[
  {
    "path": "README.md",
    "content": "ViperCard is an open source rewrite of 1987's HyperCard.\n\nYou can use it to make animations, games, and interactive art!\n\nThis is a community project, all source code is released to the public.\n\n* Try it now at [vipercard.net](https://www.vipercard.net)\n\n* Follow on [twitter](https://twitter.com/vipercarddotnet) and talk about your projects on [google groups](https://groups.google.com/forum/#!forum/vipercard)\n\n* Donate at [donorbox.org](https://donorbox.org/vipercard)\n\nEnjoy!\n\n    ViperCard\n    Copyright (C) 2020 Ben Fisher\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "vipercard/.gitignore",
    "content": "\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 instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n"
  },
  {
    "path": "vipercard/LICENSE",
    "content": "The following files are released under the MIT License:\nCopyright 2019 moltenform (Ben Fisher)\n  src/ui512/utils/util512.ts\n  src/ui512/utils/util512Base.ts\n  src/ui512/utils/util512Assert.ts\n  src/ui512/utils/util512Higher.ts\n  src/test/testUtils/testTop.ts\n  src/test/testUtils/testUtils.ts\n  src/test/util512/testUtil512.ts\n  src/test/util512/testUtil512Assert.ts\n  src/test/util512/testUtil512Class.ts\n  src/test/util512/testUtil512Higher.ts\n\nAll other files are released under the GPLv3 license:\nCopyright 2019 moltenform (Ben Fisher)\n\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "vipercard/building.md",
    "content": "\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 install`\n\n- run `npm run start`\n\n- webpack will do its thing, after ~30s of compiling, a browser and vipercard will open\n\n### Running tests\n\n- open the JavaScript console, usually in the brower's 'show development tools'\n\n- click on any button in ViperCard, then press Option+Shift+T\n\n- the test status should be shown, and finally a message like '261/261. all tests pass.'\n\n### Build for production\n\n- Production builds have minified js and fewer breakpoints\n\n- cd to `vipercard/vipercard`\n\n- run `npm run build`\n\n- an output .js file will be written to `./dist`\n\n- make a copy of `index.dev.html` with a new `<script>` at the bottom pointing to the js file\n\n- run a server and open the new html file\n\n"
  },
  {
    "path": "vipercard/doc/gendocs.py",
    "content": "\n\n# gendocs.py\n# Ben Fisher, 2017\n\nimport re\nimport json\nimport sys\nfrom collections import OrderedDict\nimport enum\n\n# if documentation needs to have a real ^ or ` character,\n# it should use $caret$ or $backtic1$ or $backtic$\n\nsys.path.append('../vipercard/tools/typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_common import *\n\ndef parseSection(txt):\n    out = []\n    longOnes = re.compile('\\n' +'=' * 50 + '*\\n')\n    pts = re.split(longOnes, txt)\n    assertTrue(not pts[0].strip(), 'text outside?', pts[0].strip())\n    pts.pop(0) # get rid of any first ones\n    if len(pts)%2 != 0:\n        assertTrue(False, \"uneven start and stop titles?\")\n    for title, body in takeBatch(pts, 2):\n        title = title.strip()\n        assertTrue(title.startswith('===='), 'not a title?', title)\n        title = title.replace('=', '').strip()\n        title = title.replace('___', ' ')\n        assertTrue(not '\\n' in title, 'title must be one line')\n        body = parseBody(body, title)\n        if title.strip()[0] == '(':\n            shortTitle = title\n        else:\n            shortTitle = title.split('(')[0]\n        \n        out.append((shortTitle, title, body))\n    return out\n    \ndef parseBody(txt, title):\n    # Examples should automatically be given code-formatting\n    exfind = '\\nExamples:'\n    hasExamples = txt.find(exfind)\n    if hasExamples!=-1:\n        txt = txt[0:hasExamples + len(exfind)] + '\\n`' + txt[hasExamples + len(exfind):] + '\\n`\\n'\n    \n    # check code-formatting\n    # a - 1\n    # a`b`c - 3\n    # a`b ` c `d `e -5\n    assertTrue(len(txt.split('`')) % 2 == 1, \"unclosed `?\", title)\n    # check sub-headers\n    assertTrue(len(txt.split('^')) % 2 == 1, \"unclosed ^?\", title)\n    if not txt.endswith('\\n'):\n        txt+='\\n'\n    return txt\n    \ndef parseAll(f):\n    trace('parsing...')\n    out = OrderedDict()\n    for f, short in files.listFiles(f):\n        if short.startswith('reference_') and not '.' in short:\n            trace(f'{short}...')\n            section = parseSection(files.readAll(f, encoding='utf-8'))\n            out[short] = section\n    return out\n    \nif __name__=='__main__':\n    parseAll('.')\n"
  },
  {
    "path": "vipercard/doc/gendocs_to_md.py",
    "content": "\nfrom gendocs import *\nimport os\n\ndef addFormattingMarkdown(s):\n    # first, escape characters that happen to be markdown formatters\n    # not needed because the symbols are in `code` blocks treated as literal\n    # s = s.replace('\\\\', '\\\\\\\\')\n    # s = s.replace('#', '\\\\#')\n    # s = s.replace('*', '\\\\*')\n    # s = s.replace('_', '\\\\_')\n    # s = s.replace('~', '\\\\~')\n    \n    # then do formatting\n    s = s.replace('^', '**')\n    \n    r = re.compile('\\n`(.*?)`\\n    ([a-zA-Z0-9].*)')\n    s = r.sub('\\n\\n$backtic1$\\\\1$backtic1$ (\\\\2)\\n\\n', s)\n    \n    r = re.compile('\\n`([^`]+?)`\\n', re.DOTALL)\n    s = r.sub('\\n\\n```\\n\\\\1\\n```\\n\\n', s)\n    \n    # if a subheader bold, should not be a newline right there, add more space\n    r = re.compile('\\\\*\\\\*\\n(?=[A-Za-z0-9])', re.DOTALL)\n    s = r.sub('**\\n\\n', s)\n    \n\n    s = s.replace('$caret$', '^').replace('$backtic1$', '`').replace('$backtic$', '\\\\`')\n    \n    # need to double newlines! except for * lists. and not inside a ``` block\n    pts = s.split('```')\n    for i, item in enumerate(pts):\n        if i%2==0:\n            pts[i] = re.sub(r'(\\S) *\\n *([^*\\s])', r'\\1'+'\\n\\n'+r'\\2', pts[i])\n    \n    s = '```'.join(pts)\n    \n    return s\n\n\ndef goSection(section, sectionfulltitle, outname, outfile, myHeaderLinks):\n    out = ''\n    out += '''<!---\nthis is a generated file, changes will be lost.\n-->'''\n    out+='\\n\\n'+myHeaderLinks+'\\n\\n'\n    for item in section:\n        shortTitle, title, body = item\n        out += f'\\n\\n## {title}\\n\\n'\n        out += addFormattingMarkdown(body)\n    \n    \n    trace('write to', outfile)\n    files.writeAll(outfile, out, encoding='utf-8')\n    \n\n\ndef makeHeaderLinks(data, mapIt, outname1):\n    headerLinks = []\n    for key in data:\n        outname = key.split('_')[-1].lower()\n        sectionfulltitle = mapIt[outname].replace('lng', '')\n        if outname==outname1:\n            headerLinks.append(sectionfulltitle)\n        else:\n            headerLinks.append(f'[{sectionfulltitle}](./{key}.md)')\n            \n    return ' | '.join(headerLinks)\n\ndef goToMarkdown(indir):\n    data = parseAll(indir)\n    trace('outputting...')\n    mapIt = dict(overview='lngOverview',\n        commands='lngCommands',\n        syntax='lngSyntax',\n        properties='lngProperties',\n        functions='lngFunctions',\n        events='lngEvent Handlers',\n        compatibility='lngCompatibility')\n    \n    for key in data:\n        section = data[key]\n        outname = key.split('_')[-1].lower()\n        sectionfulltitle = mapIt[outname]\n        outfile = key + '.md'\n        myHeaderLinks = makeHeaderLinks(data, mapIt, outname)\n        goSection(section, sectionfulltitle, outname, outfile, myHeaderLinks)\n    trace('done.')\n\ndef transformToHtml(indir, outdir):\n    indir = os.path.abspath(indir)\n    outdir = os.path.abspath(outdir)\n    goToMarkdown(indir)\n    tmpdir = r'C:\\b\\devarchive\\moltenform\\static\\page' + '\\\\TEMP'\n    if not os.path.exists(tmpdir):\n        os.mkdir(tmpdir)\n    files.ensureEmptyDirectory(tmpdir)\n    manifest = '''\n# These are temporary files belonging to vipercard\n\ntitleprefix=title\ncontentprefix=\ncontentprefix_ifnotindex=\ncontentprefix_ifindex=\ncsspath=../github-markdown/github-markdown.css\nheader=\nheadernavparts=vipercard.net=/;script reference=./reference_01_overview.html\n\nheader_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>\nend_header_generated_by_makelinkchain=\n    \n    '''\n    files.writeAll(f'{tmpdir}/mdnotjekyll_info.txt', manifest)\n    \n    for f, short in files.listFiles(indir):\n        if short.endswith('.md') and not 'readme' in short.lower() and not 'rationale' in short.lower():\n            dest = files.join(tmpdir, short).replace('.md','.mdnotjekyll')\n            files.copy(f, dest, False)\n    prevpath = os.path.abspath('.')\n    scr = r\"C:\\b\\devarchive\\moltenform\\site-make-pages\\markdown\\goMarkdown.py\"\n    os.chdir(files.getParent(scr))\n    args = [r\"C:\\data\\e5\\unzipped\\devkits\\py_64_37\\pythonw\", scr]\n    files.run(args)\n    os.chdir(prevpath)\n    \n    for f, short in files.listFiles(outdir):\n        if f.lower().endswith('.html'):\n            files.delete(f)\n            \n    headerfragment = files.readAll(outdir+'/../noship_headerfragment.html', encoding='utf-8')\n    \n    for f, short in files.listFiles(tmpdir):\n        if short.endswith('.html'):\n            dest = files.join(outdir, short)\n            files.move(f, dest, False)\n            alltxt = files.readAll(dest, encoding='utf-8')\n            alltxt = fixuphtml(short, alltxt, headerfragment)\n            files.writeAll(dest, alltxt, encoding='utf-8')\n    \n    import shutil\n    shutil.rmtree(tmpdir)\n    movePagesUp(outdir)\n\ng_titles = {}\ng_titles['page_404'] = 'ViperCard - Page not found'\ng_titles['page_terms'] = 'ViperCard - Terms and Content Policies'\ng_titles['page_video'] = 'ViperCard - Tutorial Videos'\ng_titles['page_video1'] = 'ViperCard - Tutorial Videos - Making a GIF'\ng_titles['page_video2'] = 'ViperCard - Tutorial Videos - Making a game'\ng_titles['page_video3'] = 'ViperCard - Tutorial Videos - Making interactive art'\ng_titles['page_why'] = 'ViperCard - Rationale'\ng_titles['reference_01_overview'] = 'ViperCard - Script Reference - overview'\ng_titles['reference_02_commands'] = 'ViperCard - Script Reference - commands'\ng_titles['reference_03_syntax'] = 'ViperCard - Script Reference - syntax'\ng_titles['reference_04_properties'] = 'ViperCard - Script Reference - properties'\ng_titles['reference_05_functions'] = 'ViperCard - Script Reference - functions'\ng_titles['reference_06_events'] = 'ViperCard - Script Reference - events'\ng_titles['reference_07_compatibility'] = 'ViperCard - Script Reference - compatibility'\nnavScrRef = '<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>'\nnavVideo = '<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>'\ng_nav = {}\ng_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>'\ng_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>'\ng_nav['page_video'] = navVideo\ng_nav['page_video1'] = navVideo\ng_nav['page_video2'] = navVideo\ng_nav['page_video3'] = navVideo\ng_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>'\ng_nav['reference_01_overview'] = navScrRef\ng_nav['reference_02_commands'] = navScrRef\ng_nav['reference_03_syntax'] = navScrRef\ng_nav['reference_04_properties'] = navScrRef\ng_nav['reference_05_functions'] = navScrRef\ng_nav['reference_06_events'] = navScrRef\ng_nav['reference_07_compatibility'] = navScrRef\ng_descriptions={}\ng_descriptions['page_404'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_terms'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_video'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_video1'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_video2'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_video3'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['page_why'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_01_overview'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_02_commands'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_03_syntax'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_04_properties'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_05_functions'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_06_events'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\ng_descriptions['reference_07_compatibility'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'\n\ndef fixuphtml(short, alltxt, headerfragment):\n    \n    def replExpectAtLeastOne(s1, s2):\n        nonlocal alltxt\n        assertTrue(s1 in alltxt, \"not seen\", s1)\n        alltxt = alltxt.replace(s1, s2)\n    if not 'page' in short:\n        replExpectAtLeastOne('md\">', 'html\">')\n    key = short.split('.')[0]\n    replExpectAtLeastOne('<head>', '<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\\n'+headerfragment+'\\n')\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>', \n        g_nav[key])\n    replExpectAtLeastOne('<link rel=\"stylesheet\" href=\"../github-markdown/github-markdown.css\">', '<link rel=\"stylesheet\" href=\"./github-markdown.css\">')\n    replExpectAtLeastOne('<link rel=\"stylesheet\" href=\"../smalltheme.css\">', '<link rel=\"stylesheet\" href=\"./smalltheme.css\">')\n    alltxt = alltxt.replace('example videos.', 'example videos (<a href=\"../video.html\">here</a>).')\n    alltxt = re.sub(r'<title>(.*?)</title>', rf'<title>{g_titles[key]}</title>', alltxt)\n    alltxt = alltxt.replace('%%keywords%%', g_descriptions[key]+', '+g_titles[key])\n    alltxt = alltxt.replace('%%description%%', g_descriptions[key]+', '+g_titles[key])\n    return alltxt\n\ndef fixuphtmlpage(alltxt):\n    def replExpectAtLeastOne(s1, s2):\n        nonlocal alltxt\n        assertTrue(s1 in alltxt, \"not seen\", s1)\n        alltxt = alltxt.replace(s1, s2)\n    \n    replExpectAtLeastOne('<link rel=\"stylesheet\" href=\"./smalltheme.css\">', '<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">')\n    replExpectAtLeastOne('<link rel=\"stylesheet\" href=\"./github-markdown.css\">', '<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">')\n    return alltxt\n\ndef movePagesUp(outdir):\n    for f, short in files.listFiles(outdir):\n        if short.startswith('page_'):\n            dest = f'{outdir}/../{short.replace(\"page_\", \"\")}'\n            files.move(f, dest, True) # overwrite existing\n            # fix html\n            alltxt = files.readAll(dest, encoding='utf-8')\n            alltxt = fixuphtmlpage(alltxt)\n            files.writeAll(dest, alltxt, encoding='utf-8')\n\nif __name__=='__main__':\n    outdir = r'..\\vipercard\\0.3\\html\\script_reference'\n    transformToHtml('.', outdir)\n    "
  },
  {
    "path": "vipercard/doc/gendocs_tovipercard.py",
    "content": "\nfrom gendocs import *\nspecialCharFontChange = \"\\x02\"\nchangeFontTitle = f'{specialCharFontChange}times_24_biuosdce{specialCharFontChange}'\nchangeFontBody = f'{specialCharFontChange}times_12_biuosdce{specialCharFontChange}'\nchangeFontBold = f'{specialCharFontChange}times_12_+biuosdce{specialCharFontChange}'\nchangeFontCode = f'{specialCharFontChange}monaco_9_biuosdce{specialCharFontChange}'\n\ndef goItem(item):\n    shortTitle, title, body = item\n    ret = {}\n    \n    body = body.replace(specialCharFontChange, '?')\n    body = changeFontTitle + title + changeFontBody + '\\n\\n' + body\n    \n    counter = 0\n    def doReplaceBold(np):\n        nonlocal counter\n        counter += 1\n        if counter % 2 == 1:\n            return changeFontBold\n        else:\n            return changeFontBody\n    body = re.sub(r'\\^',doReplaceBold,body)\n    \n    counter = 0\n    def doReplaceCodef(np):\n        nonlocal counter\n        counter += 1\n        if counter % 2 == 1:\n            return changeFontCode\n        else:\n            return changeFontBody\n    body = re.sub(r'`',doReplaceCodef, body)\n    body = changeFontBody + body\n    body = body.replace('$caret$', '^').replace('$backtic1$', '`').replace('$backtic$', '\\\\`')\n    ret['title'] = title\n    ret['body'] = body\n    return ret\n\ndef goSection(section, sectionfulltitle, outname, outfile):\n    trace(f'{outname}...')\n    out = OrderedDict()\n    out['name'] = sectionfulltitle\n    entries = []\n    out['entries'] = entries\n    for item in section:\n        entries.append(goItem(item))\n    alls = json.dumps(out)\n    trace('write to ', outfile)\n    files.writeAll(outfile, alls, encoding='utf-8')\n\ndef goTsIndexSection(section, sectionfulltitle, outname):\n    trace('/* prettier-ignore */')\n    out = []\n    out.append(outname)\n    out.append(sectionfulltitle)\n    entries = []\n    out.append(entries)\n    for item in section:\n        shortTitle, title, body = item\n        entries.append(shortTitle)\n    j = json.dumps(out)\n    assertTrue(j.startswith('[\"'), j)\n    trace(j + ',')\n    \ndef goToVipercard(indir, outdir):\n    data = parseAll(indir)\n    trace('outputting...')\n    mapIt = dict(overview='lngOverview',\n        commands='lngCommands',\n        syntax='lngSyntax',\n        properties='lngProperties',\n        functions='lngFunctions',\n        events='lngEvent Handlers',\n        compatibility='lngCompatibility')\n    for key in data:\n        section = data[key]\n        outname = key.split('_')[-1].lower()\n        sectionfulltitle = mapIt[outname]\n        outfile = files.join(outdir, f'ref{outname}.json')\n        goSection(section, sectionfulltitle, outname, outfile)\n    for key in data:\n        section = data[key]\n        outname = key.split('_')[-1].lower()\n        sectionfulltitle = mapIt[outname]\n        goTsIndexSection(section, sectionfulltitle, outname)\n    trace('done.')\n\nif __name__=='__main__':\n    outdir = '../vipercard/resources03a/docs'\n    goToVipercard('.', outdir)\n    \n\n"
  },
  {
    "path": "vipercard/doc/libraries.txt",
    "content": "\nUses:\nchevrotain\n    https://github.com/SAP/chevrotain\n    Shahar Soel, Apache-2.0\n\nFileSaver.js\n    https://github.com/eligrey/FileSaver.js\n    Eli Grey <me@eligrey.com> MIT license\n\nGolly\n    https://github.com/dannygarcia/golly\n    Copyright (c) 2012, Danny Garcia MIT license\n    \njs-lru\n    https://github.com/rsms/js-lru\n    MIT license\n\nClipboard.js\n    https://github.com/zenorocha/clipboard.js/\n    MIT license\n\n[base64js](https://github.com/beatgammit/base64-js)\n\n\nJSGIF (libgif.js)\n    https://github.com/antimatter15/jsgif\n    MIT license\n\neasy.filter Bresenham\n    http://members.chello.at/easyfilter/bresenham.html\n    Alois Zingl, Vienna, Austria\n    Bresenham Curve Rasterizing Algorithms\n    Used with explicit permission, e-mail on Oct 27 2017\n\nlz-string\n    https://github.com/pieroxy/lz-string\n    Sam Hocevar, released under WTFPL\n\n[Pizzicato](https://github.com/alemangui/pizzicato)\n\n[Bowser](https://github.com/lancedikson/bowser)\n\n[TypeScript Types for TextEncoding](https://github.com/DefinitelyTyped/DefinitelyTyped)\n\ndeep-freeze\n    https://github.com/substack/deep-freeze\n    public domain\n\npbkdf2 gist by Chris Veness\n\nWikipedia's [description of Mac OS Roman](https://en.wikipedia.org/wiki/Mac_OS_Roman)\n\nA small code excerpt from:\nScintilla\n    http://www.scintilla.org/\n    Scintilla license (public domain)\n\n\n\n\n\n"
  },
  {
    "path": "vipercard/doc/page_404.md",
    "content": "\nThe requested page was not found.\n\n<a href=\"/\"><img border=\"0\" src=\"/resources03a/intro/err/back.png\"  alt=\"Back to ViperCard\" /></a>\n"
  },
  {
    "path": "vipercard/doc/page_terms.md",
    "content": "\n#### Terms and Content Policies\n\nThe 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”).\n\nPlease 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.\n\n#### Your Account\nYou 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.\n\n#### Responsibility of Contributors\nIf 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:\n\nthe 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;\n* 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;\n* 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;\n* the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content;\n* 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);\n* 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\n* 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.\n\nBy 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.\n\nWithout 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.\n\n\n\n\n\n#### Responsibility of Website Visitors\n*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.\n\n#### Content Posted on Other Websites\nWe 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.\n\n#### Disclaimer of Warranties\nThe 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.\n\n#### Copyright Infringement and DMCA Policy\nAs *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*.\n\n\n#### Intellectual Property\nThis 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*.\n\n#### Changes\n*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.\n\n#### Termination\n*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.\n\n\n#### Limitation of Liability\nIn 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.\n\n#### General Representation and Warranty\nYou 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.\n\n#### Indemnification\nYou 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.\n\n#### Miscellaneous\nThis 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.\n\nThe 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.\n\nThese 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.\n\n"
  },
  {
    "path": "vipercard/doc/page_video.md",
    "content": "<iframe width=\"450\" height=\"240\" src=\"https://www.youtube.com/embed/9Jyh-EXsH4w?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video1.html\" style=\"color:black;\">Demo 1: make an animated GIF</a></h3>\n<h3><a href=\"video2.html\" style=\"color:black;\">Demo 2: make a game</a></h3>\n<h3><a href=\"video3.html\" style=\"color:black;\">Demo 3: make interactive art</a></h3>\n\n\n<h3><a href=\"/\" style=\"color:black;text-decoration:none\">Home</a></h3>\n\n"
  },
  {
    "path": "vipercard/doc/page_video1.md",
    "content": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/gF4KI_4mFY0?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n"
  },
  {
    "path": "vipercard/doc/page_video2.md",
    "content": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/VYnXucRurY0?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n"
  },
  {
    "path": "vipercard/doc/page_video3.md",
    "content": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/oCaGCMDwZPc?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n"
  },
  {
    "path": "vipercard/doc/page_why.md",
    "content": "\n\n# Why\n\nViperCard is a fun project for creating games and animations, but it also makes me reflect on the process of writing software.\n\nThis 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.\n\nComputer 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.\n\nMore 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.\n\nI'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.\n\nOur 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.\n\nViperCard 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).\n\n# Still in progress\n\n- ViperCard is currently not compatible with screen readers and accessibility tools.\n\n- ViperCard is currently not compatible with mobile or tablet, despite the importance of these platforms.\n\n- ViperCard is still in development and some features are not yet complete. For example: HyperCard's visual effect command and show all cards command.\n\nViperCard is released under the GNU Public License. See https://github.com/moltenform/vipercard for more information.\n"
  },
  {
    "path": "vipercard/doc/readme.md",
    "content": "\nHere's the ViperCard script reference, as it is shown within the application.\n\n* [01 Overview](reference_01_overview.md)\n* [02 Commands](reference_02_commands.md)\n* [03 Syntax](reference_03_syntax.md)\n* [04 Properties](reference_04_properties.md)\n* [05 Functions](reference_05_functions.md)\n* [06 Events](reference_06_events.md)\n* [07 Compatibility](reference_07_compatibility.md)\n\n"
  },
  {
    "path": "vipercard/doc/reference_01_overview",
    "content": "\n \n============================================================\n========================= Introduction\n============================================================\n\n\nWelcome to ViperCard, an open source re-creation and re-imagination of 1987's HyperCard. We suggest first watching the example videos.\n\n\n\n\n============================================================\n========================= Scripting\n============================================================\n\nAll objects (all buttons, fields, and cards) have an associated set of code called a \"script.\"\n\nHere is an example script:\n`on mouseUp\n    answer \"hello, world\"\nend mouseUp`\n\nIf 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.\n\nA 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.\n\n`on mouseUp\n    -- this line is a comment\n    answer \"hello, world\"\nend mouseUp`\n\n\nThe indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.\n\nA long line of code can be continued with a backslash, e.g.\n\n`answer (\"here is how to continue\" & \\\n    \"code across two lines\")`\n\nTo have a comment spanning many lines, do this,\n\n`on mouseUp\n    --[[this line is a comment\n    and so is this\n    and also this]]\n    answer \"hello, world\"\nend mouseUp`\n\nThe language is not case sensitive. `on mouseup` and `on mouseUp` are equivalent.\n\nA common data type is a string (i.e. text).\n\n`put \"abc\" into x`\n\nDouble-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:\n\n`if x is \"\" then\n    answer \"empty string\"\nend if`\n\nTo include a double-quote character in a string, use the quote constant,\n\n`answer (quote & \"a\" & quote) -- displays \"a\"`\n\nValid 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.\n\n`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))`.\n\nYou can call a function in two ways. `the mouseLoc` is the same as `mouseLoc()`. `the length of \"abc\"` is the same as `length(\"abc\")`.\n\nButtons 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.\n\nA script can set properties of an object with syntax like:\n\n`set the width of cd btn \"myBtn\" to 450`\n\nChoose 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:\n\n`set the width of cd btn id 1234 to 450`\n\nWhen 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.\n\nThe documentation here has a list of Commands, Event Handlers, and Properties that can be set.\n\n\n\n============================================================\n========================= Expressions\n============================================================\n\n\nYou can use expressions like `put 1+2+3+4 into x` or `put sqrt(0.5) + sqrt(0.6) into y` in your code.\n\nExpressions can use parentheses to contain any level of nested sub-expressions, for example,\n\n`sqrt(0.5)\nsqrt(0.5 + sqrt(0.6))\nsqrt(0.5 + sqrt(0.6 + sqrt(0.7)))`\nare all valid.\n\nParentheses are used to dictate the order of operations, since\n`3*(4+5)`\ngives a different answer than\n`(3*4)+5`\n\nParentheses 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)`\n\nDo not type something like\n`answer (line n + 1 of x) -- this is hard to read.`\nwhich is unclear,\n`answer (line (n + 1) of x) -- this is preferred.`\n\nIn the expression `2 + 3`, the symbol `+` is called an operator. \nViperCard also has logical operators like `and`, `or`, and `not`.\nSee the `operators` page in the Syntax documentation section\nfor more information.\n\n\n============================================================\n========================= Message Box\n============================================================\n\n\nOpen the Message Box by choosing 'Message Box' from the Go menu, or by pressing Cmd+M.\n\nThe 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.\n\nAs 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.\n\nYou can use the Up and Down arrow keys to see previously typed commands.\n\nYou can use a semicolon to combine many lines, for example `put 2 into x; put x * 3`\n\nYou 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`.\n\nIn 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.\n\n`\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\n-- otherwise, the line is ignored\nput x into the msg box\n-- code will continue running\n`\n\nThe shortened form,\n\n`\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\nput x`\n\nis also supported.\n\n\n\n============================================================\n========================= Lists/Arrays\n============================================================\n\n\nHere's a common way to create a list:\n\n`put \"\" into myList\nrepeat with x = 1 to 5\n    put 0 into line x of myList\nend repeat`\n\nAppend a number to the list:\n\n`put newline & 20 after myList`\n\nInsert a number in the list (if the line doesn't yet exist, it will be added)\n\n`put 6 into line 8 of myList`\n\nAdd 10 to each element of the list:\n\n`repeat with x = 1 to the number of lines in myList\n    put (line x of myList) + 10 into line x of myList\nend repeat\n`\n\n`myList` is a normal variable, it can be passed as an argument and so on.\n\n^Two-dimensional lists^\n\nHere's a common way to create a 2-d list:\n`put \"\" into myList\nrepeat with x = 1 to 5\n    repeat with y = 1 to 5\n        put 0 into item x of line y of myList\n    end repeat\nend repeat`\n\nInsert a new number into the list (it's ok if the line or item does not yet exist, it will be created):\n\n`put 3 into item 6 of line 8`\n\nAdd 10 to each element of the list:\n\n`repeat with y = 1 to the number of lines in myList\n    repeat with x = 1 to the number of items in line y of myList\n        if length(item x of line y of theLine) > 0 theLine\n            add 10 to item x of line y of theLine\n        end if\n    end repeat\nend repeat\n`\n\n\n============================================================\n========================= Variables\n============================================================\n\n\nUse a statement like \n\n`put 3 into x`\n\nto put the value \"3\" into a variable named \"x\". You don't need to first declare x as a variable.\n\nVariable names and function names are case insensitive.\n\nVariable 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.\n\nIf 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`.\n\nUse \"global\" to declare a variable as a global.\n1) it can be accessed from any other script\n2) its contents are saved even after the function is complete.\n\nFor example,\n\n`global coordX, coordY\nput 1 into coordX\nput 2 into coordY`\n\nIf another script says\n`global coordX, coordY\nanswer coordX, coordY`\nit will read the values that were set.\n\nGlobal variables are, though, reset when you close the stack (the values \nare not saved as part of the project.)\n\n^Data types^\n\nA runtime error can be thrown if a value has the wrong \ntype, e.g.\n`put \"abc\" + 4 into z`\ncauses a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string `\"abc\"`.\n\nIf you need to convert from a text type to a number, you can use the functions `strToNumber` and `numberToStr`. For example,\n`ask \"please enter a number\"\nput it into x\nif strToNumber(x) is not false then\n    answer \"the number plus one is\" && (strToNumber(x) + 1)\nend if\n`\n\nFor `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.\n\nNote that equality checks account for different data types: \n\n`if (456 is \"456.00\") then answer \"yes\" -- answers yes`\n\nA \"point\" data type is two numbers separated by a comma. You can write:\n`\nput 1 into x\nput 2 into y\nset the topleft of cd btn \"myBtn\" to x, y\n`\n\nThis is the same as writing\n`\nset the topleft of cd btn \"myBtn\" to 1, 2\nset the topleft of cd btn \"myBtn\" to \"1, 2\"\n-- or\nset the top of cd btn \"myBtn\" to 1\nset the left of cd btn \"myBtn\" to 2\n`\n\n============================================================\n========================= User Functions\n============================================================\n\nAn example of how to define and call a custom function:\n`function myAddition p1, p2\n    return p1 + p2\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp`\n\nAn example of how to define and call a custom handler:\n`on showMessage p1, p2\n    put p1 into cd fld \"results1\"\n    put p2 into cd fld \"results2\"\nend showMessage\non mouseUp\n    showMessage \"hello\", \"world\"\nend mouseUp`\n\nYou can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.\n\nNo error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string (\"\").\n`myAddition(7, 8, 9) -- the extra argument 9 is ignored\nmyAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8\nmyAddition(7) -- p1 is assigned 7, p2 is assigned \"\"\nmyAddition() -- p1 is assigned \"\", p2 is assigned \"\"`\n\nYou can use recursion.\n\nYou 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:\n\nMessages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.\n* If you click on a button:\n    * A mouseUp message is created\n    * Script of the button is examined. \n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass mouseUp', continue:\n    * Script of the current card is examined.\n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass mouseUp', continue:\n    * Script of the current stack is examined.\n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n\n* Similarly, if you are typing text in a field, and type the letter 'a':\n    * A afterKeyUp message is created\n    * Script of the current field is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the afterKeyUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass afterKeyUp', continue:\n    * Script of the current card is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the afterKeyUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass afterKeyUp', continue:\n    * Script of the current stack is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the mouseUp handler.\n\nCalling `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.\n\nSee documentation of the 'pass' command for more information.\n\nCalls 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.\n\n\n============================================================\n========================= Text and Chunks\n============================================================\n\n\n^Lines^\n\nUse `newline` to refer to a new line character.\n\nLet's say you wanted two lines of text in a field, you would use \nthe following:\n\n`put \"first line\" & newline & \"second line\" into cd fld \"myFld\"`\n\n(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.)\n\n^Chunks^\n\nViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:\n\n`\nput \"ab\" & tab & \"cd\" & tab & \"ef\" into myList\nset the itemDelimiter to tab\nput 2 into n\nanswer \"Result:\" & item n of myList\n`\nIf you have a comma-separated list you can get the nth item like this:\n\n`\nput \"ab,cd,ef\" into myList\nset the itemDelimiter to \",\"\nput 2 into n\nanswer \"Result:\" & item n of myList\n`\n\nMore advanced examples:\n\n`\nanswer char 2 of \"abcd\"\nanswer char (n + 1) of \"abcd\"\nanswer char 2 to 4 of \"abcd\"\n\nanswer item 2 of \"ab,cd,ef,gh\"\nanswer item (n + 1) of \"ab,cd,ef,gh\"\nanswer item 2 to 4 of \"ab,cd,ef,gh\"\n\nanswer first item of \"ab,cd,ef,gh\"\nanswer last item of \"ab,cd,ef,gh\"\nanswer any item of \"ab,cd,ef,gh\"\n\nput \"ab\" & newline & \"cd\" & newline & \"ef\" into myList\nanswer line 2 of myList\nanswer line (n + 1) of myList\nanswer line 2 to 3 of myList\n`\n\nRecursive scopes:\n`\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\n\nanswer item 2 of line 2 of myList\nanswer char 2 of line 2 of myList\nanswer char 2 of item 2 of line 2 of myList\n\nanswer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n`\n\n\n^Modifying by chunk^\n\n`\nput \"abcd\" into x\nput \"A\" into char 2 of x\nput \"A\" into char 2 to 4 of x\n\nput \"10,20,30\" into myList\nput \"A\" into item 2 of myList\nput \"A\" into item 2 to 3 of myList\nmultiply item 2 of myList by 5\nadd 1 to item 2 of myList\n\nput \"A\" into first item of myList\nput \"A\" into last item of myList\nput \"A\" into any item of myList\n\nput \"A\" into before item 2 of myList\nput \"A\" into after item 2 of myList\nput \"A\" into before char 2 of item 2 of myList\n\nput \"A\" into before item 2 of cd fld \"myFld\"\nput \"A\" into after item 2 of cd fld \"myFld\"\nput \"A\" into before char 2 of item 2 of cd fld \"myFld\"\n\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\nput \"A\" into item 2 of line 2 of myList\nput \"A\" into char 2 of line 2 of myList\nput \"A\" into char 2 of item 2 of line 2 of myList\n\nput \"A\" into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n`\n\n^Backwards compatiblity^\n\nWe went to much effort to maintain fidelity with HyperCard's chunk processing. All of the above can be done with words:\n\n`\nput \"ab cd ef\" into x\nanswer word 2 of x\nanswer word 2 to 3 of x\nput \"A\" into word 2 of x\nput \"A\" into word 2 to 3 of x\nput \"A\" into char 2 to 3 of word 2 to 3 of x\n`\n\nTo 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).\n\n`\n-- if compatibility mode is on:\n-- we follow HyperCard's non-intuitive behavior for the following:\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\nput \"A\" into item 3 of item 4 of myList\nput \"A\" into item 3 of char 2 of myList\ndelete item 3 of item 4 of myList\ndelete item 3 of char 2 of myList\nadd 1 to item 3 of item 4 of myList\nadd 1 to item 3 of char 2 of myList\nanswer item 0 of myList\nput \"A\" into item 0 of myList\nanswer item 4 to 1 of myList\nput \"A\" into item 4 to 1 of myList\n\n\n-- The only known cases we don't support (we'll throw a runtime error):\nanswer item -1 of myList\nput \"A\" into item -1 of myList\ndelete item -1 of myList\nanswer char 2 of item 4 to 1 of myList\nput \"A\" into char 2 of item 4 to 1 of myList\ndelete char 2 of item 4 to 1 of myList\ndelete item 2 to 3 of myList\n`\n\nSee also documentation for the `delete` command.\n\n============================================================\n========================= Objects\n============================================================\n\nWays to refer to a button or field:\n`\ncd btn id 1234\ncd btn \"myBtn\"\ncd btn 2\nfirst cd btn\nany cd btn\nlast cd btn\n`\n\nWays to refer to a card:\n`\nthis card\nprev card\nnext card\nfirst card\nsecond card\nlast card\ncard 1\ncard id 1234\ncard \"name\"\n`\n\nWays to refer to a background:\n`\nthis background\nprev background\nnext background\nfirst background\nsecond background\nlast background\nbg 1\nbg id 1234\nbg \"name\"\n`\n\nWays to refer to a stack:\n`\nthis stack\nstack 1\nstack \"name\"\n`\nOther ways to refer to objects:\n`\nanswer the name of the target\nanswer the name of me\nanswer the name of the owner of cd btn id 1234\nput \"cd btn id 1234\" into x\nanswer the name of x\n\nfunction whichObject\n    return \"cd btn id 1234\"\nend whichObject\nanswer the name of whichObject()\n`\n============================================================\n========================= Structure\n============================================================\n\n\n^Loops^\n`repeat with x = 1 to 3\n    ...other code here...\nend repeat`\n\nRefer to `repeat` under \"syntax\" for more information.\n\n^If statements^\n`if x > 1 then\n    ...other code here...\nelse\n    ...other code here...\nend if`\nRefer to `if` under \"syntax\" for more information.\n\n\n^Scripts^\nNo code can exist outside of a handler or function.\n\n^Handlers^\nHandlers look like this\n\n`on mouseup \n    answer \"hello world\"\nend mouseup`\n    \nand respond to an event message.\n    \n^Functions^\nFunctions look like this\n\n`function myAddition p1, p2\n    return p1 + p2\nend myAddition`\n\nThey can then be called with code like\n`put myAddition(1,2) into x`\nFunctions inside of functions are not supported.\n\n\n^Statements^\nYou cannot have a line that is just\n    `sqrt(0.5)`\nwith no command, this is a syntax error.\n    \nStatements occur on separate lines, there's no way to have more than one statement on a line.\n    \n^Expressions^\n\nA 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,\n\n`go card 2\n-- is the same as\nput 1 into x\ngo card (x + 1)\n\nput \"abc\" into cd fld \"myFld1\"\nput \"abc\" into cd fld (prefix & \"1\")\n\nput \"a\" into line 4 of myList\nput \"a\" into line (x+1) of myList\n\nset the left of cd btn \"myBtn\" to x\nset the left of cd btn \"myBtn\" to (45 + 50 * cos(theta))\n`\n\n============================================================\n========================= Examples\n============================================================\n\nThe tutorial videos show helpful example code.\n\nExample 1:\n`\n-- after creating a field called \"myFld\":\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click button \"Go\", you get 10 points!\n    put cd fld \"myFld\" into score\n    put (score + 10) into score\n    put score into cd fld \"myFld\"\nend mouseUp\n\n`\n\nExample 2:\n`\n-- after creating a btn called \"fish\":\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click this, the fish moves\n    put the top of cd btn \"fish\" into y\n    subtract 10 from y\n    set the top of cd btn \"fish\" to y\nend mouseUp\n\n`\nExample 3:\n`\n-- create interactive art.\n-- put this in the card script,\n-- then when you choose the browse tool and \n-- click on the card, it will draw lines.\n\non mouseUp\n    put the clickH into X\n    put the clickV into y\n    \n    -- choose the line tool to draw lines\n    choose \"line\" tool\n    \n    -- make a loop that will repeat 10 times\n    repeat 10 times\n        put random(80) into randx\n        put random(80) into randy\n        -- will get random # between 1 and 80\n        drag from x, y to (x + randx), (y + randy)\n    end repeat\nend mouseUp\n  \n`\n\n\n============================================================\n========================= Tips & Shortcuts\n============================================================\n\n\nGeneral tips\n\n* If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script\n* See more error details, when in the Script Editor, by clicking on the error excerpt\n* Double-click the eraser tool to clear paint on the current card\n\nKeyboard shortcuts when editing text,\n\n* Cmd+C to copy\n* Cmd+X to cut\n* Cmd+V to paste\n* Cmd+A to select all\n* Cmd+Backspace to delete entire word\n* PageUp / PageDown to scroll one page\n* Shift+PageUp / Shift+PageDown to select one page\n* Home to move to start of line\n* Shift+Home to select to start of line\n* Cmd+Home to move to the start\n* Cmd+Shift+Home to select to the start\n* Left Arrow to move to the left\n* Shift+Left Arrow to select to the left\n* Cmd+Left Arrow to move left one word\n* Cmd+Shift+Left Arrow to select left one word\n* Cmd+Arrow Up to scroll up\n* Cmd+Arrow Down to scroll down\n* Cmd+D to duplicate the current line\n* Cmd+L to delete the current line\n* Cmd+Q to quickly comment-out or uncomment the current line\n* Cmd+Q when many lines are selected to comment-out all of them\n* Cmd+Q to comment-out a block of code\n* Tab key, to auto-indent code in a script\n\nSome of the main differences between ViperCard and HyperCard:\n* ViperCard is open source software that can run in any modern web browser\n* you can export stacks as a modern json format\n* art-stamps feature for adding clip art\n* new animation features like save-to-gif\n* in ViperCard you have to hit Save to save changes\n* but in ViperCard you have extensive undo history and can even undo changes made by a script\n\nA few of the differences between ViperCard and HyperCard:\n* You can use `--[[block comments]]` that span many lines.\n* You can write `exit to ViperCard` instead of `exit to HyperCard`\n* You must specify `cd` or `bg` when referring to a button or field, unless compatibility mode is enabled (Object->Stack Info)\n* Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.\n* Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool\n* You cannot read a variable that has not been set. `put unsetVar into x` causes a runtime error.\n* hilite and checkmark are separate properties\n* label and name are separate properties\n* You can't have a variable named id, short, long, first, and so on.\n* The `choose` command sets the emulated current tool, not the actual tool, and is limited to certain paint operations\n* The newline character is \\n and not \\r\n\n\n\n============================================================\n========================= What's New\n============================================================\n\nNew in 0.24\n* Script stack trace\n* Use `get the shiftKey`, deprecate `get the shiftKey()`\n* You can say `the sin of 4`\n* You can say `sin of 4`, `sin of cd fld 1`\n* Continue lines with logical-not, press `Alt-Enter` in code editor\n* Block comments `--[[a comment]]`\n* You can use `select`, `mark`, `doMenu` commands\n* You can turn on compat mode to allow `put \"a\" into fld 1`\n* Everything is case insensitive, even `cd btn \"aBcDe\"`\n* Improvements to `send` and `do`, script error shown in more helpful line\n* Improvements to built in functions like `selectedText`\n* Improvements to click features like `wait until the mouseClick`\n* You can say `put \"card id 2590\" into xx; put the name of xx into y`\n* You can use values for coords, e.g. `put \"3,4\" into c; set the loc of cd btn 1 to c`\n* Better match subtle differences between `target` and `the target`\n* Single-line `if` statements, fewer parentheses needed\n* Call custom functions from anywhere\n* Better cursors, better rendering on different screen resolutions\n* More fonts, all fonts have pixel-perfect spacing\n* You can use recursive chunks like `put \"a\" into char 7 of line 3 of x`\n* Improvements to load time by loading some libraries asynchronously\n* Common commands in script execution are faster\n* Scripts can dynamically create/delete objects, and set scripts\n* New features like `set the textstyle of line 3 of cd fld \"myFld\" to \"toggle-bold\"`\n\n\n============================================================\n========================= Credits\n============================================================\n\n\nViperCard\nhttps://github.com/moltenform/vipercard\nCopyright (C) 2020 Ben Fisher\n\nThis 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. \n\nThis 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.\n\nViperCard uses the following libraries:\n\n* Chevrotain\n    * https://github.com/SAP/chevrotain\n    * Apache License 2.0\n* FileSaver.js\n    * https://github.com/eligrey/FileSaver.js\n    * MIT License\n* Golly\n    * https://github.com/dannygarcia/golly\n    * MIT License\n* js-lru\n    * https://github.com/rsms/js-lru\n    * MIT License\n* Clipboard.js\n    * https://github.com/zenorocha/clipboard.js\n    * MIT License\n* base64js\n    * https://github.com/beatgammit/base64-js\n    * MIT License\n* JSGIF\n    * https://github.com/antimatter15/jsgif\n    * MIT License\n* Bresenham easy.filter\n    * http://members.chello.at/easyfilter/bresenham.html\n    * written permission of author\n* lz-string\n    * https://github.com/pieroxy/lz-string\n    * MIT License\n* Pizzicato\n    * https://github.com/alemangui/pizzicato\n    * MIT License\n* Bowser\n    * https://github.com/lancedikson/bowser\n    * MIT License\n* types-text-encoding \n    * https://www.npmjs.com/package/@types/text-encoding\n    * MIT License\n* deep-freeze\n    * https://github.com/substack/deep-freeze\n    * Public domain\n* pbkdf2 gist by Chris Veness\n* description of Mac OS Roman character set\n    * https://en.wikipedia.org/wiki/Mac_OS_Roman\n    * http://creativecommons.org/licenses/by-sa/3.0/\n    * Creative Commons Attribution-ShareAlike\n* and a small excerpt from the SciTE code editor,\n* ported from C++ to TypeScript by Ben Fisher\n* SciTE\n    * https://www.scintilla.org/License.txt\n\n"
  },
  {
    "path": "vipercard/doc/reference_01_overview.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\nOverview | [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)\n\n\n\n## Introduction\n\n\n\nWelcome to ViperCard, an open source re-creation and re-imagination of 1987's HyperCard. We suggest first watching the example videos.\n\n\n\n\n\n## Scripting\n\n\nAll objects (all buttons, fields, and cards) have an associated set of code called a \"script.\"\n\nHere is an example script:\n\n```\non mouseUp\n    answer \"hello, world\"\nend mouseUp\n```\n\n\nIf 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.\n\nA 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.\n\n\n```\non mouseUp\n    -- this line is a comment\n    answer \"hello, world\"\nend mouseUp\n```\n\n\n\nThe indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.\n\nA long line of code can be continued with a backslash, e.g.\n\n\n```\nanswer (\"here is how to continue\" & \\\n    \"code across two lines\")\n```\n\n\nTo have a comment spanning many lines, do this,\n\n\n```\non mouseUp\n    --[[this line is a comment\n    and so is this\n    and also this]]\n    answer \"hello, world\"\nend mouseUp\n```\n\n\nThe language is not case sensitive. `on mouseup` and `on mouseUp` are equivalent.\n\nA common data type is a string (i.e. text).\n\n\n```\nput \"abc\" into x\n```\n\n\nDouble-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:\n\n\n```\nif x is \"\" then\n    answer \"empty string\"\nend if\n```\n\n\nTo include a double-quote character in a string, use the quote constant,\n\n\n```\nanswer (quote & \"a\" & quote) -- displays \"a\"\n```\n\n\nValid 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.\n\n`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))`.\n\nYou can call a function in two ways. `the mouseLoc` is the same as `mouseLoc()`. `the length of \"abc\"` is the same as `length(\"abc\")`.\n\nButtons 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.\n\nA script can set properties of an object with syntax like:\n\n\n```\nset the width of cd btn \"myBtn\" to 450\n```\n\n\nChoose 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:\n\n\n```\nset the width of cd btn id 1234 to 450\n```\n\n\nWhen 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.\n\nThe documentation here has a list of Commands, Event Handlers, and Properties that can be set.\n\n\n\n\n## Expressions\n\n\n\nYou can use expressions like `put 1+2+3+4 into x` or `put sqrt(0.5) + sqrt(0.6) into y` in your code.\n\nExpressions can use parentheses to contain any level of nested sub-expressions, for example,\n\n\n```\nsqrt(0.5)\nsqrt(0.5 + sqrt(0.6))\nsqrt(0.5 + sqrt(0.6 + sqrt(0.7)))\n```\n\nare all valid.\n\nParentheses are used to dictate the order of operations, since\n\n```\n3*(4+5)\n```\n\ngives a different answer than\n\n```\n(3*4)+5\n```\n\n\nParentheses 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)`\n\nDo not type something like\n\n```\nanswer (line n + 1 of x) -- this is hard to read.\n```\n\nwhich is unclear,\n\n```\nanswer (line (n + 1) of x) -- this is preferred.\n```\n\n\nIn the expression `2 + 3`, the symbol `+` is called an operator.\n\nViperCard also has logical operators like `and`, `or`, and `not`.\n\nSee the `operators` page in the Syntax documentation section\n\nfor more information.\n\n\n\n## Message Box\n\n\n\nOpen the Message Box by choosing 'Message Box' from the Go menu, or by pressing Cmd+M.\n\nThe 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.\n\nAs 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.\n\nYou can use the Up and Down arrow keys to see previously typed commands.\n\nYou can use a semicolon to combine many lines, for example `put 2 into x; put x * 3`\n\nYou 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`.\n\nIn 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.\n\n\n```\n\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\n-- otherwise, the line is ignored\nput x into the msg box\n-- code will continue running\n\n```\n\n\nThe shortened form,\n\n\n```\n\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\nput x\n```\n\n\nis also supported.\n\n\n\n\n## Lists/Arrays\n\n\n\nHere's a common way to create a list:\n\n\n```\nput \"\" into myList\nrepeat with x = 1 to 5\n    put 0 into line x of myList\nend repeat\n```\n\n\nAppend a number to the list:\n\n\n```\nput newline & 20 after myList\n```\n\n\nInsert a number in the list (if the line doesn't yet exist, it will be added)\n\n\n```\nput 6 into line 8 of myList\n```\n\n\nAdd 10 to each element of the list:\n\n\n```\nrepeat with x = 1 to the number of lines in myList\n    put (line x of myList) + 10 into line x of myList\nend repeat\n\n```\n\n\n`myList` is a normal variable, it can be passed as an argument and so on.\n\n**Two-dimensional lists**\n\nHere's a common way to create a 2-d list:\n\n```\nput \"\" into myList\nrepeat with x = 1 to 5\n    repeat with y = 1 to 5\n        put 0 into item x of line y of myList\n    end repeat\nend repeat\n```\n\n\nInsert a new number into the list (it's ok if the line or item does not yet exist, it will be created):\n\n\n```\nput 3 into item 6 of line 8\n```\n\n\nAdd 10 to each element of the list:\n\n\n```\nrepeat with y = 1 to the number of lines in myList\n    repeat with x = 1 to the number of items in line y of myList\n        if length(item x of line y of theLine) > 0 theLine\n            add 10 to item x of line y of theLine\n        end if\n    end repeat\nend repeat\n\n```\n\n\n\n\n## Variables\n\n\n\nUse a statement like \n\n\n```\nput 3 into x\n```\n\n\nto put the value \"3\" into a variable named \"x\". You don't need to first declare x as a variable.\n\nVariable names and function names are case insensitive.\n\nVariable 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.\n\nIf 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`.\n\nUse \"global\" to declare a variable as a global.\n\n1) it can be accessed from any other script\n\n2) its contents are saved even after the function is complete.\n\nFor example,\n\n\n```\nglobal coordX, coordY\nput 1 into coordX\nput 2 into coordY\n```\n\n\nIf another script says\n\n```\nglobal coordX, coordY\nanswer coordX, coordY\n```\n\nit will read the values that were set.\n\nGlobal variables are, though, reset when you close the stack (the values\n\nare not saved as part of the project.)\n\n**Data types**\n\nA runtime error can be thrown if a value has the wrong\n\ntype, e.g.\n\n```\nput \"abc\" + 4 into z\n```\n\ncauses a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string `\"abc\"`.\n\nIf you need to convert from a text type to a number, you can use the functions `strToNumber` and `numberToStr`. For example,\n\n```\nask \"please enter a number\"\nput it into x\nif strToNumber(x) is not false then\n    answer \"the number plus one is\" && (strToNumber(x) + 1)\nend if\n\n```\n\n\nFor `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.\n\nNote that equality checks account for different data types: \n\n\n```\nif (456 is \"456.00\") then answer \"yes\" -- answers yes\n```\n\n\nA \"point\" data type is two numbers separated by a comma. You can write:\n\n```\n\nput 1 into x\nput 2 into y\nset the topleft of cd btn \"myBtn\" to x, y\n\n```\n\n\nThis is the same as writing\n\n```\n\nset the topleft of cd btn \"myBtn\" to 1, 2\nset the topleft of cd btn \"myBtn\" to \"1, 2\"\n-- or\nset the top of cd btn \"myBtn\" to 1\nset the left of cd btn \"myBtn\" to 2\n\n```\n\n\n\n## User Functions\n\n\nAn example of how to define and call a custom function:\n\n```\nfunction myAddition p1, p2\n    return p1 + p2\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp\n```\n\n\nAn example of how to define and call a custom handler:\n\n```\non showMessage p1, p2\n    put p1 into cd fld \"results1\"\n    put p2 into cd fld \"results2\"\nend showMessage\non mouseUp\n    showMessage \"hello\", \"world\"\nend mouseUp\n```\n\n\nYou can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.\n\nNo error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string (\"\").\n\n```\nmyAddition(7, 8, 9) -- the extra argument 9 is ignored\nmyAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8\nmyAddition(7) -- p1 is assigned 7, p2 is assigned \"\"\nmyAddition() -- p1 is assigned \"\", p2 is assigned \"\"\n```\n\n\nYou can use recursion.\n\nYou 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:\n\nMessages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.\n* If you click on a button:\n    * A mouseUp message is created\n    * Script of the button is examined. \n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass mouseUp', continue:\n    * Script of the current card is examined.\n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass mouseUp', continue:\n    * Script of the current stack is examined.\n    * If there is an 'on mouseUp' handler,\n        * Run the code in the mouseUp handler.\n\n* Similarly, if you are typing text in a field, and type the letter 'a':\n    * A afterKeyUp message is created\n    * Script of the current field is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the afterKeyUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass afterKeyUp', continue:\n    * Script of the current card is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the afterKeyUp handler.\n        * If the handler completes, stop running code, we're done.\n        * If the handler calls 'pass afterKeyUp', continue:\n    * Script of the current stack is examined.\n    * If there is an 'on afterKeyUp' handler,\n        * Run the code in the mouseUp handler.\n\nCalling `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.\n\nSee documentation of the 'pass' command for more information.\n\nCalls 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.\n\n\n\n## Text and Chunks\n\n\n\n**Lines**\n\nUse `newline` to refer to a new line character.\n\nLet's say you wanted two lines of text in a field, you would use\n\nthe following:\n\n\n```\nput \"first line\" & newline & \"second line\" into cd fld \"myFld\"\n```\n\n\n(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.)\n\n**Chunks**\n\nViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:\n\n\n```\n\nput \"ab\" & tab & \"cd\" & tab & \"ef\" into myList\nset the itemDelimiter to tab\nput 2 into n\nanswer \"Result:\" & item n of myList\n\n```\n\nIf you have a comma-separated list you can get the nth item like this:\n\n\n```\n\nput \"ab,cd,ef\" into myList\nset the itemDelimiter to \",\"\nput 2 into n\nanswer \"Result:\" & item n of myList\n\n```\n\n\nMore advanced examples:\n\n\n```\n\nanswer char 2 of \"abcd\"\nanswer char (n + 1) of \"abcd\"\nanswer char 2 to 4 of \"abcd\"\n\nanswer item 2 of \"ab,cd,ef,gh\"\nanswer item (n + 1) of \"ab,cd,ef,gh\"\nanswer item 2 to 4 of \"ab,cd,ef,gh\"\n\nanswer first item of \"ab,cd,ef,gh\"\nanswer last item of \"ab,cd,ef,gh\"\nanswer any item of \"ab,cd,ef,gh\"\n\nput \"ab\" & newline & \"cd\" & newline & \"ef\" into myList\nanswer line 2 of myList\nanswer line (n + 1) of myList\nanswer line 2 to 3 of myList\n\n```\n\n\nRecursive scopes:\n\n```\n\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\n\nanswer item 2 of line 2 of myList\nanswer char 2 of line 2 of myList\nanswer char 2 of item 2 of line 2 of myList\n\nanswer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n\n```\n\n\n\n**Modifying by chunk**\n\n\n```\n\nput \"abcd\" into x\nput \"A\" into char 2 of x\nput \"A\" into char 2 to 4 of x\n\nput \"10,20,30\" into myList\nput \"A\" into item 2 of myList\nput \"A\" into item 2 to 3 of myList\nmultiply item 2 of myList by 5\nadd 1 to item 2 of myList\n\nput \"A\" into first item of myList\nput \"A\" into last item of myList\nput \"A\" into any item of myList\n\nput \"A\" into before item 2 of myList\nput \"A\" into after item 2 of myList\nput \"A\" into before char 2 of item 2 of myList\n\nput \"A\" into before item 2 of cd fld \"myFld\"\nput \"A\" into after item 2 of cd fld \"myFld\"\nput \"A\" into before char 2 of item 2 of cd fld \"myFld\"\n\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\nput \"A\" into item 2 of line 2 of myList\nput \"A\" into char 2 of line 2 of myList\nput \"A\" into char 2 of item 2 of line 2 of myList\n\nput \"A\" into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n\n```\n\n\n**Backwards compatiblity**\n\nWe went to much effort to maintain fidelity with HyperCard's chunk processing. All of the above can be done with words:\n\n\n```\n\nput \"ab cd ef\" into x\nanswer word 2 of x\nanswer word 2 to 3 of x\nput \"A\" into word 2 of x\nput \"A\" into word 2 to 3 of x\nput \"A\" into char 2 to 3 of word 2 to 3 of x\n\n```\n\n\nTo 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).\n\n\n```\n\n-- if compatibility mode is on:\n-- we follow HyperCard's non-intuitive behavior for the following:\nput \"ab,cd\" & newline & \"ef,gh\" & newline & \"ij,kl\" into myList\nput \"A\" into item 3 of item 4 of myList\nput \"A\" into item 3 of char 2 of myList\ndelete item 3 of item 4 of myList\ndelete item 3 of char 2 of myList\nadd 1 to item 3 of item 4 of myList\nadd 1 to item 3 of char 2 of myList\nanswer item 0 of myList\nput \"A\" into item 0 of myList\nanswer item 4 to 1 of myList\nput \"A\" into item 4 to 1 of myList\n\n\n-- The only known cases we don't support (we'll throw a runtime error):\nanswer item -1 of myList\nput \"A\" into item -1 of myList\ndelete item -1 of myList\nanswer char 2 of item 4 to 1 of myList\nput \"A\" into char 2 of item 4 to 1 of myList\ndelete char 2 of item 4 to 1 of myList\ndelete item 2 to 3 of myList\n\n```\n\n\nSee also documentation for the `delete` command.\n\n\n## Objects\n\n\nWays to refer to a button or field:\n\n```\n\ncd btn id 1234\ncd btn \"myBtn\"\ncd btn 2\nfirst cd btn\nany cd btn\nlast cd btn\n\n```\n\n\nWays to refer to a card:\n\n```\n\nthis card\nprev card\nnext card\nfirst card\nsecond card\nlast card\ncard 1\ncard id 1234\ncard \"name\"\n\n```\n\n\nWays to refer to a background:\n\n```\n\nthis background\nprev background\nnext background\nfirst background\nsecond background\nlast background\nbg 1\nbg id 1234\nbg \"name\"\n\n```\n\n\nWays to refer to a stack:\n\n```\n\nthis stack\nstack 1\nstack \"name\"\n\n```\n\nOther ways to refer to objects:\n\n```\n\nanswer the name of the target\nanswer the name of me\nanswer the name of the owner of cd btn id 1234\nput \"cd btn id 1234\" into x\nanswer the name of x\n\nfunction whichObject\n    return \"cd btn id 1234\"\nend whichObject\nanswer the name of whichObject()\n\n```\n\n\n\n## Structure\n\n\n\n**Loops**\n\n```\nrepeat with x = 1 to 3\n    ...other code here...\nend repeat\n```\n\n\nRefer to `repeat` under \"syntax\" for more information.\n\n**If statements**\n\n```\nif x > 1 then\n    ...other code here...\nelse\n    ...other code here...\nend if\n```\n\nRefer to `if` under \"syntax\" for more information.\n\n\n**Scripts**\n\nNo code can exist outside of a handler or function.\n\n**Handlers**\n\nHandlers look like this\n\n\n```\non mouseup \n    answer \"hello world\"\nend mouseup\n```\n\n    \nand respond to an event message.\n    \n**Functions**\n\nFunctions look like this\n\n\n```\nfunction myAddition p1, p2\n    return p1 + p2\nend myAddition\n```\n\n\nThey can then be called with code like\n\n```\nput myAddition(1,2) into x\n```\n\nFunctions inside of functions are not supported.\n\n\n**Statements**\n\nYou cannot have a line that is just\n\n`sqrt(0.5)`\n\nwith no command, this is a syntax error.\n    \nStatements occur on separate lines, there's no way to have more than one statement on a line.\n    \n**Expressions**\n\nA 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,\n\n\n```\ngo card 2\n-- is the same as\nput 1 into x\ngo card (x + 1)\n\nput \"abc\" into cd fld \"myFld1\"\nput \"abc\" into cd fld (prefix & \"1\")\n\nput \"a\" into line 4 of myList\nput \"a\" into line (x+1) of myList\n\nset the left of cd btn \"myBtn\" to x\nset the left of cd btn \"myBtn\" to (45 + 50 * cos(theta))\n\n```\n\n\n\n## Examples\n\n\nThe tutorial videos show helpful example code.\n\nExample 1:\n\n```\n\n-- after creating a field called \"myFld\":\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click button \"Go\", you get 10 points!\n    put cd fld \"myFld\" into score\n    put (score + 10) into score\n    put score into cd fld \"myFld\"\nend mouseUp\n\n\n```\n\n\nExample 2:\n\n```\n\n-- after creating a btn called \"fish\":\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click this, the fish moves\n    put the top of cd btn \"fish\" into y\n    subtract 10 from y\n    set the top of cd btn \"fish\" to y\nend mouseUp\n\n\n```\n\nExample 3:\n\n```\n\n-- create interactive art.\n-- put this in the card script,\n-- then when you choose the browse tool and \n-- click on the card, it will draw lines.\n\non mouseUp\n    put the clickH into X\n    put the clickV into y\n    \n    -- choose the line tool to draw lines\n    choose \"line\" tool\n    \n    -- make a loop that will repeat 10 times\n    repeat 10 times\n        put random(80) into randx\n        put random(80) into randy\n        -- will get random # between 1 and 80\n        drag from x, y to (x + randx), (y + randy)\n    end repeat\nend mouseUp\n  \n\n```\n\n\n\n\n## Tips & Shortcuts\n\n\n\nGeneral tips\n\n* If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script\n* See more error details, when in the Script Editor, by clicking on the error excerpt\n* Double-click the eraser tool to clear paint on the current card\n\nKeyboard shortcuts when editing text,\n\n* Cmd+C to copy\n* Cmd+X to cut\n* Cmd+V to paste\n* Cmd+A to select all\n* Cmd+Backspace to delete entire word\n* PageUp / PageDown to scroll one page\n* Shift+PageUp / Shift+PageDown to select one page\n* Home to move to start of line\n* Shift+Home to select to start of line\n* Cmd+Home to move to the start\n* Cmd+Shift+Home to select to the start\n* Left Arrow to move to the left\n* Shift+Left Arrow to select to the left\n* Cmd+Left Arrow to move left one word\n* Cmd+Shift+Left Arrow to select left one word\n* Cmd+Arrow Up to scroll up\n* Cmd+Arrow Down to scroll down\n* Cmd+D to duplicate the current line\n* Cmd+L to delete the current line\n* Cmd+Q to quickly comment-out or uncomment the current line\n* Cmd+Q when many lines are selected to comment-out all of them\n* Cmd+Q to comment-out a block of code\n* Tab key, to auto-indent code in a script\n\nSome of the main differences between ViperCard and HyperCard:\n* ViperCard is open source software that can run in any modern web browser\n* you can export stacks as a modern json format\n* art-stamps feature for adding clip art\n* new animation features like save-to-gif\n* in ViperCard you have to hit Save to save changes\n* but in ViperCard you have extensive undo history and can even undo changes made by a script\n\nA few of the differences between ViperCard and HyperCard:\n* You can use `--[[block comments]]` that span many lines.\n* You can write `exit to ViperCard` instead of `exit to HyperCard`\n* You must specify `cd` or `bg` when referring to a button or field, unless compatibility mode is enabled (Object->Stack Info)\n* Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.\n* Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool\n* You cannot read a variable that has not been set. `put unsetVar into x` causes a runtime error.\n* hilite and checkmark are separate properties\n* label and name are separate properties\n* You can't have a variable named id, short, long, first, and so on.\n* The `choose` command sets the emulated current tool, not the actual tool, and is limited to certain paint operations\n* The newline character is \\n and not \\r\n\n\n\n\n## What's New\n\n\nNew in 0.24\n* Script stack trace\n* Use `get the shiftKey`, deprecate `get the shiftKey()`\n* You can say `the sin of 4`\n* You can say `sin of 4`, `sin of cd fld 1`\n* Continue lines with logical-not, press `Alt-Enter` in code editor\n* Block comments `--[[a comment]]`\n* You can use `select`, `mark`, `doMenu` commands\n* You can turn on compat mode to allow `put \"a\" into fld 1`\n* Everything is case insensitive, even `cd btn \"aBcDe\"`\n* Improvements to `send` and `do`, script error shown in more helpful line\n* Improvements to built in functions like `selectedText`\n* Improvements to click features like `wait until the mouseClick`\n* You can say `put \"card id 2590\" into xx; put the name of xx into y`\n* You can use values for coords, e.g. `put \"3,4\" into c; set the loc of cd btn 1 to c`\n* Better match subtle differences between `target` and `the target`\n* Single-line `if` statements, fewer parentheses needed\n* Call custom functions from anywhere\n* Better cursors, better rendering on different screen resolutions\n* More fonts, all fonts have pixel-perfect spacing\n* You can use recursive chunks like `put \"a\" into char 7 of line 3 of x`\n* Improvements to load time by loading some libraries asynchronously\n* Common commands in script execution are faster\n* Scripts can dynamically create/delete objects, and set scripts\n* New features like `set the textstyle of line 3 of cd fld \"myFld\" to \"toggle-bold\"`\n\n\n\n## Credits\n\n\n\nViperCard\n\nhttps://github.com/moltenform/vipercard\n\nCopyright (C) 2020 Ben Fisher\n\nThis 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. \n\nThis 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.\n\nViperCard uses the following libraries:\n\n* Chevrotain\n    * https://github.com/SAP/chevrotain\n    * Apache License 2.0\n* FileSaver.js\n    * https://github.com/eligrey/FileSaver.js\n    * MIT License\n* Golly\n    * https://github.com/dannygarcia/golly\n    * MIT License\n* js-lru\n    * https://github.com/rsms/js-lru\n    * MIT License\n* Clipboard.js\n    * https://github.com/zenorocha/clipboard.js\n    * MIT License\n* base64js\n    * https://github.com/beatgammit/base64-js\n    * MIT License\n* JSGIF\n    * https://github.com/antimatter15/jsgif\n    * MIT License\n* Bresenham easy.filter\n    * http://members.chello.at/easyfilter/bresenham.html\n    * written permission of author\n* lz-string\n    * https://github.com/pieroxy/lz-string\n    * MIT License\n* Pizzicato\n    * https://github.com/alemangui/pizzicato\n    * MIT License\n* Bowser\n    * https://github.com/lancedikson/bowser\n    * MIT License\n* types-text-encoding \n    * https://www.npmjs.com/package/@types/text-encoding\n    * MIT License\n* deep-freeze\n    * https://github.com/substack/deep-freeze\n    * Public domain\n* pbkdf2 gist by Chris Veness\n* description of Mac OS Roman character set\n    * https://en.wikipedia.org/wiki/Mac_OS_Roman\n    * http://creativecommons.org/licenses/by-sa/3.0/\n    * Creative Commons Attribution-ShareAlike\n* and a small excerpt from the SciTE code editor,\n* ported from C++ to TypeScript by Ben Fisher\n* SciTE\n    * https://www.scintilla.org/License.txt\n\n"
  },
  {
    "path": "vipercard/doc/reference_02_commands",
    "content": "\n\n============================================================\n========================= add\n============================================================\n\nAdds the value of number to the number in a container.\n\nExamples:\n\nput 2 into x\nadd 3 to x\nanswer x -- will display \"5\"\n\nput \"1,2,3\" into x\nadd 3 to item 2 of x\nanswer x -- will display \"1,5,3\"\n\nadd 5 to cd fld \"myFld\"\n\n============================================================\n========================= answer\n============================================================\n\nDisplays a dialog box.\n\nThe button that is pressed (1, 2, or 3) will be assigned to the variable \"it\".\n\nExamples:\n\nanswer \"abc\" -- will display \"abc\"\n\nanswer \"are you sure?\" with \"OK\" or \"cancel\" \nput it into whichChosen\nif whichChosen is 1 then\nanswer \"clicked OK\"\nelse if whichChosen is 2 then\nanswer \"clicked cancel\"\nend if\n\nanswer \"many choices\" with \"btn1\" or \"btn2\"  or \"btn3\" \nanswer whichChosen\n\n\n============================================================\n========================= ask\n============================================================\n\nDisplays a dialog box allowing the user to type in a response.\n\nThe text typed will be assigned to the variable `it`. If the user clicks `Cancel`, the result will be `\"\"`.\n\nYou can say `ask \"prompt\"` or `ask \"prompt\" with \"default text\"`.\n\nExamples:\n\nask \"what is your name?\" with \"ben\"\nput it into yourName\nif yourName is \"\" then\n    answer \"you did not type a name\"\nelse\n    answer \"you typed\" && yourName\nend if\n\n============================================================\n========================= beep\n============================================================\n\n\nPlay the system beep sound.\n\n============================================================\n========================= choose tool\n============================================================\n\n\nYou can use the choose command to programmatically draw shapes and lines.\n\nWhen a script completes, you'll be taken back to the Browse tool regardless of which tool was chosen within a script.\n\nThe form `choose \"brush\" tool` and `choose tool 3` is also supported.\n\nExamples:\n\nchoose pencil tool\nclick at 10,20\n-- this draws a black pixel at the coordinates x=10, y=20\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\n-- tools include:\nbrush\nbucket\npencil\nline\nrect\noval\nroundrect\ncurve\nspray\nbrowse\n\n============================================================\n========================= click\n============================================================\n\nUse the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\n\nExamples:\n\nchoose pencil tool\nclick at 10,20\n-- this draws a pixel at the coordinates x=10, y=20\n\n\n============================================================\n========================= create\n============================================================\n\nUse `domenu \"new button\"` or `domenu \"new field\"` to create a button.\n\nExamples:\n\ndoMenu \"New Button\"\nput the result into newBtn\nset the name of cd btn id newBtn to \"my new button\"\nset the loc of cd btn id newBtn to 30, 30\n\n============================================================\n========================= do\n============================================================\n\nTake a string, and execute it as if it were a ViperCard script.\n\nSimilar to eval() in other languages.\n\nExamples:\n\nput \"answer \" into buildScript\nput quote & \"abc\" & quote after buildScript\ndo buildScript\n\n============================================================\n========================= doMenu\n============================================================\n\nDo a menu action.\n\nSupported actions include:\n\n`\ndoMenu \"new card\"\ndoMenu \"delete card\"\ndoMenu \"first\"\ndoMenu \"prev\"\ndoMenu \"next\"\ndoMenu \"last\"\ndoMenu \"new button\"\ndoMenu \"new field\"\ndoMenu \"duplicate card paint\"\n\n-- all items from the Draw menu like\ndoMenu \"black fill\"\n-- all items from the Font menu like\ndoMenu \"helvetica\"\n-- all items from the Style menu like\ndoMenu \"14\"\n\n`\n\n============================================================\n========================= dial\n============================================================\n\nThe 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.\n\nNote: If you include a hypen in the number, place the entire expression in quotation marks. Otherwise, ViperCard performs a subtraction before dialing the number.\n\nThe 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.\n\nExamples:\n\ndial \"\" -- begin loading the dial tone sounds\nwait 4 seconds\ndial \"555-1234\"\n\n============================================================\n========================= disable\n============================================================\n\nDisables a button (sets the \"enabled\" property to true, so that the button no longer responds to clicks).\n\n============================================================\n========================= divide\n============================================================\n\nDivides the number in a container by a number.\n\nExamples:\n\nput 12 into x\ndivide x by 3\nanswer x -- will display \"4\"\n\nput \"1,12,3\" into x\ndivide item 2 of x by 3\nanswer x -- will display \"1,4,3\"\n\n\n============================================================\n========================= delete (object or text)\n============================================================\n\n^Deleting objects^\n\n`-- delete objects\ndelete cd btn \"myBtn\"\ndelete card 14`\n\n^Deleting text^\n\n`put \"abcde\" into x\ndelete char 2 of x\nanswer x -- shows \"acde\"`\n\n`put \"abcde\" into x\ndelete char 2 to 4 of x\nanswer x -- shows \"ae\"`\n\n`put \"abcde\" into cd fld 1\ndelete char 2 to 4 of cd fld 1`\n\nDeleting 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.\n\nExamples:\n\n-- we support complex expressions\ndelete char 2 to 4 of item 3 of line 5 of myVar\ndelete item 3 of line 3 to 5 of myVar\ndelete first item of myVar\ndelete second item of myVar\ndelete last item of myVar\ndelete item 3 of myVar\ndelete line 3 of myVar\ndelete word 3 of myVar\n\n-- we do not support backwards ranges\ndelete item 3 to 2 of myVar\n\n-- we do not support out-of-order scopes\n-- (unless you go Object->Stack Info and turn on compatibility mode)\ndelete line 3 of item 3 of myVar -- error\ndelete item 3 of word 3 of myVar -- error\ndelete word 3 of char 3 of myVar -- error\ndelete word 3 of word 4 of myVar -- error\n\n-- we do not support deleting a range (unless chars)\ndelete word 3 to 5 of myVar -- not yet supported\n\n\n\n============================================================\n========================= drag\n============================================================\n\nUse the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\n\nExamples:\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\nchoose curve tool\ndrag from 10,20 to 30,40 to 50,60\n\n\n============================================================\n========================= enable\n============================================================\n\nEnables a button (sets the \"enabled\" property to false, so that the button is no longer disabled).\n\n============================================================\n========================= go to card\n============================================================\n\nGo to a different card.\n\nExamples:\n\ngo to card 1 -- goes to first card\ngo first -- goes to first card\ngo last -- goes to last card\ngo next -- goes to the next card\ngo prev -- goes to the previous card\n\nThe following are supported:\nlast\nmiddle\nany\nfirst\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neigth\nninth\ntenth\nnext\nprevious\nthis\nmid\nprev\n\n('go back' and 'go forth' are supported for compatibility with old scripts.)\n\n\n============================================================\n========================= hide\n============================================================\n\nHides a button or field.\n(sets the \"visible\" to false)\n\n============================================================\n========================= multiply\n============================================================\n\nMultiplies the number in a container by a number.\n\nExamples:\n\nput 12 into x\nmultiply x by 3\nanswer x -- will display \"36\"\n\nput \"1,12,3\" into x\nmultiply item 2 of x by 3\nanswer x -- will display \"1,36,3\"\n\nmultiply cd fld 1 by 5\n\n============================================================\n========================= lock___screen\n============================================================\n\nThis feature will arrive in a future version...\n\n============================================================\n========================= play\n============================================================\n\n\nPlay a sound effect.\n\nFor example, to play a chime sound,\n\n`play \"glider_1_Extra\" load\nwait 4 seconds\nplay \"glider_1_Extra\"`\n\nYou 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.\n\nYou can't say `play (\"glider\" & x)`, instead do the equivalent `put \"glider\" & x into tmp; play tmp`\n\nViperCard can play the following sounds:\n\n`glider_1_Aww\nglider_1_Bass\nglider_1_BeamIn\nglider_1_BlowerOn\nglider_1_Bounce\nglider_1_Clock\nglider_1_Crunch\nglider_1_Drip\nglider_1_Energize\nglider_1_Extra\nglider_1_FireBand\nglider_1_GetBand\nglider_1_GoodMove\nglider_1_GreaseFall\nglider_1_Guitar\nglider_1_Hey!\nglider_1_Lightning\nglider_1_LightsOn\nglider_1_Pop\nglider_1_Push\nglider_1_Shredder\nglider_1_Tick\nglider_1_ToastDrop\nglider_1_ToastJump\nglider_1_Yow!\nglider_1_Zap`\n\n============================================================\n========================= put\n============================================================\n\nPut an expression into a variable or field.\n\nExamples:\n\nput 2+3 into x\nanswer x -- shows 5\n\nput \"hello\" into cd fld \"message\"\n\nput \"aa,bb,cc\" into x\nput \"11\" into item 2 of x\nanswer x -- shows \"aa,11,cc\"\n\nput \"abc\" into x\nput \"q\" into char 2 of x\nanswer x -- shows \"aqc\"\n\nput \"appended text\" after x\nput \"prepended text\" before x\n\n-- if the message box is open, you can display the contents of a variable into the message box,\n-- this is similar to \"print\" or \"writeline\" in other languages.\nput 2+3 into x\nput x into the msg box\n\n\n============================================================\n========================= replace\n============================================================\n\nReplace all occurrences of a string.\n\nExamples:\nput \"a-b-c\" into x\nreplace \"-\" with \"_\" in x\nanswer x -- shows a_b_c\n\n\n-- you can also use replace in a field.\nput \"-\" into search\nput \"_\" into replacement\nreplace search with replacement in cd fld \"myFld\"\n\n============================================================\n========================= select\n============================================================\n\nSet the selection in a field. For this to take effect, the field must be on the current card.\nExamples:\n\n-- set the selection\nselect char 2 to 4 of cd fld \"myFld\"\nselect line 3 of cd fld \"myFld\"\nselect item 2 to 3 of cd fld \"myFld\"\n\n-- set the caret position\nselect before char 3 of cd fld \"myFld\"\nselect before line 3 of cd fld \"myFld\"\nselect after char 3 of cd fld \"myFld\"\nselect before text of cd fld \"myFld\"\nselect after text of cd fld \"myFld\"\n\n-- select all\nselect text of cd fld \"myFld\"\n\n-- clear selection\nselect empty\n\n-- look up field by string\nselect char 1 of the selectedField\n\n============================================================\n========================= send\n============================================================\n\nTake a string, and execute it as if it were a ViperCard script in the context of an object.\n\nMessages in ViperCard automatically travel upwards from button to card, background, and then stack.\n\nBut 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.\n\nExamples:\n\n-- sending a message to a different card\nsend \"prepareNextCard\" to card \"otherCard\"\n\n-- simulate a button click\nsend \"mouseUp\" to cd btn \"myButton\"\n\n-- if you have hundreds of lines of code in one script, this\n-- can feel disorganized. with \"send\" you can store code\n-- in other objects, for example, moving\n-- mathematical computation to a different card or button.\n-- in the script of cd btn \"mathUtils\" of card \"otherCard\", write\non myCompute a, b\nreturn a * a + b\nend myCompute\n\n-- from another script\nsend \"myCompute 3, 4\" to cd btn \"mathUtils\" of card \"otherCard\"\nput the result into x\n\n============================================================\n========================= set\n============================================================\n\nUse the set command to change a property.\nA few examples:\n\n`set the width of cd btn \"myButton\" to 100\nset the topLeft of cd btn \"myButton\" to 24, 25\nput the long name of btn \"myButton\" into x\nset the textsize of char 2 to 4 of cd fld \"myFld\" to 18 \nset the itemdelimiter to \"|\"`\n\nSee the \"Properties\" section of documentation for more.\n\n\n============================================================\n========================= show\n============================================================\n\nShows a button or field.\n(sets the \"visible\" to true)\n\n============================================================\n========================= sort\n============================================================\n\nNew: 'sort by each' expressions.\n\nSort styles:\n* text sorting (default), compares text, not case sensitive.\n* numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\n* ascending (default)\n* descending\n\nSort granularity:\n* sort items of x\n* sort lines of x\n* sort chars of x\n\nExamples:\n\nput \"aa,cc,bb\" into x\nsort items of x\nanswer x -- displays \"aa,bb,cc\"\n\nput \"aa|cc|bb\" into x\nset the itemDelimiter to \"|\"\nsort items of x\nanswer x -- displays \"aa|b|cc\"\n\nput \"ac,bb,ca\" into x\nsort items of x by char 2 of each\nanswer x -- displays \"ca,bb,ac\"\n\n-- numeric is needed!\nput \"12,24,1,5\" into x\nsort items of x numeric\nanswer x -- displays \"1,5,12,24\"\n\nput \"12,24,1,5\" into x\nsort descending items of x numeric\nanswer x -- displays \"24,12,5,1\"\n\n\n============================================================\n========================= subtract\n============================================================\n\nSubtracts a number from the number in a container.\n\nExamples:\n\nput 12 into x\nsubtract 3 from x\nanswer x -- will display \"9\"\n\nput \"1,12,3\" into x\nsubtract 3 from item 2 of x\nanswer x -- will display \"1,9,3\"\n\nsubtract 1 from cd fld \"myFld\"\n\n============================================================\n========================= unlock___screen\n============================================================\n\nThis feature will arrive in a future version...\n\n\n============================================================\n========================= wait\n============================================================\n\nPauses the script. By default waits in \"ticks\", which are 60th of a second.\n\nExamples:\n\nwait 500 ms -- pauses for half a second.\n\n--(A paused script can be terminated by clicking the Stop icon in the\n--navigation palette, or by changing to the button or field tool.)\n\nwait until the mouseH > 120\nwait until the shiftKey\nwait until the mouseClick -- now supported\n\nwait 5 seconds\nwait 5 ticks\nwait 5 milliseconds\nwait 5 ms\n\n============================================================\n========================= visual___effect\n============================================================\n\nThis feature will arrive in a future version...\n\n"
  },
  {
    "path": "vipercard/doc/reference_02_commands.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[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)\n\n\n\n## add\n\n\nAdds the value of number to the number in a container.\n\nExamples:\n\n```\n\n\nput 2 into x\nadd 3 to x\nanswer x -- will display \"5\"\n\nput \"1,2,3\" into x\nadd 3 to item 2 of x\nanswer x -- will display \"1,5,3\"\n\nadd 5 to cd fld \"myFld\"\n\n\n```\n\n\n\n## answer\n\n\nDisplays a dialog box.\n\nThe button that is pressed (1, 2, or 3) will be assigned to the variable \"it\".\n\nExamples:\n\n```\n\n\nanswer \"abc\" -- will display \"abc\"\n\nanswer \"are you sure?\" with \"OK\" or \"cancel\" \nput it into whichChosen\nif whichChosen is 1 then\nanswer \"clicked OK\"\nelse if whichChosen is 2 then\nanswer \"clicked cancel\"\nend if\n\nanswer \"many choices\" with \"btn1\" or \"btn2\"  or \"btn3\" \nanswer whichChosen\n\n\n\n```\n\n\n\n## ask\n\n\nDisplays a dialog box allowing the user to type in a response.\n\nThe text typed will be assigned to the variable `it`. If the user clicks `Cancel`, the result will be `\"\"`.\n\nYou can say `ask \"prompt\"` or `ask \"prompt\" with \"default text\"`.\n\nExamples:\n\n```\n\n\nask \"what is your name?\" with \"ben\"\nput it into yourName\nif yourName is \"\" then\n    answer \"you did not type a name\"\nelse\n    answer \"you typed\" && yourName\nend if\n\n\n```\n\n\n\n## beep\n\n\n\nPlay the system beep sound.\n\n\n## choose tool\n\n\n\nYou can use the choose command to programmatically draw shapes and lines.\n\nWhen a script completes, you'll be taken back to the Browse tool regardless of which tool was chosen within a script.\n\nThe form `choose \"brush\" tool` and `choose tool 3` is also supported.\n\nExamples:\n\n```\n\n\nchoose pencil tool\nclick at 10,20\n-- this draws a black pixel at the coordinates x=10, y=20\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\n-- tools include:\nbrush\nbucket\npencil\nline\nrect\noval\nroundrect\ncurve\nspray\nbrowse\n\n\n```\n\n\n\n## click\n\n\nUse the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\n\nExamples:\n\n```\n\n\nchoose pencil tool\nclick at 10,20\n-- this draws a pixel at the coordinates x=10, y=20\n\n\n\n```\n\n\n\n## create\n\n\nUse `domenu \"new button\"` or `domenu \"new field\"` to create a button.\n\nExamples:\n\n```\n\n\ndoMenu \"New Button\"\nput the result into newBtn\nset the name of cd btn id newBtn to \"my new button\"\nset the loc of cd btn id newBtn to 30, 30\n\n\n```\n\n\n\n## do\n\n\nTake a string, and execute it as if it were a ViperCard script.\n\nSimilar to eval() in other languages.\n\nExamples:\n\n```\n\n\nput \"answer \" into buildScript\nput quote & \"abc\" & quote after buildScript\ndo buildScript\n\n\n```\n\n\n\n## doMenu\n\n\nDo a menu action.\n\nSupported actions include:\n\n\n```\n\ndoMenu \"new card\"\ndoMenu \"delete card\"\ndoMenu \"first\"\ndoMenu \"prev\"\ndoMenu \"next\"\ndoMenu \"last\"\ndoMenu \"new button\"\ndoMenu \"new field\"\ndoMenu \"duplicate card paint\"\n\n-- all items from the Draw menu like\ndoMenu \"black fill\"\n-- all items from the Font menu like\ndoMenu \"helvetica\"\n-- all items from the Style menu like\ndoMenu \"14\"\n\n\n```\n\n\n\n## dial\n\n\nThe 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.\n\nNote: If you include a hypen in the number, place the entire expression in quotation marks. Otherwise, ViperCard performs a subtraction before dialing the number.\n\nThe 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.\n\nExamples:\n\n```\n\n\ndial \"\" -- begin loading the dial tone sounds\nwait 4 seconds\ndial \"555-1234\"\n\n\n```\n\n\n\n## disable\n\n\nDisables a button (sets the \"enabled\" property to true, so that the button no longer responds to clicks).\n\n\n## divide\n\n\nDivides the number in a container by a number.\n\nExamples:\n\n```\n\n\nput 12 into x\ndivide x by 3\nanswer x -- will display \"4\"\n\nput \"1,12,3\" into x\ndivide item 2 of x by 3\nanswer x -- will display \"1,4,3\"\n\n\n\n```\n\n\n\n## delete (object or text)\n\n\n**Deleting objects**\n\n\n```\n-- delete objects\ndelete cd btn \"myBtn\"\ndelete card 14\n```\n\n\n**Deleting text**\n\n\n```\nput \"abcde\" into x\ndelete char 2 of x\nanswer x -- shows \"acde\"\n```\n\n\n\n```\nput \"abcde\" into x\ndelete char 2 to 4 of x\nanswer x -- shows \"ae\"\n```\n\n\n\n```\nput \"abcde\" into cd fld 1\ndelete char 2 to 4 of cd fld 1\n```\n\n\nDeleting 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.\n\nExamples:\n\n```\n\n\n-- we support complex expressions\ndelete char 2 to 4 of item 3 of line 5 of myVar\ndelete item 3 of line 3 to 5 of myVar\ndelete first item of myVar\ndelete second item of myVar\ndelete last item of myVar\ndelete item 3 of myVar\ndelete line 3 of myVar\ndelete word 3 of myVar\n\n-- we do not support backwards ranges\ndelete item 3 to 2 of myVar\n\n-- we do not support out-of-order scopes\n-- (unless you go Object->Stack Info and turn on compatibility mode)\ndelete line 3 of item 3 of myVar -- error\ndelete item 3 of word 3 of myVar -- error\ndelete word 3 of char 3 of myVar -- error\ndelete word 3 of word 4 of myVar -- error\n\n-- we do not support deleting a range (unless chars)\ndelete word 3 to 5 of myVar -- not yet supported\n\n\n\n\n```\n\n\n\n## drag\n\n\nUse the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\n\nExamples:\n\n```\n\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\nchoose curve tool\ndrag from 10,20 to 30,40 to 50,60\n\n\n\n```\n\n\n\n## enable\n\n\nEnables a button (sets the \"enabled\" property to false, so that the button is no longer disabled).\n\n\n## go to card\n\n\nGo to a different card.\n\nExamples:\n\n```\n\n\ngo to card 1 -- goes to first card\ngo first -- goes to first card\ngo last -- goes to last card\ngo next -- goes to the next card\ngo prev -- goes to the previous card\n\nThe following are supported:\nlast\nmiddle\nany\nfirst\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neigth\nninth\ntenth\nnext\nprevious\nthis\nmid\nprev\n\n('go back' and 'go forth' are supported for compatibility with old scripts.)\n\n\n\n```\n\n\n\n## hide\n\n\nHides a button or field.\n\n(sets the \"visible\" to false)\n\n\n## multiply\n\n\nMultiplies the number in a container by a number.\n\nExamples:\n\n```\n\n\nput 12 into x\nmultiply x by 3\nanswer x -- will display \"36\"\n\nput \"1,12,3\" into x\nmultiply item 2 of x by 3\nanswer x -- will display \"1,36,3\"\n\nmultiply cd fld 1 by 5\n\n\n```\n\n\n\n## lock screen\n\n\nThis feature will arrive in a future version...\n\n\n## play\n\n\n\nPlay a sound effect.\n\nFor example, to play a chime sound,\n\n\n```\nplay \"glider_1_Extra\" load\nwait 4 seconds\nplay \"glider_1_Extra\"\n```\n\n\nYou 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.\n\nYou can't say `play (\"glider\" & x)`, instead do the equivalent `put \"glider\" & x into tmp; play tmp`\n\nViperCard can play the following sounds:\n\n\n```\nglider_1_Aww\nglider_1_Bass\nglider_1_BeamIn\nglider_1_BlowerOn\nglider_1_Bounce\nglider_1_Clock\nglider_1_Crunch\nglider_1_Drip\nglider_1_Energize\nglider_1_Extra\nglider_1_FireBand\nglider_1_GetBand\nglider_1_GoodMove\nglider_1_GreaseFall\nglider_1_Guitar\nglider_1_Hey!\nglider_1_Lightning\nglider_1_LightsOn\nglider_1_Pop\nglider_1_Push\nglider_1_Shredder\nglider_1_Tick\nglider_1_ToastDrop\nglider_1_ToastJump\nglider_1_Yow!\nglider_1_Zap\n```\n\n\n\n## put\n\n\nPut an expression into a variable or field.\n\nExamples:\n\n```\n\n\nput 2+3 into x\nanswer x -- shows 5\n\nput \"hello\" into cd fld \"message\"\n\nput \"aa,bb,cc\" into x\nput \"11\" into item 2 of x\nanswer x -- shows \"aa,11,cc\"\n\nput \"abc\" into x\nput \"q\" into char 2 of x\nanswer x -- shows \"aqc\"\n\nput \"appended text\" after x\nput \"prepended text\" before x\n\n-- if the message box is open, you can display the contents of a variable into the message box,\n-- this is similar to \"print\" or \"writeline\" in other languages.\nput 2+3 into x\nput x into the msg box\n\n\n\n```\n\n\n\n## replace\n\n\nReplace all occurrences of a string.\n\nExamples:\n\n```\n\nput \"a-b-c\" into x\nreplace \"-\" with \"_\" in x\nanswer x -- shows a_b_c\n\n\n-- you can also use replace in a field.\nput \"-\" into search\nput \"_\" into replacement\nreplace search with replacement in cd fld \"myFld\"\n\n\n```\n\n\n\n## select\n\n\nSet the selection in a field. For this to take effect, the field must be on the current card.\n\nExamples:\n\n```\n\n\n-- set the selection\nselect char 2 to 4 of cd fld \"myFld\"\nselect line 3 of cd fld \"myFld\"\nselect item 2 to 3 of cd fld \"myFld\"\n\n-- set the caret position\nselect before char 3 of cd fld \"myFld\"\nselect before line 3 of cd fld \"myFld\"\nselect after char 3 of cd fld \"myFld\"\nselect before text of cd fld \"myFld\"\nselect after text of cd fld \"myFld\"\n\n-- select all\nselect text of cd fld \"myFld\"\n\n-- clear selection\nselect empty\n\n-- look up field by string\nselect char 1 of the selectedField\n\n\n```\n\n\n\n## send\n\n\nTake a string, and execute it as if it were a ViperCard script in the context of an object.\n\nMessages in ViperCard automatically travel upwards from button to card, background, and then stack.\n\nBut 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.\n\nExamples:\n\n```\n\n\n-- sending a message to a different card\nsend \"prepareNextCard\" to card \"otherCard\"\n\n-- simulate a button click\nsend \"mouseUp\" to cd btn \"myButton\"\n\n-- if you have hundreds of lines of code in one script, this\n-- can feel disorganized. with \"send\" you can store code\n-- in other objects, for example, moving\n-- mathematical computation to a different card or button.\n-- in the script of cd btn \"mathUtils\" of card \"otherCard\", write\non myCompute a, b\nreturn a * a + b\nend myCompute\n\n-- from another script\nsend \"myCompute 3, 4\" to cd btn \"mathUtils\" of card \"otherCard\"\nput the result into x\n\n\n```\n\n\n\n## set\n\n\nUse the set command to change a property.\n\nA few examples:\n\n\n```\nset the width of cd btn \"myButton\" to 100\nset the topLeft of cd btn \"myButton\" to 24, 25\nput the long name of btn \"myButton\" into x\nset the textsize of char 2 to 4 of cd fld \"myFld\" to 18 \nset the itemdelimiter to \"|\"\n```\n\n\nSee the \"Properties\" section of documentation for more.\n\n\n\n## show\n\n\nShows a button or field.\n\n(sets the \"visible\" to true)\n\n\n## sort\n\n\nNew: 'sort by each' expressions.\n\nSort styles:\n* text sorting (default), compares text, not case sensitive.\n* numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\n* ascending (default)\n* descending\n\nSort granularity:\n* sort items of x\n* sort lines of x\n* sort chars of x\n\nExamples:\n\n```\n\n\nput \"aa,cc,bb\" into x\nsort items of x\nanswer x -- displays \"aa,bb,cc\"\n\nput \"aa|cc|bb\" into x\nset the itemDelimiter to \"|\"\nsort items of x\nanswer x -- displays \"aa|b|cc\"\n\nput \"ac,bb,ca\" into x\nsort items of x by char 2 of each\nanswer x -- displays \"ca,bb,ac\"\n\n-- numeric is needed!\nput \"12,24,1,5\" into x\nsort items of x numeric\nanswer x -- displays \"1,5,12,24\"\n\nput \"12,24,1,5\" into x\nsort descending items of x numeric\nanswer x -- displays \"24,12,5,1\"\n\n\n\n```\n\n\n\n## subtract\n\n\nSubtracts a number from the number in a container.\n\nExamples:\n\n```\n\n\nput 12 into x\nsubtract 3 from x\nanswer x -- will display \"9\"\n\nput \"1,12,3\" into x\nsubtract 3 from item 2 of x\nanswer x -- will display \"1,9,3\"\n\nsubtract 1 from cd fld \"myFld\"\n\n\n```\n\n\n\n## unlock screen\n\n\nThis feature will arrive in a future version...\n\n\n\n## wait\n\n\nPauses the script. By default waits in \"ticks\", which are 60th of a second.\n\nExamples:\n\n```\n\n\nwait 500 ms -- pauses for half a second.\n\n--(A paused script can be terminated by clicking the Stop icon in the\n--navigation palette, or by changing to the button or field tool.)\n\nwait until the mouseH > 120\nwait until the shiftKey\nwait until the mouseClick -- now supported\n\nwait 5 seconds\nwait 5 ticks\nwait 5 milliseconds\nwait 5 ms\n\n\n```\n\n\n\n## visual effect\n\n\nThis feature will arrive in a future version...\n\n"
  },
  {
    "path": "vipercard/doc/reference_03_syntax",
    "content": "\n\n\n============================================================\n========================= (Operators)\n============================================================\n\nHere are the operators that can be used.\n`2 * 3`\nmultiplication\n`2 / 3`\ndivision\n`2 $caret$ 3`\nraise to the third power\n`7 div 5`\ntruncated division\n`7 mod 5`\nmodulo\n`2 > 3`\ngreater than\n`2 < 3`\nless than\n`2 >= 3`\ngreater than or equal to\n`2 <= 3`\nless than or equal to\n`2  ==  3`\nequal to\n`2  !=  3`\nnot equal to\n`\"abc\" is \"def\"`\nequal to\n`\"abc\" is not \"def\"`\nnot equal to\n`\"abc\" is in \"123abcdef\"`\ndoes string contain another string\n`\"abc\" is not in \"123abcdef\"`\nstring is not in another string\n`2 + 3`\naddition\n`2 - 3`\nsubtraction\n\n`&` and `&&` combine two strings (concatenation).\n`put \"a\" & \"b\" into x\nanswer x -- displays \"ab\"\nput \"a\" && \"b\" into x\nanswer x -- displays \"a b\"`\n\nYou can also use `a = b`, which is equivalent to `a == b`\n\n^Logical operators^\n\nThe 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.\n`true and false`\nlogical and\n`true or false`\nlogical or\n`not true`\nlogical not\n\nLogical operations are not guaranteed to be short-circuiting. In other words,\n`put (true or myfunction()) into x`\nstill will call `myfunction`, when it hypothetically could have been skipped.\n\n\n\n============================================================\n========================= (Constants)\n============================================================\n\nThe following constants are defined:\n`\npi\nnewline\ntab\nempty\nquote\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\ncolon\ncomma\ntrue\nfalse\nup\ndown\nspace\nreturn\ncr\nformfeed\nlinefeed`\n\n\n============================================================\n========================= global\n============================================================\n\nDeclares that a variable is a global.\n1) it can be accessed from any other script\n2) the contents are saved even after the function is complete.\nThe contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.\n\nExamples:\n\nglobal currentData1, currentData2\nput \"stored 1\" into currentData1\nput \"stored 2\" into currentData2\n\n\n============================================================\n========================= if/then\n============================================================\n\n\nUse to run certain code based on a condition that can be true or false.\n\nIn the example\n\n`\nput 2 into x\nif x > 0 then\n    answer \"x is greater than 0\"\nend if`\n\nFirst, we'll check the expression `x > 0`. Since it evaluates to true, the code inside is run. \n\nYou can also include an \"else\" section that will be run only if the expression evaluated to false.\n\n`if x > 0 then\n    answer \"x is greater than 0\"\nelse\n    answer \"x is not greater than 0\"\nend if`\n\nYou can chain together many different conditions with \"else if\". \n\n`\nput 3 into x\nif x > 3 then\n    answer \"x is greater than 3\"\nelse if x < 3 then\n    answer \"x is less than 3\"\nelse if x is 3 then\n    answer \"x is 3\"\nend if`\n\nAs soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.\n\n`\nif 3+3 is 6 then\n    answer \"aaa\"\nelse if 2+2 is 4 then\n    -- this not run, even though the expression is true\n    answer \"bbb\"\nend if\n`\n\n============================================================\n========================= short if/then\n============================================================\n\nExamples:\n\nif 3+3 is 6 then answer \"it is\"\n\n-- you can even do this\n\nif 3+3 is 7 then answer \"it is not\"\nelse answer \"it is\"\n\n============================================================\n========================= exit___repeat\n============================================================\n\nExit the current loop. Equivalent to \"break\" in C.\n\nExamples:\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        exit repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- and does not display 2 or 3\n\n============================================================\n========================= exit\n============================================================\n\nSkips to the end of the current handler, skipping over all subsequent lines of code. Similar to return, but does not point to a value.\n\nExamples:\n\non mouseUp\n    put cd fld \"fld1\" into x\n    if x is not a number then\n        answer \"you did not type a number\"\n        exit mouseUp\n        answer \"this will never get called\"\n    end if\n    put x * 2 into cd fld \"fld1\"\nend mouseUp\n\n============================================================\n========================= exit to ViperCard\n============================================================\n\nExits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.\n\nFor 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.\n\nExamples:\n\non myHandler\n    exit to ViperCard\n    answer \"this will never get called\"\nend myHandler\non mouseUp\n    myHandler\n    answer \"and even this will never get called\"\nend mouseUp\n\n============================================================\n========================= next___repeat\n============================================================\n\nInside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to \"continue\" in C.\n\nExamples:\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        next repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- displays 3\n-- and does not display 2\n\n============================================================\n========================= pass\n============================================================\n\nExits the current function and calls a function higher in the message hierarchy. For example, if a button has the script\n`on mouseUp\n    answer \"button handling the event\"\nend mouseUp\n-- and the current card has the script\non mouseUp\n    answer \"card handling the event\"\nend mouseUp`\nand the button is clicked, only the button's code will be run.\n\nIf you want both to be run, you can use the pass command. If a button has the script\n`on mouseUp\n    answer \"button handling the event\"\n    pass mouseUp\n    -- any code here will be skipped\nend mouseUp\n--and the current card has the script\non mouseUp\n    answer \"card handling the event\"\nend mouseUp`\nand the button is clicked,\nboth will be run.\n\n\n============================================================\n========================= repeat\n============================================================\n\nUse to create a loop.\n\nExamples:\n\nrepeat with x = 1 to 5\n    answer \"x is now\" & x\nend repeat\n\nrepeat with x = 5 down to 1\n    answer \"x is now\" & x\nend repeat\n\nrepeat 3 times\n    answer \"hi\"\nend repeat\n\nrepeat forever\n    answer \"this is an infinite loop\"\nend repeat\n\nput 0 into counter\nrepeat forever\n    answer \"but not this\"\n    add 1 to counter\n    if counter > 3 then\n        exit repeat\n    end if\nend repeat\n\nput 0 into counter\nrepeat until counter > 3\n    add 1 to counter\nend repeat\n\nput 0 into counter\nrepeat while counter <= 3\n    add 1 to counter\nend repeat\n\n============================================================\n========================= return\n============================================================\n\nReturns a value from the current function.\nNote: no lines of code after the return statement will be run.\n\nExamples:\n\nfunction myAddition p1, p2\n    return p1 + p2\n    answer \"this line will never be reached\"\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp\n"
  },
  {
    "path": "vipercard/doc/reference_03_syntax.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[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)\n\n\n\n## (Operators)\n\n\nHere are the operators that can be used.\n\n```\n2 * 3\n```\n\nmultiplication\n\n```\n2 / 3\n```\n\ndivision\n\n```\n2 ^ 3\n```\n\nraise to the third power\n\n```\n7 div 5\n```\n\ntruncated division\n\n```\n7 mod 5\n```\n\nmodulo\n\n```\n2 > 3\n```\n\ngreater than\n\n```\n2 < 3\n```\n\nless than\n\n```\n2 >= 3\n```\n\ngreater than or equal to\n\n```\n2 <= 3\n```\n\nless than or equal to\n\n```\n2  ==  3\n```\n\nequal to\n\n```\n2  !=  3\n```\n\nnot equal to\n\n```\n\"abc\" is \"def\"\n```\n\nequal to\n\n```\n\"abc\" is not \"def\"\n```\n\nnot equal to\n\n```\n\"abc\" is in \"123abcdef\"\n```\n\ndoes string contain another string\n\n```\n\"abc\" is not in \"123abcdef\"\n```\n\nstring is not in another string\n\n```\n2 + 3\n```\n\naddition\n\n```\n2 - 3\n```\n\nsubtraction\n\n`&` and `&&` combine two strings (concatenation).\n\n```\nput \"a\" & \"b\" into x\nanswer x -- displays \"ab\"\nput \"a\" && \"b\" into x\nanswer x -- displays \"a b\"\n```\n\n\nYou can also use `a = b`, which is equivalent to `a == b`\n\n**Logical operators**\n\nThe 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.\n\n```\ntrue and false\n```\n\nlogical and\n\n```\ntrue or false\n```\n\nlogical or\n\n```\nnot true\n```\n\nlogical not\n\nLogical operations are not guaranteed to be short-circuiting. In other words,\n\n```\nput (true or myfunction()) into x\n```\n\nstill will call `myfunction`, when it hypothetically could have been skipped.\n\n\n\n\n## (Constants)\n\n\nThe following constants are defined:\n\n```\n\npi\nnewline\ntab\nempty\nquote\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\ncolon\ncomma\ntrue\nfalse\nup\ndown\nspace\nreturn\ncr\nformfeed\nlinefeed\n```\n\n\n\n\n## global\n\n\nDeclares that a variable is a global.\n\n1) it can be accessed from any other script\n\n2) the contents are saved even after the function is complete.\n\nThe contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.\n\nExamples:\n\n```\n\n\nglobal currentData1, currentData2\nput \"stored 1\" into currentData1\nput \"stored 2\" into currentData2\n\n\n\n```\n\n\n\n## if/then\n\n\n\nUse to run certain code based on a condition that can be true or false.\n\nIn the example\n\n\n```\n\nput 2 into x\nif x > 0 then\n    answer \"x is greater than 0\"\nend if\n```\n\n\nFirst, we'll check the expression `x > 0`. Since it evaluates to true, the code inside is run. \n\nYou can also include an \"else\" section that will be run only if the expression evaluated to false.\n\n\n```\nif x > 0 then\n    answer \"x is greater than 0\"\nelse\n    answer \"x is not greater than 0\"\nend if\n```\n\n\nYou can chain together many different conditions with \"else if\". \n\n\n```\n\nput 3 into x\nif x > 3 then\n    answer \"x is greater than 3\"\nelse if x < 3 then\n    answer \"x is less than 3\"\nelse if x is 3 then\n    answer \"x is 3\"\nend if\n```\n\n\nAs soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.\n\n\n```\n\nif 3+3 is 6 then\n    answer \"aaa\"\nelse if 2+2 is 4 then\n    -- this not run, even though the expression is true\n    answer \"bbb\"\nend if\n\n```\n\n\n\n## short if/then\n\n\nExamples:\n\n```\n\n\nif 3+3 is 6 then answer \"it is\"\n\n-- you can even do this\n\nif 3+3 is 7 then answer \"it is not\"\nelse answer \"it is\"\n\n\n```\n\n\n\n## exit repeat\n\n\nExit the current loop. Equivalent to \"break\" in C.\n\nExamples:\n\n```\n\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        exit repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- and does not display 2 or 3\n\n\n```\n\n\n\n## exit\n\n\nSkips to the end of the current handler, skipping over all subsequent lines of code. Similar to return, but does not point to a value.\n\nExamples:\n\n```\n\n\non mouseUp\n    put cd fld \"fld1\" into x\n    if x is not a number then\n        answer \"you did not type a number\"\n        exit mouseUp\n        answer \"this will never get called\"\n    end if\n    put x * 2 into cd fld \"fld1\"\nend mouseUp\n\n\n```\n\n\n\n## exit to ViperCard\n\n\nExits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.\n\nFor 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.\n\nExamples:\n\n```\n\n\non myHandler\n    exit to ViperCard\n    answer \"this will never get called\"\nend myHandler\non mouseUp\n    myHandler\n    answer \"and even this will never get called\"\nend mouseUp\n\n\n```\n\n\n\n## next repeat\n\n\nInside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to \"continue\" in C.\n\nExamples:\n\n```\n\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        next repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- displays 3\n-- and does not display 2\n\n\n```\n\n\n\n## pass\n\n\nExits the current function and calls a function higher in the message hierarchy. For example, if a button has the script\n\n```\non mouseUp\n    answer \"button handling the event\"\nend mouseUp\n-- and the current card has the script\non mouseUp\n    answer \"card handling the event\"\nend mouseUp\n```\n\nand the button is clicked, only the button's code will be run.\n\nIf you want both to be run, you can use the pass command. If a button has the script\n\n```\non mouseUp\n    answer \"button handling the event\"\n    pass mouseUp\n    -- any code here will be skipped\nend mouseUp\n--and the current card has the script\non mouseUp\n    answer \"card handling the event\"\nend mouseUp\n```\n\nand the button is clicked,\n\nboth will be run.\n\n\n\n## repeat\n\n\nUse to create a loop.\n\nExamples:\n\n```\n\n\nrepeat with x = 1 to 5\n    answer \"x is now\" & x\nend repeat\n\nrepeat with x = 5 down to 1\n    answer \"x is now\" & x\nend repeat\n\nrepeat 3 times\n    answer \"hi\"\nend repeat\n\nrepeat forever\n    answer \"this is an infinite loop\"\nend repeat\n\nput 0 into counter\nrepeat forever\n    answer \"but not this\"\n    add 1 to counter\n    if counter > 3 then\n        exit repeat\n    end if\nend repeat\n\nput 0 into counter\nrepeat until counter > 3\n    add 1 to counter\nend repeat\n\nput 0 into counter\nrepeat while counter <= 3\n    add 1 to counter\nend repeat\n\n\n```\n\n\n\n## return\n\n\nReturns a value from the current function.\n\nNote: no lines of code after the return statement will be run.\n\nExamples:\n\n```\n\n\nfunction myAddition p1, p2\n    return p1 + p2\n    answer \"this line will never be reached\"\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp\n\n\n```\n\n"
  },
  {
    "path": "vipercard/doc/reference_04_properties",
    "content": "\n \n\n============================================================\n========================= id\n============================================================\n\nThe id uniquely identifies an object. In ViperCard, all objects will have different ids, even if they are different types or are on different cards.\n\nIf you put the long id of an object into a variable, you can use that variable to refer to the object.\n\n`put the long id of card id 1011 into z\nset the name of z to \"changed\"`\n\nThe short id of an object is just the number. For example the short id of card id 1011 is 1011.\n\n`put the short id of card id 1011 into z\nset the name of cd id z to \"changed\"`\n\n============================================================\n========================= name\n============================================================\n\nYou can get or set the name of an object.\n`\ndoMenu \"New Button\"\nset the name of the result to \"my new button\"\n\nset the name of cd btn id 1011 to \"changed\"\nanswer the short name of cd btn id 1011 -- \"changed\"\n`\n\n============================================================\n========================= number\n============================================================\n\nYou can get the number of an object.\n`\nanswer the number of cd fld 2 -- 2\nanswer the number of cd btn 3 -- 3\nanswer the number of card 4 -- 4\n`\n\n============================================================\n========================= owner\n============================================================\n\nGets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.\n\nExamples:\n\nput the owner of cd btn \"myBtn\" into z\nset the name of the owner of cd btn \"myBtn\" to \"changed\"\n\n============================================================\n========================= script\n============================================================\n\nIt's unlikely to be useful, but a script can dynamically change the contents of another script.\nExamples:\n\nput return & \"on newCode\" & return & \"answer 234\" & \\\n    return & \"end newCode\" into newCode\nput the script of cd btn id 123 into oldCode\nset the script of cd btn id 123 to oldCode & newCode\nsend \"newCode\" to cd btn id 123\n\n============================================================\n========================= btn: autohilite\n============================================================\n\nDoes the button turn black when you click on it?\n\nExamples:\n\nput the autohilite of cd btn \"myBtn\" into z\n\n\n============================================================\n========================= btn: checkmark\n============================================================\n\n\nExamples:\n\nset the checkmark of cd btn \"myBtn\" to true.\n\n============================================================\n========================= btn: enabled\n============================================================\n\nIf a button is not enabled, it is greyed out and can't be clicked.\n\nExamples:\n\nset the enabled of cd btn \"myBtn\" to true\nset the enabled of cd btn \"myBtn\" to false\n\n\n============================================================\n========================= btn: left\n============================================================\n\nThe 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.\n\nExamples:\n\nset the left of cd btn \"myBtn\" to 4\n\n\n============================================================\n========================= btn: loc, location\n============================================================\n\nThe coordinates of the center of the object.\nExamples:\n\nput the location of cd btn \"myBtn\" into z\n\n\n============================================================\n========================= btn: height\n============================================================\n\nThe height of the object on screen, in pixels.\nExamples:\n\nput the height of cd btn \"myBtn\" into z\n\n\n============================================================\n========================= btn: hilite\n============================================================\n\n\nExamples:\n\nput the hilite of cd btn \"myBtn\" into z\n\n============================================================\n========================= btn: label\n============================================================\n\n\nExamples:\n\nput the label of cd btn \"myBtn\" into z\n\n\n============================================================\n========================= btn: icon\n============================================================\n\nNumber of the icon.\nExamples:\n\nput the icon of cd btn \"myBtn\" into z\n\n============================================================\n========================= btn: rect, rectangle\n============================================================\n\nFour 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.\nExamples:\n\nset the rect of cd btn \"myBtn\" to 45,56,67,78\nset the rectangle of cd btn \"myBtn\" to 45,56,67,78\n\n\n============================================================\n========================= btn: showlabel\n============================================================\n\nIs the label text shown?\nExamples:\n\nput the showlabel of cd btn \"myBtn\" into z\n\n============================================================\n========================= btn: style\n============================================================\n\nStyles include:\nTransparent\nRectangle\nOpaque\nRoundrect\nPlain\nShadow\nOsStandard\nOsDefault\nOsBoxmodal\nCheckbox\nRadio\n\nExamples:\n\nset the style of cd btn \"myBtn\" to \"Shadow\"\n\n============================================================\n========================= btn: textalign\n============================================================\n\nSet alignment of the label text.\nExamples:\n\nset the textalign of cd btn \"myBtn\" to \"left\"\nset the textalign of cd btn \"myBtn\" to \"center\"\n\n\n============================================================\n========================= btn: textfont\n============================================================\n\nSet typeface of the label text.\n\nExamples:\n\nset the textfont of cd btn \"myBtn\" to \"courier\"\n\n\n============================================================\n========================= btn: textsize\n============================================================\n\nSet size of the label text.\n\nExamples:\n\nset the textsize of cd btn \"myBtn\" to 24\n\n\n============================================================\n========================= btn: textstyle\n============================================================\n\nSet style of the label text.\n\nExamples:\n\nset the textstyle of cd btn \"myBtn\" to \"bold\"\n\n\n============================================================\n========================= btn: top\n============================================================\n\nThe 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.\nExamples:\n\nput the top of cd btn \"myBtn\" into z\n\n\n\n============================================================\n========================= btn: topleft\n============================================================\n\nThe x,y coordinates of the upper left corner.\nExamples:\n\nset the topleft of cd btn \"myBtn\" to 34, 56\n\n============================================================\n========================= btn: visible\n============================================================\n\nHide or show the object.\nExamples:\n\nset the visible of cd btn \"myBtn\" to false\n\n============================================================\n========================= btn: width\n============================================================\n\nThe width of the object on screen, in pixels.\nExamples:\n\nput the width of cd btn \"myBtn\" into z\n\n\n============================================================\n========================= fld: alltext\n============================================================\n\nGet or set all contents of the field.\nExamples:\n\nput the alltext of cd fld \"myFld\" into z\n\n\n============================================================\n========================= fld: dontwrap\n============================================================\n\nWrap text onto different lines.\nExamples:\n\nput the dontwrap of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: enabled\n============================================================\n\nA disabled field is greyed out and can't be edited.\nExamples:\n\nput the enabled of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: defaulttextfont\n============================================================\n\n\nIf the user deletes all text in a field and then types a letter, the font of this letter will be determined by the defaulttextfont.\n\nExamples:\n\nput the defaulttextfont of cd fld \"myFld\" into z\n\n\n============================================================\n========================= fld: defaulttextsize\n============================================================\n\n\nIf the user deletes all text in a field and then types a letter, the size of this letter will be determined by the defaulttextsize.\n\nExamples:\n\nput the defaulttextsize of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: defaulttextstyle\n============================================================\n\n\nIf the user deletes all text in a field and then types a letter, the style of this letter will be determined by the defaulttextstyle.\n\nExamples:\n\nput the defaulttextstyle of cd fld \"myFld\" into z\n\n\n============================================================\n========================= fld: left\n============================================================\n\nThe 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.\nExamples:\n\nset the left of cd fld \"myFld\" to 4\n\n\n============================================================\n========================= fld: loc, location\n============================================================\n\nThe coordinates of the center of the object.\nExamples:\n\nput the location of cd fld \"myFld\" into z\n\n\n============================================================\n========================= fld: locktext\n============================================================\n\nYou can't type new text into a 'locked' field. You can still set the contents via a script.\nExamples:\n\nset the locktext of cd fld \"myFld\" to true\nput \"still can change\" into cd fld \"myFld\"\n\n============================================================\n========================= fld: height\n============================================================\n\nThe height of the object on screen, in pixels.\nExamples:\n\nput the height of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: rect, rectangle\n============================================================\n\nFour 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.\nExamples:\n\nset the rect of cd fld \"myFld\" to 45,56,67,78\nset the rectangle of cd fld \"myFld\" to 45,56,67,78\n\n\n============================================================\n========================= fld: scroll\n============================================================\n\nThe vertical scroll position.\nExamples:\n\nput the scroll of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: singleline\n============================================================\n\nField is a single line, cannot contain newlines.\nExamples:\n\nput the singleline of cd fld \"myFld\" into z\n\n\n\n============================================================\n========================= fld: style\n============================================================\n\nStyles include:\nOpaque\nTransparent\nRectangle\nShadow\nScrolling\n\nExamples:\n\nset the style of cd fld \"myFld\" to \"shadow\"\n\n============================================================\n========================= fld: textalign\n============================================================\n\nSet alignment of text\nExamples:\n\nset the textalign of cd fld \"myFld\" to \"left\"\nset the textalign of cd fld \"myFld\" to \"center\"\n\n\n============================================================\n========================= fld: textfont\n============================================================\n\n\nBy default, applies the property to the entire field.\n`set the textfont of cd fld \"myFld\" to \"chicago\"\nput the textfont of cd fld \"myFld\" into z`\n\nWe now support getting and setting by chunk!\n`set the textfont of char 3 to 4 of cd fld \"myFld\" to \"geneva\"\nput the textfont of char 3 to 4 of cd fld \"myFld\" into z`\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\n\n============================================================\n========================= fld: textsize\n============================================================\n\n\nBy default, applies the property to the entire field.\n`set the textsize of cd fld \"myFld\" to \"chicago\"\nput the textsize of cd fld \"myFld\" into z`\n\nWe now support getting and setting by chunk!\n`set the textsize of char 3 to 4 of cd fld \"myFld\" to \"geneva\"\nput the textsize of char 3 to 4 of cd fld \"myFld\" into z`\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\n\n============================================================\n========================= fld: textstyle\n============================================================\n\n\nBy default, applies the property to the entire field.\n`set the textstyle of cd fld \"myFld\" to \"bold\"\nset the textstyle of cd fld \"myFld\" to \"bold,italic\"\nset the textstyle of cd fld \"myFld\" to \"plain\"\nput the textstyle of cd fld \"myFld\" into z`\n\nWe now support getting and setting by chunk!\n`set the textstyle of char 3 to 4 of cd fld \"myFld\" to \"bold\"\nput the textstyle of char 3 to 4 of cd fld \"myFld\" into z`\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\nYou can also do the following:\n`set the textstyle of cd fld \"myFld\" to \"add-bold\"\nset the textstyle of cd fld \"myFld\" to \"subtract-italic\"\nset the textstyle of cd fld \"myFld\" to \"toggle-outline\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"add-bold\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"subtract-italic\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"toggle-outline\"`\n\n============================================================\n========================= fld: top\n============================================================\n\nThe 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.\nExamples:\n\nput the top of cd fld \"myFld\" into z\n\n\n\n============================================================\n========================= fld: topleft\n============================================================\n\nThe x,y coordinates of the upper left corner.\nExamples:\n\nset the topleft of cd fld \"myFld\" to 34, 56\n\n============================================================\n========================= fld: width\n============================================================\n\nThe width of the object on screen, in pixels.\nExamples:\n\nput the width of cd fld \"myFld\" into z\n\n============================================================\n========================= fld: visible\n============================================================\n\nShow or hide the object.\nExamples:\n\nput the visible of cd fld \"myFld\" into z\n\n\n============================================================\n========================= cursor\n============================================================\n\nSets the current cursor.\n\nExamples:\n\n-- show the watch\nset the cursor to \"watch\"\nwait 2 seconds\n\n-- spinning ball\nrepeat with x = 1 to 30\n    set the cursor to \"busy\"\n    wait 0.2 seconds\nend repeat\n\n\n============================================================\n========================= filled\n============================================================\n\nThe color/opacity for drawing. Currently can be \"true\" for black, \"false\" for transparent, or \"white\" for white.\nExamples:\n\nset the filled to \"white\"\n\n============================================================\n========================= lineColor\n============================================================\n\nThe lineColor for drawing. Currently can be 0 (black) or 1 (white).\nExamples:\n\nset the lineSize to 1\n\n============================================================\n========================= lineSize\n============================================================\n\nThe linesize for drawing. Currently can be 1 (thin) or 2 (thicker).\n\nExamples:\n\nset the lineSize to 2\n\n============================================================\n========================= itemdelimiter\n============================================================\n\n\nExamples:\n\nput the itemdelimiter into z\nset the itemdel to tab\nanswer item 2 of \"a\"&tab&\"b\"&tab&\"c\"\nset the itemdel to \",\"\n\n\n============================================================\n========================= idlerate\n============================================================\n\nThe speed at which `on idle` is called.\n\nExamples:\n\nset the idlerate to \"default\"\nset the idlerate to \"faster\"\nset the idlerate to \"faster2\"\n\n============================================================\n========================= multiple\n============================================================\n\nThe \"draw multiple\" setting for drawing. Does not yet affect script drawing.\n\nExamples:\n\nset the multiple to true\n\n============================================================\n========================= pattern\n============================================================\n\nThe current pattern number.\n\n"
  },
  {
    "path": "vipercard/doc/reference_04_properties.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[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)\n\n\n\n## id\n\n\nThe id uniquely identifies an object. In ViperCard, all objects will have different ids, even if they are different types or are on different cards.\n\nIf you put the long id of an object into a variable, you can use that variable to refer to the object.\n\n\n```\nput the long id of card id 1011 into z\nset the name of z to \"changed\"\n```\n\n\nThe short id of an object is just the number. For example the short id of card id 1011 is 1011.\n\n\n```\nput the short id of card id 1011 into z\nset the name of cd id z to \"changed\"\n```\n\n\n\n## name\n\n\nYou can get or set the name of an object.\n\n```\n\ndoMenu \"New Button\"\nset the name of the result to \"my new button\"\n\nset the name of cd btn id 1011 to \"changed\"\nanswer the short name of cd btn id 1011 -- \"changed\"\n\n```\n\n\n\n## number\n\n\nYou can get the number of an object.\n\n```\n\nanswer the number of cd fld 2 -- 2\nanswer the number of cd btn 3 -- 3\nanswer the number of card 4 -- 4\n\n```\n\n\n\n## owner\n\n\nGets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.\n\nExamples:\n\n```\n\n\nput the owner of cd btn \"myBtn\" into z\nset the name of the owner of cd btn \"myBtn\" to \"changed\"\n\n\n```\n\n\n\n## script\n\n\nIt's unlikely to be useful, but a script can dynamically change the contents of another script.\n\nExamples:\n\n```\n\n\nput return & \"on newCode\" & return & \"answer 234\" & \\\n    return & \"end newCode\" into newCode\nput the script of cd btn id 123 into oldCode\nset the script of cd btn id 123 to oldCode & newCode\nsend \"newCode\" to cd btn id 123\n\n\n```\n\n\n\n## btn: autohilite\n\n\nDoes the button turn black when you click on it?\n\nExamples:\n\n```\n\n\nput the autohilite of cd btn \"myBtn\" into z\n\n\n\n```\n\n\n\n## btn: checkmark\n\n\n\nExamples:\n\n```\n\n\nset the checkmark of cd btn \"myBtn\" to true.\n\n\n```\n\n\n\n## btn: enabled\n\n\nIf a button is not enabled, it is greyed out and can't be clicked.\n\nExamples:\n\n```\n\n\nset the enabled of cd btn \"myBtn\" to true\nset the enabled of cd btn \"myBtn\" to false\n\n\n\n```\n\n\n\n## btn: left\n\n\nThe 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.\n\nExamples:\n\n```\n\n\nset the left of cd btn \"myBtn\" to 4\n\n\n\n```\n\n\n\n## btn: loc, location\n\n\nThe coordinates of the center of the object.\n\nExamples:\n\n```\n\n\nput the location of cd btn \"myBtn\" into z\n\n\n\n```\n\n\n\n## btn: height\n\n\nThe height of the object on screen, in pixels.\n\nExamples:\n\n```\n\n\nput the height of cd btn \"myBtn\" into z\n\n\n\n```\n\n\n\n## btn: hilite\n\n\n\nExamples:\n\n```\n\n\nput the hilite of cd btn \"myBtn\" into z\n\n\n```\n\n\n\n## btn: label\n\n\n\nExamples:\n\n```\n\n\nput the label of cd btn \"myBtn\" into z\n\n\n\n```\n\n\n\n## btn: icon\n\n\nNumber of the icon.\n\nExamples:\n\n```\n\n\nput the icon of cd btn \"myBtn\" into z\n\n\n```\n\n\n\n## btn: rect, rectangle\n\n\nFour 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.\n\nExamples:\n\n```\n\n\nset the rect of cd btn \"myBtn\" to 45,56,67,78\nset the rectangle of cd btn \"myBtn\" to 45,56,67,78\n\n\n\n```\n\n\n\n## btn: showlabel\n\n\nIs the label text shown?\n\nExamples:\n\n```\n\n\nput the showlabel of cd btn \"myBtn\" into z\n\n\n```\n\n\n\n## btn: style\n\n\nStyles include:\n\nTransparent\n\nRectangle\n\nOpaque\n\nRoundrect\n\nPlain\n\nShadow\n\nOsStandard\n\nOsDefault\n\nOsBoxmodal\n\nCheckbox\n\nRadio\n\nExamples:\n\n```\n\n\nset the style of cd btn \"myBtn\" to \"Shadow\"\n\n\n```\n\n\n\n## btn: textalign\n\n\nSet alignment of the label text.\n\nExamples:\n\n```\n\n\nset the textalign of cd btn \"myBtn\" to \"left\"\nset the textalign of cd btn \"myBtn\" to \"center\"\n\n\n\n```\n\n\n\n## btn: textfont\n\n\nSet typeface of the label text.\n\nExamples:\n\n```\n\n\nset the textfont of cd btn \"myBtn\" to \"courier\"\n\n\n\n```\n\n\n\n## btn: textsize\n\n\nSet size of the label text.\n\nExamples:\n\n```\n\n\nset the textsize of cd btn \"myBtn\" to 24\n\n\n\n```\n\n\n\n## btn: textstyle\n\n\nSet style of the label text.\n\nExamples:\n\n```\n\n\nset the textstyle of cd btn \"myBtn\" to \"bold\"\n\n\n\n```\n\n\n\n## btn: top\n\n\nThe 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.\n\nExamples:\n\n```\n\n\nput the top of cd btn \"myBtn\" into z\n\n\n\n\n```\n\n\n\n## btn: topleft\n\n\nThe x,y coordinates of the upper left corner.\n\nExamples:\n\n```\n\n\nset the topleft of cd btn \"myBtn\" to 34, 56\n\n\n```\n\n\n\n## btn: visible\n\n\nHide or show the object.\n\nExamples:\n\n```\n\n\nset the visible of cd btn \"myBtn\" to false\n\n\n```\n\n\n\n## btn: width\n\n\nThe width of the object on screen, in pixels.\n\nExamples:\n\n```\n\n\nput the width of cd btn \"myBtn\" into z\n\n\n\n```\n\n\n\n## fld: alltext\n\n\nGet or set all contents of the field.\n\nExamples:\n\n```\n\n\nput the alltext of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## fld: dontwrap\n\n\nWrap text onto different lines.\n\nExamples:\n\n```\n\n\nput the dontwrap of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: enabled\n\n\nA disabled field is greyed out and can't be edited.\n\nExamples:\n\n```\n\n\nput the enabled of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: defaulttextfont\n\n\n\nIf the user deletes all text in a field and then types a letter, the font of this letter will be determined by the defaulttextfont.\n\nExamples:\n\n```\n\n\nput the defaulttextfont of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## fld: defaulttextsize\n\n\n\nIf the user deletes all text in a field and then types a letter, the size of this letter will be determined by the defaulttextsize.\n\nExamples:\n\n```\n\n\nput the defaulttextsize of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: defaulttextstyle\n\n\n\nIf the user deletes all text in a field and then types a letter, the style of this letter will be determined by the defaulttextstyle.\n\nExamples:\n\n```\n\n\nput the defaulttextstyle of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## fld: left\n\n\nThe 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.\n\nExamples:\n\n```\n\n\nset the left of cd fld \"myFld\" to 4\n\n\n\n```\n\n\n\n## fld: loc, location\n\n\nThe coordinates of the center of the object.\n\nExamples:\n\n```\n\n\nput the location of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## fld: locktext\n\n\nYou can't type new text into a 'locked' field. You can still set the contents via a script.\n\nExamples:\n\n```\n\n\nset the locktext of cd fld \"myFld\" to true\nput \"still can change\" into cd fld \"myFld\"\n\n\n```\n\n\n\n## fld: height\n\n\nThe height of the object on screen, in pixels.\n\nExamples:\n\n```\n\n\nput the height of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: rect, rectangle\n\n\nFour 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.\n\nExamples:\n\n```\n\n\nset the rect of cd fld \"myFld\" to 45,56,67,78\nset the rectangle of cd fld \"myFld\" to 45,56,67,78\n\n\n\n```\n\n\n\n## fld: scroll\n\n\nThe vertical scroll position.\n\nExamples:\n\n```\n\n\nput the scroll of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: singleline\n\n\nField is a single line, cannot contain newlines.\n\nExamples:\n\n```\n\n\nput the singleline of cd fld \"myFld\" into z\n\n\n\n\n```\n\n\n\n## fld: style\n\n\nStyles include:\n\nOpaque\n\nTransparent\n\nRectangle\n\nShadow\n\nScrolling\n\nExamples:\n\n```\n\n\nset the style of cd fld \"myFld\" to \"shadow\"\n\n\n```\n\n\n\n## fld: textalign\n\n\nSet alignment of text\n\nExamples:\n\n```\n\n\nset the textalign of cd fld \"myFld\" to \"left\"\nset the textalign of cd fld \"myFld\" to \"center\"\n\n\n\n```\n\n\n\n## fld: textfont\n\n\n\nBy default, applies the property to the entire field.\n\n```\nset the textfont of cd fld \"myFld\" to \"chicago\"\nput the textfont of cd fld \"myFld\" into z\n```\n\n\nWe now support getting and setting by chunk!\n\n```\nset the textfont of char 3 to 4 of cd fld \"myFld\" to \"geneva\"\nput the textfont of char 3 to 4 of cd fld \"myFld\" into z\n```\n\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\n\n\n## fld: textsize\n\n\n\nBy default, applies the property to the entire field.\n\n```\nset the textsize of cd fld \"myFld\" to \"chicago\"\nput the textsize of cd fld \"myFld\" into z\n```\n\n\nWe now support getting and setting by chunk!\n\n```\nset the textsize of char 3 to 4 of cd fld \"myFld\" to \"geneva\"\nput the textsize of char 3 to 4 of cd fld \"myFld\" into z\n```\n\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\n\n\n## fld: textstyle\n\n\n\nBy default, applies the property to the entire field.\n\n```\nset the textstyle of cd fld \"myFld\" to \"bold\"\nset the textstyle of cd fld \"myFld\" to \"bold,italic\"\nset the textstyle of cd fld \"myFld\" to \"plain\"\nput the textstyle of cd fld \"myFld\" into z\n```\n\n\nWe now support getting and setting by chunk!\n\n```\nset the textstyle of char 3 to 4 of cd fld \"myFld\" to \"bold\"\nput the textstyle of char 3 to 4 of cd fld \"myFld\" into z\n```\n\n\nWhen querying for a property and there are multiple values, returns the string \"mixed\".\n\nYou can also do the following:\n\n```\nset the textstyle of cd fld \"myFld\" to \"add-bold\"\nset the textstyle of cd fld \"myFld\" to \"subtract-italic\"\nset the textstyle of cd fld \"myFld\" to \"toggle-outline\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"add-bold\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"subtract-italic\"\nset the textstyle of line 2 of cd fld \"myFld\" to \"toggle-outline\"\n```\n\n\n\n## fld: top\n\n\nThe 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.\n\nExamples:\n\n```\n\n\nput the top of cd fld \"myFld\" into z\n\n\n\n\n```\n\n\n\n## fld: topleft\n\n\nThe x,y coordinates of the upper left corner.\n\nExamples:\n\n```\n\n\nset the topleft of cd fld \"myFld\" to 34, 56\n\n\n```\n\n\n\n## fld: width\n\n\nThe width of the object on screen, in pixels.\n\nExamples:\n\n```\n\n\nput the width of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## fld: visible\n\n\nShow or hide the object.\n\nExamples:\n\n```\n\n\nput the visible of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## cursor\n\n\nSets the current cursor.\n\nExamples:\n\n```\n\n\n-- show the watch\nset the cursor to \"watch\"\nwait 2 seconds\n\n-- spinning ball\nrepeat with x = 1 to 30\n    set the cursor to \"busy\"\n    wait 0.2 seconds\nend repeat\n\n\n\n```\n\n\n\n## filled\n\n\nThe color/opacity for drawing. Currently can be \"true\" for black, \"false\" for transparent, or \"white\" for white.\n\nExamples:\n\n```\n\n\nset the filled to \"white\"\n\n\n```\n\n\n\n## lineColor\n\n\nThe lineColor for drawing. Currently can be 0 (black) or 1 (white).\n\nExamples:\n\n```\n\n\nset the lineSize to 1\n\n\n```\n\n\n\n## lineSize\n\n\nThe linesize for drawing. Currently can be 1 (thin) or 2 (thicker).\n\nExamples:\n\n```\n\n\nset the lineSize to 2\n\n\n```\n\n\n\n## itemdelimiter\n\n\n\nExamples:\n\n```\n\n\nput the itemdelimiter into z\nset the itemdel to tab\nanswer item 2 of \"a\"&tab&\"b\"&tab&\"c\"\nset the itemdel to \",\"\n\n\n\n```\n\n\n\n## idlerate\n\n\nThe speed at which `on idle` is called.\n\nExamples:\n\n```\n\n\nset the idlerate to \"default\"\nset the idlerate to \"faster\"\nset the idlerate to \"faster2\"\n\n\n```\n\n\n\n## multiple\n\n\nThe \"draw multiple\" setting for drawing. Does not yet affect script drawing.\n\nExamples:\n\n```\n\n\nset the multiple to true\n\n\n```\n\n\n\n## pattern\n\n\nThe current pattern number.\n\n"
  },
  {
    "path": "vipercard/doc/reference_05_functions",
    "content": "\n \n============================================================\n========================= abs(x)\n============================================================\n\nAbsolute value.\nExamples:\n\nput abs(-0.5) into x\nput abs(0.5) into x\n\n============================================================\n========================= atan(x)\n============================================================\n\n\nArctangent, in radians.\nExamples:\n\nput atan(0.5) into x\n\n\n============================================================\n========================= average()\n============================================================\n\nSimple mean of numbers.\nSupports any number of arguments.\nYou can also provide a comma-delimited string.\nExamples:\n\nput average(1,2,3) into x\nput average(\"1,2,3\") into x -- returns 2\n\n============================================================\n========================= charToNum(x)\n============================================================\n\nFrom ascii-like number to a character. Note that characters in a field are displayed in Mac OS Roman encoding.\n\nNote that the newline character is always \\n (10).\nExamples:\n\nput charToNum(97) into x\n\n\n\n============================================================\n========================= clickH()\n============================================================\n\nGet x coordinate of a recent mouse click. See `clickLoc` for more details.\nExamples:\n\nput clickh() into x\n\n\n============================================================\n========================= clickLoc()\n============================================================\nGet the coordinates of a recent mouse click.\n\nThis isn't necessarily the most recent mouseClick, it is only updated \n1) clicks before the script runs\n2) when you check the `mouseClick`\n3) when you simulate a click with `click` or `drag`\n\nExamples:\n\nwait until the mouseClic\nanswer \"you clicked at\" && the clickLoc\n\n\n============================================================\n========================= clickV()\n============================================================\n\nGet y coordinate of a recent mouse click. See `clickLoc` for more details.\n\nExamples:\n\nput clickv() into x\n\n\n============================================================\n========================= commandKey()\n============================================================\n\nCheck if this modifier key is pressed.\nExamples:\n\nif the commandKey is down then\n    answer \"cmd key is down\"\nend if\n-- same as\nif the cmdKey is down then\n    answer \"cmd key is down\"\nend if\n\n\n============================================================\n========================= contains\n============================================================\n\nCan you find a string within a string?\n\nExamples:\n\nif \"abc\" contains \"b\" then\n    answer \"yes\"\nend if\n\n============================================================\n========================= cos(x)\n============================================================\n\n\nExamples:\n\nput cos(0.5 * pi) into x\n\n============================================================\n========================= date()\n============================================================\n\n\nReturns the current date.\n\nExamples:\n\nthe date\ndate()\nthe abbrev date\nthe short date\nthe long date\nthe English date\n\n============================================================\n========================= exp(x)\n============================================================\n\ne to the power of x.\nExamples:\n\nput exp(0.5) into x\n\n\n\n============================================================\n========================= exp2(x)\n============================================================\n\n2 to the power of x.\n\nExamples:\n\nput exp2(0.5) into x\n\n============================================================\n========================= is___a\n============================================================\n\nCheck the type of an expression.\n\nExamples:\n\nif x is a number then\n    answer \"a\"\nend if\nif x is a integer then\n    answer \"b\"\nend if\nif x is a logical then\n    answer \"c\"\nend if\nif x is a point then\n    answer \"d\"\nend if\nif x is a rect then\n    answer \"e\"\nend if\n\n============================================================\n========================= is___in\n============================================================\n\nCan you find a string within a string?\nExamples:\n\nif \"b\" is in \"abc\" then\n    answer \"yes\"\nend if\n\n-- is within is the same,\nif \"b\" is within \"abc\" then\n    answer \"yes\"\nend if\n\n\n============================================================\n========================= keyChar()\n============================================================\n\nIn an afterkeydown or afterkeyup handler, check the character. Is affected by shift.\nExamples:\n\nput keyChar() into x\non afterKeyDown\n    if keyChar() is \"i\" and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer \"you pressed option-i\"\n    else if keyChar() is \"U\" and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer \"you pressed shift-u\"\n    end if\nend afterKeyDown\n\n============================================================\n========================= keyRepeated()\n============================================================\n\nIn an afterkeydown handler, did this event come from the user holding the key down?\nExamples:\n\nif not keyRepeated() then\n    add 1 to uniqueKeyPresses\nend if\n\n============================================================\n========================= length(s)\n============================================================\n\nReturns the length of a string, in characters.\n\nExamples:\n\nanswer length(\"abc\") -- displays 3\nanswer the length of \"\" -- displays 0\nanswer the length of \"abc\" -- displays 3\n\n============================================================\n========================= ln(x)\n============================================================\n\n\nExamples:\n\nput ln(0.5) into x\n\n\n\n\n\n============================================================\n========================= log2(x)\n============================================================\n\nBase-2 logarithm.\nExamples:\n\nput log2(0.5) into x\n\n============================================================\n========================= max(...)\n============================================================\n\nSupports any number of arguments. You can also provide a comma-delimited string.\nExamples:\n\nput max(1,2,3) into x\nput max(\"45,49,40\") into x -- returns 49\n\n============================================================\n========================= me\n============================================================\n\nRefers to the object that owns the current script.\n\nSimilar to, but distinct from 'target'.\n\nExamples:\n\nput the id of me into theTarget\n\nset the width of me to 100\n\n============================================================\n========================= min()\n============================================================\n\nSupports any number of arguments. You can also provide a comma-delimited string.\nExamples:\n\nput min(1,2,3) into x\nput min(\"45,49,40\") into x -- returns 40\n\n============================================================\n========================= mouse()\n============================================================\n\nIs the mouse button currently down. Returns one of the constants `down` or `up`.\nExamples:\n\nif the mouse is down then\n    answer \"mouse button is clicked\"\nend if\n\n============================================================\n========================= mouseClick()\n============================================================\n\nWas the mouse recently clicked? Doesn't include the click that created the message, it needs to be later.\n\nWhen you check the mouseClick, it will only return true once before resetting back to false. See also: clickloc, clickh, clickv.\n\nExamples:\n\nwait until the mouseClick\nanswer the clickloc\n\n\n============================================================\n========================= mouseH()\n============================================================\n\nThe x coordinate of the current mouse location.\nExamples:\n\nput mouseH() into x\n\n\n============================================================\n========================= mouseLoc()\n============================================================\n\nThe coordinates of the current mouse location.\n\nExamples:\n\nput mouseLoc() into x\n\n\n============================================================\n========================= mouseV()\n============================================================\n\nThe y coordinate of the current mouse location.\n\nExamples:\n\nput mouseV() into x\n\n\n============================================================\n========================= number\n============================================================\n\n^Count parts of text^\n`answer the number of chars in \"abc\"\nanswer the number of items in \"a,b,c\"\nanswer the number of lines in myList`\n\n^Count current objects^\n`answer the number of cards in this stack\nanswer the number of buttons in this card\nanswer the number of fields in this card\nrepeat with x = 1 to the number of cards in this stack\n    set the name of card x of this stack to \"c\" & x\nend repeat`\n\n^Get the number of an object.^\n`answer the number of this card\nput the number of cd fld id 1234 into x\nput \"abc\" into cd fld x`\n\n============================================================\n========================= numberToStr(x)\n============================================================\n\nConvert number to string.\nExamples:\n\nput numberToStr(0.5) into x\n\n============================================================\n========================= numToChar(x)\n============================================================\n\nFrom a character to an ascii-like number. Note that characters in a field are displayed in Mac OS Roman encoding.\n\nNote that the newline character is always \\n (10).\nExamples:\n\nput numToChar(\"a\") into x\n\n\n============================================================\n========================= objectById(id)\n============================================================\n\nGets the full id from the numeric id.\nExamples:\n\n-- assuming there is a cd btn id 1234\nput objectById(1234) into x\n-- x is now \"card button id 1234\".\n-- you can now do this\nset the topleft of x to 100, 200\n\n============================================================\n========================= offset(needle, haystack)\n============================================================\n\nSearch for a string within a string, and return the position where found. If not found, returns 0. (one-based indexing).\nExamples:\n\nput offset(\"b\", \"abc\") into x\n-- x is now 2.\n\n\n============================================================\n========================= optionKey()\n============================================================\n\nCheck if this modifier key is pressed.\nExamples:\n\nif the optionKey is down then\n    answer \"opt key is down\"\nend if\n\n============================================================\n========================= param(n)\n============================================================\n\nGet the nth value passed into the current procedure. Can be used to build a function that takes any number of arguments,  see example.\n\nExamples:\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer \"total is\" && total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n============================================================\n========================= paramCount()\n============================================================\n\nGet the number of values passed into the current procedure. Can be used to build a function that takes any number of arguments, see example.\n\nExamples:\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer \"total is\" && total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n============================================================\n========================= params()\n============================================================\n\nGet all of the values passed into the current procedure.\nExamples:\n\nput params() into x\n\n\n============================================================\n========================= random(n)\n============================================================\n\nn must be an integer.\nReturns random value between 1 and n.\nExamples:\n\nput random(20) into roll\n\n============================================================\n========================= result()\n============================================================\n\nThe return value of the last called function or procedure.\nExamples:\n\non myProc\n    return \"a\"\nend myProc\non mouseUp\n    myProc\n    answer the result\nend mouseUp\n\n============================================================\n========================= round(x)\n============================================================\n\nReturns integer nearest to number. Odd integers plus 0.5 round up, even integers plus 0.5 round down.\nExamples:\n\nput round(1.7) into x\n\n============================================================\n========================= screenRect()\n============================================================\n\n\nExamples:\n\nput screenRect() into x\n\n\n============================================================\n========================= seconds()\n============================================================\n\nSeconds since January 1, 1904.\nExamples:\n\nput seconds() into x\n\n============================================================\n========================= selectedChunk()\n============================================================\n\nA full description of the current selection, or \"\" if there is no selection.\n\nReturns a string that looks like this: `char 2 to 4 of cd fld id 567`.\n\nExamples:\n\nset the textSize of the selectedChunk to 24\nput the textFont of the selectedChunk into x\nput word 2 of the selectedChunk into selStart \nput word 4 of the selectedChunk into selEnd \nput the selectedChunk into x\n\n============================================================\n========================= selectedField()\n============================================================\n\nThe field that contains current selected text, or \"\" if there is no selection.\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\n\"card field 4\".)\n\nExamples:\n\nput selectedField() into x\nset the loc of the selectedField to 23, 45\nset the textalign of the selectedField to \"center\"\n\n============================================================\n========================= selectedLine()\n============================================================\n\nThe number of the line of the current selected text, or \"\" if there is no selection.\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\n\"line 3 of card field 4\".)\nExamples:\n\nput selectedLine() into x\n\n\n============================================================\n========================= selectedText()\n============================================================\n\nThe value of the current selected text, or the empty string if there is no selection.\n\nExamples:\n\nput selectedText() into x\n\n============================================================\n========================= the selection\n============================================================\n\nReading from `the selection` retrieves the value of the current selected text, or the empty string if there is no selection.\n\nWriting to `the selection` replaces the currently selected text with new text.\n\nExamples:\n\nput the selection into x\nput \"\" into the selection\nput \"abc\" into the selection\n\n-- chunks are supported\nput char 2 to 3 of the selection into x\nput \"\" into char 2 to 3 of the selection\nput \"abc\" into char 3 of the selection\nput item 2 to 3 of the selection into x\nput \"\" into item 2 to 3 of the selection\nput \"abc\" into item 3 of the selection\n\n-- you can delete part of the selection\ndelete char 2 to 4 of the selection\ndelete item 3 of the selection\n\n============================================================\n========================= shiftKey()\n============================================================\n\nCheck if this modifier key is pressed.\nExamples:\n\nif the shiftKey is down then\n    answer \"shift key is down\"\nend if\n\n\n============================================================\n========================= sqrt(x)\n============================================================\n\n\nExamples:\n\nput sqrt(0.5) into x\n\n============================================================\n========================= sin(x)\n============================================================\n\n\nExamples:\n\nput sin(0.5 * pi) into x\n\n\n============================================================\n========================= strToNumber(x)\n============================================================\n\nParse string to number. Supports scientific notation. If cannot be parsed, returns \"false\"\nExamples:\n\nput strToNumber(\"12\") into x\nput strToNumber(\"-12\") into x\nput strToNumber(\"1e6\") into x\nask \"what is a number\"\nput it into x\nif strToNumber(x) is false then\n    answer \"that was not a number\"\nend if\n\n\n\n============================================================\n========================= sum()\n============================================================\n\n\nSupports any number of arguments.\nYou can also provide a comma-delimited string.\nExamples:\n\nput sum(1,2,3) into x\nput sum(\"1,2,3\") into x -- returns 6\n\n\n============================================================\n========================= tan(x)\n============================================================\n\n\nExamples:\n\nput tan(0.125 * pi) into x\n\n\n============================================================\n========================= target\n============================================================\n\nRefers to the object that was most recently acted on.\n\nHere's one way this can be useful: If you have many buttons that all basically perform the same action, you could have an 'on mouseup' handler in the card script instead of a separate script within each button. This script in the card could check the target to see which of the buttons were clicked.\n\nDifferent than 'me', which is the owner of the currently running script, which might be different than the button that was clicked.\n\nExamples:\n\nset the width of the target to 100\n\nput the short id of the target into x\n\n\n============================================================\n========================= there___is___a\n============================================================\n\nCheck for the existence of an object.\n\nExamples:\n\nif there is a cd btn id 12345 then\n    answer \"found\"\nend if\nif there is not a cd btn id 12345 then\n    answer \"not found\"\nend if\n\n============================================================\n========================= ticks()\n============================================================\n\nTicks (60th of a second) since January 1, 1904.\nExamples:\n\nput ticks() into x\n\n============================================================\n========================= tool()\n============================================================\n\nThe current simulated tool, as set by the `choose` command. (The `choose` command can be used to draw lines and shapes).\n\nThe actual current tool will be the browse tool when any script is running.\n\nExamples:\n\nchoose pencil tool\nanswer tool() -- shows \"pencil\"\n\n============================================================\n========================= toLowerCase()\n============================================================\n\nExamples:\n\nanswer toLowerCase(\"ABC\") -- shows \"abc\"\n\n============================================================\n========================= toUpperCase()\n============================================================\n\nExamples:\n\nanswer toUpperCase(\"abc\") -- shows \"ABC\"\n\n\n============================================================\n========================= trunc(x)\n============================================================\n\nGet integer part of a number. i.e. for positive numbers, always round down to the nearest integer.\n\nExamples:\n\nput trunc(0.5) into x\n\n\n\n============================================================\n========================= annuity(rate, periods)\n============================================================\n\nComputes the total cost of an annuity now that will pay you one unit per period, over the specific number of periods.\n\nYou want to purchase an annuity that pays you $10,000 a year for 10 years. The interest rate is 10%. How much will it cost you now? The amount loaned is 10000 * annuity(0.10, 10), or 61445.67.\n\n============================================================\n========================= compound(rate, periods)\n============================================================\n\n\nReturns the value of one unit of principal invested at the interest rate and compounded over the specified number of periods.\n\nExample: $100 invested for 20 years at 10% interest compounded yearly:\n\nfutureValue = 100 * compound(0.10, 20) = about $673\n"
  },
  {
    "path": "vipercard/doc/reference_05_functions.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./reference_02_commands.md) | [Syntax](./reference_03_syntax.md) | [Properties](./reference_04_properties.md) | Functions | [Event Handlers](./reference_06_events.md) | [Compatibility](./reference_07_compatibility.md)\n\n\n\n## abs(x)\n\n\nAbsolute value.\n\nExamples:\n\n```\n\n\nput abs(-0.5) into x\nput abs(0.5) into x\n\n\n```\n\n\n\n## atan(x)\n\n\n\nArctangent, in radians.\n\nExamples:\n\n```\n\n\nput atan(0.5) into x\n\n\n\n```\n\n\n\n## average()\n\n\nSimple mean of numbers.\n\nSupports any number of arguments.\n\nYou can also provide a comma-delimited string.\n\nExamples:\n\n```\n\n\nput average(1,2,3) into x\nput average(\"1,2,3\") into x -- returns 2\n\n\n```\n\n\n\n## charToNum(x)\n\n\nFrom ascii-like number to a character. Note that characters in a field are displayed in Mac OS Roman encoding.\n\nNote that the newline character is always \\n (10).\n\nExamples:\n\n```\n\n\nput charToNum(97) into x\n\n\n\n\n```\n\n\n\n## clickH()\n\n\nGet x coordinate of a recent mouse click. See `clickLoc` for more details.\n\nExamples:\n\n```\n\n\nput clickh() into x\n\n\n\n```\n\n\n\n## clickLoc()\n\nGet the coordinates of a recent mouse click.\n\nThis isn't necessarily the most recent mouseClick, it is only updated\n\n1) clicks before the script runs\n\n2) when you check the `mouseClick`\n\n3) when you simulate a click with `click` or `drag`\n\nExamples:\n\n```\n\n\nwait until the mouseClic\nanswer \"you clicked at\" && the clickLoc\n\n\n\n```\n\n\n\n## clickV()\n\n\nGet y coordinate of a recent mouse click. See `clickLoc` for more details.\n\nExamples:\n\n```\n\n\nput clickv() into x\n\n\n\n```\n\n\n\n## commandKey()\n\n\nCheck if this modifier key is pressed.\n\nExamples:\n\n```\n\n\nif the commandKey is down then\n    answer \"cmd key is down\"\nend if\n-- same as\nif the cmdKey is down then\n    answer \"cmd key is down\"\nend if\n\n\n\n```\n\n\n\n## contains\n\n\nCan you find a string within a string?\n\nExamples:\n\n```\n\n\nif \"abc\" contains \"b\" then\n    answer \"yes\"\nend if\n\n\n```\n\n\n\n## cos(x)\n\n\n\nExamples:\n\n```\n\n\nput cos(0.5 * pi) into x\n\n\n```\n\n\n\n## date()\n\n\n\nReturns the current date.\n\nExamples:\n\n```\n\n\nthe date\ndate()\nthe abbrev date\nthe short date\nthe long date\nthe English date\n\n\n```\n\n\n\n## exp(x)\n\n\ne to the power of x.\n\nExamples:\n\n```\n\n\nput exp(0.5) into x\n\n\n\n\n```\n\n\n\n## exp2(x)\n\n\n2 to the power of x.\n\nExamples:\n\n```\n\n\nput exp2(0.5) into x\n\n\n```\n\n\n\n## is a\n\n\nCheck the type of an expression.\n\nExamples:\n\n```\n\n\nif x is a number then\n    answer \"a\"\nend if\nif x is a integer then\n    answer \"b\"\nend if\nif x is a logical then\n    answer \"c\"\nend if\nif x is a point then\n    answer \"d\"\nend if\nif x is a rect then\n    answer \"e\"\nend if\n\n\n```\n\n\n\n## is in\n\n\nCan you find a string within a string?\n\nExamples:\n\n```\n\n\nif \"b\" is in \"abc\" then\n    answer \"yes\"\nend if\n\n-- is within is the same,\nif \"b\" is within \"abc\" then\n    answer \"yes\"\nend if\n\n\n\n```\n\n\n\n## keyChar()\n\n\nIn an afterkeydown or afterkeyup handler, check the character. Is affected by shift.\n\nExamples:\n\n```\n\n\nput keyChar() into x\non afterKeyDown\n    if keyChar() is \"i\" and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer \"you pressed option-i\"\n    else if keyChar() is \"U\" and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer \"you pressed shift-u\"\n    end if\nend afterKeyDown\n\n\n```\n\n\n\n## keyRepeated()\n\n\nIn an afterkeydown handler, did this event come from the user holding the key down?\n\nExamples:\n\n```\n\n\nif not keyRepeated() then\n    add 1 to uniqueKeyPresses\nend if\n\n\n```\n\n\n\n## length(s)\n\n\nReturns the length of a string, in characters.\n\nExamples:\n\n```\n\n\nanswer length(\"abc\") -- displays 3\nanswer the length of \"\" -- displays 0\nanswer the length of \"abc\" -- displays 3\n\n\n```\n\n\n\n## ln(x)\n\n\n\nExamples:\n\n```\n\n\nput ln(0.5) into x\n\n\n\n\n\n\n```\n\n\n\n## log2(x)\n\n\nBase-2 logarithm.\n\nExamples:\n\n```\n\n\nput log2(0.5) into x\n\n\n```\n\n\n\n## max(...)\n\n\nSupports any number of arguments. You can also provide a comma-delimited string.\n\nExamples:\n\n```\n\n\nput max(1,2,3) into x\nput max(\"45,49,40\") into x -- returns 49\n\n\n```\n\n\n\n## me\n\n\nRefers to the object that owns the current script.\n\nSimilar to, but distinct from 'target'.\n\nExamples:\n\n```\n\n\nput the id of me into theTarget\n\nset the width of me to 100\n\n\n```\n\n\n\n## min()\n\n\nSupports any number of arguments. You can also provide a comma-delimited string.\n\nExamples:\n\n```\n\n\nput min(1,2,3) into x\nput min(\"45,49,40\") into x -- returns 40\n\n\n```\n\n\n\n## mouse()\n\n\nIs the mouse button currently down. Returns one of the constants `down` or `up`.\n\nExamples:\n\n```\n\n\nif the mouse is down then\n    answer \"mouse button is clicked\"\nend if\n\n\n```\n\n\n\n## mouseClick()\n\n\nWas the mouse recently clicked? Doesn't include the click that created the message, it needs to be later.\n\nWhen you check the mouseClick, it will only return true once before resetting back to false. See also: clickloc, clickh, clickv.\n\nExamples:\n\n```\n\n\nwait until the mouseClick\nanswer the clickloc\n\n\n\n```\n\n\n\n## mouseH()\n\n\nThe x coordinate of the current mouse location.\n\nExamples:\n\n```\n\n\nput mouseH() into x\n\n\n\n```\n\n\n\n## mouseLoc()\n\n\nThe coordinates of the current mouse location.\n\nExamples:\n\n```\n\n\nput mouseLoc() into x\n\n\n\n```\n\n\n\n## mouseV()\n\n\nThe y coordinate of the current mouse location.\n\nExamples:\n\n```\n\n\nput mouseV() into x\n\n\n\n```\n\n\n\n## number\n\n\n**Count parts of text**\n\n```\nanswer the number of chars in \"abc\"\nanswer the number of items in \"a,b,c\"\nanswer the number of lines in myList\n```\n\n\n**Count current objects**\n\n```\nanswer the number of cards in this stack\nanswer the number of buttons in this card\nanswer the number of fields in this card\nrepeat with x = 1 to the number of cards in this stack\n    set the name of card x of this stack to \"c\" & x\nend repeat\n```\n\n\n**Get the number of an object.**\n\n```\nanswer the number of this card\nput the number of cd fld id 1234 into x\nput \"abc\" into cd fld x\n```\n\n\n\n## numberToStr(x)\n\n\nConvert number to string.\n\nExamples:\n\n```\n\n\nput numberToStr(0.5) into x\n\n\n```\n\n\n\n## numToChar(x)\n\n\nFrom a character to an ascii-like number. Note that characters in a field are displayed in Mac OS Roman encoding.\n\nNote that the newline character is always \\n (10).\n\nExamples:\n\n```\n\n\nput numToChar(\"a\") into x\n\n\n\n```\n\n\n\n## objectById(id)\n\n\nGets the full id from the numeric id.\n\nExamples:\n\n```\n\n\n-- assuming there is a cd btn id 1234\nput objectById(1234) into x\n-- x is now \"card button id 1234\".\n-- you can now do this\nset the topleft of x to 100, 200\n\n\n```\n\n\n\n## offset(needle, haystack)\n\n\nSearch for a string within a string, and return the position where found. If not found, returns 0. (one-based indexing).\n\nExamples:\n\n```\n\n\nput offset(\"b\", \"abc\") into x\n-- x is now 2.\n\n\n\n```\n\n\n\n## optionKey()\n\n\nCheck if this modifier key is pressed.\n\nExamples:\n\n```\n\n\nif the optionKey is down then\n    answer \"opt key is down\"\nend if\n\n\n```\n\n\n\n## param(n)\n\n\nGet the nth value passed into the current procedure. Can be used to build a function that takes any number of arguments,  see example.\n\nExamples:\n\n```\n\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer \"total is\" && total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n\n```\n\n\n\n## paramCount()\n\n\nGet the number of values passed into the current procedure. Can be used to build a function that takes any number of arguments, see example.\n\nExamples:\n\n```\n\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer \"total is\" && total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n\n```\n\n\n\n## params()\n\n\nGet all of the values passed into the current procedure.\n\nExamples:\n\n```\n\n\nput params() into x\n\n\n\n```\n\n\n\n## random(n)\n\n\nn must be an integer.\n\nReturns random value between 1 and n.\n\nExamples:\n\n```\n\n\nput random(20) into roll\n\n\n```\n\n\n\n## result()\n\n\nThe return value of the last called function or procedure.\n\nExamples:\n\n```\n\n\non myProc\n    return \"a\"\nend myProc\non mouseUp\n    myProc\n    answer the result\nend mouseUp\n\n\n```\n\n\n\n## round(x)\n\n\nReturns integer nearest to number. Odd integers plus 0.5 round up, even integers plus 0.5 round down.\n\nExamples:\n\n```\n\n\nput round(1.7) into x\n\n\n```\n\n\n\n## screenRect()\n\n\n\nExamples:\n\n```\n\n\nput screenRect() into x\n\n\n\n```\n\n\n\n## seconds()\n\n\nSeconds since January 1, 1904.\n\nExamples:\n\n```\n\n\nput seconds() into x\n\n\n```\n\n\n\n## selectedChunk()\n\n\nA full description of the current selection, or \"\" if there is no selection.\n\nReturns a string that looks like this: `char 2 to 4 of cd fld id 567`.\n\nExamples:\n\n```\n\n\nset the textSize of the selectedChunk to 24\nput the textFont of the selectedChunk into x\nput word 2 of the selectedChunk into selStart \nput word 4 of the selectedChunk into selEnd \nput the selectedChunk into x\n\n\n```\n\n\n\n## selectedField()\n\n\nThe field that contains current selected text, or \"\" if there is no selection.\n\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\n\n\"card field 4\".)\n\nExamples:\n\n```\n\n\nput selectedField() into x\nset the loc of the selectedField to 23, 45\nset the textalign of the selectedField to \"center\"\n\n\n```\n\n\n\n## selectedLine()\n\n\nThe number of the line of the current selected text, or \"\" if there is no selection.\n\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\n\n\"line 3 of card field 4\".)\n\nExamples:\n\n```\n\n\nput selectedLine() into x\n\n\n\n```\n\n\n\n## selectedText()\n\n\nThe value of the current selected text, or the empty string if there is no selection.\n\nExamples:\n\n```\n\n\nput selectedText() into x\n\n\n```\n\n\n\n## the selection\n\n\nReading from `the selection` retrieves the value of the current selected text, or the empty string if there is no selection.\n\nWriting to `the selection` replaces the currently selected text with new text.\n\nExamples:\n\n```\n\n\nput the selection into x\nput \"\" into the selection\nput \"abc\" into the selection\n\n-- chunks are supported\nput char 2 to 3 of the selection into x\nput \"\" into char 2 to 3 of the selection\nput \"abc\" into char 3 of the selection\nput item 2 to 3 of the selection into x\nput \"\" into item 2 to 3 of the selection\nput \"abc\" into item 3 of the selection\n\n-- you can delete part of the selection\ndelete char 2 to 4 of the selection\ndelete item 3 of the selection\n\n\n```\n\n\n\n## shiftKey()\n\n\nCheck if this modifier key is pressed.\n\nExamples:\n\n```\n\n\nif the shiftKey is down then\n    answer \"shift key is down\"\nend if\n\n\n\n```\n\n\n\n## sqrt(x)\n\n\n\nExamples:\n\n```\n\n\nput sqrt(0.5) into x\n\n\n```\n\n\n\n## sin(x)\n\n\n\nExamples:\n\n```\n\n\nput sin(0.5 * pi) into x\n\n\n\n```\n\n\n\n## strToNumber(x)\n\n\nParse string to number. Supports scientific notation. If cannot be parsed, returns \"false\"\n\nExamples:\n\n```\n\n\nput strToNumber(\"12\") into x\nput strToNumber(\"-12\") into x\nput strToNumber(\"1e6\") into x\nask \"what is a number\"\nput it into x\nif strToNumber(x) is false then\n    answer \"that was not a number\"\nend if\n\n\n\n\n```\n\n\n\n## sum()\n\n\n\nSupports any number of arguments.\n\nYou can also provide a comma-delimited string.\n\nExamples:\n\n```\n\n\nput sum(1,2,3) into x\nput sum(\"1,2,3\") into x -- returns 6\n\n\n\n```\n\n\n\n## tan(x)\n\n\n\nExamples:\n\n```\n\n\nput tan(0.125 * pi) into x\n\n\n\n```\n\n\n\n## target\n\n\nRefers to the object that was most recently acted on.\n\nHere's one way this can be useful: If you have many buttons that all basically perform the same action, you could have an 'on mouseup' handler in the card script instead of a separate script within each button. This script in the card could check the target to see which of the buttons were clicked.\n\nDifferent than 'me', which is the owner of the currently running script, which might be different than the button that was clicked.\n\nExamples:\n\n```\n\n\nset the width of the target to 100\n\nput the short id of the target into x\n\n\n\n```\n\n\n\n## there is a\n\n\nCheck for the existence of an object.\n\nExamples:\n\n```\n\n\nif there is a cd btn id 12345 then\n    answer \"found\"\nend if\nif there is not a cd btn id 12345 then\n    answer \"not found\"\nend if\n\n\n```\n\n\n\n## ticks()\n\n\nTicks (60th of a second) since January 1, 1904.\n\nExamples:\n\n```\n\n\nput ticks() into x\n\n\n```\n\n\n\n## tool()\n\n\nThe current simulated tool, as set by the `choose` command. (The `choose` command can be used to draw lines and shapes).\n\nThe actual current tool will be the browse tool when any script is running.\n\nExamples:\n\n```\n\n\nchoose pencil tool\nanswer tool() -- shows \"pencil\"\n\n\n```\n\n\n\n## toLowerCase()\n\n\nExamples:\n\n```\n\n\nanswer toLowerCase(\"ABC\") -- shows \"abc\"\n\n\n```\n\n\n\n## toUpperCase()\n\n\nExamples:\n\n```\n\n\nanswer toUpperCase(\"abc\") -- shows \"ABC\"\n\n\n\n```\n\n\n\n## trunc(x)\n\n\nGet integer part of a number. i.e. for positive numbers, always round down to the nearest integer.\n\nExamples:\n\n```\n\n\nput trunc(0.5) into x\n\n\n\n\n```\n\n\n\n## annuity(rate, periods)\n\n\nComputes the total cost of an annuity now that will pay you one unit per period, over the specific number of periods.\n\nYou want to purchase an annuity that pays you $10,000 a year for 10 years. The interest rate is 10%. How much will it cost you now? The amount loaned is 10000 * annuity(0.10, 10), or 61445.67.\n\n\n## compound(rate, periods)\n\n\n\nReturns the value of one unit of principal invested at the interest rate and compounded over the specified number of periods.\n\nExample: $100 invested for 20 years at 10% interest compounded yearly:\n\nfutureValue = 100 * compound(0.10, 20) = about $673\n"
  },
  {
    "path": "vipercard/doc/reference_06_events",
    "content": "\n \n\n============================================================\n========================= afterKeyDown\n============================================================\n\n\nCalled when a key is pressed.\n\nYou can use the functions `keyChar()`,  `shiftKey()`,  `optionKey()`, and `commandKey()`, to determine which key(s) where pressed.\n\n`keyRepeated()` can be used to see if the key event comes from the key having been held down.\n\nExamples:\n\non afterKeyDown\n    if keyChar() is \"i\" and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer \"you pressed option-i\"\n    else if keyChar() is \"U\" and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer \"you pressed shift-u\"\n    end if\nend afterKeyDown\n============================================================\n========================= afterKeyUp\n============================================================\n\n\nCalled when a key is pressed and released.\n\n\nExamples:\n\non afterKeyUp\n    if keyChar() is \"i\" then\n        answer \"you pressed i\"\n    end if\nend afterKeyUp\n\n============================================================\n========================= closeBackground\n============================================================\n\nWhen you go to a different card, if the card belongs to a different background, the closeBackground message will be sent. (You're leaving one background and going to another).\n\nExamples:\n\n-- in a background's script\non closeBackground\n    answer \"you have left this background\"\nend closeBackground\n\n============================================================\n========================= closeCard\n============================================================\n\nMessage sent upon leaving a card.\n\nBecause messages continue up the hierarchy until they are handled, you can also respond to closeCard in a stack script.\n\nExamples:\n\n-- in a card's script\non closeCard\n    answer \"you have left this card\"\nend closeCard\n\n\n============================================================\n========================= closeField\n============================================================\n\nSent when the user clicks on a field to select it, types text into the field, and then de-selects the field.\n\nIf the browse tool is active, this message will be sent by the following:\n* When typing text into a field, click outside the field\n* When typing text into a field, press Enter\n* When typing text into a field, go to a different card\n\nSee also: `openField` and `exitField`.\n\nThe message is sent to the target field and travels upward to the current card as usual.\n\nExamples:\n\n-- in a field's script\n\non closeField\n    -- do a simple check of what the user just typed\n    if not \"@\" in the target then\n        put \"not a e-mail address\" into cd fld \"status\"\n    else\n        put \"\" into cd fld \"status\"\n    end if\nend closeField\n\n============================================================\n========================= exitField\n============================================================\n\nSent when the user clicks on a field to select it, does not type text into the field, and then de-selects the field.\n\nIf the browse tool is active, this message will be sent by the following:\n* When a field is selected, click outside the field\n* When a field is selected, press Enter\n* When a field is selected, go to a different card\n\nIt's possible for exitField to be sent to the field more than once if some of the above actions happen at the same time.\n\nSee also: `openField` and `closeField`.\n\nThe message is sent to the target field and travels upward to the current card as usual.\n\nExamples:\n\n-- in a field's script\n\non openField\n    show cd btn \"indicateCurrentlyEditingField\"\nend openField\n\non closeField\n    hide cd btn \"indicateCurrentlyEditingField\"\nend closeField\n\non exitField\n    hide cd btn \"indicateCurrentlyEditingField\"\nend exitField\n\n============================================================\n========================= idle\n============================================================\n\nSent repeatedly to the current card. Can be used for a game loop.\n\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\n\nTo get faster idle calls, at the expense of heavier cpu usage, use `set the idlerate to \"faster\"`\n\n\n============================================================\n========================= mouseDoubleClick\n============================================================\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Create a button, edit its script, and type the example below. Now when you choose the browse tool and double-click the button, your code will run.\n\nExamples:\n\non mouseDoubleClick\n    answer \"you double-clicked this button.\"\nend mouseDoubleClick\n\n============================================================\n========================= mouseDown\n============================================================\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is pressed down onto the object. Create a button, edit its script, and type the example below. Now when you choose the browse tool and click the button, your code will run.\n\nExamples:\n\non mouseDown\n    answer \"code is running.\"\nend mouseDown\n\n============================================================\n========================= mouseEnter\n============================================================\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse enters the object.\n\nExamples:\n\non mouseEnter\n    set the icon of me to 12\nend mouseDown\n\n============================================================\n========================= mouseLeave\n============================================================\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse leaves the object.\n\nExamples:\n\non mouseLeave\n    set the icon of me to 10\nend mouseLeave\n\n============================================================\n========================= mouseUp\n============================================================\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is clicked. To be precise, when the mouse is pressed down onto the object, and released on the same object. Create a button, edit its script, type the example below. Now when you choose the browse tool and click the button, your code will run.\n\nExamples:\n\non mouseUp\n    answer \"hello, world.\"\nend mouseUp\n\n============================================================\n========================= mouseWithin\n============================================================\n\nCalled repeatedly when the cursor is inside the object. You can use the `mouseloc()` function to get the position of the cursor. This can be used to create drag/drop effects.\n\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\n\nExamples:\n\non mouseWithin\n    set the loc of cd btn \"follow\" to the mouseLoc\nend mouseWithin\n\n============================================================\n========================= openBackground\n============================================================\n\nWhen you go to a different card, if the card belongs to a different background, the openBackground message will be sent. (You're leaving one background and going to another).\n\nExamples:\n\n-- in a background's script\non openBackground\n    answer \"welcome to this background\"\nend openBackground\n\n============================================================\n========================= openCard\n============================================================\n\nMessage sent upon going to a card.\n\nBecause messages continue up the hierarchy until they are handled, you can also respond to openCard in a stack script.\n\nExamples:\n\n-- in a card's script\non openCard\n    answer \"welcome to this card\"\nend openCard\n\n============================================================\n========================= openField\n============================================================\n\nSent to a field, when text is first selected in it.\n\nSee also: `closeField` and `exitField`.\n\nExamples:\n\n-- in a field's script\n\non openField\n    -- place default text in the field when you tab over to it...\n    put \"abc\" into the target\nend openField\n\n============================================================\n========================= openStack\n============================================================\n\nMessage sent upon first opening the stack.\n\nExamples:\n\n-- in a stack's script\non openStack\n    answer \"welcome to this card\"\nend openStack\n\n"
  },
  {
    "path": "vipercard/doc/reference_06_events.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./reference_02_commands.md) | [Syntax](./reference_03_syntax.md) | [Properties](./reference_04_properties.md) | [Functions](./reference_05_functions.md) | Event Handlers | [Compatibility](./reference_07_compatibility.md)\n\n\n\n## afterKeyDown\n\n\n\nCalled when a key is pressed.\n\nYou can use the functions `keyChar()`,  `shiftKey()`,  `optionKey()`, and `commandKey()`, to determine which key(s) where pressed.\n\n`keyRepeated()` can be used to see if the key event comes from the key having been held down.\n\nExamples:\n\n```\n\n\non afterKeyDown\n    if keyChar() is \"i\" and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer \"you pressed option-i\"\n    else if keyChar() is \"U\" and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer \"you pressed shift-u\"\n    end if\nend afterKeyDown\n\n```\n\n\n\n## afterKeyUp\n\n\n\nCalled when a key is pressed and released.\n\n\nExamples:\n\n```\n\n\non afterKeyUp\n    if keyChar() is \"i\" then\n        answer \"you pressed i\"\n    end if\nend afterKeyUp\n\n\n```\n\n\n\n## closeBackground\n\n\nWhen you go to a different card, if the card belongs to a different background, the closeBackground message will be sent. (You're leaving one background and going to another).\n\nExamples:\n\n```\n\n\n-- in a background's script\non closeBackground\n    answer \"you have left this background\"\nend closeBackground\n\n\n```\n\n\n\n## closeCard\n\n\nMessage sent upon leaving a card.\n\nBecause messages continue up the hierarchy until they are handled, you can also respond to closeCard in a stack script.\n\nExamples:\n\n```\n\n\n-- in a card's script\non closeCard\n    answer \"you have left this card\"\nend closeCard\n\n\n\n```\n\n\n\n## closeField\n\n\nSent when the user clicks on a field to select it, types text into the field, and then de-selects the field.\n\nIf the browse tool is active, this message will be sent by the following:\n* When typing text into a field, click outside the field\n* When typing text into a field, press Enter\n* When typing text into a field, go to a different card\n\nSee also: `openField` and `exitField`.\n\nThe message is sent to the target field and travels upward to the current card as usual.\n\nExamples:\n\n```\n\n\n-- in a field's script\n\non closeField\n    -- do a simple check of what the user just typed\n    if not \"@\" in the target then\n        put \"not a e-mail address\" into cd fld \"status\"\n    else\n        put \"\" into cd fld \"status\"\n    end if\nend closeField\n\n\n```\n\n\n\n## exitField\n\n\nSent when the user clicks on a field to select it, does not type text into the field, and then de-selects the field.\n\nIf the browse tool is active, this message will be sent by the following:\n* When a field is selected, click outside the field\n* When a field is selected, press Enter\n* When a field is selected, go to a different card\n\nIt's possible for exitField to be sent to the field more than once if some of the above actions happen at the same time.\n\nSee also: `openField` and `closeField`.\n\nThe message is sent to the target field and travels upward to the current card as usual.\n\nExamples:\n\n```\n\n\n-- in a field's script\n\non openField\n    show cd btn \"indicateCurrentlyEditingField\"\nend openField\n\non closeField\n    hide cd btn \"indicateCurrentlyEditingField\"\nend closeField\n\non exitField\n    hide cd btn \"indicateCurrentlyEditingField\"\nend exitField\n\n\n```\n\n\n\n## idle\n\n\nSent repeatedly to the current card. Can be used for a game loop.\n\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\n\nTo get faster idle calls, at the expense of heavier cpu usage, use `set the idlerate to \"faster\"`\n\n\n\n## mouseDoubleClick\n\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Create a button, edit its script, and type the example below. Now when you choose the browse tool and double-click the button, your code will run.\n\nExamples:\n\n```\n\n\non mouseDoubleClick\n    answer \"you double-clicked this button.\"\nend mouseDoubleClick\n\n\n```\n\n\n\n## mouseDown\n\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is pressed down onto the object. Create a button, edit its script, and type the example below. Now when you choose the browse tool and click the button, your code will run.\n\nExamples:\n\n```\n\n\non mouseDown\n    answer \"code is running.\"\nend mouseDown\n\n\n```\n\n\n\n## mouseEnter\n\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse enters the object.\n\nExamples:\n\n```\n\n\non mouseEnter\n    set the icon of me to 12\nend mouseDown\n\n\n```\n\n\n\n## mouseLeave\n\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse leaves the object.\n\nExamples:\n\n```\n\n\non mouseLeave\n    set the icon of me to 10\nend mouseLeave\n\n\n```\n\n\n\n## mouseUp\n\n\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is clicked. To be precise, when the mouse is pressed down onto the object, and released on the same object. Create a button, edit its script, type the example below. Now when you choose the browse tool and click the button, your code will run.\n\nExamples:\n\n```\n\n\non mouseUp\n    answer \"hello, world.\"\nend mouseUp\n\n\n```\n\n\n\n## mouseWithin\n\n\nCalled repeatedly when the cursor is inside the object. You can use the `mouseloc()` function to get the position of the cursor. This can be used to create drag/drop effects.\n\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\n\nExamples:\n\n```\n\n\non mouseWithin\n    set the loc of cd btn \"follow\" to the mouseLoc\nend mouseWithin\n\n\n```\n\n\n\n## openBackground\n\n\nWhen you go to a different card, if the card belongs to a different background, the openBackground message will be sent. (You're leaving one background and going to another).\n\nExamples:\n\n```\n\n\n-- in a background's script\non openBackground\n    answer \"welcome to this background\"\nend openBackground\n\n\n```\n\n\n\n## openCard\n\n\nMessage sent upon going to a card.\n\nBecause messages continue up the hierarchy until they are handled, you can also respond to openCard in a stack script.\n\nExamples:\n\n```\n\n\n-- in a card's script\non openCard\n    answer \"welcome to this card\"\nend openCard\n\n\n```\n\n\n\n## openField\n\n\nSent to a field, when text is first selected in it.\n\nSee also: `closeField` and `exitField`.\n\nExamples:\n\n```\n\n\n-- in a field's script\n\non openField\n    -- place default text in the field when you tab over to it...\n    put \"abc\" into the target\nend openField\n\n\n```\n\n\n\n## openStack\n\n\nMessage sent upon first opening the stack.\n\nExamples:\n\n```\n\n\n-- in a stack's script\non openStack\n    answer \"welcome to this card\"\nend openStack\n\n\n\n```\n\n"
  },
  {
    "path": "vipercard/doc/reference_07_compatibility",
    "content": "\n\n============================================================\n========================= (Compatibility)\n============================================================\n\nThese are provided for compatibility with HyperCard. They might have hard-coded values/reduced functionality, and are unlikely to be useful in new scripts.\n\nYou can enable compatibility mode for a stack by choosing `Object->Stack info...` and clicking `Compatibility` in the panel on the right. This setting is saved with the stack and makes these changes for compatibility.\n* You can say `btn 2` instead of `cd btn 2`\n* You can say `put \"A\" into item 3 of char 2 of x` which doesn't usually make sense\n* You can say `put \"new\" into item 4 of line 3 of x` and get more intuitive behavior\n* Uses HyperCard's less useful form for `long id`, `owner`, and `the target`.\n\n============================================================\n========================= abbrev id\n============================================================\n\n\nExamples:\n\nput the abbrev id of cd fld \"myFld\" into z\n\n\n============================================================\n========================= abbrev name\n============================================================\n\n\nExamples:\n\nput the abbrev name of cd fld \"myFld\" into z\n\n============================================================\n========================= arrowKey\n============================================================\n\nSends an `arrowKey` message. By default, `arrowKey left` goes to the previous card, and `arrowKey right` goes to the next card, but this can be overridden in a card script or stack script.\n\n============================================================\n========================= bottom\n============================================================\n\nEquivalent to the top of the object + the height of the object.\nExamples:\n\nput the bottom of cd fld \"myFld\" into z\n\n============================================================\n========================= botright\n============================================================\n\n\nExamples:\n\nput the botright of cd btn \"myBtn\" into z\n\n============================================================\n========================= diskSpace()\n============================================================\n\n(Deprecated and hard-coded).\nExamples:\n\nput diskSpace() into x\n\n\n\n============================================================\n========================= environment\n============================================================\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\nput the environment into z\n\n\n\n============================================================\n========================= errorDialog\n============================================================\n\n\nCauses a runtime error at the current line.\n\nExamples:\n\nerrorDialog \"Not a number\"\n\n============================================================\n========================= exp1(x)\n============================================================\n\n(e to the power of x) minus 1.\n\nExamples:\n\nput exp1(0.5) into x\n\n============================================================\n========================= freesize\n============================================================\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\nput the freesize of this stack into z\n\n============================================================\n========================= get\n============================================================\n\nEvaluates any expression and saves the result to the variable \"it\".\n\nThe 'put' command is typically more useful.\n\nExamples:\n\nget 2+3\nput it into x\nanswer x -- shows 5\n\nget the width of cd btn \"myBtn\"\nput it into x\nanswer x -- shows the width of the specified button\n\n============================================================\n========================= heapSpace()\n============================================================\n\n(Deprecated and hard-coded).\nExamples:\n\nput heapSpace() into x\n\n\n============================================================\n========================= ln1(x)\n============================================================\n\nNatural logarithm of (x + 1)\nExamples:\n\nput ln1(0.5) into x\n\n============================================================\n========================= long name\n============================================================\n\n\nExamples:\n\nput the long name of cd fld \"myFld\" into z\n\n============================================================\n========================= mark\n============================================================\n\nFully functional, might not be useful.\nSets the \"marked\" property on a card to true.\n\n`\nmark card id 1234\nmark cards where the name of this card contains \"b\"\nmark all cards\n`\n\nWhen cards are marked, you can conveniently reference them:\n`\nmarked card 4\nprev marked card\nnext marked card\nfirst marked card\nsecond marked card\nlast marked card\n`\n============================================================\n========================= marked\n============================================================\n\nYou can mark a card.\nExamples:\n\nanswer the marked of cd 4\nset the marked of cd 4 to true\n\n============================================================\n========================= on___errorDialog\n============================================================\n\n\n(Included for compatibility, unlikely to be useful for writing scripts).\n\nA few error messages create an errorDialog event. The default response is\nto show a script error at the offending line. If you write your own errorDialog\nhandler you can catch these events. However, because nearly all errors do not\ngo through errorDialog, this is unlikely to be useful.\n\n============================================================\n========================= right\n============================================================\n\nEquivalent to the left of the object + the width of the object.\nExamples:\n\nput the right of cd fld \"myFld\" into z\n\n\n============================================================\n========================= pop\n============================================================\n\nFunctional, but not recommended in new code.\n\nExamples:\n\npush card\ngo to card 7\npop card into x\ngo to card x\n\n============================================================\n========================= push\n============================================================\n\nFunctional, but not recommended in new code.\n\nExamples:\n\npush card\ngo to card 7\npop card\n\n\n============================================================\n========================= size\n============================================================\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\nput the size of this stack into z\n\n============================================================\n========================= stacksInUse\n============================================================\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\nput the stacksInUse into z\n\n\n============================================================\n========================= stackSpace()\n============================================================\n\n(Deprecated and hard-coded).\nExamples:\n\nput stackSpace() into x\n\n\n============================================================\n========================= suspended\n============================================================\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\nput the suspended into z\n\n\n\n============================================================\n========================= systemVersion\n============================================================\n\n(Deprecated and hard-coded).\nTo get the current software version, use\n`put the version into x`\nor\n`put the long version into x`\ninstead.\n\nExamples:\n\nput systemVersion() into x\n\n============================================================\n========================= trappable: on___arrowKey\n============================================================\n\nYou can make a custom `arrowKey` handler that overrides the default one.\n\n============================================================\n========================= trappable: on___doMenu\n============================================================\n\nYou can make a custom `doMenu` handler that overrides the default one.\n\nHold the Shift key to bypass a customized `doMenu`.\n\nExamples:\n\n-- in a card's script\non doMenu p1, p2\n    if p1 == \"New Card\" then\n        answer \"Making a new card\"\n    end if\n    send \"doMenu \"&quote&p1&quote&\", \"&quote&p2&quote to this stack\nend doMenu\n============================================================\n========================= trappable: on___help\n============================================================\n\nYou can make a custom `help` handler that overrides the default one. However, the default one won't really ever be called, since you can't choose `Help` from the `Go` menu in ViperCard.\n\n============================================================\n========================= unmark\n============================================================\n\nFully functional, might not be useful.\n\nSets the \"marked\" property on a card to false.\n\nExamples:\n\nunmark card id 1234\nunmark all cards\n\n============================================================\n========================= version\n============================================================\n\n\nExamples:\n\nput the version into z\nput the long version into z\n\n"
  },
  {
    "path": "vipercard/doc/reference_07_compatibility.md",
    "content": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [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\n\n\n\n## (Compatibility)\n\n\nThese are provided for compatibility with HyperCard. They might have hard-coded values/reduced functionality, and are unlikely to be useful in new scripts.\n\nYou can enable compatibility mode for a stack by choosing `Object->Stack info...` and clicking `Compatibility` in the panel on the right. This setting is saved with the stack and makes these changes for compatibility.\n* You can say `btn 2` instead of `cd btn 2`\n* You can say `put \"A\" into item 3 of char 2 of x` which doesn't usually make sense\n* You can say `put \"new\" into item 4 of line 3 of x` and get more intuitive behavior\n* Uses HyperCard's less useful form for `long id`, `owner`, and `the target`.\n\n\n## abbrev id\n\n\n\nExamples:\n\n```\n\n\nput the abbrev id of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## abbrev name\n\n\n\nExamples:\n\n```\n\n\nput the abbrev name of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## arrowKey\n\n\nSends an `arrowKey` message. By default, `arrowKey left` goes to the previous card, and `arrowKey right` goes to the next card, but this can be overridden in a card script or stack script.\n\n\n## bottom\n\n\nEquivalent to the top of the object + the height of the object.\n\nExamples:\n\n```\n\n\nput the bottom of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## botright\n\n\n\nExamples:\n\n```\n\n\nput the botright of cd btn \"myBtn\" into z\n\n\n```\n\n\n\n## diskSpace()\n\n\n(Deprecated and hard-coded).\n\nExamples:\n\n```\n\n\nput diskSpace() into x\n\n\n\n\n```\n\n\n\n## environment\n\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\n```\n\n\nput the environment into z\n\n\n\n\n```\n\n\n\n## errorDialog\n\n\n\nCauses a runtime error at the current line.\n\nExamples:\n\n```\n\n\nerrorDialog \"Not a number\"\n\n\n```\n\n\n\n## exp1(x)\n\n\n(e to the power of x) minus 1.\n\nExamples:\n\n```\n\n\nput exp1(0.5) into x\n\n\n```\n\n\n\n## freesize\n\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\n```\n\n\nput the freesize of this stack into z\n\n\n```\n\n\n\n## get\n\n\nEvaluates any expression and saves the result to the variable \"it\".\n\nThe 'put' command is typically more useful.\n\nExamples:\n\n```\n\n\nget 2+3\nput it into x\nanswer x -- shows 5\n\nget the width of cd btn \"myBtn\"\nput it into x\nanswer x -- shows the width of the specified button\n\n\n```\n\n\n\n## heapSpace()\n\n\n(Deprecated and hard-coded).\n\nExamples:\n\n```\n\n\nput heapSpace() into x\n\n\n\n```\n\n\n\n## ln1(x)\n\n\nNatural logarithm of (x + 1)\n\nExamples:\n\n```\n\n\nput ln1(0.5) into x\n\n\n```\n\n\n\n## long name\n\n\n\nExamples:\n\n```\n\n\nput the long name of cd fld \"myFld\" into z\n\n\n```\n\n\n\n## mark\n\n\nFully functional, might not be useful.\n\nSets the \"marked\" property on a card to true.\n\n\n```\n\nmark card id 1234\nmark cards where the name of this card contains \"b\"\nmark all cards\n\n```\n\n\nWhen cards are marked, you can conveniently reference them:\n\n```\n\nmarked card 4\nprev marked card\nnext marked card\nfirst marked card\nsecond marked card\nlast marked card\n\n```\n\n\n\n## marked\n\n\nYou can mark a card.\n\nExamples:\n\n```\n\n\nanswer the marked of cd 4\nset the marked of cd 4 to true\n\n\n```\n\n\n\n## on errorDialog\n\n\n\n(Included for compatibility, unlikely to be useful for writing scripts).\n\nA few error messages create an errorDialog event. The default response is\n\nto show a script error at the offending line. If you write your own errorDialog\n\nhandler you can catch these events. However, because nearly all errors do not\n\ngo through errorDialog, this is unlikely to be useful.\n\n\n## right\n\n\nEquivalent to the left of the object + the width of the object.\n\nExamples:\n\n```\n\n\nput the right of cd fld \"myFld\" into z\n\n\n\n```\n\n\n\n## pop\n\n\nFunctional, but not recommended in new code.\n\nExamples:\n\n```\n\n\npush card\ngo to card 7\npop card into x\ngo to card x\n\n\n```\n\n\n\n## push\n\n\nFunctional, but not recommended in new code.\n\nExamples:\n\n```\n\n\npush card\ngo to card 7\npop card\n\n\n\n```\n\n\n\n## size\n\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\n```\n\n\nput the size of this stack into z\n\n\n```\n\n\n\n## stacksInUse\n\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\n```\n\n\nput the stacksInUse into z\n\n\n\n```\n\n\n\n## stackSpace()\n\n\n(Deprecated and hard-coded).\n\nExamples:\n\n```\n\n\nput stackSpace() into x\n\n\n\n```\n\n\n\n## suspended\n\n\n(Deprecated and hard-coded, for backwards compatibility only)\n\nExamples:\n\n```\n\n\nput the suspended into z\n\n\n\n\n```\n\n\n\n## systemVersion\n\n\n(Deprecated and hard-coded).\n\nTo get the current software version, use\n\n```\nput the version into x\n```\n\nor\n\n```\nput the long version into x\n```\n\ninstead.\n\nExamples:\n\n```\n\n\nput systemVersion() into x\n\n\n```\n\n\n\n## trappable: on arrowKey\n\n\nYou can make a custom `arrowKey` handler that overrides the default one.\n\n\n## trappable: on doMenu\n\n\nYou can make a custom `doMenu` handler that overrides the default one.\n\nHold the Shift key to bypass a customized `doMenu`.\n\nExamples:\n\n```\n\n\n-- in a card's script\non doMenu p1, p2\n    if p1 == \"New Card\" then\n        answer \"Making a new card\"\n    end if\n    send \"doMenu \"&quote&p1&quote&\", \"&quote&p2&quote to this stack\nend doMenu\n\n```\n\n\n\n## trappable: on help\n\n\nYou can make a custom `help` handler that overrides the default one. However, the default one won't really ever be called, since you can't choose `Help` from the `Go` menu in ViperCard.\n\n\n## unmark\n\n\nFully functional, might not be useful.\n\nSets the \"marked\" property on a card to false.\n\nExamples:\n\n```\n\n\nunmark card id 1234\nunmark all cards\n\n\n```\n\n\n\n## version\n\n\n\nExamples:\n\n```\n\n\nput the version into z\nput the long version into z\n\n\n\n```\n\n"
  },
  {
    "path": "vipercard/vipercard/.eslintrc.js",
    "content": "/* Useful references:\nhttps://www.npmjs.com/package/eslint-config-react-app\nhttps://github.com/facebook/create-react-app/blob/master/packages/eslint-config-react-app/index.js\nhttps://medium.com/@dors718/linting-your-react-typescript-project-with-eslint-and-prettier-2423170c3d42\nto run it from a shell\nnpm run lint */\n\nconst path = require('path');\nmodule.exports = {\n    parser: '@typescript-eslint/parser', /* Specifies the ESLint parser */\n    plugins: [\n        '@typescript-eslint',\n        'ban',\n        /* not 'prettier', we don't run prettier through eslint as it's slow */\n        /* to run prettier, instead run `npm run prettierexceptlongimports` */\n    ],\n    env: {\n        browser: true,\n        jest: true\n    },\n    extends: [\n        'eslint:recommended',\n        'plugin:@typescript-eslint/recommended', /* Uses the recommended rules from the @typescript-eslint/eslint-plugin */\n        'plugin:@typescript-eslint/recommended-requiring-type-checking', /* You need both to actually get the defaults */\n        'prettier/@typescript-eslint', /* Disable ESLint rules if their redundant with a prettier error  */\n        /* 'plugin:prettier/recommended' Displays prettier errors as ESLint errors. (must be last) */\n    ],\n    parserOptions: {\n        project: path.resolve(__dirname, './tsconfig.json'),\n        tsconfigRootDir: __dirname,\n        ecmaVersion: 2018, /* Allows for the parsing of modern ECMAScript features */\n        sourceType: 'module', /* Allows for the use of imports */\n        ecmaFeatures: {\n            jsx: true /* Allows for the parsing of JSX */\n        }\n    },\n    rules: {\n        /* let's alter rules from the recommendations above */\n        /* turn off ones that typescript does a better job at */\n        'no-undef': 'off',\n        'no-redeclare': 'off',\n\n        /* won't let you do myList.reduce(Util512.add) */\n        '@typescript-eslint/unbound-method': 'off',\n\n        /* don't needlessly have a call() or apply() */\n        'no-useless-call': 'warn', \n\n        /* apply is dangerous, there could be max arg limits. see also the ban/ban */\n        'prefer-spread': 'warn', \n\n        /* personal preference, ones that I think are fine */\n        'no-inner-declarations': 'off',\n        'no-prototype-builtins': 'off',\n        'no-debugger': 'off',\n        'no-constant-condition': 'off',\n        'prefer-const': 'off',\n        'prefer-destructuring': 'off',\n        'no-empty': 'off',\n\n        /* typescript, ones that I think are fine */\n        '@typescript-eslint/explicit-function-return-type': 'off',\n        '@typescript-eslint/class-name-casing': 'off',\n        '@typescript-eslint/camelcase': 'off',\n        '@typescript-eslint/no-explicit-any': 'off',\n        '@typescript-eslint/no-use-before-define': 'off',\n        '@typescript-eslint/triple-slash-reference': 'off',\n        '@typescript-eslint/no-inferrable-types': 'off',\n        '@typescript-eslint/no-empty-interface': 'off',\n        '@typescript-eslint/no-empty-function': 'off',\n        '@typescript-eslint/no-empty': 'off',\n        '@typescript-eslint/no-namespace': 'off',\n        '@typescript-eslint/prefer-regexp-exec': 'off',\n        '@typescript-eslint/promise-function-async': 'off',\n        '@typescript-eslint/interface-name-prefix': 'off',\n        '@typescript-eslint/require-await': 'off',\n\n        /* leaving disabled, since default vals in classes seem to work fine */\n        'no-invalid-this': 'off',\n\n        /* we want let s1 || 'default' to be an error, s1 ?? 'default' is better */\n        /* should I enable strict-boolean-expressions to detect this?  */\n        /* no, causes false positives for code like if (str1) {...} which I think is ok. */\n        /* so I've written my own || check, which runs when you run `npm run prettierexceptlongimports` */\n        '@typescript-eslint/prefer-nullish-coalescing': [\"error\", { \n            ignoreConditionalTests: false,\n            ignoreMixedLogicalExpressions: false,\n            forceSuggestionFixer: false,\n          },],\n\n        /* went through all non-default ones, chose to turn these on */\n        'curly': 'warn',\n        'eqeqeq': 'warn',\n        'no-template-curly-in-string': 'warn',\n        'block-scoped-var': 'warn',\n        'default-case': 'warn',\n        'default-param-last': 'warn',\n        'guard-for-in': 'warn',\n        'no-caller': 'warn',\n        'no-constructor-return': 'warn',\n        'no-eval': 'warn',\n        'no-extend-native': 'warn',\n        'no-extra-bind': 'warn',\n        'no-extra-label': 'warn',\n        'no-floating-decimal': 'warn',\n        'no-implicit-coercion': 'warn',\n        'no-implied-eval': 'warn',\n        'no-labels': 'warn',\n        'no-loop-func': 'warn',\n        'no-new-func': 'warn',\n        'no-new-wrappers': 'warn',\n        'no-octal-escape': 'warn',\n        'no-return-assign': 'warn',\n        'no-return-await': 'warn',\n        'no-self-compare': 'warn',\n        'no-sequences': 'warn',\n        'no-throw-literal': 'warn',\n        'no-unused-expressions': 'warn',\n        'wrap-iife': 'warn',\n        'no-array-constructor': 'warn',\n        'no-multi-assign': 'warn',\n        'no-tabs': 'warn',\n        'no-var': 'warn',\n        'prefer-rest-params': 'warn',\n\n        /* unfortunately incompatible with prettier, see .prettier.js for more */\n        'no-mixed-operators': 'off',\n\n        /* went through all non-default ts ones, chose to turn these on */\n        '@typescript-eslint/no-extra-non-null-assertion': 'warn',\n        '@typescript-eslint/no-floating-promises': 'warn',\n        '@typescript-eslint/no-implied-eval': 'warn',\n        '@typescript-eslint/no-non-null-asserted-optional-chain': 'warn',\n        '@typescript-eslint/no-throw-literal': 'warn',\n        '@typescript-eslint/require-array-sort-compare': 'warn',\n\n        /* checks locals, not fn params. */\n        /* annoying to leave this on while editing, so we'll use typescript 6133 instead */\n        /* and leave typescript warning 6133 on only when building for production */\n        '@typescript-eslint/no-unused-vars': 'off', \n\n        /* don't need `radix` due to ban below */\n        /* don't need `prefer-for-of`, in some cases I want the slightly-faster for in */\n        /* don't need `no-duplicate-super`, no longer seen */\n        /* no-param-reassign might be useful one day */\n        /* id-blacklist might be useful one day */\n\n        \"ban/ban\": [\n            1, /* warn */\n            {\"name\": \"parseInt\", \"message\": \"prefer my parseint in utils, don't need to remember to specify base10.\"},\n            {\"name\": [\"*\", \"setTimeout\"], \"message\": \"use syncToAsyncAfterPause instead or exceptions won't get logged.\"},\n            {\"name\": \"setTimeout\", \"message\": \"use syncToAsyncAfterPause instead or exceptions won't get logged.\"},\n            {\"name\": [\"*\", \"setInterval\"], \"message\": \"use syncToAsyncAfterPause instead or exceptions won't get logged.\"},\n            {\"name\": \"setInterval\", \"message\": \"use syncToAsyncAfterPause instead or exceptions won't get logged.\"},\n        ]\n    },\n    settings: {\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/.gitignore",
    "content": "\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 libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n"
  },
  {
    "path": "vipercard/vipercard/.prettierrc.js",
    "content": "module.exports = {\n    /* note: because prettier strips most formatting on its way down to an AST, */\n    /* it strips parentheses from math expressions even when you've intentionally */\n    /* added them. */\n\n    /* and there's no way to disable this behavior, see */\n    /* https://github.com/prettier/prettier/issues/3968 */\n    /* almost a deal-breaker for me. for now I'll use prettier-ignore when needed. */\n\n    semi: true,\n    trailingComma: 'none',\n    singleQuote: true,\n    printWidth: 90,\n    tabWidth: 4,\n    arrowParens: 'avoid',\n};\n"
  },
  {
    "path": "vipercard/vipercard/.prettierrc_longer.js",
    "content": "module.exports = {\n    semi: true,\n    trailingComma: 'none',\n    singleQuote: true,\n    printWidth: 130,\n    tabWidth: 4,\n    arrowParens: 'avoid',\n};\n"
  },
  {
    "path": "vipercard/vipercard/.vscode/launch.json",
    "content": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"chrome\",\n            \"request\": \"launch\",\n            \"smartStep\": true,\n            \"name\": \"Launch Chrome against localhost\",\n            \"url\": \"http://localhost:8080\",\n            \"webRoot\": \"${workspaceFolder}\"\n        }\n    ]\n}\n"
  },
  {
    "path": "vipercard/vipercard/.vscode/settings.json",
    "content": "{\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    \"[javascript]\": {\n        \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n    },\n    \"files.exclude\": {\n        \"**/.git\": true,         \n        \"**/.DS_Store\": true,    \n        \"**/node_modules\": true, \n        \"**/nocpy*\": true,\n\n\n    \"*.pyc\": true,\n    \".gitignore\": true,\n    \"BingSiteAuth.xml\": true,\n    \"favicon.ico\": true,\n    \"handle_bounced_email.py\": true,\n    \"index.yaml\": true,\n    \"package-lock.json\": true,\n    \"tsconfig.json\": true,\n    \"vpservermainshell.py\": true,\n    \n    /* remove just this directory from list */\n    \"0.2\": true,\n    \"external\": true,\n    \"dist\": true,\n    \"tools\": true,\n    \"vpserver\": true,\n    \"resources\": true,\n    \"resources03a\": true,\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/.vscode/tasks.json",
    "content": "{\n    /* See https://go.microsoft.com/fwlink/?LinkId=733558 \n    for the documentation about the tasks.json format\n    these are in group build, they save any unsaved changes.\n\n    Note: to get the $gcc problem matcher you should install the\n    c/c++ vscode extension */\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"type\": \"npm\",\n            \"script\": \"build\",\n            \"problemMatcher\": [\n                \"$tsc\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"start\",\n            \"problemMatcher\": [\n                \"$tsc\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"lint\",\n            \"problemMatcher\": [\n                \"$eslint-stylish\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"autoimportmodules\",\n            \"problemMatcher\": [\n                \"$gcc\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"prettierexceptlongimports\",\n            \"problemMatcher\": [\n                \"$gcc\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"addassertmarkers\",\n            \"problemMatcher\": [\n                \"$gcc\"\n            ],\n            \"group\": \"build\"\n        },\n        {\n            \"type\": \"npm\",\n            \"script\": \"findmissingcomments\",\n            \"problemMatcher\": [\n                \"$gcc\"\n            ],\n            \"group\": \"build\"\n        },\n    ]\n}"
  },
  {
    "path": "vipercard/vipercard/0.3/html/404.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Page not found\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Page not found\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Page not found</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<div class=\"smalltheme-uppernavbox\"><span class=\"linktilebuttonhspace\"></span><a class=\"smalltheme-textwithinbox\" href=\"/\">vipercard</a><span class=\"smalltheme-textwithinbox\"><span class=\"linktilebuttonhspace\"></span></div>\n<article class=\"markdown-body\">\n\n\n<p>The requested page was not found.</p>\n<p><a href=\"/\"><img border=\"0\" src=\"/resources03a/intro/err/back.png\"  alt=\"Back to ViperCard\" /></a></p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/github-markdown.css",
    "content": "@font-face {\n  font-family: octicons-link;\n  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');\n}\n\n.markdown-body {\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n  line-height: 1.5;\n  color: #24292e;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 16px;\n  line-height: 1.5;\n  word-wrap: break-word;\n}\n\n.markdown-body .pl-c {\n  color: #6a737d;\n}\n\n.markdown-body .pl-c1,\n.markdown-body .pl-s .pl-v {\n  color: #005cc5;\n}\n\n.markdown-body .pl-e,\n.markdown-body .pl-en {\n  color: #6f42c1;\n}\n\n.markdown-body .pl-smi,\n.markdown-body .pl-s .pl-s1 {\n  color: #24292e;\n}\n\n.markdown-body .pl-ent {\n  color: #22863a;\n}\n\n.markdown-body .pl-k {\n  color: #d73a49;\n}\n\n.markdown-body .pl-s,\n.markdown-body .pl-pds,\n.markdown-body .pl-s .pl-pse .pl-s1,\n.markdown-body .pl-sr,\n.markdown-body .pl-sr .pl-cce,\n.markdown-body .pl-sr .pl-sre,\n.markdown-body .pl-sr .pl-sra {\n  color: #032f62;\n}\n\n.markdown-body .pl-v,\n.markdown-body .pl-smw {\n  color: #e36209;\n}\n\n.markdown-body .pl-bu {\n  color: #b31d28;\n}\n\n.markdown-body .pl-ii {\n  color: #fafbfc;\n  background-color: #b31d28;\n}\n\n.markdown-body .pl-c2 {\n  color: #fafbfc;\n  background-color: #d73a49;\n}\n\n.markdown-body .pl-c2::before {\n  content: \"^M\";\n}\n\n.markdown-body .pl-sr .pl-cce {\n  font-weight: bold;\n  color: #22863a;\n}\n\n.markdown-body .pl-ml {\n  color: #735c0f;\n}\n\n.markdown-body .pl-mh,\n.markdown-body .pl-mh .pl-en,\n.markdown-body .pl-ms {\n  font-weight: bold;\n  color: #005cc5;\n}\n\n.markdown-body .pl-mi {\n  font-style: italic;\n  color: #24292e;\n}\n\n.markdown-body .pl-mb {\n  font-weight: bold;\n  color: #24292e;\n}\n\n.markdown-body .pl-md {\n  color: #b31d28;\n  background-color: #ffeef0;\n}\n\n.markdown-body .pl-mi1 {\n  color: #22863a;\n  background-color: #f0fff4;\n}\n\n.markdown-body .pl-mc {\n  color: #e36209;\n  background-color: #ffebda;\n}\n\n.markdown-body .pl-mi2 {\n  color: #f6f8fa;\n  background-color: #005cc5;\n}\n\n.markdown-body .pl-mdr {\n  font-weight: bold;\n  color: #6f42c1;\n}\n\n.markdown-body .pl-ba {\n  color: #586069;\n}\n\n.markdown-body .pl-sg {\n  color: #959da5;\n}\n\n.markdown-body .pl-corl {\n  text-decoration: underline;\n  color: #032f62;\n}\n\n.markdown-body .octicon {\n  display: inline-block;\n  vertical-align: text-top;\n  fill: currentColor;\n}\n\n.markdown-body a {\n  background-color: transparent;\n}\n\n.markdown-body a:active,\n.markdown-body a:hover {\n  outline-width: 0;\n}\n\n.markdown-body strong {\n  font-weight: inherit;\n}\n\n.markdown-body strong {\n  font-weight: bolder;\n}\n\n.markdown-body h1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n.markdown-body img {\n  border-style: none;\n}\n\n.markdown-body code,\n.markdown-body kbd,\n.markdown-body pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n.markdown-body hr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\n.markdown-body input {\n  font: inherit;\n  margin: 0;\n}\n\n.markdown-body input {\n  overflow: visible;\n}\n\n.markdown-body [type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\n.markdown-body * {\n  box-sizing: border-box;\n}\n\n.markdown-body input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n.markdown-body a {\n  color: #0366d6;\n  text-decoration: none;\n}\n\n.markdown-body a:hover {\n  text-decoration: underline;\n}\n\n.markdown-body strong {\n  font-weight: 600;\n}\n\n.markdown-body hr {\n  height: 0;\n  margin: 15px 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: 1px solid #dfe2e5;\n}\n\n.markdown-body hr::before {\n  display: table;\n  content: \"\";\n}\n\n.markdown-body hr::after {\n  display: table;\n  clear: both;\n  content: \"\";\n}\n\n.markdown-body table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n\n.markdown-body td,\n.markdown-body th {\n  padding: 0;\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body h1 {\n  font-size: 32px;\n  font-weight: 600;\n}\n\n.markdown-body h2 {\n  font-size: 24px;\n  font-weight: 600;\n}\n\n.markdown-body h3 {\n  font-size: 20px;\n  font-weight: 600;\n}\n\n.markdown-body h4 {\n  font-size: 16px;\n  font-weight: 600;\n}\n\n.markdown-body h5 {\n  font-size: 14px;\n  font-weight: 600;\n}\n\n.markdown-body h6 {\n  font-size: 12px;\n  font-weight: 600;\n}\n\n.markdown-body p {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\n.markdown-body blockquote {\n  margin: 0;\n}\n\n.markdown-body ul,\n.markdown-body ol {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body ol ol,\n.markdown-body ul ol {\n  list-style-type: lower-roman;\n}\n\n.markdown-body ul ul ol,\n.markdown-body ul ol ol,\n.markdown-body ol ul ol,\n.markdown-body ol ol ol {\n  list-style-type: lower-alpha;\n}\n\n.markdown-body dd {\n  margin-left: 0;\n}\n\n.markdown-body code {\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  font-size: 12px;\n}\n\n.markdown-body pre {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  font-size: 12px;\n}\n\n.markdown-body .octicon {\n  vertical-align: text-bottom;\n}\n\n.markdown-body .pl-0 {\n  padding-left: 0 !important;\n}\n\n.markdown-body .pl-1 {\n  padding-left: 4px !important;\n}\n\n.markdown-body .pl-2 {\n  padding-left: 8px !important;\n}\n\n.markdown-body .pl-3 {\n  padding-left: 16px !important;\n}\n\n.markdown-body .pl-4 {\n  padding-left: 24px !important;\n}\n\n.markdown-body .pl-5 {\n  padding-left: 32px !important;\n}\n\n.markdown-body .pl-6 {\n  padding-left: 40px !important;\n}\n\n.markdown-body::before {\n  display: table;\n  content: \"\";\n}\n\n.markdown-body::after {\n  display: table;\n  clear: both;\n  content: \"\";\n}\n\n.markdown-body>*:first-child {\n  margin-top: 0 !important;\n}\n\n.markdown-body>*:last-child {\n  margin-bottom: 0 !important;\n}\n\n.markdown-body a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n\n.markdown-body .anchor {\n  float: left;\n  padding-right: 4px;\n  margin-left: -20px;\n  line-height: 1;\n}\n\n.markdown-body .anchor:focus {\n  outline: none;\n}\n\n.markdown-body p,\n.markdown-body blockquote,\n.markdown-body ul,\n.markdown-body ol,\n.markdown-body dl,\n.markdown-body table,\n.markdown-body pre {\n  margin-top: 0;\n  margin-bottom: 16px;\n}\n\n.markdown-body hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 24px 0;\n  background-color: #e1e4e8;\n  border: 0;\n}\n\n.markdown-body blockquote {\n  padding: 0 1em;\n  color: #6a737d;\n  border-left: 0.25em solid #dfe2e5;\n}\n\n.markdown-body blockquote>:first-child {\n  margin-top: 0;\n}\n\n.markdown-body blockquote>:last-child {\n  margin-bottom: 0;\n}\n\n.markdown-body kbd {\n  display: inline-block;\n  padding: 3px 5px;\n  font-size: 11px;\n  line-height: 10px;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: #fafbfc;\n  border: solid 1px #c6cbd1;\n  border-bottom-color: #959da5;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 #959da5;\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n  margin-top: 24px;\n  margin-bottom: 16px;\n  font-weight: 600;\n  line-height: 1.25;\n}\n\n.markdown-body h1 .octicon-link,\n.markdown-body h2 .octicon-link,\n.markdown-body h3 .octicon-link,\n.markdown-body h4 .octicon-link,\n.markdown-body h5 .octicon-link,\n.markdown-body h6 .octicon-link {\n  color: #1b1f23;\n  vertical-align: middle;\n  visibility: hidden;\n}\n\n.markdown-body h1:hover .anchor,\n.markdown-body h2:hover .anchor,\n.markdown-body h3:hover .anchor,\n.markdown-body h4:hover .anchor,\n.markdown-body h5:hover .anchor,\n.markdown-body h6:hover .anchor {\n  text-decoration: none;\n}\n\n.markdown-body h1:hover .anchor .octicon-link,\n.markdown-body h2:hover .anchor .octicon-link,\n.markdown-body h3:hover .anchor .octicon-link,\n.markdown-body h4:hover .anchor .octicon-link,\n.markdown-body h5:hover .anchor .octicon-link,\n.markdown-body h6:hover .anchor .octicon-link {\n  visibility: visible;\n}\n\n.markdown-body h1 {\n  padding-bottom: 0.3em;\n  font-size: 2em;\n  border-bottom: 1px solid #eaecef;\n}\n\n.markdown-body h2 {\n  padding-bottom: 0.3em;\n  font-size: 1.5em;\n  border-bottom: 1px solid #eaecef;\n}\n\n.markdown-body h3 {\n  font-size: 1.25em;\n}\n\n.markdown-body h4 {\n  font-size: 1em;\n}\n\n.markdown-body h5 {\n  font-size: 0.875em;\n}\n\n.markdown-body h6 {\n  font-size: 0.85em;\n  color: #6a737d;\n}\n\n.markdown-body ul,\n.markdown-body ol {\n  padding-left: 2em;\n}\n\n.markdown-body ul ul,\n.markdown-body ul ol,\n.markdown-body ol ol,\n.markdown-body ol ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body li {\n  word-wrap: break-all;\n}\n\n.markdown-body li>p {\n  margin-top: 16px;\n}\n\n.markdown-body li+li {\n  margin-top: 0.25em;\n}\n\n.markdown-body dl {\n  padding: 0;\n}\n\n.markdown-body dl dt {\n  padding: 0;\n  margin-top: 16px;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n\n.markdown-body dl dd {\n  padding: 0 16px;\n  margin-bottom: 16px;\n}\n\n.markdown-body table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n\n.markdown-body table th {\n  font-weight: 600;\n}\n\n.markdown-body table th,\n.markdown-body table td {\n  padding: 6px 13px;\n  border: 1px solid #dfe2e5;\n}\n\n.markdown-body table tr {\n  background-color: #fff;\n  border-top: 1px solid #c6cbd1;\n}\n\n.markdown-body table tr:nth-child(2n) {\n  background-color: #f6f8fa;\n}\n\n.markdown-body img {\n  max-width: 100%;\n  box-sizing: content-box;\n  background-color: #fff;\n}\n\n.markdown-body img[align=right] {\n  padding-left: 20px;\n}\n\n.markdown-body img[align=left] {\n  padding-right: 20px;\n}\n\n.markdown-body code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: rgba(27,31,35,0.05);\n  border-radius: 3px;\n}\n\n.markdown-body pre {\n  word-wrap: normal;\n}\n\n.markdown-body pre>code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n\n.markdown-body .highlight {\n  margin-bottom: 16px;\n}\n\n.markdown-body .highlight pre {\n  margin-bottom: 0;\n  word-break: normal;\n}\n\n.markdown-body .highlight pre,\n.markdown-body pre {\n  padding: 16px;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: #f6f8fa;\n  border-radius: 3px;\n}\n\n.markdown-body pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: transparent;\n  border: 0;\n}\n\n.markdown-body .full-commit .btn-outline:not(:disabled):hover {\n  color: #005cc5;\n  border-color: #005cc5;\n}\n\n.markdown-body kbd {\n  display: inline-block;\n  padding: 3px 5px;\n  font: 11px \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  line-height: 10px;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: #fafbfc;\n  border: solid 1px #d1d5da;\n  border-bottom-color: #c6cbd1;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 #c6cbd1;\n}\n\n.markdown-body :checked+.radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: #0366d6;\n}\n\n.markdown-body .task-list-item {\n  list-style-type: none;\n}\n\n.markdown-body .task-list-item+.task-list-item {\n  margin-top: 3px;\n}\n\n.markdown-body .task-list-item input {\n  margin: 0 0.2em 0.25em -1.6em;\n  vertical-align: middle;\n}\n\n.markdown-body hr {\n  border-bottom-color: #eee;\n}\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_01_overview.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - overview\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - overview\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - overview</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p>Overview | <a href=\"./reference_02_commands.html\">Commands</a> | <a href=\"./reference_03_syntax.html\">Syntax</a> | <a href=\"./reference_04_properties.html\">Properties</a> | <a href=\"./reference_05_functions.html\">Functions</a> | <a href=\"./reference_06_events.html\">Event Handlers</a> | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"introduction\">Introduction</h2>\n<p>Welcome to ViperCard, an open source re-creation and re-imagination of 1987&#39;s HyperCard. We suggest first watching the example videos (<a href=\"../video.html\">here</a>).</p>\n<h2 id=\"scripting\">Scripting</h2>\n<p>All objects (all buttons, fields, and cards) have an associated set of code called a &quot;script.&quot;</p>\n<p>Here is an example script:</p>\n<pre><code>on mouseUp\n    answer &quot;hello, world&quot;\nend mouseUp</code></pre><p>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.</p>\n<p>A line of code beginning with -- is ignored. This is often used to write explanatory comments. It can also be used to temporarily &quot;disable&quot; some code. You can press Cmd+Q in the script editor to quickly comment-out or uncomment a line.</p>\n<pre><code>on mouseUp\n    -- this line is a comment\n    answer &quot;hello, world&quot;\nend mouseUp</code></pre><p>The indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.</p>\n<p>A long line of code can be continued with a backslash, e.g.</p>\n<pre><code>answer (&quot;here is how to continue&quot; &amp; \\\n    &quot;code across two lines&quot;)</code></pre><p>To have a comment spanning many lines, do this,</p>\n<pre><code>on mouseUp\n    --[[this line is a comment\n    and so is this\n    and also this]]\n    answer &quot;hello, world&quot;\nend mouseUp</code></pre><p>The language is not case sensitive. <code>on mouseup</code> and <code>on mouseUp</code> are equivalent.</p>\n<p>A common data type is a string (i.e. text).</p>\n<pre><code>put &quot;abc&quot; into x</code></pre><p>Double-quotes (&quot;), not single-quotes (&#39;), must be used. A string with length 0, &quot;&quot;, is perfectly valid and used often to represent a missing value. You may see this referred to as an &#39;empty string&#39;. You can easily test for an empty string with code like:</p>\n<pre><code>if x is &quot;&quot; then\n    answer &quot;empty string&quot;\nend if</code></pre><p>To include a double-quote character in a string, use the quote constant,</p>\n<pre><code>answer (quote &amp; &quot;a&quot; &amp; quote) -- displays &quot;a&quot;</code></pre><p>Valid numbers include <code>123</code>, <code>123.456</code>, and scientific notation like <code>1.23e6</code> which means <code>1.23</code> multiplied by (<code>10</code> to the <code>6</code>th power). Numbers can be in the range <code>[-1e18, 1e18]</code>, 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.</p>\n<p><code>sqrt(0.5)</code> is a function call meaning to take the square root of <code>0.5</code>. <code>sum(1, 2)</code> 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, <code>sum(1, sum(2, 3))</code>.</p>\n<p>You can call a function in two ways. <code>the mouseLoc</code> is the same as <code>mouseLoc()</code>. <code>the length of &quot;abc&quot;</code> is the same as <code>length(&quot;abc&quot;)</code>.</p>\n<p>Buttons and fields are referred to as &quot;objects&quot;. Cards are also a type of object. And, the entire project, referred to as a &quot;stack&quot;, is an object.</p>\n<p>A script can set properties of an object with syntax like:</p>\n<pre><code>set the width of cd btn &quot;myBtn&quot; to 450</code></pre><p>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:</p>\n<pre><code>set the width of cd btn id 1234 to 450</code></pre><p>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 <code>on mouseUp</code> defined, then the code inside <code>on mouseUp</code> will be run.</p>\n<p>The documentation here has a list of Commands, Event Handlers, and Properties that can be set.</p>\n<h2 id=\"expressions\">Expressions</h2>\n<p>You can use expressions like <code>put 1+2+3+4 into x</code> or <code>put sqrt(0.5) + sqrt(0.6) into y</code> in your code.</p>\n<p>Expressions can use parentheses to contain any level of nested sub-expressions, for example,</p>\n<pre><code>sqrt(0.5)\nsqrt(0.5 + sqrt(0.6))\nsqrt(0.5 + sqrt(0.6 + sqrt(0.7)))</code></pre><p>are all valid.</p>\n<p>Parentheses are used to dictate the order of operations, since</p>\n<pre><code>3*(4+5)</code></pre><p>gives a different answer than</p>\n<pre><code>(3*4)+5</code></pre><p>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 <code>(line (n + 1) of x)</code></p>\n<p>Do not type something like</p>\n<pre><code>answer (line n + 1 of x) -- this is hard to read.</code></pre><p>which is unclear,</p>\n<pre><code>answer (line (n + 1) of x) -- this is preferred.</code></pre><p>In the expression <code>2 + 3</code>, the symbol <code>+</code> is called an operator.</p>\n<p>ViperCard also has logical operators like <code>and</code>, <code>or</code>, and <code>not</code>.</p>\n<p>See the <code>operators</code> page in the Syntax documentation section</p>\n<p>for more information.</p>\n<h2 id=\"message-box\">Message Box</h2>\n<p>Open the Message Box by choosing &#39;Message Box&#39; from the Go menu, or by pressing Cmd+M.</p>\n<p>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 <code>put 12*34</code>, and press Enter. The result will be shown below.</p>\n<p>As another example, if you have two buttons, and you want to align the left sides of the buttons, you can type <code>set the left of cd btn 2 to the left of cd btn 1</code>, and press Enter, and the action will be performed.</p>\n<p>You can use the Up and Down arrow keys to see previously typed commands.</p>\n<p>You can use a semicolon to combine many lines, for example <code>put 2 into x; put x * 3</code></p>\n<p>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 <code>put 4 into myGlobal</code> without first needing to declare <code>global myGlobal</code>.</p>\n<p>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.</p>\n<pre><code>\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\n-- otherwise, the line is ignored\nput x into the msg box\n-- code will continue running\n</code></pre><p>The shortened form,</p>\n<pre><code>\nput 45 * 56 into x\n-- if the msg box is open, will show the value of x\nput x</code></pre><p>is also supported.</p>\n<h2 id=\"lists-arrays\">Lists/Arrays</h2>\n<p>Here&#39;s a common way to create a list:</p>\n<pre><code>put &quot;&quot; into myList\nrepeat with x = 1 to 5\n    put 0 into line x of myList\nend repeat</code></pre><p>Append a number to the list:</p>\n<pre><code>put newline &amp; 20 after myList</code></pre><p>Insert a number in the list (if the line doesn&#39;t yet exist, it will be added)</p>\n<pre><code>put 6 into line 8 of myList</code></pre><p>Add 10 to each element of the list:</p>\n<pre><code>repeat with x = 1 to the number of lines in myList\n    put (line x of myList) + 10 into line x of myList\nend repeat\n</code></pre><p><code>myList</code> is a normal variable, it can be passed as an argument and so on.</p>\n<p><strong>Two-dimensional lists</strong></p>\n<p>Here&#39;s a common way to create a 2-d list:</p>\n<pre><code>put &quot;&quot; into myList\nrepeat with x = 1 to 5\n    repeat with y = 1 to 5\n        put 0 into item x of line y of myList\n    end repeat\nend repeat</code></pre><p>Insert a new number into the list (it&#39;s ok if the line or item does not yet exist, it will be created):</p>\n<pre><code>put 3 into item 6 of line 8</code></pre><p>Add 10 to each element of the list:</p>\n<pre><code>repeat with y = 1 to the number of lines in myList\n    repeat with x = 1 to the number of items in line y of myList\n        if length(item x of line y of theLine) &gt; 0 theLine\n            add 10 to item x of line y of theLine\n        end if\n    end repeat\nend repeat\n</code></pre><h2 id=\"variables\">Variables</h2>\n<p>Use a statement like </p>\n<pre><code>put 3 into x</code></pre><p>to put the value &quot;3&quot; into a variable named &quot;x&quot;. You don&#39;t need to first declare x as a variable.</p>\n<p>Variable names and function names are case insensitive.</p>\n<p>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 &quot;line&quot; because this is a keyword. You cannot have a variable named &quot;result&quot; because this is a built-in function.</p>\n<p>If you try to read from a variable before it has been introduced, a runtime error will occur. <code>put notSeenBefore into x</code> will cause an error unless there is a statement assigning a value to <code>notSeenBefore</code>.</p>\n<p>Use &quot;global&quot; to declare a variable as a global.</p>\n<p>1) it can be accessed from any other script</p>\n<p>2) its contents are saved even after the function is complete.</p>\n<p>For example,</p>\n<pre><code>global coordX, coordY\nput 1 into coordX\nput 2 into coordY</code></pre><p>If another script says</p>\n<pre><code>global coordX, coordY\nanswer coordX, coordY</code></pre><p>it will read the values that were set.</p>\n<p>Global variables are, though, reset when you close the stack (the values</p>\n<p>are not saved as part of the project.)</p>\n<p><strong>Data types</strong></p>\n<p>A runtime error can be thrown if a value has the wrong</p>\n<p>type, e.g.</p>\n<pre><code>put &quot;abc&quot; + 4 into z</code></pre><p>causes a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string <code>&quot;abc&quot;</code>.</p>\n<p>If you need to convert from a text type to a number, you can use the functions <code>strToNumber</code> and <code>numberToStr</code>. For example,</p>\n<pre><code>ask &quot;please enter a number&quot;\nput it into x\nif strToNumber(x) is not false then\n    answer &quot;the number plus one is&quot; &amp;&amp; (strToNumber(x) + 1)\nend if\n</code></pre><p>For <code>if</code> and <code>else if</code>, only <code>true</code> or <code>false</code> are accepted, any other value is a runtime error. For example, to check that a string is not empty, you cannot say <code>if myVar then</code>, you have to say something like <code>if length(myVar) &gt; 0 then</code> instead.</p>\n<p>Note that equality checks account for different data types: </p>\n<pre><code>if (456 is &quot;456.00&quot;) then answer &quot;yes&quot; -- answers yes</code></pre><p>A &quot;point&quot; data type is two numbers separated by a comma. You can write:</p>\n<pre><code>\nput 1 into x\nput 2 into y\nset the topleft of cd btn &quot;myBtn&quot; to x, y\n</code></pre><p>This is the same as writing</p>\n<pre><code>\nset the topleft of cd btn &quot;myBtn&quot; to 1, 2\nset the topleft of cd btn &quot;myBtn&quot; to &quot;1, 2&quot;\n-- or\nset the top of cd btn &quot;myBtn&quot; to 1\nset the left of cd btn &quot;myBtn&quot; to 2\n</code></pre><h2 id=\"user-functions\">User Functions</h2>\n<p>An example of how to define and call a custom function:</p>\n<pre><code>function myAddition p1, p2\n    return p1 + p2\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp</code></pre><p>An example of how to define and call a custom handler:</p>\n<pre><code>on showMessage p1, p2\n    put p1 into cd fld &quot;results1&quot;\n    put p2 into cd fld &quot;results2&quot;\nend showMessage\non mouseUp\n    showMessage &quot;hello&quot;, &quot;world&quot;\nend mouseUp</code></pre><p>You can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.</p>\n<p>No error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string (&quot;&quot;).</p>\n<pre><code>myAddition(7, 8, 9) -- the extra argument 9 is ignored\nmyAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8\nmyAddition(7) -- p1 is assigned 7, p2 is assigned &quot;&quot;\nmyAddition() -- p1 is assigned &quot;&quot;, p2 is assigned &quot;&quot;</code></pre><p>You can use recursion.</p>\n<p>You can place common code in the current card&#39;s script, or the stack&#39;s script, so that it can be called by many objects. This is because of the message hierarchy:</p>\n<p>Messages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.</p>\n<ul>\n<li><p>If you click on a button:</p>\n<ul>\n<li>A mouseUp message is created</li>\n<li>Script of the button is examined. </li>\n<li>If there is an &#39;on mouseUp&#39; handler,<ul>\n<li>Run the code in the mouseUp handler.</li>\n<li>If the handler completes, stop running code, we&#39;re done.</li>\n<li>If the handler calls &#39;pass mouseUp&#39;, continue:</li>\n</ul>\n</li>\n<li>Script of the current card is examined.</li>\n<li>If there is an &#39;on mouseUp&#39; handler,<ul>\n<li>Run the code in the mouseUp handler.</li>\n<li>If the handler completes, stop running code, we&#39;re done.</li>\n<li>If the handler calls &#39;pass mouseUp&#39;, continue:</li>\n</ul>\n</li>\n<li>Script of the current stack is examined.</li>\n<li>If there is an &#39;on mouseUp&#39; handler,<ul>\n<li>Run the code in the mouseUp handler.</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><p>Similarly, if you are typing text in a field, and type the letter &#39;a&#39;:</p>\n<ul>\n<li>A afterKeyUp message is created</li>\n<li>Script of the current field is examined.</li>\n<li>If there is an &#39;on afterKeyUp&#39; handler,<ul>\n<li>Run the code in the afterKeyUp handler.</li>\n<li>If the handler completes, stop running code, we&#39;re done.</li>\n<li>If the handler calls &#39;pass afterKeyUp&#39;, continue:</li>\n</ul>\n</li>\n<li>Script of the current card is examined.</li>\n<li>If there is an &#39;on afterKeyUp&#39; handler,<ul>\n<li>Run the code in the afterKeyUp handler.</li>\n<li>If the handler completes, stop running code, we&#39;re done.</li>\n<li>If the handler calls &#39;pass afterKeyUp&#39;, continue:</li>\n</ul>\n</li>\n<li>Script of the current stack is examined.</li>\n<li>If there is an &#39;on afterKeyUp&#39; handler,<ul>\n<li>Run the code in the mouseUp handler.</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<p>Calling <code>exit to ViperCard</code> 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.</p>\n<p>See documentation of the &#39;pass&#39; command for more information.</p>\n<p>Calls to custom commands and procedures also bubble upwards in the same way. A function in the stack&#39;s script can be called from any handler on a card, field, or button. A function in the card&#39;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.</p>\n<h2 id=\"text-and-chunks\">Text and Chunks</h2>\n<p><strong>Lines</strong></p>\n<p>Use <code>newline</code> to refer to a new line character.</p>\n<p>Let&#39;s say you wanted two lines of text in a field, you would use</p>\n<p>the following:</p>\n<pre><code>put &quot;first line&quot; &amp; newline &amp; &quot;second line&quot; into cd fld &quot;myFld&quot;</code></pre><p>(You shouldn&#39;t have to be concerned with platform differences: the constants &#39;return&#39;, &#39;cr&#39;, &#39;linefeed&#39; 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&#39;ll automatically convert to \\r\\n newlines so it will work seemlessly with other software. Internally, ASCII 10 represents newline.)</p>\n<p><strong>Chunks</strong></p>\n<p>ViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:</p>\n<pre><code>\nput &quot;ab&quot; &amp; tab &amp; &quot;cd&quot; &amp; tab &amp; &quot;ef&quot; into myList\nset the itemDelimiter to tab\nput 2 into n\nanswer &quot;Result:&quot; &amp; item n of myList\n</code></pre><p>If you have a comma-separated list you can get the nth item like this:</p>\n<pre><code>\nput &quot;ab,cd,ef&quot; into myList\nset the itemDelimiter to &quot;,&quot;\nput 2 into n\nanswer &quot;Result:&quot; &amp; item n of myList\n</code></pre><p>More advanced examples:</p>\n<pre><code>\nanswer char 2 of &quot;abcd&quot;\nanswer char (n + 1) of &quot;abcd&quot;\nanswer char 2 to 4 of &quot;abcd&quot;\n\nanswer item 2 of &quot;ab,cd,ef,gh&quot;\nanswer item (n + 1) of &quot;ab,cd,ef,gh&quot;\nanswer item 2 to 4 of &quot;ab,cd,ef,gh&quot;\n\nanswer first item of &quot;ab,cd,ef,gh&quot;\nanswer last item of &quot;ab,cd,ef,gh&quot;\nanswer any item of &quot;ab,cd,ef,gh&quot;\n\nput &quot;ab&quot; &amp; newline &amp; &quot;cd&quot; &amp; newline &amp; &quot;ef&quot; into myList\nanswer line 2 of myList\nanswer line (n + 1) of myList\nanswer line 2 to 3 of myList\n</code></pre><p>Recursive scopes:</p>\n<pre><code>\nput &quot;ab,cd&quot; &amp; newline &amp; &quot;ef,gh&quot; &amp; newline &amp; &quot;ij,kl&quot; into myList\n\nanswer item 2 of line 2 of myList\nanswer char 2 of line 2 of myList\nanswer char 2 of item 2 of line 2 of myList\n\nanswer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n</code></pre><p><strong>Modifying by chunk</strong></p>\n<pre><code>\nput &quot;abcd&quot; into x\nput &quot;A&quot; into char 2 of x\nput &quot;A&quot; into char 2 to 4 of x\n\nput &quot;10,20,30&quot; into myList\nput &quot;A&quot; into item 2 of myList\nput &quot;A&quot; into item 2 to 3 of myList\nmultiply item 2 of myList by 5\nadd 1 to item 2 of myList\n\nput &quot;A&quot; into first item of myList\nput &quot;A&quot; into last item of myList\nput &quot;A&quot; into any item of myList\n\nput &quot;A&quot; into before item 2 of myList\nput &quot;A&quot; into after item 2 of myList\nput &quot;A&quot; into before char 2 of item 2 of myList\n\nput &quot;A&quot; into before item 2 of cd fld &quot;myFld&quot;\nput &quot;A&quot; into after item 2 of cd fld &quot;myFld&quot;\nput &quot;A&quot; into before char 2 of item 2 of cd fld &quot;myFld&quot;\n\nput &quot;ab,cd&quot; &amp; newline &amp; &quot;ef,gh&quot; &amp; newline &amp; &quot;ij,kl&quot; into myList\nput &quot;A&quot; into item 2 of line 2 of myList\nput &quot;A&quot; into char 2 of line 2 of myList\nput &quot;A&quot; into char 2 of item 2 of line 2 of myList\n\nput &quot;A&quot; into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\n</code></pre><p><strong>Backwards compatiblity</strong></p>\n<p>We went to much effort to maintain fidelity with HyperCard&#39;s chunk processing. All of the above can be done with words:</p>\n<pre><code>\nput &quot;ab cd ef&quot; into x\nanswer word 2 of x\nanswer word 2 to 3 of x\nput &quot;A&quot; into word 2 of x\nput &quot;A&quot; into word 2 to 3 of x\nput &quot;A&quot; into char 2 to 3 of word 2 to 3 of x\n</code></pre><p>To enable full compatibility with HyperCard, go to <code>Object-&gt;Stack info...</code> and turn on compatibility mode. Chunk handling will now be identical (including the non-intuitive behavior seen below).</p>\n<pre><code>\n-- if compatibility mode is on:\n-- we follow HyperCard&#39;s non-intuitive behavior for the following:\nput &quot;ab,cd&quot; &amp; newline &amp; &quot;ef,gh&quot; &amp; newline &amp; &quot;ij,kl&quot; into myList\nput &quot;A&quot; into item 3 of item 4 of myList\nput &quot;A&quot; into item 3 of char 2 of myList\ndelete item 3 of item 4 of myList\ndelete item 3 of char 2 of myList\nadd 1 to item 3 of item 4 of myList\nadd 1 to item 3 of char 2 of myList\nanswer item 0 of myList\nput &quot;A&quot; into item 0 of myList\nanswer item 4 to 1 of myList\nput &quot;A&quot; into item 4 to 1 of myList\n\n\n-- The only known cases we don&#39;t support (we&#39;ll throw a runtime error):\nanswer item -1 of myList\nput &quot;A&quot; into item -1 of myList\ndelete item -1 of myList\nanswer char 2 of item 4 to 1 of myList\nput &quot;A&quot; into char 2 of item 4 to 1 of myList\ndelete char 2 of item 4 to 1 of myList\ndelete item 2 to 3 of myList\n</code></pre><p>See also documentation for the <code>delete</code> command.</p>\n<h2 id=\"objects\">Objects</h2>\n<p>Ways to refer to a button or field:</p>\n<pre><code>\ncd btn id 1234\ncd btn &quot;myBtn&quot;\ncd btn 2\nfirst cd btn\nany cd btn\nlast cd btn\n</code></pre><p>Ways to refer to a card:</p>\n<pre><code>\nthis card\nprev card\nnext card\nfirst card\nsecond card\nlast card\ncard 1\ncard id 1234\ncard &quot;name&quot;\n</code></pre><p>Ways to refer to a background:</p>\n<pre><code>\nthis background\nprev background\nnext background\nfirst background\nsecond background\nlast background\nbg 1\nbg id 1234\nbg &quot;name&quot;\n</code></pre><p>Ways to refer to a stack:</p>\n<pre><code>\nthis stack\nstack 1\nstack &quot;name&quot;\n</code></pre><p>Other ways to refer to objects:</p>\n<pre><code>\nanswer the name of the target\nanswer the name of me\nanswer the name of the owner of cd btn id 1234\nput &quot;cd btn id 1234&quot; into x\nanswer the name of x\n\nfunction whichObject\n    return &quot;cd btn id 1234&quot;\nend whichObject\nanswer the name of whichObject()\n</code></pre><h2 id=\"structure\">Structure</h2>\n<p><strong>Loops</strong></p>\n<pre><code>repeat with x = 1 to 3\n    ...other code here...\nend repeat</code></pre><p>Refer to <code>repeat</code> under &quot;syntax&quot; for more information.</p>\n<p><strong>If statements</strong></p>\n<pre><code>if x &gt; 1 then\n    ...other code here...\nelse\n    ...other code here...\nend if</code></pre><p>Refer to <code>if</code> under &quot;syntax&quot; for more information.</p>\n<p><strong>Scripts</strong></p>\n<p>No code can exist outside of a handler or function.</p>\n<p><strong>Handlers</strong></p>\n<p>Handlers look like this</p>\n<pre><code>on mouseup \n    answer &quot;hello world&quot;\nend mouseup</code></pre><p>and respond to an event message.</p>\n<p><strong>Functions</strong></p>\n<p>Functions look like this</p>\n<pre><code>function myAddition p1, p2\n    return p1 + p2\nend myAddition</code></pre><p>They can then be called with code like</p>\n<pre><code>put myAddition(1,2) into x</code></pre><p>Functions inside of functions are not supported.</p>\n<p><strong>Statements</strong></p>\n<p>You cannot have a line that is just</p>\n<p><code>sqrt(0.5)</code></p>\n<p>with no command, this is a syntax error.</p>\n<p>Statements occur on separate lines, there&#39;s no way to have more than one statement on a line.</p>\n<p><strong>Expressions</strong></p>\n<p>A set of computations such as <code>1+2+3+4</code> or <code>sqrt(0.5) + sqrt(0.6)</code> is an expression. Most places that take a value can be given an expression, for example,</p>\n<pre><code>go card 2\n-- is the same as\nput 1 into x\ngo card (x + 1)\n\nput &quot;abc&quot; into cd fld &quot;myFld1&quot;\nput &quot;abc&quot; into cd fld (prefix &amp; &quot;1&quot;)\n\nput &quot;a&quot; into line 4 of myList\nput &quot;a&quot; into line (x+1) of myList\n\nset the left of cd btn &quot;myBtn&quot; to x\nset the left of cd btn &quot;myBtn&quot; to (45 + 50 * cos(theta))\n</code></pre><h2 id=\"examples\">Examples</h2>\n<p>The tutorial videos show helpful example code.</p>\n<p>Example 1:</p>\n<pre><code>\n-- after creating a field called &quot;myFld&quot;:\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click button &quot;Go&quot;, you get 10 points!\n    put cd fld &quot;myFld&quot; into score\n    put (score + 10) into score\n    put score into cd fld &quot;myFld&quot;\nend mouseUp\n\n</code></pre><p>Example 2:</p>\n<pre><code>\n-- after creating a btn called &quot;fish&quot;:\n-- create a btn and put this in its script:\non mouseUp\n    -- when you click this, the fish moves\n    put the top of cd btn &quot;fish&quot; into y\n    subtract 10 from y\n    set the top of cd btn &quot;fish&quot; to y\nend mouseUp\n\n</code></pre><p>Example 3:</p>\n<pre><code>\n-- create interactive art.\n-- put this in the card script,\n-- then when you choose the browse tool and \n-- click on the card, it will draw lines.\n\non mouseUp\n    put the clickH into X\n    put the clickV into y\n\n    -- choose the line tool to draw lines\n    choose &quot;line&quot; tool\n\n    -- make a loop that will repeat 10 times\n    repeat 10 times\n        put random(80) into randx\n        put random(80) into randy\n        -- will get random # between 1 and 80\n        drag from x, y to (x + randx), (y + randy)\n    end repeat\nend mouseUp\n\n</code></pre><h2 id=\"tips-shortcuts\">Tips &amp; Shortcuts</h2>\n<p>General tips</p>\n<ul>\n<li>If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script</li>\n<li>See more error details, when in the Script Editor, by clicking on the error excerpt</li>\n<li>Double-click the eraser tool to clear paint on the current card</li>\n</ul>\n<p>Keyboard shortcuts when editing text,</p>\n<ul>\n<li>Cmd+C to copy</li>\n<li>Cmd+X to cut</li>\n<li>Cmd+V to paste</li>\n<li>Cmd+A to select all</li>\n<li>Cmd+Backspace to delete entire word</li>\n<li>PageUp / PageDown to scroll one page</li>\n<li>Shift+PageUp / Shift+PageDown to select one page</li>\n<li>Home to move to start of line</li>\n<li>Shift+Home to select to start of line</li>\n<li>Cmd+Home to move to the start</li>\n<li>Cmd+Shift+Home to select to the start</li>\n<li>Left Arrow to move to the left</li>\n<li>Shift+Left Arrow to select to the left</li>\n<li>Cmd+Left Arrow to move left one word</li>\n<li>Cmd+Shift+Left Arrow to select left one word</li>\n<li>Cmd+Arrow Up to scroll up</li>\n<li>Cmd+Arrow Down to scroll down</li>\n<li>Cmd+D to duplicate the current line</li>\n<li>Cmd+L to delete the current line</li>\n<li>Cmd+Q to quickly comment-out or uncomment the current line</li>\n<li>Cmd+Q when many lines are selected to comment-out all of them</li>\n<li>Cmd+Q to comment-out a block of code</li>\n<li>Tab key, to auto-indent code in a script</li>\n</ul>\n<p>Some of the main differences between ViperCard and HyperCard:</p>\n<ul>\n<li>ViperCard is open source software that can run in any modern web browser</li>\n<li>you can export stacks as a modern json format</li>\n<li>art-stamps feature for adding clip art</li>\n<li>new animation features like save-to-gif</li>\n<li>in ViperCard you have to hit Save to save changes</li>\n<li>but in ViperCard you have extensive undo history and can even undo changes made by a script</li>\n</ul>\n<p>A few of the differences between ViperCard and HyperCard:</p>\n<ul>\n<li>You can use <code>--[[block comments]]</code> that span many lines.</li>\n<li>You can write <code>exit to ViperCard</code> instead of <code>exit to HyperCard</code></li>\n<li>You must specify <code>cd</code> or <code>bg</code> when referring to a button or field, unless compatibility mode is enabled (Object-&gt;Stack Info)</li>\n<li>Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.</li>\n<li>Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool</li>\n<li>You cannot read a variable that has not been set. <code>put unsetVar into x</code> causes a runtime error.</li>\n<li>hilite and checkmark are separate properties</li>\n<li>label and name are separate properties</li>\n<li>You can&#39;t have a variable named id, short, long, first, and so on.</li>\n<li>The <code>choose</code> command sets the emulated current tool, not the actual tool, and is limited to certain paint operations</li>\n<li>The newline character is \\n and not \\r</li>\n</ul>\n<h2 id=\"what-s-new\">What&#39;s New</h2>\n<p>New in 0.24</p>\n<ul>\n<li>Script stack trace</li>\n<li>Use <code>get the shiftKey</code>, deprecate <code>get the shiftKey()</code></li>\n<li>You can say <code>the sin of 4</code></li>\n<li>You can say <code>sin of 4</code>, <code>sin of cd fld 1</code></li>\n<li>Continue lines with logical-not, press <code>Alt-Enter</code> in code editor</li>\n<li>Block comments <code>--[[a comment]]</code></li>\n<li>You can use <code>select</code>, <code>mark</code>, <code>doMenu</code> commands</li>\n<li>You can turn on compat mode to allow <code>put &quot;a&quot; into fld 1</code></li>\n<li>Everything is case insensitive, even <code>cd btn &quot;aBcDe&quot;</code></li>\n<li>Improvements to <code>send</code> and <code>do</code>, script error shown in more helpful line</li>\n<li>Improvements to built in functions like <code>selectedText</code></li>\n<li>Improvements to click features like <code>wait until the mouseClick</code></li>\n<li>You can say <code>put &quot;card id 2590&quot; into xx; put the name of xx into y</code></li>\n<li>You can use values for coords, e.g. <code>put &quot;3,4&quot; into c; set the loc of cd btn 1 to c</code></li>\n<li>Better match subtle differences between <code>target</code> and <code>the target</code></li>\n<li>Single-line <code>if</code> statements, fewer parentheses needed</li>\n<li>Call custom functions from anywhere</li>\n<li>Better cursors, better rendering on different screen resolutions</li>\n<li>More fonts, all fonts have pixel-perfect spacing</li>\n<li>You can use recursive chunks like <code>put &quot;a&quot; into char 7 of line 3 of x</code></li>\n<li>Improvements to load time by loading some libraries asynchronously</li>\n<li>Common commands in script execution are faster</li>\n<li>Scripts can dynamically create/delete objects, and set scripts</li>\n<li>New features like <code>set the textstyle of line 3 of cd fld &quot;myFld&quot; to &quot;toggle-bold&quot;</code></li>\n</ul>\n<h2 id=\"credits\">Credits</h2>\n<p>ViperCard</p>\n<p><a href=\"https://github.com/moltenform/vipercard\">https://github.com/moltenform/vipercard</a></p>\n<p>Copyright (C) 2020 Ben Fisher</p>\n<p>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. </p>\n<p>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.</p>\n<p>ViperCard uses the following libraries:</p>\n<ul>\n<li>Chevrotain<ul>\n<li><a href=\"https://github.com/SAP/chevrotain\">https://github.com/SAP/chevrotain</a></li>\n<li>Apache License 2.0</li>\n</ul>\n</li>\n<li>FileSaver.js<ul>\n<li><a href=\"https://github.com/eligrey/FileSaver.js\">https://github.com/eligrey/FileSaver.js</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>Golly<ul>\n<li><a href=\"https://github.com/dannygarcia/golly\">https://github.com/dannygarcia/golly</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>js-lru<ul>\n<li><a href=\"https://github.com/rsms/js-lru\">https://github.com/rsms/js-lru</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>Clipboard.js<ul>\n<li><a href=\"https://github.com/zenorocha/clipboard.js\">https://github.com/zenorocha/clipboard.js</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>base64js<ul>\n<li><a href=\"https://github.com/beatgammit/base64-js\">https://github.com/beatgammit/base64-js</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>JSGIF<ul>\n<li><a href=\"https://github.com/antimatter15/jsgif\">https://github.com/antimatter15/jsgif</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>Bresenham easy.filter<ul>\n<li><a href=\"http://members.chello.at/easyfilter/bresenham.html\">http://members.chello.at/easyfilter/bresenham.html</a></li>\n<li>written permission of author</li>\n</ul>\n</li>\n<li>lz-string<ul>\n<li><a href=\"https://github.com/pieroxy/lz-string\">https://github.com/pieroxy/lz-string</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>Pizzicato<ul>\n<li><a href=\"https://github.com/alemangui/pizzicato\">https://github.com/alemangui/pizzicato</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>Bowser<ul>\n<li><a href=\"https://github.com/lancedikson/bowser\">https://github.com/lancedikson/bowser</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>types-text-encoding <ul>\n<li><a href=\"https://www.npmjs.com/package/@types/text-encoding\">https://www.npmjs.com/package/@types/text-encoding</a></li>\n<li>MIT License</li>\n</ul>\n</li>\n<li>deep-freeze<ul>\n<li><a href=\"https://github.com/substack/deep-freeze\">https://github.com/substack/deep-freeze</a></li>\n<li>Public domain</li>\n</ul>\n</li>\n<li>pbkdf2 gist by Chris Veness</li>\n<li>description of Mac OS Roman character set<ul>\n<li><a href=\"https://en.wikipedia.org/wiki/Mac_OS_Roman\">https://en.wikipedia.org/wiki/Mac_OS_Roman</a></li>\n<li><a href=\"http://creativecommons.org/licenses/by-sa/3.0/\">http://creativecommons.org/licenses/by-sa/3.0/</a></li>\n<li>Creative Commons Attribution-ShareAlike</li>\n</ul>\n</li>\n<li>and a small excerpt from the SciTE code editor,</li>\n<li>ported from C++ to TypeScript by Ben Fisher</li>\n<li>SciTE<ul>\n<li><a href=\"https://www.scintilla.org/License.txt\">https://www.scintilla.org/License.txt</a></li>\n</ul>\n</li>\n</ul>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_02_commands.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - commands\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - commands\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - commands</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | Commands | <a href=\"./reference_03_syntax.html\">Syntax</a> | <a href=\"./reference_04_properties.html\">Properties</a> | <a href=\"./reference_05_functions.html\">Functions</a> | <a href=\"./reference_06_events.html\">Event Handlers</a> | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"add\">add</h2>\n<p>Adds the value of number to the number in a container.</p>\n<p>Examples:</p>\n<pre><code>\n\nput 2 into x\nadd 3 to x\nanswer x -- will display &quot;5&quot;\n\nput &quot;1,2,3&quot; into x\nadd 3 to item 2 of x\nanswer x -- will display &quot;1,5,3&quot;\n\nadd 5 to cd fld &quot;myFld&quot;\n\n</code></pre><h2 id=\"answer\">answer</h2>\n<p>Displays a dialog box.</p>\n<p>The button that is pressed (1, 2, or 3) will be assigned to the variable &quot;it&quot;.</p>\n<p>Examples:</p>\n<pre><code>\n\nanswer &quot;abc&quot; -- will display &quot;abc&quot;\n\nanswer &quot;are you sure?&quot; with &quot;OK&quot; or &quot;cancel&quot; \nput it into whichChosen\nif whichChosen is 1 then\nanswer &quot;clicked OK&quot;\nelse if whichChosen is 2 then\nanswer &quot;clicked cancel&quot;\nend if\n\nanswer &quot;many choices&quot; with &quot;btn1&quot; or &quot;btn2&quot;  or &quot;btn3&quot; \nanswer whichChosen\n\n\n</code></pre><h2 id=\"ask\">ask</h2>\n<p>Displays a dialog box allowing the user to type in a response.</p>\n<p>The text typed will be assigned to the variable <code>it</code>. If the user clicks <code>Cancel</code>, the result will be <code>&quot;&quot;</code>.</p>\n<p>You can say <code>ask &quot;prompt&quot;</code> or <code>ask &quot;prompt&quot; with &quot;default text&quot;</code>.</p>\n<p>Examples:</p>\n<pre><code>\n\nask &quot;what is your name?&quot; with &quot;ben&quot;\nput it into yourName\nif yourName is &quot;&quot; then\n    answer &quot;you did not type a name&quot;\nelse\n    answer &quot;you typed&quot; &amp;&amp; yourName\nend if\n\n</code></pre><h2 id=\"beep\">beep</h2>\n<p>Play the system beep sound.</p>\n<h2 id=\"choose-tool\">choose tool</h2>\n<p>You can use the choose command to programmatically draw shapes and lines.</p>\n<p>When a script completes, you&#39;ll be taken back to the Browse tool regardless of which tool was chosen within a script.</p>\n<p>The form <code>choose &quot;brush&quot; tool</code> and <code>choose tool 3</code> is also supported.</p>\n<p>Examples:</p>\n<pre><code>\n\nchoose pencil tool\nclick at 10,20\n-- this draws a black pixel at the coordinates x=10, y=20\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\n-- tools include:\nbrush\nbucket\npencil\nline\nrect\noval\nroundrect\ncurve\nspray\nbrowse\n\n</code></pre><h2 id=\"click\">click</h2>\n<p>Use the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.</p>\n<p>Examples:</p>\n<pre><code>\n\nchoose pencil tool\nclick at 10,20\n-- this draws a pixel at the coordinates x=10, y=20\n\n\n</code></pre><h2 id=\"create\">create</h2>\n<p>Use <code>domenu &quot;new button&quot;</code> or <code>domenu &quot;new field&quot;</code> to create a button.</p>\n<p>Examples:</p>\n<pre><code>\n\ndoMenu &quot;New Button&quot;\nput the result into newBtn\nset the name of cd btn id newBtn to &quot;my new button&quot;\nset the loc of cd btn id newBtn to 30, 30\n\n</code></pre><h2 id=\"do\">do</h2>\n<p>Take a string, and execute it as if it were a ViperCard script.</p>\n<p>Similar to eval() in other languages.</p>\n<p>Examples:</p>\n<pre><code>\n\nput &quot;answer &quot; into buildScript\nput quote &amp; &quot;abc&quot; &amp; quote after buildScript\ndo buildScript\n\n</code></pre><h2 id=\"domenu\">doMenu</h2>\n<p>Do a menu action.</p>\n<p>Supported actions include:</p>\n<pre><code>\ndoMenu &quot;new card&quot;\ndoMenu &quot;delete card&quot;\ndoMenu &quot;first&quot;\ndoMenu &quot;prev&quot;\ndoMenu &quot;next&quot;\ndoMenu &quot;last&quot;\ndoMenu &quot;new button&quot;\ndoMenu &quot;new field&quot;\ndoMenu &quot;duplicate card paint&quot;\n\n-- all items from the Draw menu like\ndoMenu &quot;black fill&quot;\n-- all items from the Font menu like\ndoMenu &quot;helvetica&quot;\n-- all items from the Style menu like\ndoMenu &quot;14&quot;\n\n</code></pre><h2 id=\"dial\">dial</h2>\n<p>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.</p>\n<p>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.</p>\n<p>The first time the <code>dial</code> command is run, the sounds might not be played because they might not have been loaded yet. Use <code>dial &quot;&quot;</code> when your program starts to ensure that the sounds are loaded.</p>\n<p>Examples:</p>\n<pre><code>\n\ndial &quot;&quot; -- begin loading the dial tone sounds\nwait 4 seconds\ndial &quot;555-1234&quot;\n\n</code></pre><h2 id=\"disable\">disable</h2>\n<p>Disables a button (sets the &quot;enabled&quot; property to true, so that the button no longer responds to clicks).</p>\n<h2 id=\"divide\">divide</h2>\n<p>Divides the number in a container by a number.</p>\n<p>Examples:</p>\n<pre><code>\n\nput 12 into x\ndivide x by 3\nanswer x -- will display &quot;4&quot;\n\nput &quot;1,12,3&quot; into x\ndivide item 2 of x by 3\nanswer x -- will display &quot;1,4,3&quot;\n\n\n</code></pre><h2 id=\"delete-object-or-text-\">delete (object or text)</h2>\n<p><strong>Deleting objects</strong></p>\n<pre><code>-- delete objects\ndelete cd btn &quot;myBtn&quot;\ndelete card 14</code></pre><p><strong>Deleting text</strong></p>\n<pre><code>put &quot;abcde&quot; into x\ndelete char 2 of x\nanswer x -- shows &quot;acde&quot;</code></pre><pre><code>put &quot;abcde&quot; into x\ndelete char 2 to 4 of x\nanswer x -- shows &quot;ae&quot;</code></pre><pre><code>put &quot;abcde&quot; into cd fld 1\ndelete char 2 to 4 of cd fld 1</code></pre><p>Deleting words, lines and items is also supported for compatibility with HyperCard but is not recommended in new code, as HyperCard&#39;s behavior can be inconsistent and non-intuitive.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- we support complex expressions\ndelete char 2 to 4 of item 3 of line 5 of myVar\ndelete item 3 of line 3 to 5 of myVar\ndelete first item of myVar\ndelete second item of myVar\ndelete last item of myVar\ndelete item 3 of myVar\ndelete line 3 of myVar\ndelete word 3 of myVar\n\n-- we do not support backwards ranges\ndelete item 3 to 2 of myVar\n\n-- we do not support out-of-order scopes\n-- (unless you go Object-&gt;Stack Info and turn on compatibility mode)\ndelete line 3 of item 3 of myVar -- error\ndelete item 3 of word 3 of myVar -- error\ndelete word 3 of char 3 of myVar -- error\ndelete word 3 of word 4 of myVar -- error\n\n-- we do not support deleting a range (unless chars)\ndelete word 3 to 5 of myVar -- not yet supported\n\n\n\n</code></pre><h2 id=\"drag\">drag</h2>\n<p>Use the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.</p>\n<p>Examples:</p>\n<pre><code>\n\nchoose line tool\ndrag from 10,20 to 30,40\n-- this draws a line starting at the coordinates (10,20) \n-- ending at (30,40)\n\nchoose curve tool\ndrag from 10,20 to 30,40 to 50,60\n\n\n</code></pre><h2 id=\"enable\">enable</h2>\n<p>Enables a button (sets the &quot;enabled&quot; property to false, so that the button is no longer disabled).</p>\n<h2 id=\"go-to-card\">go to card</h2>\n<p>Go to a different card.</p>\n<p>Examples:</p>\n<pre><code>\n\ngo to card 1 -- goes to first card\ngo first -- goes to first card\ngo last -- goes to last card\ngo next -- goes to the next card\ngo prev -- goes to the previous card\n\nThe following are supported:\nlast\nmiddle\nany\nfirst\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neigth\nninth\ntenth\nnext\nprevious\nthis\nmid\nprev\n\n(&#39;go back&#39; and &#39;go forth&#39; are supported for compatibility with old scripts.)\n\n\n</code></pre><h2 id=\"hide\">hide</h2>\n<p>Hides a button or field.</p>\n<p>(sets the &quot;visible&quot; to false)</p>\n<h2 id=\"multiply\">multiply</h2>\n<p>Multiplies the number in a container by a number.</p>\n<p>Examples:</p>\n<pre><code>\n\nput 12 into x\nmultiply x by 3\nanswer x -- will display &quot;36&quot;\n\nput &quot;1,12,3&quot; into x\nmultiply item 2 of x by 3\nanswer x -- will display &quot;1,36,3&quot;\n\nmultiply cd fld 1 by 5\n\n</code></pre><h2 id=\"lock-screen\">lock screen</h2>\n<p>This feature will arrive in a future version...</p>\n<h2 id=\"play\">play</h2>\n<p>Play a sound effect.</p>\n<p>For example, to play a chime sound,</p>\n<pre><code>play &quot;glider_1_Extra&quot; load\nwait 4 seconds\nplay &quot;glider_1_Extra&quot;</code></pre><p>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.</p>\n<p>You can&#39;t say <code>play (&quot;glider&quot; &amp; x)</code>, instead do the equivalent <code>put &quot;glider&quot; &amp; x into tmp; play tmp</code></p>\n<p>ViperCard can play the following sounds:</p>\n<pre><code>glider_1_Aww\nglider_1_Bass\nglider_1_BeamIn\nglider_1_BlowerOn\nglider_1_Bounce\nglider_1_Clock\nglider_1_Crunch\nglider_1_Drip\nglider_1_Energize\nglider_1_Extra\nglider_1_FireBand\nglider_1_GetBand\nglider_1_GoodMove\nglider_1_GreaseFall\nglider_1_Guitar\nglider_1_Hey!\nglider_1_Lightning\nglider_1_LightsOn\nglider_1_Pop\nglider_1_Push\nglider_1_Shredder\nglider_1_Tick\nglider_1_ToastDrop\nglider_1_ToastJump\nglider_1_Yow!\nglider_1_Zap</code></pre><h2 id=\"put\">put</h2>\n<p>Put an expression into a variable or field.</p>\n<p>Examples:</p>\n<pre><code>\n\nput 2+3 into x\nanswer x -- shows 5\n\nput &quot;hello&quot; into cd fld &quot;message&quot;\n\nput &quot;aa,bb,cc&quot; into x\nput &quot;11&quot; into item 2 of x\nanswer x -- shows &quot;aa,11,cc&quot;\n\nput &quot;abc&quot; into x\nput &quot;q&quot; into char 2 of x\nanswer x -- shows &quot;aqc&quot;\n\nput &quot;appended text&quot; after x\nput &quot;prepended text&quot; before x\n\n-- if the message box is open, you can display the contents of a variable into the message box,\n-- this is similar to &quot;print&quot; or &quot;writeline&quot; in other languages.\nput 2+3 into x\nput x into the msg box\n\n\n</code></pre><h2 id=\"replace\">replace</h2>\n<p>Replace all occurrences of a string.</p>\n<p>Examples:</p>\n<pre><code>\nput &quot;a-b-c&quot; into x\nreplace &quot;-&quot; with &quot;_&quot; in x\nanswer x -- shows a_b_c\n\n\n-- you can also use replace in a field.\nput &quot;-&quot; into search\nput &quot;_&quot; into replacement\nreplace search with replacement in cd fld &quot;myFld&quot;\n\n</code></pre><h2 id=\"select\">select</h2>\n<p>Set the selection in a field. For this to take effect, the field must be on the current card.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- set the selection\nselect char 2 to 4 of cd fld &quot;myFld&quot;\nselect line 3 of cd fld &quot;myFld&quot;\nselect item 2 to 3 of cd fld &quot;myFld&quot;\n\n-- set the caret position\nselect before char 3 of cd fld &quot;myFld&quot;\nselect before line 3 of cd fld &quot;myFld&quot;\nselect after char 3 of cd fld &quot;myFld&quot;\nselect before text of cd fld &quot;myFld&quot;\nselect after text of cd fld &quot;myFld&quot;\n\n-- select all\nselect text of cd fld &quot;myFld&quot;\n\n-- clear selection\nselect empty\n\n-- look up field by string\nselect char 1 of the selectedField\n\n</code></pre><h2 id=\"send\">send</h2>\n<p>Take a string, and execute it as if it were a ViperCard script in the context of an object.</p>\n<p>Messages in ViperCard automatically travel upwards from button to card, background, and then stack.</p>\n<p>But by using the &#39;send&#39; 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.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- sending a message to a different card\nsend &quot;prepareNextCard&quot; to card &quot;otherCard&quot;\n\n-- simulate a button click\nsend &quot;mouseUp&quot; to cd btn &quot;myButton&quot;\n\n-- if you have hundreds of lines of code in one script, this\n-- can feel disorganized. with &quot;send&quot; you can store code\n-- in other objects, for example, moving\n-- mathematical computation to a different card or button.\n-- in the script of cd btn &quot;mathUtils&quot; of card &quot;otherCard&quot;, write\non myCompute a, b\nreturn a * a + b\nend myCompute\n\n-- from another script\nsend &quot;myCompute 3, 4&quot; to cd btn &quot;mathUtils&quot; of card &quot;otherCard&quot;\nput the result into x\n\n</code></pre><h2 id=\"set\">set</h2>\n<p>Use the set command to change a property.</p>\n<p>A few examples:</p>\n<pre><code>set the width of cd btn &quot;myButton&quot; to 100\nset the topLeft of cd btn &quot;myButton&quot; to 24, 25\nput the long name of btn &quot;myButton&quot; into x\nset the textsize of char 2 to 4 of cd fld &quot;myFld&quot; to 18 \nset the itemdelimiter to &quot;|&quot;</code></pre><p>See the &quot;Properties&quot; section of documentation for more.</p>\n<h2 id=\"show\">show</h2>\n<p>Shows a button or field.</p>\n<p>(sets the &quot;visible&quot; to true)</p>\n<h2 id=\"sort\">sort</h2>\n<p>New: &#39;sort by each&#39; expressions.</p>\n<p>Sort styles:</p>\n<ul>\n<li>text sorting (default), compares text, not case sensitive.</li>\n<li>numeric sorting, interpret as numbers, e.g. 10 sorts after 2.</li>\n<li>ascending (default)</li>\n<li>descending</li>\n</ul>\n<p>Sort granularity:</p>\n<ul>\n<li>sort items of x</li>\n<li>sort lines of x</li>\n<li>sort chars of x</li>\n</ul>\n<p>Examples:</p>\n<pre><code>\n\nput &quot;aa,cc,bb&quot; into x\nsort items of x\nanswer x -- displays &quot;aa,bb,cc&quot;\n\nput &quot;aa|cc|bb&quot; into x\nset the itemDelimiter to &quot;|&quot;\nsort items of x\nanswer x -- displays &quot;aa|b|cc&quot;\n\nput &quot;ac,bb,ca&quot; into x\nsort items of x by char 2 of each\nanswer x -- displays &quot;ca,bb,ac&quot;\n\n-- numeric is needed!\nput &quot;12,24,1,5&quot; into x\nsort items of x numeric\nanswer x -- displays &quot;1,5,12,24&quot;\n\nput &quot;12,24,1,5&quot; into x\nsort descending items of x numeric\nanswer x -- displays &quot;24,12,5,1&quot;\n\n\n</code></pre><h2 id=\"subtract\">subtract</h2>\n<p>Subtracts a number from the number in a container.</p>\n<p>Examples:</p>\n<pre><code>\n\nput 12 into x\nsubtract 3 from x\nanswer x -- will display &quot;9&quot;\n\nput &quot;1,12,3&quot; into x\nsubtract 3 from item 2 of x\nanswer x -- will display &quot;1,9,3&quot;\n\nsubtract 1 from cd fld &quot;myFld&quot;\n\n</code></pre><h2 id=\"unlock-screen\">unlock screen</h2>\n<p>This feature will arrive in a future version...</p>\n<h2 id=\"wait\">wait</h2>\n<p>Pauses the script. By default waits in &quot;ticks&quot;, which are 60th of a second.</p>\n<p>Examples:</p>\n<pre><code>\n\nwait 500 ms -- pauses for half a second.\n\n--(A paused script can be terminated by clicking the Stop icon in the\n--navigation palette, or by changing to the button or field tool.)\n\nwait until the mouseH &gt; 120\nwait until the shiftKey\nwait until the mouseClick -- now supported\n\nwait 5 seconds\nwait 5 ticks\nwait 5 milliseconds\nwait 5 ms\n\n</code></pre><h2 id=\"visual-effect\">visual effect</h2>\n<p>This feature will arrive in a future version...</p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_03_syntax.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - syntax\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - syntax\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - syntax</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | <a href=\"./reference_02_commands.html\">Commands</a> | Syntax | <a href=\"./reference_04_properties.html\">Properties</a> | <a href=\"./reference_05_functions.html\">Functions</a> | <a href=\"./reference_06_events.html\">Event Handlers</a> | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"-operators-\">(Operators)</h2>\n<p>Here are the operators that can be used.</p>\n<pre><code>2 * 3</code></pre><p>multiplication</p>\n<pre><code>2 / 3</code></pre><p>division</p>\n<pre><code>2 ^ 3</code></pre><p>raise to the third power</p>\n<pre><code>7 div 5</code></pre><p>truncated division</p>\n<pre><code>7 mod 5</code></pre><p>modulo</p>\n<pre><code>2 &gt; 3</code></pre><p>greater than</p>\n<pre><code>2 &lt; 3</code></pre><p>less than</p>\n<pre><code>2 &gt;= 3</code></pre><p>greater than or equal to</p>\n<pre><code>2 &lt;= 3</code></pre><p>less than or equal to</p>\n<pre><code>2  ==  3</code></pre><p>equal to</p>\n<pre><code>2  !=  3</code></pre><p>not equal to</p>\n<pre><code>&quot;abc&quot; is &quot;def&quot;</code></pre><p>equal to</p>\n<pre><code>&quot;abc&quot; is not &quot;def&quot;</code></pre><p>not equal to</p>\n<pre><code>&quot;abc&quot; is in &quot;123abcdef&quot;</code></pre><p>does string contain another string</p>\n<pre><code>&quot;abc&quot; is not in &quot;123abcdef&quot;</code></pre><p>string is not in another string</p>\n<pre><code>2 + 3</code></pre><p>addition</p>\n<pre><code>2 - 3</code></pre><p>subtraction</p>\n<p><code>&amp;</code> and <code>&amp;&amp;</code> combine two strings (concatenation).</p>\n<pre><code>put &quot;a&quot; &amp; &quot;b&quot; into x\nanswer x -- displays &quot;ab&quot;\nput &quot;a&quot; &amp;&amp; &quot;b&quot; into x\nanswer x -- displays &quot;a b&quot;</code></pre><p>You can also use <code>a = b</code>, which is equivalent to <code>a == b</code></p>\n<p><strong>Logical operators</strong></p>\n<p>The constants &#39;true&#39; and &#39;false&#39; are used often. Internally there is no distinct boolean type, but the strings &quot;true&quot; and &quot;false&quot; are interpreted as true and false respectively.</p>\n<pre><code>true and false</code></pre><p>logical and</p>\n<pre><code>true or false</code></pre><p>logical or</p>\n<pre><code>not true</code></pre><p>logical not</p>\n<p>Logical operations are not guaranteed to be short-circuiting. In other words,</p>\n<pre><code>put (true or myfunction()) into x</code></pre><p>still will call <code>myfunction</code>, when it hypothetically could have been skipped.</p>\n<h2 id=\"-constants-\">(Constants)</h2>\n<p>The following constants are defined:</p>\n<pre><code>\npi\nnewline\ntab\nempty\nquote\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\ncolon\ncomma\ntrue\nfalse\nup\ndown\nspace\nreturn\ncr\nformfeed\nlinefeed</code></pre><h2 id=\"global\">global</h2>\n<p>Declares that a variable is a global.</p>\n<p>1) it can be accessed from any other script</p>\n<p>2) the contents are saved even after the function is complete.</p>\n<p>The contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.</p>\n<p>Examples:</p>\n<pre><code>\n\nglobal currentData1, currentData2\nput &quot;stored 1&quot; into currentData1\nput &quot;stored 2&quot; into currentData2\n\n\n</code></pre><h2 id=\"if-then\">if/then</h2>\n<p>Use to run certain code based on a condition that can be true or false.</p>\n<p>In the example</p>\n<pre><code>\nput 2 into x\nif x &gt; 0 then\n    answer &quot;x is greater than 0&quot;\nend if</code></pre><p>First, we&#39;ll check the expression <code>x &gt; 0</code>. Since it evaluates to true, the code inside is run. </p>\n<p>You can also include an &quot;else&quot; section that will be run only if the expression evaluated to false.</p>\n<pre><code>if x &gt; 0 then\n    answer &quot;x is greater than 0&quot;\nelse\n    answer &quot;x is not greater than 0&quot;\nend if</code></pre><p>You can chain together many different conditions with &quot;else if&quot;. </p>\n<pre><code>\nput 3 into x\nif x &gt; 3 then\n    answer &quot;x is greater than 3&quot;\nelse if x &lt; 3 then\n    answer &quot;x is less than 3&quot;\nelse if x is 3 then\n    answer &quot;x is 3&quot;\nend if</code></pre><p>As soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.</p>\n<pre><code>\nif 3+3 is 6 then\n    answer &quot;aaa&quot;\nelse if 2+2 is 4 then\n    -- this not run, even though the expression is true\n    answer &quot;bbb&quot;\nend if\n</code></pre><h2 id=\"short-if-then\">short if/then</h2>\n<p>Examples:</p>\n<pre><code>\n\nif 3+3 is 6 then answer &quot;it is&quot;\n\n-- you can even do this\n\nif 3+3 is 7 then answer &quot;it is not&quot;\nelse answer &quot;it is&quot;\n\n</code></pre><h2 id=\"exit-repeat\">exit repeat</h2>\n<p>Exit the current loop. Equivalent to &quot;break&quot; in C.</p>\n<p>Examples:</p>\n<pre><code>\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        exit repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- and does not display 2 or 3\n\n</code></pre><h2 id=\"exit\">exit</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseUp\n    put cd fld &quot;fld1&quot; into x\n    if x is not a number then\n        answer &quot;you did not type a number&quot;\n        exit mouseUp\n        answer &quot;this will never get called&quot;\n    end if\n    put x * 2 into cd fld &quot;fld1&quot;\nend mouseUp\n\n</code></pre><h2 id=\"exit-to-vipercard\">exit to ViperCard</h2>\n<p>Exits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.</p>\n<p>For compatibility, <code>exit to HyperCard</code> is also accepted. <code>exit to ViperCard</code> can also be useful if you have overridden a default message and want to defer to the default behavior.</p>\n<p>Examples:</p>\n<pre><code>\n\non myHandler\n    exit to ViperCard\n    answer &quot;this will never get called&quot;\nend myHandler\non mouseUp\n    myHandler\n    answer &quot;and even this will never get called&quot;\nend mouseUp\n\n</code></pre><h2 id=\"next-repeat\">next repeat</h2>\n<p>Inside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to &quot;continue&quot; in C.</p>\n<p>Examples:</p>\n<pre><code>\n\nrepeat with x = 1 to 3\n    if x == 2 then\n        next repeat\n    end if\n    answer x\nend repeat\n-- displays 1\n-- displays 3\n-- and does not display 2\n\n</code></pre><h2 id=\"pass\">pass</h2>\n<p>Exits the current function and calls a function higher in the message hierarchy. For example, if a button has the script</p>\n<pre><code>on mouseUp\n    answer &quot;button handling the event&quot;\nend mouseUp\n-- and the current card has the script\non mouseUp\n    answer &quot;card handling the event&quot;\nend mouseUp</code></pre><p>and the button is clicked, only the button&#39;s code will be run.</p>\n<p>If you want both to be run, you can use the pass command. If a button has the script</p>\n<pre><code>on mouseUp\n    answer &quot;button handling the event&quot;\n    pass mouseUp\n    -- any code here will be skipped\nend mouseUp\n--and the current card has the script\non mouseUp\n    answer &quot;card handling the event&quot;\nend mouseUp</code></pre><p>and the button is clicked,</p>\n<p>both will be run.</p>\n<h2 id=\"repeat\">repeat</h2>\n<p>Use to create a loop.</p>\n<p>Examples:</p>\n<pre><code>\n\nrepeat with x = 1 to 5\n    answer &quot;x is now&quot; &amp; x\nend repeat\n\nrepeat with x = 5 down to 1\n    answer &quot;x is now&quot; &amp; x\nend repeat\n\nrepeat 3 times\n    answer &quot;hi&quot;\nend repeat\n\nrepeat forever\n    answer &quot;this is an infinite loop&quot;\nend repeat\n\nput 0 into counter\nrepeat forever\n    answer &quot;but not this&quot;\n    add 1 to counter\n    if counter &gt; 3 then\n        exit repeat\n    end if\nend repeat\n\nput 0 into counter\nrepeat until counter &gt; 3\n    add 1 to counter\nend repeat\n\nput 0 into counter\nrepeat while counter &lt;= 3\n    add 1 to counter\nend repeat\n\n</code></pre><h2 id=\"return\">return</h2>\n<p>Returns a value from the current function.</p>\n<p>Note: no lines of code after the return statement will be run.</p>\n<p>Examples:</p>\n<pre><code>\n\nfunction myAddition p1, p2\n    return p1 + p2\n    answer &quot;this line will never be reached&quot;\nend myAddition\non mouseUp\n    put myAddition(1,2) into x\nend mouseUp\n\n</code></pre>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_04_properties.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - properties\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - properties\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - properties</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | <a href=\"./reference_02_commands.html\">Commands</a> | <a href=\"./reference_03_syntax.html\">Syntax</a> | Properties | <a href=\"./reference_05_functions.html\">Functions</a> | <a href=\"./reference_06_events.html\">Event Handlers</a> | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"id\">id</h2>\n<p>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.</p>\n<p>If you put the long id of an object into a variable, you can use that variable to refer to the object.</p>\n<pre><code>put the long id of card id 1011 into z\nset the name of z to &quot;changed&quot;</code></pre><p>The short id of an object is just the number. For example the short id of card id 1011 is 1011.</p>\n<pre><code>put the short id of card id 1011 into z\nset the name of cd id z to &quot;changed&quot;</code></pre><h2 id=\"name\">name</h2>\n<p>You can get or set the name of an object.</p>\n<pre><code>\ndoMenu &quot;New Button&quot;\nset the name of the result to &quot;my new button&quot;\n\nset the name of cd btn id 1011 to &quot;changed&quot;\nanswer the short name of cd btn id 1011 -- &quot;changed&quot;\n</code></pre><h2 id=\"number\">number</h2>\n<p>You can get the number of an object.</p>\n<pre><code>\nanswer the number of cd fld 2 -- 2\nanswer the number of cd btn 3 -- 3\nanswer the number of card 4 -- 4\n</code></pre><h2 id=\"owner\">owner</h2>\n<p>Gets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the owner of cd btn &quot;myBtn&quot; into z\nset the name of the owner of cd btn &quot;myBtn&quot; to &quot;changed&quot;\n\n</code></pre><h2 id=\"script\">script</h2>\n<p>It&#39;s unlikely to be useful, but a script can dynamically change the contents of another script.</p>\n<p>Examples:</p>\n<pre><code>\n\nput return &amp; &quot;on newCode&quot; &amp; return &amp; &quot;answer 234&quot; &amp; \\\n    return &amp; &quot;end newCode&quot; into newCode\nput the script of cd btn id 123 into oldCode\nset the script of cd btn id 123 to oldCode &amp; newCode\nsend &quot;newCode&quot; to cd btn id 123\n\n</code></pre><h2 id=\"btn-autohilite\">btn: autohilite</h2>\n<p>Does the button turn black when you click on it?</p>\n<p>Examples:</p>\n<pre><code>\n\nput the autohilite of cd btn &quot;myBtn&quot; into z\n\n\n</code></pre><h2 id=\"btn-checkmark\">btn: checkmark</h2>\n<p>Examples:</p>\n<pre><code>\n\nset the checkmark of cd btn &quot;myBtn&quot; to true.\n\n</code></pre><h2 id=\"btn-enabled\">btn: enabled</h2>\n<p>If a button is not enabled, it is greyed out and can&#39;t be clicked.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the enabled of cd btn &quot;myBtn&quot; to true\nset the enabled of cd btn &quot;myBtn&quot; to false\n\n\n</code></pre><h2 id=\"btn-left\">btn: left</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the left of cd btn &quot;myBtn&quot; to 4\n\n\n</code></pre><h2 id=\"btn-loc-location\">btn: loc, location</h2>\n<p>The coordinates of the center of the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the location of cd btn &quot;myBtn&quot; into z\n\n\n</code></pre><h2 id=\"btn-height\">btn: height</h2>\n<p>The height of the object on screen, in pixels.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the height of cd btn &quot;myBtn&quot; into z\n\n\n</code></pre><h2 id=\"btn-hilite\">btn: hilite</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the hilite of cd btn &quot;myBtn&quot; into z\n\n</code></pre><h2 id=\"btn-label\">btn: label</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the label of cd btn &quot;myBtn&quot; into z\n\n\n</code></pre><h2 id=\"btn-icon\">btn: icon</h2>\n<p>Number of the icon.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the icon of cd btn &quot;myBtn&quot; into z\n\n</code></pre><h2 id=\"btn-rect-rectangle\">btn: rect, rectangle</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the rect of cd btn &quot;myBtn&quot; to 45,56,67,78\nset the rectangle of cd btn &quot;myBtn&quot; to 45,56,67,78\n\n\n</code></pre><h2 id=\"btn-showlabel\">btn: showlabel</h2>\n<p>Is the label text shown?</p>\n<p>Examples:</p>\n<pre><code>\n\nput the showlabel of cd btn &quot;myBtn&quot; into z\n\n</code></pre><h2 id=\"btn-style\">btn: style</h2>\n<p>Styles include:</p>\n<p>Transparent</p>\n<p>Rectangle</p>\n<p>Opaque</p>\n<p>Roundrect</p>\n<p>Plain</p>\n<p>Shadow</p>\n<p>OsStandard</p>\n<p>OsDefault</p>\n<p>OsBoxmodal</p>\n<p>Checkbox</p>\n<p>Radio</p>\n<p>Examples:</p>\n<pre><code>\n\nset the style of cd btn &quot;myBtn&quot; to &quot;Shadow&quot;\n\n</code></pre><h2 id=\"btn-textalign\">btn: textalign</h2>\n<p>Set alignment of the label text.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textalign of cd btn &quot;myBtn&quot; to &quot;left&quot;\nset the textalign of cd btn &quot;myBtn&quot; to &quot;center&quot;\n\n\n</code></pre><h2 id=\"btn-textfont\">btn: textfont</h2>\n<p>Set typeface of the label text.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textfont of cd btn &quot;myBtn&quot; to &quot;courier&quot;\n\n\n</code></pre><h2 id=\"btn-textsize\">btn: textsize</h2>\n<p>Set size of the label text.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textsize of cd btn &quot;myBtn&quot; to 24\n\n\n</code></pre><h2 id=\"btn-textstyle\">btn: textstyle</h2>\n<p>Set style of the label text.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textstyle of cd btn &quot;myBtn&quot; to &quot;bold&quot;\n\n\n</code></pre><h2 id=\"btn-top\">btn: top</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the top of cd btn &quot;myBtn&quot; into z\n\n\n\n</code></pre><h2 id=\"btn-topleft\">btn: topleft</h2>\n<p>The x,y coordinates of the upper left corner.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the topleft of cd btn &quot;myBtn&quot; to 34, 56\n\n</code></pre><h2 id=\"btn-visible\">btn: visible</h2>\n<p>Hide or show the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the visible of cd btn &quot;myBtn&quot; to false\n\n</code></pre><h2 id=\"btn-width\">btn: width</h2>\n<p>The width of the object on screen, in pixels.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the width of cd btn &quot;myBtn&quot; into z\n\n\n</code></pre><h2 id=\"fld-alltext\">fld: alltext</h2>\n<p>Get or set all contents of the field.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the alltext of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"fld-dontwrap\">fld: dontwrap</h2>\n<p>Wrap text onto different lines.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the dontwrap of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-enabled\">fld: enabled</h2>\n<p>A disabled field is greyed out and can&#39;t be edited.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the enabled of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-defaulttextfont\">fld: defaulttextfont</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the defaulttextfont of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"fld-defaulttextsize\">fld: defaulttextsize</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the defaulttextsize of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-defaulttextstyle\">fld: defaulttextstyle</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the defaulttextstyle of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"fld-left\">fld: left</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the left of cd fld &quot;myFld&quot; to 4\n\n\n</code></pre><h2 id=\"fld-loc-location\">fld: loc, location</h2>\n<p>The coordinates of the center of the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the location of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"fld-locktext\">fld: locktext</h2>\n<p>You can&#39;t type new text into a &#39;locked&#39; field. You can still set the contents via a script.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the locktext of cd fld &quot;myFld&quot; to true\nput &quot;still can change&quot; into cd fld &quot;myFld&quot;\n\n</code></pre><h2 id=\"fld-height\">fld: height</h2>\n<p>The height of the object on screen, in pixels.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the height of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-rect-rectangle\">fld: rect, rectangle</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the rect of cd fld &quot;myFld&quot; to 45,56,67,78\nset the rectangle of cd fld &quot;myFld&quot; to 45,56,67,78\n\n\n</code></pre><h2 id=\"fld-scroll\">fld: scroll</h2>\n<p>The vertical scroll position.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the scroll of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-singleline\">fld: singleline</h2>\n<p>Field is a single line, cannot contain newlines.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the singleline of cd fld &quot;myFld&quot; into z\n\n\n\n</code></pre><h2 id=\"fld-style\">fld: style</h2>\n<p>Styles include:</p>\n<p>Opaque</p>\n<p>Transparent</p>\n<p>Rectangle</p>\n<p>Shadow</p>\n<p>Scrolling</p>\n<p>Examples:</p>\n<pre><code>\n\nset the style of cd fld &quot;myFld&quot; to &quot;shadow&quot;\n\n</code></pre><h2 id=\"fld-textalign\">fld: textalign</h2>\n<p>Set alignment of text</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textalign of cd fld &quot;myFld&quot; to &quot;left&quot;\nset the textalign of cd fld &quot;myFld&quot; to &quot;center&quot;\n\n\n</code></pre><h2 id=\"fld-textfont\">fld: textfont</h2>\n<p>By default, applies the property to the entire field.</p>\n<pre><code>set the textfont of cd fld &quot;myFld&quot; to &quot;chicago&quot;\nput the textfont of cd fld &quot;myFld&quot; into z</code></pre><p>We now support getting and setting by chunk!</p>\n<pre><code>set the textfont of char 3 to 4 of cd fld &quot;myFld&quot; to &quot;geneva&quot;\nput the textfont of char 3 to 4 of cd fld &quot;myFld&quot; into z</code></pre><p>When querying for a property and there are multiple values, returns the string &quot;mixed&quot;.</p>\n<h2 id=\"fld-textsize\">fld: textsize</h2>\n<p>By default, applies the property to the entire field.</p>\n<pre><code>set the textsize of cd fld &quot;myFld&quot; to &quot;chicago&quot;\nput the textsize of cd fld &quot;myFld&quot; into z</code></pre><p>We now support getting and setting by chunk!</p>\n<pre><code>set the textsize of char 3 to 4 of cd fld &quot;myFld&quot; to &quot;geneva&quot;\nput the textsize of char 3 to 4 of cd fld &quot;myFld&quot; into z</code></pre><p>When querying for a property and there are multiple values, returns the string &quot;mixed&quot;.</p>\n<h2 id=\"fld-textstyle\">fld: textstyle</h2>\n<p>By default, applies the property to the entire field.</p>\n<pre><code>set the textstyle of cd fld &quot;myFld&quot; to &quot;bold&quot;\nset the textstyle of cd fld &quot;myFld&quot; to &quot;bold,italic&quot;\nset the textstyle of cd fld &quot;myFld&quot; to &quot;plain&quot;\nput the textstyle of cd fld &quot;myFld&quot; into z</code></pre><p>We now support getting and setting by chunk!</p>\n<pre><code>set the textstyle of char 3 to 4 of cd fld &quot;myFld&quot; to &quot;bold&quot;\nput the textstyle of char 3 to 4 of cd fld &quot;myFld&quot; into z</code></pre><p>When querying for a property and there are multiple values, returns the string &quot;mixed&quot;.</p>\n<p>You can also do the following:</p>\n<pre><code>set the textstyle of cd fld &quot;myFld&quot; to &quot;add-bold&quot;\nset the textstyle of cd fld &quot;myFld&quot; to &quot;subtract-italic&quot;\nset the textstyle of cd fld &quot;myFld&quot; to &quot;toggle-outline&quot;\nset the textstyle of line 2 of cd fld &quot;myFld&quot; to &quot;add-bold&quot;\nset the textstyle of line 2 of cd fld &quot;myFld&quot; to &quot;subtract-italic&quot;\nset the textstyle of line 2 of cd fld &quot;myFld&quot; to &quot;toggle-outline&quot;</code></pre><h2 id=\"fld-top\">fld: top</h2>\n<p>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.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the top of cd fld &quot;myFld&quot; into z\n\n\n\n</code></pre><h2 id=\"fld-topleft\">fld: topleft</h2>\n<p>The x,y coordinates of the upper left corner.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the topleft of cd fld &quot;myFld&quot; to 34, 56\n\n</code></pre><h2 id=\"fld-width\">fld: width</h2>\n<p>The width of the object on screen, in pixels.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the width of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"fld-visible\">fld: visible</h2>\n<p>Show or hide the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the visible of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"cursor\">cursor</h2>\n<p>Sets the current cursor.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- show the watch\nset the cursor to &quot;watch&quot;\nwait 2 seconds\n\n-- spinning ball\nrepeat with x = 1 to 30\n    set the cursor to &quot;busy&quot;\n    wait 0.2 seconds\nend repeat\n\n\n</code></pre><h2 id=\"filled\">filled</h2>\n<p>The color/opacity for drawing. Currently can be &quot;true&quot; for black, &quot;false&quot; for transparent, or &quot;white&quot; for white.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the filled to &quot;white&quot;\n\n</code></pre><h2 id=\"linecolor\">lineColor</h2>\n<p>The lineColor for drawing. Currently can be 0 (black) or 1 (white).</p>\n<p>Examples:</p>\n<pre><code>\n\nset the lineSize to 1\n\n</code></pre><h2 id=\"linesize\">lineSize</h2>\n<p>The linesize for drawing. Currently can be 1 (thin) or 2 (thicker).</p>\n<p>Examples:</p>\n<pre><code>\n\nset the lineSize to 2\n\n</code></pre><h2 id=\"itemdelimiter\">itemdelimiter</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the itemdelimiter into z\nset the itemdel to tab\nanswer item 2 of &quot;a&quot;&amp;tab&amp;&quot;b&quot;&amp;tab&amp;&quot;c&quot;\nset the itemdel to &quot;,&quot;\n\n\n</code></pre><h2 id=\"idlerate\">idlerate</h2>\n<p>The speed at which <code>on idle</code> is called.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the idlerate to &quot;default&quot;\nset the idlerate to &quot;faster&quot;\nset the idlerate to &quot;faster2&quot;\n\n</code></pre><h2 id=\"multiple\">multiple</h2>\n<p>The &quot;draw multiple&quot; setting for drawing. Does not yet affect script drawing.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the multiple to true\n\n</code></pre><h2 id=\"pattern\">pattern</h2>\n<p>The current pattern number.</p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_05_functions.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - functions\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - functions\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - functions</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | <a href=\"./reference_02_commands.html\">Commands</a> | <a href=\"./reference_03_syntax.html\">Syntax</a> | <a href=\"./reference_04_properties.html\">Properties</a> | Functions | <a href=\"./reference_06_events.html\">Event Handlers</a> | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"abs-x-\">abs(x)</h2>\n<p>Absolute value.</p>\n<p>Examples:</p>\n<pre><code>\n\nput abs(-0.5) into x\nput abs(0.5) into x\n\n</code></pre><h2 id=\"atan-x-\">atan(x)</h2>\n<p>Arctangent, in radians.</p>\n<p>Examples:</p>\n<pre><code>\n\nput atan(0.5) into x\n\n\n</code></pre><h2 id=\"average-\">average()</h2>\n<p>Simple mean of numbers.</p>\n<p>Supports any number of arguments.</p>\n<p>You can also provide a comma-delimited string.</p>\n<p>Examples:</p>\n<pre><code>\n\nput average(1,2,3) into x\nput average(&quot;1,2,3&quot;) into x -- returns 2\n\n</code></pre><h2 id=\"chartonum-x-\">charToNum(x)</h2>\n<p>From ascii-like number to a character. Note that characters in a field are displayed in Mac OS Roman encoding.</p>\n<p>Note that the newline character is always \\n (10).</p>\n<p>Examples:</p>\n<pre><code>\n\nput charToNum(97) into x\n\n\n\n</code></pre><h2 id=\"clickh-\">clickH()</h2>\n<p>Get x coordinate of a recent mouse click. See <code>clickLoc</code> for more details.</p>\n<p>Examples:</p>\n<pre><code>\n\nput clickh() into x\n\n\n</code></pre><h2 id=\"clickloc-\">clickLoc()</h2>\n<p>Get the coordinates of a recent mouse click.</p>\n<p>This isn&#39;t necessarily the most recent mouseClick, it is only updated</p>\n<p>1) clicks before the script runs</p>\n<p>2) when you check the <code>mouseClick</code></p>\n<p>3) when you simulate a click with <code>click</code> or <code>drag</code></p>\n<p>Examples:</p>\n<pre><code>\n\nwait until the mouseClic\nanswer &quot;you clicked at&quot; &amp;&amp; the clickLoc\n\n\n</code></pre><h2 id=\"clickv-\">clickV()</h2>\n<p>Get y coordinate of a recent mouse click. See <code>clickLoc</code> for more details.</p>\n<p>Examples:</p>\n<pre><code>\n\nput clickv() into x\n\n\n</code></pre><h2 id=\"commandkey-\">commandKey()</h2>\n<p>Check if this modifier key is pressed.</p>\n<p>Examples:</p>\n<pre><code>\n\nif the commandKey is down then\n    answer &quot;cmd key is down&quot;\nend if\n-- same as\nif the cmdKey is down then\n    answer &quot;cmd key is down&quot;\nend if\n\n\n</code></pre><h2 id=\"contains\">contains</h2>\n<p>Can you find a string within a string?</p>\n<p>Examples:</p>\n<pre><code>\n\nif &quot;abc&quot; contains &quot;b&quot; then\n    answer &quot;yes&quot;\nend if\n\n</code></pre><h2 id=\"cos-x-\">cos(x)</h2>\n<p>Examples:</p>\n<pre><code>\n\nput cos(0.5 * pi) into x\n\n</code></pre><h2 id=\"date-\">date()</h2>\n<p>Returns the current date.</p>\n<p>Examples:</p>\n<pre><code>\n\nthe date\ndate()\nthe abbrev date\nthe short date\nthe long date\nthe English date\n\n</code></pre><h2 id=\"exp-x-\">exp(x)</h2>\n<p>e to the power of x.</p>\n<p>Examples:</p>\n<pre><code>\n\nput exp(0.5) into x\n\n\n\n</code></pre><h2 id=\"exp2-x-\">exp2(x)</h2>\n<p>2 to the power of x.</p>\n<p>Examples:</p>\n<pre><code>\n\nput exp2(0.5) into x\n\n</code></pre><h2 id=\"is-a\">is a</h2>\n<p>Check the type of an expression.</p>\n<p>Examples:</p>\n<pre><code>\n\nif x is a number then\n    answer &quot;a&quot;\nend if\nif x is a integer then\n    answer &quot;b&quot;\nend if\nif x is a logical then\n    answer &quot;c&quot;\nend if\nif x is a point then\n    answer &quot;d&quot;\nend if\nif x is a rect then\n    answer &quot;e&quot;\nend if\n\n</code></pre><h2 id=\"is-in\">is in</h2>\n<p>Can you find a string within a string?</p>\n<p>Examples:</p>\n<pre><code>\n\nif &quot;b&quot; is in &quot;abc&quot; then\n    answer &quot;yes&quot;\nend if\n\n-- is within is the same,\nif &quot;b&quot; is within &quot;abc&quot; then\n    answer &quot;yes&quot;\nend if\n\n\n</code></pre><h2 id=\"keychar-\">keyChar()</h2>\n<p>In an afterkeydown or afterkeyup handler, check the character. Is affected by shift.</p>\n<p>Examples:</p>\n<pre><code>\n\nput keyChar() into x\non afterKeyDown\n    if keyChar() is &quot;i&quot; and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer &quot;you pressed option-i&quot;\n    else if keyChar() is &quot;U&quot; and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer &quot;you pressed shift-u&quot;\n    end if\nend afterKeyDown\n\n</code></pre><h2 id=\"keyrepeated-\">keyRepeated()</h2>\n<p>In an afterkeydown handler, did this event come from the user holding the key down?</p>\n<p>Examples:</p>\n<pre><code>\n\nif not keyRepeated() then\n    add 1 to uniqueKeyPresses\nend if\n\n</code></pre><h2 id=\"length-s-\">length(s)</h2>\n<p>Returns the length of a string, in characters.</p>\n<p>Examples:</p>\n<pre><code>\n\nanswer length(&quot;abc&quot;) -- displays 3\nanswer the length of &quot;&quot; -- displays 0\nanswer the length of &quot;abc&quot; -- displays 3\n\n</code></pre><h2 id=\"ln-x-\">ln(x)</h2>\n<p>Examples:</p>\n<pre><code>\n\nput ln(0.5) into x\n\n\n\n\n\n</code></pre><h2 id=\"log2-x-\">log2(x)</h2>\n<p>Base-2 logarithm.</p>\n<p>Examples:</p>\n<pre><code>\n\nput log2(0.5) into x\n\n</code></pre><h2 id=\"max-\">max(...)</h2>\n<p>Supports any number of arguments. You can also provide a comma-delimited string.</p>\n<p>Examples:</p>\n<pre><code>\n\nput max(1,2,3) into x\nput max(&quot;45,49,40&quot;) into x -- returns 49\n\n</code></pre><h2 id=\"me\">me</h2>\n<p>Refers to the object that owns the current script.</p>\n<p>Similar to, but distinct from &#39;target&#39;.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the id of me into theTarget\n\nset the width of me to 100\n\n</code></pre><h2 id=\"min-\">min()</h2>\n<p>Supports any number of arguments. You can also provide a comma-delimited string.</p>\n<p>Examples:</p>\n<pre><code>\n\nput min(1,2,3) into x\nput min(&quot;45,49,40&quot;) into x -- returns 40\n\n</code></pre><h2 id=\"mouse-\">mouse()</h2>\n<p>Is the mouse button currently down. Returns one of the constants <code>down</code> or <code>up</code>.</p>\n<p>Examples:</p>\n<pre><code>\n\nif the mouse is down then\n    answer &quot;mouse button is clicked&quot;\nend if\n\n</code></pre><h2 id=\"mouseclick-\">mouseClick()</h2>\n<p>Was the mouse recently clicked? Doesn&#39;t include the click that created the message, it needs to be later.</p>\n<p>When you check the mouseClick, it will only return true once before resetting back to false. See also: clickloc, clickh, clickv.</p>\n<p>Examples:</p>\n<pre><code>\n\nwait until the mouseClick\nanswer the clickloc\n\n\n</code></pre><h2 id=\"mouseh-\">mouseH()</h2>\n<p>The x coordinate of the current mouse location.</p>\n<p>Examples:</p>\n<pre><code>\n\nput mouseH() into x\n\n\n</code></pre><h2 id=\"mouseloc-\">mouseLoc()</h2>\n<p>The coordinates of the current mouse location.</p>\n<p>Examples:</p>\n<pre><code>\n\nput mouseLoc() into x\n\n\n</code></pre><h2 id=\"mousev-\">mouseV()</h2>\n<p>The y coordinate of the current mouse location.</p>\n<p>Examples:</p>\n<pre><code>\n\nput mouseV() into x\n\n\n</code></pre><h2 id=\"number\">number</h2>\n<p><strong>Count parts of text</strong></p>\n<pre><code>answer the number of chars in &quot;abc&quot;\nanswer the number of items in &quot;a,b,c&quot;\nanswer the number of lines in myList</code></pre><p><strong>Count current objects</strong></p>\n<pre><code>answer the number of cards in this stack\nanswer the number of buttons in this card\nanswer the number of fields in this card\nrepeat with x = 1 to the number of cards in this stack\n    set the name of card x of this stack to &quot;c&quot; &amp; x\nend repeat</code></pre><p><strong>Get the number of an object.</strong></p>\n<pre><code>answer the number of this card\nput the number of cd fld id 1234 into x\nput &quot;abc&quot; into cd fld x</code></pre><h2 id=\"numbertostr-x-\">numberToStr(x)</h2>\n<p>Convert number to string.</p>\n<p>Examples:</p>\n<pre><code>\n\nput numberToStr(0.5) into x\n\n</code></pre><h2 id=\"numtochar-x-\">numToChar(x)</h2>\n<p>From a character to an ascii-like number. Note that characters in a field are displayed in Mac OS Roman encoding.</p>\n<p>Note that the newline character is always \\n (10).</p>\n<p>Examples:</p>\n<pre><code>\n\nput numToChar(&quot;a&quot;) into x\n\n\n</code></pre><h2 id=\"objectbyid-id-\">objectById(id)</h2>\n<p>Gets the full id from the numeric id.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- assuming there is a cd btn id 1234\nput objectById(1234) into x\n-- x is now &quot;card button id 1234&quot;.\n-- you can now do this\nset the topleft of x to 100, 200\n\n</code></pre><h2 id=\"offset-needle-haystack-\">offset(needle, haystack)</h2>\n<p>Search for a string within a string, and return the position where found. If not found, returns 0. (one-based indexing).</p>\n<p>Examples:</p>\n<pre><code>\n\nput offset(&quot;b&quot;, &quot;abc&quot;) into x\n-- x is now 2.\n\n\n</code></pre><h2 id=\"optionkey-\">optionKey()</h2>\n<p>Check if this modifier key is pressed.</p>\n<p>Examples:</p>\n<pre><code>\n\nif the optionKey is down then\n    answer &quot;opt key is down&quot;\nend if\n\n</code></pre><h2 id=\"param-n-\">param(n)</h2>\n<p>Get the nth value passed into the current procedure. Can be used to build a function that takes any number of arguments,  see example.</p>\n<p>Examples:</p>\n<pre><code>\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer &quot;total is&quot; &amp;&amp; total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n</code></pre><h2 id=\"paramcount-\">paramCount()</h2>\n<p>Get the number of values passed into the current procedure. Can be used to build a function that takes any number of arguments, see example.</p>\n<p>Examples:</p>\n<pre><code>\n\non mySumOfNumbers\n    put 0 into total\n    repeat with x = 1 to paramCount()\n        put total + param(x) into total\n    end repeat\n    answer &quot;total is&quot; &amp;&amp; total\nend mySumOfNumbers\n\non mouseUp\n    mySumOfNumbers 1, 2, 3\nend mouseUp\n\n</code></pre><h2 id=\"params-\">params()</h2>\n<p>Get all of the values passed into the current procedure.</p>\n<p>Examples:</p>\n<pre><code>\n\nput params() into x\n\n\n</code></pre><h2 id=\"random-n-\">random(n)</h2>\n<p>n must be an integer.</p>\n<p>Returns random value between 1 and n.</p>\n<p>Examples:</p>\n<pre><code>\n\nput random(20) into roll\n\n</code></pre><h2 id=\"result-\">result()</h2>\n<p>The return value of the last called function or procedure.</p>\n<p>Examples:</p>\n<pre><code>\n\non myProc\n    return &quot;a&quot;\nend myProc\non mouseUp\n    myProc\n    answer the result\nend mouseUp\n\n</code></pre><h2 id=\"round-x-\">round(x)</h2>\n<p>Returns integer nearest to number. Odd integers plus 0.5 round up, even integers plus 0.5 round down.</p>\n<p>Examples:</p>\n<pre><code>\n\nput round(1.7) into x\n\n</code></pre><h2 id=\"screenrect-\">screenRect()</h2>\n<p>Examples:</p>\n<pre><code>\n\nput screenRect() into x\n\n\n</code></pre><h2 id=\"seconds-\">seconds()</h2>\n<p>Seconds since January 1, 1904.</p>\n<p>Examples:</p>\n<pre><code>\n\nput seconds() into x\n\n</code></pre><h2 id=\"selectedchunk-\">selectedChunk()</h2>\n<p>A full description of the current selection, or &quot;&quot; if there is no selection.</p>\n<p>Returns a string that looks like this: <code>char 2 to 4 of cd fld id 567</code>.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the textSize of the selectedChunk to 24\nput the textFont of the selectedChunk into x\nput word 2 of the selectedChunk into selStart \nput word 4 of the selectedChunk into selEnd \nput the selectedChunk into x\n\n</code></pre><h2 id=\"selectedfield-\">selectedField()</h2>\n<p>The field that contains current selected text, or &quot;&quot; if there is no selection.</p>\n<p>(If compatibility mode is enabled, not recommended for new code, uses HyperCard&#39;s formatting and returns a string like</p>\n<p>&quot;card field 4&quot;.)</p>\n<p>Examples:</p>\n<pre><code>\n\nput selectedField() into x\nset the loc of the selectedField to 23, 45\nset the textalign of the selectedField to &quot;center&quot;\n\n</code></pre><h2 id=\"selectedline-\">selectedLine()</h2>\n<p>The number of the line of the current selected text, or &quot;&quot; if there is no selection.</p>\n<p>(If compatibility mode is enabled, not recommended for new code, uses HyperCard&#39;s formatting and returns a string like</p>\n<p>&quot;line 3 of card field 4&quot;.)</p>\n<p>Examples:</p>\n<pre><code>\n\nput selectedLine() into x\n\n\n</code></pre><h2 id=\"selectedtext-\">selectedText()</h2>\n<p>The value of the current selected text, or the empty string if there is no selection.</p>\n<p>Examples:</p>\n<pre><code>\n\nput selectedText() into x\n\n</code></pre><h2 id=\"the-selection\">the selection</h2>\n<p>Reading from <code>the selection</code> retrieves the value of the current selected text, or the empty string if there is no selection.</p>\n<p>Writing to <code>the selection</code> replaces the currently selected text with new text.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the selection into x\nput &quot;&quot; into the selection\nput &quot;abc&quot; into the selection\n\n-- chunks are supported\nput char 2 to 3 of the selection into x\nput &quot;&quot; into char 2 to 3 of the selection\nput &quot;abc&quot; into char 3 of the selection\nput item 2 to 3 of the selection into x\nput &quot;&quot; into item 2 to 3 of the selection\nput &quot;abc&quot; into item 3 of the selection\n\n-- you can delete part of the selection\ndelete char 2 to 4 of the selection\ndelete item 3 of the selection\n\n</code></pre><h2 id=\"shiftkey-\">shiftKey()</h2>\n<p>Check if this modifier key is pressed.</p>\n<p>Examples:</p>\n<pre><code>\n\nif the shiftKey is down then\n    answer &quot;shift key is down&quot;\nend if\n\n\n</code></pre><h2 id=\"sqrt-x-\">sqrt(x)</h2>\n<p>Examples:</p>\n<pre><code>\n\nput sqrt(0.5) into x\n\n</code></pre><h2 id=\"sin-x-\">sin(x)</h2>\n<p>Examples:</p>\n<pre><code>\n\nput sin(0.5 * pi) into x\n\n\n</code></pre><h2 id=\"strtonumber-x-\">strToNumber(x)</h2>\n<p>Parse string to number. Supports scientific notation. If cannot be parsed, returns &quot;false&quot;</p>\n<p>Examples:</p>\n<pre><code>\n\nput strToNumber(&quot;12&quot;) into x\nput strToNumber(&quot;-12&quot;) into x\nput strToNumber(&quot;1e6&quot;) into x\nask &quot;what is a number&quot;\nput it into x\nif strToNumber(x) is false then\n    answer &quot;that was not a number&quot;\nend if\n\n\n\n</code></pre><h2 id=\"sum-\">sum()</h2>\n<p>Supports any number of arguments.</p>\n<p>You can also provide a comma-delimited string.</p>\n<p>Examples:</p>\n<pre><code>\n\nput sum(1,2,3) into x\nput sum(&quot;1,2,3&quot;) into x -- returns 6\n\n\n</code></pre><h2 id=\"tan-x-\">tan(x)</h2>\n<p>Examples:</p>\n<pre><code>\n\nput tan(0.125 * pi) into x\n\n\n</code></pre><h2 id=\"target\">target</h2>\n<p>Refers to the object that was most recently acted on.</p>\n<p>Here&#39;s one way this can be useful: If you have many buttons that all basically perform the same action, you could have an &#39;on mouseup&#39; handler in the card script instead of a separate script within each button. This script in the card could check the target to see which of the buttons were clicked.</p>\n<p>Different than &#39;me&#39;, which is the owner of the currently running script, which might be different than the button that was clicked.</p>\n<p>Examples:</p>\n<pre><code>\n\nset the width of the target to 100\n\nput the short id of the target into x\n\n\n</code></pre><h2 id=\"there-is-a\">there is a</h2>\n<p>Check for the existence of an object.</p>\n<p>Examples:</p>\n<pre><code>\n\nif there is a cd btn id 12345 then\n    answer &quot;found&quot;\nend if\nif there is not a cd btn id 12345 then\n    answer &quot;not found&quot;\nend if\n\n</code></pre><h2 id=\"ticks-\">ticks()</h2>\n<p>Ticks (60th of a second) since January 1, 1904.</p>\n<p>Examples:</p>\n<pre><code>\n\nput ticks() into x\n\n</code></pre><h2 id=\"tool-\">tool()</h2>\n<p>The current simulated tool, as set by the <code>choose</code> command. (The <code>choose</code> command can be used to draw lines and shapes).</p>\n<p>The actual current tool will be the browse tool when any script is running.</p>\n<p>Examples:</p>\n<pre><code>\n\nchoose pencil tool\nanswer tool() -- shows &quot;pencil&quot;\n\n</code></pre><h2 id=\"tolowercase-\">toLowerCase()</h2>\n<p>Examples:</p>\n<pre><code>\n\nanswer toLowerCase(&quot;ABC&quot;) -- shows &quot;abc&quot;\n\n</code></pre><h2 id=\"touppercase-\">toUpperCase()</h2>\n<p>Examples:</p>\n<pre><code>\n\nanswer toUpperCase(&quot;abc&quot;) -- shows &quot;ABC&quot;\n\n\n</code></pre><h2 id=\"trunc-x-\">trunc(x)</h2>\n<p>Get integer part of a number. i.e. for positive numbers, always round down to the nearest integer.</p>\n<p>Examples:</p>\n<pre><code>\n\nput trunc(0.5) into x\n\n\n\n</code></pre><h2 id=\"annuity-rate-periods-\">annuity(rate, periods)</h2>\n<p>Computes the total cost of an annuity now that will pay you one unit per period, over the specific number of periods.</p>\n<p>You want to purchase an annuity that pays you $10,000 a year for 10 years. The interest rate is 10%. How much will it cost you now? The amount loaned is 10000 * annuity(0.10, 10), or 61445.67.</p>\n<h2 id=\"compound-rate-periods-\">compound(rate, periods)</h2>\n<p>Returns the value of one unit of principal invested at the interest rate and compounded over the specified number of periods.</p>\n<p>Example: $100 invested for 20 years at 10% interest compounded yearly:</p>\n<p>futureValue = 100 * compound(0.10, 20) = about $673</p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_06_events.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - events\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - events\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - events</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | <a href=\"./reference_02_commands.html\">Commands</a> | <a href=\"./reference_03_syntax.html\">Syntax</a> | <a href=\"./reference_04_properties.html\">Properties</a> | <a href=\"./reference_05_functions.html\">Functions</a> | Event Handlers | <a href=\"./reference_07_compatibility.html\">Compatibility</a></p>\n<h2 id=\"afterkeydown\">afterKeyDown</h2>\n<p>Called when a key is pressed.</p>\n<p>You can use the functions <code>keyChar()</code>,  <code>shiftKey()</code>,  <code>optionKey()</code>, and <code>commandKey()</code>, to determine which key(s) where pressed.</p>\n<p><code>keyRepeated()</code> can be used to see if the key event comes from the key having been held down.</p>\n<p>Examples:</p>\n<pre><code>\n\non afterKeyDown\n    if keyChar() is &quot;i&quot; and the shiftKey is up and \\\n            the optionKey is down and the commandKey is up then\n        answer &quot;you pressed option-i&quot;\n    else if keyChar() is &quot;U&quot; and the shiftKey is down and \\\n            the optionKey is up and the commandKey is up then\n        answer &quot;you pressed shift-u&quot;\n    end if\nend afterKeyDown\n</code></pre><h2 id=\"afterkeyup\">afterKeyUp</h2>\n<p>Called when a key is pressed and released.</p>\n<p>Examples:</p>\n<pre><code>\n\non afterKeyUp\n    if keyChar() is &quot;i&quot; then\n        answer &quot;you pressed i&quot;\n    end if\nend afterKeyUp\n\n</code></pre><h2 id=\"closebackground\">closeBackground</h2>\n<p>When you go to a different card, if the card belongs to a different background, the closeBackground message will be sent. (You&#39;re leaving one background and going to another).</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a background&#39;s script\non closeBackground\n    answer &quot;you have left this background&quot;\nend closeBackground\n\n</code></pre><h2 id=\"closecard\">closeCard</h2>\n<p>Message sent upon leaving a card.</p>\n<p>Because messages continue up the hierarchy until they are handled, you can also respond to closeCard in a stack script.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a card&#39;s script\non closeCard\n    answer &quot;you have left this card&quot;\nend closeCard\n\n\n</code></pre><h2 id=\"closefield\">closeField</h2>\n<p>Sent when the user clicks on a field to select it, types text into the field, and then de-selects the field.</p>\n<p>If the browse tool is active, this message will be sent by the following:</p>\n<ul>\n<li>When typing text into a field, click outside the field</li>\n<li>When typing text into a field, press Enter</li>\n<li>When typing text into a field, go to a different card</li>\n</ul>\n<p>See also: <code>openField</code> and <code>exitField</code>.</p>\n<p>The message is sent to the target field and travels upward to the current card as usual.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a field&#39;s script\n\non closeField\n    -- do a simple check of what the user just typed\n    if not &quot;@&quot; in the target then\n        put &quot;not a e-mail address&quot; into cd fld &quot;status&quot;\n    else\n        put &quot;&quot; into cd fld &quot;status&quot;\n    end if\nend closeField\n\n</code></pre><h2 id=\"exitfield\">exitField</h2>\n<p>Sent when the user clicks on a field to select it, does not type text into the field, and then de-selects the field.</p>\n<p>If the browse tool is active, this message will be sent by the following:</p>\n<ul>\n<li>When a field is selected, click outside the field</li>\n<li>When a field is selected, press Enter</li>\n<li>When a field is selected, go to a different card</li>\n</ul>\n<p>It&#39;s possible for exitField to be sent to the field more than once if some of the above actions happen at the same time.</p>\n<p>See also: <code>openField</code> and <code>closeField</code>.</p>\n<p>The message is sent to the target field and travels upward to the current card as usual.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a field&#39;s script\n\non openField\n    show cd btn &quot;indicateCurrentlyEditingField&quot;\nend openField\n\non closeField\n    hide cd btn &quot;indicateCurrentlyEditingField&quot;\nend closeField\n\non exitField\n    hide cd btn &quot;indicateCurrentlyEditingField&quot;\nend exitField\n\n</code></pre><h2 id=\"idle\">idle</h2>\n<p>Sent repeatedly to the current card. Can be used for a game loop.</p>\n<p>(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)</p>\n<p>To get faster idle calls, at the expense of heavier cpu usage, use <code>set the idlerate to &quot;faster&quot;</code></p>\n<h2 id=\"mousedoubleclick\">mouseDoubleClick</h2>\n<p>Remember that scripts are only run when you&#39;re in the Browse tool (hand-shape). Create a button, edit its script, and type the example below. Now when you choose the browse tool and double-click the button, your code will run.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseDoubleClick\n    answer &quot;you double-clicked this button.&quot;\nend mouseDoubleClick\n\n</code></pre><h2 id=\"mousedown\">mouseDown</h2>\n<p>Remember that scripts are only run when you&#39;re in the Browse tool (hand-shape). Called whenever the mouse is pressed down onto the object. Create a button, edit its script, and type the example below. Now when you choose the browse tool and click the button, your code will run.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseDown\n    answer &quot;code is running.&quot;\nend mouseDown\n\n</code></pre><h2 id=\"mouseenter\">mouseEnter</h2>\n<p>Remember that scripts are only run when you&#39;re in the Browse tool (hand-shape). Called whenever the mouse enters the object.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseEnter\n    set the icon of me to 12\nend mouseDown\n\n</code></pre><h2 id=\"mouseleave\">mouseLeave</h2>\n<p>Remember that scripts are only run when you&#39;re in the Browse tool (hand-shape). Called whenever the mouse leaves the object.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseLeave\n    set the icon of me to 10\nend mouseLeave\n\n</code></pre><h2 id=\"mouseup\">mouseUp</h2>\n<p>Remember that scripts are only run when you&#39;re in the Browse tool (hand-shape). Called whenever the mouse is clicked. To be precise, when the mouse is pressed down onto the object, and released on the same object. Create a button, edit its script, type the example below. Now when you choose the browse tool and click the button, your code will run.</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseUp\n    answer &quot;hello, world.&quot;\nend mouseUp\n\n</code></pre><h2 id=\"mousewithin\">mouseWithin</h2>\n<p>Called repeatedly when the cursor is inside the object. You can use the <code>mouseloc()</code> function to get the position of the cursor. This can be used to create drag/drop effects.</p>\n<p>(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)</p>\n<p>Examples:</p>\n<pre><code>\n\non mouseWithin\n    set the loc of cd btn &quot;follow&quot; to the mouseLoc\nend mouseWithin\n\n</code></pre><h2 id=\"openbackground\">openBackground</h2>\n<p>When you go to a different card, if the card belongs to a different background, the openBackground message will be sent. (You&#39;re leaving one background and going to another).</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a background&#39;s script\non openBackground\n    answer &quot;welcome to this background&quot;\nend openBackground\n\n</code></pre><h2 id=\"opencard\">openCard</h2>\n<p>Message sent upon going to a card.</p>\n<p>Because messages continue up the hierarchy until they are handled, you can also respond to openCard in a stack script.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a card&#39;s script\non openCard\n    answer &quot;welcome to this card&quot;\nend openCard\n\n</code></pre><h2 id=\"openfield\">openField</h2>\n<p>Sent to a field, when text is first selected in it.</p>\n<p>See also: <code>closeField</code> and <code>exitField</code>.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a field&#39;s script\n\non openField\n    -- place default text in the field when you tab over to it...\n    put &quot;abc&quot; into the target\nend openField\n\n</code></pre><h2 id=\"openstack\">openStack</h2>\n<p>Message sent upon first opening the stack.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a stack&#39;s script\non openStack\n    answer &quot;welcome to this card&quot;\nend openStack\n\n\n</code></pre>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_07_compatibility.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - compatibility\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Script Reference - compatibility\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Script Reference - compatibility</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<!---\nthis is a generated file, changes will be lost.\n-->\n\n<p><a href=\"./reference_01_overview.html\">Overview</a> | <a href=\"./reference_02_commands.html\">Commands</a> | <a href=\"./reference_03_syntax.html\">Syntax</a> | <a href=\"./reference_04_properties.html\">Properties</a> | <a href=\"./reference_05_functions.html\">Functions</a> | <a href=\"./reference_06_events.html\">Event Handlers</a> | Compatibility</p>\n<h2 id=\"-compatibility-\">(Compatibility)</h2>\n<p>These are provided for compatibility with HyperCard. They might have hard-coded values/reduced functionality, and are unlikely to be useful in new scripts.</p>\n<p>You can enable compatibility mode for a stack by choosing <code>Object-&gt;Stack info...</code> and clicking <code>Compatibility</code> in the panel on the right. This setting is saved with the stack and makes these changes for compatibility.</p>\n<ul>\n<li>You can say <code>btn 2</code> instead of <code>cd btn 2</code></li>\n<li>You can say <code>put &quot;A&quot; into item 3 of char 2 of x</code> which doesn&#39;t usually make sense</li>\n<li>You can say <code>put &quot;new&quot; into item 4 of line 3 of x</code> and get more intuitive behavior</li>\n<li>Uses HyperCard&#39;s less useful form for <code>long id</code>, <code>owner</code>, and <code>the target</code>.</li>\n</ul>\n<h2 id=\"abbrev-id\">abbrev id</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the abbrev id of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"abbrev-name\">abbrev name</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the abbrev name of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"arrowkey\">arrowKey</h2>\n<p>Sends an <code>arrowKey</code> message. By default, <code>arrowKey left</code> goes to the previous card, and <code>arrowKey right</code> goes to the next card, but this can be overridden in a card script or stack script.</p>\n<h2 id=\"bottom\">bottom</h2>\n<p>Equivalent to the top of the object + the height of the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the bottom of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"botright\">botright</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the botright of cd btn &quot;myBtn&quot; into z\n\n</code></pre><h2 id=\"diskspace-\">diskSpace()</h2>\n<p>(Deprecated and hard-coded).</p>\n<p>Examples:</p>\n<pre><code>\n\nput diskSpace() into x\n\n\n\n</code></pre><h2 id=\"environment\">environment</h2>\n<p>(Deprecated and hard-coded, for backwards compatibility only)</p>\n<p>Examples:</p>\n<pre><code>\n\nput the environment into z\n\n\n\n</code></pre><h2 id=\"errordialog\">errorDialog</h2>\n<p>Causes a runtime error at the current line.</p>\n<p>Examples:</p>\n<pre><code>\n\nerrorDialog &quot;Not a number&quot;\n\n</code></pre><h2 id=\"exp1-x-\">exp1(x)</h2>\n<p>(e to the power of x) minus 1.</p>\n<p>Examples:</p>\n<pre><code>\n\nput exp1(0.5) into x\n\n</code></pre><h2 id=\"freesize\">freesize</h2>\n<p>(Deprecated and hard-coded, for backwards compatibility only)</p>\n<p>Examples:</p>\n<pre><code>\n\nput the freesize of this stack into z\n\n</code></pre><h2 id=\"get\">get</h2>\n<p>Evaluates any expression and saves the result to the variable &quot;it&quot;.</p>\n<p>The &#39;put&#39; command is typically more useful.</p>\n<p>Examples:</p>\n<pre><code>\n\nget 2+3\nput it into x\nanswer x -- shows 5\n\nget the width of cd btn &quot;myBtn&quot;\nput it into x\nanswer x -- shows the width of the specified button\n\n</code></pre><h2 id=\"heapspace-\">heapSpace()</h2>\n<p>(Deprecated and hard-coded).</p>\n<p>Examples:</p>\n<pre><code>\n\nput heapSpace() into x\n\n\n</code></pre><h2 id=\"ln1-x-\">ln1(x)</h2>\n<p>Natural logarithm of (x + 1)</p>\n<p>Examples:</p>\n<pre><code>\n\nput ln1(0.5) into x\n\n</code></pre><h2 id=\"long-name\">long name</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the long name of cd fld &quot;myFld&quot; into z\n\n</code></pre><h2 id=\"mark\">mark</h2>\n<p>Fully functional, might not be useful.</p>\n<p>Sets the &quot;marked&quot; property on a card to true.</p>\n<pre><code>\nmark card id 1234\nmark cards where the name of this card contains &quot;b&quot;\nmark all cards\n</code></pre><p>When cards are marked, you can conveniently reference them:</p>\n<pre><code>\nmarked card 4\nprev marked card\nnext marked card\nfirst marked card\nsecond marked card\nlast marked card\n</code></pre><h2 id=\"marked\">marked</h2>\n<p>You can mark a card.</p>\n<p>Examples:</p>\n<pre><code>\n\nanswer the marked of cd 4\nset the marked of cd 4 to true\n\n</code></pre><h2 id=\"on-errordialog\">on errorDialog</h2>\n<p>(Included for compatibility, unlikely to be useful for writing scripts).</p>\n<p>A few error messages create an errorDialog event. The default response is</p>\n<p>to show a script error at the offending line. If you write your own errorDialog</p>\n<p>handler you can catch these events. However, because nearly all errors do not</p>\n<p>go through errorDialog, this is unlikely to be useful.</p>\n<h2 id=\"right\">right</h2>\n<p>Equivalent to the left of the object + the width of the object.</p>\n<p>Examples:</p>\n<pre><code>\n\nput the right of cd fld &quot;myFld&quot; into z\n\n\n</code></pre><h2 id=\"pop\">pop</h2>\n<p>Functional, but not recommended in new code.</p>\n<p>Examples:</p>\n<pre><code>\n\npush card\ngo to card 7\npop card into x\ngo to card x\n\n</code></pre><h2 id=\"push\">push</h2>\n<p>Functional, but not recommended in new code.</p>\n<p>Examples:</p>\n<pre><code>\n\npush card\ngo to card 7\npop card\n\n\n</code></pre><h2 id=\"size\">size</h2>\n<p>(Deprecated and hard-coded, for backwards compatibility only)</p>\n<p>Examples:</p>\n<pre><code>\n\nput the size of this stack into z\n\n</code></pre><h2 id=\"stacksinuse\">stacksInUse</h2>\n<p>(Deprecated and hard-coded, for backwards compatibility only)</p>\n<p>Examples:</p>\n<pre><code>\n\nput the stacksInUse into z\n\n\n</code></pre><h2 id=\"stackspace-\">stackSpace()</h2>\n<p>(Deprecated and hard-coded).</p>\n<p>Examples:</p>\n<pre><code>\n\nput stackSpace() into x\n\n\n</code></pre><h2 id=\"suspended\">suspended</h2>\n<p>(Deprecated and hard-coded, for backwards compatibility only)</p>\n<p>Examples:</p>\n<pre><code>\n\nput the suspended into z\n\n\n\n</code></pre><h2 id=\"systemversion\">systemVersion</h2>\n<p>(Deprecated and hard-coded).</p>\n<p>To get the current software version, use</p>\n<pre><code>put the version into x</code></pre><p>or</p>\n<pre><code>put the long version into x</code></pre><p>instead.</p>\n<p>Examples:</p>\n<pre><code>\n\nput systemVersion() into x\n\n</code></pre><h2 id=\"trappable-on-arrowkey\">trappable: on arrowKey</h2>\n<p>You can make a custom <code>arrowKey</code> handler that overrides the default one.</p>\n<h2 id=\"trappable-on-domenu\">trappable: on doMenu</h2>\n<p>You can make a custom <code>doMenu</code> handler that overrides the default one.</p>\n<p>Hold the Shift key to bypass a customized <code>doMenu</code>.</p>\n<p>Examples:</p>\n<pre><code>\n\n-- in a card&#39;s script\non doMenu p1, p2\n    if p1 == &quot;New Card&quot; then\n        answer &quot;Making a new card&quot;\n    end if\n    send &quot;doMenu &quot;&amp;quote&amp;p1&amp;quote&amp;&quot;, &quot;&amp;quote&amp;p2&amp;quote to this stack\nend doMenu\n</code></pre><h2 id=\"trappable-on-help\">trappable: on help</h2>\n<p>You can make a custom <code>help</code> handler that overrides the default one. However, the default one won&#39;t really ever be called, since you can&#39;t choose <code>Help</code> from the <code>Go</code> menu in ViperCard.</p>\n<h2 id=\"unmark\">unmark</h2>\n<p>Fully functional, might not be useful.</p>\n<p>Sets the &quot;marked&quot; property on a card to false.</p>\n<p>Examples:</p>\n<pre><code>\n\nunmark card id 1234\nunmark all cards\n\n</code></pre><h2 id=\"version\">version</h2>\n<p>Examples:</p>\n<pre><code>\n\nput the version into z\nput the long version into z\n\n\n</code></pre>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/smalltheme.css",
    "content": "/* \n    smalltheme.css\n    Ben Fisher\n*/\n\n.markdown-body {\n    box-sizing: border-box;\n    min-width: 200px;\n    max-width: 980px;\n    margin: 0 auto;\n    padding: 45px;\n}\n\n@media (max-width: 767px) {\n    .markdown-body {\n        padding: 15px;\n    }\n}\n\nbody {\n    background-color: rgb(255, 255, 255);\n    border-top-color: rgb(0, 0, 0);\n    border-top-style: solid;\n    border-top-width: 5px;\n    box-sizing: border-box;\n    display: block;\n    text-size-adjust: 100%;\n    margin-top: 0;\n    padding-top: 0;\n    margin-bottom: 34px;\n    margin-left: 0;\n    padding-left: 0;\n    margin-right: 0;\n}\n\n.smalltheme-uppernavbox {\n    display: inline-block;\n    vertical-align: top;\n    margin: 0 0 30px;\n    padding: 12px 5px 8px 17px;\n    background-color: rgb(0, 0, 0);\n    box-sizing: border-box;\n    font-size: 0.775rem;\n    line-height: 1.7142857143;\n    font-family: 'source-sans-pro', sans-serif;\n    color: #222;\n}\n\n.smalltheme-textwithinbox {\n    text-decoration: none;\n    color: #fff;\n    border-radius: 4px;\n    margin-bottom: 0;\n    padding: 6px 7px 6px 7px;\n    box-sizing: border-box;\n    text-transform: uppercase;\n    border: 1px solid black;\n}\n\n.smalltheme-uppernavbox a:hover {\n    background-color: rgb(26, 26, 26);\n    border-color: rgb(66, 66, 66);\n    color: #fff;\n}\n\n.smalltheme-uppernavbox a:visited {\n    color: #fff;\n}\n.smalltheme-uppernavbox a:link {\n    color: #fff;\n}\n.smalltheme-uppernavbox a:active {\n    background-color: rgb(26, 26, 26);\n    border-color: rgb(66, 66, 66);\n    color: #fff;\n}\n\ndiv.commentpost {\n}\n\ndiv.commentauthor {\n    font-weight: bold;\n}\n\ndiv.commentcontent {\n}\n\n.linktilebutton {\n    /* Text color */\n    color: #0099cc;\n    /* Remove background color */\n    background: transparent;\n    /* Border thickness, line style, and color */\n    border: 2px solid #0099cc;\n    /* Adds curve to border corners */\n    border-radius: 6px;\n    /* Make letters uppercase */\n    color: white;\n    padding: 10px 17px;\n    text-align: center;\n    display: inline-block;\n    font-size: 14px;\n    margin: 4px 2px;\n    /* -webkit-transition-duration: 0.3s;  Safari \n      transition-duration: 0.3s; */\n    cursor: pointer;\n    text-decoration: none;\n}\n.linktilebutton_wide {\n    /* width:224px; */\n    width: 185px;\n}\n\n.linktilebutton_med {\n    width: 100px;\n}\n\n.linktilebutton_narrow {\n    width: 50px;\n}\n\n.linktilebutton {\n    background-color: white;\n    color: black;\n    border: 2px solid #000202;\n}\n/*button on hover*/\n.linktilebutton:hover {\n    background-color: #000202;\n    color: white;\n}\n.linktilebutton:active {\n    background-color: #000202;\n    color: white;\n}\n.linktilebuttonicon {\n    margin-bottom: 0.2em;\n}\n/* https://medium.freecodecamp.org/a-quick-guide-to-styling-buttons-using-css-f64d4f96337f */\n.linktilebuttonhspace {\n    margin: 0px;\n    padding: 0px;\n}\n\n/* \"DESKTOP\" version, icons are full size */\n.linktilebuttonicon_home {\n    width: 32px;\n    height: 64px;\n}\n.linktilebuttonicon_nothome {\n    width: 64px;\n    height: 64px;\n}\n\n/* \"MOBILE\" version, icons are smaller, and hide some icons */\n@media only screen and (max-width: 600px) {\n    .linktilebuttonicon_home {\n        width: 16px;\n        height: 32px;\n    }\n    .linktilebuttonicon_nothome {\n        width: 32px;\n        height: 32px;\n    }\n    .linktilebutton_left {\n        display: none;\n    }\n    .linktilebutton_middle {\n        display: none;\n    }\n}\n@media only screen and (max-height: 400px) {\n    .linktilebuttonicon_home {\n        width: 16px;\n        height: 32px;\n    }\n    .linktilebuttonicon_nothome {\n        width: 32px;\n        height: 32px;\n    }\n    .linktilebutton_left {\n        display: none;\n    }\n    .linktilebutton_middle {\n        display: none;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/terms.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Terms and Content Policies\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Terms and Content Policies\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Terms and Content Policies</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<div class=\"smalltheme-uppernavbox\"><span class=\"linktilebuttonhspace\"></span><a class=\"smalltheme-textwithinbox\" href=\"/\">vipercard</a><span class=\"smalltheme-textwithinbox\"><span class=\"linktilebuttonhspace\"></span></div>\n<article class=\"markdown-body\">\n\n\n<h4 id=\"terms-and-content-policies\">Terms and Content Policies</h4>\n<p>The following terms and conditions govern all use of the <em>ViperCard</em> website and all content, services and products available at or through the website (taken together, the Website). The Website is owned and operated by <em>ViperCard</em>. 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 <em>ViperCard</em> (collectively, the “Agreement”).</p>\n<p>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 <em>ViperCard</em>, acceptance is expressly limited to these terms.</p>\n<h4 id=\"your-account\">Your Account</h4>\n<p>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 <em>ViperCard</em> may change or remove any description or keyword that it considers inappropriate or unlawful, or otherwise likely to cause <em>ViperCard</em> liability. You must immediately notify <em>ViperCard</em> of any unauthorized uses of your account or any other breaches of security. <em>ViperCard</em> 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.</p>\n<h4 id=\"responsibility-of-contributors\">Responsibility of Contributors</h4>\n<p>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:</p>\n<p>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;</p>\n<ul>\n<li>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;</li>\n<li>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;</li>\n<li>the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content;</li>\n<li>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);</li>\n<li>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</li>\n<li>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 <em>ViperCard</em> or otherwise.</li>\n</ul>\n<p>By submitting Content to <em>ViperCard</em> for inclusion on your Website, you grant <em>ViperCard</em> a world-wide, royalty-free, and non-exclusive license to reproduce and publish the Content. If you delete Content, <em>ViperCard</em> 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.</p>\n<p>Without limiting any of those representations or warranties, <em>ViperCard</em> has the right (though not the obligation) to, in <em>ViperCard</em>’s sole discretion (i) refuse or remove any content that, in <em>ViperCard</em>’s reasonable opinion, violates any <em>ViperCard</em> 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 <em>ViperCard</em>’s sole discretion.</p>\n<h4 id=\"responsibility-of-website-visitors\">Responsibility of Website Visitors</h4>\n<p><em>ViperCard</em> 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, <em>ViperCard</em> 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. <em>ViperCard</em> 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.</p>\n<h4 id=\"content-posted-on-other-websites\">Content Posted on Other Websites</h4>\n<p>We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which <em>ViperCard</em> links, and that link to <em>ViperCard</em>. <em>ViperCard</em> does not have any control over those non-<em>ViperCard</em> websites and webpages, and is not responsible for their contents or their use. By linking to a non-<em>ViperCard</em> website or webpage, <em>ViperCard</em> 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. <em>ViperCard</em> disclaims any responsibility for any harm resulting from your use of non-<em>ViperCard</em> websites and webpages.</p>\n<h4 id=\"disclaimer-of-warranties\">Disclaimer of Warranties</h4>\n<p>The Website is provided “as is”. <em>ViperCard</em> 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 <em>ViperCard</em> 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.</p>\n<h4 id=\"copyright-infringement-and-dmca-policy\">Copyright Infringement and DMCA Policy</h4>\n<p>As <em>ViperCard</em> 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 <em>ViperCard</em> violates your copyright, you are encouraged to notify <em>ViperCard</em> in accordance with <em>ViperCard</em>’s Digital Millennium Copyright Act (”DMCA”) Policy. <em>ViperCard</em> 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 <em>ViperCard</em> or others, <em>ViperCard</em> may, in its discretion, terminate or deny access to and use of the Website. In the case of such termination, <em>ViperCard</em> will have no obligation to provide a refund of any amounts previously paid to <em>ViperCard</em>.</p>\n<h4 id=\"intellectual-property\">Intellectual Property</h4>\n<p>This Agreement does not transfer from <em>ViperCard</em> to you any <em>ViperCard</em> or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with <em>ViperCard</em>.</p>\n<h4 id=\"changes\">Changes</h4>\n<p><em>ViperCard</em> 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. <em>ViperCard</em> 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.</p>\n<h4 id=\"termination\">Termination</h4>\n<p><em>ViperCard</em> 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 <em>ViperCard</em> if you materially breach this Agreement and fail to cure such breach within thirty (30) days from <em>ViperCard</em>’s notice to you thereof; provided that, <em>ViperCard</em> 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.</p>\n<h4 id=\"limitation-of-liability\">Limitation of Liability</h4>\n<p>In no event will <em>ViperCard</em>, 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 <em>ViperCard</em> under this agreement during the twelve (12) month period prior to the date the cause of the action accrues. <em>ViperCard</em> 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.</p>\n<h4 id=\"general-representation-and-warranty\">General Representation and Warranty</h4>\n<p>You represent and warrant that (i) your use of the Website will be in strict accordance with the <em>ViperCard</em> 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.</p>\n<h4 id=\"indemnification\">Indemnification</h4>\n<p>You agree to indemnify and hold harmless <em>ViperCard</em>, 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.</p>\n<h4 id=\"miscellaneous\">Miscellaneous</h4>\n<p>This Agreement constitutes the entire agreement between <em>ViperCard</em> and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of <em>ViperCard</em>, or by the posting by <em>ViperCard</em> 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.</p>\n<p>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; <em>ViperCard</em> 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.</p>\n<p>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.</p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Tutorial Videos</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<iframe width=\"450\" height=\"240\" src=\"https://www.youtube.com/embed/9Jyh-EXsH4w?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video1.html\" style=\"color:black;\">Demo 1: make an animated GIF</a></h3>\n<h3><a href=\"video2.html\" style=\"color:black;\">Demo 2: make a game</a></h3>\n<h3><a href=\"video3.html\" style=\"color:black;\">Demo 3: make interactive art</a></h3>\n\n\n<h3><a href=\"/\" style=\"color:black;text-decoration:none\">Home</a></h3>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video1.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making a GIF\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making a GIF\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Tutorial Videos - Making a GIF</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/gF4KI_4mFY0?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video2.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making a game\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making a game\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Tutorial Videos - Making a game</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/VYnXucRurY0?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video3.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making interactive art\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Tutorial Videos - Making interactive art\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Tutorial Videos - Making interactive art</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/oCaGCMDwZPc?rel=0&autoplay=1\" style=\"border:0px\" allowfullscreen=\"true\"></iframe>\n\n<h3><a href=\"video.html\" style=\"color:black;text-decoration:none\">Back</a></h3>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/html/why.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"description\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Rationale\">\n<meta name=\"keywords\" content=\"ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh, ViperCard - Rationale\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"Projects\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources/intro/desc.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net/\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n<meta name=\"HandheldFriendly\" content=\"True\">\n\n\n\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimal-ui\">\n\t\t<title>ViperCard - Rationale</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" href=\"./script_reference/github-markdown.css\">\n<link rel=\"stylesheet\" href=\"./script_reference/smalltheme.css\">\n</head>\n<body>\n\n<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>\n<article class=\"markdown-body\">\n\n\n<h1 id=\"why\">Why</h1>\n<p>ViperCard is a fun project for creating games and animations, but it also makes me reflect on the process of writing software.</p>\n<p>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&#39;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&#39;re not yet in the right place.</p>\n<p>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.</p>\n<p>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&#39;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.</p>\n<p>I&#39;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.</p>\n<p>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.</p>\n<p>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).</p>\n<h1 id=\"still-in-progress\">Still in progress</h1>\n<ul>\n<li><p>ViperCard is currently not compatible with screen readers and accessibility tools.</p>\n</li>\n<li><p>ViperCard is currently not compatible with mobile or tablet, despite the importance of these platforms.</p>\n</li>\n<li><p>ViperCard is still in development and some features are not yet complete. For example: HyperCard&#39;s visual effect command and show all cards command.</p>\n</li>\n</ul>\n<p>ViperCard is released under the GNU Public License. See <a href=\"https://github.com/moltenform/vipercard\">https://github.com/moltenform/vipercard</a> for more information.</p>\n</article>\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/index.dev.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; script-src 'self' 'sha256-ALkdxhiBsSK0a+pHzbfOFLVCELwQ+VUp/9xwPRk2+Uw=' www.googletagmanager.com www.google-analytics.com https://www.google-analytics.com https://ssl.google-analytics.com; connect-src 'self' www.googletagmanager.com www.google-analytics.com https://www.google-analytics.com; img-src 'self' www.google-analytics.com https://www.google-analytics.com; font-src 'self'; style-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'none'; worker-src 'self'; frame-src 'self' donorbox.org\">\n        <link rel=\"canonical\" href=\"https://www.vipercard.net/0.3/\">\n        <title>ViperCard</title>\n        <script>\n            window.setTimeout(function() {\n                var open = document.getElementById('idOpeningMsg');\n                if (open) {\n                    open.style.display = 'block';\n                }\n            }, 500);\n\n            window.onload = function() {\n                var makeNewGolly = function(param) { return new GOLLY(param); }\n                if (!window.mainVPCStartCanvas) {\n                    alert('Could not start ViperCard. This is usually caused by module loading errors.');\n                } else {\n                    window.mainVPCStartCanvas(makeNewGolly);\n                }\n            }\n\n            window.dataLayer = window.dataLayer || [];\n            function gtag(){dataLayer.push(arguments);}\n            gtag('js', new Date());\n            gtag('config', 'UA-115931349-1');\n        </script>\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"/0.3/style.css\">\n    </head>\n    <body>\n    <img src=\"/resources03a/images/opening.png\" id=\"idOpeningMsg\" />\n    <audio class=\"notvisible\" autoplay=\"true\" volume=\"0.9\" preload=\"auto\" id=\"vpcinitialaudio\" >\n        <source src=\"/resources03a/sound/sound.m4a\" type=\"audio/mp4\" autoplay=\"true\" volume=\"0.9\" preload=\"auto\">\n        <source src=\"/resources03a/sound/sound.ogg\" type=\"audio/ogg\" autoplay=\"true\" volume=\"0.9\" preload=\"auto\">\n    </audio>\n    <p class=\"messageBelow\" id=\"elemMessageBelow\"></p>\n    <link rel=\"preload\" href=\"/resources03a/images/0cursors1.png\" as=\"image\" />\n    <link rel=\"preload\" href=\"/resources03a/images/logo.png\" as=\"image\" />\n    <link rel=\"preload\" href=\"/resources03a/images/000.png\" as=\"image\" />\n    <link rel=\"preload\" href=\"/resources03a/fonts/00_12_biuosdce.png\" as=\"image\" />\n    <link rel=\"preload\" href=\"/resources03a/fonts/00_12_biuosdce.json\" as=\"fetch\" crossorigin />\n    <script src=\"/external/externalmanualbundlebig.js\"></script>\n    <!-- scripts will be added here -->\n    </body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/0.3/style.css",
    "content": "\ncanvas {\n    image-rendering: optimizeSpeed;\n    image-rendering: -moz-crisp-edges;\n    image-rendering: -webkit-optimize-contrast;\n    image-rendering: -o-crisp-edges;\n    image-rendering: pixelated;\n    -ms-interpolation-mode: nearest-neighbor;\n    margin: 0px;\n    border: 0px solid black;\n    padding: 0px;\n}\n\n.messageBelow {\n    color: white;\n    font-family: sans-serif;\n    font-size: 60%;\n    margin-left: 90px;\n    margin-top: 200px;\n}\n\nbody {\n    /* we never want a scrollbar on this page */\n    position: fixed;\n    background-color: rgb(0, 0, 0);\n}\n\n.notvisible {\n    display: none;\n}\n\n#idOpeningMsg {\n    /* we'll wait a bit before showing it */\n    display: none;\n    position: fixed;\n    top: 0px;\n    left: 0px;\n    z-index: -999;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -o-user-select: none;\n    user-select: none;\n}\n"
  },
  {
    "path": "vipercard/vipercard/BingSiteAuth.xml",
    "content": "<?xml version=\"1.0\"?>\n<users>\n\t<user>8A1E5D2B537BBA3E6ADDC00E6B7B2E7C</user>\n</users>"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [2.0.2] - 2019-05-14\n\n- Catching an exception on Send (HEAD) ([#534])\n\n## [2.0.0] - 2018-10-17\n\n- Removed eval to resolve CSP ([#465])\n\n## [2.0.0-rc.4] - 2018-10-17\n\n- Don’t throw on module.exports\n\n## [2.0.0-rc.3] - 2018-09-27\n\n- Switch export method\n\n## [2.0.0-rc.2] - 2018-09-26\n\n- Added a changelog.md\n- Reverted `a.click()` to use dispatch with a try-catch ([#465], [#382])\n- Made third argument to an object where you have to pass `{ autoBom: true }`\n  - boolean are depricated but still works\n\n## [2.0.0-rc.1] - 2018-09-26\n\n- saveAs don't return anything\n  - The object that dispatched `writestart progress write writeend` are gone\n  - detecting such features was never possible and nobody seems to use it.\n- Removed the demo folder\n- Removed date/version from top of the file\n- Dosen't crash in web workers ([#449])\n- Support saving urls ([#260] with workarounds for cross origin)\n- Uses babel universal module pattern (UMD) to export the package\n- Provides source map now as well.\n- use a[download] before msSaveAs ([#193], [#294])\n- removed dist from .gitignore (npm uses it if it don't find a .npmignore)\n- autoBom is now reversed so you have to tell when you want to use autoBom ([#432])\n- `a.click()` since there are new and depricated event constructors that works differently ([#382])\n- opens up a new popup (tab) directly for the fallback method since the FileReader is async\n- removed the explicitly MSIE [1-9] check\n- Uses new anchor link for each save (might solve multiple download problems)\n\n  [#382]: https://github.com/eligrey/FileSaver.js/issues/382\n  [#449]: https://github.com/eligrey/FileSaver.js/issues/449\n  [#260]: https://github.com/eligrey/FileSaver.js/issues/260\n  [#193]: https://github.com/eligrey/FileSaver.js/issues/193\n  [#294]: https://github.com/eligrey/FileSaver.js/issues/294\n  [#432]: https://github.com/eligrey/FileSaver.js/issues/432\n  [#382]: https://github.com/eligrey/FileSaver.js/issues/382\n  [#465]: https://github.com/eligrey/FileSaver.js/issues/465\n  [#469]: https://github.com/eligrey/FileSaver.js/issues/469\n  [#470]: https://github.com/eligrey/FileSaver.js/issues/470\n  [#491]: https://github.com/eligrey/FileSaver.js/issues/491\n  [#534]: https://github.com/eligrey/FileSaver.js/issues/534\n"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.d.ts",
    "content": "// Type definitions for FileSaver.js\n// Project: https://github.com/eligrey/FileSaver.js/\n// Definitions by: Cyril Schumacher <https://github.com/cyrilschumacher>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n/**\n * @summary Interface for \"saveAs\" function.\n * @author  Cyril Schumacher\n * @version 1.0\n */\nexport interface FileSaver {\n    (\n        /**\n         * @summary Data.\n         * @type {Blob}\n         */\n        data: Blob,\n\n        /**\n         * @summary File name.\n         * @type {DOMString}\n         */\n  filename: string,\n\n  /**\n   * @summary Disable Unicode text encoding hints or not.\n   * @type {boolean}\n   */\n  disableAutoBOM?: boolean\n    ): void\n}\n\n\n"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.js",
    "content": "(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory();\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory();\n    global.FileSaver = mod.exports;\n  }\n})(this, function () {\n  \"use strict\";\n\n  /*\n  * FileSaver.js\n  * A saveAs() FileSaver implementation.\n  *\n  * By Eli Grey, http://eligrey.com\n  *\n  * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n  * source  : http://purl.eligrey.com/github/FileSaver.js\n  */\n  // The one and only way of getting global scope in all environments\n  // https://stackoverflow.com/q/3277182/1008999\n  var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0;\n\n  function bom(blob, opts) {\n    if (typeof opts === 'undefined') opts = {\n      autoBom: false\n    };else if (typeof opts !== 'object') {\n      console.warn('Deprecated: Expected third argument to be a object');\n      opts = {\n        autoBom: !opts\n      };\n    } // prepend BOM for UTF-8 XML and text/* types (including HTML)\n    // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n\n    if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n      return new Blob([String.fromCharCode(0xFEFF), blob], {\n        type: blob.type\n      });\n    }\n\n    return blob;\n  }\n\n  function download(url, name, opts) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url);\n    xhr.responseType = 'blob';\n\n    xhr.onload = function () {\n      saveAs(xhr.response, name, opts);\n    };\n\n    xhr.onerror = function () {\n      console.error('could not download file');\n    };\n\n    xhr.send();\n  }\n\n  function corsEnabled(url) {\n    var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker\n\n    xhr.open('HEAD', url, false);\n\n    try {\n      xhr.send();\n    } catch (e) {}\n\n    return xhr.status >= 200 && xhr.status <= 299;\n  } // `a.click()` doesn't work for all browsers (#465)\n\n\n  function click(node) {\n    try {\n      node.dispatchEvent(new MouseEvent('click'));\n    } catch (e) {\n      var evt = document.createEvent('MouseEvents');\n      evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\n      node.dispatchEvent(evt);\n    }\n  }\n\n  var saveAs = _global.saveAs || ( // probably in some web worker\n  typeof window !== 'object' || window !== _global ? function saveAs() {}\n  /* noop */\n  // Use download attribute first if possible (#193 Lumia mobile)\n  : 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL;\n    var a = document.createElement('a');\n    name = name || blob.name || 'download';\n    a.download = name;\n    a.rel = 'noopener'; // tabnabbing\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob;\n\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank');\n      } else {\n        click(a);\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob);\n      setTimeout(function () {\n        URL.revokeObjectURL(a.href);\n      }, 4E4); // 40s\n\n      setTimeout(function () {\n        click(a);\n      }, 0);\n    }\n  } // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) {\n    name = name || blob.name || 'download';\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts);\n      } else {\n        var a = document.createElement('a');\n        a.href = blob;\n        a.target = '_blank';\n        setTimeout(function () {\n          click(a);\n        });\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name);\n    }\n  } // Fallback to using FileReader and a popup\n  : function saveAs(blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank');\n\n    if (popup) {\n      popup.document.title = popup.document.body.innerText = 'downloading...';\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts);\n    var force = blob.type === 'application/octet-stream';\n\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari;\n\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n\n    if ((isChromeIOS || force && isSafari) && typeof FileReader === 'object') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader();\n\n      reader.onloadend = function () {\n        var url = reader.result;\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\n        if (popup) popup.location.href = url;else location = url;\n        popup = null; // reverse-tabnabbing #460\n      };\n\n      reader.readAsDataURL(blob);\n    } else {\n      var URL = _global.URL || _global.webkitURL;\n      var url = URL.createObjectURL(blob);\n      if (popup) popup.location = url;else location.href = url;\n      popup = null; // reverse-tabnabbing #460\n\n      setTimeout(function () {\n        URL.revokeObjectURL(url);\n      }, 4E4); // 40s\n    }\n  });\n  _global.saveAs = saveAs.saveAs = saveAs;\n\n  if (typeof module !== 'undefined') {\n    module.exports = saveAs;\n  }\n});\n"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/LICENSE.md",
    "content": "The MIT License\n\nCopyright © 2016 [Eli Grey][1].\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n  [1]: http://eligrey.com\n"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/README.md",
    "content": "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 at the more advanced [StreamSaver.js][7]\nthat can save data directly to the hard drive asynchronously with the power of the new streams API. That will have\nsupport for progress, cancelation and knowing when it's done writing\n\nFileSaver.js\n============\n\nFileSaver.js is the solution to saving files on the client-side, and is perfect for\nweb apps that generates files on the client, However if the file is coming from the\nserver we recommend you to first try to use [Content-Disposition][8] attachment response header as it has more cross-browser compatiblity.\n\nLooking for `canvas.toBlob()` for saving canvases? Check out\n[canvas-toBlob.js][2] for a cross-browser implementation.\n\nSupported Browsers\n------------------\n\n| Browser        | Constructs as | Filenames    | Max Blob Size | Dependencies |\n| -------------- | ------------- | ------------ | ------------- | ------------ |\n| Firefox 20+    | Blob          | Yes          | 800 MiB       | None         |\n| Firefox < 20   | data: URI     | No           | n/a           | [Blob.js](https://github.com/eligrey/Blob.js) |\n| Chrome         | Blob          | Yes          | [2GB][3]      | None         |\n| Chrome for Android | Blob      | Yes          | [RAM/5][3]    | None         |\n| Edge           | Blob          | Yes          | ?             | None         |\n| IE 10+         | Blob          | Yes          | 600 MiB       | None         |\n| Opera 15+      | Blob          | Yes          | 500 MiB       | None         |\n| Opera < 15     | data: URI     | No           | n/a           | [Blob.js](https://github.com/eligrey/Blob.js) |\n| Safari 6.1+*   | Blob          | No           | ?             | None         |\n| Safari < 6     | data: URI     | No           | n/a           | [Blob.js](https://github.com/eligrey/Blob.js) |\n| Safari 10.1+   | Blob          | Yes          | n/a           | None         |\n\nFeature detection is possible:\n\n```js\ntry {\n    var isFileSaverSupported = !!new Blob;\n} catch (e) {}\n```\n\n### IE < 10\n\nIt is possible to save text files in IE < 10 without Flash-based polyfills.\nSee [ChenWenBrian and koffsyrup's `saveTextAs()`](https://github.com/koffsyrup/FileSaver.js#examples) for more details.\n\n### Safari 6.1+\n\nBlobs may be opened instead of saved sometimes—you may have to direct your Safari users to manually\npress <kbd>⌘</kbd>+<kbd>S</kbd> to save the file after it is opened. Using the `application/octet-stream` MIME type to force downloads [can cause issues in Safari](https://github.com/eligrey/FileSaver.js/issues/12#issuecomment-47247096).\n\n### iOS\n\nsaveAs must be run within a user interaction event such as onTouchDown or onClick; setTimeout will prevent saveAs from triggering. Due to restrictions in iOS saveAs opens in a new window instead of downloading, if you want this fixed please [tell Apple how this WebKit bug is affecting you](https://bugs.webkit.org/show_bug.cgi?id=167341).\n\nSyntax\n------\n### Import `saveAs()` from file-saver\n```js\nimport { saveAs } from 'file-saver';\n```\n\n```js\nFileSaver saveAs(Blob/File/Url, optional DOMString filename, optional Object { autoBom })\n```\n\nPass `{ autoBom: true }` if you want FileSaver.js to automatically provide Unicode text encoding hints (see: [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)). Note that this is only done if your blob type has `charset=utf-8` set.\n\nExamples\n--------\n\n### Saving text using `require()`\n```js\nvar FileSaver = require('file-saver');\nvar blob = new Blob([\"Hello, world!\"], {type: \"text/plain;charset=utf-8\"});\nFileSaver.saveAs(blob, \"hello world.txt\");\n```\n\n### Saving text\n\n```js\nvar blob = new Blob([\"Hello, world!\"], {type: \"text/plain;charset=utf-8\"});\nFileSaver.saveAs(blob, \"hello world.txt\");\n```\n\n### Saving URLs\n\n```js\nFileSaver.saveAs(\"https://httpbin.org/image\", \"image.jpg\");\n```\nUsing URLs within the same origin will just use `a[download]`.\nOtherwise, it will first check if it supports cors header with a synchronous head request.\nIf it does, it will download the data and save using blob URLs. \nIf not, it will try to download it using `a[download]`.\n\nThe standard W3C File API [`Blob`][4] interface is not available in all browsers.\n[Blob.js][5] is a cross-browser `Blob` implementation that solves this.\n\n### Saving a canvas\n```js\nvar canvas = document.getElementById(\"my-canvas\");\ncanvas.toBlob(function(blob) {\n    saveAs(blob, \"pretty image.png\");\n});\n```\n\nNote: The standard HTML5 `canvas.toBlob()` method is not available in all browsers.\n[canvas-toBlob.js][6] is a cross-browser `canvas.toBlob()` that polyfills this.\n\n### Saving File\n\nYou can save a File constructor without specifying a filename. If the\nfile itself already contains a name, there is a hand full of ways to get a file\ninstance (from storage, file input, new constructor, clipboard event). \nIf you still want to change the name, then you can change it in the 2nd argument.\n\n```js\n// Note: Ie and Edge don't support the new File constructor,\n// so it's better to construct blobs and use saveAs(blob, filename)\nvar file = new File([\"Hello, world!\"], \"hello world.txt\", {type: \"text/plain;charset=utf-8\"});\nFileSaver.saveAs(file);\n```\n\n\n\n![Tracking image](https://in.getclicky.com/212712ns.gif)\n\n  [1]: http://eligrey.com/demos/FileSaver.js/\n  [2]: https://github.com/eligrey/canvas-toBlob.js\n  [3]: https://bugs.chromium.org/p/chromium/issues/detail?id=375297#c107\n  [4]: https://developer.mozilla.org/en-US/docs/DOM/Blob\n  [5]: https://github.com/eligrey/Blob.js\n  [6]: https://github.com/eligrey/canvas-toBlob.js\n  [7]: https://github.com/jimmywarting/StreamSaver.js\n  [8]: https://github.com/eligrey/FileSaver.js/wiki/Saving-a-remote-file#using-http-header\n\nInstallation\n------------------\n\n```bash\n# Basic Node.JS installation\nnpm install file-saver --save\nbower install file-saver\n```\n\nAdditionally, TypeScript definitions can be installed via:\n\n```bash\n# Additional typescript definitions\nnpm install @types/file-saver --save-dev\n```\n"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Jameson Little\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/README.md",
    "content": "base64-js\n=========\n\n`base64-js` does basic base64 encoding/decoding in pure JS.\n\n[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js)\n\nMany browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.\n\nSometimes encoding/decoding binary data in the browser is useful, and that is what this module does.\n\n## install\n\nWith [npm](https://npmjs.org) do:\n\n`npm install base64-js` and `var base64js = require('base64-js')`\n\nFor use in web browsers do:\n\n`<script src=\"base64js.min.js\"></script>`\n\n## methods\n\n`base64js` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument.\n\n* `byteLength` - Takes a base64 string and returns length of byte array\n* `toByteArray` - Takes a base64 string and returns a byte array\n* `fromByteArray` - Takes a byte array and returns a base64 string\n\n## license\n\nMIT\n"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/base64js.js",
    "content": "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/LICENSE",
    "content": "Copyright 2015, Dustin Diaz (the \"Original Author\")\nAll rights reserved.\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nDistributions of all or part of the Software intended to be used\nby the recipients as they would use the unmodified Software,\ncontaining modifications that substantially alter, remove, or\ndisable functionality of the Software, outside of the documented\nconfiguration mechanisms provided by the Software, shall be\nmodified such that the Original Author's bug reporting email\naddresses and urls are either replaced with the contact information\nof the parties responsible for the changes, or removed entirely.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\nExcept where noted, this license applies to any and all software\nprograms and associated documentation files created by the\nOriginal Author, when distributed with the Software.\n"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/README.md",
    "content": "## Bowser\nA small, fast and rich-API browser/platform/engine detector for both browser and node.\n- **Small.** Use plain ES5-version which is ~4.8kB gzipped.\n- **Optimized.** Use only those parsers you need — it doesn't do useless work.\n- **Multi-platform.** It's browser- and node-ready, so you can use it in any environment.\n\nDon't hesitate to support the project on Github or [OpenCollective](https://opencollective.com/bowser) if you like it ❤️ Also, contributors are always welcome!\n\n[![Financial Contributors on Open Collective](https://opencollective.com/bowser/all/badge.svg?label=financial+contributors)](https://opencollective.com/bowser) [![Build Status](https://travis-ci.org/lancedikson/bowser.svg?branch=master)](https://travis-ci.org/lancedikson/bowser/)  [![Greenkeeper badge](https://badges.greenkeeper.io/lancedikson/bowser.svg)](https://greenkeeper.io/)  [![Coverage Status](https://coveralls.io/repos/github/lancedikson/bowser/badge.svg?branch=master)](https://coveralls.io/github/lancedikson/bowser?branch=master) ![Downloads](https://img.shields.io/npm/dm/bowser)\n\n# Contents\n- [Overview](#overview)\n- [Use cases](#use-cases)\n- [Advanced usage](#advanced-usage)\n- [How can I help?](#contributing)\n\n# Overview\n\nThe library is made to help to detect what browser your user has and gives you a convenient API to filter the users somehow depending on their browsers.\n\n### ⚠️ Version 2.0 breaking changes ⚠️\n\nVersion 2.0 has drastically changed the API. All available methods are on the [docs page](https://lancedikson.github.io/bowser/docs).\n\n_For legacy code, check out the [1.x](https://github.com/lancedikson/bowser/tree/v1.x) branch and install it through `npm install bowser@1.9.4`._\n\n# Use cases\n\nFirst of all, require the library. This is a UMD Module, so it will work for AMD, TypeScript, ES6, and CommonJS module systems.\n\n```javascript\nconst Bowser = require(\"bowser\"); // CommonJS\n\nimport * as Bowser from \"bowser\"; // TypeScript\n\nimport Bowser from \"bowser\"; // ES6 (and TypeScript with --esModuleInterop enabled)\n```\n\nBy default, the exported version is the *ES5 transpiled version*, which **do not** include any polyfills.\n\nIn case you don't use your own `babel-polyfill` you may need to have pre-built bundle with all needed polyfills.\nSo, for you it's suitable to require bowser like this: `require('bowser/bundled')`.\nAs the result, you get a ES5 version of bowser with `babel-polyfill` bundled together.\n\nYou may need to use the source files, so they will be available in the package as well.\n\n## Browser props detection\n\nOften we need to pick users' browser properties such as the name, the version, the rendering engine and so on. Here is an example how to do it with Bowser:\n\n```javascript\nconst browser = Bowser.getParser(window.navigator.userAgent);\n\nconsole.log(`The current browser name is \"${browser.getBrowserName()}\"`);\n// The current browser name is \"Internet Explorer\"\n```\n\nor\n\n```javascript\nconst browser = Bowser.getParser(window.navigator.userAgent);\nconsole.log(browser.getBrowser());\n\n// outputs\n{\n  name: \"Internet Explorer\"\n  version: \"11.0\"\n}\n```\n\nor\n\n```javascript\nconsole.log(Bowser.parse(window.navigator.userAgent));\n\n// outputs\n{\n  browser: {\n    name: \"Internet Explorer\"\n    version: \"11.0\"\n  },\n  os: {\n    name: \"Windows\"\n    version: \"NT 6.3\"\n    versionName: \"8.1\"\n  },\n  platform: {\n    type: \"desktop\"\n  },\n  engine: {\n    name: \"Trident\"\n    version: \"7.0\"\n  }\n}\n```\n\n\n## Filtering browsers\n\nYou could want to filter some particular browsers to provide any special support for them or make any workarounds.\nIt could look like this:\n\n```javascript\nconst browser = Bowser.getParser(window.navigator.userAgent);\nconst isValidBrowser = browser.satisfies({\n  // declare browsers per OS\n  windows: {\n    \"internet explorer\": \">10\",\n  },\n  macos: {\n    safari: \">10.1\"\n  },\n\n  // per platform (mobile, desktop or tablet)\n  mobile: {\n    safari: '>=9',\n    'android browser': '>3.10'\n  },\n\n  // or in general\n  chrome: \"~20.1.1432\",\n  firefox: \">31\",\n  opera: \">=22\",\n\n  // also supports equality operator\n  chrome: \"=20.1.1432\", // will match particular build only\n\n  // and loose-equality operator\n  chrome: \"~20\",        // will match any 20.* sub-version\n  chrome: \"~20.1\"       // will match any 20.1.* sub-version (20.1.19 as well as 20.1.12.42-alpha.1)\n});\n```\n\nSettings for any particular OS or platform has more priority and redefines settings of standalone browsers.\nThus, you can define OS or platform specific rules and they will have more priority in the end.\n\nMore of API and possibilities you will find in the `docs` folder.\n\n### Browser names for `.satisfies()`\n\nBy default you are supposed to use the full browser name for `.satisfies`.\nBut, there's a short way to define a browser using short aliases. The full\nlist of aliases can be found in [the file](src/constants.js).\n\n## Similar Projects\n* [Kong](https://github.com/BigBadBleuCheese/Kong) - A C# port of Bowser.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/lancedikson/bowser/graphs/contributors\"><img src=\"https://opencollective.com/bowser/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/bowser/contribute)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/bowser\"><img src=\"https://opencollective.com/bowser/individuals.svg?width=890\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/bowser/contribute)]\n\n<a href=\"https://opencollective.com/bowser/organization/0/website\"><img src=\"https://opencollective.com/bowser/organization/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/1/website\"><img src=\"https://opencollective.com/bowser/organization/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/2/website\"><img src=\"https://opencollective.com/bowser/organization/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/3/website\"><img src=\"https://opencollective.com/bowser/organization/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/4/website\"><img src=\"https://opencollective.com/bowser/organization/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/5/website\"><img src=\"https://opencollective.com/bowser/organization/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/6/website\"><img src=\"https://opencollective.com/bowser/organization/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/7/website\"><img src=\"https://opencollective.com/bowser/organization/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/8/website\"><img src=\"https://opencollective.com/bowser/organization/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/bowser/organization/9/website\"><img src=\"https://opencollective.com/bowser/organization/9/avatar.svg\"></a>\n\n## License\nLicensed as MIT. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.\n"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/bowser-2.9-bundled.js",
    "content": "!function(t,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define([],n):\"object\"==typeof exports?exports.bowser=n():t.bowser=n()}(this,(function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&n&&\"string\"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p=\"\",e(e.s=129)}([function(t,n,e){var r=e(1),i=e(7),o=e(14),u=e(11),a=e(19),c=function(t,n,e){var s,f,l,h,d=t&c.F,p=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,m=p?r:v?r[n]||(r[n]={}):(r[n]||{}).prototype,b=p?i:i[n]||(i[n]={}),S=b.prototype||(b.prototype={});for(s in p&&(e=n),e)l=((f=!d&&m&&void 0!==m[s])?m:e)[s],h=y&&f?a(l,r):g&&\"function\"==typeof l?a(Function.call,l):l,m&&u(m,s,l,t&c.U),b[s]!=l&&o(b,s,h),g&&S[s]!=l&&(S[s]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(4);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){var r=e(50)(\"wks\"),i=e(31),o=e(1).Symbol,u=\"function\"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)(\"Symbol.\"+t))}).store=r},function(t,n,e){var r=e(21),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n,e){t.exports=!e(2)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),i=e(96),o=e(28),u=Object.defineProperty;n.f=e(8)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(26);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(1),i=e(14),o=e(13),u=e(31)(\"src\"),a=e(134),c=(\"\"+a).split(\"toString\");e(7).inspectSource=function(t){return a.call(t)},(t.exports=function(t,n,e,a){var s=\"function\"==typeof e;s&&(o(e,\"name\")||i(e,\"name\",n)),t[n]!==e&&(s&&(o(e,u)||i(e,u,t[n]?\"\"+t[n]:c.join(String(n)))),t===r?t[n]=e:a?t[n]?t[n]=e:i(t,n,e):(delete t[n],i(t,n,e)))})(Function.prototype,\"toString\",(function(){return\"function\"==typeof this&&this[u]||a.call(this)}))},function(t,n,e){var r=e(0),i=e(2),o=e(26),u=/\"/g,a=function(t,n,e,r){var i=String(o(t)),a=\"<\"+n;return\"\"!==e&&(a+=\" \"+e+'=\"'+String(r).replace(u,\"&quot;\")+'\"'),a+\">\"+i+\"</\"+n+\">\"};t.exports=function(t,n){var e={};e[t]=n(a),r(r.P+r.F*i((function(){var n=\"\"[t]('\"');return n!==n.toLowerCase()||n.split('\"').length>3})),\"String\",e)}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(9),i=e(30);t.exports=e(8)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(46),i=e(26);t.exports=function(t){return r(i(t))}},function(t,n,e){\"use strict\";var r=e(2);t.exports=function(t,n){return!!t&&r((function(){n?t.call(null,(function(){}),1):t.call(null)}))}},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=e(18),i=function(){function t(){}return t.getFirstMatch=function(t,n){var e=n.match(t);return e&&e.length>0&&e[1]||\"\"},t.getSecondMatch=function(t,n){var e=n.match(t);return e&&e.length>1&&e[2]||\"\"},t.matchAndReturnConst=function(t,n,e){if(t.test(n))return e},t.getWindowsVersionName=function(t){switch(t){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},t.getMacOSVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),10===n[0])switch(n[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},t.getAndroidVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),!(1===n[0]&&n[1]<5))return 1===n[0]&&n[1]<6?\"Cupcake\":1===n[0]&&n[1]>=6?\"Donut\":2===n[0]&&n[1]<2?\"Eclair\":2===n[0]&&2===n[1]?\"Froyo\":2===n[0]&&n[1]>2?\"Gingerbread\":3===n[0]?\"Honeycomb\":4===n[0]&&n[1]<1?\"Ice Cream Sandwich\":4===n[0]&&n[1]<4?\"Jelly Bean\":4===n[0]&&n[1]>=4?\"KitKat\":5===n[0]?\"Lollipop\":6===n[0]?\"Marshmallow\":7===n[0]?\"Nougat\":8===n[0]?\"Oreo\":9===n[0]?\"Pie\":void 0},t.getVersionPrecision=function(t){return t.split(\".\").length},t.compareVersions=function(n,e,r){void 0===r&&(r=!1);var i=t.getVersionPrecision(n),o=t.getVersionPrecision(e),u=Math.max(i,o),a=0,c=t.map([n,e],(function(n){var e=u-t.getVersionPrecision(n),r=n+new Array(e+1).join(\".0\");return t.map(r.split(\".\"),(function(t){return new Array(20-t.length).join(\"0\")+t})).reverse()}));for(r&&(a=u-Math.min(i,o)),u-=1;u>=a;){if(c[0][u]>c[1][u])return 1;if(c[0][u]===c[1][u]){if(u===a)return 0;u-=1}else if(c[0][u]<c[1][u])return-1}},t.map=function(t,n){var e,r=[];if(Array.prototype.map)return Array.prototype.map.call(t,n);for(e=0;e<t.length;e+=1)r.push(n(t[e]));return r},t.find=function(t,n){var e,r;if(Array.prototype.find)return Array.prototype.find.call(t,n);for(e=0,r=t.length;e<r;e+=1){var i=t[e];if(n(i,e))return i}},t.assign=function(t){for(var n,e,r=t,i=arguments.length,o=new Array(i>1?i-1:0),u=1;u<i;u++)o[u-1]=arguments[u];if(Object.assign)return Object.assign.apply(Object,[t].concat(o));var a=function(){var t=o[n];\"object\"==typeof t&&null!==t&&Object.keys(t).forEach((function(n){r[n]=t[n]}))};for(n=0,e=o.length;n<e;n+=1)a();return t},t.getBrowserAlias=function(t){return r.BROWSER_ALIASES_MAP[t]},t.getBrowserTypeByAlias=function(t){return r.BROWSER_MAP[t]||\"\"},t}();n.default=i,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.ENGINE_MAP=n.OS_MAP=n.PLATFORMS_MAP=n.BROWSER_MAP=n.BROWSER_ALIASES_MAP=void 0;n.BROWSER_ALIASES_MAP={\"Amazon Silk\":\"amazon_silk\",\"Android Browser\":\"android\",Bada:\"bada\",BlackBerry:\"blackberry\",Chrome:\"chrome\",Chromium:\"chromium\",Electron:\"electron\",Epiphany:\"epiphany\",Firefox:\"firefox\",Focus:\"focus\",Generic:\"generic\",\"Google Search\":\"google_search\",Googlebot:\"googlebot\",\"Internet Explorer\":\"ie\",\"K-Meleon\":\"k_meleon\",Maxthon:\"maxthon\",\"Microsoft Edge\":\"edge\",\"MZ Browser\":\"mz\",\"NAVER Whale Browser\":\"naver\",Opera:\"opera\",\"Opera Coast\":\"opera_coast\",PhantomJS:\"phantomjs\",Puffin:\"puffin\",QupZilla:\"qupzilla\",QQ:\"qq\",QQLite:\"qqlite\",Safari:\"safari\",Sailfish:\"sailfish\",\"Samsung Internet for Android\":\"samsung_internet\",SeaMonkey:\"seamonkey\",Sleipnir:\"sleipnir\",Swing:\"swing\",Tizen:\"tizen\",\"UC Browser\":\"uc\",Vivaldi:\"vivaldi\",\"WebOS Browser\":\"webos\",WeChat:\"wechat\",\"Yandex Browser\":\"yandex\",Roku:\"roku\"};n.BROWSER_MAP={amazon_silk:\"Amazon Silk\",android:\"Android Browser\",bada:\"Bada\",blackberry:\"BlackBerry\",chrome:\"Chrome\",chromium:\"Chromium\",electron:\"Electron\",epiphany:\"Epiphany\",firefox:\"Firefox\",focus:\"Focus\",generic:\"Generic\",googlebot:\"Googlebot\",google_search:\"Google Search\",ie:\"Internet Explorer\",k_meleon:\"K-Meleon\",maxthon:\"Maxthon\",edge:\"Microsoft Edge\",mz:\"MZ Browser\",naver:\"NAVER Whale Browser\",opera:\"Opera\",opera_coast:\"Opera Coast\",phantomjs:\"PhantomJS\",puffin:\"Puffin\",qupzilla:\"QupZilla\",qq:\"QQ Browser\",qqlite:\"QQ Browser Lite\",safari:\"Safari\",sailfish:\"Sailfish\",samsung_internet:\"Samsung Internet for Android\",seamonkey:\"SeaMonkey\",sleipnir:\"Sleipnir\",swing:\"Swing\",tizen:\"Tizen\",uc:\"UC Browser\",vivaldi:\"Vivaldi\",webos:\"WebOS Browser\",wechat:\"WeChat\",yandex:\"Yandex Browser\"};n.PLATFORMS_MAP={tablet:\"tablet\",mobile:\"mobile\",desktop:\"desktop\",tv:\"tv\"};n.OS_MAP={WindowsPhone:\"Windows Phone\",Windows:\"Windows\",MacOS:\"macOS\",iOS:\"iOS\",Android:\"Android\",WebOS:\"WebOS\",BlackBerry:\"BlackBerry\",Bada:\"Bada\",Tizen:\"Tizen\",Linux:\"Linux\",ChromeOS:\"Chrome OS\",PlayStation4:\"PlayStation 4\",Roku:\"Roku\"};n.ENGINE_MAP={EdgeHTML:\"EdgeHTML\",Blink:\"Blink\",Trident:\"Trident\",Presto:\"Presto\",Gecko:\"Gecko\",WebKit:\"WebKit\"}},function(t,n,e){var r=e(20);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(47),i=e(30),o=e(15),u=e(28),a=e(13),c=e(96),s=Object.getOwnPropertyDescriptor;n.f=e(8)?s:function(t,n){if(t=o(t),n=u(n,!0),c)try{return s(t,n)}catch(t){}if(a(t,n))return i(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(0),i=e(7),o=e(2);t.exports=function(t,n){var e=(i.Object||{})[t]||Object[t],u={};u[t]=n(e),r(r.S+r.F*o((function(){e(1)})),\"Object\",u)}},function(t,n,e){var r=e(19),i=e(46),o=e(10),u=e(6),a=e(112);t.exports=function(t,n){var e=1==t,c=2==t,s=3==t,f=4==t,l=6==t,h=5==t||l,d=n||a;return function(n,a,p){for(var v,g,y=o(n),m=i(y),b=r(a,p,3),S=u(m.length),w=0,_=e?d(n,S):c?d(n,0):void 0;S>w;w++)if((h||w in m)&&(g=b(v=m[w],w,y),t))if(e)_[w]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:_.push(v)}else if(f)return!1;return l?-1:s||f?f:_}}},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError(\"Can't call method on  \"+t);return t}},function(t,n,e){\"use strict\";if(e(8)){var r=e(32),i=e(1),o=e(2),u=e(0),a=e(61),c=e(86),s=e(19),f=e(44),l=e(30),h=e(14),d=e(45),p=e(21),v=e(6),g=e(123),y=e(34),m=e(28),b=e(13),S=e(48),w=e(4),_=e(10),M=e(78),x=e(35),P=e(37),O=e(36).f,A=e(80),F=e(31),E=e(5),N=e(24),R=e(51),k=e(49),T=e(82),I=e(42),j=e(54),L=e(43),B=e(81),C=e(114),W=e(9),V=e(22),G=W.f,D=V.f,U=i.RangeError,z=i.TypeError,q=i.Uint8Array,K=Array.prototype,Y=c.ArrayBuffer,Q=c.DataView,H=N(0),J=N(2),X=N(3),Z=N(4),$=N(5),tt=N(6),nt=R(!0),et=R(!1),rt=T.values,it=T.keys,ot=T.entries,ut=K.lastIndexOf,at=K.reduce,ct=K.reduceRight,st=K.join,ft=K.sort,lt=K.slice,ht=K.toString,dt=K.toLocaleString,pt=E(\"iterator\"),vt=E(\"toStringTag\"),gt=F(\"typed_constructor\"),yt=F(\"def_constructor\"),mt=a.CONSTR,bt=a.TYPED,St=a.VIEW,wt=N(1,(function(t,n){return Ot(k(t,t[yt]),n)})),_t=o((function(){return 1===new q(new Uint16Array([1]).buffer)[0]})),Mt=!!q&&!!q.prototype.set&&o((function(){new q(1).set({})})),xt=function(t,n){var e=p(t);if(e<0||e%n)throw U(\"Wrong offset!\");return e},Pt=function(t){if(w(t)&&bt in t)return t;throw z(t+\" is not a typed array!\")},Ot=function(t,n){if(!(w(t)&&gt in t))throw z(\"It is not a typed array constructor!\");return new t(n)},At=function(t,n){return Ft(k(t,t[yt]),n)},Ft=function(t,n){for(var e=0,r=n.length,i=Ot(t,r);r>e;)i[e]=n[e++];return i},Et=function(t,n,e){G(t,n,{get:function(){return this._d[e]}})},Nt=function(t){var n,e,r,i,o,u,a=_(t),c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=A(a);if(null!=h&&!M(h)){for(u=h.call(a),r=[],n=0;!(o=u.next()).done;n++)r.push(o.value);a=r}for(l&&c>2&&(f=s(f,arguments[2],2)),n=0,e=v(a.length),i=Ot(this,e);e>n;n++)i[n]=l?f(a[n],n):a[n];return i},Rt=function(){for(var t=0,n=arguments.length,e=Ot(this,n);n>t;)e[t]=arguments[t++];return e},kt=!!q&&o((function(){dt.call(new q(1))})),Tt=function(){return dt.apply(kt?lt.call(Pt(this)):Pt(this),arguments)},It={copyWithin:function(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return B.apply(Pt(this),arguments)},filter:function(t){return At(this,J(Pt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return $(Pt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){H(Pt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return et(Pt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return st.apply(Pt(this),arguments)},lastIndexOf:function(t){return ut.apply(Pt(this),arguments)},map:function(t){return wt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return at.apply(Pt(this),arguments)},reduceRight:function(t){return ct.apply(Pt(this),arguments)},reverse:function(){for(var t,n=Pt(this).length,e=Math.floor(n/2),r=0;r<e;)t=this[r],this[r++]=this[--n],this[n]=t;return this},some:function(t){return X(Pt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ft.call(Pt(this),t)},subarray:function(t,n){var e=Pt(this),r=e.length,i=y(t,r);return new(k(e,e[yt]))(e.buffer,e.byteOffset+i*e.BYTES_PER_ELEMENT,v((void 0===n?r:y(n,r))-i))}},jt=function(t,n){return At(this,lt.call(Pt(this),t,n))},Lt=function(t){Pt(this);var n=xt(arguments[1],1),e=this.length,r=_(t),i=v(r.length),o=0;if(i+n>e)throw U(\"Wrong length!\");for(;o<i;)this[n+o]=r[o++]},Bt={entries:function(){return ot.call(Pt(this))},keys:function(){return it.call(Pt(this))},values:function(){return rt.call(Pt(this))}},Ct=function(t,n){return w(t)&&t[bt]&&\"symbol\"!=typeof n&&n in t&&String(+n)==String(n)},Wt=function(t,n){return Ct(t,n=m(n,!0))?l(2,t[n]):D(t,n)},Vt=function(t,n,e){return!(Ct(t,n=m(n,!0))&&w(e)&&b(e,\"value\"))||b(e,\"get\")||b(e,\"set\")||e.configurable||b(e,\"writable\")&&!e.writable||b(e,\"enumerable\")&&!e.enumerable?G(t,n,e):(t[n]=e.value,t)};mt||(V.f=Wt,W.f=Vt),u(u.S+u.F*!mt,\"Object\",{getOwnPropertyDescriptor:Wt,defineProperty:Vt}),o((function(){ht.call({})}))&&(ht=dt=function(){return st.call(this)});var Gt=d({},It);d(Gt,Bt),h(Gt,pt,Bt.values),d(Gt,{slice:jt,set:Lt,constructor:function(){},toString:ht,toLocaleString:Tt}),Et(Gt,\"buffer\",\"b\"),Et(Gt,\"byteOffset\",\"o\"),Et(Gt,\"byteLength\",\"l\"),Et(Gt,\"length\",\"e\"),G(Gt,vt,{get:function(){return this[bt]}}),t.exports=function(t,n,e,c){var s=t+((c=!!c)?\"Clamped\":\"\")+\"Array\",l=\"get\"+t,d=\"set\"+t,p=i[s],y=p||{},m=p&&P(p),b=!p||!a.ABV,_={},M=p&&p.prototype,A=function(t,e){G(t,e,{get:function(){return function(t,e){var r=t._d;return r.v[l](e*n+r.o,_t)}(this,e)},set:function(t){return function(t,e,r){var i=t._d;c&&(r=(r=Math.round(r))<0?0:r>255?255:255&r),i.v[d](e*n+i.o,r,_t)}(this,e,t)},enumerable:!0})};b?(p=e((function(t,e,r,i){f(t,p,s,\"_d\");var o,u,a,c,l=0,d=0;if(w(e)){if(!(e instanceof Y||\"ArrayBuffer\"==(c=S(e))||\"SharedArrayBuffer\"==c))return bt in e?Ft(p,e):Nt.call(p,e);o=e,d=xt(r,n);var y=e.byteLength;if(void 0===i){if(y%n)throw U(\"Wrong length!\");if((u=y-d)<0)throw U(\"Wrong length!\")}else if((u=v(i)*n)+d>y)throw U(\"Wrong length!\");a=u/n}else a=g(e),o=new Y(u=a*n);for(h(t,\"_d\",{b:o,o:d,l:u,e:a,v:new Q(o)});l<a;)A(t,l++)})),M=p.prototype=x(Gt),h(M,\"constructor\",p)):o((function(){p(1)}))&&o((function(){new p(-1)}))&&j((function(t){new p,new p(null),new p(1.5),new p(t)}),!0)||(p=e((function(t,e,r,i){var o;return f(t,p,s),w(e)?e instanceof Y||\"ArrayBuffer\"==(o=S(e))||\"SharedArrayBuffer\"==o?void 0!==i?new y(e,xt(r,n),i):void 0!==r?new y(e,xt(r,n)):new y(e):bt in e?Ft(p,e):Nt.call(p,e):new y(g(e))})),H(m!==Function.prototype?O(y).concat(O(m)):O(y),(function(t){t in p||h(p,t,y[t])})),p.prototype=M,r||(M.constructor=p));var F=M[pt],E=!!F&&(\"values\"==F.name||null==F.name),N=Bt.values;h(p,gt,!0),h(M,bt,s),h(M,St,!0),h(M,yt,p),(c?new p(1)[vt]==s:vt in M)||G(M,vt,{get:function(){return s}}),_[s]=p,u(u.G+u.W+u.F*(p!=y),_),u(u.S,s,{BYTES_PER_ELEMENT:n}),u(u.S+u.F*o((function(){y.of.call(p,1)})),s,{from:Nt,of:Rt}),\"BYTES_PER_ELEMENT\"in M||h(M,\"BYTES_PER_ELEMENT\",n),u(u.P,s,It),L(s),u(u.P+u.F*Mt,s,{set:Lt}),u(u.P+u.F*!E,s,Bt),r||M.toString==ht||(M.toString=ht),u(u.P+u.F*o((function(){new p(1).slice()})),s,{slice:jt}),u(u.P+u.F*(o((function(){return[1,2].toLocaleString()!=new p([1,2]).toLocaleString()}))||!o((function(){M.toLocaleString.call([1,2])}))),s,{toLocaleString:Tt}),I[s]=E?F:N,r||E||h(M,pt,N)}}else t.exports=function(){}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n,e){var r=e(31)(\"meta\"),i=e(4),o=e(13),u=e(9).f,a=0,c=Object.isExtensible||function(){return!0},s=!e(2)((function(){return c(Object.preventExtensions({}))})),f=function(t){u(t,r,{value:{i:\"O\"+ ++a,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,n){if(!i(t))return\"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!o(t,r)){if(!c(t))return\"F\";if(!n)return\"E\";f(t)}return t[r].i},getWeak:function(t,n){if(!o(t,r)){if(!c(t))return!0;if(!n)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&c(t)&&!o(t,r)&&f(t),t}}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return\"Symbol(\".concat(void 0===t?\"\":t,\")_\",(++e+r).toString(36))}},function(t,n){t.exports=!1},function(t,n,e){var r=e(98),i=e(65);t.exports=Object.keys||function(t){return r(t,i)}},function(t,n,e){var r=e(21),i=Math.max,o=Math.min;t.exports=function(t,n){return(t=r(t))<0?i(t+n,0):o(t,n)}},function(t,n,e){var r=e(3),i=e(99),o=e(65),u=e(64)(\"IE_PROTO\"),a=function(){},c=function(){var t,n=e(62)(\"iframe\"),r=o.length;for(n.style.display=\"none\",e(66).appendChild(n),n.src=\"javascript:\",(t=n.contentWindow.document).open(),t.write(\"<script>document.F=Object<\\/script>\"),t.close(),c=t.F;r--;)delete c.prototype[o[r]];return c()};t.exports=Object.create||function(t,n){var e;return null!==t?(a.prototype=r(t),e=new a,a.prototype=null,e[u]=t):e=c(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(98),i=e(65).concat(\"length\",\"prototype\");n.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,n,e){var r=e(13),i=e(10),o=e(64)(\"IE_PROTO\"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(5)(\"unscopables\"),i=Array.prototype;null==i[r]&&e(14)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t)||t._t!==n)throw TypeError(\"Incompatible receiver, \"+n+\" required!\");return t}},function(t,n,e){var r=e(9).f,i=e(13),o=e(5)(\"toStringTag\");t.exports=function(t,n,e){t&&!i(t=e?t:t.prototype,o)&&r(t,o,{configurable:!0,value:n})}},function(t,n,e){var r=e(0),i=e(26),o=e(2),u=e(68),a=\"[\"+u+\"]\",c=RegExp(\"^\"+a+a+\"*\"),s=RegExp(a+a+\"*$\"),f=function(t,n,e){var i={},a=o((function(){return!!u[t]()||\"​\"!=\"​\"[t]()})),c=i[t]=a?n(l):u[t];e&&(i[e]=c),r(r.P+r.F*a,\"String\",i)},l=f.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(c,\"\")),2&n&&(t=t.replace(s,\"\")),t};t.exports=f},function(t,n){t.exports={}},function(t,n,e){\"use strict\";var r=e(1),i=e(9),o=e(8),u=e(5)(\"species\");t.exports=function(t){var n=r[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,r){if(!(t instanceof n)||void 0!==r&&r in t)throw TypeError(e+\": incorrect invocation!\");return t}},function(t,n,e){var r=e(11);t.exports=function(t,n,e){for(var i in n)r(t,i,n[i],e);return t}},function(t,n,e){var r=e(25);t.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(t){return\"String\"==r(t)?t.split(\"\"):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(25),i=e(5)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}());t.exports=function(t){var n,e,u;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:o?r(n):\"Object\"==(u=r(n))&&\"function\"==typeof n.callee?\"Arguments\":u}},function(t,n,e){var r=e(3),i=e(20),o=e(5)(\"species\");t.exports=function(t,n){var e,u=r(t).constructor;return void 0===u||null==(e=r(u)[o])?n:i(e)}},function(t,n,e){var r=e(7),i=e(1),o=i[\"__core-js_shared__\"]||(i[\"__core-js_shared__\"]={});(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})(\"versions\",[]).push({version:r.version,mode:e(32)?\"pure\":\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})},function(t,n,e){var r=e(15),i=e(6),o=e(34);t.exports=function(t){return function(n,e,u){var a,c=r(n),s=i(c.length),f=o(u,s);if(t&&e!=e){for(;s>f;)if((a=c[f++])!=a)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===e)return t||f||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(25);t.exports=Array.isArray||function(t){return\"Array\"==r(t)}},function(t,n,e){var r=e(5)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var e=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:e=!0}},o[r]=function(){return u},t(o)}catch(t){}return e}},function(t,n,e){\"use strict\";var r=e(3);t.exports=function(){var t=r(this),n=\"\";return t.global&&(n+=\"g\"),t.ignoreCase&&(n+=\"i\"),t.multiline&&(n+=\"m\"),t.unicode&&(n+=\"u\"),t.sticky&&(n+=\"y\"),n}},function(t,n,e){\"use strict\";var r=e(48),i=RegExp.prototype.exec;t.exports=function(t,n){var e=t.exec;if(\"function\"==typeof e){var o=e.call(t,n);if(\"object\"!=typeof o)throw new TypeError(\"RegExp exec method returned something other than an Object or null\");return o}if(\"RegExp\"!==r(t))throw new TypeError(\"RegExp#exec called on incompatible receiver\");return i.call(t,n)}},function(t,n,e){\"use strict\";e(116);var r=e(11),i=e(14),o=e(2),u=e(26),a=e(5),c=e(83),s=a(\"species\"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")})),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e=\"ab\".split(t);return 2===e.length&&\"a\"===e[0]&&\"b\"===e[1]}();t.exports=function(t,n,e){var h=a(t),d=!o((function(){var n={};return n[h]=function(){return 7},7!=\"\"[t](n)})),p=d?!o((function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},\"split\"===t&&(e.constructor={},e.constructor[s]=function(){return e}),e[h](\"\"),!n})):void 0;if(!d||!p||\"replace\"===t&&!f||\"split\"===t&&!l){var v=/./[h],g=e(u,h,\"\"[t],(function(t,n,e,r,i){return n.exec===c?d&&!i?{done:!0,value:v.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}})),y=g[0],m=g[1];r(String.prototype,t,y),i(RegExp.prototype,h,2==n?function(t,n){return m.call(t,this,n)}:function(t){return m.call(t,this)})}}},function(t,n,e){var r=e(19),i=e(111),o=e(78),u=e(3),a=e(6),c=e(80),s={},f={};(n=t.exports=function(t,n,e,l,h){var d,p,v,g,y=h?function(){return t}:c(t),m=r(e,l,n?2:1),b=0;if(\"function\"!=typeof y)throw TypeError(t+\" is not iterable!\");if(o(y)){for(d=a(t.length);d>b;b++)if((g=n?m(u(p=t[b])[0],p[1]):m(t[b]))===s||g===f)return g}else for(v=y.call(t);!(p=v.next()).done;)if((g=i(v,m,p.value,n))===s||g===f)return g}).BREAK=s,n.RETURN=f},function(t,n,e){var r=e(1).navigator;t.exports=r&&r.userAgent||\"\"},function(t,n,e){\"use strict\";var r=e(1),i=e(0),o=e(11),u=e(45),a=e(29),c=e(58),s=e(44),f=e(4),l=e(2),h=e(54),d=e(40),p=e(69);t.exports=function(t,n,e,v,g,y){var m=r[t],b=m,S=g?\"set\":\"add\",w=b&&b.prototype,_={},M=function(t){var n=w[t];o(w,t,\"delete\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"has\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"get\"==t?function(t){return y&&!f(t)?void 0:n.call(this,0===t?0:t)}:\"add\"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(\"function\"==typeof b&&(y||w.forEach&&!l((function(){(new b).entries().next()})))){var x=new b,P=x[S](y?{}:-0,1)!=x,O=l((function(){x.has(1)})),A=h((function(t){new b(t)})),F=!y&&l((function(){for(var t=new b,n=5;n--;)t[S](n,n);return!t.has(-0)}));A||((b=n((function(n,e){s(n,b,t);var r=p(new m,n,b);return null!=e&&c(e,g,r[S],r),r}))).prototype=w,w.constructor=b),(O||F)&&(M(\"delete\"),M(\"has\"),g&&M(\"get\")),(F||P)&&M(S),y&&w.clear&&delete w.clear}else b=v.getConstructor(n,t,g,S),u(b.prototype,e),a.NEED=!0;return d(b,t),_[t]=b,i(i.G+i.W+i.F*(b!=m),_),y||v.setStrong(b,t,g),b}},function(t,n,e){for(var r,i=e(1),o=e(14),u=e(31),a=u(\"typed_array\"),c=u(\"view\"),s=!(!i.ArrayBuffer||!i.DataView),f=s,l=0,h=\"Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array\".split(\",\");l<9;)(r=i[h[l++]])?(o(r.prototype,a,!0),o(r.prototype,c,!0)):f=!1;t.exports={ABV:s,CONSTR:f,TYPED:a,VIEW:c}},function(t,n,e){var r=e(4),i=e(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){n.f=e(5)},function(t,n,e){var r=e(50)(\"keys\"),i=e(31);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,n){t.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(t,n,e){var r=e(1).document;t.exports=r&&r.documentElement},function(t,n,e){var r=e(4),i=e(3),o=function(t,n){if(i(t),!r(n)&&null!==n)throw TypeError(n+\": can't set as prototype!\")};t.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(22).f(Object.prototype,\"__proto__\").set,2))(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},function(t,n){t.exports=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\"},function(t,n,e){var r=e(4),i=e(67).set;t.exports=function(t,n,e){var o,u=n.constructor;return u!==e&&\"function\"==typeof u&&(o=u.prototype)!==e.prototype&&r(o)&&i&&i(t,o),t}},function(t,n,e){\"use strict\";var r=e(21),i=e(26);t.exports=function(t){var n=String(i(this)),e=\"\",o=r(t);if(o<0||o==1/0)throw RangeError(\"Count can't be negative\");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(e+=n);return e}},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var e=Math.expm1;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:e},function(t,n,e){var r=e(21),i=e(26);t.exports=function(t){return function(n,e){var o,u,a=String(i(n)),c=r(e),s=a.length;return c<0||c>=s?t?\"\":void 0:(o=a.charCodeAt(c))<55296||o>56319||c+1===s||(u=a.charCodeAt(c+1))<56320||u>57343?t?a.charAt(c):o:t?a.slice(c,c+2):u-56320+(o-55296<<10)+65536}}},function(t,n,e){\"use strict\";var r=e(32),i=e(0),o=e(11),u=e(14),a=e(42),c=e(110),s=e(40),f=e(37),l=e(5)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),d=function(){return this};t.exports=function(t,n,e,p,v,g,y){c(e,n,p);var m,b,S,w=function(t){if(!h&&t in P)return P[t];switch(t){case\"keys\":case\"values\":return function(){return new e(this,t)}}return function(){return new e(this,t)}},_=n+\" Iterator\",M=\"values\"==v,x=!1,P=t.prototype,O=P[l]||P[\"@@iterator\"]||v&&P[v],A=O||w(v),F=v?M?w(\"entries\"):A:void 0,E=\"Array\"==n&&P.entries||O;if(E&&(S=f(E.call(new t)))!==Object.prototype&&S.next&&(s(S,_,!0),r||\"function\"==typeof S[l]||u(S,l,d)),M&&O&&\"values\"!==O.name&&(x=!0,A=function(){return O.call(this)}),r&&!y||!h&&!x&&P[l]||u(P,l,A),a[n]=A,a[_]=d,v)if(m={values:M?A:w(\"values\"),keys:g?A:w(\"keys\"),entries:F},y)for(b in m)b in P||o(P,b,m[b]);else i(i.P+i.F*(h||x),n,m);return m}},function(t,n,e){var r=e(76),i=e(26);t.exports=function(t,n,e){if(r(n))throw TypeError(\"String#\"+e+\" doesn't accept regex!\");return String(i(t))}},function(t,n,e){var r=e(4),i=e(25),o=e(5)(\"match\");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[o])?!!n:\"RegExp\"==i(t))}},function(t,n,e){var r=e(5)(\"match\");t.exports=function(t){var n=/./;try{\"/./\"[t](n)}catch(e){try{return n[r]=!1,!\"/./\"[t](n)}catch(t){}}return!0}},function(t,n,e){var r=e(42),i=e(5)(\"iterator\"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,n,e){\"use strict\";var r=e(9),i=e(30);t.exports=function(t,n,e){n in t?r.f(t,n,i(0,e)):t[n]=e}},function(t,n,e){var r=e(48),i=e(5)(\"iterator\"),o=e(42);t.exports=e(7).getIteratorMethod=function(t){if(null!=t)return t[i]||t[\"@@iterator\"]||o[r(t)]}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=function(t){for(var n=r(this),e=o(n.length),u=arguments.length,a=i(u>1?arguments[1]:void 0,e),c=u>2?arguments[2]:void 0,s=void 0===c?e:i(c,e);s>a;)n[a++]=t;return n}},function(t,n,e){\"use strict\";var r=e(38),i=e(115),o=e(42),u=e(15);t.exports=e(74)(Array,\"Array\",(function(t,n){this._t=u(t),this._i=0,this._k=n}),(function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,i(1)):i(0,\"keys\"==n?e:\"values\"==n?t[e]:[e,t[e]])}),\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(t,n,e){\"use strict\";var r,i,o=e(55),u=RegExp.prototype.exec,a=String.prototype.replace,c=u,s=(r=/a/,i=/b*/g,u.call(r,\"a\"),u.call(i,\"a\"),0!==r.lastIndex||0!==i.lastIndex),f=void 0!==/()??/.exec(\"\")[1];(s||f)&&(c=function(t){var n,e,r,i,c=this;return f&&(e=new RegExp(\"^\"+c.source+\"$(?!\\\\s)\",o.call(c))),s&&(n=c.lastIndex),r=u.call(c,t),s&&r&&(c.lastIndex=c.global?r.index+r[0].length:n),f&&r&&r.length>1&&a.call(r[0],e,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r}),t.exports=c},function(t,n,e){\"use strict\";var r=e(73)(!0);t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r,i,o,u=e(19),a=e(104),c=e(66),s=e(62),f=e(1),l=f.process,h=f.setImmediate,d=f.clearImmediate,p=f.MessageChannel,v=f.Dispatch,g=0,y={},m=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},b=function(t){m.call(t.data)};h&&d||(h=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return y[++g]=function(){a(\"function\"==typeof t?t:Function(t),n)},r(g),g},d=function(t){delete y[t]},\"process\"==e(25)(l)?r=function(t){l.nextTick(u(m,t,1))}:v&&v.now?r=function(t){v.now(u(m,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=b,r=u(o.postMessage,o,1)):f.addEventListener&&\"function\"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+\"\",\"*\")},f.addEventListener(\"message\",b,!1)):r=\"onreadystatechange\"in s(\"script\")?function(t){c.appendChild(s(\"script\")).onreadystatechange=function(){c.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0)}),t.exports={set:h,clear:d}},function(t,n,e){\"use strict\";var r=e(1),i=e(8),o=e(32),u=e(61),a=e(14),c=e(45),s=e(2),f=e(44),l=e(21),h=e(6),d=e(123),p=e(36).f,v=e(9).f,g=e(81),y=e(40),m=\"prototype\",b=\"Wrong index!\",S=r.ArrayBuffer,w=r.DataView,_=r.Math,M=r.RangeError,x=r.Infinity,P=S,O=_.abs,A=_.pow,F=_.floor,E=_.log,N=_.LN2,R=i?\"_b\":\"buffer\",k=i?\"_l\":\"byteLength\",T=i?\"_o\":\"byteOffset\";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=23===n?A(2,-24)-A(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=O(t))!=t||t===x?(i=t!=t?1:0,r=c):(r=F(E(t)/N),t*(o=A(2,-r))<1&&(r--,o*=2),(t+=r+s>=1?f/o:f*A(2,1-s))*o>=2&&(r++,o/=2),r+s>=c?(i=0,r=c):r+s>=1?(i=(t*o-1)*A(2,n),r+=s):(i=t*A(2,s-1)*A(2,n),r=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(r=r<<n|i,a+=n;a>0;u[l++]=255&r,r/=256,a-=8);return u[--l]|=128*h,u}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--],f=127&s;for(s>>=7;a>0;f=256*f+t[c],c--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=n;a>0;r=256*r+t[c],c--,a-=8);if(0===f)f=1-u;else{if(f===o)return r?NaN:s?-x:x;r+=A(2,n),f-=u}return(s?-1:1)*r*A(2,f-n)}function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function B(t){return[255&t]}function C(t){return[255&t,t>>8&255]}function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function V(t){return I(t,52,8)}function G(t){return I(t,23,4)}function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}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+t[T],a=o.slice(u,u+n);return r?a:a.reverse()}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]._b,c=u+t[T],s=r(+i),f=0;f<n;f++)a[c+f]=s[o?f:n-f-1]}if(u.ABV){if(!s((function(){S(1)}))||!s((function(){new S(-1)}))||s((function(){return new S,new S(1.5),new S(NaN),\"ArrayBuffer\"!=S.name}))){for(var q,K=(S=function(t){return f(this,S),new P(d(t))})[m]=P[m],Y=p(P),Q=0;Y.length>Q;)(q=Y[Q++])in S||a(S,q,P[q]);o||(K.constructor=S)}var H=new w(new S(2)),J=w[m].setInt8;H.setInt8(0,2147483648),H.setInt8(1,2147483649),!H.getInt8(0)&&H.getInt8(1)||c(w[m],{setInt8:function(t,n){J.call(this,t,n<<24>>24)},setUint8:function(t,n){J.call(this,t,n<<24>>24)}},!0)}else S=function(t){f(this,S,\"ArrayBuffer\");var n=d(t);this._b=g.call(new Array(n),0),this[k]=n},w=function(t,n,e){f(this,w,\"DataView\"),f(t,S,\"DataView\");var r=t[k],i=l(n);if(i<0||i>r)throw M(\"Wrong offset!\");if(i+(e=void 0===e?r-i:h(e))>r)throw M(\"Wrong length!\");this[R]=t,this[T]=i,this[k]=e},i&&(D(S,\"byteLength\",\"_l\"),D(w,\"buffer\",\"_b\"),D(w,\"byteLength\",\"_l\"),D(w,\"byteOffset\",\"_o\")),c(w[m],{getInt8:function(t){return U(this,1,t)[0]<<24>>24},getUint8:function(t){return U(this,1,t)[0]},getInt16:function(t){var n=U(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=U(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return L(U(this,4,t,arguments[1]))},getUint32:function(t){return L(U(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return j(U(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return j(U(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){z(this,1,t,B,n)},setUint8:function(t,n){z(this,1,t,B,n)},setInt16:function(t,n){z(this,2,t,C,n,arguments[2])},setUint16:function(t,n){z(this,2,t,C,n,arguments[2])},setInt32:function(t,n){z(this,4,t,W,n,arguments[2])},setUint32:function(t,n){z(this,4,t,W,n,arguments[2])},setFloat32:function(t,n){z(this,4,t,G,n,arguments[2])},setFloat64:function(t,n){z(this,8,t,V,n,arguments[2])}});y(S,\"ArrayBuffer\"),y(w,\"DataView\"),a(w[m],u.VIEW,!0),n.ArrayBuffer=S,n.DataView=w},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){t.exports=!e(128)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(91))&&r.__esModule?r:{default:r},o=e(18);function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}var a=function(){function t(){}var n,e,r;return t.getParser=function(t,n){if(void 0===n&&(n=!1),\"string\"!=typeof t)throw new Error(\"UserAgent should be a string\");return new i.default(t,n)},t.parse=function(t){return new i.default(t).getResult()},n=t,r=[{key:\"BROWSER_MAP\",get:function(){return o.BROWSER_MAP}},{key:\"ENGINE_MAP\",get:function(){return o.ENGINE_MAP}},{key:\"OS_MAP\",get:function(){return o.OS_MAP}},{key:\"PLATFORMS_MAP\",get:function(){return o.PLATFORMS_MAP}}],(e=null)&&u(n.prototype,e),r&&u(n,r),t}();n.default=a,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=c(e(92)),i=c(e(93)),o=c(e(94)),u=c(e(95)),a=c(e(17));function c(t){return t&&t.__esModule?t:{default:t}}var s=function(){function t(t,n){if(void 0===n&&(n=!1),null==t||\"\"===t)throw new Error(\"UserAgent parameter can't be empty\");this._ua=t,this.parsedResult={},!0!==n&&this.parse()}var n=t.prototype;return n.getUA=function(){return this._ua},n.test=function(t){return t.test(this._ua)},n.parseBrowser=function(){var t=this;this.parsedResult.browser={};var n=a.default.find(r.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.browser=n.describe(this.getUA())),this.parsedResult.browser},n.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},n.getBrowserName=function(t){return t?String(this.getBrowser().name).toLowerCase()||\"\":this.getBrowser().name||\"\"},n.getBrowserVersion=function(){return this.getBrowser().version},n.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},n.parseOS=function(){var t=this;this.parsedResult.os={};var n=a.default.find(i.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.os=n.describe(this.getUA())),this.parsedResult.os},n.getOSName=function(t){var n=this.getOS().name;return t?String(n).toLowerCase()||\"\":n||\"\"},n.getOSVersion=function(){return this.getOS().version},n.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},n.getPlatformType=function(t){void 0===t&&(t=!1);var n=this.getPlatform().type;return t?String(n).toLowerCase()||\"\":n||\"\"},n.parsePlatform=function(){var t=this;this.parsedResult.platform={};var n=a.default.find(o.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.platform=n.describe(this.getUA())),this.parsedResult.platform},n.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},n.getEngineName=function(t){return t?String(this.getEngine().name).toLowerCase()||\"\":this.getEngine().name||\"\"},n.parseEngine=function(){var t=this;this.parsedResult.engine={};var n=a.default.find(u.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.engine=n.describe(this.getUA())),this.parsedResult.engine},n.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},n.getResult=function(){return a.default.assign({},this.parsedResult)},n.satisfies=function(t){var n=this,e={},r=0,i={},o=0;if(Object.keys(t).forEach((function(n){var u=t[n];\"string\"==typeof u?(i[n]=u,o+=1):\"object\"==typeof u&&(e[n]=u,r+=1)})),r>0){var u=Object.keys(e),c=a.default.find(u,(function(t){return n.isOS(t)}));if(c){var s=this.satisfies(e[c]);if(void 0!==s)return s}var f=a.default.find(u,(function(t){return n.isPlatform(t)}));if(f){var l=this.satisfies(e[f]);if(void 0!==l)return l}}if(o>0){var h=Object.keys(i),d=a.default.find(h,(function(t){return n.isBrowser(t,!0)}));if(void 0!==d)return this.compareVersion(i[d])}},n.isBrowser=function(t,n){void 0===n&&(n=!1);var e=this.getBrowserName().toLowerCase(),r=t.toLowerCase(),i=a.default.getBrowserTypeByAlias(r);return n&&i&&(r=i.toLowerCase()),r===e},n.compareVersion=function(t){var n=[0],e=t,r=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===t[0]||\"<\"===t[0]?(e=t.substr(1),\"=\"===t[1]?(r=!0,e=t.substr(2)):n=[],\">\"===t[0]?n.push(1):n.push(-1)):\"=\"===t[0]?e=t.substr(1):\"~\"===t[0]&&(r=!0,e=t.substr(1)),n.indexOf(a.default.compareVersions(i,e,r))>-1},n.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},n.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},n.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},n.is=function(t){return this.isBrowser(t)||this.isOS(t)||this.isPlatform(t)},n.some=function(t){var n=this;return void 0===t&&(t=[]),t.some((function(t){return n.is(t)}))},t}();n.default=s,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r};var o=/version\\/(\\d+(\\.?_?\\d+)+)/i,u=[{test:[/googlebot/i],describe:function(t){var n={name:\"Googlebot\"},e=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/opera/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/opr\\/|opios/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/SamsungBrowser/i],describe:function(t){var n={name:\"Samsung Internet for Android\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Whale/i],describe:function(t){var n={name:\"NAVER Whale Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/MZBrowser/i],describe:function(t){var n={name:\"MZ Browser\"},e=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/focus/i],describe:function(t){var n={name:\"Focus\"},e=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/swing/i],describe:function(t){var n={name:\"Swing\"},e=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/coast/i],describe:function(t){var n={name:\"Opera Coast\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/yabrowser/i],describe:function(t){var n={name:\"Yandex Browser\"},e=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/ucbrowser/i],describe:function(t){var n={name:\"UC Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Maxthon|mxios/i],describe:function(t){var n={name:\"Maxthon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/epiphany/i],describe:function(t){var n={name:\"Epiphany\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/puffin/i],describe:function(t){var n={name:\"Puffin\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sleipnir/i],describe:function(t){var n={name:\"Sleipnir\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/k-meleon/i],describe:function(t){var n={name:\"K-Meleon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/micromessenger/i],describe:function(t){var n={name:\"WeChat\"},e=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qqbrowser/i],describe:function(t){var n={name:/qqbrowserlite/i.test(t)?\"QQ Browser Lite\":\"QQ Browser\"},e=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/msie|trident/i],describe:function(t){var n={name:\"Internet Explorer\"},e=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/\\sedg\\//i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/edg([ea]|ios)/i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/vivaldi/i],describe:function(t){var n={name:\"Vivaldi\"},e=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/seamonkey/i],describe:function(t){var n={name:\"SeaMonkey\"},e=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sailfish/i],describe:function(t){var n={name:\"Sailfish\"},e=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,t);return e&&(n.version=e),n}},{test:[/silk/i],describe:function(t){var n={name:\"Amazon Silk\"},e=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/phantom/i],describe:function(t){var n={name:\"PhantomJS\"},e=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/slimerjs/i],describe:function(t){var n={name:\"SlimerJS\"},e=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n={name:\"BlackBerry\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n={name:\"WebOS Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/bada/i],describe:function(t){var n={name:\"Bada\"},e=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/tizen/i],describe:function(t){var n={name:\"Tizen\"},e=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qupzilla/i],describe:function(t){var n={name:\"QupZilla\"},e=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var n={name:\"Firefox\"},e=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/electron/i],describe:function(t){var n={name:\"Electron\"},e=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/chromium/i],describe:function(t){var n={name:\"Chromium\"},e=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/chrome|crios|crmo/i],describe:function(t){var n={name:\"Chrome\"},e=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/GSA/i],describe:function(t){var n={name:\"Google Search\"},e=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n={name:\"Android Browser\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/playstation 4/i],describe:function(t){var n={name:\"PlayStation 4\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/safari|applewebkit/i],describe:function(t){var n={name:\"Safari\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/.*/i],describe:function(t){var n=-1!==t.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(n,t),version:i.default.getSecondMatch(n,t)}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/Roku\\/DVP/],describe:function(t){var n=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,t);return{name:o.OS_MAP.Roku,version:n}}},{test:[/windows phone/i],describe:function(t){var n=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.WindowsPhone,version:n}}},{test:[/windows /i],describe:function(t){var n=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,t),e=i.default.getWindowsVersionName(n);return{name:o.OS_MAP.Windows,version:n,versionName:e}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(t){var n=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,t);return{name:o.OS_MAP.iOS,version:n}}},{test:[/macintosh/i],describe:function(t){var n=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,t).replace(/[_\\s]/g,\".\"),e=i.default.getMacOSVersionName(n),r={name:o.OS_MAP.MacOS,version:n};return e&&(r.versionName=e),r}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var n=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,t).replace(/[_\\s]/g,\".\");return{name:o.OS_MAP.iOS,version:n}}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,t),e=i.default.getAndroidVersionName(n),r={name:o.OS_MAP.Android,version:n};return e&&(r.versionName=e),r}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,t),e={name:o.OS_MAP.WebOS};return n&&n.length&&(e.version=n),e}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,t)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,t)||i.default.getFirstMatch(/\\bbb(\\d+)/i,t);return{name:o.OS_MAP.BlackBerry,version:n}}},{test:[/bada/i],describe:function(t){var n=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Bada,version:n}}},{test:[/tizen/i],describe:function(t){var n=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Tizen,version:n}}},{test:[/linux/i],describe:function(){return{name:o.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:o.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var n=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.PlayStation4,version:n}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(t){var n=i.default.getFirstMatch(/(can-l01)/i,t)&&\"Nova\",e={type:o.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return n&&(e.model=n),e}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){var n=t.test(/ipod|iphone/i),e=t.test(/like (ipod|iphone)/i);return n&&!e},describe:function(t){var n=i.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:o.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:n}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"blackberry\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(t){return\"bada\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"windows phone\"===t.getBrowserName()},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(t){var n=Number(String(t.getOSVersion()).split(\".\")[0]);return\"android\"===t.getOSName(!0)&&n>=3},describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){return\"android\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"macos\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(t){return\"windows\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"linux\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"playstation 4\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}},{test:function(t){return\"roku\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:function(t){return\"microsoft edge\"===t.getBrowserName(!0)},describe:function(t){if(/\\sedg\\//i.test(t))return{name:o.ENGINE_MAP.Blink};var n=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,t);return{name:o.ENGINE_MAP.EdgeHTML,version:n}}},{test:[/trident/i],describe:function(t){var n={name:o.ENGINE_MAP.Trident},e=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){return t.test(/presto/i)},describe:function(t){var n={name:o.ENGINE_MAP.Presto},e=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=t.test(/gecko/i),e=t.test(/like gecko/i);return n&&!e},describe:function(t){var n={name:o.ENGINE_MAP.Gecko},e=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:o.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var n={name:o.ENGINE_MAP.WebKit},e=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}}];n.default=u,t.exports=n.default},function(t,n,e){t.exports=!e(8)&&!e(2)((function(){return 7!=Object.defineProperty(e(62)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(1),i=e(7),o=e(32),u=e(63),a=e(9).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});\"_\"==t.charAt(0)||t in n||a(n,t,{value:u.f(t)})}},function(t,n,e){var r=e(13),i=e(15),o=e(51)(!1),u=e(64)(\"IE_PROTO\");t.exports=function(t,n){var e,a=i(t),c=0,s=[];for(e in a)e!=u&&r(a,e)&&s.push(e);for(;n.length>c;)r(a,e=n[c++])&&(~o(s,e)||s.push(e));return s}},function(t,n,e){var r=e(9),i=e(3),o=e(33);t.exports=e(8)?Object.defineProperties:function(t,n){i(t);for(var e,u=o(n),a=u.length,c=0;a>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(15),i=e(36).f,o={}.toString,u=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&\"[object Window]\"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(r(t))}},function(t,n,e){\"use strict\";var r=e(8),i=e(33),o=e(52),u=e(47),a=e(10),c=e(46),s=Object.assign;t.exports=!s||e(2)((function(){var t={},n={},e=Symbol(),r=\"abcdefghijklmnopqrst\";return t[e]=7,r.split(\"\").forEach((function(t){n[t]=t})),7!=s({},t)[e]||Object.keys(s({},n)).join(\"\")!=r}))?function(t,n){for(var e=a(t),s=arguments.length,f=1,l=o.f,h=u.f;s>f;)for(var d,p=c(arguments[f++]),v=l?i(p).concat(l(p)):i(p),g=v.length,y=0;g>y;)d=v[y++],r&&!h.call(p,d)||(e[d]=p[d]);return e}:s},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){\"use strict\";var r=e(20),i=e(4),o=e(104),u=[].slice,a={},c=function(t,n,e){if(!(n in a)){for(var r=[],i=0;i<n;i++)r[i]=\"a[\"+i+\"]\";a[n]=Function(\"F,a\",\"return new F(\"+r.join(\",\")+\")\")}return a[n](t,e)};t.exports=Function.bind||function(t){var n=r(this),e=u.call(arguments,1),a=function(){var r=e.concat(u.call(arguments));return this instanceof a?c(n,r.length,r):o(n,r,t)};return i(n.prototype)&&(a.prototype=n.prototype),a}},function(t,n){t.exports=function(t,n,e){var r=void 0===e;switch(n.length){case 0:return r?t():t.call(e);case 1:return r?t(n[0]):t.call(e,n[0]);case 2:return r?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return r?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return r?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},function(t,n,e){var r=e(1).parseInt,i=e(41).trim,o=e(68),u=/^[-+]?0[xX]/;t.exports=8!==r(o+\"08\")||22!==r(o+\"0x16\")?function(t,n){var e=i(String(t),3);return r(e,n>>>0||(u.test(e)?16:10))}:r},function(t,n,e){var r=e(1).parseFloat,i=e(41).trim;t.exports=1/r(e(68)+\"-0\")!=-1/0?function(t){var n=i(String(t),3),e=r(n);return 0===e&&\"-\"==n.charAt(0)?-0:e}:r},function(t,n,e){var r=e(25);t.exports=function(t,n){if(\"number\"!=typeof t&&\"Number\"!=r(t))throw TypeError(n);return+t}},function(t,n,e){var r=e(4),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,e){\"use strict\";var r=e(35),i=e(30),o=e(40),u={};e(14)(u,e(5)(\"iterator\"),(function(){return this})),t.exports=function(t,n,e){t.prototype=r(u,{next:i(1,e)}),o(t,n+\" Iterator\")}},function(t,n,e){var r=e(3);t.exports=function(t,n,e,i){try{return i?n(r(e)[0],e[1]):n(e)}catch(n){var o=t.return;throw void 0!==o&&r(o.call(t)),n}}},function(t,n,e){var r=e(224);t.exports=function(t,n){return new(r(t))(n)}},function(t,n,e){var r=e(20),i=e(10),o=e(46),u=e(6);t.exports=function(t,n,e,a,c){r(n);var s=i(t),f=o(s),l=u(s.length),h=c?l-1:0,d=c?-1:1;if(e<2)for(;;){if(h in f){a=f[h],h+=d;break}if(h+=d,c?h<0:l<=h)throw TypeError(\"Reduce of empty array with no initial value\")}for(;c?h>=0:l>h;h+=d)h in f&&(a=n(a,f[h],h,s));return a}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=[].copyWithin||function(t,n){var e=r(this),u=o(e.length),a=i(t,u),c=i(n,u),s=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===s?u:i(s,u))-c,u-a),l=1;for(c<a&&a<c+f&&(l=-1,c+=f-1,a+=f-1);f-- >0;)c in e?e[a]=e[c]:delete e[a],a+=l,c+=l;return e}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){\"use strict\";var r=e(83);e(0)({target:\"RegExp\",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,n,e){e(8)&&\"g\"!=/./g.flags&&e(9).f(RegExp.prototype,\"flags\",{configurable:!0,get:e(55)})},function(t,n,e){\"use strict\";var r,i,o,u,a=e(32),c=e(1),s=e(19),f=e(48),l=e(0),h=e(4),d=e(20),p=e(44),v=e(58),g=e(49),y=e(85).set,m=e(244)(),b=e(119),S=e(245),w=e(59),_=e(120),M=c.TypeError,x=c.process,P=x&&x.versions,O=P&&P.v8||\"\",A=c.Promise,F=\"process\"==f(x),E=function(){},N=i=b.f,R=!!function(){try{var t=A.resolve(1),n=(t.constructor={})[e(5)(\"species\")]=function(t){t(E,E)};return(F||\"function\"==typeof PromiseRejectionEvent)&&t.then(E)instanceof n&&0!==O.indexOf(\"6.6\")&&-1===w.indexOf(\"Chrome/66\")}catch(t){}}(),k=function(t){var n;return!(!h(t)||\"function\"!=typeof(n=t.then))&&n},T=function(t,n){if(!t._n){t._n=!0;var e=t._c;m((function(){for(var r=t._v,i=1==t._s,o=0,u=function(n){var e,o,u,a=i?n.ok:n.fail,c=n.resolve,s=n.reject,f=n.domain;try{a?(i||(2==t._h&&L(t),t._h=1),!0===a?e=r:(f&&f.enter(),e=a(r),f&&(f.exit(),u=!0)),e===n.promise?s(M(\"Promise-chain cycle\")):(o=k(e))?o.call(e,c,s):c(e)):s(r)}catch(t){f&&!u&&f.exit(),s(t)}};e.length>o;)u(e[o++]);t._c=[],t._n=!1,n&&!t._h&&I(t)}))}},I=function(t){y.call(c,(function(){var n,e,r,i=t._v,o=j(t);if(o&&(n=S((function(){F?x.emit(\"unhandledRejection\",i,t):(e=c.onunhandledrejection)?e({promise:t,reason:i}):(r=c.console)&&r.error&&r.error(\"Unhandled promise rejection\",i)})),t._h=F||j(t)?2:1),t._a=void 0,o&&n.e)throw n.v}))},j=function(t){return 1!==t._h&&0===(t._a||t._c).length},L=function(t){y.call(c,(function(){var n;F?x.emit(\"rejectionHandled\",t):(n=c.onrejectionhandled)&&n({promise:t,reason:t._v})}))},B=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),T(n,!0))},C=function(t){var n,e=this;if(!e._d){e._d=!0,e=e._w||e;try{if(e===t)throw M(\"Promise can't be resolved itself\");(n=k(t))?m((function(){var r={_w:e,_d:!1};try{n.call(t,s(C,r,1),s(B,r,1))}catch(t){B.call(r,t)}})):(e._v=t,e._s=1,T(e,!1))}catch(t){B.call({_w:e,_d:!1},t)}}};R||(A=function(t){p(this,A,\"Promise\",\"_h\"),d(t),r.call(this);try{t(s(C,this,1),s(B,this,1))}catch(t){B.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=e(45)(A.prototype,{then:function(t,n){var e=N(g(this,A));return e.ok=\"function\"!=typeof t||t,e.fail=\"function\"==typeof n&&n,e.domain=F?x.domain:void 0,this._c.push(e),this._a&&this._a.push(e),this._s&&T(this,!1),e.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r;this.promise=t,this.resolve=s(C,t,1),this.reject=s(B,t,1)},b.f=N=function(t){return t===A||t===u?new o(t):i(t)}),l(l.G+l.W+l.F*!R,{Promise:A}),e(40)(A,\"Promise\"),e(43)(\"Promise\"),u=e(7).Promise,l(l.S+l.F*!R,\"Promise\",{reject:function(t){var n=N(this);return(0,n.reject)(t),n.promise}}),l(l.S+l.F*(a||!R),\"Promise\",{resolve:function(t){return _(a&&this===u?A:this,t)}}),l(l.S+l.F*!(R&&e(54)((function(t){A.all(t).catch(E)}))),\"Promise\",{all:function(t){var n=this,e=N(n),r=e.resolve,i=e.reject,o=S((function(){var e=[],o=0,u=1;v(t,!1,(function(t){var a=o++,c=!1;e.push(void 0),u++,n.resolve(t).then((function(t){c||(c=!0,e[a]=t,--u||r(e))}),i)})),--u||r(e)}));return o.e&&i(o.v),e.promise},race:function(t){var n=this,e=N(n),r=e.reject,i=S((function(){v(t,!1,(function(t){n.resolve(t).then(e.resolve,r)}))}));return i.e&&r(i.v),e.promise}})},function(t,n,e){\"use strict\";var r=e(20);function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError(\"Bad Promise constructor\");n=t,e=r})),this.resolve=r(n),this.reject=r(e)}t.exports.f=function(t){return new i(t)}},function(t,n,e){var r=e(3),i=e(4),o=e(119);t.exports=function(t,n){if(r(t),i(n)&&n.constructor===t)return n;var e=o.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){\"use strict\";var r=e(9).f,i=e(35),o=e(45),u=e(19),a=e(44),c=e(58),s=e(74),f=e(115),l=e(43),h=e(8),d=e(29).fastKey,p=e(39),v=h?\"_s\":\"size\",g=function(t,n){var e,r=d(n);if(\"F\"!==r)return t._i[r];for(e=t._f;e;e=e.n)if(e.k==n)return e};t.exports={getConstructor:function(t,n,e,s){var f=t((function(t,r){a(t,f,n,\"_i\"),t._t=n,t._i=i(null),t._f=void 0,t._l=void 0,t[v]=0,null!=r&&c(r,e,t[s],t)}));return o(f.prototype,{clear:function(){for(var t=p(this,n),e=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete e[r.i];t._f=t._l=void 0,t[v]=0},delete:function(t){var e=p(this,n),r=g(e,t);if(r){var i=r.n,o=r.p;delete e._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),e._f==r&&(e._f=i),e._l==r&&(e._l=o),e[v]--}return!!r},forEach:function(t){p(this,n);for(var e,r=u(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!g(p(this,n),t)}}),h&&r(f.prototype,\"size\",{get:function(){return p(this,n)[v]}}),f},def:function(t,n,e){var r,i,o=g(t,n);return o?o.v=e:(t._l=o={i:i=d(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=o),r&&(r.n=o),t[v]++,\"F\"!==i&&(t._i[i]=o)),t},getEntry:g,setStrong:function(t,n,e){s(t,n,(function(t,e){this._t=p(t,n),this._k=e,this._l=void 0}),(function(){for(var t=this._k,n=this._l;n&&n.r;)n=n.p;return this._t&&(this._l=n=n?n.n:this._t._f)?f(0,\"keys\"==t?n.k:\"values\"==t?n.v:[n.k,n.v]):(this._t=void 0,f(1))}),e?\"entries\":\"values\",!e,!0),l(n)}}},function(t,n,e){\"use strict\";var r=e(45),i=e(29).getWeak,o=e(3),u=e(4),a=e(44),c=e(58),s=e(24),f=e(13),l=e(39),h=s(5),d=s(6),p=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,n){return h(t.a,(function(t){return t[0]===n}))};g.prototype={get:function(t){var n=y(this,t);if(n)return n[1]},has:function(t){return!!y(this,t)},set:function(t,n){var e=y(this,t);e?e[1]=n:this.a.push([t,n])},delete:function(t){var n=d(this.a,(function(n){return n[0]===t}));return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,o){var s=t((function(t,r){a(t,s,n,\"_i\"),t._t=n,t._i=p++,t._l=void 0,null!=r&&c(r,e,t[o],t)}));return r(s.prototype,{delete:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).delete(t):e&&f(e,this._i)&&delete e[this._i]},has:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).has(t):e&&f(e,this._i)}}),s},def:function(t,n,e){var r=i(o(n),!0);return!0===r?v(t).set(n,e):r[t._i]=e,t},ufstore:v}},function(t,n,e){var r=e(21),i=e(6);t.exports=function(t){if(void 0===t)return 0;var n=r(t),e=i(n);if(n!==e)throw RangeError(\"Wrong length!\");return e}},function(t,n,e){var r=e(36),i=e(52),o=e(3),u=e(1).Reflect;t.exports=u&&u.ownKeys||function(t){var n=r.f(o(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(6),i=e(70),o=e(26);t.exports=function(t,n,e,u){var a=String(o(t)),c=a.length,s=void 0===e?\" \":String(e),f=r(n);if(f<=c||\"\"==s)return a;var l=f-c,h=i.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+a:a+h}},function(t,n,e){var r=e(8),i=e(33),o=e(15),u=e(47).f;t.exports=function(t){return function(n){for(var e,a=o(n),c=i(a),s=c.length,f=0,l=[];s>f;)e=c[f++],r&&!u.call(a,e)||l.push(t?[e,a[e]]:a[e]);return l}}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){e(130),t.exports=e(90)},function(t,n,e){\"use strict\";e(131);var r,i=(r=e(303))&&r.__esModule?r:{default:r};i.default._babelPolyfill&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning.\"),i.default._babelPolyfill=!0},function(t,n,e){\"use strict\";e(132),e(275),e(277),e(280),e(282),e(284),e(286),e(288),e(290),e(292),e(294),e(296),e(298),e(302)},function(t,n,e){e(133),e(136),e(137),e(138),e(139),e(140),e(141),e(142),e(143),e(144),e(145),e(146),e(147),e(148),e(149),e(150),e(151),e(152),e(153),e(154),e(155),e(156),e(157),e(158),e(159),e(160),e(161),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(171),e(172),e(173),e(174),e(175),e(176),e(177),e(179),e(180),e(181),e(182),e(183),e(184),e(185),e(186),e(187),e(188),e(189),e(190),e(191),e(192),e(193),e(194),e(195),e(196),e(197),e(198),e(199),e(200),e(201),e(202),e(203),e(204),e(205),e(206),e(207),e(208),e(209),e(210),e(211),e(212),e(214),e(215),e(217),e(218),e(219),e(220),e(221),e(222),e(223),e(225),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(82),e(238),e(116),e(239),e(117),e(240),e(241),e(242),e(243),e(118),e(246),e(247),e(248),e(249),e(250),e(251),e(252),e(253),e(254),e(255),e(256),e(257),e(258),e(259),e(260),e(261),e(262),e(263),e(264),e(265),e(266),e(267),e(268),e(269),e(270),e(271),e(272),e(273),e(274),t.exports=e(7)},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(8),u=e(0),a=e(11),c=e(29).KEY,s=e(2),f=e(50),l=e(40),h=e(31),d=e(5),p=e(63),v=e(97),g=e(135),y=e(53),m=e(3),b=e(4),S=e(10),w=e(15),_=e(28),M=e(30),x=e(35),P=e(100),O=e(22),A=e(52),F=e(9),E=e(33),N=O.f,R=F.f,k=P.f,T=r.Symbol,I=r.JSON,j=I&&I.stringify,L=d(\"_hidden\"),B=d(\"toPrimitive\"),C={}.propertyIsEnumerable,W=f(\"symbol-registry\"),V=f(\"symbols\"),G=f(\"op-symbols\"),D=Object.prototype,U=\"function\"==typeof T&&!!A.f,z=r.QObject,q=!z||!z.prototype||!z.prototype.findChild,K=o&&s((function(){return 7!=x(R({},\"a\",{get:function(){return R(this,\"a\",{value:7}).a}})).a}))?function(t,n,e){var r=N(D,n);r&&delete D[n],R(t,n,e),r&&t!==D&&R(D,n,r)}:R,Y=function(t){var n=V[t]=x(T.prototype);return n._k=t,n},Q=U&&\"symbol\"==typeof T.iterator?function(t){return\"symbol\"==typeof t}:function(t){return t instanceof T},H=function(t,n,e){return t===D&&H(G,n,e),m(t),n=_(n,!0),m(e),i(V,n)?(e.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),e=x(e,{enumerable:M(0,!1)})):(i(t,L)||R(t,L,M(1,{})),t[L][n]=!0),K(t,n,e)):R(t,n,e)},J=function(t,n){m(t);for(var e,r=g(n=w(n)),i=0,o=r.length;o>i;)H(t,e=r[i++],n[e]);return t},X=function(t){var n=C.call(this,t=_(t,!0));return!(this===D&&i(V,t)&&!i(G,t))&&(!(n||!i(this,t)||!i(V,t)||i(this,L)&&this[L][t])||n)},Z=function(t,n){if(t=w(t),n=_(n,!0),t!==D||!i(V,n)||i(G,n)){var e=N(t,n);return!e||!i(V,n)||i(t,L)&&t[L][n]||(e.enumerable=!0),e}},$=function(t){for(var n,e=k(w(t)),r=[],o=0;e.length>o;)i(V,n=e[o++])||n==L||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===D,r=k(e?G:w(t)),o=[],u=0;r.length>u;)!i(V,n=r[u++])||e&&!i(D,n)||o.push(V[n]);return o};U||(a((T=function(){if(this instanceof T)throw TypeError(\"Symbol is not a constructor!\");var t=h(arguments.length>0?arguments[0]:void 0),n=function(e){this===D&&n.call(G,e),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),K(this,t,M(1,e))};return o&&q&&K(D,t,{configurable:!0,set:n}),Y(t)}).prototype,\"toString\",(function(){return this._k})),O.f=Z,F.f=H,e(36).f=P.f=$,e(47).f=X,A.f=tt,o&&!e(32)&&a(D,\"propertyIsEnumerable\",X,!0),p.f=function(t){return Y(d(t))}),u(u.G+u.W+u.F*!U,{Symbol:T});for(var nt=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),et=0;nt.length>et;)d(nt[et++]);for(var rt=E(d.store),it=0;rt.length>it;)v(rt[it++]);u(u.S+u.F*!U,\"Symbol\",{for:function(t){return i(W,t+=\"\")?W[t]:W[t]=T(t)},keyFor:function(t){if(!Q(t))throw TypeError(t+\" is not a symbol!\");for(var n in W)if(W[n]===t)return n},useSetter:function(){q=!0},useSimple:function(){q=!1}}),u(u.S+u.F*!U,\"Object\",{create:function(t,n){return void 0===n?x(t):J(x(t),n)},defineProperty:H,defineProperties:J,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:tt});var ot=s((function(){A.f(1)}));u(u.S+u.F*ot,\"Object\",{getOwnPropertySymbols:function(t){return A.f(S(t))}}),I&&u(u.S+u.F*(!U||s((function(){var t=T();return\"[null]\"!=j([t])||\"{}\"!=j({a:t})||\"{}\"!=j(Object(t))}))),\"JSON\",{stringify:function(t){for(var n,e,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(e=n=r[1],(b(n)||void 0!==t)&&!Q(t))return y(n)||(n=function(t,n){if(\"function\"==typeof e&&(n=e.call(this,t,n)),!Q(n))return n}),r[1]=n,j.apply(I,r)}}),T.prototype[B]||e(14)(T.prototype,B,T.prototype.valueOf),l(T,\"Symbol\"),l(Math,\"Math\",!0),l(r.JSON,\"JSON\",!0)},function(t,n,e){t.exports=e(50)(\"native-function-to-string\",Function.toString)},function(t,n,e){var r=e(33),i=e(52),o=e(47);t.exports=function(t){var n=r(t),e=i.f;if(e)for(var u,a=e(t),c=o.f,s=0;a.length>s;)c.call(t,u=a[s++])&&n.push(u);return n}},function(t,n,e){var r=e(0);r(r.S,\"Object\",{create:e(35)})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperty:e(9).f})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperties:e(99)})},function(t,n,e){var r=e(15),i=e(22).f;e(23)(\"getOwnPropertyDescriptor\",(function(){return function(t,n){return i(r(t),n)}}))},function(t,n,e){var r=e(10),i=e(37);e(23)(\"getPrototypeOf\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){var r=e(10),i=e(33);e(23)(\"keys\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){e(23)(\"getOwnPropertyNames\",(function(){return e(100).f}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"freeze\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"seal\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"preventExtensions\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4);e(23)(\"isFrozen\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isSealed\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isExtensible\",(function(t){return function(n){return!!r(n)&&(!t||t(n))}}))},function(t,n,e){var r=e(0);r(r.S+r.F,\"Object\",{assign:e(101)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{is:e(102)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{setPrototypeOf:e(67).set})},function(t,n,e){\"use strict\";var r=e(48),i={};i[e(5)(\"toStringTag\")]=\"z\",i+\"\"!=\"[object z]\"&&e(11)(Object.prototype,\"toString\",(function(){return\"[object \"+r(this)+\"]\"}),!0)},function(t,n,e){var r=e(0);r(r.P,\"Function\",{bind:e(103)})},function(t,n,e){var r=e(9).f,i=Function.prototype,o=/^\\s*function ([^ (]*)/;\"name\"in i||e(8)&&r(i,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(o)[1]}catch(t){return\"\"}}})},function(t,n,e){\"use strict\";var r=e(4),i=e(37),o=e(5)(\"hasInstance\"),u=Function.prototype;o in u||e(9).f(u,o,{value:function(t){if(\"function\"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(0),i=e(105);r(r.G+r.F*(parseInt!=i),{parseInt:i})},function(t,n,e){var r=e(0),i=e(106);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(25),u=e(69),a=e(28),c=e(2),s=e(36).f,f=e(22).f,l=e(9).f,h=e(41).trim,d=r.Number,p=d,v=d.prototype,g=\"Number\"==o(e(35)(v)),y=\"trim\"in String.prototype,m=function(t){var n=a(t,!1);if(\"string\"==typeof n&&n.length>2){var e,r,i,o=(n=y?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(e=n.charCodeAt(2))||120===e)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+n}for(var u,c=n.slice(2),s=0,f=c.length;s<f;s++)if((u=c.charCodeAt(s))<48||u>i)return NaN;return parseInt(c,r)}}return+n};if(!d(\" 0o1\")||!d(\"0b1\")||d(\"+0x1\")){d=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof d&&(g?c((function(){v.valueOf.call(e)})):\"Number\"!=o(e))?u(new p(m(n)),e,d):m(n)};for(var b,S=e(8)?s(p):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),w=0;S.length>w;w++)i(p,b=S[w])&&!i(d,b)&&l(d,b,f(p,b));d.prototype=v,v.constructor=d,e(11)(r,\"Number\",d)}},function(t,n,e){\"use strict\";var r=e(0),i=e(21),o=e(107),u=e(70),a=1..toFixed,c=Math.floor,s=[0,0,0,0,0,0],f=\"Number.toFixed: incorrect invocation!\",l=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*s[e],s[e]=r%1e7,r=c(r/1e7)},h=function(t){for(var n=6,e=0;--n>=0;)e+=s[n],s[n]=c(e/t),e=e%t*1e7},d=function(){for(var t=6,n=\"\";--t>=0;)if(\"\"!==n||0===t||0!==s[t]){var e=String(s[t]);n=\"\"===n?e:n+u.call(\"0\",7-e.length)+e}return n},p=function(t,n,e){return 0===n?e:n%2==1?p(t,n-1,e*t):p(t*t,n/2,e)};r(r.P+r.F*(!!a&&(\"0.000\"!==8e-5.toFixed(3)||\"1\"!==.9.toFixed(0)||\"1.25\"!==1.255.toFixed(2)||\"1000000000000000128\"!==(0xde0b6b3a7640080).toFixed(0))||!e(2)((function(){a.call({})}))),\"Number\",{toFixed:function(t){var n,e,r,a,c=o(this,f),s=i(t),v=\"\",g=\"0\";if(s<0||s>20)throw RangeError(f);if(c!=c)return\"NaN\";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v=\"-\",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*p(2,69,1))-69)<0?c*p(2,-n,1):c/p(2,n,1),e*=4503599627370496,(n=52-n)>0){for(l(0,e),r=s;r>=7;)l(1e7,0),r-=7;for(l(p(10,r,1),0),r=n-1;r>=23;)h(1<<23),r-=23;h(1<<r),l(1,1),h(2),g=d()}else l(0,e),l(1<<-n,0),g=d()+u.call(\"0\",s);return g=s>0?v+((a=g.length)<=s?\"0.\"+u.call(\"0\",s-a)+g:g.slice(0,a-s)+\".\"+g.slice(a-s)):v+g}})},function(t,n,e){\"use strict\";var r=e(0),i=e(2),o=e(107),u=1..toPrecision;r(r.P+r.F*(i((function(){return\"1\"!==u.call(1,void 0)}))||!i((function(){u.call({})}))),\"Number\",{toPrecision:function(t){var n=o(this,\"Number#toPrecision: incorrect invocation!\");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{EPSILON:Math.pow(2,-52)})},function(t,n,e){var r=e(0),i=e(1).isFinite;r(r.S,\"Number\",{isFinite:function(t){return\"number\"==typeof t&&i(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isInteger:e(108)})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(0),i=e(108),o=Math.abs;r(r.S,\"Number\",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(0),i=e(106);r(r.S+r.F*(Number.parseFloat!=i),\"Number\",{parseFloat:i})},function(t,n,e){var r=e(0),i=e(105);r(r.S+r.F*(Number.parseInt!=i),\"Number\",{parseInt:i})},function(t,n,e){var r=e(0),i=e(109),o=Math.sqrt,u=Math.acosh;r(r.S+r.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),\"Math\",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,e){var r=e(0),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),\"Math\",{asinh:function t(n){return isFinite(n=+n)&&0!=n?n<0?-t(-n):Math.log(n+Math.sqrt(n*n+1)):n}})},function(t,n,e){var r=e(0),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),\"Math\",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,e){var r=e(0),i=e(71);r(r.S,\"Math\",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,e){var r=e(0),i=Math.exp;r(r.S,\"Math\",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,e){var r=e(0),i=e(72);r(r.S+r.F*(i!=Math.expm1),\"Math\",{expm1:i})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{fround:e(178)})},function(t,n,e){var r=e(71),i=Math.pow,o=i(2,-52),u=i(2,-23),a=i(2,127)*(2-u),c=i(2,-126);t.exports=Math.fround||function(t){var n,e,i=Math.abs(t),s=r(t);return i<c?s*(i/c/u+1/o-1/o)*c*u:(e=(n=(1+u/o)*i)-(n-i))>a||e!=e?s*(1/0):s*e}},function(t,n,e){var r=e(0),i=Math.abs;r(r.S,\"Math\",{hypot:function(t,n){for(var e,r,o=0,u=0,a=arguments.length,c=0;u<a;)c<(e=i(arguments[u++]))?(o=o*(r=c/e)*r+1,c=e):o+=e>0?(r=e/c)*r:e;return c===1/0?1/0:c*Math.sqrt(o)}})},function(t,n,e){var r=e(0),i=Math.imul;r(r.S+r.F*e(2)((function(){return-5!=i(4294967295,5)||2!=i.length})),\"Math\",{imul:function(t,n){var e=+t,r=+n,i=65535&e,o=65535&r;return 0|i*o+((65535&e>>>16)*o+i*(65535&r>>>16)<<16>>>0)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log1p:e(109)})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{sign:e(71)})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S+r.F*e(2)((function(){return-2e-17!=!Math.sinh(-2e-17)})),\"Math\",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S,\"Math\",{tanh:function(t){var n=i(t=+t),e=i(-t);return n==1/0?1:e==1/0?-1:(n-e)/(o(t)+o(-t))}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,e){var r=e(0),i=e(34),o=String.fromCharCode,u=String.fromCodePoint;r(r.S+r.F*(!!u&&1!=u.length),\"String\",{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,u=0;r>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+\" is not a valid code point\");e.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return e.join(\"\")}})},function(t,n,e){var r=e(0),i=e(15),o=e(6);r(r.S,\"String\",{raw:function(t){for(var n=i(t.raw),e=o(n.length),r=arguments.length,u=[],a=0;e>a;)u.push(String(n[a++])),a<r&&u.push(String(arguments[a]));return u.join(\"\")}})},function(t,n,e){\"use strict\";e(41)(\"trim\",(function(t){return function(){return t(this,3)}}))},function(t,n,e){\"use strict\";var r=e(73)(!0);e(74)(String,\"String\",(function(t){this._t=String(t),this._i=0}),(function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})}))},function(t,n,e){\"use strict\";var r=e(0),i=e(73)(!1);r(r.P,\"String\",{codePointAt:function(t){return i(this,t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".endsWith;r(r.P+r.F*e(77)(\"endsWith\"),\"String\",{endsWith:function(t){var n=o(this,t,\"endsWith\"),e=arguments.length>1?arguments[1]:void 0,r=i(n.length),a=void 0===e?r:Math.min(i(e),r),c=String(t);return u?u.call(n,c,a):n.slice(a-c.length,a)===c}})},function(t,n,e){\"use strict\";var r=e(0),i=e(75);r(r.P+r.F*e(77)(\"includes\"),\"String\",{includes:function(t){return!!~i(this,t,\"includes\").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(0);r(r.P,\"String\",{repeat:e(70)})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".startsWith;r(r.P+r.F*e(77)(\"startsWith\"),\"String\",{startsWith:function(t){var n=o(this,t,\"startsWith\"),e=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return u?u.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){\"use strict\";e(12)(\"anchor\",(function(t){return function(n){return t(this,\"a\",\"name\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"big\",(function(t){return function(){return t(this,\"big\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"blink\",(function(t){return function(){return t(this,\"blink\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"bold\",(function(t){return function(){return t(this,\"b\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fixed\",(function(t){return function(){return t(this,\"tt\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fontcolor\",(function(t){return function(n){return t(this,\"font\",\"color\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"fontsize\",(function(t){return function(n){return t(this,\"font\",\"size\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"italics\",(function(t){return function(){return t(this,\"i\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"link\",(function(t){return function(n){return t(this,\"a\",\"href\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"small\",(function(t){return function(){return t(this,\"small\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"strike\",(function(t){return function(){return t(this,\"strike\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sub\",(function(t){return function(){return t(this,\"sub\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sup\",(function(t){return function(){return t(this,\"sup\",\"\",\"\")}}))},function(t,n,e){var r=e(0);r(r.S,\"Date\",{now:function(){return(new Date).getTime()}})},function(t,n,e){\"use strict\";var r=e(0),i=e(10),o=e(28);r(r.P+r.F*e(2)((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})),\"Date\",{toJSON:function(t){var n=i(this),e=o(n);return\"number\"!=typeof e||isFinite(e)?n.toISOString():null}})},function(t,n,e){var r=e(0),i=e(213);r(r.P+r.F*(Date.prototype.toISOString!==i),\"Date\",{toISOString:i})},function(t,n,e){\"use strict\";var r=e(2),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:\"0\"+t};t.exports=r((function(){return\"0385-07-25T07:06:39.999Z\"!=o.call(new Date(-5e13-1))}))||!r((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError(\"Invalid time value\");var t=this,n=t.getUTCFullYear(),e=t.getUTCMilliseconds(),r=n<0?\"-\":n>9999?\"+\":\"\";return r+(\"00000\"+Math.abs(n)).slice(r?-6:-4)+\"-\"+u(t.getUTCMonth()+1)+\"-\"+u(t.getUTCDate())+\"T\"+u(t.getUTCHours())+\":\"+u(t.getUTCMinutes())+\":\"+u(t.getUTCSeconds())+\".\"+(e>99?e:\"0\"+u(e))+\"Z\"}:o},function(t,n,e){var r=Date.prototype,i=r.toString,o=r.getTime;new Date(NaN)+\"\"!=\"Invalid Date\"&&e(11)(r,\"toString\",(function(){var t=o.call(this);return t==t?i.call(this):\"Invalid Date\"}))},function(t,n,e){var r=e(5)(\"toPrimitive\"),i=Date.prototype;r in i||e(14)(i,r,e(216))},function(t,n,e){\"use strict\";var r=e(3),i=e(28);t.exports=function(t){if(\"string\"!==t&&\"number\"!==t&&\"default\"!==t)throw TypeError(\"Incorrect hint\");return i(r(this),\"number\"!=t)}},function(t,n,e){var r=e(0);r(r.S,\"Array\",{isArray:e(53)})},function(t,n,e){\"use strict\";var r=e(19),i=e(0),o=e(10),u=e(111),a=e(78),c=e(6),s=e(79),f=e(80);i(i.S+i.F*!e(54)((function(t){Array.from(t)})),\"Array\",{from:function(t){var n,e,i,l,h=o(t),d=\"function\"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v,y=0,m=f(h);if(g&&(v=r(v,p>2?arguments[2]:void 0,2)),null==m||d==Array&&a(m))for(e=new d(n=c(h.length));n>y;y++)s(e,y,g?v(h[y],y):h[y]);else for(l=m.call(h),e=new d;!(i=l.next()).done;y++)s(e,y,g?u(l,v,[i.value,y],!0):i.value);return e.length=y,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(79);r(r.S+r.F*e(2)((function(){function t(){}return!(Array.of.call(t)instanceof t)})),\"Array\",{of:function(){for(var t=0,n=arguments.length,e=new(\"function\"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=[].join;r(r.P+r.F*(e(46)!=Object||!e(16)(o)),\"Array\",{join:function(t){return o.call(i(this),void 0===t?\",\":t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(66),o=e(25),u=e(34),a=e(6),c=[].slice;r(r.P+r.F*e(2)((function(){i&&c.call(i)})),\"Array\",{slice:function(t,n){var e=a(this.length),r=o(this);if(n=void 0===n?e:n,\"Array\"==r)return c.call(this,t,n);for(var i=u(t,e),s=u(n,e),f=a(s-i),l=new Array(f),h=0;h<f;h++)l[h]=\"String\"==r?this.charAt(i+h):this[i+h];return l}})},function(t,n,e){\"use strict\";var r=e(0),i=e(20),o=e(10),u=e(2),a=[].sort,c=[1,2,3];r(r.P+r.F*(u((function(){c.sort(void 0)}))||!u((function(){c.sort(null)}))||!e(16)(a)),\"Array\",{sort:function(t){return void 0===t?a.call(o(this)):a.call(o(this),i(t))}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(0),o=e(16)([].forEach,!0);r(r.P+r.F*!o,\"Array\",{forEach:function(t){return i(this,t,arguments[1])}})},function(t,n,e){var r=e(4),i=e(53),o=e(5)(\"species\");t.exports=function(t){var n;return i(t)&&(\"function\"!=typeof(n=t.constructor)||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&null===(n=n[o])&&(n=void 0)),void 0===n?Array:n}},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(1);r(r.P+r.F*!e(16)([].map,!0),\"Array\",{map:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(2);r(r.P+r.F*!e(16)([].filter,!0),\"Array\",{filter:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(3);r(r.P+r.F*!e(16)([].some,!0),\"Array\",{some:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(4);r(r.P+r.F*!e(16)([].every,!0),\"Array\",{every:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduce,!0),\"Array\",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduceRight,!0),\"Array\",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(u||!e(16)(o)),\"Array\",{indexOf:function(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=e(21),u=e(6),a=[].lastIndexOf,c=!!a&&1/[1].lastIndexOf(1,-0)<0;r(r.P+r.F*(c||!e(16)(a)),\"Array\",{lastIndexOf:function(t){if(c)return a.apply(this,arguments)||0;var n=i(this),e=u(n.length),r=e-1;for(arguments.length>1&&(r=Math.min(r,o(arguments[1]))),r<0&&(r=e+r);r>=0;r--)if(r in n&&n[r]===t)return r||0;return-1}})},function(t,n,e){var r=e(0);r(r.P,\"Array\",{copyWithin:e(114)}),e(38)(\"copyWithin\")},function(t,n,e){var r=e(0);r(r.P,\"Array\",{fill:e(81)}),e(38)(\"fill\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(5),o=!0;\"find\"in[]&&Array(1).find((function(){o=!1})),r(r.P+r.F*o,\"Array\",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"find\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(6),o=\"findIndex\",u=!0;o in[]&&Array(1)[o]((function(){u=!1})),r(r.P+r.F*u,\"Array\",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(o)},function(t,n,e){e(43)(\"Array\")},function(t,n,e){var r=e(1),i=e(69),o=e(9).f,u=e(36).f,a=e(76),c=e(55),s=r.RegExp,f=s,l=s.prototype,h=/a/g,d=/a/g,p=new s(h)!==h;if(e(8)&&(!p||e(2)((function(){return d[e(5)(\"match\")]=!1,s(h)!=h||s(d)==d||\"/a/i\"!=s(h,\"i\")})))){s=function(t,n){var e=this instanceof s,r=a(t),o=void 0===n;return!e&&r&&t.constructor===s&&o?t:i(p?new f(r&&!o?t.source:t,n):f((r=t instanceof s)?t.source:t,r&&o?c.call(t):n),e?this:l,s)};for(var v=function(t){t in s||o(s,t,{configurable:!0,get:function(){return f[t]},set:function(n){f[t]=n}})},g=u(f),y=0;g.length>y;)v(g[y++]);l.constructor=s,s.prototype=l,e(11)(r,\"RegExp\",s)}e(43)(\"RegExp\")},function(t,n,e){\"use strict\";e(117);var r=e(3),i=e(55),o=e(8),u=/./.toString,a=function(t){e(11)(RegExp.prototype,\"toString\",t,!0)};e(2)((function(){return\"/a/b\"!=u.call({source:\"a\",flags:\"b\"})}))?a((function(){var t=r(this);return\"/\".concat(t.source,\"/\",\"flags\"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)})):\"toString\"!=u.name&&a((function(){return u.call(this)}))},function(t,n,e){\"use strict\";var r=e(3),i=e(6),o=e(84),u=e(56);e(57)(\"match\",1,(function(t,n,e,a){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=a(e,t,this);if(n.done)return n.value;var c=r(t),s=String(this);if(!c.global)return u(c,s);var f=c.unicode;c.lastIndex=0;for(var l,h=[],d=0;null!==(l=u(c,s));){var p=String(l[0]);h[d]=p,\"\"===p&&(c.lastIndex=o(s,i(c.lastIndex),f)),d++}return 0===d?null:h}]}))},function(t,n,e){\"use strict\";var r=e(3),i=e(10),o=e(6),u=e(21),a=e(84),c=e(56),s=Math.max,f=Math.min,l=Math.floor,h=/\\$([$&`']|\\d\\d?|<[^>]*>)/g,d=/\\$([$&`']|\\d\\d?)/g;e(57)(\"replace\",2,(function(t,n,e,p){return[function(r,i){var o=t(this),u=null==r?void 0:r[n];return void 0!==u?u.call(r,o,i):e.call(String(o),r,i)},function(t,n){var i=p(e,t,this,n);if(i.done)return i.value;var l=r(t),h=String(this),d=\"function\"==typeof n;d||(n=String(n));var g=l.global;if(g){var y=l.unicode;l.lastIndex=0}for(var m=[];;){var b=c(l,h);if(null===b)break;if(m.push(b),!g)break;\"\"===String(b[0])&&(l.lastIndex=a(h,o(l.lastIndex),y))}for(var S,w=\"\",_=0,M=0;M<m.length;M++){b=m[M];for(var x=String(b[0]),P=s(f(u(b.index),h.length),0),O=[],A=1;A<b.length;A++)O.push(void 0===(S=b[A])?S:String(S));var F=b.groups;if(d){var E=[x].concat(O,P,h);void 0!==F&&E.push(F);var N=String(n.apply(void 0,E))}else N=v(x,h,P,O,F,n);P>=_&&(w+=h.slice(_,P)+N,_=P+x.length)}return w+h.slice(_)}];function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==u&&(u=i(u),f=h),e.call(a,f,(function(e,i){var a;switch(i.charAt(0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return n.slice(0,r);case\"'\":return n.slice(c);case\"<\":a=u[i.slice(1,-1)];break;default:var f=+i;if(0===f)return e;if(f>s){var h=l(f/10);return 0===h?e:h<=s?void 0===o[h-1]?i.charAt(1):o[h-1]+i.charAt(1):e}a=o[f-1]}return void 0===a?\"\":a}))}}))},function(t,n,e){\"use strict\";var r=e(3),i=e(102),o=e(56);e(57)(\"search\",1,(function(t,n,e,u){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=u(e,t,this);if(n.done)return n.value;var a=r(t),c=String(this),s=a.lastIndex;i(s,0)||(a.lastIndex=0);var f=o(a,c);return i(a.lastIndex,s)||(a.lastIndex=s),null===f?-1:f.index}]}))},function(t,n,e){\"use strict\";var r=e(76),i=e(3),o=e(49),u=e(84),a=e(6),c=e(56),s=e(83),f=e(2),l=Math.min,h=[].push,d=!f((function(){RegExp(4294967295,\"y\")}));e(57)(\"split\",2,(function(t,n,e,f){var p;return p=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var i=String(this);if(void 0===t&&0===n)return[];if(!r(t))return e.call(i,t,n);for(var o,u,a,c=[],f=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),l=0,d=void 0===n?4294967295:n>>>0,p=new RegExp(t.source,f+\"g\");(o=s.call(p,i))&&!((u=p.lastIndex)>l&&(c.push(i.slice(l,o.index)),o.length>1&&o.index<i.length&&h.apply(c,o.slice(1)),a=o[0].length,l=u,c.length>=d));)p.lastIndex===o.index&&p.lastIndex++;return l===i.length?!a&&p.test(\"\")||c.push(\"\"):c.push(i.slice(l)),c.length>d?c.slice(0,d):c}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,r){var i=t(this),o=null==e?void 0:e[n];return void 0!==o?o.call(e,i,r):p.call(String(i),e,r)},function(t,n){var r=f(p,t,this,n,p!==e);if(r.done)return r.value;var s=i(t),h=String(this),v=o(s,RegExp),g=s.unicode,y=(s.ignoreCase?\"i\":\"\")+(s.multiline?\"m\":\"\")+(s.unicode?\"u\":\"\")+(d?\"y\":\"g\"),m=new v(d?s:\"^(?:\"+s.source+\")\",y),b=void 0===n?4294967295:n>>>0;if(0===b)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var S=0,w=0,_=[];w<h.length;){m.lastIndex=d?w:0;var M,x=c(m,d?h:h.slice(w));if(null===x||(M=l(a(m.lastIndex+(d?0:w)),h.length))===S)w=u(h,w,g);else{if(_.push(h.slice(S,w)),_.length===b)return _;for(var P=1;P<=x.length-1;P++)if(_.push(x[P]),_.length===b)return _;w=S=M}}return _.push(h.slice(S)),_}]}))},function(t,n,e){var r=e(1),i=e(85).set,o=r.MutationObserver||r.WebKitMutationObserver,u=r.process,a=r.Promise,c=\"process\"==e(25)(u);t.exports=function(){var t,n,e,s=function(){var r,i;for(c&&(r=u.domain)&&r.exit();t;){i=t.fn,t=t.next;try{i()}catch(r){throw t?e():n=void 0,r}}n=void 0,r&&r.enter()};if(c)e=function(){u.nextTick(s)};else if(!o||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var f=a.resolve(void 0);e=function(){f.then(s)}}else e=function(){i.call(r,s)};else{var l=!0,h=document.createTextNode(\"\");new o(s).observe(h,{characterData:!0}),e=function(){h.data=l=!l}}return function(r){var i={fn:r,next:void 0};n&&(n.next=i),t||(t=i,e()),n=i}}},function(t,n){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Map\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{get:function(t){var n=r.getEntry(i(this,\"Map\"),t);return n&&n.v},set:function(t,n){return r.def(i(this,\"Map\"),0===t?0:t,n)}},r,!0)},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Set\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"Set\"),t=0===t?0:t,t)}},r)},function(t,n,e){\"use strict\";var r,i=e(1),o=e(24)(0),u=e(11),a=e(29),c=e(101),s=e(122),f=e(4),l=e(39),h=e(39),d=!i.ActiveXObject&&\"ActiveXObject\"in i,p=a.getWeak,v=Object.isExtensible,g=s.ufstore,y=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(f(t)){var n=p(t);return!0===n?g(l(this,\"WeakMap\")).get(t):n?n[this._i]:void 0}},set:function(t,n){return s.def(l(this,\"WeakMap\"),t,n)}},b=t.exports=e(60)(\"WeakMap\",y,m,s,!0,!0);h&&d&&(c((r=s.getConstructor(y,\"WeakMap\")).prototype,m),a.NEED=!0,o([\"delete\",\"has\",\"get\",\"set\"],(function(t){var n=b.prototype,e=n[t];u(n,t,(function(n,i){if(f(n)&&!v(n)){this._f||(this._f=new r);var o=this._f[t](n,i);return\"set\"==t?this:o}return e.call(this,n,i)}))})))},function(t,n,e){\"use strict\";var r=e(122),i=e(39);e(60)(\"WeakSet\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"WeakSet\"),t,!0)}},r,!1,!0)},function(t,n,e){\"use strict\";var r=e(0),i=e(61),o=e(86),u=e(3),a=e(34),c=e(6),s=e(4),f=e(1).ArrayBuffer,l=e(49),h=o.ArrayBuffer,d=o.DataView,p=i.ABV&&f.isView,v=h.prototype.slice,g=i.VIEW;r(r.G+r.W+r.F*(f!==h),{ArrayBuffer:h}),r(r.S+r.F*!i.CONSTR,\"ArrayBuffer\",{isView:function(t){return p&&p(t)||s(t)&&g in t}}),r(r.P+r.U+r.F*e(2)((function(){return!new h(2).slice(1,void 0).byteLength})),\"ArrayBuffer\",{slice:function(t,n){if(void 0!==v&&void 0===n)return v.call(u(this),t);for(var e=u(this).byteLength,r=a(t,e),i=a(void 0===n?e:n,e),o=new(l(this,h))(c(i-r)),s=new d(this),f=new d(o),p=0;r<i;)f.setUint8(p++,s.getUint8(r++));return o}}),e(43)(\"ArrayBuffer\")},function(t,n,e){var r=e(0);r(r.G+r.W+r.F*!e(61).ABV,{DataView:e(86).DataView})},function(t,n,e){e(27)(\"Int8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}),!0)},function(t,n,e){e(27)(\"Int16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Int32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float64\",8,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){var r=e(0),i=e(20),o=e(3),u=(e(1).Reflect||{}).apply,a=Function.apply;r(r.S+r.F*!e(2)((function(){u((function(){}))})),\"Reflect\",{apply:function(t,n,e){var r=i(t),c=o(e);return u?u(r,n,c):a.call(r,n,c)}})},function(t,n,e){var r=e(0),i=e(35),o=e(20),u=e(3),a=e(4),c=e(2),s=e(103),f=(e(1).Reflect||{}).construct,l=c((function(){function t(){}return!(f((function(){}),[],t)instanceof t)})),h=!c((function(){f((function(){}))}));r(r.S+r.F*(l||h),\"Reflect\",{construct:function(t,n){o(t),u(n);var e=arguments.length<3?t:o(arguments[2]);if(h&&!l)return f(t,n,e);if(t==e){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var r=[null];return r.push.apply(r,n),new(s.apply(t,r))}var c=e.prototype,d=i(a(c)?c:Object.prototype),p=Function.apply.call(t,d,n);return a(p)?p:d}})},function(t,n,e){var r=e(9),i=e(0),o=e(3),u=e(28);i(i.S+i.F*e(2)((function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})})),\"Reflect\",{defineProperty:function(t,n,e){o(t),n=u(n,!0),o(e);try{return r.f(t,n,e),!0}catch(t){return!1}}})},function(t,n,e){var r=e(0),i=e(22).f,o=e(3);r(r.S,\"Reflect\",{deleteProperty:function(t,n){var e=i(o(t),n);return!(e&&!e.configurable)&&delete t[n]}})},function(t,n,e){\"use strict\";var r=e(0),i=e(3),o=function(t){this._t=i(t),this._i=0;var n,e=this._k=[];for(n in t)e.push(n)};e(110)(o,\"Object\",(function(){var t,n=this._k;do{if(this._i>=n.length)return{value:void 0,done:!0}}while(!((t=n[this._i++])in this._t));return{value:t,done:!1}})),r(r.S,\"Reflect\",{enumerate:function(t){return new o(t)}})},function(t,n,e){var r=e(22),i=e(37),o=e(13),u=e(0),a=e(4),c=e(3);u(u.S,\"Reflect\",{get:function t(n,e){var u,s,f=arguments.length<3?n:arguments[2];return c(n)===f?n[e]:(u=r.f(n,e))?o(u,\"value\")?u.value:void 0!==u.get?u.get.call(f):void 0:a(s=i(n))?t(s,e,f):void 0}})},function(t,n,e){var r=e(22),i=e(0),o=e(3);i(i.S,\"Reflect\",{getOwnPropertyDescriptor:function(t,n){return r.f(o(t),n)}})},function(t,n,e){var r=e(0),i=e(37),o=e(3);r(r.S,\"Reflect\",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{has:function(t,n){return n in t}})},function(t,n,e){var r=e(0),i=e(3),o=Object.isExtensible;r(r.S,\"Reflect\",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{ownKeys:e(124)})},function(t,n,e){var r=e(0),i=e(3),o=Object.preventExtensions;r(r.S,\"Reflect\",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,e){var r=e(9),i=e(22),o=e(37),u=e(13),a=e(0),c=e(30),s=e(3),f=e(4);a(a.S,\"Reflect\",{set:function t(n,e,a){var l,h,d=arguments.length<4?n:arguments[3],p=i.f(s(n),e);if(!p){if(f(h=o(n)))return t(h,e,a,d);p=c(0)}if(u(p,\"value\")){if(!1===p.writable||!f(d))return!1;if(l=i.f(d,e)){if(l.get||l.set||!1===l.writable)return!1;l.value=a,r.f(d,e,l)}else r.f(d,e,c(0,a));return!0}return void 0!==p.set&&(p.set.call(d,a),!0)}})},function(t,n,e){var r=e(0),i=e(67);i&&r(r.S,\"Reflect\",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,e){e(276),t.exports=e(7).Array.includes},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!0);r(r.P,\"Array\",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"includes\")},function(t,n,e){e(278),t.exports=e(7).Array.flatMap},function(t,n,e){\"use strict\";var r=e(0),i=e(279),o=e(10),u=e(6),a=e(20),c=e(112);r(r.P,\"Array\",{flatMap:function(t){var n,e,r=o(this);return a(t),n=u(r.length),e=c(r,0),i(e,r,r,n,0,1,t,arguments[1]),e}}),e(38)(\"flatMap\")},function(t,n,e){\"use strict\";var r=e(53),i=e(4),o=e(6),u=e(19),a=e(5)(\"isConcatSpreadable\");t.exports=function t(n,e,c,s,f,l,h,d){for(var p,v,g=f,y=0,m=!!h&&u(h,d,3);y<s;){if(y in c){if(p=m?m(c[y],y,e):c[y],v=!1,i(p)&&(v=void 0!==(v=p[a])?!!v:r(p)),v&&l>0)g=t(n,e,p,o(p.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();n[g]=p}g++}y++}return g}},function(t,n,e){e(281),t.exports=e(7).String.padStart},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,e){e(283),t.exports=e(7).String.padEnd},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,e){e(285),t.exports=e(7).String.trimLeft},function(t,n,e){\"use strict\";e(41)(\"trimLeft\",(function(t){return function(){return t(this,1)}}),\"trimStart\")},function(t,n,e){e(287),t.exports=e(7).String.trimRight},function(t,n,e){\"use strict\";e(41)(\"trimRight\",(function(t){return function(){return t(this,2)}}),\"trimEnd\")},function(t,n,e){e(289),t.exports=e(63).f(\"asyncIterator\")},function(t,n,e){e(97)(\"asyncIterator\")},function(t,n,e){e(291),t.exports=e(7).Object.getOwnPropertyDescriptors},function(t,n,e){var r=e(0),i=e(124),o=e(15),u=e(22),a=e(79);r(r.S,\"Object\",{getOwnPropertyDescriptors:function(t){for(var n,e,r=o(t),c=u.f,s=i(r),f={},l=0;s.length>l;)void 0!==(e=c(r,n=s[l++]))&&a(f,n,e);return f}})},function(t,n,e){e(293),t.exports=e(7).Object.values},function(t,n,e){var r=e(0),i=e(126)(!1);r(r.S,\"Object\",{values:function(t){return i(t)}})},function(t,n,e){e(295),t.exports=e(7).Object.entries},function(t,n,e){var r=e(0),i=e(126)(!0);r(r.S,\"Object\",{entries:function(t){return i(t)}})},function(t,n,e){\"use strict\";e(118),e(297),t.exports=e(7).Promise.finally},function(t,n,e){\"use strict\";var r=e(0),i=e(7),o=e(1),u=e(49),a=e(120);r(r.P+r.R,\"Promise\",{finally:function(t){var n=u(this,i.Promise||o.Promise),e=\"function\"==typeof t;return this.then(e?function(e){return a(n,t()).then((function(){return e}))}:t,e?function(e){return a(n,t()).then((function(){throw e}))}:t)}})},function(t,n,e){e(299),e(300),e(301),t.exports=e(7)},function(t,n,e){var r=e(1),i=e(0),o=e(59),u=[].slice,a=/MSIE .\\./.test(o),c=function(t){return function(n,e){var r=arguments.length>2,i=!!r&&u.call(arguments,2);return t(r?function(){(\"function\"==typeof n?n:Function(n)).apply(this,i)}:n,e)}};i(i.G+i.B+i.F*a,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(t,n,e){var r=e(0),i=e(85);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,e){for(var r=e(82),i=e(33),o=e(11),u=e(1),a=e(14),c=e(42),s=e(5),f=s(\"iterator\"),l=s(\"toStringTag\"),h=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),v=0;v<p.length;v++){var g,y=p[v],m=d[y],b=u[y],S=b&&b.prototype;if(S&&(S[f]||a(S,f,h),S[l]||a(S,l,y),c[y]=h,m))for(g in r)S[g]||o(S,g,r[g],!0)}},function(t,n,e){var r=function(t){\"use strict\";var n,e=Object.prototype,r=e.hasOwnProperty,i=\"function\"==typeof Symbol?Symbol:{},o=i.iterator||\"@@iterator\",u=i.asyncIterator||\"@@asyncIterator\",a=i.toStringTag||\"@@toStringTag\";function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.create(i.prototype),u=new A(r||[]);return o._invoke=function(t,n,e){var r=f;return function(i,o){if(r===h)throw new Error(\"Generator is already running\");if(r===d){if(\"throw\"===i)throw o;return E()}for(e.method=i,e.arg=o;;){var u=e.delegate;if(u){var a=x(u,e);if(a){if(a===p)continue;return a}}if(\"next\"===e.method)e.sent=e._sent=e.arg;else if(\"throw\"===e.method){if(r===f)throw r=d,e.arg;e.dispatchException(e.arg)}else\"return\"===e.method&&e.abrupt(\"return\",e.arg);r=h;var c=s(t,n,e);if(\"normal\"===c.type){if(r=e.done?d:l,c.arg===p)continue;return{value:c.arg,done:e.done}}\"throw\"===c.type&&(r=d,e.method=\"throw\",e.arg=c.arg)}}}(t,e,u),o}function s(t,n,e){try{return{type:\"normal\",arg:t.call(n,e)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=c;var f=\"suspendedStart\",l=\"suspendedYield\",h=\"executing\",d=\"completed\",p={};function v(){}function g(){}function y(){}var m={};m[o]=function(){return this};var b=Object.getPrototypeOf,S=b&&b(b(F([])));S&&S!==e&&r.call(S,o)&&(m=S);var w=y.prototype=v.prototype=Object.create(m);function _(t){[\"next\",\"throw\",\"return\"].forEach((function(n){t[n]=function(t){return this._invoke(n,t)}}))}function M(t){var n;this._invoke=function(e,i){function o(){return new Promise((function(n,o){!function n(e,i,o,u){var a=s(t[e],t,i);if(\"throw\"!==a.type){var c=a.arg,f=c.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?Promise.resolve(f.__await).then((function(t){n(\"next\",t,o,u)}),(function(t){n(\"throw\",t,o,u)})):Promise.resolve(f).then((function(t){c.value=t,o(c)}),(function(t){return n(\"throw\",t,o,u)}))}u(a.arg)}(e,i,n,o)}))}return n=n?n.then(o,o):o()}}function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=n,x(t,e),\"throw\"===e.method))return p;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return p}var i=s(r,t.iterator,e.arg);if(\"throw\"===i.type)return e.method=\"throw\",e.arg=i.arg,e.delegate=null,p;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=n),e.delegate=null,p):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,p)}function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function O(t){var n=t.completion||{};n.type=\"normal\",delete n.arg,t.completion=n}function A(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(P,this),this.reset(!0)}function F(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,u=function e(){for(;++i<t.length;)if(r.call(t,i))return e.value=t[i],e.done=!1,e;return e.value=n,e.done=!0,e};return u.next=u}}return{next:E}}function E(){return{value:n,done:!0}}return g.prototype=w.constructor=y,y.constructor=g,y[a]=g.displayName=\"GeneratorFunction\",t.isGeneratorFunction=function(t){var n=\"function\"==typeof t&&t.constructor;return!!n&&(n===g||\"GeneratorFunction\"===(n.displayName||n.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,y):(t.__proto__=y,a in t||(t[a]=\"GeneratorFunction\")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},_(M.prototype),M.prototype[u]=function(){return this},t.AsyncIterator=M,t.async=function(n,e,r,i){var o=new M(c(n,e,r,i));return t.isGeneratorFunction(e)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},_(w),w[a]=\"Generator\",w[o]=function(){return this},w.toString=function(){return\"[object Generator]\"},t.keys=function(t){var n=[];for(var e in t)n.push(e);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=F,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=n,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=n)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function i(r,i){return a.type=\"throw\",a.arg=t,e.next=r,i&&(e.method=\"next\",e.arg=n),!!i}for(var o=this.tryEntries.length-1;o>=0;--o){var u=this.tryEntries[o],a=u.completion;if(\"root\"===u.tryLoc)return i(\"end\");if(u.tryLoc<=this.prev){var c=r.call(u,\"catchLoc\"),s=r.call(u,\"finallyLoc\");if(c&&s){if(this.prev<u.catchLoc)return i(u.catchLoc,!0);if(this.prev<u.finallyLoc)return i(u.finallyLoc)}else if(c){if(this.prev<u.catchLoc)return i(u.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<u.finallyLoc)return i(u.finallyLoc)}}}},abrupt:function(t,n){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc<=this.prev&&r.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var o=i;break}}o&&(\"break\"===t||\"continue\"===t)&&o.tryLoc<=n&&n<=o.finallyLoc&&(o=null);var u=o?o.completion:{};return u.type=t,u.arg=n,o?(this.method=\"next\",this.next=o.finallyLoc,p):this.complete(u)},complete:function(t,n){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&n&&(this.next=n),p},finish:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),O(e),p}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc===t){var r=e.completion;if(\"throw\"===r.type){var i=r.arg;O(e)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:F(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=n),p}},t}(t.exports);try{regeneratorRuntime=r}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(r)}},function(t,n,e){e(304),t.exports=e(127).global},function(t,n,e){var r=e(305);r(r.G,{global:e(87)})},function(t,n,e){var r=e(87),i=e(127),o=e(306),u=e(308),a=e(315),c=function(t,n,e){var s,f,l,h=t&c.F,d=t&c.G,p=t&c.S,v=t&c.P,g=t&c.B,y=t&c.W,m=d?i:i[n]||(i[n]={}),b=m.prototype,S=d?r:p?r[n]:(r[n]||{}).prototype;for(s in d&&(e=n),e)(f=!h&&S&&void 0!==S[s])&&a(m,s)||(l=f?S[s]:e[s],m[s]=d&&\"function\"!=typeof S[s]?e[s]:g&&f?o(l,r):y&&S[s]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n.prototype=t.prototype,n}(l):v&&\"function\"==typeof l?o(Function.call,l):l,v&&((m.virtual||(m.virtual={}))[s]=l,t&c.R&&b&&!b[s]&&u(b,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n,e){var r=e(307);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n,e){var r=e(309),i=e(314);t.exports=e(89)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(310),i=e(311),o=e(313),u=Object.defineProperty;n.f=e(89)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(88);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n,e){t.exports=!e(89)&&!e(128)((function(){return 7!=Object.defineProperty(e(312)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(88),i=e(87).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){var r=e(88);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}}])}));\n    "
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/bowser.d.ts",
    "content": "// Type definitions for Bowser v2\n// Project: https://github.com/lancedikson/bowser\n// Definitions by: Alexander P. Cerutti <https://github.com/alexandercerutti>,\n\nexport = Bowser;\nexport as namespace Bowser;\n\nexport declare namespace Bowser {\n  /**\n   * Creates a Parser instance\n   * @param {string} UA - User agent string\n   * @param {boolean} skipParsing\n   */\n\n  function getParser(UA: string, skipParsing?: boolean): Parser.Parser;\n\n  /**\n   * Creates a Parser instance and runs Parser.getResult immediately\n   * @param UA - User agent string\n   * @returns {Parser.ParsedResult}\n   */\n\n  function parse(UA: string): Parser.ParsedResult;\n\n  /**\n   * Constants exposed via bowser getters\n   */\n  const BROWSER_MAP: Record<string, string>;\n  const ENGINE_MAP: Record<string, string>;\n  const OS_MAP: Record<string, string>;\n  const PLATFORMS_MAP: Record<string, string>;\n\n  namespace Parser {\n    interface Parser {\n      constructor(UA: string, skipParsing?: boolean): Parser.Parser;\n\n      /**\n       * Get parsed browser object\n       * @return {BrowserDetails} Browser's details\n       */\n\n      getBrowser(): BrowserDetails;\n\n      /**\n       * Get browser's name\n       * @return {String} Browser's name or an empty string\n       */\n\n      getBrowserName(): string;\n\n      /**\n       * Get browser's version\n       * @return {String} version of browser\n       */\n\n      getBrowserVersion(): string;\n\n      /**\n       * Get OS\n       * @return {OSDetails} - OS Details\n       *\n       * @example\n       * this.getOS(); // {\n       * //   name: 'macOS',\n       * //   version: '10.11.12',\n       * // }\n       */\n\n      getOS(): OSDetails;\n\n      /**\n       * Get OS name\n       * @param {Boolean} [toLowerCase] return lower-cased value\n       * @return {String} name of the OS — macOS, Windows, Linux, etc.\n       */\n\n      getOSName(toLowerCase?: boolean): string;\n\n      /**\n       * Get OS version\n       * @return {String} full version with dots ('10.11.12', '5.6', etc)\n       */\n\n      getOSVersion(): string;\n\n      /**\n       * Get parsed platform\n       * @returns {PlatformDetails}\n       */\n\n      getPlatform(): PlatformDetails;\n\n      /**\n       * Get platform name\n       * @param {boolean} toLowerCase\n       */\n\n      getPlatformType(toLowerCase?: boolean): string;\n\n      /**\n       * Get parsed engine\n       * @returns {EngineDetails}\n       */\n\n      getEngine(): EngineDetails;\n\n      /**\n       * Get parsed result\n       * @return {ParsedResult}\n       */\n\n      getResult(): ParsedResult;\n\n      /**\n       * Get UserAgent string of current Parser instance\n       * @return {String} User-Agent String of the current <Parser> object\n       */\n\n      getUA(): string;\n\n      /**\n       * Is anything? Check if the browser is called \"anything\",\n       * the OS called \"anything\" or the platform called \"anything\"\n       * @param {String} anything\n       * @returns {Boolean}\n       */\n\n      is(anything: any): boolean;\n\n      /**\n       * Parse full information about the browser\n       */\n\n      parse(): void;\n\n      /**\n       * Get parsed browser object\n       * @returns {BrowserDetails}\n       */\n\n      parseBrowser(): BrowserDetails;\n\n      /**\n       * Get parsed engine\n       * @returns {EngineDetails}\n       */\n\n      parseEngine(): EngineDetails;\n\n      /**\n       * Parse OS and save it to this.parsedResult.os\n       * @returns {OSDetails}\n       */\n\n      parseOS(): OSDetails;\n\n      /**\n       * Get parsed platform\n       * @returns {PlatformDetails}\n       */\n\n      parsePlatform(): PlatformDetails;\n\n      /**\n       * Check if parsed browser matches certain conditions\n       *\n       * @param {checkTree} checkTree It's one or two layered object,\n       * which can include a platform or an OS on the first layer\n       * and should have browsers specs on the bottom-laying layer\n       *\n       * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not.\n       * Returns `undefined` when the browser is no described in the checkTree object.\n       *\n       * @example\n       * const browser = new Bowser(UA);\n       * if (browser.check({chrome: '>118.01.1322' }))\n       * // or with os\n       * if (browser.check({windows: { chrome: '>118.01.1322' } }))\n       * // or with platforms\n       * if (browser.check({desktop: { chrome: '>118.01.1322' } }))\n       */\n\n      satisfies(checkTree: checkTree): boolean | undefined;\n\n       /**\n       * Check if the browser name equals the passed string\n       * @param browserName The string to compare with the browser name\n       * @param [includingAlias=false] The flag showing whether alias will be included into comparison\n       * @returns {boolean}\n       */\n\n\n      isBrowser(browserName: string, includingAlias?: boolean): boolean;\n\n      /**\n       * Check if any of the given values satifies `.is(anything)`\n       * @param {string[]} anythings\n       * @returns {boolean} true if at least one condition is satisfied, false otherwise.\n       */\n\n      some(anythings: string[]): boolean | undefined;\n\n      /**\n       * Test a UA string for a regexp\n       * @param regex\n       * @returns {boolean} true if the regex matches the UA, false otherwise.\n       */\n\n      test(regex: RegExp): boolean;\n    }\n\n    interface ParsedResult {\n      browser: BrowserDetails;\n      os: OSDetails;\n      platform: PlatformDetails;\n      engine: EngineDetails;\n    }\n\n    interface Details {\n      name?: string;\n      version?: string;\n    }\n\n    interface OSDetails extends Details {\n      versionName?: string;\n    }\n\n    interface PlatformDetails {\n      type?: string;\n      vendor?: string;\n      model?: string;\n    }\n\n    type BrowserDetails = Details;\n    type EngineDetails = Details;\n\n    interface checkTree {\n      [key: string]: any;\n    }\n  }\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/README.md",
    "content": "# Chevrotain\n\nFor details see:\n\n-   Chevrotain's [website](https://sap.github.io/chevrotain/docs/).\n-   Chevrotain's root [README](https://github.com/SAP/chevrotain).\n\n## Install\n\nUsing npm:\n\n```sh\nnpm install chevrotain\n```\n\nor using yarn:\n\n```sh\nyarn add chevrotain\n```\n"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/chevrotain.js",
    "content": "/*! chevrotain - v6.5.0 */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"chevrotain\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"chevrotain\"] = factory();\n\telse\n\t\troot[\"chevrotain\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 18);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/*\n Utils using lodash style API. (not necessarily 100% compliant) for functional and other utils.\n These utils should replace usage of lodash in the production code base. not because they are any better...\n but for the purpose of being a dependency free library.\n\n The hotspots in the code are already written in imperative style for performance reasons.\n so writing several dozen utils which may be slower than the original lodash, does not matter as much\n considering they will not be invoked in hotspots...\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isEmpty(arr) {\n    return arr && arr.length === 0;\n}\nexports.isEmpty = isEmpty;\nfunction keys(obj) {\n    if (obj === undefined || obj === null) {\n        return [];\n    }\n    return Object.keys(obj);\n}\nexports.keys = keys;\nfunction values(obj) {\n    var vals = [];\n    var keys = Object.keys(obj);\n    for (var i = 0; i < keys.length; i++) {\n        vals.push(obj[keys[i]]);\n    }\n    return vals;\n}\nexports.values = values;\nfunction mapValues(obj, callback) {\n    var result = [];\n    var objKeys = keys(obj);\n    for (var idx = 0; idx < objKeys.length; idx++) {\n        var currKey = objKeys[idx];\n        result.push(callback.call(null, obj[currKey], currKey));\n    }\n    return result;\n}\nexports.mapValues = mapValues;\nfunction map(arr, callback) {\n    var result = [];\n    for (var idx = 0; idx < arr.length; idx++) {\n        result.push(callback.call(null, arr[idx], idx));\n    }\n    return result;\n}\nexports.map = map;\nfunction flatten(arr) {\n    var result = [];\n    for (var idx = 0; idx < arr.length; idx++) {\n        var currItem = arr[idx];\n        if (Array.isArray(currItem)) {\n            result = result.concat(flatten(currItem));\n        }\n        else {\n            result.push(currItem);\n        }\n    }\n    return result;\n}\nexports.flatten = flatten;\nfunction first(arr) {\n    return isEmpty(arr) ? undefined : arr[0];\n}\nexports.first = first;\nfunction last(arr) {\n    var len = arr && arr.length;\n    return len ? arr[len - 1] : undefined;\n}\nexports.last = last;\nfunction forEach(collection, iteratorCallback) {\n    /* istanbul ignore else */\n    if (Array.isArray(collection)) {\n        for (var i = 0; i < collection.length; i++) {\n            iteratorCallback.call(null, collection[i], i);\n        }\n    }\n    else if (isObject(collection)) {\n        var colKeys = keys(collection);\n        for (var i = 0; i < colKeys.length; i++) {\n            var key = colKeys[i];\n            var value = collection[key];\n            iteratorCallback.call(null, value, key);\n        }\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.forEach = forEach;\nfunction isString(item) {\n    return typeof item === \"string\";\n}\nexports.isString = isString;\nfunction isUndefined(item) {\n    return item === undefined;\n}\nexports.isUndefined = isUndefined;\nfunction isFunction(item) {\n    return item instanceof Function;\n}\nexports.isFunction = isFunction;\nfunction drop(arr, howMuch) {\n    if (howMuch === void 0) { howMuch = 1; }\n    return arr.slice(howMuch, arr.length);\n}\nexports.drop = drop;\nfunction dropRight(arr, howMuch) {\n    if (howMuch === void 0) { howMuch = 1; }\n    return arr.slice(0, arr.length - howMuch);\n}\nexports.dropRight = dropRight;\nfunction filter(arr, predicate) {\n    var result = [];\n    if (Array.isArray(arr)) {\n        for (var i = 0; i < arr.length; i++) {\n            var item = arr[i];\n            if (predicate.call(null, item)) {\n                result.push(item);\n            }\n        }\n    }\n    return result;\n}\nexports.filter = filter;\nfunction reject(arr, predicate) {\n    return filter(arr, function (item) { return !predicate(item); });\n}\nexports.reject = reject;\nfunction pick(obj, predicate) {\n    var keys = Object.keys(obj);\n    var result = {};\n    for (var i = 0; i < keys.length; i++) {\n        var currKey = keys[i];\n        var currItem = obj[currKey];\n        if (predicate(currItem)) {\n            result[currKey] = currItem;\n        }\n    }\n    return result;\n}\nexports.pick = pick;\nfunction has(obj, prop) {\n    if (isObject(obj)) {\n        return obj.hasOwnProperty(prop);\n    }\n    return false;\n}\nexports.has = has;\nfunction contains(arr, item) {\n    return find(arr, function (currItem) { return currItem === item; }) !== undefined ? true : false;\n}\nexports.contains = contains;\n/**\n * shallow clone\n */\nfunction cloneArr(arr) {\n    var newArr = [];\n    for (var i = 0; i < arr.length; i++) {\n        newArr.push(arr[i]);\n    }\n    return newArr;\n}\nexports.cloneArr = cloneArr;\n/**\n * shallow clone\n */\nfunction cloneObj(obj) {\n    var clonedObj = {};\n    for (var key in obj) {\n        /* istanbul ignore else */\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n            clonedObj[key] = obj[key];\n        }\n    }\n    return clonedObj;\n}\nexports.cloneObj = cloneObj;\nfunction find(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        var item = arr[i];\n        if (predicate.call(null, item)) {\n            return item;\n        }\n    }\n    return undefined;\n}\nexports.find = find;\nfunction findAll(arr, predicate) {\n    var found = [];\n    for (var i = 0; i < arr.length; i++) {\n        var item = arr[i];\n        if (predicate.call(null, item)) {\n            found.push(item);\n        }\n    }\n    return found;\n}\nexports.findAll = findAll;\nfunction reduce(arrOrObj, iterator, initial) {\n    var isArr = Array.isArray(arrOrObj);\n    var vals = isArr ? arrOrObj : values(arrOrObj);\n    var objKeys = isArr ? [] : keys(arrOrObj);\n    var accumulator = initial;\n    for (var i = 0; i < vals.length; i++) {\n        accumulator = iterator.call(null, accumulator, vals[i], isArr ? i : objKeys[i]);\n    }\n    return accumulator;\n}\nexports.reduce = reduce;\nfunction compact(arr) {\n    return reject(arr, function (item) { return item === null || item === undefined; });\n}\nexports.compact = compact;\nfunction uniq(arr, identity) {\n    if (identity === void 0) { identity = function (item) { return item; }; }\n    var identities = [];\n    return reduce(arr, function (result, currItem) {\n        var currIdentity = identity(currItem);\n        if (contains(identities, currIdentity)) {\n            return result;\n        }\n        else {\n            identities.push(currIdentity);\n            return result.concat(currItem);\n        }\n    }, []);\n}\nexports.uniq = uniq;\nfunction partial(func) {\n    var restArgs = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        restArgs[_i - 1] = arguments[_i];\n    }\n    var firstArg = [null];\n    var allArgs = firstArg.concat(restArgs);\n    return Function.bind.apply(func, allArgs);\n}\nexports.partial = partial;\nfunction isArray(obj) {\n    return Array.isArray(obj);\n}\nexports.isArray = isArray;\nfunction isRegExp(obj) {\n    return obj instanceof RegExp;\n}\nexports.isRegExp = isRegExp;\nfunction isObject(obj) {\n    return obj instanceof Object;\n}\nexports.isObject = isObject;\nfunction every(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        if (!predicate(arr[i], i)) {\n            return false;\n        }\n    }\n    return true;\n}\nexports.every = every;\nfunction difference(arr, values) {\n    return reject(arr, function (item) { return contains(values, item); });\n}\nexports.difference = difference;\nfunction some(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        if (predicate(arr[i])) {\n            return true;\n        }\n    }\n    return false;\n}\nexports.some = some;\nfunction indexOf(arr, value) {\n    for (var i = 0; i < arr.length; i++) {\n        if (arr[i] === value) {\n            return i;\n        }\n    }\n    return -1;\n}\nexports.indexOf = indexOf;\nfunction sortBy(arr, orderFunc) {\n    var result = cloneArr(arr);\n    result.sort(function (a, b) { return orderFunc(a) - orderFunc(b); });\n    return result;\n}\nexports.sortBy = sortBy;\nfunction zipObject(keys, values) {\n    if (keys.length !== values.length) {\n        throw Error(\"can't zipObject with different number of keys and values!\");\n    }\n    var result = {};\n    for (var i = 0; i < keys.length; i++) {\n        result[keys[i]] = values[i];\n    }\n    return result;\n}\nexports.zipObject = zipObject;\n/**\n * mutates! (and returns) target\n */\nfunction assign(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    for (var i = 0; i < sources.length; i++) {\n        var curSource = sources[i];\n        var currSourceKeys = keys(curSource);\n        for (var j = 0; j < currSourceKeys.length; j++) {\n            var currKey = currSourceKeys[j];\n            target[currKey] = curSource[currKey];\n        }\n    }\n    return target;\n}\nexports.assign = assign;\n/**\n * mutates! (and returns) target\n */\nfunction assignNoOverwrite(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    for (var i = 0; i < sources.length; i++) {\n        var curSource = sources[i];\n        if (isUndefined(curSource)) {\n            continue;\n        }\n        var currSourceKeys = keys(curSource);\n        for (var j = 0; j < currSourceKeys.length; j++) {\n            var currKey = currSourceKeys[j];\n            if (!has(target, currKey)) {\n                target[currKey] = curSource[currKey];\n            }\n        }\n    }\n    return target;\n}\nexports.assignNoOverwrite = assignNoOverwrite;\nfunction defaults() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    return assignNoOverwrite.apply(null, [{}].concat(sources));\n}\nexports.defaults = defaults;\nfunction groupBy(arr, groupKeyFunc) {\n    var result = {};\n    forEach(arr, function (item) {\n        var currGroupKey = groupKeyFunc(item);\n        var currGroupArr = result[currGroupKey];\n        if (currGroupArr) {\n            currGroupArr.push(item);\n        }\n        else {\n            result[currGroupKey] = [item];\n        }\n    });\n    return result;\n}\nexports.groupBy = groupBy;\n/**\n * Merge obj2 into obj1.\n * Will overwrite existing properties with the same name\n */\nfunction merge(obj1, obj2) {\n    var result = cloneObj(obj1);\n    var keys2 = keys(obj2);\n    for (var i = 0; i < keys2.length; i++) {\n        var key = keys2[i];\n        var value = obj2[key];\n        result[key] = value;\n    }\n    return result;\n}\nexports.merge = merge;\nfunction NOOP() { }\nexports.NOOP = NOOP;\nfunction IDENTITY(item) {\n    return item;\n}\nexports.IDENTITY = IDENTITY;\n/**\n * Will return a new packed array with same values.\n */\nfunction packArray(holeyArr) {\n    var result = [];\n    for (var i = 0; i < holeyArr.length; i++) {\n        var orgValue = holeyArr[i];\n        result.push(orgValue !== undefined ? orgValue : undefined);\n    }\n    return result;\n}\nexports.packArray = packArray;\nfunction PRINT_ERROR(msg) {\n    /* istanbul ignore else - can't override global.console in node.js */\n    if (console && console.error) {\n        console.error(\"Error: \" + msg);\n    }\n}\nexports.PRINT_ERROR = PRINT_ERROR;\nfunction PRINT_WARNING(msg) {\n    /* istanbul ignore else - can't override global.console in node.js*/\n    if (console && console.warn) {\n        // TODO: modify docs accordingly\n        console.warn(\"Warning: \" + msg);\n    }\n}\nexports.PRINT_WARNING = PRINT_WARNING;\nfunction isES2015MapSupported() {\n    return typeof Map === \"function\";\n}\nexports.isES2015MapSupported = isES2015MapSupported;\nfunction applyMixins(derivedCtor, baseCtors) {\n    baseCtors.forEach(function (baseCtor) {\n        var baseProto = baseCtor.prototype;\n        Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n            if (propName === \"constructor\") {\n                return;\n            }\n            var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n            // Handle Accessors\n            if (basePropDescriptor &&\n                (basePropDescriptor.get || basePropDescriptor.set)) {\n                Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n            }\n            else {\n                derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n            }\n        });\n    });\n}\nexports.applyMixins = applyMixins;\n// base on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n    function FakeConstructor() { }\n    // If our object is used as a constructor it would receive\n    FakeConstructor.prototype = toBecomeFast;\n    var fakeInstance = new FakeConstructor();\n    function fakeAccess() {\n        return typeof fakeInstance.bar;\n    }\n    // help V8 understand this is a \"real\" prototype by actually using\n    // the fake instance.\n    fakeAccess();\n    fakeAccess();\n    return toBecomeFast;\n    // Eval prevents optimization of this method (even though this is dead code)\n    /* istanbul ignore next */\n    // tslint:disable-next-line\n    eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\nfunction peek(arr) {\n    return arr[arr.length - 1];\n}\nexports.peek = peek;\n/* istanbul ignore next - for performance tracing*/\nfunction timer(func) {\n    var start = new Date().getTime();\n    var val = func();\n    var end = new Date().getTime();\n    var total = end - start;\n    return { time: total, value: val };\n}\nexports.timer = timer;\n//# sourceMappingURL=utils.js.map\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar tokens_public_1 = __webpack_require__(3);\nvar AbstractProduction = /** @class */ (function () {\n    function AbstractProduction(definition) {\n        this.definition = definition;\n    }\n    AbstractProduction.prototype.accept = function (visitor) {\n        visitor.visit(this);\n        utils_1.forEach(this.definition, function (prod) {\n            prod.accept(visitor);\n        });\n    };\n    return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n    __extends(NonTerminal, _super);\n    function NonTerminal(options) {\n        var _this = _super.call(this, []) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    Object.defineProperty(NonTerminal.prototype, \"definition\", {\n        get: function () {\n            if (this.referencedRule !== undefined) {\n                return this.referencedRule.definition;\n            }\n            return [];\n        },\n        set: function (definition) {\n            // immutable\n        },\n        enumerable: true,\n        configurable: true\n    });\n    NonTerminal.prototype.accept = function (visitor) {\n        visitor.visit(this);\n        // don't visit children of a reference, we will get cyclic infinite loops if we do so\n    };\n    return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n    __extends(Rule, _super);\n    function Rule(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.orgText = \"\";\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\n// TODO: is this only used in an Alternation?\n//       Perhaps `Flat` should be renamed to `Alternative`?\nvar Flat = /** @class */ (function (_super) {\n    __extends(Flat, _super);\n    // A named Flat production is used to indicate a Nested Rule in an alternation\n    function Flat(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.ignoreAmbiguities = false;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Flat;\n}(AbstractProduction));\nexports.Flat = Flat;\nvar Option = /** @class */ (function (_super) {\n    __extends(Option, _super);\n    function Option(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n    __extends(RepetitionMandatory, _super);\n    function RepetitionMandatory(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n    __extends(RepetitionMandatoryWithSeparator, _super);\n    function RepetitionMandatoryWithSeparator(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n    __extends(Repetition, _super);\n    function Repetition(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n    __extends(RepetitionWithSeparator, _super);\n    function RepetitionWithSeparator(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n    __extends(Alternation, _super);\n    function Alternation(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        _this.ignoreAmbiguities = false;\n        _this.hasPredicates = false;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n    function Terminal(options) {\n        this.idx = 1;\n        utils_1.assign(this, utils_1.pick(options, function (v) { return v !== undefined; }));\n    }\n    Terminal.prototype.accept = function (visitor) {\n        visitor.visit(this);\n    };\n    return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n    return utils_1.map(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n    function convertDefinition(definition) {\n        return utils_1.map(definition, serializeProduction);\n    }\n    /* istanbul ignore else */\n    if (node instanceof NonTerminal) {\n        return {\n            type: \"NonTerminal\",\n            name: node.nonTerminalName,\n            idx: node.idx\n        };\n    }\n    else if (node instanceof Flat) {\n        return {\n            type: \"Flat\",\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Option) {\n        return {\n            type: \"Option\",\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionMandatory) {\n        return {\n            type: \"RepetitionMandatory\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionMandatoryWithSeparator) {\n        return {\n            type: \"RepetitionMandatoryWithSeparator\",\n            name: node.name,\n            idx: node.idx,\n            separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionWithSeparator) {\n        return {\n            type: \"RepetitionWithSeparator\",\n            name: node.name,\n            idx: node.idx,\n            separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Repetition) {\n        return {\n            type: \"Repetition\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Alternation) {\n        return {\n            type: \"Alternation\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Terminal) {\n        var serializedTerminal = {\n            type: \"Terminal\",\n            name: node.terminalType.name,\n            label: tokens_public_1.tokenLabel(node.terminalType),\n            idx: node.idx\n        };\n        var pattern = node.terminalType.PATTERN;\n        if (node.terminalType.PATTERN) {\n            serializedTerminal.pattern = utils_1.isRegExp(pattern)\n                ? pattern.source\n                : pattern;\n        }\n        return serializedTerminal;\n    }\n    else if (node instanceof Rule) {\n        return {\n            type: \"Rule\",\n            name: node.name,\n            orgText: node.orgText,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=gast_public.js.map\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar follow_1 = __webpack_require__(27);\nvar tokens_public_1 = __webpack_require__(3);\nvar cst_1 = __webpack_require__(17);\nvar errors_public_1 = __webpack_require__(10);\nvar gast_resolver_public_1 = __webpack_require__(24);\nvar recoverable_1 = __webpack_require__(25);\nvar looksahead_1 = __webpack_require__(30);\nvar tree_builder_1 = __webpack_require__(31);\nvar lexer_adapter_1 = __webpack_require__(33);\nvar recognizer_api_1 = __webpack_require__(34);\nvar recognizer_engine_1 = __webpack_require__(35);\nvar error_handler_1 = __webpack_require__(36);\nvar context_assist_1 = __webpack_require__(37);\nvar gast_recorder_1 = __webpack_require__(38);\nvar perf_tracer_1 = __webpack_require__(39);\nexports.END_OF_FILE = tokens_public_1.createTokenInstance(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n    recoveryEnabled: false,\n    maxLookahead: 4,\n    ignoredIssues: {},\n    dynamicTokensEnabled: false,\n    outputCst: true,\n    errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n    nodeLocationTracking: \"none\",\n    traceInitPerf: false,\n    skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n    recoveryValueFunc: function () { return undefined; },\n    resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_NESTED_RULE_NAME\"] = 10] = \"INVALID_NESTED_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_NESTED_NAME\"] = 11] = \"DUPLICATE_NESTED_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 12] = \"NO_NON_EMPTY_LOOKAHEAD\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 13] = \"AMBIGUOUS_PREFIX_ALTS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 14] = \"TOO_MANY_ALTS\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n    if (value === void 0) { value = undefined; }\n    return function () {\n        return value;\n    };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n    function Parser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        this.ignoredIssues = exports.DEFAULT_PARSER_CONFIG.ignoredIssues;\n        this.definitionErrors = [];\n        this.selfAnalysisDone = false;\n        var that = this;\n        that.initErrorHandler(config);\n        that.initLexerAdapter();\n        that.initLooksAhead(config);\n        that.initRecognizerEngine(tokenVocabulary, config);\n        that.initRecoverable(config);\n        that.initTreeBuilder(config);\n        that.initContentAssist();\n        that.initGastRecorder(config);\n        that.initPerformanceTracer(config);\n        /* istanbul ignore if - complete over-kill to test this, we should only add a test when we actually hard deprecate it and throw an error... */\n        if (utils_1.has(config, \"ignoredIssues\") &&\n            config.ignoredIssues !== exports.DEFAULT_PARSER_CONFIG.ignoredIssues) {\n            utils_1.PRINT_WARNING(\"The <ignoredIssues> IParserConfig property is soft-deprecated and will be removed in future versions.\\n\\t\" +\n                \"Please use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\");\n        }\n        this.ignoredIssues = utils_1.has(config, \"ignoredIssues\")\n            ? config.ignoredIssues\n            : exports.DEFAULT_PARSER_CONFIG.ignoredIssues;\n        this.skipValidations = utils_1.has(config, \"skipValidations\")\n            ? config.skipValidations\n            : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n    }\n    /**\n     *  @deprecated use the **instance** method with the same name instead\n     */\n    Parser.performSelfAnalysis = function (parserInstance) {\n        ;\n        parserInstance.performSelfAnalysis();\n    };\n    Parser.prototype.performSelfAnalysis = function () {\n        var _this = this;\n        this.TRACE_INIT(\"performSelfAnalysis\", function () {\n            var defErrorsMsgs;\n            _this.selfAnalysisDone = true;\n            var className = _this.className;\n            _this.TRACE_INIT(\"toFastProps\", function () {\n                // Without this voodoo magic the parser would be x3-x4 slower\n                // It seems it is better to invoke `toFastProperties` **before**\n                // Any manipulations of the `this` object done during the recording phase.\n                utils_1.toFastProperties(_this);\n            });\n            _this.TRACE_INIT(\"Grammar Recording\", function () {\n                try {\n                    _this.enableRecording();\n                    // Building the GAST\n                    utils_1.forEach(_this.definedRulesNames, function (currRuleName) {\n                        var wrappedRule = _this[currRuleName];\n                        var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n                        var recordedRuleGast = undefined;\n                        _this.TRACE_INIT(currRuleName + \" Rule\", function () {\n                            recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n                        });\n                        _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n                    });\n                }\n                finally {\n                    _this.disableRecording();\n                }\n            });\n            var resolverErrors = [];\n            _this.TRACE_INIT(\"Grammar Resolving\", function () {\n                resolverErrors = gast_resolver_public_1.resolveGrammar({\n                    rules: utils_1.values(_this.gastProductionsCache)\n                });\n                _this.definitionErrors.push.apply(_this.definitionErrors, resolverErrors); // mutability for the win?\n            });\n            _this.TRACE_INIT(\"Grammar Validations\", function () {\n                // only perform additional grammar validations IFF no resolving errors have occurred.\n                // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n                if (utils_1.isEmpty(resolverErrors) && _this.skipValidations === false) {\n                    var validationErrors = gast_resolver_public_1.validateGrammar({\n                        rules: utils_1.values(_this.gastProductionsCache),\n                        maxLookahead: _this.maxLookahead,\n                        tokenTypes: utils_1.values(_this.tokensMap),\n                        ignoredIssues: _this.ignoredIssues,\n                        errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n                        grammarName: className\n                    });\n                    _this.definitionErrors.push.apply(_this.definitionErrors, validationErrors); // mutability for the win?\n                }\n            });\n            // this analysis may fail if the grammar is not perfectly valid\n            if (utils_1.isEmpty(_this.definitionErrors)) {\n                // The results of these computations are not needed unless error recovery is enabled.\n                if (_this.recoveryEnabled) {\n                    _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n                        var allFollows = follow_1.computeAllProdsFollows(utils_1.values(_this.gastProductionsCache));\n                        _this.resyncFollows = allFollows;\n                    });\n                }\n                _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n                    _this.preComputeLookaheadFunctions(utils_1.values(_this.gastProductionsCache));\n                });\n            }\n            _this.TRACE_INIT(\"expandAllNestedRuleNames\", function () {\n                // TODO: is this needed for EmbeddedActionsParser?\n                var cstAnalysisResult = cst_1.expandAllNestedRuleNames(utils_1.values(_this.gastProductionsCache), _this.fullRuleNameToShort);\n                _this.allRuleNames = cstAnalysisResult.allRuleNames;\n            });\n            if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n                !utils_1.isEmpty(_this.definitionErrors)) {\n                defErrorsMsgs = utils_1.map(_this.definitionErrors, function (defError) { return defError.message; });\n                throw new Error(\"Parser Definition Errors detected:\\n \" + defErrorsMsgs.join(\"\\n-------------------------------\\n\"));\n            }\n        });\n    };\n    // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n    // (normally during the parser's constructor).\n    // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n    // for example: duplicate rule names, referencing an unresolved subrule, ect...\n    // This flag should not be enabled during normal usage, it is used in special situations, for example when\n    // needing to display the parser definition errors in some GUI(online playground).\n    Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n    return Parser;\n}());\nexports.Parser = Parser;\nutils_1.applyMixins(Parser, [\n    recoverable_1.Recoverable,\n    looksahead_1.LooksAhead,\n    tree_builder_1.TreeBuilder,\n    lexer_adapter_1.LexerAdapter,\n    recognizer_engine_1.RecognizerEngine,\n    recognizer_api_1.RecognizerApi,\n    error_handler_1.ErrorHandler,\n    context_assist_1.ContentAssist,\n    gast_recorder_1.GastRecorder,\n    perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n    __extends(CstParser, _super);\n    function CstParser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        var _this = this;\n        var configClone = utils_1.cloneObj(config);\n        configClone.outputCst = true;\n        _this = _super.call(this, tokenVocabulary, configClone) || this;\n        return _this;\n    }\n    return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n    __extends(EmbeddedActionsParser, _super);\n    function EmbeddedActionsParser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        var _this = this;\n        var configClone = utils_1.cloneObj(config);\n        configClone.outputCst = false;\n        _this = _super.call(this, tokenVocabulary, configClone) || this;\n        return _this;\n    }\n    return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar lexer_public_1 = __webpack_require__(9);\nvar tokens_1 = __webpack_require__(5);\nfunction tokenLabel(tokType) {\n    if (hasTokenLabel(tokType)) {\n        return tokType.LABEL;\n    }\n    else {\n        return tokType.name;\n    }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n    return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n    return utils_1.isString(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n    return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n    var pattern = config.pattern;\n    var tokenType = {};\n    tokenType.name = config.name;\n    if (!utils_1.isUndefined(pattern)) {\n        tokenType.PATTERN = pattern;\n    }\n    if (utils_1.has(config, PARENT)) {\n        throw \"The parent property is no longer supported.\\n\" +\n            \"See: https://github.com/SAP/chevrotain/issues/564#issuecomment-349062346 for details.\";\n    }\n    if (utils_1.has(config, CATEGORIES)) {\n        // casting to ANY as this will be fixed inside `augmentTokenTypes``\n        tokenType.CATEGORIES = config[CATEGORIES];\n    }\n    tokens_1.augmentTokenTypes([tokenType]);\n    if (utils_1.has(config, LABEL)) {\n        tokenType.LABEL = config[LABEL];\n    }\n    if (utils_1.has(config, GROUP)) {\n        tokenType.GROUP = config[GROUP];\n    }\n    if (utils_1.has(config, POP_MODE)) {\n        tokenType.POP_MODE = config[POP_MODE];\n    }\n    if (utils_1.has(config, PUSH_MODE)) {\n        tokenType.PUSH_MODE = config[PUSH_MODE];\n    }\n    if (utils_1.has(config, LONGER_ALT)) {\n        tokenType.LONGER_ALT = config[LONGER_ALT];\n    }\n    if (utils_1.has(config, LINE_BREAKS)) {\n        tokenType.LINE_BREAKS = config[LINE_BREAKS];\n    }\n    if (utils_1.has(config, START_CHARS_HINT)) {\n        tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n    }\n    return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\ntokens_1.augmentTokenTypes([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n    return {\n        image: image,\n        startOffset: startOffset,\n        endOffset: endOffset,\n        startLine: startLine,\n        endLine: endLine,\n        startColumn: startColumn,\n        endColumn: endColumn,\n        tokenTypeIdx: tokType.tokenTypeIdx,\n        tokenType: tokType\n    };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n    return tokens_1.tokenStructuredMatcher(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gast_public_1 = __webpack_require__(1);\nvar GAstVisitor = /** @class */ (function () {\n    function GAstVisitor() {\n    }\n    GAstVisitor.prototype.visit = function (node) {\n        var nodeAny = node;\n        switch (nodeAny.constructor) {\n            case gast_public_1.NonTerminal:\n                return this.visitNonTerminal(nodeAny);\n            case gast_public_1.Flat:\n                return this.visitFlat(nodeAny);\n            case gast_public_1.Option:\n                return this.visitOption(nodeAny);\n            case gast_public_1.RepetitionMandatory:\n                return this.visitRepetitionMandatory(nodeAny);\n            case gast_public_1.RepetitionMandatoryWithSeparator:\n                return this.visitRepetitionMandatoryWithSeparator(nodeAny);\n            case gast_public_1.RepetitionWithSeparator:\n                return this.visitRepetitionWithSeparator(nodeAny);\n            case gast_public_1.Repetition:\n                return this.visitRepetition(nodeAny);\n            case gast_public_1.Alternation:\n                return this.visitAlternation(nodeAny);\n            case gast_public_1.Terminal:\n                return this.visitTerminal(nodeAny);\n            case gast_public_1.Rule:\n                return this.visitRule(nodeAny);\n            /* istanbul ignore next */\n            default:\n                throw Error(\"non exhaustive match\");\n        }\n    };\n    GAstVisitor.prototype.visitNonTerminal = function (node) { };\n    GAstVisitor.prototype.visitFlat = function (node) { };\n    GAstVisitor.prototype.visitOption = function (node) { };\n    GAstVisitor.prototype.visitRepetition = function (node) { };\n    GAstVisitor.prototype.visitRepetitionMandatory = function (node) { };\n    GAstVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { };\n    GAstVisitor.prototype.visitRepetitionWithSeparator = function (node) { };\n    GAstVisitor.prototype.visitAlternation = function (node) { };\n    GAstVisitor.prototype.visitTerminal = function (node) { };\n    GAstVisitor.prototype.visitRule = function (node) { };\n    return GAstVisitor;\n}());\nexports.GAstVisitor = GAstVisitor;\n//# sourceMappingURL=gast_visitor_public.js.map\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nfunction tokenStructuredMatcher(tokInstance, tokConstructor) {\n    var instanceType = tokInstance.tokenTypeIdx;\n    if (instanceType === tokConstructor.tokenTypeIdx) {\n        return true;\n    }\n    else {\n        return (tokConstructor.isParent === true &&\n            tokConstructor.categoryMatchesMap[instanceType] === true);\n    }\n}\nexports.tokenStructuredMatcher = tokenStructuredMatcher;\n// Optimized tokenMatcher in case our grammar does not use token categories\n// Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\nfunction tokenStructuredMatcherNoCategories(token, tokType) {\n    return token.tokenTypeIdx === tokType.tokenTypeIdx;\n}\nexports.tokenStructuredMatcherNoCategories = tokenStructuredMatcherNoCategories;\nexports.tokenShortNameIdx = 1;\nexports.tokenIdxToClass = {};\nfunction augmentTokenTypes(tokenTypes) {\n    // collect the parent Token Types as well.\n    var tokenTypesAndParents = expandCategories(tokenTypes);\n    // add required tokenType and categoryMatches properties\n    assignTokenDefaultProps(tokenTypesAndParents);\n    // fill up the categoryMatches\n    assignCategoriesMapProp(tokenTypesAndParents);\n    assignCategoriesTokensProp(tokenTypesAndParents);\n    utils_1.forEach(tokenTypesAndParents, function (tokType) {\n        tokType.isParent = tokType.categoryMatches.length > 0;\n    });\n}\nexports.augmentTokenTypes = augmentTokenTypes;\nfunction expandCategories(tokenTypes) {\n    var result = utils_1.cloneArr(tokenTypes);\n    var categories = tokenTypes;\n    var searching = true;\n    while (searching) {\n        categories = utils_1.compact(utils_1.flatten(utils_1.map(categories, function (currTokType) { return currTokType.CATEGORIES; })));\n        var newCategories = utils_1.difference(categories, result);\n        result = result.concat(newCategories);\n        if (utils_1.isEmpty(newCategories)) {\n            searching = false;\n        }\n        else {\n            categories = newCategories;\n        }\n    }\n    return result;\n}\nexports.expandCategories = expandCategories;\nfunction assignTokenDefaultProps(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        if (!hasShortKeyProperty(currTokType)) {\n            exports.tokenIdxToClass[exports.tokenShortNameIdx] = currTokType;\n            currTokType.tokenTypeIdx = exports.tokenShortNameIdx++;\n        }\n        // CATEGORIES? : TokenType | TokenType[]\n        if (hasCategoriesProperty(currTokType) &&\n            !utils_1.isArray(currTokType.CATEGORIES)\n        // &&\n        // !isUndefined(currTokType.CATEGORIES.PATTERN)\n        ) {\n            currTokType.CATEGORIES = [currTokType.CATEGORIES];\n        }\n        if (!hasCategoriesProperty(currTokType)) {\n            currTokType.CATEGORIES = [];\n        }\n        if (!hasExtendingTokensTypesProperty(currTokType)) {\n            currTokType.categoryMatches = [];\n        }\n        if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n            currTokType.categoryMatchesMap = {};\n        }\n    });\n}\nexports.assignTokenDefaultProps = assignTokenDefaultProps;\nfunction assignCategoriesTokensProp(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        // avoid duplications\n        currTokType.categoryMatches = [];\n        utils_1.forEach(currTokType.categoryMatchesMap, function (val, key) {\n            currTokType.categoryMatches.push(exports.tokenIdxToClass[key].tokenTypeIdx);\n        });\n    });\n}\nexports.assignCategoriesTokensProp = assignCategoriesTokensProp;\nfunction assignCategoriesMapProp(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        singleAssignCategoriesToksMap([], currTokType);\n    });\n}\nexports.assignCategoriesMapProp = assignCategoriesMapProp;\nfunction singleAssignCategoriesToksMap(path, nextNode) {\n    utils_1.forEach(path, function (pathNode) {\n        nextNode.categoryMatchesMap[pathNode.tokenTypeIdx] = true;\n    });\n    utils_1.forEach(nextNode.CATEGORIES, function (nextCategory) {\n        var newPath = path.concat(nextNode);\n        // avoids infinite loops due to cyclic categories.\n        if (!utils_1.contains(newPath, nextCategory)) {\n            singleAssignCategoriesToksMap(newPath, nextCategory);\n        }\n    });\n}\nexports.singleAssignCategoriesToksMap = singleAssignCategoriesToksMap;\nfunction hasShortKeyProperty(tokType) {\n    return utils_1.has(tokType, \"tokenTypeIdx\");\n}\nexports.hasShortKeyProperty = hasShortKeyProperty;\nfunction hasCategoriesProperty(tokType) {\n    return utils_1.has(tokType, \"CATEGORIES\");\n}\nexports.hasCategoriesProperty = hasCategoriesProperty;\nfunction hasExtendingTokensTypesProperty(tokType) {\n    return utils_1.has(tokType, \"categoryMatches\");\n}\nexports.hasExtendingTokensTypesProperty = hasExtendingTokensTypesProperty;\nfunction hasExtendingTokensTypesMapProperty(tokType) {\n    return utils_1.has(tokType, \"categoryMatchesMap\");\n}\nexports.hasExtendingTokensTypesMapProperty = hasExtendingTokensTypesMapProperty;\nfunction isTokenType(tokType) {\n    return utils_1.has(tokType, \"tokenTypeIdx\");\n}\nexports.isTokenType = isTokenType;\n//# sourceMappingURL=tokens.js.map\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction isSequenceProd(prod) {\n    return (prod instanceof gast_public_1.Flat ||\n        prod instanceof gast_public_1.Option ||\n        prod instanceof gast_public_1.Repetition ||\n        prod instanceof gast_public_1.RepetitionMandatory ||\n        prod instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n        prod instanceof gast_public_1.RepetitionWithSeparator ||\n        prod instanceof gast_public_1.Terminal ||\n        prod instanceof gast_public_1.Rule);\n}\nexports.isSequenceProd = isSequenceProd;\nfunction isOptionalProd(prod, alreadyVisited) {\n    if (alreadyVisited === void 0) { alreadyVisited = []; }\n    var isDirectlyOptional = prod instanceof gast_public_1.Option ||\n        prod instanceof gast_public_1.Repetition ||\n        prod instanceof gast_public_1.RepetitionWithSeparator;\n    if (isDirectlyOptional) {\n        return true;\n    }\n    // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n    // empty optional top rule\n    // may be indirectly optional ((A?B?C?) | (D?E?F?))\n    if (prod instanceof gast_public_1.Alternation) {\n        // for OR its enough for just one of the alternatives to be optional\n        return utils_1.some(prod.definition, function (subProd) {\n            return isOptionalProd(subProd, alreadyVisited);\n        });\n    }\n    else if (prod instanceof gast_public_1.NonTerminal && utils_1.contains(alreadyVisited, prod)) {\n        // avoiding stack overflow due to infinite recursion\n        return false;\n    }\n    else if (prod instanceof gast_public_1.AbstractProduction) {\n        if (prod instanceof gast_public_1.NonTerminal) {\n            alreadyVisited.push(prod);\n        }\n        return utils_1.every(prod.definition, function (subProd) {\n            return isOptionalProd(subProd, alreadyVisited);\n        });\n    }\n    else {\n        return false;\n    }\n}\nexports.isOptionalProd = isOptionalProd;\nfunction isBranchingProd(prod) {\n    return prod instanceof gast_public_1.Alternation;\n}\nexports.isBranchingProd = isBranchingProd;\nfunction getProductionDslName(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        return \"SUBRULE\";\n    }\n    else if (prod instanceof gast_public_1.Option) {\n        return \"OPTION\";\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return \"OR\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return \"AT_LEAST_ONE\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return \"AT_LEAST_ONE_SEP\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return \"MANY_SEP\";\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return \"MANY\";\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return \"CONSUME\";\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.getProductionDslName = getProductionDslName;\nvar DslMethodsCollectorVisitor = /** @class */ (function (_super) {\n    __extends(DslMethodsCollectorVisitor, _super);\n    function DslMethodsCollectorVisitor() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        // A minus is never valid in an identifier name\n        _this.separator = \"-\";\n        _this.dslMethods = {\n            option: [],\n            alternation: [],\n            repetition: [],\n            repetitionWithSeparator: [],\n            repetitionMandatory: [],\n            repetitionMandatoryWithSeparator: []\n        };\n        return _this;\n    }\n    DslMethodsCollectorVisitor.prototype.reset = function () {\n        this.dslMethods = {\n            option: [],\n            alternation: [],\n            repetition: [],\n            repetitionWithSeparator: [],\n            repetitionMandatory: [],\n            repetitionMandatoryWithSeparator: []\n        };\n    };\n    DslMethodsCollectorVisitor.prototype.visitTerminal = function (terminal) {\n        var key = terminal.terminalType.name + this.separator + \"Terminal\";\n        if (!utils_1.has(this.dslMethods, key)) {\n            this.dslMethods[key] = [];\n        }\n        this.dslMethods[key].push(terminal);\n    };\n    DslMethodsCollectorVisitor.prototype.visitNonTerminal = function (subrule) {\n        var key = subrule.nonTerminalName + this.separator + \"Terminal\";\n        if (!utils_1.has(this.dslMethods, key)) {\n            this.dslMethods[key] = [];\n        }\n        this.dslMethods[key].push(subrule);\n    };\n    DslMethodsCollectorVisitor.prototype.visitOption = function (option) {\n        this.dslMethods.option.push(option);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.dslMethods.repetitionWithSeparator.push(manySep);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.dslMethods.repetitionMandatory.push(atLeastOne);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetition = function (many) {\n        this.dslMethods.repetition.push(many);\n    };\n    DslMethodsCollectorVisitor.prototype.visitAlternation = function (or) {\n        this.dslMethods.alternation.push(or);\n    };\n    return DslMethodsCollectorVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.DslMethodsCollectorVisitor = DslMethodsCollectorVisitor;\nvar collectorVisitor = new DslMethodsCollectorVisitor();\nfunction collectMethods(rule) {\n    collectorVisitor.reset();\n    rule.accept(collectorVisitor);\n    var dslMethods = collectorVisitor.dslMethods;\n    // avoid uncleaned references\n    collectorVisitor.reset();\n    return dslMethods;\n}\nexports.collectMethods = collectMethods;\n//# sourceMappingURL=gast.js.map\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Lookahead keys are 32Bit integers in the form\n// TTTTTTTT-ZZZZZZZZZZZZ-YYYY-XXXXXXXX\n// XXXX -> Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\n/* tslint:disable */\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n/* tslint:enable */\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n    /* tslint:disable */\n    return occurrence | dslMethodIdx | ruleIdx;\n    /* tslint:enable */\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\nfunction getKeyForAltIndex(ruleIdx, dslMethodIdx, occurrence, altIdx) {\n    /* tslint:disable */\n    // alternative indices are zero based, thus must always add one (turn on one bit) to guarantee uniqueness.\n    var altIdxBitMap = (altIdx + 1) << BITS_START_FOR_ALT_IDX;\n    return (getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) |\n        altIdxBitMap);\n    /* tslint:enable */\n}\nexports.getKeyForAltIndex = getKeyForAltIndex;\n//# sourceMappingURL=keys.js.map\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar MISMATCHED_TOKEN_EXCEPTION = \"MismatchedTokenException\";\nvar NO_VIABLE_ALT_EXCEPTION = \"NoViableAltException\";\nvar EARLY_EXIT_EXCEPTION = \"EarlyExitException\";\nvar NOT_ALL_INPUT_PARSED_EXCEPTION = \"NotAllInputParsedException\";\nvar RECOGNITION_EXCEPTION_NAMES = [\n    MISMATCHED_TOKEN_EXCEPTION,\n    NO_VIABLE_ALT_EXCEPTION,\n    EARLY_EXIT_EXCEPTION,\n    NOT_ALL_INPUT_PARSED_EXCEPTION\n];\nObject.freeze(RECOGNITION_EXCEPTION_NAMES);\n// hacks to bypass no support for custom Errors in javascript/typescript\nfunction isRecognitionException(error) {\n    // can't do instanceof on hacked custom js exceptions\n    return utils_1.contains(RECOGNITION_EXCEPTION_NAMES, error.name);\n}\nexports.isRecognitionException = isRecognitionException;\nfunction MismatchedTokenException(message, token, previousToken) {\n    this.name = MISMATCHED_TOKEN_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.MismatchedTokenException = MismatchedTokenException;\n// must use the \"Error.prototype\" instead of \"new Error\"\n// because the stack trace points to where \"new Error\" was invoked\"\nMismatchedTokenException.prototype = Error.prototype;\nfunction NoViableAltException(message, token, previousToken) {\n    this.name = NO_VIABLE_ALT_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.NoViableAltException = NoViableAltException;\nNoViableAltException.prototype = Error.prototype;\nfunction NotAllInputParsedException(message, token) {\n    this.name = NOT_ALL_INPUT_PARSED_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.resyncedTokens = [];\n}\nexports.NotAllInputParsedException = NotAllInputParsedException;\nNotAllInputParsedException.prototype = Error.prototype;\nfunction EarlyExitException(message, token, previousToken) {\n    this.name = EARLY_EXIT_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.EarlyExitException = EarlyExitException;\nEarlyExitException.prototype = Error.prototype;\n//# sourceMappingURL=exceptions_public.js.map\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar lexer_1 = __webpack_require__(20);\nvar utils_1 = __webpack_require__(0);\nvar tokens_1 = __webpack_require__(5);\nvar lexer_errors_public_1 = __webpack_require__(21);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar LexerDefinitionErrorType;\n(function (LexerDefinitionErrorType) {\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MISSING_PATTERN\"] = 0] = \"MISSING_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_PATTERN\"] = 1] = \"INVALID_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"EOI_ANCHOR_FOUND\"] = 2] = \"EOI_ANCHOR_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNSUPPORTED_FLAGS_FOUND\"] = 3] = \"UNSUPPORTED_FLAGS_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"DUPLICATE_PATTERNS_FOUND\"] = 4] = \"DUPLICATE_PATTERNS_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_GROUP_TYPE_FOUND\"] = 5] = \"INVALID_GROUP_TYPE_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"PUSH_MODE_DOES_NOT_EXIST\"] = 6] = \"PUSH_MODE_DOES_NOT_EXIST\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\"] = 7] = \"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\"] = 8] = \"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\"] = 9] = \"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\"] = 10] = \"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"SOI_ANCHOR_FOUND\"] = 11] = \"SOI_ANCHOR_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"EMPTY_MATCH_PATTERN\"] = 12] = \"EMPTY_MATCH_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"NO_LINE_BREAKS_FLAGS\"] = 13] = \"NO_LINE_BREAKS_FLAGS\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNREACHABLE_PATTERN\"] = 14] = \"UNREACHABLE_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"IDENTIFY_TERMINATOR\"] = 15] = \"IDENTIFY_TERMINATOR\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"CUSTOM_LINE_BREAK\"] = 16] = \"CUSTOM_LINE_BREAK\";\n})(LexerDefinitionErrorType = exports.LexerDefinitionErrorType || (exports.LexerDefinitionErrorType = {}));\nvar DEFAULT_LEXER_CONFIG = {\n    deferDefinitionErrorsHandling: false,\n    positionTracking: \"full\",\n    lineTerminatorsPattern: /\\n|\\r\\n?/g,\n    lineTerminatorCharacters: [\"\\n\", \"\\r\"],\n    ensureOptimizations: false,\n    safeMode: false,\n    errorMessageProvider: lexer_errors_public_1.defaultLexerErrorProvider,\n    traceInitPerf: false,\n    skipValidations: false\n};\nObject.freeze(DEFAULT_LEXER_CONFIG);\nvar Lexer = /** @class */ (function () {\n    function Lexer(lexerDefinition, config) {\n        var _this = this;\n        if (config === void 0) { config = DEFAULT_LEXER_CONFIG; }\n        this.lexerDefinition = lexerDefinition;\n        this.lexerDefinitionErrors = [];\n        this.lexerDefinitionWarning = [];\n        this.patternIdxToConfig = {};\n        this.charCodeToPatternIdxToConfig = {};\n        this.modes = [];\n        this.emptyGroups = {};\n        this.config = undefined;\n        this.trackStartLines = true;\n        this.trackEndLines = true;\n        this.hasCustom = false;\n        this.canModeBeOptimized = {};\n        if (typeof config === \"boolean\") {\n            throw Error(\"The second argument to the Lexer constructor is now an ILexerConfig Object.\\n\" +\n                \"a boolean 2nd argument is no longer supported\");\n        }\n        // todo: defaults func?\n        this.config = utils_1.merge(DEFAULT_LEXER_CONFIG, config);\n        var traceInitVal = this.config.traceInitPerf;\n        if (traceInitVal === true) {\n            this.traceInitMaxIdent = Infinity;\n            this.traceInitPerf = true;\n        }\n        else if (typeof traceInitVal === \"number\") {\n            this.traceInitMaxIdent = traceInitVal;\n            this.traceInitPerf = true;\n        }\n        this.traceInitIndent = -1;\n        this.TRACE_INIT(\"Lexer Constructor\", function () {\n            var actualDefinition;\n            var hasOnlySingleMode = true;\n            _this.TRACE_INIT(\"Lexer Config handling\", function () {\n                if (_this.config.lineTerminatorsPattern ===\n                    DEFAULT_LEXER_CONFIG.lineTerminatorsPattern) {\n                    // optimized built-in implementation for the defaults definition of lineTerminators\n                    _this.config.lineTerminatorsPattern = lexer_1.LineTerminatorOptimizedTester;\n                }\n                else {\n                    if (_this.config.lineTerminatorCharacters ===\n                        DEFAULT_LEXER_CONFIG.lineTerminatorCharacters) {\n                        throw Error(\"Error: Missing <lineTerminatorCharacters> property on the Lexer config.\\n\" +\n                            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\");\n                    }\n                }\n                if (config.safeMode && config.ensureOptimizations) {\n                    throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');\n                }\n                _this.trackStartLines = /full|onlyStart/i.test(_this.config.positionTracking);\n                _this.trackEndLines = /full/i.test(_this.config.positionTracking);\n                // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n                if (utils_1.isArray(lexerDefinition)) {\n                    actualDefinition = { modes: {} };\n                    actualDefinition.modes[lexer_1.DEFAULT_MODE] = utils_1.cloneArr(lexerDefinition);\n                    actualDefinition[lexer_1.DEFAULT_MODE] = lexer_1.DEFAULT_MODE;\n                }\n                else {\n                    // no conversion needed, input should already be a IMultiModeLexerDefinition\n                    hasOnlySingleMode = false;\n                    actualDefinition = utils_1.cloneObj((lexerDefinition));\n                }\n            });\n            if (_this.config.skipValidations === false) {\n                _this.TRACE_INIT(\"performRuntimeChecks\", function () {\n                    _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat(lexer_1.performRuntimeChecks(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n                });\n                _this.TRACE_INIT(\"performWarningRuntimeChecks\", function () {\n                    _this.lexerDefinitionWarning = _this.lexerDefinitionWarning.concat(lexer_1.performWarningRuntimeChecks(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n                });\n            }\n            // for extra robustness to avoid throwing an none informative error message\n            actualDefinition.modes = actualDefinition.modes\n                ? actualDefinition.modes\n                : {};\n            // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n            // this transformation is to increase robustness in the case of partially invalid lexer definition.\n            utils_1.forEach(actualDefinition.modes, function (currModeValue, currModeName) {\n                actualDefinition.modes[currModeName] = utils_1.reject(currModeValue, function (currTokType) { return utils_1.isUndefined(currTokType); });\n            });\n            var allModeNames = utils_1.keys(actualDefinition.modes);\n            utils_1.forEach(actualDefinition.modes, function (currModDef, currModName) {\n                _this.TRACE_INIT(\"Mode: <\" + currModName + \"> processing\", function () {\n                    _this.modes.push(currModName);\n                    if (_this.config.skipValidations === false) {\n                        _this.TRACE_INIT(\"validatePatterns\", function () {\n                            _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat(lexer_1.validatePatterns(currModDef, allModeNames));\n                        });\n                    }\n                    // If definition errors were encountered, the analysis phase may fail unexpectedly/\n                    // Considering a lexer with definition errors may never be used, there is no point\n                    // to performing the analysis anyhow...\n                    if (utils_1.isEmpty(_this.lexerDefinitionErrors)) {\n                        tokens_1.augmentTokenTypes(currModDef);\n                        var currAnalyzeResult_1;\n                        _this.TRACE_INIT(\"analyzeTokenTypes\", function () {\n                            currAnalyzeResult_1 = lexer_1.analyzeTokenTypes(currModDef, {\n                                lineTerminatorCharacters: _this.config\n                                    .lineTerminatorCharacters,\n                                positionTracking: config.positionTracking,\n                                ensureOptimizations: config.ensureOptimizations,\n                                safeMode: config.safeMode,\n                                tracer: _this.TRACE_INIT.bind(_this)\n                            });\n                        });\n                        _this.patternIdxToConfig[currModName] =\n                            currAnalyzeResult_1.patternIdxToConfig;\n                        _this.charCodeToPatternIdxToConfig[currModName] =\n                            currAnalyzeResult_1.charCodeToPatternIdxToConfig;\n                        _this.emptyGroups = utils_1.merge(_this.emptyGroups, currAnalyzeResult_1.emptyGroups);\n                        _this.hasCustom =\n                            currAnalyzeResult_1.hasCustom || _this.hasCustom;\n                        _this.canModeBeOptimized[currModName] =\n                            currAnalyzeResult_1.canBeOptimized;\n                    }\n                });\n            });\n            _this.defaultMode = actualDefinition.defaultMode;\n            if (!utils_1.isEmpty(_this.lexerDefinitionErrors) &&\n                !_this.config.deferDefinitionErrorsHandling) {\n                var allErrMessages = utils_1.map(_this.lexerDefinitionErrors, function (error) {\n                    return error.message;\n                });\n                var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n                throw new Error(\"Errors detected in definition of Lexer:\\n\" +\n                    allErrMessagesString);\n            }\n            // Only print warning if there are no errors, This will avoid pl\n            utils_1.forEach(_this.lexerDefinitionWarning, function (warningDescriptor) {\n                utils_1.PRINT_WARNING(warningDescriptor.message);\n            });\n            _this.TRACE_INIT(\"Choosing sub-methods implementations\", function () {\n                // Choose the relevant internal implementations for this specific parser.\n                // These implementations should be in-lined by the JavaScript engine\n                // to provide optimal performance in each scenario.\n                if (lexer_1.SUPPORT_STICKY) {\n                    _this.chopInput = utils_1.IDENTITY;\n                    _this.match = _this.matchWithTest;\n                }\n                else {\n                    _this.updateLastIndex = utils_1.NOOP;\n                    _this.match = _this.matchWithExec;\n                }\n                if (hasOnlySingleMode) {\n                    _this.handleModes = utils_1.NOOP;\n                }\n                if (_this.trackStartLines === false) {\n                    _this.computeNewColumn = utils_1.IDENTITY;\n                }\n                if (_this.trackEndLines === false) {\n                    _this.updateTokenEndLineColumnLocation = utils_1.NOOP;\n                }\n                if (/full/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createFullToken;\n                }\n                else if (/onlyStart/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createStartOnlyToken;\n                }\n                else if (/onlyOffset/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createOffsetOnlyToken;\n                }\n                else {\n                    throw Error(\"Invalid <positionTracking> config option: \\\"\" + _this.config.positionTracking + \"\\\"\");\n                }\n                if (_this.hasCustom) {\n                    _this.addToken = _this.addTokenUsingPush;\n                    _this.handlePayload = _this.handlePayloadWithCustom;\n                }\n                else {\n                    _this.addToken = _this.addTokenUsingMemberAccess;\n                    _this.handlePayload = _this.handlePayloadNoCustom;\n                }\n            });\n            _this.TRACE_INIT(\"Failed Optimization Warnings\", function () {\n                var unOptimizedModes = utils_1.reduce(_this.canModeBeOptimized, function (cannotBeOptimized, canBeOptimized, modeName) {\n                    if (canBeOptimized === false) {\n                        cannotBeOptimized.push(modeName);\n                    }\n                    return cannotBeOptimized;\n                }, []);\n                if (config.ensureOptimizations && !utils_1.isEmpty(unOptimizedModes)) {\n                    throw Error(\"Lexer Modes: < \" + unOptimizedModes.join(\", \") + \" > cannot be optimized.\\n\" +\n                        '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n                        \"\\t Or inspect the console log for details on how to resolve these issues.\");\n                }\n            });\n            _this.TRACE_INIT(\"clearRegExpParserCache\", function () {\n                reg_exp_parser_1.clearRegExpParserCache();\n            });\n            _this.TRACE_INIT(\"toFastProperties\", function () {\n                utils_1.toFastProperties(_this);\n            });\n        });\n    }\n    Lexer.prototype.tokenize = function (text, initialMode) {\n        if (initialMode === void 0) { initialMode = this.defaultMode; }\n        if (!utils_1.isEmpty(this.lexerDefinitionErrors)) {\n            var allErrMessages = utils_1.map(this.lexerDefinitionErrors, function (error) {\n                return error.message;\n            });\n            var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n            throw new Error(\"Unable to Tokenize because Errors detected in definition of Lexer:\\n\" +\n                allErrMessagesString);\n        }\n        var lexResult = this.tokenizeInternal(text, initialMode);\n        return lexResult;\n    };\n    // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n    // This is intentional due to performance considerations.\n    Lexer.prototype.tokenizeInternal = function (text, initialMode) {\n        var _this = this;\n        var i, j, matchAltImage, longerAltIdx, matchedImage, payload, altPayload, imageLength, group, tokType, newToken, errLength, droppedChar, msg, match;\n        var orgText = text;\n        var orgLength = orgText.length;\n        var offset = 0;\n        var matchedTokensIndex = 0;\n        // initializing the tokensArray to the \"guessed\" size.\n        // guessing too little will still reduce the number of array re-sizes on pushes.\n        // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n        // but would still have a faster runtime by avoiding (All but one) array resizing.\n        var guessedNumberOfTokens = this.hasCustom\n            ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n            : Math.floor(text.length / 10);\n        var matchedTokens = new Array(guessedNumberOfTokens);\n        var errors = [];\n        var line = this.trackStartLines ? 1 : undefined;\n        var column = this.trackStartLines ? 1 : undefined;\n        var groups = lexer_1.cloneEmptyGroups(this.emptyGroups);\n        var trackLines = this.trackStartLines;\n        var lineTerminatorPattern = this.config.lineTerminatorsPattern;\n        var currModePatternsLength = 0;\n        var patternIdxToConfig = [];\n        var currCharCodeToPatternIdxToConfig = [];\n        var modeStack = [];\n        var emptyArray = [];\n        Object.freeze(emptyArray);\n        var getPossiblePatterns = undefined;\n        function getPossiblePatternsSlow() {\n            return patternIdxToConfig;\n        }\n        function getPossiblePatternsOptimized(charCode) {\n            var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(charCode);\n            var possiblePatterns = currCharCodeToPatternIdxToConfig[optimizedCharIdx];\n            if (possiblePatterns === undefined) {\n                return emptyArray;\n            }\n            else {\n                return possiblePatterns;\n            }\n        }\n        var pop_mode = function (popToken) {\n            // TODO: perhaps avoid this error in the edge case there is no more input?\n            if (modeStack.length === 1 &&\n                // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n                // So no error should occur.\n                popToken.tokenType.PUSH_MODE === undefined) {\n                // if we try to pop the last mode there lexer will no longer have ANY mode.\n                // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n                var msg_1 = _this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(popToken);\n                errors.push({\n                    offset: popToken.startOffset,\n                    line: popToken.startLine !== undefined\n                        ? popToken.startLine\n                        : undefined,\n                    column: popToken.startColumn !== undefined\n                        ? popToken.startColumn\n                        : undefined,\n                    length: popToken.image.length,\n                    message: msg_1\n                });\n            }\n            else {\n                modeStack.pop();\n                var newMode = utils_1.last(modeStack);\n                patternIdxToConfig = _this.patternIdxToConfig[newMode];\n                currCharCodeToPatternIdxToConfig = _this\n                    .charCodeToPatternIdxToConfig[newMode];\n                currModePatternsLength = patternIdxToConfig.length;\n                var modeCanBeOptimized = _this.canModeBeOptimized[newMode] &&\n                    _this.config.safeMode === false;\n                if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n                    getPossiblePatterns = getPossiblePatternsOptimized;\n                }\n                else {\n                    getPossiblePatterns = getPossiblePatternsSlow;\n                }\n            }\n        };\n        function push_mode(newMode) {\n            modeStack.push(newMode);\n            currCharCodeToPatternIdxToConfig = this\n                .charCodeToPatternIdxToConfig[newMode];\n            patternIdxToConfig = this.patternIdxToConfig[newMode];\n            currModePatternsLength = patternIdxToConfig.length;\n            currModePatternsLength = patternIdxToConfig.length;\n            var modeCanBeOptimized = this.canModeBeOptimized[newMode] &&\n                this.config.safeMode === false;\n            if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n                getPossiblePatterns = getPossiblePatternsOptimized;\n            }\n            else {\n                getPossiblePatterns = getPossiblePatternsSlow;\n            }\n        }\n        // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n        // seem to matter performance wise.\n        push_mode.call(this, initialMode);\n        var currConfig;\n        while (offset < orgLength) {\n            matchedImage = null;\n            var nextCharCode = orgText.charCodeAt(offset);\n            var chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode);\n            var chosenPatternsLength = chosenPatternIdxToConfig.length;\n            for (i = 0; i < chosenPatternsLength; i++) {\n                currConfig = chosenPatternIdxToConfig[i];\n                var currPattern = currConfig.pattern;\n                payload = null;\n                // manually in-lined because > 600 chars won't be in-lined in V8\n                var singleCharCode = currConfig.short;\n                if (singleCharCode !== false) {\n                    if (nextCharCode === singleCharCode) {\n                        // single character string\n                        matchedImage = currPattern;\n                    }\n                }\n                else if (currConfig.isCustom === true) {\n                    match = currPattern.exec(orgText, offset, matchedTokens, groups);\n                    if (match !== null) {\n                        matchedImage = match[0];\n                        if (match.payload !== undefined) {\n                            payload = match.payload;\n                        }\n                    }\n                    else {\n                        matchedImage = null;\n                    }\n                }\n                else {\n                    this.updateLastIndex(currPattern, offset);\n                    matchedImage = this.match(currPattern, text, offset);\n                }\n                if (matchedImage !== null) {\n                    // even though this pattern matched we must try a another longer alternative.\n                    // this can be used to prioritize keywords over identifiers\n                    longerAltIdx = currConfig.longerAlt;\n                    if (longerAltIdx !== undefined) {\n                        // TODO: micro optimize, avoid extra prop access\n                        // by saving/linking longerAlt on the original config?\n                        var longerAltConfig = patternIdxToConfig[longerAltIdx];\n                        var longerAltPattern = longerAltConfig.pattern;\n                        altPayload = null;\n                        // single Char can never be a longer alt so no need to test it.\n                        // manually in-lined because > 600 chars won't be in-lined in V8\n                        if (longerAltConfig.isCustom === true) {\n                            match = longerAltPattern.exec(orgText, offset, matchedTokens, groups);\n                            if (match !== null) {\n                                matchAltImage = match[0];\n                                if (match.payload !== undefined) {\n                                    altPayload = match.payload;\n                                }\n                            }\n                            else {\n                                matchAltImage = null;\n                            }\n                        }\n                        else {\n                            this.updateLastIndex(longerAltPattern, offset);\n                            matchAltImage = this.match(longerAltPattern, text, offset);\n                        }\n                        if (matchAltImage &&\n                            matchAltImage.length > matchedImage.length) {\n                            matchedImage = matchAltImage;\n                            payload = altPayload;\n                            currConfig = longerAltConfig;\n                        }\n                    }\n                    break;\n                }\n            }\n            // successful match\n            if (matchedImage !== null) {\n                imageLength = matchedImage.length;\n                group = currConfig.group;\n                if (group !== undefined) {\n                    tokType = currConfig.tokenTypeIdx;\n                    // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n                    // createFullToken method\n                    newToken = this.createTokenInstance(matchedImage, offset, tokType, currConfig.tokenType, line, column, imageLength);\n                    this.handlePayload(newToken, payload);\n                    // TODO: optimize NOOP in case there are no special groups?\n                    if (group === false) {\n                        matchedTokensIndex = this.addToken(matchedTokens, matchedTokensIndex, newToken);\n                    }\n                    else {\n                        groups[group].push(newToken);\n                    }\n                }\n                text = this.chopInput(text, imageLength);\n                offset = offset + imageLength;\n                // TODO: with newlines the column may be assigned twice\n                column = this.computeNewColumn(column, imageLength);\n                if (trackLines === true &&\n                    currConfig.canLineTerminator === true) {\n                    var numOfLTsInMatch = 0;\n                    var foundTerminator = void 0;\n                    var lastLTEndOffset = void 0;\n                    lineTerminatorPattern.lastIndex = 0;\n                    do {\n                        foundTerminator = lineTerminatorPattern.test(matchedImage);\n                        if (foundTerminator === true) {\n                            lastLTEndOffset =\n                                lineTerminatorPattern.lastIndex - 1;\n                            numOfLTsInMatch++;\n                        }\n                    } while (foundTerminator === true);\n                    if (numOfLTsInMatch !== 0) {\n                        line = line + numOfLTsInMatch;\n                        column = imageLength - lastLTEndOffset;\n                        this.updateTokenEndLineColumnLocation(newToken, group, lastLTEndOffset, numOfLTsInMatch, line, column, imageLength);\n                    }\n                }\n                // will be NOOP if no modes present\n                this.handleModes(currConfig, pop_mode, push_mode, newToken);\n            }\n            else {\n                // error recovery, drop characters until we identify a valid token's start point\n                var errorStartOffset = offset;\n                var errorLine = line;\n                var errorColumn = column;\n                var foundResyncPoint = false;\n                while (!foundResyncPoint && offset < orgLength) {\n                    // drop chars until we succeed in matching something\n                    droppedChar = orgText.charCodeAt(offset);\n                    // Identity Func (when sticky flag is enabled)\n                    text = this.chopInput(text, 1);\n                    offset++;\n                    for (j = 0; j < currModePatternsLength; j++) {\n                        var currConfig_1 = patternIdxToConfig[j];\n                        var currPattern = currConfig_1.pattern;\n                        // manually in-lined because > 600 chars won't be in-lined in V8\n                        var singleCharCode = currConfig_1.short;\n                        if (singleCharCode !== false) {\n                            if (orgText.charCodeAt(offset) === singleCharCode) {\n                                // single character string\n                                foundResyncPoint = true;\n                            }\n                        }\n                        else if (currConfig_1.isCustom === true) {\n                            foundResyncPoint =\n                                currPattern.exec(orgText, offset, matchedTokens, groups) !== null;\n                        }\n                        else {\n                            this.updateLastIndex(currPattern, offset);\n                            foundResyncPoint = currPattern.exec(text) !== null;\n                        }\n                        if (foundResyncPoint === true) {\n                            break;\n                        }\n                    }\n                }\n                errLength = offset - errorStartOffset;\n                // at this point we either re-synced or reached the end of the input text\n                msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(orgText, errorStartOffset, errLength, errorLine, errorColumn);\n                errors.push({\n                    offset: errorStartOffset,\n                    line: errorLine,\n                    column: errorColumn,\n                    length: errLength,\n                    message: msg\n                });\n            }\n        }\n        // if we do have custom patterns which push directly into the\n        // TODO: custom tokens should not push directly??\n        if (!this.hasCustom) {\n            // if we guessed a too large size for the tokens array this will shrink it to the right size.\n            matchedTokens.length = matchedTokensIndex;\n        }\n        return {\n            tokens: matchedTokens,\n            groups: groups,\n            errors: errors\n        };\n    };\n    Lexer.prototype.handleModes = function (config, pop_mode, push_mode, newToken) {\n        if (config.pop === true) {\n            // need to save the PUSH_MODE property as if the mode is popped\n            // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n            var pushMode = config.push;\n            pop_mode(newToken);\n            if (pushMode !== undefined) {\n                push_mode.call(this, pushMode);\n            }\n        }\n        else if (config.push !== undefined) {\n            push_mode.call(this, config.push);\n        }\n    };\n    Lexer.prototype.chopInput = function (text, length) {\n        return text.substring(length);\n    };\n    Lexer.prototype.updateLastIndex = function (regExp, newLastIndex) {\n        regExp.lastIndex = newLastIndex;\n    };\n    // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n    Lexer.prototype.updateTokenEndLineColumnLocation = function (newToken, group, lastLTIdx, numOfLTsInMatch, line, column, imageLength) {\n        var lastCharIsLT, fixForEndingInLT;\n        if (group !== undefined) {\n            // a none skipped multi line Token, need to update endLine/endColumn\n            lastCharIsLT = lastLTIdx === imageLength - 1;\n            fixForEndingInLT = lastCharIsLT ? -1 : 0;\n            if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n                // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n                newToken.endLine = line + fixForEndingInLT;\n                // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n                // inclusive to exclusive range.\n                newToken.endColumn = column - 1 + -fixForEndingInLT;\n            }\n            // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n        }\n    };\n    Lexer.prototype.computeNewColumn = function (oldColumn, imageLength) {\n        return oldColumn + imageLength;\n    };\n    // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.createTokenInstance = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return null;\n    };\n    Lexer.prototype.createOffsetOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    Lexer.prototype.createStartOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            startLine: startLine,\n            startColumn: startColumn,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    Lexer.prototype.createFullToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn, imageLength) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            endOffset: startOffset + imageLength - 1,\n            startLine: startLine,\n            endLine: startLine,\n            startColumn: startColumn,\n            endColumn: startColumn + imageLength - 1,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.addToken = function (tokenVector, index, tokenToAdd) {\n        return 666;\n    };\n    Lexer.prototype.addTokenUsingPush = function (tokenVector, index, tokenToAdd) {\n        tokenVector.push(tokenToAdd);\n        return index;\n    };\n    Lexer.prototype.addTokenUsingMemberAccess = function (tokenVector, index, tokenToAdd) {\n        tokenVector[index] = tokenToAdd;\n        index++;\n        return index;\n    };\n    // Place holder, will be replaced by the correct variant according to the hasCustom flag option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.handlePayload = function (token, payload) { };\n    Lexer.prototype.handlePayloadNoCustom = function (token, payload) { };\n    Lexer.prototype.handlePayloadWithCustom = function (token, payload) {\n        if (payload !== null) {\n            token.payload = payload;\n        }\n    };\n    /* istanbul ignore next - place holder to be replaced with chosen alternative at runtime */\n    Lexer.prototype.match = function (pattern, text, offset) {\n        return null;\n    };\n    Lexer.prototype.matchWithTest = function (pattern, text, offset) {\n        var found = pattern.test(text);\n        if (found === true) {\n            return text.substring(offset, pattern.lastIndex);\n        }\n        return null;\n    };\n    Lexer.prototype.matchWithExec = function (pattern, text) {\n        var regExpArray = pattern.exec(text);\n        return regExpArray !== null ? regExpArray[0] : regExpArray;\n    };\n    // Duplicated from the parser's perf trace trait to allow future extraction\n    // of the lexer to a separate package.\n    Lexer.prototype.TRACE_INIT = function (phaseDesc, phaseImpl) {\n        // No need to optimize this using NOOP pattern because\n        // It is not called in a hot spot...\n        if (this.traceInitPerf === true) {\n            this.traceInitIndent++;\n            var indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                console.log(indent + \"--> <\" + phaseDesc + \">\");\n            }\n            var _a = utils_1.timer(phaseImpl), time = _a.time, value = _a.value;\n            /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n            var traceMethod = time > 10 ? console.warn : console.log;\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                traceMethod(indent + \"<-- <\" + phaseDesc + \"> time: \" + time + \"ms\");\n            }\n            this.traceInitIndent--;\n            return value;\n        }\n        else {\n            return phaseImpl();\n        }\n    };\n    Lexer.SKIPPED = \"This marks a skipped Token pattern, this means each token identified by it will\" +\n        \"be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\";\n    Lexer.NA = /NOT_APPLICABLE/;\n    return Lexer;\n}());\nexports.Lexer = Lexer;\n//# sourceMappingURL=lexer_public.js.map\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tokens_public_1 = __webpack_require__(3);\nvar utils = __webpack_require__(0);\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_1 = __webpack_require__(6);\nvar checks_1 = __webpack_require__(11);\nexports.defaultParserErrorProvider = {\n    buildMismatchTokenMessage: function (_a) {\n        var expected = _a.expected, actual = _a.actual, previous = _a.previous, ruleName = _a.ruleName;\n        var hasLabel = tokens_public_1.hasTokenLabel(expected);\n        var expectedMsg = hasLabel\n            ? \"--> \" + tokens_public_1.tokenLabel(expected) + \" <--\"\n            : \"token of type --> \" + expected.name + \" <--\";\n        var msg = \"Expecting \" + expectedMsg + \" but found --> '\" + actual.image + \"' <--\";\n        return msg;\n    },\n    buildNotAllInputParsedMessage: function (_a) {\n        var firstRedundant = _a.firstRedundant, ruleName = _a.ruleName;\n        return (\"Redundant input, expecting EOF but found: \" + firstRedundant.image);\n    },\n    buildNoViableAltMessage: function (_a) {\n        var expectedPathsPerAlt = _a.expectedPathsPerAlt, actual = _a.actual, previous = _a.previous, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n        var errPrefix = \"Expecting: \";\n        // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n        var actualText = utils_1.first(actual).image;\n        var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n        if (customUserDescription) {\n            return errPrefix + customUserDescription + errSuffix;\n        }\n        else {\n            var allLookAheadPaths = utils_1.reduce(expectedPathsPerAlt, function (result, currAltPaths) { return result.concat(currAltPaths); }, []);\n            var nextValidTokenSequences = utils_1.map(allLookAheadPaths, function (currPath) {\n                return \"[\" + utils_1.map(currPath, function (currTokenType) {\n                    return tokens_public_1.tokenLabel(currTokenType);\n                }).join(\", \") + \"]\";\n            });\n            var nextValidSequenceItems = utils_1.map(nextValidTokenSequences, function (itemMsg, idx) { return \"  \" + (idx + 1) + \". \" + itemMsg; });\n            var calculatedDescription = \"one of these possible Token sequences:\\n\" + nextValidSequenceItems.join(\"\\n\");\n            return errPrefix + calculatedDescription + errSuffix;\n        }\n    },\n    buildEarlyExitMessage: function (_a) {\n        var expectedIterationPaths = _a.expectedIterationPaths, actual = _a.actual, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n        var errPrefix = \"Expecting: \";\n        // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n        var actualText = utils_1.first(actual).image;\n        var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n        if (customUserDescription) {\n            return errPrefix + customUserDescription + errSuffix;\n        }\n        else {\n            var nextValidTokenSequences = utils_1.map(expectedIterationPaths, function (currPath) {\n                return \"[\" + utils_1.map(currPath, function (currTokenType) {\n                    return tokens_public_1.tokenLabel(currTokenType);\n                }).join(\",\") + \"]\";\n            });\n            var calculatedDescription = \"expecting at least one iteration which starts with one of these possible Token sequences::\\n  \" +\n                (\"<\" + nextValidTokenSequences.join(\" ,\") + \">\");\n            return errPrefix + calculatedDescription + errSuffix;\n        }\n    }\n};\nObject.freeze(exports.defaultParserErrorProvider);\nexports.defaultGrammarResolverErrorProvider = {\n    buildRuleNotFoundError: function (topLevelRule, undefinedRule) {\n        var msg = \"Invalid grammar, reference to a rule which is not defined: ->\" +\n            undefinedRule.nonTerminalName +\n            \"<-\\n\" +\n            \"inside top level rule: ->\" +\n            topLevelRule.name +\n            \"<-\";\n        return msg;\n    }\n};\nexports.defaultGrammarValidatorErrorProvider = {\n    buildDuplicateFoundError: function (topLevelRule, duplicateProds) {\n        function getExtraProductionArgument(prod) {\n            if (prod instanceof gast_public_1.Terminal) {\n                return prod.terminalType.name;\n            }\n            else if (prod instanceof gast_public_1.NonTerminal) {\n                return prod.nonTerminalName;\n            }\n            else {\n                return \"\";\n            }\n        }\n        var topLevelName = topLevelRule.name;\n        var duplicateProd = utils_1.first(duplicateProds);\n        var index = duplicateProd.idx;\n        var dslName = gast_1.getProductionDslName(duplicateProd);\n        var extraArgument = getExtraProductionArgument(duplicateProd);\n        var hasExplicitIndex = index > 0;\n        var msg = \"->\" + dslName + (hasExplicitIndex ? index : \"\") + \"<- \" + (extraArgument ? \"with argument: ->\" + extraArgument + \"<-\" : \"\") + \"\\n                  appears more than once (\" + duplicateProds.length + \" times) in the top level rule: ->\" + topLevelName + \"<-.                  \\n                  For further details see: https://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES \\n                  \";\n        // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n        msg = msg.replace(/[ \\t]+/g, \" \");\n        msg = msg.replace(/\\s\\s+/g, \"\\n\");\n        return msg;\n    },\n    buildInvalidNestedRuleNameError: function (topLevelRule, nestedProd) {\n        var msg = \"Invalid nested rule name: ->\" + nestedProd.name + \"<- inside rule: ->\" + topLevelRule.name + \"<-\\n\" +\n            (\"it must match the pattern: ->\" + checks_1.validNestedRuleName.toString() + \"<-.\\n\") +\n            \"Note that this means a nested rule name must start with the '$'(dollar) sign.\";\n        return msg;\n    },\n    buildDuplicateNestedRuleNameError: function (topLevelRule, nestedProd) {\n        var duplicateName = utils_1.first(nestedProd).name;\n        var errMsg = \"Duplicate nested rule name: ->\" + duplicateName + \"<- inside rule: ->\" + topLevelRule.name + \"<-\\n\" +\n            \"A nested name must be unique in the scope of a top level grammar rule.\";\n        return errMsg;\n    },\n    buildNamespaceConflictError: function (rule) {\n        var errMsg = \"Namespace conflict found in grammar.\\n\" +\n            (\"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\" + rule.name + \">.\\n\") +\n            \"To resolve this make sure each Terminal and Non-Terminal names are unique\\n\" +\n            \"This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n\" +\n            \"and Non-Terminal names start with a lower case letter.\";\n        return errMsg;\n    },\n    buildAlternationPrefixAmbiguityError: function (options) {\n        var pathMsg = utils_1.map(options.prefixPath, function (currTok) {\n            return tokens_public_1.tokenLabel(currTok);\n        }).join(\", \");\n        var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n        var errMsg = \"Ambiguous alternatives: <\" + options.ambiguityIndices.join(\" ,\") + \"> due to common lookahead prefix\\n\" +\n            (\"in <OR\" + occurrence + \"> inside <\" + options.topLevelRule.name + \"> Rule,\\n\") +\n            (\"<\" + pathMsg + \"> may appears as a prefix path in all these alternatives.\\n\") +\n            \"See: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n\" +\n            \"For Further details.\";\n        return errMsg;\n    },\n    buildAlternationAmbiguityError: function (options) {\n        var pathMsg = utils_1.map(options.prefixPath, function (currtok) {\n            return tokens_public_1.tokenLabel(currtok);\n        }).join(\", \");\n        var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n        var currMessage = \"Ambiguous Alternatives Detected: <\" + options.ambiguityIndices.join(\" ,\") + \"> in <OR\" + occurrence + \">\" +\n            (\" inside <\" + options.topLevelRule.name + \"> Rule,\\n\") +\n            (\"<\" + pathMsg + \"> may appears as a prefix path in all these alternatives.\\n\");\n        currMessage =\n            currMessage +\n                \"See: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n\" +\n                \"For Further details.\";\n        return currMessage;\n    },\n    buildEmptyRepetitionError: function (options) {\n        var dslName = gast_1.getProductionDslName(options.repetition);\n        if (options.repetition.idx !== 0) {\n            dslName += options.repetition.idx;\n        }\n        var errMsg = \"The repetition <\" + dslName + \"> within Rule <\" + options.topLevelRule.name + \"> can never consume any tokens.\\n\" +\n            \"This could lead to an infinite loop.\";\n        return errMsg;\n    },\n    buildTokenNameError: function (options) {\n        var tokTypeName = options.tokenType.name;\n        var errMsg = \"Invalid Grammar Token name: ->\" + tokTypeName + \"<- it must match the pattern: ->\" + options.expectedPattern.toString() + \"<-\";\n        return errMsg;\n    },\n    buildEmptyAlternationError: function (options) {\n        var errMsg = \"Ambiguous empty alternative: <\" + (options.emptyChoiceIdx + 1) + \">\" +\n            (\" in <OR\" + options.alternation.idx + \"> inside <\" + options.topLevelRule.name + \"> Rule.\\n\") +\n            \"Only the last alternative may be an empty alternative.\";\n        return errMsg;\n    },\n    buildTooManyAlternativesError: function (options) {\n        var errMsg = \"An Alternation cannot have more than 256 alternatives:\\n\" +\n            (\"<OR\" + options.alternation.idx + \"> inside <\" + options.topLevelRule.name + \"> Rule.\\n has \" + (options.alternation.definition.length +\n                1) + \" alternatives.\");\n        return errMsg;\n    },\n    buildLeftRecursionError: function (options) {\n        var ruleName = options.topLevelRule.name;\n        var pathNames = utils.map(options.leftRecursionPath, function (currRule) { return currRule.name; });\n        var leftRecursivePath = ruleName + \" --> \" + pathNames\n            .concat([ruleName])\n            .join(\" --> \");\n        var errMsg = \"Left Recursion found in grammar.\\n\" +\n            (\"rule: <\" + ruleName + \"> can be invoked from itself (directly or indirectly)\\n\") +\n            (\"without consuming any Tokens. The grammar path that causes this is: \\n \" + leftRecursivePath + \"\\n\") +\n            \" To fix this refactor your grammar to remove the left recursion.\\n\" +\n            \"see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.\";\n        return errMsg;\n    },\n    buildInvalidRuleNameError: function (options) {\n        var ruleName = options.topLevelRule.name;\n        var expectedPatternString = options.expectedPattern.toString();\n        var errMsg = \"Invalid grammar rule name: ->\" + ruleName + \"<- it must match the pattern: ->\" + expectedPatternString + \"<-\";\n        return errMsg;\n    },\n    buildDuplicateRuleNameError: function (options) {\n        var ruleName;\n        if (options.topLevelRule instanceof gast_public_1.Rule) {\n            ruleName = options.topLevelRule.name;\n        }\n        else {\n            ruleName = options.topLevelRule;\n        }\n        var errMsg = \"Duplicate definition, rule: ->\" + ruleName + \"<- is already defined in the grammar: ->\" + options.grammarName + \"<-\";\n        return errMsg;\n    }\n};\n//# sourceMappingURL=errors_public.js.map\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __webpack_require__(0);\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\nvar gast_1 = __webpack_require__(6);\nvar lookahead_1 = __webpack_require__(12);\nvar cst_1 = __webpack_require__(17);\nvar interpreter_1 = __webpack_require__(13);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction validateGrammar(topLevels, globalMaxLookahead, tokenTypes, ignoredIssues, errMsgProvider, grammarName) {\n    var duplicateErrors = utils.map(topLevels, function (currTopLevel) {\n        return validateDuplicateProductions(currTopLevel, errMsgProvider);\n    });\n    var leftRecursionErrors = utils.map(topLevels, function (currTopRule) {\n        return validateNoLeftRecursion(currTopRule, currTopRule, errMsgProvider);\n    });\n    var emptyAltErrors = [];\n    var ambiguousAltsErrors = [];\n    var emptyRepetitionErrors = [];\n    // left recursion could cause infinite loops in the following validations.\n    // It is safest to first have the user fix the left recursion errors first and only then examine Further issues.\n    if (utils_1.every(leftRecursionErrors, utils_1.isEmpty)) {\n        emptyAltErrors = utils_1.map(topLevels, function (currTopRule) {\n            return validateEmptyOrAlternative(currTopRule, errMsgProvider);\n        });\n        ambiguousAltsErrors = utils_1.map(topLevels, function (currTopRule) {\n            return validateAmbiguousAlternationAlternatives(currTopRule, globalMaxLookahead, ignoredIssues, errMsgProvider);\n        });\n        emptyRepetitionErrors = validateSomeNonEmptyLookaheadPath(topLevels, globalMaxLookahead, errMsgProvider);\n    }\n    var termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider);\n    var tokenNameErrors = utils.map(tokenTypes, function (currTokType) {\n        return validateTokenName(currTokType, errMsgProvider);\n    });\n    var nestedRulesNameErrors = validateNestedRulesNames(topLevels, errMsgProvider);\n    var nestedRulesDuplicateErrors = validateDuplicateNestedRules(topLevels, errMsgProvider);\n    var tooManyAltsErrors = utils_1.map(topLevels, function (curRule) {\n        return validateTooManyAlts(curRule, errMsgProvider);\n    });\n    var ruleNameErrors = utils_1.map(topLevels, function (curRule) {\n        return validateRuleName(curRule, errMsgProvider);\n    });\n    var duplicateRulesError = utils_1.map(topLevels, function (curRule) {\n        return validateRuleDoesNotAlreadyExist(curRule, topLevels, grammarName, errMsgProvider);\n    });\n    return (utils.flatten(duplicateErrors.concat(tokenNameErrors, nestedRulesNameErrors, nestedRulesDuplicateErrors, emptyRepetitionErrors, leftRecursionErrors, emptyAltErrors, ambiguousAltsErrors, termsNamespaceConflictErrors, tooManyAltsErrors, ruleNameErrors, duplicateRulesError)));\n}\nexports.validateGrammar = validateGrammar;\nfunction validateNestedRulesNames(topLevels, errMsgProvider) {\n    var result = [];\n    utils_1.forEach(topLevels, function (curTopLevel) {\n        var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(\"\");\n        curTopLevel.accept(namedCollectorVisitor);\n        var nestedProds = utils_1.map(namedCollectorVisitor.result, function (currItem) { return currItem.orgProd; });\n        result.push(utils_1.map(nestedProds, function (currNestedProd) {\n            return validateNestedRuleName(curTopLevel, currNestedProd, errMsgProvider);\n        }));\n    });\n    return utils_1.flatten(result);\n}\nfunction validateDuplicateProductions(topLevelRule, errMsgProvider) {\n    var collectorVisitor = new OccurrenceValidationCollector();\n    topLevelRule.accept(collectorVisitor);\n    var allRuleProductions = collectorVisitor.allProductions;\n    var productionGroups = utils.groupBy(allRuleProductions, identifyProductionForDuplicates);\n    var duplicates = utils.pick(productionGroups, function (currGroup) {\n        return currGroup.length > 1;\n    });\n    var errors = utils.map(utils.values(duplicates), function (currDuplicates) {\n        var firstProd = utils.first(currDuplicates);\n        var msg = errMsgProvider.buildDuplicateFoundError(topLevelRule, currDuplicates);\n        var dslName = gast_1.getProductionDslName(firstProd);\n        var defError = {\n            message: msg,\n            type: parser_1.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n            ruleName: topLevelRule.name,\n            dslName: dslName,\n            occurrence: firstProd.idx\n        };\n        var param = getExtraProductionArgument(firstProd);\n        if (param) {\n            defError.parameter = param;\n        }\n        return defError;\n    });\n    return errors;\n}\nfunction identifyProductionForDuplicates(prod) {\n    return gast_1.getProductionDslName(prod) + \"_#_\" + prod.idx + \"_#_\" + getExtraProductionArgument(prod);\n}\nexports.identifyProductionForDuplicates = identifyProductionForDuplicates;\nfunction getExtraProductionArgument(prod) {\n    if (prod instanceof gast_public_1.Terminal) {\n        return prod.terminalType.name;\n    }\n    else if (prod instanceof gast_public_1.NonTerminal) {\n        return prod.nonTerminalName;\n    }\n    else {\n        return \"\";\n    }\n}\nvar OccurrenceValidationCollector = /** @class */ (function (_super) {\n    __extends(OccurrenceValidationCollector, _super);\n    function OccurrenceValidationCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.allProductions = [];\n        return _this;\n    }\n    OccurrenceValidationCollector.prototype.visitNonTerminal = function (subrule) {\n        this.allProductions.push(subrule);\n    };\n    OccurrenceValidationCollector.prototype.visitOption = function (option) {\n        this.allProductions.push(option);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.allProductions.push(manySep);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.allProductions.push(atLeastOne);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.allProductions.push(atLeastOneSep);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetition = function (many) {\n        this.allProductions.push(many);\n    };\n    OccurrenceValidationCollector.prototype.visitAlternation = function (or) {\n        this.allProductions.push(or);\n    };\n    OccurrenceValidationCollector.prototype.visitTerminal = function (terminal) {\n        this.allProductions.push(terminal);\n    };\n    return OccurrenceValidationCollector;\n}(gast_visitor_public_1.GAstVisitor));\nexports.OccurrenceValidationCollector = OccurrenceValidationCollector;\nexports.validTermsPattern = /^[a-zA-Z_]\\w*$/;\nexports.validNestedRuleName = new RegExp(exports.validTermsPattern.source.replace(\"^\", \"^\\\\$\"));\n// TODO: remove this limitation now that we use recorders\nfunction validateRuleName(rule, errMsgProvider) {\n    var errors = [];\n    var ruleName = rule.name;\n    if (!ruleName.match(exports.validTermsPattern)) {\n        errors.push({\n            message: errMsgProvider.buildInvalidRuleNameError({\n                topLevelRule: rule,\n                expectedPattern: exports.validTermsPattern\n            }),\n            type: parser_1.ParserDefinitionErrorType.INVALID_RULE_NAME,\n            ruleName: ruleName\n        });\n    }\n    return errors;\n}\nexports.validateRuleName = validateRuleName;\n// TODO: did the nested rule name regExp now change?\nfunction validateNestedRuleName(topLevel, nestedProd, errMsgProvider) {\n    var errors = [];\n    var errMsg;\n    if (!nestedProd.name.match(exports.validNestedRuleName)) {\n        errMsg = errMsgProvider.buildInvalidNestedRuleNameError(topLevel, nestedProd);\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.INVALID_NESTED_RULE_NAME,\n            ruleName: topLevel.name\n        });\n    }\n    return errors;\n}\nexports.validateNestedRuleName = validateNestedRuleName;\n// TODO: remove this limitation now that we use recorders\nfunction validateTokenName(tokenType, errMsgProvider) {\n    var errors = [];\n    var tokTypeName = tokenType.name;\n    if (!tokTypeName.match(exports.validTermsPattern)) {\n        errors.push({\n            message: errMsgProvider.buildTokenNameError({\n                tokenType: tokenType,\n                expectedPattern: exports.validTermsPattern\n            }),\n            type: parser_1.ParserDefinitionErrorType.INVALID_TOKEN_NAME\n        });\n    }\n    return errors;\n}\nexports.validateTokenName = validateTokenName;\nfunction validateRuleDoesNotAlreadyExist(rule, allRules, className, errMsgProvider) {\n    var errors = [];\n    var occurrences = utils_1.reduce(allRules, function (result, curRule) {\n        if (curRule.name === rule.name) {\n            return result + 1;\n        }\n        return result;\n    }, 0);\n    if (occurrences > 1) {\n        var errMsg = errMsgProvider.buildDuplicateRuleNameError({\n            topLevelRule: rule,\n            grammarName: className\n        });\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n            ruleName: rule.name\n        });\n    }\n    return errors;\n}\nexports.validateRuleDoesNotAlreadyExist = validateRuleDoesNotAlreadyExist;\n// TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n// This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n// The grammar structure, only at runtime.\nfunction validateRuleIsOverridden(ruleName, definedRulesNames, className) {\n    var errors = [];\n    var errMsg;\n    if (!utils.contains(definedRulesNames, ruleName)) {\n        errMsg =\n            \"Invalid rule override, rule: ->\" + ruleName + \"<- cannot be overridden in the grammar: ->\" + className + \"<-\" +\n                \"as it is not defined in any of the super grammars \";\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n            ruleName: ruleName\n        });\n    }\n    return errors;\n}\nexports.validateRuleIsOverridden = validateRuleIsOverridden;\nfunction validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) {\n    if (path === void 0) { path = []; }\n    var errors = [];\n    var nextNonTerminals = getFirstNoneTerminal(currRule.definition);\n    if (utils.isEmpty(nextNonTerminals)) {\n        return [];\n    }\n    else {\n        var ruleName = topRule.name;\n        var foundLeftRecursion = utils.contains(nextNonTerminals, topRule);\n        if (foundLeftRecursion) {\n            errors.push({\n                message: errMsgProvider.buildLeftRecursionError({\n                    topLevelRule: topRule,\n                    leftRecursionPath: path\n                }),\n                type: parser_1.ParserDefinitionErrorType.LEFT_RECURSION,\n                ruleName: ruleName\n            });\n        }\n        // we are only looking for cyclic paths leading back to the specific topRule\n        // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n        var validNextSteps = utils.difference(nextNonTerminals, path.concat([topRule]));\n        var errorsFromNextSteps = utils.map(validNextSteps, function (currRefRule) {\n            var newPath = utils.cloneArr(path);\n            newPath.push(currRefRule);\n            return validateNoLeftRecursion(topRule, currRefRule, errMsgProvider, newPath);\n        });\n        return errors.concat(utils.flatten(errorsFromNextSteps));\n    }\n}\nexports.validateNoLeftRecursion = validateNoLeftRecursion;\nfunction getFirstNoneTerminal(definition) {\n    var result = [];\n    if (utils.isEmpty(definition)) {\n        return result;\n    }\n    var firstProd = utils.first(definition);\n    /* istanbul ignore else */\n    if (firstProd instanceof gast_public_1.NonTerminal) {\n        result.push(firstProd.referencedRule);\n    }\n    else if (firstProd instanceof gast_public_1.Flat ||\n        firstProd instanceof gast_public_1.Option ||\n        firstProd instanceof gast_public_1.RepetitionMandatory ||\n        firstProd instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n        firstProd instanceof gast_public_1.RepetitionWithSeparator ||\n        firstProd instanceof gast_public_1.Repetition) {\n        result = result.concat(getFirstNoneTerminal(firstProd.definition));\n    }\n    else if (firstProd instanceof gast_public_1.Alternation) {\n        // each sub definition in alternation is a FLAT\n        result = utils.flatten(utils.map(firstProd.definition, function (currSubDef) {\n            return getFirstNoneTerminal(currSubDef.definition);\n        }));\n    }\n    else if (firstProd instanceof gast_public_1.Terminal) {\n        // nothing to see, move along\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n    var isFirstOptional = gast_1.isOptionalProd(firstProd);\n    var hasMore = definition.length > 1;\n    if (isFirstOptional && hasMore) {\n        var rest = utils.drop(definition);\n        return result.concat(getFirstNoneTerminal(rest));\n    }\n    else {\n        return result;\n    }\n}\nexports.getFirstNoneTerminal = getFirstNoneTerminal;\nvar OrCollector = /** @class */ (function (_super) {\n    __extends(OrCollector, _super);\n    function OrCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.alternations = [];\n        return _this;\n    }\n    OrCollector.prototype.visitAlternation = function (node) {\n        this.alternations.push(node);\n    };\n    return OrCollector;\n}(gast_visitor_public_1.GAstVisitor));\nfunction validateEmptyOrAlternative(topLevelRule, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    var errors = utils.reduce(ors, function (errors, currOr) {\n        var exceptLast = utils.dropRight(currOr.definition);\n        var currErrors = utils.map(exceptLast, function (currAlternative, currAltIdx) {\n            var possibleFirstInAlt = interpreter_1.nextPossibleTokensAfter([currAlternative], [], null, 1);\n            if (utils.isEmpty(possibleFirstInAlt)) {\n                return {\n                    message: errMsgProvider.buildEmptyAlternationError({\n                        topLevelRule: topLevelRule,\n                        alternation: currOr,\n                        emptyChoiceIdx: currAltIdx\n                    }),\n                    type: parser_1.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n                    ruleName: topLevelRule.name,\n                    occurrence: currOr.idx,\n                    alternative: currAltIdx + 1\n                };\n            }\n            else {\n                return null;\n            }\n        });\n        return errors.concat(utils.compact(currErrors));\n    }, []);\n    return errors;\n}\nexports.validateEmptyOrAlternative = validateEmptyOrAlternative;\nfunction validateAmbiguousAlternationAlternatives(topLevelRule, globalMaxLookahead, ignoredIssues, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    // TODO: this filtering should be deprecated once we remove the ignoredIssues\n    //  IParserConfig property\n    var ignoredIssuesForCurrentRule = ignoredIssues[topLevelRule.name];\n    if (ignoredIssuesForCurrentRule) {\n        ors = utils_1.reject(ors, function (currOr) {\n            return ignoredIssuesForCurrentRule[gast_1.getProductionDslName(currOr) +\n                (currOr.idx === 0 ? \"\" : currOr.idx)];\n        });\n    }\n    // New Handling of ignoring ambiguities\n    // - https://github.com/SAP/chevrotain/issues/869\n    ors = utils_1.reject(ors, function (currOr) { return currOr.ignoreAmbiguities === true; });\n    var errors = utils.reduce(ors, function (result, currOr) {\n        var currOccurrence = currOr.idx;\n        var actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead;\n        var alternatives = lookahead_1.getLookaheadPathsForOr(currOccurrence, topLevelRule, actualMaxLookahead, currOr);\n        var altsAmbiguityErrors = checkAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n        var altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n        return result.concat(altsAmbiguityErrors, altsPrefixAmbiguityErrors);\n    }, []);\n    return errors;\n}\nexports.validateAmbiguousAlternationAlternatives = validateAmbiguousAlternationAlternatives;\nvar RepetionCollector = /** @class */ (function (_super) {\n    __extends(RepetionCollector, _super);\n    function RepetionCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.allProductions = [];\n        return _this;\n    }\n    RepetionCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.allProductions.push(manySep);\n    };\n    RepetionCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.allProductions.push(atLeastOne);\n    };\n    RepetionCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.allProductions.push(atLeastOneSep);\n    };\n    RepetionCollector.prototype.visitRepetition = function (many) {\n        this.allProductions.push(many);\n    };\n    return RepetionCollector;\n}(gast_visitor_public_1.GAstVisitor));\nexports.RepetionCollector = RepetionCollector;\nfunction validateTooManyAlts(topLevelRule, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    var errors = utils.reduce(ors, function (errors, currOr) {\n        if (currOr.definition.length > 255) {\n            errors.push({\n                message: errMsgProvider.buildTooManyAlternativesError({\n                    topLevelRule: topLevelRule,\n                    alternation: currOr\n                }),\n                type: parser_1.ParserDefinitionErrorType.TOO_MANY_ALTS,\n                ruleName: topLevelRule.name,\n                occurrence: currOr.idx\n            });\n        }\n        return errors;\n    }, []);\n    return errors;\n}\nexports.validateTooManyAlts = validateTooManyAlts;\nfunction validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, errMsgProvider) {\n    var errors = [];\n    utils_1.forEach(topLevelRules, function (currTopRule) {\n        var collectorVisitor = new RepetionCollector();\n        currTopRule.accept(collectorVisitor);\n        var allRuleProductions = collectorVisitor.allProductions;\n        utils_1.forEach(allRuleProductions, function (currProd) {\n            var prodType = lookahead_1.getProdType(currProd);\n            var actualMaxLookahead = currProd.maxLookahead || maxLookahead;\n            var currOccurrence = currProd.idx;\n            var paths = lookahead_1.getLookaheadPathsForOptionalProd(currOccurrence, currTopRule, prodType, actualMaxLookahead);\n            var pathsInsideProduction = paths[0];\n            if (utils_1.isEmpty(utils_1.flatten(pathsInsideProduction))) {\n                var errMsg = errMsgProvider.buildEmptyRepetitionError({\n                    topLevelRule: currTopRule,\n                    repetition: currProd\n                });\n                errors.push({\n                    message: errMsg,\n                    type: parser_1.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n                    ruleName: currTopRule.name\n                });\n            }\n        });\n    });\n    return errors;\n}\nexports.validateSomeNonEmptyLookaheadPath = validateSomeNonEmptyLookaheadPath;\nfunction checkAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    var foundAmbiguousPaths = [];\n    var identicalAmbiguities = utils_1.reduce(alternatives, function (result, currAlt, currAltIdx) {\n        // ignore (skip) ambiguities with this alternative\n        if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n            return result;\n        }\n        utils_1.forEach(currAlt, function (currPath) {\n            var altsCurrPathAppearsIn = [currAltIdx];\n            utils_1.forEach(alternatives, function (currOtherAlt, currOtherAltIdx) {\n                if (currAltIdx !== currOtherAltIdx &&\n                    lookahead_1.containsPath(currOtherAlt, currPath) &&\n                    // ignore (skip) ambiguities with this \"other\" alternative\n                    alternation.definition[currOtherAltIdx]\n                        .ignoreAmbiguities !== true) {\n                    altsCurrPathAppearsIn.push(currOtherAltIdx);\n                }\n            });\n            if (altsCurrPathAppearsIn.length > 1 &&\n                !lookahead_1.containsPath(foundAmbiguousPaths, currPath)) {\n                foundAmbiguousPaths.push(currPath);\n                result.push({\n                    alts: altsCurrPathAppearsIn,\n                    path: currPath\n                });\n            }\n        });\n        return result;\n    }, []);\n    var currErrors = utils.map(identicalAmbiguities, function (currAmbDescriptor) {\n        var ambgIndices = utils_1.map(currAmbDescriptor.alts, function (currAltIdx) { return currAltIdx + 1; });\n        var currMessage = errMsgProvider.buildAlternationAmbiguityError({\n            topLevelRule: rule,\n            alternation: alternation,\n            ambiguityIndices: ambgIndices,\n            prefixPath: currAmbDescriptor.path\n        });\n        return {\n            message: currMessage,\n            type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n            ruleName: rule.name,\n            occurrence: alternation.idx,\n            alternatives: [currAmbDescriptor.alts]\n        };\n    });\n    return currErrors;\n}\nfunction checkPrefixAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    var errors = [];\n    // flatten\n    var pathsAndIndices = utils_1.reduce(alternatives, function (result, currAlt, idx) {\n        var currPathsAndIdx = utils_1.map(currAlt, function (currPath) {\n            return { idx: idx, path: currPath };\n        });\n        return result.concat(currPathsAndIdx);\n    }, []);\n    utils_1.forEach(pathsAndIndices, function (currPathAndIdx) {\n        var alternativeGast = alternation.definition[currPathAndIdx.idx];\n        // ignore (skip) ambiguities with this alternative\n        if (alternativeGast.ignoreAmbiguities === true) {\n            return;\n        }\n        var targetIdx = currPathAndIdx.idx;\n        var targetPath = currPathAndIdx.path;\n        var prefixAmbiguitiesPathsAndIndices = utils_1.findAll(pathsAndIndices, function (searchPathAndIdx) {\n            // prefix ambiguity can only be created from lower idx (higher priority) path\n            return (\n            // ignore (skip) ambiguities with this \"other\" alternative\n            alternation.definition[searchPathAndIdx.idx]\n                .ignoreAmbiguities !== true &&\n                searchPathAndIdx.idx < targetIdx &&\n                // checking for strict prefix because identical lookaheads\n                // will be be detected using a different validation.\n                lookahead_1.isStrictPrefixOfPath(searchPathAndIdx.path, targetPath));\n        });\n        var currPathPrefixErrors = utils_1.map(prefixAmbiguitiesPathsAndIndices, function (currAmbPathAndIdx) {\n            var ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1];\n            var occurrence = alternation.idx === 0 ? \"\" : alternation.idx;\n            var message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n                topLevelRule: rule,\n                alternation: alternation,\n                ambiguityIndices: ambgIndices,\n                prefixPath: currAmbPathAndIdx.path\n            });\n            return {\n                message: message,\n                type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n                ruleName: rule.name,\n                occurrence: occurrence,\n                alternatives: ambgIndices\n            };\n        });\n        errors = errors.concat(currPathPrefixErrors);\n    });\n    return errors;\n}\nexports.checkPrefixAlternativesAmbiguities = checkPrefixAlternativesAmbiguities;\nfunction checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider) {\n    var errors = [];\n    var tokenNames = utils_1.map(tokenTypes, function (currToken) { return currToken.name; });\n    utils_1.forEach(topLevels, function (currRule) {\n        var currRuleName = currRule.name;\n        if (utils_1.contains(tokenNames, currRuleName)) {\n            var errMsg = errMsgProvider.buildNamespaceConflictError(currRule);\n            errors.push({\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n                ruleName: currRuleName\n            });\n        }\n    });\n    return errors;\n}\nfunction validateDuplicateNestedRules(topLevelRules, errMsgProvider) {\n    var errors = [];\n    utils_1.forEach(topLevelRules, function (currTopRule) {\n        var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(\"\");\n        currTopRule.accept(namedCollectorVisitor);\n        var prodsByGroup = utils_1.groupBy(namedCollectorVisitor.result, function (item) { return item.name; });\n        var duplicates = utils_1.pick(prodsByGroup, function (currGroup) {\n            return currGroup.length > 1;\n        });\n        utils_1.forEach(utils_1.values(duplicates), function (currDupGroup) {\n            var currDupProds = utils_1.map(currDupGroup, function (dupGroup) { return dupGroup.orgProd; });\n            var errMsg = errMsgProvider.buildDuplicateNestedRuleNameError(currTopRule, currDupProds);\n            errors.push({\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.DUPLICATE_NESTED_NAME,\n                ruleName: currTopRule.name\n            });\n        });\n    });\n    return errors;\n}\n//# sourceMappingURL=checks.js.map\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar interpreter_1 = __webpack_require__(13);\nvar rest_1 = __webpack_require__(14);\nvar tokens_1 = __webpack_require__(5);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n    PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n    PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.Option) {\n        return PROD_TYPE.OPTION;\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return PROD_TYPE.REPETITION;\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return PROD_TYPE.REPETITION_MANDATORY;\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return PROD_TYPE.ALTERNATION;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.getProdType = getProdType;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n    var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n    var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n        ? tokens_1.tokenStructuredMatcherNoCategories\n        : tokens_1.tokenStructuredMatcher;\n    return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n *  When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n *  the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n *  Example: given a production:\n *  ABC(DE)?DF\n *\n *  The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n *  alternatives.\n *\n *  @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n    var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n    var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n        ? tokens_1.tokenStructuredMatcherNoCategories\n        : tokens_1.tokenStructuredMatcher;\n    return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n    var numOfAlts = alts.length;\n    var areAllOneTokenLookahead = utils_1.every(alts, function (currAlt) {\n        return utils_1.every(currAlt, function (currPath) {\n            return currPath.length === 1;\n        });\n    });\n    // This version takes into account the predicates as well.\n    if (hasPredicates) {\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function (orAlts) {\n            // unfortunately the predicates must be extracted every single time\n            // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n            // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n            var predicates = utils_1.map(orAlts, function (currAlt) { return currAlt.GATE; });\n            for (var t = 0; t < numOfAlts; t++) {\n                var currAlt = alts[t];\n                var currNumOfPaths = currAlt.length;\n                var currPredicate = predicates[t];\n                if (currPredicate !== undefined &&\n                    currPredicate.call(this) === false) {\n                    // if the predicate does not match there is no point in checking the paths\n                    continue;\n                }\n                nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n                    var currPath = currAlt[j];\n                    var currPathLength = currPath.length;\n                    for (var i = 0; i < currPathLength; i++) {\n                        var nextToken = this.LA(i + 1);\n                        if (tokenMatcher(nextToken, currPath[i]) === false) {\n                            // mismatch in current path\n                            // try the next pth\n                            continue nextPath;\n                        }\n                    }\n                    // found a full path that matches.\n                    // this will also work for an empty ALT as the loop will be skipped\n                    return t;\n                }\n                // none of the paths for the current alternative matched\n                // try the next alternative\n            }\n            // none of the alternatives could be matched\n            return undefined;\n        };\n    }\n    else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n        // optimized (common) case of all the lookaheads paths requiring only\n        // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n        var singleTokenAlts = utils_1.map(alts, function (currAlt) {\n            return utils_1.flatten(currAlt);\n        });\n        var choiceToAlt_1 = utils_1.reduce(singleTokenAlts, function (result, currAlt, idx) {\n            utils_1.forEach(currAlt, function (currTokType) {\n                if (!utils_1.has(result, currTokType.tokenTypeIdx)) {\n                    result[currTokType.tokenTypeIdx] = idx;\n                }\n                utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) {\n                    if (!utils_1.has(result, currExtendingType)) {\n                        result[currExtendingType] = idx;\n                    }\n                });\n            });\n            return result;\n        }, []);\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function () {\n            var nextToken = this.LA(1);\n            return choiceToAlt_1[nextToken.tokenTypeIdx];\n        };\n    }\n    else {\n        // optimized lookahead without needing to check the predicates at all.\n        // this causes code duplication which is intentional to improve performance.\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function () {\n            for (var t = 0; t < numOfAlts; t++) {\n                var currAlt = alts[t];\n                var currNumOfPaths = currAlt.length;\n                nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n                    var currPath = currAlt[j];\n                    var currPathLength = currPath.length;\n                    for (var i = 0; i < currPathLength; i++) {\n                        var nextToken = this.LA(i + 1);\n                        if (tokenMatcher(nextToken, currPath[i]) === false) {\n                            // mismatch in current path\n                            // try the next pth\n                            continue nextPath;\n                        }\n                    }\n                    // found a full path that matches.\n                    // this will also work for an empty ALT as the loop will be skipped\n                    return t;\n                }\n                // none of the paths for the current alternative matched\n                // try the next alternative\n            }\n            // none of the alternatives could be matched\n            return undefined;\n        };\n    }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n    var areAllOneTokenLookahead = utils_1.every(alt, function (currPath) {\n        return currPath.length === 1;\n    });\n    var numOfPaths = alt.length;\n    // optimized (common) case of all the lookaheads paths requiring only\n    // a single token lookahead.\n    if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n        var singleTokensTypes = utils_1.flatten(alt);\n        if (singleTokensTypes.length === 1 &&\n            utils_1.isEmpty(singleTokensTypes[0].categoryMatches)) {\n            var expectedTokenType = singleTokensTypes[0];\n            var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n            return function () {\n                return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n            };\n        }\n        else {\n            var choiceToAlt_2 = utils_1.reduce(singleTokensTypes, function (result, currTokType, idx) {\n                result[currTokType.tokenTypeIdx] = true;\n                utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) {\n                    result[currExtendingType] = true;\n                });\n                return result;\n            }, []);\n            return function () {\n                var nextToken = this.LA(1);\n                return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n            };\n        }\n    }\n    else {\n        return function () {\n            nextPath: for (var j = 0; j < numOfPaths; j++) {\n                var currPath = alt[j];\n                var currPathLength = currPath.length;\n                for (var i = 0; i < currPathLength; i++) {\n                    var nextToken = this.LA(i + 1);\n                    if (tokenMatcher(nextToken, currPath[i]) === false) {\n                        // mismatch in current path\n                        // try the next pth\n                        continue nextPath;\n                    }\n                }\n                // found a full path that matches.\n                return true;\n            }\n            // none of the paths matched\n            return false;\n        };\n    }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n    __extends(RestDefinitionFinderWalker, _super);\n    function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n        var _this = _super.call(this) || this;\n        _this.topProd = topProd;\n        _this.targetOccurrence = targetOccurrence;\n        _this.targetProdType = targetProdType;\n        return _this;\n    }\n    RestDefinitionFinderWalker.prototype.startWalking = function () {\n        this.walk(this.topProd);\n        return this.restDef;\n    };\n    RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n        if (node.idx === this.targetOccurrence &&\n            this.targetProdType === expectedProdType) {\n            this.restDef = currRest.concat(prevRest);\n            return true;\n        }\n        // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n        return false;\n    };\n    RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n        if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n        if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n        }\n    };\n    return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n    __extends(InsideDefinitionFinderVisitor, _super);\n    function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n        var _this = _super.call(this) || this;\n        _this.targetOccurrence = targetOccurrence;\n        _this.targetProdType = targetProdType;\n        _this.targetRef = targetRef;\n        _this.result = [];\n        return _this;\n    }\n    InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n        if (node.idx === this.targetOccurrence &&\n            this.targetProdType === expectedProdName &&\n            (this.targetRef === undefined || node === this.targetRef)) {\n            this.result = node.definition;\n        }\n    };\n    InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.OPTION);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n    };\n    return InsideDefinitionFinderVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n    var result = new Array(size);\n    for (var i = 0; i < size; i++) {\n        result[i] = [];\n    }\n    return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * -  A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n    var keys = [\"\"];\n    for (var i = 0; i < path.length; i++) {\n        var tokType = path[i];\n        var longerKeys = [];\n        for (var j = 0; j < keys.length; j++) {\n            var currShorterKey = keys[j];\n            longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n            for (var t = 0; t < tokType.categoryMatches.length; t++) {\n                var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n                longerKeys.push(currShorterKey + categoriesKeySuffix);\n            }\n        }\n        keys = longerKeys;\n    }\n    return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n    for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n        // We only want to test vs the other alternatives\n        if (currAltIdx === idx) {\n            continue;\n        }\n        var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n        for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n            var searchKey = searchPathKeys[searchIdx];\n            if (otherAltKnownPathsKeys[searchKey] === true) {\n                return false;\n            }\n        }\n    }\n    // None of the SearchPathKeys were found in any of the other alternatives\n    return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n    var partialAlts = utils_1.map(altsDefs, function (currAlt) { return interpreter_1.possiblePathsFrom([currAlt], 1); });\n    var finalResult = initializeArrayOfArrays(partialAlts.length);\n    var altsHashes = utils_1.map(partialAlts, function (currAltPaths) {\n        var dict = {};\n        utils_1.forEach(currAltPaths, function (item) {\n            var keys = pathToHashKeys(item.partialPath);\n            utils_1.forEach(keys, function (currKey) {\n                dict[currKey] = true;\n            });\n        });\n        return dict;\n    });\n    var newData = partialAlts;\n    // maxLookahead loop\n    for (var pathLength = 1; pathLength <= k; pathLength++) {\n        var currDataset = newData;\n        newData = initializeArrayOfArrays(currDataset.length);\n        var _loop_1 = function (altIdx) {\n            var currAltPathsAndSuffixes = currDataset[altIdx];\n            // paths in current alternative loop\n            for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n                var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n                var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n                var prefixKeys = pathToHashKeys(currPathPrefix);\n                var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n                // End of the line for this path.\n                if (isUnique ||\n                    utils_1.isEmpty(suffixDef) ||\n                    currPathPrefix.length === k) {\n                    var currAltResult = finalResult[altIdx];\n                    // TODO: Can we implement a containsPath using Maps/Dictionaries?\n                    if (containsPath(currAltResult, currPathPrefix) === false) {\n                        currAltResult.push(currPathPrefix);\n                        // Update all new  keys for the current path.\n                        for (var j = 0; j < prefixKeys.length; j++) {\n                            var currKey = prefixKeys[j];\n                            altsHashes[altIdx][currKey] = true;\n                        }\n                    }\n                }\n                // Expand longer paths\n                else {\n                    var newPartialPathsAndSuffixes = interpreter_1.possiblePathsFrom(suffixDef, pathLength + 1, currPathPrefix);\n                    newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n                    // Update keys for new known paths\n                    utils_1.forEach(newPartialPathsAndSuffixes, function (item) {\n                        var prefixKeys = pathToHashKeys(item.partialPath);\n                        utils_1.forEach(prefixKeys, function (key) {\n                            altsHashes[altIdx][key] = true;\n                        });\n                    });\n                }\n            }\n        };\n        // alternatives loop\n        for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n            _loop_1(altIdx);\n        }\n    }\n    return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n    var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n    ruleGrammar.accept(visitor);\n    return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n    var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n    ruleGrammar.accept(insideDefVisitor);\n    var insideDef = insideDefVisitor.result;\n    var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n    var afterDef = afterDefWalker.startWalking();\n    var insideFlat = new gast_public_1.Flat({ definition: insideDef });\n    var afterFlat = new gast_public_1.Flat({ definition: afterDef });\n    return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n    compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n        var otherPath = alternative[i];\n        if (otherPath.length !== searchPath.length) {\n            continue;\n        }\n        for (var j = 0; j < otherPath.length; j++) {\n            var searchTok = searchPath[j];\n            var otherTok = otherPath[j];\n            var matchingTokens = searchTok === otherTok ||\n                otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !==\n                    undefined;\n            if (matchingTokens === false) {\n                continue compareOtherPath;\n            }\n        }\n        return true;\n    }\n    return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n    return (prefix.length < other.length &&\n        utils_1.every(prefix, function (tokType, idx) {\n            var otherTokType = other[idx];\n            return (tokType === otherTokType ||\n                otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n        }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n    return utils_1.every(lookAheadPaths, function (singleAltPaths) {\n        return utils_1.every(singleAltPaths, function (singlePath) {\n            return utils_1.every(singlePath, function (token) { return utils_1.isEmpty(token.categoryMatches); });\n        });\n    });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* istanbul ignore next */ var __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar rest_1 = __webpack_require__(14);\nvar utils_1 = __webpack_require__(0);\nvar first_1 = __webpack_require__(22);\nvar gast_public_1 = __webpack_require__(1);\nvar AbstractNextPossibleTokensWalker = /** @class */ (function (_super) {\n    __extends(AbstractNextPossibleTokensWalker, _super);\n    function AbstractNextPossibleTokensWalker(topProd, path) {\n        var _this = _super.call(this) /* istanbul ignore next */ || this;\n        _this.topProd = topProd;\n        _this.path = path;\n        _this.possibleTokTypes = [];\n        _this.nextProductionName = \"\";\n        _this.nextProductionOccurrence = 0;\n        _this.found = false;\n        _this.isAtEndOfPath = false;\n        return _this;\n    }\n    AbstractNextPossibleTokensWalker.prototype.startWalking = function () {\n        this.found = false;\n        if (this.path.ruleStack[0] !== this.topProd.name) {\n            throw Error(\"The path does not start with the walker's top Rule!\");\n        }\n        // immutable for the win\n        this.ruleStack = utils_1.cloneArr(this.path.ruleStack).reverse(); // intelij bug requires assertion\n        this.occurrenceStack = utils_1.cloneArr(this.path.occurrenceStack).reverse(); // intelij bug requires assertion\n        // already verified that the first production is valid, we now seek the 2nd production\n        this.ruleStack.pop();\n        this.occurrenceStack.pop();\n        this.updateExpectedNext();\n        this.walk(this.topProd);\n        return this.possibleTokTypes;\n    };\n    AbstractNextPossibleTokensWalker.prototype.walk = function (prod, prevRest) {\n        if (prevRest === void 0) { prevRest = []; }\n        // stop scanning once we found the path\n        if (!this.found) {\n            _super.prototype.walk.call(this, prod, prevRest);\n        }\n    };\n    AbstractNextPossibleTokensWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n        // found the next production, need to keep walking in it\n        if (refProd.referencedRule.name === this.nextProductionName &&\n            refProd.idx === this.nextProductionOccurrence) {\n            var fullRest = currRest.concat(prevRest);\n            this.updateExpectedNext();\n            this.walk(refProd.referencedRule, fullRest);\n        }\n    };\n    AbstractNextPossibleTokensWalker.prototype.updateExpectedNext = function () {\n        // need to consume the Terminal\n        if (utils_1.isEmpty(this.ruleStack)) {\n            // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n            // really seeking is the last Terminal...\n            this.nextProductionName = \"\";\n            this.nextProductionOccurrence = 0;\n            this.isAtEndOfPath = true;\n        }\n        else {\n            this.nextProductionName = this.ruleStack.pop();\n            this.nextProductionOccurrence = this.occurrenceStack.pop();\n        }\n    };\n    return AbstractNextPossibleTokensWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextPossibleTokensWalker = AbstractNextPossibleTokensWalker;\nvar NextAfterTokenWalker = /** @class */ (function (_super) {\n    __extends(NextAfterTokenWalker, _super);\n    function NextAfterTokenWalker(topProd, path) {\n        var _this = _super.call(this, topProd, path) /* istanbul ignore next */ || this;\n        _this.path = path;\n        _this.nextTerminalName = \"\";\n        _this.nextTerminalOccurrence = 0;\n        _this.nextTerminalName = _this.path.lastTok.name;\n        _this.nextTerminalOccurrence = _this.path.lastTokOccurrence;\n        return _this;\n    }\n    NextAfterTokenWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n        if (this.isAtEndOfPath &&\n            terminal.terminalType.name === this.nextTerminalName &&\n            terminal.idx === this.nextTerminalOccurrence &&\n            !this.found) {\n            var fullRest = currRest.concat(prevRest);\n            var restProd = new gast_public_1.Flat({ definition: fullRest });\n            this.possibleTokTypes = first_1.first(restProd);\n            this.found = true;\n        }\n    };\n    return NextAfterTokenWalker;\n}(AbstractNextPossibleTokensWalker));\nexports.NextAfterTokenWalker = NextAfterTokenWalker;\n/**\n * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n * it never \"follows\" production refs\n */\nvar AbstractNextTerminalAfterProductionWalker = /** @class */ (function (_super) {\n    __extends(AbstractNextTerminalAfterProductionWalker, _super);\n    function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) {\n        var _this = _super.call(this) /* istanbul ignore next */ || this;\n        _this.topRule = topRule;\n        _this.occurrence = occurrence;\n        _this.result = {\n            token: undefined,\n            occurrence: undefined,\n            isEndOfRule: undefined\n        };\n        return _this;\n    }\n    AbstractNextTerminalAfterProductionWalker.prototype.startWalking = function () {\n        this.walk(this.topRule);\n        return this.result;\n    };\n    return AbstractNextTerminalAfterProductionWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextTerminalAfterProductionWalker = AbstractNextTerminalAfterProductionWalker;\nvar NextTerminalAfterManyWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterManyWalker, _super);\n    function NextTerminalAfterManyWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterManyWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        if (manyProd.idx === this.occurrence) {\n            var firstAfterMany = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterMany === undefined;\n            if (firstAfterMany instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterMany.terminalType;\n                this.result.occurrence = firstAfterMany.idx;\n            }\n        }\n        else {\n            _super.prototype.walkMany.call(this, manyProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterManyWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManyWalker = NextTerminalAfterManyWalker;\nvar NextTerminalAfterManySepWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterManySepWalker, _super);\n    function NextTerminalAfterManySepWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterManySepWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        if (manySepProd.idx === this.occurrence) {\n            var firstAfterManySep = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterManySep === undefined;\n            if (firstAfterManySep instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterManySep.terminalType;\n                this.result.occurrence = firstAfterManySep.idx;\n            }\n        }\n        else {\n            _super.prototype.walkManySep.call(this, manySepProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterManySepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManySepWalker = NextTerminalAfterManySepWalker;\nvar NextTerminalAfterAtLeastOneWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterAtLeastOneWalker, _super);\n    function NextTerminalAfterAtLeastOneWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterAtLeastOneWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        if (atLeastOneProd.idx === this.occurrence) {\n            var firstAfterAtLeastOne = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterAtLeastOne === undefined;\n            if (firstAfterAtLeastOne instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterAtLeastOne.terminalType;\n                this.result.occurrence = firstAfterAtLeastOne.idx;\n            }\n        }\n        else {\n            _super.prototype.walkAtLeastOne.call(this, atLeastOneProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterAtLeastOneWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneWalker = NextTerminalAfterAtLeastOneWalker;\n// TODO: reduce code duplication in the AfterWalkers\nvar NextTerminalAfterAtLeastOneSepWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterAtLeastOneSepWalker, _super);\n    function NextTerminalAfterAtLeastOneSepWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterAtLeastOneSepWalker.prototype.walkAtLeastOneSep = function (atleastOneSepProd, currRest, prevRest) {\n        if (atleastOneSepProd.idx === this.occurrence) {\n            var firstAfterfirstAfterAtLeastOneSep = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule =\n                firstAfterfirstAfterAtLeastOneSep === undefined;\n            if (firstAfterfirstAfterAtLeastOneSep instanceof gast_public_1.Terminal) {\n                this.result.token =\n                    firstAfterfirstAfterAtLeastOneSep.terminalType;\n                this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx;\n            }\n        }\n        else {\n            _super.prototype.walkAtLeastOneSep.call(this, atleastOneSepProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterAtLeastOneSepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneSepWalker = NextTerminalAfterAtLeastOneSepWalker;\nfunction possiblePathsFrom(targetDef, maxLength, currPath) {\n    if (currPath === void 0) { currPath = []; }\n    // avoid side effects\n    currPath = utils_1.cloneArr(currPath);\n    var result = [];\n    var i = 0;\n    // TODO: avoid inner funcs\n    function remainingPathWith(nextDef) {\n        return nextDef.concat(utils_1.drop(targetDef, i + 1));\n    }\n    // TODO: avoid inner funcs\n    function getAlternativesForProd(definition) {\n        var alternatives = possiblePathsFrom(remainingPathWith(definition), maxLength, currPath);\n        return result.concat(alternatives);\n    }\n    /**\n     * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n     * following (rest) of the targetDef.\n     *\n     * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n     * the optional production.\n     */\n    while (currPath.length < maxLength && i < targetDef.length) {\n        var prod = targetDef[i];\n        /* istanbul ignore else */\n        if (prod instanceof gast_public_1.Flat) {\n            return getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.NonTerminal) {\n            return getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.Option) {\n            result = getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatory) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: prod.definition\n                })\n            ]);\n            return getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n            var newDef = [\n                new gast_public_1.Flat({ definition: prod.definition }),\n                new gast_public_1.Repetition({\n                    definition: [\n                        new gast_public_1.Terminal({ terminalType: prod.separator })\n                    ].concat(prod.definition)\n                })\n            ];\n            return getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: [\n                        new gast_public_1.Terminal({ terminalType: prod.separator })\n                    ].concat(prod.definition)\n                })\n            ]);\n            result = getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.Repetition) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: prod.definition\n                })\n            ]);\n            result = getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.Alternation) {\n            utils_1.forEach(prod.definition, function (currAlt) {\n                result = getAlternativesForProd(currAlt.definition);\n            });\n            return result;\n        }\n        else if (prod instanceof gast_public_1.Terminal) {\n            currPath.push(prod.terminalType);\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n        i++;\n    }\n    result.push({\n        partialPath: currPath,\n        suffixDef: utils_1.drop(targetDef, i)\n    });\n    return result;\n}\nexports.possiblePathsFrom = possiblePathsFrom;\nfunction nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, maxLookAhead) {\n    var EXIT_NON_TERMINAL = \"EXIT_NONE_TERMINAL\";\n    // to avoid creating a new Array each time.\n    var EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL];\n    var EXIT_ALTERNATIVE = \"EXIT_ALTERNATIVE\";\n    var foundCompletePath = false;\n    var tokenVectorLength = tokenVector.length;\n    var minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1;\n    var result = [];\n    var possiblePaths = [];\n    possiblePaths.push({\n        idx: -1,\n        def: initialDef,\n        ruleStack: [],\n        occurrenceStack: []\n    });\n    while (!utils_1.isEmpty(possiblePaths)) {\n        var currPath = possiblePaths.pop();\n        // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n        if (currPath === EXIT_ALTERNATIVE) {\n            if (foundCompletePath &&\n                utils_1.last(possiblePaths).idx <= minimalAlternativesIndex) {\n                // remove irrelevant alternative\n                possiblePaths.pop();\n            }\n            continue;\n        }\n        var currDef = currPath.def;\n        var currIdx = currPath.idx;\n        var currRuleStack = currPath.ruleStack;\n        var currOccurrenceStack = currPath.occurrenceStack;\n        // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n        if (utils_1.isEmpty(currDef)) {\n            continue;\n        }\n        var prod = currDef[0];\n        /* istanbul ignore else */\n        if (prod === EXIT_NON_TERMINAL) {\n            var nextPath = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: utils_1.dropRight(currRuleStack),\n                occurrenceStack: utils_1.dropRight(currOccurrenceStack)\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.Terminal) {\n            /* istanbul ignore else */\n            if (currIdx < tokenVectorLength - 1) {\n                var nextIdx = currIdx + 1;\n                var actualToken = tokenVector[nextIdx];\n                if (tokMatcher(actualToken, prod.terminalType)) {\n                    var nextPath = {\n                        idx: nextIdx,\n                        def: utils_1.drop(currDef),\n                        ruleStack: currRuleStack,\n                        occurrenceStack: currOccurrenceStack\n                    };\n                    possiblePaths.push(nextPath);\n                }\n                // end of the line\n            }\n            else if (currIdx === tokenVectorLength - 1) {\n                // IGNORE ABOVE ELSE\n                result.push({\n                    nextTokenType: prod.terminalType,\n                    nextTokenOccurrence: prod.idx,\n                    ruleStack: currRuleStack,\n                    occurrenceStack: currOccurrenceStack\n                });\n                foundCompletePath = true;\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        }\n        else if (prod instanceof gast_public_1.NonTerminal) {\n            var newRuleStack = utils_1.cloneArr(currRuleStack);\n            newRuleStack.push(prod.nonTerminalName);\n            var newOccurrenceStack = utils_1.cloneArr(currOccurrenceStack);\n            newOccurrenceStack.push(prod.idx);\n            var nextPath = {\n                idx: currIdx,\n                def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, utils_1.drop(currDef)),\n                ruleStack: newRuleStack,\n                occurrenceStack: newOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.Option) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            var nextPathWith = {\n                idx: currIdx,\n                def: prod.definition.concat(utils_1.drop(currDef)),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatory) {\n            // TODO:(THE NEW operators here take a while...) (convert once?)\n            var secondIteration = new gast_public_1.Repetition({\n                definition: prod.definition,\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef));\n            var nextPath = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n            // TODO:(THE NEW operators here take a while...) (convert once?)\n            var separatorGast = new gast_public_1.Terminal({\n                terminalType: prod.separator\n            });\n            var secondIteration = new gast_public_1.Repetition({\n                definition: [separatorGast].concat(prod.definition),\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef));\n            var nextPath = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            var separatorGast = new gast_public_1.Terminal({\n                terminalType: prod.separator\n            });\n            var nthRepetition = new gast_public_1.Repetition({\n                definition: [separatorGast].concat(prod.definition),\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef));\n            var nextPathWith = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.Repetition) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n            var nthRepetition = new gast_public_1.Repetition({\n                definition: prod.definition,\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef));\n            var nextPathWith = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.Alternation) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            for (var i = prod.definition.length - 1; i >= 0; i--) {\n                var currAlt = prod.definition[i];\n                var currAltPath = {\n                    idx: currIdx,\n                    def: currAlt.definition.concat(utils_1.drop(currDef)),\n                    ruleStack: currRuleStack,\n                    occurrenceStack: currOccurrenceStack\n                };\n                possiblePaths.push(currAltPath);\n                possiblePaths.push(EXIT_ALTERNATIVE);\n            }\n        }\n        else if (prod instanceof gast_public_1.Flat) {\n            possiblePaths.push({\n                idx: currIdx,\n                def: prod.definition.concat(utils_1.drop(currDef)),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            });\n        }\n        else if (prod instanceof gast_public_1.Rule) {\n            // last because we should only encounter at most a single one of these per invocation.\n            possiblePaths.push(expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack));\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    }\n    return result;\n}\nexports.nextPossibleTokensAfter = nextPossibleTokensAfter;\nfunction expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurrenceStack) {\n    var newRuleStack = utils_1.cloneArr(currRuleStack);\n    newRuleStack.push(topRule.name);\n    var newCurrOccurrenceStack = utils_1.cloneArr(currOccurrenceStack);\n    // top rule is always assumed to have been called with occurrence index 1\n    newCurrOccurrenceStack.push(1);\n    return {\n        idx: currIdx,\n        def: topRule.definition,\n        ruleStack: newRuleStack,\n        occurrenceStack: newCurrOccurrenceStack\n    };\n}\n//# sourceMappingURL=interpreter.js.map\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\n/**\n *  A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n */\nvar RestWalker = /** @class */ (function () {\n    function RestWalker() {\n    }\n    RestWalker.prototype.walk = function (prod, prevRest) {\n        var _this = this;\n        if (prevRest === void 0) { prevRest = []; }\n        utils_1.forEach(prod.definition, function (subProd, index) {\n            var currRest = utils_1.drop(prod.definition, index + 1);\n            /* istanbul ignore else */\n            if (subProd instanceof gast_public_1.NonTerminal) {\n                _this.walkProdRef(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Terminal) {\n                _this.walkTerminal(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Flat) {\n                _this.walkFlat(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Option) {\n                _this.walkOption(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionMandatory) {\n                _this.walkAtLeastOne(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n                _this.walkAtLeastOneSep(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionWithSeparator) {\n                _this.walkManySep(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Repetition) {\n                _this.walkMany(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Alternation) {\n                _this.walkOr(subProd, currRest, prevRest);\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n    };\n    RestWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { };\n    RestWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { };\n    RestWalker.prototype.walkFlat = function (flatProd, currRest, prevRest) {\n        // ABCDEF => after the D the rest is EF\n        var fullOrRest = currRest.concat(prevRest);\n        this.walk(flatProd, fullOrRest);\n    };\n    RestWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n        // ABC(DE)?F => after the (DE)? the rest is F\n        var fullOrRest = currRest.concat(prevRest);\n        this.walk(optionProd, fullOrRest);\n    };\n    RestWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n        var fullAtLeastOneRest = [\n            new gast_public_1.Option({ definition: atLeastOneProd.definition })\n        ].concat(currRest, prevRest);\n        this.walk(atLeastOneProd, fullAtLeastOneRest);\n    };\n    RestWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n        // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n        var fullAtLeastOneSepRest = restForRepetitionWithSeparator(atLeastOneSepProd, currRest, prevRest);\n        this.walk(atLeastOneSepProd, fullAtLeastOneSepRest);\n    };\n    RestWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n        var fullManyRest = [\n            new gast_public_1.Option({ definition: manyProd.definition })\n        ].concat(currRest, prevRest);\n        this.walk(manyProd, fullManyRest);\n    };\n    RestWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n        var fullManySepRest = restForRepetitionWithSeparator(manySepProd, currRest, prevRest);\n        this.walk(manySepProd, fullManySepRest);\n    };\n    RestWalker.prototype.walkOr = function (orProd, currRest, prevRest) {\n        var _this = this;\n        // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n        var fullOrRest = currRest.concat(prevRest);\n        // walk all different alternatives\n        utils_1.forEach(orProd.definition, function (alt) {\n            // wrapping each alternative in a single definition wrapper\n            // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n            // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n            var prodWrapper = new gast_public_1.Flat({ definition: [alt] });\n            _this.walk(prodWrapper, fullOrRest);\n        });\n    };\n    return RestWalker;\n}());\nexports.RestWalker = RestWalker;\nfunction restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {\n    var repSepRest = [\n        new gast_public_1.Option({\n            definition: [\n                new gast_public_1.Terminal({ terminalType: repSepProd.separator })\n            ].concat(repSepProd.definition)\n        })\n    ];\n    var fullRepSepRest = repSepRest.concat(currRest, prevRest);\n    return fullRepSepRest;\n}\n//# sourceMappingURL=rest.js.map\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;;(function(root, factory) {\n    // istanbul ignore next\n    if (true) {\n        // istanbul ignore next\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n    } else {}\n})(\n    typeof self !== \"undefined\"\n        ? // istanbul ignore next\n          self\n        : this,\n    function() {\n        // references\n        // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n        // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\n        function RegExpParser() {}\n\n        RegExpParser.prototype.saveState = function() {\n            return {\n                idx: this.idx,\n                input: this.input,\n                groupIdx: this.groupIdx\n            }\n        }\n\n        RegExpParser.prototype.restoreState = function(newState) {\n            this.idx = newState.idx\n            this.input = newState.input\n            this.groupIdx = newState.groupIdx\n        }\n\n        RegExpParser.prototype.pattern = function(input) {\n            // parser state\n            this.idx = 0\n            this.input = input\n            this.groupIdx = 0\n\n            this.consumeChar(\"/\")\n            var value = this.disjunction()\n            this.consumeChar(\"/\")\n\n            var flags = {\n                type: \"Flags\",\n                global: false,\n                ignoreCase: false,\n                multiLine: false,\n                unicode: false,\n                sticky: false\n            }\n\n            while (this.isRegExpFlag()) {\n                switch (this.popChar()) {\n                    case \"g\":\n                        addFlag(flags, \"global\")\n                        break\n                    case \"i\":\n                        addFlag(flags, \"ignoreCase\")\n                        break\n                    case \"m\":\n                        addFlag(flags, \"multiLine\")\n                        break\n                    case \"u\":\n                        addFlag(flags, \"unicode\")\n                        break\n                    case \"y\":\n                        addFlag(flags, \"sticky\")\n                        break\n                }\n            }\n\n            if (this.idx !== this.input.length) {\n                throw Error(\n                    \"Redundant input: \" + this.input.substring(this.idx)\n                )\n            }\n            return { type: \"Pattern\", flags: flags, value: value }\n        }\n\n        RegExpParser.prototype.disjunction = function() {\n            var alts = []\n            alts.push(this.alternative())\n\n            while (this.peekChar() === \"|\") {\n                this.consumeChar(\"|\")\n                alts.push(this.alternative())\n            }\n\n            return { type: \"Disjunction\", value: alts }\n        }\n\n        RegExpParser.prototype.alternative = function() {\n            var terms = []\n\n            while (this.isTerm()) {\n                terms.push(this.term())\n            }\n\n            return { type: \"Alternative\", value: terms }\n        }\n\n        RegExpParser.prototype.term = function() {\n            if (this.isAssertion()) {\n                return this.assertion()\n            } else {\n                return this.atom()\n            }\n        }\n\n        RegExpParser.prototype.assertion = function() {\n            switch (this.popChar()) {\n                case \"^\":\n                    return { type: \"StartAnchor\" }\n                case \"$\":\n                    return { type: \"EndAnchor\" }\n                // '\\b' or '\\B'\n                case \"\\\\\":\n                    switch (this.popChar()) {\n                        case \"b\":\n                            return { type: \"WordBoundary\" }\n                        case \"B\":\n                            return { type: \"NonWordBoundary\" }\n                    }\n                    // istanbul ignore next\n                    throw Error(\"Invalid Assertion Escape\")\n                // '(?=' or '(?!'\n                case \"(\":\n                    this.consumeChar(\"?\")\n\n                    var type\n                    switch (this.popChar()) {\n                        case \"=\":\n                            type = \"Lookahead\"\n                            break\n                        case \"!\":\n                            type = \"NegativeLookahead\"\n                            break\n                    }\n                    ASSERT_EXISTS(type)\n\n                    var disjunction = this.disjunction()\n\n                    this.consumeChar(\")\")\n\n                    return { type: type, value: disjunction }\n            }\n            // istanbul ignore next\n            ASSERT_NEVER_REACH_HERE()\n        }\n\n        RegExpParser.prototype.quantifier = function(isBacktracking) {\n            var range\n            switch (this.popChar()) {\n                case \"*\":\n                    range = {\n                        atLeast: 0,\n                        atMost: Infinity\n                    }\n                    break\n                case \"+\":\n                    range = {\n                        atLeast: 1,\n                        atMost: Infinity\n                    }\n                    break\n                case \"?\":\n                    range = {\n                        atLeast: 0,\n                        atMost: 1\n                    }\n                    break\n                case \"{\":\n                    var atLeast = this.integerIncludingZero()\n                    switch (this.popChar()) {\n                        case \"}\":\n                            range = {\n                                atLeast: atLeast,\n                                atMost: atLeast\n                            }\n                            break\n                        case \",\":\n                            var atMost\n                            if (this.isDigit()) {\n                                atMost = this.integerIncludingZero()\n                                range = {\n                                    atLeast: atLeast,\n                                    atMost: atMost\n                                }\n                            } else {\n                                range = {\n                                    atLeast: atLeast,\n                                    atMost: Infinity\n                                }\n                            }\n                            this.consumeChar(\"}\")\n                            break\n                    }\n                    // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n                    // causes severe performance degradations\n                    if (isBacktracking === true && range === undefined) {\n                        return undefined\n                    }\n                    ASSERT_EXISTS(range)\n                    break\n            }\n\n            // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n            // causes severe performance degradations\n            if (isBacktracking === true && range === undefined) {\n                return undefined\n            }\n\n            ASSERT_EXISTS(range)\n\n            if (this.peekChar(0) === \"?\") {\n                this.consumeChar(\"?\")\n                range.greedy = false\n            } else {\n                range.greedy = true\n            }\n\n            range.type = \"Quantifier\"\n            return range\n        }\n\n        RegExpParser.prototype.atom = function() {\n            var atom\n            switch (this.peekChar()) {\n                case \".\":\n                    atom = this.dotAll()\n                    break\n                case \"\\\\\":\n                    atom = this.atomEscape()\n                    break\n                case \"[\":\n                    atom = this.characterClass()\n                    break\n                case \"(\":\n                    atom = this.group()\n                    break\n            }\n\n            if (atom === undefined && this.isPatternCharacter()) {\n                atom = this.patternCharacter()\n            }\n\n            ASSERT_EXISTS(atom)\n\n            if (this.isQuantifier()) {\n                atom.quantifier = this.quantifier()\n            }\n\n            return atom\n        }\n\n        RegExpParser.prototype.dotAll = function() {\n            this.consumeChar(\".\")\n            return {\n                type: \"Set\",\n                complement: true,\n                value: [cc(\"\\n\"), cc(\"\\r\"), cc(\"\\u2028\"), cc(\"\\u2029\")]\n            }\n        }\n\n        RegExpParser.prototype.atomEscape = function() {\n            this.consumeChar(\"\\\\\")\n\n            switch (this.peekChar()) {\n                case \"1\":\n                case \"2\":\n                case \"3\":\n                case \"4\":\n                case \"5\":\n                case \"6\":\n                case \"7\":\n                case \"8\":\n                case \"9\":\n                    return this.decimalEscapeAtom()\n                case \"d\":\n                case \"D\":\n                case \"s\":\n                case \"S\":\n                case \"w\":\n                case \"W\":\n                    return this.characterClassEscape()\n                case \"f\":\n                case \"n\":\n                case \"r\":\n                case \"t\":\n                case \"v\":\n                    return this.controlEscapeAtom()\n                case \"c\":\n                    return this.controlLetterEscapeAtom()\n                case \"0\":\n                    return this.nulCharacterAtom()\n                case \"x\":\n                    return this.hexEscapeSequenceAtom()\n                case \"u\":\n                    return this.regExpUnicodeEscapeSequenceAtom()\n                default:\n                    return this.identityEscapeAtom()\n            }\n        }\n\n        RegExpParser.prototype.decimalEscapeAtom = function() {\n            var value = this.positiveInteger()\n\n            return { type: \"GroupBackReference\", value: value }\n        }\n\n        RegExpParser.prototype.characterClassEscape = function() {\n            var set\n            var complement = false\n            switch (this.popChar()) {\n                case \"d\":\n                    set = digitsCharCodes\n                    break\n                case \"D\":\n                    set = digitsCharCodes\n                    complement = true\n                    break\n                case \"s\":\n                    set = whitespaceCodes\n                    break\n                case \"S\":\n                    set = whitespaceCodes\n                    complement = true\n                    break\n                case \"w\":\n                    set = wordCharCodes\n                    break\n                case \"W\":\n                    set = wordCharCodes\n                    complement = true\n                    break\n            }\n\n            ASSERT_EXISTS(set)\n\n            return { type: \"Set\", value: set, complement: complement }\n        }\n\n        RegExpParser.prototype.controlEscapeAtom = function() {\n            var escapeCode\n            switch (this.popChar()) {\n                case \"f\":\n                    escapeCode = cc(\"\\f\")\n                    break\n                case \"n\":\n                    escapeCode = cc(\"\\n\")\n                    break\n                case \"r\":\n                    escapeCode = cc(\"\\r\")\n                    break\n                case \"t\":\n                    escapeCode = cc(\"\\t\")\n                    break\n                case \"v\":\n                    escapeCode = cc(\"\\v\")\n                    break\n            }\n            ASSERT_EXISTS(escapeCode)\n\n            return { type: \"Character\", value: escapeCode }\n        }\n\n        RegExpParser.prototype.controlLetterEscapeAtom = function() {\n            this.consumeChar(\"c\")\n            var letter = this.popChar()\n            if (/[a-zA-Z]/.test(letter) === false) {\n                throw Error(\"Invalid \")\n            }\n\n            var letterCode = letter.toUpperCase().charCodeAt(0) - 64\n            return { type: \"Character\", value: letterCode }\n        }\n\n        RegExpParser.prototype.nulCharacterAtom = function() {\n            // TODO implement '[lookahead ∉ DecimalDigit]'\n            // TODO: for the deprecated octal escape sequence\n            this.consumeChar(\"0\")\n            return { type: \"Character\", value: cc(\"\\0\") }\n        }\n\n        RegExpParser.prototype.hexEscapeSequenceAtom = function() {\n            this.consumeChar(\"x\")\n            return this.parseHexDigits(2)\n        }\n\n        RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() {\n            this.consumeChar(\"u\")\n            return this.parseHexDigits(4)\n        }\n\n        RegExpParser.prototype.identityEscapeAtom = function() {\n            // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n            // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n            var escapedChar = this.popChar()\n            return { type: \"Character\", value: cc(escapedChar) }\n        }\n\n        RegExpParser.prototype.classPatternCharacterAtom = function() {\n            switch (this.peekChar()) {\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                // istanbul ignore next\n                case \"\\\\\":\n                // istanbul ignore next\n                case \"]\":\n                    throw Error(\"TBD\")\n                default:\n                    var nextChar = this.popChar()\n                    return { type: \"Character\", value: cc(nextChar) }\n            }\n        }\n\n        RegExpParser.prototype.characterClass = function() {\n            var set = []\n            var complement = false\n            this.consumeChar(\"[\")\n            if (this.peekChar(0) === \"^\") {\n                this.consumeChar(\"^\")\n                complement = true\n            }\n\n            while (this.isClassAtom()) {\n                var from = this.classAtom()\n                var isFromSingleChar = from.type === \"Character\"\n                if (isFromSingleChar && this.isRangeDash()) {\n                    this.consumeChar(\"-\")\n                    var to = this.classAtom()\n                    var isToSingleChar = to.type === \"Character\"\n\n                    // a range can only be used when both sides are single characters\n                    if (isToSingleChar) {\n                        if (to.value < from.value) {\n                            throw Error(\"Range out of order in character class\")\n                        }\n                        set.push({ from: from.value, to: to.value })\n                    } else {\n                        // literal dash\n                        insertToSet(from.value, set)\n                        set.push(cc(\"-\"))\n                        insertToSet(to.value, set)\n                    }\n                } else {\n                    insertToSet(from.value, set)\n                }\n            }\n\n            this.consumeChar(\"]\")\n\n            return { type: \"Set\", complement: complement, value: set }\n        }\n\n        RegExpParser.prototype.classAtom = function() {\n            switch (this.peekChar()) {\n                // istanbul ignore next\n                case \"]\":\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                    throw Error(\"TBD\")\n                case \"\\\\\":\n                    return this.classEscape()\n                default:\n                    return this.classPatternCharacterAtom()\n            }\n        }\n\n        RegExpParser.prototype.classEscape = function() {\n            this.consumeChar(\"\\\\\")\n            switch (this.peekChar()) {\n                // Matches a backspace.\n                // (Not to be confused with \\b word boundary outside characterClass)\n                case \"b\":\n                    this.consumeChar(\"b\")\n                    return { type: \"Character\", value: cc(\"\\u0008\") }\n                case \"d\":\n                case \"D\":\n                case \"s\":\n                case \"S\":\n                case \"w\":\n                case \"W\":\n                    return this.characterClassEscape()\n                case \"f\":\n                case \"n\":\n                case \"r\":\n                case \"t\":\n                case \"v\":\n                    return this.controlEscapeAtom()\n                case \"c\":\n                    return this.controlLetterEscapeAtom()\n                case \"0\":\n                    return this.nulCharacterAtom()\n                case \"x\":\n                    return this.hexEscapeSequenceAtom()\n                case \"u\":\n                    return this.regExpUnicodeEscapeSequenceAtom()\n                default:\n                    return this.identityEscapeAtom()\n            }\n        }\n\n        RegExpParser.prototype.group = function() {\n            var capturing = true\n            this.consumeChar(\"(\")\n            switch (this.peekChar(0)) {\n                case \"?\":\n                    this.consumeChar(\"?\")\n                    this.consumeChar(\":\")\n                    capturing = false\n                    break\n                default:\n                    this.groupIdx++\n                    break\n            }\n            var value = this.disjunction()\n            this.consumeChar(\")\")\n\n            var groupAst = {\n                type: \"Group\",\n                capturing: capturing,\n                value: value\n            }\n\n            if (capturing) {\n                groupAst.idx = this.groupIdx\n            }\n\n            return groupAst\n        }\n\n        RegExpParser.prototype.positiveInteger = function() {\n            var number = this.popChar()\n\n            // istanbul ignore next - can't ever get here due to previous lookahead checks\n            // still implementing this error checking in case this ever changes.\n            if (decimalPatternNoZero.test(number) === false) {\n                throw Error(\"Expecting a positive integer\")\n            }\n\n            while (decimalPattern.test(this.peekChar(0))) {\n                number += this.popChar()\n            }\n\n            return parseInt(number, 10)\n        }\n\n        RegExpParser.prototype.integerIncludingZero = function() {\n            var number = this.popChar()\n            if (decimalPattern.test(number) === false) {\n                throw Error(\"Expecting an integer\")\n            }\n\n            while (decimalPattern.test(this.peekChar(0))) {\n                number += this.popChar()\n            }\n\n            return parseInt(number, 10)\n        }\n\n        RegExpParser.prototype.patternCharacter = function() {\n            var nextChar = this.popChar()\n            switch (nextChar) {\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                // istanbul ignore next\n                case \"^\":\n                // istanbul ignore next\n                case \"$\":\n                // istanbul ignore next\n                case \"\\\\\":\n                // istanbul ignore next\n                case \".\":\n                // istanbul ignore next\n                case \"*\":\n                // istanbul ignore next\n                case \"+\":\n                // istanbul ignore next\n                case \"?\":\n                // istanbul ignore next\n                case \"(\":\n                // istanbul ignore next\n                case \")\":\n                // istanbul ignore next\n                case \"[\":\n                // istanbul ignore next\n                case \"|\":\n                    // istanbul ignore next\n                    throw Error(\"TBD\")\n                default:\n                    return { type: \"Character\", value: cc(nextChar) }\n            }\n        }\n        RegExpParser.prototype.isRegExpFlag = function() {\n            switch (this.peekChar(0)) {\n                case \"g\":\n                case \"i\":\n                case \"m\":\n                case \"u\":\n                case \"y\":\n                    return true\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isRangeDash = function() {\n            return this.peekChar() === \"-\" && this.isClassAtom(1)\n        }\n\n        RegExpParser.prototype.isDigit = function() {\n            return decimalPattern.test(this.peekChar(0))\n        }\n\n        RegExpParser.prototype.isClassAtom = function(howMuch) {\n            if (howMuch === undefined) {\n                howMuch = 0\n            }\n\n            switch (this.peekChar(howMuch)) {\n                case \"]\":\n                case \"\\n\":\n                case \"\\r\":\n                case \"\\u2028\":\n                case \"\\u2029\":\n                    return false\n                default:\n                    return true\n            }\n        }\n\n        RegExpParser.prototype.isTerm = function() {\n            return this.isAtom() || this.isAssertion()\n        }\n\n        RegExpParser.prototype.isAtom = function() {\n            if (this.isPatternCharacter()) {\n                return true\n            }\n\n            switch (this.peekChar(0)) {\n                case \".\":\n                case \"\\\\\": // atomEscape\n                case \"[\": // characterClass\n                // TODO: isAtom must be called before isAssertion - disambiguate\n                case \"(\": // group\n                    return true\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isAssertion = function() {\n            switch (this.peekChar(0)) {\n                case \"^\":\n                case \"$\":\n                    return true\n                // '\\b' or '\\B'\n                case \"\\\\\":\n                    switch (this.peekChar(1)) {\n                        case \"b\":\n                        case \"B\":\n                            return true\n                        default:\n                            return false\n                    }\n                // '(?=' or '(?!'\n                case \"(\":\n                    return (\n                        this.peekChar(1) === \"?\" &&\n                        (this.peekChar(2) === \"=\" || this.peekChar(2) === \"!\")\n                    )\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isQuantifier = function() {\n            var prevState = this.saveState()\n            try {\n                return this.quantifier(true) !== undefined\n            } catch (e) {\n                return false\n            } finally {\n                this.restoreState(prevState)\n            }\n        }\n\n        RegExpParser.prototype.isPatternCharacter = function() {\n            switch (this.peekChar()) {\n                case \"^\":\n                case \"$\":\n                case \"\\\\\":\n                case \".\":\n                case \"*\":\n                case \"+\":\n                case \"?\":\n                case \"(\":\n                case \")\":\n                case \"[\":\n                case \"|\":\n                case \"/\":\n                case \"\\n\":\n                case \"\\r\":\n                case \"\\u2028\":\n                case \"\\u2029\":\n                    return false\n                default:\n                    return true\n            }\n        }\n\n        RegExpParser.prototype.parseHexDigits = function(howMany) {\n            var hexString = \"\"\n            for (var i = 0; i < howMany; i++) {\n                var hexChar = this.popChar()\n                if (hexDigitPattern.test(hexChar) === false) {\n                    throw Error(\"Expecting a HexDecimal digits\")\n                }\n                hexString += hexChar\n            }\n            var charCode = parseInt(hexString, 16)\n            return { type: \"Character\", value: charCode }\n        }\n\n        RegExpParser.prototype.peekChar = function(howMuch) {\n            if (howMuch === undefined) {\n                howMuch = 0\n            }\n            return this.input[this.idx + howMuch]\n        }\n\n        RegExpParser.prototype.popChar = function() {\n            var nextChar = this.peekChar(0)\n            this.consumeChar()\n            return nextChar\n        }\n\n        RegExpParser.prototype.consumeChar = function(char) {\n            if (char !== undefined && this.input[this.idx] !== char) {\n                throw Error(\n                    \"Expected: '\" +\n                        char +\n                        \"' but found: '\" +\n                        this.input[this.idx] +\n                        \"' at offset: \" +\n                        this.idx\n                )\n            }\n\n            if (this.idx >= this.input.length) {\n                throw Error(\"Unexpected end of input\")\n            }\n            this.idx++\n        }\n\n        // consts and utilities\n        var hexDigitPattern = /[0-9a-fA-F]/\n        var decimalPattern = /[0-9]/\n        var decimalPatternNoZero = /[1-9]/\n\n        function cc(char) {\n            return char.charCodeAt(0)\n        }\n\n        function insertToSet(item, set) {\n            if (item.length !== undefined) {\n                item.forEach(function(subItem) {\n                    set.push(subItem)\n                })\n            } else {\n                set.push(item)\n            }\n        }\n\n        function addFlag(flagObj, flagKey) {\n            if (flagObj[flagKey] === true) {\n                throw \"duplicate flag \" + flagKey\n            }\n\n            flagObj[flagKey] = true\n        }\n\n        function ASSERT_EXISTS(obj) {\n            // istanbul ignore next\n            if (obj === undefined) {\n                throw Error(\"Internal Error - Should never get here!\")\n            }\n        }\n\n        // istanbul ignore next\n        function ASSERT_NEVER_REACH_HERE() {\n            throw Error(\"Internal Error - Should never get here!\")\n        }\n\n        var i\n        var digitsCharCodes = []\n        for (i = cc(\"0\"); i <= cc(\"9\"); i++) {\n            digitsCharCodes.push(i)\n        }\n\n        var wordCharCodes = [cc(\"_\")].concat(digitsCharCodes)\n        for (i = cc(\"a\"); i <= cc(\"z\"); i++) {\n            wordCharCodes.push(i)\n        }\n\n        for (i = cc(\"A\"); i <= cc(\"Z\"); i++) {\n            wordCharCodes.push(i)\n        }\n\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\n        var whitespaceCodes = [\n            cc(\" \"),\n            cc(\"\\f\"),\n            cc(\"\\n\"),\n            cc(\"\\r\"),\n            cc(\"\\t\"),\n            cc(\"\\v\"),\n            cc(\"\\t\"),\n            cc(\"\\u00a0\"),\n            cc(\"\\u1680\"),\n            cc(\"\\u2000\"),\n            cc(\"\\u2001\"),\n            cc(\"\\u2002\"),\n            cc(\"\\u2003\"),\n            cc(\"\\u2004\"),\n            cc(\"\\u2005\"),\n            cc(\"\\u2006\"),\n            cc(\"\\u2007\"),\n            cc(\"\\u2008\"),\n            cc(\"\\u2009\"),\n            cc(\"\\u200a\"),\n            cc(\"\\u2028\"),\n            cc(\"\\u2029\"),\n            cc(\"\\u202f\"),\n            cc(\"\\u205f\"),\n            cc(\"\\u3000\"),\n            cc(\"\\ufeff\")\n        ]\n\n        function BaseRegExpVisitor() {}\n\n        BaseRegExpVisitor.prototype.visitChildren = function(node) {\n            for (var key in node) {\n                var child = node[key]\n                /* istanbul ignore else */\n                if (node.hasOwnProperty(key)) {\n                    if (child.type !== undefined) {\n                        this.visit(child)\n                    } else if (Array.isArray(child)) {\n                        child.forEach(function(subChild) {\n                            this.visit(subChild)\n                        }, this)\n                    }\n                }\n            }\n        }\n\n        BaseRegExpVisitor.prototype.visit = function(node) {\n            switch (node.type) {\n                case \"Pattern\":\n                    this.visitPattern(node)\n                    break\n                case \"Flags\":\n                    this.visitFlags(node)\n                    break\n                case \"Disjunction\":\n                    this.visitDisjunction(node)\n                    break\n                case \"Alternative\":\n                    this.visitAlternative(node)\n                    break\n                case \"StartAnchor\":\n                    this.visitStartAnchor(node)\n                    break\n                case \"EndAnchor\":\n                    this.visitEndAnchor(node)\n                    break\n                case \"WordBoundary\":\n                    this.visitWordBoundary(node)\n                    break\n                case \"NonWordBoundary\":\n                    this.visitNonWordBoundary(node)\n                    break\n                case \"Lookahead\":\n                    this.visitLookahead(node)\n                    break\n                case \"NegativeLookahead\":\n                    this.visitNegativeLookahead(node)\n                    break\n                case \"Character\":\n                    this.visitCharacter(node)\n                    break\n                case \"Set\":\n                    this.visitSet(node)\n                    break\n                case \"Group\":\n                    this.visitGroup(node)\n                    break\n                case \"GroupBackReference\":\n                    this.visitGroupBackReference(node)\n                    break\n                case \"Quantifier\":\n                    this.visitQuantifier(node)\n                    break\n            }\n\n            this.visitChildren(node)\n        }\n\n        BaseRegExpVisitor.prototype.visitPattern = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitFlags = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitDisjunction = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitAlternative = function(node) {}\n\n        // Assertion\n        BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitLookahead = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {}\n\n        // atoms\n        BaseRegExpVisitor.prototype.visitCharacter = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitSet = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitGroup = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitQuantifier = function(node) {}\n\n        return {\n            RegExpParser: RegExpParser,\n            BaseRegExpVisitor: BaseRegExpVisitor,\n            VERSION: \"0.4.0\"\n        }\n    }\n)\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar regExpAstCache = {};\nvar regExpParser = new regexp_to_ast_1.RegExpParser();\nfunction getRegExpAst(regExp) {\n    var regExpStr = regExp.toString();\n    if (regExpAstCache.hasOwnProperty(regExpStr)) {\n        return regExpAstCache[regExpStr];\n    }\n    else {\n        var regExpAst = regExpParser.pattern(regExpStr);\n        regExpAstCache[regExpStr] = regExpAst;\n        return regExpAst;\n    }\n}\nexports.getRegExpAst = getRegExpAst;\nfunction clearRegExpParserCache() {\n    regExpAstCache = {};\n}\nexports.clearRegExpParserCache = clearRegExpParserCache;\n//# sourceMappingURL=reg_exp_parser.js.map\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar keys_1 = __webpack_require__(7);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nfunction setNodeLocationOnlyOffset(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n        // assumption1: Token location information is either NaN or a valid number\n        // assumption2: Token location information is fully valid if it exist\n        // (both start/end offsets exist and are numbers).\n        currNodeLocation.startOffset = newLocationInfo.startOffset;\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n    }\n    // Once the startOffset has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n    }\n}\nexports.setNodeLocationOnlyOffset = setNodeLocationOnlyOffset;\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nfunction setNodeLocationFull(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n        // assumption1: Token location information is either NaN or a valid number\n        // assumption2: Token location information is fully valid if it exist\n        // (all start/end props exist and are numbers).\n        currNodeLocation.startOffset = newLocationInfo.startOffset;\n        currNodeLocation.startColumn = newLocationInfo.startColumn;\n        currNodeLocation.startLine = newLocationInfo.startLine;\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n        currNodeLocation.endColumn = newLocationInfo.endColumn;\n        currNodeLocation.endLine = newLocationInfo.endLine;\n    }\n    // Once the start props has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n        currNodeLocation.endColumn = newLocationInfo.endColumn;\n        currNodeLocation.endLine = newLocationInfo.endLine;\n    }\n}\nexports.setNodeLocationFull = setNodeLocationFull;\nfunction addTerminalToCst(node, token, tokenTypeName) {\n    if (node.children[tokenTypeName] === undefined) {\n        node.children[tokenTypeName] = [token];\n    }\n    else {\n        node.children[tokenTypeName].push(token);\n    }\n}\nexports.addTerminalToCst = addTerminalToCst;\nfunction addNoneTerminalToCst(node, ruleName, ruleResult) {\n    if (node.children[ruleName] === undefined) {\n        node.children[ruleName] = [ruleResult];\n    }\n    else {\n        node.children[ruleName].push(ruleResult);\n    }\n}\nexports.addNoneTerminalToCst = addNoneTerminalToCst;\nvar NamedDSLMethodsCollectorVisitor = /** @class */ (function (_super) {\n    __extends(NamedDSLMethodsCollectorVisitor, _super);\n    function NamedDSLMethodsCollectorVisitor(ruleIdx) {\n        var _this = _super.call(this) || this;\n        _this.result = [];\n        _this.ruleIdx = ruleIdx;\n        return _this;\n    }\n    NamedDSLMethodsCollectorVisitor.prototype.collectNamedDSLMethod = function (node, newNodeConstructor, methodIdx) {\n        // TODO: better hack to copy what we need here...\n        if (!utils_1.isUndefined(node.name)) {\n            // copy without name so this will indeed be processed later.\n            var nameLessNode \n            /* istanbul ignore else */\n            = void 0;\n            /* istanbul ignore else */\n            if (node instanceof gast_public_1.Option ||\n                node instanceof gast_public_1.Repetition ||\n                node instanceof gast_public_1.RepetitionMandatory ||\n                node instanceof gast_public_1.Alternation) {\n                nameLessNode = new newNodeConstructor({\n                    definition: node.definition,\n                    idx: node.idx\n                });\n            }\n            else if (node instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n                node instanceof gast_public_1.RepetitionWithSeparator) {\n                nameLessNode = new newNodeConstructor({\n                    definition: node.definition,\n                    idx: node.idx,\n                    separator: node.separator\n                });\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n            var def = [nameLessNode];\n            var key = keys_1.getKeyForAutomaticLookahead(this.ruleIdx, methodIdx, node.idx);\n            this.result.push({ def: def, key: key, name: node.name, orgProd: node });\n        }\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitOption = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.Option, keys_1.OPTION_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetition = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.Repetition, keys_1.MANY_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatory, keys_1.AT_LEAST_ONE_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatoryWithSeparator, keys_1.AT_LEAST_ONE_SEP_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionWithSeparator, keys_1.MANY_SEP_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitAlternation = function (node) {\n        var _this = this;\n        this.collectNamedDSLMethod(node, gast_public_1.Alternation, keys_1.OR_IDX);\n        var hasMoreThanOneAlternative = node.definition.length > 1;\n        utils_1.forEach(node.definition, function (currFlatAlt, altIdx) {\n            if (!utils_1.isUndefined(currFlatAlt.name)) {\n                var def = currFlatAlt.definition;\n                if (hasMoreThanOneAlternative) {\n                    def = [new gast_public_1.Option({ definition: currFlatAlt.definition })];\n                }\n                else {\n                    // mandatory\n                    def = currFlatAlt.definition;\n                }\n                var key = keys_1.getKeyForAltIndex(_this.ruleIdx, keys_1.OR_IDX, node.idx, altIdx);\n                _this.result.push({\n                    def: def,\n                    key: key,\n                    name: currFlatAlt.name,\n                    orgProd: currFlatAlt\n                });\n            }\n        });\n    };\n    return NamedDSLMethodsCollectorVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.NamedDSLMethodsCollectorVisitor = NamedDSLMethodsCollectorVisitor;\nfunction expandAllNestedRuleNames(topRules, fullToShortName) {\n    var result = {\n        allRuleNames: []\n    };\n    utils_1.forEach(topRules, function (currTopRule) {\n        var currTopRuleShortName = fullToShortName[currTopRule.name];\n        result.allRuleNames.push(currTopRule.name);\n        var namedCollectorVisitor = new NamedDSLMethodsCollectorVisitor(currTopRuleShortName);\n        currTopRule.accept(namedCollectorVisitor);\n        utils_1.forEach(namedCollectorVisitor.result, function (_a) {\n            var def = _a.def, key = _a.key, name = _a.name;\n            result.allRuleNames.push(currTopRule.name + name);\n        });\n    });\n    return result;\n}\nexports.expandAllNestedRuleNames = expandAllNestedRuleNames;\n//# sourceMappingURL=cst.js.map\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// semantic version\nvar version_1 = __webpack_require__(19);\nexports.VERSION = version_1.VERSION;\nvar parser_1 = __webpack_require__(2);\nexports.Parser = parser_1.Parser;\nexports.CstParser = parser_1.CstParser;\nexports.EmbeddedActionsParser = parser_1.EmbeddedActionsParser;\nexports.ParserDefinitionErrorType = parser_1.ParserDefinitionErrorType;\nexports.EMPTY_ALT = parser_1.EMPTY_ALT;\nvar lexer_public_1 = __webpack_require__(9);\nexports.Lexer = lexer_public_1.Lexer;\nexports.LexerDefinitionErrorType = lexer_public_1.LexerDefinitionErrorType;\n// Tokens utilities\nvar tokens_public_1 = __webpack_require__(3);\nexports.createToken = tokens_public_1.createToken;\nexports.createTokenInstance = tokens_public_1.createTokenInstance;\nexports.EOF = tokens_public_1.EOF;\nexports.tokenLabel = tokens_public_1.tokenLabel;\nexports.tokenMatcher = tokens_public_1.tokenMatcher;\nexports.tokenName = tokens_public_1.tokenName;\n// Other Utilities\nvar errors_public_1 = __webpack_require__(10);\nexports.defaultGrammarResolverErrorProvider = errors_public_1.defaultGrammarResolverErrorProvider;\nexports.defaultGrammarValidatorErrorProvider = errors_public_1.defaultGrammarValidatorErrorProvider;\nexports.defaultParserErrorProvider = errors_public_1.defaultParserErrorProvider;\nvar exceptions_public_1 = __webpack_require__(8);\nexports.EarlyExitException = exceptions_public_1.EarlyExitException;\nexports.isRecognitionException = exceptions_public_1.isRecognitionException;\nexports.MismatchedTokenException = exceptions_public_1.MismatchedTokenException;\nexports.NotAllInputParsedException = exceptions_public_1.NotAllInputParsedException;\nexports.NoViableAltException = exceptions_public_1.NoViableAltException;\nvar lexer_errors_public_1 = __webpack_require__(21);\nexports.defaultLexerErrorProvider = lexer_errors_public_1.defaultLexerErrorProvider;\n// grammar reflection API\nvar gast_public_1 = __webpack_require__(1);\nexports.Alternation = gast_public_1.Alternation;\nexports.Flat = gast_public_1.Flat;\nexports.NonTerminal = gast_public_1.NonTerminal;\nexports.Option = gast_public_1.Option;\nexports.Repetition = gast_public_1.Repetition;\nexports.RepetitionMandatory = gast_public_1.RepetitionMandatory;\nexports.RepetitionMandatoryWithSeparator = gast_public_1.RepetitionMandatoryWithSeparator;\nexports.RepetitionWithSeparator = gast_public_1.RepetitionWithSeparator;\nexports.Rule = gast_public_1.Rule;\nexports.Terminal = gast_public_1.Terminal;\n// GAST Utilities\nvar gast_public_2 = __webpack_require__(1);\nexports.serializeGrammar = gast_public_2.serializeGrammar;\nexports.serializeProduction = gast_public_2.serializeProduction;\nvar gast_visitor_public_1 = __webpack_require__(4);\nexports.GAstVisitor = gast_visitor_public_1.GAstVisitor;\nvar gast_resolver_public_1 = __webpack_require__(24);\nexports.assignOccurrenceIndices = gast_resolver_public_1.assignOccurrenceIndices;\nexports.resolveGrammar = gast_resolver_public_1.resolveGrammar;\nexports.validateGrammar = gast_resolver_public_1.validateGrammar;\n/* istanbul ignore next */\nfunction clearCache() {\n    console.warn(\"The clearCache function was 'soft' removed from the Chevrotain API.\" +\n        \"\\n\\t It performs no action other than printing this message.\" +\n        \"\\n\\t Please avoid using it as it will be completely removed in the future\");\n}\nexports.clearCache = clearCache;\nvar render_public_1 = __webpack_require__(40);\nexports.createSyntaxDiagramsCode = render_public_1.createSyntaxDiagramsCode;\nvar generate_public_1 = __webpack_require__(41);\nexports.generateParserFactory = generate_public_1.generateParserFactory;\nexports.generateParserModule = generate_public_1.generateParserModule;\n//# sourceMappingURL=api.js.map\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// needs a separate module as this is required inside chevrotain productive code\n// and also in the entry point for webpack(api.ts).\n// A separate file avoids cyclic dependencies and webpack errors.\nexports.VERSION = \"6.5.0\";\n//# sourceMappingURL=version.js.map\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar lexer_public_1 = __webpack_require__(9);\nvar utils_1 = __webpack_require__(0);\nvar reg_exp_1 = __webpack_require__(28);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar PATTERN = \"PATTERN\";\nexports.DEFAULT_MODE = \"defaultMode\";\nexports.MODES = \"modes\";\nexports.SUPPORT_STICKY = typeof new RegExp(\"(?:)\").sticky === \"boolean\";\nfunction disableSticky() {\n    exports.SUPPORT_STICKY = false;\n}\nexports.disableSticky = disableSticky;\nfunction enableSticky() {\n    exports.SUPPORT_STICKY = true;\n}\nexports.enableSticky = enableSticky;\nfunction analyzeTokenTypes(tokenTypes, options) {\n    options = utils_1.defaults(options, {\n        useSticky: exports.SUPPORT_STICKY,\n        debug: false,\n        safeMode: false,\n        positionTracking: \"full\",\n        lineTerminatorCharacters: [\"\\r\", \"\\n\"],\n        tracer: function (msg, action) { return action(); }\n    });\n    var tracer = options.tracer;\n    tracer(\"initCharCodeToOptimizedIndexMap\", function () {\n        initCharCodeToOptimizedIndexMap();\n    });\n    var onlyRelevantTypes;\n    tracer(\"Reject Lexer.NA\", function () {\n        onlyRelevantTypes = utils_1.reject(tokenTypes, function (currType) {\n            return currType[PATTERN] === lexer_public_1.Lexer.NA;\n        });\n    });\n    var hasCustom = false;\n    var allTransformedPatterns;\n    tracer(\"Transform Patterns\", function () {\n        hasCustom = false;\n        allTransformedPatterns = utils_1.map(onlyRelevantTypes, function (currType) {\n            var currPattern = currType[PATTERN];\n            /* istanbul ignore else */\n            if (utils_1.isRegExp(currPattern)) {\n                var regExpSource = currPattern.source;\n                if (regExpSource.length === 1 &&\n                    // only these regExp meta characters which can appear in a length one regExp\n                    regExpSource !== \"^\" &&\n                    regExpSource !== \"$\" &&\n                    regExpSource !== \".\") {\n                    return regExpSource;\n                }\n                else if (regExpSource.length === 2 &&\n                    regExpSource[0] === \"\\\\\" &&\n                    // not a meta character\n                    !utils_1.contains([\n                        \"d\",\n                        \"D\",\n                        \"s\",\n                        \"S\",\n                        \"t\",\n                        \"r\",\n                        \"n\",\n                        \"t\",\n                        \"0\",\n                        \"c\",\n                        \"b\",\n                        \"B\",\n                        \"f\",\n                        \"v\",\n                        \"w\",\n                        \"W\"\n                    ], regExpSource[1])) {\n                    // escaped meta Characters: /\\+/ /\\[/\n                    // or redundant escaping: /\\a/\n                    // without the escaping \"\\\"\n                    return regExpSource[1];\n                }\n                else {\n                    return options.useSticky\n                        ? addStickyFlag(currPattern)\n                        : addStartOfInput(currPattern);\n                }\n            }\n            else if (utils_1.isFunction(currPattern)) {\n                hasCustom = true;\n                // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n                return { exec: currPattern };\n            }\n            else if (utils_1.has(currPattern, \"exec\")) {\n                hasCustom = true;\n                // ICustomPattern\n                return currPattern;\n            }\n            else if (typeof currPattern === \"string\") {\n                if (currPattern.length === 1) {\n                    return currPattern;\n                }\n                else {\n                    var escapedRegExpString = currPattern.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n                    var wrappedRegExp = new RegExp(escapedRegExpString);\n                    return options.useSticky\n                        ? addStickyFlag(wrappedRegExp)\n                        : addStartOfInput(wrappedRegExp);\n                }\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n    });\n    var patternIdxToType;\n    var patternIdxToGroup;\n    var patternIdxToLongerAltIdx;\n    var patternIdxToPushMode;\n    var patternIdxToPopMode;\n    tracer(\"misc mapping\", function () {\n        patternIdxToType = utils_1.map(onlyRelevantTypes, function (currType) { return currType.tokenTypeIdx; });\n        patternIdxToGroup = utils_1.map(onlyRelevantTypes, function (clazz) {\n            var groupName = clazz.GROUP;\n            /* istanbul ignore next */\n            if (groupName === lexer_public_1.Lexer.SKIPPED) {\n                return undefined;\n            }\n            else if (utils_1.isString(groupName)) {\n                return groupName;\n            }\n            else if (utils_1.isUndefined(groupName)) {\n                return false;\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n        patternIdxToLongerAltIdx = utils_1.map(onlyRelevantTypes, function (clazz) {\n            var longerAltType = clazz.LONGER_ALT;\n            if (longerAltType) {\n                var longerAltIdx = utils_1.indexOf(onlyRelevantTypes, longerAltType);\n                return longerAltIdx;\n            }\n        });\n        patternIdxToPushMode = utils_1.map(onlyRelevantTypes, function (clazz) { return clazz.PUSH_MODE; });\n        patternIdxToPopMode = utils_1.map(onlyRelevantTypes, function (clazz) {\n            return utils_1.has(clazz, \"POP_MODE\");\n        });\n    });\n    var patternIdxToCanLineTerminator;\n    tracer(\"Line Terminator Handling\", function () {\n        var lineTerminatorCharCodes = getCharCodes(options.lineTerminatorCharacters);\n        patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) { return false; });\n        if (options.positionTracking !== \"onlyOffset\") {\n            patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) {\n                if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n                    return tokType.LINE_BREAKS;\n                }\n                else {\n                    if (checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false) {\n                        return reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN);\n                    }\n                }\n            });\n        }\n    });\n    var patternIdxToIsCustom;\n    var patternIdxToShort;\n    var emptyGroups;\n    var patternIdxToConfig;\n    tracer(\"Misc Mapping #2\", function () {\n        patternIdxToIsCustom = utils_1.map(onlyRelevantTypes, isCustomPattern);\n        patternIdxToShort = utils_1.map(allTransformedPatterns, isShortPattern);\n        emptyGroups = utils_1.reduce(onlyRelevantTypes, function (acc, clazz) {\n            var groupName = clazz.GROUP;\n            if (utils_1.isString(groupName) && !(groupName === lexer_public_1.Lexer.SKIPPED)) {\n                acc[groupName] = [];\n            }\n            return acc;\n        }, {});\n        patternIdxToConfig = utils_1.map(allTransformedPatterns, function (x, idx) {\n            return {\n                pattern: allTransformedPatterns[idx],\n                longerAlt: patternIdxToLongerAltIdx[idx],\n                canLineTerminator: patternIdxToCanLineTerminator[idx],\n                isCustom: patternIdxToIsCustom[idx],\n                short: patternIdxToShort[idx],\n                group: patternIdxToGroup[idx],\n                push: patternIdxToPushMode[idx],\n                pop: patternIdxToPopMode[idx],\n                tokenTypeIdx: patternIdxToType[idx],\n                tokenType: onlyRelevantTypes[idx]\n            };\n        });\n    });\n    var canBeOptimized = true;\n    var charCodeToPatternIdxToConfig = [];\n    if (!options.safeMode) {\n        tracer(\"First Char Optimization\", function () {\n            charCodeToPatternIdxToConfig = utils_1.reduce(onlyRelevantTypes, function (result, currTokType, idx) {\n                if (typeof currTokType.PATTERN === \"string\") {\n                    var charCode = currTokType.PATTERN.charCodeAt(0);\n                    var optimizedIdx = charCodeToOptimizedIndex(charCode);\n                    addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx]);\n                }\n                else if (utils_1.isArray(currTokType.START_CHARS_HINT)) {\n                    var lastOptimizedIdx_1;\n                    utils_1.forEach(currTokType.START_CHARS_HINT, function (charOrInt) {\n                        var charCode = typeof charOrInt === \"string\"\n                            ? charOrInt.charCodeAt(0)\n                            : charOrInt;\n                        var currOptimizedIdx = charCodeToOptimizedIndex(charCode);\n                        // Avoid adding the config multiple times\n                        if (lastOptimizedIdx_1 !== currOptimizedIdx) {\n                            lastOptimizedIdx_1 = currOptimizedIdx;\n                            addToMapOfArrays(result, currOptimizedIdx, patternIdxToConfig[idx]);\n                        }\n                    });\n                }\n                else if (utils_1.isRegExp(currTokType.PATTERN)) {\n                    if (currTokType.PATTERN.unicode) {\n                        canBeOptimized = false;\n                        if (options.ensureOptimizations) {\n                            utils_1.PRINT_ERROR(\"\" + reg_exp_1.failedOptimizationPrefixMsg +\n                                (\"\\tUnable to analyze < \" + currTokType.PATTERN.toString() + \" > pattern.\\n\") +\n                                \"\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\" +\n                                \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                                \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\");\n                        }\n                    }\n                    else {\n                        var optimizedCodes = reg_exp_1.getOptimizedStartCodesIndices(currTokType.PATTERN, options.ensureOptimizations);\n                        /* istanbul ignore if */\n                        // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n                        // the first should be a different validation and the second cannot be tested.\n                        if (utils_1.isEmpty(optimizedCodes)) {\n                            // we cannot understand what codes may start possible matches\n                            // The optimization correctness requires knowing start codes for ALL patterns.\n                            // Not actually sure this is an error, no debug message\n                            canBeOptimized = false;\n                        }\n                        utils_1.forEach(optimizedCodes, function (code) {\n                            addToMapOfArrays(result, code, patternIdxToConfig[idx]);\n                        });\n                    }\n                }\n                else {\n                    if (options.ensureOptimizations) {\n                        utils_1.PRINT_ERROR(\"\" + reg_exp_1.failedOptimizationPrefixMsg +\n                            (\"\\tTokenType: <\" + currTokType.name + \"> is using a custom token pattern without providing <start_chars_hint> parameter.\\n\") +\n                            \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\");\n                    }\n                    canBeOptimized = false;\n                }\n                return result;\n            }, []);\n        });\n    }\n    tracer(\"ArrayPacking\", function () {\n        charCodeToPatternIdxToConfig = utils_1.packArray(charCodeToPatternIdxToConfig);\n    });\n    return {\n        emptyGroups: emptyGroups,\n        patternIdxToConfig: patternIdxToConfig,\n        charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n        hasCustom: hasCustom,\n        canBeOptimized: canBeOptimized\n    };\n}\nexports.analyzeTokenTypes = analyzeTokenTypes;\nfunction validatePatterns(tokenTypes, validModesNames) {\n    var errors = [];\n    var missingResult = findMissingPatterns(tokenTypes);\n    errors = errors.concat(missingResult.errors);\n    var invalidResult = findInvalidPatterns(missingResult.valid);\n    var validTokenTypes = invalidResult.valid;\n    errors = errors.concat(invalidResult.errors);\n    errors = errors.concat(validateRegExpPattern(validTokenTypes));\n    errors = errors.concat(findInvalidGroupType(validTokenTypes));\n    errors = errors.concat(findModesThatDoNotExist(validTokenTypes, validModesNames));\n    errors = errors.concat(findUnreachablePatterns(validTokenTypes));\n    return errors;\n}\nexports.validatePatterns = validatePatterns;\nfunction validateRegExpPattern(tokenTypes) {\n    var errors = [];\n    var withRegExpPatterns = utils_1.filter(tokenTypes, function (currTokType) {\n        return utils_1.isRegExp(currTokType[PATTERN]);\n    });\n    errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns));\n    errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns));\n    errors = errors.concat(findUnsupportedFlags(withRegExpPatterns));\n    errors = errors.concat(findDuplicatePatterns(withRegExpPatterns));\n    errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns));\n    return errors;\n}\nfunction findMissingPatterns(tokenTypes) {\n    var tokenTypesWithMissingPattern = utils_1.filter(tokenTypes, function (currType) {\n        return !utils_1.has(currType, PATTERN);\n    });\n    var errors = utils_1.map(tokenTypesWithMissingPattern, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- missing static 'PATTERN' property\",\n            type: lexer_public_1.LexerDefinitionErrorType.MISSING_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    var valid = utils_1.difference(tokenTypes, tokenTypesWithMissingPattern);\n    return { errors: errors, valid: valid };\n}\nexports.findMissingPatterns = findMissingPatterns;\nfunction findInvalidPatterns(tokenTypes) {\n    var tokenTypesWithInvalidPattern = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return (!utils_1.isRegExp(pattern) &&\n            !utils_1.isFunction(pattern) &&\n            !utils_1.has(pattern, \"exec\") &&\n            !utils_1.isString(pattern));\n    });\n    var errors = utils_1.map(tokenTypesWithInvalidPattern, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' can only be a RegExp, a\" +\n                \" Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",\n            type: lexer_public_1.LexerDefinitionErrorType.INVALID_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    var valid = utils_1.difference(tokenTypes, tokenTypesWithInvalidPattern);\n    return { errors: errors, valid: valid };\n}\nexports.findInvalidPatterns = findInvalidPatterns;\nvar end_of_input = /[^\\\\][\\$]/;\nfunction findEndOfInputAnchor(tokenTypes) {\n    var EndAnchorFinder = /** @class */ (function (_super) {\n        __extends(EndAnchorFinder, _super);\n        function EndAnchorFinder() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.found = false;\n            return _this;\n        }\n        EndAnchorFinder.prototype.visitEndAnchor = function (node) {\n            this.found = true;\n        };\n        return EndAnchorFinder;\n    }(regexp_to_ast_1.BaseRegExpVisitor));\n    var invalidRegex = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        try {\n            var regexpAst = reg_exp_parser_1.getRegExpAst(pattern);\n            var endAnchorVisitor = new EndAnchorFinder();\n            endAnchorVisitor.visit(regexpAst);\n            return endAnchorVisitor.found;\n        }\n        catch (e) {\n            // old behavior in case of runtime exceptions with regexp-to-ast.\n            /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n            return end_of_input.test(pattern.source);\n        }\n    });\n    var errors = utils_1.map(invalidRegex, function (currType) {\n        return {\n            message: \"Unexpected RegExp Anchor Error:\\n\" +\n                \"\\tToken Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n                \"\\tSee sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findEndOfInputAnchor = findEndOfInputAnchor;\nfunction findEmptyMatchRegExps(tokenTypes) {\n    var matchesEmptyString = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return pattern.test(\"\");\n    });\n    var errors = utils_1.map(matchesEmptyString, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' must not match an empty string\",\n            type: lexer_public_1.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findEmptyMatchRegExps = findEmptyMatchRegExps;\nvar start_of_input = /[^\\\\[][\\^]|^\\^/;\nfunction findStartOfInputAnchor(tokenTypes) {\n    var StartAnchorFinder = /** @class */ (function (_super) {\n        __extends(StartAnchorFinder, _super);\n        function StartAnchorFinder() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.found = false;\n            return _this;\n        }\n        StartAnchorFinder.prototype.visitStartAnchor = function (node) {\n            this.found = true;\n        };\n        return StartAnchorFinder;\n    }(regexp_to_ast_1.BaseRegExpVisitor));\n    var invalidRegex = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        try {\n            var regexpAst = reg_exp_parser_1.getRegExpAst(pattern);\n            var startAnchorVisitor = new StartAnchorFinder();\n            startAnchorVisitor.visit(regexpAst);\n            return startAnchorVisitor.found;\n        }\n        catch (e) {\n            // old behavior in case of runtime exceptions with regexp-to-ast.\n            /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n            return start_of_input.test(pattern.source);\n        }\n    });\n    var errors = utils_1.map(invalidRegex, function (currType) {\n        return {\n            message: \"Unexpected RegExp Anchor Error:\\n\" +\n                \"\\tToken Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n                \"\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findStartOfInputAnchor = findStartOfInputAnchor;\nfunction findUnsupportedFlags(tokenTypes) {\n    var invalidFlags = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return (pattern instanceof RegExp && (pattern.multiline || pattern.global));\n    });\n    var errors = utils_1.map(invalidFlags, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n            type: lexer_public_1.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findUnsupportedFlags = findUnsupportedFlags;\n// This can only test for identical duplicate RegExps, not semantically equivalent ones.\nfunction findDuplicatePatterns(tokenTypes) {\n    var found = [];\n    var identicalPatterns = utils_1.map(tokenTypes, function (outerType) {\n        return utils_1.reduce(tokenTypes, function (result, innerType) {\n            if (outerType.PATTERN.source === innerType.PATTERN.source &&\n                !utils_1.contains(found, innerType) &&\n                innerType.PATTERN !== lexer_public_1.Lexer.NA) {\n                // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n                // in essence we are creating Equivalence classes on equality relation.\n                found.push(innerType);\n                result.push(innerType);\n                return result;\n            }\n            return result;\n        }, []);\n    });\n    identicalPatterns = utils_1.compact(identicalPatterns);\n    var duplicatePatterns = utils_1.filter(identicalPatterns, function (currIdenticalSet) {\n        return currIdenticalSet.length > 1;\n    });\n    var errors = utils_1.map(duplicatePatterns, function (setOfIdentical) {\n        var tokenTypeNames = utils_1.map(setOfIdentical, function (currType) {\n            return currType.name;\n        });\n        var dupPatternSrc = utils_1.first(setOfIdentical).PATTERN;\n        return {\n            message: \"The same RegExp pattern ->\" + dupPatternSrc + \"<-\" +\n                (\"has been used in all of the following Token Types: \" + tokenTypeNames.join(\", \") + \" <-\"),\n            type: lexer_public_1.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n            tokenTypes: setOfIdentical\n        };\n    });\n    return errors;\n}\nexports.findDuplicatePatterns = findDuplicatePatterns;\nfunction findInvalidGroupType(tokenTypes) {\n    var invalidTypes = utils_1.filter(tokenTypes, function (clazz) {\n        if (!utils_1.has(clazz, \"GROUP\")) {\n            return false;\n        }\n        var group = clazz.GROUP;\n        return group !== lexer_public_1.Lexer.SKIPPED && group !== lexer_public_1.Lexer.NA && !utils_1.isString(group);\n    });\n    var errors = utils_1.map(invalidTypes, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n            type: lexer_public_1.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findInvalidGroupType = findInvalidGroupType;\nfunction findModesThatDoNotExist(tokenTypes, validModes) {\n    var invalidModes = utils_1.filter(tokenTypes, function (clazz) {\n        return (clazz.PUSH_MODE !== undefined &&\n            !utils_1.contains(validModes, clazz.PUSH_MODE));\n    });\n    var errors = utils_1.map(invalidModes, function (tokType) {\n        var msg = \"Token Type: ->\" + tokType.name + \"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\" + tokType.PUSH_MODE + \"<-\" +\n            \"which does not exist\";\n        return {\n            message: msg,\n            type: lexer_public_1.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n            tokenTypes: [tokType]\n        };\n    });\n    return errors;\n}\nexports.findModesThatDoNotExist = findModesThatDoNotExist;\nfunction findUnreachablePatterns(tokenTypes) {\n    var errors = [];\n    var canBeTested = utils_1.reduce(tokenTypes, function (result, tokType, idx) {\n        var pattern = tokType.PATTERN;\n        if (pattern === lexer_public_1.Lexer.NA) {\n            return result;\n        }\n        // a more comprehensive validation for all forms of regExps would require\n        // deeper regExp analysis capabilities\n        if (utils_1.isString(pattern)) {\n            result.push({ str: pattern, idx: idx, tokenType: tokType });\n        }\n        else if (utils_1.isRegExp(pattern) && noMetaChar(pattern)) {\n            result.push({ str: pattern.source, idx: idx, tokenType: tokType });\n        }\n        return result;\n    }, []);\n    utils_1.forEach(tokenTypes, function (tokType, testIdx) {\n        utils_1.forEach(canBeTested, function (_a) {\n            var str = _a.str, idx = _a.idx, tokenType = _a.tokenType;\n            if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n                var msg = \"Token: ->\" + tokenType.name + \"<- can never be matched.\\n\" +\n                    (\"Because it appears AFTER the Token Type ->\" + tokType.name + \"<-\") +\n                    \"in the lexer's definition.\\n\" +\n                    \"See https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNREACHABLE\";\n                errors.push({\n                    message: msg,\n                    type: lexer_public_1.LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n                    tokenTypes: [tokType, tokenType]\n                });\n            }\n        });\n    });\n    return errors;\n}\nexports.findUnreachablePatterns = findUnreachablePatterns;\nfunction testTokenType(str, pattern) {\n    /* istanbul ignore else */\n    if (utils_1.isRegExp(pattern)) {\n        var regExpArray = pattern.exec(str);\n        return regExpArray !== null && regExpArray.index === 0;\n    }\n    else if (utils_1.isFunction(pattern)) {\n        // maintain the API of custom patterns\n        return pattern(str, 0, [], {});\n    }\n    else if (utils_1.has(pattern, \"exec\")) {\n        // maintain the API of custom patterns\n        return pattern.exec(str, 0, [], {});\n    }\n    else if (typeof pattern === \"string\") {\n        return pattern === str;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nfunction noMetaChar(regExp) {\n    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n    var metaChars = [\n        \".\",\n        \"\\\\\",\n        \"[\",\n        \"]\",\n        \"|\",\n        \"^\",\n        \"$\",\n        \"(\",\n        \")\",\n        \"?\",\n        \"*\",\n        \"+\",\n        \"{\"\n    ];\n    return (utils_1.find(metaChars, function (char) { return regExp.source.indexOf(char) !== -1; }) ===\n        undefined);\n}\nfunction addStartOfInput(pattern) {\n    var flags = pattern.ignoreCase ? \"i\" : \"\";\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(\"^(?:\" + pattern.source + \")\", flags);\n}\nexports.addStartOfInput = addStartOfInput;\nfunction addStickyFlag(pattern) {\n    var flags = pattern.ignoreCase ? \"iy\" : \"y\";\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(\"\" + pattern.source, flags);\n}\nexports.addStickyFlag = addStickyFlag;\nfunction performRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    var errors = [];\n    // some run time checks to help the end users.\n    if (!utils_1.has(lexerDefinition, exports.DEFAULT_MODE)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized without a <\" +\n                exports.DEFAULT_MODE +\n                \"> property in its definition\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\n        });\n    }\n    if (!utils_1.has(lexerDefinition, exports.MODES)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized without a <\" +\n                exports.MODES +\n                \"> property in its definition\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\n        });\n    }\n    if (utils_1.has(lexerDefinition, exports.MODES) &&\n        utils_1.has(lexerDefinition, exports.DEFAULT_MODE) &&\n        !utils_1.has(lexerDefinition.modes, lexerDefinition.defaultMode)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized with a \" + exports.DEFAULT_MODE + \": <\" + lexerDefinition.defaultMode + \">\" +\n                \"which does not exist\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\n        });\n    }\n    if (utils_1.has(lexerDefinition, exports.MODES)) {\n        utils_1.forEach(lexerDefinition.modes, function (currModeValue, currModeName) {\n            utils_1.forEach(currModeValue, function (currTokType, currIdx) {\n                if (utils_1.isUndefined(currTokType)) {\n                    errors.push({\n                        message: \"A Lexer cannot be initialized using an undefined Token Type. Mode:\" +\n                            (\"<\" + currModeName + \"> at index: <\" + currIdx + \">\\n\"),\n                        type: lexer_public_1.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\n                    });\n                }\n            });\n        });\n    }\n    return errors;\n}\nexports.performRuntimeChecks = performRuntimeChecks;\nfunction performWarningRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    var warnings = [];\n    var hasAnyLineBreak = false;\n    var allTokenTypes = utils_1.compact(utils_1.flatten(utils_1.mapValues(lexerDefinition.modes, function (tokTypes) { return tokTypes; })));\n    var concreteTokenTypes = utils_1.reject(allTokenTypes, function (currType) { return currType[PATTERN] === lexer_public_1.Lexer.NA; });\n    var terminatorCharCodes = getCharCodes(lineTerminatorCharacters);\n    if (trackLines) {\n        utils_1.forEach(concreteTokenTypes, function (tokType) {\n            var currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes);\n            if (currIssue !== false) {\n                var message = buildLineBreakIssueMessage(tokType, currIssue);\n                var warningDescriptor = {\n                    message: message,\n                    type: currIssue.issue,\n                    tokenType: tokType\n                };\n                warnings.push(warningDescriptor);\n            }\n            else {\n                // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n                if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n                    if (tokType.LINE_BREAKS === true) {\n                        hasAnyLineBreak = true;\n                    }\n                }\n                else {\n                    if (reg_exp_1.canMatchCharCode(terminatorCharCodes, tokType.PATTERN)) {\n                        hasAnyLineBreak = true;\n                    }\n                }\n            }\n        });\n    }\n    if (trackLines && !hasAnyLineBreak) {\n        warnings.push({\n            message: \"Warning: No LINE_BREAKS Found.\\n\" +\n                \"\\tThis Lexer has been defined to track line and column information,\\n\" +\n                \"\\tBut none of the Token Types can be identified as matching a line terminator.\\n\" +\n                \"\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS\n        });\n    }\n    return warnings;\n}\nexports.performWarningRuntimeChecks = performWarningRuntimeChecks;\nfunction cloneEmptyGroups(emptyGroups) {\n    var clonedResult = {};\n    var groupKeys = utils_1.keys(emptyGroups);\n    utils_1.forEach(groupKeys, function (currKey) {\n        var currGroupValue = emptyGroups[currKey];\n        /* istanbul ignore else */\n        if (utils_1.isArray(currGroupValue)) {\n            clonedResult[currKey] = [];\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    });\n    return clonedResult;\n}\nexports.cloneEmptyGroups = cloneEmptyGroups;\n// TODO: refactor to avoid duplication\nfunction isCustomPattern(tokenType) {\n    var pattern = tokenType.PATTERN;\n    /* istanbul ignore else */\n    if (utils_1.isRegExp(pattern)) {\n        return false;\n    }\n    else if (utils_1.isFunction(pattern)) {\n        // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n        return true;\n    }\n    else if (utils_1.has(pattern, \"exec\")) {\n        // ICustomPattern\n        return true;\n    }\n    else if (utils_1.isString(pattern)) {\n        return false;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.isCustomPattern = isCustomPattern;\nfunction isShortPattern(pattern) {\n    if (utils_1.isString(pattern) && pattern.length === 1) {\n        return pattern.charCodeAt(0);\n    }\n    else {\n        return false;\n    }\n}\nexports.isShortPattern = isShortPattern;\n/**\n * Faster than using a RegExp for default newline detection during lexing.\n */\nexports.LineTerminatorOptimizedTester = {\n    // implements /\\n|\\r\\n?/g.test\n    test: function (text) {\n        var len = text.length;\n        for (var i = this.lastIndex; i < len; i++) {\n            var c = text.charCodeAt(i);\n            if (c === 10) {\n                this.lastIndex = i + 1;\n                return true;\n            }\n            else if (c === 13) {\n                if (text.charCodeAt(i + 1) === 10) {\n                    this.lastIndex = i + 2;\n                }\n                else {\n                    this.lastIndex = i + 1;\n                }\n                return true;\n            }\n        }\n        return false;\n    },\n    lastIndex: 0\n};\nfunction checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {\n    if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n        // if the user explicitly declared the line_breaks option we will respect their choice\n        // and assume it is correct.\n        return false;\n    }\n    else {\n        /* istanbul ignore else */\n        if (utils_1.isRegExp(tokType.PATTERN)) {\n            try {\n                reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN);\n            }\n            catch (e) {\n                /* istanbul ignore next - to test this we would have to mock <canMatchCharCode> to throw an error */\n                return {\n                    issue: lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n                    errMsg: e.message\n                };\n            }\n            return false;\n        }\n        else if (utils_1.isString(tokType.PATTERN)) {\n            // string literal patterns can always be analyzed to detect line terminator usage\n            return false;\n        }\n        else if (isCustomPattern(tokType)) {\n            // custom token types\n            return { issue: lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK };\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    }\n}\nfunction buildLineBreakIssueMessage(tokType, details) {\n    /* istanbul ignore else */\n    if (details.issue === lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n        return (\"Warning: unable to identify line terminator usage in pattern.\\n\" +\n            (\"\\tThe problem is in the <\" + tokType.name + \"> Token Type\\n\") +\n            (\"\\t Root cause: \" + details.errMsg + \".\\n\") +\n            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\");\n    }\n    else if (details.issue === lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n        return (\"Warning: A Custom Token Pattern should specify the <line_breaks> option.\\n\" +\n            (\"\\tThe problem is in the <\" + tokType.name + \"> Token Type\\n\") +\n            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\");\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.buildLineBreakIssueMessage = buildLineBreakIssueMessage;\nfunction getCharCodes(charsOrCodes) {\n    var charCodes = utils_1.map(charsOrCodes, function (numOrString) {\n        if (utils_1.isString(numOrString) && numOrString.length > 0) {\n            return numOrString.charCodeAt(0);\n        }\n        else {\n            return numOrString;\n        }\n    });\n    return charCodes;\n}\nfunction addToMapOfArrays(map, key, value) {\n    if (map[key] === undefined) {\n        map[key] = [value];\n    }\n    else {\n        map[key].push(value);\n    }\n}\nexports.minOptimizationVal = 256;\n/**\n * We ae mapping charCode above ASCI (256) into buckets each in the size of 256.\n * This is because ASCI are the most common start chars so each one of those will get its own\n * possible token configs vector.\n *\n * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n * to place these into buckets of possible token configs, What we gain from\n * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n * Our 'charCodeToPatternIdxToConfig' max size will now be:\n * 256 + (2^16 / 2^8) - 1 === 511\n *\n * note the hack for fast division integer part extraction\n * See: https://stackoverflow.com/a/4228528\n */\nfunction charCodeToOptimizedIndex(charCode) {\n    return charCode < exports.minOptimizationVal\n        ? charCode\n        : charCodeToOptimizedIdxMap[charCode];\n}\nexports.charCodeToOptimizedIndex = charCodeToOptimizedIndex;\n/**\n * This is a compromise between cold start / hot running performance\n * Creating this array takes ~3ms on a modern machine,\n * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n * performance degrades by ~10%\n *\n * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n */\nvar charCodeToOptimizedIdxMap = [];\nfunction initCharCodeToOptimizedIndexMap() {\n    if (utils_1.isEmpty(charCodeToOptimizedIdxMap)) {\n        charCodeToOptimizedIdxMap = new Array(65536);\n        for (var i = 0; i < 65536; i++) {\n            /* tslint:disable */\n            charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i;\n            /* tslint:enable */\n        }\n    }\n}\n//# sourceMappingURL=lexer.js.map\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultLexerErrorProvider = {\n    buildUnableToPopLexerModeMessage: function (token) {\n        return \"Unable to pop Lexer Mode after encountering Token ->\" + token.image + \"<- The Mode Stack is empty\";\n    },\n    buildUnexpectedCharactersMessage: function (fullText, startOffset, length, line, column) {\n        return (\"unexpected character: ->\" + fullText.charAt(startOffset) + \"<- at offset: \" + startOffset + \",\" + (\" skipped \" + length + \" characters.\"));\n    }\n};\n//# sourceMappingURL=lexer_errors_public.js.map\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_1 = __webpack_require__(6);\nfunction first(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        // this could in theory cause infinite loops if\n        // (1) prod A refs prod B.\n        // (2) prod B refs prod A\n        // (3) AB can match the empty set\n        // in other words a cycle where everything is optional so the first will keep\n        // looking ahead for the next optional part and will never exit\n        // currently there is no safeguard for this unique edge case because\n        // (1) not sure a grammar in which this can happen is useful for anything (productive)\n        return first(prod.referencedRule);\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return firstForTerminal(prod);\n    }\n    else if (gast_1.isSequenceProd(prod)) {\n        return firstForSequence(prod);\n    }\n    else if (gast_1.isBranchingProd(prod)) {\n        return firstForBranching(prod);\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.first = first;\nfunction firstForSequence(prod) {\n    var firstSet = [];\n    var seq = prod.definition;\n    var nextSubProdIdx = 0;\n    var hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n    var currSubProd;\n    // so we enter the loop at least once (if the definition is not empty\n    var isLastInnerProdOptional = true;\n    // scan a sequence until it's end or until we have found a NONE optional production in it\n    while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n        currSubProd = seq[nextSubProdIdx];\n        isLastInnerProdOptional = gast_1.isOptionalProd(currSubProd);\n        firstSet = firstSet.concat(first(currSubProd));\n        nextSubProdIdx = nextSubProdIdx + 1;\n        hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n    }\n    return utils_1.uniq(firstSet);\n}\nexports.firstForSequence = firstForSequence;\nfunction firstForBranching(prod) {\n    var allAlternativesFirsts = utils_1.map(prod.definition, function (innerProd) {\n        return first(innerProd);\n    });\n    return utils_1.uniq(utils_1.flatten(allAlternativesFirsts));\n}\nexports.firstForBranching = firstForBranching;\nfunction firstForTerminal(terminal) {\n    return [terminal.terminalType];\n}\nexports.firstForTerminal = firstForTerminal;\n//# sourceMappingURL=first.js.map\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: can this be removed? where is it used?\nexports.IN = \"_~IN~_\";\n//# sourceMappingURL=constants.js.map\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar resolver_1 = __webpack_require__(29);\nvar checks_1 = __webpack_require__(11);\nvar errors_public_1 = __webpack_require__(10);\nvar gast_1 = __webpack_require__(6);\nfunction resolveGrammar(options) {\n    options = utils_1.defaults(options, {\n        errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n    });\n    var topRulesTable = {};\n    utils_1.forEach(options.rules, function (rule) {\n        topRulesTable[rule.name] = rule;\n    });\n    return resolver_1.resolveGrammar(topRulesTable, options.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n    options = utils_1.defaults(options, {\n        errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n        ignoredIssues: {}\n    });\n    return checks_1.validateGrammar(options.rules, options.maxLookahead, options.tokenTypes, options.ignoredIssues, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\nfunction assignOccurrenceIndices(options) {\n    utils_1.forEach(options.rules, function (currRule) {\n        var methodsCollector = new gast_1.DslMethodsCollectorVisitor();\n        currRule.accept(methodsCollector);\n        utils_1.forEach(methodsCollector.dslMethods, function (methods) {\n            utils_1.forEach(methods, function (currMethod, arrIdx) {\n                currMethod.idx = arrIdx + 1;\n            });\n        });\n    });\n}\nexports.assignOccurrenceIndices = assignOccurrenceIndices;\n//# sourceMappingURL=gast_resolver_public.js.map\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tokens_public_1 = __webpack_require__(3);\nvar utils_1 = __webpack_require__(0);\nvar exceptions_public_1 = __webpack_require__(8);\nvar constants_1 = __webpack_require__(23);\nvar parser_1 = __webpack_require__(2);\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nfunction InRuleRecoveryException(message) {\n    this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n    this.message = message;\n}\nexports.InRuleRecoveryException = InRuleRecoveryException;\nInRuleRecoveryException.prototype = Error.prototype;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n    function Recoverable() {\n    }\n    Recoverable.prototype.initRecoverable = function (config) {\n        this.firstAfterRepMap = {};\n        this.resyncFollows = {};\n        this.recoveryEnabled = utils_1.has(config, \"recoveryEnabled\")\n            ? config.recoveryEnabled\n            : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n        // performance optimization, NOOP will be inlined which\n        // effectively means that this optional feature does not exist\n        // when not used.\n        if (this.recoveryEnabled) {\n            this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n        }\n    };\n    Recoverable.prototype.getTokenToInsert = function (tokType) {\n        var tokToInsert = tokens_public_1.createTokenInstance(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n        tokToInsert.isInsertedInRecovery = true;\n        return tokToInsert;\n    };\n    Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n        return true;\n    };\n    Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n        var _this = this;\n        // TODO: can the resyncTokenType be cached?\n        var reSyncTokType = this.findReSyncTokenType();\n        var savedLexerState = this.exportLexerState();\n        var resyncedTokens = [];\n        var passedResyncPoint = false;\n        var nextTokenWithoutResync = this.LA(1);\n        var currToken = this.LA(1);\n        var generateErrorMessage = function () {\n            var previousToken = _this.LA(0);\n            // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n            // the error that would have been thrown\n            var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n                expected: expectedTokType,\n                actual: nextTokenWithoutResync,\n                previous: previousToken,\n                ruleName: _this.getCurrRuleFullName()\n            });\n            var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n            // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n            error.resyncedTokens = utils_1.dropRight(resyncedTokens);\n            _this.SAVE_ERROR(error);\n        };\n        while (!passedResyncPoint) {\n            // re-synced to a point where we can safely exit the repetition/\n            if (this.tokenMatcher(currToken, expectedTokType)) {\n                generateErrorMessage();\n                return; // must return here to avoid reverting the inputIdx\n            }\n            else if (lookAheadFunc.call(this)) {\n                // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n                generateErrorMessage();\n                // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n                grammarRule.apply(this, grammarRuleArgs);\n                return; // must return here to avoid reverting the inputIdx\n            }\n            else if (this.tokenMatcher(currToken, reSyncTokType)) {\n                passedResyncPoint = true;\n            }\n            else {\n                currToken = this.SKIP_TOKEN();\n                this.addToResyncTokens(currToken, resyncedTokens);\n            }\n        }\n        // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n        // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n        // \"between rules\" resync recovery later in the flow.\n        this.importLexerState(savedLexerState);\n    };\n    Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n        // Edge case of arriving from a MANY repetition which is stuck\n        // Attempting recovery in this case could cause an infinite loop\n        if (notStuck === false) {\n            return false;\n        }\n        // arguments to try and perform resync into the next iteration of the many are missing\n        if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n            return false;\n        }\n        // no need to recover, next token is what we expect...\n        if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n            return false;\n        }\n        // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n        // and prefer some backtracking path that includes recovered errors.\n        if (this.isBackTracking()) {\n            return false;\n        }\n        // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n        // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n        //noinspection RedundantIfStatementJS\n        if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n            return false;\n        }\n        return true;\n    };\n    // Error Recovery functionality\n    Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n        var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n        var follows = this.getNextPossibleTokenTypes(grammarPath);\n        return follows;\n    };\n    Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n        if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n            var tokToInsert = this.getTokenToInsert(expectedTokType);\n            return tokToInsert;\n        }\n        if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n            var nextTok = this.SKIP_TOKEN();\n            this.consumeToken();\n            return nextTok;\n        }\n        throw new InRuleRecoveryException(\"sad sad panda\");\n    };\n    Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n        return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n            this.canRecoverWithSingleTokenDeletion(expectedToken));\n    };\n    Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n        var _this = this;\n        if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n            return false;\n        }\n        // must know the possible following tokens to perform single token insertion\n        if (utils_1.isEmpty(follows)) {\n            return false;\n        }\n        var mismatchedTok = this.LA(1);\n        var isMisMatchedTokInFollows = utils_1.find(follows, function (possibleFollowsTokType) {\n            return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n        }) !== undefined;\n        return isMisMatchedTokInFollows;\n    };\n    Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n        var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n        return isNextTokenWhatIsExpected;\n    };\n    Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n        var followKey = this.getCurrFollowKey();\n        var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n        return utils_1.contains(currentRuleReSyncSet, tokenTypeIdx);\n    };\n    Recoverable.prototype.findReSyncTokenType = function () {\n        var allPossibleReSyncTokTypes = this.flattenFollowSet();\n        // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n        var nextToken = this.LA(1);\n        var k = 2;\n        while (true) {\n            var nextTokenType = nextToken.tokenType;\n            if (utils_1.contains(allPossibleReSyncTokTypes, nextTokenType)) {\n                return nextTokenType;\n            }\n            nextToken = this.LA(k);\n            k++;\n        }\n    };\n    Recoverable.prototype.getCurrFollowKey = function () {\n        // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n        if (this.RULE_STACK.length === 1) {\n            return exports.EOF_FOLLOW_KEY;\n        }\n        var currRuleShortName = this.getLastExplicitRuleShortName();\n        var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n        var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n        return {\n            ruleName: this.shortRuleNameToFullName(currRuleShortName),\n            idxInCallingRule: currRuleIdx,\n            inRule: this.shortRuleNameToFullName(prevRuleShortName)\n        };\n    };\n    Recoverable.prototype.buildFullFollowKeyStack = function () {\n        var _this = this;\n        var explicitRuleStack = this.RULE_STACK;\n        var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n        if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) {\n            explicitRuleStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_STACK[idx]; });\n            explicitOccurrenceStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_OCCURRENCE_STACK[idx]; });\n        }\n        // TODO: only iterate over explicit rules here\n        return utils_1.map(explicitRuleStack, function (ruleName, idx) {\n            if (idx === 0) {\n                return exports.EOF_FOLLOW_KEY;\n            }\n            return {\n                ruleName: _this.shortRuleNameToFullName(ruleName),\n                idxInCallingRule: explicitOccurrenceStack[idx],\n                inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n            };\n        });\n    };\n    Recoverable.prototype.flattenFollowSet = function () {\n        var _this = this;\n        var followStack = utils_1.map(this.buildFullFollowKeyStack(), function (currKey) {\n            return _this.getFollowSetFromFollowKey(currKey);\n        });\n        return utils_1.flatten(followStack);\n    };\n    Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n        if (followKey === exports.EOF_FOLLOW_KEY) {\n            return [tokens_public_1.EOF];\n        }\n        var followName = followKey.ruleName +\n            followKey.idxInCallingRule +\n            constants_1.IN +\n            followKey.inRule;\n        return this.resyncFollows[followName];\n    };\n    // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n    // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n    Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n        if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n            resyncTokens.push(token);\n        }\n        return resyncTokens;\n    };\n    Recoverable.prototype.reSyncTo = function (tokType) {\n        var resyncedTokens = [];\n        var nextTok = this.LA(1);\n        while (this.tokenMatcher(nextTok, tokType) === false) {\n            nextTok = this.SKIP_TOKEN();\n            this.addToResyncTokens(nextTok, resyncedTokens);\n        }\n        // the last token is not part of the error.\n        return utils_1.dropRight(resyncedTokens);\n    };\n    Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n        // by default this is a NO-OP\n        // The actual implementation is with the function(not method) below\n    };\n    Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n        var pathRuleStack = this.getHumanReadableRuleStack();\n        var pathOccurrenceStack = utils_1.cloneArr(this.RULE_OCCURRENCE_STACK);\n        var grammarPath = {\n            ruleStack: pathRuleStack,\n            occurrenceStack: pathOccurrenceStack,\n            lastTok: tokType,\n            lastTokOccurrence: tokIdxInRule\n        };\n        return grammarPath;\n    };\n    Recoverable.prototype.getHumanReadableRuleStack = function () {\n        var _this = this;\n        if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) {\n            return utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (currIdx) {\n                return _this.shortRuleNameToFullName(_this.RULE_STACK[currIdx]);\n            });\n        }\n        else {\n            return utils_1.map(this.RULE_STACK, function (currShortName) {\n                return _this.shortRuleNameToFullName(currShortName);\n            });\n        }\n    };\n    return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n    var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n    var firstAfterRepInfo = this.firstAfterRepMap[key];\n    if (firstAfterRepInfo === undefined) {\n        var currRuleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[currRuleName];\n        var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n        firstAfterRepInfo = walker.startWalking();\n        this.firstAfterRepMap[key] = firstAfterRepInfo;\n    }\n    var expectTokAfterLastMatch = firstAfterRepInfo.token;\n    var nextTokIdx = firstAfterRepInfo.occurrence;\n    var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n    // special edge case of a TOP most repetition after which the input should END.\n    // this will force an attempt for inRule recovery in that scenario.\n    if (this.RULE_STACK.length === 1 &&\n        isEndOfRule &&\n        expectTokAfterLastMatch === undefined) {\n        expectTokAfterLastMatch = tokens_public_1.EOF;\n        nextTokIdx = 1;\n    }\n    if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n        // TODO: performance optimization: instead of passing the original args here, we modify\n        // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n        // to avoid searching the cache for it once more.\n        this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n    }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nfunction classNameFromInstance(instance) {\n    return functionName(instance.constructor);\n}\nexports.classNameFromInstance = classNameFromInstance;\nvar FUNC_NAME_REGEXP = /^\\s*function\\s*(\\S*)\\s*\\(/;\nvar NAME = \"name\";\n/* istanbul ignore next too many hacks for IE/old versions of node.js here*/\nfunction functionName(func) {\n    // Engines that support Function.prototype.name OR the nth (n>1) time after\n    // the name has been computed in the following else block.\n    var existingNameProp = func.name;\n    if (existingNameProp) {\n        return existingNameProp;\n    }\n    // hack for IE and engines that do not support Object.defineProperty on function.name (Node.js 0.10 && 0.12)\n    var computedName = func.toString().match(FUNC_NAME_REGEXP)[1];\n    return computedName;\n}\nexports.functionName = functionName;\n/**\n * @returns {boolean} - has the property been successfully defined\n */\nfunction defineNameProp(obj, nameValue) {\n    var namePropDescriptor = Object.getOwnPropertyDescriptor(obj, NAME);\n    /* istanbul ignore else -> will only run in old versions of node.js */\n    if (utils_1.isUndefined(namePropDescriptor) || namePropDescriptor.configurable) {\n        Object.defineProperty(obj, NAME, {\n            enumerable: false,\n            configurable: true,\n            writable: false,\n            value: nameValue\n        });\n        return true;\n    }\n    /* istanbul ignore next -> will only run in old versions of node.js */\n    return false;\n}\nexports.defineNameProp = defineNameProp;\n//# sourceMappingURL=lang_extensions.js.map\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar rest_1 = __webpack_require__(14);\nvar first_1 = __webpack_require__(22);\nvar utils_1 = __webpack_require__(0);\nvar constants_1 = __webpack_require__(23);\nvar gast_public_1 = __webpack_require__(1);\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n    __extends(ResyncFollowsWalker, _super);\n    function ResyncFollowsWalker(topProd) {\n        var _this = _super.call(this) || this;\n        _this.topProd = topProd;\n        _this.follows = {};\n        return _this;\n    }\n    ResyncFollowsWalker.prototype.startWalking = function () {\n        this.walk(this.topProd);\n        return this.follows;\n    };\n    ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n        // do nothing! just like in the public sector after 13:00\n    };\n    ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n        var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n            this.topProd.name;\n        var fullRest = currRest.concat(prevRest);\n        var restProd = new gast_public_1.Flat({ definition: fullRest });\n        var t_in_topProd_follows = first_1.first(restProd);\n        this.follows[followName] = t_in_topProd_follows;\n    };\n    return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n    var reSyncFollows = {};\n    utils_1.forEach(topProductions, function (topProd) {\n        var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n        utils_1.assign(reSyncFollows, currRefsFollow);\n    });\n    return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n    return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n    var terminalName = terminal.terminalType.name;\n    return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar utils_1 = __webpack_require__(0);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar lexer_1 = __webpack_require__(20);\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n    if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n    try {\n        var ast = reg_exp_parser_1.getRegExpAst(regExp);\n        var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n        return firstChars;\n    }\n    catch (e) {\n        /* istanbul ignore next */\n        // Testing this relies on the regexp-to-ast library having a bug... */\n        // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n        if (e.message === complementErrorMessage) {\n            if (ensureOptimizations) {\n                utils_1.PRINT_WARNING(\"\" + exports.failedOptimizationPrefixMsg +\n                    (\"\\tUnable to optimize: < \" + regExp.toString() + \" >\\n\") +\n                    \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n                    \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                    \"\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n            }\n        }\n        else {\n            var msgSuffix = \"\";\n            if (ensureOptimizations) {\n                msgSuffix =\n                    \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n                        \"\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n            }\n            utils_1.PRINT_ERROR(exports.failedOptimizationPrefixMsg + \"\\n\" +\n                (\"\\tFailed parsing: < \" + regExp.toString() + \" >\\n\") +\n                (\"\\tUsing the regexp-to-ast library version: \" + regexp_to_ast_1.VERSION + \"\\n\") +\n                \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n                msgSuffix);\n        }\n    }\n    return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n    switch (ast.type) {\n        case \"Disjunction\":\n            for (var i = 0; i < ast.value.length; i++) {\n                firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n            }\n            break;\n        case \"Alternative\":\n            var terms = ast.value;\n            for (var i = 0; i < terms.length; i++) {\n                var term = terms[i];\n                // skip terms that cannot effect the first char results\n                switch (term.type) {\n                    case \"EndAnchor\":\n                    // A group back reference cannot affect potential starting char.\n                    // because if a back reference is the first production than automatically\n                    // the group being referenced has had to come BEFORE so its codes have already been added\n                    case \"GroupBackReference\":\n                    // assertions do not affect potential starting codes\n                    case \"Lookahead\":\n                    case \"NegativeLookahead\":\n                    case \"StartAnchor\":\n                    case \"WordBoundary\":\n                    case \"NonWordBoundary\":\n                        continue;\n                }\n                var atom = term;\n                switch (atom.type) {\n                    case \"Character\":\n                        addOptimizedIdxToResult(atom.value, result, ignoreCase);\n                        break;\n                    case \"Set\":\n                        if (atom.complement === true) {\n                            throw Error(complementErrorMessage);\n                        }\n                        utils_1.forEach(atom.value, function (code) {\n                            if (typeof code === \"number\") {\n                                addOptimizedIdxToResult(code, result, ignoreCase);\n                            }\n                            else {\n                                // range\n                                var range = code;\n                                // cannot optimize when ignoreCase is\n                                if (ignoreCase === true) {\n                                    for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n                                        addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n                                    }\n                                }\n                                // Optimization (2 orders of magnitude less work for very large ranges)\n                                else {\n                                    // handle unoptimized values\n                                    for (var rangeCode = range.from; rangeCode <= range.to &&\n                                        rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n                                        addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n                                    }\n                                    // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n                                    if (range.to >= lexer_1.minOptimizationVal) {\n                                        var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n                                            ? range.from\n                                            : lexer_1.minOptimizationVal;\n                                        var maxUnOptVal = range.to;\n                                        var minOptIdx = lexer_1.charCodeToOptimizedIndex(minUnOptVal);\n                                        var maxOptIdx = lexer_1.charCodeToOptimizedIndex(maxUnOptVal);\n                                        for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n                                            result[currOptIdx] = currOptIdx;\n                                        }\n                                    }\n                                }\n                            }\n                        });\n                        break;\n                    case \"Group\":\n                        firstCharOptimizedIndices(atom.value, result, ignoreCase);\n                        break;\n                    /* istanbul ignore next */\n                    default:\n                        throw Error(\"Non Exhaustive Match\");\n                }\n                // reached a mandatory production, no more **start** codes can be found on this alternative\n                var isOptionalQuantifier = atom.quantifier !== undefined &&\n                    atom.quantifier.atLeast === 0;\n                if (\n                // A group may be optional due to empty contents /(?:)/\n                // or if everything inside it is optional /((a)?)/\n                (atom.type === \"Group\" &&\n                    isWholeOptional(atom) === false) ||\n                    // If this term is not a group it may only be optional if it has an optional quantifier\n                    (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n                    break;\n                }\n            }\n            break;\n        /* istanbul ignore next */\n        default:\n            throw Error(\"non exhaustive match!\");\n    }\n    // console.log(Object.keys(result).length)\n    return utils_1.values(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n    var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(code);\n    result[optimizedCharIdx] = optimizedCharIdx;\n    if (ignoreCase === true) {\n        handleIgnoreCase(code, result);\n    }\n}\nfunction handleIgnoreCase(code, result) {\n    var char = String.fromCharCode(code);\n    var upperChar = char.toUpperCase();\n    /* istanbul ignore else */\n    if (upperChar !== char) {\n        var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(upperChar.charCodeAt(0));\n        result[optimizedCharIdx] = optimizedCharIdx;\n    }\n    else {\n        var lowerChar = char.toLowerCase();\n        if (lowerChar !== char) {\n            var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(lowerChar.charCodeAt(0));\n            result[optimizedCharIdx] = optimizedCharIdx;\n        }\n    }\n}\nfunction findCode(setNode, targetCharCodes) {\n    return utils_1.find(setNode.value, function (codeOrRange) {\n        if (typeof codeOrRange === \"number\") {\n            return utils_1.contains(targetCharCodes, codeOrRange);\n        }\n        else {\n            // range\n            var range_1 = codeOrRange;\n            return (utils_1.find(targetCharCodes, function (targetCode) {\n                return range_1.from <= targetCode && targetCode <= range_1.to;\n            }) !== undefined);\n        }\n    });\n}\nfunction isWholeOptional(ast) {\n    if (ast.quantifier && ast.quantifier.atLeast === 0) {\n        return true;\n    }\n    if (!ast.value) {\n        return false;\n    }\n    return utils_1.isArray(ast.value)\n        ? utils_1.every(ast.value, isWholeOptional)\n        : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n    __extends(CharCodeFinder, _super);\n    function CharCodeFinder(targetCharCodes) {\n        var _this = _super.call(this) || this;\n        _this.targetCharCodes = targetCharCodes;\n        _this.found = false;\n        return _this;\n    }\n    CharCodeFinder.prototype.visitChildren = function (node) {\n        // No need to keep looking...\n        if (this.found === true) {\n            return;\n        }\n        // switch lookaheads as they do not actually consume any characters thus\n        // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n        switch (node.type) {\n            case \"Lookahead\":\n                this.visitLookahead(node);\n                return;\n            case \"NegativeLookahead\":\n                this.visitNegativeLookahead(node);\n                return;\n        }\n        _super.prototype.visitChildren.call(this, node);\n    };\n    CharCodeFinder.prototype.visitCharacter = function (node) {\n        if (utils_1.contains(this.targetCharCodes, node.value)) {\n            this.found = true;\n        }\n    };\n    CharCodeFinder.prototype.visitSet = function (node) {\n        if (node.complement) {\n            if (findCode(node, this.targetCharCodes) === undefined) {\n                this.found = true;\n            }\n        }\n        else {\n            if (findCode(node, this.targetCharCodes) !== undefined) {\n                this.found = true;\n            }\n        }\n    };\n    return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n    if (pattern instanceof RegExp) {\n        var ast = reg_exp_parser_1.getRegExpAst(pattern);\n        var charCodeFinder = new CharCodeFinder(charCodes);\n        charCodeFinder.visit(ast);\n        return charCodeFinder.found;\n    }\n    else {\n        return (utils_1.find(pattern, function (char) {\n            return utils_1.contains(charCodes, char.charCodeAt(0));\n        }) !== undefined);\n    }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar parser_1 = __webpack_require__(2);\nvar utils_1 = __webpack_require__(0);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction resolveGrammar(topLevels, errMsgProvider) {\n    var refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);\n    refResolver.resolveRefs();\n    return refResolver.errors;\n}\nexports.resolveGrammar = resolveGrammar;\nvar GastRefResolverVisitor = /** @class */ (function (_super) {\n    __extends(GastRefResolverVisitor, _super);\n    function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {\n        var _this = _super.call(this) || this;\n        _this.nameToTopRule = nameToTopRule;\n        _this.errMsgProvider = errMsgProvider;\n        _this.errors = [];\n        return _this;\n    }\n    GastRefResolverVisitor.prototype.resolveRefs = function () {\n        var _this = this;\n        utils_1.forEach(utils_1.values(this.nameToTopRule), function (prod) {\n            _this.currTopLevel = prod;\n            prod.accept(_this);\n        });\n    };\n    GastRefResolverVisitor.prototype.visitNonTerminal = function (node) {\n        var ref = this.nameToTopRule[node.nonTerminalName];\n        if (!ref) {\n            var msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node);\n            this.errors.push({\n                message: msg,\n                type: parser_1.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n                ruleName: this.currTopLevel.name,\n                unresolvedRefName: node.nonTerminalName\n            });\n        }\n        else {\n            node.referencedRule = ref;\n        }\n    };\n    return GastRefResolverVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.GastRefResolverVisitor = GastRefResolverVisitor;\n//# sourceMappingURL=resolver.js.map\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar lookahead_1 = __webpack_require__(12);\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\nvar keys_1 = __webpack_require__(7);\nvar gast_1 = __webpack_require__(6);\n/**\n * Trait responsible for the lookahead related utilities and optimizations.\n */\nvar LooksAhead = /** @class */ (function () {\n    function LooksAhead() {\n    }\n    LooksAhead.prototype.initLooksAhead = function (config) {\n        this.dynamicTokensEnabled = utils_1.has(config, \"dynamicTokensEnabled\")\n            ? config.dynamicTokensEnabled\n            : parser_1.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled;\n        this.maxLookahead = utils_1.has(config, \"maxLookahead\")\n            ? config.maxLookahead\n            : parser_1.DEFAULT_PARSER_CONFIG.maxLookahead;\n        /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n        this.lookAheadFuncsCache = utils_1.isES2015MapSupported() ? new Map() : [];\n        // Performance optimization on newer engines that support ES6 Map\n        // For larger Maps this is slightly faster than using a plain object (array in our case).\n        /* istanbul ignore else - The else branch will be tested on older node.js versions and IE11 */\n        if (utils_1.isES2015MapSupported()) {\n            this.getLaFuncFromCache = this.getLaFuncFromMap;\n            this.setLaFuncCache = this.setLaFuncCacheUsingMap;\n        }\n        else {\n            this.getLaFuncFromCache = this.getLaFuncFromObj;\n            this.setLaFuncCache = this.setLaFuncUsingObj;\n        }\n    };\n    LooksAhead.prototype.preComputeLookaheadFunctions = function (rules) {\n        var _this = this;\n        utils_1.forEach(rules, function (currRule) {\n            _this.TRACE_INIT(currRule.name + \" Rule Lookahead\", function () {\n                var _a = gast_1.collectMethods(currRule), alternation = _a.alternation, repetition = _a.repetition, option = _a.option, repetitionMandatory = _a.repetitionMandatory, repetitionMandatoryWithSeparator = _a.repetitionMandatoryWithSeparator, repetitionWithSeparator = _a.repetitionWithSeparator;\n                utils_1.forEach(alternation, function (currProd) {\n                    var prodIdx = currProd.idx === 0 ? \"\" : currProd.idx;\n                    _this.TRACE_INIT(\"\" + gast_1.getProductionDslName(currProd) + prodIdx, function () {\n                        var laFunc = lookahead_1.buildLookaheadFuncForOr(currProd.idx, currRule, currProd.maxLookahead || _this.maxLookahead, currProd.hasPredicates, _this.dynamicTokensEnabled, _this.lookAheadBuilderForAlternatives);\n                        var key = keys_1.getKeyForAutomaticLookahead(_this.fullRuleNameToShort[currRule.name], keys_1.OR_IDX, currProd.idx);\n                        _this.setLaFuncCache(key, laFunc);\n                    });\n                });\n                utils_1.forEach(repetition, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_IDX, lookahead_1.PROD_TYPE.REPETITION, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(option, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.OPTION_IDX, lookahead_1.PROD_TYPE.OPTION, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionMandatory, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_IDX, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionMandatoryWithSeparator, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_SEP_IDX, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionWithSeparator, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_SEP_IDX, lookahead_1.PROD_TYPE.REPETITION_WITH_SEPARATOR, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n            });\n        });\n    };\n    LooksAhead.prototype.computeLookaheadFunc = function (rule, prodOccurrence, prodKey, prodType, prodMaxLookahead, dslMethodName) {\n        var _this = this;\n        this.TRACE_INIT(\"\" + dslMethodName + (prodOccurrence === 0 ? \"\" : prodOccurrence), function () {\n            var laFunc = lookahead_1.buildLookaheadFuncForOptionalProd(prodOccurrence, rule, prodMaxLookahead || _this.maxLookahead, _this.dynamicTokensEnabled, prodType, _this.lookAheadBuilderForOptional);\n            var key = keys_1.getKeyForAutomaticLookahead(_this.fullRuleNameToShort[rule.name], prodKey, prodOccurrence);\n            _this.setLaFuncCache(key, laFunc);\n        });\n    };\n    LooksAhead.prototype.lookAheadBuilderForOptional = function (alt, tokenMatcher, dynamicTokensEnabled) {\n        return lookahead_1.buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled);\n    };\n    LooksAhead.prototype.lookAheadBuilderForAlternatives = function (alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n        return lookahead_1.buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n    };\n    // this actually returns a number, but it is always used as a string (object prop key)\n    LooksAhead.prototype.getKeyForAutomaticLookahead = function (dslMethodIdx, occurrence) {\n        var currRuleShortName = this.getLastExplicitRuleShortName();\n        return keys_1.getKeyForAutomaticLookahead(currRuleShortName, dslMethodIdx, occurrence);\n    };\n    /* istanbul ignore next */\n    LooksAhead.prototype.getLaFuncFromCache = function (key) {\n        return undefined;\n    };\n    LooksAhead.prototype.getLaFuncFromMap = function (key) {\n        return this.lookAheadFuncsCache.get(key);\n    };\n    /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n    LooksAhead.prototype.getLaFuncFromObj = function (key) {\n        return this.lookAheadFuncsCache[key];\n    };\n    /* istanbul ignore next */\n    LooksAhead.prototype.setLaFuncCache = function (key, value) { };\n    LooksAhead.prototype.setLaFuncCacheUsingMap = function (key, value) {\n        this.lookAheadFuncsCache.set(key, value);\n    };\n    /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n    LooksAhead.prototype.setLaFuncUsingObj = function (key, value) {\n        this.lookAheadFuncsCache[key] = value;\n    };\n    return LooksAhead;\n}());\nexports.LooksAhead = LooksAhead;\n//# sourceMappingURL=looksahead.js.map\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar cst_1 = __webpack_require__(17);\nvar utils_1 = __webpack_require__(0);\nvar cst_visitor_1 = __webpack_require__(32);\nvar keys_1 = __webpack_require__(7);\nvar parser_1 = __webpack_require__(2);\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n    function TreeBuilder() {\n    }\n    TreeBuilder.prototype.initTreeBuilder = function (config) {\n        this.LAST_EXPLICIT_RULE_STACK = [];\n        this.CST_STACK = [];\n        this.outputCst = utils_1.has(config, \"outputCst\")\n            ? config.outputCst\n            : parser_1.DEFAULT_PARSER_CONFIG.outputCst;\n        this.nodeLocationTracking = utils_1.has(config, \"nodeLocationTracking\")\n            ? config.nodeLocationTracking\n            : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n        if (!this.outputCst) {\n            this.cstInvocationStateUpdate = utils_1.NOOP;\n            this.cstFinallyStateUpdate = utils_1.NOOP;\n            this.cstPostTerminal = utils_1.NOOP;\n            this.cstPostNonTerminal = utils_1.NOOP;\n            this.cstPostRule = utils_1.NOOP;\n            this.getLastExplicitRuleShortName = this.getLastExplicitRuleShortNameNoCst;\n            this.getPreviousExplicitRuleShortName = this.getPreviousExplicitRuleShortNameNoCst;\n            this.getLastExplicitRuleOccurrenceIndex = this.getLastExplicitRuleOccurrenceIndexNoCst;\n            this.manyInternal = this.manyInternalNoCst;\n            this.orInternal = this.orInternalNoCst;\n            this.optionInternal = this.optionInternalNoCst;\n            this.atLeastOneInternal = this.atLeastOneInternalNoCst;\n            this.manySepFirstInternal = this.manySepFirstInternalNoCst;\n            this.atLeastOneSepFirstInternal = this.atLeastOneSepFirstInternalNoCst;\n        }\n        else {\n            if (/full/i.test(this.nodeLocationTracking)) {\n                if (this.recoveryEnabled) {\n                    this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n                    this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n                    this.cstPostRule = utils_1.NOOP;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n                }\n                else {\n                    this.setNodeLocationFromToken = utils_1.NOOP;\n                    this.setNodeLocationFromNode = utils_1.NOOP;\n                    this.cstPostRule = this.cstPostRuleFull;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n                }\n            }\n            else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n                if (this.recoveryEnabled) {\n                    this.setNodeLocationFromToken = (cst_1.setNodeLocationOnlyOffset);\n                    this.setNodeLocationFromNode = (cst_1.setNodeLocationOnlyOffset);\n                    this.cstPostRule = utils_1.NOOP;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRecovery;\n                }\n                else {\n                    this.setNodeLocationFromToken = utils_1.NOOP;\n                    this.setNodeLocationFromNode = utils_1.NOOP;\n                    this.cstPostRule = this.cstPostRuleOnlyOffset;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRegular;\n                }\n            }\n            else if (/none/i.test(this.nodeLocationTracking)) {\n                this.setNodeLocationFromToken = utils_1.NOOP;\n                this.setNodeLocationFromNode = utils_1.NOOP;\n                this.cstPostRule = utils_1.NOOP;\n                this.setInitialNodeLocation = utils_1.NOOP;\n            }\n            else {\n                throw Error(\"Invalid <nodeLocationTracking> config option: \\\"\" + config.nodeLocationTracking + \"\\\"\");\n            }\n        }\n    };\n    TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n        cstNode.location = {\n            startOffset: NaN,\n            endOffset: NaN\n        };\n    };\n    TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n        cstNode.location = {\n            // without error recovery the starting Location of a new CstNode is guaranteed\n            // To be the next Token's startOffset (for valid inputs).\n            // For invalid inputs there won't be any CSTOutput so this potential\n            // inaccuracy does not matter\n            startOffset: this.LA(1).startOffset,\n            endOffset: NaN\n        };\n    };\n    TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n        cstNode.location = {\n            startOffset: NaN,\n            startLine: NaN,\n            startColumn: NaN,\n            endOffset: NaN,\n            endLine: NaN,\n            endColumn: NaN\n        };\n    };\n    /**\n     *  @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n\n     * @param cstNode\n     */\n    TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n        var nextToken = this.LA(1);\n        cstNode.location = {\n            startOffset: nextToken.startOffset,\n            startLine: nextToken.startLine,\n            startColumn: nextToken.startColumn,\n            endOffset: NaN,\n            endLine: NaN,\n            endColumn: NaN\n        };\n    };\n    // CST\n    TreeBuilder.prototype.cstNestedInvocationStateUpdate = function (nestedName, shortName) {\n        var cstNode = {\n            name: nestedName,\n            fullName: this.shortRuleNameToFull[this.getLastExplicitRuleShortName()] +\n                nestedName,\n            children: {}\n        };\n        this.setInitialNodeLocation(cstNode);\n        this.CST_STACK.push(cstNode);\n    };\n    TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName, shortName) {\n        this.LAST_EXPLICIT_RULE_STACK.push(this.RULE_STACK.length - 1);\n        var cstNode = {\n            name: fullRuleName,\n            children: {}\n        };\n        this.setInitialNodeLocation(cstNode);\n        this.CST_STACK.push(cstNode);\n    };\n    TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n        this.LAST_EXPLICIT_RULE_STACK.pop();\n        this.CST_STACK.pop();\n    };\n    TreeBuilder.prototype.cstNestedFinallyStateUpdate = function () {\n        var lastCstNode = this.CST_STACK.pop();\n        // TODO: the naming is bad, this should go directly to the\n        //       (correct) cstLocation update method\n        //       e.g if we put other logic in postRule...\n        this.cstPostRule(lastCstNode);\n    };\n    TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n        var prevToken = this.LA(0);\n        var loc = ruleCstNode.location;\n        // If this condition is true it means we consumed at least one Token\n        // In this CstNode or its nested children.\n        if (loc.startOffset <= prevToken.startOffset === true) {\n            loc.endOffset = prevToken.endOffset;\n            loc.endLine = prevToken.endLine;\n            loc.endColumn = prevToken.endColumn;\n        }\n        // \"empty\" CstNode edge case\n        else {\n            loc.startOffset = NaN;\n            loc.startLine = NaN;\n            loc.startColumn = NaN;\n        }\n    };\n    TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n        var prevToken = this.LA(0);\n        var loc = ruleCstNode.location;\n        // If this condition is true it means we consumed at least one Token\n        // In this CstNode or its nested children.\n        if (loc.startOffset <= prevToken.startOffset === true) {\n            loc.endOffset = prevToken.endOffset;\n        }\n        // \"empty\" CstNode edge case\n        else {\n            loc.startOffset = NaN;\n        }\n    };\n    TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n        var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n        cst_1.addTerminalToCst(rootCst, consumedToken, key);\n        // This is only used when **both** error recovery and CST Output are enabled.\n        this.setNodeLocationFromToken(rootCst.location, consumedToken);\n    };\n    TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n        // Avoid side effects due to back tracking\n        // TODO: This costs a 2-3% in performance, A flag on IParserConfig\n        //   could be used to get rid of this conditional, but not sure its worth the effort\n        //   and API complexity.\n        if (this.isBackTracking() !== true) {\n            var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n            cst_1.addNoneTerminalToCst(preCstNode, ruleName, ruleCstResult);\n            // This is only used when **both** error recovery and CST Output are enabled.\n            this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n        }\n    };\n    TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n        if (utils_1.isUndefined(this.baseCstVisitorConstructor)) {\n            var newBaseCstVisitorConstructor = cst_visitor_1.createBaseSemanticVisitorConstructor(this.className, this.allRuleNames);\n            this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n            return newBaseCstVisitorConstructor;\n        }\n        return this.baseCstVisitorConstructor;\n    };\n    TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n        if (utils_1.isUndefined(this.baseCstVisitorWithDefaultsConstructor)) {\n            var newConstructor = cst_visitor_1.createBaseVisitorConstructorWithDefaults(this.className, this.allRuleNames, this.getBaseCstVisitorConstructor());\n            this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n            return newConstructor;\n        }\n        return this.baseCstVisitorWithDefaultsConstructor;\n    };\n    TreeBuilder.prototype.nestedRuleBeforeClause = function (methodOpts, laKey) {\n        var nestedName;\n        if (methodOpts.NAME !== undefined) {\n            nestedName = methodOpts.NAME;\n            this.nestedRuleInvocationStateUpdate(nestedName, laKey);\n            return nestedName;\n        }\n        else {\n            return undefined;\n        }\n    };\n    TreeBuilder.prototype.nestedAltBeforeClause = function (methodOpts, occurrence, methodKeyIdx, altIdx) {\n        var ruleIdx = this.getLastExplicitRuleShortName();\n        var shortName = keys_1.getKeyForAltIndex(ruleIdx, methodKeyIdx, occurrence, altIdx);\n        var nestedName;\n        if (methodOpts.NAME !== undefined) {\n            nestedName = methodOpts.NAME;\n            this.nestedRuleInvocationStateUpdate(nestedName, shortName);\n            return {\n                shortName: shortName,\n                nestedName: nestedName\n            };\n        }\n        else {\n            return undefined;\n        }\n    };\n    TreeBuilder.prototype.nestedRuleFinallyClause = function (laKey, nestedName) {\n        var cstStack = this.CST_STACK;\n        var nestedRuleCst = cstStack[cstStack.length - 1];\n        this.nestedRuleFinallyStateUpdate();\n        // this return a different result than the previous invocation because \"nestedRuleFinallyStateUpdate\" pops the cst stack\n        var parentCstNode = cstStack[cstStack.length - 1];\n        cst_1.addNoneTerminalToCst(parentCstNode, nestedName, nestedRuleCst);\n        this.setNodeLocationFromNode(parentCstNode.location, nestedRuleCst.location);\n    };\n    TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n        var lastExplictIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1];\n        return this.RULE_STACK[lastExplictIndex];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleShortNameNoCst = function () {\n        var ruleStack = this.RULE_STACK;\n        return ruleStack[ruleStack.length - 1];\n    };\n    TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n        var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 2];\n        return this.RULE_STACK[lastExplicitIndex];\n    };\n    TreeBuilder.prototype.getPreviousExplicitRuleShortNameNoCst = function () {\n        var ruleStack = this.RULE_STACK;\n        return ruleStack[ruleStack.length - 2];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n        var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1];\n        return this.RULE_OCCURRENCE_STACK[lastExplicitIndex];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndexNoCst = function () {\n        var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n        return occurrenceStack[occurrenceStack.length - 1];\n    };\n    TreeBuilder.prototype.nestedRuleInvocationStateUpdate = function (nestedRuleName, shortNameKey) {\n        this.RULE_OCCURRENCE_STACK.push(1);\n        this.RULE_STACK.push(shortNameKey);\n        this.cstNestedInvocationStateUpdate(nestedRuleName, shortNameKey);\n    };\n    TreeBuilder.prototype.nestedRuleFinallyStateUpdate = function () {\n        this.RULE_STACK.pop();\n        this.RULE_OCCURRENCE_STACK.pop();\n        // NOOP when cst is disabled\n        this.cstNestedFinallyStateUpdate();\n    };\n    return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar lang_extensions_1 = __webpack_require__(26);\nvar checks_1 = __webpack_require__(11);\nfunction defaultVisit(ctx, param) {\n    var childrenNames = utils_1.keys(ctx);\n    var childrenNamesLength = childrenNames.length;\n    for (var i = 0; i < childrenNamesLength; i++) {\n        var currChildName = childrenNames[i];\n        var currChildArray = ctx[currChildName];\n        var currChildArrayLength = currChildArray.length;\n        for (var j = 0; j < currChildArrayLength; j++) {\n            var currChild = currChildArray[j];\n            // distinction between Tokens Children and CstNode children\n            if (currChild.tokenTypeIdx === undefined) {\n                if (currChild.fullName !== undefined) {\n                    this[currChild.fullName](currChild.children, param);\n                }\n                else {\n                    this[currChild.name](currChild.children, param);\n                }\n            }\n        }\n    }\n    // defaultVisit does not support generic out param\n    return undefined;\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n    var derivedConstructor = function () { };\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    lang_extensions_1.defineNameProp(derivedConstructor, grammarName + \"BaseSemantics\");\n    var semanticProto = {\n        visit: function (cstNode, param) {\n            // enables writing more concise visitor methods when CstNode has only a single child\n            if (utils_1.isArray(cstNode)) {\n                // A CST Node's children dictionary can never have empty arrays as values\n                // If a key is defined there will be at least one element in the corresponding value array.\n                cstNode = cstNode[0];\n            }\n            // enables passing optional CstNodes concisely.\n            if (utils_1.isUndefined(cstNode)) {\n                return undefined;\n            }\n            if (cstNode.fullName !== undefined) {\n                return this[cstNode.fullName](cstNode.children, param);\n            }\n            else {\n                return this[cstNode.name](cstNode.children, param);\n            }\n        },\n        validateVisitor: function () {\n            var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n            if (!utils_1.isEmpty(semanticDefinitionErrors)) {\n                var errorMessages = utils_1.map(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n                throw Error(\"Errors Detected in CST Visitor <\" + lang_extensions_1.functionName(this.constructor) + \">:\\n\\t\" +\n                    (\"\" + errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n            }\n        }\n    };\n    derivedConstructor.prototype = semanticProto;\n    derivedConstructor.prototype.constructor = derivedConstructor;\n    derivedConstructor._RULE_NAMES = ruleNames;\n    return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n    var derivedConstructor = function () { };\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    lang_extensions_1.defineNameProp(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n    var withDefaultsProto = Object.create(baseConstructor.prototype);\n    utils_1.forEach(ruleNames, function (ruleName) {\n        withDefaultsProto[ruleName] = defaultVisit;\n    });\n    derivedConstructor.prototype = withDefaultsProto;\n    derivedConstructor.prototype.constructor = derivedConstructor;\n    return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n    CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n    CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n    var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n    var redundantErrors = validateRedundantMethods(visitorInstance, ruleNames);\n    return missingErrors.concat(redundantErrors);\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n    var errors = utils_1.map(ruleNames, function (currRuleName) {\n        if (!utils_1.isFunction(visitorInstance[currRuleName])) {\n            return {\n                msg: \"Missing visitor method: <\" + currRuleName + \"> on \" + lang_extensions_1.functionName(visitorInstance.constructor) + \" CST Visitor.\",\n                type: CstVisitorDefinitionError.MISSING_METHOD,\n                methodName: currRuleName\n            };\n        }\n    });\n    return utils_1.compact(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\nvar VALID_PROP_NAMES = [\"constructor\", \"visit\", \"validateVisitor\"];\nfunction validateRedundantMethods(visitorInstance, ruleNames) {\n    var errors = [];\n    for (var prop in visitorInstance) {\n        if (checks_1.validTermsPattern.test(prop) &&\n            utils_1.isFunction(visitorInstance[prop]) &&\n            !utils_1.contains(VALID_PROP_NAMES, prop) &&\n            !utils_1.contains(ruleNames, prop)) {\n            errors.push({\n                msg: \"Redundant visitor method: <\" + prop + \"> on \" + lang_extensions_1.functionName(visitorInstance.constructor) + \" CST Visitor\\n\" +\n                    \"There is no Grammar Rule corresponding to this method's name.\\n\" +\n                    (\"For utility methods on visitor classes use methods names that do not match /\" + checks_1.validTermsPattern.source + \"/.\"),\n                type: CstVisitorDefinitionError.REDUNDANT_METHOD,\n                methodName: prop\n            });\n        }\n    }\n    return errors;\n}\nexports.validateRedundantMethods = validateRedundantMethods;\n//# sourceMappingURL=cst_visitor.js.map\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n *\n * This could be generalized to support other kinds of lexers, e.g.\n * - Just in Time Lexing / Lexer-Less parsing.\n * - Streaming Lexer.\n */\nvar LexerAdapter = /** @class */ (function () {\n    function LexerAdapter() {\n    }\n    LexerAdapter.prototype.initLexerAdapter = function () {\n        this.tokVector = [];\n        this.tokVectorLength = 0;\n        this.currIdx = -1;\n    };\n    Object.defineProperty(LexerAdapter.prototype, \"input\", {\n        get: function () {\n            return this.tokVector;\n        },\n        set: function (newInput) {\n            if (this.selfAnalysisDone !== true) {\n                throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");\n            }\n            this.reset();\n            this.tokVector = newInput;\n            this.tokVectorLength = newInput.length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // skips a token and returns the next token\n    LexerAdapter.prototype.SKIP_TOKEN = function () {\n        if (this.currIdx <= this.tokVector.length - 2) {\n            this.consumeToken();\n            return this.LA(1);\n        }\n        else {\n            return parser_1.END_OF_FILE;\n        }\n    };\n    // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n    // or lexers dependent on parser context.\n    LexerAdapter.prototype.LA = function (howMuch) {\n        var soughtIdx = this.currIdx + howMuch;\n        if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n            return parser_1.END_OF_FILE;\n        }\n        else {\n            return this.tokVector[soughtIdx];\n        }\n    };\n    LexerAdapter.prototype.consumeToken = function () {\n        this.currIdx++;\n    };\n    LexerAdapter.prototype.exportLexerState = function () {\n        return this.currIdx;\n    };\n    LexerAdapter.prototype.importLexerState = function (newState) {\n        this.currIdx = newState;\n    };\n    LexerAdapter.prototype.resetLexerState = function () {\n        this.currIdx = -1;\n    };\n    LexerAdapter.prototype.moveToTerminatedState = function () {\n        this.currIdx = this.tokVector.length - 1;\n    };\n    LexerAdapter.prototype.getLexerPosition = function () {\n        return this.exportLexerState();\n    };\n    return LexerAdapter;\n}());\nexports.LexerAdapter = LexerAdapter;\n//# sourceMappingURL=lexer_adapter.js.map\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar exceptions_public_1 = __webpack_require__(8);\nvar parser_1 = __webpack_require__(2);\nvar errors_public_1 = __webpack_require__(10);\nvar checks_1 = __webpack_require__(11);\nvar gast_public_1 = __webpack_require__(1);\n/**\n * This trait is responsible for implementing the public API\n * for defining Chevrotain parsers, i.e:\n * - CONSUME\n * - RULE\n * - OPTION\n * - ...\n */\nvar RecognizerApi = /** @class */ (function () {\n    function RecognizerApi() {\n    }\n    RecognizerApi.prototype.ACTION = function (impl) {\n        return impl.call(this);\n    };\n    RecognizerApi.prototype.consume = function (idx, tokType, options) {\n        return this.consumeInternal(tokType, idx, options);\n    };\n    RecognizerApi.prototype.subrule = function (idx, ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, idx, options);\n    };\n    RecognizerApi.prototype.option = function (idx, actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, idx);\n    };\n    RecognizerApi.prototype.or = function (idx, altsOrOpts) {\n        return this.orInternal(altsOrOpts, idx);\n    };\n    RecognizerApi.prototype.many = function (idx, actionORMethodDef) {\n        return this.manyInternal(idx, actionORMethodDef);\n    };\n    RecognizerApi.prototype.atLeastOne = function (idx, actionORMethodDef) {\n        return this.atLeastOneInternal(idx, actionORMethodDef);\n    };\n    RecognizerApi.prototype.CONSUME = function (tokType, options) {\n        return this.consumeInternal(tokType, 0, options);\n    };\n    RecognizerApi.prototype.CONSUME1 = function (tokType, options) {\n        return this.consumeInternal(tokType, 1, options);\n    };\n    RecognizerApi.prototype.CONSUME2 = function (tokType, options) {\n        return this.consumeInternal(tokType, 2, options);\n    };\n    RecognizerApi.prototype.CONSUME3 = function (tokType, options) {\n        return this.consumeInternal(tokType, 3, options);\n    };\n    RecognizerApi.prototype.CONSUME4 = function (tokType, options) {\n        return this.consumeInternal(tokType, 4, options);\n    };\n    RecognizerApi.prototype.CONSUME5 = function (tokType, options) {\n        return this.consumeInternal(tokType, 5, options);\n    };\n    RecognizerApi.prototype.CONSUME6 = function (tokType, options) {\n        return this.consumeInternal(tokType, 6, options);\n    };\n    RecognizerApi.prototype.CONSUME7 = function (tokType, options) {\n        return this.consumeInternal(tokType, 7, options);\n    };\n    RecognizerApi.prototype.CONSUME8 = function (tokType, options) {\n        return this.consumeInternal(tokType, 8, options);\n    };\n    RecognizerApi.prototype.CONSUME9 = function (tokType, options) {\n        return this.consumeInternal(tokType, 9, options);\n    };\n    RecognizerApi.prototype.SUBRULE = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 0, options);\n    };\n    RecognizerApi.prototype.SUBRULE1 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 1, options);\n    };\n    RecognizerApi.prototype.SUBRULE2 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 2, options);\n    };\n    RecognizerApi.prototype.SUBRULE3 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 3, options);\n    };\n    RecognizerApi.prototype.SUBRULE4 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 4, options);\n    };\n    RecognizerApi.prototype.SUBRULE5 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 5, options);\n    };\n    RecognizerApi.prototype.SUBRULE6 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 6, options);\n    };\n    RecognizerApi.prototype.SUBRULE7 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 7, options);\n    };\n    RecognizerApi.prototype.SUBRULE8 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 8, options);\n    };\n    RecognizerApi.prototype.SUBRULE9 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 9, options);\n    };\n    RecognizerApi.prototype.OPTION = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 0);\n    };\n    RecognizerApi.prototype.OPTION1 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 1);\n    };\n    RecognizerApi.prototype.OPTION2 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 2);\n    };\n    RecognizerApi.prototype.OPTION3 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 3);\n    };\n    RecognizerApi.prototype.OPTION4 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 4);\n    };\n    RecognizerApi.prototype.OPTION5 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 5);\n    };\n    RecognizerApi.prototype.OPTION6 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 6);\n    };\n    RecognizerApi.prototype.OPTION7 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 7);\n    };\n    RecognizerApi.prototype.OPTION8 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 8);\n    };\n    RecognizerApi.prototype.OPTION9 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 9);\n    };\n    RecognizerApi.prototype.OR = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 0);\n    };\n    RecognizerApi.prototype.OR1 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 1);\n    };\n    RecognizerApi.prototype.OR2 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 2);\n    };\n    RecognizerApi.prototype.OR3 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 3);\n    };\n    RecognizerApi.prototype.OR4 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 4);\n    };\n    RecognizerApi.prototype.OR5 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 5);\n    };\n    RecognizerApi.prototype.OR6 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 6);\n    };\n    RecognizerApi.prototype.OR7 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 7);\n    };\n    RecognizerApi.prototype.OR8 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 8);\n    };\n    RecognizerApi.prototype.OR9 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 9);\n    };\n    RecognizerApi.prototype.MANY = function (actionORMethodDef) {\n        this.manyInternal(0, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY1 = function (actionORMethodDef) {\n        this.manyInternal(1, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY2 = function (actionORMethodDef) {\n        this.manyInternal(2, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY3 = function (actionORMethodDef) {\n        this.manyInternal(3, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY4 = function (actionORMethodDef) {\n        this.manyInternal(4, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY5 = function (actionORMethodDef) {\n        this.manyInternal(5, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY6 = function (actionORMethodDef) {\n        this.manyInternal(6, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY7 = function (actionORMethodDef) {\n        this.manyInternal(7, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY8 = function (actionORMethodDef) {\n        this.manyInternal(8, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY9 = function (actionORMethodDef) {\n        this.manyInternal(9, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY_SEP = function (options) {\n        this.manySepFirstInternal(0, options);\n    };\n    RecognizerApi.prototype.MANY_SEP1 = function (options) {\n        this.manySepFirstInternal(1, options);\n    };\n    RecognizerApi.prototype.MANY_SEP2 = function (options) {\n        this.manySepFirstInternal(2, options);\n    };\n    RecognizerApi.prototype.MANY_SEP3 = function (options) {\n        this.manySepFirstInternal(3, options);\n    };\n    RecognizerApi.prototype.MANY_SEP4 = function (options) {\n        this.manySepFirstInternal(4, options);\n    };\n    RecognizerApi.prototype.MANY_SEP5 = function (options) {\n        this.manySepFirstInternal(5, options);\n    };\n    RecognizerApi.prototype.MANY_SEP6 = function (options) {\n        this.manySepFirstInternal(6, options);\n    };\n    RecognizerApi.prototype.MANY_SEP7 = function (options) {\n        this.manySepFirstInternal(7, options);\n    };\n    RecognizerApi.prototype.MANY_SEP8 = function (options) {\n        this.manySepFirstInternal(8, options);\n    };\n    RecognizerApi.prototype.MANY_SEP9 = function (options) {\n        this.manySepFirstInternal(9, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE = function (actionORMethodDef) {\n        this.atLeastOneInternal(0, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE1 = function (actionORMethodDef) {\n        return this.atLeastOneInternal(1, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE2 = function (actionORMethodDef) {\n        this.atLeastOneInternal(2, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE3 = function (actionORMethodDef) {\n        this.atLeastOneInternal(3, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE4 = function (actionORMethodDef) {\n        this.atLeastOneInternal(4, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE5 = function (actionORMethodDef) {\n        this.atLeastOneInternal(5, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE6 = function (actionORMethodDef) {\n        this.atLeastOneInternal(6, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE7 = function (actionORMethodDef) {\n        this.atLeastOneInternal(7, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE8 = function (actionORMethodDef) {\n        this.atLeastOneInternal(8, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE9 = function (actionORMethodDef) {\n        this.atLeastOneInternal(9, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP = function (options) {\n        this.atLeastOneSepFirstInternal(0, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP1 = function (options) {\n        this.atLeastOneSepFirstInternal(1, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP2 = function (options) {\n        this.atLeastOneSepFirstInternal(2, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP3 = function (options) {\n        this.atLeastOneSepFirstInternal(3, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP4 = function (options) {\n        this.atLeastOneSepFirstInternal(4, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP5 = function (options) {\n        this.atLeastOneSepFirstInternal(5, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP6 = function (options) {\n        this.atLeastOneSepFirstInternal(6, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP7 = function (options) {\n        this.atLeastOneSepFirstInternal(7, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP8 = function (options) {\n        this.atLeastOneSepFirstInternal(8, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP9 = function (options) {\n        this.atLeastOneSepFirstInternal(9, options);\n    };\n    RecognizerApi.prototype.RULE = function (name, implementation, config) {\n        if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n        if (utils_1.contains(this.definedRulesNames, name)) {\n            var errMsg = errors_public_1.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n                topLevelRule: name,\n                grammarName: this.className\n            });\n            var error = {\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n                ruleName: name\n            };\n            this.definitionErrors.push(error);\n        }\n        this.definedRulesNames.push(name);\n        var ruleImplementation = this.defineRule(name, implementation, config);\n        this[name] = ruleImplementation;\n        return ruleImplementation;\n    };\n    RecognizerApi.prototype.OVERRIDE_RULE = function (name, impl, config) {\n        if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n        var ruleErrors = [];\n        ruleErrors = ruleErrors.concat(checks_1.validateRuleIsOverridden(name, this.definedRulesNames, this.className));\n        this.definitionErrors.push.apply(this.definitionErrors, ruleErrors); // mutability for the win\n        var ruleImplementation = this.defineRule(name, impl, config);\n        this[name] = ruleImplementation;\n        return ruleImplementation;\n    };\n    RecognizerApi.prototype.BACKTRACK = function (grammarRule, args) {\n        return function () {\n            // save org state\n            this.isBackTrackingStack.push(1);\n            var orgState = this.saveRecogState();\n            try {\n                grammarRule.apply(this, args);\n                // if no exception was thrown we have succeed parsing the rule.\n                return true;\n            }\n            catch (e) {\n                if (exceptions_public_1.isRecognitionException(e)) {\n                    return false;\n                }\n                else {\n                    throw e;\n                }\n            }\n            finally {\n                this.reloadRecogState(orgState);\n                this.isBackTrackingStack.pop();\n            }\n        };\n    };\n    // GAST export APIs\n    RecognizerApi.prototype.getGAstProductions = function () {\n        return this.gastProductionsCache;\n    };\n    RecognizerApi.prototype.getSerializedGastProductions = function () {\n        return gast_public_1.serializeGrammar(utils_1.values(this.gastProductionsCache));\n    };\n    return RecognizerApi;\n}());\nexports.RecognizerApi = RecognizerApi;\n//# sourceMappingURL=recognizer_api.js.map\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar keys_1 = __webpack_require__(7);\nvar exceptions_public_1 = __webpack_require__(8);\nvar lookahead_1 = __webpack_require__(12);\nvar interpreter_1 = __webpack_require__(13);\nvar parser_1 = __webpack_require__(2);\nvar recoverable_1 = __webpack_require__(25);\nvar tokens_public_1 = __webpack_require__(3);\nvar tokens_1 = __webpack_require__(5);\nvar lang_extensions_1 = __webpack_require__(26);\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n    function RecognizerEngine() {\n    }\n    RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n        this.className = lang_extensions_1.classNameFromInstance(this);\n        // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n        this.shortRuleNameToFull = {};\n        this.fullRuleNameToShort = {};\n        this.ruleShortNameIdx = 256;\n        this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n        this.definedRulesNames = [];\n        this.tokensMap = {};\n        this.allRuleNames = [];\n        this.isBackTrackingStack = [];\n        this.RULE_STACK = [];\n        this.RULE_OCCURRENCE_STACK = [];\n        this.gastProductionsCache = {};\n        if (utils_1.has(config, \"serializedGrammar\")) {\n            throw Error(\"The Parser's configuration can no longer contain a <serializedGrammar> property.\\n\" +\n                \"\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n                \"\\tFor Further details.\");\n        }\n        if (utils_1.isArray(tokenVocabulary)) {\n            // This only checks for Token vocabularies provided as arrays.\n            // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n            // rather than all edge cases of empty Token vocabularies.\n            if (utils_1.isEmpty(tokenVocabulary)) {\n                throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n                    \"\\tNote that the first argument for the parser constructor\\n\" +\n                    \"\\tis no longer a Token vector (since v4.0).\");\n            }\n            if (typeof tokenVocabulary[0].startOffset === \"number\") {\n                throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n                    \"\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n                    \"\\tFor Further details.\");\n            }\n        }\n        if (utils_1.isArray(tokenVocabulary)) {\n            this.tokensMap = utils_1.reduce(tokenVocabulary, function (acc, tokType) {\n                acc[tokType.name] = tokType;\n                return acc;\n            }, {});\n        }\n        else if (utils_1.has(tokenVocabulary, \"modes\") &&\n            utils_1.every(utils_1.flatten(utils_1.values(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n            var allTokenTypes = utils_1.flatten(utils_1.values(tokenVocabulary.modes));\n            var uniqueTokens = utils_1.uniq(allTokenTypes);\n            this.tokensMap = utils_1.reduce(uniqueTokens, function (acc, tokType) {\n                acc[tokType.name] = tokType;\n                return acc;\n            }, {});\n        }\n        else if (utils_1.isObject(tokenVocabulary)) {\n            this.tokensMap = utils_1.cloneObj(tokenVocabulary);\n        }\n        else {\n            throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors,\" +\n                \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n        }\n        // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n        // parsed with a clear error message (\"expecting EOF but found ...\")\n        /* tslint:disable */\n        this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n        // TODO: This check may not be accurate for multi mode lexers\n        var noTokenCategoriesUsed = utils_1.every(utils_1.values(tokenVocabulary), function (tokenConstructor) { return utils_1.isEmpty(tokenConstructor.categoryMatches); });\n        this.tokenMatcher = noTokenCategoriesUsed\n            ? tokens_1.tokenStructuredMatcherNoCategories\n            : tokens_1.tokenStructuredMatcher;\n        // Because ES2015+ syntax should be supported for creating Token classes\n        // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n        // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n        tokens_1.augmentTokenTypes(utils_1.values(this.tokensMap));\n    };\n    RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n        if (this.selfAnalysisDone) {\n            throw Error(\"Grammar rule <\" + ruleName + \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\" +\n                \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n        }\n        var resyncEnabled = utils_1.has(config, \"resyncEnabled\")\n            ? config.resyncEnabled\n            : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n        var recoveryValueFunc = utils_1.has(config, \"recoveryValueFunc\")\n            ? config.recoveryValueFunc\n            : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n        // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n        // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n        /* tslint:disable */\n        var shortName = this.ruleShortNameIdx <<\n            (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n        /* tslint:enable */\n        this.ruleShortNameIdx++;\n        this.shortRuleNameToFull[shortName] = ruleName;\n        this.fullRuleNameToShort[ruleName] = shortName;\n        function invokeRuleWithTry(args) {\n            try {\n                if (this.outputCst === true) {\n                    impl.apply(this, args);\n                    var cst = this.CST_STACK[this.CST_STACK.length - 1];\n                    this.cstPostRule(cst);\n                    return cst;\n                }\n                else {\n                    return impl.apply(this, args);\n                }\n            }\n            catch (e) {\n                return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n            }\n            finally {\n                this.ruleFinallyStateUpdate();\n            }\n        }\n        var wrappedGrammarRule;\n        wrappedGrammarRule = function (idxInCallingRule, args) {\n            if (idxInCallingRule === void 0) { idxInCallingRule = 0; }\n            this.ruleInvocationStateUpdate(shortName, ruleName, idxInCallingRule);\n            return invokeRuleWithTry.call(this, args);\n        };\n        var ruleNamePropName = \"ruleName\";\n        wrappedGrammarRule[ruleNamePropName] = ruleName;\n        wrappedGrammarRule[\"originalGrammarAction\"] = impl;\n        return wrappedGrammarRule;\n    };\n    RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n        var isFirstInvokedRule = this.RULE_STACK.length === 1;\n        // note the reSync is always enabled for the first rule invocation, because we must always be able to\n        // reSync with EOF and just output some INVALID ParseTree\n        // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n        // path is really the most valid one\n        var reSyncEnabled = resyncEnabledConfig &&\n            !this.isBackTracking() &&\n            this.recoveryEnabled;\n        if (exceptions_public_1.isRecognitionException(e)) {\n            var recogError = e;\n            if (reSyncEnabled) {\n                var reSyncTokType = this.findReSyncTokenType();\n                if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n                    recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n                    if (this.outputCst) {\n                        var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n                        partialCstResult.recoveredNode = true;\n                        return partialCstResult;\n                    }\n                    else {\n                        return recoveryValueFunc();\n                    }\n                }\n                else {\n                    if (this.outputCst) {\n                        var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n                        partialCstResult.recoveredNode = true;\n                        recogError.partialCstResult = partialCstResult;\n                    }\n                    // to be handled Further up the call stack\n                    throw recogError;\n                }\n            }\n            else if (isFirstInvokedRule) {\n                // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n                this.moveToTerminatedState();\n                // the parser should never throw one of its own errors outside its flow.\n                // even if error recovery is disabled\n                return recoveryValueFunc();\n            }\n            else {\n                // to be recovered Further up the call stack\n                throw recogError;\n            }\n        }\n        else {\n            // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n            throw e;\n        }\n    };\n    // Implementation of parsing DSL\n    RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, key);\n        try {\n            return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(key, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.optionInternalNoCst = function (actionORMethodDef, occurrence) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n        return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n    };\n    RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n        var _this = this;\n        var lookAheadFunc = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_1 = lookAheadFunc;\n                lookAheadFunc = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_1.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        if (lookAheadFunc.call(this) === true) {\n            return action.call(this);\n        }\n        return undefined;\n    };\n    RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey);\n        try {\n            return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.atLeastOneInternalNoCst = function (prodOccurrence, actionORMethodDef) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n        this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, key);\n    };\n    RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n        var _this = this;\n        var lookAheadFunc = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_2 = lookAheadFunc;\n                lookAheadFunc = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_2.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        if (lookAheadFunc.call(this) === true) {\n            var notStuck = this.doSingleRepetition(action);\n            while (lookAheadFunc.call(this) === true &&\n                notStuck === true) {\n                notStuck = this.doSingleRepetition(action);\n            }\n        }\n        else {\n            throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n        }\n        // note that while it may seem that this can cause an error because by using a recursive call to\n        // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n        // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(options, laKey);\n        try {\n            this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternalNoCst = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n        this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n        var _this = this;\n        var action = options.DEF;\n        var separator = options.SEP;\n        var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n        // 1st iteration\n        if (firstIterationLookaheadFunc.call(this) === true) {\n            ;\n            action.call(this);\n            //  TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n            //  because it is only needed in error recovery scenarios.\n            var separatorLookAheadFunc = function () {\n                return _this.tokenMatcher(_this.LA(1), separator);\n            };\n            // 2nd..nth iterations\n            while (this.tokenMatcher(this.LA(1), separator) === true) {\n                // note that this CONSUME will never enter recovery because\n                // the separatorLookAheadFunc checks that the separator really does exist.\n                this.CONSUME(separator);\n                action.call(this);\n            }\n            // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n            this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n                prodOccurrence,\n                separator,\n                separatorLookAheadFunc,\n                action,\n                interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n            ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n        }\n        else {\n            throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n        }\n    };\n    RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey);\n        try {\n            return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.manyInternalNoCst = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n        return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n    };\n    RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n        var _this = this;\n        var lookaheadFunction = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_3 = lookaheadFunction;\n                lookaheadFunction = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_3.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        var notStuck = true;\n        while (lookaheadFunction.call(this) === true && notStuck === true) {\n            notStuck = this.doSingleRepetition(action);\n        }\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n        // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n        // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n        // An infinite loop cannot occur as:\n        // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n        // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n        notStuck);\n    };\n    RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(options, laKey);\n        try {\n            this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.manySepFirstInternalNoCst = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n        this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n    };\n    RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n        var _this = this;\n        var action = options.DEF;\n        var separator = options.SEP;\n        var firstIterationLaFunc = this.getLaFuncFromCache(key);\n        // 1st iteration\n        if (firstIterationLaFunc.call(this) === true) {\n            action.call(this);\n            var separatorLookAheadFunc = function () {\n                return _this.tokenMatcher(_this.LA(1), separator);\n            };\n            // 2nd..nth iterations\n            while (this.tokenMatcher(this.LA(1), separator) === true) {\n                // note that this CONSUME will never enter recovery because\n                // the separatorLookAheadFunc checks that the separator really does exist.\n                this.CONSUME(separator);\n                // No need for checking infinite loop here due to consuming the separator.\n                action.call(this);\n            }\n            // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n            this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n                prodOccurrence,\n                separator,\n                separatorLookAheadFunc,\n                action,\n                interpreter_1.NextTerminalAfterManySepWalker\n            ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n        }\n    };\n    RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n        while (separatorLookAheadFunc()) {\n            // note that this CONSUME will never enter recovery because\n            // the separatorLookAheadFunc checks that the separator really does exist.\n            this.CONSUME(separator);\n            action.call(this);\n        }\n        // we can only arrive to this function after an error\n        // has occurred (hence the name 'second') so the following\n        // IF will always be entered, its possible to remove it...\n        // however it is kept to avoid confusion and be consistent.\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        /* istanbul ignore else */\n        this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n            prodOccurrence,\n            separator,\n            separatorLookAheadFunc,\n            action,\n            nextTerminalAfterWalker\n        ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n    };\n    RecognizerEngine.prototype.doSingleRepetition = function (action) {\n        var beforeIteration = this.getLexerPosition();\n        action.call(this);\n        var afterIteration = this.getLexerPosition();\n        // This boolean will indicate if this repetition progressed\n        // or if we are \"stuck\" (potential infinite loop in the repetition).\n        return afterIteration > beforeIteration;\n    };\n    RecognizerEngine.prototype.orInternalNoCst = function (altsOrOpts, occurrence) {\n        var alts = utils_1.isArray(altsOrOpts)\n            ? altsOrOpts\n            : altsOrOpts.DEF;\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n        var laFunc = this.getLaFuncFromCache(laKey);\n        var altIdxToTake = laFunc.call(this, alts);\n        if (altIdxToTake !== undefined) {\n            var chosenAlternative = alts[altIdxToTake];\n            return chosenAlternative.ALT.call(this);\n        }\n        this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n    };\n    RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n        var nestedName = this.nestedRuleBeforeClause(altsOrOpts, laKey);\n        try {\n            var alts = utils_1.isArray(altsOrOpts)\n                ? altsOrOpts\n                : altsOrOpts.DEF;\n            var laFunc = this.getLaFuncFromCache(laKey);\n            var altIdxToTake = laFunc.call(this, alts);\n            if (altIdxToTake !== undefined) {\n                var chosenAlternative = alts[altIdxToTake];\n                var nestedAltBeforeClauseResult = this.nestedAltBeforeClause(chosenAlternative, occurrence, keys_1.OR_IDX, altIdxToTake);\n                try {\n                    return chosenAlternative.ALT.call(this);\n                }\n                finally {\n                    if (nestedAltBeforeClauseResult !== undefined) {\n                        this.nestedRuleFinallyClause(nestedAltBeforeClauseResult.shortName, nestedAltBeforeClauseResult.nestedName);\n                    }\n                }\n            }\n            this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n        this.RULE_STACK.pop();\n        this.RULE_OCCURRENCE_STACK.pop();\n        // NOOP when cst is disabled\n        this.cstFinallyStateUpdate();\n        if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n            var firstRedundantTok = this.LA(1);\n            var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n                firstRedundant: firstRedundantTok,\n                ruleName: this.getCurrRuleFullName()\n            });\n            this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n        }\n    };\n    RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n        var ruleResult;\n        try {\n            var args = options !== undefined ? options.ARGS : undefined;\n            ruleResult = ruleToCall.call(this, idx, args);\n            this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n                ? options.LABEL\n                : ruleToCall.ruleName);\n            return ruleResult;\n        }\n        catch (e) {\n            this.subruleInternalError(e, options, ruleToCall.ruleName);\n        }\n    };\n    RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n        if (exceptions_public_1.isRecognitionException(e) && e.partialCstResult !== undefined) {\n            this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n                ? options.LABEL\n                : ruleName);\n            delete e.partialCstResult;\n        }\n        throw e;\n    };\n    RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n        var consumedToken;\n        try {\n            var nextToken = this.LA(1);\n            if (this.tokenMatcher(nextToken, tokType) === true) {\n                this.consumeToken();\n                consumedToken = nextToken;\n            }\n            else {\n                this.consumeInternalError(tokType, nextToken, options);\n            }\n        }\n        catch (eFromConsumption) {\n            consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n        }\n        this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n            ? options.LABEL\n            : tokType.name, consumedToken);\n        return consumedToken;\n    };\n    RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n        var msg;\n        var previousToken = this.LA(0);\n        if (options !== undefined && options.ERR_MSG) {\n            msg = options.ERR_MSG;\n        }\n        else {\n            msg = this.errorMessageProvider.buildMismatchTokenMessage({\n                expected: tokType,\n                actual: nextToken,\n                previous: previousToken,\n                ruleName: this.getCurrRuleFullName()\n            });\n        }\n        throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n    };\n    RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n        // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n        // but the original syntax could have been parsed successfully without any backtracking + recovery\n        if (this.recoveryEnabled &&\n            // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n            eFromConsumption.name === \"MismatchedTokenException\" &&\n            !this.isBackTracking()) {\n            var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n            try {\n                return this.tryInRuleRecovery(tokType, follows);\n            }\n            catch (eFromInRuleRecovery) {\n                if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n                    // failed in RuleRecovery.\n                    // throw the original error in order to trigger reSync error recovery\n                    throw eFromConsumption;\n                }\n                else {\n                    throw eFromInRuleRecovery;\n                }\n            }\n        }\n        else {\n            throw eFromConsumption;\n        }\n    };\n    RecognizerEngine.prototype.saveRecogState = function () {\n        // errors is a getter which will clone the errors array\n        var savedErrors = this.errors;\n        var savedRuleStack = utils_1.cloneArr(this.RULE_STACK);\n        return {\n            errors: savedErrors,\n            lexerState: this.exportLexerState(),\n            RULE_STACK: savedRuleStack,\n            CST_STACK: this.CST_STACK,\n            LAST_EXPLICIT_RULE_STACK: this.LAST_EXPLICIT_RULE_STACK\n        };\n    };\n    RecognizerEngine.prototype.reloadRecogState = function (newState) {\n        this.errors = newState.errors;\n        this.importLexerState(newState.lexerState);\n        this.RULE_STACK = newState.RULE_STACK;\n    };\n    RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n        this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n        this.RULE_STACK.push(shortName);\n        // NOOP when cst is disabled\n        this.cstInvocationStateUpdate(fullName, shortName);\n    };\n    RecognizerEngine.prototype.isBackTracking = function () {\n        return this.isBackTrackingStack.length !== 0;\n    };\n    RecognizerEngine.prototype.getCurrRuleFullName = function () {\n        var shortName = this.getLastExplicitRuleShortName();\n        return this.shortRuleNameToFull[shortName];\n    };\n    RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n        return this.shortRuleNameToFull[shortName];\n    };\n    RecognizerEngine.prototype.isAtEndOfInput = function () {\n        return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n    };\n    RecognizerEngine.prototype.reset = function () {\n        this.resetLexerState();\n        this.isBackTrackingStack = [];\n        this.errors = [];\n        this.RULE_STACK = [];\n        this.LAST_EXPLICIT_RULE_STACK = [];\n        // TODO: extract a specific rest for TreeBuilder trait\n        this.CST_STACK = [];\n        this.RULE_OCCURRENCE_STACK = [];\n    };\n    return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar exceptions_public_1 = __webpack_require__(8);\nvar utils_1 = __webpack_require__(0);\nvar lookahead_1 = __webpack_require__(12);\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n    function ErrorHandler() {\n    }\n    ErrorHandler.prototype.initErrorHandler = function (config) {\n        this._errors = [];\n        this.errorMessageProvider = utils_1.defaults(config.errorMessageProvider, parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider);\n    };\n    ErrorHandler.prototype.SAVE_ERROR = function (error) {\n        if (exceptions_public_1.isRecognitionException(error)) {\n            error.context = {\n                ruleStack: this.getHumanReadableRuleStack(),\n                ruleOccurrenceStack: utils_1.cloneArr(this.RULE_OCCURRENCE_STACK)\n            };\n            this._errors.push(error);\n            return error;\n        }\n        else {\n            throw Error(\"Trying to save an Error which is not a RecognitionException\");\n        }\n    };\n    Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n        // TODO: extract these methods to ErrorHandler Trait?\n        get: function () {\n            return utils_1.cloneArr(this._errors);\n        },\n        set: function (newErrors) {\n            this._errors = newErrors;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // TODO: consider caching the error message computed information\n    ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n        var ruleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[ruleName];\n        var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, this.maxLookahead);\n        var insideProdPaths = lookAheadPathsPerAlternative[0];\n        var actualTokens = [];\n        for (var i = 1; i <= this.maxLookahead; i++) {\n            actualTokens.push(this.LA(i));\n        }\n        var msg = this.errorMessageProvider.buildEarlyExitMessage({\n            expectedIterationPaths: insideProdPaths,\n            actual: actualTokens,\n            previous: this.LA(0),\n            customUserDescription: userDefinedErrMsg,\n            ruleName: ruleName\n        });\n        throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n    };\n    // TODO: consider caching the error message computed information\n    ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n        var ruleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[ruleName];\n        // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n        var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOr(occurrence, ruleGrammar, this.maxLookahead);\n        var actualTokens = [];\n        for (var i = 1; i <= this.maxLookahead; i++) {\n            actualTokens.push(this.LA(i));\n        }\n        var previousToken = this.LA(0);\n        var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n            expectedPathsPerAlt: lookAheadPathsPerAlternative,\n            actual: actualTokens,\n            previous: previousToken,\n            customUserDescription: errMsgTypes,\n            ruleName: this.getCurrRuleFullName()\n        });\n        throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n    };\n    return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar interpreter_1 = __webpack_require__(13);\nvar utils_1 = __webpack_require__(0);\nvar ContentAssist = /** @class */ (function () {\n    function ContentAssist() {\n    }\n    ContentAssist.prototype.initContentAssist = function () { };\n    ContentAssist.prototype.computeContentAssist = function (startRuleName, precedingInput) {\n        var startRuleGast = this.gastProductionsCache[startRuleName];\n        if (utils_1.isUndefined(startRuleGast)) {\n            throw Error(\"Rule ->\" + startRuleName + \"<- does not exist in this grammar.\");\n        }\n        return interpreter_1.nextPossibleTokensAfter([startRuleGast], precedingInput, this.tokenMatcher, this.maxLookahead);\n    };\n    // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n    // TODO: should this be more explicitly part of the public API?\n    ContentAssist.prototype.getNextPossibleTokenTypes = function (grammarPath) {\n        var topRuleName = utils_1.first(grammarPath.ruleStack);\n        var gastProductions = this.getGAstProductions();\n        var topProduction = gastProductions[topRuleName];\n        var nextPossibleTokenTypes = new interpreter_1.NextAfterTokenWalker(topProduction, grammarPath).startWalking();\n        return nextPossibleTokenTypes;\n    };\n    return ContentAssist;\n}());\nexports.ContentAssist = ContentAssist;\n//# sourceMappingURL=context_assist.js.map\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar lexer_public_1 = __webpack_require__(9);\nvar tokens_1 = __webpack_require__(5);\nvar tokens_public_1 = __webpack_require__(3);\nvar parser_1 = __webpack_require__(2);\nvar keys_1 = __webpack_require__(7);\nvar RECORDING_NULL_OBJECT = {\n    description: \"This Object indicates the Parser is during Recording Phase\"\n};\nObject.freeze(RECORDING_NULL_OBJECT);\nvar HANDLE_SEPARATOR = true;\nvar MAX_METHOD_IDX = Math.pow(2, keys_1.BITS_FOR_OCCURRENCE_IDX) - 1;\nvar RFT = tokens_public_1.createToken({ name: \"RECORDING_PHASE_TOKEN\", pattern: lexer_public_1.Lexer.NA });\ntokens_1.augmentTokenTypes([RFT]);\nvar RECORDING_PHASE_TOKEN = tokens_public_1.createTokenInstance(RFT, \"This IToken indicates the Parser is in Recording Phase\\n\\t\" +\n    \"\" +\n    \"See: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\", \n// Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n// cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n-1, -1, -1, -1, -1, -1);\nObject.freeze(RECORDING_PHASE_TOKEN);\nvar RECORDING_PHASE_CSTNODE = {\n    name: \"This CSTNode indicates the Parser is in Recording Phase\\n\\t\" +\n        \"See: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\",\n    children: {}\n};\n/**\n * This trait handles the creation of the GAST structure for Chevrotain Grammars\n */\nvar GastRecorder = /** @class */ (function () {\n    function GastRecorder() {\n    }\n    GastRecorder.prototype.initGastRecorder = function (config) {\n        this.recordingProdStack = [];\n        this.RECORDING_PHASE = false;\n    };\n    GastRecorder.prototype.enableRecording = function () {\n        var _this = this;\n        this.RECORDING_PHASE = true;\n        this.TRACE_INIT(\"Enable Recording\", function () {\n            var _loop_1 = function (i) {\n                var idx = i > 0 ? i : \"\";\n                _this[\"CONSUME\" + idx] = function (arg1, arg2) {\n                    return this.consumeInternalRecord(arg1, i, arg2);\n                };\n                _this[\"SUBRULE\" + idx] = function (arg1, arg2) {\n                    return this.subruleInternalRecord(arg1, i, arg2);\n                };\n                _this[\"OPTION\" + idx] = function (arg1) {\n                    return this.optionInternalRecord(arg1, i);\n                };\n                _this[\"OR\" + idx] = function (arg1) {\n                    return this.orInternalRecord(arg1, i);\n                };\n                _this[\"MANY\" + idx] = function (arg1) {\n                    this.manyInternalRecord(i, arg1);\n                };\n                _this[\"MANY_SEP\" + idx] = function (arg1) {\n                    this.manySepFirstInternalRecord(i, arg1);\n                };\n                _this[\"AT_LEAST_ONE\" + idx] = function (arg1) {\n                    this.atLeastOneInternalRecord(i, arg1);\n                };\n                _this[\"AT_LEAST_ONE_SEP\" + idx] = function (arg1) {\n                    this.atLeastOneSepFirstInternalRecord(i, arg1);\n                };\n            };\n            /**\n             * Warning Dark Voodoo Magic upcoming!\n             * We are \"replacing\" the public parsing DSL methods API\n             * With **new** alternative implementations on the Parser **instance**\n             *\n             * So far this is the only way I've found to avoid performance regressions during parsing time.\n             * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n             *   implementations directly instead.\n             */\n            for (var i = 0; i < 10; i++) {\n                _loop_1(i);\n            }\n            // DSL methods with the idx(suffix) as an argument\n            _this[\"consume\"] = function (idx, arg1, arg2) {\n                return this.consumeInternalRecord(arg1, idx, arg2);\n            };\n            _this[\"subrule\"] = function (idx, arg1, arg2) {\n                return this.subruleInternalRecord(arg1, idx, arg2);\n            };\n            _this[\"option\"] = function (idx, arg1) {\n                return this.optionInternalRecord(arg1, idx);\n            };\n            _this[\"or\"] = function (idx, arg1) {\n                return this.orInternalRecord(arg1, idx);\n            };\n            _this[\"many\"] = function (idx, arg1) {\n                this.manyInternalRecord(idx, arg1);\n            };\n            _this[\"atLeastOne\"] = function (idx, arg1) {\n                this.atLeastOneInternalRecord(idx, arg1);\n            };\n            _this.ACTION = _this.ACTION_RECORD;\n            _this.BACKTRACK = _this.BACKTRACK_RECORD;\n            _this.LA = _this.LA_RECORD;\n        });\n    };\n    GastRecorder.prototype.disableRecording = function () {\n        var _this = this;\n        this.RECORDING_PHASE = false;\n        // By deleting these **instance** properties, any future invocation\n        // will be deferred to the original methods on the **prototype** object\n        // This seems to get rid of any incorrect optimizations that V8 may\n        // do during the recording phase.\n        this.TRACE_INIT(\"Deleting Recording methods\", function () {\n            for (var i = 0; i < 10; i++) {\n                var idx = i > 0 ? i : \"\";\n                delete _this[\"CONSUME\" + idx];\n                delete _this[\"SUBRULE\" + idx];\n                delete _this[\"OPTION\" + idx];\n                delete _this[\"OR\" + idx];\n                delete _this[\"MANY\" + idx];\n                delete _this[\"MANY_SEP\" + idx];\n                delete _this[\"AT_LEAST_ONE\" + idx];\n                delete _this[\"AT_LEAST_ONE_SEP\" + idx];\n            }\n            delete _this[\"consume\"];\n            delete _this[\"subrule\"];\n            delete _this[\"option\"];\n            delete _this[\"or\"];\n            delete _this[\"many\"];\n            delete _this[\"atLeastOne\"];\n            delete _this.ACTION;\n            delete _this.BACKTRACK;\n            delete _this.LA;\n        });\n    };\n    // TODO: is there any way to use this method to check no\n    //   Parser methods are called inside an ACTION?\n    //   Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n    GastRecorder.prototype.ACTION_RECORD = function (impl) {\n        // NO-OP during recording\n        return;\n    };\n    // Executing backtracking logic will break our recording logic assumptions\n    GastRecorder.prototype.BACKTRACK_RECORD = function (grammarRule, args) {\n        return function () { return true; };\n    };\n    // LA is part of the official API and may be used for custom lookahead logic\n    // by end users who may forget to wrap it in ACTION or inside a GATE\n    GastRecorder.prototype.LA_RECORD = function (howMuch) {\n        // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n        // On LA return EOF at the end of the input so an infinite loop may occur.\n        return parser_1.END_OF_FILE;\n    };\n    GastRecorder.prototype.topLevelRuleRecord = function (name, def) {\n        try {\n            var newTopLevelRule = new gast_public_1.Rule({ definition: [], name: name });\n            newTopLevelRule.name = name;\n            this.recordingProdStack.push(newTopLevelRule);\n            def.call(this);\n            this.recordingProdStack.pop();\n            return newTopLevelRule;\n        }\n        catch (originalError) {\n            if (originalError.KNOWN_RECORDER_ERROR !== true) {\n                try {\n                    originalError.message =\n                        originalError.message +\n                            '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n                            \"https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording\";\n                }\n                catch (mutabilityError) {\n                    // We may not be able to modify the original error object\n                    throw originalError;\n                }\n            }\n            throw originalError;\n        }\n    };\n    // Implementation of parsing DSL\n    GastRecorder.prototype.optionInternalRecord = function (actionORMethodDef, occurrence) {\n        return recordProd.call(this, gast_public_1.Option, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.atLeastOneInternalRecord = function (occurrence, actionORMethodDef) {\n        recordProd.call(this, gast_public_1.RepetitionMandatory, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.atLeastOneSepFirstInternalRecord = function (occurrence, options) {\n        recordProd.call(this, gast_public_1.RepetitionMandatoryWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n    };\n    GastRecorder.prototype.manyInternalRecord = function (occurrence, actionORMethodDef) {\n        recordProd.call(this, gast_public_1.Repetition, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.manySepFirstInternalRecord = function (occurrence, options) {\n        recordProd.call(this, gast_public_1.RepetitionWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n    };\n    GastRecorder.prototype.orInternalRecord = function (altsOrOpts, occurrence) {\n        return recordOrProd.call(this, altsOrOpts, occurrence);\n    };\n    GastRecorder.prototype.subruleInternalRecord = function (ruleToCall, occurrence, options) {\n        assertMethodIdxIsValid(occurrence);\n        if (!ruleToCall || utils_1.has(ruleToCall, \"ruleName\") === false) {\n            var error = new Error(\"<SUBRULE\" + getIdxSuffix(occurrence) + \"> argument is invalid\" +\n                (\" expecting a Parser method reference but got: <\" + JSON.stringify(ruleToCall) + \">\") +\n                (\"\\n inside top level rule: <\" + this.recordingProdStack[0].name + \">\"));\n            error.KNOWN_RECORDER_ERROR = true;\n            throw error;\n        }\n        var prevProd = utils_1.peek(this.recordingProdStack);\n        var ruleName = ruleToCall[\"ruleName\"];\n        var newNoneTerminal = new gast_public_1.NonTerminal({\n            idx: occurrence,\n            nonTerminalName: ruleName,\n            // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n            referencedRule: undefined\n        });\n        prevProd.definition.push(newNoneTerminal);\n        return this.outputCst\n            ? RECORDING_PHASE_CSTNODE\n            : RECORDING_NULL_OBJECT;\n    };\n    GastRecorder.prototype.consumeInternalRecord = function (tokType, occurrence, options) {\n        assertMethodIdxIsValid(occurrence);\n        if (!tokens_1.hasShortKeyProperty(tokType)) {\n            var error = new Error(\"<CONSUME\" + getIdxSuffix(occurrence) + \"> argument is invalid\" +\n                (\" expecting a TokenType reference but got: <\" + JSON.stringify(tokType) + \">\") +\n                (\"\\n inside top level rule: <\" + this.recordingProdStack[0].name + \">\"));\n            error.KNOWN_RECORDER_ERROR = true;\n            throw error;\n        }\n        var prevProd = utils_1.peek(this.recordingProdStack);\n        var newNoneTerminal = new gast_public_1.Terminal({\n            idx: occurrence,\n            terminalType: tokType\n        });\n        prevProd.definition.push(newNoneTerminal);\n        return RECORDING_PHASE_TOKEN;\n    };\n    return GastRecorder;\n}());\nexports.GastRecorder = GastRecorder;\nfunction recordProd(prodConstructor, mainProdArg, occurrence, handleSep) {\n    if (handleSep === void 0) { handleSep = false; }\n    assertMethodIdxIsValid(occurrence);\n    var prevProd = utils_1.peek(this.recordingProdStack);\n    var grammarAction = utils_1.isFunction(mainProdArg)\n        ? mainProdArg\n        : mainProdArg.DEF;\n    var newProd = new prodConstructor({ definition: [], idx: occurrence });\n    if (utils_1.has(mainProdArg, \"NAME\")) {\n        newProd.name = mainProdArg.NAME;\n    }\n    if (handleSep) {\n        newProd.separator = mainProdArg.SEP;\n    }\n    if (utils_1.has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n        newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n    }\n    this.recordingProdStack.push(newProd);\n    grammarAction.call(this);\n    prevProd.definition.push(newProd);\n    this.recordingProdStack.pop();\n    return RECORDING_NULL_OBJECT;\n}\nfunction recordOrProd(mainProdArg, occurrence) {\n    var _this = this;\n    assertMethodIdxIsValid(occurrence);\n    var prevProd = utils_1.peek(this.recordingProdStack);\n    // Only an array of alternatives\n    var hasOptions = utils_1.isArray(mainProdArg) === false;\n    var alts = hasOptions === false ? mainProdArg : mainProdArg.DEF;\n    var newOrProd = new gast_public_1.Alternation({\n        definition: [],\n        idx: occurrence,\n        ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true\n    });\n    if (utils_1.has(mainProdArg, \"NAME\")) {\n        newOrProd.name = mainProdArg.NAME;\n    }\n    if (utils_1.has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n        newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n    }\n    var hasPredicates = utils_1.some(alts, function (currAlt) { return utils_1.isFunction(currAlt.GATE); });\n    newOrProd.hasPredicates = hasPredicates;\n    prevProd.definition.push(newOrProd);\n    utils_1.forEach(alts, function (currAlt) {\n        var currAltFlat = new gast_public_1.Flat({ definition: [] });\n        newOrProd.definition.push(currAltFlat);\n        if (utils_1.has(currAlt, \"NAME\")) {\n            currAltFlat.name = currAlt.NAME;\n        }\n        if (utils_1.has(currAlt, \"IGNORE_AMBIGUITIES\")) {\n            currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES;\n        }\n        // **implicit** ignoreAmbiguities due to usage of gate\n        else if (utils_1.has(currAlt, \"GATE\")) {\n            currAltFlat.ignoreAmbiguities = true;\n        }\n        _this.recordingProdStack.push(currAltFlat);\n        currAlt.ALT.call(_this);\n        _this.recordingProdStack.pop();\n    });\n    return RECORDING_NULL_OBJECT;\n}\nfunction getIdxSuffix(idx) {\n    return idx === 0 ? \"\" : \"\" + idx;\n}\nfunction assertMethodIdxIsValid(idx) {\n    if (idx < 0 || idx > MAX_METHOD_IDX) {\n        var error = new Error(\n        // The stack trace will contain all the needed details\n        \"Invalid DSL Method idx value: <\" + idx + \">\\n\\t\" +\n            (\"Idx value must be a none negative value smaller than \" + (MAX_METHOD_IDX +\n                1)));\n        error.KNOWN_RECORDER_ERROR = true;\n        throw error;\n    }\n}\n//# sourceMappingURL=gast_recorder.js.map\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar PerformanceTracer = /** @class */ (function () {\n    function PerformanceTracer() {\n    }\n    PerformanceTracer.prototype.initPerformanceTracer = function (config) {\n        if (utils_1.has(config, \"traceInitPerf\")) {\n            var userTraceInitPerf = config.traceInitPerf;\n            var traceIsNumber = typeof userTraceInitPerf === \"number\";\n            this.traceInitMaxIdent = traceIsNumber\n                ? userTraceInitPerf\n                : Infinity;\n            this.traceInitPerf = traceIsNumber\n                ? userTraceInitPerf > 0\n                : userTraceInitPerf;\n        }\n        else {\n            this.traceInitMaxIdent = 0;\n            this.traceInitPerf = parser_1.DEFAULT_PARSER_CONFIG.traceInitPerf;\n        }\n        this.traceInitIndent = -1;\n    };\n    PerformanceTracer.prototype.TRACE_INIT = function (phaseDesc, phaseImpl) {\n        // No need to optimize this using NOOP pattern because\n        // It is not called in a hot spot...\n        if (this.traceInitPerf === true) {\n            this.traceInitIndent++;\n            var indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                console.log(indent + \"--> <\" + phaseDesc + \">\");\n            }\n            var _a = utils_1.timer(phaseImpl), time = _a.time, value = _a.value;\n            /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n            var traceMethod = time > 10 ? console.warn : console.log;\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                traceMethod(indent + \"<-- <\" + phaseDesc + \"> time: \" + time + \"ms\");\n            }\n            this.traceInitIndent--;\n            return value;\n        }\n        else {\n            return phaseImpl();\n        }\n    };\n    return PerformanceTracer;\n}());\nexports.PerformanceTracer = PerformanceTracer;\n//# sourceMappingURL=perf_tracer.js.map\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar version_1 = __webpack_require__(19);\nfunction createSyntaxDiagramsCode(grammar, _a) {\n    var _b = _a === void 0 ? {} : _a, _c = _b.resourceBase, resourceBase = _c === void 0 ? \"https://unpkg.com/chevrotain@\" + version_1.VERSION + \"/diagrams/\" : _c, _d = _b.css, css = _d === void 0 ? \"https://unpkg.com/chevrotain@\" + version_1.VERSION + \"/diagrams/diagrams.css\" : _d;\n    var header = \"\\n<!-- This is a generated file -->\\n<!DOCTYPE html>\\n<meta charset=\\\"utf-8\\\">\\n<style>\\n  body {\\n    background-color: hsl(30, 20%, 95%)\\n  }\\n</style>\\n\\n\";\n    var cssHtml = \"\\n<link rel='stylesheet' href='\" + css + \"'>\\n\";\n    var scripts = \"\\n<script src='\" + resourceBase + \"vendor/railroad-diagrams.js'></script>\\n<script src='\" + resourceBase + \"src/diagrams_builder.js'></script>\\n<script src='\" + resourceBase + \"src/diagrams_behavior.js'></script>\\n<script src='\" + resourceBase + \"src/main.js'></script>\\n\";\n    var diagramsDiv = \"\\n<div id=\\\"diagrams\\\" align=\\\"center\\\"></div>    \\n\";\n    var serializedGrammar = \"\\n<script>\\n    window.serializedGrammar = \" + JSON.stringify(grammar, null, \"  \") + \";\\n</script>\\n\";\n    var initLogic = \"\\n<script>\\n    var diagramsDiv = document.getElementById(\\\"diagrams\\\");\\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\\n</script>\\n\";\n    return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar generate_1 = __webpack_require__(42);\nfunction generateParserFactory(options) {\n    var wrapperText = generate_1.genWrapperFunction({\n        name: options.name,\n        rules: options.rules\n    });\n    var constructorWrapper = new Function(\"tokenVocabulary\", \"config\", \"chevrotain\", wrapperText);\n    return function (config) {\n        return constructorWrapper(options.tokenVocabulary, config, \n        // TODO: check how the require is transpiled/webpacked\n        __webpack_require__(18));\n    };\n}\nexports.generateParserFactory = generateParserFactory;\nfunction generateParserModule(options) {\n    return generate_1.genUmdModule({ name: options.name, rules: options.rules });\n}\nexports.generateParserModule = generateParserModule;\n//# sourceMappingURL=generate_public.js.map\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\n/**\n * Missing features\n * 1. Rule arguments\n * 2. Gates\n * 3. embedded actions\n */\nvar NL = \"\\n\";\nfunction genUmdModule(options) {\n    return \"\\n(function (root, factory) {\\n    if (typeof define === 'function' && define.amd) {\\n        // AMD. Register as an anonymous module.\\n        define(['chevrotain'], factory);\\n    } else if (typeof module === 'object' && module.exports) {\\n        // Node. Does not work with strict CommonJS, but\\n        // only CommonJS-like environments that support module.exports,\\n        // like Node.\\n        module.exports = factory(require('chevrotain'));\\n    } else {\\n        // Browser globals (root is window)\\n        root.returnExports = factory(root.b);\\n    }\\n}(typeof self !== 'undefined' ? self : this, function (chevrotain) {\\n\\n\" + genClass(options) + \"\\n    \\nreturn {\\n    \" + options.name + \": \" + options.name + \" \\n}\\n}));\\n\";\n}\nexports.genUmdModule = genUmdModule;\nfunction genWrapperFunction(options) {\n    return \"    \\n\" + genClass(options) + \"\\nreturn new \" + options.name + \"(tokenVocabulary, config)    \\n\";\n}\nexports.genWrapperFunction = genWrapperFunction;\nfunction genClass(options) {\n    // TODO: how to pass the token vocabulary? Constructor? other?\n    var result = \"\\nfunction \" + options.name + \"(tokenVocabulary, config) {\\n    // invoke super constructor\\n    // No support for embedded actions currently, so we can 'hardcode'\\n    // The use of CstParser.\\n    chevrotain.CstParser.call(this, tokenVocabulary, config)\\n\\n    const $ = this\\n\\n    \" + genAllRules(options.rules) + \"\\n\\n    // very important to call this after all the rules have been defined.\\n    // otherwise the parser may not work correctly as it will lack information\\n    // derived during the self analysis phase.\\n    this.performSelfAnalysis(this)\\n}\\n\\n// inheritance as implemented in javascript in the previous decade... :(\\n\" + options.name + \".prototype = Object.create(chevrotain.CstParser.prototype)\\n\" + options.name + \".prototype.constructor = \" + options.name + \"    \\n    \";\n    return result;\n}\nexports.genClass = genClass;\nfunction genAllRules(rules) {\n    var rulesText = utils_1.map(rules, function (currRule) {\n        return genRule(currRule, 1);\n    });\n    return rulesText.join(\"\\n\");\n}\nexports.genAllRules = genAllRules;\nfunction genRule(prod, n) {\n    var result = indent(n, \"$.RULE(\\\"\" + prod.name + \"\\\", function() {\") + NL;\n    result += genDefinition(prod.definition, n + 1);\n    result += indent(n + 1, \"})\") + NL;\n    return result;\n}\nexports.genRule = genRule;\nfunction genTerminal(prod, n) {\n    var name = prod.terminalType.name;\n    // TODO: potential performance optimization, avoid tokenMap Dictionary access\n    return indent(n, \"$.CONSUME\" + prod.idx + \"(this.tokensMap.\" + name + \")\" + NL);\n}\nexports.genTerminal = genTerminal;\nfunction genNonTerminal(prod, n) {\n    return indent(n, \"$.SUBRULE\" + prod.idx + \"($.\" + prod.nonTerminalName + \")\" + NL);\n}\nexports.genNonTerminal = genNonTerminal;\nfunction genAlternation(prod, n) {\n    var result = indent(n, \"$.OR\" + prod.idx + \"([\") + NL;\n    var alts = utils_1.map(prod.definition, function (altDef) { return genSingleAlt(altDef, n + 1); });\n    result += alts.join(\",\" + NL);\n    result += NL + indent(n, \"])\" + NL);\n    return result;\n}\nexports.genAlternation = genAlternation;\nfunction genSingleAlt(prod, n) {\n    var result = indent(n, \"{\") + NL;\n    if (prod.name) {\n        result += indent(n + 1, \"NAME: \\\"\" + prod.name + \"\\\",\") + NL;\n    }\n    result += indent(n + 1, \"ALT: function() {\") + NL;\n    result += genDefinition(prod.definition, n + 1);\n    result += indent(n + 1, \"}\") + NL;\n    result += indent(n, \"}\");\n    return result;\n}\nexports.genSingleAlt = genSingleAlt;\nfunction genProd(prod, n) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        return genNonTerminal(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Option) {\n        return genDSLRule(\"OPTION\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return genDSLRule(\"AT_LEAST_ONE\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return genDSLRule(\"AT_LEAST_ONE_SEP\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return genDSLRule(\"MANY_SEP\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return genDSLRule(\"MANY\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return genAlternation(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return genTerminal(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Flat) {\n        return genDefinition(prod.definition, n);\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nfunction genDSLRule(dslName, prod, n) {\n    var result = indent(n, \"$.\" + (dslName + prod.idx) + \"(\");\n    if (prod.name || prod.separator) {\n        result += \"{\" + NL;\n        if (prod.name) {\n            result += indent(n + 1, \"NAME: \\\"\" + prod.name + \"\\\"\") + \",\" + NL;\n        }\n        if (prod.separator) {\n            result +=\n                indent(n + 1, \"SEP: this.tokensMap.\" + prod.separator.name) +\n                    \",\" +\n                    NL;\n        }\n        result += \"DEF: \" + genDefFunction(prod.definition, n + 2) + NL;\n        result += indent(n, \"}\") + NL;\n    }\n    else {\n        result += genDefFunction(prod.definition, n + 1);\n    }\n    result += indent(n, \")\") + NL;\n    return result;\n}\nfunction genDefFunction(definition, n) {\n    var def = \"function() {\" + NL;\n    def += genDefinition(definition, n);\n    def += indent(n, \"}\") + NL;\n    return def;\n}\nfunction genDefinition(def, n) {\n    var result = \"\";\n    utils_1.forEach(def, function (prod) {\n        result += genProd(prod, n + 1);\n    });\n    return result;\n}\nfunction indent(howMuch, text) {\n    var spaces = Array(howMuch * 4 + 1).join(\" \");\n    return spaces + text;\n}\n//# sourceMappingURL=generate.js.map\n\n/***/ })\n/******/ ]);\n});"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/chevrotaintyping.d.ts",
    "content": "export as namespace chevrotain\n\nexport declare const VERSION: string\n\n/**\n * This class does not actually exists nor is exposed at runtime.\n * This is just a helper to avoid duplications in the Type Definitions\n * Of `CstParser` and `EmbeddedActionsParser`\n */\ndeclare abstract class BaseParser {\n    /**\n     * This must be called at the end of a Parser constructor.\n     * See: http://sap.github.io/chevrotain/docs/tutorial/step2_parsing.html#under-the-hood\n     */\n    protected performSelfAnalysis(): void\n\n    /**\n     * It is recommended to reuse the same Parser instance\n     * by passing an empty array to the input argument\n     * and only later setting the input by using the input property.\n     * See: http://sap.github.io/chevrotain/docs/FAQ.html#major-performance-benefits\n     *\n     * @param tokenVocabulary - A data structure containing all the Tokens used by the Parser.\n     * @param config - The Parser's configuration.\n     */\n    constructor(tokenVocabulary: TokenVocabulary, config?: IParserConfig)\n\n    errors: IRecognitionException[]\n\n    /**\n     * Flag indicating the Parser is at the recording phase.\n     * Can be used to implement methods similar to {@link BaseParser.ACTION}\n     * Or any other logic to requires knowledge of the recording phase.\n     * See:\n     *   - https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording\n     * to learn more on the recording phase and how Chevrotain works.\n     */\n    RECORDING_PHASE: boolean\n\n    /**\n     * Resets the parser state, should be overridden for custom parsers which \"carry\" additional state.\n     * When overriding, remember to also invoke the super implementation!\n     */\n    reset(): void\n\n    getBaseCstVisitorConstructor(): {\n        new (...args: any[]): ICstVisitor<any, any>\n    }\n\n    getBaseCstVisitorConstructorWithDefaults(): {\n        new (...args: any[]): ICstVisitor<any, any>\n    }\n\n    getGAstProductions(): Record<string, Rule>\n\n    getSerializedGastProductions(): ISerializedGast[]\n\n    /**\n     * @param startRuleName\n     * @param precedingInput - The token vector up to (not including) the content assist point\n     */\n    computeContentAssist(\n        startRuleName: string,\n        precedingInput: IToken[]\n    ): ISyntacticContentAssistPath[]\n\n    /**\n     * @param grammarRule - The rule to try and parse in backtracking mode.\n     * @param args - argumens to be passed to the grammar rule execution\n     *\n     * @return a lookahead function that will try to parse the given grammarRule and will return true if succeed.\n     */\n    protected BACKTRACK<T>(\n        grammarRule: (...args: any[]) => T,\n        args?: any[]\n    ): () => boolean\n\n    /**\n     * The Semantic Actions wrapper.\n     * Should be used to wrap semantic actions that either:\n     * - May fail when executing in \"recording phase\".\n     * - Have global side effects that should be avoided during \"recording phase\".\n     *\n     * For more information see:\n     *   - https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording\n     */\n    protected ACTION<T>(impl: () => T): T\n\n    /**\n     * Like `CONSUME` with the numerical suffix as a parameter, e.g:\n     * consume(0, X) === CONSUME(X)\n     * consume(1, X) === CONSUME1(X)\n     * consume(2, X) === CONSUME2(X)\n     * ...\n     * @see CONSUME\n     */\n    protected consume(\n        idx: number,\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * Like `OPTION` with the numerical suffix as a parameter, e.g:\n     * option(0, X) === OPTION(X)\n     * option(1, X) === OPTION1(X)\n     * option(2, X) === OPTION2(X)\n     * ...\n     * @see SUBRULE\n     */\n    protected option<OUT>(\n        idx: number,\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * Like `OR` with the numerical suffix as a parameter, e.g:\n     * or(0, X) === OR(X)\n     * or(1, X) === OR1(X)\n     * or(2, X) === OR2(X)\n     * ...\n     * @see OR\n     */\n    protected or(idx: number, altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * Like `MANY` with the numerical suffix as a parameter, e.g:\n     * many(0, X) === MANY(X)\n     * many(1, X) === MANY1(X)\n     * many(2, X) === MANY2(X)\n     * ...\n     * @see MANY\n     */\n    protected many(\n        idx: number,\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * Like `AT_LEAST_ONE` with the numerical suffix as a parameter, e.g:\n     * atLeastOne(0, X) === AT_LEAST_ONE(X)\n     * atLeastOne(1, X) === AT_LEAST_ONE1(X)\n     * atLeastOne(2, X) === AT_LEAST_ONE2(X)\n     * ...\n     * @see AT_LEAST_ONE\n     */\n    protected atLeastOne(\n        idx: number,\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     *\n     * A Parsing DSL method use to consume a single Token.\n     * In EBNF terms this is equivalent to a Terminal.\n     *\n     * A Token will be consumed, IFF the next token in the token vector matches <tokType>.\n     * otherwise the parser may attempt to perform error recovery (if enabled).\n     *\n     * The index in the method name indicates the unique occurrence of a terminal consumption\n     * inside a the top level rule. What this means is that if a terminal appears\n     * more than once in a single rule, each appearance must have a **different** index.\n     *\n     * For example:\n     * ```\n     *   this.RULE(\"qualifiedName\", () => {\n     *   this.CONSUME1(Identifier);\n     *     this.MANY(() => {\n     *       this.CONSUME1(Dot);\n     *       // here we use CONSUME2 because the terminal\n     *       // 'Identifier' has already appeared previously in the\n     *       // the rule 'parseQualifiedName'\n     *       this.CONSUME2(Identifier);\n     *     });\n     *   })\n     * ```\n     *\n     * - See more details on the [unique suffixes requirement](http://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES).\n     *\n     * @param tokType - The Type of the token to be consumed.\n     * @param options - optional properties to modify the behavior of CONSUME.\n     */\n    protected CONSUME(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME1(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME2(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME3(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME4(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME5(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME6(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME7(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME8(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * @see CONSUME\n     * @hidden\n     */\n    protected CONSUME9(\n        tokType: TokenType,\n        options?: ConsumeMethodOpts\n    ): IToken\n\n    /**\n     * Parsing DSL Method that Indicates an Optional production.\n     * in EBNF notation this is equivalent to: \"[...]\".\n     *\n     * Note that there are two syntax forms:\n     * - Passing the grammar action directly:\n     *   ```\n     *     this.OPTION(() => {\n     *       this.CONSUME(Digit)}\n     *     );\n     *   ```\n     *\n     * - using an \"options\" object:\n     *   ```\n     *     this.OPTION({\n     *       GATE:predicateFunc,\n     *       DEF: () => {\n     *         this.CONSUME(Digit)\n     *     }});\n     *   ```\n     *\n     * The optional 'GATE' property in \"options\" object form can be used to add constraints\n     * to invoking the grammar action.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the optional production in it's top rule.\n     *\n     * @param  actionORMethodDef - The grammar action to optionally invoke once\n     *                             or an \"OPTIONS\" object describing the grammar action and optional properties.\n     */\n    // TODO: return `OUT | undefined` explicitly\n    protected OPTION<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION1<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION2<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION3<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION4<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION5<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION6<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION7<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION8<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * @see OPTION\n     * @hidden\n     */\n    protected OPTION9<OUT>(\n        actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>\n    ): OUT\n\n    /**\n     * Parsing DSL method that indicates a choice between a set of alternatives must be made.\n     * This is equivalent to an EBNF alternation (A | B | C | D ...), except\n     * that the alternatives are ordered like in a PEG grammar.\n     * This means that the **first** matching alternative is always chosen.\n     *\n     * There are several forms for the inner alternatives array:\n     *\n     * - Passing alternatives array directly:\n     *   ```\n     *     this.OR([\n     *       { ALT:() => { this.CONSUME(One) }},\n     *       { ALT:() => { this.CONSUME(Two) }},\n     *       { ALT:() => { this.CONSUME(Three) }}\n     *     ])\n     *   ```\n     *\n     * - Passing alternative array directly with predicates (GATE):\n     *   ```\n     *     this.OR([\n     *       { GATE: predicateFunc1, ALT:() => { this.CONSUME(One) }},\n     *       { GATE: predicateFuncX, ALT:() => { this.CONSUME(Two) }},\n     *       { GATE: predicateFuncX, ALT:() => { this.CONSUME(Three) }}\n     *     ])\n     *   ```\n     *\n     * - These syntax forms can also be mixed:\n     *   ```\n     *     this.OR([\n     *       {\n     *         GATE: predicateFunc1,\n     *         ALT:() => { this.CONSUME(One) }\n     *       },\n     *       { ALT:() => { this.CONSUME(Two) }},\n     *       { ALT:() => { this.CONSUME(Three) }}\n     *     ])\n     *   ```\n     *\n     * - Additionally an \"options\" object may be used:\n     *   ```\n     *     this.OR({\n     *       DEF:[\n     *         { ALT:() => { this.CONSUME(One) }},\n     *         { ALT:() => { this.CONSUME(Two) }},\n     *         { ALT:() => { this.CONSUME(Three) }}\n     *       ],\n     *       // OPTIONAL property\n     *       ERR_MSG: \"A Number\"\n     *     })\n     *   ```\n     *\n     * The 'predicateFuncX' in the long form can be used to add constraints to choosing the alternative.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the alternation production in it's top rule.\n     *\n     * @param altsOrOpts - A set of alternatives or an \"OPTIONS\" object describing the alternatives and optional properties.\n     *\n     * @returns The result of invoking the chosen alternative.\n     */\n    protected OR(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR1(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR2(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR3(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR4(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR5(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR6(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR7(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR8(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * @see OR\n     * @hidden\n     */\n    protected OR9(altsOrOpts: IOrAlt[] | OrMethodOpts): any\n\n    /**\n     * Parsing DSL method, that indicates a repetition of zero or more.\n     * This is equivalent to EBNF repetition {...}.\n     *\n     * Note that there are two syntax forms:\n     * - Passing the grammar action directly:\n     *   ```\n     *     this.MANY(() => {\n     *       this.CONSUME(Comma)\n     *       this.CONSUME(Digit)\n     *      })\n     *   ```\n     *\n     * - using an \"options\" object:\n     *   ```\n     *     this.MANY({\n     *       GATE: predicateFunc,\n     *       DEF: () => {\n     *              this.CONSUME(Comma)\n     *              this.CONSUME(Digit)\n     *            }\n     *     });\n     *   ```\n     *\n     * The optional 'GATE' property in \"options\" object form can be used to add constraints\n     * to invoking the grammar action.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the repetition production in it's top rule.\n     *\n     * @param actionORMethodDef - The grammar action to optionally invoke multiple times\n     *                             or an \"OPTIONS\" object describing the grammar action and optional properties.\n     *\n     */\n    protected MANY(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY1(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY2(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY3(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY4(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY5(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY6(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY7(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY8(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * @see MANY\n     * @hidden\n     */\n    protected MANY9(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>\n    ): void\n\n    /**\n     * Parsing DSL method, that indicates a repetition of zero or more with a separator\n     * Token between the repetitions.\n     *\n     * Example:\n     *\n     * ```\n     *     this.MANY_SEP({\n     *         SEP:Comma,\n     *         DEF: () => {\n     *             this.CONSUME(Number};\n     *             // ...\n     *         })\n     * ```\n     *\n     * Note that because this DSL method always requires more than one argument the options object is always required\n     * and it is not possible to use a shorter form like in the MANY DSL method.\n     *\n     * Note that for the purposes of deciding on whether or not another iteration exists\n     * Only a single Token is examined (The separator). Therefore if the grammar being implemented is\n     * so \"crazy\" to require multiple tokens to identify an item separator please use the more basic DSL methods\n     * to implement it.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the repetition production in it's top rule.\n     *\n     * @param options - An object defining the grammar of each iteration and the separator between iterations\n     *\n     */\n    protected MANY_SEP(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP1(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP2(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP3(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP4(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP5(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP6(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP7(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP8(options: ManySepMethodOpts<any>): void\n\n    /**\n     * @see MANY_SEP\n     * @hidden\n     */\n    protected MANY_SEP9(options: ManySepMethodOpts<any>): void\n\n    /**\n     * Convenience method, same as MANY but the repetition is of one or more.\n     * failing to match at least one repetition will result in a parsing error and\n     * cause a parsing error.\n     *\n     * @see MANY\n     *\n     * @param actionORMethodDef  - The grammar action to optionally invoke multiple times\n     *                             or an \"OPTIONS\" object describing the grammar action and optional properties.\n     *\n     */\n    protected AT_LEAST_ONE(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE1(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE2(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE3(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE4(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE5(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE6(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE7(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE8(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE\n     * @hidden\n     */\n    protected AT_LEAST_ONE9(\n        actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>\n    ): void\n\n    /**\n     * Convenience method, same as MANY_SEP but the repetition is of one or more.\n     * failing to match at least one repetition will result in a parsing error and\n     * cause the parser to attempt error recovery.\n     *\n     * Note that an additional optional property ERR_MSG can be used to provide custom error messages.\n     *\n     * @see MANY_SEP\n     *\n     * @param options - An object defining the grammar of each iteration and the separator between iterations\n     *\n     * @return {ISeparatedIterationResult<OUT>}\n     */\n    protected AT_LEAST_ONE_SEP(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP1(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP2(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP3(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP4(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP5(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP6(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP7(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP8(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * @see AT_LEAST_ONE_SEP\n     * @hidden\n     */\n    protected AT_LEAST_ONE_SEP9(\n        options: AtLeastOneSepMethodOpts<any>\n    ): void\n\n    /**\n     * Returns an \"imaginary\" Token to insert when Single Token Insertion is done\n     * Override this if you require special behavior in your grammar.\n     * For example if an IntegerToken is required provide one with the image '0' so it would be valid syntactically.\n     */\n    protected getTokenToInsert(tokType: TokenType): IToken\n\n    /**\n     * By default all tokens type may be inserted. This behavior may be overridden in inheriting Recognizers\n     * for example: One may decide that only punctuation tokens may be inserted automatically as they have no additional\n     * semantic value. (A mandatory semicolon has no additional semantic meaning, but an Integer may have additional meaning\n     * depending on its int value and context (Inserting an integer 0 in cardinality: \"[1..]\" will cause semantic issues\n     * as the max of the cardinality will be greater than the min value (and this is a false error!).\n     */\n    protected canTokenTypeBeInsertedInRecovery(\n        tokType: TokenType\n    ): boolean\n\n    /**\n     * @deprecated - will be removed in the future\n     */\n    protected getNextPossibleTokenTypes(\n        grammarPath: ITokenGrammarPath\n    ): TokenType[]\n\n    input: IToken[]\n\n    protected SKIP_TOKEN(): IToken\n\n    /**\n     * Look-Ahead for the Token Vector\n     * LA(1) is the next Token ahead.\n     * LA(n) is the nth Token ahead.\n     * LA(0) is the previously consumed Token.\n     *\n     * Looking beyond the end of the Token Vector or before its begining\n     * will return in an IToken of type EOF {@link EOF}.\n     * This behavior can be used to avoid infinite loops.\n     *\n     * This is often used to implement custom lookahead logic for GATES.\n     * https://sap.github.io/chevrotain/docs/features/gates.html\n     */\n    protected LA(howMuch: number): IToken\n}\n\n/**\n * @deprecated Soft deprecated, CstParser or EmbeddedActionsParser instead.\n *    - {@link CstParser}\n *    - {@link EmbeddedActionsParser}\n */\nexport declare class Parser extends BaseParser {\n    /**\n     * @deprecated use {@link Parser.performSelfAnalysis} **instance** method instead.\n     */\n    protected static performSelfAnalysis(parserInstance: Parser): void\n\n    /**\n     *\n     * @param name - The name of the rule.\n     * @param implementation - The implementation of the rule.\n     * @param [config] - The rule's optional configuration.\n     *\n     * @returns - The parsing rule which is the production implementation wrapped with the parsing logic that handles\n     *                     Parser state / error recovery&reporting/ ...\n     */\n    protected RULE<T>(\n        name: string,\n        implementation: (...implArgs: any[]) => T,\n        config?: IRuleConfig<T>\n    ): (idxInCallingRule?: number, ...args: any[]) => T | any\n\n    /**\n     * Same as {@link Parser.RULE}, but should only be used in\n     * \"extending\" grammars to override rules/productions from the super grammar.\n     * See [Parser Inheritance Example](https://github.com/SAP/chevrotain/tree/master/examples/parser/inheritance).\n     */\n    protected OVERRIDE_RULE<T>(\n        name: string,\n        impl: (...implArgs: any[]) => T,\n        config?: IRuleConfig<T>\n    ): (idxInCallingRule?: number, ...args: any[]) => T | any\n\n    protected SUBRULE<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE1<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE2<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE3<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE4<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE5<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE6<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE7<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE8<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE9<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n}\n\n/**\n * A Parser that outputs a Concrete Syntax Tree.\n * See:\n *    - https://sap.github.io/chevrotain/docs/tutorial/step3_adding_actions_root.html#alternatives\n *    - https://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html\n * For in depth docs.\n */\nexport declare class CstParser extends BaseParser {\n    // TODO: remove `outputCST` from the config options in the constructor\n    /**\n     * @deprecated use {@link Parser.performSelfAnalysis} **instance** method instead.\n     */\n    protected static performSelfAnalysis(parserInstance: Parser): void\n\n    /**\n     * Creates a Grammar Rule\n     */\n    protected RULE(\n        name: string,\n        implementation: (...implArgs: any[]) => any,\n        config?: IRuleConfig<CstNode>\n    ): (idxInCallingRule?: number, ...args: any[]) => CstNode\n\n    /**\n     * Overrides a Grammar Rule\n     * See usage example in: https://github.com/SAP/chevrotain/blob/master/examples/parser/versioning/versioning.js\n     */\n    protected OVERRIDE_RULE<T>(\n        name: string,\n        implementation: (...implArgs: any[]) => any,\n        config?: IRuleConfig<CstNode>\n    ): (idxInCallingRule?: number, ...args: any[]) => CstNode\n\n    /**\n     * Like `SUBRULE` with the numerical suffix as a parameter, e.g:\n     * subrule(0, X) === SUBRULE(X)\n     * subrule(1, X) === SUBRULE1(X)\n     * subrule(2, X) === SUBRULE2(X)\n     * ...\n     * @see SUBRULE\n     */\n    protected subrule(\n        idx: number,\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * The Parsing DSL Method is used by one rule to call another.\n     * It is equivalent to a non-Terminal in EBNF notation.\n     *\n     * This may seem redundant as it does not actually do much.\n     * However using it is **mandatory** for all sub rule invocations.\n     *\n     * Calling another rule without wrapping in SUBRULE(...)\n     * will cause errors/mistakes in the Parser's self analysis phase,\n     * which will lead to errors in error recovery/automatic lookahead calculation\n     * and any other functionality relying on the Parser's self analysis\n     * output.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the sub rule invocation in its rule.\n     *\n     */\n    protected SUBRULE(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE1(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE2(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE3(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE4(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE5(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE6(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE7(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE8(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE9(\n        ruleToCall: (idx: number) => CstNode,\n        options?: SubruleMethodOpts\n    ): CstNode\n}\n\n/**\n * A Parser that relies on end user's embedded actions to control its output.\n * For more details see:\n *   - https://sap.github.io/chevrotain/docs/tutorial/step3_adding_actions_root.html#alternatives\n *   - https://sap.github.io/chevrotain/docs/tutorial/step3b_adding_actions_embedded.html#simple-example\n */\nexport declare class EmbeddedActionsParser extends BaseParser {\n    /**\n     * @deprecated use {@link Parser.performSelfAnalysis} **instance** method instead.\n     */\n    protected static performSelfAnalysis(parserInstance: Parser): void\n\n    // TODO: remove `outputCST` from the config options in the constructor\n\n    /**\n     * Creates a Grammar Rule\n     */\n    protected RULE<T>(\n        name: string,\n        implementation: (...implArgs: any[]) => T,\n        config?: IRuleConfig<T>\n    ): (idxInCallingRule?: number, ...args: any[]) => T\n\n    /**\n     * Overrides a Grammar Rule\n     * See usage example in: https://github.com/SAP/chevrotain/blob/master/examples/parser/versioning/versioning.js\n     */\n    protected OVERRIDE_RULE<T>(\n        name: string,\n        impl: (...implArgs: any[]) => T,\n        config?: IRuleConfig<T>\n    ): (idxInCallingRule?: number, ...args: any[]) => T\n\n    /**\n     * Like `SUBRULE` with the numerical suffix as a parameter, e.g:\n     * subrule(0, X) === SUBRULE(X)\n     * subrule(1, X) === SUBRULE1(X)\n     * subrule(2, X) === SUBRULE2(X)\n     * ...\n     * @see SUBRULE\n     */\n    protected subrule<T>(\n        idx: number,\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * The Parsing DSL Method is used by one rule to call another.\n     * It is equivalent to a non-Terminal in EBNF notation.\n     *\n     * This may seem redundant as it does not actually do much.\n     * However using it is **mandatory** for all sub rule invocations.\n     *\n     * Calling another rule without wrapping in SUBRULE(...)\n     * will cause errors/mistakes in the Parser's self analysis phase,\n     * which will lead to errors in error recovery/automatic lookahead calculation\n     * and any other functionality relying on the Parser's self analysis\n     * output.\n     *\n     * As in CONSUME the index in the method name indicates the occurrence\n     * of the sub rule invocation in its rule.\n     *\n     */\n    protected SUBRULE<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE1<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE2<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE3<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE4<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE5<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE6<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE7<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE8<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n\n    /**\n     * @see SUBRULE\n     * @hidden\n     */\n    protected SUBRULE9<T>(\n        ruleToCall: (idx: number) => T,\n        options?: SubruleMethodOpts\n    ): T\n}\n\nexport declare enum ParserDefinitionErrorType {\n    INVALID_RULE_NAME = 0,\n    DUPLICATE_RULE_NAME = 1,\n    INVALID_RULE_OVERRIDE = 2,\n    DUPLICATE_PRODUCTIONS = 3,\n    UNRESOLVED_SUBRULE_REF = 4,\n    LEFT_RECURSION = 5,\n    NONE_LAST_EMPTY_ALT = 6,\n    AMBIGUOUS_ALTS = 7,\n    CONFLICT_TOKENS_RULES_NAMESPACE = 8,\n    INVALID_TOKEN_NAME = 9,\n    INVALID_NESTED_RULE_NAME = 10,\n    DUPLICATE_NESTED_NAME = 11,\n    NO_NON_EMPTY_LOOKAHEAD = 12,\n    AMBIGUOUS_PREFIX_ALTS = 13,\n    TOO_MANY_ALTS = 14\n}\n\nexport interface ILexerDefinitionError {\n    message: string\n    type: LexerDefinitionErrorType\n    tokenTypes?: TokenType[]\n}\n\nexport declare class Lexer {\n    static SKIPPED: string\n\n    /**\n     * A Constant to mark \"abstract\" TokenTypes that are used\n     * purely as token categories.\n     * See: {@link createToken.categories}\n     */\n    static NA: RegExp\n    lexerDefinitionErrors: ILexerDefinitionError[]\n\n    /**\n     * @param lexerDefinition -\n     *  Structure composed of Tokens Types this lexer will identify.\n     *\n     *  In the simple case the structure is an array of TokenTypes.\n     *  In the case of {@link IMultiModeLexerDefinition} the structure is an object with two properties:\n     *    1. a \"modes\" property where each value is an array of TokenTypes.\n     *    2. a \"defaultMode\" property specifying the initial lexer mode.\n     *\n     *  for example:\n     *\n     *  ```\n     *    {\n     *        modes : {\n     *          modeX : [Token1, Token2],\n     *          modeY : [Token3, Token4]\n     *        },\n     *\n     *        defaultMode : \"modeY\"\n     *    }\n     *  ```\n     *\n     *  A lexer with {@link MultiModesDefinition} is simply multiple Lexers where only one Lexer(mode) can be active at the same time.\n     *  This is useful for lexing languages where there are different lexing rules depending on context.\n     *\n     *  The current lexing mode is selected via a \"mode stack\".\n     *  The last (peek) value in the stack will be the current mode of the lexer.\n     *  Defining entering and exiting lexer modes is done using the \"push_mode\" and \"pop_mode\" properites\n     *  of the {@link createToken.config} parameter.\n     *\n     *  - The Lexer will match the **first** pattern that matches, Therefor the order of Token Types is significant.\n     *    For example when one pattern may match a prefix of another pattern.\n     *\n     *    Note that there are situations in which we may wish to order the longer pattern after the shorter one.\n     *    For example: [keywords vs Identifiers](https://github.com/SAP/chevrotain/tree/master/examples/lexer/keywords_vs_identifiers).\n     */\n    constructor(\n        lexerDefinition: TokenType[] | IMultiModeLexerDefinition,\n        config?: ILexerConfig\n    )\n\n    /**\n     * Will lex(Tokenize) a string.\n     * Note that this can be called repeatedly on different strings as this method\n     * does not modify the state of the Lexer.\n     *\n     * @param text - The string to lex\n     * @param [initialMode] - The initial Lexer Mode to start with, by default this will be the first mode in the lexer's\n     *                                 definition. If the lexer has no explicit modes it will be the implicit single 'default_mode' mode.\n     */\n    tokenize(text: string, initialMode?: string): ILexingResult\n}\n\nexport interface ILexingResult {\n    tokens: IToken[]\n    groups: {\n        [groupName: string]: IToken[]\n    }\n    errors: ILexingError[]\n}\n\nexport interface ILexingError {\n    offset: number\n    line: number\n    column: number\n    length: number\n    message: string\n}\n\nexport interface ILexerConfig {\n    /**\n     * An optional flag indicating that lexer definition errors\n     * should not automatically cause an error to be raised.\n     * This can be useful when wishing to indicate lexer errors in another manner\n     * than simply throwing an error (for example in an online playground).\n     */\n    deferDefinitionErrorsHandling?: boolean\n\n    /**\n     * \"full\" location information means all six combinations of /(end|start)(Line|Column|Offset)/ properties.\n     * \"onlyStart\" means that only startLine, startColumn and startOffset will be tracked\n     * \"onlyOffset\" means that only the startOffset will be tracked.\n     *\n     * The less position tracking the faster the Lexer will be and the less memory used.\n     * However the difference is not large (~10% On V8), thus reduced location tracking options should only be used\n     * in edge cases where every last ounce of performance is needed.\n     */\n    // TODO: consider renaming this to LocationTracking to align with NodeLocationTracking option on the ParserConfig.\n    positionTracking?: \"full\" | \"onlyStart\" | \"onlyOffset\"\n\n    /**\n     * A regExp defining custom line terminators.\n     * This will be used to calculate the line and column information.\n     *\n     * Note that the regExp should use the global flag, for example: /\\n/g\n     *\n     * The default is: /\\n|\\r\\n?/g\n     *\n     * But some grammars have a different definition, for example in ECMAScript:\n     * https://www.ecma-international.org/ecma-262/8.0/index.html#sec-line-terminators\n     * U+2028 and U+2029 are also treated as line terminators.\n     *\n     * In that case we would use /\\n|\\r|\\u2028|\\u2029/g\n     *\n     * Note that it is also possible to supply an optimized RegExp like implementation\n     * as only a subset of the RegExp APIs is needed, {@link ILineTerminatorsTester}\n     * for details.\n     *\n     * keep in mind that for the default pattern: /\\n|\\r\\n?/g an optimized implementation is already built-in.\n     * This means the optimization is only relevant for lexers overriding the default pattern.\n     */\n    lineTerminatorsPattern?: RegExp | ILineTerminatorsTester\n\n    /**\n     * Characters or CharCodes that represent line terminators for this lexer.\n     * This always needs to be provided when using a custom {@link ILexerConfig.lineTerminatorsPattern}.\n     * In the future this duplication may be removed or reduced.\n     */\n    lineTerminatorCharacters?: (number | string)[]\n\n    /**\n     * When true this flag will cause the Lexer to throw an Error\n     * When it is unable to perform all of its performance optimizations.\n     *\n     * In addition error messages will be printed to the console with details\n     * how to resolve the optimizations issues.\n     *\n     * Use this flag to guarantee higher lexer performance.\n     * The optimizations can boost the lexer's performance anywhere from 30%\n     * to 100%+ depending on the number of TokenTypes used.\n     */\n    ensureOptimizations?: boolean\n\n    /**\n     * Can be used to disable lexer optimizations\n     * If there is a suspicion they are causing incorrect behavior.\n     * Note that this would have negative performance implications.\n     */\n    safeMode?: boolean\n\n    /**\n     * A custom error message provider.\n     * Can be used to override the default error messages.\n     * For example:\n     *   - Translating the error messages to a different languages.\n     *   - Changing the formatting.\n     */\n    errorMessageProvider?: ILexerErrorMessageProvider\n\n    /**\n     * Enabling this flag will print performance tracing logs during lexer\n     * Initialization (constructor invocation), this is useful to narrow down the cause\n     * of the initialization performance problem.\n     *\n     * You can also pass a numerical value which affects the verbosity\n     * of the traces, this number is the maximum nesting level of the traces, e.g:\n     * 0: Traces disabled === 'false'\n     * 1: Top Level traces only.\n     * 2: One level of nested inner traces.\n     * ...\n     *\n     * Note that passing the boolean `true` is identical to passing the numerical value `infinity`\n     */\n    traceInitPerf?: boolean | number\n\n    /**\n     * This flag will avoid running the Lexer validations during Lexer initialization.\n     *\n     * This can substantially improve the Lexer's initialization (constructor) time.\n     * @see ILexerConfig.traceInitPerf to measure the Lexer validations cost for your Lexer.\n     *\n     * Note that the Lexer validations are **extremely useful** during development time,\n     * e.g: Detecting empty/invalid regExp Patterns.\n     * So they should not be skipped during development flows.\n     *   - For example: via a conditional that checks an env variable.\n     */\n    skipValidations?: boolean\n}\n\nexport interface ILexerErrorMessageProvider {\n    /**\n     * An Unexpected Character Error occurs when the lexer is unable to match a range of one or more\n     * characters in the input text against any of the Token Types in it's Lexer definition\n     *\n     * @param fullText - Full original input text.\n     *\n     * @param startOffset - Offset in input text where error starts.\n     *\n     * @param length - Error length.\n     *\n     * @param line - Line number where the error occured. (optional)\n     *                    Will not be provided when lexer is not defined to track lines/columns\n     *\n     * @param column - Column number where the error occured. (optional)\n     *                    Will not be provided when lexer is not defined to track lines/columns\n     */\n    buildUnexpectedCharactersMessage(\n        fullText: string,\n        startOffset: number,\n        length: number,\n        line?: number,\n        column?: number\n    ): string\n\n    /**\n     * Unable To Pop Lexer Mode Error happens when lexer tries to pop the last remaining mode from the mode stack\n     * so that there is no longer any active lexer mode\n     * This error only relevant for multi-mode lexers\n     *\n     * @param token - The Token that requested pop mode.\n     */\n    buildUnableToPopLexerModeMessage(token: IToken): string\n}\n\n/**\n * This is the default logic Chevrotain uses to construct lexing error messages.\n * It can be used as a reference or as a starting point customize a lexer's\n * error messages.\n *\n * - See: {@link ILexerConfig.errorMessageProvider}\n */\nexport declare const defaultLexerErrorProvider: ILexerErrorMessageProvider\n\n/**\n * A subset of the regExp interface.\n * Needed to compute line/column info by a chevrotain lexer.\n */\nexport interface ILineTerminatorsTester {\n    /**\n     * Just like regExp.test\n     */\n    test: (text: string) => boolean\n\n    /**\n     * Just like the regExp lastIndex with the global flag enabled\n     * It should be updated after every match to point to the offset where the next\n     * match attempt starts.\n     */\n    lastIndex: number\n}\n\nexport type TokenPattern =\n    | RegExp\n    | string\n    | CustomPatternMatcherFunc\n    | ICustomPattern\n\nexport interface ITokenConfig {\n    name: string\n\n    /**\n     * Categories enable polymorphism on Token Types.\n     * A TokenType X with categories C1, C2, ... ,Cn can\n     * be matched by the parser against any of those categories.\n     * In practical terms this means that:\n     * CONSUME(C1) can match a Token of type X.\n     */\n    categories?: TokenType | TokenType[]\n\n    /**\n     * The Label is a human readable name to be used\n     * in error messages and syntax diagrams.\n     *\n     * For example a TokenType may be called LCurly, which is\n     * short for \"left curly brace\". The much easier to understand\n     * label could simply be \"{\".\n     */\n    label?: string\n\n    /**\n     * This defines what sequence of characters would be matched\n     * To this TokenType when Lexing.\n     *\n     * For Custom Patterns see: http://sap.github.io/chevrotain/docs/guide/custom_token_patterns.html\n     */\n    pattern?: TokenPattern\n\n    /**\n     * The group property will cause the lexer to collect\n     * Tokens of this type separately from the other Tokens.\n     *\n     * For example this could be used to collect comments for\n     * post processing.\n     *\n     * See: https://github.com/SAP/chevrotain/tree/master/examples/lexer/token_groups\n     */\n    group?: string\n\n    /**\n     * A name of a Lexer mode to \"enter\" once this Token Type has been matched.\n     * Lexer modes can be used to support different sets of possible Tokens Types\n     *\n     * Lexer Modes work as a stack of Lexers, so \"entering\" a mode means pushing it to the top of the stack.\n     *\n     * See: https://github.com/SAP/chevrotain/tree/master/examples/lexer/multi_mode_lexer\n     */\n    push_mode?: string\n\n    /**\n     * If \"pop_mode\" is true the Lexer will pop the last mode of the modes stack and\n     * continue lexing using the new mode at the top of the stack.\n     *\n     * See: https://github.com/SAP/chevrotain/tree/master/examples/lexer/multi_mode_lexer\n     */\n    pop_mode?: boolean\n\n    /**\n     * The \"longer_alt\" property will cause the Lexer to attempt matching against another Token Type\n     * every time this Token Type has been matched.\n     *\n     * This feature can be useful when two Token Types have common prefixes which\n     * cannot be resolved (only) by the ordering of the Tokens in the lexer definition.\n     *\n     * For example see: https://github.com/SAP/chevrotain/tree/master/examples/lexer/keywords_vs_identifiers\n     * For resolving the keywords vs Identifier ambiguity.\n     */\n    longer_alt?: TokenType\n\n    /**\n     * Can a String matching this Token Type's pattern possibly contain a line terminator?\n     * If true and the line_breaks property is not also true this will cause inaccuracies in the Lexer's line / column tracking.\n     */\n    line_breaks?: boolean\n\n    /**\n     * Possible starting characters or charCodes of the pattern.\n     * These will be used to optimize the Lexer's performance.\n     *\n     * These are normally **automatically** computed, however the option to explicitly\n     * specify those can enable optimizations even when the automatic analysis fails.\n     *\n     * e.g:\n     *   * strings hints should be one character long.\n     *    ```\n     *      { start_chars_hint: [\"a\", \"b\"] }\n     *    ```\n     *\n     *   * number hints are the result of running \".charCodeAt(0)\" on the strings.\n     *    ```\n     *      { start_chars_hint: [97, 98] }\n     *    ```\n     *\n     *   * For unicode characters outside the BMP use the first of their surrogate pairs.\n     *     for example: The '💩' character is represented by surrogate pairs: '\\uD83D\\uDCA9'\n     *       and D83D is 55357 in decimal.\n     *    * Note that \"💩\".charCodeAt(0) === 55357\n     */\n    start_chars_hint?: (string | number)[]\n}\n\n/**\n * Creates a new TokenType which can then be used\n * to define a Lexer and Parser\n */\nexport declare function createToken(config: ITokenConfig): TokenType\n\n/**\n * Utility to create Chevrotain IToken \"instances\"\n * Note that Chevrotain tokens are not real TokenTypes instances\n * and thus the instanceOf cannot be used with them.\n */\nexport declare function createTokenInstance(\n    tokType: TokenType,\n    image: string,\n    startOffset: number,\n    endOffset: number,\n    startLine: number,\n    endLine: number,\n    startColumn: number,\n    endColumn: number\n): IToken\n\n/**\n *  API #1 [Custom Token Patterns](http://sap.github.io/chevrotain/docs/guide/custom_token_patterns.html).\n */\nexport declare type CustomPatternMatcherFunc = (\n    /**\n     * The full input string.\n     */\n    text: string,\n    /**\n     * The offset at which to attempt a match\n     */\n    offset: number,\n    /**\n     * Previously scanned Tokens\n     */\n    tokens: IToken[],\n    /**\n     * Token Groups\n     */\n    groups: {\n        [groupName: string]: IToken[]\n    }\n) => CustomPatternMatcherReturn | RegExpExecArray | null // RegExpExecArray included for legacy reasons\n\nexport type CustomPatternMatcherReturn = [string] & { payload?: any }\n\nexport interface TokenType {\n    name: string\n    GROUP?: string\n    PATTERN?: TokenPattern\n    LABEL?: string\n    LONGER_ALT?: TokenType\n    POP_MODE?: boolean\n    PUSH_MODE?: string\n    LINE_BREAKS?: boolean\n    CATEGORIES?: TokenType[]\n    tokenTypeIdx?: number\n    categoryMatches?: number[]\n    categoryMatchesMap?: {\n        [tokType: number]: boolean\n    }\n    isParent?: boolean\n    START_CHARS_HINT?: (string | number)[]\n}\n\n/**\n *  API #2 for [Custom Token Patterns](http://sap.github.io/chevrotain/docs/guide/custom_token_patterns.html).\n */\ninterface ICustomPattern {\n    exec: CustomPatternMatcherFunc\n}\n\n/**\n * Things to note:\n *  - The offset range is inclusive to exclusive.\n *\n * - A lineTerminator as the last character does not effect the Token's line numbering.\n *   In other words a new line only starts **after** a line terminator.\n *\n * - A Token's image is it's **literal** text.\n *   e.g unicode escaping is untouched.\n */\nexport interface IToken {\n    /** The textual representation of the Token as it appeared in the text. */\n    image: string\n    /** Offset of the first character of the Token. */\n    startOffset: number\n    /** Line of the first character of the Token. */\n    startLine?: number\n    /** Column of the first character of the Token. */\n    startColumn?: number\n    /** Offset of the last character of the Token. */\n    endOffset?: number\n    /** Line of the last character of the Token. */\n    endLine?: number\n    /** Column of the last character of the Token. */\n    endColumn?: number\n    /** this marks if a Token does not really exist and has been inserted \"artificially\" during parsing in rule error recovery. */\n    isInsertedInRecovery?: boolean\n    /** An number index representing the type of the Token use <getTokenConstructor> to get the Token Type from a token \"instance\"  */\n    tokenTypeIdx: number\n    /**\n     * The actual Token Type of this Token \"instance\"\n     * This is the same Object returned by the \"createToken\" API.\n     * This property is very useful for debugging the Lexing and Parsing phases.\n     */\n    tokenType: TokenType\n\n    /**\n     * Custom Payload value, this is an optional feature of Custom Token Patterns\n     * For additional details see the docs:\n     * https://sap.github.io/chevrotain/docs/guide/custom_token_patterns.html#custom-payloads\n     */\n    payload?: any\n}\n\nexport declare function tokenName(tokType: TokenType): string\n\n/**\n *  Returns a human readable label for a TokenType if such exists,\n *  otherwise will return the TokenType's name.\n *\n *  Labels are useful in improving the readability of error messages and syntax diagrams.\n *  To define labels provide the label property in the {@link createToken} config parameter.\n */\nexport declare function tokenLabel(tokType: TokenType): string\n\n/**\n * A Utility method to check if a token is of the type of the argument Token class.\n * This utility is needed because Chevrotain tokens support \"categories\" which means\n * A TokenType may have multiple categories.\n *\n * This means a simple comparison using the {@link IToken.tokenType} property may not suffice.\n * For example:\n *\n * ```\n *   import { createToken, tokenMatcher, Lexer } from \"chevrotain\"\n *\n *   // An \"abstract\" Token used only for categorization purposes.\n *   const NumberTokType = createToken({ name: \"NumberTokType\", pattern: Lexer.NA })\n *\n *   const IntegerTokType = createToken({\n *     name: \"IntegerTokType\",\n *     pattern: /\\d+/,\n *     // Integer \"Is A\" Number\n *     categories: [NumberTokType]\n *   })\n *\n *   const DecimalTokType = createToken({\n *     name: \"DecimalTokType\",\n *     pattern: /\\d+\\.\\d+/,\n *     // Double \"Is A\" Number\n *     categories: [NumberTokType]\n *   })\n *\n *   // Will always be false as the tokenType property can only\n *   // be Integer or Double Token Types as the Number TokenType is \"abstract\".\n *   if (myToken.tokenType === NumberTokType) { /* ... *\\/ }\n *\n *   // Will be true when myToken is of Type Integer or Double.\n *   // Because the hierarchy defined by the categories is taken into account.\n *   if (tokenMatcher(myToken, NumberTokType) { /* ... *\\/ }\n * ```\n *\n * @returns true iff the token matches the TokenType.\n */\nexport function tokenMatcher(token: IToken, tokType: TokenType): boolean\n\nexport declare type MultiModesDefinition = {\n    [modeName: string]: TokenType[]\n}\n\nexport interface IMultiModeLexerDefinition {\n    modes: MultiModesDefinition\n    defaultMode: string\n}\n\nexport type TokenTypeDictionary = { [tokenName: string]: TokenType }\n\nexport declare type TokenVocabulary =\n    | TokenTypeDictionary\n    | TokenType[]\n    | IMultiModeLexerDefinition\n\nexport interface IRuleConfig<T> {\n    /**\n     * The function which will be invoked to produce the returned value for a production that have not been\n     * successfully executed and the parser recovered from.\n     */\n    recoveryValueFunc?: () => T\n    /**\n     * Enable/Disable re-sync error recovery for this specific production.\n     */\n    resyncEnabled?: boolean\n}\n\nexport interface DSLMethodOpts<T> {\n    /**\n     * in-lined method name\n     */\n    NAME?: string\n    /**\n     * The Grammar to process in this method.\n     */\n    DEF: GrammarAction<T>\n    /**\n     * A semantic constraint on this DSL method\n     * @see https://github.com/SAP/chevrotain/blob/master/examples/parser/predicate_lookahead/predicate_lookahead.js\n     * For farther details.\n     */\n    GATE?: () => boolean\n\n    /**\n     * Maximum number of \"following tokens\" which would be used to\n     * Choose between the alternatives.\n     *\n     * By default this value is determined by the {@link IParserConfig.maxLookahead} value.\n     * A Higher value may be used for a specific DSL method to resolve ambiguities\n     * And a lower value may be used to resolve slow initialization times issues.\n     *\n     * TODO: create full docs and link\n     */\n    MAX_LOOKAHEAD?: number\n}\n\nexport interface DSLMethodOptsWithErr<T> extends DSLMethodOpts<T> {\n    /**\n     *  Short title/classification to what is being matched.\n     *  Will be used in the error message,.\n     *  If none is provided, the error message will include the names of the expected\n     *  Tokens sequences which start the method's inner grammar\n     */\n    ERR_MSG?: string\n}\n\nexport interface OrMethodOpts {\n    NAME?: string\n    /**\n     * The set of alternatives,\n     * See detailed description in {@link Parser.OR}\n     */\n    DEF: IOrAlt[]\n    /**\n     * A description for the alternatives used in error messages\n     * If none is provided, the error message will include the names of the expected\n     * Tokens sequences which may start each alternative.\n     */\n    ERR_MSG?: string\n\n    /**\n     * A Flag indicating that **all** ambiguities in this alternation should\n     * be ignored.\n     *\n     * This flag should only be used in rare circumstances,\n     * As normally alternation ambiguities should be resolved in other ways:\n     * - Re-ordering the alternatives.\n     * - Re-factoring the grammar to extract common prefixes before alternation.\n     * - Using gates {@link IOrAlt.GATE} to implement custom lookahead logic.\n     * - Using the more granular {@link IOrAlt.IGNORE_AMBIGUITIES} on a **specific** alternative.\n     */\n    IGNORE_AMBIGUITIES?: boolean\n\n    /**\n     * Maximum number of \"following tokens\" which would be used to\n     * Choose between the alternatives.\n     *\n     * By default this value is determined by the {@link IParserConfig.maxLookahead} value.\n     * A Higher value may be used for a specific DSL method to resolve ambiguities\n     * And a lower value may be used to resolve slow initialization times issues.\n     *\n     * TODO: create full docs and link\n     */\n    MAX_LOOKAHEAD?: number\n}\n\nexport interface ManySepMethodOpts<T> {\n    NAME?: string\n    /**\n     * The grammar to process in each iteration.\n     */\n    DEF: GrammarAction<T>\n    /**\n     * The separator between each iteration.\n     */\n    SEP: TokenType\n\n    /**\n     * @see DSLMethodOpts.MAX_LOOKAHEAD\n     */\n    MAX_LOOKAHEAD?: number\n}\n\nexport interface AtLeastOneSepMethodOpts<T> extends ManySepMethodOpts<T> {\n    /**\n     *  Short title/classification to what is being matched.\n     *  Will be used in the error message,.\n     *  If none is provided, the error message will include the names of the expected\n     *  Tokens sequences which start the method's inner grammar.\n     */\n    ERR_MSG?: string\n}\n\nexport interface ConsumeMethodOpts {\n    /**\n     *  A custom Error message if the Token could not be consumed.\n     *  This will override any error message provided by the parser's \"errorMessageProvider\"\n     */\n    ERR_MSG?: string\n    /**\n     * A label to be used instead of the TokenType name in the created CST.\n     */\n    LABEL?: string\n}\n\nexport interface SubruleMethodOpts {\n    /**\n     * The arguments to parameterized rules, see:\n     * https://github.com/SAP/chevrotain/blob/master/examples/parser/parametrized_rules/parametrized.js\n     */\n    ARGS?: any[]\n    /**\n     * A label to be used instead of the subrule's name in the created CST.\n     */\n    LABEL?: string\n}\n\nexport declare type GrammarAction<OUT> = () => OUT\n\n/**\n * TODO: remove this in next major version this `IOrAlt` is enough\n * @deprecated\n */\nexport declare type IAnyOrAlt = any\n\nexport interface IOrAlt {\n    NAME?: string\n    GATE?: () => boolean\n    ALT: () => any\n    /**\n     * A Flag indicating that any ambiguities involving this\n     * specific alternative Should be ignored.\n     *\n     * This flag will be **implicitly** enabled if a GATE is used\n     * as the assumption is that the GATE is used to resolve an ambiguity.\n     */\n    IGNORE_AMBIGUITIES?: boolean\n}\n\nexport interface IOrAltWithGate extends IOrAlt {\n    // TODO: deprecate this interface\n}\n\nexport interface ICstVisitor<IN, OUT> {\n    visit(cstNode: CstNode | CstNode[], param?: IN): OUT\n    validateVisitor(): void\n}\n\n/**\n * A [Concrete Syntax Tree](http://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html) Node.\n * This structure represents the whole parse tree of the grammar\n * This means that information on each and every Token is present.\n * This is unlike an AST (Abstract Syntax Tree) where some of the syntactic information is missing.\n *\n * For example given an ECMAScript grammar, an AST would normally not contain information on the location\n * of Commas, Semi colons, redundant parenthesis ect, however a CST would have that information.\n */\nexport interface CstNode {\n    readonly name: string\n    readonly children: CstChildrenDictionary\n    readonly recoveredNode?: boolean\n\n    /**\n     * Will only be present if the {@link IParserConfig.nodeLocationTracking} is\n     * **not** set to \"none\".\n     * See: http://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html#cstnode-location\n     * For more details.\n     */\n    readonly location?: CstNodeLocation\n    /**\n     * Only relevant for [in-lined](http://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html#in-lined-rules) rules.\n     * the fullName will **also** include the name of the top level rule containing this nested rule.\n     */\n    readonly fullName?: string\n}\n\n/**\n *  The Column/Line properties will only be present when\n *  The {@link IParserConfig.nodeLocationTracking} is set to \"full\".\n */\nexport interface CstNodeLocation {\n    startOffset: number\n    startLine: number\n    startColumn?: number\n    endOffset?: number\n    endLine?: number\n    endColumn?: number\n}\n\nexport declare type CstChildrenDictionary = {\n    [identifier: string]: CstElement[]\n}\n\nexport declare type CstElement = IToken | CstNode\n\nexport declare type nodeLocationTrackingOptions = \"full\" | \"onlyOffset\" | \"none\"\n\nexport interface IParserConfig {\n    /**\n     * Is the error recovery / fault tolerance of the Chevrotain Parser enabled.\n     */\n    recoveryEnabled?: boolean\n    /**\n     * Maximum number of tokens the parser will use to choose between alternatives.\n     * By default this value is `4`.\n     * In the future it may be reduced to `3` due to performance considerations.\n     */\n    maxLookahead?: number\n    /**\n     * @deprecated - use the IGNORE_AMBIGUITIES flag on the relevant DSL method instead\n     *               - {@link IOrAlt.IGNORE_AMBIGUITIES}\n     *               - {@link OrMethodOpts.IGNORE_AMBIGUITIES}\n     *\n     * Used to mark parser definition errors that should be ignored.\n     * For example:\n     *\n     * ```\n     *    {\n     *      myCustomRule : {\n     *                      OR3 : true\n     *                     },\n     *      myOtherRule : {\n     *                     OPTION1 : true,\n     *                     OR4 : true\n     *                    }\n     *    }\n     * ```\n     *\n     * Be careful when ignoring errors, they are usually there for a reason :).\n     */\n    ignoredIssues?: IgnoredParserIssues\n    /**\n     * Enable This Flag to to support Dynamically defined Tokens.\n     * This will disable performance optimizations which cannot work if the whole Token vocabulary is not known\n     * During Parser initialization.\n     *\n     * See [runnable example](https://github.com/SAP/chevrotain/tree/master/examples/parser/dynamic_tokens)\n     */\n    dynamicTokensEnabled?: boolean\n    /**\n     * @deprecated - extend either CstParser or EmbeddedActionsParser to control this flag instead\n     *               - @see CstParser\n     *               - @see EmbeddedActionsParser\n     *\n     * Enable automatic Concrete Syntax Tree creation\n     * For in-depth docs on [Concrete Syntax Trees](http://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html):\n     */\n    outputCst?: boolean\n    /**\n     * Enable computation of CST nodes location.\n     * By default this is set to \"none\", meaning this feature is disabled.\n     * See: http://sap.github.io/chevrotain/docs/guide/concrete_syntax_tree.html#cstnode-location\n     * For more details.\n     */\n    nodeLocationTracking?: nodeLocationTrackingOptions\n    /**\n     * A custom error message provider.\n     * Can be used to override the default error messages.\n     * For example:\n     *   - Translating the error messages to a different languages.\n     *   - Changing the formatting.\n     *   - Providing special error messages under certain conditions, e.g: missing semicolons.\n     */\n    errorMessageProvider?: IParserErrorMessageProvider\n    /**\n     * Enabling this flag will print performance tracing logs during parser\n     * Initialization (constructor invocation), this is useful to narrow down the cause\n     * of the initialization performance problem.\n     *\n     * You can also pass a numerical value which affects the verbosity\n     * of the traces, this number is the maximum nesting level of the traces, e.g:\n     * 0: Traces disabled === 'false'\n     * 1: Top Level traces only.\n     * 2: One level of nested inner traces.\n     * ...\n     *\n     * Note that passing the boolean `true` is identical to passing the numerical value `infinity`\n     */\n    traceInitPerf?: boolean | number\n    /**\n     * This flag will avoid running the grammar validations during Parser initialization.\n     *\n     * This can substantially improve the Parser's initialization (constructor) time.\n     * @see IParserConfig.traceInitPerf to measure the grammar validations cost for your parser.\n     *\n     * Note that the grammar validations are **extremely useful** during development time,\n     * e.g: detecting ambiguities / left recursion.\n     * So they should not be skipped during development flows.\n     *   - For example: via a conditional that checks an env variable.\n     */\n    skipValidations?: boolean\n}\n\n/**\n * See: {@link IParserConfig.ignoredIssues}\n */\nexport declare type IgnoredParserIssues = {\n    [ruleName: string]: IgnoredRuleIssues\n}\n\n/**\n * See: {@link IParserConfig.ignoredIssues}\n */\nexport declare type IgnoredRuleIssues = {\n    [dslNameAndOccurrence: string]: boolean\n}\n\nexport interface IParserErrorMessageProvider {\n    /**\n     * Mismatched Token Error happens when the parser attempted to consume a terminal and failed.\n     * It corresponds to a failed {@link Parser.CONSUME} in Chevrotain DSL terms.\n     *\n     * @param options.expected - The expected Token Type.\n     *\n     * @param options.actual - The actual Token \"instance\".\n     *\n     * @param options.previous - The previous Token \"instance\".\n     *                                This is useful if options.actual[0] is of type chevrotain.EOF and you need to know the last token parsed.\n     *\n     * @param options.ruleName - The rule in which the error occurred.\n     */\n    buildMismatchTokenMessage?(options: {\n        expected: TokenType\n        actual: IToken\n        previous: IToken\n        ruleName: string\n    }): string\n    /**\n     * A Redundant Input Error happens when the parser has completed parsing but there\n     * is still unprocessed input remaining.\n     *\n     * @param options.firstRedundant - The first unprocessed token \"instance\".\n     *\n     * @param options.ruleName - The rule in which the error occurred.\n     */\n    buildNotAllInputParsedMessage?(options: {\n        firstRedundant: IToken\n        ruleName: string\n    }): string\n    /**\n     * A No Viable Alternative Error happens when the parser cannot detect any valid alternative in an alternation.\n     * It corresponds to a failed {@link Parser.OR} in Chevrotain DSL terms.\n     *\n     * @param options.expectedPathsPerAlt - First level of the array represents each alternative\n     *                           The next two levels represent valid (expected) paths in each alternative.\n     *\n     * @param options.actual - The actual sequence of tokens encountered.\n     *\n     * @param options.previous - The previous Token \"instance\".\n     *                                This is useful if options.actual[0] is of type chevrotain.EOF and you need to know the last token parsed.\n     *\n     * @param options.customUserDescription - A user may provide custom error message descriptor in the {@link Parser.AT_LEAST_ONE} DSL method\n     *                                        options parameter, this is that custom message.\n     *\n     * @param options.ruleName - The rule in which the error occurred.\n     */\n    buildNoViableAltMessage?(options: {\n        expectedPathsPerAlt: TokenType[][][]\n        actual: IToken[]\n        previous: IToken\n        customUserDescription: string\n        ruleName: string\n    }): string\n    /**\n     * An Early Exit Error happens when the parser cannot detect the first mandatory iteration of a repetition.\n     * It corresponds to a failed {@link Parser.AT_LEAST_ONE} or {@link Parser.AT_LEAST_ONE_SEP} in Chevrotain DSL terms.\n     *\n     * @param options.expectedIterationPaths - The valid (expected) paths in the first iteration.\n     *\n     * @param options.actual - The actual sequence of tokens encountered.\n     *\n     * @param options.previous - The previous Token \"instance\".\n     *                                This is useful if options.actual[0] is of type chevrotain.EOF and you need to know the last token parsed.\n     *\n     * @param options.customUserDescription - A user may provide custom error message descriptor in the {@link Parser.AT_LEAST_ONE} DSL method\n     *                                        options parameter, this is that custom message.\n     *\n     * @param options.ruleName - The rule in which the error occurred.\n     */\n    buildEarlyExitMessage?(options: {\n        expectedIterationPaths: TokenType[][]\n        actual: IToken[]\n        previous: IToken\n        customUserDescription: string\n        ruleName: string\n    }): string\n}\n\nexport interface IRecognizerContext {\n    /**\n     * A copy of the parser's rule stack at the \"time\" the RecognitionException occurred.\n     * This can be used to help debug parsing errors (How did we get here?).\n     */\n    ruleStack: string[]\n    /**\n     * A copy of the parser's rule occurrence stack at the \"time\" the RecognitionException occurred.\n     * This can be used to help debug parsing errors (How did we get here?).\n     */\n    ruleOccurrenceStack: number[]\n}\n\nexport declare type ISeparatedIterationResult<OUT> = {\n    values: OUT[]\n    separators: IToken[]\n}\n\nexport interface ISerializedGast {\n    type:\n        | \"NonTerminal\"\n        | \"Flat\"\n        | \"Option\"\n        | \"RepetitionMandatory\"\n        | \"RepetitionMandatoryWithSeparator\"\n        | \"Repetition\"\n        | \"RepetitionWithSeparator\"\n        | \"Alternation\"\n        | \"Terminal\"\n        | \"Rule\"\n    definition?: ISerializedGast[]\n}\n\n/**\n * Structure for the path the parser \"took\" to reach a certain position\n * in the grammar.\n */\nexport interface IGrammarPath {\n    /**\n     * The Grammar rules invoked and still unterminated to reach this Grammar Path.\n     */\n    ruleStack: string[]\n    /**\n     * The occurrence index (SUBRULE1/2/3/5/...) of each Grammar rule invoked and still unterminated.\n     * Used to distinguish between **different** invocations of the same subrule at the same top level rule.\n     */\n    occurrenceStack: number[]\n}\n\nexport interface ISyntacticContentAssistPath extends IGrammarPath {\n    nextTokenType: TokenType\n    nextTokenOccurrence: number\n}\n\nexport interface ITokenGrammarPath extends IGrammarPath {\n    lastTok: TokenType\n    lastTokOccurrence: number\n}\n\nexport declare enum LexerDefinitionErrorType {\n    MISSING_PATTERN = 0,\n    INVALID_PATTERN = 1,\n    EOI_ANCHOR_FOUND = 2,\n    UNSUPPORTED_FLAGS_FOUND = 3,\n    DUPLICATE_PATTERNS_FOUND = 4,\n    INVALID_GROUP_TYPE_FOUND = 5,\n    PUSH_MODE_DOES_NOT_EXIST = 6,\n    MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE = 7,\n    MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY = 8,\n    MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST = 9,\n    LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED = 10,\n    SOI_ANCHOR_FOUND = 11,\n    EMPTY_MATCH_PATTERN = 12,\n    NO_LINE_BREAKS_FLAGS = 13,\n    UNREACHABLE_PATTERN = 14,\n    IDENTIFY_TERMINATOR = 15,\n    CUSTOM_LINE_BREAK = 16\n}\n\n/**\n * Type of End Of File Token.\n */\nexport declare const EOF: TokenType\n\n/**\n * Convenience used to express an **empty** alternative in an OR (alternation).\n * can be used to more clearly describe the intent in a case of empty alternation.\n *\n * For example:\n *\n * 1. without using EMPTY_ALT:\n *  ```\n *    this.OR([\n *      {ALT: () => {\n *        this.CONSUME1(OneTok)\n *        return \"1\"\n *      }},\n *      {ALT: () => {\n *        this.CONSUME1(TwoTok)\n *        return \"2\"\n *      }},\n *      // implicitly empty because there are no invoked grammar\n *      // rules (OR/MANY/CONSUME...) inside this alternative.\n *      {ALT: () => {\n *        return \"666\"\n *      }},\n *    ])\n *  ```\n *\n * 2. using EMPTY_ALT:\n *  ```\n *    this.OR([\n *      {ALT: () => {\n *        this.CONSUME1(OneTok)\n *        return \"1\"\n *      }},\n *      {ALT: () => {\n *        this.CONSUME1(TwoTok)\n *        return \"2\"\n *      }},\n *      // explicitly empty, clearer intent\n *      {ALT: EMPTY_ALT(\"666\")},\n *    ])\n *  ```\n */\nexport declare function EMPTY_ALT<T>(value?: T): () => T\n\n/**\n * This is the default logic Chevrotain uses to construct error messages.\n * It can be used as a reference or as a starting point customize a parser's\n * error messages.\n *\n * - See: {@link IParserConfig.errorMessageProvider}\n */\nexport declare const defaultParserErrorProvider: IParserErrorMessageProvider\n\n/**\n * A Chevrotain Parser runtime exception.\n */\nexport interface IRecognitionException {\n    name: string\n    message: string\n    /**\n     * The token which caused the parser error.\n     */\n    token: IToken\n    /**\n     * Additional tokens which have been re-synced in error recovery due to the original error.\n     * This information can be used the calculate the whole text area which has been skipped due to an error.\n     * For example for displaying with a red underline in a text editor.\n     */\n    resyncedTokens: IToken[]\n    context: IRecognizerContext\n}\n\n/**\n * A utility to detect if an Error is a Chevrotain Parser's runtime exception.\n */\nexport declare function isRecognitionException(error: Error): boolean\n\n// TODO refactor exceptions constructors to classes\n\n/**\n * An exception of this type will be saved in {@link Parser.errors} when {@link Parser.CONSUME}\n * was called but failed to match the expected Token Type.\n */\nexport declare class MismatchedTokenException extends Error {\n    constructor(message: string, token: IToken, previousToken: IToken)\n}\n\n/**\n * An exception of this type will be saved in {@link Parser.errors} when {@link Parser.OR}\n * was called yet none of the possible alternatives could be matched.\n */\nexport declare class NoViableAltException extends Error {\n    constructor(message: string, token: IToken, previousToken: IToken)\n}\n\n/**\n * An exception of this type will be saved in {@link Parser.errors} when\n * the parser has finished yet there exists remaining input (tokens) that has not processed.\n */\nexport declare class NotAllInputParsedException extends Error {\n    constructor(message: string, token: IToken)\n}\n\n/**\n * An exception of this type will be saved in {@link Parser.errors} when {@link Parser.AT_LEAST_ONE}\n * or {@link Parser.AT_LEAST_ONE_SEP} was called but failed to match even a single iteration.\n */\nexport declare class EarlyExitException extends Error {\n    constructor(message: string, token: IToken, previousToken: IToken)\n}\n\nexport interface IOptionallyNamedProduction {\n    name?: string\n}\nexport interface IProduction {\n    accept(visitor: IGASTVisitor): void\n}\n\nexport interface IProductionWithOccurrence extends IProduction {\n    idx: number\n}\n\n/**\n * A very basic implementation of a Visitor Pattern\n * For the Grammar AST structure.\n *\n * This may be useful for advanced users who create custom logic on the grammar AST.\n * For example, custom validations or introspection.\n */\nexport abstract class GAstVisitor {\n    visit(node: IProduction): any\n\n    abstract visitNonTerminal(node: NonTerminal): any\n\n    abstract visitFlat(node: Flat): any\n\n    abstract visitOption(node: Option): any\n\n    abstract visitRepetition(node: Repetition): any\n\n    abstract visitRepetitionMandatory(node: RepetitionMandatory): any\n\n    abstract visitRepetitionMandatoryWithSeparator(\n        node: RepetitionMandatoryWithSeparator\n    ): any\n\n    abstract visitRepetitionWithSeparator(node: RepetitionWithSeparator): any\n\n    abstract visitAlternation(node: Alternation): any\n\n    abstract visitTerminal(node: Terminal): any\n\n    abstract visitRule(node: Rule): any\n}\n\n/**\n * The Grammar AST class representing a top level {@link Parser.RULE} call.\n */\nexport declare class Rule {\n    name: string\n    orgText: string\n    definition: IProduction[]\n\n    constructor(options: {\n        name: string\n        definition: IProduction[]\n        orgText?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a top level {@link Parser.SUBRULE} call.\n */\nexport declare class NonTerminal implements IProductionWithOccurrence {\n    nonTerminalName: string\n    referencedRule: Rule\n    idx: number\n    constructor(options: {\n        nonTerminalName: string\n        referencedRule?: Rule\n        idx?: number\n    })\n    definition: IProduction[]\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class used to represent a sequence.\n * This is normally only used in {@link Alternation} to distinguish\n * between the different alternatives.\n */\nexport declare class Flat implements IOptionallyNamedProduction {\n    name: string\n    definition: IProduction[]\n\n    constructor(options: { definition: IProduction[]; name?: string })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.OPTION} call.\n */\nexport declare class Option\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    idx: number\n    name?: string\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.AT_LEAST_ONE} call.\n */\nexport declare class RepetitionMandatory\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    name: string\n    idx: number\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.AT_LEAST_ONE_SEP} call.\n */\nexport declare class RepetitionMandatoryWithSeparator\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    separator: TokenType\n    idx: number\n    name: string\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        separator: TokenType\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.MANY} call.\n */\nexport declare class Repetition\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    separator: TokenType\n    idx: number\n    name: string\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.MANY_SEP} call.\n */\nexport declare class RepetitionWithSeparator\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    separator: TokenType\n    idx: number\n    name: string\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        separator: TokenType\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.OR} call.\n */\nexport declare class Alternation\n    implements IProductionWithOccurrence, IOptionallyNamedProduction {\n    idx: number\n    name: string\n    definition: IProduction[]\n\n    constructor(options: {\n        definition: IProduction[]\n        idx?: number\n        name?: string\n    })\n\n    accept(visitor: IGASTVisitor): void\n}\n\n/**\n * The Grammar AST class representing a {@link Parser.CONSUME} call.\n */\nexport declare class Terminal implements IProductionWithOccurrence {\n    terminalType: TokenType\n    idx: number\n    constructor(options: { terminalType: TokenType; idx?: number })\n    accept(visitor: IGASTVisitor): void\n}\n\nexport interface IGASTVisitor {\n    visit(prod: IProduction): any\n}\n\n/**\n * Serialize a Grammar to a JSON Object.\n *\n * This can be useful for scenarios requiring exporting the grammar structure\n * for example drawing syntax diagrams.\n */\nexport declare function serializeGrammar(topRules: Rule[]): ISerializedGast[]\n\n/**\n * Like {@link serializeGrammar} but for a single GAST Production instead of a set of Rules.\n */\nexport declare function serializeProduction(node: IProduction): ISerializedGast\n\n/**\n * A utility to resolve a grammar AST (rules parameter).\n * \"Resolving\" means assigning the appropiate value for all {@link NonTerminal.referencedRule}\n * properties in the grammar AST.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html)\n */\nexport declare function resolveGrammar(options: {\n    rules: Rule[]\n    errMsgProvider?: IGrammarResolverErrorMessageProvider\n}): IParserDefinitionError[]\n\n/**\n * A utility to validate a grammar AST (rules parameter).\n * For example: left recursion detection, ambiguity detection, ...\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html)\n */\nexport declare function validateGrammar(options: {\n    rules: Rule[]\n    /**\n     * The maximum lookahead used in the grammar.\n     * This number is needed to perform ambiguity detection.\n     */\n    maxLookahead: number\n    /**\n     * The Token Types used by the grammar.\n     */\n    tokenTypes: TokenType[]\n    grammarName: string\n    errMsgProvider: IGrammarValidatorErrorMessageProvider\n    ignoredIssues?: IgnoredParserIssues\n}): IParserDefinitionError[]\n\n/**\n * A utility for assigning unique occurence indices to a grammar AST (rules parameter).\n * This can be useful when using Chevrotain to create custom APIs.\n *\n * - FAQ: [Why are these unique occurences needed](http://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES)\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html)\n */\nexport declare function assignOccurrenceIndices(options: {\n    rules: Rule[]\n}): void\n\n/**\n * The default grammar validations errror message provider used by Chevrotain.\n * this can be used as the basis for custom error providers when using Chevrotain's\n * custom APIs.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html#grammar-validations)\n */\nexport declare const defaultGrammarValidatorErrorProvider: IGrammarValidatorErrorMessageProvider\n\n/**\n * The default grammar resolver errror message provider used by Chevrotain.\n * this can be used as the basis for custom error providers when using Chevrotain's\n * custom APIs.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html#grammar-validations)\n */\nexport declare const defaultGrammarResolverErrorProvider: IGrammarResolverErrorMessageProvider\n\n/**\n * Implementing this interface enables customizing grammar validation errors\n * when using custom APIs.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html#grammar-validations)\n */\nexport interface IGrammarValidatorErrorMessageProvider {\n    buildDuplicateFoundError(\n        topLevelRule: Rule,\n        duplicateProds: IProductionWithOccurrence[]\n    ): string\n    buildInvalidNestedRuleNameError(\n        topLevelRule: Rule,\n        nestedProd: IOptionallyNamedProduction\n    ): string\n    buildDuplicateNestedRuleNameError(\n        topLevelRule: Rule,\n        nestedProd: IOptionallyNamedProduction[]\n    ): string\n    buildNamespaceConflictError(topLevelRule: Rule): string\n    buildAlternationPrefixAmbiguityError(options: {\n        topLevelRule: Rule\n        prefixPath: TokenType[]\n        ambiguityIndices: number[]\n        alternation: Alternation\n    }): string\n    buildAlternationAmbiguityError(options: {\n        topLevelRule: Rule\n        prefixPath: TokenType[]\n        ambiguityIndices: number[]\n        alternation: Alternation\n    }): string\n    buildEmptyRepetitionError(options: {\n        topLevelRule: Rule\n        repetition: IProductionWithOccurrence\n    }): string\n    buildTokenNameError(options: {\n        tokenType: TokenType\n        expectedPattern: RegExp\n    }): any\n    buildEmptyAlternationError(options: {\n        topLevelRule: Rule\n        alternation: Alternation\n        emptyChoiceIdx: number\n    }): any\n    buildTooManyAlternativesError(options: {\n        topLevelRule: Rule\n        alternation: Alternation\n    }): string\n    buildLeftRecursionError(options: {\n        topLevelRule: Rule\n        leftRecursionPath: Rule[]\n    }): string\n    buildInvalidRuleNameError(options: {\n        topLevelRule: Rule\n        expectedPattern: RegExp\n    }): string\n    buildDuplicateRuleNameError(options: {\n        topLevelRule: Rule | string\n        grammarName: string\n    }): string\n}\n\n/**\n * Implementing this interface enables customizing grammar resolving errors\n * when using custom APIs.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html#grammar-validations)\n */\nexport interface IGrammarResolverErrorMessageProvider {\n    buildRuleNotFoundError(\n        topLevelRule: Rule,\n        undefinedRule: NonTerminal\n    ): string\n}\n\n/**\n * Structure of grammar validations errors.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html#grammar-validations)\n */\nexport interface IParserDefinitionError {\n    message: string\n    type: ParserDefinitionErrorType\n    ruleName?: string\n}\n\n/**\n * @deprecated\n * This function no longer does anything, Avoid using this function\n * As it will be removed in future versions.\n */\nexport declare function clearCache(): void\n\n/**\n * Structure of configuration object for {@link createSyntaxDiagramsCode}\n */\nexport interface ICreateSyntaxDiagramsConfig {\n    /**\n     * Base Url to load the runtime resources for rendering the diagrams\n     */\n    resourceBase?: string\n    /**\n     * Url to load the styleSheet, replace with your own for styling customization.\n     */\n    css?: string\n}\n\n/**\n * Will generate an html source code (text).\n * This html text will render syntax diagrams for the provided grammar.\n *\n * - See detailed docs for [Syntax Diagrams](http://sap.github.io/chevrotain/docs/guide/generating_syntax_diagrams.html).\n */\nexport declare function createSyntaxDiagramsCode(\n    grammar: ISerializedGast[],\n    config?: ICreateSyntaxDiagramsConfig\n): string\n\n/**\n * Generate A Parser factory from a set of Rules.\n *\n * This variant will Create a factory function that once invoked with a IParserConfig will return\n * a Parser Object.\n *\n * - Note that this happens using the Function constructor (a type of \"eval\") so it will not work in environments\n *   where content security policy is enabled, such as certain websites, Chrome extensions ect...\n *\n *   This means this function is best used for development flows to reduce the feedback loops\n *   or for productive flows targeting node.js only.\n *\n *   For productive flows targeting a browser runtime see {@link generateParserModule}.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html).\n */\nexport declare function generateParserFactory(options: {\n    name: string\n    rules: Rule[]\n    tokenVocabulary: TokenVocabulary\n}): (config?: IParserConfig) => Parser\n\n/**\n * Generate A Parser's text from a set of Rules.\n *\n * This variant will generate the **string literal** for a UMD module https://github.com/umdjs/umd\n * That exports a Parser Constructor.\n *\n * - Note that the constructor exposed by the generated module must receive the TokenVocabulary as the first\n *   argument, the IParser config can be passed as the second argument.\n *\n * - See detailed docs for [Custom APIs](http://sap.github.io/chevrotain/docs/guide/custom_apis.html).\n */\nexport declare function generateParserModule(options: {\n    name: string\n    rules: Rule[]\n}): string\n"
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/LICENSE",
    "content": "MIT License\n\nCopyright (c) Zeno Rocha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/clipboard.js",
    "content": "/*!\n * clipboard.js v2.0.6\n * https://clipboardjs.com/\n * \n * Licensed MIT © Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n    if(typeof exports === 'object' && typeof module === 'object')\n        module.exports = factory();\n    else if(typeof define === 'function' && define.amd)\n        define([], factory);\n    else if(typeof exports === 'object')\n        exports[\"ClipboardJS\"] = factory();\n    else\n        root[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/     // The module cache\n/******/     var installedModules = {};\n/******/\n/******/     // The require function\n/******/     function __webpack_require__(moduleId) {\n/******/\n/******/         // Check if module is in cache\n/******/         if(installedModules[moduleId]) {\n/******/             return installedModules[moduleId].exports;\n/******/         }\n/******/         // Create a new module (and put it into the cache)\n/******/         var module = installedModules[moduleId] = {\n/******/             i: moduleId,\n/******/             l: false,\n/******/             exports: {}\n/******/         };\n/******/\n/******/         // Execute the module function\n/******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/         // Flag the module as loaded\n/******/         module.l = true;\n/******/\n/******/         // Return the exports of the module\n/******/         return module.exports;\n/******/     }\n/******/\n/******/\n/******/     // expose the modules object (__webpack_modules__)\n/******/     __webpack_require__.m = modules;\n/******/\n/******/     // expose the module cache\n/******/     __webpack_require__.c = installedModules;\n/******/\n/******/     // define getter function for harmony exports\n/******/     __webpack_require__.d = function(exports, name, getter) {\n/******/         if(!__webpack_require__.o(exports, name)) {\n/******/             Object.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/         }\n/******/     };\n/******/\n/******/     // define __esModule on exports\n/******/     __webpack_require__.r = function(exports) {\n/******/         if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/             Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/         }\n/******/         Object.defineProperty(exports, '__esModule', { value: true });\n/******/     };\n/******/\n/******/     // create a fake namespace object\n/******/     // mode & 1: value is a module id, require it\n/******/     // mode & 2: merge all properties of value into the ns\n/******/     // mode & 4: return value when already ns object\n/******/     // mode & 8|1: behave like require\n/******/     __webpack_require__.t = function(value, mode) {\n/******/         if(mode & 1) value = __webpack_require__(value);\n/******/         if(mode & 8) return value;\n/******/         if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/         var ns = Object.create(null);\n/******/         __webpack_require__.r(ns);\n/******/         Object.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/         if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/         return ns;\n/******/     };\n/******/\n/******/     // getDefaultExport function for compatibility with non-harmony modules\n/******/     __webpack_require__.n = function(module) {\n/******/         var getter = module && module.__esModule ?\n/******/             function getDefault() { return module['default']; } :\n/******/             function getModuleExports() { return module; };\n/******/         __webpack_require__.d(getter, 'a', getter);\n/******/         return getter;\n/******/     };\n/******/\n/******/     // Object.prototype.hasOwnProperty.call\n/******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/     // __webpack_public_path__\n/******/     __webpack_require__.p = \"\";\n/******/\n/******/\n/******/     // Load entry module and return exports\n/******/     return __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nfunction select(element) {\n    var selectedText;\n\n    if (element.nodeName === 'SELECT') {\n        element.focus();\n\n        selectedText = element.value;\n    }\n    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n        var isReadOnly = element.hasAttribute('readonly');\n\n        if (!isReadOnly) {\n            element.setAttribute('readonly', '');\n        }\n\n        element.select();\n        element.setSelectionRange(0, element.value.length);\n\n        if (!isReadOnly) {\n            element.removeAttribute('readonly');\n        }\n\n        selectedText = element.value;\n    }\n    else {\n        if (element.hasAttribute('contenteditable')) {\n            element.focus();\n        }\n\n        var selection = window.getSelection();\n        var range = document.createRange();\n\n        range.selectNodeContents(element);\n        selection.removeAllRanges();\n        selection.addRange(range);\n\n        selectedText = selection.toString();\n    }\n\n    return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nfunction E () {\n  // Keep this empty so it's easier to inherit from\n  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n  on: function (name, callback, ctx) {\n    var e = this.e || (this.e = {});\n\n    (e[name] || (e[name] = [])).push({\n      fn: callback,\n      ctx: ctx\n    });\n\n    return this;\n  },\n\n  once: function (name, callback, ctx) {\n    var self = this;\n    function listener () {\n      self.off(name, listener);\n      callback.apply(ctx, arguments);\n    };\n\n    listener._ = callback\n    return this.on(name, listener, ctx);\n  },\n\n  emit: function (name) {\n    var data = [].slice.call(arguments, 1);\n    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n    var i = 0;\n    var len = evtArr.length;\n\n    for (i; i < len; i++) {\n      evtArr[i].fn.apply(evtArr[i].ctx, data);\n    }\n\n    return this;\n  },\n\n  off: function (name, callback) {\n    var e = this.e || (this.e = {});\n    var evts = e[name];\n    var liveEvents = [];\n\n    if (evts && callback) {\n      for (var i = 0, len = evts.length; i < len; i++) {\n        if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n          liveEvents.push(evts[i]);\n      }\n    }\n\n    // Remove event from queue to prevent memory leak\n    // Suggested by https://github.com/lazd\n    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n    (liveEvents.length)\n      ? e[name] = liveEvents\n      : delete e[name];\n\n    return this;\n  }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar is = __webpack_require__(3);\nvar delegate = __webpack_require__(4);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n    if (!target && !type && !callback) {\n        throw new Error('Missing required arguments');\n    }\n\n    if (!is.string(type)) {\n        throw new TypeError('Second argument must be a String');\n    }\n\n    if (!is.fn(callback)) {\n        throw new TypeError('Third argument must be a Function');\n    }\n\n    if (is.node(target)) {\n        return listenNode(target, type, callback);\n    }\n    else if (is.nodeList(target)) {\n        return listenNodeList(target, type, callback);\n    }\n    else if (is.string(target)) {\n        return listenSelector(target, type, callback);\n    }\n    else {\n        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n    }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n    node.addEventListener(type, callback);\n\n    return {\n        destroy: function() {\n            node.removeEventListener(type, callback);\n        }\n    }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n    Array.prototype.forEach.call(nodeList, function(node) {\n        node.addEventListener(type, callback);\n    });\n\n    return {\n        destroy: function() {\n            Array.prototype.forEach.call(nodeList, function(node) {\n                node.removeEventListener(type, callback);\n            });\n        }\n    }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n    return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n    return value !== undefined\n        && value instanceof HTMLElement\n        && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return value !== undefined\n        && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n        && ('length' in value)\n        && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n    return typeof value === 'string'\n        || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return type === '[object Function]';\n};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar closest = __webpack_require__(5);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n    var listenerFn = listener.apply(this, arguments);\n\n    element.addEventListener(type, listenerFn, useCapture);\n\n    return {\n        destroy: function() {\n            element.removeEventListener(type, listenerFn, useCapture);\n        }\n    }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n    // Handle the regular Element usage\n    if (typeof elements.addEventListener === 'function') {\n        return _delegate.apply(null, arguments);\n    }\n\n    // Handle Element-less usage, it defaults to global delegation\n    if (typeof type === 'function') {\n        // Use `document` as the first parameter, then apply arguments\n        // This is a short way to .unshift `arguments` without running into deoptimizations\n        return _delegate.bind(null, document).apply(null, arguments);\n    }\n\n    // Handle Selector-based usage\n    if (typeof elements === 'string') {\n        elements = document.querySelectorAll(elements);\n    }\n\n    // Handle Array-like based usage\n    return Array.prototype.map.call(elements, function (element) {\n        return _delegate(element, selector, type, callback, useCapture);\n    });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n    return function(e) {\n        e.delegateTarget = closest(e.target, selector);\n\n        if (e.delegateTarget) {\n            callback.call(element, e);\n        }\n    }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n    var proto = Element.prototype;\n\n    proto.matches = proto.matchesSelector ||\n                    proto.mozMatchesSelector ||\n                    proto.msMatchesSelector ||\n                    proto.oMatchesSelector ||\n                    proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n        if (typeof element.matches === 'function' &&\n            element.matches(selector)) {\n          return element;\n        }\n        element = element.parentNode;\n    }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(0);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n\n// CONCATENATED MODULE: ./src/clipboard-action.js\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/**\n * Inner class which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n */\n\nvar clipboard_action_ClipboardAction = function () {\n    /**\n     * @param {Object} options\n     */\n    function ClipboardAction(options) {\n        _classCallCheck(this, ClipboardAction);\n\n        this.resolveOptions(options);\n        this.initSelection();\n    }\n\n    /**\n     * Defines base properties passed from constructor.\n     * @param {Object} options\n     */\n\n\n    _createClass(ClipboardAction, [{\n        key: 'resolveOptions',\n        value: function resolveOptions() {\n            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            this.action = options.action;\n            this.container = options.container;\n            this.emitter = options.emitter;\n            this.target = options.target;\n            this.text = options.text;\n            this.trigger = options.trigger;\n\n            this.selectedText = '';\n        }\n\n        /**\n         * Decides which selection strategy is going to be applied based\n         * on the existence of `text` and `target` properties.\n         */\n\n    }, {\n        key: 'initSelection',\n        value: function initSelection() {\n            if (this.text) {\n                this.selectFake();\n            } else if (this.target) {\n                this.selectTarget();\n            }\n        }\n\n        /**\n         * Creates a fake textarea element, sets its value from `text` property,\n         * and makes a selection on it.\n         */\n\n    }, {\n        key: 'selectFake',\n        value: function selectFake() {\n            var _this = this;\n\n            var isRTL = document.documentElement.getAttribute('dir') == 'rtl';\n\n            this.removeFake();\n\n            this.fakeHandlerCallback = function () {\n                return _this.removeFake();\n            };\n            this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;\n\n            this.fakeElem = document.createElement('textarea');\n            // Prevent zooming on iOS\n            this.fakeElem.style.fontSize = '12pt';\n            // Reset box model\n            this.fakeElem.style.border = '0';\n            this.fakeElem.style.padding = '0';\n            this.fakeElem.style.margin = '0';\n            // Move element out of screen horizontally\n            this.fakeElem.style.position = 'absolute';\n            this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';\n            // Move element to the same position vertically\n            var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n            this.fakeElem.style.top = yPosition + 'px';\n\n            this.fakeElem.setAttribute('readonly', '');\n            this.fakeElem.value = this.text;\n\n            this.container.appendChild(this.fakeElem);\n\n            this.selectedText = select_default()(this.fakeElem);\n            this.copyText();\n        }\n\n        /**\n         * Only removes the fake element after another click event, that way\n         * a user can hit `Ctrl+C` to copy because selection still exists.\n         */\n\n    }, {\n        key: 'removeFake',\n        value: function removeFake() {\n            if (this.fakeHandler) {\n                this.container.removeEventListener('click', this.fakeHandlerCallback);\n                this.fakeHandler = null;\n                this.fakeHandlerCallback = null;\n            }\n\n            if (this.fakeElem) {\n                this.container.removeChild(this.fakeElem);\n                this.fakeElem = null;\n            }\n        }\n\n        /**\n         * Selects the content from element passed on `target` property.\n         */\n\n    }, {\n        key: 'selectTarget',\n        value: function selectTarget() {\n            this.selectedText = select_default()(this.target);\n            this.copyText();\n        }\n\n        /**\n         * Executes the copy operation based on the current selection.\n         */\n\n    }, {\n        key: 'copyText',\n        value: function copyText() {\n            var succeeded = void 0;\n\n            try {\n                succeeded = document.execCommand(this.action);\n            } catch (err) {\n                succeeded = false;\n            }\n\n            this.handleResult(succeeded);\n        }\n\n        /**\n         * Fires an event based on the copy operation result.\n         * @param {Boolean} succeeded\n         */\n\n    }, {\n        key: 'handleResult',\n        value: function handleResult(succeeded) {\n            this.emitter.emit(succeeded ? 'success' : 'error', {\n                action: this.action,\n                text: this.selectedText,\n                trigger: this.trigger,\n                clearSelection: this.clearSelection.bind(this)\n            });\n        }\n\n        /**\n         * Moves focus away from `target` and back to the trigger, removes current selection.\n         */\n\n    }, {\n        key: 'clearSelection',\n        value: function clearSelection() {\n            if (this.trigger) {\n                this.trigger.focus();\n            }\n            document.activeElement.blur();\n            window.getSelection().removeAllRanges();\n        }\n\n        /**\n         * Sets the `action` to be performed which can be either 'copy' or 'cut'.\n         * @param {String} action\n         */\n\n    }, {\n        key: 'destroy',\n\n\n        /**\n         * Destroy lifecycle.\n         */\n        value: function destroy() {\n            this.removeFake();\n        }\n    }, {\n        key: 'action',\n        set: function set() {\n            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';\n\n            this._action = action;\n\n            if (this._action !== 'copy' && this._action !== 'cut') {\n                throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n            }\n        }\n\n        /**\n         * Gets the `action` property.\n         * @return {String}\n         */\n        ,\n        get: function get() {\n            return this._action;\n        }\n\n        /**\n         * Sets the `target` property using an element\n         * that will be have its content copied.\n         * @param {Element} target\n         */\n\n    }, {\n        key: 'target',\n        set: function set(target) {\n            if (target !== undefined) {\n                if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {\n                    if (this.action === 'copy' && target.hasAttribute('disabled')) {\n                        throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n                    }\n\n                    if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n                        throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n                    }\n\n                    this._target = target;\n                } else {\n                    throw new Error('Invalid \"target\" value, use a valid Element');\n                }\n            }\n        }\n\n        /**\n         * Gets the `target` property.\n         * @return {String|HTMLElement}\n         */\n        ,\n        get: function get() {\n            return this._target;\n        }\n    }]);\n\n    return ClipboardAction;\n}();\n\n/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(1);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(2);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n\n// CONCATENATED MODULE: ./src/clipboard.js\nvar clipboard_typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\nvar clipboard_Clipboard = function (_Emitter) {\n    _inherits(Clipboard, _Emitter);\n\n    /**\n     * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n     * @param {Object} options\n     */\n    function Clipboard(trigger, options) {\n        clipboard_classCallCheck(this, Clipboard);\n\n        var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));\n\n        _this.resolveOptions(options);\n        _this.listenClick(trigger);\n        return _this;\n    }\n\n    /**\n     * Defines if attributes would be resolved using internal setter functions\n     * or custom functions that were passed in the constructor.\n     * @param {Object} options\n     */\n\n\n    clipboard_createClass(Clipboard, [{\n        key: 'resolveOptions',\n        value: function resolveOptions() {\n            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n            this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n            this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n            this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n        }\n\n        /**\n         * Adds a click event listener to the passed trigger.\n         * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n         */\n\n    }, {\n        key: 'listenClick',\n        value: function listenClick(trigger) {\n            var _this2 = this;\n\n            this.listener = listen_default()(trigger, 'click', function (e) {\n                return _this2.onClick(e);\n            });\n        }\n\n        /**\n         * Defines a new `ClipboardAction` on each click event.\n         * @param {Event} e\n         */\n\n    }, {\n        key: 'onClick',\n        value: function onClick(e) {\n            var trigger = e.delegateTarget || e.currentTarget;\n\n            if (this.clipboardAction) {\n                this.clipboardAction = null;\n            }\n\n            this.clipboardAction = new clipboard_action({\n                action: this.action(trigger),\n                target: this.target(trigger),\n                text: this.text(trigger),\n                container: this.container,\n                trigger: trigger,\n                emitter: this\n            });\n        }\n\n        /**\n         * Default `action` lookup function.\n         * @param {Element} trigger\n         */\n\n    }, {\n        key: 'defaultAction',\n        value: function defaultAction(trigger) {\n            return getAttributeValue('action', trigger);\n        }\n\n        /**\n         * Default `target` lookup function.\n         * @param {Element} trigger\n         */\n\n    }, {\n        key: 'defaultTarget',\n        value: function defaultTarget(trigger) {\n            var selector = getAttributeValue('target', trigger);\n\n            if (selector) {\n                return document.querySelector(selector);\n            }\n        }\n\n        /**\n         * Returns the support of the given action, or all actions if no action is\n         * given.\n         * @param {String} [action]\n         */\n\n    }, {\n        key: 'defaultText',\n\n\n        /**\n         * Default `text` lookup function.\n         * @param {Element} trigger\n         */\n        value: function defaultText(trigger) {\n            return getAttributeValue('text', trigger);\n        }\n\n        /**\n         * Destroy lifecycle.\n         */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            this.listener.destroy();\n\n            if (this.clipboardAction) {\n                this.clipboardAction.destroy();\n                this.clipboardAction = null;\n            }\n        }\n    }], [{\n        key: 'isSupported',\n        value: function isSupported() {\n            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n\n            var actions = typeof action === 'string' ? [action] : action;\n            var support = !!document.queryCommandSupported;\n\n            actions.forEach(function (action) {\n                support = support && !!document.queryCommandSupported(action);\n            });\n\n            return support;\n        }\n    }]);\n\n    return Clipboard;\n}(tiny_emitter_default.a);\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\n\nfunction getAttributeValue(suffix, element) {\n    var attribute = 'data-clipboard-' + suffix;\n\n    if (!element.hasAttribute(attribute)) {\n        return;\n    }\n\n    return element.getAttribute(attribute);\n}\n\n/* harmony default export */ var clipboard = __webpack_exports__[\"default\"] = (clipboard_Clipboard);\n\n/***/ })\n/******/ ])[\"default\"];\n});"
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/readme.md",
    "content": "# clipboard.js\n\n[![Build Status](http://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://travis-ci.org/zenorocha/clipboard.js)\n![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat)\n\n> Modern copy to clipboard. No Flash. Just 3kb gzipped.\n\n<a href=\"https://clipboardjs.com/\"><img width=\"728\" src=\"https://cloud.githubusercontent.com/assets/398893/16165747/a0f6fc46-349a-11e6-8c9b-c5fd58d9099c.png\" alt=\"Demo\"></a>\n\n## Why\n\nCopying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework.\n\nThat's why clipboard.js exists.\n\n## Install\n\nYou can get it on npm.\n\n```\nnpm install clipboard --save\n```\n\nOr if you're not into package management, just [download a ZIP](https://github.com/zenorocha/clipboard.js/archive/master.zip) file.\n\n## Setup\n\nFirst, include the script located on the `dist` folder or load it from [a third-party CDN provider](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers).\n\n```html\n<script src=\"dist/clipboard.min.js\"></script>\n```\n\nNow, you need to instantiate it by [passing a DOM selector](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18), [HTML element](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17), or [list of HTML elements](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19).\n\n```js\nnew ClipboardJS('.btn');\n```\n\nInternally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.\n\nFor this reason we use [event delegation](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters).\n\n# Usage\n\nWe're living a _declarative renaissance_, that's why we decided to take advantage of [HTML5 data attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) for better usability.\n\n### Copy text from another element\n\nA pretty common use case is to copy content from another element. You can do that by adding a `data-clipboard-target` attribute in your trigger element.\n\nThe value you include on this attribute needs to match another's element selector.\n\n<a href=\"https://clipboardjs.com/#example-target\"><img width=\"473\" alt=\"example-2\" src=\"https://cloud.githubusercontent.com/assets/398893/9983467/a4946aaa-5fb1-11e5-9780-f09fcd7ca6c8.png\"></a>\n\n```html\n<!-- Target -->\n<input id=\"foo\" value=\"https://github.com/zenorocha/clipboard.js.git\">\n\n<!-- Trigger -->\n<button class=\"btn\" data-clipboard-target=\"#foo\">\n    <img src=\"assets/clippy.svg\" alt=\"Copy to clipboard\">\n</button>\n```\n\n### Cut text from another element\n\nAdditionally, you can define a `data-clipboard-action` attribute to specify if you want to either `copy` or `cut` content.\n\nIf you omit this attribute, `copy` will be used by default.\n\n<a href=\"https://clipboardjs.com/#example-action\"><img width=\"473\" alt=\"example-3\" src=\"https://cloud.githubusercontent.com/assets/398893/10000358/7df57b9c-6050-11e5-9cd1-fbc51d2fd0a7.png\"></a>\n\n```html\n<!-- Target -->\n<textarea id=\"bar\">Mussum ipsum cacilds...</textarea>\n\n<!-- Trigger -->\n<button class=\"btn\" data-clipboard-action=\"cut\" data-clipboard-target=\"#bar\">\n    Cut to clipboard\n</button>\n```\n\nAs you may expect, the `cut` action only works on `<input>` or `<textarea>` elements.\n\n### Copy text from attribute\n\nTruth is, you don't even need another element to copy its content from. You can just include a `data-clipboard-text` attribute in your trigger element.\n\n<a href=\"https://clipboardjs.com/#example-text\"><img width=\"147\" alt=\"example-1\" src=\"https://cloud.githubusercontent.com/assets/398893/10000347/6e16cf8c-6050-11e5-9883-1c5681f9ec45.png\"></a>\n\n```html\n<!-- Trigger -->\n<button class=\"btn\" data-clipboard-text=\"Just because you can doesn't mean you should — clipboard.js\">\n    Copy to clipboard\n</button>\n```\n\n## Events\n\nThere are cases where you'd like to show some user feedback or capture what has been selected after a copy/cut operation.\n\nThat's why we fire custom events such as `success` and `error` for you to listen and implement your custom logic.\n\n```js\nvar clipboard = new ClipboardJS('.btn');\n\nclipboard.on('success', function(e) {\n    console.info('Action:', e.action);\n    console.info('Text:', e.text);\n    console.info('Trigger:', e.trigger);\n\n    e.clearSelection();\n});\n\nclipboard.on('error', function(e) {\n    console.error('Action:', e.action);\n    console.error('Trigger:', e.trigger);\n});\n```\n\nFor a live demonstration, go to this [site](https://clipboardjs.com/) and open your console.\n\n## Tooltips\n\nEach application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.\n\nThe tooltips you see on the [demo site](https://clipboardjs.com/) were built using [GitHub's Primer](https://primer.style/css/components/tooltips). You may want to check that out if you're looking for a similar look and feel.\n\n## Advanced Options\n\nIf you don't want to modify your HTML, there's a pretty handy imperative API for you to use. All you need to do is declare a function, do your thing, and return a value.\n\nFor instance, if you want to dynamically set a `target`, you'll need to return a Node.\n\n```js\nnew ClipboardJS('.btn', {\n    target: function(trigger) {\n        return trigger.nextElementSibling;\n    }\n});\n```\n\nIf you want to dynamically set a `text`, you'll return a String.\n\n```js\nnew ClipboardJS('.btn', {\n    text: function(trigger) {\n        return trigger.getAttribute('aria-label');\n    }\n});\n```\n\nFor use in Bootstrap Modals or with any other library that changes the focus you'll want to set the focused element as the `container` value.\n\n```js\nnew ClipboardJS('.btn', {\n    container: document.getElementById('modal')\n});\n```\n\nAlso, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.\n\n```js\nvar clipboard = new ClipboardJS('.btn');\nclipboard.destroy();\n```\n\n## Browser Support\n\nThis library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The first one is [supported by all browsers](https://caniuse.com/#search=selection) while the second one is supported in the following browsers.\n\n| <img src=\"https://clipboardjs.com/assets/images/chrome.png\" width=\"48px\" height=\"48px\" alt=\"Chrome logo\"> | <img src=\"https://clipboardjs.com/assets/images/edge.png\" width=\"48px\" height=\"48px\" alt=\"Edge logo\"> | <img src=\"https://clipboardjs.com/assets/images/firefox.png\" width=\"48px\" height=\"48px\" alt=\"Firefox logo\"> | <img src=\"https://clipboardjs.com/assets/images/ie.png\" width=\"48px\" height=\"48px\" alt=\"Internet Explorer logo\"> | <img src=\"https://clipboardjs.com/assets/images/opera.png\" width=\"48px\" height=\"48px\" alt=\"Opera logo\"> | <img src=\"https://clipboardjs.com/assets/images/safari.png\" width=\"48px\" height=\"48px\" alt=\"Safari logo\"> |\n|:---:|:---:|:---:|:---:|:---:|:---:|\n| 42+ ✔ | 12+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | 10+ ✔ |\n\nThe good news is that clipboard.js gracefully degrades if you need to support older browsers. All you have to do is show a tooltip saying `Copied!` when `success` event is called and `Press Ctrl+C to copy` when `error` event is called because the text is already selected.\n\nYou can also check if clipboard.js is supported or not by running `ClipboardJS.isSupported()`, that way you can hide copy/cut buttons from the UI.\n\n## Bonus\n\nA browser extension that adds a \"copy to clipboard\" button to every code block on *GitHub, MDN, Gist, StackOverflow, StackExchange, npm, and even Medium.*\n\nInstall for [Chrome](https://chrome.google.com/webstore/detail/codecopy/fkbfebkcoelajmhanocgppanfoojcdmg) and [Firefox](https://addons.mozilla.org/en-US/firefox/addon/codecopy/).\n\n## License\n\n[MIT License](https://zenorocha.mit-license.org/) © Zeno Rocha\n"
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/(already in typescript)",
    "content": ""
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/LICENSE",
    "content": "easy.filter Bresenham\nhttp://members.chello.at/easyfilter/bresenham.html\nAlois Zingl, Vienna, Austria\nBresenham Curve Rasterizing Algorithms\nUsed with explicit permission, e-mail on Oct 27 2017"
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/bresenham.js",
    "content": "/**\n * Bresenham Curve Rasterizing Algorithms\n * @author  Zingl Alois\n * @date    17.12.2014\n * @version 1.3\n * @url     http://members.chello.at/easyfilter/bresenham.html\n*/\n\nfunction assert(a) {\n    if (!a) console.log(\"Assertion failed in bresenham.js \"+a);\n    return a;\n}\n    \nfunction plotLine(x0, y0, x1, y1)\n{\n    var dx =  Math.abs(x1-x0), sx = x0<x1 ? 1 : -1;\n    var dy = -Math.abs(y1-y0), sy = y0<y1 ? 1 : -1;\n    var err = dx+dy, e2;                                   /* error value e_xy */\n\n    for (;;){                                                          /* loop */\n            setPixel(x0,y0);\n            if (x0 == x1 && y0 == y1) break;\n            e2 = 2*err;\n            if (e2 >= dy) { err += dy; x0 += sx; }                        /* x step */\n            if (e2 <= dx) { err += dx; y0 += sy; }                        /* y step */\n    }\n}\n\nfunction plotEllipse(xm, ym, a, b)\n{\n    var x = -a, y = 0;           /* II. quadrant from bottom left to top right */\n    var e2, dx = (1+2*x)*b*b;                              /* error increment  */\n    var dy = x*x, err = dx+dy;                              /* error of 1.step */\n\n    do {\n            setPixel(xm-x, ym+y);                                 /*   I. Quadrant */\n            setPixel(xm+x, ym+y);                                 /*  II. Quadrant */\n            setPixel(xm+x, ym-y);                                 /* III. Quadrant */\n            setPixel(xm-x, ym-y);                                 /*  IV. Quadrant */\n            e2 = 2*err;                                        \n            if (e2 >= dx) { x++; err += dx += 2*b*b; }                   /* x step */\n            if (e2 <= dy) { y++; err += dy += 2*a*a; }                   /* y step */\n    } while (x <= 0);\n\n    while (y++ < b) {            /* too early stop for flat ellipses with a=1, */\n            setPixel(xm, ym+y);                        /* -> finish tip of ellipse */\n            setPixel(xm, ym-y);\n    }\n}\n\nfunction plotCircle(xm, ym, r)\n{\n    var x = -r, y = 0, err = 2-2*r;                /* bottom left to top right */\n    do {\n            setPixel(xm-x, ym+y);                            /*   I. Quadrant +x +y */\n            setPixel(xm-y, ym-x);                            /*  II. Quadrant -x +y */\n            setPixel(xm+x, ym-y);                            /* III. Quadrant -x -y */\n            setPixel(xm+y, ym+x);                            /*  IV. Quadrant +x -y */\n            r = err;                                       \n            if (r <= y) err += ++y*2+1;                                   /* y step */\n            if (r > x || err > y) err += ++x*2+1;                         /* x step */\n    } while (x < 0);\n}\n\nfunction plotEllipseRect(x0, y0, x1, y1)\n{                              /* rectangular parameter enclosing the ellipse */\n    var a = Math.abs(x1-x0), b = Math.abs(y1-y0), b1 = b&1;        /* diameter */\n    var dx = 4*(1.0-a)*b*b, dy = 4*(b1+1)*a*a;              /* error increment */\n    var err = dx+dy+b1*a*a, e2;                             /* error of 1.step */\n\n    if (x0 > x1) { x0 = x1; x1 += a; }        /* if called with swapped points */\n    if (y0 > y1) y0 = y1;                                  /* .. exchange them */\n    y0 += (b+1)>>1; y1 = y0-b1;                              /* starting pixel */\n    a = 8*a*a; b1 = 8*b*b;                               \n                                                                                                                \n    do {                                                 \n            setPixel(x1, y0);                                      /*   I. Quadrant */\n            setPixel(x0, y0);                                      /*  II. Quadrant */\n            setPixel(x0, y1);                                      /* III. Quadrant */\n            setPixel(x1, y1);                                      /*  IV. Quadrant */\n            e2 = 2*err;\n            if (e2 <= dy) { y0++; y1--; err += dy += a; }                 /* y step */\n            if (e2 >= dx || 2*err > dy) { x0++; x1--; err += dx += b1; }       /* x */\n    } while (x0 <= x1);\n\n    while (y0-y1 <= b) {                /* too early stop of flat ellipses a=1 */\n            setPixel(x0-1, y0);                         /* -> finish tip of ellipse */\n            setPixel(x1+1, y0++);\n            setPixel(x0-1, y1);\n            setPixel(x1+1, y1--);\n    }\n}\n\nfunction plotQuadBezierSeg(x0, y0, x1, y1, x2, y2)\n{                                  /* plot a limited quadratic Bezier segment */\n    var sx = x2-x1, sy = y2-y1;\n    var xx = x0-x1, yy = y0-y1, xy;               /* relative values for checks */\n    var dx, dy, err, cur = xx*sy-yy*sx;                            /* curvature */\n\n    assert(xx*sx <= 0 && yy*sy <= 0);       /* sign of gradient must not change */\n\n    if (sx*sx+sy*sy > xx*xx+yy*yy) {                 /* begin with shorter part */\n        x2 = x0; x0 = sx+x1; y2 = y0; y0 = sy+y1; cur = -cur;       /* swap P0 P2 */\n    }\n    if (cur != 0) {                                         /* no straight line */\n        xx += sx; xx *= sx = x0 < x2 ? 1 : -1;                /* x step direction */\n        yy += sy; yy *= sy = y0 < y2 ? 1 : -1;                /* y step direction */\n        xy = 2*xx*yy; xx *= xx; yy *= yy;               /* differences 2nd degree */\n        if (cur*sx*sy < 0) {                                /* negated curvature? */\n            xx = -xx; yy = -yy; xy = -xy; cur = -cur;\n        }\n        dx = 4.0*sy*cur*(x1-x0)+xx-xy;                  /* differences 1st degree */\n        dy = 4.0*sx*cur*(y0-y1)+yy-xy;\n        xx += xx; yy += yy; err = dx+dy+xy;                     /* error 1st step */\n        do {\n            setPixel(x0,y0);                                          /* plot curve */\n            if (x0 == x2 && y0 == y2) return;       /* last pixel -> curve finished */\n            y1 = 2*err < dx;                       /* save value for test of y step */\n            if (2*err > dy) { x0 += sx; dx -= xy; err += dy += yy; }      /* x step */\n            if (    y1    ) { y0 += sy; dy -= xy; err += dx += xx; }      /* y step */\n        } while (dy < 0 && dx > 0);        /* gradient negates -> algorithm fails */\n    }\n    plotLine(x0,y0, x2,y2);                       /* plot remaining part to end */\n}\n\nfunction plotQuadBezier(x0, y0, x1, y1, x2, y2)\n{                                          /* plot any quadratic Bezier curve */\n    var x = x0-x1, y = y0-y1, t = x0-2*x1+x2, r;\n\n    if (x*(x2-x1) > 0) {                              /* horizontal cut at P4? */\n            if (y*(y2-y1) > 0)                           /* vertical cut at P6 too? */\n                if (Math.abs((y0-2*y1+y2)/t*x) > Math.abs(y)) {      /* which first? */\n                        x0 = x2; x2 = x+x1; y0 = y2; y2 = y+y1;            /* swap points */\n                }                            /* now horizontal cut at P4 comes first */\n            t = (x0-x1)/t;\n            r = (1-t)*((1-t)*y0+2.0*t*y1)+t*t*y2;                       /* By(t=P4) */\n            t = (x0*x2-x1*x1)*t/(x0-x1);                       /* gradient dP4/dx=0 */\n            x = Math.floor(t+0.5); y = Math.floor(r+0.5);\n            r = (y1-y0)*(t-x0)/(x1-x0)+y0;                  /* intersect P3 | P0 P1 */\n            plotQuadBezierSeg(x0,y0, x,Math.floor(r+0.5), x,y);\n            r = (y1-y2)*(t-x2)/(x1-x2)+y2;                  /* intersect P4 | P1 P2 */\n            x0 = x1 = x; y0 = y; y1 = Math.floor(r+0.5);        /* P0 = P4, P1 = P8 */\n    }\n    if ((y0-y1)*(y2-y1) > 0) {                          /* vertical cut at P6? */\n            t = y0-2*y1+y2; t = (y0-y1)/t;\n            r = (1-t)*((1-t)*x0+2.0*t*x1)+t*t*x2;                       /* Bx(t=P6) */\n            t = (y0*y2-y1*y1)*t/(y0-y1);                       /* gradient dP6/dy=0 */\n            x = Math.floor(r+0.5); y = Math.floor(t+0.5);\n            r = (x1-x0)*(t-y0)/(y1-y0)+x0;                  /* intersect P6 | P0 P1 */\n            plotQuadBezierSeg(x0,y0, Math.floor(r+0.5),y, x,y);\n            r = (x1-x2)*(t-y2)/(y1-y2)+x2;                  /* intersect P7 | P1 P2 */\n            x0 = x; x1 = Math.floor(r+0.5); y0 = y1 = y;        /* P0 = P6, P1 = P7 */\n    }\n    plotQuadBezierSeg(x0,y0, x1,y1, x2,y2);                  /* remaining part */\n}\n\nfunction plotQuadRationalBezierSeg(x0, y0, x1, y1, x2, y2, w)\n{                   /* plot a limited rational Bezier segment, squared weight */\n    var sx = x2-x1, sy = y2-y1;                   /* relative values for checks */\n    var dx = x0-x2, dy = y0-y2, xx = x0-x1, yy = y0-y1;\n    var xy = xx*sy+yy*sx, cur = xx*sy-yy*sx, err;                  /* curvature */\n\n    assert(xx*sx <= 0.0 && yy*sy <= 0.0);   /* sign of gradient must not change */\n\n    if (cur != 0.0 && w > 0.0) {                            /* no straight line */\n        if (sx*sx+sy*sy > xx*xx+yy*yy) {               /* begin with shorter part */\n            x2 = x0; x0 -= dx; y2 = y0; y0 -= dy; cur = -cur;         /* swap P0 P2 */\n        }\n        xx = 2.0*(4.0*w*sx*xx+dx*dx);                   /* differences 2nd degree */\n        yy = 2.0*(4.0*w*sy*yy+dy*dy);\n        sx = x0 < x2 ? 1 : -1;                                /* x step direction */\n        sy = y0 < y2 ? 1 : -1;                                /* y step direction */\n        xy = -2.0*sx*sy*(2.0*w*xy+dx*dy);\n\n        if (cur*sx*sy < 0.0) {                              /* negated curvature? */\n            xx = -xx; yy = -yy; xy = -xy; cur = -cur;\n        }\n        dx = 4.0*w*(x1-x0)*sy*cur+xx/2.0+xy;            /* differences 1st degree */\n        dy = 4.0*w*(y0-y1)*sx*cur+yy/2.0+xy;\n\n        if (w < 0.5 && (dy > xy || dx < xy)) {   /* flat ellipse, algorithm fails */\n            cur = (w+1.0)/2.0; w = Math.sqrt(w); xy = 1.0/(w+1.0);\n            sx = Math.floor((x0+2.0*w*x1+x2)*xy/2.0+0.5);/*subdivide curve in half */\n            sy = Math.floor((y0+2.0*w*y1+y2)*xy/2.0+0.5);\n            dx = Math.floor((w*x1+x0)*xy+0.5); dy = Math.floor((y1*w+y0)*xy+0.5);\n            plotQuadRationalBezierSeg(x0,y0, dx,dy, sx,sy, cur);/* plot separately */\n            dx = Math.floor((w*x1+x2)*xy+0.5); dy = Math.floor((y1*w+y2)*xy+0.5);\n            plotQuadRationalBezierSeg(sx,sy, dx,dy, x2,y2, cur);\n            return;\n        }\n        err = dx+dy-xy;                                           /* error 1.step */\n        do {\n            setPixel(x0,y0);                                          /* plot curve */\n            if (x0 == x2 && y0 == y2) return;       /* last pixel -> curve finished */\n            x1 = 2*err > dy; y1 = 2*(err+yy) < -dy;/* save value for test of x step */\n            if (2*err < dx || y1) { y0 += sy; dy += xy; err += dx += xx; }/* y step */\n            if (2*err > dx || x1) { x0 += sx; dx += xy; err += dy += yy; }/* x step */\n        } while (dy <= xy && dx >= xy);    /* gradient negates -> algorithm fails */\n    }\n    plotLine(x0,y0, x2,y2);                     /* plot remaining needle to end */\n}\n\nfunction plotQuadRationalBezier(x0, y0, x1, y1, x2, y2, w)\n{                                 /* plot any quadratic rational Bezier curve */\n    var x = x0-2*x1+x2, y = y0-2*y1+y2;\n    var xx = x0-x1, yy = y0-y1, ww, t, q;\n\n    assert(w >= 0.0);\n\n    if (xx*(x2-x1) > 0) {                             /* horizontal cut at P4? */\n            if (yy*(y2-y1) > 0)                          /* vertical cut at P6 too? */\n                if (Math.abs(xx*y) > Math.abs(yy*x)) {               /* which first? */\n                        x0 = x2; x2 = xx+x1; y0 = y2; y2 = yy+y1;          /* swap points */\n                }                            /* now horizontal cut at P4 comes first */\n            if (x0 == x2 || w == 1.0) t = (x0-x1)/x;\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(x0-x1)*(x2-x1)+(x2-x0)*(x2-x0));\n                if (x1 < x0) q = -q;\n                t = (2.0*w*(x0-x1)-x0+x2+q)/(2.0*(1.0-w)*(x2-x0));        /* t at P4 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P4 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P3 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P8 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);                   /* P4 */\n            yy = (xx-x0)*(y1-y0)/(x1-x0)+y0;                /* intersect P3 | P0 P1 */\n            plotQuadRationalBezierSeg(x0,y0, x,Math.floor(yy+0.5), x,y, ww);\n            yy = (xx-x2)*(y1-y2)/(x1-x2)+y2;                /* intersect P4 | P1 P2 */\n            y1 = Math.floor(yy+0.5); x0 = x1 = x; y0 = y;       /* P0 = P4, P1 = P8 */\n    }\n    if ((y0-y1)*(y2-y1) > 0) {                          /* vertical cut at P6? */\n            if (y0 == y2 || w == 1.0) t = (y0-y1)/(y0-2.0*y1+y2);\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(y0-y1)*(y2-y1)+(y2-y0)*(y2-y0));\n                if (y1 < y0) q = -q;\n                t = (2.0*w*(y0-y1)-y0+y2+q)/(2.0*(1.0-w)*(y2-y0));        /* t at P6 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P6 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P5 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P7 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);           /* P6 */\n            xx = (x1-x0)*(yy-y0)/(y1-y0)+x0;                /* intersect P6 | P0 P1 */\n            plotQuadRationalBezierSeg(x0,y0, Math.floor(xx+0.5),y, x,y, ww);\n            xx = (x1-x2)*(yy-y2)/(y1-y2)+x2;                /* intersect P7 | P1 P2 */\n            x1 = Math.floor(xx+0.5); x0 = x; y0 = y1 = y;       /* P0 = P6, P1 = P7 */\n    }\n    plotQuadRationalBezierSeg(x0,y0, x1,y1, x2,y2, w*w);          /* remaining */\n}\n\nfunction plotRotatedEllipse(x, y, a, b, angle)\n{                                   /* plot ellipse rotated by angle (radian) */\n    var xd = a*a, yd = b*b;\n    var s = Math.sin(angle), zd = (xd-yd)*s;               /* ellipse rotation */\n    xd = Math.sqrt(xd-zd*s), yd = Math.sqrt(yd+zd*s);      /* surrounding rect */\n    a = Math.floor(xd+0.5); b = Math.floor(yd+0.5); zd = zd*a*b/(xd*yd);  \n    plotRotatedEllipseRect(x-a,y-b, x+a,y+b, (4*zd*Math.cos(angle)));\n}\n\nfunction plotRotatedEllipseRect(x0, y0, x1, y1, zd)\n{                  /* rectangle enclosing the ellipse, integer rotation angle */\n    var xd = x1-x0, yd = y1-y0, w = xd*yd;\n    if (zd == 0) return plotEllipseRect(x0,y0, x1,y1);          /* looks nicer */\n    if (w != 0.0) w = (w-zd)/(w+w);                    /* squared weight of P1 */\n    assert(w <= 1.0 && w >= 0.0);                /* limit angle to |zd|<=xd*yd */\n    xd = Math.floor(xd*w+0.5); yd = Math.floor(yd*w+0.5);       /* snap to int */\n    plotQuadRationalBezierSeg(x0,y0+yd, x0,y0, x0+xd,y0, 1.0-w);\n    plotQuadRationalBezierSeg(x0,y0+yd, x0,y1, x1-xd,y1, w);\n    plotQuadRationalBezierSeg(x1,y1-yd, x1,y1, x1-xd,y1, 1.0-w);\n    plotQuadRationalBezierSeg(x1,y1-yd, x1,y0, x0+xd,y0, w);\n}\n\nfunction plotCubicBezierSeg(x0, y0, x1, y1, x2, y2, x3, y3)\n{                                        /* plot limited cubic Bezier segment */\n    var f, fx, fy, leg = 1;\n    var sx = x0 < x3 ? 1 : -1, sy = y0 < y3 ? 1 : -1;        /* step direction */\n    var xc = -Math.abs(x0+x1-x2-x3), xa = xc-4*sx*(x1-x2), xb = sx*(x0-x1-x2+x3);\n    var yc = -Math.abs(y0+y1-y2-y3), ya = yc-4*sy*(y1-y2), yb = sy*(y0-y1-y2+y3);\n    var ab, ac, bc, cb, xx, xy, yy, dx, dy, ex, pxy, EP = 0.01;\n                                                                                                /* check for curve restrains */\n    /* slope P0-P1 == P2-P3    and  (P0-P3 == P1-P2      or  no slope change)  */\n    assert((x1-x0)*(x2-x3) < EP && ((x3-x0)*(x1-x2) < EP || xb*xb < xa*xc+EP));\n    assert((y1-y0)*(y2-y3) < EP && ((y3-y0)*(y1-y2) < EP || yb*yb < ya*yc+EP));\n\n    if (xa == 0 && ya == 0)                                /* quadratic Bezier */\n            return plotQuadBezierSeg(x0,y0, (3*x1-x0)>>1,(3*y1-y0)>>1, x3,y3);\n    x1 = (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+1;                    /* line lengths */\n    x2 = (x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)+1;\n\n    do {                                                /* loop over both ends */\n            ab = xa*yb-xb*ya; ac = xa*yc-xc*ya; bc = xb*yc-xc*yb;\n            ex = ab*(ab+ac-3*bc)+ac*ac;       /* P0 part of self-intersection loop? */\n            f = ex > 0 ? 1 : Math.floor(Math.sqrt(1+1024/x1));   /* calc resolution */\n            ab *= f; ac *= f; bc *= f; ex *= f*f;            /* increase resolution */\n            xy = 9*(ab+ac+bc)/8; cb = 8*(xa-ya);  /* init differences of 1st degree */\n            dx = 27*(8*ab*(yb*yb-ya*yc)+ex*(ya+2*yb+yc))/64-ya*ya*(xy-ya);\n            dy = 27*(8*ab*(xb*xb-xa*xc)-ex*(xa+2*xb+xc))/64-xa*xa*(xy+xa);\n                                                                                        /* init differences of 2nd degree */\n            xx = 3*(3*ab*(3*yb*yb-ya*ya-2*ya*yc)-ya*(3*ac*(ya+yb)+ya*cb))/4;\n            yy = 3*(3*ab*(3*xb*xb-xa*xa-2*xa*xc)-xa*(3*ac*(xa+xb)+xa*cb))/4;\n            xy = xa*ya*(6*ab+6*ac-3*bc+cb); ac = ya*ya; cb = xa*xa;\n            xy = 3*(xy+9*f*(cb*yb*yc-xb*xc*ac)-18*xb*yb*ab)/8;\n\n            if (ex < 0) {         /* negate values if inside self-intersection loop */\n                dx = -dx; dy = -dy; xx = -xx; yy = -yy; xy = -xy; ac = -ac; cb = -cb;\n            }                                     /* init differences of 3rd degree */\n            ab = 6*ya*ac; ac = -6*xa*ac; bc = 6*ya*cb; cb = -6*xa*cb;\n            dx += xy; ex = dx+dy; dy += xy;                    /* error of 1st step */\nexit: \n            for (pxy = 0, fx = fy = f; x0 != x3 && y0 != y3; ) {\n                setPixel(x0,y0);                                       /* plot curve */\n                do {                                  /* move sub-steps of one pixel */\n                        if (pxy == 0) if (dx > xy || dy < xy) break exit;    /* confusing */\n                        if (pxy == 1) if (dx > 0 || dy < 0) break exit;         /* values */\n                        y1 = 2*ex-dy;                    /* save value for test of y step */\n                        if (2*ex >= dx) {                                   /* x sub-step */\n                            fx--; ex += dx += xx; dy += xy += ac; yy += bc; xx += ab;\n                        } else if (y1 > 0) break exit;\n                        if (y1 <= 0) {                                      /* y sub-step */\n                            fy--; ex += dy += yy; dx += xy += bc; xx += ac; yy += cb;\n                        }\n                } while (fx > 0 && fy > 0);                       /* pixel complete? */\n                if (2*fx <= f) { x0 += sx; fx += f; }                      /* x step */\n                if (2*fy <= f) { y0 += sy; fy += f; }                      /* y step */\n                if (pxy == 0 && dx < 0 && dy > 0) pxy = 1;      /* pixel ahead valid */\n            }\n            xx = x0; x0 = x3; x3 = xx; sx = -sx; xb = -xb;             /* swap legs */\n            yy = y0; y0 = y3; y3 = yy; sy = -sy; yb = -yb; x1 = x2;\n    } while (leg--);                                          /* try other end */\n    plotLine(x0,y0, x3,y3);       /* remaining part in case of cusp or crunode */\n}\n\nfunction plotCubicBezier(x0, y0, x1, y1, x2, y2, x3, y3)\n{                                              /* plot any cubic Bezier curve */\n    var n = 0, i = 0;\n    var xc = x0+x1-x2-x3, xa = xc-4*(x1-x2);\n    var xb = x0-x1-x2+x3, xd = xb+4*(x1+x2);\n    var yc = y0+y1-y2-y3, ya = yc-4*(y1-y2);\n    var yb = y0-y1-y2+y3, yd = yb+4*(y1+y2);\n    var fx0 = x0, fx1, fx2, fx3, fy0 = y0, fy1, fy2, fy3;\n    var t1 = xb*xb-xa*xc, t2, t = new Array(5);\n                                                                /* sub-divide curve at gradient sign changes */\n    if (xa == 0) {                                               /* horizontal */\n            if (Math.abs(xc) < 2*Math.abs(xb)) t[n++] = xc/(2.0*xb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (xb-t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (xb+t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    t1 = yb*yb-ya*yc;\n    if (ya == 0) {                                                 /* vertical */\n            if (Math.abs(yc) < 2*Math.abs(yb)) t[n++] = yc/(2.0*yb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (yb-t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (yb+t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    for (i = 1; i < n; i++)                         /* bubble sort of 4 points */\n            if ((t1 = t[i-1]) > t[i]) { t[i-1] = t[i]; t[i] = t1; i = 0; }\n\n    t1 = -1.0; t[n] = 1.0;                                /* begin / end point */\n    for (i = 0; i <= n; i++) {                 /* plot each segment separately */\n            t2 = t[i];                                /* sub-divide at t[i-1], t[i] */\n            fx1 = (t1*(t1*xb-2*xc)-t2*(t1*(t1*xa-2*xb)+xc)+xd)/8-fx0;\n            fy1 = (t1*(t1*yb-2*yc)-t2*(t1*(t1*ya-2*yb)+yc)+yd)/8-fy0;\n            fx2 = (t2*(t2*xb-2*xc)-t1*(t2*(t2*xa-2*xb)+xc)+xd)/8-fx0;\n            fy2 = (t2*(t2*yb-2*yc)-t1*(t2*(t2*ya-2*yb)+yc)+yd)/8-fy0;\n            fx0 -= fx3 = (t2*(t2*(3*xb-t2*xa)-3*xc)+xd)/8;\n            fy0 -= fy3 = (t2*(t2*(3*yb-t2*ya)-3*yc)+yd)/8;\n            x3 = Math.floor(fx3+0.5); y3 = Math.floor(fy3+0.5);     /* scale bounds */\n            if (fx0 != 0.0) { fx1 *= fx0 = (x0-x3)/fx0; fx2 *= fx0; }\n            if (fy0 != 0.0) { fy1 *= fy0 = (y0-y3)/fy0; fy2 *= fy0; }\n            if (x0 != x3 || y0 != y3)                            /* segment t1 - t2 */\n                plotCubicBezierSeg(x0,y0, x0+fx1,y0+fy1, x0+fx2,y0+fy2, x3,y3);\n            x0 = x3; y0 = y3; fx0 = fx3; fy0 = fy3; t1 = t2;\n    }\n}\n\nfunction plotLineAA(x0, y0, x1, y1)\n{             /* draw a black (0) anti-aliased line on white (255) background */\n    var dx = Math.abs(x1-x0), sx = x0 < x1 ? 1 : -1;\n    var dy = Math.abs(y1-y0), sy = y0 < y1 ? 1 : -1;\n    var err = dx-dy, e2, x2;                               /* error value e_xy */\n    var ed = dx+dy == 0 ? 1 : Math.sqrt(dx*dx+dy*dy);\n\n    for ( ; ; ){                                                 /* pixel loop */\n            setPixelAA(x0,y0, 255*Math.abs(err-dx+dy)/ed);\n            e2 = err; x2 = x0;\n            if (2*e2 >= -dx) {                                            /* x step */\n                if (x0 == x1) break;\n                if (e2+dy < ed) setPixelAA(x0,y0+sy, 255*(e2+dy)/ed);\n                err -= dy; x0 += sx;\n            }\n            if (2*e2 <= dy) {                                             /* y step */\n                if (y0 == y1) break;\n                if (dx-e2 < ed) setPixelAA(x2+sx,y0, 255*(dx-e2)/ed);\n                err += dx; y0 += sy;\n            }\n    }\n}\n\nfunction plotCircleAA(xm, ym, r)\n{                     /* draw a black anti-aliased circle on white background */\n    var x = r, y = 0;            /* II. quadrant from bottom left to top right */\n    var i, x2, e2, err = 2-2*r;                             /* error of 1.step */\n    r = 1-err;\n    for ( ; ; ) {\n            i = 255*Math.abs(err+2*(x+y)-2)/r;          /* get blend value of pixel */\n            setPixelAA(xm+x, ym-y, i);                             /*   I. Quadrant */\n            setPixelAA(xm+y, ym+x, i);                             /*  II. Quadrant */\n            setPixelAA(xm-x, ym+y, i);                             /* III. Quadrant */\n            setPixelAA(xm-y, ym-x, i);                             /*  IV. Quadrant */\n            if (x == 0) break;\n            e2 = err; x2 = x;                                    /* remember values */\n            if (err > y) {                                                /* x step */\n                i = 255*(err+2*x-1)/r;                              /* outward pixel */\n                if (i < 255) {\n                        setPixelAA(xm+x, ym-y+1, i);\n                        setPixelAA(xm+y-1, ym+x, i);\n                        setPixelAA(xm-x, ym+y-1, i);\n                        setPixelAA(xm-y+1, ym-x, i);\n                }  \n                err -= --x*2-1; \n            } \n            if (e2 <= x2--) {                                             /* y step */\n                i = 255*(1-2*y-e2)/r;                                /* inward pixel */\n                if (i < 255) {\n                        setPixelAA(xm+x2, ym-y, i);\n                        setPixelAA(xm+y, ym+x2, i);\n                        setPixelAA(xm-x2, ym+y, i);\n                        setPixelAA(xm-y, ym-x2, i);\n                }  \n                err -= --y*2-1; \n            } \n    }\n}\n\nfunction plotEllipseRectAA(x0, y0, x1, y1)\n{        /* draw a black anti-aliased rectangular ellipse on white background */\n    var a = Math.abs(x1-x0), b = Math.abs(y1-y0), b1 = b&1;        /* diameter */\n    var dx = 4*(a-1)*b*b, dy = 4*(b1+1)*a*a;                /* error increment */\n    var f, ed, i, err = b1*a*a-dx+dy;                       /* error of 1.step */\n\n    if (a == 0 || b == 0) return plotLine(x0,y0, x1,y1);\n    if (x0 > x1) { x0 = x1; x1 += a; }        /* if called with swapped points */\n    if (y0 > y1) y0 = y1;                                  /* .. exchange them */\n    y0 += (b+1)>>1; y1 = y0-b1;                              /* starting pixel */\n    a = 8*a*a; b1 = 8*b*b;\n\n    for (;;) {                        /* approximate ed=Math.sqrt(dx*dx+dy*dy) */\n            i = Math.min(dx,dy); ed = Math.max(dx,dy);\n            if (y0 == y1+1 && err > dy && a > b1) ed = 255*4/a;            /* x-tip */\n            else ed = 255/(ed+2*ed*i*i/(4*ed*ed+i*i));             /* approximation */\n            i = ed*Math.abs(err+dx-dy);         /* get intensity value by pixel err */\n            setPixelAA(x0,y0, i); setPixelAA(x0,y1, i);\n            setPixelAA(x1,y0, i); setPixelAA(x1,y1, i);\n\n            if (f = 2*err+dy >= 0) {                  /* x step, remember condition */\n                if (x0 >= x1) break;\n                i = ed*(err+dx);\n                if (i < 256) {\n                        setPixelAA(x0,y0+1, i); setPixelAA(x0,y1-1, i);\n                        setPixelAA(x1,y0+1, i); setPixelAA(x1,y1-1, i);\n                }          /* do error increment later since values are still needed */\n            }\n            if (2*err <= dx) {                                            /* y step */\n                i = ed*(dy-err);\n                if (i < 256) {\n                        setPixelAA(x0+1,y0, i); setPixelAA(x1-1,y0, i);\n                        setPixelAA(x0+1,y1, i); setPixelAA(x1-1,y1, i);\n                }\n                y0++; y1--; err += dy += a;\n            }\n            if (f) { x0++; x1--; err -= dx -= b1; }            /* x error increment */\n    }\n    if (--x0 == x1++)                       /* too early stop of flat ellipses */\n            while (y0-y1 < b) {\n                i = 255*4*Math.abs(err+dx)/b1;           /* -> finish tip of ellipse */\n                setPixelAA(x0,++y0, i); setPixelAA(x1,y0, i);\n                setPixelAA(x0,--y1, i); setPixelAA(x1,y1, i);\n                err += dy += a;\n            }\n}\n\nfunction plotQuadBezierSegAA(x0, y0, x1, y1, x2, y2)\n{                    /* draw an limited anti-aliased quadratic Bezier segment */\n    var sx = x2-x1, sy = y2-y1;\n    var xx = x0-x1, yy = y0-y1, xy;              /* relative values for checks */\n    var dx, dy, err, ed, cur = xx*sy-yy*sx;                       /* curvature */\n\n    assert(xx*sx <= 0 && yy*sy <= 0);      /* sign of gradient must not change */\n\n    if (sx*sx+sy*sy > xx*xx+yy*yy) {                /* begin with shorter part */\n            x2 = x0; x0 = sx+x1; y2 = y0; y0 = sy+y1; cur = -cur;     /* swap P0 P2 */\n    }\n    if (cur != 0)\n    {                                                      /* no straight line */\n            xx += sx; xx *= sx = x0 < x2 ? 1 : -1;              /* x step direction */\n            yy += sy; yy *= sy = y0 < y2 ? 1 : -1;              /* y step direction */\n            xy = 2*xx*yy; xx *= xx; yy *= yy;             /* differences 2nd degree */\n            if (cur*sx*sy < 0) {                              /* negated curvature? */\n                xx = -xx; yy = -yy; xy = -xy; cur = -cur;\n            }\n            dx = 4.0*sy*(x1-x0)*cur+xx-xy;                /* differences 1st degree */\n            dy = 4.0*sx*(y0-y1)*cur+yy-xy;\n            xx += xx; yy += yy; err = dx+dy+xy;                   /* error 1st step */\n            do {\n                cur = Math.min(dx+xy,-xy-dy);\n                ed = Math.max(dx+xy,-xy-dy);           /* approximate error distance */\n                ed += 2*ed*cur*cur/(4*ed*ed+cur*cur);\n                setPixelAA(x0,y0, 255*Math.abs(err-dx-dy-xy)/ed);      /* plot curve */\n                if (x0 == x2 || y0 == y2) break;     /* last pixel -> curve finished */\n                x1 = x0; cur = dx-err; y1 = 2*err+dy < 0;\n                if (2*err+dx > 0) {                                        /* x step */\n                        if (err-dy < ed) setPixelAA(x0,y0+sy, 255*Math.abs(err-dy)/ed);\n                        x0 += sx; dx -= xy; err += dy += yy;\n                }\n                if (y1) {                                                  /* y step */\n                        if (cur < ed) setPixelAA(x1+sx,y0, 255*Math.abs(cur)/ed);\n                        y0 += sy; dy -= xy; err += dx += xx;\n                }\n            } while (dy < dx);                  /* gradient negates -> close curves */\n    }\n    plotLineAA(x0,y0, x2,y2);                  /* plot remaining needle to end */\n}\n\nfunction plotQuadBezierAA(x0, y0, x1, y1, x2, y2)\n{                             /* plot any anti-aliased quadratic Bezier curve */\n    var x = x0-x1, y = y0-y1, t = x0-2*x1+x2, r;\n\n    if (x*(x2-x1) > 0) {                              /* horizontal cut at P4? */\n            if (y*(y2-y1) > 0)                           /* vertical cut at P6 too? */\n                if (Math.abs((y0-2*y1+y2)/t*x) > Math.abs(y)) {      /* which first? */\n                        x0 = x2; x2 = x+x1; y0 = y2; y2 = y+y1;            /* swap points */\n                }                            /* now horizontal cut at P4 comes first */\n            t = (x0-x1)/t;\n            r = (1-t)*((1-t)*y0+2.0*t*y1)+t*t*y2;                       /* By(t=P4) */\n            t = (x0*x2-x1*x1)*t/(x0-x1);                       /* gradient dP4/dx=0 */\n            x = Math.floor(t+0.5); y = Math.floor(r+0.5);\n            r = (y1-y0)*(t-x0)/(x1-x0)+y0;                  /* intersect P3 | P0 P1 */\n            plotQuadBezierSegAA(x0,y0, x,Math.floor(r+0.5), x,y);\n            r = (y1-y2)*(t-x2)/(x1-x2)+y2;                  /* intersect P4 | P1 P2 */\n            x0 = x1 = x; y0 = y; y1 = Math.floor(r+0.5);        /* P0 = P4, P1 = P8 */\n    }\n    if ((y0-y1)*(y2-y1) > 0) {                          /* vertical cut at P6? */\n            t = y0-2*y1+y2; t = (y0-y1)/t;\n            r = (1-t)*((1-t)*x0+2.0*t*x1)+t*t*x2;                       /* Bx(t=P6) */\n            t = (y0*y2-y1*y1)*t/(y0-y1);                       /* gradient dP6/dy=0 */\n            x = Math.floor(r+0.5); y = Math.floor(t+0.5);\n            r = (x1-x0)*(t-y0)/(y1-y0)+x0;                  /* intersect P6 | P0 P1 */\n            plotQuadBezierSegAA(x0,y0, Math.floor(r+0.5),y, x,y);\n            r = (x1-x2)*(t-y2)/(y1-y2)+x2;                  /* intersect P7 | P1 P2 */\n            x0 = x; x1 = Math.floor(r+0.5); y0 = y1 = y;        /* P0 = P6, P1 = P7 */\n    }\n    plotQuadBezierSegAA(x0,y0, x1,y1, x2,y2);                /* remaining part */\n}\n\nfunction plotQuadRationalBezierSegAA(x0, y0, x1, y1, x2, y2, w)\n{   /* draw an anti-aliased rational quadratic Bezier segment, squared weight */\n    var sx = x2-x1, sy = y2-y1;                  /* relative values for checks */\n    var dx = x0-x2, dy = y0-y2, xx = x0-x1, yy = y0-y1;\n    var xy = xx*sy+yy*sx, cur = xx*sy-yy*sx, err, ed, f;          /* curvature */\n\n    assert(xx*sx <= 0.0 && yy*sy <= 0.0);  /* sign of gradient must not change */\n\n    if (cur != 0.0 && w > 0.0) {                           /* no straight line */\n            if (sx*sx+sy*sy > xx*xx+yy*yy) {             /* begin with shorter part */\n                x2 = x0; x0 -= dx; y2 = y0; y0 -= dy; cur = -cur;      /* swap P0 P2 */\n            }\n            xx = 2.0*(4.0*w*sx*xx+dx*dx);                 /* differences 2nd degree */\n            yy = 2.0*(4.0*w*sy*yy+dy*dy);\n            sx = x0 < x2 ? 1 : -1;                              /* x step direction */\n            sy = y0 < y2 ? 1 : -1;                              /* y step direction */\n            xy = -2.0*sx*sy*(2.0*w*xy+dx*dy);\n\n            if (cur*sx*sy < 0) {                              /* negated curvature? */\n                xx = -xx; yy = -yy; cur = -cur; xy = -xy;\n            }\n            dx = 4.0*w*(x1-x0)*sy*cur+xx/2.0+xy;          /* differences 1st degree */\n            dy = 4.0*w*(y0-y1)*sx*cur+yy/2.0+xy;\n\n            if (w < 0.5 && dy > dx) {              /* flat ellipse, algorithm fails */\n                cur = (w+1.0)/2.0; w = Math.sqrt(w); xy = 1.0/(w+1.0);\n                sx = Math.floor((x0+2.0*w*x1+x2)*xy/2.0+0.5);     /* subdivide curve */\n                sy = Math.floor((y0+2.0*w*y1+y2)*xy/2.0+0.5);\n                dx = Math.floor((w*x1+x0)*xy+0.5); dy = Math.floor((y1*w+y0)*xy+0.5);\n                plotQuadRationalBezierSegAA(x0,y0, dx,dy, sx,sy, cur); /* plot apart */\n                dx = Math.floor((w*x1+x2)*xy+0.5); dy = Math.floor((y1*w+y2)*xy+0.5);\n                return plotQuadRationalBezierSegAA(sx,sy, dx,dy, x2,y2, cur);\n            }\n            err = dx+dy-xy;                                       /* error 1st step */\n            do {                                                      /* pixel loop */\n                cur = Math.min(dx-xy,xy-dy); ed = Math.max(dx-xy,xy-dy);\n                ed += 2*ed*cur*cur/(4.*ed*ed+cur*cur); /* approximate error distance */\n                x1 = 255*Math.abs(err-dx-dy+xy)/ed;/* get blend value by pixel error */\n                if (x1 < 256) setPixelAA(x0,y0, x1);                   /* plot curve */\n                if (f = 2*err+dy < 0) {                                    /* y step */\n                        if (y0 == y2) return;             /* last pixel -> curve finished */\n                        if (dx-err < ed) setPixelAA(x0+sx,y0, 255*Math.abs(dx-err)/ed);\n                }\n                if (2*err+dx > 0) {                                        /* x step */\n                        if (x0 == x2) return;             /* last pixel -> curve finished */\n                        if (err-dy < ed) setPixelAA(x0,y0+sy, 255*Math.abs(err-dy)/ed);\n                        x0 += sx; dx += xy; err += dy += yy;\n                }\n                if (f) { y0 += sy; dy += xy; err += dx += xx; }            /* y step */\n            } while (dy < dx);               /* gradient negates -> algorithm fails */\n    }\n    plotLineAA(x0,y0, x2,y2);                  /* plot remaining needle to end */\n}\n\nfunction plotQuadRationalBezierAA(x0, y0, x1, y1, x2, y2, w)\n{                    /* plot any anti-aliased quadratic rational Bezier curve */\n    var x = x0-2*x1+x2, y = y0-2*y1+y2;\n    var xx = x0-x1, yy = y0-y1, ww, t, q;\n\n    assert(w >= 0.0);\n\n    if (xx*(x2-x1) > 0) {                             /* horizontal cut at P4? */\n            if (yy*(y2-y1) > 0)                          /* vertical cut at P6 too? */\n                if (Math.abs(xx*y) > Math.abs(yy*x)) {               /* which first? */\n                        x0 = x2; x2 = xx+x1; y0 = y2; y2 = yy+y1;          /* swap points */\n                }                            /* now horizontal cut at P4 comes first */\n            if (x0 == x2 || w == 1.0) t = (x0-x1)/x;\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(x0-x1)*(x2-x1)+(x2-x0)*(x2-x0));\n                if (x1 < x0) q = -q;\n                t = (2.0*w*(x0-x1)-x0+x2+q)/(2.0*(1.0-w)*(x2-x0));        /* t at P4 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P4 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P3 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P8 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);                   /* P4 */\n            yy = (xx-x0)*(y1-y0)/(x1-x0)+y0;                /* intersect P3 | P0 P1 */\n            plotQuadRationalBezierSegAA(x0,y0, x,Math.floor(yy+0.5), x,y, ww);\n            yy = (xx-x2)*(y1-y2)/(x1-x2)+y2;                /* intersect P4 | P1 P2 */\n            y1 = Math.floor(yy+0.5); x0 = x1 = x; y0 = y;       /* P0 = P4, P1 = P8 */\n    }\n    if ((y0-y1)*(y2-y1) > 0) {                          /* vertical cut at P6? */\n            if (y0 == y2 || w == 1.0) t = (y0-y1)/(y0-2.0*y1+y2);\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(y0-y1)*(y2-y1)+(y2-y0)*(y2-y0));\n                if (y1 < y0) q = -q;\n                t = (2.0*w*(y0-y1)-y0+y2+q)/(2.0*(1.0-w)*(y2-y0));        /* t at P6 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P6 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P5 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P7 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);                   /* P6 */\n            xx = (x1-x0)*(yy-y0)/(y1-y0)+x0;                /* intersect P6 | P0 P1 */\n            plotQuadRationalBezierSegAA(x0,y0, Math.floor(xx+0.5),y, x,y, ww);\n            xx = (x1-x2)*(yy-y2)/(y1-y2)+x2;                /* intersect P7 | P1 P2 */\n            x1 = Math.floor(xx+0.5); x0 = x; y0 = y1 = y;       /* P0 = P6, P1 = P7 */\n    }\n    plotQuadRationalBezierSegAA(x0,y0, x1,y1, x2,y2, w*w);   /* remaining part */\n}\n\nfunction plotRotatedEllipseAA(x, y, a, b, angle)\n{                                   /* plot ellipse rotated by angle (radian) */\n    var xd = a*a, yd = b*b;\n    var s = Math.sin(angle), zd = (xd-yd)*s;               /* ellipse rotation */\n    xd = Math.sqrt(xd-zd*s), yd = Math.sqrt(yd+zd*s);       /* surrounding rect*/\n    a = Math.floor(xd+0.5); b = Math.floor(yd+0.5); zd = zd*a*b/(xd*yd);\n    plotRotatedEllipseRectAA(x-a,y-b, x+a,y+b, (4*zd*Math.cos(angle)));\n}\n\nfunction plotRotatedEllipseRectAA(x0, y0, x1, y1, zd)\n{                  /* rectangle enclosing the ellipse, integer rotation angle */\n    var xd = x1-x0, yd = y1-y0, w = xd*yd;\n    if (w != 0.0) w = (w-zd)/(w+w);                    /* squared weight of P1 */\n    assert(w <= 1.0 && w >= 0.0);                /* limit angle to |zd|<=xd*yd */\n    xd = Math.floor(xd*w+0.5); yd = Math.floor(yd*w+0.5);       /* snap to int */\n    plotQuadRationalBezierSegAA(x0,y0+yd, x0,y0, x0+xd,y0, 1.0-w);\n    plotQuadRationalBezierSegAA(x0,y0+yd, x0,y1, x1-xd,y1, w);\n    plotQuadRationalBezierSegAA(x1,y1-yd, x1,y1, x1-xd,y1, 1.0-w);\n    plotQuadRationalBezierSegAA(x1,y1-yd, x1,y0, x0+xd,y0, w);\n}\n\nfunction plotCubicBezierSegAA(x0, y0, x1, y1, x2, y2, x3, y3)\n{                           /* plot limited anti-aliased cubic Bezier segment */\n    var f, fx, fy, leg = 1;\n    var sx = x0 < x3 ? 1 : -1, sy = y0 < y3 ? 1 : -1;        /* step direction */\n    var xc = -Math.abs(x0+x1-x2-x3), xa = xc-4*sx*(x1-x2), xb = sx*(x0-x1-x2+x3);\n    var yc = -Math.abs(y0+y1-y2-y3), ya = yc-4*sy*(y1-y2), yb = sy*(y0-y1-y2+y3);\n    var ab, ac, bc, ba, xx, xy, yy, dx, dy, ex, px, py, ed, ip, EP = 0.01;\n                                                                                                /* check for curve restrains */\n    /* slope P0-P1 == P2-P3    and  (P0-P3 == P1-P2      or   no slope change) */\n    assert((x1-x0)*(x2-x3) < EP && ((x3-x0)*(x1-x2) < EP || xb*xb < xa*xc+EP));\n    assert((y1-y0)*(y2-y3) < EP && ((y3-y0)*(y1-y2) < EP || yb*yb < ya*yc+EP));\n\n    if (xa == 0 && ya == 0)                                /* quadratic Bezier */\n            return plotQuadBezierSegAA(x0,y0, (3*x1-x0)>>1,(3*y1-y0)>>1, x3,y3);\n    x1 = (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+1;                    /* line lengths */\n    x2 = (x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)+1;\nexit:   \n    do {                                                /* loop over both ends */\n            ab = xa*yb-xb*ya; ac = xa*yc-xc*ya; bc = xb*yc-xc*yb;\n            ip = 4*ab*bc-ac*ac;                   /* self intersection loop at all? */\n            ex = ab*(ab+ac-3*bc)+ac*ac;       /* P0 part of self-intersection loop? */\n            f = ex > 0 ? 1 : Math.floor(Math.sqrt(1+1024/x1));   /* calc resolution */\n            ab *= f; ac *= f; bc *= f; ex *= f*f;            /* increase resolution */\n            xy = 9*(ab+ac+bc)/8; ba = 8*(xa-ya);  /* init differences of 1st degree */\n            dx = 27*(8*ab*(yb*yb-ya*yc)+ex*(ya+2*yb+yc))/64-ya*ya*(xy-ya);\n            dy = 27*(8*ab*(xb*xb-xa*xc)-ex*(xa+2*xb+xc))/64-xa*xa*(xy+xa);\n                                                                                        /* init differences of 2nd degree */\n            xx = 3*(3*ab*(3*yb*yb-ya*ya-2*ya*yc)-ya*(3*ac*(ya+yb)+ya*ba))/4;\n            yy = 3*(3*ab*(3*xb*xb-xa*xa-2*xa*xc)-xa*(3*ac*(xa+xb)+xa*ba))/4;\n            xy = xa*ya*(6*ab+6*ac-3*bc+ba); ac = ya*ya; ba = xa*xa;\n            xy = 3*(xy+9*f*(ba*yb*yc-xb*xc*ac)-18*xb*yb*ab)/8;\n\n            if (ex < 0) {         /* negate values if inside self-intersection loop */\n                dx = -dx; dy = -dy; xx = -xx; yy = -yy; xy = -xy; ac = -ac; ba = -ba;\n            }                                     /* init differences of 3rd degree */\n            ab = 6*ya*ac; ac = -6*xa*ac; bc = 6*ya*ba; ba = -6*xa*ba;\n            dx += xy; ex = dx+dy; dy += xy;                    /* error of 1st step */\n loop:\n        for (fx = fy = f; ; ) {\n            if (x0 == x3 || y0 == y3) break exit;\n                y1 = Math.min(Math.abs(xy-dx),Math.abs(dy-xy));\n                ed = Math.max(Math.abs(xy-dx),Math.abs(dy-xy));   /* approximate err */\n                ed = f*(ed+2*ed*y1*y1/(4*ed*ed+y1*y1));\n                y1 = 255*Math.abs(ex-(f-fx+1)*dx-(f-fy+1)*dy+f*xy)/ed;\n                if (y1 < 256) setPixelAA(x0, y0, y1);                  /* plot curve */\n                px = Math.abs(ex-(f-fx+1)*dx+(fy-1)*dy);   /* pixel varensity x move */\n                py = Math.abs(ex+(fx-1)*dx-(f-fy+1)*dy);   /* pixel varensity y move */\n                y2 = y0;\n                do {                                  /* move sub-steps of one pixel */\n                        if (ip >= -EP)               /* intersection possible? -> check.. */\n                            if (dx+xx > xy || dy+yy < xy) break loop;  /* two x or y steps */\n                        y1 = 2*ex+dx;                    /* save value for test of y step */\n                        if (2*ex+dy > 0) {                                  /* x sub-step */\n                            fx--; ex += dx += xx; dy += xy += ac; yy += bc; xx += ab;\n                        } else if (y1 > 0) break loop;                /* tiny nearly cusp */\n                        if (y1 <= 0) {                                      /* y sub-step */\n                            fy--; ex += dy += yy; dx += xy += bc; xx += ac; yy += ba;\n                        }\n                } while (fx > 0 && fy > 0);                       /* pixel complete? */\n                if (2*fy <= f) {                           /* x+ anti-aliasing pixel */\n                        if (py < ed) setPixelAA(x0+sx, y0, 255*py/ed);      /* plot curve */\n                        y0 += sy; fy += f;                                      /* y step */\n                }\n                if (2*fx <= f) {                           /* y+ anti-aliasing pixel */\n                        if (px < ed) setPixelAA(x0, y2+sy, 255*px/ed);      /* plot curve */\n                        x0 += sx; fx += f;                                      /* x step */\n                }\n            }\n            if (2*ex < dy && 2*fy <= f+2) {         /* round x+ approximation pixel */\n                if (py < ed) setPixelAA(x0+sx, y0, 255*py/ed);         /* plot curve */\n                y0 += sy;\n            }\n            if (2*ex > dx && 2*fx <= f+2) {         /* round y+ approximation pixel */\n                if (px < ed) setPixelAA(x0, y2+sy, 255*px/ed);         /* plot curve */\n                x0 += sx;\n            }\n            xx = x0; x0 = x3; x3 = xx; sx = -sx; xb = -xb;             /* swap legs */\n            yy = y0; y0 = y3; y3 = yy; sy = -sy; yb = -yb; x1 = x2;\n    } while (leg--);                                          /* try other end */\n    plotLineAA(x0,y0, x3,y3);     /* remaining part in case of cusp or crunode */\n}\n\nfunction plotCubicBezierAA(x0, y0, x1, y1, x2, y2, x3, y3)\n{                                              /* plot any cubic Bezier curve */\n    var n = 0, i = 0;\n    var xc = x0+x1-x2-x3, xa = xc-4*(x1-x2);\n    var xb = x0-x1-x2+x3, xd = xb+4*(x1+x2);\n    var yc = y0+y1-y2-y3, ya = yc-4*(y1-y2);\n    var yb = y0-y1-y2+y3, yd = yb+4*(y1+y2);\n    var fx0 = x0, fx1, fx2, fx3, fy0 = y0, fy1, fy2, fy3;\n    var t1 = xb*xb-xa*xc, t2, t = new Array(5);\n                                                                /* sub-divide curve at gradient sign changes */\n    if (xa == 0) {                                               /* horizontal */\n            if (Math.abs(xc) < 2*Math.abs(xb)) t[n++] = xc/(2.0*xb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (xb-t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (xb+t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    t1 = yb*yb-ya*yc;\n    if (ya == 0) {                                                 /* vertical */\n            if (Math.abs(yc) < 2*Math.abs(yb)) t[n++] = yc/(2.0*yb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (yb-t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (yb+t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    for (i = 1; i < n; i++)                         /* bubble sort of 4 points */\n            if ((t1 = t[i-1]) > t[i]) { t[i-1] = t[i]; t[i] = t1; i = 0; }\n\n    t1 = -1.0; t[n] = 1.0;                                /* begin / end point */\n    for (i = 0; i <= n; i++) {                 /* plot each segment separately */\n            t2 = t[i];                                /* sub-divide at t[i-1], t[i] */\n            fx1 = (t1*(t1*xb-2*xc)-t2*(t1*(t1*xa-2*xb)+xc)+xd)/8-fx0;\n            fy1 = (t1*(t1*yb-2*yc)-t2*(t1*(t1*ya-2*yb)+yc)+yd)/8-fy0;\n            fx2 = (t2*(t2*xb-2*xc)-t1*(t2*(t2*xa-2*xb)+xc)+xd)/8-fx0;\n            fy2 = (t2*(t2*yb-2*yc)-t1*(t2*(t2*ya-2*yb)+yc)+yd)/8-fy0;\n            fx0 -= fx3 = (t2*(t2*(3*xb-t2*xa)-3*xc)+xd)/8;\n            fy0 -= fy3 = (t2*(t2*(3*yb-t2*ya)-3*yc)+yd)/8;\n            x3 = Math.floor(fx3+0.5); y3 = Math.floor(fy3+0.5);     /* scale bounds */\n            if (fx0 != 0.0) { fx1 *= fx0 = (x0-x3)/fx0; fx2 *= fx0; }\n            if (fy0 != 0.0) { fy1 *= fy0 = (y0-y3)/fy0; fy2 *= fy0; }\n            if (x0 != x3 || y0 != y3)                            /* segment t1 - t2 */\n                plotCubicBezierSegAA(x0,y0, x0+fx1,y0+fy1, x0+fx2,y0+fy2, x3,y3);\n            x0 = x3; y0 = y3; fx0 = fx3; fy0 = fy3; t1 = t2;\n    }\n}\n\nfunction plotLineWidth(x0, y0, x1, y1, th)\n{                              /* plot an anti-aliased line of width th pixel */\n    var dx = Math.abs(x1-x0), sx = x0 < x1 ? 1 : -1; \n    var dy = Math.abs(y1-y0), sy = y0 < y1 ? 1 : -1; \n    var err, e2 = Math.sqrt(dx*dx+dy*dy);                            /* length */\n\n    if (th <= 1 || e2 == 0) return plotLineAA(x0,y0, x1,y1);         /* assert */\n    dx *= 255/e2; dy *= 255/e2; th = 255*(th-1);               /* scale values */\n\n    if (dx < dy) {                                               /* steep line */\n            x1 = Math.round((e2+th/2)/dy);                          /* start offset */\n            err = x1*dy-th/2;                  /* shift error value to offset width */\n            for (x0 -= x1*sx; ; y0 += sy) {\n                setPixelAA(x1 = x0, y0, err);                  /* aliasing pre-pixel */\n                for (e2 = dy-err-th; e2+dy < 255; e2 += dy)  \n                        setPixel(x1 += sx, y0);                      /* pixel on the line */\n                setPixelAA(x1+sx, y0, e2);                    /* aliasing post-pixel */\n                if (y0 == y1) break;\n                err += dx;                                                 /* y-step */\n                if (err > 255) { err -= dy; x0 += sx; }                    /* x-step */ \n            }\n    } else {                                                      /* flat line */\n            y1 = Math.round((e2+th/2)/dx);                          /* start offset */\n            err = y1*dx-th/2;                  /* shift error value to offset width */\n            for (y0 -= y1*sy; ; x0 += sx) {\n                setPixelAA(x0, y1 = y0, err);                  /* aliasing pre-pixel */\n                for (e2 = dx-err-th; e2+dx < 255; e2 += dx) \n                        setPixel(x0, y1 += sy);                      /* pixel on the line */\n                setPixelAA(x0, y1+sy, e2);                    /* aliasing post-pixel */\n                if (x0 == x1) break;\n                err += dy;                                                 /* x-step */ \n                if (err > 255) { err -= dx; y0 += sy; }                    /* y-step */\n            } \n    }\n}\n\nfunction plotEllipseRectWidth(x0, y0, x1, y1, th)\n{               /* draw anti-aliased ellipse inside rectangle with thick line */\n    var a = Math.abs(x1-x0), b = Math.abs(y1-y0), b1 = b&1;  /* outer diameter */\n    var a2 = a-2*th, b2 = b-2*th;                            /* inner diameter */\n    var dx = 4*(a-1)*b*b, dy = 4*(b1-1)*a*a;                /* error increment */\n    var i = a+b2, err = b1*a*a, dx2, dy2, e2, ed; \n                                                                                                        /* thick line correction */\n    if (th < 1.5) return plotEllipseRectAA(x0,y0, x1,y1);\n    if ((th-1)*(2*b-th) > a*a) b2 = Math.sqrt(a*(b-a)*i*a2)/(a-th);       \n    if ((th-1)*(2*a-th) > b*b) { a2 = Math.sqrt(b*(a-b)*i*b2)/(b-th); th = (a-a2)/2; }\n    if (a == 0 || b == 0) return plotLine(x0,y0, x1,y1);\n    if (x0 > x1) { x0 = x1; x1 += a; }        /* if called with swapped points */\n    if (y0 > y1) y0 = y1;                                  /* .. exchange them */\n    if (b2 <= 0) th = a;                                     /* filled ellipse */\n    e2 = th-Math.floor(th); th = x0+th-e2;\n    dx2 = 4*(a2+2*e2-1)*b2*b2; dy2 = 4*(b1-1)*a2*a2; e2 = dx2*e2;\n    y0 += (b+1)>>1; y1 = y0-b1;                              /* starting pixel */\n    a = 8*a*a; b1 = 8*b*b; a2 = 8*a2*a2; b2 = 8*b2*b2;\n    \n    do {          \n            for (;;) {                           \n                if (err < 0 || x0 > x1) { i = x0; break; }\n                i = Math.min(dx,dy); ed = Math.max(dx,dy);\n                if (y0 == y1+1 && 2*err > dx && a > b1) ed = a/4;           /* x-tip */\n                else ed += 2*ed*i*i/(4*ed*ed+i*i+1)+1;/* approx ed=sqrt(dx*dx+dy*dy) */\n                i = 255*err/ed;                             /* outside anti-aliasing */\n                setPixelAA(x0,y0, i); setPixelAA(x0,y1, i);\n                setPixelAA(x1,y0, i); setPixelAA(x1,y1, i);\n                if (err+dy+a < dx) { i = x0+1; break; }\n                x0++; x1--; err -= dx; dx -= b1;                /* x error increment */\n            }\n            for (; i < th && 2*i <= x0+x1; i++) {                /* fill line pixel */\n                setPixel(i,y0); setPixel(x0+x1-i,y0); \n                setPixel(i,y1); setPixel(x0+x1-i,y1);\n            }    \n            while (e2 > 0 && x0+x1 >= 2*th) {               /* inside anti-aliasing */\n                i = Math.min(dx2,dy2); ed = Math.max(dx2,dy2);\n                if (y0 == y1+1 && 2*e2 > dx2 && a2 > b2) ed = a2/4;         /* x-tip */\n                else  ed += 2*ed*i*i/(4*ed*ed+i*i);                 /* approximation */\n                i = 255-255*e2/ed;             /* get intensity value by pixel error */\n                setPixelAA(th,y0, i); setPixelAA(x0+x1-th,y0, i);\n                setPixelAA(th,y1, i); setPixelAA(x0+x1-th,y1, i);\n                if (e2+dy2+a2 < dx2) break; \n                th++; e2 -= dx2; dx2 -= b2;                     /* x error increment */\n            }\n            e2 += dy2 += a2;\n            y0++; y1--; err += dy += a;                                   /* y step */\n    } while (x0 < x1);\n    \n    if (y0-y1 <= b)             \n    {\n            if (err > dy+a) { y0--; y1++; err -= dy -= a; }\n            for (; y0-y1 <= b; err += dy += a) { /* too early stop of flat ellipses */\n                i = 255*4*err/b1;                        /* -> finish tip of ellipse */\n                setPixelAA(x0,y0, i); setPixelAA(x1,y0++, i);\n                setPixelAA(x0,y1, i); setPixelAA(x1,y1--, i);\n            }\n    }\n}\n\nfunction plotQuadRationalBezierWidthSeg(x0, y0, x1, y1, x2, y2, w, th)\n{   /* plot a limited rational Bezier segment of thickness th, squared weight */\n    var sx = x2-x1, sy = y2-y1;                  /* relative values for checks */\n    var dx = x0-x2, dy = y0-y2, xx = x0-x1, yy = y0-y1;\n    var xy = xx*sy+yy*sx, cur = xx*sy-yy*sx, err, e2, ed;         /* curvature */\n\n    assert(xx*sx <= 0.0 && yy*sy <= 0.0);  /* sign of gradient must not change */\n\n    if (cur != 0.0 && w > 0.0) {                           /* no straight line */\n            if (sx*sx+sy*sy > xx*xx+yy*yy) {              /* begin with longer part */\n                x2 = x0; x0 -= dx; y2 = y0; y0 -= dy; cur = -cur;      /* swap P0 P2 */\n            }\n            xx = 2.0*(4.0*w*sx*xx+dx*dx);                 /* differences 2nd degree */\n            yy = 2.0*(4.0*w*sy*yy+dy*dy);\n            sx = x0 < x2 ? 1 : -1;                              /* x step direction */\n            sy = y0 < y2 ? 1 : -1;                              /* y step direction */\n            xy = -2.0*sx*sy*(2.0*w*xy+dx*dy);\n\n            if (cur*sx*sy < 0) {                              /* negated curvature? */\n                xx = -xx; yy = -yy; cur = -cur; xy = -xy;\n            }\n            dx = 4.0*w*(x1-x0)*sy*cur+xx/2.0;             /* differences 1st degree */\n            dy = 4.0*w*(y0-y1)*sx*cur+yy/2.0;\n\n            if (w < 0.5 && (dx+xx <= 0 || dy+yy >= 0)) {/* flat ellipse, algo fails */\n                cur = (w+1.0)/2.0; w = fsqrt(w); xy = 1.0/(w+1.0);\n                sx = Math.floor((x0+2.0*w*x1+x2)*xy/2.0+0.5);    /* subdivide curve  */\n                sy = Math.floor((y0+2.0*w*y1+y2)*xy/2.0+0.5);     /* plot separately */\n                dx = Math.floor((w*x1+x0)*xy+0.5); dy = Math.floor((y1*w+y0)*xy+0.5);\n                plotQuadRationalBezierWidthSeg(x0,y0, dx,dy, sx,sy, cur, th);\n                dx = Math.floor((w*x1+x2)*xy+0.5); dy = Math.floor((y1*w+y2)*xy+0.5);\n                return plotQuadRationalBezierWidthSeg(sx,sy, dx,dy, x2,y2, cur, th);\n            }\n            fail:\n            for (err = 0; dy+2*yy < 0 && dx+2*xx > 0; ) /* loop of steep/flat curve */\n                if (dx+dy+xy < 0) {                                   /* steep curve */\n                        do {\n                            ed = -dy-2*dy*dx*dx/(4.*dy*dy+dx*dx);      /* approximate sqrt */\n                            w = (th-1)*ed;                             /* scale line width */\n                            x1 = Math.floor((err-ed-w/2)/dy);              /* start offset */\n                            e2 = err-x1*dy-w/2;                   /* error value at offset */\n                            x1 = x0-x1*sx;                                  /* start point */\n                            setPixelAA(x1, y0, 255*e2/ed);           /* aliasing pre-pixel */\n                            for (e2 = -w-dy-e2; e2-dy < ed; e2 -= dy)\n                                    setPixel(x1 += sx, y0);              /* pixel on thick line */\n                            setPixelAA(x1+sx, y0, 255*e2/ed);       /* aliasing post-pixel */\n                            if (y0 == y2) return;          /* last pixel -> curve finished */\n                            y0 += sy; dy += xy; err += dx; dx += xx;             /* y step */\n                            if (2*err+dy > 0) {                            /* e_x+e_xy > 0 */\n                                    x0 += sx; dx += xy; err += dy; dy += yy;          /* x step */\n                            }\n                            if (x0 != x2 && (dx+2*xx <= 0 || dy+2*yy >= 0))\n                                    if (Math.abs(y2-y0) > Math.abs(x2-x0)) break fail;\n                                    else break;                             /* other curve near */\n                        } while (dx+dy+xy < 0);                  /* gradient still steep? */\n                                                                                    /* change from steep to flat curve */\n                        for (cur = err-dy-w/2, y1 = y0; cur < ed; y1 += sy, cur += dx) {\n                            for (e2 = cur, x1 = x0; e2-dy < ed; e2 -= dy)\n                                    setPixel(x1 -= sx, y1);              /* pixel on thick line */\n                            setPixelAA(x1-sx, y1, 255*e2/ed);       /* aliasing post-pixel */\n                        }\n                } else {                                               /* flat curve */\n                        do {\n                            ed = dx+2*dx*dy*dy/(4.*dx*dx+dy*dy);       /* approximate sqrt */\n                            w = (th-1)*ed;                             /* scale line width */\n                            y1 = Math.floor((err+ed+w/2)/dx);              /* start offset */\n                            e2 = y1*dx-w/2-err;                   /* error value at offset */\n                            y1 = y0-y1*sy;                                  /* start point */\n                            setPixelAA(x0, y1, 255*e2/ed);           /* aliasing pre-pixel */\n                            for (e2 = dx-e2-w; e2+dx < ed; e2 += dx)\n                                    setPixel(x0, y1 += sy);              /* pixel on thick line */\n                            setPixelAA(x0, y1+sy, 255*e2/ed);       /* aliasing post-pixel */\n                            if (x0 == x2) return;          /* last pixel -> curve finished */\n                            x0 += sx; dx += xy; err += dy; dy += yy;             /* x step */\n                            if (2*err+dx < 0)  {                           /* e_y+e_xy < 0 */\n                                    y0 += sy; dy += xy; err += dx; dx += xx;          /* y step */\n                            }\n                            if (y0 != y2 && (dx+2*xx <= 0 || dy+2*yy >= 0))\n                                    if (Math.abs(y2-y0) <= Math.abs(x2-x0)) break fail;  \n                                    else break;                             /* other curve near */\n                        } while (dx+dy+xy >= 0);                  /* gradient still flat? */\n                                                                                    /* change from flat to steep curve */ \n                        for (cur = -err+dx-w/2, x1 = x0; cur < ed; x1 += sx, cur -= dy) {\n                            for (e2 = cur, y1 = y0; e2+dx < ed; e2 += dx)\n                                    setPixel(x1, y1 -= sy);              /* pixel on thick line */\n                            setPixelAA(x1, y1-sy, 255*e2/ed);       /* aliasing post-pixel */\n                        }\n                }\n            }\n    plotLineWidth(x0,y0, x2,y2, th);            /* confusing error values  */\n}\n\nfunction plotQuadRationalBezierWidth(x0, y0, x1, y1, x2, y2, w, th)\n{                    /* plot any anti-aliased quadratic rational Bezier curve */\n    var x = x0-2*x1+x2, y = y0-2*y1+y2;\n    var xx = x0-x1, yy = y0-y1, ww, t, q;\n\n    assert(w >= 0.0);\n\n    if (xx*(x2-x1) > 0) {                             /* horizontal cut at P4? */\n            if (yy*(y2-y1) > 0)                          /* vertical cut at P6 too? */\n                if (Math.abs(xx*y) > Math.abs(yy*x)) {               /* which first? */\n                        x0 = x2; x2 = xx+x1; y0 = y2; y2 = yy+y1;          /* swap points */\n                }                            /* now horizontal cut at P4 comes first */\n            if (x0 == x2 || w == 1.0) t = (x0-x1)/x;\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(x0-x1)*(x2-x1)+(x2-x0)*(x2-x0));\n                if (x1 < x0) q = -q;\n                t = (2.0*w*(x0-x1)-x0+x2+q)/(2.0*(1.0-w)*(x2-x0));        /* t at P4 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P4 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P3 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P8 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);                   /* P4 */\n            yy = (xx-x0)*(y1-y0)/(x1-x0)+y0;                /* intersect P3 | P0 P1 */\n            plotQuadRationalBezierWidthSeg(x0,y0, x,Math.floor(yy+0.5), x,y, ww, th);\n            yy = (xx-x2)*(y1-y2)/(x1-x2)+y2;                /* intersect P4 | P1 P2 */\n            y1 = Math.floor(yy+0.5); x0 = x1 = x; y0 = y;       /* P0 = P4, P1 = P8 */\n    }\n    if ((y0-y1)*(y2-y1) > 0) {                          /* vertical cut at P6? */\n            if (y0 == y2 || w == 1.0) t = (y0-y1)/(y0-2.0*y1+y2);\n            else {                                 /* non-rational or rational case */\n                q = Math.sqrt(4.0*w*w*(y0-y1)*(y2-y1)+(y2-y0)*(y2-y0));\n                if (y1 < y0) q = -q;\n                t = (2.0*w*(y0-y1)-y0+y2+q)/(2.0*(1.0-w)*(y2-y0));        /* t at P6 */\n            }\n            q = 1.0/(2.0*t*(1.0-t)*(w-1.0)+1.0);                 /* sub-divide at t */\n            xx = (t*t*(x0-2.0*w*x1+x2)+2.0*t*(w*x1-x0)+x0)*q;               /* = P6 */\n            yy = (t*t*(y0-2.0*w*y1+y2)+2.0*t*(w*y1-y0)+y0)*q;\n            ww = t*(w-1.0)+1.0; ww *= ww*q;                    /* squared weight P5 */\n            w = ((1.0-t)*(w-1.0)+1.0)*Math.sqrt(q);                    /* weight P7 */\n            x = Math.floor(xx+0.5); y = Math.floor(yy+0.5);                   /* P6 */\n            xx = (x1-x0)*(yy-y0)/(y1-y0)+x0;                /* intersect P6 | P0 P1 */\n            plotQuadRationalBezierWidthSeg(x0,y0, Math.floor(xx+0.5),y, x,y, ww, th);\n            xx = (x1-x2)*(yy-y2)/(y1-y2)+x2;                /* intersect P7 | P1 P2 */\n            x1 = Math.floor(xx+0.5); x0 = x; y0 = y1 = y;       /* P0 = P6, P1 = P7 */\n    }\n    plotQuadRationalBezierWidthSeg(x0,y0, x1,y1, x2,y2, w*w, th);  \n}\n\nfunction plotRotatedEllipseWidth(x, y, a, b, angle, th)\n{                                   /* plot ellipse rotated by angle (radian) */\n    var xd = a*a, yd = b*b;\n    var s = Math.sin(angle), zd = (xd-yd)*s;               /* ellipse rotation */\n    xd = Math.sqrt(xd-zd*s), yd = Math.sqrt(yd+zd*s);       /* surrounding rect*/\n    a = Math.floor(xd+0.5); b = Math.floor(yd+0.5); zd = zd*a*b/(xd*yd);\n    plotRotatedEllipseRectWidth(x-a,y-b, x+a,y+b, (4*zd*Math.cos(angle)), th);\n}\n\nfunction plotRotatedEllipseRectWidth(x0, y0, x1, y1, zd, th)\n{                  /* rectangle enclosing the ellipse, integer rotation angle */\n    var xd = x1-x0, yd = y1-y0, w = xd*yd;\n    if (w != 0.0) w = (w-zd)/(w+w);                    /* squared weight of P1 */\n    assert(w <= 1.0 && w >= 0.0);                /* limit angle to |zd|<=xd*yd */\n    xd = Math.floor(xd*w+0.5); yd = Math.floor(yd*w+0.5);       /* snap to int */\n    plotQuadRationalBezierWidthSeg(x0,y0+yd, x0,y0, x0+xd,y0, 1.0-w, th);\n    plotQuadRationalBezierWidthSeg(x0,y0+yd, x0,y1, x1-xd,y1, w, th);\n    plotQuadRationalBezierWidthSeg(x1,y1-yd, x1,y1, x1-xd,y1, 1.0-w, th);\n    plotQuadRationalBezierWidthSeg(x1,y1-yd, x1,y0, x0+xd,y0, w, th);\n}\n\nfunction plotCubicBezierWidth(x0, y0, x1, y1, x2, y2, x3, y3, th)\n{                                              /* plot any cubic Bezier curve */\n    var n = 0, i = 0;\n    var xc = x0+x1-x2-x3, xa = xc-4*(x1-x2);\n    var xb = x0-x1-x2+x3, xd = xb+4*(x1+x2);\n    var yc = y0+y1-y2-y3, ya = yc-4*(y1-y2);\n    var yb = y0-y1-y2+y3, yd = yb+4*(y1+y2);\n    var fx0 = x0, fx1, fx2, fx3, fy0 = y0, fy1, fy2, fy3;\n    var t1 = xb*xb-xa*xc, t2, t = new Array(7);\n                                                                /* sub-divide curve at gradient sign changes */\n    if (xa == 0) {                                               /* horizontal */\n            if (Math.abs(xc) < 2*Math.abs(xb)) t[n++] = xc/(2.0*xb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (xb-t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (xb+t2)/xa; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    t1 = yb*yb-ya*yc;\n    if (ya == 0) {                                                 /* vertical */\n            if (Math.abs(yc) < 2*Math.abs(yb)) t[n++] = yc/(2.0*yb);  /* one change */\n    } else if (t1 > 0.0) {                                      /* two changes */\n            t2 = Math.sqrt(t1);\n            t1 = (yb-t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n            t1 = (yb+t2)/ya; if (Math.abs(t1) < 1.0) t[n++] = t1;\n    }\n    t1 = 2*(xa*yb-xb*ya); t2 = xa*yc-xc*ya;      /* divide at inflection point */\n    i = t2*t2-2*t1*(xb*yc-xc*yb);\n    if (i > 0) {\n            i = Math.sqrt(i);\n            t[n] = (t2+i)/t1; if (Math.abs(t[n]) < 1.0) n++;\n            t[n] = (t2-i)/t1; if (Math.abs(t[n]) < 1.0) n++;\n    }\n    for (i = 1; i < n; i++)                         /* bubble sort of 4 points */\n            if ((t1 = t[i-1]) > t[i]) { t[i-1] = t[i]; t[i] = t1; i = 0; }\n\n    t1 = -1.0; t[n] = 1.0;                               /* begin / end points */\n    for (i = 0; i <= n; i++) {                 /* plot each segment separately */\n            t2 = t[i];                                /* sub-divide at t[i-1], t[i] */\n            fx1 = (t1*(t1*xb-2*xc)-t2*(t1*(t1*xa-2*xb)+xc)+xd)/8-fx0;\n            fy1 = (t1*(t1*yb-2*yc)-t2*(t1*(t1*ya-2*yb)+yc)+yd)/8-fy0;\n            fx2 = (t2*(t2*xb-2*xc)-t1*(t2*(t2*xa-2*xb)+xc)+xd)/8-fx0;\n            fy2 = (t2*(t2*yb-2*yc)-t1*(t2*(t2*ya-2*yb)+yc)+yd)/8-fy0;\n            fx0 -= fx3 = (t2*(t2*(3*xb-t2*xa)-3*xc)+xd)/8;\n            fy0 -= fy3 = (t2*(t2*(3*yb-t2*ya)-3*yc)+yd)/8;\n            x3 = Math.floor(fx3+0.5); y3 = Math.floor(fy3+0.5);     /* scale bounds */\n            if (fx0 != 0.0) { fx1 *= fx0 = (x0-x3)/fx0; fx2 *= fx0; }\n            if (fy0 != 0.0) { fy1 *= fy0 = (y0-y3)/fy0; fy2 *= fy0; }\n            if (x0 != x3 || y0 != y3)                            /* segment t1 - t2 */\n                plotCubicBezierSegWidth(x0,y0, x0+fx1,y0+fy1, x0+fx2,y0+fy2, x3,y3, th);\n            x0 = x3; y0 = y3; fx0 = fx3; fy0 = fy3; t1 = t2;\n    }\n}\n\nfunction plotCubicBezierSegWidth(x0,y0, x1,y1, x2,y2, x3,y3, th)\n{                     /* split cubic Bezier segment in two quadratic segments */\n    var x = Math.floor((x0+3*x1+3*x2+x3+4)/8), \n            y = Math.floor((y0+3*y1+3*y2+y3+4)/8);\n    plotQuadRationalBezierWidthSeg(x0,y0, \n            Math.floor((x0+3*x1+2)/4),Math.floor((y0+3*y1+2)/4), x,y, 1,th);\n    plotQuadRationalBezierWidthSeg(x,y, \n            Math.floor((3*x2+x3+2)/4),Math.floor((3*y2+y3+2)/4), x3,y3, 1,th);\n}   "
  },
  {
    "path": "vipercard/vipercard/external/externaldelaybundlebig.js",
    "content": "\n// externaldelaybundle\n// changes here will be overwritten\n\n\n\n// begin:./chevrotain-6.5.0/chevrotain.js\n/*! chevrotain - v6.5.0 */\n(function webpackUniversalModuleDefinition(root, factory) {\n    if(typeof exports === 'object' && typeof module === 'object')\n        module.exports = factory();\n    else if(typeof define === 'function' && define.amd)\n        define(\"chevrotain\", [], factory);\n    else if(typeof exports === 'object')\n        exports[\"chevrotain\"] = factory();\n    else\n        root[\"chevrotain\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/     // The module cache\n/******/     var installedModules = {};\n/******/\n/******/     // The require function\n/******/     function __webpack_require__(moduleId) {\n/******/\n/******/         // Check if module is in cache\n/******/         if(installedModules[moduleId]) {\n/******/             return installedModules[moduleId].exports;\n/******/         }\n/******/         // Create a new module (and put it into the cache)\n/******/         var module = installedModules[moduleId] = {\n/******/             i: moduleId,\n/******/             l: false,\n/******/             exports: {}\n/******/         };\n/******/\n/******/         // Execute the module function\n/******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/         // Flag the module as loaded\n/******/         module.l = true;\n/******/\n/******/         // Return the exports of the module\n/******/         return module.exports;\n/******/     }\n/******/\n/******/\n/******/     // expose the modules object (__webpack_modules__)\n/******/     __webpack_require__.m = modules;\n/******/\n/******/     // expose the module cache\n/******/     __webpack_require__.c = installedModules;\n/******/\n/******/     // define getter function for harmony exports\n/******/     __webpack_require__.d = function(exports, name, getter) {\n/******/         if(!__webpack_require__.o(exports, name)) {\n/******/             Object.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/         }\n/******/     };\n/******/\n/******/     // define __esModule on exports\n/******/     __webpack_require__.r = function(exports) {\n/******/         if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/             Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/         }\n/******/         Object.defineProperty(exports, '__esModule', { value: true });\n/******/     };\n/******/\n/******/     // create a fake namespace object\n/******/     // mode & 1: value is a module id, require it\n/******/     // mode & 2: merge all properties of value into the ns\n/******/     // mode & 4: return value when already ns object\n/******/     // mode & 8|1: behave like require\n/******/     __webpack_require__.t = function(value, mode) {\n/******/         if(mode & 1) value = __webpack_require__(value);\n/******/         if(mode & 8) return value;\n/******/         if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/         var ns = Object.create(null);\n/******/         __webpack_require__.r(ns);\n/******/         Object.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/         if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/         return ns;\n/******/     };\n/******/\n/******/     // getDefaultExport function for compatibility with non-harmony modules\n/******/     __webpack_require__.n = function(module) {\n/******/         var getter = module && module.__esModule ?\n/******/             function getDefault() { return module['default']; } :\n/******/             function getModuleExports() { return module; };\n/******/         __webpack_require__.d(getter, 'a', getter);\n/******/         return getter;\n/******/     };\n/******/\n/******/     // Object.prototype.hasOwnProperty.call\n/******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/     // __webpack_public_path__\n/******/     __webpack_require__.p = \"\";\n/******/\n/******/\n/******/     // Load entry module and return exports\n/******/     return __webpack_require__(__webpack_require__.s = 18);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/*\n Utils using lodash style API. (not necessarily 100% compliant) for functional and other utils.\n These utils should replace usage of lodash in the production code base. not because they are any better...\n but for the purpose of being a dependency free library.\n\n The hotspots in the code are already written in imperative style for performance reasons.\n so writing several dozen utils which may be slower than the original lodash, does not matter as much\n considering they will not be invoked in hotspots...\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isEmpty(arr) {\n    return arr && arr.length === 0;\n}\nexports.isEmpty = isEmpty;\nfunction keys(obj) {\n    if (obj === undefined || obj === null) {\n        return [];\n    }\n    return Object.keys(obj);\n}\nexports.keys = keys;\nfunction values(obj) {\n    var vals = [];\n    var keys = Object.keys(obj);\n    for (var i = 0; i < keys.length; i++) {\n        vals.push(obj[keys[i]]);\n    }\n    return vals;\n}\nexports.values = values;\nfunction mapValues(obj, callback) {\n    var result = [];\n    var objKeys = keys(obj);\n    for (var idx = 0; idx < objKeys.length; idx++) {\n        var currKey = objKeys[idx];\n        result.push(callback.call(null, obj[currKey], currKey));\n    }\n    return result;\n}\nexports.mapValues = mapValues;\nfunction map(arr, callback) {\n    var result = [];\n    for (var idx = 0; idx < arr.length; idx++) {\n        result.push(callback.call(null, arr[idx], idx));\n    }\n    return result;\n}\nexports.map = map;\nfunction flatten(arr) {\n    var result = [];\n    for (var idx = 0; idx < arr.length; idx++) {\n        var currItem = arr[idx];\n        if (Array.isArray(currItem)) {\n            result = result.concat(flatten(currItem));\n        }\n        else {\n            result.push(currItem);\n        }\n    }\n    return result;\n}\nexports.flatten = flatten;\nfunction first(arr) {\n    return isEmpty(arr) ? undefined : arr[0];\n}\nexports.first = first;\nfunction last(arr) {\n    var len = arr && arr.length;\n    return len ? arr[len - 1] : undefined;\n}\nexports.last = last;\nfunction forEach(collection, iteratorCallback) {\n    /* istanbul ignore else */\n    if (Array.isArray(collection)) {\n        for (var i = 0; i < collection.length; i++) {\n            iteratorCallback.call(null, collection[i], i);\n        }\n    }\n    else if (isObject(collection)) {\n        var colKeys = keys(collection);\n        for (var i = 0; i < colKeys.length; i++) {\n            var key = colKeys[i];\n            var value = collection[key];\n            iteratorCallback.call(null, value, key);\n        }\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.forEach = forEach;\nfunction isString(item) {\n    return typeof item === \"string\";\n}\nexports.isString = isString;\nfunction isUndefined(item) {\n    return item === undefined;\n}\nexports.isUndefined = isUndefined;\nfunction isFunction(item) {\n    return item instanceof Function;\n}\nexports.isFunction = isFunction;\nfunction drop(arr, howMuch) {\n    if (howMuch === void 0) { howMuch = 1; }\n    return arr.slice(howMuch, arr.length);\n}\nexports.drop = drop;\nfunction dropRight(arr, howMuch) {\n    if (howMuch === void 0) { howMuch = 1; }\n    return arr.slice(0, arr.length - howMuch);\n}\nexports.dropRight = dropRight;\nfunction filter(arr, predicate) {\n    var result = [];\n    if (Array.isArray(arr)) {\n        for (var i = 0; i < arr.length; i++) {\n            var item = arr[i];\n            if (predicate.call(null, item)) {\n                result.push(item);\n            }\n        }\n    }\n    return result;\n}\nexports.filter = filter;\nfunction reject(arr, predicate) {\n    return filter(arr, function (item) { return !predicate(item); });\n}\nexports.reject = reject;\nfunction pick(obj, predicate) {\n    var keys = Object.keys(obj);\n    var result = {};\n    for (var i = 0; i < keys.length; i++) {\n        var currKey = keys[i];\n        var currItem = obj[currKey];\n        if (predicate(currItem)) {\n            result[currKey] = currItem;\n        }\n    }\n    return result;\n}\nexports.pick = pick;\nfunction has(obj, prop) {\n    if (isObject(obj)) {\n        return obj.hasOwnProperty(prop);\n    }\n    return false;\n}\nexports.has = has;\nfunction contains(arr, item) {\n    return find(arr, function (currItem) { return currItem === item; }) !== undefined ? true : false;\n}\nexports.contains = contains;\n/**\n * shallow clone\n */\nfunction cloneArr(arr) {\n    var newArr = [];\n    for (var i = 0; i < arr.length; i++) {\n        newArr.push(arr[i]);\n    }\n    return newArr;\n}\nexports.cloneArr = cloneArr;\n/**\n * shallow clone\n */\nfunction cloneObj(obj) {\n    var clonedObj = {};\n    for (var key in obj) {\n        /* istanbul ignore else */\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n            clonedObj[key] = obj[key];\n        }\n    }\n    return clonedObj;\n}\nexports.cloneObj = cloneObj;\nfunction find(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        var item = arr[i];\n        if (predicate.call(null, item)) {\n            return item;\n        }\n    }\n    return undefined;\n}\nexports.find = find;\nfunction findAll(arr, predicate) {\n    var found = [];\n    for (var i = 0; i < arr.length; i++) {\n        var item = arr[i];\n        if (predicate.call(null, item)) {\n            found.push(item);\n        }\n    }\n    return found;\n}\nexports.findAll = findAll;\nfunction reduce(arrOrObj, iterator, initial) {\n    var isArr = Array.isArray(arrOrObj);\n    var vals = isArr ? arrOrObj : values(arrOrObj);\n    var objKeys = isArr ? [] : keys(arrOrObj);\n    var accumulator = initial;\n    for (var i = 0; i < vals.length; i++) {\n        accumulator = iterator.call(null, accumulator, vals[i], isArr ? i : objKeys[i]);\n    }\n    return accumulator;\n}\nexports.reduce = reduce;\nfunction compact(arr) {\n    return reject(arr, function (item) { return item === null || item === undefined; });\n}\nexports.compact = compact;\nfunction uniq(arr, identity) {\n    if (identity === void 0) { identity = function (item) { return item; }; }\n    var identities = [];\n    return reduce(arr, function (result, currItem) {\n        var currIdentity = identity(currItem);\n        if (contains(identities, currIdentity)) {\n            return result;\n        }\n        else {\n            identities.push(currIdentity);\n            return result.concat(currItem);\n        }\n    }, []);\n}\nexports.uniq = uniq;\nfunction partial(func) {\n    var restArgs = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        restArgs[_i - 1] = arguments[_i];\n    }\n    var firstArg = [null];\n    var allArgs = firstArg.concat(restArgs);\n    return Function.bind.apply(func, allArgs);\n}\nexports.partial = partial;\nfunction isArray(obj) {\n    return Array.isArray(obj);\n}\nexports.isArray = isArray;\nfunction isRegExp(obj) {\n    return obj instanceof RegExp;\n}\nexports.isRegExp = isRegExp;\nfunction isObject(obj) {\n    return obj instanceof Object;\n}\nexports.isObject = isObject;\nfunction every(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        if (!predicate(arr[i], i)) {\n            return false;\n        }\n    }\n    return true;\n}\nexports.every = every;\nfunction difference(arr, values) {\n    return reject(arr, function (item) { return contains(values, item); });\n}\nexports.difference = difference;\nfunction some(arr, predicate) {\n    for (var i = 0; i < arr.length; i++) {\n        if (predicate(arr[i])) {\n            return true;\n        }\n    }\n    return false;\n}\nexports.some = some;\nfunction indexOf(arr, value) {\n    for (var i = 0; i < arr.length; i++) {\n        if (arr[i] === value) {\n            return i;\n        }\n    }\n    return -1;\n}\nexports.indexOf = indexOf;\nfunction sortBy(arr, orderFunc) {\n    var result = cloneArr(arr);\n    result.sort(function (a, b) { return orderFunc(a) - orderFunc(b); });\n    return result;\n}\nexports.sortBy = sortBy;\nfunction zipObject(keys, values) {\n    if (keys.length !== values.length) {\n        throw Error(\"can't zipObject with different number of keys and values!\");\n    }\n    var result = {};\n    for (var i = 0; i < keys.length; i++) {\n        result[keys[i]] = values[i];\n    }\n    return result;\n}\nexports.zipObject = zipObject;\n/**\n * mutates! (and returns) target\n */\nfunction assign(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    for (var i = 0; i < sources.length; i++) {\n        var curSource = sources[i];\n        var currSourceKeys = keys(curSource);\n        for (var j = 0; j < currSourceKeys.length; j++) {\n            var currKey = currSourceKeys[j];\n            target[currKey] = curSource[currKey];\n        }\n    }\n    return target;\n}\nexports.assign = assign;\n/**\n * mutates! (and returns) target\n */\nfunction assignNoOverwrite(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    for (var i = 0; i < sources.length; i++) {\n        var curSource = sources[i];\n        if (isUndefined(curSource)) {\n            continue;\n        }\n        var currSourceKeys = keys(curSource);\n        for (var j = 0; j < currSourceKeys.length; j++) {\n            var currKey = currSourceKeys[j];\n            if (!has(target, currKey)) {\n                target[currKey] = curSource[currKey];\n            }\n        }\n    }\n    return target;\n}\nexports.assignNoOverwrite = assignNoOverwrite;\nfunction defaults() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    return assignNoOverwrite.apply(null, [{}].concat(sources));\n}\nexports.defaults = defaults;\nfunction groupBy(arr, groupKeyFunc) {\n    var result = {};\n    forEach(arr, function (item) {\n        var currGroupKey = groupKeyFunc(item);\n        var currGroupArr = result[currGroupKey];\n        if (currGroupArr) {\n            currGroupArr.push(item);\n        }\n        else {\n            result[currGroupKey] = [item];\n        }\n    });\n    return result;\n}\nexports.groupBy = groupBy;\n/**\n * Merge obj2 into obj1.\n * Will overwrite existing properties with the same name\n */\nfunction merge(obj1, obj2) {\n    var result = cloneObj(obj1);\n    var keys2 = keys(obj2);\n    for (var i = 0; i < keys2.length; i++) {\n        var key = keys2[i];\n        var value = obj2[key];\n        result[key] = value;\n    }\n    return result;\n}\nexports.merge = merge;\nfunction NOOP() { }\nexports.NOOP = NOOP;\nfunction IDENTITY(item) {\n    return item;\n}\nexports.IDENTITY = IDENTITY;\n/**\n * Will return a new packed array with same values.\n */\nfunction packArray(holeyArr) {\n    var result = [];\n    for (var i = 0; i < holeyArr.length; i++) {\n        var orgValue = holeyArr[i];\n        result.push(orgValue !== undefined ? orgValue : undefined);\n    }\n    return result;\n}\nexports.packArray = packArray;\nfunction PRINT_ERROR(msg) {\n    /* istanbul ignore else - can't override global.console in node.js */\n    if (console && console.error) {\n        console.error(\"Error: \" + msg);\n    }\n}\nexports.PRINT_ERROR = PRINT_ERROR;\nfunction PRINT_WARNING(msg) {\n    /* istanbul ignore else - can't override global.console in node.js*/\n    if (console && console.warn) {\n        // TODO: modify docs accordingly\n        console.warn(\"Warning: \" + msg);\n    }\n}\nexports.PRINT_WARNING = PRINT_WARNING;\nfunction isES2015MapSupported() {\n    return typeof Map === \"function\";\n}\nexports.isES2015MapSupported = isES2015MapSupported;\nfunction applyMixins(derivedCtor, baseCtors) {\n    baseCtors.forEach(function (baseCtor) {\n        var baseProto = baseCtor.prototype;\n        Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n            if (propName === \"constructor\") {\n                return;\n            }\n            var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n            // Handle Accessors\n            if (basePropDescriptor &&\n                (basePropDescriptor.get || basePropDescriptor.set)) {\n                Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n            }\n            else {\n                derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n            }\n        });\n    });\n}\nexports.applyMixins = applyMixins;\n// base on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n    function FakeConstructor() { }\n    // If our object is used as a constructor it would receive\n    FakeConstructor.prototype = toBecomeFast;\n    var fakeInstance = new FakeConstructor();\n    function fakeAccess() {\n        return typeof fakeInstance.bar;\n    }\n    // help V8 understand this is a \"real\" prototype by actually using\n    // the fake instance.\n    fakeAccess();\n    fakeAccess();\n    return toBecomeFast;\n    // Eval prevents optimization of this method (even though this is dead code)\n    /* istanbul ignore next */\n    // tslint:disable-next-line\n    eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\nfunction peek(arr) {\n    return arr[arr.length - 1];\n}\nexports.peek = peek;\n/* istanbul ignore next - for performance tracing*/\nfunction timer(func) {\n    var start = new Date().getTime();\n    var val = func();\n    var end = new Date().getTime();\n    var total = end - start;\n    return { time: total, value: val };\n}\nexports.timer = timer;\n//# sourceMappingURL=utils.js.map\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar tokens_public_1 = __webpack_require__(3);\nvar AbstractProduction = /** @class */ (function () {\n    function AbstractProduction(definition) {\n        this.definition = definition;\n    }\n    AbstractProduction.prototype.accept = function (visitor) {\n        visitor.visit(this);\n        utils_1.forEach(this.definition, function (prod) {\n            prod.accept(visitor);\n        });\n    };\n    return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n    __extends(NonTerminal, _super);\n    function NonTerminal(options) {\n        var _this = _super.call(this, []) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    Object.defineProperty(NonTerminal.prototype, \"definition\", {\n        get: function () {\n            if (this.referencedRule !== undefined) {\n                return this.referencedRule.definition;\n            }\n            return [];\n        },\n        set: function (definition) {\n            // immutable\n        },\n        enumerable: true,\n        configurable: true\n    });\n    NonTerminal.prototype.accept = function (visitor) {\n        visitor.visit(this);\n        // don't visit children of a reference, we will get cyclic infinite loops if we do so\n    };\n    return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n    __extends(Rule, _super);\n    function Rule(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.orgText = \"\";\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\n// TODO: is this only used in an Alternation?\n//       Perhaps `Flat` should be renamed to `Alternative`?\nvar Flat = /** @class */ (function (_super) {\n    __extends(Flat, _super);\n    // A named Flat production is used to indicate a Nested Rule in an alternation\n    function Flat(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.ignoreAmbiguities = false;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Flat;\n}(AbstractProduction));\nexports.Flat = Flat;\nvar Option = /** @class */ (function (_super) {\n    __extends(Option, _super);\n    function Option(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n    __extends(RepetitionMandatory, _super);\n    function RepetitionMandatory(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n    __extends(RepetitionMandatoryWithSeparator, _super);\n    function RepetitionMandatoryWithSeparator(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n    __extends(Repetition, _super);\n    function Repetition(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n    __extends(RepetitionWithSeparator, _super);\n    function RepetitionWithSeparator(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n    __extends(Alternation, _super);\n    function Alternation(options) {\n        var _this = _super.call(this, options.definition) || this;\n        _this.idx = 1;\n        _this.ignoreAmbiguities = false;\n        _this.hasPredicates = false;\n        utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; }));\n        return _this;\n    }\n    return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n    function Terminal(options) {\n        this.idx = 1;\n        utils_1.assign(this, utils_1.pick(options, function (v) { return v !== undefined; }));\n    }\n    Terminal.prototype.accept = function (visitor) {\n        visitor.visit(this);\n    };\n    return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n    return utils_1.map(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n    function convertDefinition(definition) {\n        return utils_1.map(definition, serializeProduction);\n    }\n    /* istanbul ignore else */\n    if (node instanceof NonTerminal) {\n        return {\n            type: \"NonTerminal\",\n            name: node.nonTerminalName,\n            idx: node.idx\n        };\n    }\n    else if (node instanceof Flat) {\n        return {\n            type: \"Flat\",\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Option) {\n        return {\n            type: \"Option\",\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionMandatory) {\n        return {\n            type: \"RepetitionMandatory\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionMandatoryWithSeparator) {\n        return {\n            type: \"RepetitionMandatoryWithSeparator\",\n            name: node.name,\n            idx: node.idx,\n            separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof RepetitionWithSeparator) {\n        return {\n            type: \"RepetitionWithSeparator\",\n            name: node.name,\n            idx: node.idx,\n            separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Repetition) {\n        return {\n            type: \"Repetition\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Alternation) {\n        return {\n            type: \"Alternation\",\n            name: node.name,\n            idx: node.idx,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else if (node instanceof Terminal) {\n        var serializedTerminal = {\n            type: \"Terminal\",\n            name: node.terminalType.name,\n            label: tokens_public_1.tokenLabel(node.terminalType),\n            idx: node.idx\n        };\n        var pattern = node.terminalType.PATTERN;\n        if (node.terminalType.PATTERN) {\n            serializedTerminal.pattern = utils_1.isRegExp(pattern)\n                ? pattern.source\n                : pattern;\n        }\n        return serializedTerminal;\n    }\n    else if (node instanceof Rule) {\n        return {\n            type: \"Rule\",\n            name: node.name,\n            orgText: node.orgText,\n            definition: convertDefinition(node.definition)\n        };\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=gast_public.js.map\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar follow_1 = __webpack_require__(27);\nvar tokens_public_1 = __webpack_require__(3);\nvar cst_1 = __webpack_require__(17);\nvar errors_public_1 = __webpack_require__(10);\nvar gast_resolver_public_1 = __webpack_require__(24);\nvar recoverable_1 = __webpack_require__(25);\nvar looksahead_1 = __webpack_require__(30);\nvar tree_builder_1 = __webpack_require__(31);\nvar lexer_adapter_1 = __webpack_require__(33);\nvar recognizer_api_1 = __webpack_require__(34);\nvar recognizer_engine_1 = __webpack_require__(35);\nvar error_handler_1 = __webpack_require__(36);\nvar context_assist_1 = __webpack_require__(37);\nvar gast_recorder_1 = __webpack_require__(38);\nvar perf_tracer_1 = __webpack_require__(39);\nexports.END_OF_FILE = tokens_public_1.createTokenInstance(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n    recoveryEnabled: false,\n    maxLookahead: 4,\n    ignoredIssues: {},\n    dynamicTokensEnabled: false,\n    outputCst: true,\n    errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n    nodeLocationTracking: \"none\",\n    traceInitPerf: false,\n    skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n    recoveryValueFunc: function () { return undefined; },\n    resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_NESTED_RULE_NAME\"] = 10] = \"INVALID_NESTED_RULE_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_NESTED_NAME\"] = 11] = \"DUPLICATE_NESTED_NAME\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 12] = \"NO_NON_EMPTY_LOOKAHEAD\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 13] = \"AMBIGUOUS_PREFIX_ALTS\";\n    ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 14] = \"TOO_MANY_ALTS\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n    if (value === void 0) { value = undefined; }\n    return function () {\n        return value;\n    };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n    function Parser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        this.ignoredIssues = exports.DEFAULT_PARSER_CONFIG.ignoredIssues;\n        this.definitionErrors = [];\n        this.selfAnalysisDone = false;\n        var that = this;\n        that.initErrorHandler(config);\n        that.initLexerAdapter();\n        that.initLooksAhead(config);\n        that.initRecognizerEngine(tokenVocabulary, config);\n        that.initRecoverable(config);\n        that.initTreeBuilder(config);\n        that.initContentAssist();\n        that.initGastRecorder(config);\n        that.initPerformanceTracer(config);\n        /* istanbul ignore if - complete over-kill to test this, we should only add a test when we actually hard deprecate it and throw an error... */\n        if (utils_1.has(config, \"ignoredIssues\") &&\n            config.ignoredIssues !== exports.DEFAULT_PARSER_CONFIG.ignoredIssues) {\n            utils_1.PRINT_WARNING(\"The <ignoredIssues> IParserConfig property is soft-deprecated and will be removed in future versions.\\n\\t\" +\n                \"Please use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\");\n        }\n        this.ignoredIssues = utils_1.has(config, \"ignoredIssues\")\n            ? config.ignoredIssues\n            : exports.DEFAULT_PARSER_CONFIG.ignoredIssues;\n        this.skipValidations = utils_1.has(config, \"skipValidations\")\n            ? config.skipValidations\n            : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n    }\n    /**\n     *  @deprecated use the **instance** method with the same name instead\n     */\n    Parser.performSelfAnalysis = function (parserInstance) {\n        ;\n        parserInstance.performSelfAnalysis();\n    };\n    Parser.prototype.performSelfAnalysis = function () {\n        var _this = this;\n        this.TRACE_INIT(\"performSelfAnalysis\", function () {\n            var defErrorsMsgs;\n            _this.selfAnalysisDone = true;\n            var className = _this.className;\n            _this.TRACE_INIT(\"toFastProps\", function () {\n                // Without this voodoo magic the parser would be x3-x4 slower\n                // It seems it is better to invoke `toFastProperties` **before**\n                // Any manipulations of the `this` object done during the recording phase.\n                utils_1.toFastProperties(_this);\n            });\n            _this.TRACE_INIT(\"Grammar Recording\", function () {\n                try {\n                    _this.enableRecording();\n                    // Building the GAST\n                    utils_1.forEach(_this.definedRulesNames, function (currRuleName) {\n                        var wrappedRule = _this[currRuleName];\n                        var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n                        var recordedRuleGast = undefined;\n                        _this.TRACE_INIT(currRuleName + \" Rule\", function () {\n                            recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n                        });\n                        _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n                    });\n                }\n                finally {\n                    _this.disableRecording();\n                }\n            });\n            var resolverErrors = [];\n            _this.TRACE_INIT(\"Grammar Resolving\", function () {\n                resolverErrors = gast_resolver_public_1.resolveGrammar({\n                    rules: utils_1.values(_this.gastProductionsCache)\n                });\n                _this.definitionErrors.push.apply(_this.definitionErrors, resolverErrors); // mutability for the win?\n            });\n            _this.TRACE_INIT(\"Grammar Validations\", function () {\n                // only perform additional grammar validations IFF no resolving errors have occurred.\n                // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n                if (utils_1.isEmpty(resolverErrors) && _this.skipValidations === false) {\n                    var validationErrors = gast_resolver_public_1.validateGrammar({\n                        rules: utils_1.values(_this.gastProductionsCache),\n                        maxLookahead: _this.maxLookahead,\n                        tokenTypes: utils_1.values(_this.tokensMap),\n                        ignoredIssues: _this.ignoredIssues,\n                        errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n                        grammarName: className\n                    });\n                    _this.definitionErrors.push.apply(_this.definitionErrors, validationErrors); // mutability for the win?\n                }\n            });\n            // this analysis may fail if the grammar is not perfectly valid\n            if (utils_1.isEmpty(_this.definitionErrors)) {\n                // The results of these computations are not needed unless error recovery is enabled.\n                if (_this.recoveryEnabled) {\n                    _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n                        var allFollows = follow_1.computeAllProdsFollows(utils_1.values(_this.gastProductionsCache));\n                        _this.resyncFollows = allFollows;\n                    });\n                }\n                _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n                    _this.preComputeLookaheadFunctions(utils_1.values(_this.gastProductionsCache));\n                });\n            }\n            _this.TRACE_INIT(\"expandAllNestedRuleNames\", function () {\n                // TODO: is this needed for EmbeddedActionsParser?\n                var cstAnalysisResult = cst_1.expandAllNestedRuleNames(utils_1.values(_this.gastProductionsCache), _this.fullRuleNameToShort);\n                _this.allRuleNames = cstAnalysisResult.allRuleNames;\n            });\n            if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n                !utils_1.isEmpty(_this.definitionErrors)) {\n                defErrorsMsgs = utils_1.map(_this.definitionErrors, function (defError) { return defError.message; });\n                throw new Error(\"Parser Definition Errors detected:\\n \" + defErrorsMsgs.join(\"\\n-------------------------------\\n\"));\n            }\n        });\n    };\n    // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n    // (normally during the parser's constructor).\n    // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n    // for example: duplicate rule names, referencing an unresolved subrule, ect...\n    // This flag should not be enabled during normal usage, it is used in special situations, for example when\n    // needing to display the parser definition errors in some GUI(online playground).\n    Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n    return Parser;\n}());\nexports.Parser = Parser;\nutils_1.applyMixins(Parser, [\n    recoverable_1.Recoverable,\n    looksahead_1.LooksAhead,\n    tree_builder_1.TreeBuilder,\n    lexer_adapter_1.LexerAdapter,\n    recognizer_engine_1.RecognizerEngine,\n    recognizer_api_1.RecognizerApi,\n    error_handler_1.ErrorHandler,\n    context_assist_1.ContentAssist,\n    gast_recorder_1.GastRecorder,\n    perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n    __extends(CstParser, _super);\n    function CstParser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        var _this = this;\n        var configClone = utils_1.cloneObj(config);\n        configClone.outputCst = true;\n        _this = _super.call(this, tokenVocabulary, configClone) || this;\n        return _this;\n    }\n    return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n    __extends(EmbeddedActionsParser, _super);\n    function EmbeddedActionsParser(tokenVocabulary, config) {\n        if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n        var _this = this;\n        var configClone = utils_1.cloneObj(config);\n        configClone.outputCst = false;\n        _this = _super.call(this, tokenVocabulary, configClone) || this;\n        return _this;\n    }\n    return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar lexer_public_1 = __webpack_require__(9);\nvar tokens_1 = __webpack_require__(5);\nfunction tokenLabel(tokType) {\n    if (hasTokenLabel(tokType)) {\n        return tokType.LABEL;\n    }\n    else {\n        return tokType.name;\n    }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n    return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n    return utils_1.isString(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n    return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n    var pattern = config.pattern;\n    var tokenType = {};\n    tokenType.name = config.name;\n    if (!utils_1.isUndefined(pattern)) {\n        tokenType.PATTERN = pattern;\n    }\n    if (utils_1.has(config, PARENT)) {\n        throw \"The parent property is no longer supported.\\n\" +\n            \"See: https://github.com/SAP/chevrotain/issues/564#issuecomment-349062346 for details.\";\n    }\n    if (utils_1.has(config, CATEGORIES)) {\n        // casting to ANY as this will be fixed inside `augmentTokenTypes``\n        tokenType.CATEGORIES = config[CATEGORIES];\n    }\n    tokens_1.augmentTokenTypes([tokenType]);\n    if (utils_1.has(config, LABEL)) {\n        tokenType.LABEL = config[LABEL];\n    }\n    if (utils_1.has(config, GROUP)) {\n        tokenType.GROUP = config[GROUP];\n    }\n    if (utils_1.has(config, POP_MODE)) {\n        tokenType.POP_MODE = config[POP_MODE];\n    }\n    if (utils_1.has(config, PUSH_MODE)) {\n        tokenType.PUSH_MODE = config[PUSH_MODE];\n    }\n    if (utils_1.has(config, LONGER_ALT)) {\n        tokenType.LONGER_ALT = config[LONGER_ALT];\n    }\n    if (utils_1.has(config, LINE_BREAKS)) {\n        tokenType.LINE_BREAKS = config[LINE_BREAKS];\n    }\n    if (utils_1.has(config, START_CHARS_HINT)) {\n        tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n    }\n    return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\ntokens_1.augmentTokenTypes([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n    return {\n        image: image,\n        startOffset: startOffset,\n        endOffset: endOffset,\n        startLine: startLine,\n        endLine: endLine,\n        startColumn: startColumn,\n        endColumn: endColumn,\n        tokenTypeIdx: tokType.tokenTypeIdx,\n        tokenType: tokType\n    };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n    return tokens_1.tokenStructuredMatcher(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gast_public_1 = __webpack_require__(1);\nvar GAstVisitor = /** @class */ (function () {\n    function GAstVisitor() {\n    }\n    GAstVisitor.prototype.visit = function (node) {\n        var nodeAny = node;\n        switch (nodeAny.constructor) {\n            case gast_public_1.NonTerminal:\n                return this.visitNonTerminal(nodeAny);\n            case gast_public_1.Flat:\n                return this.visitFlat(nodeAny);\n            case gast_public_1.Option:\n                return this.visitOption(nodeAny);\n            case gast_public_1.RepetitionMandatory:\n                return this.visitRepetitionMandatory(nodeAny);\n            case gast_public_1.RepetitionMandatoryWithSeparator:\n                return this.visitRepetitionMandatoryWithSeparator(nodeAny);\n            case gast_public_1.RepetitionWithSeparator:\n                return this.visitRepetitionWithSeparator(nodeAny);\n            case gast_public_1.Repetition:\n                return this.visitRepetition(nodeAny);\n            case gast_public_1.Alternation:\n                return this.visitAlternation(nodeAny);\n            case gast_public_1.Terminal:\n                return this.visitTerminal(nodeAny);\n            case gast_public_1.Rule:\n                return this.visitRule(nodeAny);\n            /* istanbul ignore next */\n            default:\n                throw Error(\"non exhaustive match\");\n        }\n    };\n    GAstVisitor.prototype.visitNonTerminal = function (node) { };\n    GAstVisitor.prototype.visitFlat = function (node) { };\n    GAstVisitor.prototype.visitOption = function (node) { };\n    GAstVisitor.prototype.visitRepetition = function (node) { };\n    GAstVisitor.prototype.visitRepetitionMandatory = function (node) { };\n    GAstVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { };\n    GAstVisitor.prototype.visitRepetitionWithSeparator = function (node) { };\n    GAstVisitor.prototype.visitAlternation = function (node) { };\n    GAstVisitor.prototype.visitTerminal = function (node) { };\n    GAstVisitor.prototype.visitRule = function (node) { };\n    return GAstVisitor;\n}());\nexports.GAstVisitor = GAstVisitor;\n//# sourceMappingURL=gast_visitor_public.js.map\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nfunction tokenStructuredMatcher(tokInstance, tokConstructor) {\n    var instanceType = tokInstance.tokenTypeIdx;\n    if (instanceType === tokConstructor.tokenTypeIdx) {\n        return true;\n    }\n    else {\n        return (tokConstructor.isParent === true &&\n            tokConstructor.categoryMatchesMap[instanceType] === true);\n    }\n}\nexports.tokenStructuredMatcher = tokenStructuredMatcher;\n// Optimized tokenMatcher in case our grammar does not use token categories\n// Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\nfunction tokenStructuredMatcherNoCategories(token, tokType) {\n    return token.tokenTypeIdx === tokType.tokenTypeIdx;\n}\nexports.tokenStructuredMatcherNoCategories = tokenStructuredMatcherNoCategories;\nexports.tokenShortNameIdx = 1;\nexports.tokenIdxToClass = {};\nfunction augmentTokenTypes(tokenTypes) {\n    // collect the parent Token Types as well.\n    var tokenTypesAndParents = expandCategories(tokenTypes);\n    // add required tokenType and categoryMatches properties\n    assignTokenDefaultProps(tokenTypesAndParents);\n    // fill up the categoryMatches\n    assignCategoriesMapProp(tokenTypesAndParents);\n    assignCategoriesTokensProp(tokenTypesAndParents);\n    utils_1.forEach(tokenTypesAndParents, function (tokType) {\n        tokType.isParent = tokType.categoryMatches.length > 0;\n    });\n}\nexports.augmentTokenTypes = augmentTokenTypes;\nfunction expandCategories(tokenTypes) {\n    var result = utils_1.cloneArr(tokenTypes);\n    var categories = tokenTypes;\n    var searching = true;\n    while (searching) {\n        categories = utils_1.compact(utils_1.flatten(utils_1.map(categories, function (currTokType) { return currTokType.CATEGORIES; })));\n        var newCategories = utils_1.difference(categories, result);\n        result = result.concat(newCategories);\n        if (utils_1.isEmpty(newCategories)) {\n            searching = false;\n        }\n        else {\n            categories = newCategories;\n        }\n    }\n    return result;\n}\nexports.expandCategories = expandCategories;\nfunction assignTokenDefaultProps(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        if (!hasShortKeyProperty(currTokType)) {\n            exports.tokenIdxToClass[exports.tokenShortNameIdx] = currTokType;\n            currTokType.tokenTypeIdx = exports.tokenShortNameIdx++;\n        }\n        // CATEGORIES? : TokenType | TokenType[]\n        if (hasCategoriesProperty(currTokType) &&\n            !utils_1.isArray(currTokType.CATEGORIES)\n        // &&\n        // !isUndefined(currTokType.CATEGORIES.PATTERN)\n        ) {\n            currTokType.CATEGORIES = [currTokType.CATEGORIES];\n        }\n        if (!hasCategoriesProperty(currTokType)) {\n            currTokType.CATEGORIES = [];\n        }\n        if (!hasExtendingTokensTypesProperty(currTokType)) {\n            currTokType.categoryMatches = [];\n        }\n        if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n            currTokType.categoryMatchesMap = {};\n        }\n    });\n}\nexports.assignTokenDefaultProps = assignTokenDefaultProps;\nfunction assignCategoriesTokensProp(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        // avoid duplications\n        currTokType.categoryMatches = [];\n        utils_1.forEach(currTokType.categoryMatchesMap, function (val, key) {\n            currTokType.categoryMatches.push(exports.tokenIdxToClass[key].tokenTypeIdx);\n        });\n    });\n}\nexports.assignCategoriesTokensProp = assignCategoriesTokensProp;\nfunction assignCategoriesMapProp(tokenTypes) {\n    utils_1.forEach(tokenTypes, function (currTokType) {\n        singleAssignCategoriesToksMap([], currTokType);\n    });\n}\nexports.assignCategoriesMapProp = assignCategoriesMapProp;\nfunction singleAssignCategoriesToksMap(path, nextNode) {\n    utils_1.forEach(path, function (pathNode) {\n        nextNode.categoryMatchesMap[pathNode.tokenTypeIdx] = true;\n    });\n    utils_1.forEach(nextNode.CATEGORIES, function (nextCategory) {\n        var newPath = path.concat(nextNode);\n        // avoids infinite loops due to cyclic categories.\n        if (!utils_1.contains(newPath, nextCategory)) {\n            singleAssignCategoriesToksMap(newPath, nextCategory);\n        }\n    });\n}\nexports.singleAssignCategoriesToksMap = singleAssignCategoriesToksMap;\nfunction hasShortKeyProperty(tokType) {\n    return utils_1.has(tokType, \"tokenTypeIdx\");\n}\nexports.hasShortKeyProperty = hasShortKeyProperty;\nfunction hasCategoriesProperty(tokType) {\n    return utils_1.has(tokType, \"CATEGORIES\");\n}\nexports.hasCategoriesProperty = hasCategoriesProperty;\nfunction hasExtendingTokensTypesProperty(tokType) {\n    return utils_1.has(tokType, \"categoryMatches\");\n}\nexports.hasExtendingTokensTypesProperty = hasExtendingTokensTypesProperty;\nfunction hasExtendingTokensTypesMapProperty(tokType) {\n    return utils_1.has(tokType, \"categoryMatchesMap\");\n}\nexports.hasExtendingTokensTypesMapProperty = hasExtendingTokensTypesMapProperty;\nfunction isTokenType(tokType) {\n    return utils_1.has(tokType, \"tokenTypeIdx\");\n}\nexports.isTokenType = isTokenType;\n//# sourceMappingURL=tokens.js.map\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction isSequenceProd(prod) {\n    return (prod instanceof gast_public_1.Flat ||\n        prod instanceof gast_public_1.Option ||\n        prod instanceof gast_public_1.Repetition ||\n        prod instanceof gast_public_1.RepetitionMandatory ||\n        prod instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n        prod instanceof gast_public_1.RepetitionWithSeparator ||\n        prod instanceof gast_public_1.Terminal ||\n        prod instanceof gast_public_1.Rule);\n}\nexports.isSequenceProd = isSequenceProd;\nfunction isOptionalProd(prod, alreadyVisited) {\n    if (alreadyVisited === void 0) { alreadyVisited = []; }\n    var isDirectlyOptional = prod instanceof gast_public_1.Option ||\n        prod instanceof gast_public_1.Repetition ||\n        prod instanceof gast_public_1.RepetitionWithSeparator;\n    if (isDirectlyOptional) {\n        return true;\n    }\n    // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n    // empty optional top rule\n    // may be indirectly optional ((A?B?C?) | (D?E?F?))\n    if (prod instanceof gast_public_1.Alternation) {\n        // for OR its enough for just one of the alternatives to be optional\n        return utils_1.some(prod.definition, function (subProd) {\n            return isOptionalProd(subProd, alreadyVisited);\n        });\n    }\n    else if (prod instanceof gast_public_1.NonTerminal && utils_1.contains(alreadyVisited, prod)) {\n        // avoiding stack overflow due to infinite recursion\n        return false;\n    }\n    else if (prod instanceof gast_public_1.AbstractProduction) {\n        if (prod instanceof gast_public_1.NonTerminal) {\n            alreadyVisited.push(prod);\n        }\n        return utils_1.every(prod.definition, function (subProd) {\n            return isOptionalProd(subProd, alreadyVisited);\n        });\n    }\n    else {\n        return false;\n    }\n}\nexports.isOptionalProd = isOptionalProd;\nfunction isBranchingProd(prod) {\n    return prod instanceof gast_public_1.Alternation;\n}\nexports.isBranchingProd = isBranchingProd;\nfunction getProductionDslName(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        return \"SUBRULE\";\n    }\n    else if (prod instanceof gast_public_1.Option) {\n        return \"OPTION\";\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return \"OR\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return \"AT_LEAST_ONE\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return \"AT_LEAST_ONE_SEP\";\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return \"MANY_SEP\";\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return \"MANY\";\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return \"CONSUME\";\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.getProductionDslName = getProductionDslName;\nvar DslMethodsCollectorVisitor = /** @class */ (function (_super) {\n    __extends(DslMethodsCollectorVisitor, _super);\n    function DslMethodsCollectorVisitor() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        // A minus is never valid in an identifier name\n        _this.separator = \"-\";\n        _this.dslMethods = {\n            option: [],\n            alternation: [],\n            repetition: [],\n            repetitionWithSeparator: [],\n            repetitionMandatory: [],\n            repetitionMandatoryWithSeparator: []\n        };\n        return _this;\n    }\n    DslMethodsCollectorVisitor.prototype.reset = function () {\n        this.dslMethods = {\n            option: [],\n            alternation: [],\n            repetition: [],\n            repetitionWithSeparator: [],\n            repetitionMandatory: [],\n            repetitionMandatoryWithSeparator: []\n        };\n    };\n    DslMethodsCollectorVisitor.prototype.visitTerminal = function (terminal) {\n        var key = terminal.terminalType.name + this.separator + \"Terminal\";\n        if (!utils_1.has(this.dslMethods, key)) {\n            this.dslMethods[key] = [];\n        }\n        this.dslMethods[key].push(terminal);\n    };\n    DslMethodsCollectorVisitor.prototype.visitNonTerminal = function (subrule) {\n        var key = subrule.nonTerminalName + this.separator + \"Terminal\";\n        if (!utils_1.has(this.dslMethods, key)) {\n            this.dslMethods[key] = [];\n        }\n        this.dslMethods[key].push(subrule);\n    };\n    DslMethodsCollectorVisitor.prototype.visitOption = function (option) {\n        this.dslMethods.option.push(option);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.dslMethods.repetitionWithSeparator.push(manySep);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.dslMethods.repetitionMandatory.push(atLeastOne);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);\n    };\n    DslMethodsCollectorVisitor.prototype.visitRepetition = function (many) {\n        this.dslMethods.repetition.push(many);\n    };\n    DslMethodsCollectorVisitor.prototype.visitAlternation = function (or) {\n        this.dslMethods.alternation.push(or);\n    };\n    return DslMethodsCollectorVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.DslMethodsCollectorVisitor = DslMethodsCollectorVisitor;\nvar collectorVisitor = new DslMethodsCollectorVisitor();\nfunction collectMethods(rule) {\n    collectorVisitor.reset();\n    rule.accept(collectorVisitor);\n    var dslMethods = collectorVisitor.dslMethods;\n    // avoid uncleaned references\n    collectorVisitor.reset();\n    return dslMethods;\n}\nexports.collectMethods = collectMethods;\n//# sourceMappingURL=gast.js.map\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Lookahead keys are 32Bit integers in the form\n// TTTTTTTT-ZZZZZZZZZZZZ-YYYY-XXXXXXXX\n// XXXX -> Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\n/* tslint:disable */\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n/* tslint:enable */\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n    /* tslint:disable */\n    return occurrence | dslMethodIdx | ruleIdx;\n    /* tslint:enable */\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\nfunction getKeyForAltIndex(ruleIdx, dslMethodIdx, occurrence, altIdx) {\n    /* tslint:disable */\n    // alternative indices are zero based, thus must always add one (turn on one bit) to guarantee uniqueness.\n    var altIdxBitMap = (altIdx + 1) << BITS_START_FOR_ALT_IDX;\n    return (getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) |\n        altIdxBitMap);\n    /* tslint:enable */\n}\nexports.getKeyForAltIndex = getKeyForAltIndex;\n//# sourceMappingURL=keys.js.map\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar MISMATCHED_TOKEN_EXCEPTION = \"MismatchedTokenException\";\nvar NO_VIABLE_ALT_EXCEPTION = \"NoViableAltException\";\nvar EARLY_EXIT_EXCEPTION = \"EarlyExitException\";\nvar NOT_ALL_INPUT_PARSED_EXCEPTION = \"NotAllInputParsedException\";\nvar RECOGNITION_EXCEPTION_NAMES = [\n    MISMATCHED_TOKEN_EXCEPTION,\n    NO_VIABLE_ALT_EXCEPTION,\n    EARLY_EXIT_EXCEPTION,\n    NOT_ALL_INPUT_PARSED_EXCEPTION\n];\nObject.freeze(RECOGNITION_EXCEPTION_NAMES);\n// hacks to bypass no support for custom Errors in javascript/typescript\nfunction isRecognitionException(error) {\n    // can't do instanceof on hacked custom js exceptions\n    return utils_1.contains(RECOGNITION_EXCEPTION_NAMES, error.name);\n}\nexports.isRecognitionException = isRecognitionException;\nfunction MismatchedTokenException(message, token, previousToken) {\n    this.name = MISMATCHED_TOKEN_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.MismatchedTokenException = MismatchedTokenException;\n// must use the \"Error.prototype\" instead of \"new Error\"\n// because the stack trace points to where \"new Error\" was invoked\"\nMismatchedTokenException.prototype = Error.prototype;\nfunction NoViableAltException(message, token, previousToken) {\n    this.name = NO_VIABLE_ALT_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.NoViableAltException = NoViableAltException;\nNoViableAltException.prototype = Error.prototype;\nfunction NotAllInputParsedException(message, token) {\n    this.name = NOT_ALL_INPUT_PARSED_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.resyncedTokens = [];\n}\nexports.NotAllInputParsedException = NotAllInputParsedException;\nNotAllInputParsedException.prototype = Error.prototype;\nfunction EarlyExitException(message, token, previousToken) {\n    this.name = EARLY_EXIT_EXCEPTION;\n    this.message = message;\n    this.token = token;\n    this.previousToken = previousToken;\n    this.resyncedTokens = [];\n}\nexports.EarlyExitException = EarlyExitException;\nEarlyExitException.prototype = Error.prototype;\n//# sourceMappingURL=exceptions_public.js.map\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar lexer_1 = __webpack_require__(20);\nvar utils_1 = __webpack_require__(0);\nvar tokens_1 = __webpack_require__(5);\nvar lexer_errors_public_1 = __webpack_require__(21);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar LexerDefinitionErrorType;\n(function (LexerDefinitionErrorType) {\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MISSING_PATTERN\"] = 0] = \"MISSING_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_PATTERN\"] = 1] = \"INVALID_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"EOI_ANCHOR_FOUND\"] = 2] = \"EOI_ANCHOR_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNSUPPORTED_FLAGS_FOUND\"] = 3] = \"UNSUPPORTED_FLAGS_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"DUPLICATE_PATTERNS_FOUND\"] = 4] = \"DUPLICATE_PATTERNS_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_GROUP_TYPE_FOUND\"] = 5] = \"INVALID_GROUP_TYPE_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"PUSH_MODE_DOES_NOT_EXIST\"] = 6] = \"PUSH_MODE_DOES_NOT_EXIST\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\"] = 7] = \"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\"] = 8] = \"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\"] = 9] = \"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\"] = 10] = \"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"SOI_ANCHOR_FOUND\"] = 11] = \"SOI_ANCHOR_FOUND\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"EMPTY_MATCH_PATTERN\"] = 12] = \"EMPTY_MATCH_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"NO_LINE_BREAKS_FLAGS\"] = 13] = \"NO_LINE_BREAKS_FLAGS\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNREACHABLE_PATTERN\"] = 14] = \"UNREACHABLE_PATTERN\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"IDENTIFY_TERMINATOR\"] = 15] = \"IDENTIFY_TERMINATOR\";\n    LexerDefinitionErrorType[LexerDefinitionErrorType[\"CUSTOM_LINE_BREAK\"] = 16] = \"CUSTOM_LINE_BREAK\";\n})(LexerDefinitionErrorType = exports.LexerDefinitionErrorType || (exports.LexerDefinitionErrorType = {}));\nvar DEFAULT_LEXER_CONFIG = {\n    deferDefinitionErrorsHandling: false,\n    positionTracking: \"full\",\n    lineTerminatorsPattern: /\\n|\\r\\n?/g,\n    lineTerminatorCharacters: [\"\\n\", \"\\r\"],\n    ensureOptimizations: false,\n    safeMode: false,\n    errorMessageProvider: lexer_errors_public_1.defaultLexerErrorProvider,\n    traceInitPerf: false,\n    skipValidations: false\n};\nObject.freeze(DEFAULT_LEXER_CONFIG);\nvar Lexer = /** @class */ (function () {\n    function Lexer(lexerDefinition, config) {\n        var _this = this;\n        if (config === void 0) { config = DEFAULT_LEXER_CONFIG; }\n        this.lexerDefinition = lexerDefinition;\n        this.lexerDefinitionErrors = [];\n        this.lexerDefinitionWarning = [];\n        this.patternIdxToConfig = {};\n        this.charCodeToPatternIdxToConfig = {};\n        this.modes = [];\n        this.emptyGroups = {};\n        this.config = undefined;\n        this.trackStartLines = true;\n        this.trackEndLines = true;\n        this.hasCustom = false;\n        this.canModeBeOptimized = {};\n        if (typeof config === \"boolean\") {\n            throw Error(\"The second argument to the Lexer constructor is now an ILexerConfig Object.\\n\" +\n                \"a boolean 2nd argument is no longer supported\");\n        }\n        // todo: defaults func?\n        this.config = utils_1.merge(DEFAULT_LEXER_CONFIG, config);\n        var traceInitVal = this.config.traceInitPerf;\n        if (traceInitVal === true) {\n            this.traceInitMaxIdent = Infinity;\n            this.traceInitPerf = true;\n        }\n        else if (typeof traceInitVal === \"number\") {\n            this.traceInitMaxIdent = traceInitVal;\n            this.traceInitPerf = true;\n        }\n        this.traceInitIndent = -1;\n        this.TRACE_INIT(\"Lexer Constructor\", function () {\n            var actualDefinition;\n            var hasOnlySingleMode = true;\n            _this.TRACE_INIT(\"Lexer Config handling\", function () {\n                if (_this.config.lineTerminatorsPattern ===\n                    DEFAULT_LEXER_CONFIG.lineTerminatorsPattern) {\n                    // optimized built-in implementation for the defaults definition of lineTerminators\n                    _this.config.lineTerminatorsPattern = lexer_1.LineTerminatorOptimizedTester;\n                }\n                else {\n                    if (_this.config.lineTerminatorCharacters ===\n                        DEFAULT_LEXER_CONFIG.lineTerminatorCharacters) {\n                        throw Error(\"Error: Missing <lineTerminatorCharacters> property on the Lexer config.\\n\" +\n                            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\");\n                    }\n                }\n                if (config.safeMode && config.ensureOptimizations) {\n                    throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');\n                }\n                _this.trackStartLines = /full|onlyStart/i.test(_this.config.positionTracking);\n                _this.trackEndLines = /full/i.test(_this.config.positionTracking);\n                // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n                if (utils_1.isArray(lexerDefinition)) {\n                    actualDefinition = { modes: {} };\n                    actualDefinition.modes[lexer_1.DEFAULT_MODE] = utils_1.cloneArr(lexerDefinition);\n                    actualDefinition[lexer_1.DEFAULT_MODE] = lexer_1.DEFAULT_MODE;\n                }\n                else {\n                    // no conversion needed, input should already be a IMultiModeLexerDefinition\n                    hasOnlySingleMode = false;\n                    actualDefinition = utils_1.cloneObj((lexerDefinition));\n                }\n            });\n            if (_this.config.skipValidations === false) {\n                _this.TRACE_INIT(\"performRuntimeChecks\", function () {\n                    _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat(lexer_1.performRuntimeChecks(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n                });\n                _this.TRACE_INIT(\"performWarningRuntimeChecks\", function () {\n                    _this.lexerDefinitionWarning = _this.lexerDefinitionWarning.concat(lexer_1.performWarningRuntimeChecks(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n                });\n            }\n            // for extra robustness to avoid throwing an none informative error message\n            actualDefinition.modes = actualDefinition.modes\n                ? actualDefinition.modes\n                : {};\n            // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n            // this transformation is to increase robustness in the case of partially invalid lexer definition.\n            utils_1.forEach(actualDefinition.modes, function (currModeValue, currModeName) {\n                actualDefinition.modes[currModeName] = utils_1.reject(currModeValue, function (currTokType) { return utils_1.isUndefined(currTokType); });\n            });\n            var allModeNames = utils_1.keys(actualDefinition.modes);\n            utils_1.forEach(actualDefinition.modes, function (currModDef, currModName) {\n                _this.TRACE_INIT(\"Mode: <\" + currModName + \"> processing\", function () {\n                    _this.modes.push(currModName);\n                    if (_this.config.skipValidations === false) {\n                        _this.TRACE_INIT(\"validatePatterns\", function () {\n                            _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat(lexer_1.validatePatterns(currModDef, allModeNames));\n                        });\n                    }\n                    // If definition errors were encountered, the analysis phase may fail unexpectedly/\n                    // Considering a lexer with definition errors may never be used, there is no point\n                    // to performing the analysis anyhow...\n                    if (utils_1.isEmpty(_this.lexerDefinitionErrors)) {\n                        tokens_1.augmentTokenTypes(currModDef);\n                        var currAnalyzeResult_1;\n                        _this.TRACE_INIT(\"analyzeTokenTypes\", function () {\n                            currAnalyzeResult_1 = lexer_1.analyzeTokenTypes(currModDef, {\n                                lineTerminatorCharacters: _this.config\n                                    .lineTerminatorCharacters,\n                                positionTracking: config.positionTracking,\n                                ensureOptimizations: config.ensureOptimizations,\n                                safeMode: config.safeMode,\n                                tracer: _this.TRACE_INIT.bind(_this)\n                            });\n                        });\n                        _this.patternIdxToConfig[currModName] =\n                            currAnalyzeResult_1.patternIdxToConfig;\n                        _this.charCodeToPatternIdxToConfig[currModName] =\n                            currAnalyzeResult_1.charCodeToPatternIdxToConfig;\n                        _this.emptyGroups = utils_1.merge(_this.emptyGroups, currAnalyzeResult_1.emptyGroups);\n                        _this.hasCustom =\n                            currAnalyzeResult_1.hasCustom || _this.hasCustom;\n                        _this.canModeBeOptimized[currModName] =\n                            currAnalyzeResult_1.canBeOptimized;\n                    }\n                });\n            });\n            _this.defaultMode = actualDefinition.defaultMode;\n            if (!utils_1.isEmpty(_this.lexerDefinitionErrors) &&\n                !_this.config.deferDefinitionErrorsHandling) {\n                var allErrMessages = utils_1.map(_this.lexerDefinitionErrors, function (error) {\n                    return error.message;\n                });\n                var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n                throw new Error(\"Errors detected in definition of Lexer:\\n\" +\n                    allErrMessagesString);\n            }\n            // Only print warning if there are no errors, This will avoid pl\n            utils_1.forEach(_this.lexerDefinitionWarning, function (warningDescriptor) {\n                utils_1.PRINT_WARNING(warningDescriptor.message);\n            });\n            _this.TRACE_INIT(\"Choosing sub-methods implementations\", function () {\n                // Choose the relevant internal implementations for this specific parser.\n                // These implementations should be in-lined by the JavaScript engine\n                // to provide optimal performance in each scenario.\n                if (lexer_1.SUPPORT_STICKY) {\n                    _this.chopInput = utils_1.IDENTITY;\n                    _this.match = _this.matchWithTest;\n                }\n                else {\n                    _this.updateLastIndex = utils_1.NOOP;\n                    _this.match = _this.matchWithExec;\n                }\n                if (hasOnlySingleMode) {\n                    _this.handleModes = utils_1.NOOP;\n                }\n                if (_this.trackStartLines === false) {\n                    _this.computeNewColumn = utils_1.IDENTITY;\n                }\n                if (_this.trackEndLines === false) {\n                    _this.updateTokenEndLineColumnLocation = utils_1.NOOP;\n                }\n                if (/full/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createFullToken;\n                }\n                else if (/onlyStart/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createStartOnlyToken;\n                }\n                else if (/onlyOffset/i.test(_this.config.positionTracking)) {\n                    _this.createTokenInstance = _this.createOffsetOnlyToken;\n                }\n                else {\n                    throw Error(\"Invalid <positionTracking> config option: \\\"\" + _this.config.positionTracking + \"\\\"\");\n                }\n                if (_this.hasCustom) {\n                    _this.addToken = _this.addTokenUsingPush;\n                    _this.handlePayload = _this.handlePayloadWithCustom;\n                }\n                else {\n                    _this.addToken = _this.addTokenUsingMemberAccess;\n                    _this.handlePayload = _this.handlePayloadNoCustom;\n                }\n            });\n            _this.TRACE_INIT(\"Failed Optimization Warnings\", function () {\n                var unOptimizedModes = utils_1.reduce(_this.canModeBeOptimized, function (cannotBeOptimized, canBeOptimized, modeName) {\n                    if (canBeOptimized === false) {\n                        cannotBeOptimized.push(modeName);\n                    }\n                    return cannotBeOptimized;\n                }, []);\n                if (config.ensureOptimizations && !utils_1.isEmpty(unOptimizedModes)) {\n                    throw Error(\"Lexer Modes: < \" + unOptimizedModes.join(\", \") + \" > cannot be optimized.\\n\" +\n                        '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n                        \"\\t Or inspect the console log for details on how to resolve these issues.\");\n                }\n            });\n            _this.TRACE_INIT(\"clearRegExpParserCache\", function () {\n                reg_exp_parser_1.clearRegExpParserCache();\n            });\n            _this.TRACE_INIT(\"toFastProperties\", function () {\n                utils_1.toFastProperties(_this);\n            });\n        });\n    }\n    Lexer.prototype.tokenize = function (text, initialMode) {\n        if (initialMode === void 0) { initialMode = this.defaultMode; }\n        if (!utils_1.isEmpty(this.lexerDefinitionErrors)) {\n            var allErrMessages = utils_1.map(this.lexerDefinitionErrors, function (error) {\n                return error.message;\n            });\n            var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n            throw new Error(\"Unable to Tokenize because Errors detected in definition of Lexer:\\n\" +\n                allErrMessagesString);\n        }\n        var lexResult = this.tokenizeInternal(text, initialMode);\n        return lexResult;\n    };\n    // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n    // This is intentional due to performance considerations.\n    Lexer.prototype.tokenizeInternal = function (text, initialMode) {\n        var _this = this;\n        var i, j, matchAltImage, longerAltIdx, matchedImage, payload, altPayload, imageLength, group, tokType, newToken, errLength, droppedChar, msg, match;\n        var orgText = text;\n        var orgLength = orgText.length;\n        var offset = 0;\n        var matchedTokensIndex = 0;\n        // initializing the tokensArray to the \"guessed\" size.\n        // guessing too little will still reduce the number of array re-sizes on pushes.\n        // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n        // but would still have a faster runtime by avoiding (All but one) array resizing.\n        var guessedNumberOfTokens = this.hasCustom\n            ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n            : Math.floor(text.length / 10);\n        var matchedTokens = new Array(guessedNumberOfTokens);\n        var errors = [];\n        var line = this.trackStartLines ? 1 : undefined;\n        var column = this.trackStartLines ? 1 : undefined;\n        var groups = lexer_1.cloneEmptyGroups(this.emptyGroups);\n        var trackLines = this.trackStartLines;\n        var lineTerminatorPattern = this.config.lineTerminatorsPattern;\n        var currModePatternsLength = 0;\n        var patternIdxToConfig = [];\n        var currCharCodeToPatternIdxToConfig = [];\n        var modeStack = [];\n        var emptyArray = [];\n        Object.freeze(emptyArray);\n        var getPossiblePatterns = undefined;\n        function getPossiblePatternsSlow() {\n            return patternIdxToConfig;\n        }\n        function getPossiblePatternsOptimized(charCode) {\n            var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(charCode);\n            var possiblePatterns = currCharCodeToPatternIdxToConfig[optimizedCharIdx];\n            if (possiblePatterns === undefined) {\n                return emptyArray;\n            }\n            else {\n                return possiblePatterns;\n            }\n        }\n        var pop_mode = function (popToken) {\n            // TODO: perhaps avoid this error in the edge case there is no more input?\n            if (modeStack.length === 1 &&\n                // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n                // So no error should occur.\n                popToken.tokenType.PUSH_MODE === undefined) {\n                // if we try to pop the last mode there lexer will no longer have ANY mode.\n                // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n                var msg_1 = _this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(popToken);\n                errors.push({\n                    offset: popToken.startOffset,\n                    line: popToken.startLine !== undefined\n                        ? popToken.startLine\n                        : undefined,\n                    column: popToken.startColumn !== undefined\n                        ? popToken.startColumn\n                        : undefined,\n                    length: popToken.image.length,\n                    message: msg_1\n                });\n            }\n            else {\n                modeStack.pop();\n                var newMode = utils_1.last(modeStack);\n                patternIdxToConfig = _this.patternIdxToConfig[newMode];\n                currCharCodeToPatternIdxToConfig = _this\n                    .charCodeToPatternIdxToConfig[newMode];\n                currModePatternsLength = patternIdxToConfig.length;\n                var modeCanBeOptimized = _this.canModeBeOptimized[newMode] &&\n                    _this.config.safeMode === false;\n                if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n                    getPossiblePatterns = getPossiblePatternsOptimized;\n                }\n                else {\n                    getPossiblePatterns = getPossiblePatternsSlow;\n                }\n            }\n        };\n        function push_mode(newMode) {\n            modeStack.push(newMode);\n            currCharCodeToPatternIdxToConfig = this\n                .charCodeToPatternIdxToConfig[newMode];\n            patternIdxToConfig = this.patternIdxToConfig[newMode];\n            currModePatternsLength = patternIdxToConfig.length;\n            currModePatternsLength = patternIdxToConfig.length;\n            var modeCanBeOptimized = this.canModeBeOptimized[newMode] &&\n                this.config.safeMode === false;\n            if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n                getPossiblePatterns = getPossiblePatternsOptimized;\n            }\n            else {\n                getPossiblePatterns = getPossiblePatternsSlow;\n            }\n        }\n        // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n        // seem to matter performance wise.\n        push_mode.call(this, initialMode);\n        var currConfig;\n        while (offset < orgLength) {\n            matchedImage = null;\n            var nextCharCode = orgText.charCodeAt(offset);\n            var chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode);\n            var chosenPatternsLength = chosenPatternIdxToConfig.length;\n            for (i = 0; i < chosenPatternsLength; i++) {\n                currConfig = chosenPatternIdxToConfig[i];\n                var currPattern = currConfig.pattern;\n                payload = null;\n                // manually in-lined because > 600 chars won't be in-lined in V8\n                var singleCharCode = currConfig.short;\n                if (singleCharCode !== false) {\n                    if (nextCharCode === singleCharCode) {\n                        // single character string\n                        matchedImage = currPattern;\n                    }\n                }\n                else if (currConfig.isCustom === true) {\n                    match = currPattern.exec(orgText, offset, matchedTokens, groups);\n                    if (match !== null) {\n                        matchedImage = match[0];\n                        if (match.payload !== undefined) {\n                            payload = match.payload;\n                        }\n                    }\n                    else {\n                        matchedImage = null;\n                    }\n                }\n                else {\n                    this.updateLastIndex(currPattern, offset);\n                    matchedImage = this.match(currPattern, text, offset);\n                }\n                if (matchedImage !== null) {\n                    // even though this pattern matched we must try a another longer alternative.\n                    // this can be used to prioritize keywords over identifiers\n                    longerAltIdx = currConfig.longerAlt;\n                    if (longerAltIdx !== undefined) {\n                        // TODO: micro optimize, avoid extra prop access\n                        // by saving/linking longerAlt on the original config?\n                        var longerAltConfig = patternIdxToConfig[longerAltIdx];\n                        var longerAltPattern = longerAltConfig.pattern;\n                        altPayload = null;\n                        // single Char can never be a longer alt so no need to test it.\n                        // manually in-lined because > 600 chars won't be in-lined in V8\n                        if (longerAltConfig.isCustom === true) {\n                            match = longerAltPattern.exec(orgText, offset, matchedTokens, groups);\n                            if (match !== null) {\n                                matchAltImage = match[0];\n                                if (match.payload !== undefined) {\n                                    altPayload = match.payload;\n                                }\n                            }\n                            else {\n                                matchAltImage = null;\n                            }\n                        }\n                        else {\n                            this.updateLastIndex(longerAltPattern, offset);\n                            matchAltImage = this.match(longerAltPattern, text, offset);\n                        }\n                        if (matchAltImage &&\n                            matchAltImage.length > matchedImage.length) {\n                            matchedImage = matchAltImage;\n                            payload = altPayload;\n                            currConfig = longerAltConfig;\n                        }\n                    }\n                    break;\n                }\n            }\n            // successful match\n            if (matchedImage !== null) {\n                imageLength = matchedImage.length;\n                group = currConfig.group;\n                if (group !== undefined) {\n                    tokType = currConfig.tokenTypeIdx;\n                    // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n                    // createFullToken method\n                    newToken = this.createTokenInstance(matchedImage, offset, tokType, currConfig.tokenType, line, column, imageLength);\n                    this.handlePayload(newToken, payload);\n                    // TODO: optimize NOOP in case there are no special groups?\n                    if (group === false) {\n                        matchedTokensIndex = this.addToken(matchedTokens, matchedTokensIndex, newToken);\n                    }\n                    else {\n                        groups[group].push(newToken);\n                    }\n                }\n                text = this.chopInput(text, imageLength);\n                offset = offset + imageLength;\n                // TODO: with newlines the column may be assigned twice\n                column = this.computeNewColumn(column, imageLength);\n                if (trackLines === true &&\n                    currConfig.canLineTerminator === true) {\n                    var numOfLTsInMatch = 0;\n                    var foundTerminator = void 0;\n                    var lastLTEndOffset = void 0;\n                    lineTerminatorPattern.lastIndex = 0;\n                    do {\n                        foundTerminator = lineTerminatorPattern.test(matchedImage);\n                        if (foundTerminator === true) {\n                            lastLTEndOffset =\n                                lineTerminatorPattern.lastIndex - 1;\n                            numOfLTsInMatch++;\n                        }\n                    } while (foundTerminator === true);\n                    if (numOfLTsInMatch !== 0) {\n                        line = line + numOfLTsInMatch;\n                        column = imageLength - lastLTEndOffset;\n                        this.updateTokenEndLineColumnLocation(newToken, group, lastLTEndOffset, numOfLTsInMatch, line, column, imageLength);\n                    }\n                }\n                // will be NOOP if no modes present\n                this.handleModes(currConfig, pop_mode, push_mode, newToken);\n            }\n            else {\n                // error recovery, drop characters until we identify a valid token's start point\n                var errorStartOffset = offset;\n                var errorLine = line;\n                var errorColumn = column;\n                var foundResyncPoint = false;\n                while (!foundResyncPoint && offset < orgLength) {\n                    // drop chars until we succeed in matching something\n                    droppedChar = orgText.charCodeAt(offset);\n                    // Identity Func (when sticky flag is enabled)\n                    text = this.chopInput(text, 1);\n                    offset++;\n                    for (j = 0; j < currModePatternsLength; j++) {\n                        var currConfig_1 = patternIdxToConfig[j];\n                        var currPattern = currConfig_1.pattern;\n                        // manually in-lined because > 600 chars won't be in-lined in V8\n                        var singleCharCode = currConfig_1.short;\n                        if (singleCharCode !== false) {\n                            if (orgText.charCodeAt(offset) === singleCharCode) {\n                                // single character string\n                                foundResyncPoint = true;\n                            }\n                        }\n                        else if (currConfig_1.isCustom === true) {\n                            foundResyncPoint =\n                                currPattern.exec(orgText, offset, matchedTokens, groups) !== null;\n                        }\n                        else {\n                            this.updateLastIndex(currPattern, offset);\n                            foundResyncPoint = currPattern.exec(text) !== null;\n                        }\n                        if (foundResyncPoint === true) {\n                            break;\n                        }\n                    }\n                }\n                errLength = offset - errorStartOffset;\n                // at this point we either re-synced or reached the end of the input text\n                msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(orgText, errorStartOffset, errLength, errorLine, errorColumn);\n                errors.push({\n                    offset: errorStartOffset,\n                    line: errorLine,\n                    column: errorColumn,\n                    length: errLength,\n                    message: msg\n                });\n            }\n        }\n        // if we do have custom patterns which push directly into the\n        // TODO: custom tokens should not push directly??\n        if (!this.hasCustom) {\n            // if we guessed a too large size for the tokens array this will shrink it to the right size.\n            matchedTokens.length = matchedTokensIndex;\n        }\n        return {\n            tokens: matchedTokens,\n            groups: groups,\n            errors: errors\n        };\n    };\n    Lexer.prototype.handleModes = function (config, pop_mode, push_mode, newToken) {\n        if (config.pop === true) {\n            // need to save the PUSH_MODE property as if the mode is popped\n            // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n            var pushMode = config.push;\n            pop_mode(newToken);\n            if (pushMode !== undefined) {\n                push_mode.call(this, pushMode);\n            }\n        }\n        else if (config.push !== undefined) {\n            push_mode.call(this, config.push);\n        }\n    };\n    Lexer.prototype.chopInput = function (text, length) {\n        return text.substring(length);\n    };\n    Lexer.prototype.updateLastIndex = function (regExp, newLastIndex) {\n        regExp.lastIndex = newLastIndex;\n    };\n    // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n    Lexer.prototype.updateTokenEndLineColumnLocation = function (newToken, group, lastLTIdx, numOfLTsInMatch, line, column, imageLength) {\n        var lastCharIsLT, fixForEndingInLT;\n        if (group !== undefined) {\n            // a none skipped multi line Token, need to update endLine/endColumn\n            lastCharIsLT = lastLTIdx === imageLength - 1;\n            fixForEndingInLT = lastCharIsLT ? -1 : 0;\n            if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n                // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n                newToken.endLine = line + fixForEndingInLT;\n                // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n                // inclusive to exclusive range.\n                newToken.endColumn = column - 1 + -fixForEndingInLT;\n            }\n            // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n        }\n    };\n    Lexer.prototype.computeNewColumn = function (oldColumn, imageLength) {\n        return oldColumn + imageLength;\n    };\n    // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.createTokenInstance = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return null;\n    };\n    Lexer.prototype.createOffsetOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    Lexer.prototype.createStartOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            startLine: startLine,\n            startColumn: startColumn,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    Lexer.prototype.createFullToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn, imageLength) {\n        return {\n            image: image,\n            startOffset: startOffset,\n            endOffset: startOffset + imageLength - 1,\n            startLine: startLine,\n            endLine: startLine,\n            startColumn: startColumn,\n            endColumn: startColumn + imageLength - 1,\n            tokenTypeIdx: tokenTypeIdx,\n            tokenType: tokenType\n        };\n    };\n    // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.addToken = function (tokenVector, index, tokenToAdd) {\n        return 666;\n    };\n    Lexer.prototype.addTokenUsingPush = function (tokenVector, index, tokenToAdd) {\n        tokenVector.push(tokenToAdd);\n        return index;\n    };\n    Lexer.prototype.addTokenUsingMemberAccess = function (tokenVector, index, tokenToAdd) {\n        tokenVector[index] = tokenToAdd;\n        index++;\n        return index;\n    };\n    // Place holder, will be replaced by the correct variant according to the hasCustom flag option at runtime.\n    /* istanbul ignore next - place holder */\n    Lexer.prototype.handlePayload = function (token, payload) { };\n    Lexer.prototype.handlePayloadNoCustom = function (token, payload) { };\n    Lexer.prototype.handlePayloadWithCustom = function (token, payload) {\n        if (payload !== null) {\n            token.payload = payload;\n        }\n    };\n    /* istanbul ignore next - place holder to be replaced with chosen alternative at runtime */\n    Lexer.prototype.match = function (pattern, text, offset) {\n        return null;\n    };\n    Lexer.prototype.matchWithTest = function (pattern, text, offset) {\n        var found = pattern.test(text);\n        if (found === true) {\n            return text.substring(offset, pattern.lastIndex);\n        }\n        return null;\n    };\n    Lexer.prototype.matchWithExec = function (pattern, text) {\n        var regExpArray = pattern.exec(text);\n        return regExpArray !== null ? regExpArray[0] : regExpArray;\n    };\n    // Duplicated from the parser's perf trace trait to allow future extraction\n    // of the lexer to a separate package.\n    Lexer.prototype.TRACE_INIT = function (phaseDesc, phaseImpl) {\n        // No need to optimize this using NOOP pattern because\n        // It is not called in a hot spot...\n        if (this.traceInitPerf === true) {\n            this.traceInitIndent++;\n            var indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                console.log(indent + \"--> <\" + phaseDesc + \">\");\n            }\n            var _a = utils_1.timer(phaseImpl), time = _a.time, value = _a.value;\n            /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n            var traceMethod = time > 10 ? console.warn : console.log;\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                traceMethod(indent + \"<-- <\" + phaseDesc + \"> time: \" + time + \"ms\");\n            }\n            this.traceInitIndent--;\n            return value;\n        }\n        else {\n            return phaseImpl();\n        }\n    };\n    Lexer.SKIPPED = \"This marks a skipped Token pattern, this means each token identified by it will\" +\n        \"be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\";\n    Lexer.NA = /NOT_APPLICABLE/;\n    return Lexer;\n}());\nexports.Lexer = Lexer;\n//# sourceMappingURL=lexer_public.js.map\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tokens_public_1 = __webpack_require__(3);\nvar utils = __webpack_require__(0);\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_1 = __webpack_require__(6);\nvar checks_1 = __webpack_require__(11);\nexports.defaultParserErrorProvider = {\n    buildMismatchTokenMessage: function (_a) {\n        var expected = _a.expected, actual = _a.actual, previous = _a.previous, ruleName = _a.ruleName;\n        var hasLabel = tokens_public_1.hasTokenLabel(expected);\n        var expectedMsg = hasLabel\n            ? \"--> \" + tokens_public_1.tokenLabel(expected) + \" <--\"\n            : \"token of type --> \" + expected.name + \" <--\";\n        var msg = \"Expecting \" + expectedMsg + \" but found --> '\" + actual.image + \"' <--\";\n        return msg;\n    },\n    buildNotAllInputParsedMessage: function (_a) {\n        var firstRedundant = _a.firstRedundant, ruleName = _a.ruleName;\n        return (\"Redundant input, expecting EOF but found: \" + firstRedundant.image);\n    },\n    buildNoViableAltMessage: function (_a) {\n        var expectedPathsPerAlt = _a.expectedPathsPerAlt, actual = _a.actual, previous = _a.previous, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n        var errPrefix = \"Expecting: \";\n        // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n        var actualText = utils_1.first(actual).image;\n        var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n        if (customUserDescription) {\n            return errPrefix + customUserDescription + errSuffix;\n        }\n        else {\n            var allLookAheadPaths = utils_1.reduce(expectedPathsPerAlt, function (result, currAltPaths) { return result.concat(currAltPaths); }, []);\n            var nextValidTokenSequences = utils_1.map(allLookAheadPaths, function (currPath) {\n                return \"[\" + utils_1.map(currPath, function (currTokenType) {\n                    return tokens_public_1.tokenLabel(currTokenType);\n                }).join(\", \") + \"]\";\n            });\n            var nextValidSequenceItems = utils_1.map(nextValidTokenSequences, function (itemMsg, idx) { return \"  \" + (idx + 1) + \". \" + itemMsg; });\n            var calculatedDescription = \"one of these possible Token sequences:\\n\" + nextValidSequenceItems.join(\"\\n\");\n            return errPrefix + calculatedDescription + errSuffix;\n        }\n    },\n    buildEarlyExitMessage: function (_a) {\n        var expectedIterationPaths = _a.expectedIterationPaths, actual = _a.actual, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n        var errPrefix = \"Expecting: \";\n        // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n        var actualText = utils_1.first(actual).image;\n        var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n        if (customUserDescription) {\n            return errPrefix + customUserDescription + errSuffix;\n        }\n        else {\n            var nextValidTokenSequences = utils_1.map(expectedIterationPaths, function (currPath) {\n                return \"[\" + utils_1.map(currPath, function (currTokenType) {\n                    return tokens_public_1.tokenLabel(currTokenType);\n                }).join(\",\") + \"]\";\n            });\n            var calculatedDescription = \"expecting at least one iteration which starts with one of these possible Token sequences::\\n  \" +\n                (\"<\" + nextValidTokenSequences.join(\" ,\") + \">\");\n            return errPrefix + calculatedDescription + errSuffix;\n        }\n    }\n};\nObject.freeze(exports.defaultParserErrorProvider);\nexports.defaultGrammarResolverErrorProvider = {\n    buildRuleNotFoundError: function (topLevelRule, undefinedRule) {\n        var msg = \"Invalid grammar, reference to a rule which is not defined: ->\" +\n            undefinedRule.nonTerminalName +\n            \"<-\\n\" +\n            \"inside top level rule: ->\" +\n            topLevelRule.name +\n            \"<-\";\n        return msg;\n    }\n};\nexports.defaultGrammarValidatorErrorProvider = {\n    buildDuplicateFoundError: function (topLevelRule, duplicateProds) {\n        function getExtraProductionArgument(prod) {\n            if (prod instanceof gast_public_1.Terminal) {\n                return prod.terminalType.name;\n            }\n            else if (prod instanceof gast_public_1.NonTerminal) {\n                return prod.nonTerminalName;\n            }\n            else {\n                return \"\";\n            }\n        }\n        var topLevelName = topLevelRule.name;\n        var duplicateProd = utils_1.first(duplicateProds);\n        var index = duplicateProd.idx;\n        var dslName = gast_1.getProductionDslName(duplicateProd);\n        var extraArgument = getExtraProductionArgument(duplicateProd);\n        var hasExplicitIndex = index > 0;\n        var msg = \"->\" + dslName + (hasExplicitIndex ? index : \"\") + \"<- \" + (extraArgument ? \"with argument: ->\" + extraArgument + \"<-\" : \"\") + \"\\n                  appears more than once (\" + duplicateProds.length + \" times) in the top level rule: ->\" + topLevelName + \"<-.                  \\n                  For further details see: https://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES \\n                  \";\n        // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n        msg = msg.replace(/[ \\t]+/g, \" \");\n        msg = msg.replace(/\\s\\s+/g, \"\\n\");\n        return msg;\n    },\n    buildInvalidNestedRuleNameError: function (topLevelRule, nestedProd) {\n        var msg = \"Invalid nested rule name: ->\" + nestedProd.name + \"<- inside rule: ->\" + topLevelRule.name + \"<-\\n\" +\n            (\"it must match the pattern: ->\" + checks_1.validNestedRuleName.toString() + \"<-.\\n\") +\n            \"Note that this means a nested rule name must start with the '$'(dollar) sign.\";\n        return msg;\n    },\n    buildDuplicateNestedRuleNameError: function (topLevelRule, nestedProd) {\n        var duplicateName = utils_1.first(nestedProd).name;\n        var errMsg = \"Duplicate nested rule name: ->\" + duplicateName + \"<- inside rule: ->\" + topLevelRule.name + \"<-\\n\" +\n            \"A nested name must be unique in the scope of a top level grammar rule.\";\n        return errMsg;\n    },\n    buildNamespaceConflictError: function (rule) {\n        var errMsg = \"Namespace conflict found in grammar.\\n\" +\n            (\"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\" + rule.name + \">.\\n\") +\n            \"To resolve this make sure each Terminal and Non-Terminal names are unique\\n\" +\n            \"This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n\" +\n            \"and Non-Terminal names start with a lower case letter.\";\n        return errMsg;\n    },\n    buildAlternationPrefixAmbiguityError: function (options) {\n        var pathMsg = utils_1.map(options.prefixPath, function (currTok) {\n            return tokens_public_1.tokenLabel(currTok);\n        }).join(\", \");\n        var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n        var errMsg = \"Ambiguous alternatives: <\" + options.ambiguityIndices.join(\" ,\") + \"> due to common lookahead prefix\\n\" +\n            (\"in <OR\" + occurrence + \"> inside <\" + options.topLevelRule.name + \"> Rule,\\n\") +\n            (\"<\" + pathMsg + \"> may appears as a prefix path in all these alternatives.\\n\") +\n            \"See: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n\" +\n            \"For Further details.\";\n        return errMsg;\n    },\n    buildAlternationAmbiguityError: function (options) {\n        var pathMsg = utils_1.map(options.prefixPath, function (currtok) {\n            return tokens_public_1.tokenLabel(currtok);\n        }).join(\", \");\n        var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n        var currMessage = \"Ambiguous Alternatives Detected: <\" + options.ambiguityIndices.join(\" ,\") + \"> in <OR\" + occurrence + \">\" +\n            (\" inside <\" + options.topLevelRule.name + \"> Rule,\\n\") +\n            (\"<\" + pathMsg + \"> may appears as a prefix path in all these alternatives.\\n\");\n        currMessage =\n            currMessage +\n                \"See: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n\" +\n                \"For Further details.\";\n        return currMessage;\n    },\n    buildEmptyRepetitionError: function (options) {\n        var dslName = gast_1.getProductionDslName(options.repetition);\n        if (options.repetition.idx !== 0) {\n            dslName += options.repetition.idx;\n        }\n        var errMsg = \"The repetition <\" + dslName + \"> within Rule <\" + options.topLevelRule.name + \"> can never consume any tokens.\\n\" +\n            \"This could lead to an infinite loop.\";\n        return errMsg;\n    },\n    buildTokenNameError: function (options) {\n        var tokTypeName = options.tokenType.name;\n        var errMsg = \"Invalid Grammar Token name: ->\" + tokTypeName + \"<- it must match the pattern: ->\" + options.expectedPattern.toString() + \"<-\";\n        return errMsg;\n    },\n    buildEmptyAlternationError: function (options) {\n        var errMsg = \"Ambiguous empty alternative: <\" + (options.emptyChoiceIdx + 1) + \">\" +\n            (\" in <OR\" + options.alternation.idx + \"> inside <\" + options.topLevelRule.name + \"> Rule.\\n\") +\n            \"Only the last alternative may be an empty alternative.\";\n        return errMsg;\n    },\n    buildTooManyAlternativesError: function (options) {\n        var errMsg = \"An Alternation cannot have more than 256 alternatives:\\n\" +\n            (\"<OR\" + options.alternation.idx + \"> inside <\" + options.topLevelRule.name + \"> Rule.\\n has \" + (options.alternation.definition.length +\n                1) + \" alternatives.\");\n        return errMsg;\n    },\n    buildLeftRecursionError: function (options) {\n        var ruleName = options.topLevelRule.name;\n        var pathNames = utils.map(options.leftRecursionPath, function (currRule) { return currRule.name; });\n        var leftRecursivePath = ruleName + \" --> \" + pathNames\n            .concat([ruleName])\n            .join(\" --> \");\n        var errMsg = \"Left Recursion found in grammar.\\n\" +\n            (\"rule: <\" + ruleName + \"> can be invoked from itself (directly or indirectly)\\n\") +\n            (\"without consuming any Tokens. The grammar path that causes this is: \\n \" + leftRecursivePath + \"\\n\") +\n            \" To fix this refactor your grammar to remove the left recursion.\\n\" +\n            \"see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.\";\n        return errMsg;\n    },\n    buildInvalidRuleNameError: function (options) {\n        var ruleName = options.topLevelRule.name;\n        var expectedPatternString = options.expectedPattern.toString();\n        var errMsg = \"Invalid grammar rule name: ->\" + ruleName + \"<- it must match the pattern: ->\" + expectedPatternString + \"<-\";\n        return errMsg;\n    },\n    buildDuplicateRuleNameError: function (options) {\n        var ruleName;\n        if (options.topLevelRule instanceof gast_public_1.Rule) {\n            ruleName = options.topLevelRule.name;\n        }\n        else {\n            ruleName = options.topLevelRule;\n        }\n        var errMsg = \"Duplicate definition, rule: ->\" + ruleName + \"<- is already defined in the grammar: ->\" + options.grammarName + \"<-\";\n        return errMsg;\n    }\n};\n//# sourceMappingURL=errors_public.js.map\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __webpack_require__(0);\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\nvar gast_1 = __webpack_require__(6);\nvar lookahead_1 = __webpack_require__(12);\nvar cst_1 = __webpack_require__(17);\nvar interpreter_1 = __webpack_require__(13);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction validateGrammar(topLevels, globalMaxLookahead, tokenTypes, ignoredIssues, errMsgProvider, grammarName) {\n    var duplicateErrors = utils.map(topLevels, function (currTopLevel) {\n        return validateDuplicateProductions(currTopLevel, errMsgProvider);\n    });\n    var leftRecursionErrors = utils.map(topLevels, function (currTopRule) {\n        return validateNoLeftRecursion(currTopRule, currTopRule, errMsgProvider);\n    });\n    var emptyAltErrors = [];\n    var ambiguousAltsErrors = [];\n    var emptyRepetitionErrors = [];\n    // left recursion could cause infinite loops in the following validations.\n    // It is safest to first have the user fix the left recursion errors first and only then examine Further issues.\n    if (utils_1.every(leftRecursionErrors, utils_1.isEmpty)) {\n        emptyAltErrors = utils_1.map(topLevels, function (currTopRule) {\n            return validateEmptyOrAlternative(currTopRule, errMsgProvider);\n        });\n        ambiguousAltsErrors = utils_1.map(topLevels, function (currTopRule) {\n            return validateAmbiguousAlternationAlternatives(currTopRule, globalMaxLookahead, ignoredIssues, errMsgProvider);\n        });\n        emptyRepetitionErrors = validateSomeNonEmptyLookaheadPath(topLevels, globalMaxLookahead, errMsgProvider);\n    }\n    var termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider);\n    var tokenNameErrors = utils.map(tokenTypes, function (currTokType) {\n        return validateTokenName(currTokType, errMsgProvider);\n    });\n    var nestedRulesNameErrors = validateNestedRulesNames(topLevels, errMsgProvider);\n    var nestedRulesDuplicateErrors = validateDuplicateNestedRules(topLevels, errMsgProvider);\n    var tooManyAltsErrors = utils_1.map(topLevels, function (curRule) {\n        return validateTooManyAlts(curRule, errMsgProvider);\n    });\n    var ruleNameErrors = utils_1.map(topLevels, function (curRule) {\n        return validateRuleName(curRule, errMsgProvider);\n    });\n    var duplicateRulesError = utils_1.map(topLevels, function (curRule) {\n        return validateRuleDoesNotAlreadyExist(curRule, topLevels, grammarName, errMsgProvider);\n    });\n    return (utils.flatten(duplicateErrors.concat(tokenNameErrors, nestedRulesNameErrors, nestedRulesDuplicateErrors, emptyRepetitionErrors, leftRecursionErrors, emptyAltErrors, ambiguousAltsErrors, termsNamespaceConflictErrors, tooManyAltsErrors, ruleNameErrors, duplicateRulesError)));\n}\nexports.validateGrammar = validateGrammar;\nfunction validateNestedRulesNames(topLevels, errMsgProvider) {\n    var result = [];\n    utils_1.forEach(topLevels, function (curTopLevel) {\n        var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(\"\");\n        curTopLevel.accept(namedCollectorVisitor);\n        var nestedProds = utils_1.map(namedCollectorVisitor.result, function (currItem) { return currItem.orgProd; });\n        result.push(utils_1.map(nestedProds, function (currNestedProd) {\n            return validateNestedRuleName(curTopLevel, currNestedProd, errMsgProvider);\n        }));\n    });\n    return utils_1.flatten(result);\n}\nfunction validateDuplicateProductions(topLevelRule, errMsgProvider) {\n    var collectorVisitor = new OccurrenceValidationCollector();\n    topLevelRule.accept(collectorVisitor);\n    var allRuleProductions = collectorVisitor.allProductions;\n    var productionGroups = utils.groupBy(allRuleProductions, identifyProductionForDuplicates);\n    var duplicates = utils.pick(productionGroups, function (currGroup) {\n        return currGroup.length > 1;\n    });\n    var errors = utils.map(utils.values(duplicates), function (currDuplicates) {\n        var firstProd = utils.first(currDuplicates);\n        var msg = errMsgProvider.buildDuplicateFoundError(topLevelRule, currDuplicates);\n        var dslName = gast_1.getProductionDslName(firstProd);\n        var defError = {\n            message: msg,\n            type: parser_1.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n            ruleName: topLevelRule.name,\n            dslName: dslName,\n            occurrence: firstProd.idx\n        };\n        var param = getExtraProductionArgument(firstProd);\n        if (param) {\n            defError.parameter = param;\n        }\n        return defError;\n    });\n    return errors;\n}\nfunction identifyProductionForDuplicates(prod) {\n    return gast_1.getProductionDslName(prod) + \"_#_\" + prod.idx + \"_#_\" + getExtraProductionArgument(prod);\n}\nexports.identifyProductionForDuplicates = identifyProductionForDuplicates;\nfunction getExtraProductionArgument(prod) {\n    if (prod instanceof gast_public_1.Terminal) {\n        return prod.terminalType.name;\n    }\n    else if (prod instanceof gast_public_1.NonTerminal) {\n        return prod.nonTerminalName;\n    }\n    else {\n        return \"\";\n    }\n}\nvar OccurrenceValidationCollector = /** @class */ (function (_super) {\n    __extends(OccurrenceValidationCollector, _super);\n    function OccurrenceValidationCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.allProductions = [];\n        return _this;\n    }\n    OccurrenceValidationCollector.prototype.visitNonTerminal = function (subrule) {\n        this.allProductions.push(subrule);\n    };\n    OccurrenceValidationCollector.prototype.visitOption = function (option) {\n        this.allProductions.push(option);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.allProductions.push(manySep);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.allProductions.push(atLeastOne);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.allProductions.push(atLeastOneSep);\n    };\n    OccurrenceValidationCollector.prototype.visitRepetition = function (many) {\n        this.allProductions.push(many);\n    };\n    OccurrenceValidationCollector.prototype.visitAlternation = function (or) {\n        this.allProductions.push(or);\n    };\n    OccurrenceValidationCollector.prototype.visitTerminal = function (terminal) {\n        this.allProductions.push(terminal);\n    };\n    return OccurrenceValidationCollector;\n}(gast_visitor_public_1.GAstVisitor));\nexports.OccurrenceValidationCollector = OccurrenceValidationCollector;\nexports.validTermsPattern = /^[a-zA-Z_]\\w*$/;\nexports.validNestedRuleName = new RegExp(exports.validTermsPattern.source.replace(\"^\", \"^\\\\$\"));\n// TODO: remove this limitation now that we use recorders\nfunction validateRuleName(rule, errMsgProvider) {\n    var errors = [];\n    var ruleName = rule.name;\n    if (!ruleName.match(exports.validTermsPattern)) {\n        errors.push({\n            message: errMsgProvider.buildInvalidRuleNameError({\n                topLevelRule: rule,\n                expectedPattern: exports.validTermsPattern\n            }),\n            type: parser_1.ParserDefinitionErrorType.INVALID_RULE_NAME,\n            ruleName: ruleName\n        });\n    }\n    return errors;\n}\nexports.validateRuleName = validateRuleName;\n// TODO: did the nested rule name regExp now change?\nfunction validateNestedRuleName(topLevel, nestedProd, errMsgProvider) {\n    var errors = [];\n    var errMsg;\n    if (!nestedProd.name.match(exports.validNestedRuleName)) {\n        errMsg = errMsgProvider.buildInvalidNestedRuleNameError(topLevel, nestedProd);\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.INVALID_NESTED_RULE_NAME,\n            ruleName: topLevel.name\n        });\n    }\n    return errors;\n}\nexports.validateNestedRuleName = validateNestedRuleName;\n// TODO: remove this limitation now that we use recorders\nfunction validateTokenName(tokenType, errMsgProvider) {\n    var errors = [];\n    var tokTypeName = tokenType.name;\n    if (!tokTypeName.match(exports.validTermsPattern)) {\n        errors.push({\n            message: errMsgProvider.buildTokenNameError({\n                tokenType: tokenType,\n                expectedPattern: exports.validTermsPattern\n            }),\n            type: parser_1.ParserDefinitionErrorType.INVALID_TOKEN_NAME\n        });\n    }\n    return errors;\n}\nexports.validateTokenName = validateTokenName;\nfunction validateRuleDoesNotAlreadyExist(rule, allRules, className, errMsgProvider) {\n    var errors = [];\n    var occurrences = utils_1.reduce(allRules, function (result, curRule) {\n        if (curRule.name === rule.name) {\n            return result + 1;\n        }\n        return result;\n    }, 0);\n    if (occurrences > 1) {\n        var errMsg = errMsgProvider.buildDuplicateRuleNameError({\n            topLevelRule: rule,\n            grammarName: className\n        });\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n            ruleName: rule.name\n        });\n    }\n    return errors;\n}\nexports.validateRuleDoesNotAlreadyExist = validateRuleDoesNotAlreadyExist;\n// TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n// This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n// The grammar structure, only at runtime.\nfunction validateRuleIsOverridden(ruleName, definedRulesNames, className) {\n    var errors = [];\n    var errMsg;\n    if (!utils.contains(definedRulesNames, ruleName)) {\n        errMsg =\n            \"Invalid rule override, rule: ->\" + ruleName + \"<- cannot be overridden in the grammar: ->\" + className + \"<-\" +\n                \"as it is not defined in any of the super grammars \";\n        errors.push({\n            message: errMsg,\n            type: parser_1.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n            ruleName: ruleName\n        });\n    }\n    return errors;\n}\nexports.validateRuleIsOverridden = validateRuleIsOverridden;\nfunction validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) {\n    if (path === void 0) { path = []; }\n    var errors = [];\n    var nextNonTerminals = getFirstNoneTerminal(currRule.definition);\n    if (utils.isEmpty(nextNonTerminals)) {\n        return [];\n    }\n    else {\n        var ruleName = topRule.name;\n        var foundLeftRecursion = utils.contains(nextNonTerminals, topRule);\n        if (foundLeftRecursion) {\n            errors.push({\n                message: errMsgProvider.buildLeftRecursionError({\n                    topLevelRule: topRule,\n                    leftRecursionPath: path\n                }),\n                type: parser_1.ParserDefinitionErrorType.LEFT_RECURSION,\n                ruleName: ruleName\n            });\n        }\n        // we are only looking for cyclic paths leading back to the specific topRule\n        // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n        var validNextSteps = utils.difference(nextNonTerminals, path.concat([topRule]));\n        var errorsFromNextSteps = utils.map(validNextSteps, function (currRefRule) {\n            var newPath = utils.cloneArr(path);\n            newPath.push(currRefRule);\n            return validateNoLeftRecursion(topRule, currRefRule, errMsgProvider, newPath);\n        });\n        return errors.concat(utils.flatten(errorsFromNextSteps));\n    }\n}\nexports.validateNoLeftRecursion = validateNoLeftRecursion;\nfunction getFirstNoneTerminal(definition) {\n    var result = [];\n    if (utils.isEmpty(definition)) {\n        return result;\n    }\n    var firstProd = utils.first(definition);\n    /* istanbul ignore else */\n    if (firstProd instanceof gast_public_1.NonTerminal) {\n        result.push(firstProd.referencedRule);\n    }\n    else if (firstProd instanceof gast_public_1.Flat ||\n        firstProd instanceof gast_public_1.Option ||\n        firstProd instanceof gast_public_1.RepetitionMandatory ||\n        firstProd instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n        firstProd instanceof gast_public_1.RepetitionWithSeparator ||\n        firstProd instanceof gast_public_1.Repetition) {\n        result = result.concat(getFirstNoneTerminal(firstProd.definition));\n    }\n    else if (firstProd instanceof gast_public_1.Alternation) {\n        // each sub definition in alternation is a FLAT\n        result = utils.flatten(utils.map(firstProd.definition, function (currSubDef) {\n            return getFirstNoneTerminal(currSubDef.definition);\n        }));\n    }\n    else if (firstProd instanceof gast_public_1.Terminal) {\n        // nothing to see, move along\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n    var isFirstOptional = gast_1.isOptionalProd(firstProd);\n    var hasMore = definition.length > 1;\n    if (isFirstOptional && hasMore) {\n        var rest = utils.drop(definition);\n        return result.concat(getFirstNoneTerminal(rest));\n    }\n    else {\n        return result;\n    }\n}\nexports.getFirstNoneTerminal = getFirstNoneTerminal;\nvar OrCollector = /** @class */ (function (_super) {\n    __extends(OrCollector, _super);\n    function OrCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.alternations = [];\n        return _this;\n    }\n    OrCollector.prototype.visitAlternation = function (node) {\n        this.alternations.push(node);\n    };\n    return OrCollector;\n}(gast_visitor_public_1.GAstVisitor));\nfunction validateEmptyOrAlternative(topLevelRule, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    var errors = utils.reduce(ors, function (errors, currOr) {\n        var exceptLast = utils.dropRight(currOr.definition);\n        var currErrors = utils.map(exceptLast, function (currAlternative, currAltIdx) {\n            var possibleFirstInAlt = interpreter_1.nextPossibleTokensAfter([currAlternative], [], null, 1);\n            if (utils.isEmpty(possibleFirstInAlt)) {\n                return {\n                    message: errMsgProvider.buildEmptyAlternationError({\n                        topLevelRule: topLevelRule,\n                        alternation: currOr,\n                        emptyChoiceIdx: currAltIdx\n                    }),\n                    type: parser_1.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n                    ruleName: topLevelRule.name,\n                    occurrence: currOr.idx,\n                    alternative: currAltIdx + 1\n                };\n            }\n            else {\n                return null;\n            }\n        });\n        return errors.concat(utils.compact(currErrors));\n    }, []);\n    return errors;\n}\nexports.validateEmptyOrAlternative = validateEmptyOrAlternative;\nfunction validateAmbiguousAlternationAlternatives(topLevelRule, globalMaxLookahead, ignoredIssues, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    // TODO: this filtering should be deprecated once we remove the ignoredIssues\n    //  IParserConfig property\n    var ignoredIssuesForCurrentRule = ignoredIssues[topLevelRule.name];\n    if (ignoredIssuesForCurrentRule) {\n        ors = utils_1.reject(ors, function (currOr) {\n            return ignoredIssuesForCurrentRule[gast_1.getProductionDslName(currOr) +\n                (currOr.idx === 0 ? \"\" : currOr.idx)];\n        });\n    }\n    // New Handling of ignoring ambiguities\n    // - https://github.com/SAP/chevrotain/issues/869\n    ors = utils_1.reject(ors, function (currOr) { return currOr.ignoreAmbiguities === true; });\n    var errors = utils.reduce(ors, function (result, currOr) {\n        var currOccurrence = currOr.idx;\n        var actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead;\n        var alternatives = lookahead_1.getLookaheadPathsForOr(currOccurrence, topLevelRule, actualMaxLookahead, currOr);\n        var altsAmbiguityErrors = checkAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n        var altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n        return result.concat(altsAmbiguityErrors, altsPrefixAmbiguityErrors);\n    }, []);\n    return errors;\n}\nexports.validateAmbiguousAlternationAlternatives = validateAmbiguousAlternationAlternatives;\nvar RepetionCollector = /** @class */ (function (_super) {\n    __extends(RepetionCollector, _super);\n    function RepetionCollector() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.allProductions = [];\n        return _this;\n    }\n    RepetionCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n        this.allProductions.push(manySep);\n    };\n    RepetionCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n        this.allProductions.push(atLeastOne);\n    };\n    RepetionCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n        this.allProductions.push(atLeastOneSep);\n    };\n    RepetionCollector.prototype.visitRepetition = function (many) {\n        this.allProductions.push(many);\n    };\n    return RepetionCollector;\n}(gast_visitor_public_1.GAstVisitor));\nexports.RepetionCollector = RepetionCollector;\nfunction validateTooManyAlts(topLevelRule, errMsgProvider) {\n    var orCollector = new OrCollector();\n    topLevelRule.accept(orCollector);\n    var ors = orCollector.alternations;\n    var errors = utils.reduce(ors, function (errors, currOr) {\n        if (currOr.definition.length > 255) {\n            errors.push({\n                message: errMsgProvider.buildTooManyAlternativesError({\n                    topLevelRule: topLevelRule,\n                    alternation: currOr\n                }),\n                type: parser_1.ParserDefinitionErrorType.TOO_MANY_ALTS,\n                ruleName: topLevelRule.name,\n                occurrence: currOr.idx\n            });\n        }\n        return errors;\n    }, []);\n    return errors;\n}\nexports.validateTooManyAlts = validateTooManyAlts;\nfunction validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, errMsgProvider) {\n    var errors = [];\n    utils_1.forEach(topLevelRules, function (currTopRule) {\n        var collectorVisitor = new RepetionCollector();\n        currTopRule.accept(collectorVisitor);\n        var allRuleProductions = collectorVisitor.allProductions;\n        utils_1.forEach(allRuleProductions, function (currProd) {\n            var prodType = lookahead_1.getProdType(currProd);\n            var actualMaxLookahead = currProd.maxLookahead || maxLookahead;\n            var currOccurrence = currProd.idx;\n            var paths = lookahead_1.getLookaheadPathsForOptionalProd(currOccurrence, currTopRule, prodType, actualMaxLookahead);\n            var pathsInsideProduction = paths[0];\n            if (utils_1.isEmpty(utils_1.flatten(pathsInsideProduction))) {\n                var errMsg = errMsgProvider.buildEmptyRepetitionError({\n                    topLevelRule: currTopRule,\n                    repetition: currProd\n                });\n                errors.push({\n                    message: errMsg,\n                    type: parser_1.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n                    ruleName: currTopRule.name\n                });\n            }\n        });\n    });\n    return errors;\n}\nexports.validateSomeNonEmptyLookaheadPath = validateSomeNonEmptyLookaheadPath;\nfunction checkAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    var foundAmbiguousPaths = [];\n    var identicalAmbiguities = utils_1.reduce(alternatives, function (result, currAlt, currAltIdx) {\n        // ignore (skip) ambiguities with this alternative\n        if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n            return result;\n        }\n        utils_1.forEach(currAlt, function (currPath) {\n            var altsCurrPathAppearsIn = [currAltIdx];\n            utils_1.forEach(alternatives, function (currOtherAlt, currOtherAltIdx) {\n                if (currAltIdx !== currOtherAltIdx &&\n                    lookahead_1.containsPath(currOtherAlt, currPath) &&\n                    // ignore (skip) ambiguities with this \"other\" alternative\n                    alternation.definition[currOtherAltIdx]\n                        .ignoreAmbiguities !== true) {\n                    altsCurrPathAppearsIn.push(currOtherAltIdx);\n                }\n            });\n            if (altsCurrPathAppearsIn.length > 1 &&\n                !lookahead_1.containsPath(foundAmbiguousPaths, currPath)) {\n                foundAmbiguousPaths.push(currPath);\n                result.push({\n                    alts: altsCurrPathAppearsIn,\n                    path: currPath\n                });\n            }\n        });\n        return result;\n    }, []);\n    var currErrors = utils.map(identicalAmbiguities, function (currAmbDescriptor) {\n        var ambgIndices = utils_1.map(currAmbDescriptor.alts, function (currAltIdx) { return currAltIdx + 1; });\n        var currMessage = errMsgProvider.buildAlternationAmbiguityError({\n            topLevelRule: rule,\n            alternation: alternation,\n            ambiguityIndices: ambgIndices,\n            prefixPath: currAmbDescriptor.path\n        });\n        return {\n            message: currMessage,\n            type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n            ruleName: rule.name,\n            occurrence: alternation.idx,\n            alternatives: [currAmbDescriptor.alts]\n        };\n    });\n    return currErrors;\n}\nfunction checkPrefixAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    var errors = [];\n    // flatten\n    var pathsAndIndices = utils_1.reduce(alternatives, function (result, currAlt, idx) {\n        var currPathsAndIdx = utils_1.map(currAlt, function (currPath) {\n            return { idx: idx, path: currPath };\n        });\n        return result.concat(currPathsAndIdx);\n    }, []);\n    utils_1.forEach(pathsAndIndices, function (currPathAndIdx) {\n        var alternativeGast = alternation.definition[currPathAndIdx.idx];\n        // ignore (skip) ambiguities with this alternative\n        if (alternativeGast.ignoreAmbiguities === true) {\n            return;\n        }\n        var targetIdx = currPathAndIdx.idx;\n        var targetPath = currPathAndIdx.path;\n        var prefixAmbiguitiesPathsAndIndices = utils_1.findAll(pathsAndIndices, function (searchPathAndIdx) {\n            // prefix ambiguity can only be created from lower idx (higher priority) path\n            return (\n            // ignore (skip) ambiguities with this \"other\" alternative\n            alternation.definition[searchPathAndIdx.idx]\n                .ignoreAmbiguities !== true &&\n                searchPathAndIdx.idx < targetIdx &&\n                // checking for strict prefix because identical lookaheads\n                // will be be detected using a different validation.\n                lookahead_1.isStrictPrefixOfPath(searchPathAndIdx.path, targetPath));\n        });\n        var currPathPrefixErrors = utils_1.map(prefixAmbiguitiesPathsAndIndices, function (currAmbPathAndIdx) {\n            var ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1];\n            var occurrence = alternation.idx === 0 ? \"\" : alternation.idx;\n            var message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n                topLevelRule: rule,\n                alternation: alternation,\n                ambiguityIndices: ambgIndices,\n                prefixPath: currAmbPathAndIdx.path\n            });\n            return {\n                message: message,\n                type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n                ruleName: rule.name,\n                occurrence: occurrence,\n                alternatives: ambgIndices\n            };\n        });\n        errors = errors.concat(currPathPrefixErrors);\n    });\n    return errors;\n}\nexports.checkPrefixAlternativesAmbiguities = checkPrefixAlternativesAmbiguities;\nfunction checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider) {\n    var errors = [];\n    var tokenNames = utils_1.map(tokenTypes, function (currToken) { return currToken.name; });\n    utils_1.forEach(topLevels, function (currRule) {\n        var currRuleName = currRule.name;\n        if (utils_1.contains(tokenNames, currRuleName)) {\n            var errMsg = errMsgProvider.buildNamespaceConflictError(currRule);\n            errors.push({\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n                ruleName: currRuleName\n            });\n        }\n    });\n    return errors;\n}\nfunction validateDuplicateNestedRules(topLevelRules, errMsgProvider) {\n    var errors = [];\n    utils_1.forEach(topLevelRules, function (currTopRule) {\n        var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(\"\");\n        currTopRule.accept(namedCollectorVisitor);\n        var prodsByGroup = utils_1.groupBy(namedCollectorVisitor.result, function (item) { return item.name; });\n        var duplicates = utils_1.pick(prodsByGroup, function (currGroup) {\n            return currGroup.length > 1;\n        });\n        utils_1.forEach(utils_1.values(duplicates), function (currDupGroup) {\n            var currDupProds = utils_1.map(currDupGroup, function (dupGroup) { return dupGroup.orgProd; });\n            var errMsg = errMsgProvider.buildDuplicateNestedRuleNameError(currTopRule, currDupProds);\n            errors.push({\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.DUPLICATE_NESTED_NAME,\n                ruleName: currTopRule.name\n            });\n        });\n    });\n    return errors;\n}\n//# sourceMappingURL=checks.js.map\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar interpreter_1 = __webpack_require__(13);\nvar rest_1 = __webpack_require__(14);\nvar tokens_1 = __webpack_require__(5);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n    PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n    PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n    PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.Option) {\n        return PROD_TYPE.OPTION;\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return PROD_TYPE.REPETITION;\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return PROD_TYPE.REPETITION_MANDATORY;\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return PROD_TYPE.ALTERNATION;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.getProdType = getProdType;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n    var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n    var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n        ? tokens_1.tokenStructuredMatcherNoCategories\n        : tokens_1.tokenStructuredMatcher;\n    return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n *  When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n *  the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n *  Example: given a production:\n *  ABC(DE)?DF\n *\n *  The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n *  alternatives.\n *\n *  @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n    var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n    var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n        ? tokens_1.tokenStructuredMatcherNoCategories\n        : tokens_1.tokenStructuredMatcher;\n    return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n    var numOfAlts = alts.length;\n    var areAllOneTokenLookahead = utils_1.every(alts, function (currAlt) {\n        return utils_1.every(currAlt, function (currPath) {\n            return currPath.length === 1;\n        });\n    });\n    // This version takes into account the predicates as well.\n    if (hasPredicates) {\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function (orAlts) {\n            // unfortunately the predicates must be extracted every single time\n            // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n            // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n            var predicates = utils_1.map(orAlts, function (currAlt) { return currAlt.GATE; });\n            for (var t = 0; t < numOfAlts; t++) {\n                var currAlt = alts[t];\n                var currNumOfPaths = currAlt.length;\n                var currPredicate = predicates[t];\n                if (currPredicate !== undefined &&\n                    currPredicate.call(this) === false) {\n                    // if the predicate does not match there is no point in checking the paths\n                    continue;\n                }\n                nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n                    var currPath = currAlt[j];\n                    var currPathLength = currPath.length;\n                    for (var i = 0; i < currPathLength; i++) {\n                        var nextToken = this.LA(i + 1);\n                        if (tokenMatcher(nextToken, currPath[i]) === false) {\n                            // mismatch in current path\n                            // try the next pth\n                            continue nextPath;\n                        }\n                    }\n                    // found a full path that matches.\n                    // this will also work for an empty ALT as the loop will be skipped\n                    return t;\n                }\n                // none of the paths for the current alternative matched\n                // try the next alternative\n            }\n            // none of the alternatives could be matched\n            return undefined;\n        };\n    }\n    else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n        // optimized (common) case of all the lookaheads paths requiring only\n        // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n        var singleTokenAlts = utils_1.map(alts, function (currAlt) {\n            return utils_1.flatten(currAlt);\n        });\n        var choiceToAlt_1 = utils_1.reduce(singleTokenAlts, function (result, currAlt, idx) {\n            utils_1.forEach(currAlt, function (currTokType) {\n                if (!utils_1.has(result, currTokType.tokenTypeIdx)) {\n                    result[currTokType.tokenTypeIdx] = idx;\n                }\n                utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) {\n                    if (!utils_1.has(result, currExtendingType)) {\n                        result[currExtendingType] = idx;\n                    }\n                });\n            });\n            return result;\n        }, []);\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function () {\n            var nextToken = this.LA(1);\n            return choiceToAlt_1[nextToken.tokenTypeIdx];\n        };\n    }\n    else {\n        // optimized lookahead without needing to check the predicates at all.\n        // this causes code duplication which is intentional to improve performance.\n        /**\n         * @returns {number} - The chosen alternative index\n         */\n        return function () {\n            for (var t = 0; t < numOfAlts; t++) {\n                var currAlt = alts[t];\n                var currNumOfPaths = currAlt.length;\n                nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n                    var currPath = currAlt[j];\n                    var currPathLength = currPath.length;\n                    for (var i = 0; i < currPathLength; i++) {\n                        var nextToken = this.LA(i + 1);\n                        if (tokenMatcher(nextToken, currPath[i]) === false) {\n                            // mismatch in current path\n                            // try the next pth\n                            continue nextPath;\n                        }\n                    }\n                    // found a full path that matches.\n                    // this will also work for an empty ALT as the loop will be skipped\n                    return t;\n                }\n                // none of the paths for the current alternative matched\n                // try the next alternative\n            }\n            // none of the alternatives could be matched\n            return undefined;\n        };\n    }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n    var areAllOneTokenLookahead = utils_1.every(alt, function (currPath) {\n        return currPath.length === 1;\n    });\n    var numOfPaths = alt.length;\n    // optimized (common) case of all the lookaheads paths requiring only\n    // a single token lookahead.\n    if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n        var singleTokensTypes = utils_1.flatten(alt);\n        if (singleTokensTypes.length === 1 &&\n            utils_1.isEmpty(singleTokensTypes[0].categoryMatches)) {\n            var expectedTokenType = singleTokensTypes[0];\n            var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n            return function () {\n                return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n            };\n        }\n        else {\n            var choiceToAlt_2 = utils_1.reduce(singleTokensTypes, function (result, currTokType, idx) {\n                result[currTokType.tokenTypeIdx] = true;\n                utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) {\n                    result[currExtendingType] = true;\n                });\n                return result;\n            }, []);\n            return function () {\n                var nextToken = this.LA(1);\n                return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n            };\n        }\n    }\n    else {\n        return function () {\n            nextPath: for (var j = 0; j < numOfPaths; j++) {\n                var currPath = alt[j];\n                var currPathLength = currPath.length;\n                for (var i = 0; i < currPathLength; i++) {\n                    var nextToken = this.LA(i + 1);\n                    if (tokenMatcher(nextToken, currPath[i]) === false) {\n                        // mismatch in current path\n                        // try the next pth\n                        continue nextPath;\n                    }\n                }\n                // found a full path that matches.\n                return true;\n            }\n            // none of the paths matched\n            return false;\n        };\n    }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n    __extends(RestDefinitionFinderWalker, _super);\n    function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n        var _this = _super.call(this) || this;\n        _this.topProd = topProd;\n        _this.targetOccurrence = targetOccurrence;\n        _this.targetProdType = targetProdType;\n        return _this;\n    }\n    RestDefinitionFinderWalker.prototype.startWalking = function () {\n        this.walk(this.topProd);\n        return this.restDef;\n    };\n    RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n        if (node.idx === this.targetOccurrence &&\n            this.targetProdType === expectedProdType) {\n            this.restDef = currRest.concat(prevRest);\n            return true;\n        }\n        // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n        return false;\n    };\n    RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n        if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n        if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n        }\n    };\n    RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n            _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n        }\n    };\n    return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n    __extends(InsideDefinitionFinderVisitor, _super);\n    function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n        var _this = _super.call(this) || this;\n        _this.targetOccurrence = targetOccurrence;\n        _this.targetProdType = targetProdType;\n        _this.targetRef = targetRef;\n        _this.result = [];\n        return _this;\n    }\n    InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n        if (node.idx === this.targetOccurrence &&\n            this.targetProdType === expectedProdName &&\n            (this.targetRef === undefined || node === this.targetRef)) {\n            this.result = node.definition;\n        }\n    };\n    InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.OPTION);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n    };\n    InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n        this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n    };\n    return InsideDefinitionFinderVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n    var result = new Array(size);\n    for (var i = 0; i < size; i++) {\n        result[i] = [];\n    }\n    return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * -  A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n    var keys = [\"\"];\n    for (var i = 0; i < path.length; i++) {\n        var tokType = path[i];\n        var longerKeys = [];\n        for (var j = 0; j < keys.length; j++) {\n            var currShorterKey = keys[j];\n            longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n            for (var t = 0; t < tokType.categoryMatches.length; t++) {\n                var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n                longerKeys.push(currShorterKey + categoriesKeySuffix);\n            }\n        }\n        keys = longerKeys;\n    }\n    return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n    for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n        // We only want to test vs the other alternatives\n        if (currAltIdx === idx) {\n            continue;\n        }\n        var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n        for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n            var searchKey = searchPathKeys[searchIdx];\n            if (otherAltKnownPathsKeys[searchKey] === true) {\n                return false;\n            }\n        }\n    }\n    // None of the SearchPathKeys were found in any of the other alternatives\n    return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n    var partialAlts = utils_1.map(altsDefs, function (currAlt) { return interpreter_1.possiblePathsFrom([currAlt], 1); });\n    var finalResult = initializeArrayOfArrays(partialAlts.length);\n    var altsHashes = utils_1.map(partialAlts, function (currAltPaths) {\n        var dict = {};\n        utils_1.forEach(currAltPaths, function (item) {\n            var keys = pathToHashKeys(item.partialPath);\n            utils_1.forEach(keys, function (currKey) {\n                dict[currKey] = true;\n            });\n        });\n        return dict;\n    });\n    var newData = partialAlts;\n    // maxLookahead loop\n    for (var pathLength = 1; pathLength <= k; pathLength++) {\n        var currDataset = newData;\n        newData = initializeArrayOfArrays(currDataset.length);\n        var _loop_1 = function (altIdx) {\n            var currAltPathsAndSuffixes = currDataset[altIdx];\n            // paths in current alternative loop\n            for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n                var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n                var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n                var prefixKeys = pathToHashKeys(currPathPrefix);\n                var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n                // End of the line for this path.\n                if (isUnique ||\n                    utils_1.isEmpty(suffixDef) ||\n                    currPathPrefix.length === k) {\n                    var currAltResult = finalResult[altIdx];\n                    // TODO: Can we implement a containsPath using Maps/Dictionaries?\n                    if (containsPath(currAltResult, currPathPrefix) === false) {\n                        currAltResult.push(currPathPrefix);\n                        // Update all new  keys for the current path.\n                        for (var j = 0; j < prefixKeys.length; j++) {\n                            var currKey = prefixKeys[j];\n                            altsHashes[altIdx][currKey] = true;\n                        }\n                    }\n                }\n                // Expand longer paths\n                else {\n                    var newPartialPathsAndSuffixes = interpreter_1.possiblePathsFrom(suffixDef, pathLength + 1, currPathPrefix);\n                    newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n                    // Update keys for new known paths\n                    utils_1.forEach(newPartialPathsAndSuffixes, function (item) {\n                        var prefixKeys = pathToHashKeys(item.partialPath);\n                        utils_1.forEach(prefixKeys, function (key) {\n                            altsHashes[altIdx][key] = true;\n                        });\n                    });\n                }\n            }\n        };\n        // alternatives loop\n        for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n            _loop_1(altIdx);\n        }\n    }\n    return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n    var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n    ruleGrammar.accept(visitor);\n    return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n    var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n    ruleGrammar.accept(insideDefVisitor);\n    var insideDef = insideDefVisitor.result;\n    var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n    var afterDef = afterDefWalker.startWalking();\n    var insideFlat = new gast_public_1.Flat({ definition: insideDef });\n    var afterFlat = new gast_public_1.Flat({ definition: afterDef });\n    return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n    compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n        var otherPath = alternative[i];\n        if (otherPath.length !== searchPath.length) {\n            continue;\n        }\n        for (var j = 0; j < otherPath.length; j++) {\n            var searchTok = searchPath[j];\n            var otherTok = otherPath[j];\n            var matchingTokens = searchTok === otherTok ||\n                otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !==\n                    undefined;\n            if (matchingTokens === false) {\n                continue compareOtherPath;\n            }\n        }\n        return true;\n    }\n    return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n    return (prefix.length < other.length &&\n        utils_1.every(prefix, function (tokType, idx) {\n            var otherTokType = other[idx];\n            return (tokType === otherTokType ||\n                otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n        }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n    return utils_1.every(lookAheadPaths, function (singleAltPaths) {\n        return utils_1.every(singleAltPaths, function (singlePath) {\n            return utils_1.every(singlePath, function (token) { return utils_1.isEmpty(token.categoryMatches); });\n        });\n    });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* istanbul ignore next */ var __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar rest_1 = __webpack_require__(14);\nvar utils_1 = __webpack_require__(0);\nvar first_1 = __webpack_require__(22);\nvar gast_public_1 = __webpack_require__(1);\nvar AbstractNextPossibleTokensWalker = /** @class */ (function (_super) {\n    __extends(AbstractNextPossibleTokensWalker, _super);\n    function AbstractNextPossibleTokensWalker(topProd, path) {\n        var _this = _super.call(this) /* istanbul ignore next */ || this;\n        _this.topProd = topProd;\n        _this.path = path;\n        _this.possibleTokTypes = [];\n        _this.nextProductionName = \"\";\n        _this.nextProductionOccurrence = 0;\n        _this.found = false;\n        _this.isAtEndOfPath = false;\n        return _this;\n    }\n    AbstractNextPossibleTokensWalker.prototype.startWalking = function () {\n        this.found = false;\n        if (this.path.ruleStack[0] !== this.topProd.name) {\n            throw Error(\"The path does not start with the walker's top Rule!\");\n        }\n        // immutable for the win\n        this.ruleStack = utils_1.cloneArr(this.path.ruleStack).reverse(); // intelij bug requires assertion\n        this.occurrenceStack = utils_1.cloneArr(this.path.occurrenceStack).reverse(); // intelij bug requires assertion\n        // already verified that the first production is valid, we now seek the 2nd production\n        this.ruleStack.pop();\n        this.occurrenceStack.pop();\n        this.updateExpectedNext();\n        this.walk(this.topProd);\n        return this.possibleTokTypes;\n    };\n    AbstractNextPossibleTokensWalker.prototype.walk = function (prod, prevRest) {\n        if (prevRest === void 0) { prevRest = []; }\n        // stop scanning once we found the path\n        if (!this.found) {\n            _super.prototype.walk.call(this, prod, prevRest);\n        }\n    };\n    AbstractNextPossibleTokensWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n        // found the next production, need to keep walking in it\n        if (refProd.referencedRule.name === this.nextProductionName &&\n            refProd.idx === this.nextProductionOccurrence) {\n            var fullRest = currRest.concat(prevRest);\n            this.updateExpectedNext();\n            this.walk(refProd.referencedRule, fullRest);\n        }\n    };\n    AbstractNextPossibleTokensWalker.prototype.updateExpectedNext = function () {\n        // need to consume the Terminal\n        if (utils_1.isEmpty(this.ruleStack)) {\n            // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n            // really seeking is the last Terminal...\n            this.nextProductionName = \"\";\n            this.nextProductionOccurrence = 0;\n            this.isAtEndOfPath = true;\n        }\n        else {\n            this.nextProductionName = this.ruleStack.pop();\n            this.nextProductionOccurrence = this.occurrenceStack.pop();\n        }\n    };\n    return AbstractNextPossibleTokensWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextPossibleTokensWalker = AbstractNextPossibleTokensWalker;\nvar NextAfterTokenWalker = /** @class */ (function (_super) {\n    __extends(NextAfterTokenWalker, _super);\n    function NextAfterTokenWalker(topProd, path) {\n        var _this = _super.call(this, topProd, path) /* istanbul ignore next */ || this;\n        _this.path = path;\n        _this.nextTerminalName = \"\";\n        _this.nextTerminalOccurrence = 0;\n        _this.nextTerminalName = _this.path.lastTok.name;\n        _this.nextTerminalOccurrence = _this.path.lastTokOccurrence;\n        return _this;\n    }\n    NextAfterTokenWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n        if (this.isAtEndOfPath &&\n            terminal.terminalType.name === this.nextTerminalName &&\n            terminal.idx === this.nextTerminalOccurrence &&\n            !this.found) {\n            var fullRest = currRest.concat(prevRest);\n            var restProd = new gast_public_1.Flat({ definition: fullRest });\n            this.possibleTokTypes = first_1.first(restProd);\n            this.found = true;\n        }\n    };\n    return NextAfterTokenWalker;\n}(AbstractNextPossibleTokensWalker));\nexports.NextAfterTokenWalker = NextAfterTokenWalker;\n/**\n * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n * it never \"follows\" production refs\n */\nvar AbstractNextTerminalAfterProductionWalker = /** @class */ (function (_super) {\n    __extends(AbstractNextTerminalAfterProductionWalker, _super);\n    function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) {\n        var _this = _super.call(this) /* istanbul ignore next */ || this;\n        _this.topRule = topRule;\n        _this.occurrence = occurrence;\n        _this.result = {\n            token: undefined,\n            occurrence: undefined,\n            isEndOfRule: undefined\n        };\n        return _this;\n    }\n    AbstractNextTerminalAfterProductionWalker.prototype.startWalking = function () {\n        this.walk(this.topRule);\n        return this.result;\n    };\n    return AbstractNextTerminalAfterProductionWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextTerminalAfterProductionWalker = AbstractNextTerminalAfterProductionWalker;\nvar NextTerminalAfterManyWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterManyWalker, _super);\n    function NextTerminalAfterManyWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterManyWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        if (manyProd.idx === this.occurrence) {\n            var firstAfterMany = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterMany === undefined;\n            if (firstAfterMany instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterMany.terminalType;\n                this.result.occurrence = firstAfterMany.idx;\n            }\n        }\n        else {\n            _super.prototype.walkMany.call(this, manyProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterManyWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManyWalker = NextTerminalAfterManyWalker;\nvar NextTerminalAfterManySepWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterManySepWalker, _super);\n    function NextTerminalAfterManySepWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterManySepWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        if (manySepProd.idx === this.occurrence) {\n            var firstAfterManySep = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterManySep === undefined;\n            if (firstAfterManySep instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterManySep.terminalType;\n                this.result.occurrence = firstAfterManySep.idx;\n            }\n        }\n        else {\n            _super.prototype.walkManySep.call(this, manySepProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterManySepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManySepWalker = NextTerminalAfterManySepWalker;\nvar NextTerminalAfterAtLeastOneWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterAtLeastOneWalker, _super);\n    function NextTerminalAfterAtLeastOneWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterAtLeastOneWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        if (atLeastOneProd.idx === this.occurrence) {\n            var firstAfterAtLeastOne = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule = firstAfterAtLeastOne === undefined;\n            if (firstAfterAtLeastOne instanceof gast_public_1.Terminal) {\n                this.result.token = firstAfterAtLeastOne.terminalType;\n                this.result.occurrence = firstAfterAtLeastOne.idx;\n            }\n        }\n        else {\n            _super.prototype.walkAtLeastOne.call(this, atLeastOneProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterAtLeastOneWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneWalker = NextTerminalAfterAtLeastOneWalker;\n// TODO: reduce code duplication in the AfterWalkers\nvar NextTerminalAfterAtLeastOneSepWalker = /** @class */ (function (_super) {\n    __extends(NextTerminalAfterAtLeastOneSepWalker, _super);\n    function NextTerminalAfterAtLeastOneSepWalker() {\n        return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this;\n    }\n    NextTerminalAfterAtLeastOneSepWalker.prototype.walkAtLeastOneSep = function (atleastOneSepProd, currRest, prevRest) {\n        if (atleastOneSepProd.idx === this.occurrence) {\n            var firstAfterfirstAfterAtLeastOneSep = utils_1.first(currRest.concat(prevRest));\n            this.result.isEndOfRule =\n                firstAfterfirstAfterAtLeastOneSep === undefined;\n            if (firstAfterfirstAfterAtLeastOneSep instanceof gast_public_1.Terminal) {\n                this.result.token =\n                    firstAfterfirstAfterAtLeastOneSep.terminalType;\n                this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx;\n            }\n        }\n        else {\n            _super.prototype.walkAtLeastOneSep.call(this, atleastOneSepProd, currRest, prevRest);\n        }\n    };\n    return NextTerminalAfterAtLeastOneSepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneSepWalker = NextTerminalAfterAtLeastOneSepWalker;\nfunction possiblePathsFrom(targetDef, maxLength, currPath) {\n    if (currPath === void 0) { currPath = []; }\n    // avoid side effects\n    currPath = utils_1.cloneArr(currPath);\n    var result = [];\n    var i = 0;\n    // TODO: avoid inner funcs\n    function remainingPathWith(nextDef) {\n        return nextDef.concat(utils_1.drop(targetDef, i + 1));\n    }\n    // TODO: avoid inner funcs\n    function getAlternativesForProd(definition) {\n        var alternatives = possiblePathsFrom(remainingPathWith(definition), maxLength, currPath);\n        return result.concat(alternatives);\n    }\n    /**\n     * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n     * following (rest) of the targetDef.\n     *\n     * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n     * the optional production.\n     */\n    while (currPath.length < maxLength && i < targetDef.length) {\n        var prod = targetDef[i];\n        /* istanbul ignore else */\n        if (prod instanceof gast_public_1.Flat) {\n            return getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.NonTerminal) {\n            return getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.Option) {\n            result = getAlternativesForProd(prod.definition);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatory) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: prod.definition\n                })\n            ]);\n            return getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n            var newDef = [\n                new gast_public_1.Flat({ definition: prod.definition }),\n                new gast_public_1.Repetition({\n                    definition: [\n                        new gast_public_1.Terminal({ terminalType: prod.separator })\n                    ].concat(prod.definition)\n                })\n            ];\n            return getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: [\n                        new gast_public_1.Terminal({ terminalType: prod.separator })\n                    ].concat(prod.definition)\n                })\n            ]);\n            result = getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.Repetition) {\n            var newDef = prod.definition.concat([\n                new gast_public_1.Repetition({\n                    definition: prod.definition\n                })\n            ]);\n            result = getAlternativesForProd(newDef);\n        }\n        else if (prod instanceof gast_public_1.Alternation) {\n            utils_1.forEach(prod.definition, function (currAlt) {\n                result = getAlternativesForProd(currAlt.definition);\n            });\n            return result;\n        }\n        else if (prod instanceof gast_public_1.Terminal) {\n            currPath.push(prod.terminalType);\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n        i++;\n    }\n    result.push({\n        partialPath: currPath,\n        suffixDef: utils_1.drop(targetDef, i)\n    });\n    return result;\n}\nexports.possiblePathsFrom = possiblePathsFrom;\nfunction nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, maxLookAhead) {\n    var EXIT_NON_TERMINAL = \"EXIT_NONE_TERMINAL\";\n    // to avoid creating a new Array each time.\n    var EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL];\n    var EXIT_ALTERNATIVE = \"EXIT_ALTERNATIVE\";\n    var foundCompletePath = false;\n    var tokenVectorLength = tokenVector.length;\n    var minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1;\n    var result = [];\n    var possiblePaths = [];\n    possiblePaths.push({\n        idx: -1,\n        def: initialDef,\n        ruleStack: [],\n        occurrenceStack: []\n    });\n    while (!utils_1.isEmpty(possiblePaths)) {\n        var currPath = possiblePaths.pop();\n        // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n        if (currPath === EXIT_ALTERNATIVE) {\n            if (foundCompletePath &&\n                utils_1.last(possiblePaths).idx <= minimalAlternativesIndex) {\n                // remove irrelevant alternative\n                possiblePaths.pop();\n            }\n            continue;\n        }\n        var currDef = currPath.def;\n        var currIdx = currPath.idx;\n        var currRuleStack = currPath.ruleStack;\n        var currOccurrenceStack = currPath.occurrenceStack;\n        // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n        if (utils_1.isEmpty(currDef)) {\n            continue;\n        }\n        var prod = currDef[0];\n        /* istanbul ignore else */\n        if (prod === EXIT_NON_TERMINAL) {\n            var nextPath = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: utils_1.dropRight(currRuleStack),\n                occurrenceStack: utils_1.dropRight(currOccurrenceStack)\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.Terminal) {\n            /* istanbul ignore else */\n            if (currIdx < tokenVectorLength - 1) {\n                var nextIdx = currIdx + 1;\n                var actualToken = tokenVector[nextIdx];\n                if (tokMatcher(actualToken, prod.terminalType)) {\n                    var nextPath = {\n                        idx: nextIdx,\n                        def: utils_1.drop(currDef),\n                        ruleStack: currRuleStack,\n                        occurrenceStack: currOccurrenceStack\n                    };\n                    possiblePaths.push(nextPath);\n                }\n                // end of the line\n            }\n            else if (currIdx === tokenVectorLength - 1) {\n                // IGNORE ABOVE ELSE\n                result.push({\n                    nextTokenType: prod.terminalType,\n                    nextTokenOccurrence: prod.idx,\n                    ruleStack: currRuleStack,\n                    occurrenceStack: currOccurrenceStack\n                });\n                foundCompletePath = true;\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        }\n        else if (prod instanceof gast_public_1.NonTerminal) {\n            var newRuleStack = utils_1.cloneArr(currRuleStack);\n            newRuleStack.push(prod.nonTerminalName);\n            var newOccurrenceStack = utils_1.cloneArr(currOccurrenceStack);\n            newOccurrenceStack.push(prod.idx);\n            var nextPath = {\n                idx: currIdx,\n                def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, utils_1.drop(currDef)),\n                ruleStack: newRuleStack,\n                occurrenceStack: newOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.Option) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            var nextPathWith = {\n                idx: currIdx,\n                def: prod.definition.concat(utils_1.drop(currDef)),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatory) {\n            // TODO:(THE NEW operators here take a while...) (convert once?)\n            var secondIteration = new gast_public_1.Repetition({\n                definition: prod.definition,\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef));\n            var nextPath = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n            // TODO:(THE NEW operators here take a while...) (convert once?)\n            var separatorGast = new gast_public_1.Terminal({\n                terminalType: prod.separator\n            });\n            var secondIteration = new gast_public_1.Repetition({\n                definition: [separatorGast].concat(prod.definition),\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef));\n            var nextPath = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPath);\n        }\n        else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            var separatorGast = new gast_public_1.Terminal({\n                terminalType: prod.separator\n            });\n            var nthRepetition = new gast_public_1.Repetition({\n                definition: [separatorGast].concat(prod.definition),\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef));\n            var nextPathWith = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.Repetition) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            var nextPathWithout = {\n                idx: currIdx,\n                def: utils_1.drop(currDef),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWithout);\n            // required marker to avoid backtracking paths whose higher priority alternatives already matched\n            possiblePaths.push(EXIT_ALTERNATIVE);\n            // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n            var nthRepetition = new gast_public_1.Repetition({\n                definition: prod.definition,\n                idx: prod.idx\n            });\n            var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef));\n            var nextPathWith = {\n                idx: currIdx,\n                def: nextDef,\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            };\n            possiblePaths.push(nextPathWith);\n        }\n        else if (prod instanceof gast_public_1.Alternation) {\n            // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n            for (var i = prod.definition.length - 1; i >= 0; i--) {\n                var currAlt = prod.definition[i];\n                var currAltPath = {\n                    idx: currIdx,\n                    def: currAlt.definition.concat(utils_1.drop(currDef)),\n                    ruleStack: currRuleStack,\n                    occurrenceStack: currOccurrenceStack\n                };\n                possiblePaths.push(currAltPath);\n                possiblePaths.push(EXIT_ALTERNATIVE);\n            }\n        }\n        else if (prod instanceof gast_public_1.Flat) {\n            possiblePaths.push({\n                idx: currIdx,\n                def: prod.definition.concat(utils_1.drop(currDef)),\n                ruleStack: currRuleStack,\n                occurrenceStack: currOccurrenceStack\n            });\n        }\n        else if (prod instanceof gast_public_1.Rule) {\n            // last because we should only encounter at most a single one of these per invocation.\n            possiblePaths.push(expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack));\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    }\n    return result;\n}\nexports.nextPossibleTokensAfter = nextPossibleTokensAfter;\nfunction expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurrenceStack) {\n    var newRuleStack = utils_1.cloneArr(currRuleStack);\n    newRuleStack.push(topRule.name);\n    var newCurrOccurrenceStack = utils_1.cloneArr(currOccurrenceStack);\n    // top rule is always assumed to have been called with occurrence index 1\n    newCurrOccurrenceStack.push(1);\n    return {\n        idx: currIdx,\n        def: topRule.definition,\n        ruleStack: newRuleStack,\n        occurrenceStack: newCurrOccurrenceStack\n    };\n}\n//# sourceMappingURL=interpreter.js.map\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\n/**\n *  A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n */\nvar RestWalker = /** @class */ (function () {\n    function RestWalker() {\n    }\n    RestWalker.prototype.walk = function (prod, prevRest) {\n        var _this = this;\n        if (prevRest === void 0) { prevRest = []; }\n        utils_1.forEach(prod.definition, function (subProd, index) {\n            var currRest = utils_1.drop(prod.definition, index + 1);\n            /* istanbul ignore else */\n            if (subProd instanceof gast_public_1.NonTerminal) {\n                _this.walkProdRef(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Terminal) {\n                _this.walkTerminal(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Flat) {\n                _this.walkFlat(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Option) {\n                _this.walkOption(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionMandatory) {\n                _this.walkAtLeastOne(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n                _this.walkAtLeastOneSep(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.RepetitionWithSeparator) {\n                _this.walkManySep(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Repetition) {\n                _this.walkMany(subProd, currRest, prevRest);\n            }\n            else if (subProd instanceof gast_public_1.Alternation) {\n                _this.walkOr(subProd, currRest, prevRest);\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n    };\n    RestWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { };\n    RestWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { };\n    RestWalker.prototype.walkFlat = function (flatProd, currRest, prevRest) {\n        // ABCDEF => after the D the rest is EF\n        var fullOrRest = currRest.concat(prevRest);\n        this.walk(flatProd, fullOrRest);\n    };\n    RestWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n        // ABC(DE)?F => after the (DE)? the rest is F\n        var fullOrRest = currRest.concat(prevRest);\n        this.walk(optionProd, fullOrRest);\n    };\n    RestWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n        // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n        var fullAtLeastOneRest = [\n            new gast_public_1.Option({ definition: atLeastOneProd.definition })\n        ].concat(currRest, prevRest);\n        this.walk(atLeastOneProd, fullAtLeastOneRest);\n    };\n    RestWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n        // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n        var fullAtLeastOneSepRest = restForRepetitionWithSeparator(atLeastOneSepProd, currRest, prevRest);\n        this.walk(atLeastOneSepProd, fullAtLeastOneSepRest);\n    };\n    RestWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n        // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n        var fullManyRest = [\n            new gast_public_1.Option({ definition: manyProd.definition })\n        ].concat(currRest, prevRest);\n        this.walk(manyProd, fullManyRest);\n    };\n    RestWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n        // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n        var fullManySepRest = restForRepetitionWithSeparator(manySepProd, currRest, prevRest);\n        this.walk(manySepProd, fullManySepRest);\n    };\n    RestWalker.prototype.walkOr = function (orProd, currRest, prevRest) {\n        var _this = this;\n        // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n        var fullOrRest = currRest.concat(prevRest);\n        // walk all different alternatives\n        utils_1.forEach(orProd.definition, function (alt) {\n            // wrapping each alternative in a single definition wrapper\n            // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n            // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n            var prodWrapper = new gast_public_1.Flat({ definition: [alt] });\n            _this.walk(prodWrapper, fullOrRest);\n        });\n    };\n    return RestWalker;\n}());\nexports.RestWalker = RestWalker;\nfunction restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {\n    var repSepRest = [\n        new gast_public_1.Option({\n            definition: [\n                new gast_public_1.Terminal({ terminalType: repSepProd.separator })\n            ].concat(repSepProd.definition)\n        })\n    ];\n    var fullRepSepRest = repSepRest.concat(currRest, prevRest);\n    return fullRepSepRest;\n}\n//# sourceMappingURL=rest.js.map\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;;(function(root, factory) {\n    // istanbul ignore next\n    if (true) {\n        // istanbul ignore next\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n                __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n                (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n                __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n    } else {}\n})(\n    typeof self !== \"undefined\"\n        ? // istanbul ignore next\n          self\n        : this,\n    function() {\n        // references\n        // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n        // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\n        function RegExpParser() {}\n\n        RegExpParser.prototype.saveState = function() {\n            return {\n                idx: this.idx,\n                input: this.input,\n                groupIdx: this.groupIdx\n            }\n        }\n\n        RegExpParser.prototype.restoreState = function(newState) {\n            this.idx = newState.idx\n            this.input = newState.input\n            this.groupIdx = newState.groupIdx\n        }\n\n        RegExpParser.prototype.pattern = function(input) {\n            // parser state\n            this.idx = 0\n            this.input = input\n            this.groupIdx = 0\n\n            this.consumeChar(\"/\")\n            var value = this.disjunction()\n            this.consumeChar(\"/\")\n\n            var flags = {\n                type: \"Flags\",\n                global: false,\n                ignoreCase: false,\n                multiLine: false,\n                unicode: false,\n                sticky: false\n            }\n\n            while (this.isRegExpFlag()) {\n                switch (this.popChar()) {\n                    case \"g\":\n                        addFlag(flags, \"global\")\n                        break\n                    case \"i\":\n                        addFlag(flags, \"ignoreCase\")\n                        break\n                    case \"m\":\n                        addFlag(flags, \"multiLine\")\n                        break\n                    case \"u\":\n                        addFlag(flags, \"unicode\")\n                        break\n                    case \"y\":\n                        addFlag(flags, \"sticky\")\n                        break\n                }\n            }\n\n            if (this.idx !== this.input.length) {\n                throw Error(\n                    \"Redundant input: \" + this.input.substring(this.idx)\n                )\n            }\n            return { type: \"Pattern\", flags: flags, value: value }\n        }\n\n        RegExpParser.prototype.disjunction = function() {\n            var alts = []\n            alts.push(this.alternative())\n\n            while (this.peekChar() === \"|\") {\n                this.consumeChar(\"|\")\n                alts.push(this.alternative())\n            }\n\n            return { type: \"Disjunction\", value: alts }\n        }\n\n        RegExpParser.prototype.alternative = function() {\n            var terms = []\n\n            while (this.isTerm()) {\n                terms.push(this.term())\n            }\n\n            return { type: \"Alternative\", value: terms }\n        }\n\n        RegExpParser.prototype.term = function() {\n            if (this.isAssertion()) {\n                return this.assertion()\n            } else {\n                return this.atom()\n            }\n        }\n\n        RegExpParser.prototype.assertion = function() {\n            switch (this.popChar()) {\n                case \"^\":\n                    return { type: \"StartAnchor\" }\n                case \"$\":\n                    return { type: \"EndAnchor\" }\n                // '\\b' or '\\B'\n                case \"\\\\\":\n                    switch (this.popChar()) {\n                        case \"b\":\n                            return { type: \"WordBoundary\" }\n                        case \"B\":\n                            return { type: \"NonWordBoundary\" }\n                    }\n                    // istanbul ignore next\n                    throw Error(\"Invalid Assertion Escape\")\n                // '(?=' or '(?!'\n                case \"(\":\n                    this.consumeChar(\"?\")\n\n                    var type\n                    switch (this.popChar()) {\n                        case \"=\":\n                            type = \"Lookahead\"\n                            break\n                        case \"!\":\n                            type = \"NegativeLookahead\"\n                            break\n                    }\n                    ASSERT_EXISTS(type)\n\n                    var disjunction = this.disjunction()\n\n                    this.consumeChar(\")\")\n\n                    return { type: type, value: disjunction }\n            }\n            // istanbul ignore next\n            ASSERT_NEVER_REACH_HERE()\n        }\n\n        RegExpParser.prototype.quantifier = function(isBacktracking) {\n            var range\n            switch (this.popChar()) {\n                case \"*\":\n                    range = {\n                        atLeast: 0,\n                        atMost: Infinity\n                    }\n                    break\n                case \"+\":\n                    range = {\n                        atLeast: 1,\n                        atMost: Infinity\n                    }\n                    break\n                case \"?\":\n                    range = {\n                        atLeast: 0,\n                        atMost: 1\n                    }\n                    break\n                case \"{\":\n                    var atLeast = this.integerIncludingZero()\n                    switch (this.popChar()) {\n                        case \"}\":\n                            range = {\n                                atLeast: atLeast,\n                                atMost: atLeast\n                            }\n                            break\n                        case \",\":\n                            var atMost\n                            if (this.isDigit()) {\n                                atMost = this.integerIncludingZero()\n                                range = {\n                                    atLeast: atLeast,\n                                    atMost: atMost\n                                }\n                            } else {\n                                range = {\n                                    atLeast: atLeast,\n                                    atMost: Infinity\n                                }\n                            }\n                            this.consumeChar(\"}\")\n                            break\n                    }\n                    // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n                    // causes severe performance degradations\n                    if (isBacktracking === true && range === undefined) {\n                        return undefined\n                    }\n                    ASSERT_EXISTS(range)\n                    break\n            }\n\n            // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n            // causes severe performance degradations\n            if (isBacktracking === true && range === undefined) {\n                return undefined\n            }\n\n            ASSERT_EXISTS(range)\n\n            if (this.peekChar(0) === \"?\") {\n                this.consumeChar(\"?\")\n                range.greedy = false\n            } else {\n                range.greedy = true\n            }\n\n            range.type = \"Quantifier\"\n            return range\n        }\n\n        RegExpParser.prototype.atom = function() {\n            var atom\n            switch (this.peekChar()) {\n                case \".\":\n                    atom = this.dotAll()\n                    break\n                case \"\\\\\":\n                    atom = this.atomEscape()\n                    break\n                case \"[\":\n                    atom = this.characterClass()\n                    break\n                case \"(\":\n                    atom = this.group()\n                    break\n            }\n\n            if (atom === undefined && this.isPatternCharacter()) {\n                atom = this.patternCharacter()\n            }\n\n            ASSERT_EXISTS(atom)\n\n            if (this.isQuantifier()) {\n                atom.quantifier = this.quantifier()\n            }\n\n            return atom\n        }\n\n        RegExpParser.prototype.dotAll = function() {\n            this.consumeChar(\".\")\n            return {\n                type: \"Set\",\n                complement: true,\n                value: [cc(\"\\n\"), cc(\"\\r\"), cc(\"\\u2028\"), cc(\"\\u2029\")]\n            }\n        }\n\n        RegExpParser.prototype.atomEscape = function() {\n            this.consumeChar(\"\\\\\")\n\n            switch (this.peekChar()) {\n                case \"1\":\n                case \"2\":\n                case \"3\":\n                case \"4\":\n                case \"5\":\n                case \"6\":\n                case \"7\":\n                case \"8\":\n                case \"9\":\n                    return this.decimalEscapeAtom()\n                case \"d\":\n                case \"D\":\n                case \"s\":\n                case \"S\":\n                case \"w\":\n                case \"W\":\n                    return this.characterClassEscape()\n                case \"f\":\n                case \"n\":\n                case \"r\":\n                case \"t\":\n                case \"v\":\n                    return this.controlEscapeAtom()\n                case \"c\":\n                    return this.controlLetterEscapeAtom()\n                case \"0\":\n                    return this.nulCharacterAtom()\n                case \"x\":\n                    return this.hexEscapeSequenceAtom()\n                case \"u\":\n                    return this.regExpUnicodeEscapeSequenceAtom()\n                default:\n                    return this.identityEscapeAtom()\n            }\n        }\n\n        RegExpParser.prototype.decimalEscapeAtom = function() {\n            var value = this.positiveInteger()\n\n            return { type: \"GroupBackReference\", value: value }\n        }\n\n        RegExpParser.prototype.characterClassEscape = function() {\n            var set\n            var complement = false\n            switch (this.popChar()) {\n                case \"d\":\n                    set = digitsCharCodes\n                    break\n                case \"D\":\n                    set = digitsCharCodes\n                    complement = true\n                    break\n                case \"s\":\n                    set = whitespaceCodes\n                    break\n                case \"S\":\n                    set = whitespaceCodes\n                    complement = true\n                    break\n                case \"w\":\n                    set = wordCharCodes\n                    break\n                case \"W\":\n                    set = wordCharCodes\n                    complement = true\n                    break\n            }\n\n            ASSERT_EXISTS(set)\n\n            return { type: \"Set\", value: set, complement: complement }\n        }\n\n        RegExpParser.prototype.controlEscapeAtom = function() {\n            var escapeCode\n            switch (this.popChar()) {\n                case \"f\":\n                    escapeCode = cc(\"\\f\")\n                    break\n                case \"n\":\n                    escapeCode = cc(\"\\n\")\n                    break\n                case \"r\":\n                    escapeCode = cc(\"\\r\")\n                    break\n                case \"t\":\n                    escapeCode = cc(\"\\t\")\n                    break\n                case \"v\":\n                    escapeCode = cc(\"\\v\")\n                    break\n            }\n            ASSERT_EXISTS(escapeCode)\n\n            return { type: \"Character\", value: escapeCode }\n        }\n\n        RegExpParser.prototype.controlLetterEscapeAtom = function() {\n            this.consumeChar(\"c\")\n            var letter = this.popChar()\n            if (/[a-zA-Z]/.test(letter) === false) {\n                throw Error(\"Invalid \")\n            }\n\n            var letterCode = letter.toUpperCase().charCodeAt(0) - 64\n            return { type: \"Character\", value: letterCode }\n        }\n\n        RegExpParser.prototype.nulCharacterAtom = function() {\n            // TODO implement '[lookahead ∉ DecimalDigit]'\n            // TODO: for the deprecated octal escape sequence\n            this.consumeChar(\"0\")\n            return { type: \"Character\", value: cc(\"\\0\") }\n        }\n\n        RegExpParser.prototype.hexEscapeSequenceAtom = function() {\n            this.consumeChar(\"x\")\n            return this.parseHexDigits(2)\n        }\n\n        RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() {\n            this.consumeChar(\"u\")\n            return this.parseHexDigits(4)\n        }\n\n        RegExpParser.prototype.identityEscapeAtom = function() {\n            // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n            // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n            var escapedChar = this.popChar()\n            return { type: \"Character\", value: cc(escapedChar) }\n        }\n\n        RegExpParser.prototype.classPatternCharacterAtom = function() {\n            switch (this.peekChar()) {\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                // istanbul ignore next\n                case \"\\\\\":\n                // istanbul ignore next\n                case \"]\":\n                    throw Error(\"TBD\")\n                default:\n                    var nextChar = this.popChar()\n                    return { type: \"Character\", value: cc(nextChar) }\n            }\n        }\n\n        RegExpParser.prototype.characterClass = function() {\n            var set = []\n            var complement = false\n            this.consumeChar(\"[\")\n            if (this.peekChar(0) === \"^\") {\n                this.consumeChar(\"^\")\n                complement = true\n            }\n\n            while (this.isClassAtom()) {\n                var from = this.classAtom()\n                var isFromSingleChar = from.type === \"Character\"\n                if (isFromSingleChar && this.isRangeDash()) {\n                    this.consumeChar(\"-\")\n                    var to = this.classAtom()\n                    var isToSingleChar = to.type === \"Character\"\n\n                    // a range can only be used when both sides are single characters\n                    if (isToSingleChar) {\n                        if (to.value < from.value) {\n                            throw Error(\"Range out of order in character class\")\n                        }\n                        set.push({ from: from.value, to: to.value })\n                    } else {\n                        // literal dash\n                        insertToSet(from.value, set)\n                        set.push(cc(\"-\"))\n                        insertToSet(to.value, set)\n                    }\n                } else {\n                    insertToSet(from.value, set)\n                }\n            }\n\n            this.consumeChar(\"]\")\n\n            return { type: \"Set\", complement: complement, value: set }\n        }\n\n        RegExpParser.prototype.classAtom = function() {\n            switch (this.peekChar()) {\n                // istanbul ignore next\n                case \"]\":\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                    throw Error(\"TBD\")\n                case \"\\\\\":\n                    return this.classEscape()\n                default:\n                    return this.classPatternCharacterAtom()\n            }\n        }\n\n        RegExpParser.prototype.classEscape = function() {\n            this.consumeChar(\"\\\\\")\n            switch (this.peekChar()) {\n                // Matches a backspace.\n                // (Not to be confused with \\b word boundary outside characterClass)\n                case \"b\":\n                    this.consumeChar(\"b\")\n                    return { type: \"Character\", value: cc(\"\\u0008\") }\n                case \"d\":\n                case \"D\":\n                case \"s\":\n                case \"S\":\n                case \"w\":\n                case \"W\":\n                    return this.characterClassEscape()\n                case \"f\":\n                case \"n\":\n                case \"r\":\n                case \"t\":\n                case \"v\":\n                    return this.controlEscapeAtom()\n                case \"c\":\n                    return this.controlLetterEscapeAtom()\n                case \"0\":\n                    return this.nulCharacterAtom()\n                case \"x\":\n                    return this.hexEscapeSequenceAtom()\n                case \"u\":\n                    return this.regExpUnicodeEscapeSequenceAtom()\n                default:\n                    return this.identityEscapeAtom()\n            }\n        }\n\n        RegExpParser.prototype.group = function() {\n            var capturing = true\n            this.consumeChar(\"(\")\n            switch (this.peekChar(0)) {\n                case \"?\":\n                    this.consumeChar(\"?\")\n                    this.consumeChar(\":\")\n                    capturing = false\n                    break\n                default:\n                    this.groupIdx++\n                    break\n            }\n            var value = this.disjunction()\n            this.consumeChar(\")\")\n\n            var groupAst = {\n                type: \"Group\",\n                capturing: capturing,\n                value: value\n            }\n\n            if (capturing) {\n                groupAst.idx = this.groupIdx\n            }\n\n            return groupAst\n        }\n\n        RegExpParser.prototype.positiveInteger = function() {\n            var number = this.popChar()\n\n            // istanbul ignore next - can't ever get here due to previous lookahead checks\n            // still implementing this error checking in case this ever changes.\n            if (decimalPatternNoZero.test(number) === false) {\n                throw Error(\"Expecting a positive integer\")\n            }\n\n            while (decimalPattern.test(this.peekChar(0))) {\n                number += this.popChar()\n            }\n\n            return parseInt(number, 10)\n        }\n\n        RegExpParser.prototype.integerIncludingZero = function() {\n            var number = this.popChar()\n            if (decimalPattern.test(number) === false) {\n                throw Error(\"Expecting an integer\")\n            }\n\n            while (decimalPattern.test(this.peekChar(0))) {\n                number += this.popChar()\n            }\n\n            return parseInt(number, 10)\n        }\n\n        RegExpParser.prototype.patternCharacter = function() {\n            var nextChar = this.popChar()\n            switch (nextChar) {\n                // istanbul ignore next\n                case \"\\n\":\n                // istanbul ignore next\n                case \"\\r\":\n                // istanbul ignore next\n                case \"\\u2028\":\n                // istanbul ignore next\n                case \"\\u2029\":\n                // istanbul ignore next\n                case \"^\":\n                // istanbul ignore next\n                case \"$\":\n                // istanbul ignore next\n                case \"\\\\\":\n                // istanbul ignore next\n                case \".\":\n                // istanbul ignore next\n                case \"*\":\n                // istanbul ignore next\n                case \"+\":\n                // istanbul ignore next\n                case \"?\":\n                // istanbul ignore next\n                case \"(\":\n                // istanbul ignore next\n                case \")\":\n                // istanbul ignore next\n                case \"[\":\n                // istanbul ignore next\n                case \"|\":\n                    // istanbul ignore next\n                    throw Error(\"TBD\")\n                default:\n                    return { type: \"Character\", value: cc(nextChar) }\n            }\n        }\n        RegExpParser.prototype.isRegExpFlag = function() {\n            switch (this.peekChar(0)) {\n                case \"g\":\n                case \"i\":\n                case \"m\":\n                case \"u\":\n                case \"y\":\n                    return true\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isRangeDash = function() {\n            return this.peekChar() === \"-\" && this.isClassAtom(1)\n        }\n\n        RegExpParser.prototype.isDigit = function() {\n            return decimalPattern.test(this.peekChar(0))\n        }\n\n        RegExpParser.prototype.isClassAtom = function(howMuch) {\n            if (howMuch === undefined) {\n                howMuch = 0\n            }\n\n            switch (this.peekChar(howMuch)) {\n                case \"]\":\n                case \"\\n\":\n                case \"\\r\":\n                case \"\\u2028\":\n                case \"\\u2029\":\n                    return false\n                default:\n                    return true\n            }\n        }\n\n        RegExpParser.prototype.isTerm = function() {\n            return this.isAtom() || this.isAssertion()\n        }\n\n        RegExpParser.prototype.isAtom = function() {\n            if (this.isPatternCharacter()) {\n                return true\n            }\n\n            switch (this.peekChar(0)) {\n                case \".\":\n                case \"\\\\\": // atomEscape\n                case \"[\": // characterClass\n                // TODO: isAtom must be called before isAssertion - disambiguate\n                case \"(\": // group\n                    return true\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isAssertion = function() {\n            switch (this.peekChar(0)) {\n                case \"^\":\n                case \"$\":\n                    return true\n                // '\\b' or '\\B'\n                case \"\\\\\":\n                    switch (this.peekChar(1)) {\n                        case \"b\":\n                        case \"B\":\n                            return true\n                        default:\n                            return false\n                    }\n                // '(?=' or '(?!'\n                case \"(\":\n                    return (\n                        this.peekChar(1) === \"?\" &&\n                        (this.peekChar(2) === \"=\" || this.peekChar(2) === \"!\")\n                    )\n                default:\n                    return false\n            }\n        }\n\n        RegExpParser.prototype.isQuantifier = function() {\n            var prevState = this.saveState()\n            try {\n                return this.quantifier(true) !== undefined\n            } catch (e) {\n                return false\n            } finally {\n                this.restoreState(prevState)\n            }\n        }\n\n        RegExpParser.prototype.isPatternCharacter = function() {\n            switch (this.peekChar()) {\n                case \"^\":\n                case \"$\":\n                case \"\\\\\":\n                case \".\":\n                case \"*\":\n                case \"+\":\n                case \"?\":\n                case \"(\":\n                case \")\":\n                case \"[\":\n                case \"|\":\n                case \"/\":\n                case \"\\n\":\n                case \"\\r\":\n                case \"\\u2028\":\n                case \"\\u2029\":\n                    return false\n                default:\n                    return true\n            }\n        }\n\n        RegExpParser.prototype.parseHexDigits = function(howMany) {\n            var hexString = \"\"\n            for (var i = 0; i < howMany; i++) {\n                var hexChar = this.popChar()\n                if (hexDigitPattern.test(hexChar) === false) {\n                    throw Error(\"Expecting a HexDecimal digits\")\n                }\n                hexString += hexChar\n            }\n            var charCode = parseInt(hexString, 16)\n            return { type: \"Character\", value: charCode }\n        }\n\n        RegExpParser.prototype.peekChar = function(howMuch) {\n            if (howMuch === undefined) {\n                howMuch = 0\n            }\n            return this.input[this.idx + howMuch]\n        }\n\n        RegExpParser.prototype.popChar = function() {\n            var nextChar = this.peekChar(0)\n            this.consumeChar()\n            return nextChar\n        }\n\n        RegExpParser.prototype.consumeChar = function(char) {\n            if (char !== undefined && this.input[this.idx] !== char) {\n                throw Error(\n                    \"Expected: '\" +\n                        char +\n                        \"' but found: '\" +\n                        this.input[this.idx] +\n                        \"' at offset: \" +\n                        this.idx\n                )\n            }\n\n            if (this.idx >= this.input.length) {\n                throw Error(\"Unexpected end of input\")\n            }\n            this.idx++\n        }\n\n        // consts and utilities\n        var hexDigitPattern = /[0-9a-fA-F]/\n        var decimalPattern = /[0-9]/\n        var decimalPatternNoZero = /[1-9]/\n\n        function cc(char) {\n            return char.charCodeAt(0)\n        }\n\n        function insertToSet(item, set) {\n            if (item.length !== undefined) {\n                item.forEach(function(subItem) {\n                    set.push(subItem)\n                })\n            } else {\n                set.push(item)\n            }\n        }\n\n        function addFlag(flagObj, flagKey) {\n            if (flagObj[flagKey] === true) {\n                throw \"duplicate flag \" + flagKey\n            }\n\n            flagObj[flagKey] = true\n        }\n\n        function ASSERT_EXISTS(obj) {\n            // istanbul ignore next\n            if (obj === undefined) {\n                throw Error(\"Internal Error - Should never get here!\")\n            }\n        }\n\n        // istanbul ignore next\n        function ASSERT_NEVER_REACH_HERE() {\n            throw Error(\"Internal Error - Should never get here!\")\n        }\n\n        var i\n        var digitsCharCodes = []\n        for (i = cc(\"0\"); i <= cc(\"9\"); i++) {\n            digitsCharCodes.push(i)\n        }\n\n        var wordCharCodes = [cc(\"_\")].concat(digitsCharCodes)\n        for (i = cc(\"a\"); i <= cc(\"z\"); i++) {\n            wordCharCodes.push(i)\n        }\n\n        for (i = cc(\"A\"); i <= cc(\"Z\"); i++) {\n            wordCharCodes.push(i)\n        }\n\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\n        var whitespaceCodes = [\n            cc(\" \"),\n            cc(\"\\f\"),\n            cc(\"\\n\"),\n            cc(\"\\r\"),\n            cc(\"\\t\"),\n            cc(\"\\v\"),\n            cc(\"\\t\"),\n            cc(\"\\u00a0\"),\n            cc(\"\\u1680\"),\n            cc(\"\\u2000\"),\n            cc(\"\\u2001\"),\n            cc(\"\\u2002\"),\n            cc(\"\\u2003\"),\n            cc(\"\\u2004\"),\n            cc(\"\\u2005\"),\n            cc(\"\\u2006\"),\n            cc(\"\\u2007\"),\n            cc(\"\\u2008\"),\n            cc(\"\\u2009\"),\n            cc(\"\\u200a\"),\n            cc(\"\\u2028\"),\n            cc(\"\\u2029\"),\n            cc(\"\\u202f\"),\n            cc(\"\\u205f\"),\n            cc(\"\\u3000\"),\n            cc(\"\\ufeff\")\n        ]\n\n        function BaseRegExpVisitor() {}\n\n        BaseRegExpVisitor.prototype.visitChildren = function(node) {\n            for (var key in node) {\n                var child = node[key]\n                /* istanbul ignore else */\n                if (node.hasOwnProperty(key)) {\n                    if (child.type !== undefined) {\n                        this.visit(child)\n                    } else if (Array.isArray(child)) {\n                        child.forEach(function(subChild) {\n                            this.visit(subChild)\n                        }, this)\n                    }\n                }\n            }\n        }\n\n        BaseRegExpVisitor.prototype.visit = function(node) {\n            switch (node.type) {\n                case \"Pattern\":\n                    this.visitPattern(node)\n                    break\n                case \"Flags\":\n                    this.visitFlags(node)\n                    break\n                case \"Disjunction\":\n                    this.visitDisjunction(node)\n                    break\n                case \"Alternative\":\n                    this.visitAlternative(node)\n                    break\n                case \"StartAnchor\":\n                    this.visitStartAnchor(node)\n                    break\n                case \"EndAnchor\":\n                    this.visitEndAnchor(node)\n                    break\n                case \"WordBoundary\":\n                    this.visitWordBoundary(node)\n                    break\n                case \"NonWordBoundary\":\n                    this.visitNonWordBoundary(node)\n                    break\n                case \"Lookahead\":\n                    this.visitLookahead(node)\n                    break\n                case \"NegativeLookahead\":\n                    this.visitNegativeLookahead(node)\n                    break\n                case \"Character\":\n                    this.visitCharacter(node)\n                    break\n                case \"Set\":\n                    this.visitSet(node)\n                    break\n                case \"Group\":\n                    this.visitGroup(node)\n                    break\n                case \"GroupBackReference\":\n                    this.visitGroupBackReference(node)\n                    break\n                case \"Quantifier\":\n                    this.visitQuantifier(node)\n                    break\n            }\n\n            this.visitChildren(node)\n        }\n\n        BaseRegExpVisitor.prototype.visitPattern = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitFlags = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitDisjunction = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitAlternative = function(node) {}\n\n        // Assertion\n        BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitLookahead = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {}\n\n        // atoms\n        BaseRegExpVisitor.prototype.visitCharacter = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitSet = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitGroup = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {}\n\n        BaseRegExpVisitor.prototype.visitQuantifier = function(node) {}\n\n        return {\n            RegExpParser: RegExpParser,\n            BaseRegExpVisitor: BaseRegExpVisitor,\n            VERSION: \"0.4.0\"\n        }\n    }\n)\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar regExpAstCache = {};\nvar regExpParser = new regexp_to_ast_1.RegExpParser();\nfunction getRegExpAst(regExp) {\n    var regExpStr = regExp.toString();\n    if (regExpAstCache.hasOwnProperty(regExpStr)) {\n        return regExpAstCache[regExpStr];\n    }\n    else {\n        var regExpAst = regExpParser.pattern(regExpStr);\n        regExpAstCache[regExpStr] = regExpAst;\n        return regExpAst;\n    }\n}\nexports.getRegExpAst = getRegExpAst;\nfunction clearRegExpParserCache() {\n    regExpAstCache = {};\n}\nexports.clearRegExpParserCache = clearRegExpParserCache;\n//# sourceMappingURL=reg_exp_parser.js.map\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar keys_1 = __webpack_require__(7);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_visitor_public_1 = __webpack_require__(4);\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nfunction setNodeLocationOnlyOffset(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n        // assumption1: Token location information is either NaN or a valid number\n        // assumption2: Token location information is fully valid if it exist\n        // (both start/end offsets exist and are numbers).\n        currNodeLocation.startOffset = newLocationInfo.startOffset;\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n    }\n    // Once the startOffset has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n    }\n}\nexports.setNodeLocationOnlyOffset = setNodeLocationOnlyOffset;\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nfunction setNodeLocationFull(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n        // assumption1: Token location information is either NaN or a valid number\n        // assumption2: Token location information is fully valid if it exist\n        // (all start/end props exist and are numbers).\n        currNodeLocation.startOffset = newLocationInfo.startOffset;\n        currNodeLocation.startColumn = newLocationInfo.startColumn;\n        currNodeLocation.startLine = newLocationInfo.startLine;\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n        currNodeLocation.endColumn = newLocationInfo.endColumn;\n        currNodeLocation.endLine = newLocationInfo.endLine;\n    }\n    // Once the start props has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n        currNodeLocation.endOffset = newLocationInfo.endOffset;\n        currNodeLocation.endColumn = newLocationInfo.endColumn;\n        currNodeLocation.endLine = newLocationInfo.endLine;\n    }\n}\nexports.setNodeLocationFull = setNodeLocationFull;\nfunction addTerminalToCst(node, token, tokenTypeName) {\n    if (node.children[tokenTypeName] === undefined) {\n        node.children[tokenTypeName] = [token];\n    }\n    else {\n        node.children[tokenTypeName].push(token);\n    }\n}\nexports.addTerminalToCst = addTerminalToCst;\nfunction addNoneTerminalToCst(node, ruleName, ruleResult) {\n    if (node.children[ruleName] === undefined) {\n        node.children[ruleName] = [ruleResult];\n    }\n    else {\n        node.children[ruleName].push(ruleResult);\n    }\n}\nexports.addNoneTerminalToCst = addNoneTerminalToCst;\nvar NamedDSLMethodsCollectorVisitor = /** @class */ (function (_super) {\n    __extends(NamedDSLMethodsCollectorVisitor, _super);\n    function NamedDSLMethodsCollectorVisitor(ruleIdx) {\n        var _this = _super.call(this) || this;\n        _this.result = [];\n        _this.ruleIdx = ruleIdx;\n        return _this;\n    }\n    NamedDSLMethodsCollectorVisitor.prototype.collectNamedDSLMethod = function (node, newNodeConstructor, methodIdx) {\n        // TODO: better hack to copy what we need here...\n        if (!utils_1.isUndefined(node.name)) {\n            // copy without name so this will indeed be processed later.\n            var nameLessNode \n            /* istanbul ignore else */\n            = void 0;\n            /* istanbul ignore else */\n            if (node instanceof gast_public_1.Option ||\n                node instanceof gast_public_1.Repetition ||\n                node instanceof gast_public_1.RepetitionMandatory ||\n                node instanceof gast_public_1.Alternation) {\n                nameLessNode = new newNodeConstructor({\n                    definition: node.definition,\n                    idx: node.idx\n                });\n            }\n            else if (node instanceof gast_public_1.RepetitionMandatoryWithSeparator ||\n                node instanceof gast_public_1.RepetitionWithSeparator) {\n                nameLessNode = new newNodeConstructor({\n                    definition: node.definition,\n                    idx: node.idx,\n                    separator: node.separator\n                });\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n            var def = [nameLessNode];\n            var key = keys_1.getKeyForAutomaticLookahead(this.ruleIdx, methodIdx, node.idx);\n            this.result.push({ def: def, key: key, name: node.name, orgProd: node });\n        }\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitOption = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.Option, keys_1.OPTION_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetition = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.Repetition, keys_1.MANY_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatory, keys_1.AT_LEAST_ONE_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatoryWithSeparator, keys_1.AT_LEAST_ONE_SEP_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n        this.collectNamedDSLMethod(node, gast_public_1.RepetitionWithSeparator, keys_1.MANY_SEP_IDX);\n    };\n    NamedDSLMethodsCollectorVisitor.prototype.visitAlternation = function (node) {\n        var _this = this;\n        this.collectNamedDSLMethod(node, gast_public_1.Alternation, keys_1.OR_IDX);\n        var hasMoreThanOneAlternative = node.definition.length > 1;\n        utils_1.forEach(node.definition, function (currFlatAlt, altIdx) {\n            if (!utils_1.isUndefined(currFlatAlt.name)) {\n                var def = currFlatAlt.definition;\n                if (hasMoreThanOneAlternative) {\n                    def = [new gast_public_1.Option({ definition: currFlatAlt.definition })];\n                }\n                else {\n                    // mandatory\n                    def = currFlatAlt.definition;\n                }\n                var key = keys_1.getKeyForAltIndex(_this.ruleIdx, keys_1.OR_IDX, node.idx, altIdx);\n                _this.result.push({\n                    def: def,\n                    key: key,\n                    name: currFlatAlt.name,\n                    orgProd: currFlatAlt\n                });\n            }\n        });\n    };\n    return NamedDSLMethodsCollectorVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.NamedDSLMethodsCollectorVisitor = NamedDSLMethodsCollectorVisitor;\nfunction expandAllNestedRuleNames(topRules, fullToShortName) {\n    var result = {\n        allRuleNames: []\n    };\n    utils_1.forEach(topRules, function (currTopRule) {\n        var currTopRuleShortName = fullToShortName[currTopRule.name];\n        result.allRuleNames.push(currTopRule.name);\n        var namedCollectorVisitor = new NamedDSLMethodsCollectorVisitor(currTopRuleShortName);\n        currTopRule.accept(namedCollectorVisitor);\n        utils_1.forEach(namedCollectorVisitor.result, function (_a) {\n            var def = _a.def, key = _a.key, name = _a.name;\n            result.allRuleNames.push(currTopRule.name + name);\n        });\n    });\n    return result;\n}\nexports.expandAllNestedRuleNames = expandAllNestedRuleNames;\n//# sourceMappingURL=cst.js.map\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// semantic version\nvar version_1 = __webpack_require__(19);\nexports.VERSION = version_1.VERSION;\nvar parser_1 = __webpack_require__(2);\nexports.Parser = parser_1.Parser;\nexports.CstParser = parser_1.CstParser;\nexports.EmbeddedActionsParser = parser_1.EmbeddedActionsParser;\nexports.ParserDefinitionErrorType = parser_1.ParserDefinitionErrorType;\nexports.EMPTY_ALT = parser_1.EMPTY_ALT;\nvar lexer_public_1 = __webpack_require__(9);\nexports.Lexer = lexer_public_1.Lexer;\nexports.LexerDefinitionErrorType = lexer_public_1.LexerDefinitionErrorType;\n// Tokens utilities\nvar tokens_public_1 = __webpack_require__(3);\nexports.createToken = tokens_public_1.createToken;\nexports.createTokenInstance = tokens_public_1.createTokenInstance;\nexports.EOF = tokens_public_1.EOF;\nexports.tokenLabel = tokens_public_1.tokenLabel;\nexports.tokenMatcher = tokens_public_1.tokenMatcher;\nexports.tokenName = tokens_public_1.tokenName;\n// Other Utilities\nvar errors_public_1 = __webpack_require__(10);\nexports.defaultGrammarResolverErrorProvider = errors_public_1.defaultGrammarResolverErrorProvider;\nexports.defaultGrammarValidatorErrorProvider = errors_public_1.defaultGrammarValidatorErrorProvider;\nexports.defaultParserErrorProvider = errors_public_1.defaultParserErrorProvider;\nvar exceptions_public_1 = __webpack_require__(8);\nexports.EarlyExitException = exceptions_public_1.EarlyExitException;\nexports.isRecognitionException = exceptions_public_1.isRecognitionException;\nexports.MismatchedTokenException = exceptions_public_1.MismatchedTokenException;\nexports.NotAllInputParsedException = exceptions_public_1.NotAllInputParsedException;\nexports.NoViableAltException = exceptions_public_1.NoViableAltException;\nvar lexer_errors_public_1 = __webpack_require__(21);\nexports.defaultLexerErrorProvider = lexer_errors_public_1.defaultLexerErrorProvider;\n// grammar reflection API\nvar gast_public_1 = __webpack_require__(1);\nexports.Alternation = gast_public_1.Alternation;\nexports.Flat = gast_public_1.Flat;\nexports.NonTerminal = gast_public_1.NonTerminal;\nexports.Option = gast_public_1.Option;\nexports.Repetition = gast_public_1.Repetition;\nexports.RepetitionMandatory = gast_public_1.RepetitionMandatory;\nexports.RepetitionMandatoryWithSeparator = gast_public_1.RepetitionMandatoryWithSeparator;\nexports.RepetitionWithSeparator = gast_public_1.RepetitionWithSeparator;\nexports.Rule = gast_public_1.Rule;\nexports.Terminal = gast_public_1.Terminal;\n// GAST Utilities\nvar gast_public_2 = __webpack_require__(1);\nexports.serializeGrammar = gast_public_2.serializeGrammar;\nexports.serializeProduction = gast_public_2.serializeProduction;\nvar gast_visitor_public_1 = __webpack_require__(4);\nexports.GAstVisitor = gast_visitor_public_1.GAstVisitor;\nvar gast_resolver_public_1 = __webpack_require__(24);\nexports.assignOccurrenceIndices = gast_resolver_public_1.assignOccurrenceIndices;\nexports.resolveGrammar = gast_resolver_public_1.resolveGrammar;\nexports.validateGrammar = gast_resolver_public_1.validateGrammar;\n/* istanbul ignore next */\nfunction clearCache() {\n    console.warn(\"The clearCache function was 'soft' removed from the Chevrotain API.\" +\n        \"\\n\\t It performs no action other than printing this message.\" +\n        \"\\n\\t Please avoid using it as it will be completely removed in the future\");\n}\nexports.clearCache = clearCache;\nvar render_public_1 = __webpack_require__(40);\nexports.createSyntaxDiagramsCode = render_public_1.createSyntaxDiagramsCode;\nvar generate_public_1 = __webpack_require__(41);\nexports.generateParserFactory = generate_public_1.generateParserFactory;\nexports.generateParserModule = generate_public_1.generateParserModule;\n//# sourceMappingURL=api.js.map\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// needs a separate module as this is required inside chevrotain productive code\n// and also in the entry point for webpack(api.ts).\n// A separate file avoids cyclic dependencies and webpack errors.\nexports.VERSION = \"6.5.0\";\n//# sourceMappingURL=version.js.map\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar lexer_public_1 = __webpack_require__(9);\nvar utils_1 = __webpack_require__(0);\nvar reg_exp_1 = __webpack_require__(28);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar PATTERN = \"PATTERN\";\nexports.DEFAULT_MODE = \"defaultMode\";\nexports.MODES = \"modes\";\nexports.SUPPORT_STICKY = typeof new RegExp(\"(?:)\").sticky === \"boolean\";\nfunction disableSticky() {\n    exports.SUPPORT_STICKY = false;\n}\nexports.disableSticky = disableSticky;\nfunction enableSticky() {\n    exports.SUPPORT_STICKY = true;\n}\nexports.enableSticky = enableSticky;\nfunction analyzeTokenTypes(tokenTypes, options) {\n    options = utils_1.defaults(options, {\n        useSticky: exports.SUPPORT_STICKY,\n        debug: false,\n        safeMode: false,\n        positionTracking: \"full\",\n        lineTerminatorCharacters: [\"\\r\", \"\\n\"],\n        tracer: function (msg, action) { return action(); }\n    });\n    var tracer = options.tracer;\n    tracer(\"initCharCodeToOptimizedIndexMap\", function () {\n        initCharCodeToOptimizedIndexMap();\n    });\n    var onlyRelevantTypes;\n    tracer(\"Reject Lexer.NA\", function () {\n        onlyRelevantTypes = utils_1.reject(tokenTypes, function (currType) {\n            return currType[PATTERN] === lexer_public_1.Lexer.NA;\n        });\n    });\n    var hasCustom = false;\n    var allTransformedPatterns;\n    tracer(\"Transform Patterns\", function () {\n        hasCustom = false;\n        allTransformedPatterns = utils_1.map(onlyRelevantTypes, function (currType) {\n            var currPattern = currType[PATTERN];\n            /* istanbul ignore else */\n            if (utils_1.isRegExp(currPattern)) {\n                var regExpSource = currPattern.source;\n                if (regExpSource.length === 1 &&\n                    // only these regExp meta characters which can appear in a length one regExp\n                    regExpSource !== \"^\" &&\n                    regExpSource !== \"$\" &&\n                    regExpSource !== \".\") {\n                    return regExpSource;\n                }\n                else if (regExpSource.length === 2 &&\n                    regExpSource[0] === \"\\\\\" &&\n                    // not a meta character\n                    !utils_1.contains([\n                        \"d\",\n                        \"D\",\n                        \"s\",\n                        \"S\",\n                        \"t\",\n                        \"r\",\n                        \"n\",\n                        \"t\",\n                        \"0\",\n                        \"c\",\n                        \"b\",\n                        \"B\",\n                        \"f\",\n                        \"v\",\n                        \"w\",\n                        \"W\"\n                    ], regExpSource[1])) {\n                    // escaped meta Characters: /\\+/ /\\[/\n                    // or redundant escaping: /\\a/\n                    // without the escaping \"\\\"\n                    return regExpSource[1];\n                }\n                else {\n                    return options.useSticky\n                        ? addStickyFlag(currPattern)\n                        : addStartOfInput(currPattern);\n                }\n            }\n            else if (utils_1.isFunction(currPattern)) {\n                hasCustom = true;\n                // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n                return { exec: currPattern };\n            }\n            else if (utils_1.has(currPattern, \"exec\")) {\n                hasCustom = true;\n                // ICustomPattern\n                return currPattern;\n            }\n            else if (typeof currPattern === \"string\") {\n                if (currPattern.length === 1) {\n                    return currPattern;\n                }\n                else {\n                    var escapedRegExpString = currPattern.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n                    var wrappedRegExp = new RegExp(escapedRegExpString);\n                    return options.useSticky\n                        ? addStickyFlag(wrappedRegExp)\n                        : addStartOfInput(wrappedRegExp);\n                }\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n    });\n    var patternIdxToType;\n    var patternIdxToGroup;\n    var patternIdxToLongerAltIdx;\n    var patternIdxToPushMode;\n    var patternIdxToPopMode;\n    tracer(\"misc mapping\", function () {\n        patternIdxToType = utils_1.map(onlyRelevantTypes, function (currType) { return currType.tokenTypeIdx; });\n        patternIdxToGroup = utils_1.map(onlyRelevantTypes, function (clazz) {\n            var groupName = clazz.GROUP;\n            /* istanbul ignore next */\n            if (groupName === lexer_public_1.Lexer.SKIPPED) {\n                return undefined;\n            }\n            else if (utils_1.isString(groupName)) {\n                return groupName;\n            }\n            else if (utils_1.isUndefined(groupName)) {\n                return false;\n            }\n            else {\n                throw Error(\"non exhaustive match\");\n            }\n        });\n        patternIdxToLongerAltIdx = utils_1.map(onlyRelevantTypes, function (clazz) {\n            var longerAltType = clazz.LONGER_ALT;\n            if (longerAltType) {\n                var longerAltIdx = utils_1.indexOf(onlyRelevantTypes, longerAltType);\n                return longerAltIdx;\n            }\n        });\n        patternIdxToPushMode = utils_1.map(onlyRelevantTypes, function (clazz) { return clazz.PUSH_MODE; });\n        patternIdxToPopMode = utils_1.map(onlyRelevantTypes, function (clazz) {\n            return utils_1.has(clazz, \"POP_MODE\");\n        });\n    });\n    var patternIdxToCanLineTerminator;\n    tracer(\"Line Terminator Handling\", function () {\n        var lineTerminatorCharCodes = getCharCodes(options.lineTerminatorCharacters);\n        patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) { return false; });\n        if (options.positionTracking !== \"onlyOffset\") {\n            patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) {\n                if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n                    return tokType.LINE_BREAKS;\n                }\n                else {\n                    if (checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false) {\n                        return reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN);\n                    }\n                }\n            });\n        }\n    });\n    var patternIdxToIsCustom;\n    var patternIdxToShort;\n    var emptyGroups;\n    var patternIdxToConfig;\n    tracer(\"Misc Mapping #2\", function () {\n        patternIdxToIsCustom = utils_1.map(onlyRelevantTypes, isCustomPattern);\n        patternIdxToShort = utils_1.map(allTransformedPatterns, isShortPattern);\n        emptyGroups = utils_1.reduce(onlyRelevantTypes, function (acc, clazz) {\n            var groupName = clazz.GROUP;\n            if (utils_1.isString(groupName) && !(groupName === lexer_public_1.Lexer.SKIPPED)) {\n                acc[groupName] = [];\n            }\n            return acc;\n        }, {});\n        patternIdxToConfig = utils_1.map(allTransformedPatterns, function (x, idx) {\n            return {\n                pattern: allTransformedPatterns[idx],\n                longerAlt: patternIdxToLongerAltIdx[idx],\n                canLineTerminator: patternIdxToCanLineTerminator[idx],\n                isCustom: patternIdxToIsCustom[idx],\n                short: patternIdxToShort[idx],\n                group: patternIdxToGroup[idx],\n                push: patternIdxToPushMode[idx],\n                pop: patternIdxToPopMode[idx],\n                tokenTypeIdx: patternIdxToType[idx],\n                tokenType: onlyRelevantTypes[idx]\n            };\n        });\n    });\n    var canBeOptimized = true;\n    var charCodeToPatternIdxToConfig = [];\n    if (!options.safeMode) {\n        tracer(\"First Char Optimization\", function () {\n            charCodeToPatternIdxToConfig = utils_1.reduce(onlyRelevantTypes, function (result, currTokType, idx) {\n                if (typeof currTokType.PATTERN === \"string\") {\n                    var charCode = currTokType.PATTERN.charCodeAt(0);\n                    var optimizedIdx = charCodeToOptimizedIndex(charCode);\n                    addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx]);\n                }\n                else if (utils_1.isArray(currTokType.START_CHARS_HINT)) {\n                    var lastOptimizedIdx_1;\n                    utils_1.forEach(currTokType.START_CHARS_HINT, function (charOrInt) {\n                        var charCode = typeof charOrInt === \"string\"\n                            ? charOrInt.charCodeAt(0)\n                            : charOrInt;\n                        var currOptimizedIdx = charCodeToOptimizedIndex(charCode);\n                        // Avoid adding the config multiple times\n                        if (lastOptimizedIdx_1 !== currOptimizedIdx) {\n                            lastOptimizedIdx_1 = currOptimizedIdx;\n                            addToMapOfArrays(result, currOptimizedIdx, patternIdxToConfig[idx]);\n                        }\n                    });\n                }\n                else if (utils_1.isRegExp(currTokType.PATTERN)) {\n                    if (currTokType.PATTERN.unicode) {\n                        canBeOptimized = false;\n                        if (options.ensureOptimizations) {\n                            utils_1.PRINT_ERROR(\"\" + reg_exp_1.failedOptimizationPrefixMsg +\n                                (\"\\tUnable to analyze < \" + currTokType.PATTERN.toString() + \" > pattern.\\n\") +\n                                \"\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\" +\n                                \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                                \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\");\n                        }\n                    }\n                    else {\n                        var optimizedCodes = reg_exp_1.getOptimizedStartCodesIndices(currTokType.PATTERN, options.ensureOptimizations);\n                        /* istanbul ignore if */\n                        // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n                        // the first should be a different validation and the second cannot be tested.\n                        if (utils_1.isEmpty(optimizedCodes)) {\n                            // we cannot understand what codes may start possible matches\n                            // The optimization correctness requires knowing start codes for ALL patterns.\n                            // Not actually sure this is an error, no debug message\n                            canBeOptimized = false;\n                        }\n                        utils_1.forEach(optimizedCodes, function (code) {\n                            addToMapOfArrays(result, code, patternIdxToConfig[idx]);\n                        });\n                    }\n                }\n                else {\n                    if (options.ensureOptimizations) {\n                        utils_1.PRINT_ERROR(\"\" + reg_exp_1.failedOptimizationPrefixMsg +\n                            (\"\\tTokenType: <\" + currTokType.name + \"> is using a custom token pattern without providing <start_chars_hint> parameter.\\n\") +\n                            \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\");\n                    }\n                    canBeOptimized = false;\n                }\n                return result;\n            }, []);\n        });\n    }\n    tracer(\"ArrayPacking\", function () {\n        charCodeToPatternIdxToConfig = utils_1.packArray(charCodeToPatternIdxToConfig);\n    });\n    return {\n        emptyGroups: emptyGroups,\n        patternIdxToConfig: patternIdxToConfig,\n        charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n        hasCustom: hasCustom,\n        canBeOptimized: canBeOptimized\n    };\n}\nexports.analyzeTokenTypes = analyzeTokenTypes;\nfunction validatePatterns(tokenTypes, validModesNames) {\n    var errors = [];\n    var missingResult = findMissingPatterns(tokenTypes);\n    errors = errors.concat(missingResult.errors);\n    var invalidResult = findInvalidPatterns(missingResult.valid);\n    var validTokenTypes = invalidResult.valid;\n    errors = errors.concat(invalidResult.errors);\n    errors = errors.concat(validateRegExpPattern(validTokenTypes));\n    errors = errors.concat(findInvalidGroupType(validTokenTypes));\n    errors = errors.concat(findModesThatDoNotExist(validTokenTypes, validModesNames));\n    errors = errors.concat(findUnreachablePatterns(validTokenTypes));\n    return errors;\n}\nexports.validatePatterns = validatePatterns;\nfunction validateRegExpPattern(tokenTypes) {\n    var errors = [];\n    var withRegExpPatterns = utils_1.filter(tokenTypes, function (currTokType) {\n        return utils_1.isRegExp(currTokType[PATTERN]);\n    });\n    errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns));\n    errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns));\n    errors = errors.concat(findUnsupportedFlags(withRegExpPatterns));\n    errors = errors.concat(findDuplicatePatterns(withRegExpPatterns));\n    errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns));\n    return errors;\n}\nfunction findMissingPatterns(tokenTypes) {\n    var tokenTypesWithMissingPattern = utils_1.filter(tokenTypes, function (currType) {\n        return !utils_1.has(currType, PATTERN);\n    });\n    var errors = utils_1.map(tokenTypesWithMissingPattern, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- missing static 'PATTERN' property\",\n            type: lexer_public_1.LexerDefinitionErrorType.MISSING_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    var valid = utils_1.difference(tokenTypes, tokenTypesWithMissingPattern);\n    return { errors: errors, valid: valid };\n}\nexports.findMissingPatterns = findMissingPatterns;\nfunction findInvalidPatterns(tokenTypes) {\n    var tokenTypesWithInvalidPattern = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return (!utils_1.isRegExp(pattern) &&\n            !utils_1.isFunction(pattern) &&\n            !utils_1.has(pattern, \"exec\") &&\n            !utils_1.isString(pattern));\n    });\n    var errors = utils_1.map(tokenTypesWithInvalidPattern, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' can only be a RegExp, a\" +\n                \" Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",\n            type: lexer_public_1.LexerDefinitionErrorType.INVALID_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    var valid = utils_1.difference(tokenTypes, tokenTypesWithInvalidPattern);\n    return { errors: errors, valid: valid };\n}\nexports.findInvalidPatterns = findInvalidPatterns;\nvar end_of_input = /[^\\\\][\\$]/;\nfunction findEndOfInputAnchor(tokenTypes) {\n    var EndAnchorFinder = /** @class */ (function (_super) {\n        __extends(EndAnchorFinder, _super);\n        function EndAnchorFinder() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.found = false;\n            return _this;\n        }\n        EndAnchorFinder.prototype.visitEndAnchor = function (node) {\n            this.found = true;\n        };\n        return EndAnchorFinder;\n    }(regexp_to_ast_1.BaseRegExpVisitor));\n    var invalidRegex = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        try {\n            var regexpAst = reg_exp_parser_1.getRegExpAst(pattern);\n            var endAnchorVisitor = new EndAnchorFinder();\n            endAnchorVisitor.visit(regexpAst);\n            return endAnchorVisitor.found;\n        }\n        catch (e) {\n            // old behavior in case of runtime exceptions with regexp-to-ast.\n            /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n            return end_of_input.test(pattern.source);\n        }\n    });\n    var errors = utils_1.map(invalidRegex, function (currType) {\n        return {\n            message: \"Unexpected RegExp Anchor Error:\\n\" +\n                \"\\tToken Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n                \"\\tSee sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findEndOfInputAnchor = findEndOfInputAnchor;\nfunction findEmptyMatchRegExps(tokenTypes) {\n    var matchesEmptyString = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return pattern.test(\"\");\n    });\n    var errors = utils_1.map(matchesEmptyString, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' must not match an empty string\",\n            type: lexer_public_1.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findEmptyMatchRegExps = findEmptyMatchRegExps;\nvar start_of_input = /[^\\\\[][\\^]|^\\^/;\nfunction findStartOfInputAnchor(tokenTypes) {\n    var StartAnchorFinder = /** @class */ (function (_super) {\n        __extends(StartAnchorFinder, _super);\n        function StartAnchorFinder() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.found = false;\n            return _this;\n        }\n        StartAnchorFinder.prototype.visitStartAnchor = function (node) {\n            this.found = true;\n        };\n        return StartAnchorFinder;\n    }(regexp_to_ast_1.BaseRegExpVisitor));\n    var invalidRegex = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        try {\n            var regexpAst = reg_exp_parser_1.getRegExpAst(pattern);\n            var startAnchorVisitor = new StartAnchorFinder();\n            startAnchorVisitor.visit(regexpAst);\n            return startAnchorVisitor.found;\n        }\n        catch (e) {\n            // old behavior in case of runtime exceptions with regexp-to-ast.\n            /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n            return start_of_input.test(pattern.source);\n        }\n    });\n    var errors = utils_1.map(invalidRegex, function (currType) {\n        return {\n            message: \"Unexpected RegExp Anchor Error:\\n\" +\n                \"\\tToken Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n                \"\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findStartOfInputAnchor = findStartOfInputAnchor;\nfunction findUnsupportedFlags(tokenTypes) {\n    var invalidFlags = utils_1.filter(tokenTypes, function (currType) {\n        var pattern = currType[PATTERN];\n        return (pattern instanceof RegExp && (pattern.multiline || pattern.global));\n    });\n    var errors = utils_1.map(invalidFlags, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n            type: lexer_public_1.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findUnsupportedFlags = findUnsupportedFlags;\n// This can only test for identical duplicate RegExps, not semantically equivalent ones.\nfunction findDuplicatePatterns(tokenTypes) {\n    var found = [];\n    var identicalPatterns = utils_1.map(tokenTypes, function (outerType) {\n        return utils_1.reduce(tokenTypes, function (result, innerType) {\n            if (outerType.PATTERN.source === innerType.PATTERN.source &&\n                !utils_1.contains(found, innerType) &&\n                innerType.PATTERN !== lexer_public_1.Lexer.NA) {\n                // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n                // in essence we are creating Equivalence classes on equality relation.\n                found.push(innerType);\n                result.push(innerType);\n                return result;\n            }\n            return result;\n        }, []);\n    });\n    identicalPatterns = utils_1.compact(identicalPatterns);\n    var duplicatePatterns = utils_1.filter(identicalPatterns, function (currIdenticalSet) {\n        return currIdenticalSet.length > 1;\n    });\n    var errors = utils_1.map(duplicatePatterns, function (setOfIdentical) {\n        var tokenTypeNames = utils_1.map(setOfIdentical, function (currType) {\n            return currType.name;\n        });\n        var dupPatternSrc = utils_1.first(setOfIdentical).PATTERN;\n        return {\n            message: \"The same RegExp pattern ->\" + dupPatternSrc + \"<-\" +\n                (\"has been used in all of the following Token Types: \" + tokenTypeNames.join(\", \") + \" <-\"),\n            type: lexer_public_1.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n            tokenTypes: setOfIdentical\n        };\n    });\n    return errors;\n}\nexports.findDuplicatePatterns = findDuplicatePatterns;\nfunction findInvalidGroupType(tokenTypes) {\n    var invalidTypes = utils_1.filter(tokenTypes, function (clazz) {\n        if (!utils_1.has(clazz, \"GROUP\")) {\n            return false;\n        }\n        var group = clazz.GROUP;\n        return group !== lexer_public_1.Lexer.SKIPPED && group !== lexer_public_1.Lexer.NA && !utils_1.isString(group);\n    });\n    var errors = utils_1.map(invalidTypes, function (currType) {\n        return {\n            message: \"Token Type: ->\" +\n                currType.name +\n                \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n            type: lexer_public_1.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n            tokenTypes: [currType]\n        };\n    });\n    return errors;\n}\nexports.findInvalidGroupType = findInvalidGroupType;\nfunction findModesThatDoNotExist(tokenTypes, validModes) {\n    var invalidModes = utils_1.filter(tokenTypes, function (clazz) {\n        return (clazz.PUSH_MODE !== undefined &&\n            !utils_1.contains(validModes, clazz.PUSH_MODE));\n    });\n    var errors = utils_1.map(invalidModes, function (tokType) {\n        var msg = \"Token Type: ->\" + tokType.name + \"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\" + tokType.PUSH_MODE + \"<-\" +\n            \"which does not exist\";\n        return {\n            message: msg,\n            type: lexer_public_1.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n            tokenTypes: [tokType]\n        };\n    });\n    return errors;\n}\nexports.findModesThatDoNotExist = findModesThatDoNotExist;\nfunction findUnreachablePatterns(tokenTypes) {\n    var errors = [];\n    var canBeTested = utils_1.reduce(tokenTypes, function (result, tokType, idx) {\n        var pattern = tokType.PATTERN;\n        if (pattern === lexer_public_1.Lexer.NA) {\n            return result;\n        }\n        // a more comprehensive validation for all forms of regExps would require\n        // deeper regExp analysis capabilities\n        if (utils_1.isString(pattern)) {\n            result.push({ str: pattern, idx: idx, tokenType: tokType });\n        }\n        else if (utils_1.isRegExp(pattern) && noMetaChar(pattern)) {\n            result.push({ str: pattern.source, idx: idx, tokenType: tokType });\n        }\n        return result;\n    }, []);\n    utils_1.forEach(tokenTypes, function (tokType, testIdx) {\n        utils_1.forEach(canBeTested, function (_a) {\n            var str = _a.str, idx = _a.idx, tokenType = _a.tokenType;\n            if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n                var msg = \"Token: ->\" + tokenType.name + \"<- can never be matched.\\n\" +\n                    (\"Because it appears AFTER the Token Type ->\" + tokType.name + \"<-\") +\n                    \"in the lexer's definition.\\n\" +\n                    \"See https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNREACHABLE\";\n                errors.push({\n                    message: msg,\n                    type: lexer_public_1.LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n                    tokenTypes: [tokType, tokenType]\n                });\n            }\n        });\n    });\n    return errors;\n}\nexports.findUnreachablePatterns = findUnreachablePatterns;\nfunction testTokenType(str, pattern) {\n    /* istanbul ignore else */\n    if (utils_1.isRegExp(pattern)) {\n        var regExpArray = pattern.exec(str);\n        return regExpArray !== null && regExpArray.index === 0;\n    }\n    else if (utils_1.isFunction(pattern)) {\n        // maintain the API of custom patterns\n        return pattern(str, 0, [], {});\n    }\n    else if (utils_1.has(pattern, \"exec\")) {\n        // maintain the API of custom patterns\n        return pattern.exec(str, 0, [], {});\n    }\n    else if (typeof pattern === \"string\") {\n        return pattern === str;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nfunction noMetaChar(regExp) {\n    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n    var metaChars = [\n        \".\",\n        \"\\\\\",\n        \"[\",\n        \"]\",\n        \"|\",\n        \"^\",\n        \"$\",\n        \"(\",\n        \")\",\n        \"?\",\n        \"*\",\n        \"+\",\n        \"{\"\n    ];\n    return (utils_1.find(metaChars, function (char) { return regExp.source.indexOf(char) !== -1; }) ===\n        undefined);\n}\nfunction addStartOfInput(pattern) {\n    var flags = pattern.ignoreCase ? \"i\" : \"\";\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(\"^(?:\" + pattern.source + \")\", flags);\n}\nexports.addStartOfInput = addStartOfInput;\nfunction addStickyFlag(pattern) {\n    var flags = pattern.ignoreCase ? \"iy\" : \"y\";\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(\"\" + pattern.source, flags);\n}\nexports.addStickyFlag = addStickyFlag;\nfunction performRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    var errors = [];\n    // some run time checks to help the end users.\n    if (!utils_1.has(lexerDefinition, exports.DEFAULT_MODE)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized without a <\" +\n                exports.DEFAULT_MODE +\n                \"> property in its definition\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\n        });\n    }\n    if (!utils_1.has(lexerDefinition, exports.MODES)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized without a <\" +\n                exports.MODES +\n                \"> property in its definition\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\n        });\n    }\n    if (utils_1.has(lexerDefinition, exports.MODES) &&\n        utils_1.has(lexerDefinition, exports.DEFAULT_MODE) &&\n        !utils_1.has(lexerDefinition.modes, lexerDefinition.defaultMode)) {\n        errors.push({\n            message: \"A MultiMode Lexer cannot be initialized with a \" + exports.DEFAULT_MODE + \": <\" + lexerDefinition.defaultMode + \">\" +\n                \"which does not exist\\n\",\n            type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\n        });\n    }\n    if (utils_1.has(lexerDefinition, exports.MODES)) {\n        utils_1.forEach(lexerDefinition.modes, function (currModeValue, currModeName) {\n            utils_1.forEach(currModeValue, function (currTokType, currIdx) {\n                if (utils_1.isUndefined(currTokType)) {\n                    errors.push({\n                        message: \"A Lexer cannot be initialized using an undefined Token Type. Mode:\" +\n                            (\"<\" + currModeName + \"> at index: <\" + currIdx + \">\\n\"),\n                        type: lexer_public_1.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\n                    });\n                }\n            });\n        });\n    }\n    return errors;\n}\nexports.performRuntimeChecks = performRuntimeChecks;\nfunction performWarningRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    var warnings = [];\n    var hasAnyLineBreak = false;\n    var allTokenTypes = utils_1.compact(utils_1.flatten(utils_1.mapValues(lexerDefinition.modes, function (tokTypes) { return tokTypes; })));\n    var concreteTokenTypes = utils_1.reject(allTokenTypes, function (currType) { return currType[PATTERN] === lexer_public_1.Lexer.NA; });\n    var terminatorCharCodes = getCharCodes(lineTerminatorCharacters);\n    if (trackLines) {\n        utils_1.forEach(concreteTokenTypes, function (tokType) {\n            var currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes);\n            if (currIssue !== false) {\n                var message = buildLineBreakIssueMessage(tokType, currIssue);\n                var warningDescriptor = {\n                    message: message,\n                    type: currIssue.issue,\n                    tokenType: tokType\n                };\n                warnings.push(warningDescriptor);\n            }\n            else {\n                // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n                if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n                    if (tokType.LINE_BREAKS === true) {\n                        hasAnyLineBreak = true;\n                    }\n                }\n                else {\n                    if (reg_exp_1.canMatchCharCode(terminatorCharCodes, tokType.PATTERN)) {\n                        hasAnyLineBreak = true;\n                    }\n                }\n            }\n        });\n    }\n    if (trackLines && !hasAnyLineBreak) {\n        warnings.push({\n            message: \"Warning: No LINE_BREAKS Found.\\n\" +\n                \"\\tThis Lexer has been defined to track line and column information,\\n\" +\n                \"\\tBut none of the Token Types can be identified as matching a line terminator.\\n\" +\n                \"\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\" +\n                \"\\tfor details.\",\n            type: lexer_public_1.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS\n        });\n    }\n    return warnings;\n}\nexports.performWarningRuntimeChecks = performWarningRuntimeChecks;\nfunction cloneEmptyGroups(emptyGroups) {\n    var clonedResult = {};\n    var groupKeys = utils_1.keys(emptyGroups);\n    utils_1.forEach(groupKeys, function (currKey) {\n        var currGroupValue = emptyGroups[currKey];\n        /* istanbul ignore else */\n        if (utils_1.isArray(currGroupValue)) {\n            clonedResult[currKey] = [];\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    });\n    return clonedResult;\n}\nexports.cloneEmptyGroups = cloneEmptyGroups;\n// TODO: refactor to avoid duplication\nfunction isCustomPattern(tokenType) {\n    var pattern = tokenType.PATTERN;\n    /* istanbul ignore else */\n    if (utils_1.isRegExp(pattern)) {\n        return false;\n    }\n    else if (utils_1.isFunction(pattern)) {\n        // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n        return true;\n    }\n    else if (utils_1.has(pattern, \"exec\")) {\n        // ICustomPattern\n        return true;\n    }\n    else if (utils_1.isString(pattern)) {\n        return false;\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.isCustomPattern = isCustomPattern;\nfunction isShortPattern(pattern) {\n    if (utils_1.isString(pattern) && pattern.length === 1) {\n        return pattern.charCodeAt(0);\n    }\n    else {\n        return false;\n    }\n}\nexports.isShortPattern = isShortPattern;\n/**\n * Faster than using a RegExp for default newline detection during lexing.\n */\nexports.LineTerminatorOptimizedTester = {\n    // implements /\\n|\\r\\n?/g.test\n    test: function (text) {\n        var len = text.length;\n        for (var i = this.lastIndex; i < len; i++) {\n            var c = text.charCodeAt(i);\n            if (c === 10) {\n                this.lastIndex = i + 1;\n                return true;\n            }\n            else if (c === 13) {\n                if (text.charCodeAt(i + 1) === 10) {\n                    this.lastIndex = i + 2;\n                }\n                else {\n                    this.lastIndex = i + 1;\n                }\n                return true;\n            }\n        }\n        return false;\n    },\n    lastIndex: 0\n};\nfunction checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {\n    if (utils_1.has(tokType, \"LINE_BREAKS\")) {\n        // if the user explicitly declared the line_breaks option we will respect their choice\n        // and assume it is correct.\n        return false;\n    }\n    else {\n        /* istanbul ignore else */\n        if (utils_1.isRegExp(tokType.PATTERN)) {\n            try {\n                reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN);\n            }\n            catch (e) {\n                /* istanbul ignore next - to test this we would have to mock <canMatchCharCode> to throw an error */\n                return {\n                    issue: lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n                    errMsg: e.message\n                };\n            }\n            return false;\n        }\n        else if (utils_1.isString(tokType.PATTERN)) {\n            // string literal patterns can always be analyzed to detect line terminator usage\n            return false;\n        }\n        else if (isCustomPattern(tokType)) {\n            // custom token types\n            return { issue: lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK };\n        }\n        else {\n            throw Error(\"non exhaustive match\");\n        }\n    }\n}\nfunction buildLineBreakIssueMessage(tokType, details) {\n    /* istanbul ignore else */\n    if (details.issue === lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n        return (\"Warning: unable to identify line terminator usage in pattern.\\n\" +\n            (\"\\tThe problem is in the <\" + tokType.name + \"> Token Type\\n\") +\n            (\"\\t Root cause: \" + details.errMsg + \".\\n\") +\n            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\");\n    }\n    else if (details.issue === lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n        return (\"Warning: A Custom Token Pattern should specify the <line_breaks> option.\\n\" +\n            (\"\\tThe problem is in the <\" + tokType.name + \"> Token Type\\n\") +\n            \"\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\");\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.buildLineBreakIssueMessage = buildLineBreakIssueMessage;\nfunction getCharCodes(charsOrCodes) {\n    var charCodes = utils_1.map(charsOrCodes, function (numOrString) {\n        if (utils_1.isString(numOrString) && numOrString.length > 0) {\n            return numOrString.charCodeAt(0);\n        }\n        else {\n            return numOrString;\n        }\n    });\n    return charCodes;\n}\nfunction addToMapOfArrays(map, key, value) {\n    if (map[key] === undefined) {\n        map[key] = [value];\n    }\n    else {\n        map[key].push(value);\n    }\n}\nexports.minOptimizationVal = 256;\n/**\n * We ae mapping charCode above ASCI (256) into buckets each in the size of 256.\n * This is because ASCI are the most common start chars so each one of those will get its own\n * possible token configs vector.\n *\n * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n * to place these into buckets of possible token configs, What we gain from\n * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n * Our 'charCodeToPatternIdxToConfig' max size will now be:\n * 256 + (2^16 / 2^8) - 1 === 511\n *\n * note the hack for fast division integer part extraction\n * See: https://stackoverflow.com/a/4228528\n */\nfunction charCodeToOptimizedIndex(charCode) {\n    return charCode < exports.minOptimizationVal\n        ? charCode\n        : charCodeToOptimizedIdxMap[charCode];\n}\nexports.charCodeToOptimizedIndex = charCodeToOptimizedIndex;\n/**\n * This is a compromise between cold start / hot running performance\n * Creating this array takes ~3ms on a modern machine,\n * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n * performance degrades by ~10%\n *\n * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n */\nvar charCodeToOptimizedIdxMap = [];\nfunction initCharCodeToOptimizedIndexMap() {\n    if (utils_1.isEmpty(charCodeToOptimizedIdxMap)) {\n        charCodeToOptimizedIdxMap = new Array(65536);\n        for (var i = 0; i < 65536; i++) {\n            /* tslint:disable */\n            charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i;\n            /* tslint:enable */\n        }\n    }\n}\n//# sourceMappingURL=lexer.js.map\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultLexerErrorProvider = {\n    buildUnableToPopLexerModeMessage: function (token) {\n        return \"Unable to pop Lexer Mode after encountering Token ->\" + token.image + \"<- The Mode Stack is empty\";\n    },\n    buildUnexpectedCharactersMessage: function (fullText, startOffset, length, line, column) {\n        return (\"unexpected character: ->\" + fullText.charAt(startOffset) + \"<- at offset: \" + startOffset + \",\" + (\" skipped \" + length + \" characters.\"));\n    }\n};\n//# sourceMappingURL=lexer_errors_public.js.map\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar gast_1 = __webpack_require__(6);\nfunction first(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        // this could in theory cause infinite loops if\n        // (1) prod A refs prod B.\n        // (2) prod B refs prod A\n        // (3) AB can match the empty set\n        // in other words a cycle where everything is optional so the first will keep\n        // looking ahead for the next optional part and will never exit\n        // currently there is no safeguard for this unique edge case because\n        // (1) not sure a grammar in which this can happen is useful for anything (productive)\n        return first(prod.referencedRule);\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return firstForTerminal(prod);\n    }\n    else if (gast_1.isSequenceProd(prod)) {\n        return firstForSequence(prod);\n    }\n    else if (gast_1.isBranchingProd(prod)) {\n        return firstForBranching(prod);\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nexports.first = first;\nfunction firstForSequence(prod) {\n    var firstSet = [];\n    var seq = prod.definition;\n    var nextSubProdIdx = 0;\n    var hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n    var currSubProd;\n    // so we enter the loop at least once (if the definition is not empty\n    var isLastInnerProdOptional = true;\n    // scan a sequence until it's end or until we have found a NONE optional production in it\n    while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n        currSubProd = seq[nextSubProdIdx];\n        isLastInnerProdOptional = gast_1.isOptionalProd(currSubProd);\n        firstSet = firstSet.concat(first(currSubProd));\n        nextSubProdIdx = nextSubProdIdx + 1;\n        hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n    }\n    return utils_1.uniq(firstSet);\n}\nexports.firstForSequence = firstForSequence;\nfunction firstForBranching(prod) {\n    var allAlternativesFirsts = utils_1.map(prod.definition, function (innerProd) {\n        return first(innerProd);\n    });\n    return utils_1.uniq(utils_1.flatten(allAlternativesFirsts));\n}\nexports.firstForBranching = firstForBranching;\nfunction firstForTerminal(terminal) {\n    return [terminal.terminalType];\n}\nexports.firstForTerminal = firstForTerminal;\n//# sourceMappingURL=first.js.map\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: can this be removed? where is it used?\nexports.IN = \"_~IN~_\";\n//# sourceMappingURL=constants.js.map\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar resolver_1 = __webpack_require__(29);\nvar checks_1 = __webpack_require__(11);\nvar errors_public_1 = __webpack_require__(10);\nvar gast_1 = __webpack_require__(6);\nfunction resolveGrammar(options) {\n    options = utils_1.defaults(options, {\n        errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n    });\n    var topRulesTable = {};\n    utils_1.forEach(options.rules, function (rule) {\n        topRulesTable[rule.name] = rule;\n    });\n    return resolver_1.resolveGrammar(topRulesTable, options.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n    options = utils_1.defaults(options, {\n        errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n        ignoredIssues: {}\n    });\n    return checks_1.validateGrammar(options.rules, options.maxLookahead, options.tokenTypes, options.ignoredIssues, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\nfunction assignOccurrenceIndices(options) {\n    utils_1.forEach(options.rules, function (currRule) {\n        var methodsCollector = new gast_1.DslMethodsCollectorVisitor();\n        currRule.accept(methodsCollector);\n        utils_1.forEach(methodsCollector.dslMethods, function (methods) {\n            utils_1.forEach(methods, function (currMethod, arrIdx) {\n                currMethod.idx = arrIdx + 1;\n            });\n        });\n    });\n}\nexports.assignOccurrenceIndices = assignOccurrenceIndices;\n//# sourceMappingURL=gast_resolver_public.js.map\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tokens_public_1 = __webpack_require__(3);\nvar utils_1 = __webpack_require__(0);\nvar exceptions_public_1 = __webpack_require__(8);\nvar constants_1 = __webpack_require__(23);\nvar parser_1 = __webpack_require__(2);\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nfunction InRuleRecoveryException(message) {\n    this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n    this.message = message;\n}\nexports.InRuleRecoveryException = InRuleRecoveryException;\nInRuleRecoveryException.prototype = Error.prototype;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n    function Recoverable() {\n    }\n    Recoverable.prototype.initRecoverable = function (config) {\n        this.firstAfterRepMap = {};\n        this.resyncFollows = {};\n        this.recoveryEnabled = utils_1.has(config, \"recoveryEnabled\")\n            ? config.recoveryEnabled\n            : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n        // performance optimization, NOOP will be inlined which\n        // effectively means that this optional feature does not exist\n        // when not used.\n        if (this.recoveryEnabled) {\n            this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n        }\n    };\n    Recoverable.prototype.getTokenToInsert = function (tokType) {\n        var tokToInsert = tokens_public_1.createTokenInstance(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n        tokToInsert.isInsertedInRecovery = true;\n        return tokToInsert;\n    };\n    Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n        return true;\n    };\n    Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n        var _this = this;\n        // TODO: can the resyncTokenType be cached?\n        var reSyncTokType = this.findReSyncTokenType();\n        var savedLexerState = this.exportLexerState();\n        var resyncedTokens = [];\n        var passedResyncPoint = false;\n        var nextTokenWithoutResync = this.LA(1);\n        var currToken = this.LA(1);\n        var generateErrorMessage = function () {\n            var previousToken = _this.LA(0);\n            // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n            // the error that would have been thrown\n            var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n                expected: expectedTokType,\n                actual: nextTokenWithoutResync,\n                previous: previousToken,\n                ruleName: _this.getCurrRuleFullName()\n            });\n            var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n            // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n            error.resyncedTokens = utils_1.dropRight(resyncedTokens);\n            _this.SAVE_ERROR(error);\n        };\n        while (!passedResyncPoint) {\n            // re-synced to a point where we can safely exit the repetition/\n            if (this.tokenMatcher(currToken, expectedTokType)) {\n                generateErrorMessage();\n                return; // must return here to avoid reverting the inputIdx\n            }\n            else if (lookAheadFunc.call(this)) {\n                // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n                generateErrorMessage();\n                // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n                grammarRule.apply(this, grammarRuleArgs);\n                return; // must return here to avoid reverting the inputIdx\n            }\n            else if (this.tokenMatcher(currToken, reSyncTokType)) {\n                passedResyncPoint = true;\n            }\n            else {\n                currToken = this.SKIP_TOKEN();\n                this.addToResyncTokens(currToken, resyncedTokens);\n            }\n        }\n        // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n        // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n        // \"between rules\" resync recovery later in the flow.\n        this.importLexerState(savedLexerState);\n    };\n    Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n        // Edge case of arriving from a MANY repetition which is stuck\n        // Attempting recovery in this case could cause an infinite loop\n        if (notStuck === false) {\n            return false;\n        }\n        // arguments to try and perform resync into the next iteration of the many are missing\n        if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n            return false;\n        }\n        // no need to recover, next token is what we expect...\n        if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n            return false;\n        }\n        // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n        // and prefer some backtracking path that includes recovered errors.\n        if (this.isBackTracking()) {\n            return false;\n        }\n        // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n        // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n        //noinspection RedundantIfStatementJS\n        if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n            return false;\n        }\n        return true;\n    };\n    // Error Recovery functionality\n    Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n        var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n        var follows = this.getNextPossibleTokenTypes(grammarPath);\n        return follows;\n    };\n    Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n        if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n            var tokToInsert = this.getTokenToInsert(expectedTokType);\n            return tokToInsert;\n        }\n        if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n            var nextTok = this.SKIP_TOKEN();\n            this.consumeToken();\n            return nextTok;\n        }\n        throw new InRuleRecoveryException(\"sad sad panda\");\n    };\n    Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n        return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n            this.canRecoverWithSingleTokenDeletion(expectedToken));\n    };\n    Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n        var _this = this;\n        if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n            return false;\n        }\n        // must know the possible following tokens to perform single token insertion\n        if (utils_1.isEmpty(follows)) {\n            return false;\n        }\n        var mismatchedTok = this.LA(1);\n        var isMisMatchedTokInFollows = utils_1.find(follows, function (possibleFollowsTokType) {\n            return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n        }) !== undefined;\n        return isMisMatchedTokInFollows;\n    };\n    Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n        var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n        return isNextTokenWhatIsExpected;\n    };\n    Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n        var followKey = this.getCurrFollowKey();\n        var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n        return utils_1.contains(currentRuleReSyncSet, tokenTypeIdx);\n    };\n    Recoverable.prototype.findReSyncTokenType = function () {\n        var allPossibleReSyncTokTypes = this.flattenFollowSet();\n        // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n        var nextToken = this.LA(1);\n        var k = 2;\n        while (true) {\n            var nextTokenType = nextToken.tokenType;\n            if (utils_1.contains(allPossibleReSyncTokTypes, nextTokenType)) {\n                return nextTokenType;\n            }\n            nextToken = this.LA(k);\n            k++;\n        }\n    };\n    Recoverable.prototype.getCurrFollowKey = function () {\n        // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n        if (this.RULE_STACK.length === 1) {\n            return exports.EOF_FOLLOW_KEY;\n        }\n        var currRuleShortName = this.getLastExplicitRuleShortName();\n        var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n        var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n        return {\n            ruleName: this.shortRuleNameToFullName(currRuleShortName),\n            idxInCallingRule: currRuleIdx,\n            inRule: this.shortRuleNameToFullName(prevRuleShortName)\n        };\n    };\n    Recoverable.prototype.buildFullFollowKeyStack = function () {\n        var _this = this;\n        var explicitRuleStack = this.RULE_STACK;\n        var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n        if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) {\n            explicitRuleStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_STACK[idx]; });\n            explicitOccurrenceStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_OCCURRENCE_STACK[idx]; });\n        }\n        // TODO: only iterate over explicit rules here\n        return utils_1.map(explicitRuleStack, function (ruleName, idx) {\n            if (idx === 0) {\n                return exports.EOF_FOLLOW_KEY;\n            }\n            return {\n                ruleName: _this.shortRuleNameToFullName(ruleName),\n                idxInCallingRule: explicitOccurrenceStack[idx],\n                inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n            };\n        });\n    };\n    Recoverable.prototype.flattenFollowSet = function () {\n        var _this = this;\n        var followStack = utils_1.map(this.buildFullFollowKeyStack(), function (currKey) {\n            return _this.getFollowSetFromFollowKey(currKey);\n        });\n        return utils_1.flatten(followStack);\n    };\n    Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n        if (followKey === exports.EOF_FOLLOW_KEY) {\n            return [tokens_public_1.EOF];\n        }\n        var followName = followKey.ruleName +\n            followKey.idxInCallingRule +\n            constants_1.IN +\n            followKey.inRule;\n        return this.resyncFollows[followName];\n    };\n    // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n    // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n    Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n        if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n            resyncTokens.push(token);\n        }\n        return resyncTokens;\n    };\n    Recoverable.prototype.reSyncTo = function (tokType) {\n        var resyncedTokens = [];\n        var nextTok = this.LA(1);\n        while (this.tokenMatcher(nextTok, tokType) === false) {\n            nextTok = this.SKIP_TOKEN();\n            this.addToResyncTokens(nextTok, resyncedTokens);\n        }\n        // the last token is not part of the error.\n        return utils_1.dropRight(resyncedTokens);\n    };\n    Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n        // by default this is a NO-OP\n        // The actual implementation is with the function(not method) below\n    };\n    Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n        var pathRuleStack = this.getHumanReadableRuleStack();\n        var pathOccurrenceStack = utils_1.cloneArr(this.RULE_OCCURRENCE_STACK);\n        var grammarPath = {\n            ruleStack: pathRuleStack,\n            occurrenceStack: pathOccurrenceStack,\n            lastTok: tokType,\n            lastTokOccurrence: tokIdxInRule\n        };\n        return grammarPath;\n    };\n    Recoverable.prototype.getHumanReadableRuleStack = function () {\n        var _this = this;\n        if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) {\n            return utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (currIdx) {\n                return _this.shortRuleNameToFullName(_this.RULE_STACK[currIdx]);\n            });\n        }\n        else {\n            return utils_1.map(this.RULE_STACK, function (currShortName) {\n                return _this.shortRuleNameToFullName(currShortName);\n            });\n        }\n    };\n    return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n    var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n    var firstAfterRepInfo = this.firstAfterRepMap[key];\n    if (firstAfterRepInfo === undefined) {\n        var currRuleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[currRuleName];\n        var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n        firstAfterRepInfo = walker.startWalking();\n        this.firstAfterRepMap[key] = firstAfterRepInfo;\n    }\n    var expectTokAfterLastMatch = firstAfterRepInfo.token;\n    var nextTokIdx = firstAfterRepInfo.occurrence;\n    var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n    // special edge case of a TOP most repetition after which the input should END.\n    // this will force an attempt for inRule recovery in that scenario.\n    if (this.RULE_STACK.length === 1 &&\n        isEndOfRule &&\n        expectTokAfterLastMatch === undefined) {\n        expectTokAfterLastMatch = tokens_public_1.EOF;\n        nextTokIdx = 1;\n    }\n    if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n        // TODO: performance optimization: instead of passing the original args here, we modify\n        // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n        // to avoid searching the cache for it once more.\n        this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n    }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nfunction classNameFromInstance(instance) {\n    return functionName(instance.constructor);\n}\nexports.classNameFromInstance = classNameFromInstance;\nvar FUNC_NAME_REGEXP = /^\\s*function\\s*(\\S*)\\s*\\(/;\nvar NAME = \"name\";\n/* istanbul ignore next too many hacks for IE/old versions of node.js here*/\nfunction functionName(func) {\n    // Engines that support Function.prototype.name OR the nth (n>1) time after\n    // the name has been computed in the following else block.\n    var existingNameProp = func.name;\n    if (existingNameProp) {\n        return existingNameProp;\n    }\n    // hack for IE and engines that do not support Object.defineProperty on function.name (Node.js 0.10 && 0.12)\n    var computedName = func.toString().match(FUNC_NAME_REGEXP)[1];\n    return computedName;\n}\nexports.functionName = functionName;\n/**\n * @returns {boolean} - has the property been successfully defined\n */\nfunction defineNameProp(obj, nameValue) {\n    var namePropDescriptor = Object.getOwnPropertyDescriptor(obj, NAME);\n    /* istanbul ignore else -> will only run in old versions of node.js */\n    if (utils_1.isUndefined(namePropDescriptor) || namePropDescriptor.configurable) {\n        Object.defineProperty(obj, NAME, {\n            enumerable: false,\n            configurable: true,\n            writable: false,\n            value: nameValue\n        });\n        return true;\n    }\n    /* istanbul ignore next -> will only run in old versions of node.js */\n    return false;\n}\nexports.defineNameProp = defineNameProp;\n//# sourceMappingURL=lang_extensions.js.map\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar rest_1 = __webpack_require__(14);\nvar first_1 = __webpack_require__(22);\nvar utils_1 = __webpack_require__(0);\nvar constants_1 = __webpack_require__(23);\nvar gast_public_1 = __webpack_require__(1);\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n    __extends(ResyncFollowsWalker, _super);\n    function ResyncFollowsWalker(topProd) {\n        var _this = _super.call(this) || this;\n        _this.topProd = topProd;\n        _this.follows = {};\n        return _this;\n    }\n    ResyncFollowsWalker.prototype.startWalking = function () {\n        this.walk(this.topProd);\n        return this.follows;\n    };\n    ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n        // do nothing! just like in the public sector after 13:00\n    };\n    ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n        var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n            this.topProd.name;\n        var fullRest = currRest.concat(prevRest);\n        var restProd = new gast_public_1.Flat({ definition: fullRest });\n        var t_in_topProd_follows = first_1.first(restProd);\n        this.follows[followName] = t_in_topProd_follows;\n    };\n    return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n    var reSyncFollows = {};\n    utils_1.forEach(topProductions, function (topProd) {\n        var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n        utils_1.assign(reSyncFollows, currRefsFollow);\n    });\n    return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n    return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n    var terminalName = terminal.terminalType.name;\n    return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regexp_to_ast_1 = __webpack_require__(15);\nvar utils_1 = __webpack_require__(0);\nvar reg_exp_parser_1 = __webpack_require__(16);\nvar lexer_1 = __webpack_require__(20);\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n    if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n    try {\n        var ast = reg_exp_parser_1.getRegExpAst(regExp);\n        var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n        return firstChars;\n    }\n    catch (e) {\n        /* istanbul ignore next */\n        // Testing this relies on the regexp-to-ast library having a bug... */\n        // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n        if (e.message === complementErrorMessage) {\n            if (ensureOptimizations) {\n                utils_1.PRINT_WARNING(\"\" + exports.failedOptimizationPrefixMsg +\n                    (\"\\tUnable to optimize: < \" + regExp.toString() + \" >\\n\") +\n                    \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n                    \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                    \"\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n            }\n        }\n        else {\n            var msgSuffix = \"\";\n            if (ensureOptimizations) {\n                msgSuffix =\n                    \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n                        \"\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n            }\n            utils_1.PRINT_ERROR(exports.failedOptimizationPrefixMsg + \"\\n\" +\n                (\"\\tFailed parsing: < \" + regExp.toString() + \" >\\n\") +\n                (\"\\tUsing the regexp-to-ast library version: \" + regexp_to_ast_1.VERSION + \"\\n\") +\n                \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n                msgSuffix);\n        }\n    }\n    return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n    switch (ast.type) {\n        case \"Disjunction\":\n            for (var i = 0; i < ast.value.length; i++) {\n                firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n            }\n            break;\n        case \"Alternative\":\n            var terms = ast.value;\n            for (var i = 0; i < terms.length; i++) {\n                var term = terms[i];\n                // skip terms that cannot effect the first char results\n                switch (term.type) {\n                    case \"EndAnchor\":\n                    // A group back reference cannot affect potential starting char.\n                    // because if a back reference is the first production than automatically\n                    // the group being referenced has had to come BEFORE so its codes have already been added\n                    case \"GroupBackReference\":\n                    // assertions do not affect potential starting codes\n                    case \"Lookahead\":\n                    case \"NegativeLookahead\":\n                    case \"StartAnchor\":\n                    case \"WordBoundary\":\n                    case \"NonWordBoundary\":\n                        continue;\n                }\n                var atom = term;\n                switch (atom.type) {\n                    case \"Character\":\n                        addOptimizedIdxToResult(atom.value, result, ignoreCase);\n                        break;\n                    case \"Set\":\n                        if (atom.complement === true) {\n                            throw Error(complementErrorMessage);\n                        }\n                        utils_1.forEach(atom.value, function (code) {\n                            if (typeof code === \"number\") {\n                                addOptimizedIdxToResult(code, result, ignoreCase);\n                            }\n                            else {\n                                // range\n                                var range = code;\n                                // cannot optimize when ignoreCase is\n                                if (ignoreCase === true) {\n                                    for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n                                        addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n                                    }\n                                }\n                                // Optimization (2 orders of magnitude less work for very large ranges)\n                                else {\n                                    // handle unoptimized values\n                                    for (var rangeCode = range.from; rangeCode <= range.to &&\n                                        rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n                                        addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n                                    }\n                                    // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n                                    if (range.to >= lexer_1.minOptimizationVal) {\n                                        var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n                                            ? range.from\n                                            : lexer_1.minOptimizationVal;\n                                        var maxUnOptVal = range.to;\n                                        var minOptIdx = lexer_1.charCodeToOptimizedIndex(minUnOptVal);\n                                        var maxOptIdx = lexer_1.charCodeToOptimizedIndex(maxUnOptVal);\n                                        for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n                                            result[currOptIdx] = currOptIdx;\n                                        }\n                                    }\n                                }\n                            }\n                        });\n                        break;\n                    case \"Group\":\n                        firstCharOptimizedIndices(atom.value, result, ignoreCase);\n                        break;\n                    /* istanbul ignore next */\n                    default:\n                        throw Error(\"Non Exhaustive Match\");\n                }\n                // reached a mandatory production, no more **start** codes can be found on this alternative\n                var isOptionalQuantifier = atom.quantifier !== undefined &&\n                    atom.quantifier.atLeast === 0;\n                if (\n                // A group may be optional due to empty contents /(?:)/\n                // or if everything inside it is optional /((a)?)/\n                (atom.type === \"Group\" &&\n                    isWholeOptional(atom) === false) ||\n                    // If this term is not a group it may only be optional if it has an optional quantifier\n                    (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n                    break;\n                }\n            }\n            break;\n        /* istanbul ignore next */\n        default:\n            throw Error(\"non exhaustive match!\");\n    }\n    // console.log(Object.keys(result).length)\n    return utils_1.values(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n    var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(code);\n    result[optimizedCharIdx] = optimizedCharIdx;\n    if (ignoreCase === true) {\n        handleIgnoreCase(code, result);\n    }\n}\nfunction handleIgnoreCase(code, result) {\n    var char = String.fromCharCode(code);\n    var upperChar = char.toUpperCase();\n    /* istanbul ignore else */\n    if (upperChar !== char) {\n        var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(upperChar.charCodeAt(0));\n        result[optimizedCharIdx] = optimizedCharIdx;\n    }\n    else {\n        var lowerChar = char.toLowerCase();\n        if (lowerChar !== char) {\n            var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(lowerChar.charCodeAt(0));\n            result[optimizedCharIdx] = optimizedCharIdx;\n        }\n    }\n}\nfunction findCode(setNode, targetCharCodes) {\n    return utils_1.find(setNode.value, function (codeOrRange) {\n        if (typeof codeOrRange === \"number\") {\n            return utils_1.contains(targetCharCodes, codeOrRange);\n        }\n        else {\n            // range\n            var range_1 = codeOrRange;\n            return (utils_1.find(targetCharCodes, function (targetCode) {\n                return range_1.from <= targetCode && targetCode <= range_1.to;\n            }) !== undefined);\n        }\n    });\n}\nfunction isWholeOptional(ast) {\n    if (ast.quantifier && ast.quantifier.atLeast === 0) {\n        return true;\n    }\n    if (!ast.value) {\n        return false;\n    }\n    return utils_1.isArray(ast.value)\n        ? utils_1.every(ast.value, isWholeOptional)\n        : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n    __extends(CharCodeFinder, _super);\n    function CharCodeFinder(targetCharCodes) {\n        var _this = _super.call(this) || this;\n        _this.targetCharCodes = targetCharCodes;\n        _this.found = false;\n        return _this;\n    }\n    CharCodeFinder.prototype.visitChildren = function (node) {\n        // No need to keep looking...\n        if (this.found === true) {\n            return;\n        }\n        // switch lookaheads as they do not actually consume any characters thus\n        // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n        switch (node.type) {\n            case \"Lookahead\":\n                this.visitLookahead(node);\n                return;\n            case \"NegativeLookahead\":\n                this.visitNegativeLookahead(node);\n                return;\n        }\n        _super.prototype.visitChildren.call(this, node);\n    };\n    CharCodeFinder.prototype.visitCharacter = function (node) {\n        if (utils_1.contains(this.targetCharCodes, node.value)) {\n            this.found = true;\n        }\n    };\n    CharCodeFinder.prototype.visitSet = function (node) {\n        if (node.complement) {\n            if (findCode(node, this.targetCharCodes) === undefined) {\n                this.found = true;\n            }\n        }\n        else {\n            if (findCode(node, this.targetCharCodes) !== undefined) {\n                this.found = true;\n            }\n        }\n    };\n    return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n    if (pattern instanceof RegExp) {\n        var ast = reg_exp_parser_1.getRegExpAst(pattern);\n        var charCodeFinder = new CharCodeFinder(charCodes);\n        charCodeFinder.visit(ast);\n        return charCodeFinder.found;\n    }\n    else {\n        return (utils_1.find(pattern, function (char) {\n            return utils_1.contains(charCodes, char.charCodeAt(0));\n        }) !== undefined);\n    }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar parser_1 = __webpack_require__(2);\nvar utils_1 = __webpack_require__(0);\nvar gast_visitor_public_1 = __webpack_require__(4);\nfunction resolveGrammar(topLevels, errMsgProvider) {\n    var refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);\n    refResolver.resolveRefs();\n    return refResolver.errors;\n}\nexports.resolveGrammar = resolveGrammar;\nvar GastRefResolverVisitor = /** @class */ (function (_super) {\n    __extends(GastRefResolverVisitor, _super);\n    function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {\n        var _this = _super.call(this) || this;\n        _this.nameToTopRule = nameToTopRule;\n        _this.errMsgProvider = errMsgProvider;\n        _this.errors = [];\n        return _this;\n    }\n    GastRefResolverVisitor.prototype.resolveRefs = function () {\n        var _this = this;\n        utils_1.forEach(utils_1.values(this.nameToTopRule), function (prod) {\n            _this.currTopLevel = prod;\n            prod.accept(_this);\n        });\n    };\n    GastRefResolverVisitor.prototype.visitNonTerminal = function (node) {\n        var ref = this.nameToTopRule[node.nonTerminalName];\n        if (!ref) {\n            var msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node);\n            this.errors.push({\n                message: msg,\n                type: parser_1.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n                ruleName: this.currTopLevel.name,\n                unresolvedRefName: node.nonTerminalName\n            });\n        }\n        else {\n            node.referencedRule = ref;\n        }\n    };\n    return GastRefResolverVisitor;\n}(gast_visitor_public_1.GAstVisitor));\nexports.GastRefResolverVisitor = GastRefResolverVisitor;\n//# sourceMappingURL=resolver.js.map\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar lookahead_1 = __webpack_require__(12);\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\nvar keys_1 = __webpack_require__(7);\nvar gast_1 = __webpack_require__(6);\n/**\n * Trait responsible for the lookahead related utilities and optimizations.\n */\nvar LooksAhead = /** @class */ (function () {\n    function LooksAhead() {\n    }\n    LooksAhead.prototype.initLooksAhead = function (config) {\n        this.dynamicTokensEnabled = utils_1.has(config, \"dynamicTokensEnabled\")\n            ? config.dynamicTokensEnabled\n            : parser_1.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled;\n        this.maxLookahead = utils_1.has(config, \"maxLookahead\")\n            ? config.maxLookahead\n            : parser_1.DEFAULT_PARSER_CONFIG.maxLookahead;\n        /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n        this.lookAheadFuncsCache = utils_1.isES2015MapSupported() ? new Map() : [];\n        // Performance optimization on newer engines that support ES6 Map\n        // For larger Maps this is slightly faster than using a plain object (array in our case).\n        /* istanbul ignore else - The else branch will be tested on older node.js versions and IE11 */\n        if (utils_1.isES2015MapSupported()) {\n            this.getLaFuncFromCache = this.getLaFuncFromMap;\n            this.setLaFuncCache = this.setLaFuncCacheUsingMap;\n        }\n        else {\n            this.getLaFuncFromCache = this.getLaFuncFromObj;\n            this.setLaFuncCache = this.setLaFuncUsingObj;\n        }\n    };\n    LooksAhead.prototype.preComputeLookaheadFunctions = function (rules) {\n        var _this = this;\n        utils_1.forEach(rules, function (currRule) {\n            _this.TRACE_INIT(currRule.name + \" Rule Lookahead\", function () {\n                var _a = gast_1.collectMethods(currRule), alternation = _a.alternation, repetition = _a.repetition, option = _a.option, repetitionMandatory = _a.repetitionMandatory, repetitionMandatoryWithSeparator = _a.repetitionMandatoryWithSeparator, repetitionWithSeparator = _a.repetitionWithSeparator;\n                utils_1.forEach(alternation, function (currProd) {\n                    var prodIdx = currProd.idx === 0 ? \"\" : currProd.idx;\n                    _this.TRACE_INIT(\"\" + gast_1.getProductionDslName(currProd) + prodIdx, function () {\n                        var laFunc = lookahead_1.buildLookaheadFuncForOr(currProd.idx, currRule, currProd.maxLookahead || _this.maxLookahead, currProd.hasPredicates, _this.dynamicTokensEnabled, _this.lookAheadBuilderForAlternatives);\n                        var key = keys_1.getKeyForAutomaticLookahead(_this.fullRuleNameToShort[currRule.name], keys_1.OR_IDX, currProd.idx);\n                        _this.setLaFuncCache(key, laFunc);\n                    });\n                });\n                utils_1.forEach(repetition, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_IDX, lookahead_1.PROD_TYPE.REPETITION, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(option, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.OPTION_IDX, lookahead_1.PROD_TYPE.OPTION, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionMandatory, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_IDX, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionMandatoryWithSeparator, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_SEP_IDX, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n                utils_1.forEach(repetitionWithSeparator, function (currProd) {\n                    _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_SEP_IDX, lookahead_1.PROD_TYPE.REPETITION_WITH_SEPARATOR, currProd.maxLookahead, gast_1.getProductionDslName(currProd));\n                });\n            });\n        });\n    };\n    LooksAhead.prototype.computeLookaheadFunc = function (rule, prodOccurrence, prodKey, prodType, prodMaxLookahead, dslMethodName) {\n        var _this = this;\n        this.TRACE_INIT(\"\" + dslMethodName + (prodOccurrence === 0 ? \"\" : prodOccurrence), function () {\n            var laFunc = lookahead_1.buildLookaheadFuncForOptionalProd(prodOccurrence, rule, prodMaxLookahead || _this.maxLookahead, _this.dynamicTokensEnabled, prodType, _this.lookAheadBuilderForOptional);\n            var key = keys_1.getKeyForAutomaticLookahead(_this.fullRuleNameToShort[rule.name], prodKey, prodOccurrence);\n            _this.setLaFuncCache(key, laFunc);\n        });\n    };\n    LooksAhead.prototype.lookAheadBuilderForOptional = function (alt, tokenMatcher, dynamicTokensEnabled) {\n        return lookahead_1.buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled);\n    };\n    LooksAhead.prototype.lookAheadBuilderForAlternatives = function (alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n        return lookahead_1.buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n    };\n    // this actually returns a number, but it is always used as a string (object prop key)\n    LooksAhead.prototype.getKeyForAutomaticLookahead = function (dslMethodIdx, occurrence) {\n        var currRuleShortName = this.getLastExplicitRuleShortName();\n        return keys_1.getKeyForAutomaticLookahead(currRuleShortName, dslMethodIdx, occurrence);\n    };\n    /* istanbul ignore next */\n    LooksAhead.prototype.getLaFuncFromCache = function (key) {\n        return undefined;\n    };\n    LooksAhead.prototype.getLaFuncFromMap = function (key) {\n        return this.lookAheadFuncsCache.get(key);\n    };\n    /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n    LooksAhead.prototype.getLaFuncFromObj = function (key) {\n        return this.lookAheadFuncsCache[key];\n    };\n    /* istanbul ignore next */\n    LooksAhead.prototype.setLaFuncCache = function (key, value) { };\n    LooksAhead.prototype.setLaFuncCacheUsingMap = function (key, value) {\n        this.lookAheadFuncsCache.set(key, value);\n    };\n    /* istanbul ignore next - Using plain array as dictionary will be tested on older node.js versions and IE11 */\n    LooksAhead.prototype.setLaFuncUsingObj = function (key, value) {\n        this.lookAheadFuncsCache[key] = value;\n    };\n    return LooksAhead;\n}());\nexports.LooksAhead = LooksAhead;\n//# sourceMappingURL=looksahead.js.map\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar cst_1 = __webpack_require__(17);\nvar utils_1 = __webpack_require__(0);\nvar cst_visitor_1 = __webpack_require__(32);\nvar keys_1 = __webpack_require__(7);\nvar parser_1 = __webpack_require__(2);\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n    function TreeBuilder() {\n    }\n    TreeBuilder.prototype.initTreeBuilder = function (config) {\n        this.LAST_EXPLICIT_RULE_STACK = [];\n        this.CST_STACK = [];\n        this.outputCst = utils_1.has(config, \"outputCst\")\n            ? config.outputCst\n            : parser_1.DEFAULT_PARSER_CONFIG.outputCst;\n        this.nodeLocationTracking = utils_1.has(config, \"nodeLocationTracking\")\n            ? config.nodeLocationTracking\n            : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n        if (!this.outputCst) {\n            this.cstInvocationStateUpdate = utils_1.NOOP;\n            this.cstFinallyStateUpdate = utils_1.NOOP;\n            this.cstPostTerminal = utils_1.NOOP;\n            this.cstPostNonTerminal = utils_1.NOOP;\n            this.cstPostRule = utils_1.NOOP;\n            this.getLastExplicitRuleShortName = this.getLastExplicitRuleShortNameNoCst;\n            this.getPreviousExplicitRuleShortName = this.getPreviousExplicitRuleShortNameNoCst;\n            this.getLastExplicitRuleOccurrenceIndex = this.getLastExplicitRuleOccurrenceIndexNoCst;\n            this.manyInternal = this.manyInternalNoCst;\n            this.orInternal = this.orInternalNoCst;\n            this.optionInternal = this.optionInternalNoCst;\n            this.atLeastOneInternal = this.atLeastOneInternalNoCst;\n            this.manySepFirstInternal = this.manySepFirstInternalNoCst;\n            this.atLeastOneSepFirstInternal = this.atLeastOneSepFirstInternalNoCst;\n        }\n        else {\n            if (/full/i.test(this.nodeLocationTracking)) {\n                if (this.recoveryEnabled) {\n                    this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n                    this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n                    this.cstPostRule = utils_1.NOOP;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n                }\n                else {\n                    this.setNodeLocationFromToken = utils_1.NOOP;\n                    this.setNodeLocationFromNode = utils_1.NOOP;\n                    this.cstPostRule = this.cstPostRuleFull;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n                }\n            }\n            else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n                if (this.recoveryEnabled) {\n                    this.setNodeLocationFromToken = (cst_1.setNodeLocationOnlyOffset);\n                    this.setNodeLocationFromNode = (cst_1.setNodeLocationOnlyOffset);\n                    this.cstPostRule = utils_1.NOOP;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRecovery;\n                }\n                else {\n                    this.setNodeLocationFromToken = utils_1.NOOP;\n                    this.setNodeLocationFromNode = utils_1.NOOP;\n                    this.cstPostRule = this.cstPostRuleOnlyOffset;\n                    this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRegular;\n                }\n            }\n            else if (/none/i.test(this.nodeLocationTracking)) {\n                this.setNodeLocationFromToken = utils_1.NOOP;\n                this.setNodeLocationFromNode = utils_1.NOOP;\n                this.cstPostRule = utils_1.NOOP;\n                this.setInitialNodeLocation = utils_1.NOOP;\n            }\n            else {\n                throw Error(\"Invalid <nodeLocationTracking> config option: \\\"\" + config.nodeLocationTracking + \"\\\"\");\n            }\n        }\n    };\n    TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n        cstNode.location = {\n            startOffset: NaN,\n            endOffset: NaN\n        };\n    };\n    TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n        cstNode.location = {\n            // without error recovery the starting Location of a new CstNode is guaranteed\n            // To be the next Token's startOffset (for valid inputs).\n            // For invalid inputs there won't be any CSTOutput so this potential\n            // inaccuracy does not matter\n            startOffset: this.LA(1).startOffset,\n            endOffset: NaN\n        };\n    };\n    TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n        cstNode.location = {\n            startOffset: NaN,\n            startLine: NaN,\n            startColumn: NaN,\n            endOffset: NaN,\n            endLine: NaN,\n            endColumn: NaN\n        };\n    };\n    /**\n     *  @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n\n     * @param cstNode\n     */\n    TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n        var nextToken = this.LA(1);\n        cstNode.location = {\n            startOffset: nextToken.startOffset,\n            startLine: nextToken.startLine,\n            startColumn: nextToken.startColumn,\n            endOffset: NaN,\n            endLine: NaN,\n            endColumn: NaN\n        };\n    };\n    // CST\n    TreeBuilder.prototype.cstNestedInvocationStateUpdate = function (nestedName, shortName) {\n        var cstNode = {\n            name: nestedName,\n            fullName: this.shortRuleNameToFull[this.getLastExplicitRuleShortName()] +\n                nestedName,\n            children: {}\n        };\n        this.setInitialNodeLocation(cstNode);\n        this.CST_STACK.push(cstNode);\n    };\n    TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName, shortName) {\n        this.LAST_EXPLICIT_RULE_STACK.push(this.RULE_STACK.length - 1);\n        var cstNode = {\n            name: fullRuleName,\n            children: {}\n        };\n        this.setInitialNodeLocation(cstNode);\n        this.CST_STACK.push(cstNode);\n    };\n    TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n        this.LAST_EXPLICIT_RULE_STACK.pop();\n        this.CST_STACK.pop();\n    };\n    TreeBuilder.prototype.cstNestedFinallyStateUpdate = function () {\n        var lastCstNode = this.CST_STACK.pop();\n        // TODO: the naming is bad, this should go directly to the\n        //       (correct) cstLocation update method\n        //       e.g if we put other logic in postRule...\n        this.cstPostRule(lastCstNode);\n    };\n    TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n        var prevToken = this.LA(0);\n        var loc = ruleCstNode.location;\n        // If this condition is true it means we consumed at least one Token\n        // In this CstNode or its nested children.\n        if (loc.startOffset <= prevToken.startOffset === true) {\n            loc.endOffset = prevToken.endOffset;\n            loc.endLine = prevToken.endLine;\n            loc.endColumn = prevToken.endColumn;\n        }\n        // \"empty\" CstNode edge case\n        else {\n            loc.startOffset = NaN;\n            loc.startLine = NaN;\n            loc.startColumn = NaN;\n        }\n    };\n    TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n        var prevToken = this.LA(0);\n        var loc = ruleCstNode.location;\n        // If this condition is true it means we consumed at least one Token\n        // In this CstNode or its nested children.\n        if (loc.startOffset <= prevToken.startOffset === true) {\n            loc.endOffset = prevToken.endOffset;\n        }\n        // \"empty\" CstNode edge case\n        else {\n            loc.startOffset = NaN;\n        }\n    };\n    TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n        var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n        cst_1.addTerminalToCst(rootCst, consumedToken, key);\n        // This is only used when **both** error recovery and CST Output are enabled.\n        this.setNodeLocationFromToken(rootCst.location, consumedToken);\n    };\n    TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n        // Avoid side effects due to back tracking\n        // TODO: This costs a 2-3% in performance, A flag on IParserConfig\n        //   could be used to get rid of this conditional, but not sure its worth the effort\n        //   and API complexity.\n        if (this.isBackTracking() !== true) {\n            var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n            cst_1.addNoneTerminalToCst(preCstNode, ruleName, ruleCstResult);\n            // This is only used when **both** error recovery and CST Output are enabled.\n            this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n        }\n    };\n    TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n        if (utils_1.isUndefined(this.baseCstVisitorConstructor)) {\n            var newBaseCstVisitorConstructor = cst_visitor_1.createBaseSemanticVisitorConstructor(this.className, this.allRuleNames);\n            this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n            return newBaseCstVisitorConstructor;\n        }\n        return this.baseCstVisitorConstructor;\n    };\n    TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n        if (utils_1.isUndefined(this.baseCstVisitorWithDefaultsConstructor)) {\n            var newConstructor = cst_visitor_1.createBaseVisitorConstructorWithDefaults(this.className, this.allRuleNames, this.getBaseCstVisitorConstructor());\n            this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n            return newConstructor;\n        }\n        return this.baseCstVisitorWithDefaultsConstructor;\n    };\n    TreeBuilder.prototype.nestedRuleBeforeClause = function (methodOpts, laKey) {\n        var nestedName;\n        if (methodOpts.NAME !== undefined) {\n            nestedName = methodOpts.NAME;\n            this.nestedRuleInvocationStateUpdate(nestedName, laKey);\n            return nestedName;\n        }\n        else {\n            return undefined;\n        }\n    };\n    TreeBuilder.prototype.nestedAltBeforeClause = function (methodOpts, occurrence, methodKeyIdx, altIdx) {\n        var ruleIdx = this.getLastExplicitRuleShortName();\n        var shortName = keys_1.getKeyForAltIndex(ruleIdx, methodKeyIdx, occurrence, altIdx);\n        var nestedName;\n        if (methodOpts.NAME !== undefined) {\n            nestedName = methodOpts.NAME;\n            this.nestedRuleInvocationStateUpdate(nestedName, shortName);\n            return {\n                shortName: shortName,\n                nestedName: nestedName\n            };\n        }\n        else {\n            return undefined;\n        }\n    };\n    TreeBuilder.prototype.nestedRuleFinallyClause = function (laKey, nestedName) {\n        var cstStack = this.CST_STACK;\n        var nestedRuleCst = cstStack[cstStack.length - 1];\n        this.nestedRuleFinallyStateUpdate();\n        // this return a different result than the previous invocation because \"nestedRuleFinallyStateUpdate\" pops the cst stack\n        var parentCstNode = cstStack[cstStack.length - 1];\n        cst_1.addNoneTerminalToCst(parentCstNode, nestedName, nestedRuleCst);\n        this.setNodeLocationFromNode(parentCstNode.location, nestedRuleCst.location);\n    };\n    TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n        var lastExplictIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1];\n        return this.RULE_STACK[lastExplictIndex];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleShortNameNoCst = function () {\n        var ruleStack = this.RULE_STACK;\n        return ruleStack[ruleStack.length - 1];\n    };\n    TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n        var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 2];\n        return this.RULE_STACK[lastExplicitIndex];\n    };\n    TreeBuilder.prototype.getPreviousExplicitRuleShortNameNoCst = function () {\n        var ruleStack = this.RULE_STACK;\n        return ruleStack[ruleStack.length - 2];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n        var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1];\n        return this.RULE_OCCURRENCE_STACK[lastExplicitIndex];\n    };\n    TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndexNoCst = function () {\n        var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n        return occurrenceStack[occurrenceStack.length - 1];\n    };\n    TreeBuilder.prototype.nestedRuleInvocationStateUpdate = function (nestedRuleName, shortNameKey) {\n        this.RULE_OCCURRENCE_STACK.push(1);\n        this.RULE_STACK.push(shortNameKey);\n        this.cstNestedInvocationStateUpdate(nestedRuleName, shortNameKey);\n    };\n    TreeBuilder.prototype.nestedRuleFinallyStateUpdate = function () {\n        this.RULE_STACK.pop();\n        this.RULE_OCCURRENCE_STACK.pop();\n        // NOOP when cst is disabled\n        this.cstNestedFinallyStateUpdate();\n    };\n    return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar lang_extensions_1 = __webpack_require__(26);\nvar checks_1 = __webpack_require__(11);\nfunction defaultVisit(ctx, param) {\n    var childrenNames = utils_1.keys(ctx);\n    var childrenNamesLength = childrenNames.length;\n    for (var i = 0; i < childrenNamesLength; i++) {\n        var currChildName = childrenNames[i];\n        var currChildArray = ctx[currChildName];\n        var currChildArrayLength = currChildArray.length;\n        for (var j = 0; j < currChildArrayLength; j++) {\n            var currChild = currChildArray[j];\n            // distinction between Tokens Children and CstNode children\n            if (currChild.tokenTypeIdx === undefined) {\n                if (currChild.fullName !== undefined) {\n                    this[currChild.fullName](currChild.children, param);\n                }\n                else {\n                    this[currChild.name](currChild.children, param);\n                }\n            }\n        }\n    }\n    // defaultVisit does not support generic out param\n    return undefined;\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n    var derivedConstructor = function () { };\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    lang_extensions_1.defineNameProp(derivedConstructor, grammarName + \"BaseSemantics\");\n    var semanticProto = {\n        visit: function (cstNode, param) {\n            // enables writing more concise visitor methods when CstNode has only a single child\n            if (utils_1.isArray(cstNode)) {\n                // A CST Node's children dictionary can never have empty arrays as values\n                // If a key is defined there will be at least one element in the corresponding value array.\n                cstNode = cstNode[0];\n            }\n            // enables passing optional CstNodes concisely.\n            if (utils_1.isUndefined(cstNode)) {\n                return undefined;\n            }\n            if (cstNode.fullName !== undefined) {\n                return this[cstNode.fullName](cstNode.children, param);\n            }\n            else {\n                return this[cstNode.name](cstNode.children, param);\n            }\n        },\n        validateVisitor: function () {\n            var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n            if (!utils_1.isEmpty(semanticDefinitionErrors)) {\n                var errorMessages = utils_1.map(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n                throw Error(\"Errors Detected in CST Visitor <\" + lang_extensions_1.functionName(this.constructor) + \">:\\n\\t\" +\n                    (\"\" + errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n            }\n        }\n    };\n    derivedConstructor.prototype = semanticProto;\n    derivedConstructor.prototype.constructor = derivedConstructor;\n    derivedConstructor._RULE_NAMES = ruleNames;\n    return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n    var derivedConstructor = function () { };\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    lang_extensions_1.defineNameProp(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n    var withDefaultsProto = Object.create(baseConstructor.prototype);\n    utils_1.forEach(ruleNames, function (ruleName) {\n        withDefaultsProto[ruleName] = defaultVisit;\n    });\n    derivedConstructor.prototype = withDefaultsProto;\n    derivedConstructor.prototype.constructor = derivedConstructor;\n    return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n    CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n    CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n    var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n    var redundantErrors = validateRedundantMethods(visitorInstance, ruleNames);\n    return missingErrors.concat(redundantErrors);\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n    var errors = utils_1.map(ruleNames, function (currRuleName) {\n        if (!utils_1.isFunction(visitorInstance[currRuleName])) {\n            return {\n                msg: \"Missing visitor method: <\" + currRuleName + \"> on \" + lang_extensions_1.functionName(visitorInstance.constructor) + \" CST Visitor.\",\n                type: CstVisitorDefinitionError.MISSING_METHOD,\n                methodName: currRuleName\n            };\n        }\n    });\n    return utils_1.compact(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\nvar VALID_PROP_NAMES = [\"constructor\", \"visit\", \"validateVisitor\"];\nfunction validateRedundantMethods(visitorInstance, ruleNames) {\n    var errors = [];\n    for (var prop in visitorInstance) {\n        if (checks_1.validTermsPattern.test(prop) &&\n            utils_1.isFunction(visitorInstance[prop]) &&\n            !utils_1.contains(VALID_PROP_NAMES, prop) &&\n            !utils_1.contains(ruleNames, prop)) {\n            errors.push({\n                msg: \"Redundant visitor method: <\" + prop + \"> on \" + lang_extensions_1.functionName(visitorInstance.constructor) + \" CST Visitor\\n\" +\n                    \"There is no Grammar Rule corresponding to this method's name.\\n\" +\n                    (\"For utility methods on visitor classes use methods names that do not match /\" + checks_1.validTermsPattern.source + \"/.\"),\n                type: CstVisitorDefinitionError.REDUNDANT_METHOD,\n                methodName: prop\n            });\n        }\n    }\n    return errors;\n}\nexports.validateRedundantMethods = validateRedundantMethods;\n//# sourceMappingURL=cst_visitor.js.map\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n *\n * This could be generalized to support other kinds of lexers, e.g.\n * - Just in Time Lexing / Lexer-Less parsing.\n * - Streaming Lexer.\n */\nvar LexerAdapter = /** @class */ (function () {\n    function LexerAdapter() {\n    }\n    LexerAdapter.prototype.initLexerAdapter = function () {\n        this.tokVector = [];\n        this.tokVectorLength = 0;\n        this.currIdx = -1;\n    };\n    Object.defineProperty(LexerAdapter.prototype, \"input\", {\n        get: function () {\n            return this.tokVector;\n        },\n        set: function (newInput) {\n            if (this.selfAnalysisDone !== true) {\n                throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");\n            }\n            this.reset();\n            this.tokVector = newInput;\n            this.tokVectorLength = newInput.length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // skips a token and returns the next token\n    LexerAdapter.prototype.SKIP_TOKEN = function () {\n        if (this.currIdx <= this.tokVector.length - 2) {\n            this.consumeToken();\n            return this.LA(1);\n        }\n        else {\n            return parser_1.END_OF_FILE;\n        }\n    };\n    // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n    // or lexers dependent on parser context.\n    LexerAdapter.prototype.LA = function (howMuch) {\n        var soughtIdx = this.currIdx + howMuch;\n        if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n            return parser_1.END_OF_FILE;\n        }\n        else {\n            return this.tokVector[soughtIdx];\n        }\n    };\n    LexerAdapter.prototype.consumeToken = function () {\n        this.currIdx++;\n    };\n    LexerAdapter.prototype.exportLexerState = function () {\n        return this.currIdx;\n    };\n    LexerAdapter.prototype.importLexerState = function (newState) {\n        this.currIdx = newState;\n    };\n    LexerAdapter.prototype.resetLexerState = function () {\n        this.currIdx = -1;\n    };\n    LexerAdapter.prototype.moveToTerminatedState = function () {\n        this.currIdx = this.tokVector.length - 1;\n    };\n    LexerAdapter.prototype.getLexerPosition = function () {\n        return this.exportLexerState();\n    };\n    return LexerAdapter;\n}());\nexports.LexerAdapter = LexerAdapter;\n//# sourceMappingURL=lexer_adapter.js.map\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar exceptions_public_1 = __webpack_require__(8);\nvar parser_1 = __webpack_require__(2);\nvar errors_public_1 = __webpack_require__(10);\nvar checks_1 = __webpack_require__(11);\nvar gast_public_1 = __webpack_require__(1);\n/**\n * This trait is responsible for implementing the public API\n * for defining Chevrotain parsers, i.e:\n * - CONSUME\n * - RULE\n * - OPTION\n * - ...\n */\nvar RecognizerApi = /** @class */ (function () {\n    function RecognizerApi() {\n    }\n    RecognizerApi.prototype.ACTION = function (impl) {\n        return impl.call(this);\n    };\n    RecognizerApi.prototype.consume = function (idx, tokType, options) {\n        return this.consumeInternal(tokType, idx, options);\n    };\n    RecognizerApi.prototype.subrule = function (idx, ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, idx, options);\n    };\n    RecognizerApi.prototype.option = function (idx, actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, idx);\n    };\n    RecognizerApi.prototype.or = function (idx, altsOrOpts) {\n        return this.orInternal(altsOrOpts, idx);\n    };\n    RecognizerApi.prototype.many = function (idx, actionORMethodDef) {\n        return this.manyInternal(idx, actionORMethodDef);\n    };\n    RecognizerApi.prototype.atLeastOne = function (idx, actionORMethodDef) {\n        return this.atLeastOneInternal(idx, actionORMethodDef);\n    };\n    RecognizerApi.prototype.CONSUME = function (tokType, options) {\n        return this.consumeInternal(tokType, 0, options);\n    };\n    RecognizerApi.prototype.CONSUME1 = function (tokType, options) {\n        return this.consumeInternal(tokType, 1, options);\n    };\n    RecognizerApi.prototype.CONSUME2 = function (tokType, options) {\n        return this.consumeInternal(tokType, 2, options);\n    };\n    RecognizerApi.prototype.CONSUME3 = function (tokType, options) {\n        return this.consumeInternal(tokType, 3, options);\n    };\n    RecognizerApi.prototype.CONSUME4 = function (tokType, options) {\n        return this.consumeInternal(tokType, 4, options);\n    };\n    RecognizerApi.prototype.CONSUME5 = function (tokType, options) {\n        return this.consumeInternal(tokType, 5, options);\n    };\n    RecognizerApi.prototype.CONSUME6 = function (tokType, options) {\n        return this.consumeInternal(tokType, 6, options);\n    };\n    RecognizerApi.prototype.CONSUME7 = function (tokType, options) {\n        return this.consumeInternal(tokType, 7, options);\n    };\n    RecognizerApi.prototype.CONSUME8 = function (tokType, options) {\n        return this.consumeInternal(tokType, 8, options);\n    };\n    RecognizerApi.prototype.CONSUME9 = function (tokType, options) {\n        return this.consumeInternal(tokType, 9, options);\n    };\n    RecognizerApi.prototype.SUBRULE = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 0, options);\n    };\n    RecognizerApi.prototype.SUBRULE1 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 1, options);\n    };\n    RecognizerApi.prototype.SUBRULE2 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 2, options);\n    };\n    RecognizerApi.prototype.SUBRULE3 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 3, options);\n    };\n    RecognizerApi.prototype.SUBRULE4 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 4, options);\n    };\n    RecognizerApi.prototype.SUBRULE5 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 5, options);\n    };\n    RecognizerApi.prototype.SUBRULE6 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 6, options);\n    };\n    RecognizerApi.prototype.SUBRULE7 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 7, options);\n    };\n    RecognizerApi.prototype.SUBRULE8 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 8, options);\n    };\n    RecognizerApi.prototype.SUBRULE9 = function (ruleToCall, options) {\n        return this.subruleInternal(ruleToCall, 9, options);\n    };\n    RecognizerApi.prototype.OPTION = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 0);\n    };\n    RecognizerApi.prototype.OPTION1 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 1);\n    };\n    RecognizerApi.prototype.OPTION2 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 2);\n    };\n    RecognizerApi.prototype.OPTION3 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 3);\n    };\n    RecognizerApi.prototype.OPTION4 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 4);\n    };\n    RecognizerApi.prototype.OPTION5 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 5);\n    };\n    RecognizerApi.prototype.OPTION6 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 6);\n    };\n    RecognizerApi.prototype.OPTION7 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 7);\n    };\n    RecognizerApi.prototype.OPTION8 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 8);\n    };\n    RecognizerApi.prototype.OPTION9 = function (actionORMethodDef) {\n        return this.optionInternal(actionORMethodDef, 9);\n    };\n    RecognizerApi.prototype.OR = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 0);\n    };\n    RecognizerApi.prototype.OR1 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 1);\n    };\n    RecognizerApi.prototype.OR2 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 2);\n    };\n    RecognizerApi.prototype.OR3 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 3);\n    };\n    RecognizerApi.prototype.OR4 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 4);\n    };\n    RecognizerApi.prototype.OR5 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 5);\n    };\n    RecognizerApi.prototype.OR6 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 6);\n    };\n    RecognizerApi.prototype.OR7 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 7);\n    };\n    RecognizerApi.prototype.OR8 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 8);\n    };\n    RecognizerApi.prototype.OR9 = function (altsOrOpts) {\n        return this.orInternal(altsOrOpts, 9);\n    };\n    RecognizerApi.prototype.MANY = function (actionORMethodDef) {\n        this.manyInternal(0, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY1 = function (actionORMethodDef) {\n        this.manyInternal(1, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY2 = function (actionORMethodDef) {\n        this.manyInternal(2, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY3 = function (actionORMethodDef) {\n        this.manyInternal(3, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY4 = function (actionORMethodDef) {\n        this.manyInternal(4, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY5 = function (actionORMethodDef) {\n        this.manyInternal(5, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY6 = function (actionORMethodDef) {\n        this.manyInternal(6, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY7 = function (actionORMethodDef) {\n        this.manyInternal(7, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY8 = function (actionORMethodDef) {\n        this.manyInternal(8, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY9 = function (actionORMethodDef) {\n        this.manyInternal(9, actionORMethodDef);\n    };\n    RecognizerApi.prototype.MANY_SEP = function (options) {\n        this.manySepFirstInternal(0, options);\n    };\n    RecognizerApi.prototype.MANY_SEP1 = function (options) {\n        this.manySepFirstInternal(1, options);\n    };\n    RecognizerApi.prototype.MANY_SEP2 = function (options) {\n        this.manySepFirstInternal(2, options);\n    };\n    RecognizerApi.prototype.MANY_SEP3 = function (options) {\n        this.manySepFirstInternal(3, options);\n    };\n    RecognizerApi.prototype.MANY_SEP4 = function (options) {\n        this.manySepFirstInternal(4, options);\n    };\n    RecognizerApi.prototype.MANY_SEP5 = function (options) {\n        this.manySepFirstInternal(5, options);\n    };\n    RecognizerApi.prototype.MANY_SEP6 = function (options) {\n        this.manySepFirstInternal(6, options);\n    };\n    RecognizerApi.prototype.MANY_SEP7 = function (options) {\n        this.manySepFirstInternal(7, options);\n    };\n    RecognizerApi.prototype.MANY_SEP8 = function (options) {\n        this.manySepFirstInternal(8, options);\n    };\n    RecognizerApi.prototype.MANY_SEP9 = function (options) {\n        this.manySepFirstInternal(9, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE = function (actionORMethodDef) {\n        this.atLeastOneInternal(0, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE1 = function (actionORMethodDef) {\n        return this.atLeastOneInternal(1, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE2 = function (actionORMethodDef) {\n        this.atLeastOneInternal(2, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE3 = function (actionORMethodDef) {\n        this.atLeastOneInternal(3, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE4 = function (actionORMethodDef) {\n        this.atLeastOneInternal(4, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE5 = function (actionORMethodDef) {\n        this.atLeastOneInternal(5, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE6 = function (actionORMethodDef) {\n        this.atLeastOneInternal(6, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE7 = function (actionORMethodDef) {\n        this.atLeastOneInternal(7, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE8 = function (actionORMethodDef) {\n        this.atLeastOneInternal(8, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE9 = function (actionORMethodDef) {\n        this.atLeastOneInternal(9, actionORMethodDef);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP = function (options) {\n        this.atLeastOneSepFirstInternal(0, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP1 = function (options) {\n        this.atLeastOneSepFirstInternal(1, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP2 = function (options) {\n        this.atLeastOneSepFirstInternal(2, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP3 = function (options) {\n        this.atLeastOneSepFirstInternal(3, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP4 = function (options) {\n        this.atLeastOneSepFirstInternal(4, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP5 = function (options) {\n        this.atLeastOneSepFirstInternal(5, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP6 = function (options) {\n        this.atLeastOneSepFirstInternal(6, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP7 = function (options) {\n        this.atLeastOneSepFirstInternal(7, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP8 = function (options) {\n        this.atLeastOneSepFirstInternal(8, options);\n    };\n    RecognizerApi.prototype.AT_LEAST_ONE_SEP9 = function (options) {\n        this.atLeastOneSepFirstInternal(9, options);\n    };\n    RecognizerApi.prototype.RULE = function (name, implementation, config) {\n        if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n        if (utils_1.contains(this.definedRulesNames, name)) {\n            var errMsg = errors_public_1.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n                topLevelRule: name,\n                grammarName: this.className\n            });\n            var error = {\n                message: errMsg,\n                type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n                ruleName: name\n            };\n            this.definitionErrors.push(error);\n        }\n        this.definedRulesNames.push(name);\n        var ruleImplementation = this.defineRule(name, implementation, config);\n        this[name] = ruleImplementation;\n        return ruleImplementation;\n    };\n    RecognizerApi.prototype.OVERRIDE_RULE = function (name, impl, config) {\n        if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n        var ruleErrors = [];\n        ruleErrors = ruleErrors.concat(checks_1.validateRuleIsOverridden(name, this.definedRulesNames, this.className));\n        this.definitionErrors.push.apply(this.definitionErrors, ruleErrors); // mutability for the win\n        var ruleImplementation = this.defineRule(name, impl, config);\n        this[name] = ruleImplementation;\n        return ruleImplementation;\n    };\n    RecognizerApi.prototype.BACKTRACK = function (grammarRule, args) {\n        return function () {\n            // save org state\n            this.isBackTrackingStack.push(1);\n            var orgState = this.saveRecogState();\n            try {\n                grammarRule.apply(this, args);\n                // if no exception was thrown we have succeed parsing the rule.\n                return true;\n            }\n            catch (e) {\n                if (exceptions_public_1.isRecognitionException(e)) {\n                    return false;\n                }\n                else {\n                    throw e;\n                }\n            }\n            finally {\n                this.reloadRecogState(orgState);\n                this.isBackTrackingStack.pop();\n            }\n        };\n    };\n    // GAST export APIs\n    RecognizerApi.prototype.getGAstProductions = function () {\n        return this.gastProductionsCache;\n    };\n    RecognizerApi.prototype.getSerializedGastProductions = function () {\n        return gast_public_1.serializeGrammar(utils_1.values(this.gastProductionsCache));\n    };\n    return RecognizerApi;\n}());\nexports.RecognizerApi = RecognizerApi;\n//# sourceMappingURL=recognizer_api.js.map\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar keys_1 = __webpack_require__(7);\nvar exceptions_public_1 = __webpack_require__(8);\nvar lookahead_1 = __webpack_require__(12);\nvar interpreter_1 = __webpack_require__(13);\nvar parser_1 = __webpack_require__(2);\nvar recoverable_1 = __webpack_require__(25);\nvar tokens_public_1 = __webpack_require__(3);\nvar tokens_1 = __webpack_require__(5);\nvar lang_extensions_1 = __webpack_require__(26);\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n    function RecognizerEngine() {\n    }\n    RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n        this.className = lang_extensions_1.classNameFromInstance(this);\n        // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n        this.shortRuleNameToFull = {};\n        this.fullRuleNameToShort = {};\n        this.ruleShortNameIdx = 256;\n        this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n        this.definedRulesNames = [];\n        this.tokensMap = {};\n        this.allRuleNames = [];\n        this.isBackTrackingStack = [];\n        this.RULE_STACK = [];\n        this.RULE_OCCURRENCE_STACK = [];\n        this.gastProductionsCache = {};\n        if (utils_1.has(config, \"serializedGrammar\")) {\n            throw Error(\"The Parser's configuration can no longer contain a <serializedGrammar> property.\\n\" +\n                \"\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n                \"\\tFor Further details.\");\n        }\n        if (utils_1.isArray(tokenVocabulary)) {\n            // This only checks for Token vocabularies provided as arrays.\n            // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n            // rather than all edge cases of empty Token vocabularies.\n            if (utils_1.isEmpty(tokenVocabulary)) {\n                throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n                    \"\\tNote that the first argument for the parser constructor\\n\" +\n                    \"\\tis no longer a Token vector (since v4.0).\");\n            }\n            if (typeof tokenVocabulary[0].startOffset === \"number\") {\n                throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n                    \"\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n                    \"\\tFor Further details.\");\n            }\n        }\n        if (utils_1.isArray(tokenVocabulary)) {\n            this.tokensMap = utils_1.reduce(tokenVocabulary, function (acc, tokType) {\n                acc[tokType.name] = tokType;\n                return acc;\n            }, {});\n        }\n        else if (utils_1.has(tokenVocabulary, \"modes\") &&\n            utils_1.every(utils_1.flatten(utils_1.values(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n            var allTokenTypes = utils_1.flatten(utils_1.values(tokenVocabulary.modes));\n            var uniqueTokens = utils_1.uniq(allTokenTypes);\n            this.tokensMap = utils_1.reduce(uniqueTokens, function (acc, tokType) {\n                acc[tokType.name] = tokType;\n                return acc;\n            }, {});\n        }\n        else if (utils_1.isObject(tokenVocabulary)) {\n            this.tokensMap = utils_1.cloneObj(tokenVocabulary);\n        }\n        else {\n            throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors,\" +\n                \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n        }\n        // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n        // parsed with a clear error message (\"expecting EOF but found ...\")\n        /* tslint:disable */\n        this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n        // TODO: This check may not be accurate for multi mode lexers\n        var noTokenCategoriesUsed = utils_1.every(utils_1.values(tokenVocabulary), function (tokenConstructor) { return utils_1.isEmpty(tokenConstructor.categoryMatches); });\n        this.tokenMatcher = noTokenCategoriesUsed\n            ? tokens_1.tokenStructuredMatcherNoCategories\n            : tokens_1.tokenStructuredMatcher;\n        // Because ES2015+ syntax should be supported for creating Token classes\n        // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n        // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n        tokens_1.augmentTokenTypes(utils_1.values(this.tokensMap));\n    };\n    RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n        if (this.selfAnalysisDone) {\n            throw Error(\"Grammar rule <\" + ruleName + \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\" +\n                \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n        }\n        var resyncEnabled = utils_1.has(config, \"resyncEnabled\")\n            ? config.resyncEnabled\n            : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n        var recoveryValueFunc = utils_1.has(config, \"recoveryValueFunc\")\n            ? config.recoveryValueFunc\n            : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n        // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n        // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n        /* tslint:disable */\n        var shortName = this.ruleShortNameIdx <<\n            (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n        /* tslint:enable */\n        this.ruleShortNameIdx++;\n        this.shortRuleNameToFull[shortName] = ruleName;\n        this.fullRuleNameToShort[ruleName] = shortName;\n        function invokeRuleWithTry(args) {\n            try {\n                if (this.outputCst === true) {\n                    impl.apply(this, args);\n                    var cst = this.CST_STACK[this.CST_STACK.length - 1];\n                    this.cstPostRule(cst);\n                    return cst;\n                }\n                else {\n                    return impl.apply(this, args);\n                }\n            }\n            catch (e) {\n                return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n            }\n            finally {\n                this.ruleFinallyStateUpdate();\n            }\n        }\n        var wrappedGrammarRule;\n        wrappedGrammarRule = function (idxInCallingRule, args) {\n            if (idxInCallingRule === void 0) { idxInCallingRule = 0; }\n            this.ruleInvocationStateUpdate(shortName, ruleName, idxInCallingRule);\n            return invokeRuleWithTry.call(this, args);\n        };\n        var ruleNamePropName = \"ruleName\";\n        wrappedGrammarRule[ruleNamePropName] = ruleName;\n        wrappedGrammarRule[\"originalGrammarAction\"] = impl;\n        return wrappedGrammarRule;\n    };\n    RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n        var isFirstInvokedRule = this.RULE_STACK.length === 1;\n        // note the reSync is always enabled for the first rule invocation, because we must always be able to\n        // reSync with EOF and just output some INVALID ParseTree\n        // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n        // path is really the most valid one\n        var reSyncEnabled = resyncEnabledConfig &&\n            !this.isBackTracking() &&\n            this.recoveryEnabled;\n        if (exceptions_public_1.isRecognitionException(e)) {\n            var recogError = e;\n            if (reSyncEnabled) {\n                var reSyncTokType = this.findReSyncTokenType();\n                if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n                    recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n                    if (this.outputCst) {\n                        var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n                        partialCstResult.recoveredNode = true;\n                        return partialCstResult;\n                    }\n                    else {\n                        return recoveryValueFunc();\n                    }\n                }\n                else {\n                    if (this.outputCst) {\n                        var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n                        partialCstResult.recoveredNode = true;\n                        recogError.partialCstResult = partialCstResult;\n                    }\n                    // to be handled Further up the call stack\n                    throw recogError;\n                }\n            }\n            else if (isFirstInvokedRule) {\n                // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n                this.moveToTerminatedState();\n                // the parser should never throw one of its own errors outside its flow.\n                // even if error recovery is disabled\n                return recoveryValueFunc();\n            }\n            else {\n                // to be recovered Further up the call stack\n                throw recogError;\n            }\n        }\n        else {\n            // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n            throw e;\n        }\n    };\n    // Implementation of parsing DSL\n    RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, key);\n        try {\n            return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(key, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.optionInternalNoCst = function (actionORMethodDef, occurrence) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n        return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n    };\n    RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n        var _this = this;\n        var lookAheadFunc = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_1 = lookAheadFunc;\n                lookAheadFunc = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_1.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        if (lookAheadFunc.call(this) === true) {\n            return action.call(this);\n        }\n        return undefined;\n    };\n    RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey);\n        try {\n            return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.atLeastOneInternalNoCst = function (prodOccurrence, actionORMethodDef) {\n        var key = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n        this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, key);\n    };\n    RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n        var _this = this;\n        var lookAheadFunc = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_2 = lookAheadFunc;\n                lookAheadFunc = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_2.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        if (lookAheadFunc.call(this) === true) {\n            var notStuck = this.doSingleRepetition(action);\n            while (lookAheadFunc.call(this) === true &&\n                notStuck === true) {\n                notStuck = this.doSingleRepetition(action);\n            }\n        }\n        else {\n            throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n        }\n        // note that while it may seem that this can cause an error because by using a recursive call to\n        // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n        // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(options, laKey);\n        try {\n            this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternalNoCst = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n        this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n    };\n    RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n        var _this = this;\n        var action = options.DEF;\n        var separator = options.SEP;\n        var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n        // 1st iteration\n        if (firstIterationLookaheadFunc.call(this) === true) {\n            ;\n            action.call(this);\n            //  TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n            //  because it is only needed in error recovery scenarios.\n            var separatorLookAheadFunc = function () {\n                return _this.tokenMatcher(_this.LA(1), separator);\n            };\n            // 2nd..nth iterations\n            while (this.tokenMatcher(this.LA(1), separator) === true) {\n                // note that this CONSUME will never enter recovery because\n                // the separatorLookAheadFunc checks that the separator really does exist.\n                this.CONSUME(separator);\n                action.call(this);\n            }\n            // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n            this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n                prodOccurrence,\n                separator,\n                separatorLookAheadFunc,\n                action,\n                interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n            ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n        }\n        else {\n            throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n        }\n    };\n    RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey);\n        try {\n            return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.manyInternalNoCst = function (prodOccurrence, actionORMethodDef) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n        return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n    };\n    RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n        var _this = this;\n        var lookaheadFunction = this.getLaFuncFromCache(key);\n        var action;\n        var predicate;\n        if (actionORMethodDef.DEF !== undefined) {\n            action = actionORMethodDef.DEF;\n            predicate = actionORMethodDef.GATE;\n            // predicate present\n            if (predicate !== undefined) {\n                var orgLookaheadFunction_3 = lookaheadFunction;\n                lookaheadFunction = function () {\n                    return (predicate.call(_this) && orgLookaheadFunction_3.call(_this));\n                };\n            }\n        }\n        else {\n            action = actionORMethodDef;\n        }\n        var notStuck = true;\n        while (lookaheadFunction.call(this) === true && notStuck === true) {\n            notStuck = this.doSingleRepetition(action);\n        }\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n        // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n        // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n        // An infinite loop cannot occur as:\n        // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n        // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n        notStuck);\n    };\n    RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n        var nestedName = this.nestedRuleBeforeClause(options, laKey);\n        try {\n            this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.manySepFirstInternalNoCst = function (prodOccurrence, options) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n        this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n    };\n    RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n        var _this = this;\n        var action = options.DEF;\n        var separator = options.SEP;\n        var firstIterationLaFunc = this.getLaFuncFromCache(key);\n        // 1st iteration\n        if (firstIterationLaFunc.call(this) === true) {\n            action.call(this);\n            var separatorLookAheadFunc = function () {\n                return _this.tokenMatcher(_this.LA(1), separator);\n            };\n            // 2nd..nth iterations\n            while (this.tokenMatcher(this.LA(1), separator) === true) {\n                // note that this CONSUME will never enter recovery because\n                // the separatorLookAheadFunc checks that the separator really does exist.\n                this.CONSUME(separator);\n                // No need for checking infinite loop here due to consuming the separator.\n                action.call(this);\n            }\n            // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n            this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n                prodOccurrence,\n                separator,\n                separatorLookAheadFunc,\n                action,\n                interpreter_1.NextTerminalAfterManySepWalker\n            ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n        }\n    };\n    RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n        while (separatorLookAheadFunc()) {\n            // note that this CONSUME will never enter recovery because\n            // the separatorLookAheadFunc checks that the separator really does exist.\n            this.CONSUME(separator);\n            action.call(this);\n        }\n        // we can only arrive to this function after an error\n        // has occurred (hence the name 'second') so the following\n        // IF will always be entered, its possible to remove it...\n        // however it is kept to avoid confusion and be consistent.\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        /* istanbul ignore else */\n        this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n            prodOccurrence,\n            separator,\n            separatorLookAheadFunc,\n            action,\n            nextTerminalAfterWalker\n        ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n    };\n    RecognizerEngine.prototype.doSingleRepetition = function (action) {\n        var beforeIteration = this.getLexerPosition();\n        action.call(this);\n        var afterIteration = this.getLexerPosition();\n        // This boolean will indicate if this repetition progressed\n        // or if we are \"stuck\" (potential infinite loop in the repetition).\n        return afterIteration > beforeIteration;\n    };\n    RecognizerEngine.prototype.orInternalNoCst = function (altsOrOpts, occurrence) {\n        var alts = utils_1.isArray(altsOrOpts)\n            ? altsOrOpts\n            : altsOrOpts.DEF;\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n        var laFunc = this.getLaFuncFromCache(laKey);\n        var altIdxToTake = laFunc.call(this, alts);\n        if (altIdxToTake !== undefined) {\n            var chosenAlternative = alts[altIdxToTake];\n            return chosenAlternative.ALT.call(this);\n        }\n        this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n    };\n    RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n        var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n        var nestedName = this.nestedRuleBeforeClause(altsOrOpts, laKey);\n        try {\n            var alts = utils_1.isArray(altsOrOpts)\n                ? altsOrOpts\n                : altsOrOpts.DEF;\n            var laFunc = this.getLaFuncFromCache(laKey);\n            var altIdxToTake = laFunc.call(this, alts);\n            if (altIdxToTake !== undefined) {\n                var chosenAlternative = alts[altIdxToTake];\n                var nestedAltBeforeClauseResult = this.nestedAltBeforeClause(chosenAlternative, occurrence, keys_1.OR_IDX, altIdxToTake);\n                try {\n                    return chosenAlternative.ALT.call(this);\n                }\n                finally {\n                    if (nestedAltBeforeClauseResult !== undefined) {\n                        this.nestedRuleFinallyClause(nestedAltBeforeClauseResult.shortName, nestedAltBeforeClauseResult.nestedName);\n                    }\n                }\n            }\n            this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n        }\n        finally {\n            if (nestedName !== undefined) {\n                this.nestedRuleFinallyClause(laKey, nestedName);\n            }\n        }\n    };\n    RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n        this.RULE_STACK.pop();\n        this.RULE_OCCURRENCE_STACK.pop();\n        // NOOP when cst is disabled\n        this.cstFinallyStateUpdate();\n        if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n            var firstRedundantTok = this.LA(1);\n            var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n                firstRedundant: firstRedundantTok,\n                ruleName: this.getCurrRuleFullName()\n            });\n            this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n        }\n    };\n    RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n        var ruleResult;\n        try {\n            var args = options !== undefined ? options.ARGS : undefined;\n            ruleResult = ruleToCall.call(this, idx, args);\n            this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n                ? options.LABEL\n                : ruleToCall.ruleName);\n            return ruleResult;\n        }\n        catch (e) {\n            this.subruleInternalError(e, options, ruleToCall.ruleName);\n        }\n    };\n    RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n        if (exceptions_public_1.isRecognitionException(e) && e.partialCstResult !== undefined) {\n            this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n                ? options.LABEL\n                : ruleName);\n            delete e.partialCstResult;\n        }\n        throw e;\n    };\n    RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n        var consumedToken;\n        try {\n            var nextToken = this.LA(1);\n            if (this.tokenMatcher(nextToken, tokType) === true) {\n                this.consumeToken();\n                consumedToken = nextToken;\n            }\n            else {\n                this.consumeInternalError(tokType, nextToken, options);\n            }\n        }\n        catch (eFromConsumption) {\n            consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n        }\n        this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n            ? options.LABEL\n            : tokType.name, consumedToken);\n        return consumedToken;\n    };\n    RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n        var msg;\n        var previousToken = this.LA(0);\n        if (options !== undefined && options.ERR_MSG) {\n            msg = options.ERR_MSG;\n        }\n        else {\n            msg = this.errorMessageProvider.buildMismatchTokenMessage({\n                expected: tokType,\n                actual: nextToken,\n                previous: previousToken,\n                ruleName: this.getCurrRuleFullName()\n            });\n        }\n        throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n    };\n    RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n        // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n        // but the original syntax could have been parsed successfully without any backtracking + recovery\n        if (this.recoveryEnabled &&\n            // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n            eFromConsumption.name === \"MismatchedTokenException\" &&\n            !this.isBackTracking()) {\n            var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n            try {\n                return this.tryInRuleRecovery(tokType, follows);\n            }\n            catch (eFromInRuleRecovery) {\n                if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n                    // failed in RuleRecovery.\n                    // throw the original error in order to trigger reSync error recovery\n                    throw eFromConsumption;\n                }\n                else {\n                    throw eFromInRuleRecovery;\n                }\n            }\n        }\n        else {\n            throw eFromConsumption;\n        }\n    };\n    RecognizerEngine.prototype.saveRecogState = function () {\n        // errors is a getter which will clone the errors array\n        var savedErrors = this.errors;\n        var savedRuleStack = utils_1.cloneArr(this.RULE_STACK);\n        return {\n            errors: savedErrors,\n            lexerState: this.exportLexerState(),\n            RULE_STACK: savedRuleStack,\n            CST_STACK: this.CST_STACK,\n            LAST_EXPLICIT_RULE_STACK: this.LAST_EXPLICIT_RULE_STACK\n        };\n    };\n    RecognizerEngine.prototype.reloadRecogState = function (newState) {\n        this.errors = newState.errors;\n        this.importLexerState(newState.lexerState);\n        this.RULE_STACK = newState.RULE_STACK;\n    };\n    RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n        this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n        this.RULE_STACK.push(shortName);\n        // NOOP when cst is disabled\n        this.cstInvocationStateUpdate(fullName, shortName);\n    };\n    RecognizerEngine.prototype.isBackTracking = function () {\n        return this.isBackTrackingStack.length !== 0;\n    };\n    RecognizerEngine.prototype.getCurrRuleFullName = function () {\n        var shortName = this.getLastExplicitRuleShortName();\n        return this.shortRuleNameToFull[shortName];\n    };\n    RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n        return this.shortRuleNameToFull[shortName];\n    };\n    RecognizerEngine.prototype.isAtEndOfInput = function () {\n        return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n    };\n    RecognizerEngine.prototype.reset = function () {\n        this.resetLexerState();\n        this.isBackTrackingStack = [];\n        this.errors = [];\n        this.RULE_STACK = [];\n        this.LAST_EXPLICIT_RULE_STACK = [];\n        // TODO: extract a specific rest for TreeBuilder trait\n        this.CST_STACK = [];\n        this.RULE_OCCURRENCE_STACK = [];\n    };\n    return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar exceptions_public_1 = __webpack_require__(8);\nvar utils_1 = __webpack_require__(0);\nvar lookahead_1 = __webpack_require__(12);\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n    function ErrorHandler() {\n    }\n    ErrorHandler.prototype.initErrorHandler = function (config) {\n        this._errors = [];\n        this.errorMessageProvider = utils_1.defaults(config.errorMessageProvider, parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider);\n    };\n    ErrorHandler.prototype.SAVE_ERROR = function (error) {\n        if (exceptions_public_1.isRecognitionException(error)) {\n            error.context = {\n                ruleStack: this.getHumanReadableRuleStack(),\n                ruleOccurrenceStack: utils_1.cloneArr(this.RULE_OCCURRENCE_STACK)\n            };\n            this._errors.push(error);\n            return error;\n        }\n        else {\n            throw Error(\"Trying to save an Error which is not a RecognitionException\");\n        }\n    };\n    Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n        // TODO: extract these methods to ErrorHandler Trait?\n        get: function () {\n            return utils_1.cloneArr(this._errors);\n        },\n        set: function (newErrors) {\n            this._errors = newErrors;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // TODO: consider caching the error message computed information\n    ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n        var ruleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[ruleName];\n        var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, this.maxLookahead);\n        var insideProdPaths = lookAheadPathsPerAlternative[0];\n        var actualTokens = [];\n        for (var i = 1; i <= this.maxLookahead; i++) {\n            actualTokens.push(this.LA(i));\n        }\n        var msg = this.errorMessageProvider.buildEarlyExitMessage({\n            expectedIterationPaths: insideProdPaths,\n            actual: actualTokens,\n            previous: this.LA(0),\n            customUserDescription: userDefinedErrMsg,\n            ruleName: ruleName\n        });\n        throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n    };\n    // TODO: consider caching the error message computed information\n    ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n        var ruleName = this.getCurrRuleFullName();\n        var ruleGrammar = this.getGAstProductions()[ruleName];\n        // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n        var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOr(occurrence, ruleGrammar, this.maxLookahead);\n        var actualTokens = [];\n        for (var i = 1; i <= this.maxLookahead; i++) {\n            actualTokens.push(this.LA(i));\n        }\n        var previousToken = this.LA(0);\n        var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n            expectedPathsPerAlt: lookAheadPathsPerAlternative,\n            actual: actualTokens,\n            previous: previousToken,\n            customUserDescription: errMsgTypes,\n            ruleName: this.getCurrRuleFullName()\n        });\n        throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n    };\n    return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar interpreter_1 = __webpack_require__(13);\nvar utils_1 = __webpack_require__(0);\nvar ContentAssist = /** @class */ (function () {\n    function ContentAssist() {\n    }\n    ContentAssist.prototype.initContentAssist = function () { };\n    ContentAssist.prototype.computeContentAssist = function (startRuleName, precedingInput) {\n        var startRuleGast = this.gastProductionsCache[startRuleName];\n        if (utils_1.isUndefined(startRuleGast)) {\n            throw Error(\"Rule ->\" + startRuleName + \"<- does not exist in this grammar.\");\n        }\n        return interpreter_1.nextPossibleTokensAfter([startRuleGast], precedingInput, this.tokenMatcher, this.maxLookahead);\n    };\n    // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n    // TODO: should this be more explicitly part of the public API?\n    ContentAssist.prototype.getNextPossibleTokenTypes = function (grammarPath) {\n        var topRuleName = utils_1.first(grammarPath.ruleStack);\n        var gastProductions = this.getGAstProductions();\n        var topProduction = gastProductions[topRuleName];\n        var nextPossibleTokenTypes = new interpreter_1.NextAfterTokenWalker(topProduction, grammarPath).startWalking();\n        return nextPossibleTokenTypes;\n    };\n    return ContentAssist;\n}());\nexports.ContentAssist = ContentAssist;\n//# sourceMappingURL=context_assist.js.map\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\nvar lexer_public_1 = __webpack_require__(9);\nvar tokens_1 = __webpack_require__(5);\nvar tokens_public_1 = __webpack_require__(3);\nvar parser_1 = __webpack_require__(2);\nvar keys_1 = __webpack_require__(7);\nvar RECORDING_NULL_OBJECT = {\n    description: \"This Object indicates the Parser is during Recording Phase\"\n};\nObject.freeze(RECORDING_NULL_OBJECT);\nvar HANDLE_SEPARATOR = true;\nvar MAX_METHOD_IDX = Math.pow(2, keys_1.BITS_FOR_OCCURRENCE_IDX) - 1;\nvar RFT = tokens_public_1.createToken({ name: \"RECORDING_PHASE_TOKEN\", pattern: lexer_public_1.Lexer.NA });\ntokens_1.augmentTokenTypes([RFT]);\nvar RECORDING_PHASE_TOKEN = tokens_public_1.createTokenInstance(RFT, \"This IToken indicates the Parser is in Recording Phase\\n\\t\" +\n    \"\" +\n    \"See: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\", \n// Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n// cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n-1, -1, -1, -1, -1, -1);\nObject.freeze(RECORDING_PHASE_TOKEN);\nvar RECORDING_PHASE_CSTNODE = {\n    name: \"This CSTNode indicates the Parser is in Recording Phase\\n\\t\" +\n        \"See: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\",\n    children: {}\n};\n/**\n * This trait handles the creation of the GAST structure for Chevrotain Grammars\n */\nvar GastRecorder = /** @class */ (function () {\n    function GastRecorder() {\n    }\n    GastRecorder.prototype.initGastRecorder = function (config) {\n        this.recordingProdStack = [];\n        this.RECORDING_PHASE = false;\n    };\n    GastRecorder.prototype.enableRecording = function () {\n        var _this = this;\n        this.RECORDING_PHASE = true;\n        this.TRACE_INIT(\"Enable Recording\", function () {\n            var _loop_1 = function (i) {\n                var idx = i > 0 ? i : \"\";\n                _this[\"CONSUME\" + idx] = function (arg1, arg2) {\n                    return this.consumeInternalRecord(arg1, i, arg2);\n                };\n                _this[\"SUBRULE\" + idx] = function (arg1, arg2) {\n                    return this.subruleInternalRecord(arg1, i, arg2);\n                };\n                _this[\"OPTION\" + idx] = function (arg1) {\n                    return this.optionInternalRecord(arg1, i);\n                };\n                _this[\"OR\" + idx] = function (arg1) {\n                    return this.orInternalRecord(arg1, i);\n                };\n                _this[\"MANY\" + idx] = function (arg1) {\n                    this.manyInternalRecord(i, arg1);\n                };\n                _this[\"MANY_SEP\" + idx] = function (arg1) {\n                    this.manySepFirstInternalRecord(i, arg1);\n                };\n                _this[\"AT_LEAST_ONE\" + idx] = function (arg1) {\n                    this.atLeastOneInternalRecord(i, arg1);\n                };\n                _this[\"AT_LEAST_ONE_SEP\" + idx] = function (arg1) {\n                    this.atLeastOneSepFirstInternalRecord(i, arg1);\n                };\n            };\n            /**\n             * Warning Dark Voodoo Magic upcoming!\n             * We are \"replacing\" the public parsing DSL methods API\n             * With **new** alternative implementations on the Parser **instance**\n             *\n             * So far this is the only way I've found to avoid performance regressions during parsing time.\n             * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n             *   implementations directly instead.\n             */\n            for (var i = 0; i < 10; i++) {\n                _loop_1(i);\n            }\n            // DSL methods with the idx(suffix) as an argument\n            _this[\"consume\"] = function (idx, arg1, arg2) {\n                return this.consumeInternalRecord(arg1, idx, arg2);\n            };\n            _this[\"subrule\"] = function (idx, arg1, arg2) {\n                return this.subruleInternalRecord(arg1, idx, arg2);\n            };\n            _this[\"option\"] = function (idx, arg1) {\n                return this.optionInternalRecord(arg1, idx);\n            };\n            _this[\"or\"] = function (idx, arg1) {\n                return this.orInternalRecord(arg1, idx);\n            };\n            _this[\"many\"] = function (idx, arg1) {\n                this.manyInternalRecord(idx, arg1);\n            };\n            _this[\"atLeastOne\"] = function (idx, arg1) {\n                this.atLeastOneInternalRecord(idx, arg1);\n            };\n            _this.ACTION = _this.ACTION_RECORD;\n            _this.BACKTRACK = _this.BACKTRACK_RECORD;\n            _this.LA = _this.LA_RECORD;\n        });\n    };\n    GastRecorder.prototype.disableRecording = function () {\n        var _this = this;\n        this.RECORDING_PHASE = false;\n        // By deleting these **instance** properties, any future invocation\n        // will be deferred to the original methods on the **prototype** object\n        // This seems to get rid of any incorrect optimizations that V8 may\n        // do during the recording phase.\n        this.TRACE_INIT(\"Deleting Recording methods\", function () {\n            for (var i = 0; i < 10; i++) {\n                var idx = i > 0 ? i : \"\";\n                delete _this[\"CONSUME\" + idx];\n                delete _this[\"SUBRULE\" + idx];\n                delete _this[\"OPTION\" + idx];\n                delete _this[\"OR\" + idx];\n                delete _this[\"MANY\" + idx];\n                delete _this[\"MANY_SEP\" + idx];\n                delete _this[\"AT_LEAST_ONE\" + idx];\n                delete _this[\"AT_LEAST_ONE_SEP\" + idx];\n            }\n            delete _this[\"consume\"];\n            delete _this[\"subrule\"];\n            delete _this[\"option\"];\n            delete _this[\"or\"];\n            delete _this[\"many\"];\n            delete _this[\"atLeastOne\"];\n            delete _this.ACTION;\n            delete _this.BACKTRACK;\n            delete _this.LA;\n        });\n    };\n    // TODO: is there any way to use this method to check no\n    //   Parser methods are called inside an ACTION?\n    //   Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n    GastRecorder.prototype.ACTION_RECORD = function (impl) {\n        // NO-OP during recording\n        return;\n    };\n    // Executing backtracking logic will break our recording logic assumptions\n    GastRecorder.prototype.BACKTRACK_RECORD = function (grammarRule, args) {\n        return function () { return true; };\n    };\n    // LA is part of the official API and may be used for custom lookahead logic\n    // by end users who may forget to wrap it in ACTION or inside a GATE\n    GastRecorder.prototype.LA_RECORD = function (howMuch) {\n        // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n        // On LA return EOF at the end of the input so an infinite loop may occur.\n        return parser_1.END_OF_FILE;\n    };\n    GastRecorder.prototype.topLevelRuleRecord = function (name, def) {\n        try {\n            var newTopLevelRule = new gast_public_1.Rule({ definition: [], name: name });\n            newTopLevelRule.name = name;\n            this.recordingProdStack.push(newTopLevelRule);\n            def.call(this);\n            this.recordingProdStack.pop();\n            return newTopLevelRule;\n        }\n        catch (originalError) {\n            if (originalError.KNOWN_RECORDER_ERROR !== true) {\n                try {\n                    originalError.message =\n                        originalError.message +\n                            '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n                            \"https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording\";\n                }\n                catch (mutabilityError) {\n                    // We may not be able to modify the original error object\n                    throw originalError;\n                }\n            }\n            throw originalError;\n        }\n    };\n    // Implementation of parsing DSL\n    GastRecorder.prototype.optionInternalRecord = function (actionORMethodDef, occurrence) {\n        return recordProd.call(this, gast_public_1.Option, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.atLeastOneInternalRecord = function (occurrence, actionORMethodDef) {\n        recordProd.call(this, gast_public_1.RepetitionMandatory, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.atLeastOneSepFirstInternalRecord = function (occurrence, options) {\n        recordProd.call(this, gast_public_1.RepetitionMandatoryWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n    };\n    GastRecorder.prototype.manyInternalRecord = function (occurrence, actionORMethodDef) {\n        recordProd.call(this, gast_public_1.Repetition, actionORMethodDef, occurrence);\n    };\n    GastRecorder.prototype.manySepFirstInternalRecord = function (occurrence, options) {\n        recordProd.call(this, gast_public_1.RepetitionWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n    };\n    GastRecorder.prototype.orInternalRecord = function (altsOrOpts, occurrence) {\n        return recordOrProd.call(this, altsOrOpts, occurrence);\n    };\n    GastRecorder.prototype.subruleInternalRecord = function (ruleToCall, occurrence, options) {\n        assertMethodIdxIsValid(occurrence);\n        if (!ruleToCall || utils_1.has(ruleToCall, \"ruleName\") === false) {\n            var error = new Error(\"<SUBRULE\" + getIdxSuffix(occurrence) + \"> argument is invalid\" +\n                (\" expecting a Parser method reference but got: <\" + JSON.stringify(ruleToCall) + \">\") +\n                (\"\\n inside top level rule: <\" + this.recordingProdStack[0].name + \">\"));\n            error.KNOWN_RECORDER_ERROR = true;\n            throw error;\n        }\n        var prevProd = utils_1.peek(this.recordingProdStack);\n        var ruleName = ruleToCall[\"ruleName\"];\n        var newNoneTerminal = new gast_public_1.NonTerminal({\n            idx: occurrence,\n            nonTerminalName: ruleName,\n            // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n            referencedRule: undefined\n        });\n        prevProd.definition.push(newNoneTerminal);\n        return this.outputCst\n            ? RECORDING_PHASE_CSTNODE\n            : RECORDING_NULL_OBJECT;\n    };\n    GastRecorder.prototype.consumeInternalRecord = function (tokType, occurrence, options) {\n        assertMethodIdxIsValid(occurrence);\n        if (!tokens_1.hasShortKeyProperty(tokType)) {\n            var error = new Error(\"<CONSUME\" + getIdxSuffix(occurrence) + \"> argument is invalid\" +\n                (\" expecting a TokenType reference but got: <\" + JSON.stringify(tokType) + \">\") +\n                (\"\\n inside top level rule: <\" + this.recordingProdStack[0].name + \">\"));\n            error.KNOWN_RECORDER_ERROR = true;\n            throw error;\n        }\n        var prevProd = utils_1.peek(this.recordingProdStack);\n        var newNoneTerminal = new gast_public_1.Terminal({\n            idx: occurrence,\n            terminalType: tokType\n        });\n        prevProd.definition.push(newNoneTerminal);\n        return RECORDING_PHASE_TOKEN;\n    };\n    return GastRecorder;\n}());\nexports.GastRecorder = GastRecorder;\nfunction recordProd(prodConstructor, mainProdArg, occurrence, handleSep) {\n    if (handleSep === void 0) { handleSep = false; }\n    assertMethodIdxIsValid(occurrence);\n    var prevProd = utils_1.peek(this.recordingProdStack);\n    var grammarAction = utils_1.isFunction(mainProdArg)\n        ? mainProdArg\n        : mainProdArg.DEF;\n    var newProd = new prodConstructor({ definition: [], idx: occurrence });\n    if (utils_1.has(mainProdArg, \"NAME\")) {\n        newProd.name = mainProdArg.NAME;\n    }\n    if (handleSep) {\n        newProd.separator = mainProdArg.SEP;\n    }\n    if (utils_1.has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n        newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n    }\n    this.recordingProdStack.push(newProd);\n    grammarAction.call(this);\n    prevProd.definition.push(newProd);\n    this.recordingProdStack.pop();\n    return RECORDING_NULL_OBJECT;\n}\nfunction recordOrProd(mainProdArg, occurrence) {\n    var _this = this;\n    assertMethodIdxIsValid(occurrence);\n    var prevProd = utils_1.peek(this.recordingProdStack);\n    // Only an array of alternatives\n    var hasOptions = utils_1.isArray(mainProdArg) === false;\n    var alts = hasOptions === false ? mainProdArg : mainProdArg.DEF;\n    var newOrProd = new gast_public_1.Alternation({\n        definition: [],\n        idx: occurrence,\n        ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true\n    });\n    if (utils_1.has(mainProdArg, \"NAME\")) {\n        newOrProd.name = mainProdArg.NAME;\n    }\n    if (utils_1.has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n        newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n    }\n    var hasPredicates = utils_1.some(alts, function (currAlt) { return utils_1.isFunction(currAlt.GATE); });\n    newOrProd.hasPredicates = hasPredicates;\n    prevProd.definition.push(newOrProd);\n    utils_1.forEach(alts, function (currAlt) {\n        var currAltFlat = new gast_public_1.Flat({ definition: [] });\n        newOrProd.definition.push(currAltFlat);\n        if (utils_1.has(currAlt, \"NAME\")) {\n            currAltFlat.name = currAlt.NAME;\n        }\n        if (utils_1.has(currAlt, \"IGNORE_AMBIGUITIES\")) {\n            currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES;\n        }\n        // **implicit** ignoreAmbiguities due to usage of gate\n        else if (utils_1.has(currAlt, \"GATE\")) {\n            currAltFlat.ignoreAmbiguities = true;\n        }\n        _this.recordingProdStack.push(currAltFlat);\n        currAlt.ALT.call(_this);\n        _this.recordingProdStack.pop();\n    });\n    return RECORDING_NULL_OBJECT;\n}\nfunction getIdxSuffix(idx) {\n    return idx === 0 ? \"\" : \"\" + idx;\n}\nfunction assertMethodIdxIsValid(idx) {\n    if (idx < 0 || idx > MAX_METHOD_IDX) {\n        var error = new Error(\n        // The stack trace will contain all the needed details\n        \"Invalid DSL Method idx value: <\" + idx + \">\\n\\t\" +\n            (\"Idx value must be a none negative value smaller than \" + (MAX_METHOD_IDX +\n                1)));\n        error.KNOWN_RECORDER_ERROR = true;\n        throw error;\n    }\n}\n//# sourceMappingURL=gast_recorder.js.map\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar parser_1 = __webpack_require__(2);\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar PerformanceTracer = /** @class */ (function () {\n    function PerformanceTracer() {\n    }\n    PerformanceTracer.prototype.initPerformanceTracer = function (config) {\n        if (utils_1.has(config, \"traceInitPerf\")) {\n            var userTraceInitPerf = config.traceInitPerf;\n            var traceIsNumber = typeof userTraceInitPerf === \"number\";\n            this.traceInitMaxIdent = traceIsNumber\n                ? userTraceInitPerf\n                : Infinity;\n            this.traceInitPerf = traceIsNumber\n                ? userTraceInitPerf > 0\n                : userTraceInitPerf;\n        }\n        else {\n            this.traceInitMaxIdent = 0;\n            this.traceInitPerf = parser_1.DEFAULT_PARSER_CONFIG.traceInitPerf;\n        }\n        this.traceInitIndent = -1;\n    };\n    PerformanceTracer.prototype.TRACE_INIT = function (phaseDesc, phaseImpl) {\n        // No need to optimize this using NOOP pattern because\n        // It is not called in a hot spot...\n        if (this.traceInitPerf === true) {\n            this.traceInitIndent++;\n            var indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                console.log(indent + \"--> <\" + phaseDesc + \">\");\n            }\n            var _a = utils_1.timer(phaseImpl), time = _a.time, value = _a.value;\n            /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n            var traceMethod = time > 10 ? console.warn : console.log;\n            if (this.traceInitIndent < this.traceInitMaxIdent) {\n                traceMethod(indent + \"<-- <\" + phaseDesc + \"> time: \" + time + \"ms\");\n            }\n            this.traceInitIndent--;\n            return value;\n        }\n        else {\n            return phaseImpl();\n        }\n    };\n    return PerformanceTracer;\n}());\nexports.PerformanceTracer = PerformanceTracer;\n//# sourceMappingURL=perf_tracer.js.map\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar version_1 = __webpack_require__(19);\nfunction createSyntaxDiagramsCode(grammar, _a) {\n    var _b = _a === void 0 ? {} : _a, _c = _b.resourceBase, resourceBase = _c === void 0 ? \"https://unpkg.com/chevrotain@\" + version_1.VERSION + \"/diagrams/\" : _c, _d = _b.css, css = _d === void 0 ? \"https://unpkg.com/chevrotain@\" + version_1.VERSION + \"/diagrams/diagrams.css\" : _d;\n    var header = \"\\n<!-- This is a generated file -->\\n<!DOCTYPE html>\\n<meta charset=\\\"utf-8\\\">\\n<style>\\n  body {\\n    background-color: hsl(30, 20%, 95%)\\n  }\\n</style>\\n\\n\";\n    var cssHtml = \"\\n<link rel='stylesheet' href='\" + css + \"'>\\n\";\n    var scripts = \"\\n<script src='\" + resourceBase + \"vendor/railroad-diagrams.js'></script>\\n<script src='\" + resourceBase + \"src/diagrams_builder.js'></script>\\n<script src='\" + resourceBase + \"src/diagrams_behavior.js'></script>\\n<script src='\" + resourceBase + \"src/main.js'></script>\\n\";\n    var diagramsDiv = \"\\n<div id=\\\"diagrams\\\" align=\\\"center\\\"></div>    \\n\";\n    var serializedGrammar = \"\\n<script>\\n    window.serializedGrammar = \" + JSON.stringify(grammar, null, \"  \") + \";\\n</script>\\n\";\n    var initLogic = \"\\n<script>\\n    var diagramsDiv = document.getElementById(\\\"diagrams\\\");\\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\\n</script>\\n\";\n    return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar generate_1 = __webpack_require__(42);\nfunction generateParserFactory(options) {\n    var wrapperText = generate_1.genWrapperFunction({\n        name: options.name,\n        rules: options.rules\n    });\n    var constructorWrapper = new Function(\"tokenVocabulary\", \"config\", \"chevrotain\", wrapperText);\n    return function (config) {\n        return constructorWrapper(options.tokenVocabulary, config, \n        // TODO: check how the require is transpiled/webpacked\n        __webpack_require__(18));\n    };\n}\nexports.generateParserFactory = generateParserFactory;\nfunction generateParserModule(options) {\n    return generate_1.genUmdModule({ name: options.name, rules: options.rules });\n}\nexports.generateParserModule = generateParserModule;\n//# sourceMappingURL=generate_public.js.map\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = __webpack_require__(0);\nvar gast_public_1 = __webpack_require__(1);\n/**\n * Missing features\n * 1. Rule arguments\n * 2. Gates\n * 3. embedded actions\n */\nvar NL = \"\\n\";\nfunction genUmdModule(options) {\n    return \"\\n(function (root, factory) {\\n    if (typeof define === 'function' && define.amd) {\\n        // AMD. Register as an anonymous module.\\n        define(['chevrotain'], factory);\\n    } else if (typeof module === 'object' && module.exports) {\\n        // Node. Does not work with strict CommonJS, but\\n        // only CommonJS-like environments that support module.exports,\\n        // like Node.\\n        module.exports = factory(require('chevrotain'));\\n    } else {\\n        // Browser globals (root is window)\\n        root.returnExports = factory(root.b);\\n    }\\n}(typeof self !== 'undefined' ? self : this, function (chevrotain) {\\n\\n\" + genClass(options) + \"\\n    \\nreturn {\\n    \" + options.name + \": \" + options.name + \" \\n}\\n}));\\n\";\n}\nexports.genUmdModule = genUmdModule;\nfunction genWrapperFunction(options) {\n    return \"    \\n\" + genClass(options) + \"\\nreturn new \" + options.name + \"(tokenVocabulary, config)    \\n\";\n}\nexports.genWrapperFunction = genWrapperFunction;\nfunction genClass(options) {\n    // TODO: how to pass the token vocabulary? Constructor? other?\n    var result = \"\\nfunction \" + options.name + \"(tokenVocabulary, config) {\\n    // invoke super constructor\\n    // No support for embedded actions currently, so we can 'hardcode'\\n    // The use of CstParser.\\n    chevrotain.CstParser.call(this, tokenVocabulary, config)\\n\\n    const $ = this\\n\\n    \" + genAllRules(options.rules) + \"\\n\\n    // very important to call this after all the rules have been defined.\\n    // otherwise the parser may not work correctly as it will lack information\\n    // derived during the self analysis phase.\\n    this.performSelfAnalysis(this)\\n}\\n\\n// inheritance as implemented in javascript in the previous decade... :(\\n\" + options.name + \".prototype = Object.create(chevrotain.CstParser.prototype)\\n\" + options.name + \".prototype.constructor = \" + options.name + \"    \\n    \";\n    return result;\n}\nexports.genClass = genClass;\nfunction genAllRules(rules) {\n    var rulesText = utils_1.map(rules, function (currRule) {\n        return genRule(currRule, 1);\n    });\n    return rulesText.join(\"\\n\");\n}\nexports.genAllRules = genAllRules;\nfunction genRule(prod, n) {\n    var result = indent(n, \"$.RULE(\\\"\" + prod.name + \"\\\", function() {\") + NL;\n    result += genDefinition(prod.definition, n + 1);\n    result += indent(n + 1, \"})\") + NL;\n    return result;\n}\nexports.genRule = genRule;\nfunction genTerminal(prod, n) {\n    var name = prod.terminalType.name;\n    // TODO: potential performance optimization, avoid tokenMap Dictionary access\n    return indent(n, \"$.CONSUME\" + prod.idx + \"(this.tokensMap.\" + name + \")\" + NL);\n}\nexports.genTerminal = genTerminal;\nfunction genNonTerminal(prod, n) {\n    return indent(n, \"$.SUBRULE\" + prod.idx + \"($.\" + prod.nonTerminalName + \")\" + NL);\n}\nexports.genNonTerminal = genNonTerminal;\nfunction genAlternation(prod, n) {\n    var result = indent(n, \"$.OR\" + prod.idx + \"([\") + NL;\n    var alts = utils_1.map(prod.definition, function (altDef) { return genSingleAlt(altDef, n + 1); });\n    result += alts.join(\",\" + NL);\n    result += NL + indent(n, \"])\" + NL);\n    return result;\n}\nexports.genAlternation = genAlternation;\nfunction genSingleAlt(prod, n) {\n    var result = indent(n, \"{\") + NL;\n    if (prod.name) {\n        result += indent(n + 1, \"NAME: \\\"\" + prod.name + \"\\\",\") + NL;\n    }\n    result += indent(n + 1, \"ALT: function() {\") + NL;\n    result += genDefinition(prod.definition, n + 1);\n    result += indent(n + 1, \"}\") + NL;\n    result += indent(n, \"}\");\n    return result;\n}\nexports.genSingleAlt = genSingleAlt;\nfunction genProd(prod, n) {\n    /* istanbul ignore else */\n    if (prod instanceof gast_public_1.NonTerminal) {\n        return genNonTerminal(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Option) {\n        return genDSLRule(\"OPTION\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatory) {\n        return genDSLRule(\"AT_LEAST_ONE\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {\n        return genDSLRule(\"AT_LEAST_ONE_SEP\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.RepetitionWithSeparator) {\n        return genDSLRule(\"MANY_SEP\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.Repetition) {\n        return genDSLRule(\"MANY\", prod, n);\n    }\n    else if (prod instanceof gast_public_1.Alternation) {\n        return genAlternation(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Terminal) {\n        return genTerminal(prod, n);\n    }\n    else if (prod instanceof gast_public_1.Flat) {\n        return genDefinition(prod.definition, n);\n    }\n    else {\n        throw Error(\"non exhaustive match\");\n    }\n}\nfunction genDSLRule(dslName, prod, n) {\n    var result = indent(n, \"$.\" + (dslName + prod.idx) + \"(\");\n    if (prod.name || prod.separator) {\n        result += \"{\" + NL;\n        if (prod.name) {\n            result += indent(n + 1, \"NAME: \\\"\" + prod.name + \"\\\"\") + \",\" + NL;\n        }\n        if (prod.separator) {\n            result +=\n                indent(n + 1, \"SEP: this.tokensMap.\" + prod.separator.name) +\n                    \",\" +\n                    NL;\n        }\n        result += \"DEF: \" + genDefFunction(prod.definition, n + 2) + NL;\n        result += indent(n, \"}\") + NL;\n    }\n    else {\n        result += genDefFunction(prod.definition, n + 1);\n    }\n    result += indent(n, \")\") + NL;\n    return result;\n}\nfunction genDefFunction(definition, n) {\n    var def = \"function() {\" + NL;\n    def += genDefinition(definition, n);\n    def += indent(n, \"}\") + NL;\n    return def;\n}\nfunction genDefinition(def, n) {\n    var result = \"\";\n    utils_1.forEach(def, function (prod) {\n        result += genProd(prod, n + 1);\n    });\n    return result;\n}\nfunction indent(howMuch, text) {\n    var spaces = Array(howMuch * 4 + 1).join(\" \");\n    return spaces + text;\n}\n//# sourceMappingURL=generate.js.map\n\n/***/ })\n/******/ ]);\n});\n\n// begin:./FileSaver.js-2.0.2/FileSaver.js\n(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory();\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory();\n    global.FileSaver = mod.exports;\n  }\n})(this, function () {\n  \"use strict\";\n\n  /*\n  * FileSaver.js\n  * A saveAs() FileSaver implementation.\n  *\n  * By Eli Grey, http://eligrey.com\n  *\n  * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n  * source  : http://purl.eligrey.com/github/FileSaver.js\n  */\n  // The one and only way of getting global scope in all environments\n  // https://stackoverflow.com/q/3277182/1008999\n  var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0;\n\n  function bom(blob, opts) {\n    if (typeof opts === 'undefined') opts = {\n      autoBom: false\n    };else if (typeof opts !== 'object') {\n      console.warn('Deprecated: Expected third argument to be a object');\n      opts = {\n        autoBom: !opts\n      };\n    } // prepend BOM for UTF-8 XML and text/* types (including HTML)\n    // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n\n    if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n      return new Blob([String.fromCharCode(0xFEFF), blob], {\n        type: blob.type\n      });\n    }\n\n    return blob;\n  }\n\n  function download(url, name, opts) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url);\n    xhr.responseType = 'blob';\n\n    xhr.onload = function () {\n      saveAs(xhr.response, name, opts);\n    };\n\n    xhr.onerror = function () {\n      console.error('could not download file');\n    };\n\n    xhr.send();\n  }\n\n  function corsEnabled(url) {\n    var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker\n\n    xhr.open('HEAD', url, false);\n\n    try {\n      xhr.send();\n    } catch (e) {}\n\n    return xhr.status >= 200 && xhr.status <= 299;\n  } // `a.click()` doesn't work for all browsers (#465)\n\n\n  function click(node) {\n    try {\n      node.dispatchEvent(new MouseEvent('click'));\n    } catch (e) {\n      var evt = document.createEvent('MouseEvents');\n      evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\n      node.dispatchEvent(evt);\n    }\n  }\n\n  var saveAs = _global.saveAs || ( // probably in some web worker\n  typeof window !== 'object' || window !== _global ? function saveAs() {}\n  /* noop */\n  // Use download attribute first if possible (#193 Lumia mobile)\n  : 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL;\n    var a = document.createElement('a');\n    name = name || blob.name || 'download';\n    a.download = name;\n    a.rel = 'noopener'; // tabnabbing\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob;\n\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank');\n      } else {\n        click(a);\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob);\n      setTimeout(function () {\n        URL.revokeObjectURL(a.href);\n      }, 4E4); // 40s\n\n      setTimeout(function () {\n        click(a);\n      }, 0);\n    }\n  } // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) {\n    name = name || blob.name || 'download';\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts);\n      } else {\n        var a = document.createElement('a');\n        a.href = blob;\n        a.target = '_blank';\n        setTimeout(function () {\n          click(a);\n        });\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name);\n    }\n  } // Fallback to using FileReader and a popup\n  : function saveAs(blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank');\n\n    if (popup) {\n      popup.document.title = popup.document.body.innerText = 'downloading...';\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts);\n    var force = blob.type === 'application/octet-stream';\n\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari;\n\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n\n    if ((isChromeIOS || force && isSafari) && typeof FileReader === 'object') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader();\n\n      reader.onloadend = function () {\n        var url = reader.result;\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\n        if (popup) popup.location.href = url;else location = url;\n        popup = null; // reverse-tabnabbing #460\n      };\n\n      reader.readAsDataURL(blob);\n    } else {\n      var URL = _global.URL || _global.webkitURL;\n      var url = URL.createObjectURL(blob);\n      if (popup) popup.location = url;else location.href = url;\n      popup = null; // reverse-tabnabbing #460\n\n      setTimeout(function () {\n        URL.revokeObjectURL(url);\n      }, 4E4); // 40s\n    }\n  });\n  _global.saveAs = saveAs.saveAs = saveAs;\n\n  if (typeof module !== 'undefined') {\n    module.exports = saveAs;\n  }\n});\n\n\n// begin:./js-lru/js-lru.js\n// https://github.com/rsms/js-lru/blob/master/lru.js\n/**\n * A doubly linked list-based Least Recently Used (LRU) cache. Will keep most\n * recently used items while discarding least recently used items when its limit\n * is reached.\n *\n * Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>\n * See README.md for details.\n *\n * Illustration of the design:\n *\n *       entry             entry             entry             entry\n *       ______            ______            ______            ______\n *      | head |.newer => |      |.newer => |      |.newer => | tail |\n *      |  A   |          |  B   |          |  C   |          |  D   |\n *      |______| <= older.|______| <= older.|______| <= older.|______|\n *\n *  removed  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  added\n */\n(function(g, f) {\n    const e = typeof exports == \"object\" ? exports : typeof g == \"object\" ? g : {};\n    f(e);\n    if (typeof define == \"function\" && define.amd) {\n        define(\"lru\", e);\n    }\n})(this, function(exports) {\n    const NEWER = Symbol(\"newer\");\n    const OLDER = Symbol(\"older\");\n\n    function LRUMap(limit, entries) {\n        if (typeof limit !== \"number\") {\n            // called as (entries)\n            entries = limit;\n            limit = 0;\n        }\n\n        this.size = 0;\n        this.limit = limit;\n        this.oldest = this.newest = undefined;\n        this._keymap = new Map();\n\n        if (entries) {\n            this.assign(entries);\n            if (limit < 1) {\n                this.limit = this.size;\n            }\n        }\n    }\n\n    exports.LRUMap = LRUMap;\n\n    function Entry(key, value) {\n        this.key = key;\n        this.value = value;\n        this[NEWER] = undefined;\n        this[OLDER] = undefined;\n    }\n\n    LRUMap.prototype._markEntryAsUsed = function(entry) {\n        if (entry === this.newest) {\n            // Already the most recenlty used entry, so no need to update the list\n            return;\n        }\n        // HEAD--------------TAIL\n        //   <.older   .newer>\n        //  <--- add direction --\n        //   A  B  C  <D>  E\n        if (entry[NEWER]) {\n            if (entry === this.oldest) {\n                this.oldest = entry[NEWER];\n            }\n            entry[NEWER][OLDER] = entry[OLDER]; // C <-- E.\n        }\n        if (entry[OLDER]) {\n            entry[OLDER][NEWER] = entry[NEWER]; // C. --> E\n        }\n        entry[NEWER] = undefined; // D --x\n        entry[OLDER] = this.newest; // D. --> E\n        if (this.newest) {\n            this.newest[NEWER] = entry; // E. <-- D\n        }\n        this.newest = entry;\n    };\n\n    LRUMap.prototype.assign = function(entries) {\n        let entry,\n            limit = this.limit || Number.MAX_VALUE;\n        this._keymap.clear();\n        let it = entries[Symbol.iterator]();\n        for (let itv = it.next(); !itv.done; itv = it.next()) {\n            let e = new Entry(itv.value[0], itv.value[1]);\n            this._keymap.set(e.key, e);\n            if (!entry) {\n                this.oldest = e;\n            } else {\n                entry[NEWER] = e;\n                e[OLDER] = entry;\n            }\n            entry = e;\n            if (limit-- == 0) {\n                throw new Error(\"overflow\");\n            }\n        }\n        this.newest = entry;\n        this.size = this._keymap.size;\n    };\n\n    LRUMap.prototype.get = function(key) {\n        // First, find our cache entry\n        var entry = this._keymap.get(key);\n        if (!entry) return; // Not cached. Sorry.\n        // As <key> was found in the cache, register it as being requested recently\n        this._markEntryAsUsed(entry);\n        return entry.value;\n    };\n\n    LRUMap.prototype.set = function(key, value) {\n        var entry = this._keymap.get(key);\n\n        if (entry) {\n            // update existing\n            entry.value = value;\n            this._markEntryAsUsed(entry);\n            return this;\n        }\n\n        // new entry\n        this._keymap.set(key, (entry = new Entry(key, value)));\n\n        if (this.newest) {\n            // link previous tail to the new tail (entry)\n            this.newest[NEWER] = entry;\n            entry[OLDER] = this.newest;\n        } else {\n            // we're first in -- yay\n            this.oldest = entry;\n        }\n\n        // add new entry to the end of the linked list -- it's now the freshest entry.\n        this.newest = entry;\n        ++this.size;\n        if (this.size > this.limit) {\n            // we hit the limit -- remove the head\n            this.shift();\n        }\n\n        return this;\n    };\n\n    LRUMap.prototype.shift = function() {\n        // todo: handle special case when limit == 1\n        var entry = this.oldest;\n        if (entry) {\n            if (this.oldest[NEWER]) {\n                // advance the list\n                this.oldest = this.oldest[NEWER];\n                this.oldest[OLDER] = undefined;\n            } else {\n                // the cache is exhausted\n                this.oldest = undefined;\n                this.newest = undefined;\n            }\n            // Remove last strong reference to <entry> and remove links from the purged\n            // entry being returned:\n            entry[NEWER] = entry[OLDER] = undefined;\n            this._keymap.delete(entry.key);\n            --this.size;\n            return [entry.key, entry.value];\n        }\n    };\n\n    // ----------------------------------------------------------------------------\n    // Following code is optional and can be removed without breaking the core\n    // functionality.\n\n    LRUMap.prototype.find = function(key) {\n        let e = this._keymap.get(key);\n        return e ? e.value : undefined;\n    };\n\n    LRUMap.prototype.has = function(key) {\n        return this._keymap.has(key);\n    };\n});\n\n\n// begin:./lz-string-1.4.4/lz-string.js\n// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.4\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n  if (!baseReverseDic[alphabet]) {\n    baseReverseDic[alphabet] = {};\n    for (var i=0 ; i<alphabet.length ; i++) {\n      baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n    }\n  }\n  return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n  compressToBase64 : function (input) {\n    if (input == null) return \"\";\n    var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n    switch (res.length % 4) { // To produce valid Base64\n    default: // When could this happen ?\n    case 0 : return res;\n    case 1 : return res+\"===\";\n    case 2 : return res+\"==\";\n    case 3 : return res+\"=\";\n    }\n  },\n\n  decompressFromBase64 : function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n  },\n\n  compressToUTF16 : function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n  },\n\n  decompressFromUTF16: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n  },\n\n  //compress into uint8array (UCS-2 big endian format)\n  compressToUint8Array: function (uncompressed) {\n    var compressed = LZString.compress(uncompressed);\n    var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n    for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n      var current_value = compressed.charCodeAt(i);\n      buf[i*2] = current_value >>> 8;\n      buf[i*2+1] = current_value % 256;\n    }\n    return buf;\n  },\n\n  //decompress from uint8array (UCS-2 big endian format)\n  decompressFromUint8Array:function (compressed) {\n    if (compressed===null || compressed===undefined){\n        return LZString.decompress(compressed);\n    } else {\n        var buf=new Array(compressed.length/2); // 2 bytes per character\n        for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n          buf[i]=compressed[i*2]*256+compressed[i*2+1];\n        }\n\n        var result = [];\n        buf.forEach(function (c) {\n          result.push(f(c));\n        });\n        return LZString.decompress(result.join(''));\n\n    }\n\n  },\n\n\n  //compress into a string that is already URI encoded\n  compressToEncodedURIComponent: function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n  },\n\n  //decompress from an output of compressToEncodedURIComponent\n  decompressFromEncodedURIComponent:function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    input = input.replace(/ /g, \"+\");\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n  },\n\n  compress: function (uncompressed) {\n    return LZString._compress(uncompressed, 16, function(a){return f(a);});\n  },\n  _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n    if (uncompressed == null) return \"\";\n    var i, value,\n        context_dictionary= {},\n        context_dictionaryToCreate= {},\n        context_c=\"\",\n        context_wc=\"\",\n        context_w=\"\",\n        context_enlargeIn= 2, // Compensate for the first entry which should not count\n        context_dictSize= 3,\n        context_numBits= 2,\n        context_data=[],\n        context_data_val=0,\n        context_data_position=0,\n        ii;\n\n    for (ii = 0; ii < uncompressed.length; ii += 1) {\n      context_c = uncompressed.charAt(ii);\n      if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n        context_dictionary[context_c] = context_dictSize++;\n        context_dictionaryToCreate[context_c] = true;\n      }\n\n      context_wc = context_w + context_c;\n      if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n        context_w = context_wc;\n      } else {\n        if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n          if (context_w.charCodeAt(0)<256) {\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<8 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          } else {\n            value = 1;\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1) | value;\n              if (context_data_position ==bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = 0;\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<16 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          }\n          context_enlargeIn--;\n          if (context_enlargeIn == 0) {\n            context_enlargeIn = Math.pow(2, context_numBits);\n            context_numBits++;\n          }\n          delete context_dictionaryToCreate[context_w];\n        } else {\n          value = context_dictionary[context_w];\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n\n\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        // Add wc to the dictionary.\n        context_dictionary[context_wc] = context_dictSize++;\n        context_w = String(context_c);\n      }\n    }\n\n    // Output the code for w.\n    if (context_w !== \"\") {\n      if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n        if (context_w.charCodeAt(0)<256) {\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<8 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        } else {\n          value = 1;\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | value;\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = 0;\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<16 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        delete context_dictionaryToCreate[context_w];\n      } else {\n        value = context_dictionary[context_w];\n        for (i=0 ; i<context_numBits ; i++) {\n          context_data_val = (context_data_val << 1) | (value&1);\n          if (context_data_position == bitsPerChar-1) {\n            context_data_position = 0;\n            context_data.push(getCharFromInt(context_data_val));\n            context_data_val = 0;\n          } else {\n            context_data_position++;\n          }\n          value = value >> 1;\n        }\n\n\n      }\n      context_enlargeIn--;\n      if (context_enlargeIn == 0) {\n        context_enlargeIn = Math.pow(2, context_numBits);\n        context_numBits++;\n      }\n    }\n\n    // Mark the end of the stream\n    value = 2;\n    for (i=0 ; i<context_numBits ; i++) {\n      context_data_val = (context_data_val << 1) | (value&1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data_position = 0;\n        context_data.push(getCharFromInt(context_data_val));\n        context_data_val = 0;\n      } else {\n        context_data_position++;\n      }\n      value = value >> 1;\n    }\n\n    // Flush the last char\n    while (true) {\n      context_data_val = (context_data_val << 1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data.push(getCharFromInt(context_data_val));\n        break;\n      }\n      else context_data_position++;\n    }\n    return context_data.join('');\n  },\n\n  decompress: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n  },\n\n  _decompress: function (length, resetValue, getNextValue) {\n    var dictionary = [],\n        next,\n        enlargeIn = 4,\n        dictSize = 4,\n        numBits = 3,\n        entry = \"\",\n        result = [],\n        i,\n        w,\n        bits, resb, maxpower, power,\n        c,\n        data = {val:getNextValue(0), position:resetValue, index:1};\n\n    for (i = 0; i < 3; i += 1) {\n      dictionary[i] = i;\n    }\n\n    bits = 0;\n    maxpower = Math.pow(2,2);\n    power=1;\n    while (power!=maxpower) {\n      resb = data.val & data.position;\n      data.position >>= 1;\n      if (data.position == 0) {\n        data.position = resetValue;\n        data.val = getNextValue(data.index++);\n      }\n      bits |= (resb>0 ? 1 : 0) * power;\n      power <<= 1;\n    }\n\n    switch (next = bits) {\n      case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 2:\n        return \"\";\n    }\n    dictionary[3] = c;\n    w = c;\n    result.push(c);\n    while (true) {\n      if (data.index > length) {\n        return \"\";\n      }\n\n      bits = 0;\n      maxpower = Math.pow(2,numBits);\n      power=1;\n      while (power!=maxpower) {\n        resb = data.val & data.position;\n        data.position >>= 1;\n        if (data.position == 0) {\n          data.position = resetValue;\n          data.val = getNextValue(data.index++);\n        }\n        bits |= (resb>0 ? 1 : 0) * power;\n        power <<= 1;\n      }\n\n      switch (c = bits) {\n        case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 2:\n          return result.join('');\n      }\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n      if (dictionary[c]) {\n        entry = dictionary[c];\n      } else {\n        if (c === dictSize) {\n          entry = w + w.charAt(0);\n        } else {\n          return null;\n        }\n      }\n      result.push(entry);\n\n      // Add w+entry[0] to the dictionary.\n      dictionary[dictSize++] = w + entry.charAt(0);\n      enlargeIn--;\n\n      w = entry;\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n    }\n  }\n};\n  return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n  define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n  module.exports = LZString\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/externaldelaybundlemin.js",
    "content": "\n// externaldelaybundle\n// changes here will be overwritten\n\n\n\n// begin:./chevrotain-6.5.0/chevrotain.min.js\n/*! chevrotain - v6.5.0 */\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(\"chevrotain\",[],e):\"object\"==typeof exports?exports.chevrotain=e():t.chevrotain=e()}(\"undefined\"!=typeof self?self:this,function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=18)}([function(t,e,n){\"use strict\";function r(t){return t&&0===t.length}function i(t){return null==t?[]:Object.keys(t)}function o(t){for(var e=[],n=Object.keys(t),r=0;r<n.length;r++)e.push(t[n[r]]);return e}function a(t,e){for(var n=[],r=i(t),o=0;o<r.length;o++){var a=r[o];n.push(e.call(null,t[a],a))}return n}function s(t,e){for(var n=[],r=0;r<t.length;r++)n.push(e.call(null,t[r],r));return n}function c(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];Array.isArray(r)?e=e.concat(c(r)):e.push(r)}return e}function u(t){return r(t)?void 0:t[0]}function l(t){var e=t&&t.length;return e?t[e-1]:void 0}function p(t,e){if(Array.isArray(t))for(var n=0;n<t.length;n++)e.call(null,t[n],n);else{if(!x(t))throw Error(\"non exhaustive match\");var r=i(t);for(n=0;n<r.length;n++){var o=r[n],a=t[o];e.call(null,a,o)}}}function h(t){return\"string\"==typeof t}function f(t){return void 0===t}function d(t){return t instanceof Function}function m(t,e){return void 0===e&&(e=1),t.slice(e,t.length)}function E(t,e){return void 0===e&&(e=1),t.slice(0,t.length-e)}function T(t,e){var n=[];if(Array.isArray(t))for(var r=0;r<t.length;r++){var i=t[r];e.call(null,i)&&n.push(i)}return n}function y(t,e){return T(t,function(t){return!e(t)})}function v(t,e){for(var n=Object.keys(t),r={},i=0;i<n.length;i++){var o=n[i],a=t[o];e(a)&&(r[o]=a)}return r}function R(t,e){return!!x(t)&&t.hasOwnProperty(e)}function A(t,e){return void 0!==N(t,function(t){return t===e})}function _(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n]);return e}function g(t){var e={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function N(t,e){for(var n=0;n<t.length;n++){var r=t[n];if(e.call(null,r))return r}}function I(t,e){for(var n=[],r=0;r<t.length;r++){var i=t[r];e.call(null,i)&&n.push(i)}return n}function O(t,e,n){for(var r=Array.isArray(t),a=r?t:o(t),s=r?[]:i(t),c=n,u=0;u<a.length;u++)c=e.call(null,c,a[u],r?u:s[u]);return c}function S(t){return y(t,function(t){return null==t})}function L(t,e){void 0===e&&(e=function(t){return t});var n=[];return O(t,function(t,r){var i=e(r);return A(n,i)?t:(n.push(i),t.concat(r))},[])}function P(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var r=[null].concat(e);return Function.bind.apply(t,r)}function C(t){return Array.isArray(t)}function k(t){return t instanceof RegExp}function x(t){return t instanceof Object}function M(t,e){for(var n=0;n<t.length;n++)if(!e(t[n],n))return!1;return!0}function F(t,e){return y(t,function(t){return A(e,t)})}function b(t,e){for(var n=0;n<t.length;n++)if(e(t[n]))return!0;return!1}function D(t,e){for(var n=0;n<t.length;n++)if(t[n]===e)return n;return-1}function U(t,e){var n=_(t);return n.sort(function(t,n){return e(t)-e(n)}),n}function w(t,e){if(t.length!==e.length)throw Error(\"can't zipObject with different number of keys and values!\");for(var n={},r=0;r<t.length;r++)n[t[r]]=e[r];return n}function G(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];for(var r=0;r<e.length;r++)for(var o=e[r],a=i(o),s=0;s<a.length;s++){var c=a[s];t[c]=o[c]}return t}function K(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];for(var r=0;r<e.length;r++){var o=e[r];if(!f(o))for(var a=i(o),s=0;s<a.length;s++){var c=a[s];R(t,c)||(t[c]=o[c])}}return t}function B(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return K.apply(null,[{}].concat(t))}function W(t,e){var n={};return p(t,function(t){var r=e(t),i=n[r];i?i.push(t):n[r]=[t]}),n}function j(t,e){for(var n=g(t),r=i(e),o=0;o<r.length;o++){var a=r[o],s=e[a];n[a]=s}return n}function V(){}function Y(t){return t}function X(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];e.push(void 0!==r?r:void 0)}return e}function z(t){console&&console.error&&console.error(\"Error: \"+t)}function H(t){console&&console.warn&&console.warn(\"Warning: \"+t)}function q(){return\"function\"==typeof Map}function $(t,e){e.forEach(function(e){var n=e.prototype;Object.getOwnPropertyNames(n).forEach(function(r){if(\"constructor\"!==r){var i=Object.getOwnPropertyDescriptor(n,r);i&&(i.get||i.set)?Object.defineProperty(t.prototype,r,i):t.prototype[r]=e.prototype[r]}})})}function Z(t){function e(){}e.prototype=t;var n=new e;function r(){return typeof n.bar}return r(),r(),t}function Q(t){return t[t.length-1]}function J(t){var e=(new Date).getTime(),n=t();return{time:(new Date).getTime()-e,value:n}}Object.defineProperty(e,\"__esModule\",{value:!0}),e.isEmpty=r,e.keys=i,e.values=o,e.mapValues=a,e.map=s,e.flatten=c,e.first=u,e.last=l,e.forEach=p,e.isString=h,e.isUndefined=f,e.isFunction=d,e.drop=m,e.dropRight=E,e.filter=T,e.reject=y,e.pick=v,e.has=R,e.contains=A,e.cloneArr=_,e.cloneObj=g,e.find=N,e.findAll=I,e.reduce=O,e.compact=S,e.uniq=L,e.partial=P,e.isArray=C,e.isRegExp=k,e.isObject=x,e.every=M,e.difference=F,e.some=b,e.indexOf=D,e.sortBy=U,e.zipObject=w,e.assign=G,e.assignNoOverwrite=K,e.defaults=B,e.groupBy=W,e.merge=j,e.NOOP=V,e.IDENTITY=Y,e.packArray=X,e.PRINT_ERROR=z,e.PRINT_WARNING=H,e.isES2015MapSupported=q,e.applyMixins=$,e.toFastProperties=Z,e.peek=Q,e.timer=J},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(0),a=n(3),s=function(){function t(t){this.definition=t}return t.prototype.accept=function(t){t.visit(this),o.forEach(this.definition,function(e){e.accept(t)})},t}();e.AbstractProduction=s;var c=function(t){function e(e){var n=t.call(this,[])||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),Object.defineProperty(e.prototype,\"definition\",{get:function(){return void 0!==this.referencedRule?this.referencedRule.definition:[]},set:function(t){},enumerable:!0,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(s);e.NonTerminal=c;var u=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.orgText=\"\",o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.Rule=u;var l=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.ignoreAmbiguities=!1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.Flat=l;var p=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.Option=p;var h=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.RepetitionMandatory=h;var f=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.RepetitionMandatoryWithSeparator=f;var d=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.Repetition=d;var m=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.RepetitionWithSeparator=m;var E=function(t){function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,n.ignoreAmbiguities=!1,n.hasPredicates=!1,o.assign(n,o.pick(e,function(t){return void 0!==t})),n}return i(e,t),e}(s);e.Alternation=E;var T=function(){function t(t){this.idx=1,o.assign(this,o.pick(t,function(t){return void 0!==t}))}return t.prototype.accept=function(t){t.visit(this)},t}();function y(t){function e(t){return o.map(t,y)}if(t instanceof c)return{type:\"NonTerminal\",name:t.nonTerminalName,idx:t.idx};if(t instanceof l)return{type:\"Flat\",definition:e(t.definition)};if(t instanceof p)return{type:\"Option\",idx:t.idx,definition:e(t.definition)};if(t instanceof h)return{type:\"RepetitionMandatory\",name:t.name,idx:t.idx,definition:e(t.definition)};if(t instanceof f)return{type:\"RepetitionMandatoryWithSeparator\",name:t.name,idx:t.idx,separator:y(new T({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof m)return{type:\"RepetitionWithSeparator\",name:t.name,idx:t.idx,separator:y(new T({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof d)return{type:\"Repetition\",name:t.name,idx:t.idx,definition:e(t.definition)};if(t instanceof E)return{type:\"Alternation\",name:t.name,idx:t.idx,definition:e(t.definition)};if(t instanceof T){var n={type:\"Terminal\",name:t.terminalType.name,label:a.tokenLabel(t.terminalType),idx:t.idx},r=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(n.pattern=o.isRegExp(r)?r.source:r),n}if(t instanceof u)return{type:\"Rule\",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error(\"non exhaustive match\")}e.Terminal=T,e.serializeGrammar=function(t){return o.map(t,y)},e.serializeProduction=y},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(0),a=n(27),s=n(3),c=n(17),u=n(10),l=n(24),p=n(25),h=n(30),f=n(31),d=n(33),m=n(34),E=n(35),T=n(36),y=n(37),v=n(38),R=n(39);e.END_OF_FILE=s.createTokenInstance(s.EOF,\"\",NaN,NaN,NaN,NaN,NaN,NaN),Object.freeze(e.END_OF_FILE),e.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:4,ignoredIssues:{},dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:u.defaultParserErrorProvider,nodeLocationTracking:\"none\",traceInitPerf:!1,skipValidations:!1}),e.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0}),function(t){t[t.INVALID_RULE_NAME=0]=\"INVALID_RULE_NAME\",t[t.DUPLICATE_RULE_NAME=1]=\"DUPLICATE_RULE_NAME\",t[t.INVALID_RULE_OVERRIDE=2]=\"INVALID_RULE_OVERRIDE\",t[t.DUPLICATE_PRODUCTIONS=3]=\"DUPLICATE_PRODUCTIONS\",t[t.UNRESOLVED_SUBRULE_REF=4]=\"UNRESOLVED_SUBRULE_REF\",t[t.LEFT_RECURSION=5]=\"LEFT_RECURSION\",t[t.NONE_LAST_EMPTY_ALT=6]=\"NONE_LAST_EMPTY_ALT\",t[t.AMBIGUOUS_ALTS=7]=\"AMBIGUOUS_ALTS\",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]=\"CONFLICT_TOKENS_RULES_NAMESPACE\",t[t.INVALID_TOKEN_NAME=9]=\"INVALID_TOKEN_NAME\",t[t.INVALID_NESTED_RULE_NAME=10]=\"INVALID_NESTED_RULE_NAME\",t[t.DUPLICATE_NESTED_NAME=11]=\"DUPLICATE_NESTED_NAME\",t[t.NO_NON_EMPTY_LOOKAHEAD=12]=\"NO_NON_EMPTY_LOOKAHEAD\",t[t.AMBIGUOUS_PREFIX_ALTS=13]=\"AMBIGUOUS_PREFIX_ALTS\",t[t.TOO_MANY_ALTS=14]=\"TOO_MANY_ALTS\"}(e.ParserDefinitionErrorType||(e.ParserDefinitionErrorType={})),e.EMPTY_ALT=function(t){return void 0===t&&(t=void 0),function(){return t}};var A=function(){function t(t,n){void 0===n&&(n=e.DEFAULT_PARSER_CONFIG),this.ignoredIssues=e.DEFAULT_PARSER_CONFIG.ignoredIssues,this.definitionErrors=[],this.selfAnalysisDone=!1;this.initErrorHandler(n),this.initLexerAdapter(),this.initLooksAhead(n),this.initRecognizerEngine(t,n),this.initRecoverable(n),this.initTreeBuilder(n),this.initContentAssist(),this.initGastRecorder(n),this.initPerformanceTracer(n),o.has(n,\"ignoredIssues\")&&n.ignoredIssues!==e.DEFAULT_PARSER_CONFIG.ignoredIssues&&o.PRINT_WARNING(\"The <ignoredIssues> IParserConfig property is soft-deprecated and will be removed in future versions.\\n\\tPlease use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\"),this.ignoredIssues=o.has(n,\"ignoredIssues\")?n.ignoredIssues:e.DEFAULT_PARSER_CONFIG.ignoredIssues,this.skipValidations=o.has(n,\"skipValidations\")?n.skipValidations:e.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(t){t.performSelfAnalysis()},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT(\"performSelfAnalysis\",function(){var n;e.selfAnalysisDone=!0;var r=e.className;e.TRACE_INIT(\"toFastProps\",function(){o.toFastProperties(e)}),e.TRACE_INIT(\"Grammar Recording\",function(){try{e.enableRecording(),o.forEach(e.definedRulesNames,function(t){var n=e[t].originalGrammarAction,r=void 0;e.TRACE_INIT(t+\" Rule\",function(){r=e.topLevelRuleRecord(t,n)}),e.gastProductionsCache[t]=r})}finally{e.disableRecording()}});var i=[];if(e.TRACE_INIT(\"Grammar Resolving\",function(){i=l.resolveGrammar({rules:o.values(e.gastProductionsCache)}),e.definitionErrors.push.apply(e.definitionErrors,i)}),e.TRACE_INIT(\"Grammar Validations\",function(){if(o.isEmpty(i)&&!1===e.skipValidations){var t=l.validateGrammar({rules:o.values(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:o.values(e.tokensMap),ignoredIssues:e.ignoredIssues,errMsgProvider:u.defaultGrammarValidatorErrorProvider,grammarName:r});e.definitionErrors.push.apply(e.definitionErrors,t)}}),o.isEmpty(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT(\"computeAllProdsFollows\",function(){var t=a.computeAllProdsFollows(o.values(e.gastProductionsCache));e.resyncFollows=t}),e.TRACE_INIT(\"ComputeLookaheadFunctions\",function(){e.preComputeLookaheadFunctions(o.values(e.gastProductionsCache))})),e.TRACE_INIT(\"expandAllNestedRuleNames\",function(){var t=c.expandAllNestedRuleNames(o.values(e.gastProductionsCache),e.fullRuleNameToShort);e.allRuleNames=t.allRuleNames}),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!o.isEmpty(e.definitionErrors))throw n=o.map(e.definitionErrors,function(t){return t.message}),new Error(\"Parser Definition Errors detected:\\n \"+n.join(\"\\n-------------------------------\\n\"))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();e.Parser=A,o.applyMixins(A,[p.Recoverable,h.LooksAhead,f.TreeBuilder,d.LexerAdapter,E.RecognizerEngine,m.RecognizerApi,T.ErrorHandler,y.ContentAssist,v.GastRecorder,R.PerformanceTracer]);var _=function(t){function n(n,r){void 0===r&&(r=e.DEFAULT_PARSER_CONFIG);var i=o.cloneObj(r);return i.outputCst=!0,t.call(this,n,i)||this}return i(n,t),n}(A);e.CstParser=_;var g=function(t){function n(n,r){void 0===r&&(r=e.DEFAULT_PARSER_CONFIG);var i=o.cloneObj(r);return i.outputCst=!1,t.call(this,n,i)||this}return i(n,t),n}(A);e.EmbeddedActionsParser=g},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(9),o=n(5);function a(t){return r.isString(t.LABEL)&&\"\"!==t.LABEL}e.tokenLabel=function(t){return a(t)?t.LABEL:t.name},e.tokenName=function(t){return t.name},e.hasTokenLabel=a;var s=\"parent\",c=\"categories\",u=\"label\",l=\"group\",p=\"push_mode\",h=\"pop_mode\",f=\"longer_alt\",d=\"line_breaks\",m=\"start_chars_hint\";function E(t){return function(t){var e=t.pattern,n={};n.name=t.name,r.isUndefined(e)||(n.PATTERN=e);if(r.has(t,s))throw\"The parent property is no longer supported.\\nSee: https://github.com/SAP/chevrotain/issues/564#issuecomment-349062346 for details.\";r.has(t,c)&&(n.CATEGORIES=t[c]);o.augmentTokenTypes([n]),r.has(t,u)&&(n.LABEL=t[u]);r.has(t,l)&&(n.GROUP=t[l]);r.has(t,h)&&(n.POP_MODE=t[h]);r.has(t,p)&&(n.PUSH_MODE=t[p]);r.has(t,f)&&(n.LONGER_ALT=t[f]);r.has(t,d)&&(n.LINE_BREAKS=t[d]);r.has(t,m)&&(n.START_CHARS_HINT=t[m]);return n}(t)}e.createToken=E,e.EOF=E({name:\"EOF\",pattern:i.Lexer.NA}),o.augmentTokenTypes([e.EOF]),e.createTokenInstance=function(t,e,n,r,i,o,a,s){return{image:e,startOffset:n,endOffset:r,startLine:i,endLine:o,startColumn:a,endColumn:s,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}},e.tokenMatcher=function(t,e){return o.tokenStructuredMatcher(t,e)}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(1),i=function(){function t(){}return t.prototype.visit=function(t){var e=t;switch(e.constructor){case r.NonTerminal:return this.visitNonTerminal(e);case r.Flat:return this.visitFlat(e);case r.Option:return this.visitOption(e);case r.RepetitionMandatory:return this.visitRepetitionMandatory(e);case r.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(e);case r.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(e);case r.Repetition:return this.visitRepetition(e);case r.Alternation:return this.visitAlternation(e);case r.Terminal:return this.visitTerminal(e);case r.Rule:return this.visitRule(e);default:throw Error(\"non exhaustive match\")}},t.prototype.visitNonTerminal=function(t){},t.prototype.visitFlat=function(t){},t.prototype.visitOption=function(t){},t.prototype.visitRepetition=function(t){},t.prototype.visitRepetitionMandatory=function(t){},t.prototype.visitRepetitionMandatoryWithSeparator=function(t){},t.prototype.visitRepetitionWithSeparator=function(t){},t.prototype.visitAlternation=function(t){},t.prototype.visitTerminal=function(t){},t.prototype.visitRule=function(t){},t}();e.GAstVisitor=i},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0);function i(t){for(var e=r.cloneArr(t),n=t,i=!0;i;){n=r.compact(r.flatten(r.map(n,function(t){return t.CATEGORIES})));var o=r.difference(n,e);e=e.concat(o),r.isEmpty(o)?i=!1:n=o}return e}function o(t){r.forEach(t,function(t){u(t)||(e.tokenIdxToClass[e.tokenShortNameIdx]=t,t.tokenTypeIdx=e.tokenShortNameIdx++),l(t)&&!r.isArray(t.CATEGORIES)&&(t.CATEGORIES=[t.CATEGORIES]),l(t)||(t.CATEGORIES=[]),p(t)||(t.categoryMatches=[]),h(t)||(t.categoryMatchesMap={})})}function a(t){r.forEach(t,function(t){t.categoryMatches=[],r.forEach(t.categoryMatchesMap,function(n,r){t.categoryMatches.push(e.tokenIdxToClass[r].tokenTypeIdx)})})}function s(t){r.forEach(t,function(t){c([],t)})}function c(t,e){r.forEach(t,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),r.forEach(e.CATEGORIES,function(n){var i=t.concat(e);r.contains(i,n)||c(i,n)})}function u(t){return r.has(t,\"tokenTypeIdx\")}function l(t){return r.has(t,\"CATEGORIES\")}function p(t){return r.has(t,\"categoryMatches\")}function h(t){return r.has(t,\"categoryMatchesMap\")}e.tokenStructuredMatcher=function(t,e){var n=t.tokenTypeIdx;return n===e.tokenTypeIdx||!0===e.isParent&&!0===e.categoryMatchesMap[n]},e.tokenStructuredMatcherNoCategories=function(t,e){return t.tokenTypeIdx===e.tokenTypeIdx},e.tokenShortNameIdx=1,e.tokenIdxToClass={},e.augmentTokenTypes=function(t){var e=i(t);o(e),s(e),a(e),r.forEach(e,function(t){t.isParent=t.categoryMatches.length>0})},e.expandCategories=i,e.assignTokenDefaultProps=o,e.assignCategoriesTokensProp=a,e.assignCategoriesMapProp=s,e.singleAssignCategoriesToksMap=c,e.hasShortKeyProperty=u,e.hasCategoriesProperty=l,e.hasExtendingTokensTypesProperty=p,e.hasExtendingTokensTypesMapProperty=h,e.isTokenType=function(t){return r.has(t,\"tokenTypeIdx\")}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(0),a=n(1),s=n(4);e.isSequenceProd=function(t){return t instanceof a.Flat||t instanceof a.Option||t instanceof a.Repetition||t instanceof a.RepetitionMandatory||t instanceof a.RepetitionMandatoryWithSeparator||t instanceof a.RepetitionWithSeparator||t instanceof a.Terminal||t instanceof a.Rule},e.isOptionalProd=function t(e,n){return void 0===n&&(n=[]),!!(e instanceof a.Option||e instanceof a.Repetition||e instanceof a.RepetitionWithSeparator)||(e instanceof a.Alternation?o.some(e.definition,function(e){return t(e,n)}):!(e instanceof a.NonTerminal&&o.contains(n,e))&&e instanceof a.AbstractProduction&&(e instanceof a.NonTerminal&&n.push(e),o.every(e.definition,function(e){return t(e,n)})))},e.isBranchingProd=function(t){return t instanceof a.Alternation},e.getProductionDslName=function(t){if(t instanceof a.NonTerminal)return\"SUBRULE\";if(t instanceof a.Option)return\"OPTION\";if(t instanceof a.Alternation)return\"OR\";if(t instanceof a.RepetitionMandatory)return\"AT_LEAST_ONE\";if(t instanceof a.RepetitionMandatoryWithSeparator)return\"AT_LEAST_ONE_SEP\";if(t instanceof a.RepetitionWithSeparator)return\"MANY_SEP\";if(t instanceof a.Repetition)return\"MANY\";if(t instanceof a.Terminal)return\"CONSUME\";throw Error(\"non exhaustive match\")};var c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.separator=\"-\",e.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},e}return i(e,t),e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var e=t.terminalType.name+this.separator+\"Terminal\";o.has(this.dslMethods,e)||(this.dslMethods[e]=[]),this.dslMethods[e].push(t)},e.prototype.visitNonTerminal=function(t){var e=t.nonTerminalName+this.separator+\"Terminal\";o.has(this.dslMethods,e)||(this.dslMethods[e]=[]),this.dslMethods[e].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(s.GAstVisitor);e.DslMethodsCollectorVisitor=c;var u=new c;e.collectMethods=function(t){u.reset(),t.accept(u);var e=u.dslMethods;return u.reset(),e}},function(t,e,n){\"use strict\";function r(t,e,n){return n|e|t}Object.defineProperty(e,\"__esModule\",{value:!0}),e.BITS_FOR_METHOD_TYPE=4,e.BITS_FOR_OCCURRENCE_IDX=8,e.BITS_FOR_RULE_IDX=12,e.BITS_FOR_ALT_IDX=8,e.OR_IDX=1<<e.BITS_FOR_OCCURRENCE_IDX,e.OPTION_IDX=2<<e.BITS_FOR_OCCURRENCE_IDX,e.MANY_IDX=3<<e.BITS_FOR_OCCURRENCE_IDX,e.AT_LEAST_ONE_IDX=4<<e.BITS_FOR_OCCURRENCE_IDX,e.MANY_SEP_IDX=5<<e.BITS_FOR_OCCURRENCE_IDX,e.AT_LEAST_ONE_SEP_IDX=6<<e.BITS_FOR_OCCURRENCE_IDX,e.getKeyForAutomaticLookahead=r;var i=32-e.BITS_FOR_ALT_IDX;e.getKeyForAltIndex=function(t,e,n,o){var a=o+1<<i;return r(t,e,n)|a}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=\"MismatchedTokenException\",o=\"NoViableAltException\",a=\"EarlyExitException\",s=\"NotAllInputParsedException\",c=[i,o,a,s];function u(t,e,n){this.name=i,this.message=t,this.token=e,this.previousToken=n,this.resyncedTokens=[]}function l(t,e,n){this.name=o,this.message=t,this.token=e,this.previousToken=n,this.resyncedTokens=[]}function p(t,e){this.name=s,this.message=t,this.token=e,this.resyncedTokens=[]}function h(t,e,n){this.name=a,this.message=t,this.token=e,this.previousToken=n,this.resyncedTokens=[]}Object.freeze(c),e.isRecognitionException=function(t){return r.contains(c,t.name)},e.MismatchedTokenException=u,u.prototype=Error.prototype,e.NoViableAltException=l,l.prototype=Error.prototype,e.NotAllInputParsedException=p,p.prototype=Error.prototype,e.EarlyExitException=h,h.prototype=Error.prototype},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(20),i=n(0),o=n(5),a=n(21),s=n(16);!function(t){t[t.MISSING_PATTERN=0]=\"MISSING_PATTERN\",t[t.INVALID_PATTERN=1]=\"INVALID_PATTERN\",t[t.EOI_ANCHOR_FOUND=2]=\"EOI_ANCHOR_FOUND\",t[t.UNSUPPORTED_FLAGS_FOUND=3]=\"UNSUPPORTED_FLAGS_FOUND\",t[t.DUPLICATE_PATTERNS_FOUND=4]=\"DUPLICATE_PATTERNS_FOUND\",t[t.INVALID_GROUP_TYPE_FOUND=5]=\"INVALID_GROUP_TYPE_FOUND\",t[t.PUSH_MODE_DOES_NOT_EXIST=6]=\"PUSH_MODE_DOES_NOT_EXIST\",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]=\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]=\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]=\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]=\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\",t[t.SOI_ANCHOR_FOUND=11]=\"SOI_ANCHOR_FOUND\",t[t.EMPTY_MATCH_PATTERN=12]=\"EMPTY_MATCH_PATTERN\",t[t.NO_LINE_BREAKS_FLAGS=13]=\"NO_LINE_BREAKS_FLAGS\",t[t.UNREACHABLE_PATTERN=14]=\"UNREACHABLE_PATTERN\",t[t.IDENTIFY_TERMINATOR=15]=\"IDENTIFY_TERMINATOR\",t[t.CUSTOM_LINE_BREAK=16]=\"CUSTOM_LINE_BREAK\"}(e.LexerDefinitionErrorType||(e.LexerDefinitionErrorType={}));var c={deferDefinitionErrorsHandling:!1,positionTracking:\"full\",lineTerminatorsPattern:/\\n|\\r\\n?/g,lineTerminatorCharacters:[\"\\n\",\"\\r\"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:a.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(c);var u=function(){function t(t,e){var n=this;if(void 0===e&&(e=c),this.lexerDefinition=t,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},\"boolean\"==typeof e)throw Error(\"The second argument to the Lexer constructor is now an ILexerConfig Object.\\na boolean 2nd argument is no longer supported\");this.config=i.merge(c,e);var a=this.config.traceInitPerf;!0===a?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):\"number\"==typeof a&&(this.traceInitMaxIdent=a,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT(\"Lexer Constructor\",function(){var a,u=!0;n.TRACE_INIT(\"Lexer Config handling\",function(){if(n.config.lineTerminatorsPattern===c.lineTerminatorsPattern)n.config.lineTerminatorsPattern=r.LineTerminatorOptimizedTester;else if(n.config.lineTerminatorCharacters===c.lineTerminatorCharacters)throw Error(\"Error: Missing <lineTerminatorCharacters> property on the Lexer config.\\n\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\");if(e.safeMode&&e.ensureOptimizations)throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');n.trackStartLines=/full|onlyStart/i.test(n.config.positionTracking),n.trackEndLines=/full/i.test(n.config.positionTracking),i.isArray(t)?((a={modes:{}}).modes[r.DEFAULT_MODE]=i.cloneArr(t),a[r.DEFAULT_MODE]=r.DEFAULT_MODE):(u=!1,a=i.cloneObj(t))}),!1===n.config.skipValidations&&(n.TRACE_INIT(\"performRuntimeChecks\",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat(r.performRuntimeChecks(a,n.trackStartLines,n.config.lineTerminatorCharacters))}),n.TRACE_INIT(\"performWarningRuntimeChecks\",function(){n.lexerDefinitionWarning=n.lexerDefinitionWarning.concat(r.performWarningRuntimeChecks(a,n.trackStartLines,n.config.lineTerminatorCharacters))})),a.modes=a.modes?a.modes:{},i.forEach(a.modes,function(t,e){a.modes[e]=i.reject(t,function(t){return i.isUndefined(t)})});var l=i.keys(a.modes);if(i.forEach(a.modes,function(t,a){n.TRACE_INIT(\"Mode: <\"+a+\"> processing\",function(){var s;(n.modes.push(a),!1===n.config.skipValidations&&n.TRACE_INIT(\"validatePatterns\",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat(r.validatePatterns(t,l))}),i.isEmpty(n.lexerDefinitionErrors))&&(o.augmentTokenTypes(t),n.TRACE_INIT(\"analyzeTokenTypes\",function(){s=r.analyzeTokenTypes(t,{lineTerminatorCharacters:n.config.lineTerminatorCharacters,positionTracking:e.positionTracking,ensureOptimizations:e.ensureOptimizations,safeMode:e.safeMode,tracer:n.TRACE_INIT.bind(n)})}),n.patternIdxToConfig[a]=s.patternIdxToConfig,n.charCodeToPatternIdxToConfig[a]=s.charCodeToPatternIdxToConfig,n.emptyGroups=i.merge(n.emptyGroups,s.emptyGroups),n.hasCustom=s.hasCustom||n.hasCustom,n.canModeBeOptimized[a]=s.canBeOptimized)})}),n.defaultMode=a.defaultMode,!i.isEmpty(n.lexerDefinitionErrors)&&!n.config.deferDefinitionErrorsHandling){var p=i.map(n.lexerDefinitionErrors,function(t){return t.message}).join(\"-----------------------\\n\");throw new Error(\"Errors detected in definition of Lexer:\\n\"+p)}i.forEach(n.lexerDefinitionWarning,function(t){i.PRINT_WARNING(t.message)}),n.TRACE_INIT(\"Choosing sub-methods implementations\",function(){if(r.SUPPORT_STICKY?(n.chopInput=i.IDENTITY,n.match=n.matchWithTest):(n.updateLastIndex=i.NOOP,n.match=n.matchWithExec),u&&(n.handleModes=i.NOOP),!1===n.trackStartLines&&(n.computeNewColumn=i.IDENTITY),!1===n.trackEndLines&&(n.updateTokenEndLineColumnLocation=i.NOOP),/full/i.test(n.config.positionTracking))n.createTokenInstance=n.createFullToken;else if(/onlyStart/i.test(n.config.positionTracking))n.createTokenInstance=n.createStartOnlyToken;else{if(!/onlyOffset/i.test(n.config.positionTracking))throw Error('Invalid <positionTracking> config option: \"'+n.config.positionTracking+'\"');n.createTokenInstance=n.createOffsetOnlyToken}n.hasCustom?(n.addToken=n.addTokenUsingPush,n.handlePayload=n.handlePayloadWithCustom):(n.addToken=n.addTokenUsingMemberAccess,n.handlePayload=n.handlePayloadNoCustom)}),n.TRACE_INIT(\"Failed Optimization Warnings\",function(){var t=i.reduce(n.canModeBeOptimized,function(t,e,n){return!1===e&&t.push(n),t},[]);if(e.ensureOptimizations&&!i.isEmpty(t))throw Error(\"Lexer Modes: < \"+t.join(\", \")+' > cannot be optimized.\\n\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n\\t Or inspect the console log for details on how to resolve these issues.')}),n.TRACE_INIT(\"clearRegExpParserCache\",function(){s.clearRegExpParserCache()}),n.TRACE_INIT(\"toFastProperties\",function(){i.toFastProperties(n)})})}return t.prototype.tokenize=function(t,e){if(void 0===e&&(e=this.defaultMode),!i.isEmpty(this.lexerDefinitionErrors)){var n=i.map(this.lexerDefinitionErrors,function(t){return t.message}).join(\"-----------------------\\n\");throw new Error(\"Unable to Tokenize because Errors detected in definition of Lexer:\\n\"+n)}return this.tokenizeInternal(t,e)},t.prototype.tokenizeInternal=function(t,e){var n,o,a,s,c,u,l,p,h,f,d,m,E,T,y=this,v=t,R=v.length,A=0,_=0,g=this.hasCustom?0:Math.floor(t.length/10),N=new Array(g),I=[],O=this.trackStartLines?1:void 0,S=this.trackStartLines?1:void 0,L=r.cloneEmptyGroups(this.emptyGroups),P=this.trackStartLines,C=this.config.lineTerminatorsPattern,k=0,x=[],M=[],F=[],b=[];Object.freeze(b);var D=void 0;function U(){return x}function w(t){var e=r.charCodeToOptimizedIndex(t),n=M[e];return void 0===n?b:n}var G,K=function(t){if(1===F.length&&void 0===t.tokenType.PUSH_MODE){var e=y.config.errorMessageProvider.buildUnableToPopLexerModeMessage(t);I.push({offset:t.startOffset,line:void 0!==t.startLine?t.startLine:void 0,column:void 0!==t.startColumn?t.startColumn:void 0,length:t.image.length,message:e})}else{F.pop();var n=i.last(F);x=y.patternIdxToConfig[n],M=y.charCodeToPatternIdxToConfig[n],k=x.length;var r=y.canModeBeOptimized[n]&&!1===y.config.safeMode;D=M&&r?w:U}};function B(t){F.push(t),M=this.charCodeToPatternIdxToConfig[t],x=this.patternIdxToConfig[t],k=x.length,k=x.length;var e=this.canModeBeOptimized[t]&&!1===this.config.safeMode;D=M&&e?w:U}for(B.call(this,e);A<R;){c=null;var W=v.charCodeAt(A),j=D(W),V=j.length;for(n=0;n<V;n++){var Y=(G=j[n]).pattern;if(u=null,!1!==(et=G.short)?W===et&&(c=Y):!0===G.isCustom?null!==(T=Y.exec(v,A,N,L))?(c=T[0],void 0!==T.payload&&(u=T.payload)):c=null:(this.updateLastIndex(Y,A),c=this.match(Y,t,A)),null!==c){if(void 0!==(s=G.longerAlt)){var X=x[s],z=X.pattern;l=null,!0===X.isCustom?null!==(T=z.exec(v,A,N,L))?(a=T[0],void 0!==T.payload&&(l=T.payload)):a=null:(this.updateLastIndex(z,A),a=this.match(z,t,A)),a&&a.length>c.length&&(c=a,u=l,G=X)}break}}if(null!==c){if(p=c.length,void 0!==(h=G.group)&&(f=G.tokenTypeIdx,d=this.createTokenInstance(c,A,f,G.tokenType,O,S,p),this.handlePayload(d,u),!1===h?_=this.addToken(N,_,d):L[h].push(d)),t=this.chopInput(t,p),A+=p,S=this.computeNewColumn(S,p),!0===P&&!0===G.canLineTerminator){var H=0,q=void 0,$=void 0;C.lastIndex=0;do{!0===(q=C.test(c))&&($=C.lastIndex-1,H++)}while(!0===q);0!==H&&(O+=H,S=p-$,this.updateTokenEndLineColumnLocation(d,h,$,H,O,S,p))}this.handleModes(G,K,B,d)}else{for(var Z=A,Q=O,J=S,tt=!1;!tt&&A<R;)for(v.charCodeAt(A),t=this.chopInput(t,1),A++,o=0;o<k;o++){var et,nt=x[o];Y=nt.pattern;if(!1!==(et=nt.short)?v.charCodeAt(A)===et&&(tt=!0):!0===nt.isCustom?tt=null!==Y.exec(v,A,N,L):(this.updateLastIndex(Y,A),tt=null!==Y.exec(t)),!0===tt)break}m=A-Z,E=this.config.errorMessageProvider.buildUnexpectedCharactersMessage(v,Z,m,Q,J),I.push({offset:Z,line:Q,column:J,length:m,message:E})}}return this.hasCustom||(N.length=_),{tokens:N,groups:L,errors:I}},t.prototype.handleModes=function(t,e,n,r){if(!0===t.pop){var i=t.push;e(r),void 0!==i&&n.call(this,i)}else void 0!==t.push&&n.call(this,t.push)},t.prototype.chopInput=function(t,e){return t.substring(e)},t.prototype.updateLastIndex=function(t,e){t.lastIndex=e},t.prototype.updateTokenEndLineColumnLocation=function(t,e,n,r,i,o,a){var s,c;void 0!==e&&(c=(s=n===a-1)?-1:0,1===r&&!0===s||(t.endLine=i+c,t.endColumn=o-1-c))},t.prototype.computeNewColumn=function(t,e){return t+e},t.prototype.createTokenInstance=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return null},t.prototype.createOffsetOnlyToken=function(t,e,n,r){return{image:t,startOffset:e,tokenTypeIdx:n,tokenType:r}},t.prototype.createStartOnlyToken=function(t,e,n,r,i,o){return{image:t,startOffset:e,startLine:i,startColumn:o,tokenTypeIdx:n,tokenType:r}},t.prototype.createFullToken=function(t,e,n,r,i,o,a){return{image:t,startOffset:e,endOffset:e+a-1,startLine:i,endLine:i,startColumn:o,endColumn:o+a-1,tokenTypeIdx:n,tokenType:r}},t.prototype.addToken=function(t,e,n){return 666},t.prototype.addTokenUsingPush=function(t,e,n){return t.push(n),e},t.prototype.addTokenUsingMemberAccess=function(t,e,n){return t[e]=n,++e},t.prototype.handlePayload=function(t,e){},t.prototype.handlePayloadNoCustom=function(t,e){},t.prototype.handlePayloadWithCustom=function(t,e){null!==e&&(t.payload=e)},t.prototype.match=function(t,e,n){return null},t.prototype.matchWithTest=function(t,e,n){return!0===t.test(e)?e.substring(n,t.lastIndex):null},t.prototype.matchWithExec=function(t,e){var n=t.exec(e);return null!==n?n[0]:n},t.prototype.TRACE_INIT=function(t,e){if(!0===this.traceInitPerf){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join(\"\\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(n+\"--\\x3e <\"+t+\">\");var r=i.timer(e),o=r.time,a=r.value,s=o>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(n+\"<-- <\"+t+\"> time: \"+o+\"ms\"),this.traceInitIndent--,a}return e()},t.SKIPPED=\"This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\",t.NA=/NOT_APPLICABLE/,t}();e.Lexer=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(3),i=n(0),o=n(0),a=n(1),s=n(6),c=n(11);e.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,n=t.actual;t.previous,t.ruleName;return\"Expecting \"+(r.hasTokenLabel(e)?\"--\\x3e \"+r.tokenLabel(e)+\" <--\":\"token of type --\\x3e \"+e.name+\" <--\")+\" but found --\\x3e '\"+n.image+\"' <--\"},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant;t.ruleName;return\"Redundant input, expecting EOF but found: \"+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,n=t.actual,i=(t.previous,t.customUserDescription),a=(t.ruleName,\"\\nbut found: '\"+o.first(n).image+\"'\");if(i)return\"Expecting: \"+i+a;var s=o.reduce(e,function(t,e){return t.concat(e)},[]),c=o.map(s,function(t){return\"[\"+o.map(t,function(t){return r.tokenLabel(t)}).join(\", \")+\"]\"});return\"Expecting: \"+(\"one of these possible Token sequences:\\n\"+o.map(c,function(t,e){return\"  \"+(e+1)+\". \"+t}).join(\"\\n\"))+a},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,n=t.actual,i=t.customUserDescription,a=(t.ruleName,\"\\nbut found: '\"+o.first(n).image+\"'\");return i?\"Expecting: \"+i+a:\"Expecting: \"+(\"expecting at least one iteration which starts with one of these possible Token sequences::\\n  <\"+o.map(e,function(t){return\"[\"+o.map(t,function(t){return r.tokenLabel(t)}).join(\",\")+\"]\"}).join(\" ,\")+\">\")+a}},Object.freeze(e.defaultParserErrorProvider),e.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){return\"Invalid grammar, reference to a rule which is not defined: ->\"+e.nonTerminalName+\"<-\\ninside top level rule: ->\"+t.name+\"<-\"}},e.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){var n,r=t.name,i=o.first(e),c=i.idx,u=s.getProductionDslName(i),l=(n=i)instanceof a.Terminal?n.terminalType.name:n instanceof a.NonTerminal?n.nonTerminalName:\"\",p=\"->\"+u+(c>0?c:\"\")+\"<- \"+(l?\"with argument: ->\"+l+\"<-\":\"\")+\"\\n                  appears more than once (\"+e.length+\" times) in the top level rule: ->\"+r+\"<-.                  \\n                  For further details see: https://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES \\n                  \";return p=(p=p.replace(/[ \\t]+/g,\" \")).replace(/\\s\\s+/g,\"\\n\")},buildInvalidNestedRuleNameError:function(t,e){return\"Invalid nested rule name: ->\"+e.name+\"<- inside rule: ->\"+t.name+\"<-\\nit must match the pattern: ->\"+c.validNestedRuleName.toString()+\"<-.\\nNote that this means a nested rule name must start with the '$'(dollar) sign.\"},buildDuplicateNestedRuleNameError:function(t,e){return\"Duplicate nested rule name: ->\"+o.first(e).name+\"<- inside rule: ->\"+t.name+\"<-\\nA nested name must be unique in the scope of a top level grammar rule.\"},buildNamespaceConflictError:function(t){return\"Namespace conflict found in grammar.\\nThe grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\"+t.name+\">.\\nTo resolve this make sure each Terminal and Non-Terminal names are unique\\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\nand Non-Terminal names start with a lower case letter.\"},buildAlternationPrefixAmbiguityError:function(t){var e=o.map(t.prefixPath,function(t){return r.tokenLabel(t)}).join(\", \"),n=0===t.alternation.idx?\"\":t.alternation.idx;return\"Ambiguous alternatives: <\"+t.ambiguityIndices.join(\" ,\")+\"> due to common lookahead prefix\\nin <OR\"+n+\"> inside <\"+t.topLevelRule.name+\"> Rule,\\n<\"+e+\"> may appears as a prefix path in all these alternatives.\\nSee: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\nFor Further details.\"},buildAlternationAmbiguityError:function(t){var e=o.map(t.prefixPath,function(t){return r.tokenLabel(t)}).join(\", \"),n=0===t.alternation.idx?\"\":t.alternation.idx,i=\"Ambiguous Alternatives Detected: <\"+t.ambiguityIndices.join(\" ,\")+\"> in <OR\"+n+\"> inside <\"+t.topLevelRule.name+\"> Rule,\\n<\"+e+\"> may appears as a prefix path in all these alternatives.\\n\";return i+=\"See: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\nFor Further details.\"},buildEmptyRepetitionError:function(t){var e=s.getProductionDslName(t.repetition);return 0!==t.repetition.idx&&(e+=t.repetition.idx),\"The repetition <\"+e+\"> within Rule <\"+t.topLevelRule.name+\"> can never consume any tokens.\\nThis could lead to an infinite loop.\"},buildTokenNameError:function(t){return\"Invalid Grammar Token name: ->\"+t.tokenType.name+\"<- it must match the pattern: ->\"+t.expectedPattern.toString()+\"<-\"},buildEmptyAlternationError:function(t){return\"Ambiguous empty alternative: <\"+(t.emptyChoiceIdx+1)+\"> in <OR\"+t.alternation.idx+\"> inside <\"+t.topLevelRule.name+\"> Rule.\\nOnly the last alternative may be an empty alternative.\"},buildTooManyAlternativesError:function(t){return\"An Alternation cannot have more than 256 alternatives:\\n<OR\"+t.alternation.idx+\"> inside <\"+t.topLevelRule.name+\"> Rule.\\n has \"+(t.alternation.definition.length+1)+\" alternatives.\"},buildLeftRecursionError:function(t){var e=t.topLevelRule.name;return\"Left Recursion found in grammar.\\nrule: <\"+e+\"> can be invoked from itself (directly or indirectly)\\nwithout consuming any Tokens. The grammar path that causes this is: \\n \"+(e+\" --\\x3e \"+i.map(t.leftRecursionPath,function(t){return t.name}).concat([e]).join(\" --\\x3e \"))+\"\\n To fix this refactor your grammar to remove the left recursion.\\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.\"},buildInvalidRuleNameError:function(t){return\"Invalid grammar rule name: ->\"+t.topLevelRule.name+\"<- it must match the pattern: ->\"+t.expectedPattern.toString()+\"<-\"},buildDuplicateRuleNameError:function(t){return\"Duplicate definition, rule: ->\"+(t.topLevelRule instanceof a.Rule?t.topLevelRule.name:t.topLevelRule)+\"<- is already defined in the grammar: ->\"+t.grammarName+\"<-\"}}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(0),a=n(0),s=n(2),c=n(6),u=n(12),l=n(17),p=n(13),h=n(1),f=n(4);function d(t){return c.getProductionDslName(t)+\"_#_\"+t.idx+\"_#_\"+m(t)}function m(t){return t instanceof h.Terminal?t.terminalType.name:t instanceof h.NonTerminal?t.nonTerminalName:\"\"}e.validateGrammar=function(t,e,n,r,i,u){var p=o.map(t,function(t){return function(t,e){var n=new E;t.accept(n);var r=n.allProductions,i=o.groupBy(r,d),a=o.pick(i,function(t){return t.length>1});return o.map(o.values(a),function(n){var r=o.first(n),i=e.buildDuplicateFoundError(t,n),a=c.getProductionDslName(r),u={message:i,type:s.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:a,occurrence:r.idx},l=m(r);return l&&(u.parameter=l),u})}(t,i)}),h=o.map(t,function(t){return A(t,t,i)}),f=[],_=[],g=[];a.every(h,a.isEmpty)&&(f=a.map(t,function(t){return N(t,i)}),_=a.map(t,function(t){return I(t,e,r,i)}),g=L(t,e,i));var O=function(t,e,n){var r=[],i=a.map(e,function(t){return t.name});return a.forEach(t,function(t){var e=t.name;if(a.contains(i,e)){var o=n.buildNamespaceConflictError(t);r.push({message:o,type:s.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:e})}}),r}(t,n,i),P=o.map(n,function(t){return v(t,i)}),C=function(t,e){var n=[];return a.forEach(t,function(t){var r=new l.NamedDSLMethodsCollectorVisitor(\"\");t.accept(r);var i=a.map(r.result,function(t){return t.orgProd});n.push(a.map(i,function(n){return y(t,n,e)}))}),a.flatten(n)}(t,i),k=function(t,e){var n=[];return a.forEach(t,function(t){var r=new l.NamedDSLMethodsCollectorVisitor(\"\");t.accept(r);var i=a.groupBy(r.result,function(t){return t.name}),o=a.pick(i,function(t){return t.length>1});a.forEach(a.values(o),function(r){var i=a.map(r,function(t){return t.orgProd}),o=e.buildDuplicateNestedRuleNameError(t,i);n.push({message:o,type:s.ParserDefinitionErrorType.DUPLICATE_NESTED_NAME,ruleName:t.name})})}),n}(t,i),x=a.map(t,function(t){return S(t,i)}),M=a.map(t,function(t){return T(t,i)}),F=a.map(t,function(e){return R(e,t,u,i)});return o.flatten(p.concat(P,C,k,g,h,f,_,O,x,M,F))},e.identifyProductionForDuplicates=d;var E=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return i(e,t),e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(f.GAstVisitor);function T(t,n){var r=[],i=t.name;return i.match(e.validTermsPattern)||r.push({message:n.buildInvalidRuleNameError({topLevelRule:t,expectedPattern:e.validTermsPattern}),type:s.ParserDefinitionErrorType.INVALID_RULE_NAME,ruleName:i}),r}function y(t,n,r){var i,o=[];return n.name.match(e.validNestedRuleName)||(i=r.buildInvalidNestedRuleNameError(t,n),o.push({message:i,type:s.ParserDefinitionErrorType.INVALID_NESTED_RULE_NAME,ruleName:t.name})),o}function v(t,n){var r=[];return t.name.match(e.validTermsPattern)||r.push({message:n.buildTokenNameError({tokenType:t,expectedPattern:e.validTermsPattern}),type:s.ParserDefinitionErrorType.INVALID_TOKEN_NAME}),r}function R(t,e,n,r){var i=[];if(a.reduce(e,function(e,n){return n.name===t.name?e+1:e},0)>1){var o=r.buildDuplicateRuleNameError({topLevelRule:t,grammarName:n});i.push({message:o,type:s.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function A(t,e,n,r){void 0===r&&(r=[]);var i=[],a=_(e.definition);if(o.isEmpty(a))return[];var c=t.name;o.contains(a,t)&&i.push({message:n.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:r}),type:s.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:c});var u=o.difference(a,r.concat([t])),l=o.map(u,function(e){var i=o.cloneArr(r);return i.push(e),A(t,e,n,i)});return i.concat(o.flatten(l))}function _(t){var e=[];if(o.isEmpty(t))return e;var n=o.first(t);if(n instanceof h.NonTerminal)e.push(n.referencedRule);else if(n instanceof h.Flat||n instanceof h.Option||n instanceof h.RepetitionMandatory||n instanceof h.RepetitionMandatoryWithSeparator||n instanceof h.RepetitionWithSeparator||n instanceof h.Repetition)e=e.concat(_(n.definition));else if(n instanceof h.Alternation)e=o.flatten(o.map(n.definition,function(t){return _(t.definition)}));else if(!(n instanceof h.Terminal))throw Error(\"non exhaustive match\");var r=c.isOptionalProd(n),i=t.length>1;if(r&&i){var a=o.drop(t);return e.concat(_(a))}return e}e.OccurrenceValidationCollector=E,e.validTermsPattern=/^[a-zA-Z_]\\w*$/,e.validNestedRuleName=new RegExp(e.validTermsPattern.source.replace(\"^\",\"^\\\\$\")),e.validateRuleName=T,e.validateNestedRuleName=y,e.validateTokenName=v,e.validateRuleDoesNotAlreadyExist=R,e.validateRuleIsOverridden=function(t,e,n){var r,i=[];return o.contains(e,t)||(r=\"Invalid rule override, rule: ->\"+t+\"<- cannot be overridden in the grammar: ->\"+n+\"<-as it is not defined in any of the super grammars \",i.push({message:r,type:s.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),i},e.validateNoLeftRecursion=A,e.getFirstNoneTerminal=_;var g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.alternations=[],e}return i(e,t),e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(f.GAstVisitor);function N(t,e){var n=new g;t.accept(n);var r=n.alternations;return o.reduce(r,function(n,r){var i=o.dropRight(r.definition),a=o.map(i,function(n,i){var a=p.nextPossibleTokensAfter([n],[],null,1);return o.isEmpty(a)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:r,emptyChoiceIdx:i}),type:s.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:r.idx,alternative:i+1}:null});return n.concat(o.compact(a))},[])}function I(t,e,n,r){var i=new g;t.accept(i);var l=i.alternations,p=n[t.name];return p&&(l=a.reject(l,function(t){return p[c.getProductionDslName(t)+(0===t.idx?\"\":t.idx)]})),l=a.reject(l,function(t){return!0===t.ignoreAmbiguities}),o.reduce(l,function(n,i){var c=i.idx,l=i.maxLookahead||e,p=u.getLookaheadPathsForOr(c,t,l,i),h=function(t,e,n,r){var i=[],c=a.reduce(t,function(n,r,o){return!0===e.definition[o].ignoreAmbiguities?n:(a.forEach(r,function(r){var s=[o];a.forEach(t,function(t,n){o!==n&&u.containsPath(t,r)&&!0!==e.definition[n].ignoreAmbiguities&&s.push(n)}),s.length>1&&!u.containsPath(i,r)&&(i.push(r),n.push({alts:s,path:r}))}),n)},[]);return o.map(c,function(t){var i=a.map(t.alts,function(t){return t+1}),o=r.buildAlternationAmbiguityError({topLevelRule:n,alternation:e,ambiguityIndices:i,prefixPath:t.path});return{message:o,type:s.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:e.idx,alternatives:[t.alts]}})}(p,i,t,r),f=P(p,i,t,r);return n.concat(h,f)},[])}e.validateEmptyOrAlternative=N,e.validateAmbiguousAlternationAlternatives=I;var O=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return i(e,t),e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(f.GAstVisitor);function S(t,e){var n=new g;t.accept(n);var r=n.alternations;return o.reduce(r,function(n,r){return r.definition.length>255&&n.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:r}),type:s.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:r.idx}),n},[])}function L(t,e,n){var r=[];return a.forEach(t,function(t){var i=new O;t.accept(i);var o=i.allProductions;a.forEach(o,function(i){var o=u.getProdType(i),c=i.maxLookahead||e,l=i.idx,p=u.getLookaheadPathsForOptionalProd(l,t,o,c)[0];if(a.isEmpty(a.flatten(p))){var h=n.buildEmptyRepetitionError({topLevelRule:t,repetition:i});r.push({message:h,type:s.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:t.name})}})}),r}function P(t,e,n,r){var i=[],o=a.reduce(t,function(t,e,n){var r=a.map(e,function(t){return{idx:n,path:t}});return t.concat(r)},[]);return a.forEach(o,function(t){if(!0!==e.definition[t.idx].ignoreAmbiguities){var c=t.idx,l=t.path,p=a.findAll(o,function(t){return!0!==e.definition[t.idx].ignoreAmbiguities&&t.idx<c&&u.isStrictPrefixOfPath(t.path,l)}),h=a.map(p,function(t){var i=[t.idx+1,c+1],o=0===e.idx?\"\":e.idx;return{message:r.buildAlternationPrefixAmbiguityError({topLevelRule:n,alternation:e,ambiguityIndices:i,prefixPath:t.path}),type:s.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,ruleName:n.name,occurrence:o,alternatives:i}});i=i.concat(h)}}),i}e.RepetionCollector=O,e.validateTooManyAlts=S,e.validateSomeNonEmptyLookaheadPath=L,e.checkPrefixAlternativesAmbiguities=P},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o,a=n(0),s=n(13),c=n(14),u=n(5),l=n(1),p=n(4);!function(t){t[t.OPTION=0]=\"OPTION\",t[t.REPETITION=1]=\"REPETITION\",t[t.REPETITION_MANDATORY=2]=\"REPETITION_MANDATORY\",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]=\"REPETITION_MANDATORY_WITH_SEPARATOR\",t[t.REPETITION_WITH_SEPARATOR=4]=\"REPETITION_WITH_SEPARATOR\",t[t.ALTERNATION=5]=\"ALTERNATION\"}(o=e.PROD_TYPE||(e.PROD_TYPE={})),e.getProdType=function(t){if(t instanceof l.Option)return o.OPTION;if(t instanceof l.Repetition)return o.REPETITION;if(t instanceof l.RepetitionMandatory)return o.REPETITION_MANDATORY;if(t instanceof l.RepetitionMandatoryWithSeparator)return o.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof l.RepetitionWithSeparator)return o.REPETITION_WITH_SEPARATOR;if(t instanceof l.Alternation)return o.ALTERNATION;throw Error(\"non exhaustive match\")},e.buildLookaheadFuncForOr=function(t,e,n,r,i,o){var a=y(t,e,n);return o(a,r,A(a)?u.tokenStructuredMatcherNoCategories:u.tokenStructuredMatcher,i)},e.buildLookaheadFuncForOptionalProd=function(t,e,n,r,i,o){var a=v(t,e,i,n),s=A(a)?u.tokenStructuredMatcherNoCategories:u.tokenStructuredMatcher;return o(a[0],s,r)},e.buildAlternativesLookAheadFunc=function(t,e,n,r){var i=t.length,o=a.every(t,function(t){return a.every(t,function(t){return 1===t.length})});if(e)return function(e){for(var r=a.map(e,function(t){return t.GATE}),o=0;o<i;o++){var s=t[o],c=s.length,u=r[o];if(void 0===u||!1!==u.call(this))t:for(var l=0;l<c;l++){for(var p=s[l],h=p.length,f=0;f<h;f++){var d=this.LA(f+1);if(!1===n(d,p[f]))continue t}return o}}};if(o&&!r){var s=a.map(t,function(t){return a.flatten(t)}),c=a.reduce(s,function(t,e,n){return a.forEach(e,function(e){a.has(t,e.tokenTypeIdx)||(t[e.tokenTypeIdx]=n),a.forEach(e.categoryMatches,function(e){a.has(t,e)||(t[e]=n)})}),t},[]);return function(){var t=this.LA(1);return c[t.tokenTypeIdx]}}return function(){for(var e=0;e<i;e++){var r=t[e],o=r.length;t:for(var a=0;a<o;a++){for(var s=r[a],c=s.length,u=0;u<c;u++){var l=this.LA(u+1);if(!1===n(l,s[u]))continue t}return e}}}},e.buildSingleAlternativeLookaheadFunction=function(t,e,n){var r=a.every(t,function(t){return 1===t.length}),i=t.length;if(r&&!n){var o=a.flatten(t);if(1===o.length&&a.isEmpty(o[0].categoryMatches)){var s=o[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===s}}var c=a.reduce(o,function(t,e,n){return t[e.tokenTypeIdx]=!0,a.forEach(e.categoryMatches,function(e){t[e]=!0}),t},[]);return function(){var t=this.LA(1);return!0===c[t.tokenTypeIdx]}}return function(){t:for(var n=0;n<i;n++){for(var r=t[n],o=r.length,a=0;a<o;a++){var s=this.LA(a+1);if(!1===e(s,r[a]))continue t}return!0}return!1}};var h=function(t){function e(e,n,r){var i=t.call(this)||this;return i.topProd=e,i.targetOccurrence=n,i.targetProdType=r,i}return i(e,t),e.prototype.startWalking=function(){return this.walk(this.topProd),this.restDef},e.prototype.checkIsTarget=function(t,e,n,r){return t.idx===this.targetOccurrence&&this.targetProdType===e&&(this.restDef=n.concat(r),!0)},e.prototype.walkOption=function(e,n,r){this.checkIsTarget(e,o.OPTION,n,r)||t.prototype.walkOption.call(this,e,n,r)},e.prototype.walkAtLeastOne=function(e,n,r){this.checkIsTarget(e,o.REPETITION_MANDATORY,n,r)||t.prototype.walkOption.call(this,e,n,r)},e.prototype.walkAtLeastOneSep=function(e,n,r){this.checkIsTarget(e,o.REPETITION_MANDATORY_WITH_SEPARATOR,n,r)||t.prototype.walkOption.call(this,e,n,r)},e.prototype.walkMany=function(e,n,r){this.checkIsTarget(e,o.REPETITION,n,r)||t.prototype.walkOption.call(this,e,n,r)},e.prototype.walkManySep=function(e,n,r){this.checkIsTarget(e,o.REPETITION_WITH_SEPARATOR,n,r)||t.prototype.walkOption.call(this,e,n,r)},e}(c.RestWalker),f=function(t){function e(e,n,r){var i=t.call(this)||this;return i.targetOccurrence=e,i.targetProdType=n,i.targetRef=r,i.result=[],i}return i(e,t),e.prototype.checkIsTarget=function(t,e){t.idx!==this.targetOccurrence||this.targetProdType!==e||void 0!==this.targetRef&&t!==this.targetRef||(this.result=t.definition)},e.prototype.visitOption=function(t){this.checkIsTarget(t,o.OPTION)},e.prototype.visitRepetition=function(t){this.checkIsTarget(t,o.REPETITION)},e.prototype.visitRepetitionMandatory=function(t){this.checkIsTarget(t,o.REPETITION_MANDATORY)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.checkIsTarget(t,o.REPETITION_MANDATORY_WITH_SEPARATOR)},e.prototype.visitRepetitionWithSeparator=function(t){this.checkIsTarget(t,o.REPETITION_WITH_SEPARATOR)},e.prototype.visitAlternation=function(t){this.checkIsTarget(t,o.ALTERNATION)},e}(p.GAstVisitor);function d(t){for(var e=new Array(t),n=0;n<t;n++)e[n]=[];return e}function m(t){for(var e=[\"\"],n=0;n<t.length;n++){for(var r=t[n],i=[],o=0;o<e.length;o++){var a=e[o];i.push(a+\"_\"+r.tokenTypeIdx);for(var s=0;s<r.categoryMatches.length;s++){var c=\"_\"+r.categoryMatches[s];i.push(a+c)}}e=i}return e}function E(t,e,n){for(var r=0;r<t.length;r++)if(r!==n)for(var i=t[r],o=0;o<e.length;o++){if(!0===i[e[o]])return!1}return!0}function T(t,e){for(var n=a.map(t,function(t){return s.possiblePathsFrom([t],1)}),r=d(n.length),i=a.map(n,function(t){var e={};return a.forEach(t,function(t){var n=m(t.partialPath);a.forEach(n,function(t){e[t]=!0})}),e}),o=n,c=1;c<=e;c++){var u=o;o=d(u.length);for(var l=function(t){for(var n=u[t],l=0;l<n.length;l++){var p=n[l].partialPath,h=n[l].suffixDef,f=m(p);if(E(i,f,t)||a.isEmpty(h)||p.length===e){var d=r[t];if(!1===R(d,p)){d.push(p);for(var T=0;T<f.length;T++){var y=f[T];i[t][y]=!0}}}else{var v=s.possiblePathsFrom(h,c+1,p);o[t]=o[t].concat(v),a.forEach(v,function(e){var n=m(e.partialPath);a.forEach(n,function(e){i[t][e]=!0})})}}},p=0;p<u.length;p++)l(p)}return r}function y(t,e,n,r){var i=new f(t,o.ALTERNATION,r);return e.accept(i),T(i.result,n)}function v(t,e,n,r){var i=new f(t,n);e.accept(i);var o=i.result,a=new h(e,t,n).startWalking();return T([new l.Flat({definition:o}),new l.Flat({definition:a})],r)}function R(t,e){t:for(var n=0;n<t.length;n++){var r=t[n];if(r.length===e.length){for(var i=0;i<r.length;i++){var o=e[i],a=r[i];if(!1===(o===a||void 0!==a.categoryMatchesMap[o.tokenTypeIdx]))continue t}return!0}}return!1}function A(t){return a.every(t,function(t){return a.every(t,function(t){return a.every(t,function(t){return a.isEmpty(t.categoryMatches)})})})}e.lookAheadSequenceFromAlternatives=T,e.getLookaheadPathsForOr=y,e.getLookaheadPathsForOptionalProd=v,e.containsPath=R,e.isStrictPrefixOfPath=function(t,e){return t.length<e.length&&a.every(t,function(t,n){var r=e[n];return t===r||r.categoryMatchesMap[t.tokenTypeIdx]})},e.areTokenCategoriesNotUsed=A},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(14),a=n(0),s=n(22),c=n(1),u=function(t){function e(e,n){var r=t.call(this)||this;return r.topProd=e,r.path=n,r.possibleTokTypes=[],r.nextProductionName=\"\",r.nextProductionOccurrence=0,r.found=!1,r.isAtEndOfPath=!1,r}return i(e,t),e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error(\"The path does not start with the walker's top Rule!\");return this.ruleStack=a.cloneArr(this.path.ruleStack).reverse(),this.occurrenceStack=a.cloneArr(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(e,n){void 0===n&&(n=[]),this.found||t.prototype.walk.call(this,e,n)},e.prototype.walkProdRef=function(t,e,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var r=e.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,r)}},e.prototype.updateExpectedNext=function(){a.isEmpty(this.ruleStack)?(this.nextProductionName=\"\",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(o.RestWalker);e.AbstractNextPossibleTokensWalker=u;var l=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.path=n,r.nextTerminalName=\"\",r.nextTerminalOccurrence=0,r.nextTerminalName=r.path.lastTok.name,r.nextTerminalOccurrence=r.path.lastTokOccurrence,r}return i(e,t),e.prototype.walkTerminal=function(t,e,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var r=e.concat(n),i=new c.Flat({definition:r});this.possibleTokTypes=s.first(i),this.found=!0}},e}(u);e.NextAfterTokenWalker=l;var p=function(t){function e(e,n){var r=t.call(this)||this;return r.topRule=e,r.occurrence=n,r.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},r}return i(e,t),e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(o.RestWalker);e.AbstractNextTerminalAfterProductionWalker=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.walkMany=function(e,n,r){if(e.idx===this.occurrence){var i=a.first(n.concat(r));this.result.isEndOfRule=void 0===i,i instanceof c.Terminal&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else t.prototype.walkMany.call(this,e,n,r)},e}(p);e.NextTerminalAfterManyWalker=h;var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.walkManySep=function(e,n,r){if(e.idx===this.occurrence){var i=a.first(n.concat(r));this.result.isEndOfRule=void 0===i,i instanceof c.Terminal&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else t.prototype.walkManySep.call(this,e,n,r)},e}(p);e.NextTerminalAfterManySepWalker=f;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.walkAtLeastOne=function(e,n,r){if(e.idx===this.occurrence){var i=a.first(n.concat(r));this.result.isEndOfRule=void 0===i,i instanceof c.Terminal&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else t.prototype.walkAtLeastOne.call(this,e,n,r)},e}(p);e.NextTerminalAfterAtLeastOneWalker=d;var m=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.walkAtLeastOneSep=function(e,n,r){if(e.idx===this.occurrence){var i=a.first(n.concat(r));this.result.isEndOfRule=void 0===i,i instanceof c.Terminal&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else t.prototype.walkAtLeastOneSep.call(this,e,n,r)},e}(p);function E(t,e,n,r){var i=a.cloneArr(n);i.push(t.name);var o=a.cloneArr(r);return o.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:o}}e.NextTerminalAfterAtLeastOneSepWalker=m,e.possiblePathsFrom=function t(e,n,r){void 0===r&&(r=[]),r=a.cloneArr(r);var i=[],o=0;function s(s){var c=t(s.concat(a.drop(e,o+1)),n,r);return i.concat(c)}for(;r.length<n&&o<e.length;){var u=e[o];if(u instanceof c.Flat)return s(u.definition);if(u instanceof c.NonTerminal)return s(u.definition);if(u instanceof c.Option)i=s(u.definition);else{if(u instanceof c.RepetitionMandatory)return s(l=u.definition.concat([new c.Repetition({definition:u.definition})]));if(u instanceof c.RepetitionMandatoryWithSeparator)return s(l=[new c.Flat({definition:u.definition}),new c.Repetition({definition:[new c.Terminal({terminalType:u.separator})].concat(u.definition)})]);if(u instanceof c.RepetitionWithSeparator){var l=u.definition.concat([new c.Repetition({definition:[new c.Terminal({terminalType:u.separator})].concat(u.definition)})]);i=s(l)}else if(u instanceof c.Repetition)l=u.definition.concat([new c.Repetition({definition:u.definition})]),i=s(l);else{if(u instanceof c.Alternation)return a.forEach(u.definition,function(t){i=s(t.definition)}),i;if(!(u instanceof c.Terminal))throw Error(\"non exhaustive match\");r.push(u.terminalType)}}o++}return i.push({partialPath:r,suffixDef:a.drop(e,o)}),i},e.nextPossibleTokensAfter=function(t,e,n,r){var i=[\"EXIT_NONE_TERMINAL\"],o=!1,s=e.length,u=s-r-1,l=[],p=[];for(p.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!a.isEmpty(p);){var h=p.pop();if(\"EXIT_ALTERNATIVE\"!==h){var f=h.def,d=h.idx,m=h.ruleStack,T=h.occurrenceStack;if(!a.isEmpty(f)){var y=f[0];if(\"EXIT_NONE_TERMINAL\"===y){var v={idx:d,def:a.drop(f),ruleStack:a.dropRight(m),occurrenceStack:a.dropRight(T)};p.push(v)}else if(y instanceof c.Terminal)if(d<s-1){var R=d+1;n(e[R],y.terminalType)&&(v={idx:R,def:a.drop(f),ruleStack:m,occurrenceStack:T},p.push(v))}else{if(d!==s-1)throw Error(\"non exhaustive match\");l.push({nextTokenType:y.terminalType,nextTokenOccurrence:y.idx,ruleStack:m,occurrenceStack:T}),o=!0}else if(y instanceof c.NonTerminal){var A=a.cloneArr(m);A.push(y.nonTerminalName);var _=a.cloneArr(T);_.push(y.idx),v={idx:d,def:y.definition.concat(i,a.drop(f)),ruleStack:A,occurrenceStack:_},p.push(v)}else if(y instanceof c.Option){var g={idx:d,def:a.drop(f),ruleStack:m,occurrenceStack:T};p.push(g),p.push(\"EXIT_ALTERNATIVE\");var N={idx:d,def:y.definition.concat(a.drop(f)),ruleStack:m,occurrenceStack:T};p.push(N)}else if(y instanceof c.RepetitionMandatory){var I=new c.Repetition({definition:y.definition,idx:y.idx});v={idx:d,def:y.definition.concat([I],a.drop(f)),ruleStack:m,occurrenceStack:T},p.push(v)}else if(y instanceof c.RepetitionMandatoryWithSeparator){var O=new c.Terminal({terminalType:y.separator});I=new c.Repetition({definition:[O].concat(y.definition),idx:y.idx}),v={idx:d,def:y.definition.concat([I],a.drop(f)),ruleStack:m,occurrenceStack:T},p.push(v)}else if(y instanceof c.RepetitionWithSeparator){g={idx:d,def:a.drop(f),ruleStack:m,occurrenceStack:T},p.push(g),p.push(\"EXIT_ALTERNATIVE\"),O=new c.Terminal({terminalType:y.separator});var S=new c.Repetition({definition:[O].concat(y.definition),idx:y.idx});N={idx:d,def:y.definition.concat([S],a.drop(f)),ruleStack:m,occurrenceStack:T},p.push(N)}else if(y instanceof c.Repetition)g={idx:d,def:a.drop(f),ruleStack:m,occurrenceStack:T},p.push(g),p.push(\"EXIT_ALTERNATIVE\"),S=new c.Repetition({definition:y.definition,idx:y.idx}),N={idx:d,def:y.definition.concat([S],a.drop(f)),ruleStack:m,occurrenceStack:T},p.push(N);else if(y instanceof c.Alternation)for(var L=y.definition.length-1;L>=0;L--){var P={idx:d,def:y.definition[L].definition.concat(a.drop(f)),ruleStack:m,occurrenceStack:T};p.push(P),p.push(\"EXIT_ALTERNATIVE\")}else if(y instanceof c.Flat)p.push({idx:d,def:y.definition.concat(a.drop(f)),ruleStack:m,occurrenceStack:T});else{if(!(y instanceof c.Rule))throw Error(\"non exhaustive match\");p.push(E(y,d,m,T))}}}else o&&a.last(p).idx<=u&&p.pop()}return l}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=function(){function t(){}return t.prototype.walk=function(t,e){var n=this;void 0===e&&(e=[]),r.forEach(t.definition,function(o,a){var s=r.drop(t.definition,a+1);if(o instanceof i.NonTerminal)n.walkProdRef(o,s,e);else if(o instanceof i.Terminal)n.walkTerminal(o,s,e);else if(o instanceof i.Flat)n.walkFlat(o,s,e);else if(o instanceof i.Option)n.walkOption(o,s,e);else if(o instanceof i.RepetitionMandatory)n.walkAtLeastOne(o,s,e);else if(o instanceof i.RepetitionMandatoryWithSeparator)n.walkAtLeastOneSep(o,s,e);else if(o instanceof i.RepetitionWithSeparator)n.walkManySep(o,s,e);else if(o instanceof i.Repetition)n.walkMany(o,s,e);else{if(!(o instanceof i.Alternation))throw Error(\"non exhaustive match\");n.walkOr(o,s,e)}})},t.prototype.walkTerminal=function(t,e,n){},t.prototype.walkProdRef=function(t,e,n){},t.prototype.walkFlat=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkOption=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkAtLeastOne=function(t,e,n){var r=[new i.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkAtLeastOneSep=function(t,e,n){var r=a(t,e,n);this.walk(t,r)},t.prototype.walkMany=function(t,e,n){var r=[new i.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkManySep=function(t,e,n){var r=a(t,e,n);this.walk(t,r)},t.prototype.walkOr=function(t,e,n){var o=this,a=e.concat(n);r.forEach(t.definition,function(t){var e=new i.Flat({definition:[t]});o.walk(e,a)})},t}();function a(t,e,n){return[new i.Option({definition:[new i.Terminal({terminalType:t.separator})].concat(t.definition)})].concat(e,n)}e.RestWalker=o},function(t,e,n){var r,i,o;\"undefined\"!=typeof self&&self,i=[],void 0===(o=\"function\"==typeof(r=function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(t){this.idx=t.idx,this.input=t.input,this.groupIdx=t.groupIdx},t.prototype.pattern=function(t){this.idx=0,this.input=t,this.groupIdx=0,this.consumeChar(\"/\");var e=this.disjunction();this.consumeChar(\"/\");for(var n={type:\"Flags\",global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case\"g\":s(n,\"global\");break;case\"i\":s(n,\"ignoreCase\");break;case\"m\":s(n,\"multiLine\");break;case\"u\":s(n,\"unicode\");break;case\"y\":s(n,\"sticky\")}if(this.idx!==this.input.length)throw Error(\"Redundant input: \"+this.input.substring(this.idx));return{type:\"Pattern\",flags:n,value:e}},t.prototype.disjunction=function(){var t=[];for(t.push(this.alternative());\"|\"===this.peekChar();)this.consumeChar(\"|\"),t.push(this.alternative());return{type:\"Disjunction\",value:t}},t.prototype.alternative=function(){for(var t=[];this.isTerm();)t.push(this.term());return{type:\"Alternative\",value:t}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){switch(this.popChar()){case\"^\":return{type:\"StartAnchor\"};case\"$\":return{type:\"EndAnchor\"};case\"\\\\\":switch(this.popChar()){case\"b\":return{type:\"WordBoundary\"};case\"B\":return{type:\"NonWordBoundary\"}}throw Error(\"Invalid Assertion Escape\");case\"(\":var t;switch(this.consumeChar(\"?\"),this.popChar()){case\"=\":t=\"Lookahead\";break;case\"!\":t=\"NegativeLookahead\"}c(t);var e=this.disjunction();return this.consumeChar(\")\"),{type:t,value:e}}!function(){throw Error(\"Internal Error - Should never get here!\")}()},t.prototype.quantifier=function(t){var e;switch(this.popChar()){case\"*\":e={atLeast:0,atMost:1/0};break;case\"+\":e={atLeast:1,atMost:1/0};break;case\"?\":e={atLeast:0,atMost:1};break;case\"{\":var n=this.integerIncludingZero();switch(this.popChar()){case\"}\":e={atLeast:n,atMost:n};break;case\",\":var r;this.isDigit()?(r=this.integerIncludingZero(),e={atLeast:n,atMost:r}):e={atLeast:n,atMost:1/0},this.consumeChar(\"}\")}if(!0===t&&void 0===e)return;c(e)}if(!0!==t||void 0!==e)return c(e),\"?\"===this.peekChar(0)?(this.consumeChar(\"?\"),e.greedy=!1):e.greedy=!0,e.type=\"Quantifier\",e},t.prototype.atom=function(){var t;switch(this.peekChar()){case\".\":t=this.dotAll();break;case\"\\\\\":t=this.atomEscape();break;case\"[\":t=this.characterClass();break;case\"(\":t=this.group()}return void 0===t&&this.isPatternCharacter()&&(t=this.patternCharacter()),c(t),this.isQuantifier()&&(t.quantifier=this.quantifier()),t},t.prototype.dotAll=function(){return this.consumeChar(\".\"),{type:\"Set\",complement:!0,value:[o(\"\\n\"),o(\"\\r\"),o(\"\\u2028\"),o(\"\\u2029\")]}},t.prototype.atomEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"1\":case\"2\":case\"3\":case\"4\":case\"5\":case\"6\":case\"7\":case\"8\":case\"9\":return this.decimalEscapeAtom();case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var t=this.positiveInteger();return{type:\"GroupBackReference\",value:t}},t.prototype.characterClassEscape=function(){var t,e=!1;switch(this.popChar()){case\"d\":t=u;break;case\"D\":t=u,e=!0;break;case\"s\":t=p;break;case\"S\":t=p,e=!0;break;case\"w\":t=l;break;case\"W\":t=l,e=!0}return c(t),{type:\"Set\",value:t,complement:e}},t.prototype.controlEscapeAtom=function(){var t;switch(this.popChar()){case\"f\":t=o(\"\\f\");break;case\"n\":t=o(\"\\n\");break;case\"r\":t=o(\"\\r\");break;case\"t\":t=o(\"\\t\");break;case\"v\":t=o(\"\\v\")}return c(t),{type:\"Character\",value:t}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar(\"c\");var t=this.popChar();if(!1===/[a-zA-Z]/.test(t))throw Error(\"Invalid \");var e=t.toUpperCase().charCodeAt(0)-64;return{type:\"Character\",value:e}},t.prototype.nulCharacterAtom=function(){return this.consumeChar(\"0\"),{type:\"Character\",value:o(\"\\0\")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar(\"x\"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar(\"u\"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var t=this.popChar();return{type:\"Character\",value:o(t)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case\"\\n\":case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"\\\\\":case\"]\":throw Error(\"TBD\");default:var t=this.popChar();return{type:\"Character\",value:o(t)}}},t.prototype.characterClass=function(){var t=[],e=!1;for(this.consumeChar(\"[\"),\"^\"===this.peekChar(0)&&(this.consumeChar(\"^\"),e=!0);this.isClassAtom();){var n=this.classAtom(),r=\"Character\"===n.type;if(r&&this.isRangeDash()){this.consumeChar(\"-\");var i=this.classAtom(),s=\"Character\"===i.type;if(s){if(i.value<n.value)throw Error(\"Range out of order in character class\");t.push({from:n.value,to:i.value})}else a(n.value,t),t.push(o(\"-\")),a(i.value,t)}else a(n.value,t)}return this.consumeChar(\"]\"),{type:\"Set\",complement:e,value:t}},t.prototype.classAtom=function(){switch(this.peekChar()){case\"]\":case\"\\n\":case\"\\r\":case\"\\u2028\":case\"\\u2029\":throw Error(\"TBD\");case\"\\\\\":return this.classEscape();default:return this.classPatternCharacterAtom()}},t.prototype.classEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"b\":return this.consumeChar(\"b\"),{type:\"Character\",value:o(\"\\b\")};case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.group=function(){var t=!0;switch(this.consumeChar(\"(\"),this.peekChar(0)){case\"?\":this.consumeChar(\"?\"),this.consumeChar(\":\"),t=!1;break;default:this.groupIdx++}var e=this.disjunction();this.consumeChar(\")\");var n={type:\"Group\",capturing:t,value:e};return t&&(n.idx=this.groupIdx),n},t.prototype.positiveInteger=function(){var t=this.popChar();if(!1===i.test(t))throw Error(\"Expecting a positive integer\");for(;r.test(this.peekChar(0));)t+=this.popChar();return parseInt(t,10)},t.prototype.integerIncludingZero=function(){var t=this.popChar();if(!1===r.test(t))throw Error(\"Expecting an integer\");for(;r.test(this.peekChar(0));)t+=this.popChar();return parseInt(t,10)},t.prototype.patternCharacter=function(){var t=this.popChar();switch(t){case\"\\n\":case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":throw Error(\"TBD\");default:return{type:\"Character\",value:o(t)}}},t.prototype.isRegExpFlag=function(){switch(this.peekChar(0)){case\"g\":case\"i\":case\"m\":case\"u\":case\"y\":return!0;default:return!1}},t.prototype.isRangeDash=function(){return\"-\"===this.peekChar()&&this.isClassAtom(1)},t.prototype.isDigit=function(){return r.test(this.peekChar(0))},t.prototype.isClassAtom=function(t){switch(void 0===t&&(t=0),this.peekChar(t)){case\"]\":case\"\\n\":case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},t.prototype.isTerm=function(){return this.isAtom()||this.isAssertion()},t.prototype.isAtom=function(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case\".\":case\"\\\\\":case\"[\":case\"(\":return!0;default:return!1}},t.prototype.isAssertion=function(){switch(this.peekChar(0)){case\"^\":case\"$\":return!0;case\"\\\\\":switch(this.peekChar(1)){case\"b\":case\"B\":return!0;default:return!1}case\"(\":return\"?\"===this.peekChar(1)&&(\"=\"===this.peekChar(2)||\"!\"===this.peekChar(2));default:return!1}},t.prototype.isQuantifier=function(){var t=this.saveState();try{return void 0!==this.quantifier(!0)}catch(t){return!1}finally{this.restoreState(t)}},t.prototype.isPatternCharacter=function(){switch(this.peekChar()){case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":case\"/\":case\"\\n\":case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},t.prototype.parseHexDigits=function(t){for(var e=\"\",r=0;r<t;r++){var i=this.popChar();if(!1===n.test(i))throw Error(\"Expecting a HexDecimal digits\");e+=i}var o=parseInt(e,16);return{type:\"Character\",value:o}},t.prototype.peekChar=function(t){return void 0===t&&(t=0),this.input[this.idx+t]},t.prototype.popChar=function(){var t=this.peekChar(0);return this.consumeChar(),t},t.prototype.consumeChar=function(t){if(void 0!==t&&this.input[this.idx]!==t)throw Error(\"Expected: '\"+t+\"' but found: '\"+this.input[this.idx]+\"' at offset: \"+this.idx);if(this.idx>=this.input.length)throw Error(\"Unexpected end of input\");this.idx++};var e,n=/[0-9a-fA-F]/,r=/[0-9]/,i=/[1-9]/;function o(t){return t.charCodeAt(0)}function a(t,e){void 0!==t.length?t.forEach(function(t){e.push(t)}):e.push(t)}function s(t,e){if(!0===t[e])throw\"duplicate flag \"+e;t[e]=!0}function c(t){if(void 0===t)throw Error(\"Internal Error - Should never get here!\")}var u=[];for(e=o(\"0\");e<=o(\"9\");e++)u.push(e);var l=[o(\"_\")].concat(u);for(e=o(\"a\");e<=o(\"z\");e++)l.push(e);for(e=o(\"A\");e<=o(\"Z\");e++)l.push(e);var p=[o(\" \"),o(\"\\f\"),o(\"\\n\"),o(\"\\r\"),o(\"\\t\"),o(\"\\v\"),o(\"\\t\"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\" \"),o(\"\\u2028\"),o(\"\\u2029\"),o(\" \"),o(\" \"),o(\"　\"),o(\"\\ufeff\")];function h(){}return h.prototype.visitChildren=function(t){for(var e in t){var n=t[e];t.hasOwnProperty(e)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach(function(t){this.visit(t)},this))}},h.prototype.visit=function(t){switch(t.type){case\"Pattern\":this.visitPattern(t);break;case\"Flags\":this.visitFlags(t);break;case\"Disjunction\":this.visitDisjunction(t);break;case\"Alternative\":this.visitAlternative(t);break;case\"StartAnchor\":this.visitStartAnchor(t);break;case\"EndAnchor\":this.visitEndAnchor(t);break;case\"WordBoundary\":this.visitWordBoundary(t);break;case\"NonWordBoundary\":this.visitNonWordBoundary(t);break;case\"Lookahead\":this.visitLookahead(t);break;case\"NegativeLookahead\":this.visitNegativeLookahead(t);break;case\"Character\":this.visitCharacter(t);break;case\"Set\":this.visitSet(t);break;case\"Group\":this.visitGroup(t);break;case\"GroupBackReference\":this.visitGroupBackReference(t);break;case\"Quantifier\":this.visitQuantifier(t)}this.visitChildren(t)},h.prototype.visitPattern=function(t){},h.prototype.visitFlags=function(t){},h.prototype.visitDisjunction=function(t){},h.prototype.visitAlternative=function(t){},h.prototype.visitStartAnchor=function(t){},h.prototype.visitEndAnchor=function(t){},h.prototype.visitWordBoundary=function(t){},h.prototype.visitNonWordBoundary=function(t){},h.prototype.visitLookahead=function(t){},h.prototype.visitNegativeLookahead=function(t){},h.prototype.visitCharacter=function(t){},h.prototype.visitSet=function(t){},h.prototype.visitGroup=function(t){},h.prototype.visitGroupBackReference=function(t){},h.prototype.visitQuantifier=function(t){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:\"0.4.0\"}})?r.apply(e,i):r)||(t.exports=o)},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(15),i={},o=new r.RegExpParser;e.getRegExpAst=function(t){var e=t.toString();if(i.hasOwnProperty(e))return i[e];var n=o.pattern(e);return i[e]=n,n},e.clearRegExpParserCache=function(){i={}}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(0),a=n(7),s=n(1),c=n(4);e.setNodeLocationOnlyOffset=function(t,e){!0===isNaN(t.startOffset)?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset<e.endOffset==1&&(t.endOffset=e.endOffset)},e.setNodeLocationFull=function(t,e){!0===isNaN(t.startOffset)?(t.startOffset=e.startOffset,t.startColumn=e.startColumn,t.startLine=e.startLine,t.endOffset=e.endOffset,t.endColumn=e.endColumn,t.endLine=e.endLine):t.endOffset<e.endOffset==1&&(t.endOffset=e.endOffset,t.endColumn=e.endColumn,t.endLine=e.endLine)},e.addTerminalToCst=function(t,e,n){void 0===t.children[n]?t.children[n]=[e]:t.children[n].push(e)},e.addNoneTerminalToCst=function(t,e,n){void 0===t.children[e]?t.children[e]=[n]:t.children[e].push(n)};var u=function(t){function e(e){var n=t.call(this)||this;return n.result=[],n.ruleIdx=e,n}return i(e,t),e.prototype.collectNamedDSLMethod=function(t,e,n){if(!o.isUndefined(t.name)){var r=void 0;if(t instanceof s.Option||t instanceof s.Repetition||t instanceof s.RepetitionMandatory||t instanceof s.Alternation)r=new e({definition:t.definition,idx:t.idx});else{if(!(t instanceof s.RepetitionMandatoryWithSeparator||t instanceof s.RepetitionWithSeparator))throw Error(\"non exhaustive match\");r=new e({definition:t.definition,idx:t.idx,separator:t.separator})}var i=[r],c=a.getKeyForAutomaticLookahead(this.ruleIdx,n,t.idx);this.result.push({def:i,key:c,name:t.name,orgProd:t})}},e.prototype.visitOption=function(t){this.collectNamedDSLMethod(t,s.Option,a.OPTION_IDX)},e.prototype.visitRepetition=function(t){this.collectNamedDSLMethod(t,s.Repetition,a.MANY_IDX)},e.prototype.visitRepetitionMandatory=function(t){this.collectNamedDSLMethod(t,s.RepetitionMandatory,a.AT_LEAST_ONE_IDX)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.collectNamedDSLMethod(t,s.RepetitionMandatoryWithSeparator,a.AT_LEAST_ONE_SEP_IDX)},e.prototype.visitRepetitionWithSeparator=function(t){this.collectNamedDSLMethod(t,s.RepetitionWithSeparator,a.MANY_SEP_IDX)},e.prototype.visitAlternation=function(t){var e=this;this.collectNamedDSLMethod(t,s.Alternation,a.OR_IDX);var n=t.definition.length>1;o.forEach(t.definition,function(r,i){if(!o.isUndefined(r.name)){var c=r.definition;c=n?[new s.Option({definition:r.definition})]:r.definition;var u=a.getKeyForAltIndex(e.ruleIdx,a.OR_IDX,t.idx,i);e.result.push({def:c,key:u,name:r.name,orgProd:r})}})},e}(c.GAstVisitor);e.NamedDSLMethodsCollectorVisitor=u,e.expandAllNestedRuleNames=function(t,e){var n={allRuleNames:[]};return o.forEach(t,function(t){var r=e[t.name];n.allRuleNames.push(t.name);var i=new u(r);t.accept(i),o.forEach(i.result,function(e){e.def,e.key;var r=e.name;n.allRuleNames.push(t.name+r)})}),n}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(19);e.VERSION=r.VERSION;var i=n(2);e.Parser=i.Parser,e.CstParser=i.CstParser,e.EmbeddedActionsParser=i.EmbeddedActionsParser,e.ParserDefinitionErrorType=i.ParserDefinitionErrorType,e.EMPTY_ALT=i.EMPTY_ALT;var o=n(9);e.Lexer=o.Lexer,e.LexerDefinitionErrorType=o.LexerDefinitionErrorType;var a=n(3);e.createToken=a.createToken,e.createTokenInstance=a.createTokenInstance,e.EOF=a.EOF,e.tokenLabel=a.tokenLabel,e.tokenMatcher=a.tokenMatcher,e.tokenName=a.tokenName;var s=n(10);e.defaultGrammarResolverErrorProvider=s.defaultGrammarResolverErrorProvider,e.defaultGrammarValidatorErrorProvider=s.defaultGrammarValidatorErrorProvider,e.defaultParserErrorProvider=s.defaultParserErrorProvider;var c=n(8);e.EarlyExitException=c.EarlyExitException,e.isRecognitionException=c.isRecognitionException,e.MismatchedTokenException=c.MismatchedTokenException,e.NotAllInputParsedException=c.NotAllInputParsedException,e.NoViableAltException=c.NoViableAltException;var u=n(21);e.defaultLexerErrorProvider=u.defaultLexerErrorProvider;var l=n(1);e.Alternation=l.Alternation,e.Flat=l.Flat,e.NonTerminal=l.NonTerminal,e.Option=l.Option,e.Repetition=l.Repetition,e.RepetitionMandatory=l.RepetitionMandatory,e.RepetitionMandatoryWithSeparator=l.RepetitionMandatoryWithSeparator,e.RepetitionWithSeparator=l.RepetitionWithSeparator,e.Rule=l.Rule,e.Terminal=l.Terminal;var p=n(1);e.serializeGrammar=p.serializeGrammar,e.serializeProduction=p.serializeProduction;var h=n(4);e.GAstVisitor=h.GAstVisitor;var f=n(24);e.assignOccurrenceIndices=f.assignOccurrenceIndices,e.resolveGrammar=f.resolveGrammar,e.validateGrammar=f.validateGrammar,e.clearCache=function(){console.warn(\"The clearCache function was 'soft' removed from the Chevrotain API.\\n\\t It performs no action other than printing this message.\\n\\t Please avoid using it as it will be completely removed in the future\")};var d=n(40);e.createSyntaxDiagramsCode=d.createSyntaxDiagramsCode;var m=n(41);e.generateParserFactory=m.generateParserFactory,e.generateParserModule=m.generateParserModule},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.VERSION=\"6.5.0\"},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(15),a=n(9),s=n(0),c=n(28),u=n(16),l=\"PATTERN\";function p(t){var e=s.filter(t,function(t){return!s.has(t,l)});return{errors:s.map(e,function(t){return{message:\"Token Type: ->\"+t.name+\"<- missing static 'PATTERN' property\",type:a.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[t]}}),valid:s.difference(t,e)}}function h(t){var e=s.filter(t,function(t){var e=t[l];return!(s.isRegExp(e)||s.isFunction(e)||s.has(e,\"exec\")||s.isString(e))});return{errors:s.map(e,function(t){return{message:\"Token Type: ->\"+t.name+\"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",type:a.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[t]}}),valid:s.difference(t,e)}}e.DEFAULT_MODE=\"defaultMode\",e.MODES=\"modes\",e.SUPPORT_STICKY=\"boolean\"==typeof new RegExp(\"(?:)\").sticky,e.disableSticky=function(){e.SUPPORT_STICKY=!1},e.enableSticky=function(){e.SUPPORT_STICKY=!0},e.analyzeTokenTypes=function(t,n){var r,i=(n=s.defaults(n,{useSticky:e.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:\"full\",lineTerminatorCharacters:[\"\\r\",\"\\n\"],tracer:function(t,e){return e()}})).tracer;i(\"initCharCodeToOptimizedIndexMap\",function(){!function(){if(s.isEmpty(x)){x=new Array(65536);for(var t=0;t<65536;t++)x[t]=t>255?255+~~(t/255):t}}()}),i(\"Reject Lexer.NA\",function(){r=s.reject(t,function(t){return t[l]===a.Lexer.NA})});var o,u,p,h,f,d,m,E,T,y,v,R=!1;i(\"Transform Patterns\",function(){R=!1,o=s.map(r,function(t){var e=t[l];if(s.isRegExp(e)){var r=e.source;return 1===r.length&&\"^\"!==r&&\"$\"!==r&&\".\"!==r?r:2!==r.length||\"\\\\\"!==r[0]||s.contains([\"d\",\"D\",\"s\",\"S\",\"t\",\"r\",\"n\",\"t\",\"0\",\"c\",\"b\",\"B\",\"f\",\"v\",\"w\",\"W\"],r[1])?n.useSticky?N(e):g(e):r[1]}if(s.isFunction(e))return R=!0,{exec:e};if(s.has(e,\"exec\"))return R=!0,e;if(\"string\"==typeof e){if(1===e.length)return e;var i=e.replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\"),o=new RegExp(i);return n.useSticky?N(o):g(o)}throw Error(\"non exhaustive match\")})}),i(\"misc mapping\",function(){u=s.map(r,function(t){return t.tokenTypeIdx}),p=s.map(r,function(t){var e=t.GROUP;if(e!==a.Lexer.SKIPPED){if(s.isString(e))return e;if(s.isUndefined(e))return!1;throw Error(\"non exhaustive match\")}}),h=s.map(r,function(t){var e=t.LONGER_ALT;if(e)return s.indexOf(r,e)}),f=s.map(r,function(t){return t.PUSH_MODE}),d=s.map(r,function(t){return s.has(t,\"POP_MODE\")})}),i(\"Line Terminator Handling\",function(){var t=P(n.lineTerminatorCharacters);m=s.map(r,function(t){return!1}),\"onlyOffset\"!==n.positionTracking&&(m=s.map(r,function(e){return s.has(e,\"LINE_BREAKS\")?e.LINE_BREAKS:!1===S(e,t)?c.canMatchCharCode(t,e.PATTERN):void 0}))}),i(\"Misc Mapping #2\",function(){E=s.map(r,I),T=s.map(o,O),y=s.reduce(r,function(t,e){var n=e.GROUP;return s.isString(n)&&n!==a.Lexer.SKIPPED&&(t[n]=[]),t},{}),v=s.map(o,function(t,e){return{pattern:o[e],longerAlt:h[e],canLineTerminator:m[e],isCustom:E[e],short:T[e],group:p[e],push:f[e],pop:d[e],tokenTypeIdx:u[e],tokenType:r[e]}})});var A=!0,_=[];return n.safeMode||i(\"First Char Optimization\",function(){_=s.reduce(r,function(t,e,r){if(\"string\"==typeof e.PATTERN){var i=k(e.PATTERN.charCodeAt(0));C(t,i,v[r])}else if(s.isArray(e.START_CHARS_HINT)){var o;s.forEach(e.START_CHARS_HINT,function(e){var n=k(\"string\"==typeof e?e.charCodeAt(0):e);o!==n&&(o=n,C(t,n,v[r]))})}else if(s.isRegExp(e.PATTERN))if(e.PATTERN.unicode)A=!1,n.ensureOptimizations&&s.PRINT_ERROR(c.failedOptimizationPrefixMsg+\"\\tUnable to analyze < \"+e.PATTERN.toString()+\" > pattern.\\n\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\\tThis will disable the lexer's first char optimizations.\\n\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\");else{var a=c.getOptimizedStartCodesIndices(e.PATTERN,n.ensureOptimizations);s.isEmpty(a)&&(A=!1),s.forEach(a,function(e){C(t,e,v[r])})}else n.ensureOptimizations&&s.PRINT_ERROR(c.failedOptimizationPrefixMsg+\"\\tTokenType: <\"+e.name+\"> is using a custom token pattern without providing <start_chars_hint> parameter.\\n\\tThis will disable the lexer's first char optimizations.\\n\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\"),A=!1;return t},[])}),i(\"ArrayPacking\",function(){_=s.packArray(_)}),{emptyGroups:y,patternIdxToConfig:v,charCodeToPatternIdxToConfig:_,hasCustom:R,canBeOptimized:A}},e.validatePatterns=function(t,e){var n=[],r=p(t);n=n.concat(r.errors);var i=h(r.valid),o=i.valid;return n=(n=(n=(n=(n=n.concat(i.errors)).concat(function(t){var e=[],n=s.filter(t,function(t){return s.isRegExp(t[l])});return e=(e=(e=(e=(e=e.concat(d(n))).concat(T(n))).concat(y(n))).concat(v(n))).concat(m(n))}(o))).concat(R(o))).concat(A(o,e))).concat(_(o))},e.findMissingPatterns=p,e.findInvalidPatterns=h;var f=/[^\\\\][\\$]/;function d(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return i(e,t),e.prototype.visitEndAnchor=function(t){this.found=!0},e}(o.BaseRegExpVisitor),n=s.filter(t,function(t){var n=t[l];try{var r=u.getRegExpAst(n),i=new e;return i.visit(r),i.found}catch(t){return f.test(n.source)}});return s.map(n,function(t){return{message:\"Unexpected RegExp Anchor Error:\\n\\tToken Type: ->\"+t.name+\"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\\tSee sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\\tfor details.\",type:a.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[t]}})}function m(t){var e=s.filter(t,function(t){return t[l].test(\"\")});return s.map(e,function(t){return{message:\"Token Type: ->\"+t.name+\"<- static 'PATTERN' must not match an empty string\",type:a.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[t]}})}e.findEndOfInputAnchor=d,e.findEmptyMatchRegExps=m;var E=/[^\\\\[][\\^]|^\\^/;function T(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return i(e,t),e.prototype.visitStartAnchor=function(t){this.found=!0},e}(o.BaseRegExpVisitor),n=s.filter(t,function(t){var n=t[l];try{var r=u.getRegExpAst(n),i=new e;return i.visit(r),i.found}catch(t){return E.test(n.source)}});return s.map(n,function(t){return{message:\"Unexpected RegExp Anchor Error:\\n\\tToken Type: ->\"+t.name+\"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS\\tfor details.\",type:a.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[t]}})}function y(t){var e=s.filter(t,function(t){var e=t[l];return e instanceof RegExp&&(e.multiline||e.global)});return s.map(e,function(t){return{message:\"Token Type: ->\"+t.name+\"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",type:a.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[t]}})}function v(t){var e=[],n=s.map(t,function(n){return s.reduce(t,function(t,r){return n.PATTERN.source!==r.PATTERN.source||s.contains(e,r)||r.PATTERN===a.Lexer.NA?t:(e.push(r),t.push(r),t)},[])});n=s.compact(n);var r=s.filter(n,function(t){return t.length>1});return s.map(r,function(t){var e=s.map(t,function(t){return t.name});return{message:\"The same RegExp pattern ->\"+s.first(t).PATTERN+\"<-has been used in all of the following Token Types: \"+e.join(\", \")+\" <-\",type:a.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:t}})}function R(t){var e=s.filter(t,function(t){if(!s.has(t,\"GROUP\"))return!1;var e=t.GROUP;return e!==a.Lexer.SKIPPED&&e!==a.Lexer.NA&&!s.isString(e)});return s.map(e,function(t){return{message:\"Token Type: ->\"+t.name+\"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",type:a.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[t]}})}function A(t,e){var n=s.filter(t,function(t){return void 0!==t.PUSH_MODE&&!s.contains(e,t.PUSH_MODE)});return s.map(n,function(t){return{message:\"Token Type: ->\"+t.name+\"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\"+t.PUSH_MODE+\"<-which does not exist\",type:a.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[t]}})}function _(t){var e=[],n=s.reduce(t,function(t,e,n){var r,i=e.PATTERN;return i===a.Lexer.NA?t:(s.isString(i)?t.push({str:i,idx:n,tokenType:e}):s.isRegExp(i)&&(r=i,void 0===s.find([\".\",\"\\\\\",\"[\",\"]\",\"|\",\"^\",\"$\",\"(\",\")\",\"?\",\"*\",\"+\",\"{\"],function(t){return-1!==r.source.indexOf(t)}))&&t.push({str:i.source,idx:n,tokenType:e}),t)},[]);return s.forEach(t,function(t,r){s.forEach(n,function(n){var i=n.str,o=n.idx,c=n.tokenType;if(r<o&&function(t,e){if(s.isRegExp(e)){var n=e.exec(t);return null!==n&&0===n.index}if(s.isFunction(e))return e(t,0,[],{});if(s.has(e,\"exec\"))return e.exec(t,0,[],{});if(\"string\"==typeof e)return e===t;throw Error(\"non exhaustive match\")}(i,t.PATTERN)){var u=\"Token: ->\"+c.name+\"<- can never be matched.\\nBecause it appears AFTER the Token Type ->\"+t.name+\"<-in the lexer's definition.\\nSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNREACHABLE\";e.push({message:u,type:a.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[t,c]})}})}),e}function g(t){var e=t.ignoreCase?\"i\":\"\";return new RegExp(\"^(?:\"+t.source+\")\",e)}function N(t){var e=t.ignoreCase?\"iy\":\"y\";return new RegExp(\"\"+t.source,e)}function I(t){var e=t.PATTERN;if(s.isRegExp(e))return!1;if(s.isFunction(e))return!0;if(s.has(e,\"exec\"))return!0;if(s.isString(e))return!1;throw Error(\"non exhaustive match\")}function O(t){return!(!s.isString(t)||1!==t.length)&&t.charCodeAt(0)}function S(t,e){if(s.has(t,\"LINE_BREAKS\"))return!1;if(s.isRegExp(t.PATTERN)){try{c.canMatchCharCode(e,t.PATTERN)}catch(t){return{issue:a.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}if(s.isString(t.PATTERN))return!1;if(I(t))return{issue:a.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error(\"non exhaustive match\")}function L(t,e){if(e.issue===a.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return\"Warning: unable to identify line terminator usage in pattern.\\n\\tThe problem is in the <\"+t.name+\"> Token Type\\n\\t Root cause: \"+e.errMsg+\".\\n\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\";if(e.issue===a.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return\"Warning: A Custom Token Pattern should specify the <line_breaks> option.\\n\\tThe problem is in the <\"+t.name+\"> Token Type\\n\\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\";throw Error(\"non exhaustive match\")}function P(t){return s.map(t,function(t){return s.isString(t)&&t.length>0?t.charCodeAt(0):t})}function C(t,e,n){void 0===t[e]?t[e]=[n]:t[e].push(n)}function k(t){return t<e.minOptimizationVal?t:x[t]}e.findStartOfInputAnchor=T,e.findUnsupportedFlags=y,e.findDuplicatePatterns=v,e.findInvalidGroupType=R,e.findModesThatDoNotExist=A,e.findUnreachablePatterns=_,e.addStartOfInput=g,e.addStickyFlag=N,e.performRuntimeChecks=function(t,n,r){var i=[];return s.has(t,e.DEFAULT_MODE)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+e.DEFAULT_MODE+\"> property in its definition\\n\",type:a.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),s.has(t,e.MODES)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+e.MODES+\"> property in its definition\\n\",type:a.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),s.has(t,e.MODES)&&s.has(t,e.DEFAULT_MODE)&&!s.has(t.modes,t.defaultMode)&&i.push({message:\"A MultiMode Lexer cannot be initialized with a \"+e.DEFAULT_MODE+\": <\"+t.defaultMode+\">which does not exist\\n\",type:a.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),s.has(t,e.MODES)&&s.forEach(t.modes,function(t,e){s.forEach(t,function(t,n){s.isUndefined(t)&&i.push({message:\"A Lexer cannot be initialized using an undefined Token Type. Mode:<\"+e+\"> at index: <\"+n+\">\\n\",type:a.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i},e.performWarningRuntimeChecks=function(t,e,n){var r=[],i=!1,o=s.compact(s.flatten(s.mapValues(t.modes,function(t){return t}))),u=s.reject(o,function(t){return t[l]===a.Lexer.NA}),p=P(n);return e&&s.forEach(u,function(t){var e=S(t,p);if(!1!==e){var n={message:L(t,e),type:e.issue,tokenType:t};r.push(n)}else s.has(t,\"LINE_BREAKS\")?!0===t.LINE_BREAKS&&(i=!0):c.canMatchCharCode(p,t.PATTERN)&&(i=!0)}),e&&!i&&r.push({message:\"Warning: No LINE_BREAKS Found.\\n\\tThis Lexer has been defined to track line and column information,\\n\\tBut none of the Token Types can be identified as matching a line terminator.\\n\\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\\tfor details.\",type:a.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),r},e.cloneEmptyGroups=function(t){var e={},n=s.keys(t);return s.forEach(n,function(n){var r=t[n];if(!s.isArray(r))throw Error(\"non exhaustive match\");e[n]=[]}),e},e.isCustomPattern=I,e.isShortPattern=O,e.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,n=this.lastIndex;n<e;n++){var r=t.charCodeAt(n);if(10===r)return this.lastIndex=n+1,!0;if(13===r)return 10===t.charCodeAt(n+1)?this.lastIndex=n+2:this.lastIndex=n+1,!0}return!1},lastIndex:0},e.buildLineBreakIssueMessage=L,e.minOptimizationVal=256,e.charCodeToOptimizedIndex=k;var x=[]},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return\"Unable to pop Lexer Mode after encountering Token ->\"+t.image+\"<- The Mode Stack is empty\"},buildUnexpectedCharactersMessage:function(t,e,n,r,i){return\"unexpected character: ->\"+t.charAt(e)+\"<- at offset: \"+e+\", skipped \"+n+\" characters.\"}}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=n(6);function a(t){if(t instanceof i.NonTerminal)return a(t.referencedRule);if(t instanceof i.Terminal)return u(t);if(o.isSequenceProd(t))return s(t);if(o.isBranchingProd(t))return c(t);throw Error(\"non exhaustive match\")}function s(t){for(var e,n=[],i=t.definition,s=0,c=i.length>s,u=!0;c&&u;)e=i[s],u=o.isOptionalProd(e),n=n.concat(a(e)),s+=1,c=i.length>s;return r.uniq(n)}function c(t){var e=r.map(t.definition,function(t){return a(t)});return r.uniq(r.flatten(e))}function u(t){return[t.terminalType]}e.first=a,e.firstForSequence=s,e.firstForBranching=c,e.firstForTerminal=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.IN=\"_~IN~_\"},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(29),o=n(11),a=n(10),s=n(6);e.resolveGrammar=function(t){t=r.defaults(t,{errMsgProvider:a.defaultGrammarResolverErrorProvider});var e={};return r.forEach(t.rules,function(t){e[t.name]=t}),i.resolveGrammar(e,t.errMsgProvider)},e.validateGrammar=function(t){return t=r.defaults(t,{errMsgProvider:a.defaultGrammarValidatorErrorProvider,ignoredIssues:{}}),o.validateGrammar(t.rules,t.maxLookahead,t.tokenTypes,t.ignoredIssues,t.errMsgProvider,t.grammarName)},e.assignOccurrenceIndices=function(t){r.forEach(t.rules,function(t){var e=new s.DslMethodsCollectorVisitor;t.accept(e),r.forEach(e.dslMethods,function(t){r.forEach(t,function(t,e){t.idx=e+1})})})}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(3),i=n(0),o=n(8),a=n(23),s=n(2);function c(t){this.name=e.IN_RULE_RECOVERY_EXCEPTION,this.message=t}e.EOF_FOLLOW_KEY={},e.IN_RULE_RECOVERY_EXCEPTION=\"InRuleRecoveryException\",e.InRuleRecoveryException=c,c.prototype=Error.prototype;var u=function(){function t(){}return t.prototype.initRecoverable=function(t){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=i.has(t,\"recoveryEnabled\")?t.recoveryEnabled:s.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=l)},t.prototype.getTokenToInsert=function(t){var e=r.createTokenInstance(t,\"\",NaN,NaN,NaN,NaN,NaN,NaN);return e.isInsertedInRecovery=!0,e},t.prototype.canTokenTypeBeInsertedInRecovery=function(t){return!0},t.prototype.tryInRepetitionRecovery=function(t,e,n,r){for(var a=this,s=this.findReSyncTokenType(),c=this.exportLexerState(),u=[],l=!1,p=this.LA(1),h=this.LA(1),f=function(){var t=a.LA(0),e=a.errorMessageProvider.buildMismatchTokenMessage({expected:r,actual:p,previous:t,ruleName:a.getCurrRuleFullName()}),n=new o.MismatchedTokenException(e,p,a.LA(0));n.resyncedTokens=i.dropRight(u),a.SAVE_ERROR(n)};!l;){if(this.tokenMatcher(h,r))return void f();if(n.call(this))return f(),void t.apply(this,e);this.tokenMatcher(h,s)?l=!0:(h=this.SKIP_TOKEN(),this.addToResyncTokens(h,u))}this.importLexerState(c)},t.prototype.shouldInRepetitionRecoveryBeTried=function(t,e,n){return!1!==n&&(void 0!==t&&void 0!==e&&(!this.tokenMatcher(this.LA(1),t)&&(!this.isBackTracking()&&!this.canPerformInRuleRecovery(t,this.getFollowsForInRuleRecovery(t,e)))))},t.prototype.getFollowsForInRuleRecovery=function(t,e){var n=this.getCurrentGrammarPath(t,e);return this.getNextPossibleTokenTypes(n)},t.prototype.tryInRuleRecovery=function(t,e){if(this.canRecoverWithSingleTokenInsertion(t,e))return this.getTokenToInsert(t);if(this.canRecoverWithSingleTokenDeletion(t)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new c(\"sad sad panda\")},t.prototype.canPerformInRuleRecovery=function(t,e){return this.canRecoverWithSingleTokenInsertion(t,e)||this.canRecoverWithSingleTokenDeletion(t)},t.prototype.canRecoverWithSingleTokenInsertion=function(t,e){var n=this;if(!this.canTokenTypeBeInsertedInRecovery(t))return!1;if(i.isEmpty(e))return!1;var r=this.LA(1);return void 0!==i.find(e,function(t){return n.tokenMatcher(r,t)})},t.prototype.canRecoverWithSingleTokenDeletion=function(t){return this.tokenMatcher(this.LA(2),t)},t.prototype.isInCurrentRuleReSyncSet=function(t){var e=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(e);return i.contains(n,t)},t.prototype.findReSyncTokenType=function(){for(var t=this.flattenFollowSet(),e=this.LA(1),n=2;;){var r=e.tokenType;if(i.contains(t,r))return r;e=this.LA(n),n++}},t.prototype.getCurrFollowKey=function(){if(1===this.RULE_STACK.length)return e.EOF_FOLLOW_KEY;var t=this.getLastExplicitRuleShortName(),n=this.getLastExplicitRuleOccurrenceIndex(),r=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(t),idxInCallingRule:n,inRule:this.shortRuleNameToFullName(r)}},t.prototype.buildFullFollowKeyStack=function(){var t=this,n=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return i.isEmpty(this.LAST_EXPLICIT_RULE_STACK)||(n=i.map(this.LAST_EXPLICIT_RULE_STACK,function(e){return t.RULE_STACK[e]}),r=i.map(this.LAST_EXPLICIT_RULE_STACK,function(e){return t.RULE_OCCURRENCE_STACK[e]})),i.map(n,function(i,o){return 0===o?e.EOF_FOLLOW_KEY:{ruleName:t.shortRuleNameToFullName(i),idxInCallingRule:r[o],inRule:t.shortRuleNameToFullName(n[o-1])}})},t.prototype.flattenFollowSet=function(){var t=this,e=i.map(this.buildFullFollowKeyStack(),function(e){return t.getFollowSetFromFollowKey(e)});return i.flatten(e)},t.prototype.getFollowSetFromFollowKey=function(t){if(t===e.EOF_FOLLOW_KEY)return[r.EOF];var n=t.ruleName+t.idxInCallingRule+a.IN+t.inRule;return this.resyncFollows[n]},t.prototype.addToResyncTokens=function(t,e){return this.tokenMatcher(t,r.EOF)||e.push(t),e},t.prototype.reSyncTo=function(t){for(var e=[],n=this.LA(1);!1===this.tokenMatcher(n,t);)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,e);return i.dropRight(e)},t.prototype.attemptInRepetitionRecovery=function(t,e,n,r,i,o,a){},t.prototype.getCurrentGrammarPath=function(t,e){return{ruleStack:this.getHumanReadableRuleStack(),occurrenceStack:i.cloneArr(this.RULE_OCCURRENCE_STACK),lastTok:t,lastTokOccurrence:e}},t.prototype.getHumanReadableRuleStack=function(){var t=this;return i.isEmpty(this.LAST_EXPLICIT_RULE_STACK)?i.map(this.RULE_STACK,function(e){return t.shortRuleNameToFullName(e)}):i.map(this.LAST_EXPLICIT_RULE_STACK,function(e){return t.shortRuleNameToFullName(t.RULE_STACK[e])})},t}();function l(t,e,n,i,o,a,s){var c=this.getKeyForAutomaticLookahead(i,o),u=this.firstAfterRepMap[c];if(void 0===u){var l=this.getCurrRuleFullName();u=new a(this.getGAstProductions()[l],o).startWalking(),this.firstAfterRepMap[c]=u}var p=u.token,h=u.occurrence,f=u.isEndOfRule;1===this.RULE_STACK.length&&f&&void 0===p&&(p=r.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(p,h,s)&&this.tryInRepetitionRecovery(t,e,n,p)}e.Recoverable=u,e.attemptInRepetitionRecovery=l},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0);e.classNameFromInstance=function(t){return a(t.constructor)};var i=/^\\s*function\\s*(\\S*)\\s*\\(/,o=\"name\";function a(t){var e=t.name;return e||t.toString().match(i)[1]}e.functionName=a,e.defineNameProp=function(t,e){var n=Object.getOwnPropertyDescriptor(t,o);return!(!r.isUndefined(n)&&!n.configurable||(Object.defineProperty(t,o,{enumerable:!1,configurable:!0,writable:!1,value:e}),0))}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(14),a=n(22),s=n(0),c=n(23),u=n(1),l=function(t){function e(e){var n=t.call(this)||this;return n.topProd=e,n.follows={},n}return i(e,t),e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,e,n){},e.prototype.walkProdRef=function(t,e,n){var r=p(t.referencedRule,t.idx)+this.topProd.name,i=e.concat(n),o=new u.Flat({definition:i}),s=a.first(o);this.follows[r]=s},e}(o.RestWalker);function p(t,e){return t.name+e+c.IN}e.ResyncFollowsWalker=l,e.computeAllProdsFollows=function(t){var e={};return s.forEach(t,function(t){var n=new l(t).startWalking();s.assign(e,n)}),e},e.buildBetweenProdsFollowPrefix=p,e.buildInProdFollowPrefix=function(t){return t.terminalType.name+t.idx+c.IN}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(15),a=n(0),s=n(16),c=n(20),u=\"Complement Sets are not supported for first char optimization\";function l(t,e,n){switch(t.type){case\"Disjunction\":for(var r=0;r<t.value.length;r++)l(t.value[r],e,n);break;case\"Alternative\":var i=t.value;for(r=0;r<i.length;r++){var o=i[r];switch(o.type){case\"EndAnchor\":case\"GroupBackReference\":case\"Lookahead\":case\"NegativeLookahead\":case\"StartAnchor\":case\"WordBoundary\":case\"NonWordBoundary\":continue}var s=o;switch(s.type){case\"Character\":p(s.value,e,n);break;case\"Set\":if(!0===s.complement)throw Error(u);a.forEach(s.value,function(t){if(\"number\"==typeof t)p(t,e,n);else{var r=t;if(!0===n)for(var i=r.from;i<=r.to;i++)p(i,e,n);else{for(i=r.from;i<=r.to&&i<c.minOptimizationVal;i++)p(i,e,n);if(r.to>=c.minOptimizationVal)for(var o=r.from>=c.minOptimizationVal?r.from:c.minOptimizationVal,a=r.to,s=c.charCodeToOptimizedIndex(o),u=c.charCodeToOptimizedIndex(a),l=s;l<=u;l++)e[l]=l}}});break;case\"Group\":l(s.value,e,n);break;default:throw Error(\"Non Exhaustive Match\")}var h=void 0!==s.quantifier&&0===s.quantifier.atLeast;if(\"Group\"===s.type&&!1===f(s)||\"Group\"!==s.type&&!1===h)break}break;default:throw Error(\"non exhaustive match!\")}return a.values(e)}function p(t,e,n){var r=c.charCodeToOptimizedIndex(t);e[r]=r,!0===n&&function(t,e){var n=String.fromCharCode(t),r=n.toUpperCase();if(r!==n){var i=c.charCodeToOptimizedIndex(r.charCodeAt(0));e[i]=i}else{var o=n.toLowerCase();if(o!==n){var i=c.charCodeToOptimizedIndex(o.charCodeAt(0));e[i]=i}}}(t,e)}function h(t,e){return a.find(t.value,function(t){if(\"number\"==typeof t)return a.contains(e,t);var n=t;return void 0!==a.find(e,function(t){return n.from<=t&&t<=n.to})})}function f(t){return!(!t.quantifier||0!==t.quantifier.atLeast)||!!t.value&&(a.isArray(t.value)?a.every(t.value,f):f(t.value))}e.failedOptimizationPrefixMsg='Unable to use \"first char\" lexer optimizations:\\n',e.getOptimizedStartCodesIndices=function(t,n){void 0===n&&(n=!1);try{var r=s.getRegExpAst(t);return l(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===u)n&&a.PRINT_WARNING(e.failedOptimizationPrefixMsg+\"\\tUnable to optimize: < \"+t.toString()+\" >\\n\\tComplement Sets cannot be automatically optimized.\\n\\tThis will disable the lexer's first char optimizations.\\n\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");else{var i=\"\";n&&(i=\"\\n\\tThis will disable the lexer's first char optimizations.\\n\\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\"),a.PRINT_ERROR(e.failedOptimizationPrefixMsg+\"\\n\\tFailed parsing: < \"+t.toString()+\" >\\n\\tUsing the regexp-to-ast library version: \"+o.VERSION+\"\\n\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\"+i)}}return[]},e.firstCharOptimizedIndices=l;var d=function(t){function e(e){var n=t.call(this)||this;return n.targetCharCodes=e,n.found=!1,n}return i(e,t),e.prototype.visitChildren=function(e){if(!0!==this.found){switch(e.type){case\"Lookahead\":return void this.visitLookahead(e);case\"NegativeLookahead\":return void this.visitNegativeLookahead(e)}t.prototype.visitChildren.call(this,e)}},e.prototype.visitCharacter=function(t){a.contains(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?void 0===h(t,this.targetCharCodes)&&(this.found=!0):void 0!==h(t,this.targetCharCodes)&&(this.found=!0)},e}(o.BaseRegExpVisitor);e.canMatchCharCode=function(t,e){if(e instanceof RegExp){var n=s.getRegExpAst(e),r=new d(t);return r.visit(n),r.found}return void 0!==a.find(e,function(e){return a.contains(t,e.charCodeAt(0))})}},function(t,e,n){\"use strict\";var r,i=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,\"__esModule\",{value:!0});var o=n(2),a=n(0),s=n(4);e.resolveGrammar=function(t,e){var n=new c(t,e);return n.resolveRefs(),n.errors};var c=function(t){function e(e,n){var r=t.call(this)||this;return r.nameToTopRule=e,r.errMsgProvider=n,r.errors=[],r}return i(e,t),e.prototype.resolveRefs=function(){var t=this;a.forEach(a.values(this.nameToTopRule),function(e){t.currTopLevel=e,e.accept(t)})},e.prototype.visitNonTerminal=function(t){var e=this.nameToTopRule[t.nonTerminalName];if(e)t.referencedRule=e;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:o.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(s.GAstVisitor);e.GastRefResolverVisitor=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(12),i=n(0),o=n(2),a=n(7),s=n(6),c=function(){function t(){}return t.prototype.initLooksAhead=function(t){this.dynamicTokensEnabled=i.has(t,\"dynamicTokensEnabled\")?t.dynamicTokensEnabled:o.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=i.has(t,\"maxLookahead\")?t.maxLookahead:o.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=i.isES2015MapSupported()?new Map:[],i.isES2015MapSupported()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(t){var e=this;i.forEach(t,function(t){e.TRACE_INIT(t.name+\" Rule Lookahead\",function(){var n=s.collectMethods(t),o=n.alternation,c=n.repetition,u=n.option,l=n.repetitionMandatory,p=n.repetitionMandatoryWithSeparator,h=n.repetitionWithSeparator;i.forEach(o,function(n){var i=0===n.idx?\"\":n.idx;e.TRACE_INIT(\"\"+s.getProductionDslName(n)+i,function(){var i=r.buildLookaheadFuncForOr(n.idx,t,n.maxLookahead||e.maxLookahead,n.hasPredicates,e.dynamicTokensEnabled,e.lookAheadBuilderForAlternatives),o=a.getKeyForAutomaticLookahead(e.fullRuleNameToShort[t.name],a.OR_IDX,n.idx);e.setLaFuncCache(o,i)})}),i.forEach(c,function(n){e.computeLookaheadFunc(t,n.idx,a.MANY_IDX,r.PROD_TYPE.REPETITION,n.maxLookahead,s.getProductionDslName(n))}),i.forEach(u,function(n){e.computeLookaheadFunc(t,n.idx,a.OPTION_IDX,r.PROD_TYPE.OPTION,n.maxLookahead,s.getProductionDslName(n))}),i.forEach(l,function(n){e.computeLookaheadFunc(t,n.idx,a.AT_LEAST_ONE_IDX,r.PROD_TYPE.REPETITION_MANDATORY,n.maxLookahead,s.getProductionDslName(n))}),i.forEach(p,function(n){e.computeLookaheadFunc(t,n.idx,a.AT_LEAST_ONE_SEP_IDX,r.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,n.maxLookahead,s.getProductionDslName(n))}),i.forEach(h,function(n){e.computeLookaheadFunc(t,n.idx,a.MANY_SEP_IDX,r.PROD_TYPE.REPETITION_WITH_SEPARATOR,n.maxLookahead,s.getProductionDslName(n))})})})},t.prototype.computeLookaheadFunc=function(t,e,n,i,o,s){var c=this;this.TRACE_INIT(\"\"+s+(0===e?\"\":e),function(){var s=r.buildLookaheadFuncForOptionalProd(e,t,o||c.maxLookahead,c.dynamicTokensEnabled,i,c.lookAheadBuilderForOptional),u=a.getKeyForAutomaticLookahead(c.fullRuleNameToShort[t.name],n,e);c.setLaFuncCache(u,s)})},t.prototype.lookAheadBuilderForOptional=function(t,e,n){return r.buildSingleAlternativeLookaheadFunction(t,e,n)},t.prototype.lookAheadBuilderForAlternatives=function(t,e,n,i){return r.buildAlternativesLookAheadFunc(t,e,n,i)},t.prototype.getKeyForAutomaticLookahead=function(t,e){var n=this.getLastExplicitRuleShortName();return a.getKeyForAutomaticLookahead(n,t,e)},t.prototype.getLaFuncFromCache=function(t){},t.prototype.getLaFuncFromMap=function(t){return this.lookAheadFuncsCache.get(t)},t.prototype.getLaFuncFromObj=function(t){return this.lookAheadFuncsCache[t]},t.prototype.setLaFuncCache=function(t,e){},t.prototype.setLaFuncCacheUsingMap=function(t,e){this.lookAheadFuncsCache.set(t,e)},t.prototype.setLaFuncUsingObj=function(t,e){this.lookAheadFuncsCache[t]=e},t}();e.LooksAhead=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(17),i=n(0),o=n(32),a=n(7),s=n(2),c=function(){function t(){}return t.prototype.initTreeBuilder=function(t){if(this.LAST_EXPLICIT_RULE_STACK=[],this.CST_STACK=[],this.outputCst=i.has(t,\"outputCst\")?t.outputCst:s.DEFAULT_PARSER_CONFIG.outputCst,this.nodeLocationTracking=i.has(t,\"nodeLocationTracking\")?t.nodeLocationTracking:s.DEFAULT_PARSER_CONFIG.nodeLocationTracking,this.outputCst)if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=r.setNodeLocationFull,this.setNodeLocationFromNode=r.setNodeLocationFull,this.cstPostRule=i.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=i.NOOP,this.setNodeLocationFromNode=i.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=r.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=r.setNodeLocationOnlyOffset,this.cstPostRule=i.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=i.NOOP,this.setNodeLocationFromNode=i.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else{if(!/none/i.test(this.nodeLocationTracking))throw Error('Invalid <nodeLocationTracking> config option: \"'+t.nodeLocationTracking+'\"');this.setNodeLocationFromToken=i.NOOP,this.setNodeLocationFromNode=i.NOOP,this.cstPostRule=i.NOOP,this.setInitialNodeLocation=i.NOOP}else this.cstInvocationStateUpdate=i.NOOP,this.cstFinallyStateUpdate=i.NOOP,this.cstPostTerminal=i.NOOP,this.cstPostNonTerminal=i.NOOP,this.cstPostRule=i.NOOP,this.getLastExplicitRuleShortName=this.getLastExplicitRuleShortNameNoCst,this.getPreviousExplicitRuleShortName=this.getPreviousExplicitRuleShortNameNoCst,this.getLastExplicitRuleOccurrenceIndex=this.getLastExplicitRuleOccurrenceIndexNoCst,this.manyInternal=this.manyInternalNoCst,this.orInternal=this.orInternalNoCst,this.optionInternal=this.optionInternalNoCst,this.atLeastOneInternal=this.atLeastOneInternalNoCst,this.manySepFirstInternal=this.manySepFirstInternalNoCst,this.atLeastOneSepFirstInternal=this.atLeastOneSepFirstInternalNoCst},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(t){t.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(t){t.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(t){t.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(t){var e=this.LA(1);t.location={startOffset:e.startOffset,startLine:e.startLine,startColumn:e.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstNestedInvocationStateUpdate=function(t,e){var n={name:t,fullName:this.shortRuleNameToFull[this.getLastExplicitRuleShortName()]+t,children:{}};this.setInitialNodeLocation(n),this.CST_STACK.push(n)},t.prototype.cstInvocationStateUpdate=function(t,e){this.LAST_EXPLICIT_RULE_STACK.push(this.RULE_STACK.length-1);var n={name:t,children:{}};this.setInitialNodeLocation(n),this.CST_STACK.push(n)},t.prototype.cstFinallyStateUpdate=function(){this.LAST_EXPLICIT_RULE_STACK.pop(),this.CST_STACK.pop()},t.prototype.cstNestedFinallyStateUpdate=function(){var t=this.CST_STACK.pop();this.cstPostRule(t)},t.prototype.cstPostRuleFull=function(t){var e=this.LA(0),n=t.location;n.startOffset<=e.startOffset==!0?(n.endOffset=e.endOffset,n.endLine=e.endLine,n.endColumn=e.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(t){var e=this.LA(0),n=t.location;n.startOffset<=e.startOffset==!0?n.endOffset=e.endOffset:n.startOffset=NaN},t.prototype.cstPostTerminal=function(t,e){var n=this.CST_STACK[this.CST_STACK.length-1];r.addTerminalToCst(n,e,t),this.setNodeLocationFromToken(n.location,e)},t.prototype.cstPostNonTerminal=function(t,e){if(!0!==this.isBackTracking()){var n=this.CST_STACK[this.CST_STACK.length-1];r.addNoneTerminalToCst(n,e,t),this.setNodeLocationFromNode(n.location,t.location)}},t.prototype.getBaseCstVisitorConstructor=function(){if(i.isUndefined(this.baseCstVisitorConstructor)){var t=o.createBaseSemanticVisitorConstructor(this.className,this.allRuleNames);return this.baseCstVisitorConstructor=t,t}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if(i.isUndefined(this.baseCstVisitorWithDefaultsConstructor)){var t=o.createBaseVisitorConstructorWithDefaults(this.className,this.allRuleNames,this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=t,t}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.nestedRuleBeforeClause=function(t,e){var n;return void 0!==t.NAME?(n=t.NAME,this.nestedRuleInvocationStateUpdate(n,e),n):void 0},t.prototype.nestedAltBeforeClause=function(t,e,n,r){var i,o=this.getLastExplicitRuleShortName(),s=a.getKeyForAltIndex(o,n,e,r);return void 0!==t.NAME?(i=t.NAME,this.nestedRuleInvocationStateUpdate(i,s),{shortName:s,nestedName:i}):void 0},t.prototype.nestedRuleFinallyClause=function(t,e){var n=this.CST_STACK,i=n[n.length-1];this.nestedRuleFinallyStateUpdate();var o=n[n.length-1];r.addNoneTerminalToCst(o,e,i),this.setNodeLocationFromNode(o.location,i.location)},t.prototype.getLastExplicitRuleShortName=function(){var t=this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length-1];return this.RULE_STACK[t]},t.prototype.getLastExplicitRuleShortNameNoCst=function(){var t=this.RULE_STACK;return t[t.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var t=this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length-2];return this.RULE_STACK[t]},t.prototype.getPreviousExplicitRuleShortNameNoCst=function(){var t=this.RULE_STACK;return t[t.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var t=this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length-1];return this.RULE_OCCURRENCE_STACK[t]},t.prototype.getLastExplicitRuleOccurrenceIndexNoCst=function(){var t=this.RULE_OCCURRENCE_STACK;return t[t.length-1]},t.prototype.nestedRuleInvocationStateUpdate=function(t,e){this.RULE_OCCURRENCE_STACK.push(1),this.RULE_STACK.push(e),this.cstNestedInvocationStateUpdate(t,e)},t.prototype.nestedRuleFinallyStateUpdate=function(){this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstNestedFinallyStateUpdate()},t}();e.TreeBuilder=c},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r,i=n(0),o=n(26),a=n(11);function s(t,e){for(var n=i.keys(t),r=n.length,o=0;o<r;o++)for(var a=t[n[o]],s=a.length,c=0;c<s;c++){var u=a[c];void 0===u.tokenTypeIdx&&(void 0!==u.fullName?this[u.fullName](u.children,e):this[u.name](u.children,e))}}function c(t,e){var n=u(t,e),r=p(t,e);return n.concat(r)}function u(t,e){var n=i.map(e,function(e){if(!i.isFunction(t[e]))return{msg:\"Missing visitor method: <\"+e+\"> on \"+o.functionName(t.constructor)+\" CST Visitor.\",type:r.MISSING_METHOD,methodName:e}});return i.compact(n)}e.defaultVisit=s,e.createBaseSemanticVisitorConstructor=function(t,e){var n=function(){};return o.defineNameProp(n,t+\"BaseSemantics\"),(n.prototype={visit:function(t,e){if(i.isArray(t)&&(t=t[0]),!i.isUndefined(t))return void 0!==t.fullName?this[t.fullName](t.children,e):this[t.name](t.children,e)},validateVisitor:function(){var t=c(this,e);if(!i.isEmpty(t)){var n=i.map(t,function(t){return t.msg});throw Error(\"Errors Detected in CST Visitor <\"+o.functionName(this.constructor)+\">:\\n\\t\"+n.join(\"\\n\\n\").replace(/\\n/g,\"\\n\\t\"))}}}).constructor=n,n._RULE_NAMES=e,n},e.createBaseVisitorConstructorWithDefaults=function(t,e,n){var r=function(){};o.defineNameProp(r,t+\"BaseSemanticsWithDefaults\");var a=Object.create(n.prototype);return i.forEach(e,function(t){a[t]=s}),(r.prototype=a).constructor=r,r},function(t){t[t.REDUNDANT_METHOD=0]=\"REDUNDANT_METHOD\",t[t.MISSING_METHOD=1]=\"MISSING_METHOD\"}(r=e.CstVisitorDefinitionError||(e.CstVisitorDefinitionError={})),e.validateVisitor=c,e.validateMissingCstMethods=u;var l=[\"constructor\",\"visit\",\"validateVisitor\"];function p(t,e){var n=[];for(var s in t)a.validTermsPattern.test(s)&&i.isFunction(t[s])&&!i.contains(l,s)&&!i.contains(e,s)&&n.push({msg:\"Redundant visitor method: <\"+s+\"> on \"+o.functionName(t.constructor)+\" CST Visitor\\nThere is no Grammar Rule corresponding to this method's name.\\nFor utility methods on visitor classes use methods names that do not match /\"+a.validTermsPattern.source+\"/.\",type:r.REDUNDANT_METHOD,methodName:s});return n}e.validateRedundantMethods=p},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(2),i=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,\"input\",{get:function(){return this.tokVector},set:function(t){if(!0!==this.selfAnalysisDone)throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");this.reset(),this.tokVector=t,this.tokVectorLength=t.length},enumerable:!0,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):r.END_OF_FILE},t.prototype.LA=function(t){var e=this.currIdx+t;return e<0||this.tokVectorLength<=e?r.END_OF_FILE:this.tokVector[e]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(t){this.currIdx=t},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();e.LexerAdapter=i},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(8),o=n(2),a=n(10),s=n(11),c=n(1),u=function(){function t(){}return t.prototype.ACTION=function(t){return t.call(this)},t.prototype.consume=function(t,e,n){return this.consumeInternal(e,t,n)},t.prototype.subrule=function(t,e,n){return this.subruleInternal(e,t,n)},t.prototype.option=function(t,e){return this.optionInternal(e,t)},t.prototype.or=function(t,e){return this.orInternal(e,t)},t.prototype.many=function(t,e){return this.manyInternal(t,e)},t.prototype.atLeastOne=function(t,e){return this.atLeastOneInternal(t,e)},t.prototype.CONSUME=function(t,e){return this.consumeInternal(t,0,e)},t.prototype.CONSUME1=function(t,e){return this.consumeInternal(t,1,e)},t.prototype.CONSUME2=function(t,e){return this.consumeInternal(t,2,e)},t.prototype.CONSUME3=function(t,e){return this.consumeInternal(t,3,e)},t.prototype.CONSUME4=function(t,e){return this.consumeInternal(t,4,e)},t.prototype.CONSUME5=function(t,e){return this.consumeInternal(t,5,e)},t.prototype.CONSUME6=function(t,e){return this.consumeInternal(t,6,e)},t.prototype.CONSUME7=function(t,e){return this.consumeInternal(t,7,e)},t.prototype.CONSUME8=function(t,e){return this.consumeInternal(t,8,e)},t.prototype.CONSUME9=function(t,e){return this.consumeInternal(t,9,e)},t.prototype.SUBRULE=function(t,e){return this.subruleInternal(t,0,e)},t.prototype.SUBRULE1=function(t,e){return this.subruleInternal(t,1,e)},t.prototype.SUBRULE2=function(t,e){return this.subruleInternal(t,2,e)},t.prototype.SUBRULE3=function(t,e){return this.subruleInternal(t,3,e)},t.prototype.SUBRULE4=function(t,e){return this.subruleInternal(t,4,e)},t.prototype.SUBRULE5=function(t,e){return this.subruleInternal(t,5,e)},t.prototype.SUBRULE6=function(t,e){return this.subruleInternal(t,6,e)},t.prototype.SUBRULE7=function(t,e){return this.subruleInternal(t,7,e)},t.prototype.SUBRULE8=function(t,e){return this.subruleInternal(t,8,e)},t.prototype.SUBRULE9=function(t,e){return this.subruleInternal(t,9,e)},t.prototype.OPTION=function(t){return this.optionInternal(t,0)},t.prototype.OPTION1=function(t){return this.optionInternal(t,1)},t.prototype.OPTION2=function(t){return this.optionInternal(t,2)},t.prototype.OPTION3=function(t){return this.optionInternal(t,3)},t.prototype.OPTION4=function(t){return this.optionInternal(t,4)},t.prototype.OPTION5=function(t){return this.optionInternal(t,5)},t.prototype.OPTION6=function(t){return this.optionInternal(t,6)},t.prototype.OPTION7=function(t){return this.optionInternal(t,7)},t.prototype.OPTION8=function(t){return this.optionInternal(t,8)},t.prototype.OPTION9=function(t){return this.optionInternal(t,9)},t.prototype.OR=function(t){return this.orInternal(t,0)},t.prototype.OR1=function(t){return this.orInternal(t,1)},t.prototype.OR2=function(t){return this.orInternal(t,2)},t.prototype.OR3=function(t){return this.orInternal(t,3)},t.prototype.OR4=function(t){return this.orInternal(t,4)},t.prototype.OR5=function(t){return this.orInternal(t,5)},t.prototype.OR6=function(t){return this.orInternal(t,6)},t.prototype.OR7=function(t){return this.orInternal(t,7)},t.prototype.OR8=function(t){return this.orInternal(t,8)},t.prototype.OR9=function(t){return this.orInternal(t,9)},t.prototype.MANY=function(t){this.manyInternal(0,t)},t.prototype.MANY1=function(t){this.manyInternal(1,t)},t.prototype.MANY2=function(t){this.manyInternal(2,t)},t.prototype.MANY3=function(t){this.manyInternal(3,t)},t.prototype.MANY4=function(t){this.manyInternal(4,t)},t.prototype.MANY5=function(t){this.manyInternal(5,t)},t.prototype.MANY6=function(t){this.manyInternal(6,t)},t.prototype.MANY7=function(t){this.manyInternal(7,t)},t.prototype.MANY8=function(t){this.manyInternal(8,t)},t.prototype.MANY9=function(t){this.manyInternal(9,t)},t.prototype.MANY_SEP=function(t){this.manySepFirstInternal(0,t)},t.prototype.MANY_SEP1=function(t){this.manySepFirstInternal(1,t)},t.prototype.MANY_SEP2=function(t){this.manySepFirstInternal(2,t)},t.prototype.MANY_SEP3=function(t){this.manySepFirstInternal(3,t)},t.prototype.MANY_SEP4=function(t){this.manySepFirstInternal(4,t)},t.prototype.MANY_SEP5=function(t){this.manySepFirstInternal(5,t)},t.prototype.MANY_SEP6=function(t){this.manySepFirstInternal(6,t)},t.prototype.MANY_SEP7=function(t){this.manySepFirstInternal(7,t)},t.prototype.MANY_SEP8=function(t){this.manySepFirstInternal(8,t)},t.prototype.MANY_SEP9=function(t){this.manySepFirstInternal(9,t)},t.prototype.AT_LEAST_ONE=function(t){this.atLeastOneInternal(0,t)},t.prototype.AT_LEAST_ONE1=function(t){return this.atLeastOneInternal(1,t)},t.prototype.AT_LEAST_ONE2=function(t){this.atLeastOneInternal(2,t)},t.prototype.AT_LEAST_ONE3=function(t){this.atLeastOneInternal(3,t)},t.prototype.AT_LEAST_ONE4=function(t){this.atLeastOneInternal(4,t)},t.prototype.AT_LEAST_ONE5=function(t){this.atLeastOneInternal(5,t)},t.prototype.AT_LEAST_ONE6=function(t){this.atLeastOneInternal(6,t)},t.prototype.AT_LEAST_ONE7=function(t){this.atLeastOneInternal(7,t)},t.prototype.AT_LEAST_ONE8=function(t){this.atLeastOneInternal(8,t)},t.prototype.AT_LEAST_ONE9=function(t){this.atLeastOneInternal(9,t)},t.prototype.AT_LEAST_ONE_SEP=function(t){this.atLeastOneSepFirstInternal(0,t)},t.prototype.AT_LEAST_ONE_SEP1=function(t){this.atLeastOneSepFirstInternal(1,t)},t.prototype.AT_LEAST_ONE_SEP2=function(t){this.atLeastOneSepFirstInternal(2,t)},t.prototype.AT_LEAST_ONE_SEP3=function(t){this.atLeastOneSepFirstInternal(3,t)},t.prototype.AT_LEAST_ONE_SEP4=function(t){this.atLeastOneSepFirstInternal(4,t)},t.prototype.AT_LEAST_ONE_SEP5=function(t){this.atLeastOneSepFirstInternal(5,t)},t.prototype.AT_LEAST_ONE_SEP6=function(t){this.atLeastOneSepFirstInternal(6,t)},t.prototype.AT_LEAST_ONE_SEP7=function(t){this.atLeastOneSepFirstInternal(7,t)},t.prototype.AT_LEAST_ONE_SEP8=function(t){this.atLeastOneSepFirstInternal(8,t)},t.prototype.AT_LEAST_ONE_SEP9=function(t){this.atLeastOneSepFirstInternal(9,t)},t.prototype.RULE=function(t,e,n){if(void 0===n&&(n=o.DEFAULT_RULE_CONFIG),r.contains(this.definedRulesNames,t)){var i={message:a.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:t,grammarName:this.className}),type:o.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t};this.definitionErrors.push(i)}this.definedRulesNames.push(t);var s=this.defineRule(t,e,n);return this[t]=s,s},t.prototype.OVERRIDE_RULE=function(t,e,n){void 0===n&&(n=o.DEFAULT_RULE_CONFIG);var r=[];r=r.concat(s.validateRuleIsOverridden(t,this.definedRulesNames,this.className)),this.definitionErrors.push.apply(this.definitionErrors,r);var i=this.defineRule(t,e,n);return this[t]=i,i},t.prototype.BACKTRACK=function(t,e){return function(){this.isBackTrackingStack.push(1);var n=this.saveRecogState();try{return t.apply(this,e),!0}catch(t){if(i.isRecognitionException(t))return!1;throw t}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return c.serializeGrammar(r.values(this.gastProductionsCache))},t}();e.RecognizerApi=u},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(7),o=n(8),a=n(12),s=n(13),c=n(2),u=n(25),l=n(3),p=n(5),h=n(26),f=function(){function t(){}return t.prototype.initRecognizerEngine=function(t,e){if(this.className=h.classNameFromInstance(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=p.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.allRuleNames=[],this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},r.has(e,\"serializedGrammar\"))throw Error(\"The Parser's configuration can no longer contain a <serializedGrammar> property.\\n\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\\tFor Further details.\");if(r.isArray(t)){if(r.isEmpty(t))throw Error(\"A Token Vocabulary cannot be empty.\\n\\tNote that the first argument for the parser constructor\\n\\tis no longer a Token vector (since v4.0).\");if(\"number\"==typeof t[0].startOffset)throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\\tSee: https://sap.github.io/chevrotain/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\\tFor Further details.\")}if(r.isArray(t))this.tokensMap=r.reduce(t,function(t,e){return t[e.name]=e,t},{});else if(r.has(t,\"modes\")&&r.every(r.flatten(r.values(t.modes)),p.isTokenType)){var n=r.flatten(r.values(t.modes)),i=r.uniq(n);this.tokensMap=r.reduce(i,function(t,e){return t[e.name]=e,t},{})}else{if(!r.isObject(t))throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition\");this.tokensMap=r.cloneObj(t)}this.tokensMap.EOF=l.EOF;var o=r.every(r.values(t),function(t){return r.isEmpty(t.categoryMatches)});this.tokenMatcher=o?p.tokenStructuredMatcherNoCategories:p.tokenStructuredMatcher,p.augmentTokenTypes(r.values(this.tokensMap))},t.prototype.defineRule=function(t,e,n){if(this.selfAnalysisDone)throw Error(\"Grammar rule <\"+t+\"> may not be defined after the 'performSelfAnalysis' method has been called'\\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");var o,a=r.has(n,\"resyncEnabled\")?n.resyncEnabled:c.DEFAULT_RULE_CONFIG.resyncEnabled,s=r.has(n,\"recoveryValueFunc\")?n.recoveryValueFunc:c.DEFAULT_RULE_CONFIG.recoveryValueFunc,u=this.ruleShortNameIdx<<i.BITS_FOR_METHOD_TYPE+i.BITS_FOR_OCCURRENCE_IDX;this.ruleShortNameIdx++,this.shortRuleNameToFull[u]=t,this.fullRuleNameToShort[t]=u;return(o=function(n,r){return void 0===n&&(n=0),this.ruleInvocationStateUpdate(u,t,n),function(t){try{if(!0===this.outputCst){e.apply(this,t);var n=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(n),n}return e.apply(this,t)}catch(t){return this.invokeRuleCatch(t,a,s)}finally{this.ruleFinallyStateUpdate()}}.call(this,r)}).ruleName=t,o.originalGrammarAction=e,o},t.prototype.invokeRuleCatch=function(t,e,n){var r=1===this.RULE_STACK.length,i=e&&!this.isBackTracking()&&this.recoveryEnabled;if(o.isRecognitionException(t)){var a=t;if(i){var s,c=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(c))return a.resyncedTokens=this.reSyncTo(c),this.outputCst?((s=this.CST_STACK[this.CST_STACK.length-1]).recoveredNode=!0,s):n();throw this.outputCst&&((s=this.CST_STACK[this.CST_STACK.length-1]).recoveredNode=!0,a.partialCstResult=s),a}if(r)return this.moveToTerminatedState(),n();throw a}throw t},t.prototype.optionInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.OPTION_IDX,e),r=this.nestedRuleBeforeClause(t,n);try{return this.optionInternalLogic(t,e,n)}finally{void 0!==r&&this.nestedRuleFinallyClause(n,r)}},t.prototype.optionInternalNoCst=function(t,e){var n=this.getKeyForAutomaticLookahead(i.OPTION_IDX,e);return this.optionInternalLogic(t,e,n)},t.prototype.optionInternalLogic=function(t,e,n){var r,i,o=this,a=this.getLaFuncFromCache(n);if(void 0!==t.DEF){if(r=t.DEF,void 0!==(i=t.GATE)){var s=a;a=function(){return i.call(o)&&s.call(o)}}}else r=t;if(!0===a.call(this))return r.call(this)},t.prototype.atLeastOneInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.AT_LEAST_ONE_IDX,t),r=this.nestedRuleBeforeClause(e,n);try{return this.atLeastOneInternalLogic(t,e,n)}finally{void 0!==r&&this.nestedRuleFinallyClause(n,r)}},t.prototype.atLeastOneInternalNoCst=function(t,e){var n=this.getKeyForAutomaticLookahead(i.AT_LEAST_ONE_IDX,t);this.atLeastOneInternalLogic(t,e,n)},t.prototype.atLeastOneInternalLogic=function(t,e,n){var r,o,c=this,u=this.getLaFuncFromCache(n);if(void 0!==e.DEF){if(r=e.DEF,void 0!==(o=e.GATE)){var l=u;u=function(){return o.call(c)&&l.call(c)}}}else r=e;if(!0!==u.call(this))throw this.raiseEarlyExitException(t,a.PROD_TYPE.REPETITION_MANDATORY,e.ERR_MSG);for(var p=this.doSingleRepetition(r);!0===u.call(this)&&!0===p;)p=this.doSingleRepetition(r);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[t,e],u,i.AT_LEAST_ONE_IDX,t,s.NextTerminalAfterAtLeastOneWalker)},t.prototype.atLeastOneSepFirstInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.AT_LEAST_ONE_SEP_IDX,t),r=this.nestedRuleBeforeClause(e,n);try{this.atLeastOneSepFirstInternalLogic(t,e,n)}finally{void 0!==r&&this.nestedRuleFinallyClause(n,r)}},t.prototype.atLeastOneSepFirstInternalNoCst=function(t,e){var n=this.getKeyForAutomaticLookahead(i.AT_LEAST_ONE_SEP_IDX,t);this.atLeastOneSepFirstInternalLogic(t,e,n)},t.prototype.atLeastOneSepFirstInternalLogic=function(t,e,n){var r=this,o=e.DEF,c=e.SEP;if(!0!==this.getLaFuncFromCache(n).call(this))throw this.raiseEarlyExitException(t,a.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,e.ERR_MSG);o.call(this);for(var u=function(){return r.tokenMatcher(r.LA(1),c)};!0===this.tokenMatcher(this.LA(1),c);)this.CONSUME(c),o.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[t,c,u,o,s.NextTerminalAfterAtLeastOneSepWalker],u,i.AT_LEAST_ONE_SEP_IDX,t,s.NextTerminalAfterAtLeastOneSepWalker)},t.prototype.manyInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.MANY_IDX,t),r=this.nestedRuleBeforeClause(e,n);try{return this.manyInternalLogic(t,e,n)}finally{void 0!==r&&this.nestedRuleFinallyClause(n,r)}},t.prototype.manyInternalNoCst=function(t,e){var n=this.getKeyForAutomaticLookahead(i.MANY_IDX,t);return this.manyInternalLogic(t,e,n)},t.prototype.manyInternalLogic=function(t,e,n){var r,o,a=this,c=this.getLaFuncFromCache(n);if(void 0!==e.DEF){if(r=e.DEF,void 0!==(o=e.GATE)){var u=c;c=function(){return o.call(a)&&u.call(a)}}}else r=e;for(var l=!0;!0===c.call(this)&&!0===l;)l=this.doSingleRepetition(r);this.attemptInRepetitionRecovery(this.manyInternal,[t,e],c,i.MANY_IDX,t,s.NextTerminalAfterManyWalker,l)},t.prototype.manySepFirstInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.MANY_SEP_IDX,t),r=this.nestedRuleBeforeClause(e,n);try{this.manySepFirstInternalLogic(t,e,n)}finally{void 0!==r&&this.nestedRuleFinallyClause(n,r)}},t.prototype.manySepFirstInternalNoCst=function(t,e){var n=this.getKeyForAutomaticLookahead(i.MANY_SEP_IDX,t);this.manySepFirstInternalLogic(t,e,n)},t.prototype.manySepFirstInternalLogic=function(t,e,n){var r=this,o=e.DEF,a=e.SEP;if(!0===this.getLaFuncFromCache(n).call(this)){o.call(this);for(var c=function(){return r.tokenMatcher(r.LA(1),a)};!0===this.tokenMatcher(this.LA(1),a);)this.CONSUME(a),o.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[t,a,c,o,s.NextTerminalAfterManySepWalker],c,i.MANY_SEP_IDX,t,s.NextTerminalAfterManySepWalker)}},t.prototype.repetitionSepSecondInternal=function(t,e,n,r,o){for(;n();)this.CONSUME(e),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[t,e,n,r,o],n,i.AT_LEAST_ONE_SEP_IDX,t,o)},t.prototype.doSingleRepetition=function(t){var e=this.getLexerPosition();return t.call(this),this.getLexerPosition()>e},t.prototype.orInternalNoCst=function(t,e){var n=r.isArray(t)?t:t.DEF,o=this.getKeyForAutomaticLookahead(i.OR_IDX,e),a=this.getLaFuncFromCache(o).call(this,n);if(void 0!==a)return n[a].ALT.call(this);this.raiseNoAltException(e,t.ERR_MSG)},t.prototype.orInternal=function(t,e){var n=this.getKeyForAutomaticLookahead(i.OR_IDX,e),o=this.nestedRuleBeforeClause(t,n);try{var a=r.isArray(t)?t:t.DEF,s=this.getLaFuncFromCache(n).call(this,a);if(void 0!==s){var c=a[s],u=this.nestedAltBeforeClause(c,e,i.OR_IDX,s);try{return c.ALT.call(this)}finally{void 0!==u&&this.nestedRuleFinallyClause(u.shortName,u.nestedName)}}this.raiseNoAltException(e,t.ERR_MSG)}finally{void 0!==o&&this.nestedRuleFinallyClause(n,o)}},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),0===this.RULE_STACK.length&&!1===this.isAtEndOfInput()){var t=this.LA(1),e=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:t,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new o.NotAllInputParsedException(e,t))}},t.prototype.subruleInternal=function(t,e,n){var r;try{var i=void 0!==n?n.ARGS:void 0;return r=t.call(this,e,i),this.cstPostNonTerminal(r,void 0!==n&&void 0!==n.LABEL?n.LABEL:t.ruleName),r}catch(e){this.subruleInternalError(e,n,t.ruleName)}},t.prototype.subruleInternalError=function(t,e,n){throw o.isRecognitionException(t)&&void 0!==t.partialCstResult&&(this.cstPostNonTerminal(t.partialCstResult,void 0!==e&&void 0!==e.LABEL?e.LABEL:n),delete t.partialCstResult),t},t.prototype.consumeInternal=function(t,e,n){var r;try{var i=this.LA(1);!0===this.tokenMatcher(i,t)?(this.consumeToken(),r=i):this.consumeInternalError(t,i,n)}catch(n){r=this.consumeInternalRecovery(t,e,n)}return this.cstPostTerminal(void 0!==n&&void 0!==n.LABEL?n.LABEL:t.name,r),r},t.prototype.consumeInternalError=function(t,e,n){var r,i=this.LA(0);throw r=void 0!==n&&n.ERR_MSG?n.ERR_MSG:this.errorMessageProvider.buildMismatchTokenMessage({expected:t,actual:e,previous:i,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new o.MismatchedTokenException(r,e,i))},t.prototype.consumeInternalRecovery=function(t,e,n){if(!this.recoveryEnabled||\"MismatchedTokenException\"!==n.name||this.isBackTracking())throw n;var r=this.getFollowsForInRuleRecovery(t,e);try{return this.tryInRuleRecovery(t,r)}catch(t){throw t.name===u.IN_RULE_RECOVERY_EXCEPTION?n:t}},t.prototype.saveRecogState=function(){var t=this.errors,e=r.cloneArr(this.RULE_STACK);return{errors:t,lexerState:this.exportLexerState(),RULE_STACK:e,CST_STACK:this.CST_STACK,LAST_EXPLICIT_RULE_STACK:this.LAST_EXPLICIT_RULE_STACK}},t.prototype.reloadRecogState=function(t){this.errors=t.errors,this.importLexerState(t.lexerState),this.RULE_STACK=t.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(t,e,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(t),this.cstInvocationStateUpdate(e,t)},t.prototype.isBackTracking=function(){return 0!==this.isBackTrackingStack.length},t.prototype.getCurrRuleFullName=function(){var t=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[t]},t.prototype.shortRuleNameToFullName=function(t){return this.shortRuleNameToFull[t]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),l.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.LAST_EXPLICIT_RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();e.RecognizerEngine=f},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(8),i=n(0),o=n(12),a=n(2),s=function(){function t(){}return t.prototype.initErrorHandler=function(t){this._errors=[],this.errorMessageProvider=i.defaults(t.errorMessageProvider,a.DEFAULT_PARSER_CONFIG.errorMessageProvider)},t.prototype.SAVE_ERROR=function(t){if(r.isRecognitionException(t))return t.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:i.cloneArr(this.RULE_OCCURRENCE_STACK)},this._errors.push(t),t;throw Error(\"Trying to save an Error which is not a RecognitionException\")},Object.defineProperty(t.prototype,\"errors\",{get:function(){return i.cloneArr(this._errors)},set:function(t){this._errors=t},enumerable:!0,configurable:!0}),t.prototype.raiseEarlyExitException=function(t,e,n){for(var i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],s=o.getLookaheadPathsForOptionalProd(t,a,e,this.maxLookahead)[0],c=[],u=1;u<=this.maxLookahead;u++)c.push(this.LA(u));var l=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:s,actual:c,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new r.EarlyExitException(l,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(t,e){for(var n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=o.getLookaheadPathsForOr(t,i,this.maxLookahead),s=[],c=1;c<=this.maxLookahead;c++)s.push(this.LA(c));var u=this.LA(0),l=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:u,customUserDescription:e,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new r.NoViableAltException(l,this.LA(1),u))},t}();e.ErrorHandler=s},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(13),i=n(0),o=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(t,e){var n=this.gastProductionsCache[t];if(i.isUndefined(n))throw Error(\"Rule ->\"+t+\"<- does not exist in this grammar.\");return r.nextPossibleTokensAfter([n],e,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(t){var e=i.first(t.ruleStack),n=this.getGAstProductions()[e];return new r.NextAfterTokenWalker(n,t).startWalking()},t}();e.ContentAssist=o},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=n(9),a=n(5),s=n(3),c=n(2),u=n(7),l={description:\"This Object indicates the Parser is during Recording Phase\"};Object.freeze(l);var p=Math.pow(2,u.BITS_FOR_OCCURRENCE_IDX)-1,h=s.createToken({name:\"RECORDING_PHASE_TOKEN\",pattern:o.Lexer.NA});a.augmentTokenTypes([h]);var f=s.createTokenInstance(h,\"This IToken indicates the Parser is in Recording Phase\\n\\tSee: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\",-1,-1,-1,-1,-1,-1);Object.freeze(f);var d={name:\"This CSTNode indicates the Parser is in Recording Phase\\n\\tSee: https://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording for details\",children:{}},m=function(){function t(){}return t.prototype.initGastRecorder=function(t){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var t=this;this.RECORDING_PHASE=!0,this.TRACE_INIT(\"Enable Recording\",function(){for(var e=function(e){var n=e>0?e:\"\";t[\"CONSUME\"+n]=function(t,n){return this.consumeInternalRecord(t,e,n)},t[\"SUBRULE\"+n]=function(t,n){return this.subruleInternalRecord(t,e,n)},t[\"OPTION\"+n]=function(t){return this.optionInternalRecord(t,e)},t[\"OR\"+n]=function(t){return this.orInternalRecord(t,e)},t[\"MANY\"+n]=function(t){this.manyInternalRecord(e,t)},t[\"MANY_SEP\"+n]=function(t){this.manySepFirstInternalRecord(e,t)},t[\"AT_LEAST_ONE\"+n]=function(t){this.atLeastOneInternalRecord(e,t)},t[\"AT_LEAST_ONE_SEP\"+n]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}},n=0;n<10;n++)e(n);t.consume=function(t,e,n){return this.consumeInternalRecord(e,t,n)},t.subrule=function(t,e,n){return this.subruleInternalRecord(e,t,n)},t.option=function(t,e){return this.optionInternalRecord(e,t)},t.or=function(t,e){return this.orInternalRecord(e,t)},t.many=function(t,e){this.manyInternalRecord(t,e)},t.atLeastOne=function(t,e){this.atLeastOneInternalRecord(t,e)},t.ACTION=t.ACTION_RECORD,t.BACKTRACK=t.BACKTRACK_RECORD,t.LA=t.LA_RECORD})},t.prototype.disableRecording=function(){var t=this;this.RECORDING_PHASE=!1,this.TRACE_INIT(\"Deleting Recording methods\",function(){for(var e=0;e<10;e++){var n=e>0?e:\"\";delete t[\"CONSUME\"+n],delete t[\"SUBRULE\"+n],delete t[\"OPTION\"+n],delete t[\"OR\"+n],delete t[\"MANY\"+n],delete t[\"MANY_SEP\"+n],delete t[\"AT_LEAST_ONE\"+n],delete t[\"AT_LEAST_ONE_SEP\"+n]}delete t.consume,delete t.subrule,delete t.option,delete t.or,delete t.many,delete t.atLeastOne,delete t.ACTION,delete t.BACKTRACK,delete t.LA})},t.prototype.ACTION_RECORD=function(t){},t.prototype.BACKTRACK_RECORD=function(t,e){return function(){return!0}},t.prototype.LA_RECORD=function(t){return c.END_OF_FILE},t.prototype.topLevelRuleRecord=function(t,e){try{var n=new i.Rule({definition:[],name:t});return n.name=t,this.recordingProdStack.push(n),e.call(this),this.recordingProdStack.pop(),n}catch(t){if(!0!==t.KNOWN_RECORDER_ERROR)try{t.message=t.message+'\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\thttps://sap.github.io/chevrotain/docs/guide/internals.html#grammar-recording'}catch(e){throw t}throw t}},t.prototype.optionInternalRecord=function(t,e){return E.call(this,i.Option,t,e)},t.prototype.atLeastOneInternalRecord=function(t,e){E.call(this,i.RepetitionMandatory,e,t)},t.prototype.atLeastOneSepFirstInternalRecord=function(t,e){E.call(this,i.RepetitionMandatoryWithSeparator,e,t,!0)},t.prototype.manyInternalRecord=function(t,e){E.call(this,i.Repetition,e,t)},t.prototype.manySepFirstInternalRecord=function(t,e){E.call(this,i.RepetitionWithSeparator,e,t,!0)},t.prototype.orInternalRecord=function(t,e){return function(t,e){var n=this;y(e);var o=r.peek(this.recordingProdStack),a=!1===r.isArray(t),s=!1===a?t:t.DEF,c=new i.Alternation({definition:[],idx:e,ignoreAmbiguities:a&&!0===t.IGNORE_AMBIGUITIES});r.has(t,\"NAME\")&&(c.name=t.NAME);r.has(t,\"MAX_LOOKAHEAD\")&&(c.maxLookahead=t.MAX_LOOKAHEAD);var u=r.some(s,function(t){return r.isFunction(t.GATE)});return c.hasPredicates=u,o.definition.push(c),r.forEach(s,function(t){var e=new i.Flat({definition:[]});c.definition.push(e),r.has(t,\"NAME\")&&(e.name=t.NAME),r.has(t,\"IGNORE_AMBIGUITIES\")?e.ignoreAmbiguities=t.IGNORE_AMBIGUITIES:r.has(t,\"GATE\")&&(e.ignoreAmbiguities=!0),n.recordingProdStack.push(e),t.ALT.call(n),n.recordingProdStack.pop()}),l}.call(this,t,e)},t.prototype.subruleInternalRecord=function(t,e,n){if(y(e),!t||!1===r.has(t,\"ruleName\")){var o=new Error(\"<SUBRULE\"+T(e)+\"> argument is invalid expecting a Parser method reference but got: <\"+JSON.stringify(t)+\">\\n inside top level rule: <\"+this.recordingProdStack[0].name+\">\");throw o.KNOWN_RECORDER_ERROR=!0,o}var a=r.peek(this.recordingProdStack),s=t.ruleName,c=new i.NonTerminal({idx:e,nonTerminalName:s,referencedRule:void 0});return a.definition.push(c),this.outputCst?d:l},t.prototype.consumeInternalRecord=function(t,e,n){if(y(e),!a.hasShortKeyProperty(t)){var o=new Error(\"<CONSUME\"+T(e)+\"> argument is invalid expecting a TokenType reference but got: <\"+JSON.stringify(t)+\">\\n inside top level rule: <\"+this.recordingProdStack[0].name+\">\");throw o.KNOWN_RECORDER_ERROR=!0,o}var s=r.peek(this.recordingProdStack),c=new i.Terminal({idx:e,terminalType:t});return s.definition.push(c),f},t}();function E(t,e,n,i){void 0===i&&(i=!1),y(n);var o=r.peek(this.recordingProdStack),a=r.isFunction(e)?e:e.DEF,s=new t({definition:[],idx:n});return r.has(e,\"NAME\")&&(s.name=e.NAME),i&&(s.separator=e.SEP),r.has(e,\"MAX_LOOKAHEAD\")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),o.definition.push(s),this.recordingProdStack.pop(),l}function T(t){return 0===t?\"\":\"\"+t}function y(t){if(t<0||t>p){var e=new Error(\"Invalid DSL Method idx value: <\"+t+\">\\n\\tIdx value must be a none negative value smaller than \"+(p+1));throw e.KNOWN_RECORDER_ERROR=!0,e}}e.GastRecorder=m},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(2),o=function(){function t(){}return t.prototype.initPerformanceTracer=function(t){if(r.has(t,\"traceInitPerf\")){var e=t.traceInitPerf,n=\"number\"==typeof e;this.traceInitMaxIdent=n?e:1/0,this.traceInitPerf=n?e>0:e}else this.traceInitMaxIdent=0,this.traceInitPerf=i.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(t,e){if(!0===this.traceInitPerf){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join(\"\\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(n+\"--\\x3e <\"+t+\">\");var i=r.timer(e),o=i.time,a=i.value,s=o>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(n+\"<-- <\"+t+\"> time: \"+o+\"ms\"),this.traceInitIndent--,a}return e()},t}();e.PerformanceTracer=o},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(19);e.createSyntaxDiagramsCode=function(t,e){var n=void 0===e?{}:e,i=n.resourceBase,o=void 0===i?\"https://unpkg.com/chevrotain@\"+r.VERSION+\"/diagrams/\":i,a=n.css;return\"\\n\\x3c!-- This is a generated file --\\x3e\\n<!DOCTYPE html>\\n<meta charset=\\\"utf-8\\\">\\n<style>\\n  body {\\n    background-color: hsl(30, 20%, 95%)\\n  }\\n</style>\\n\\n\\n<link rel='stylesheet' href='\"+(void 0===a?\"https://unpkg.com/chevrotain@\"+r.VERSION+\"/diagrams/diagrams.css\":a)+\"'>\\n\\n<script src='\"+o+\"vendor/railroad-diagrams.js'><\\/script>\\n<script src='\"+o+\"src/diagrams_builder.js'><\\/script>\\n<script src='\"+o+\"src/diagrams_behavior.js'><\\/script>\\n<script src='\"+o+'src/main.js\\'><\\/script>\\n\\n<div id=\"diagrams\" align=\"center\"></div>    \\n\\n<script>\\n    window.serializedGrammar = '+JSON.stringify(t,null,\"  \")+';\\n<\\/script>\\n\\n<script>\\n    var diagramsDiv = document.getElementById(\"diagrams\");\\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\\n<\\/script>\\n'}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(42);e.generateParserFactory=function(t){var e=r.genWrapperFunction({name:t.name,rules:t.rules}),i=new Function(\"tokenVocabulary\",\"config\",\"chevrotain\",e);return function(e){return i(t.tokenVocabulary,e,n(18))}},e.generateParserModule=function(t){return r.genUmdModule({name:t.name,rules:t.rules})}},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=\"\\n\";function a(t){return\"\\nfunction \"+t.name+\"(tokenVocabulary, config) {\\n    // invoke super constructor\\n    // No support for embedded actions currently, so we can 'hardcode'\\n    // The use of CstParser.\\n    chevrotain.CstParser.call(this, tokenVocabulary, config)\\n\\n    const $ = this\\n\\n    \"+s(t.rules)+\"\\n\\n    // very important to call this after all the rules have been defined.\\n    // otherwise the parser may not work correctly as it will lack information\\n    // derived during the self analysis phase.\\n    this.performSelfAnalysis(this)\\n}\\n\\n// inheritance as implemented in javascript in the previous decade... :(\\n\"+t.name+\".prototype = Object.create(chevrotain.CstParser.prototype)\\n\"+t.name+\".prototype.constructor = \"+t.name+\"    \\n    \"}function s(t){return r.map(t,function(t){return c(t,1)}).join(\"\\n\")}function c(t,e){var n=E(e,'$.RULE(\"'+t.name+'\", function() {')+o;return n+=m(t.definition,e+1),n+=E(e+1,\"})\")+o}function u(t,e){var n=t.terminalType.name;return E(e,\"$.CONSUME\"+t.idx+\"(this.tokensMap.\"+n+\")\"+o)}function l(t,e){return E(e,\"$.SUBRULE\"+t.idx+\"($.\"+t.nonTerminalName+\")\"+o)}function p(t,e){var n=E(e,\"$.OR\"+t.idx+\"([\")+o;return n+=r.map(t.definition,function(t){return h(t,e+1)}).join(\",\"+o),n+=o+E(e,\"])\"+o)}function h(t,e){var n=E(e,\"{\")+o;return t.name&&(n+=E(e+1,'NAME: \"'+t.name+'\",')+o),n+=E(e+1,\"ALT: function() {\")+o,n+=m(t.definition,e+1),n+=E(e+1,\"}\")+o,n+=E(e,\"}\")}function f(t,e,n){var r=E(n,\"$.\"+(t+e.idx)+\"(\");return e.name||e.separator?(r+=\"{\"+o,e.name&&(r+=E(n+1,'NAME: \"'+e.name+'\"')+\",\"+o),e.separator&&(r+=E(n+1,\"SEP: this.tokensMap.\"+e.separator.name)+\",\"+o),r+=\"DEF: \"+d(e.definition,n+2)+o,r+=E(n,\"}\")+o):r+=d(e.definition,n+1),r+=E(n,\")\")+o}function d(t,e){var n=\"function() {\"+o;return n+=m(t,e),n+=E(e,\"}\")+o}function m(t,e){var n=\"\";return r.forEach(t,function(t){n+=function(t,e){if(t instanceof i.NonTerminal)return l(t,e);if(t instanceof i.Option)return f(\"OPTION\",t,e);if(t instanceof i.RepetitionMandatory)return f(\"AT_LEAST_ONE\",t,e);if(t instanceof i.RepetitionMandatoryWithSeparator)return f(\"AT_LEAST_ONE_SEP\",t,e);if(t instanceof i.RepetitionWithSeparator)return f(\"MANY_SEP\",t,e);if(t instanceof i.Repetition)return f(\"MANY\",t,e);if(t instanceof i.Alternation)return p(t,e);if(t instanceof i.Terminal)return u(t,e);if(t instanceof i.Flat)return m(t.definition,e);throw Error(\"non exhaustive match\")}(t,e+1)}),n}function E(t,e){return Array(4*t+1).join(\" \")+e}e.genUmdModule=function(t){return\"\\n(function (root, factory) {\\n    if (typeof define === 'function' && define.amd) {\\n        // AMD. Register as an anonymous module.\\n        define(['chevrotain'], factory);\\n    } else if (typeof module === 'object' && module.exports) {\\n        // Node. Does not work with strict CommonJS, but\\n        // only CommonJS-like environments that support module.exports,\\n        // like Node.\\n        module.exports = factory(require('chevrotain'));\\n    } else {\\n        // Browser globals (root is window)\\n        root.returnExports = factory(root.b);\\n    }\\n}(typeof self !== 'undefined' ? self : this, function (chevrotain) {\\n\\n\"+a(t)+\"\\n    \\nreturn {\\n    \"+t.name+\": \"+t.name+\" \\n}\\n}));\\n\"},e.genWrapperFunction=function(t){return\"    \\n\"+a(t)+\"\\nreturn new \"+t.name+\"(tokenVocabulary, config)    \\n\"},e.genClass=a,e.genAllRules=s,e.genRule=c,e.genTerminal=u,e.genNonTerminal=l,e.genAlternation=p,e.genSingleAlt=h}])});\n\n// begin:./FileSaver.js-2.0.2/FileSaver.min.js\n(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open(\"GET\",b),e.responseType=\"blob\",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error(\"could not download file\")},e.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open(\"\",\"_blank\"),e&&(e.document.title=e.document.body.innerText=\"downloading...\"),\"string\"==typeof a)return c(a,b,d);var g=\"application/octet-stream\"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((i||g&&h)&&\"object\"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a,\"undefined\"!=typeof module&&(module.exports=a)});\n\n//# sourceMappingURL=FileSaver.min.js.map\n\n// begin:./js-lru/js-lru.js\n// https://github.com/rsms/js-lru/blob/master/lru.js\n/**\n * A doubly linked list-based Least Recently Used (LRU) cache. Will keep most\n * recently used items while discarding least recently used items when its limit\n * is reached.\n *\n * Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>\n * See README.md for details.\n *\n * Illustration of the design:\n *\n *       entry             entry             entry             entry\n *       ______            ______            ______            ______\n *      | head |.newer => |      |.newer => |      |.newer => | tail |\n *      |  A   |          |  B   |          |  C   |          |  D   |\n *      |______| <= older.|______| <= older.|______| <= older.|______|\n *\n *  removed  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  added\n */\n(function(g, f) {\n    const e = typeof exports == \"object\" ? exports : typeof g == \"object\" ? g : {};\n    f(e);\n    if (typeof define == \"function\" && define.amd) {\n        define(\"lru\", e);\n    }\n})(this, function(exports) {\n    const NEWER = Symbol(\"newer\");\n    const OLDER = Symbol(\"older\");\n\n    function LRUMap(limit, entries) {\n        if (typeof limit !== \"number\") {\n            // called as (entries)\n            entries = limit;\n            limit = 0;\n        }\n\n        this.size = 0;\n        this.limit = limit;\n        this.oldest = this.newest = undefined;\n        this._keymap = new Map();\n\n        if (entries) {\n            this.assign(entries);\n            if (limit < 1) {\n                this.limit = this.size;\n            }\n        }\n    }\n\n    exports.LRUMap = LRUMap;\n\n    function Entry(key, value) {\n        this.key = key;\n        this.value = value;\n        this[NEWER] = undefined;\n        this[OLDER] = undefined;\n    }\n\n    LRUMap.prototype._markEntryAsUsed = function(entry) {\n        if (entry === this.newest) {\n            // Already the most recenlty used entry, so no need to update the list\n            return;\n        }\n        // HEAD--------------TAIL\n        //   <.older   .newer>\n        //  <--- add direction --\n        //   A  B  C  <D>  E\n        if (entry[NEWER]) {\n            if (entry === this.oldest) {\n                this.oldest = entry[NEWER];\n            }\n            entry[NEWER][OLDER] = entry[OLDER]; // C <-- E.\n        }\n        if (entry[OLDER]) {\n            entry[OLDER][NEWER] = entry[NEWER]; // C. --> E\n        }\n        entry[NEWER] = undefined; // D --x\n        entry[OLDER] = this.newest; // D. --> E\n        if (this.newest) {\n            this.newest[NEWER] = entry; // E. <-- D\n        }\n        this.newest = entry;\n    };\n\n    LRUMap.prototype.assign = function(entries) {\n        let entry,\n            limit = this.limit || Number.MAX_VALUE;\n        this._keymap.clear();\n        let it = entries[Symbol.iterator]();\n        for (let itv = it.next(); !itv.done; itv = it.next()) {\n            let e = new Entry(itv.value[0], itv.value[1]);\n            this._keymap.set(e.key, e);\n            if (!entry) {\n                this.oldest = e;\n            } else {\n                entry[NEWER] = e;\n                e[OLDER] = entry;\n            }\n            entry = e;\n            if (limit-- == 0) {\n                throw new Error(\"overflow\");\n            }\n        }\n        this.newest = entry;\n        this.size = this._keymap.size;\n    };\n\n    LRUMap.prototype.get = function(key) {\n        // First, find our cache entry\n        var entry = this._keymap.get(key);\n        if (!entry) return; // Not cached. Sorry.\n        // As <key> was found in the cache, register it as being requested recently\n        this._markEntryAsUsed(entry);\n        return entry.value;\n    };\n\n    LRUMap.prototype.set = function(key, value) {\n        var entry = this._keymap.get(key);\n\n        if (entry) {\n            // update existing\n            entry.value = value;\n            this._markEntryAsUsed(entry);\n            return this;\n        }\n\n        // new entry\n        this._keymap.set(key, (entry = new Entry(key, value)));\n\n        if (this.newest) {\n            // link previous tail to the new tail (entry)\n            this.newest[NEWER] = entry;\n            entry[OLDER] = this.newest;\n        } else {\n            // we're first in -- yay\n            this.oldest = entry;\n        }\n\n        // add new entry to the end of the linked list -- it's now the freshest entry.\n        this.newest = entry;\n        ++this.size;\n        if (this.size > this.limit) {\n            // we hit the limit -- remove the head\n            this.shift();\n        }\n\n        return this;\n    };\n\n    LRUMap.prototype.shift = function() {\n        // todo: handle special case when limit == 1\n        var entry = this.oldest;\n        if (entry) {\n            if (this.oldest[NEWER]) {\n                // advance the list\n                this.oldest = this.oldest[NEWER];\n                this.oldest[OLDER] = undefined;\n            } else {\n                // the cache is exhausted\n                this.oldest = undefined;\n                this.newest = undefined;\n            }\n            // Remove last strong reference to <entry> and remove links from the purged\n            // entry being returned:\n            entry[NEWER] = entry[OLDER] = undefined;\n            this._keymap.delete(entry.key);\n            --this.size;\n            return [entry.key, entry.value];\n        }\n    };\n\n    // ----------------------------------------------------------------------------\n    // Following code is optional and can be removed without breaking the core\n    // functionality.\n\n    LRUMap.prototype.find = function(key) {\n        let e = this._keymap.get(key);\n        return e ? e.value : undefined;\n    };\n\n    LRUMap.prototype.has = function(key) {\n        return this._keymap.has(key);\n    };\n});\n\n\n// begin:./lz-string-1.4.4/lz-string.min.js\nvar LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\",t={},i={compressToBase64:function(o){if(null==o)return\"\";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+\"===\";case 2:return r+\"==\";case 3:return r+\"=\"}},decompressFromBase64:function(r){return null==r?\"\":\"\"==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?\"\":i._compress(o,15,function(o){return r(o+32)})+\" \"},decompressFromUTF16:function(o){return null==o?\"\":\"\"==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(\"\"))},compressToEncodedURIComponent:function(o){return null==o?\"\":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?\"\":\"\"==r?null:(r=r.replace(/ /g,\"+\"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return\"\";var e,t,i,s={},p={},u=\"\",c=\"\",a=\"\",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(\"\"!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join(\"\")},decompress:function(o){return null==o?\"\":\"\"==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v=\"\",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return\"\"}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return\"\";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join(\"\")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();\"function\"==typeof define&&define.amd?define(function(){return LZString}):\"undefined\"!=typeof module&&null!=module&&(module.exports=LZString);\n"
  },
  {
    "path": "vipercard/vipercard/external/externalmanualbundlebig.js",
    "content": "\n// externalmanualbundle\n// changes here will be overwritten\n\n\n\n// begin:./base64-js-1.3.1/base64js.min.js\n(function(r){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=r()}else if(typeof define===\"function\"&&define.amd){define([],r)}else{var e;if(typeof window!==\"undefined\"){e=window}else if(typeof global!==\"undefined\"){e=global}else if(typeof self!==\"undefined\"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function r(e,n,t){function o(f,i){if(!n[f]){if(!e[f]){var u=\"function\"==typeof require&&require;if(!i&&u)return u(f,!0);if(a)return a(f,!0);var v=new Error(\"Cannot find module '\"+f+\"'\");throw v.code=\"MODULE_NOT_FOUND\",v}var d=n[f]={exports:{}};e[f][0].call(d.exports,function(r){var n=e[f][1][r];return o(n||r)},d,d.exports,r,e,n,t)}return n[f].exports}for(var a=\"function\"==typeof require&&require,f=0;f<t.length;f++)o(t[f]);return o}return r}()({\"/\":[function(r,e,n){\"use strict\";n.byteLength=d;n.toByteArray=h;n.fromByteArray=p;var t=[];var o=[];var a=typeof Uint8Array!==\"undefined\"?Uint8Array:Array;var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";for(var i=0,u=f.length;i<u;++i){t[i]=f[i];o[f.charCodeAt(i)]=i}o[\"-\".charCodeAt(0)]=62;o[\"_\".charCodeAt(0)]=63;function v(r){var e=r.length;if(e%4>0){throw new Error(\"Invalid string. Length must be a multiple of 4\")}var n=r.indexOf(\"=\");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function d(r){var e=v(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function c(r,e,n){return(e+n)*3/4-n}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));var u=0;var d=f>0?t-4:t;for(var h=0;h<d;h+=4){e=o[r.charCodeAt(h)]<<18|o[r.charCodeAt(h+1)]<<12|o[r.charCodeAt(h+2)]<<6|o[r.charCodeAt(h+3)];i[u++]=e>>16&255;i[u++]=e>>8&255;i[u++]=e&255}if(f===2){e=o[r.charCodeAt(h)]<<2|o[r.charCodeAt(h+1)]>>4;i[u++]=e&255}if(f===1){e=o[r.charCodeAt(h)]<<10|o[r.charCodeAt(h+1)]<<4|o[r.charCodeAt(h+2)]>>2;i[u++]=e>>8&255;i[u++]=e&255}return i}function s(r){return t[r>>18&63]+t[r>>12&63]+t[r>>6&63]+t[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join(\"\")}function p(r){var e;var n=r.length;var o=n%3;var a=[];var f=16383;for(var i=0,u=n-o;i<u;i+=f){a.push(l(r,i,i+f>u?u:i+f))}if(o===1){e=r[n-1];a.push(t[e>>2]+t[e<<4&63]+\"==\")}else if(o===2){e=(r[n-2]<<8)+r[n-1];a.push(t[e>>10]+t[e>>4&63]+t[e<<2&63]+\"=\")}return a.join(\"\")}},{}]},{},[])(\"/\")});\n\n\n// begin:./bowser-2.9/bowser-2.9-bundled.js\n!function(t,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define([],n):\"object\"==typeof exports?exports.bowser=n():t.bowser=n()}(this,(function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&n&&\"string\"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p=\"\",e(e.s=129)}([function(t,n,e){var r=e(1),i=e(7),o=e(14),u=e(11),a=e(19),c=function(t,n,e){var s,f,l,h,d=t&c.F,p=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,m=p?r:v?r[n]||(r[n]={}):(r[n]||{}).prototype,b=p?i:i[n]||(i[n]={}),S=b.prototype||(b.prototype={});for(s in p&&(e=n),e)l=((f=!d&&m&&void 0!==m[s])?m:e)[s],h=y&&f?a(l,r):g&&\"function\"==typeof l?a(Function.call,l):l,m&&u(m,s,l,t&c.U),b[s]!=l&&o(b,s,h),g&&S[s]!=l&&(S[s]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(4);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){var r=e(50)(\"wks\"),i=e(31),o=e(1).Symbol,u=\"function\"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)(\"Symbol.\"+t))}).store=r},function(t,n,e){var r=e(21),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n,e){t.exports=!e(2)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),i=e(96),o=e(28),u=Object.defineProperty;n.f=e(8)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(26);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(1),i=e(14),o=e(13),u=e(31)(\"src\"),a=e(134),c=(\"\"+a).split(\"toString\");e(7).inspectSource=function(t){return a.call(t)},(t.exports=function(t,n,e,a){var s=\"function\"==typeof e;s&&(o(e,\"name\")||i(e,\"name\",n)),t[n]!==e&&(s&&(o(e,u)||i(e,u,t[n]?\"\"+t[n]:c.join(String(n)))),t===r?t[n]=e:a?t[n]?t[n]=e:i(t,n,e):(delete t[n],i(t,n,e)))})(Function.prototype,\"toString\",(function(){return\"function\"==typeof this&&this[u]||a.call(this)}))},function(t,n,e){var r=e(0),i=e(2),o=e(26),u=/\"/g,a=function(t,n,e,r){var i=String(o(t)),a=\"<\"+n;return\"\"!==e&&(a+=\" \"+e+'=\"'+String(r).replace(u,\"&quot;\")+'\"'),a+\">\"+i+\"</\"+n+\">\"};t.exports=function(t,n){var e={};e[t]=n(a),r(r.P+r.F*i((function(){var n=\"\"[t]('\"');return n!==n.toLowerCase()||n.split('\"').length>3})),\"String\",e)}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(9),i=e(30);t.exports=e(8)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(46),i=e(26);t.exports=function(t){return r(i(t))}},function(t,n,e){\"use strict\";var r=e(2);t.exports=function(t,n){return!!t&&r((function(){n?t.call(null,(function(){}),1):t.call(null)}))}},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=e(18),i=function(){function t(){}return t.getFirstMatch=function(t,n){var e=n.match(t);return e&&e.length>0&&e[1]||\"\"},t.getSecondMatch=function(t,n){var e=n.match(t);return e&&e.length>1&&e[2]||\"\"},t.matchAndReturnConst=function(t,n,e){if(t.test(n))return e},t.getWindowsVersionName=function(t){switch(t){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},t.getMacOSVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),10===n[0])switch(n[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},t.getAndroidVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),!(1===n[0]&&n[1]<5))return 1===n[0]&&n[1]<6?\"Cupcake\":1===n[0]&&n[1]>=6?\"Donut\":2===n[0]&&n[1]<2?\"Eclair\":2===n[0]&&2===n[1]?\"Froyo\":2===n[0]&&n[1]>2?\"Gingerbread\":3===n[0]?\"Honeycomb\":4===n[0]&&n[1]<1?\"Ice Cream Sandwich\":4===n[0]&&n[1]<4?\"Jelly Bean\":4===n[0]&&n[1]>=4?\"KitKat\":5===n[0]?\"Lollipop\":6===n[0]?\"Marshmallow\":7===n[0]?\"Nougat\":8===n[0]?\"Oreo\":9===n[0]?\"Pie\":void 0},t.getVersionPrecision=function(t){return t.split(\".\").length},t.compareVersions=function(n,e,r){void 0===r&&(r=!1);var i=t.getVersionPrecision(n),o=t.getVersionPrecision(e),u=Math.max(i,o),a=0,c=t.map([n,e],(function(n){var e=u-t.getVersionPrecision(n),r=n+new Array(e+1).join(\".0\");return t.map(r.split(\".\"),(function(t){return new Array(20-t.length).join(\"0\")+t})).reverse()}));for(r&&(a=u-Math.min(i,o)),u-=1;u>=a;){if(c[0][u]>c[1][u])return 1;if(c[0][u]===c[1][u]){if(u===a)return 0;u-=1}else if(c[0][u]<c[1][u])return-1}},t.map=function(t,n){var e,r=[];if(Array.prototype.map)return Array.prototype.map.call(t,n);for(e=0;e<t.length;e+=1)r.push(n(t[e]));return r},t.find=function(t,n){var e,r;if(Array.prototype.find)return Array.prototype.find.call(t,n);for(e=0,r=t.length;e<r;e+=1){var i=t[e];if(n(i,e))return i}},t.assign=function(t){for(var n,e,r=t,i=arguments.length,o=new Array(i>1?i-1:0),u=1;u<i;u++)o[u-1]=arguments[u];if(Object.assign)return Object.assign.apply(Object,[t].concat(o));var a=function(){var t=o[n];\"object\"==typeof t&&null!==t&&Object.keys(t).forEach((function(n){r[n]=t[n]}))};for(n=0,e=o.length;n<e;n+=1)a();return t},t.getBrowserAlias=function(t){return r.BROWSER_ALIASES_MAP[t]},t.getBrowserTypeByAlias=function(t){return r.BROWSER_MAP[t]||\"\"},t}();n.default=i,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.ENGINE_MAP=n.OS_MAP=n.PLATFORMS_MAP=n.BROWSER_MAP=n.BROWSER_ALIASES_MAP=void 0;n.BROWSER_ALIASES_MAP={\"Amazon Silk\":\"amazon_silk\",\"Android Browser\":\"android\",Bada:\"bada\",BlackBerry:\"blackberry\",Chrome:\"chrome\",Chromium:\"chromium\",Electron:\"electron\",Epiphany:\"epiphany\",Firefox:\"firefox\",Focus:\"focus\",Generic:\"generic\",\"Google Search\":\"google_search\",Googlebot:\"googlebot\",\"Internet Explorer\":\"ie\",\"K-Meleon\":\"k_meleon\",Maxthon:\"maxthon\",\"Microsoft Edge\":\"edge\",\"MZ Browser\":\"mz\",\"NAVER Whale Browser\":\"naver\",Opera:\"opera\",\"Opera Coast\":\"opera_coast\",PhantomJS:\"phantomjs\",Puffin:\"puffin\",QupZilla:\"qupzilla\",QQ:\"qq\",QQLite:\"qqlite\",Safari:\"safari\",Sailfish:\"sailfish\",\"Samsung Internet for Android\":\"samsung_internet\",SeaMonkey:\"seamonkey\",Sleipnir:\"sleipnir\",Swing:\"swing\",Tizen:\"tizen\",\"UC Browser\":\"uc\",Vivaldi:\"vivaldi\",\"WebOS Browser\":\"webos\",WeChat:\"wechat\",\"Yandex Browser\":\"yandex\",Roku:\"roku\"};n.BROWSER_MAP={amazon_silk:\"Amazon Silk\",android:\"Android Browser\",bada:\"Bada\",blackberry:\"BlackBerry\",chrome:\"Chrome\",chromium:\"Chromium\",electron:\"Electron\",epiphany:\"Epiphany\",firefox:\"Firefox\",focus:\"Focus\",generic:\"Generic\",googlebot:\"Googlebot\",google_search:\"Google Search\",ie:\"Internet Explorer\",k_meleon:\"K-Meleon\",maxthon:\"Maxthon\",edge:\"Microsoft Edge\",mz:\"MZ Browser\",naver:\"NAVER Whale Browser\",opera:\"Opera\",opera_coast:\"Opera Coast\",phantomjs:\"PhantomJS\",puffin:\"Puffin\",qupzilla:\"QupZilla\",qq:\"QQ Browser\",qqlite:\"QQ Browser Lite\",safari:\"Safari\",sailfish:\"Sailfish\",samsung_internet:\"Samsung Internet for Android\",seamonkey:\"SeaMonkey\",sleipnir:\"Sleipnir\",swing:\"Swing\",tizen:\"Tizen\",uc:\"UC Browser\",vivaldi:\"Vivaldi\",webos:\"WebOS Browser\",wechat:\"WeChat\",yandex:\"Yandex Browser\"};n.PLATFORMS_MAP={tablet:\"tablet\",mobile:\"mobile\",desktop:\"desktop\",tv:\"tv\"};n.OS_MAP={WindowsPhone:\"Windows Phone\",Windows:\"Windows\",MacOS:\"macOS\",iOS:\"iOS\",Android:\"Android\",WebOS:\"WebOS\",BlackBerry:\"BlackBerry\",Bada:\"Bada\",Tizen:\"Tizen\",Linux:\"Linux\",ChromeOS:\"Chrome OS\",PlayStation4:\"PlayStation 4\",Roku:\"Roku\"};n.ENGINE_MAP={EdgeHTML:\"EdgeHTML\",Blink:\"Blink\",Trident:\"Trident\",Presto:\"Presto\",Gecko:\"Gecko\",WebKit:\"WebKit\"}},function(t,n,e){var r=e(20);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(47),i=e(30),o=e(15),u=e(28),a=e(13),c=e(96),s=Object.getOwnPropertyDescriptor;n.f=e(8)?s:function(t,n){if(t=o(t),n=u(n,!0),c)try{return s(t,n)}catch(t){}if(a(t,n))return i(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(0),i=e(7),o=e(2);t.exports=function(t,n){var e=(i.Object||{})[t]||Object[t],u={};u[t]=n(e),r(r.S+r.F*o((function(){e(1)})),\"Object\",u)}},function(t,n,e){var r=e(19),i=e(46),o=e(10),u=e(6),a=e(112);t.exports=function(t,n){var e=1==t,c=2==t,s=3==t,f=4==t,l=6==t,h=5==t||l,d=n||a;return function(n,a,p){for(var v,g,y=o(n),m=i(y),b=r(a,p,3),S=u(m.length),w=0,_=e?d(n,S):c?d(n,0):void 0;S>w;w++)if((h||w in m)&&(g=b(v=m[w],w,y),t))if(e)_[w]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:_.push(v)}else if(f)return!1;return l?-1:s||f?f:_}}},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError(\"Can't call method on  \"+t);return t}},function(t,n,e){\"use strict\";if(e(8)){var r=e(32),i=e(1),o=e(2),u=e(0),a=e(61),c=e(86),s=e(19),f=e(44),l=e(30),h=e(14),d=e(45),p=e(21),v=e(6),g=e(123),y=e(34),m=e(28),b=e(13),S=e(48),w=e(4),_=e(10),M=e(78),x=e(35),P=e(37),O=e(36).f,A=e(80),F=e(31),E=e(5),N=e(24),R=e(51),k=e(49),T=e(82),I=e(42),j=e(54),L=e(43),B=e(81),C=e(114),W=e(9),V=e(22),G=W.f,D=V.f,U=i.RangeError,z=i.TypeError,q=i.Uint8Array,K=Array.prototype,Y=c.ArrayBuffer,Q=c.DataView,H=N(0),J=N(2),X=N(3),Z=N(4),$=N(5),tt=N(6),nt=R(!0),et=R(!1),rt=T.values,it=T.keys,ot=T.entries,ut=K.lastIndexOf,at=K.reduce,ct=K.reduceRight,st=K.join,ft=K.sort,lt=K.slice,ht=K.toString,dt=K.toLocaleString,pt=E(\"iterator\"),vt=E(\"toStringTag\"),gt=F(\"typed_constructor\"),yt=F(\"def_constructor\"),mt=a.CONSTR,bt=a.TYPED,St=a.VIEW,wt=N(1,(function(t,n){return Ot(k(t,t[yt]),n)})),_t=o((function(){return 1===new q(new Uint16Array([1]).buffer)[0]})),Mt=!!q&&!!q.prototype.set&&o((function(){new q(1).set({})})),xt=function(t,n){var e=p(t);if(e<0||e%n)throw U(\"Wrong offset!\");return e},Pt=function(t){if(w(t)&&bt in t)return t;throw z(t+\" is not a typed array!\")},Ot=function(t,n){if(!(w(t)&&gt in t))throw z(\"It is not a typed array constructor!\");return new t(n)},At=function(t,n){return Ft(k(t,t[yt]),n)},Ft=function(t,n){for(var e=0,r=n.length,i=Ot(t,r);r>e;)i[e]=n[e++];return i},Et=function(t,n,e){G(t,n,{get:function(){return this._d[e]}})},Nt=function(t){var n,e,r,i,o,u,a=_(t),c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=A(a);if(null!=h&&!M(h)){for(u=h.call(a),r=[],n=0;!(o=u.next()).done;n++)r.push(o.value);a=r}for(l&&c>2&&(f=s(f,arguments[2],2)),n=0,e=v(a.length),i=Ot(this,e);e>n;n++)i[n]=l?f(a[n],n):a[n];return i},Rt=function(){for(var t=0,n=arguments.length,e=Ot(this,n);n>t;)e[t]=arguments[t++];return e},kt=!!q&&o((function(){dt.call(new q(1))})),Tt=function(){return dt.apply(kt?lt.call(Pt(this)):Pt(this),arguments)},It={copyWithin:function(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return B.apply(Pt(this),arguments)},filter:function(t){return At(this,J(Pt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return $(Pt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){H(Pt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return et(Pt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return st.apply(Pt(this),arguments)},lastIndexOf:function(t){return ut.apply(Pt(this),arguments)},map:function(t){return wt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return at.apply(Pt(this),arguments)},reduceRight:function(t){return ct.apply(Pt(this),arguments)},reverse:function(){for(var t,n=Pt(this).length,e=Math.floor(n/2),r=0;r<e;)t=this[r],this[r++]=this[--n],this[n]=t;return this},some:function(t){return X(Pt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ft.call(Pt(this),t)},subarray:function(t,n){var e=Pt(this),r=e.length,i=y(t,r);return new(k(e,e[yt]))(e.buffer,e.byteOffset+i*e.BYTES_PER_ELEMENT,v((void 0===n?r:y(n,r))-i))}},jt=function(t,n){return At(this,lt.call(Pt(this),t,n))},Lt=function(t){Pt(this);var n=xt(arguments[1],1),e=this.length,r=_(t),i=v(r.length),o=0;if(i+n>e)throw U(\"Wrong length!\");for(;o<i;)this[n+o]=r[o++]},Bt={entries:function(){return ot.call(Pt(this))},keys:function(){return it.call(Pt(this))},values:function(){return rt.call(Pt(this))}},Ct=function(t,n){return w(t)&&t[bt]&&\"symbol\"!=typeof n&&n in t&&String(+n)==String(n)},Wt=function(t,n){return Ct(t,n=m(n,!0))?l(2,t[n]):D(t,n)},Vt=function(t,n,e){return!(Ct(t,n=m(n,!0))&&w(e)&&b(e,\"value\"))||b(e,\"get\")||b(e,\"set\")||e.configurable||b(e,\"writable\")&&!e.writable||b(e,\"enumerable\")&&!e.enumerable?G(t,n,e):(t[n]=e.value,t)};mt||(V.f=Wt,W.f=Vt),u(u.S+u.F*!mt,\"Object\",{getOwnPropertyDescriptor:Wt,defineProperty:Vt}),o((function(){ht.call({})}))&&(ht=dt=function(){return st.call(this)});var Gt=d({},It);d(Gt,Bt),h(Gt,pt,Bt.values),d(Gt,{slice:jt,set:Lt,constructor:function(){},toString:ht,toLocaleString:Tt}),Et(Gt,\"buffer\",\"b\"),Et(Gt,\"byteOffset\",\"o\"),Et(Gt,\"byteLength\",\"l\"),Et(Gt,\"length\",\"e\"),G(Gt,vt,{get:function(){return this[bt]}}),t.exports=function(t,n,e,c){var s=t+((c=!!c)?\"Clamped\":\"\")+\"Array\",l=\"get\"+t,d=\"set\"+t,p=i[s],y=p||{},m=p&&P(p),b=!p||!a.ABV,_={},M=p&&p.prototype,A=function(t,e){G(t,e,{get:function(){return function(t,e){var r=t._d;return r.v[l](e*n+r.o,_t)}(this,e)},set:function(t){return function(t,e,r){var i=t._d;c&&(r=(r=Math.round(r))<0?0:r>255?255:255&r),i.v[d](e*n+i.o,r,_t)}(this,e,t)},enumerable:!0})};b?(p=e((function(t,e,r,i){f(t,p,s,\"_d\");var o,u,a,c,l=0,d=0;if(w(e)){if(!(e instanceof Y||\"ArrayBuffer\"==(c=S(e))||\"SharedArrayBuffer\"==c))return bt in e?Ft(p,e):Nt.call(p,e);o=e,d=xt(r,n);var y=e.byteLength;if(void 0===i){if(y%n)throw U(\"Wrong length!\");if((u=y-d)<0)throw U(\"Wrong length!\")}else if((u=v(i)*n)+d>y)throw U(\"Wrong length!\");a=u/n}else a=g(e),o=new Y(u=a*n);for(h(t,\"_d\",{b:o,o:d,l:u,e:a,v:new Q(o)});l<a;)A(t,l++)})),M=p.prototype=x(Gt),h(M,\"constructor\",p)):o((function(){p(1)}))&&o((function(){new p(-1)}))&&j((function(t){new p,new p(null),new p(1.5),new p(t)}),!0)||(p=e((function(t,e,r,i){var o;return f(t,p,s),w(e)?e instanceof Y||\"ArrayBuffer\"==(o=S(e))||\"SharedArrayBuffer\"==o?void 0!==i?new y(e,xt(r,n),i):void 0!==r?new y(e,xt(r,n)):new y(e):bt in e?Ft(p,e):Nt.call(p,e):new y(g(e))})),H(m!==Function.prototype?O(y).concat(O(m)):O(y),(function(t){t in p||h(p,t,y[t])})),p.prototype=M,r||(M.constructor=p));var F=M[pt],E=!!F&&(\"values\"==F.name||null==F.name),N=Bt.values;h(p,gt,!0),h(M,bt,s),h(M,St,!0),h(M,yt,p),(c?new p(1)[vt]==s:vt in M)||G(M,vt,{get:function(){return s}}),_[s]=p,u(u.G+u.W+u.F*(p!=y),_),u(u.S,s,{BYTES_PER_ELEMENT:n}),u(u.S+u.F*o((function(){y.of.call(p,1)})),s,{from:Nt,of:Rt}),\"BYTES_PER_ELEMENT\"in M||h(M,\"BYTES_PER_ELEMENT\",n),u(u.P,s,It),L(s),u(u.P+u.F*Mt,s,{set:Lt}),u(u.P+u.F*!E,s,Bt),r||M.toString==ht||(M.toString=ht),u(u.P+u.F*o((function(){new p(1).slice()})),s,{slice:jt}),u(u.P+u.F*(o((function(){return[1,2].toLocaleString()!=new p([1,2]).toLocaleString()}))||!o((function(){M.toLocaleString.call([1,2])}))),s,{toLocaleString:Tt}),I[s]=E?F:N,r||E||h(M,pt,N)}}else t.exports=function(){}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n,e){var r=e(31)(\"meta\"),i=e(4),o=e(13),u=e(9).f,a=0,c=Object.isExtensible||function(){return!0},s=!e(2)((function(){return c(Object.preventExtensions({}))})),f=function(t){u(t,r,{value:{i:\"O\"+ ++a,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,n){if(!i(t))return\"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!o(t,r)){if(!c(t))return\"F\";if(!n)return\"E\";f(t)}return t[r].i},getWeak:function(t,n){if(!o(t,r)){if(!c(t))return!0;if(!n)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&c(t)&&!o(t,r)&&f(t),t}}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return\"Symbol(\".concat(void 0===t?\"\":t,\")_\",(++e+r).toString(36))}},function(t,n){t.exports=!1},function(t,n,e){var r=e(98),i=e(65);t.exports=Object.keys||function(t){return r(t,i)}},function(t,n,e){var r=e(21),i=Math.max,o=Math.min;t.exports=function(t,n){return(t=r(t))<0?i(t+n,0):o(t,n)}},function(t,n,e){var r=e(3),i=e(99),o=e(65),u=e(64)(\"IE_PROTO\"),a=function(){},c=function(){var t,n=e(62)(\"iframe\"),r=o.length;for(n.style.display=\"none\",e(66).appendChild(n),n.src=\"javascript:\",(t=n.contentWindow.document).open(),t.write(\"<script>document.F=Object<\\/script>\"),t.close(),c=t.F;r--;)delete c.prototype[o[r]];return c()};t.exports=Object.create||function(t,n){var e;return null!==t?(a.prototype=r(t),e=new a,a.prototype=null,e[u]=t):e=c(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(98),i=e(65).concat(\"length\",\"prototype\");n.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,n,e){var r=e(13),i=e(10),o=e(64)(\"IE_PROTO\"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(5)(\"unscopables\"),i=Array.prototype;null==i[r]&&e(14)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t)||t._t!==n)throw TypeError(\"Incompatible receiver, \"+n+\" required!\");return t}},function(t,n,e){var r=e(9).f,i=e(13),o=e(5)(\"toStringTag\");t.exports=function(t,n,e){t&&!i(t=e?t:t.prototype,o)&&r(t,o,{configurable:!0,value:n})}},function(t,n,e){var r=e(0),i=e(26),o=e(2),u=e(68),a=\"[\"+u+\"]\",c=RegExp(\"^\"+a+a+\"*\"),s=RegExp(a+a+\"*$\"),f=function(t,n,e){var i={},a=o((function(){return!!u[t]()||\"​\"!=\"​\"[t]()})),c=i[t]=a?n(l):u[t];e&&(i[e]=c),r(r.P+r.F*a,\"String\",i)},l=f.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(c,\"\")),2&n&&(t=t.replace(s,\"\")),t};t.exports=f},function(t,n){t.exports={}},function(t,n,e){\"use strict\";var r=e(1),i=e(9),o=e(8),u=e(5)(\"species\");t.exports=function(t){var n=r[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,r){if(!(t instanceof n)||void 0!==r&&r in t)throw TypeError(e+\": incorrect invocation!\");return t}},function(t,n,e){var r=e(11);t.exports=function(t,n,e){for(var i in n)r(t,i,n[i],e);return t}},function(t,n,e){var r=e(25);t.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(t){return\"String\"==r(t)?t.split(\"\"):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(25),i=e(5)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}());t.exports=function(t){var n,e,u;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:o?r(n):\"Object\"==(u=r(n))&&\"function\"==typeof n.callee?\"Arguments\":u}},function(t,n,e){var r=e(3),i=e(20),o=e(5)(\"species\");t.exports=function(t,n){var e,u=r(t).constructor;return void 0===u||null==(e=r(u)[o])?n:i(e)}},function(t,n,e){var r=e(7),i=e(1),o=i[\"__core-js_shared__\"]||(i[\"__core-js_shared__\"]={});(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})(\"versions\",[]).push({version:r.version,mode:e(32)?\"pure\":\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})},function(t,n,e){var r=e(15),i=e(6),o=e(34);t.exports=function(t){return function(n,e,u){var a,c=r(n),s=i(c.length),f=o(u,s);if(t&&e!=e){for(;s>f;)if((a=c[f++])!=a)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===e)return t||f||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(25);t.exports=Array.isArray||function(t){return\"Array\"==r(t)}},function(t,n,e){var r=e(5)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var e=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:e=!0}},o[r]=function(){return u},t(o)}catch(t){}return e}},function(t,n,e){\"use strict\";var r=e(3);t.exports=function(){var t=r(this),n=\"\";return t.global&&(n+=\"g\"),t.ignoreCase&&(n+=\"i\"),t.multiline&&(n+=\"m\"),t.unicode&&(n+=\"u\"),t.sticky&&(n+=\"y\"),n}},function(t,n,e){\"use strict\";var r=e(48),i=RegExp.prototype.exec;t.exports=function(t,n){var e=t.exec;if(\"function\"==typeof e){var o=e.call(t,n);if(\"object\"!=typeof o)throw new TypeError(\"RegExp exec method returned something other than an Object or null\");return o}if(\"RegExp\"!==r(t))throw new TypeError(\"RegExp#exec called on incompatible receiver\");return i.call(t,n)}},function(t,n,e){\"use strict\";e(116);var r=e(11),i=e(14),o=e(2),u=e(26),a=e(5),c=e(83),s=a(\"species\"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")})),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e=\"ab\".split(t);return 2===e.length&&\"a\"===e[0]&&\"b\"===e[1]}();t.exports=function(t,n,e){var h=a(t),d=!o((function(){var n={};return n[h]=function(){return 7},7!=\"\"[t](n)})),p=d?!o((function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},\"split\"===t&&(e.constructor={},e.constructor[s]=function(){return e}),e[h](\"\"),!n})):void 0;if(!d||!p||\"replace\"===t&&!f||\"split\"===t&&!l){var v=/./[h],g=e(u,h,\"\"[t],(function(t,n,e,r,i){return n.exec===c?d&&!i?{done:!0,value:v.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}})),y=g[0],m=g[1];r(String.prototype,t,y),i(RegExp.prototype,h,2==n?function(t,n){return m.call(t,this,n)}:function(t){return m.call(t,this)})}}},function(t,n,e){var r=e(19),i=e(111),o=e(78),u=e(3),a=e(6),c=e(80),s={},f={};(n=t.exports=function(t,n,e,l,h){var d,p,v,g,y=h?function(){return t}:c(t),m=r(e,l,n?2:1),b=0;if(\"function\"!=typeof y)throw TypeError(t+\" is not iterable!\");if(o(y)){for(d=a(t.length);d>b;b++)if((g=n?m(u(p=t[b])[0],p[1]):m(t[b]))===s||g===f)return g}else for(v=y.call(t);!(p=v.next()).done;)if((g=i(v,m,p.value,n))===s||g===f)return g}).BREAK=s,n.RETURN=f},function(t,n,e){var r=e(1).navigator;t.exports=r&&r.userAgent||\"\"},function(t,n,e){\"use strict\";var r=e(1),i=e(0),o=e(11),u=e(45),a=e(29),c=e(58),s=e(44),f=e(4),l=e(2),h=e(54),d=e(40),p=e(69);t.exports=function(t,n,e,v,g,y){var m=r[t],b=m,S=g?\"set\":\"add\",w=b&&b.prototype,_={},M=function(t){var n=w[t];o(w,t,\"delete\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"has\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"get\"==t?function(t){return y&&!f(t)?void 0:n.call(this,0===t?0:t)}:\"add\"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(\"function\"==typeof b&&(y||w.forEach&&!l((function(){(new b).entries().next()})))){var x=new b,P=x[S](y?{}:-0,1)!=x,O=l((function(){x.has(1)})),A=h((function(t){new b(t)})),F=!y&&l((function(){for(var t=new b,n=5;n--;)t[S](n,n);return!t.has(-0)}));A||((b=n((function(n,e){s(n,b,t);var r=p(new m,n,b);return null!=e&&c(e,g,r[S],r),r}))).prototype=w,w.constructor=b),(O||F)&&(M(\"delete\"),M(\"has\"),g&&M(\"get\")),(F||P)&&M(S),y&&w.clear&&delete w.clear}else b=v.getConstructor(n,t,g,S),u(b.prototype,e),a.NEED=!0;return d(b,t),_[t]=b,i(i.G+i.W+i.F*(b!=m),_),y||v.setStrong(b,t,g),b}},function(t,n,e){for(var r,i=e(1),o=e(14),u=e(31),a=u(\"typed_array\"),c=u(\"view\"),s=!(!i.ArrayBuffer||!i.DataView),f=s,l=0,h=\"Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array\".split(\",\");l<9;)(r=i[h[l++]])?(o(r.prototype,a,!0),o(r.prototype,c,!0)):f=!1;t.exports={ABV:s,CONSTR:f,TYPED:a,VIEW:c}},function(t,n,e){var r=e(4),i=e(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){n.f=e(5)},function(t,n,e){var r=e(50)(\"keys\"),i=e(31);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,n){t.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(t,n,e){var r=e(1).document;t.exports=r&&r.documentElement},function(t,n,e){var r=e(4),i=e(3),o=function(t,n){if(i(t),!r(n)&&null!==n)throw TypeError(n+\": can't set as prototype!\")};t.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(22).f(Object.prototype,\"__proto__\").set,2))(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},function(t,n){t.exports=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\"},function(t,n,e){var r=e(4),i=e(67).set;t.exports=function(t,n,e){var o,u=n.constructor;return u!==e&&\"function\"==typeof u&&(o=u.prototype)!==e.prototype&&r(o)&&i&&i(t,o),t}},function(t,n,e){\"use strict\";var r=e(21),i=e(26);t.exports=function(t){var n=String(i(this)),e=\"\",o=r(t);if(o<0||o==1/0)throw RangeError(\"Count can't be negative\");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(e+=n);return e}},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var e=Math.expm1;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:e},function(t,n,e){var r=e(21),i=e(26);t.exports=function(t){return function(n,e){var o,u,a=String(i(n)),c=r(e),s=a.length;return c<0||c>=s?t?\"\":void 0:(o=a.charCodeAt(c))<55296||o>56319||c+1===s||(u=a.charCodeAt(c+1))<56320||u>57343?t?a.charAt(c):o:t?a.slice(c,c+2):u-56320+(o-55296<<10)+65536}}},function(t,n,e){\"use strict\";var r=e(32),i=e(0),o=e(11),u=e(14),a=e(42),c=e(110),s=e(40),f=e(37),l=e(5)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),d=function(){return this};t.exports=function(t,n,e,p,v,g,y){c(e,n,p);var m,b,S,w=function(t){if(!h&&t in P)return P[t];switch(t){case\"keys\":case\"values\":return function(){return new e(this,t)}}return function(){return new e(this,t)}},_=n+\" Iterator\",M=\"values\"==v,x=!1,P=t.prototype,O=P[l]||P[\"@@iterator\"]||v&&P[v],A=O||w(v),F=v?M?w(\"entries\"):A:void 0,E=\"Array\"==n&&P.entries||O;if(E&&(S=f(E.call(new t)))!==Object.prototype&&S.next&&(s(S,_,!0),r||\"function\"==typeof S[l]||u(S,l,d)),M&&O&&\"values\"!==O.name&&(x=!0,A=function(){return O.call(this)}),r&&!y||!h&&!x&&P[l]||u(P,l,A),a[n]=A,a[_]=d,v)if(m={values:M?A:w(\"values\"),keys:g?A:w(\"keys\"),entries:F},y)for(b in m)b in P||o(P,b,m[b]);else i(i.P+i.F*(h||x),n,m);return m}},function(t,n,e){var r=e(76),i=e(26);t.exports=function(t,n,e){if(r(n))throw TypeError(\"String#\"+e+\" doesn't accept regex!\");return String(i(t))}},function(t,n,e){var r=e(4),i=e(25),o=e(5)(\"match\");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[o])?!!n:\"RegExp\"==i(t))}},function(t,n,e){var r=e(5)(\"match\");t.exports=function(t){var n=/./;try{\"/./\"[t](n)}catch(e){try{return n[r]=!1,!\"/./\"[t](n)}catch(t){}}return!0}},function(t,n,e){var r=e(42),i=e(5)(\"iterator\"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,n,e){\"use strict\";var r=e(9),i=e(30);t.exports=function(t,n,e){n in t?r.f(t,n,i(0,e)):t[n]=e}},function(t,n,e){var r=e(48),i=e(5)(\"iterator\"),o=e(42);t.exports=e(7).getIteratorMethod=function(t){if(null!=t)return t[i]||t[\"@@iterator\"]||o[r(t)]}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=function(t){for(var n=r(this),e=o(n.length),u=arguments.length,a=i(u>1?arguments[1]:void 0,e),c=u>2?arguments[2]:void 0,s=void 0===c?e:i(c,e);s>a;)n[a++]=t;return n}},function(t,n,e){\"use strict\";var r=e(38),i=e(115),o=e(42),u=e(15);t.exports=e(74)(Array,\"Array\",(function(t,n){this._t=u(t),this._i=0,this._k=n}),(function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,i(1)):i(0,\"keys\"==n?e:\"values\"==n?t[e]:[e,t[e]])}),\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(t,n,e){\"use strict\";var r,i,o=e(55),u=RegExp.prototype.exec,a=String.prototype.replace,c=u,s=(r=/a/,i=/b*/g,u.call(r,\"a\"),u.call(i,\"a\"),0!==r.lastIndex||0!==i.lastIndex),f=void 0!==/()??/.exec(\"\")[1];(s||f)&&(c=function(t){var n,e,r,i,c=this;return f&&(e=new RegExp(\"^\"+c.source+\"$(?!\\\\s)\",o.call(c))),s&&(n=c.lastIndex),r=u.call(c,t),s&&r&&(c.lastIndex=c.global?r.index+r[0].length:n),f&&r&&r.length>1&&a.call(r[0],e,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r}),t.exports=c},function(t,n,e){\"use strict\";var r=e(73)(!0);t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r,i,o,u=e(19),a=e(104),c=e(66),s=e(62),f=e(1),l=f.process,h=f.setImmediate,d=f.clearImmediate,p=f.MessageChannel,v=f.Dispatch,g=0,y={},m=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},b=function(t){m.call(t.data)};h&&d||(h=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return y[++g]=function(){a(\"function\"==typeof t?t:Function(t),n)},r(g),g},d=function(t){delete y[t]},\"process\"==e(25)(l)?r=function(t){l.nextTick(u(m,t,1))}:v&&v.now?r=function(t){v.now(u(m,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=b,r=u(o.postMessage,o,1)):f.addEventListener&&\"function\"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+\"\",\"*\")},f.addEventListener(\"message\",b,!1)):r=\"onreadystatechange\"in s(\"script\")?function(t){c.appendChild(s(\"script\")).onreadystatechange=function(){c.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0)}),t.exports={set:h,clear:d}},function(t,n,e){\"use strict\";var r=e(1),i=e(8),o=e(32),u=e(61),a=e(14),c=e(45),s=e(2),f=e(44),l=e(21),h=e(6),d=e(123),p=e(36).f,v=e(9).f,g=e(81),y=e(40),m=\"prototype\",b=\"Wrong index!\",S=r.ArrayBuffer,w=r.DataView,_=r.Math,M=r.RangeError,x=r.Infinity,P=S,O=_.abs,A=_.pow,F=_.floor,E=_.log,N=_.LN2,R=i?\"_b\":\"buffer\",k=i?\"_l\":\"byteLength\",T=i?\"_o\":\"byteOffset\";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=23===n?A(2,-24)-A(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=O(t))!=t||t===x?(i=t!=t?1:0,r=c):(r=F(E(t)/N),t*(o=A(2,-r))<1&&(r--,o*=2),(t+=r+s>=1?f/o:f*A(2,1-s))*o>=2&&(r++,o/=2),r+s>=c?(i=0,r=c):r+s>=1?(i=(t*o-1)*A(2,n),r+=s):(i=t*A(2,s-1)*A(2,n),r=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(r=r<<n|i,a+=n;a>0;u[l++]=255&r,r/=256,a-=8);return u[--l]|=128*h,u}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--],f=127&s;for(s>>=7;a>0;f=256*f+t[c],c--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=n;a>0;r=256*r+t[c],c--,a-=8);if(0===f)f=1-u;else{if(f===o)return r?NaN:s?-x:x;r+=A(2,n),f-=u}return(s?-1:1)*r*A(2,f-n)}function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function B(t){return[255&t]}function C(t){return[255&t,t>>8&255]}function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function V(t){return I(t,52,8)}function G(t){return I(t,23,4)}function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}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+t[T],a=o.slice(u,u+n);return r?a:a.reverse()}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]._b,c=u+t[T],s=r(+i),f=0;f<n;f++)a[c+f]=s[o?f:n-f-1]}if(u.ABV){if(!s((function(){S(1)}))||!s((function(){new S(-1)}))||s((function(){return new S,new S(1.5),new S(NaN),\"ArrayBuffer\"!=S.name}))){for(var q,K=(S=function(t){return f(this,S),new P(d(t))})[m]=P[m],Y=p(P),Q=0;Y.length>Q;)(q=Y[Q++])in S||a(S,q,P[q]);o||(K.constructor=S)}var H=new w(new S(2)),J=w[m].setInt8;H.setInt8(0,2147483648),H.setInt8(1,2147483649),!H.getInt8(0)&&H.getInt8(1)||c(w[m],{setInt8:function(t,n){J.call(this,t,n<<24>>24)},setUint8:function(t,n){J.call(this,t,n<<24>>24)}},!0)}else S=function(t){f(this,S,\"ArrayBuffer\");var n=d(t);this._b=g.call(new Array(n),0),this[k]=n},w=function(t,n,e){f(this,w,\"DataView\"),f(t,S,\"DataView\");var r=t[k],i=l(n);if(i<0||i>r)throw M(\"Wrong offset!\");if(i+(e=void 0===e?r-i:h(e))>r)throw M(\"Wrong length!\");this[R]=t,this[T]=i,this[k]=e},i&&(D(S,\"byteLength\",\"_l\"),D(w,\"buffer\",\"_b\"),D(w,\"byteLength\",\"_l\"),D(w,\"byteOffset\",\"_o\")),c(w[m],{getInt8:function(t){return U(this,1,t)[0]<<24>>24},getUint8:function(t){return U(this,1,t)[0]},getInt16:function(t){var n=U(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=U(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return L(U(this,4,t,arguments[1]))},getUint32:function(t){return L(U(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return j(U(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return j(U(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){z(this,1,t,B,n)},setUint8:function(t,n){z(this,1,t,B,n)},setInt16:function(t,n){z(this,2,t,C,n,arguments[2])},setUint16:function(t,n){z(this,2,t,C,n,arguments[2])},setInt32:function(t,n){z(this,4,t,W,n,arguments[2])},setUint32:function(t,n){z(this,4,t,W,n,arguments[2])},setFloat32:function(t,n){z(this,4,t,G,n,arguments[2])},setFloat64:function(t,n){z(this,8,t,V,n,arguments[2])}});y(S,\"ArrayBuffer\"),y(w,\"DataView\"),a(w[m],u.VIEW,!0),n.ArrayBuffer=S,n.DataView=w},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){t.exports=!e(128)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(91))&&r.__esModule?r:{default:r},o=e(18);function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}var a=function(){function t(){}var n,e,r;return t.getParser=function(t,n){if(void 0===n&&(n=!1),\"string\"!=typeof t)throw new Error(\"UserAgent should be a string\");return new i.default(t,n)},t.parse=function(t){return new i.default(t).getResult()},n=t,r=[{key:\"BROWSER_MAP\",get:function(){return o.BROWSER_MAP}},{key:\"ENGINE_MAP\",get:function(){return o.ENGINE_MAP}},{key:\"OS_MAP\",get:function(){return o.OS_MAP}},{key:\"PLATFORMS_MAP\",get:function(){return o.PLATFORMS_MAP}}],(e=null)&&u(n.prototype,e),r&&u(n,r),t}();n.default=a,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=c(e(92)),i=c(e(93)),o=c(e(94)),u=c(e(95)),a=c(e(17));function c(t){return t&&t.__esModule?t:{default:t}}var s=function(){function t(t,n){if(void 0===n&&(n=!1),null==t||\"\"===t)throw new Error(\"UserAgent parameter can't be empty\");this._ua=t,this.parsedResult={},!0!==n&&this.parse()}var n=t.prototype;return n.getUA=function(){return this._ua},n.test=function(t){return t.test(this._ua)},n.parseBrowser=function(){var t=this;this.parsedResult.browser={};var n=a.default.find(r.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.browser=n.describe(this.getUA())),this.parsedResult.browser},n.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},n.getBrowserName=function(t){return t?String(this.getBrowser().name).toLowerCase()||\"\":this.getBrowser().name||\"\"},n.getBrowserVersion=function(){return this.getBrowser().version},n.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},n.parseOS=function(){var t=this;this.parsedResult.os={};var n=a.default.find(i.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.os=n.describe(this.getUA())),this.parsedResult.os},n.getOSName=function(t){var n=this.getOS().name;return t?String(n).toLowerCase()||\"\":n||\"\"},n.getOSVersion=function(){return this.getOS().version},n.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},n.getPlatformType=function(t){void 0===t&&(t=!1);var n=this.getPlatform().type;return t?String(n).toLowerCase()||\"\":n||\"\"},n.parsePlatform=function(){var t=this;this.parsedResult.platform={};var n=a.default.find(o.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.platform=n.describe(this.getUA())),this.parsedResult.platform},n.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},n.getEngineName=function(t){return t?String(this.getEngine().name).toLowerCase()||\"\":this.getEngine().name||\"\"},n.parseEngine=function(){var t=this;this.parsedResult.engine={};var n=a.default.find(u.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.engine=n.describe(this.getUA())),this.parsedResult.engine},n.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},n.getResult=function(){return a.default.assign({},this.parsedResult)},n.satisfies=function(t){var n=this,e={},r=0,i={},o=0;if(Object.keys(t).forEach((function(n){var u=t[n];\"string\"==typeof u?(i[n]=u,o+=1):\"object\"==typeof u&&(e[n]=u,r+=1)})),r>0){var u=Object.keys(e),c=a.default.find(u,(function(t){return n.isOS(t)}));if(c){var s=this.satisfies(e[c]);if(void 0!==s)return s}var f=a.default.find(u,(function(t){return n.isPlatform(t)}));if(f){var l=this.satisfies(e[f]);if(void 0!==l)return l}}if(o>0){var h=Object.keys(i),d=a.default.find(h,(function(t){return n.isBrowser(t,!0)}));if(void 0!==d)return this.compareVersion(i[d])}},n.isBrowser=function(t,n){void 0===n&&(n=!1);var e=this.getBrowserName().toLowerCase(),r=t.toLowerCase(),i=a.default.getBrowserTypeByAlias(r);return n&&i&&(r=i.toLowerCase()),r===e},n.compareVersion=function(t){var n=[0],e=t,r=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===t[0]||\"<\"===t[0]?(e=t.substr(1),\"=\"===t[1]?(r=!0,e=t.substr(2)):n=[],\">\"===t[0]?n.push(1):n.push(-1)):\"=\"===t[0]?e=t.substr(1):\"~\"===t[0]&&(r=!0,e=t.substr(1)),n.indexOf(a.default.compareVersions(i,e,r))>-1},n.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},n.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},n.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},n.is=function(t){return this.isBrowser(t)||this.isOS(t)||this.isPlatform(t)},n.some=function(t){var n=this;return void 0===t&&(t=[]),t.some((function(t){return n.is(t)}))},t}();n.default=s,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r};var o=/version\\/(\\d+(\\.?_?\\d+)+)/i,u=[{test:[/googlebot/i],describe:function(t){var n={name:\"Googlebot\"},e=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/opera/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/opr\\/|opios/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/SamsungBrowser/i],describe:function(t){var n={name:\"Samsung Internet for Android\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Whale/i],describe:function(t){var n={name:\"NAVER Whale Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/MZBrowser/i],describe:function(t){var n={name:\"MZ Browser\"},e=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/focus/i],describe:function(t){var n={name:\"Focus\"},e=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/swing/i],describe:function(t){var n={name:\"Swing\"},e=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/coast/i],describe:function(t){var n={name:\"Opera Coast\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/yabrowser/i],describe:function(t){var n={name:\"Yandex Browser\"},e=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/ucbrowser/i],describe:function(t){var n={name:\"UC Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Maxthon|mxios/i],describe:function(t){var n={name:\"Maxthon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/epiphany/i],describe:function(t){var n={name:\"Epiphany\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/puffin/i],describe:function(t){var n={name:\"Puffin\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sleipnir/i],describe:function(t){var n={name:\"Sleipnir\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/k-meleon/i],describe:function(t){var n={name:\"K-Meleon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/micromessenger/i],describe:function(t){var n={name:\"WeChat\"},e=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qqbrowser/i],describe:function(t){var n={name:/qqbrowserlite/i.test(t)?\"QQ Browser Lite\":\"QQ Browser\"},e=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/msie|trident/i],describe:function(t){var n={name:\"Internet Explorer\"},e=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/\\sedg\\//i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/edg([ea]|ios)/i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/vivaldi/i],describe:function(t){var n={name:\"Vivaldi\"},e=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/seamonkey/i],describe:function(t){var n={name:\"SeaMonkey\"},e=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sailfish/i],describe:function(t){var n={name:\"Sailfish\"},e=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,t);return e&&(n.version=e),n}},{test:[/silk/i],describe:function(t){var n={name:\"Amazon Silk\"},e=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/phantom/i],describe:function(t){var n={name:\"PhantomJS\"},e=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/slimerjs/i],describe:function(t){var n={name:\"SlimerJS\"},e=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n={name:\"BlackBerry\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n={name:\"WebOS Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/bada/i],describe:function(t){var n={name:\"Bada\"},e=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/tizen/i],describe:function(t){var n={name:\"Tizen\"},e=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qupzilla/i],describe:function(t){var n={name:\"QupZilla\"},e=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var n={name:\"Firefox\"},e=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/electron/i],describe:function(t){var n={name:\"Electron\"},e=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/chromium/i],describe:function(t){var n={name:\"Chromium\"},e=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/chrome|crios|crmo/i],describe:function(t){var n={name:\"Chrome\"},e=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/GSA/i],describe:function(t){var n={name:\"Google Search\"},e=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n={name:\"Android Browser\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/playstation 4/i],describe:function(t){var n={name:\"PlayStation 4\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/safari|applewebkit/i],describe:function(t){var n={name:\"Safari\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/.*/i],describe:function(t){var n=-1!==t.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(n,t),version:i.default.getSecondMatch(n,t)}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/Roku\\/DVP/],describe:function(t){var n=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,t);return{name:o.OS_MAP.Roku,version:n}}},{test:[/windows phone/i],describe:function(t){var n=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.WindowsPhone,version:n}}},{test:[/windows /i],describe:function(t){var n=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,t),e=i.default.getWindowsVersionName(n);return{name:o.OS_MAP.Windows,version:n,versionName:e}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(t){var n=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,t);return{name:o.OS_MAP.iOS,version:n}}},{test:[/macintosh/i],describe:function(t){var n=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,t).replace(/[_\\s]/g,\".\"),e=i.default.getMacOSVersionName(n),r={name:o.OS_MAP.MacOS,version:n};return e&&(r.versionName=e),r}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var n=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,t).replace(/[_\\s]/g,\".\");return{name:o.OS_MAP.iOS,version:n}}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,t),e=i.default.getAndroidVersionName(n),r={name:o.OS_MAP.Android,version:n};return e&&(r.versionName=e),r}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,t),e={name:o.OS_MAP.WebOS};return n&&n.length&&(e.version=n),e}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,t)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,t)||i.default.getFirstMatch(/\\bbb(\\d+)/i,t);return{name:o.OS_MAP.BlackBerry,version:n}}},{test:[/bada/i],describe:function(t){var n=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Bada,version:n}}},{test:[/tizen/i],describe:function(t){var n=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Tizen,version:n}}},{test:[/linux/i],describe:function(){return{name:o.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:o.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var n=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.PlayStation4,version:n}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(t){var n=i.default.getFirstMatch(/(can-l01)/i,t)&&\"Nova\",e={type:o.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return n&&(e.model=n),e}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){var n=t.test(/ipod|iphone/i),e=t.test(/like (ipod|iphone)/i);return n&&!e},describe:function(t){var n=i.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:o.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:n}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"blackberry\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(t){return\"bada\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"windows phone\"===t.getBrowserName()},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(t){var n=Number(String(t.getOSVersion()).split(\".\")[0]);return\"android\"===t.getOSName(!0)&&n>=3},describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){return\"android\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"macos\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(t){return\"windows\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"linux\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"playstation 4\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}},{test:function(t){return\"roku\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:function(t){return\"microsoft edge\"===t.getBrowserName(!0)},describe:function(t){if(/\\sedg\\//i.test(t))return{name:o.ENGINE_MAP.Blink};var n=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,t);return{name:o.ENGINE_MAP.EdgeHTML,version:n}}},{test:[/trident/i],describe:function(t){var n={name:o.ENGINE_MAP.Trident},e=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){return t.test(/presto/i)},describe:function(t){var n={name:o.ENGINE_MAP.Presto},e=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=t.test(/gecko/i),e=t.test(/like gecko/i);return n&&!e},describe:function(t){var n={name:o.ENGINE_MAP.Gecko},e=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:o.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var n={name:o.ENGINE_MAP.WebKit},e=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}}];n.default=u,t.exports=n.default},function(t,n,e){t.exports=!e(8)&&!e(2)((function(){return 7!=Object.defineProperty(e(62)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(1),i=e(7),o=e(32),u=e(63),a=e(9).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});\"_\"==t.charAt(0)||t in n||a(n,t,{value:u.f(t)})}},function(t,n,e){var r=e(13),i=e(15),o=e(51)(!1),u=e(64)(\"IE_PROTO\");t.exports=function(t,n){var e,a=i(t),c=0,s=[];for(e in a)e!=u&&r(a,e)&&s.push(e);for(;n.length>c;)r(a,e=n[c++])&&(~o(s,e)||s.push(e));return s}},function(t,n,e){var r=e(9),i=e(3),o=e(33);t.exports=e(8)?Object.defineProperties:function(t,n){i(t);for(var e,u=o(n),a=u.length,c=0;a>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(15),i=e(36).f,o={}.toString,u=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&\"[object Window]\"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(r(t))}},function(t,n,e){\"use strict\";var r=e(8),i=e(33),o=e(52),u=e(47),a=e(10),c=e(46),s=Object.assign;t.exports=!s||e(2)((function(){var t={},n={},e=Symbol(),r=\"abcdefghijklmnopqrst\";return t[e]=7,r.split(\"\").forEach((function(t){n[t]=t})),7!=s({},t)[e]||Object.keys(s({},n)).join(\"\")!=r}))?function(t,n){for(var e=a(t),s=arguments.length,f=1,l=o.f,h=u.f;s>f;)for(var d,p=c(arguments[f++]),v=l?i(p).concat(l(p)):i(p),g=v.length,y=0;g>y;)d=v[y++],r&&!h.call(p,d)||(e[d]=p[d]);return e}:s},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){\"use strict\";var r=e(20),i=e(4),o=e(104),u=[].slice,a={},c=function(t,n,e){if(!(n in a)){for(var r=[],i=0;i<n;i++)r[i]=\"a[\"+i+\"]\";a[n]=Function(\"F,a\",\"return new F(\"+r.join(\",\")+\")\")}return a[n](t,e)};t.exports=Function.bind||function(t){var n=r(this),e=u.call(arguments,1),a=function(){var r=e.concat(u.call(arguments));return this instanceof a?c(n,r.length,r):o(n,r,t)};return i(n.prototype)&&(a.prototype=n.prototype),a}},function(t,n){t.exports=function(t,n,e){var r=void 0===e;switch(n.length){case 0:return r?t():t.call(e);case 1:return r?t(n[0]):t.call(e,n[0]);case 2:return r?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return r?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return r?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},function(t,n,e){var r=e(1).parseInt,i=e(41).trim,o=e(68),u=/^[-+]?0[xX]/;t.exports=8!==r(o+\"08\")||22!==r(o+\"0x16\")?function(t,n){var e=i(String(t),3);return r(e,n>>>0||(u.test(e)?16:10))}:r},function(t,n,e){var r=e(1).parseFloat,i=e(41).trim;t.exports=1/r(e(68)+\"-0\")!=-1/0?function(t){var n=i(String(t),3),e=r(n);return 0===e&&\"-\"==n.charAt(0)?-0:e}:r},function(t,n,e){var r=e(25);t.exports=function(t,n){if(\"number\"!=typeof t&&\"Number\"!=r(t))throw TypeError(n);return+t}},function(t,n,e){var r=e(4),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,e){\"use strict\";var r=e(35),i=e(30),o=e(40),u={};e(14)(u,e(5)(\"iterator\"),(function(){return this})),t.exports=function(t,n,e){t.prototype=r(u,{next:i(1,e)}),o(t,n+\" Iterator\")}},function(t,n,e){var r=e(3);t.exports=function(t,n,e,i){try{return i?n(r(e)[0],e[1]):n(e)}catch(n){var o=t.return;throw void 0!==o&&r(o.call(t)),n}}},function(t,n,e){var r=e(224);t.exports=function(t,n){return new(r(t))(n)}},function(t,n,e){var r=e(20),i=e(10),o=e(46),u=e(6);t.exports=function(t,n,e,a,c){r(n);var s=i(t),f=o(s),l=u(s.length),h=c?l-1:0,d=c?-1:1;if(e<2)for(;;){if(h in f){a=f[h],h+=d;break}if(h+=d,c?h<0:l<=h)throw TypeError(\"Reduce of empty array with no initial value\")}for(;c?h>=0:l>h;h+=d)h in f&&(a=n(a,f[h],h,s));return a}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=[].copyWithin||function(t,n){var e=r(this),u=o(e.length),a=i(t,u),c=i(n,u),s=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===s?u:i(s,u))-c,u-a),l=1;for(c<a&&a<c+f&&(l=-1,c+=f-1,a+=f-1);f-- >0;)c in e?e[a]=e[c]:delete e[a],a+=l,c+=l;return e}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){\"use strict\";var r=e(83);e(0)({target:\"RegExp\",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,n,e){e(8)&&\"g\"!=/./g.flags&&e(9).f(RegExp.prototype,\"flags\",{configurable:!0,get:e(55)})},function(t,n,e){\"use strict\";var r,i,o,u,a=e(32),c=e(1),s=e(19),f=e(48),l=e(0),h=e(4),d=e(20),p=e(44),v=e(58),g=e(49),y=e(85).set,m=e(244)(),b=e(119),S=e(245),w=e(59),_=e(120),M=c.TypeError,x=c.process,P=x&&x.versions,O=P&&P.v8||\"\",A=c.Promise,F=\"process\"==f(x),E=function(){},N=i=b.f,R=!!function(){try{var t=A.resolve(1),n=(t.constructor={})[e(5)(\"species\")]=function(t){t(E,E)};return(F||\"function\"==typeof PromiseRejectionEvent)&&t.then(E)instanceof n&&0!==O.indexOf(\"6.6\")&&-1===w.indexOf(\"Chrome/66\")}catch(t){}}(),k=function(t){var n;return!(!h(t)||\"function\"!=typeof(n=t.then))&&n},T=function(t,n){if(!t._n){t._n=!0;var e=t._c;m((function(){for(var r=t._v,i=1==t._s,o=0,u=function(n){var e,o,u,a=i?n.ok:n.fail,c=n.resolve,s=n.reject,f=n.domain;try{a?(i||(2==t._h&&L(t),t._h=1),!0===a?e=r:(f&&f.enter(),e=a(r),f&&(f.exit(),u=!0)),e===n.promise?s(M(\"Promise-chain cycle\")):(o=k(e))?o.call(e,c,s):c(e)):s(r)}catch(t){f&&!u&&f.exit(),s(t)}};e.length>o;)u(e[o++]);t._c=[],t._n=!1,n&&!t._h&&I(t)}))}},I=function(t){y.call(c,(function(){var n,e,r,i=t._v,o=j(t);if(o&&(n=S((function(){F?x.emit(\"unhandledRejection\",i,t):(e=c.onunhandledrejection)?e({promise:t,reason:i}):(r=c.console)&&r.error&&r.error(\"Unhandled promise rejection\",i)})),t._h=F||j(t)?2:1),t._a=void 0,o&&n.e)throw n.v}))},j=function(t){return 1!==t._h&&0===(t._a||t._c).length},L=function(t){y.call(c,(function(){var n;F?x.emit(\"rejectionHandled\",t):(n=c.onrejectionhandled)&&n({promise:t,reason:t._v})}))},B=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),T(n,!0))},C=function(t){var n,e=this;if(!e._d){e._d=!0,e=e._w||e;try{if(e===t)throw M(\"Promise can't be resolved itself\");(n=k(t))?m((function(){var r={_w:e,_d:!1};try{n.call(t,s(C,r,1),s(B,r,1))}catch(t){B.call(r,t)}})):(e._v=t,e._s=1,T(e,!1))}catch(t){B.call({_w:e,_d:!1},t)}}};R||(A=function(t){p(this,A,\"Promise\",\"_h\"),d(t),r.call(this);try{t(s(C,this,1),s(B,this,1))}catch(t){B.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=e(45)(A.prototype,{then:function(t,n){var e=N(g(this,A));return e.ok=\"function\"!=typeof t||t,e.fail=\"function\"==typeof n&&n,e.domain=F?x.domain:void 0,this._c.push(e),this._a&&this._a.push(e),this._s&&T(this,!1),e.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r;this.promise=t,this.resolve=s(C,t,1),this.reject=s(B,t,1)},b.f=N=function(t){return t===A||t===u?new o(t):i(t)}),l(l.G+l.W+l.F*!R,{Promise:A}),e(40)(A,\"Promise\"),e(43)(\"Promise\"),u=e(7).Promise,l(l.S+l.F*!R,\"Promise\",{reject:function(t){var n=N(this);return(0,n.reject)(t),n.promise}}),l(l.S+l.F*(a||!R),\"Promise\",{resolve:function(t){return _(a&&this===u?A:this,t)}}),l(l.S+l.F*!(R&&e(54)((function(t){A.all(t).catch(E)}))),\"Promise\",{all:function(t){var n=this,e=N(n),r=e.resolve,i=e.reject,o=S((function(){var e=[],o=0,u=1;v(t,!1,(function(t){var a=o++,c=!1;e.push(void 0),u++,n.resolve(t).then((function(t){c||(c=!0,e[a]=t,--u||r(e))}),i)})),--u||r(e)}));return o.e&&i(o.v),e.promise},race:function(t){var n=this,e=N(n),r=e.reject,i=S((function(){v(t,!1,(function(t){n.resolve(t).then(e.resolve,r)}))}));return i.e&&r(i.v),e.promise}})},function(t,n,e){\"use strict\";var r=e(20);function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError(\"Bad Promise constructor\");n=t,e=r})),this.resolve=r(n),this.reject=r(e)}t.exports.f=function(t){return new i(t)}},function(t,n,e){var r=e(3),i=e(4),o=e(119);t.exports=function(t,n){if(r(t),i(n)&&n.constructor===t)return n;var e=o.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){\"use strict\";var r=e(9).f,i=e(35),o=e(45),u=e(19),a=e(44),c=e(58),s=e(74),f=e(115),l=e(43),h=e(8),d=e(29).fastKey,p=e(39),v=h?\"_s\":\"size\",g=function(t,n){var e,r=d(n);if(\"F\"!==r)return t._i[r];for(e=t._f;e;e=e.n)if(e.k==n)return e};t.exports={getConstructor:function(t,n,e,s){var f=t((function(t,r){a(t,f,n,\"_i\"),t._t=n,t._i=i(null),t._f=void 0,t._l=void 0,t[v]=0,null!=r&&c(r,e,t[s],t)}));return o(f.prototype,{clear:function(){for(var t=p(this,n),e=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete e[r.i];t._f=t._l=void 0,t[v]=0},delete:function(t){var e=p(this,n),r=g(e,t);if(r){var i=r.n,o=r.p;delete e._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),e._f==r&&(e._f=i),e._l==r&&(e._l=o),e[v]--}return!!r},forEach:function(t){p(this,n);for(var e,r=u(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!g(p(this,n),t)}}),h&&r(f.prototype,\"size\",{get:function(){return p(this,n)[v]}}),f},def:function(t,n,e){var r,i,o=g(t,n);return o?o.v=e:(t._l=o={i:i=d(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=o),r&&(r.n=o),t[v]++,\"F\"!==i&&(t._i[i]=o)),t},getEntry:g,setStrong:function(t,n,e){s(t,n,(function(t,e){this._t=p(t,n),this._k=e,this._l=void 0}),(function(){for(var t=this._k,n=this._l;n&&n.r;)n=n.p;return this._t&&(this._l=n=n?n.n:this._t._f)?f(0,\"keys\"==t?n.k:\"values\"==t?n.v:[n.k,n.v]):(this._t=void 0,f(1))}),e?\"entries\":\"values\",!e,!0),l(n)}}},function(t,n,e){\"use strict\";var r=e(45),i=e(29).getWeak,o=e(3),u=e(4),a=e(44),c=e(58),s=e(24),f=e(13),l=e(39),h=s(5),d=s(6),p=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,n){return h(t.a,(function(t){return t[0]===n}))};g.prototype={get:function(t){var n=y(this,t);if(n)return n[1]},has:function(t){return!!y(this,t)},set:function(t,n){var e=y(this,t);e?e[1]=n:this.a.push([t,n])},delete:function(t){var n=d(this.a,(function(n){return n[0]===t}));return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,o){var s=t((function(t,r){a(t,s,n,\"_i\"),t._t=n,t._i=p++,t._l=void 0,null!=r&&c(r,e,t[o],t)}));return r(s.prototype,{delete:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).delete(t):e&&f(e,this._i)&&delete e[this._i]},has:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).has(t):e&&f(e,this._i)}}),s},def:function(t,n,e){var r=i(o(n),!0);return!0===r?v(t).set(n,e):r[t._i]=e,t},ufstore:v}},function(t,n,e){var r=e(21),i=e(6);t.exports=function(t){if(void 0===t)return 0;var n=r(t),e=i(n);if(n!==e)throw RangeError(\"Wrong length!\");return e}},function(t,n,e){var r=e(36),i=e(52),o=e(3),u=e(1).Reflect;t.exports=u&&u.ownKeys||function(t){var n=r.f(o(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(6),i=e(70),o=e(26);t.exports=function(t,n,e,u){var a=String(o(t)),c=a.length,s=void 0===e?\" \":String(e),f=r(n);if(f<=c||\"\"==s)return a;var l=f-c,h=i.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+a:a+h}},function(t,n,e){var r=e(8),i=e(33),o=e(15),u=e(47).f;t.exports=function(t){return function(n){for(var e,a=o(n),c=i(a),s=c.length,f=0,l=[];s>f;)e=c[f++],r&&!u.call(a,e)||l.push(t?[e,a[e]]:a[e]);return l}}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){e(130),t.exports=e(90)},function(t,n,e){\"use strict\";e(131);var r,i=(r=e(303))&&r.__esModule?r:{default:r};i.default._babelPolyfill&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning.\"),i.default._babelPolyfill=!0},function(t,n,e){\"use strict\";e(132),e(275),e(277),e(280),e(282),e(284),e(286),e(288),e(290),e(292),e(294),e(296),e(298),e(302)},function(t,n,e){e(133),e(136),e(137),e(138),e(139),e(140),e(141),e(142),e(143),e(144),e(145),e(146),e(147),e(148),e(149),e(150),e(151),e(152),e(153),e(154),e(155),e(156),e(157),e(158),e(159),e(160),e(161),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(171),e(172),e(173),e(174),e(175),e(176),e(177),e(179),e(180),e(181),e(182),e(183),e(184),e(185),e(186),e(187),e(188),e(189),e(190),e(191),e(192),e(193),e(194),e(195),e(196),e(197),e(198),e(199),e(200),e(201),e(202),e(203),e(204),e(205),e(206),e(207),e(208),e(209),e(210),e(211),e(212),e(214),e(215),e(217),e(218),e(219),e(220),e(221),e(222),e(223),e(225),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(82),e(238),e(116),e(239),e(117),e(240),e(241),e(242),e(243),e(118),e(246),e(247),e(248),e(249),e(250),e(251),e(252),e(253),e(254),e(255),e(256),e(257),e(258),e(259),e(260),e(261),e(262),e(263),e(264),e(265),e(266),e(267),e(268),e(269),e(270),e(271),e(272),e(273),e(274),t.exports=e(7)},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(8),u=e(0),a=e(11),c=e(29).KEY,s=e(2),f=e(50),l=e(40),h=e(31),d=e(5),p=e(63),v=e(97),g=e(135),y=e(53),m=e(3),b=e(4),S=e(10),w=e(15),_=e(28),M=e(30),x=e(35),P=e(100),O=e(22),A=e(52),F=e(9),E=e(33),N=O.f,R=F.f,k=P.f,T=r.Symbol,I=r.JSON,j=I&&I.stringify,L=d(\"_hidden\"),B=d(\"toPrimitive\"),C={}.propertyIsEnumerable,W=f(\"symbol-registry\"),V=f(\"symbols\"),G=f(\"op-symbols\"),D=Object.prototype,U=\"function\"==typeof T&&!!A.f,z=r.QObject,q=!z||!z.prototype||!z.prototype.findChild,K=o&&s((function(){return 7!=x(R({},\"a\",{get:function(){return R(this,\"a\",{value:7}).a}})).a}))?function(t,n,e){var r=N(D,n);r&&delete D[n],R(t,n,e),r&&t!==D&&R(D,n,r)}:R,Y=function(t){var n=V[t]=x(T.prototype);return n._k=t,n},Q=U&&\"symbol\"==typeof T.iterator?function(t){return\"symbol\"==typeof t}:function(t){return t instanceof T},H=function(t,n,e){return t===D&&H(G,n,e),m(t),n=_(n,!0),m(e),i(V,n)?(e.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),e=x(e,{enumerable:M(0,!1)})):(i(t,L)||R(t,L,M(1,{})),t[L][n]=!0),K(t,n,e)):R(t,n,e)},J=function(t,n){m(t);for(var e,r=g(n=w(n)),i=0,o=r.length;o>i;)H(t,e=r[i++],n[e]);return t},X=function(t){var n=C.call(this,t=_(t,!0));return!(this===D&&i(V,t)&&!i(G,t))&&(!(n||!i(this,t)||!i(V,t)||i(this,L)&&this[L][t])||n)},Z=function(t,n){if(t=w(t),n=_(n,!0),t!==D||!i(V,n)||i(G,n)){var e=N(t,n);return!e||!i(V,n)||i(t,L)&&t[L][n]||(e.enumerable=!0),e}},$=function(t){for(var n,e=k(w(t)),r=[],o=0;e.length>o;)i(V,n=e[o++])||n==L||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===D,r=k(e?G:w(t)),o=[],u=0;r.length>u;)!i(V,n=r[u++])||e&&!i(D,n)||o.push(V[n]);return o};U||(a((T=function(){if(this instanceof T)throw TypeError(\"Symbol is not a constructor!\");var t=h(arguments.length>0?arguments[0]:void 0),n=function(e){this===D&&n.call(G,e),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),K(this,t,M(1,e))};return o&&q&&K(D,t,{configurable:!0,set:n}),Y(t)}).prototype,\"toString\",(function(){return this._k})),O.f=Z,F.f=H,e(36).f=P.f=$,e(47).f=X,A.f=tt,o&&!e(32)&&a(D,\"propertyIsEnumerable\",X,!0),p.f=function(t){return Y(d(t))}),u(u.G+u.W+u.F*!U,{Symbol:T});for(var nt=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),et=0;nt.length>et;)d(nt[et++]);for(var rt=E(d.store),it=0;rt.length>it;)v(rt[it++]);u(u.S+u.F*!U,\"Symbol\",{for:function(t){return i(W,t+=\"\")?W[t]:W[t]=T(t)},keyFor:function(t){if(!Q(t))throw TypeError(t+\" is not a symbol!\");for(var n in W)if(W[n]===t)return n},useSetter:function(){q=!0},useSimple:function(){q=!1}}),u(u.S+u.F*!U,\"Object\",{create:function(t,n){return void 0===n?x(t):J(x(t),n)},defineProperty:H,defineProperties:J,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:tt});var ot=s((function(){A.f(1)}));u(u.S+u.F*ot,\"Object\",{getOwnPropertySymbols:function(t){return A.f(S(t))}}),I&&u(u.S+u.F*(!U||s((function(){var t=T();return\"[null]\"!=j([t])||\"{}\"!=j({a:t})||\"{}\"!=j(Object(t))}))),\"JSON\",{stringify:function(t){for(var n,e,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(e=n=r[1],(b(n)||void 0!==t)&&!Q(t))return y(n)||(n=function(t,n){if(\"function\"==typeof e&&(n=e.call(this,t,n)),!Q(n))return n}),r[1]=n,j.apply(I,r)}}),T.prototype[B]||e(14)(T.prototype,B,T.prototype.valueOf),l(T,\"Symbol\"),l(Math,\"Math\",!0),l(r.JSON,\"JSON\",!0)},function(t,n,e){t.exports=e(50)(\"native-function-to-string\",Function.toString)},function(t,n,e){var r=e(33),i=e(52),o=e(47);t.exports=function(t){var n=r(t),e=i.f;if(e)for(var u,a=e(t),c=o.f,s=0;a.length>s;)c.call(t,u=a[s++])&&n.push(u);return n}},function(t,n,e){var r=e(0);r(r.S,\"Object\",{create:e(35)})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperty:e(9).f})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperties:e(99)})},function(t,n,e){var r=e(15),i=e(22).f;e(23)(\"getOwnPropertyDescriptor\",(function(){return function(t,n){return i(r(t),n)}}))},function(t,n,e){var r=e(10),i=e(37);e(23)(\"getPrototypeOf\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){var r=e(10),i=e(33);e(23)(\"keys\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){e(23)(\"getOwnPropertyNames\",(function(){return e(100).f}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"freeze\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"seal\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"preventExtensions\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4);e(23)(\"isFrozen\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isSealed\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isExtensible\",(function(t){return function(n){return!!r(n)&&(!t||t(n))}}))},function(t,n,e){var r=e(0);r(r.S+r.F,\"Object\",{assign:e(101)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{is:e(102)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{setPrototypeOf:e(67).set})},function(t,n,e){\"use strict\";var r=e(48),i={};i[e(5)(\"toStringTag\")]=\"z\",i+\"\"!=\"[object z]\"&&e(11)(Object.prototype,\"toString\",(function(){return\"[object \"+r(this)+\"]\"}),!0)},function(t,n,e){var r=e(0);r(r.P,\"Function\",{bind:e(103)})},function(t,n,e){var r=e(9).f,i=Function.prototype,o=/^\\s*function ([^ (]*)/;\"name\"in i||e(8)&&r(i,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(o)[1]}catch(t){return\"\"}}})},function(t,n,e){\"use strict\";var r=e(4),i=e(37),o=e(5)(\"hasInstance\"),u=Function.prototype;o in u||e(9).f(u,o,{value:function(t){if(\"function\"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(0),i=e(105);r(r.G+r.F*(parseInt!=i),{parseInt:i})},function(t,n,e){var r=e(0),i=e(106);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(25),u=e(69),a=e(28),c=e(2),s=e(36).f,f=e(22).f,l=e(9).f,h=e(41).trim,d=r.Number,p=d,v=d.prototype,g=\"Number\"==o(e(35)(v)),y=\"trim\"in String.prototype,m=function(t){var n=a(t,!1);if(\"string\"==typeof n&&n.length>2){var e,r,i,o=(n=y?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(e=n.charCodeAt(2))||120===e)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+n}for(var u,c=n.slice(2),s=0,f=c.length;s<f;s++)if((u=c.charCodeAt(s))<48||u>i)return NaN;return parseInt(c,r)}}return+n};if(!d(\" 0o1\")||!d(\"0b1\")||d(\"+0x1\")){d=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof d&&(g?c((function(){v.valueOf.call(e)})):\"Number\"!=o(e))?u(new p(m(n)),e,d):m(n)};for(var b,S=e(8)?s(p):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),w=0;S.length>w;w++)i(p,b=S[w])&&!i(d,b)&&l(d,b,f(p,b));d.prototype=v,v.constructor=d,e(11)(r,\"Number\",d)}},function(t,n,e){\"use strict\";var r=e(0),i=e(21),o=e(107),u=e(70),a=1..toFixed,c=Math.floor,s=[0,0,0,0,0,0],f=\"Number.toFixed: incorrect invocation!\",l=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*s[e],s[e]=r%1e7,r=c(r/1e7)},h=function(t){for(var n=6,e=0;--n>=0;)e+=s[n],s[n]=c(e/t),e=e%t*1e7},d=function(){for(var t=6,n=\"\";--t>=0;)if(\"\"!==n||0===t||0!==s[t]){var e=String(s[t]);n=\"\"===n?e:n+u.call(\"0\",7-e.length)+e}return n},p=function(t,n,e){return 0===n?e:n%2==1?p(t,n-1,e*t):p(t*t,n/2,e)};r(r.P+r.F*(!!a&&(\"0.000\"!==8e-5.toFixed(3)||\"1\"!==.9.toFixed(0)||\"1.25\"!==1.255.toFixed(2)||\"1000000000000000128\"!==(0xde0b6b3a7640080).toFixed(0))||!e(2)((function(){a.call({})}))),\"Number\",{toFixed:function(t){var n,e,r,a,c=o(this,f),s=i(t),v=\"\",g=\"0\";if(s<0||s>20)throw RangeError(f);if(c!=c)return\"NaN\";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v=\"-\",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*p(2,69,1))-69)<0?c*p(2,-n,1):c/p(2,n,1),e*=4503599627370496,(n=52-n)>0){for(l(0,e),r=s;r>=7;)l(1e7,0),r-=7;for(l(p(10,r,1),0),r=n-1;r>=23;)h(1<<23),r-=23;h(1<<r),l(1,1),h(2),g=d()}else l(0,e),l(1<<-n,0),g=d()+u.call(\"0\",s);return g=s>0?v+((a=g.length)<=s?\"0.\"+u.call(\"0\",s-a)+g:g.slice(0,a-s)+\".\"+g.slice(a-s)):v+g}})},function(t,n,e){\"use strict\";var r=e(0),i=e(2),o=e(107),u=1..toPrecision;r(r.P+r.F*(i((function(){return\"1\"!==u.call(1,void 0)}))||!i((function(){u.call({})}))),\"Number\",{toPrecision:function(t){var n=o(this,\"Number#toPrecision: incorrect invocation!\");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{EPSILON:Math.pow(2,-52)})},function(t,n,e){var r=e(0),i=e(1).isFinite;r(r.S,\"Number\",{isFinite:function(t){return\"number\"==typeof t&&i(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isInteger:e(108)})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(0),i=e(108),o=Math.abs;r(r.S,\"Number\",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(0),i=e(106);r(r.S+r.F*(Number.parseFloat!=i),\"Number\",{parseFloat:i})},function(t,n,e){var r=e(0),i=e(105);r(r.S+r.F*(Number.parseInt!=i),\"Number\",{parseInt:i})},function(t,n,e){var r=e(0),i=e(109),o=Math.sqrt,u=Math.acosh;r(r.S+r.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),\"Math\",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,e){var r=e(0),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),\"Math\",{asinh:function t(n){return isFinite(n=+n)&&0!=n?n<0?-t(-n):Math.log(n+Math.sqrt(n*n+1)):n}})},function(t,n,e){var r=e(0),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),\"Math\",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,e){var r=e(0),i=e(71);r(r.S,\"Math\",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,e){var r=e(0),i=Math.exp;r(r.S,\"Math\",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,e){var r=e(0),i=e(72);r(r.S+r.F*(i!=Math.expm1),\"Math\",{expm1:i})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{fround:e(178)})},function(t,n,e){var r=e(71),i=Math.pow,o=i(2,-52),u=i(2,-23),a=i(2,127)*(2-u),c=i(2,-126);t.exports=Math.fround||function(t){var n,e,i=Math.abs(t),s=r(t);return i<c?s*(i/c/u+1/o-1/o)*c*u:(e=(n=(1+u/o)*i)-(n-i))>a||e!=e?s*(1/0):s*e}},function(t,n,e){var r=e(0),i=Math.abs;r(r.S,\"Math\",{hypot:function(t,n){for(var e,r,o=0,u=0,a=arguments.length,c=0;u<a;)c<(e=i(arguments[u++]))?(o=o*(r=c/e)*r+1,c=e):o+=e>0?(r=e/c)*r:e;return c===1/0?1/0:c*Math.sqrt(o)}})},function(t,n,e){var r=e(0),i=Math.imul;r(r.S+r.F*e(2)((function(){return-5!=i(4294967295,5)||2!=i.length})),\"Math\",{imul:function(t,n){var e=+t,r=+n,i=65535&e,o=65535&r;return 0|i*o+((65535&e>>>16)*o+i*(65535&r>>>16)<<16>>>0)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log1p:e(109)})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{sign:e(71)})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S+r.F*e(2)((function(){return-2e-17!=!Math.sinh(-2e-17)})),\"Math\",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S,\"Math\",{tanh:function(t){var n=i(t=+t),e=i(-t);return n==1/0?1:e==1/0?-1:(n-e)/(o(t)+o(-t))}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,e){var r=e(0),i=e(34),o=String.fromCharCode,u=String.fromCodePoint;r(r.S+r.F*(!!u&&1!=u.length),\"String\",{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,u=0;r>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+\" is not a valid code point\");e.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return e.join(\"\")}})},function(t,n,e){var r=e(0),i=e(15),o=e(6);r(r.S,\"String\",{raw:function(t){for(var n=i(t.raw),e=o(n.length),r=arguments.length,u=[],a=0;e>a;)u.push(String(n[a++])),a<r&&u.push(String(arguments[a]));return u.join(\"\")}})},function(t,n,e){\"use strict\";e(41)(\"trim\",(function(t){return function(){return t(this,3)}}))},function(t,n,e){\"use strict\";var r=e(73)(!0);e(74)(String,\"String\",(function(t){this._t=String(t),this._i=0}),(function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})}))},function(t,n,e){\"use strict\";var r=e(0),i=e(73)(!1);r(r.P,\"String\",{codePointAt:function(t){return i(this,t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".endsWith;r(r.P+r.F*e(77)(\"endsWith\"),\"String\",{endsWith:function(t){var n=o(this,t,\"endsWith\"),e=arguments.length>1?arguments[1]:void 0,r=i(n.length),a=void 0===e?r:Math.min(i(e),r),c=String(t);return u?u.call(n,c,a):n.slice(a-c.length,a)===c}})},function(t,n,e){\"use strict\";var r=e(0),i=e(75);r(r.P+r.F*e(77)(\"includes\"),\"String\",{includes:function(t){return!!~i(this,t,\"includes\").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(0);r(r.P,\"String\",{repeat:e(70)})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".startsWith;r(r.P+r.F*e(77)(\"startsWith\"),\"String\",{startsWith:function(t){var n=o(this,t,\"startsWith\"),e=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return u?u.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){\"use strict\";e(12)(\"anchor\",(function(t){return function(n){return t(this,\"a\",\"name\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"big\",(function(t){return function(){return t(this,\"big\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"blink\",(function(t){return function(){return t(this,\"blink\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"bold\",(function(t){return function(){return t(this,\"b\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fixed\",(function(t){return function(){return t(this,\"tt\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fontcolor\",(function(t){return function(n){return t(this,\"font\",\"color\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"fontsize\",(function(t){return function(n){return t(this,\"font\",\"size\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"italics\",(function(t){return function(){return t(this,\"i\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"link\",(function(t){return function(n){return t(this,\"a\",\"href\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"small\",(function(t){return function(){return t(this,\"small\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"strike\",(function(t){return function(){return t(this,\"strike\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sub\",(function(t){return function(){return t(this,\"sub\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sup\",(function(t){return function(){return t(this,\"sup\",\"\",\"\")}}))},function(t,n,e){var r=e(0);r(r.S,\"Date\",{now:function(){return(new Date).getTime()}})},function(t,n,e){\"use strict\";var r=e(0),i=e(10),o=e(28);r(r.P+r.F*e(2)((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})),\"Date\",{toJSON:function(t){var n=i(this),e=o(n);return\"number\"!=typeof e||isFinite(e)?n.toISOString():null}})},function(t,n,e){var r=e(0),i=e(213);r(r.P+r.F*(Date.prototype.toISOString!==i),\"Date\",{toISOString:i})},function(t,n,e){\"use strict\";var r=e(2),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:\"0\"+t};t.exports=r((function(){return\"0385-07-25T07:06:39.999Z\"!=o.call(new Date(-5e13-1))}))||!r((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError(\"Invalid time value\");var t=this,n=t.getUTCFullYear(),e=t.getUTCMilliseconds(),r=n<0?\"-\":n>9999?\"+\":\"\";return r+(\"00000\"+Math.abs(n)).slice(r?-6:-4)+\"-\"+u(t.getUTCMonth()+1)+\"-\"+u(t.getUTCDate())+\"T\"+u(t.getUTCHours())+\":\"+u(t.getUTCMinutes())+\":\"+u(t.getUTCSeconds())+\".\"+(e>99?e:\"0\"+u(e))+\"Z\"}:o},function(t,n,e){var r=Date.prototype,i=r.toString,o=r.getTime;new Date(NaN)+\"\"!=\"Invalid Date\"&&e(11)(r,\"toString\",(function(){var t=o.call(this);return t==t?i.call(this):\"Invalid Date\"}))},function(t,n,e){var r=e(5)(\"toPrimitive\"),i=Date.prototype;r in i||e(14)(i,r,e(216))},function(t,n,e){\"use strict\";var r=e(3),i=e(28);t.exports=function(t){if(\"string\"!==t&&\"number\"!==t&&\"default\"!==t)throw TypeError(\"Incorrect hint\");return i(r(this),\"number\"!=t)}},function(t,n,e){var r=e(0);r(r.S,\"Array\",{isArray:e(53)})},function(t,n,e){\"use strict\";var r=e(19),i=e(0),o=e(10),u=e(111),a=e(78),c=e(6),s=e(79),f=e(80);i(i.S+i.F*!e(54)((function(t){Array.from(t)})),\"Array\",{from:function(t){var n,e,i,l,h=o(t),d=\"function\"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v,y=0,m=f(h);if(g&&(v=r(v,p>2?arguments[2]:void 0,2)),null==m||d==Array&&a(m))for(e=new d(n=c(h.length));n>y;y++)s(e,y,g?v(h[y],y):h[y]);else for(l=m.call(h),e=new d;!(i=l.next()).done;y++)s(e,y,g?u(l,v,[i.value,y],!0):i.value);return e.length=y,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(79);r(r.S+r.F*e(2)((function(){function t(){}return!(Array.of.call(t)instanceof t)})),\"Array\",{of:function(){for(var t=0,n=arguments.length,e=new(\"function\"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=[].join;r(r.P+r.F*(e(46)!=Object||!e(16)(o)),\"Array\",{join:function(t){return o.call(i(this),void 0===t?\",\":t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(66),o=e(25),u=e(34),a=e(6),c=[].slice;r(r.P+r.F*e(2)((function(){i&&c.call(i)})),\"Array\",{slice:function(t,n){var e=a(this.length),r=o(this);if(n=void 0===n?e:n,\"Array\"==r)return c.call(this,t,n);for(var i=u(t,e),s=u(n,e),f=a(s-i),l=new Array(f),h=0;h<f;h++)l[h]=\"String\"==r?this.charAt(i+h):this[i+h];return l}})},function(t,n,e){\"use strict\";var r=e(0),i=e(20),o=e(10),u=e(2),a=[].sort,c=[1,2,3];r(r.P+r.F*(u((function(){c.sort(void 0)}))||!u((function(){c.sort(null)}))||!e(16)(a)),\"Array\",{sort:function(t){return void 0===t?a.call(o(this)):a.call(o(this),i(t))}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(0),o=e(16)([].forEach,!0);r(r.P+r.F*!o,\"Array\",{forEach:function(t){return i(this,t,arguments[1])}})},function(t,n,e){var r=e(4),i=e(53),o=e(5)(\"species\");t.exports=function(t){var n;return i(t)&&(\"function\"!=typeof(n=t.constructor)||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&null===(n=n[o])&&(n=void 0)),void 0===n?Array:n}},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(1);r(r.P+r.F*!e(16)([].map,!0),\"Array\",{map:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(2);r(r.P+r.F*!e(16)([].filter,!0),\"Array\",{filter:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(3);r(r.P+r.F*!e(16)([].some,!0),\"Array\",{some:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(4);r(r.P+r.F*!e(16)([].every,!0),\"Array\",{every:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduce,!0),\"Array\",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduceRight,!0),\"Array\",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(u||!e(16)(o)),\"Array\",{indexOf:function(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=e(21),u=e(6),a=[].lastIndexOf,c=!!a&&1/[1].lastIndexOf(1,-0)<0;r(r.P+r.F*(c||!e(16)(a)),\"Array\",{lastIndexOf:function(t){if(c)return a.apply(this,arguments)||0;var n=i(this),e=u(n.length),r=e-1;for(arguments.length>1&&(r=Math.min(r,o(arguments[1]))),r<0&&(r=e+r);r>=0;r--)if(r in n&&n[r]===t)return r||0;return-1}})},function(t,n,e){var r=e(0);r(r.P,\"Array\",{copyWithin:e(114)}),e(38)(\"copyWithin\")},function(t,n,e){var r=e(0);r(r.P,\"Array\",{fill:e(81)}),e(38)(\"fill\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(5),o=!0;\"find\"in[]&&Array(1).find((function(){o=!1})),r(r.P+r.F*o,\"Array\",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"find\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(6),o=\"findIndex\",u=!0;o in[]&&Array(1)[o]((function(){u=!1})),r(r.P+r.F*u,\"Array\",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(o)},function(t,n,e){e(43)(\"Array\")},function(t,n,e){var r=e(1),i=e(69),o=e(9).f,u=e(36).f,a=e(76),c=e(55),s=r.RegExp,f=s,l=s.prototype,h=/a/g,d=/a/g,p=new s(h)!==h;if(e(8)&&(!p||e(2)((function(){return d[e(5)(\"match\")]=!1,s(h)!=h||s(d)==d||\"/a/i\"!=s(h,\"i\")})))){s=function(t,n){var e=this instanceof s,r=a(t),o=void 0===n;return!e&&r&&t.constructor===s&&o?t:i(p?new f(r&&!o?t.source:t,n):f((r=t instanceof s)?t.source:t,r&&o?c.call(t):n),e?this:l,s)};for(var v=function(t){t in s||o(s,t,{configurable:!0,get:function(){return f[t]},set:function(n){f[t]=n}})},g=u(f),y=0;g.length>y;)v(g[y++]);l.constructor=s,s.prototype=l,e(11)(r,\"RegExp\",s)}e(43)(\"RegExp\")},function(t,n,e){\"use strict\";e(117);var r=e(3),i=e(55),o=e(8),u=/./.toString,a=function(t){e(11)(RegExp.prototype,\"toString\",t,!0)};e(2)((function(){return\"/a/b\"!=u.call({source:\"a\",flags:\"b\"})}))?a((function(){var t=r(this);return\"/\".concat(t.source,\"/\",\"flags\"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)})):\"toString\"!=u.name&&a((function(){return u.call(this)}))},function(t,n,e){\"use strict\";var r=e(3),i=e(6),o=e(84),u=e(56);e(57)(\"match\",1,(function(t,n,e,a){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=a(e,t,this);if(n.done)return n.value;var c=r(t),s=String(this);if(!c.global)return u(c,s);var f=c.unicode;c.lastIndex=0;for(var l,h=[],d=0;null!==(l=u(c,s));){var p=String(l[0]);h[d]=p,\"\"===p&&(c.lastIndex=o(s,i(c.lastIndex),f)),d++}return 0===d?null:h}]}))},function(t,n,e){\"use strict\";var r=e(3),i=e(10),o=e(6),u=e(21),a=e(84),c=e(56),s=Math.max,f=Math.min,l=Math.floor,h=/\\$([$&`']|\\d\\d?|<[^>]*>)/g,d=/\\$([$&`']|\\d\\d?)/g;e(57)(\"replace\",2,(function(t,n,e,p){return[function(r,i){var o=t(this),u=null==r?void 0:r[n];return void 0!==u?u.call(r,o,i):e.call(String(o),r,i)},function(t,n){var i=p(e,t,this,n);if(i.done)return i.value;var l=r(t),h=String(this),d=\"function\"==typeof n;d||(n=String(n));var g=l.global;if(g){var y=l.unicode;l.lastIndex=0}for(var m=[];;){var b=c(l,h);if(null===b)break;if(m.push(b),!g)break;\"\"===String(b[0])&&(l.lastIndex=a(h,o(l.lastIndex),y))}for(var S,w=\"\",_=0,M=0;M<m.length;M++){b=m[M];for(var x=String(b[0]),P=s(f(u(b.index),h.length),0),O=[],A=1;A<b.length;A++)O.push(void 0===(S=b[A])?S:String(S));var F=b.groups;if(d){var E=[x].concat(O,P,h);void 0!==F&&E.push(F);var N=String(n.apply(void 0,E))}else N=v(x,h,P,O,F,n);P>=_&&(w+=h.slice(_,P)+N,_=P+x.length)}return w+h.slice(_)}];function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==u&&(u=i(u),f=h),e.call(a,f,(function(e,i){var a;switch(i.charAt(0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return n.slice(0,r);case\"'\":return n.slice(c);case\"<\":a=u[i.slice(1,-1)];break;default:var f=+i;if(0===f)return e;if(f>s){var h=l(f/10);return 0===h?e:h<=s?void 0===o[h-1]?i.charAt(1):o[h-1]+i.charAt(1):e}a=o[f-1]}return void 0===a?\"\":a}))}}))},function(t,n,e){\"use strict\";var r=e(3),i=e(102),o=e(56);e(57)(\"search\",1,(function(t,n,e,u){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=u(e,t,this);if(n.done)return n.value;var a=r(t),c=String(this),s=a.lastIndex;i(s,0)||(a.lastIndex=0);var f=o(a,c);return i(a.lastIndex,s)||(a.lastIndex=s),null===f?-1:f.index}]}))},function(t,n,e){\"use strict\";var r=e(76),i=e(3),o=e(49),u=e(84),a=e(6),c=e(56),s=e(83),f=e(2),l=Math.min,h=[].push,d=!f((function(){RegExp(4294967295,\"y\")}));e(57)(\"split\",2,(function(t,n,e,f){var p;return p=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var i=String(this);if(void 0===t&&0===n)return[];if(!r(t))return e.call(i,t,n);for(var o,u,a,c=[],f=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),l=0,d=void 0===n?4294967295:n>>>0,p=new RegExp(t.source,f+\"g\");(o=s.call(p,i))&&!((u=p.lastIndex)>l&&(c.push(i.slice(l,o.index)),o.length>1&&o.index<i.length&&h.apply(c,o.slice(1)),a=o[0].length,l=u,c.length>=d));)p.lastIndex===o.index&&p.lastIndex++;return l===i.length?!a&&p.test(\"\")||c.push(\"\"):c.push(i.slice(l)),c.length>d?c.slice(0,d):c}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,r){var i=t(this),o=null==e?void 0:e[n];return void 0!==o?o.call(e,i,r):p.call(String(i),e,r)},function(t,n){var r=f(p,t,this,n,p!==e);if(r.done)return r.value;var s=i(t),h=String(this),v=o(s,RegExp),g=s.unicode,y=(s.ignoreCase?\"i\":\"\")+(s.multiline?\"m\":\"\")+(s.unicode?\"u\":\"\")+(d?\"y\":\"g\"),m=new v(d?s:\"^(?:\"+s.source+\")\",y),b=void 0===n?4294967295:n>>>0;if(0===b)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var S=0,w=0,_=[];w<h.length;){m.lastIndex=d?w:0;var M,x=c(m,d?h:h.slice(w));if(null===x||(M=l(a(m.lastIndex+(d?0:w)),h.length))===S)w=u(h,w,g);else{if(_.push(h.slice(S,w)),_.length===b)return _;for(var P=1;P<=x.length-1;P++)if(_.push(x[P]),_.length===b)return _;w=S=M}}return _.push(h.slice(S)),_}]}))},function(t,n,e){var r=e(1),i=e(85).set,o=r.MutationObserver||r.WebKitMutationObserver,u=r.process,a=r.Promise,c=\"process\"==e(25)(u);t.exports=function(){var t,n,e,s=function(){var r,i;for(c&&(r=u.domain)&&r.exit();t;){i=t.fn,t=t.next;try{i()}catch(r){throw t?e():n=void 0,r}}n=void 0,r&&r.enter()};if(c)e=function(){u.nextTick(s)};else if(!o||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var f=a.resolve(void 0);e=function(){f.then(s)}}else e=function(){i.call(r,s)};else{var l=!0,h=document.createTextNode(\"\");new o(s).observe(h,{characterData:!0}),e=function(){h.data=l=!l}}return function(r){var i={fn:r,next:void 0};n&&(n.next=i),t||(t=i,e()),n=i}}},function(t,n){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Map\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{get:function(t){var n=r.getEntry(i(this,\"Map\"),t);return n&&n.v},set:function(t,n){return r.def(i(this,\"Map\"),0===t?0:t,n)}},r,!0)},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Set\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"Set\"),t=0===t?0:t,t)}},r)},function(t,n,e){\"use strict\";var r,i=e(1),o=e(24)(0),u=e(11),a=e(29),c=e(101),s=e(122),f=e(4),l=e(39),h=e(39),d=!i.ActiveXObject&&\"ActiveXObject\"in i,p=a.getWeak,v=Object.isExtensible,g=s.ufstore,y=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(f(t)){var n=p(t);return!0===n?g(l(this,\"WeakMap\")).get(t):n?n[this._i]:void 0}},set:function(t,n){return s.def(l(this,\"WeakMap\"),t,n)}},b=t.exports=e(60)(\"WeakMap\",y,m,s,!0,!0);h&&d&&(c((r=s.getConstructor(y,\"WeakMap\")).prototype,m),a.NEED=!0,o([\"delete\",\"has\",\"get\",\"set\"],(function(t){var n=b.prototype,e=n[t];u(n,t,(function(n,i){if(f(n)&&!v(n)){this._f||(this._f=new r);var o=this._f[t](n,i);return\"set\"==t?this:o}return e.call(this,n,i)}))})))},function(t,n,e){\"use strict\";var r=e(122),i=e(39);e(60)(\"WeakSet\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"WeakSet\"),t,!0)}},r,!1,!0)},function(t,n,e){\"use strict\";var r=e(0),i=e(61),o=e(86),u=e(3),a=e(34),c=e(6),s=e(4),f=e(1).ArrayBuffer,l=e(49),h=o.ArrayBuffer,d=o.DataView,p=i.ABV&&f.isView,v=h.prototype.slice,g=i.VIEW;r(r.G+r.W+r.F*(f!==h),{ArrayBuffer:h}),r(r.S+r.F*!i.CONSTR,\"ArrayBuffer\",{isView:function(t){return p&&p(t)||s(t)&&g in t}}),r(r.P+r.U+r.F*e(2)((function(){return!new h(2).slice(1,void 0).byteLength})),\"ArrayBuffer\",{slice:function(t,n){if(void 0!==v&&void 0===n)return v.call(u(this),t);for(var e=u(this).byteLength,r=a(t,e),i=a(void 0===n?e:n,e),o=new(l(this,h))(c(i-r)),s=new d(this),f=new d(o),p=0;r<i;)f.setUint8(p++,s.getUint8(r++));return o}}),e(43)(\"ArrayBuffer\")},function(t,n,e){var r=e(0);r(r.G+r.W+r.F*!e(61).ABV,{DataView:e(86).DataView})},function(t,n,e){e(27)(\"Int8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}),!0)},function(t,n,e){e(27)(\"Int16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Int32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float64\",8,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){var r=e(0),i=e(20),o=e(3),u=(e(1).Reflect||{}).apply,a=Function.apply;r(r.S+r.F*!e(2)((function(){u((function(){}))})),\"Reflect\",{apply:function(t,n,e){var r=i(t),c=o(e);return u?u(r,n,c):a.call(r,n,c)}})},function(t,n,e){var r=e(0),i=e(35),o=e(20),u=e(3),a=e(4),c=e(2),s=e(103),f=(e(1).Reflect||{}).construct,l=c((function(){function t(){}return!(f((function(){}),[],t)instanceof t)})),h=!c((function(){f((function(){}))}));r(r.S+r.F*(l||h),\"Reflect\",{construct:function(t,n){o(t),u(n);var e=arguments.length<3?t:o(arguments[2]);if(h&&!l)return f(t,n,e);if(t==e){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var r=[null];return r.push.apply(r,n),new(s.apply(t,r))}var c=e.prototype,d=i(a(c)?c:Object.prototype),p=Function.apply.call(t,d,n);return a(p)?p:d}})},function(t,n,e){var r=e(9),i=e(0),o=e(3),u=e(28);i(i.S+i.F*e(2)((function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})})),\"Reflect\",{defineProperty:function(t,n,e){o(t),n=u(n,!0),o(e);try{return r.f(t,n,e),!0}catch(t){return!1}}})},function(t,n,e){var r=e(0),i=e(22).f,o=e(3);r(r.S,\"Reflect\",{deleteProperty:function(t,n){var e=i(o(t),n);return!(e&&!e.configurable)&&delete t[n]}})},function(t,n,e){\"use strict\";var r=e(0),i=e(3),o=function(t){this._t=i(t),this._i=0;var n,e=this._k=[];for(n in t)e.push(n)};e(110)(o,\"Object\",(function(){var t,n=this._k;do{if(this._i>=n.length)return{value:void 0,done:!0}}while(!((t=n[this._i++])in this._t));return{value:t,done:!1}})),r(r.S,\"Reflect\",{enumerate:function(t){return new o(t)}})},function(t,n,e){var r=e(22),i=e(37),o=e(13),u=e(0),a=e(4),c=e(3);u(u.S,\"Reflect\",{get:function t(n,e){var u,s,f=arguments.length<3?n:arguments[2];return c(n)===f?n[e]:(u=r.f(n,e))?o(u,\"value\")?u.value:void 0!==u.get?u.get.call(f):void 0:a(s=i(n))?t(s,e,f):void 0}})},function(t,n,e){var r=e(22),i=e(0),o=e(3);i(i.S,\"Reflect\",{getOwnPropertyDescriptor:function(t,n){return r.f(o(t),n)}})},function(t,n,e){var r=e(0),i=e(37),o=e(3);r(r.S,\"Reflect\",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{has:function(t,n){return n in t}})},function(t,n,e){var r=e(0),i=e(3),o=Object.isExtensible;r(r.S,\"Reflect\",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{ownKeys:e(124)})},function(t,n,e){var r=e(0),i=e(3),o=Object.preventExtensions;r(r.S,\"Reflect\",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,e){var r=e(9),i=e(22),o=e(37),u=e(13),a=e(0),c=e(30),s=e(3),f=e(4);a(a.S,\"Reflect\",{set:function t(n,e,a){var l,h,d=arguments.length<4?n:arguments[3],p=i.f(s(n),e);if(!p){if(f(h=o(n)))return t(h,e,a,d);p=c(0)}if(u(p,\"value\")){if(!1===p.writable||!f(d))return!1;if(l=i.f(d,e)){if(l.get||l.set||!1===l.writable)return!1;l.value=a,r.f(d,e,l)}else r.f(d,e,c(0,a));return!0}return void 0!==p.set&&(p.set.call(d,a),!0)}})},function(t,n,e){var r=e(0),i=e(67);i&&r(r.S,\"Reflect\",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,e){e(276),t.exports=e(7).Array.includes},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!0);r(r.P,\"Array\",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"includes\")},function(t,n,e){e(278),t.exports=e(7).Array.flatMap},function(t,n,e){\"use strict\";var r=e(0),i=e(279),o=e(10),u=e(6),a=e(20),c=e(112);r(r.P,\"Array\",{flatMap:function(t){var n,e,r=o(this);return a(t),n=u(r.length),e=c(r,0),i(e,r,r,n,0,1,t,arguments[1]),e}}),e(38)(\"flatMap\")},function(t,n,e){\"use strict\";var r=e(53),i=e(4),o=e(6),u=e(19),a=e(5)(\"isConcatSpreadable\");t.exports=function t(n,e,c,s,f,l,h,d){for(var p,v,g=f,y=0,m=!!h&&u(h,d,3);y<s;){if(y in c){if(p=m?m(c[y],y,e):c[y],v=!1,i(p)&&(v=void 0!==(v=p[a])?!!v:r(p)),v&&l>0)g=t(n,e,p,o(p.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();n[g]=p}g++}y++}return g}},function(t,n,e){e(281),t.exports=e(7).String.padStart},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,e){e(283),t.exports=e(7).String.padEnd},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,e){e(285),t.exports=e(7).String.trimLeft},function(t,n,e){\"use strict\";e(41)(\"trimLeft\",(function(t){return function(){return t(this,1)}}),\"trimStart\")},function(t,n,e){e(287),t.exports=e(7).String.trimRight},function(t,n,e){\"use strict\";e(41)(\"trimRight\",(function(t){return function(){return t(this,2)}}),\"trimEnd\")},function(t,n,e){e(289),t.exports=e(63).f(\"asyncIterator\")},function(t,n,e){e(97)(\"asyncIterator\")},function(t,n,e){e(291),t.exports=e(7).Object.getOwnPropertyDescriptors},function(t,n,e){var r=e(0),i=e(124),o=e(15),u=e(22),a=e(79);r(r.S,\"Object\",{getOwnPropertyDescriptors:function(t){for(var n,e,r=o(t),c=u.f,s=i(r),f={},l=0;s.length>l;)void 0!==(e=c(r,n=s[l++]))&&a(f,n,e);return f}})},function(t,n,e){e(293),t.exports=e(7).Object.values},function(t,n,e){var r=e(0),i=e(126)(!1);r(r.S,\"Object\",{values:function(t){return i(t)}})},function(t,n,e){e(295),t.exports=e(7).Object.entries},function(t,n,e){var r=e(0),i=e(126)(!0);r(r.S,\"Object\",{entries:function(t){return i(t)}})},function(t,n,e){\"use strict\";e(118),e(297),t.exports=e(7).Promise.finally},function(t,n,e){\"use strict\";var r=e(0),i=e(7),o=e(1),u=e(49),a=e(120);r(r.P+r.R,\"Promise\",{finally:function(t){var n=u(this,i.Promise||o.Promise),e=\"function\"==typeof t;return this.then(e?function(e){return a(n,t()).then((function(){return e}))}:t,e?function(e){return a(n,t()).then((function(){throw e}))}:t)}})},function(t,n,e){e(299),e(300),e(301),t.exports=e(7)},function(t,n,e){var r=e(1),i=e(0),o=e(59),u=[].slice,a=/MSIE .\\./.test(o),c=function(t){return function(n,e){var r=arguments.length>2,i=!!r&&u.call(arguments,2);return t(r?function(){(\"function\"==typeof n?n:Function(n)).apply(this,i)}:n,e)}};i(i.G+i.B+i.F*a,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(t,n,e){var r=e(0),i=e(85);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,e){for(var r=e(82),i=e(33),o=e(11),u=e(1),a=e(14),c=e(42),s=e(5),f=s(\"iterator\"),l=s(\"toStringTag\"),h=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),v=0;v<p.length;v++){var g,y=p[v],m=d[y],b=u[y],S=b&&b.prototype;if(S&&(S[f]||a(S,f,h),S[l]||a(S,l,y),c[y]=h,m))for(g in r)S[g]||o(S,g,r[g],!0)}},function(t,n,e){var r=function(t){\"use strict\";var n,e=Object.prototype,r=e.hasOwnProperty,i=\"function\"==typeof Symbol?Symbol:{},o=i.iterator||\"@@iterator\",u=i.asyncIterator||\"@@asyncIterator\",a=i.toStringTag||\"@@toStringTag\";function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.create(i.prototype),u=new A(r||[]);return o._invoke=function(t,n,e){var r=f;return function(i,o){if(r===h)throw new Error(\"Generator is already running\");if(r===d){if(\"throw\"===i)throw o;return E()}for(e.method=i,e.arg=o;;){var u=e.delegate;if(u){var a=x(u,e);if(a){if(a===p)continue;return a}}if(\"next\"===e.method)e.sent=e._sent=e.arg;else if(\"throw\"===e.method){if(r===f)throw r=d,e.arg;e.dispatchException(e.arg)}else\"return\"===e.method&&e.abrupt(\"return\",e.arg);r=h;var c=s(t,n,e);if(\"normal\"===c.type){if(r=e.done?d:l,c.arg===p)continue;return{value:c.arg,done:e.done}}\"throw\"===c.type&&(r=d,e.method=\"throw\",e.arg=c.arg)}}}(t,e,u),o}function s(t,n,e){try{return{type:\"normal\",arg:t.call(n,e)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=c;var f=\"suspendedStart\",l=\"suspendedYield\",h=\"executing\",d=\"completed\",p={};function v(){}function g(){}function y(){}var m={};m[o]=function(){return this};var b=Object.getPrototypeOf,S=b&&b(b(F([])));S&&S!==e&&r.call(S,o)&&(m=S);var w=y.prototype=v.prototype=Object.create(m);function _(t){[\"next\",\"throw\",\"return\"].forEach((function(n){t[n]=function(t){return this._invoke(n,t)}}))}function M(t){var n;this._invoke=function(e,i){function o(){return new Promise((function(n,o){!function n(e,i,o,u){var a=s(t[e],t,i);if(\"throw\"!==a.type){var c=a.arg,f=c.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?Promise.resolve(f.__await).then((function(t){n(\"next\",t,o,u)}),(function(t){n(\"throw\",t,o,u)})):Promise.resolve(f).then((function(t){c.value=t,o(c)}),(function(t){return n(\"throw\",t,o,u)}))}u(a.arg)}(e,i,n,o)}))}return n=n?n.then(o,o):o()}}function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=n,x(t,e),\"throw\"===e.method))return p;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return p}var i=s(r,t.iterator,e.arg);if(\"throw\"===i.type)return e.method=\"throw\",e.arg=i.arg,e.delegate=null,p;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=n),e.delegate=null,p):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,p)}function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function O(t){var n=t.completion||{};n.type=\"normal\",delete n.arg,t.completion=n}function A(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(P,this),this.reset(!0)}function F(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,u=function e(){for(;++i<t.length;)if(r.call(t,i))return e.value=t[i],e.done=!1,e;return e.value=n,e.done=!0,e};return u.next=u}}return{next:E}}function E(){return{value:n,done:!0}}return g.prototype=w.constructor=y,y.constructor=g,y[a]=g.displayName=\"GeneratorFunction\",t.isGeneratorFunction=function(t){var n=\"function\"==typeof t&&t.constructor;return!!n&&(n===g||\"GeneratorFunction\"===(n.displayName||n.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,y):(t.__proto__=y,a in t||(t[a]=\"GeneratorFunction\")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},_(M.prototype),M.prototype[u]=function(){return this},t.AsyncIterator=M,t.async=function(n,e,r,i){var o=new M(c(n,e,r,i));return t.isGeneratorFunction(e)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},_(w),w[a]=\"Generator\",w[o]=function(){return this},w.toString=function(){return\"[object Generator]\"},t.keys=function(t){var n=[];for(var e in t)n.push(e);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=F,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=n,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=n)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function i(r,i){return a.type=\"throw\",a.arg=t,e.next=r,i&&(e.method=\"next\",e.arg=n),!!i}for(var o=this.tryEntries.length-1;o>=0;--o){var u=this.tryEntries[o],a=u.completion;if(\"root\"===u.tryLoc)return i(\"end\");if(u.tryLoc<=this.prev){var c=r.call(u,\"catchLoc\"),s=r.call(u,\"finallyLoc\");if(c&&s){if(this.prev<u.catchLoc)return i(u.catchLoc,!0);if(this.prev<u.finallyLoc)return i(u.finallyLoc)}else if(c){if(this.prev<u.catchLoc)return i(u.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<u.finallyLoc)return i(u.finallyLoc)}}}},abrupt:function(t,n){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc<=this.prev&&r.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var o=i;break}}o&&(\"break\"===t||\"continue\"===t)&&o.tryLoc<=n&&n<=o.finallyLoc&&(o=null);var u=o?o.completion:{};return u.type=t,u.arg=n,o?(this.method=\"next\",this.next=o.finallyLoc,p):this.complete(u)},complete:function(t,n){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&n&&(this.next=n),p},finish:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),O(e),p}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc===t){var r=e.completion;if(\"throw\"===r.type){var i=r.arg;O(e)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:F(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=n),p}},t}(t.exports);try{regeneratorRuntime=r}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(r)}},function(t,n,e){e(304),t.exports=e(127).global},function(t,n,e){var r=e(305);r(r.G,{global:e(87)})},function(t,n,e){var r=e(87),i=e(127),o=e(306),u=e(308),a=e(315),c=function(t,n,e){var s,f,l,h=t&c.F,d=t&c.G,p=t&c.S,v=t&c.P,g=t&c.B,y=t&c.W,m=d?i:i[n]||(i[n]={}),b=m.prototype,S=d?r:p?r[n]:(r[n]||{}).prototype;for(s in d&&(e=n),e)(f=!h&&S&&void 0!==S[s])&&a(m,s)||(l=f?S[s]:e[s],m[s]=d&&\"function\"!=typeof S[s]?e[s]:g&&f?o(l,r):y&&S[s]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n.prototype=t.prototype,n}(l):v&&\"function\"==typeof l?o(Function.call,l):l,v&&((m.virtual||(m.virtual={}))[s]=l,t&c.R&&b&&!b[s]&&u(b,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n,e){var r=e(307);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n,e){var r=e(309),i=e(314);t.exports=e(89)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(310),i=e(311),o=e(313),u=Object.defineProperty;n.f=e(89)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(88);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n,e){t.exports=!e(89)&&!e(128)((function(){return 7!=Object.defineProperty(e(312)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(88),i=e(87).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){var r=e(88);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}}])}));\n    \n\n// begin:./golly/golly.js\n/* golly.js : v0.0.1 on 09/12/2012\n* http://dannygarcia.github.com/golly/\n* Copyright (c) 2012 Danny Garcia; Licensed MIT */\n\n/* changes by Ben Fisher 2017:\n    add event for resize.\n    remove support for mousedrag.\n    remove misleading 'key' because it's not actually the key\n    etc.\n    new options:\n        'eatallkeyevents'\n        'enablecontextmenu'\n        'includeallmousemoveevents'\n*/\n\n// Base\nwindow['GOLLY'] = function(params) {\n\n    if ( !params ) {\n        params = {};\n    }\n\n    // Do we support canvas?\n    if ( !document.createElement('canvas').getContext ) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    var _this = this,\n        k = 1e3,\n        _privateParts =\n        {\n            'ctx' : undefined,\n            'domElement' : undefined,\n            'width' : undefined,\n            'height' : undefined,\n            'desiredFrameTime' : k/60,\n            'frameCount' : 0,\n            'milliseconds' : 0,\n            'pmouseX' : 0,\n            'pmouseY' : 0,\n            'eatallkeyevents': params['eatallkeyevents'] === true,\n            'includeallmousemoveevents': params['includeallmousemoveevents'] === true,\n            'offset' : {x:0, y:0}\n        },\n        _actualFrameTime,\n        d; // shorthand for the dom element\n\n    var getOffset = function() {\n        var obj = d;\n        var x = 0, y = 0;\n        while (obj) {\n            y += obj.offsetTop;\n            x += obj.offsetLeft;\n            obj = obj.offsetParent;\n        }\n        _privateParts['offset'].x = x;\n        _privateParts['offset'].y = y;\n    };\n\n    // Default parameters\n\n    if ( !params['context'] ) {\n        params['context'] = '2d';\n    }\n\n\n    // Create domElement, grab context\n\n    d = _privateParts['domElement'] = document.createElement('canvas');\n    _privateParts['ctx'] = d.getContext( params['context'] );\n\n    // Are we capable of this context?\n\n    if (_privateParts['ctx'] === null) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    // Set up width and height setters / listeners\n    \n    if ( params['customsizing'] ) {\n        // mode introduced by Ben Fisher, 2017.\n        var onResize = function() {\n            getOffset();\n            if (_this['onresize']) {\n                return _this['onresize']();\n            }\n        }\n        \n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n        document.body.style.margin = '0px';\n        document.body.style.padding = '0px';\n        document.body.style.overflow = 'hidden';\n        params['container'] = document.body;\n        \n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n    }\n    else if ( params['fullscreen'] ) {\n\n        var onResize = function() {\n\n            getOffset();\n\n            if ( params['width'] ) {\n                _privateParts['width'] = d['width'] = params['width'];\n            } else {\n                _privateParts['width'] = d['width'] = window.innerWidth;\n            }\n\n            if ( params['height'] ) {\n                _privateParts['height'] = d['height'] = params['height'];\n            } else {\n\n                _privateParts['height'] = d['height'] = window.innerHeight;\n            }\n\n            if ( !_this.loop ) {\n                if ( _this['draw'] ) {\n                    _this['draw']();\n                }\n            }\n        };\n\n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n\n        if ( !params['container'] ) {\n            document.body.style.margin = '0px';\n            document.body.style.padding = '0px';\n            document.body.style.overflow = 'hidden';\n        }\n\n        params['container'] = params['container'] || document.body;\n\n\n    } else {\n\n        if ( !params['width'] ) {\n            params['width'] = 500;\n        }\n\n        if ( !params['height'] ) {\n            params['height'] = 500;\n        }\n\n\n\n        window.addEventListener( 'resize', getOffset, false );\n        getOffset();\n\n\n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n\n        _this['width'] = params['width'];\n        _this['height'] = params['height'];\n\n    }\n\n    // Put it where we talked about (if we talked about it).\n\n    if ( params['container'] ) {\n        if ( params['fnaddtodom'] ) {\n            params['fnaddtodom'](params['container'], d);\n        } else {\n            params['container'].appendChild(d);\n        }\n        getOffset();\n    }\n\n    var getter = function(n) {\n        _this.__defineGetter__(n, function() {\n            return _privateParts[n];\n        });\n    };\n\n    // Would love to reduce this to params.\n\n    getter('ctx');\n    getter('domElement');\n    getter('width');\n    getter('height');\n    getter('frameCount');\n    getter('milliseconds');\n    getter('pmouseX');\n    getter('pmouseY');\n\n    var no_op = function() {};\n\n    _this['loop'] = true;\n    _this['draw'] = no_op;\n    _this['onresize'] = no_op;\n    _this['keydown'] = no_op;\n    _this['keyup'] = no_op;\n    _this['mousedown'] = no_op;\n    _this['mouseup'] = no_op;\n    _this['mousemove'] = no_op;\n\n    // Custom Getters & Setters\n    _this.__defineGetter__('frameRate', function(v) {\n        return 1E3/_actualFrameTime;\n    });\n\n    _this.__defineGetter__('frameTime', function(v) {\n        return _actualFrameTime;\n    });\n\n    _this.__defineSetter__('frameTime', function(v) {\n        _privateParts['desiredFrameTime'] = v;\n    });\n\n    _this.__defineSetter__('frameRate', function(v) {\n        _privateParts['desiredFrameTime'] = k/v;\n    });\n    \n    // Disable context menu\n    if (!params['enablecontextmenu']) {\n        _privateParts['domElement'].oncontextmenu = function (e) {\n            e.preventDefault();\n            return false;\n        };\n    }\n\n    // Listeners\n    window.addEventListener('keydown', function(e) {\n        // note -- requires a fairly recent standards-compliant browser\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keydown'](keycode, keychar, e.repeat, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n    \n    window.addEventListener('keyup', function(e) {\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keyup'](keycode, keychar, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n\n    _privateParts['domElement'].addEventListener('mousedown', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mousedown'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    _privateParts['domElement'].addEventListener('mouseup', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mouseup'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    let listenOn = _privateParts['domElement']\n    if (_privateParts['includeallmousemoveevents']) {\n        listenOn = window\n    }\n\n    listenOn.addEventListener('mousemove', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        _this['mousemove'](x, y, e.button, e.buttons, _privateParts['pmouseX'], _privateParts['pmouseY'], e.ctrlKey, e.altKey, e.shiftKey);\n        _privateParts['pmouseX'] = x;\n        _privateParts['pmouseY'] = y;\n    }, false);\n\n    // Internal loop.\n    if (params['trackFrameTime'] === false) {\n        _privateParts['_idraw'] = function(milliseconds) {\n            _privateParts['milliseconds'] = milliseconds;\n            _privateParts['frameCount']++;\n            _this['draw']();\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw'](performance.now());\n        \n    } else {\n        window.requestAnimationFrame = (function(){\n            return window.requestAnimationFrame   ||\n                window.webkitRequestAnimationFrame ||\n                window.mozRequestAnimationFrame    ||\n                window.oRequestAnimationFrame      ||\n                window.msRequestAnimationFrame     ||\n                function( callback ){\n                    window.setTimeout(callback, 1000 / 60);\n                };\n        }());\n\n        _privateParts['_idraw'] = function() {\n            _privateParts['frameCount']++;\n            var prev = new Date().getTime();\n            _this['draw']();\n            var delta = new Date().getTime() - prev;\n\n            if (delta > _privateParts['desiredFrameTime']) {\n                _actualFrameTime = delta;\n            } else {\n                _actualFrameTime = _privateParts['desiredFrameTime'];\n            }\n\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw']();\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/external/externalmanualbundlemin.js",
    "content": "\n// externalmanualbundle\n// changes here will be overwritten\n\n\n\n// begin:./base64-js-1.3.1/base64js.min.js\n(function(r){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=r()}else if(typeof define===\"function\"&&define.amd){define([],r)}else{var e;if(typeof window!==\"undefined\"){e=window}else if(typeof global!==\"undefined\"){e=global}else if(typeof self!==\"undefined\"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function r(e,n,t){function o(f,i){if(!n[f]){if(!e[f]){var u=\"function\"==typeof require&&require;if(!i&&u)return u(f,!0);if(a)return a(f,!0);var v=new Error(\"Cannot find module '\"+f+\"'\");throw v.code=\"MODULE_NOT_FOUND\",v}var d=n[f]={exports:{}};e[f][0].call(d.exports,function(r){var n=e[f][1][r];return o(n||r)},d,d.exports,r,e,n,t)}return n[f].exports}for(var a=\"function\"==typeof require&&require,f=0;f<t.length;f++)o(t[f]);return o}return r}()({\"/\":[function(r,e,n){\"use strict\";n.byteLength=d;n.toByteArray=h;n.fromByteArray=p;var t=[];var o=[];var a=typeof Uint8Array!==\"undefined\"?Uint8Array:Array;var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";for(var i=0,u=f.length;i<u;++i){t[i]=f[i];o[f.charCodeAt(i)]=i}o[\"-\".charCodeAt(0)]=62;o[\"_\".charCodeAt(0)]=63;function v(r){var e=r.length;if(e%4>0){throw new Error(\"Invalid string. Length must be a multiple of 4\")}var n=r.indexOf(\"=\");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function d(r){var e=v(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function c(r,e,n){return(e+n)*3/4-n}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));var u=0;var d=f>0?t-4:t;for(var h=0;h<d;h+=4){e=o[r.charCodeAt(h)]<<18|o[r.charCodeAt(h+1)]<<12|o[r.charCodeAt(h+2)]<<6|o[r.charCodeAt(h+3)];i[u++]=e>>16&255;i[u++]=e>>8&255;i[u++]=e&255}if(f===2){e=o[r.charCodeAt(h)]<<2|o[r.charCodeAt(h+1)]>>4;i[u++]=e&255}if(f===1){e=o[r.charCodeAt(h)]<<10|o[r.charCodeAt(h+1)]<<4|o[r.charCodeAt(h+2)]>>2;i[u++]=e>>8&255;i[u++]=e&255}return i}function s(r){return t[r>>18&63]+t[r>>12&63]+t[r>>6&63]+t[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join(\"\")}function p(r){var e;var n=r.length;var o=n%3;var a=[];var f=16383;for(var i=0,u=n-o;i<u;i+=f){a.push(l(r,i,i+f>u?u:i+f))}if(o===1){e=r[n-1];a.push(t[e>>2]+t[e<<4&63]+\"==\")}else if(o===2){e=(r[n-2]<<8)+r[n-1];a.push(t[e>>10]+t[e>>4&63]+t[e<<2&63]+\"=\")}return a.join(\"\")}},{}]},{},[])(\"/\")});\n\n\n// begin:./bowser-2.9/bowser-2.9-bundled.js\n!function(t,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define([],n):\"object\"==typeof exports?exports.bowser=n():t.bowser=n()}(this,(function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&n&&\"string\"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p=\"\",e(e.s=129)}([function(t,n,e){var r=e(1),i=e(7),o=e(14),u=e(11),a=e(19),c=function(t,n,e){var s,f,l,h,d=t&c.F,p=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,m=p?r:v?r[n]||(r[n]={}):(r[n]||{}).prototype,b=p?i:i[n]||(i[n]={}),S=b.prototype||(b.prototype={});for(s in p&&(e=n),e)l=((f=!d&&m&&void 0!==m[s])?m:e)[s],h=y&&f?a(l,r):g&&\"function\"==typeof l?a(Function.call,l):l,m&&u(m,s,l,t&c.U),b[s]!=l&&o(b,s,h),g&&S[s]!=l&&(S[s]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(4);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){var r=e(50)(\"wks\"),i=e(31),o=e(1).Symbol,u=\"function\"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)(\"Symbol.\"+t))}).store=r},function(t,n,e){var r=e(21),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n,e){t.exports=!e(2)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),i=e(96),o=e(28),u=Object.defineProperty;n.f=e(8)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(26);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(1),i=e(14),o=e(13),u=e(31)(\"src\"),a=e(134),c=(\"\"+a).split(\"toString\");e(7).inspectSource=function(t){return a.call(t)},(t.exports=function(t,n,e,a){var s=\"function\"==typeof e;s&&(o(e,\"name\")||i(e,\"name\",n)),t[n]!==e&&(s&&(o(e,u)||i(e,u,t[n]?\"\"+t[n]:c.join(String(n)))),t===r?t[n]=e:a?t[n]?t[n]=e:i(t,n,e):(delete t[n],i(t,n,e)))})(Function.prototype,\"toString\",(function(){return\"function\"==typeof this&&this[u]||a.call(this)}))},function(t,n,e){var r=e(0),i=e(2),o=e(26),u=/\"/g,a=function(t,n,e,r){var i=String(o(t)),a=\"<\"+n;return\"\"!==e&&(a+=\" \"+e+'=\"'+String(r).replace(u,\"&quot;\")+'\"'),a+\">\"+i+\"</\"+n+\">\"};t.exports=function(t,n){var e={};e[t]=n(a),r(r.P+r.F*i((function(){var n=\"\"[t]('\"');return n!==n.toLowerCase()||n.split('\"').length>3})),\"String\",e)}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(9),i=e(30);t.exports=e(8)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(46),i=e(26);t.exports=function(t){return r(i(t))}},function(t,n,e){\"use strict\";var r=e(2);t.exports=function(t,n){return!!t&&r((function(){n?t.call(null,(function(){}),1):t.call(null)}))}},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=e(18),i=function(){function t(){}return t.getFirstMatch=function(t,n){var e=n.match(t);return e&&e.length>0&&e[1]||\"\"},t.getSecondMatch=function(t,n){var e=n.match(t);return e&&e.length>1&&e[2]||\"\"},t.matchAndReturnConst=function(t,n,e){if(t.test(n))return e},t.getWindowsVersionName=function(t){switch(t){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},t.getMacOSVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),10===n[0])switch(n[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},t.getAndroidVersionName=function(t){var n=t.split(\".\").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),!(1===n[0]&&n[1]<5))return 1===n[0]&&n[1]<6?\"Cupcake\":1===n[0]&&n[1]>=6?\"Donut\":2===n[0]&&n[1]<2?\"Eclair\":2===n[0]&&2===n[1]?\"Froyo\":2===n[0]&&n[1]>2?\"Gingerbread\":3===n[0]?\"Honeycomb\":4===n[0]&&n[1]<1?\"Ice Cream Sandwich\":4===n[0]&&n[1]<4?\"Jelly Bean\":4===n[0]&&n[1]>=4?\"KitKat\":5===n[0]?\"Lollipop\":6===n[0]?\"Marshmallow\":7===n[0]?\"Nougat\":8===n[0]?\"Oreo\":9===n[0]?\"Pie\":void 0},t.getVersionPrecision=function(t){return t.split(\".\").length},t.compareVersions=function(n,e,r){void 0===r&&(r=!1);var i=t.getVersionPrecision(n),o=t.getVersionPrecision(e),u=Math.max(i,o),a=0,c=t.map([n,e],(function(n){var e=u-t.getVersionPrecision(n),r=n+new Array(e+1).join(\".0\");return t.map(r.split(\".\"),(function(t){return new Array(20-t.length).join(\"0\")+t})).reverse()}));for(r&&(a=u-Math.min(i,o)),u-=1;u>=a;){if(c[0][u]>c[1][u])return 1;if(c[0][u]===c[1][u]){if(u===a)return 0;u-=1}else if(c[0][u]<c[1][u])return-1}},t.map=function(t,n){var e,r=[];if(Array.prototype.map)return Array.prototype.map.call(t,n);for(e=0;e<t.length;e+=1)r.push(n(t[e]));return r},t.find=function(t,n){var e,r;if(Array.prototype.find)return Array.prototype.find.call(t,n);for(e=0,r=t.length;e<r;e+=1){var i=t[e];if(n(i,e))return i}},t.assign=function(t){for(var n,e,r=t,i=arguments.length,o=new Array(i>1?i-1:0),u=1;u<i;u++)o[u-1]=arguments[u];if(Object.assign)return Object.assign.apply(Object,[t].concat(o));var a=function(){var t=o[n];\"object\"==typeof t&&null!==t&&Object.keys(t).forEach((function(n){r[n]=t[n]}))};for(n=0,e=o.length;n<e;n+=1)a();return t},t.getBrowserAlias=function(t){return r.BROWSER_ALIASES_MAP[t]},t.getBrowserTypeByAlias=function(t){return r.BROWSER_MAP[t]||\"\"},t}();n.default=i,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.ENGINE_MAP=n.OS_MAP=n.PLATFORMS_MAP=n.BROWSER_MAP=n.BROWSER_ALIASES_MAP=void 0;n.BROWSER_ALIASES_MAP={\"Amazon Silk\":\"amazon_silk\",\"Android Browser\":\"android\",Bada:\"bada\",BlackBerry:\"blackberry\",Chrome:\"chrome\",Chromium:\"chromium\",Electron:\"electron\",Epiphany:\"epiphany\",Firefox:\"firefox\",Focus:\"focus\",Generic:\"generic\",\"Google Search\":\"google_search\",Googlebot:\"googlebot\",\"Internet Explorer\":\"ie\",\"K-Meleon\":\"k_meleon\",Maxthon:\"maxthon\",\"Microsoft Edge\":\"edge\",\"MZ Browser\":\"mz\",\"NAVER Whale Browser\":\"naver\",Opera:\"opera\",\"Opera Coast\":\"opera_coast\",PhantomJS:\"phantomjs\",Puffin:\"puffin\",QupZilla:\"qupzilla\",QQ:\"qq\",QQLite:\"qqlite\",Safari:\"safari\",Sailfish:\"sailfish\",\"Samsung Internet for Android\":\"samsung_internet\",SeaMonkey:\"seamonkey\",Sleipnir:\"sleipnir\",Swing:\"swing\",Tizen:\"tizen\",\"UC Browser\":\"uc\",Vivaldi:\"vivaldi\",\"WebOS Browser\":\"webos\",WeChat:\"wechat\",\"Yandex Browser\":\"yandex\",Roku:\"roku\"};n.BROWSER_MAP={amazon_silk:\"Amazon Silk\",android:\"Android Browser\",bada:\"Bada\",blackberry:\"BlackBerry\",chrome:\"Chrome\",chromium:\"Chromium\",electron:\"Electron\",epiphany:\"Epiphany\",firefox:\"Firefox\",focus:\"Focus\",generic:\"Generic\",googlebot:\"Googlebot\",google_search:\"Google Search\",ie:\"Internet Explorer\",k_meleon:\"K-Meleon\",maxthon:\"Maxthon\",edge:\"Microsoft Edge\",mz:\"MZ Browser\",naver:\"NAVER Whale Browser\",opera:\"Opera\",opera_coast:\"Opera Coast\",phantomjs:\"PhantomJS\",puffin:\"Puffin\",qupzilla:\"QupZilla\",qq:\"QQ Browser\",qqlite:\"QQ Browser Lite\",safari:\"Safari\",sailfish:\"Sailfish\",samsung_internet:\"Samsung Internet for Android\",seamonkey:\"SeaMonkey\",sleipnir:\"Sleipnir\",swing:\"Swing\",tizen:\"Tizen\",uc:\"UC Browser\",vivaldi:\"Vivaldi\",webos:\"WebOS Browser\",wechat:\"WeChat\",yandex:\"Yandex Browser\"};n.PLATFORMS_MAP={tablet:\"tablet\",mobile:\"mobile\",desktop:\"desktop\",tv:\"tv\"};n.OS_MAP={WindowsPhone:\"Windows Phone\",Windows:\"Windows\",MacOS:\"macOS\",iOS:\"iOS\",Android:\"Android\",WebOS:\"WebOS\",BlackBerry:\"BlackBerry\",Bada:\"Bada\",Tizen:\"Tizen\",Linux:\"Linux\",ChromeOS:\"Chrome OS\",PlayStation4:\"PlayStation 4\",Roku:\"Roku\"};n.ENGINE_MAP={EdgeHTML:\"EdgeHTML\",Blink:\"Blink\",Trident:\"Trident\",Presto:\"Presto\",Gecko:\"Gecko\",WebKit:\"WebKit\"}},function(t,n,e){var r=e(20);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(47),i=e(30),o=e(15),u=e(28),a=e(13),c=e(96),s=Object.getOwnPropertyDescriptor;n.f=e(8)?s:function(t,n){if(t=o(t),n=u(n,!0),c)try{return s(t,n)}catch(t){}if(a(t,n))return i(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(0),i=e(7),o=e(2);t.exports=function(t,n){var e=(i.Object||{})[t]||Object[t],u={};u[t]=n(e),r(r.S+r.F*o((function(){e(1)})),\"Object\",u)}},function(t,n,e){var r=e(19),i=e(46),o=e(10),u=e(6),a=e(112);t.exports=function(t,n){var e=1==t,c=2==t,s=3==t,f=4==t,l=6==t,h=5==t||l,d=n||a;return function(n,a,p){for(var v,g,y=o(n),m=i(y),b=r(a,p,3),S=u(m.length),w=0,_=e?d(n,S):c?d(n,0):void 0;S>w;w++)if((h||w in m)&&(g=b(v=m[w],w,y),t))if(e)_[w]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:_.push(v)}else if(f)return!1;return l?-1:s||f?f:_}}},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError(\"Can't call method on  \"+t);return t}},function(t,n,e){\"use strict\";if(e(8)){var r=e(32),i=e(1),o=e(2),u=e(0),a=e(61),c=e(86),s=e(19),f=e(44),l=e(30),h=e(14),d=e(45),p=e(21),v=e(6),g=e(123),y=e(34),m=e(28),b=e(13),S=e(48),w=e(4),_=e(10),M=e(78),x=e(35),P=e(37),O=e(36).f,A=e(80),F=e(31),E=e(5),N=e(24),R=e(51),k=e(49),T=e(82),I=e(42),j=e(54),L=e(43),B=e(81),C=e(114),W=e(9),V=e(22),G=W.f,D=V.f,U=i.RangeError,z=i.TypeError,q=i.Uint8Array,K=Array.prototype,Y=c.ArrayBuffer,Q=c.DataView,H=N(0),J=N(2),X=N(3),Z=N(4),$=N(5),tt=N(6),nt=R(!0),et=R(!1),rt=T.values,it=T.keys,ot=T.entries,ut=K.lastIndexOf,at=K.reduce,ct=K.reduceRight,st=K.join,ft=K.sort,lt=K.slice,ht=K.toString,dt=K.toLocaleString,pt=E(\"iterator\"),vt=E(\"toStringTag\"),gt=F(\"typed_constructor\"),yt=F(\"def_constructor\"),mt=a.CONSTR,bt=a.TYPED,St=a.VIEW,wt=N(1,(function(t,n){return Ot(k(t,t[yt]),n)})),_t=o((function(){return 1===new q(new Uint16Array([1]).buffer)[0]})),Mt=!!q&&!!q.prototype.set&&o((function(){new q(1).set({})})),xt=function(t,n){var e=p(t);if(e<0||e%n)throw U(\"Wrong offset!\");return e},Pt=function(t){if(w(t)&&bt in t)return t;throw z(t+\" is not a typed array!\")},Ot=function(t,n){if(!(w(t)&&gt in t))throw z(\"It is not a typed array constructor!\");return new t(n)},At=function(t,n){return Ft(k(t,t[yt]),n)},Ft=function(t,n){for(var e=0,r=n.length,i=Ot(t,r);r>e;)i[e]=n[e++];return i},Et=function(t,n,e){G(t,n,{get:function(){return this._d[e]}})},Nt=function(t){var n,e,r,i,o,u,a=_(t),c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=A(a);if(null!=h&&!M(h)){for(u=h.call(a),r=[],n=0;!(o=u.next()).done;n++)r.push(o.value);a=r}for(l&&c>2&&(f=s(f,arguments[2],2)),n=0,e=v(a.length),i=Ot(this,e);e>n;n++)i[n]=l?f(a[n],n):a[n];return i},Rt=function(){for(var t=0,n=arguments.length,e=Ot(this,n);n>t;)e[t]=arguments[t++];return e},kt=!!q&&o((function(){dt.call(new q(1))})),Tt=function(){return dt.apply(kt?lt.call(Pt(this)):Pt(this),arguments)},It={copyWithin:function(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return B.apply(Pt(this),arguments)},filter:function(t){return At(this,J(Pt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return $(Pt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){H(Pt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return et(Pt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return st.apply(Pt(this),arguments)},lastIndexOf:function(t){return ut.apply(Pt(this),arguments)},map:function(t){return wt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return at.apply(Pt(this),arguments)},reduceRight:function(t){return ct.apply(Pt(this),arguments)},reverse:function(){for(var t,n=Pt(this).length,e=Math.floor(n/2),r=0;r<e;)t=this[r],this[r++]=this[--n],this[n]=t;return this},some:function(t){return X(Pt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ft.call(Pt(this),t)},subarray:function(t,n){var e=Pt(this),r=e.length,i=y(t,r);return new(k(e,e[yt]))(e.buffer,e.byteOffset+i*e.BYTES_PER_ELEMENT,v((void 0===n?r:y(n,r))-i))}},jt=function(t,n){return At(this,lt.call(Pt(this),t,n))},Lt=function(t){Pt(this);var n=xt(arguments[1],1),e=this.length,r=_(t),i=v(r.length),o=0;if(i+n>e)throw U(\"Wrong length!\");for(;o<i;)this[n+o]=r[o++]},Bt={entries:function(){return ot.call(Pt(this))},keys:function(){return it.call(Pt(this))},values:function(){return rt.call(Pt(this))}},Ct=function(t,n){return w(t)&&t[bt]&&\"symbol\"!=typeof n&&n in t&&String(+n)==String(n)},Wt=function(t,n){return Ct(t,n=m(n,!0))?l(2,t[n]):D(t,n)},Vt=function(t,n,e){return!(Ct(t,n=m(n,!0))&&w(e)&&b(e,\"value\"))||b(e,\"get\")||b(e,\"set\")||e.configurable||b(e,\"writable\")&&!e.writable||b(e,\"enumerable\")&&!e.enumerable?G(t,n,e):(t[n]=e.value,t)};mt||(V.f=Wt,W.f=Vt),u(u.S+u.F*!mt,\"Object\",{getOwnPropertyDescriptor:Wt,defineProperty:Vt}),o((function(){ht.call({})}))&&(ht=dt=function(){return st.call(this)});var Gt=d({},It);d(Gt,Bt),h(Gt,pt,Bt.values),d(Gt,{slice:jt,set:Lt,constructor:function(){},toString:ht,toLocaleString:Tt}),Et(Gt,\"buffer\",\"b\"),Et(Gt,\"byteOffset\",\"o\"),Et(Gt,\"byteLength\",\"l\"),Et(Gt,\"length\",\"e\"),G(Gt,vt,{get:function(){return this[bt]}}),t.exports=function(t,n,e,c){var s=t+((c=!!c)?\"Clamped\":\"\")+\"Array\",l=\"get\"+t,d=\"set\"+t,p=i[s],y=p||{},m=p&&P(p),b=!p||!a.ABV,_={},M=p&&p.prototype,A=function(t,e){G(t,e,{get:function(){return function(t,e){var r=t._d;return r.v[l](e*n+r.o,_t)}(this,e)},set:function(t){return function(t,e,r){var i=t._d;c&&(r=(r=Math.round(r))<0?0:r>255?255:255&r),i.v[d](e*n+i.o,r,_t)}(this,e,t)},enumerable:!0})};b?(p=e((function(t,e,r,i){f(t,p,s,\"_d\");var o,u,a,c,l=0,d=0;if(w(e)){if(!(e instanceof Y||\"ArrayBuffer\"==(c=S(e))||\"SharedArrayBuffer\"==c))return bt in e?Ft(p,e):Nt.call(p,e);o=e,d=xt(r,n);var y=e.byteLength;if(void 0===i){if(y%n)throw U(\"Wrong length!\");if((u=y-d)<0)throw U(\"Wrong length!\")}else if((u=v(i)*n)+d>y)throw U(\"Wrong length!\");a=u/n}else a=g(e),o=new Y(u=a*n);for(h(t,\"_d\",{b:o,o:d,l:u,e:a,v:new Q(o)});l<a;)A(t,l++)})),M=p.prototype=x(Gt),h(M,\"constructor\",p)):o((function(){p(1)}))&&o((function(){new p(-1)}))&&j((function(t){new p,new p(null),new p(1.5),new p(t)}),!0)||(p=e((function(t,e,r,i){var o;return f(t,p,s),w(e)?e instanceof Y||\"ArrayBuffer\"==(o=S(e))||\"SharedArrayBuffer\"==o?void 0!==i?new y(e,xt(r,n),i):void 0!==r?new y(e,xt(r,n)):new y(e):bt in e?Ft(p,e):Nt.call(p,e):new y(g(e))})),H(m!==Function.prototype?O(y).concat(O(m)):O(y),(function(t){t in p||h(p,t,y[t])})),p.prototype=M,r||(M.constructor=p));var F=M[pt],E=!!F&&(\"values\"==F.name||null==F.name),N=Bt.values;h(p,gt,!0),h(M,bt,s),h(M,St,!0),h(M,yt,p),(c?new p(1)[vt]==s:vt in M)||G(M,vt,{get:function(){return s}}),_[s]=p,u(u.G+u.W+u.F*(p!=y),_),u(u.S,s,{BYTES_PER_ELEMENT:n}),u(u.S+u.F*o((function(){y.of.call(p,1)})),s,{from:Nt,of:Rt}),\"BYTES_PER_ELEMENT\"in M||h(M,\"BYTES_PER_ELEMENT\",n),u(u.P,s,It),L(s),u(u.P+u.F*Mt,s,{set:Lt}),u(u.P+u.F*!E,s,Bt),r||M.toString==ht||(M.toString=ht),u(u.P+u.F*o((function(){new p(1).slice()})),s,{slice:jt}),u(u.P+u.F*(o((function(){return[1,2].toLocaleString()!=new p([1,2]).toLocaleString()}))||!o((function(){M.toLocaleString.call([1,2])}))),s,{toLocaleString:Tt}),I[s]=E?F:N,r||E||h(M,pt,N)}}else t.exports=function(){}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n,e){var r=e(31)(\"meta\"),i=e(4),o=e(13),u=e(9).f,a=0,c=Object.isExtensible||function(){return!0},s=!e(2)((function(){return c(Object.preventExtensions({}))})),f=function(t){u(t,r,{value:{i:\"O\"+ ++a,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,n){if(!i(t))return\"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!o(t,r)){if(!c(t))return\"F\";if(!n)return\"E\";f(t)}return t[r].i},getWeak:function(t,n){if(!o(t,r)){if(!c(t))return!0;if(!n)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&c(t)&&!o(t,r)&&f(t),t}}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return\"Symbol(\".concat(void 0===t?\"\":t,\")_\",(++e+r).toString(36))}},function(t,n){t.exports=!1},function(t,n,e){var r=e(98),i=e(65);t.exports=Object.keys||function(t){return r(t,i)}},function(t,n,e){var r=e(21),i=Math.max,o=Math.min;t.exports=function(t,n){return(t=r(t))<0?i(t+n,0):o(t,n)}},function(t,n,e){var r=e(3),i=e(99),o=e(65),u=e(64)(\"IE_PROTO\"),a=function(){},c=function(){var t,n=e(62)(\"iframe\"),r=o.length;for(n.style.display=\"none\",e(66).appendChild(n),n.src=\"javascript:\",(t=n.contentWindow.document).open(),t.write(\"<script>document.F=Object<\\/script>\"),t.close(),c=t.F;r--;)delete c.prototype[o[r]];return c()};t.exports=Object.create||function(t,n){var e;return null!==t?(a.prototype=r(t),e=new a,a.prototype=null,e[u]=t):e=c(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(98),i=e(65).concat(\"length\",\"prototype\");n.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,n,e){var r=e(13),i=e(10),o=e(64)(\"IE_PROTO\"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(5)(\"unscopables\"),i=Array.prototype;null==i[r]&&e(14)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t)||t._t!==n)throw TypeError(\"Incompatible receiver, \"+n+\" required!\");return t}},function(t,n,e){var r=e(9).f,i=e(13),o=e(5)(\"toStringTag\");t.exports=function(t,n,e){t&&!i(t=e?t:t.prototype,o)&&r(t,o,{configurable:!0,value:n})}},function(t,n,e){var r=e(0),i=e(26),o=e(2),u=e(68),a=\"[\"+u+\"]\",c=RegExp(\"^\"+a+a+\"*\"),s=RegExp(a+a+\"*$\"),f=function(t,n,e){var i={},a=o((function(){return!!u[t]()||\"​\"!=\"​\"[t]()})),c=i[t]=a?n(l):u[t];e&&(i[e]=c),r(r.P+r.F*a,\"String\",i)},l=f.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(c,\"\")),2&n&&(t=t.replace(s,\"\")),t};t.exports=f},function(t,n){t.exports={}},function(t,n,e){\"use strict\";var r=e(1),i=e(9),o=e(8),u=e(5)(\"species\");t.exports=function(t){var n=r[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,r){if(!(t instanceof n)||void 0!==r&&r in t)throw TypeError(e+\": incorrect invocation!\");return t}},function(t,n,e){var r=e(11);t.exports=function(t,n,e){for(var i in n)r(t,i,n[i],e);return t}},function(t,n,e){var r=e(25);t.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(t){return\"String\"==r(t)?t.split(\"\"):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(25),i=e(5)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}());t.exports=function(t){var n,e,u;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:o?r(n):\"Object\"==(u=r(n))&&\"function\"==typeof n.callee?\"Arguments\":u}},function(t,n,e){var r=e(3),i=e(20),o=e(5)(\"species\");t.exports=function(t,n){var e,u=r(t).constructor;return void 0===u||null==(e=r(u)[o])?n:i(e)}},function(t,n,e){var r=e(7),i=e(1),o=i[\"__core-js_shared__\"]||(i[\"__core-js_shared__\"]={});(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})(\"versions\",[]).push({version:r.version,mode:e(32)?\"pure\":\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})},function(t,n,e){var r=e(15),i=e(6),o=e(34);t.exports=function(t){return function(n,e,u){var a,c=r(n),s=i(c.length),f=o(u,s);if(t&&e!=e){for(;s>f;)if((a=c[f++])!=a)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===e)return t||f||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(25);t.exports=Array.isArray||function(t){return\"Array\"==r(t)}},function(t,n,e){var r=e(5)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var e=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:e=!0}},o[r]=function(){return u},t(o)}catch(t){}return e}},function(t,n,e){\"use strict\";var r=e(3);t.exports=function(){var t=r(this),n=\"\";return t.global&&(n+=\"g\"),t.ignoreCase&&(n+=\"i\"),t.multiline&&(n+=\"m\"),t.unicode&&(n+=\"u\"),t.sticky&&(n+=\"y\"),n}},function(t,n,e){\"use strict\";var r=e(48),i=RegExp.prototype.exec;t.exports=function(t,n){var e=t.exec;if(\"function\"==typeof e){var o=e.call(t,n);if(\"object\"!=typeof o)throw new TypeError(\"RegExp exec method returned something other than an Object or null\");return o}if(\"RegExp\"!==r(t))throw new TypeError(\"RegExp#exec called on incompatible receiver\");return i.call(t,n)}},function(t,n,e){\"use strict\";e(116);var r=e(11),i=e(14),o=e(2),u=e(26),a=e(5),c=e(83),s=a(\"species\"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")})),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e=\"ab\".split(t);return 2===e.length&&\"a\"===e[0]&&\"b\"===e[1]}();t.exports=function(t,n,e){var h=a(t),d=!o((function(){var n={};return n[h]=function(){return 7},7!=\"\"[t](n)})),p=d?!o((function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},\"split\"===t&&(e.constructor={},e.constructor[s]=function(){return e}),e[h](\"\"),!n})):void 0;if(!d||!p||\"replace\"===t&&!f||\"split\"===t&&!l){var v=/./[h],g=e(u,h,\"\"[t],(function(t,n,e,r,i){return n.exec===c?d&&!i?{done:!0,value:v.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}})),y=g[0],m=g[1];r(String.prototype,t,y),i(RegExp.prototype,h,2==n?function(t,n){return m.call(t,this,n)}:function(t){return m.call(t,this)})}}},function(t,n,e){var r=e(19),i=e(111),o=e(78),u=e(3),a=e(6),c=e(80),s={},f={};(n=t.exports=function(t,n,e,l,h){var d,p,v,g,y=h?function(){return t}:c(t),m=r(e,l,n?2:1),b=0;if(\"function\"!=typeof y)throw TypeError(t+\" is not iterable!\");if(o(y)){for(d=a(t.length);d>b;b++)if((g=n?m(u(p=t[b])[0],p[1]):m(t[b]))===s||g===f)return g}else for(v=y.call(t);!(p=v.next()).done;)if((g=i(v,m,p.value,n))===s||g===f)return g}).BREAK=s,n.RETURN=f},function(t,n,e){var r=e(1).navigator;t.exports=r&&r.userAgent||\"\"},function(t,n,e){\"use strict\";var r=e(1),i=e(0),o=e(11),u=e(45),a=e(29),c=e(58),s=e(44),f=e(4),l=e(2),h=e(54),d=e(40),p=e(69);t.exports=function(t,n,e,v,g,y){var m=r[t],b=m,S=g?\"set\":\"add\",w=b&&b.prototype,_={},M=function(t){var n=w[t];o(w,t,\"delete\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"has\"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:\"get\"==t?function(t){return y&&!f(t)?void 0:n.call(this,0===t?0:t)}:\"add\"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(\"function\"==typeof b&&(y||w.forEach&&!l((function(){(new b).entries().next()})))){var x=new b,P=x[S](y?{}:-0,1)!=x,O=l((function(){x.has(1)})),A=h((function(t){new b(t)})),F=!y&&l((function(){for(var t=new b,n=5;n--;)t[S](n,n);return!t.has(-0)}));A||((b=n((function(n,e){s(n,b,t);var r=p(new m,n,b);return null!=e&&c(e,g,r[S],r),r}))).prototype=w,w.constructor=b),(O||F)&&(M(\"delete\"),M(\"has\"),g&&M(\"get\")),(F||P)&&M(S),y&&w.clear&&delete w.clear}else b=v.getConstructor(n,t,g,S),u(b.prototype,e),a.NEED=!0;return d(b,t),_[t]=b,i(i.G+i.W+i.F*(b!=m),_),y||v.setStrong(b,t,g),b}},function(t,n,e){for(var r,i=e(1),o=e(14),u=e(31),a=u(\"typed_array\"),c=u(\"view\"),s=!(!i.ArrayBuffer||!i.DataView),f=s,l=0,h=\"Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array\".split(\",\");l<9;)(r=i[h[l++]])?(o(r.prototype,a,!0),o(r.prototype,c,!0)):f=!1;t.exports={ABV:s,CONSTR:f,TYPED:a,VIEW:c}},function(t,n,e){var r=e(4),i=e(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){n.f=e(5)},function(t,n,e){var r=e(50)(\"keys\"),i=e(31);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,n){t.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(t,n,e){var r=e(1).document;t.exports=r&&r.documentElement},function(t,n,e){var r=e(4),i=e(3),o=function(t,n){if(i(t),!r(n)&&null!==n)throw TypeError(n+\": can't set as prototype!\")};t.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(22).f(Object.prototype,\"__proto__\").set,2))(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},function(t,n){t.exports=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\"},function(t,n,e){var r=e(4),i=e(67).set;t.exports=function(t,n,e){var o,u=n.constructor;return u!==e&&\"function\"==typeof u&&(o=u.prototype)!==e.prototype&&r(o)&&i&&i(t,o),t}},function(t,n,e){\"use strict\";var r=e(21),i=e(26);t.exports=function(t){var n=String(i(this)),e=\"\",o=r(t);if(o<0||o==1/0)throw RangeError(\"Count can't be negative\");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(e+=n);return e}},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var e=Math.expm1;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:e},function(t,n,e){var r=e(21),i=e(26);t.exports=function(t){return function(n,e){var o,u,a=String(i(n)),c=r(e),s=a.length;return c<0||c>=s?t?\"\":void 0:(o=a.charCodeAt(c))<55296||o>56319||c+1===s||(u=a.charCodeAt(c+1))<56320||u>57343?t?a.charAt(c):o:t?a.slice(c,c+2):u-56320+(o-55296<<10)+65536}}},function(t,n,e){\"use strict\";var r=e(32),i=e(0),o=e(11),u=e(14),a=e(42),c=e(110),s=e(40),f=e(37),l=e(5)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),d=function(){return this};t.exports=function(t,n,e,p,v,g,y){c(e,n,p);var m,b,S,w=function(t){if(!h&&t in P)return P[t];switch(t){case\"keys\":case\"values\":return function(){return new e(this,t)}}return function(){return new e(this,t)}},_=n+\" Iterator\",M=\"values\"==v,x=!1,P=t.prototype,O=P[l]||P[\"@@iterator\"]||v&&P[v],A=O||w(v),F=v?M?w(\"entries\"):A:void 0,E=\"Array\"==n&&P.entries||O;if(E&&(S=f(E.call(new t)))!==Object.prototype&&S.next&&(s(S,_,!0),r||\"function\"==typeof S[l]||u(S,l,d)),M&&O&&\"values\"!==O.name&&(x=!0,A=function(){return O.call(this)}),r&&!y||!h&&!x&&P[l]||u(P,l,A),a[n]=A,a[_]=d,v)if(m={values:M?A:w(\"values\"),keys:g?A:w(\"keys\"),entries:F},y)for(b in m)b in P||o(P,b,m[b]);else i(i.P+i.F*(h||x),n,m);return m}},function(t,n,e){var r=e(76),i=e(26);t.exports=function(t,n,e){if(r(n))throw TypeError(\"String#\"+e+\" doesn't accept regex!\");return String(i(t))}},function(t,n,e){var r=e(4),i=e(25),o=e(5)(\"match\");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[o])?!!n:\"RegExp\"==i(t))}},function(t,n,e){var r=e(5)(\"match\");t.exports=function(t){var n=/./;try{\"/./\"[t](n)}catch(e){try{return n[r]=!1,!\"/./\"[t](n)}catch(t){}}return!0}},function(t,n,e){var r=e(42),i=e(5)(\"iterator\"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,n,e){\"use strict\";var r=e(9),i=e(30);t.exports=function(t,n,e){n in t?r.f(t,n,i(0,e)):t[n]=e}},function(t,n,e){var r=e(48),i=e(5)(\"iterator\"),o=e(42);t.exports=e(7).getIteratorMethod=function(t){if(null!=t)return t[i]||t[\"@@iterator\"]||o[r(t)]}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=function(t){for(var n=r(this),e=o(n.length),u=arguments.length,a=i(u>1?arguments[1]:void 0,e),c=u>2?arguments[2]:void 0,s=void 0===c?e:i(c,e);s>a;)n[a++]=t;return n}},function(t,n,e){\"use strict\";var r=e(38),i=e(115),o=e(42),u=e(15);t.exports=e(74)(Array,\"Array\",(function(t,n){this._t=u(t),this._i=0,this._k=n}),(function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,i(1)):i(0,\"keys\"==n?e:\"values\"==n?t[e]:[e,t[e]])}),\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(t,n,e){\"use strict\";var r,i,o=e(55),u=RegExp.prototype.exec,a=String.prototype.replace,c=u,s=(r=/a/,i=/b*/g,u.call(r,\"a\"),u.call(i,\"a\"),0!==r.lastIndex||0!==i.lastIndex),f=void 0!==/()??/.exec(\"\")[1];(s||f)&&(c=function(t){var n,e,r,i,c=this;return f&&(e=new RegExp(\"^\"+c.source+\"$(?!\\\\s)\",o.call(c))),s&&(n=c.lastIndex),r=u.call(c,t),s&&r&&(c.lastIndex=c.global?r.index+r[0].length:n),f&&r&&r.length>1&&a.call(r[0],e,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r}),t.exports=c},function(t,n,e){\"use strict\";var r=e(73)(!0);t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r,i,o,u=e(19),a=e(104),c=e(66),s=e(62),f=e(1),l=f.process,h=f.setImmediate,d=f.clearImmediate,p=f.MessageChannel,v=f.Dispatch,g=0,y={},m=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},b=function(t){m.call(t.data)};h&&d||(h=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return y[++g]=function(){a(\"function\"==typeof t?t:Function(t),n)},r(g),g},d=function(t){delete y[t]},\"process\"==e(25)(l)?r=function(t){l.nextTick(u(m,t,1))}:v&&v.now?r=function(t){v.now(u(m,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=b,r=u(o.postMessage,o,1)):f.addEventListener&&\"function\"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+\"\",\"*\")},f.addEventListener(\"message\",b,!1)):r=\"onreadystatechange\"in s(\"script\")?function(t){c.appendChild(s(\"script\")).onreadystatechange=function(){c.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0)}),t.exports={set:h,clear:d}},function(t,n,e){\"use strict\";var r=e(1),i=e(8),o=e(32),u=e(61),a=e(14),c=e(45),s=e(2),f=e(44),l=e(21),h=e(6),d=e(123),p=e(36).f,v=e(9).f,g=e(81),y=e(40),m=\"prototype\",b=\"Wrong index!\",S=r.ArrayBuffer,w=r.DataView,_=r.Math,M=r.RangeError,x=r.Infinity,P=S,O=_.abs,A=_.pow,F=_.floor,E=_.log,N=_.LN2,R=i?\"_b\":\"buffer\",k=i?\"_l\":\"byteLength\",T=i?\"_o\":\"byteOffset\";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=23===n?A(2,-24)-A(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=O(t))!=t||t===x?(i=t!=t?1:0,r=c):(r=F(E(t)/N),t*(o=A(2,-r))<1&&(r--,o*=2),(t+=r+s>=1?f/o:f*A(2,1-s))*o>=2&&(r++,o/=2),r+s>=c?(i=0,r=c):r+s>=1?(i=(t*o-1)*A(2,n),r+=s):(i=t*A(2,s-1)*A(2,n),r=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(r=r<<n|i,a+=n;a>0;u[l++]=255&r,r/=256,a-=8);return u[--l]|=128*h,u}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--],f=127&s;for(s>>=7;a>0;f=256*f+t[c],c--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=n;a>0;r=256*r+t[c],c--,a-=8);if(0===f)f=1-u;else{if(f===o)return r?NaN:s?-x:x;r+=A(2,n),f-=u}return(s?-1:1)*r*A(2,f-n)}function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function B(t){return[255&t]}function C(t){return[255&t,t>>8&255]}function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function V(t){return I(t,52,8)}function G(t){return I(t,23,4)}function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}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+t[T],a=o.slice(u,u+n);return r?a:a.reverse()}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]._b,c=u+t[T],s=r(+i),f=0;f<n;f++)a[c+f]=s[o?f:n-f-1]}if(u.ABV){if(!s((function(){S(1)}))||!s((function(){new S(-1)}))||s((function(){return new S,new S(1.5),new S(NaN),\"ArrayBuffer\"!=S.name}))){for(var q,K=(S=function(t){return f(this,S),new P(d(t))})[m]=P[m],Y=p(P),Q=0;Y.length>Q;)(q=Y[Q++])in S||a(S,q,P[q]);o||(K.constructor=S)}var H=new w(new S(2)),J=w[m].setInt8;H.setInt8(0,2147483648),H.setInt8(1,2147483649),!H.getInt8(0)&&H.getInt8(1)||c(w[m],{setInt8:function(t,n){J.call(this,t,n<<24>>24)},setUint8:function(t,n){J.call(this,t,n<<24>>24)}},!0)}else S=function(t){f(this,S,\"ArrayBuffer\");var n=d(t);this._b=g.call(new Array(n),0),this[k]=n},w=function(t,n,e){f(this,w,\"DataView\"),f(t,S,\"DataView\");var r=t[k],i=l(n);if(i<0||i>r)throw M(\"Wrong offset!\");if(i+(e=void 0===e?r-i:h(e))>r)throw M(\"Wrong length!\");this[R]=t,this[T]=i,this[k]=e},i&&(D(S,\"byteLength\",\"_l\"),D(w,\"buffer\",\"_b\"),D(w,\"byteLength\",\"_l\"),D(w,\"byteOffset\",\"_o\")),c(w[m],{getInt8:function(t){return U(this,1,t)[0]<<24>>24},getUint8:function(t){return U(this,1,t)[0]},getInt16:function(t){var n=U(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=U(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return L(U(this,4,t,arguments[1]))},getUint32:function(t){return L(U(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return j(U(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return j(U(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){z(this,1,t,B,n)},setUint8:function(t,n){z(this,1,t,B,n)},setInt16:function(t,n){z(this,2,t,C,n,arguments[2])},setUint16:function(t,n){z(this,2,t,C,n,arguments[2])},setInt32:function(t,n){z(this,4,t,W,n,arguments[2])},setUint32:function(t,n){z(this,4,t,W,n,arguments[2])},setFloat32:function(t,n){z(this,4,t,G,n,arguments[2])},setFloat64:function(t,n){z(this,8,t,V,n,arguments[2])}});y(S,\"ArrayBuffer\"),y(w,\"DataView\"),a(w[m],u.VIEW,!0),n.ArrayBuffer=S,n.DataView=w},function(t,n){var e=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,e){t.exports=!e(128)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(91))&&r.__esModule?r:{default:r},o=e(18);function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}var a=function(){function t(){}var n,e,r;return t.getParser=function(t,n){if(void 0===n&&(n=!1),\"string\"!=typeof t)throw new Error(\"UserAgent should be a string\");return new i.default(t,n)},t.parse=function(t){return new i.default(t).getResult()},n=t,r=[{key:\"BROWSER_MAP\",get:function(){return o.BROWSER_MAP}},{key:\"ENGINE_MAP\",get:function(){return o.ENGINE_MAP}},{key:\"OS_MAP\",get:function(){return o.OS_MAP}},{key:\"PLATFORMS_MAP\",get:function(){return o.PLATFORMS_MAP}}],(e=null)&&u(n.prototype,e),r&&u(n,r),t}();n.default=a,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r=c(e(92)),i=c(e(93)),o=c(e(94)),u=c(e(95)),a=c(e(17));function c(t){return t&&t.__esModule?t:{default:t}}var s=function(){function t(t,n){if(void 0===n&&(n=!1),null==t||\"\"===t)throw new Error(\"UserAgent parameter can't be empty\");this._ua=t,this.parsedResult={},!0!==n&&this.parse()}var n=t.prototype;return n.getUA=function(){return this._ua},n.test=function(t){return t.test(this._ua)},n.parseBrowser=function(){var t=this;this.parsedResult.browser={};var n=a.default.find(r.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.browser=n.describe(this.getUA())),this.parsedResult.browser},n.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},n.getBrowserName=function(t){return t?String(this.getBrowser().name).toLowerCase()||\"\":this.getBrowser().name||\"\"},n.getBrowserVersion=function(){return this.getBrowser().version},n.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},n.parseOS=function(){var t=this;this.parsedResult.os={};var n=a.default.find(i.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.os=n.describe(this.getUA())),this.parsedResult.os},n.getOSName=function(t){var n=this.getOS().name;return t?String(n).toLowerCase()||\"\":n||\"\"},n.getOSVersion=function(){return this.getOS().version},n.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},n.getPlatformType=function(t){void 0===t&&(t=!1);var n=this.getPlatform().type;return t?String(n).toLowerCase()||\"\":n||\"\"},n.parsePlatform=function(){var t=this;this.parsedResult.platform={};var n=a.default.find(o.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.platform=n.describe(this.getUA())),this.parsedResult.platform},n.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},n.getEngineName=function(t){return t?String(this.getEngine().name).toLowerCase()||\"\":this.getEngine().name||\"\"},n.parseEngine=function(){var t=this;this.parsedResult.engine={};var n=a.default.find(u.default,(function(n){if(\"function\"==typeof n.test)return n.test(t);if(n.test instanceof Array)return n.test.some((function(n){return t.test(n)}));throw new Error(\"Browser's test function is not valid\")}));return n&&(this.parsedResult.engine=n.describe(this.getUA())),this.parsedResult.engine},n.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},n.getResult=function(){return a.default.assign({},this.parsedResult)},n.satisfies=function(t){var n=this,e={},r=0,i={},o=0;if(Object.keys(t).forEach((function(n){var u=t[n];\"string\"==typeof u?(i[n]=u,o+=1):\"object\"==typeof u&&(e[n]=u,r+=1)})),r>0){var u=Object.keys(e),c=a.default.find(u,(function(t){return n.isOS(t)}));if(c){var s=this.satisfies(e[c]);if(void 0!==s)return s}var f=a.default.find(u,(function(t){return n.isPlatform(t)}));if(f){var l=this.satisfies(e[f]);if(void 0!==l)return l}}if(o>0){var h=Object.keys(i),d=a.default.find(h,(function(t){return n.isBrowser(t,!0)}));if(void 0!==d)return this.compareVersion(i[d])}},n.isBrowser=function(t,n){void 0===n&&(n=!1);var e=this.getBrowserName().toLowerCase(),r=t.toLowerCase(),i=a.default.getBrowserTypeByAlias(r);return n&&i&&(r=i.toLowerCase()),r===e},n.compareVersion=function(t){var n=[0],e=t,r=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===t[0]||\"<\"===t[0]?(e=t.substr(1),\"=\"===t[1]?(r=!0,e=t.substr(2)):n=[],\">\"===t[0]?n.push(1):n.push(-1)):\"=\"===t[0]?e=t.substr(1):\"~\"===t[0]&&(r=!0,e=t.substr(1)),n.indexOf(a.default.compareVersions(i,e,r))>-1},n.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},n.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},n.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},n.is=function(t){return this.isBrowser(t)||this.isOS(t)||this.isPlatform(t)},n.some=function(t){var n=this;return void 0===t&&(t=[]),t.some((function(t){return n.is(t)}))},t}();n.default=s,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r};var o=/version\\/(\\d+(\\.?_?\\d+)+)/i,u=[{test:[/googlebot/i],describe:function(t){var n={name:\"Googlebot\"},e=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/opera/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/opr\\/|opios/i],describe:function(t){var n={name:\"Opera\"},e=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/SamsungBrowser/i],describe:function(t){var n={name:\"Samsung Internet for Android\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Whale/i],describe:function(t){var n={name:\"NAVER Whale Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/MZBrowser/i],describe:function(t){var n={name:\"MZ Browser\"},e=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/focus/i],describe:function(t){var n={name:\"Focus\"},e=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/swing/i],describe:function(t){var n={name:\"Swing\"},e=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/coast/i],describe:function(t){var n={name:\"Opera Coast\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/yabrowser/i],describe:function(t){var n={name:\"Yandex Browser\"},e=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/ucbrowser/i],describe:function(t){var n={name:\"UC Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Maxthon|mxios/i],describe:function(t){var n={name:\"Maxthon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/epiphany/i],describe:function(t){var n={name:\"Epiphany\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/puffin/i],describe:function(t){var n={name:\"Puffin\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sleipnir/i],describe:function(t){var n={name:\"Sleipnir\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/k-meleon/i],describe:function(t){var n={name:\"K-Meleon\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/micromessenger/i],describe:function(t){var n={name:\"WeChat\"},e=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qqbrowser/i],describe:function(t){var n={name:/qqbrowserlite/i.test(t)?\"QQ Browser Lite\":\"QQ Browser\"},e=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/msie|trident/i],describe:function(t){var n={name:\"Internet Explorer\"},e=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/\\sedg\\//i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/edg([ea]|ios)/i],describe:function(t){var n={name:\"Microsoft Edge\"},e=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/vivaldi/i],describe:function(t){var n={name:\"Vivaldi\"},e=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/seamonkey/i],describe:function(t){var n={name:\"SeaMonkey\"},e=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sailfish/i],describe:function(t){var n={name:\"Sailfish\"},e=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,t);return e&&(n.version=e),n}},{test:[/silk/i],describe:function(t){var n={name:\"Amazon Silk\"},e=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/phantom/i],describe:function(t){var n={name:\"PhantomJS\"},e=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/slimerjs/i],describe:function(t){var n={name:\"SlimerJS\"},e=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n={name:\"BlackBerry\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n={name:\"WebOS Browser\"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/bada/i],describe:function(t){var n={name:\"Bada\"},e=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/tizen/i],describe:function(t){var n={name:\"Tizen\"},e=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qupzilla/i],describe:function(t){var n={name:\"QupZilla\"},e=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var n={name:\"Firefox\"},e=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/electron/i],describe:function(t){var n={name:\"Electron\"},e=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/chromium/i],describe:function(t){var n={name:\"Chromium\"},e=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/chrome|crios|crmo/i],describe:function(t){var n={name:\"Chrome\"},e=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/GSA/i],describe:function(t){var n={name:\"Google Search\"},e=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n={name:\"Android Browser\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/playstation 4/i],describe:function(t){var n={name:\"PlayStation 4\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/safari|applewebkit/i],describe:function(t){var n={name:\"Safari\"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/.*/i],describe:function(t){var n=-1!==t.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(n,t),version:i.default.getSecondMatch(n,t)}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/Roku\\/DVP/],describe:function(t){var n=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,t);return{name:o.OS_MAP.Roku,version:n}}},{test:[/windows phone/i],describe:function(t){var n=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.WindowsPhone,version:n}}},{test:[/windows /i],describe:function(t){var n=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,t),e=i.default.getWindowsVersionName(n);return{name:o.OS_MAP.Windows,version:n,versionName:e}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(t){var n=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,t);return{name:o.OS_MAP.iOS,version:n}}},{test:[/macintosh/i],describe:function(t){var n=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,t).replace(/[_\\s]/g,\".\"),e=i.default.getMacOSVersionName(n),r={name:o.OS_MAP.MacOS,version:n};return e&&(r.versionName=e),r}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var n=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,t).replace(/[_\\s]/g,\".\");return{name:o.OS_MAP.iOS,version:n}}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,t),e=i.default.getAndroidVersionName(n),r={name:o.OS_MAP.Android,version:n};return e&&(r.versionName=e),r}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,t),e={name:o.OS_MAP.WebOS};return n&&n.length&&(e.version=n),e}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(t){var n=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,t)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,t)||i.default.getFirstMatch(/\\bbb(\\d+)/i,t);return{name:o.OS_MAP.BlackBerry,version:n}}},{test:[/bada/i],describe:function(t){var n=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Bada,version:n}}},{test:[/tizen/i],describe:function(t){var n=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.Tizen,version:n}}},{test:[/linux/i],describe:function(){return{name:o.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:o.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var n=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,t);return{name:o.OS_MAP.PlayStation4,version:n}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(t){var n=i.default.getFirstMatch(/(can-l01)/i,t)&&\"Nova\",e={type:o.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return n&&(e.model=n),e}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\\//],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){var n=t.test(/ipod|iphone/i),e=t.test(/like (ipod|iphone)/i);return n&&!e},describe:function(t){var n=i.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:o.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:n}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"blackberry\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(t){return\"bada\"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"windows phone\"===t.getBrowserName()},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(t){var n=Number(String(t.getOSVersion()).split(\".\")[0]);return\"android\"===t.getOSName(!0)&&n>=3},describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){return\"android\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return\"macos\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(t){return\"windows\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"linux\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return\"playstation 4\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}},{test:function(t){return\"roku\"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}}];n.default=u,t.exports=n.default},function(t,n,e){\"use strict\";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:function(t){return\"microsoft edge\"===t.getBrowserName(!0)},describe:function(t){if(/\\sedg\\//i.test(t))return{name:o.ENGINE_MAP.Blink};var n=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,t);return{name:o.ENGINE_MAP.EdgeHTML,version:n}}},{test:[/trident/i],describe:function(t){var n={name:o.ENGINE_MAP.Trident},e=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){return t.test(/presto/i)},describe:function(t){var n={name:o.ENGINE_MAP.Presto},e=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=t.test(/gecko/i),e=t.test(/like gecko/i);return n&&!e},describe:function(t){var n={name:o.ENGINE_MAP.Gecko},e=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:o.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var n={name:o.ENGINE_MAP.WebKit},e=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,t);return e&&(n.version=e),n}}];n.default=u,t.exports=n.default},function(t,n,e){t.exports=!e(8)&&!e(2)((function(){return 7!=Object.defineProperty(e(62)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(1),i=e(7),o=e(32),u=e(63),a=e(9).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});\"_\"==t.charAt(0)||t in n||a(n,t,{value:u.f(t)})}},function(t,n,e){var r=e(13),i=e(15),o=e(51)(!1),u=e(64)(\"IE_PROTO\");t.exports=function(t,n){var e,a=i(t),c=0,s=[];for(e in a)e!=u&&r(a,e)&&s.push(e);for(;n.length>c;)r(a,e=n[c++])&&(~o(s,e)||s.push(e));return s}},function(t,n,e){var r=e(9),i=e(3),o=e(33);t.exports=e(8)?Object.defineProperties:function(t,n){i(t);for(var e,u=o(n),a=u.length,c=0;a>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(15),i=e(36).f,o={}.toString,u=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&\"[object Window]\"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(r(t))}},function(t,n,e){\"use strict\";var r=e(8),i=e(33),o=e(52),u=e(47),a=e(10),c=e(46),s=Object.assign;t.exports=!s||e(2)((function(){var t={},n={},e=Symbol(),r=\"abcdefghijklmnopqrst\";return t[e]=7,r.split(\"\").forEach((function(t){n[t]=t})),7!=s({},t)[e]||Object.keys(s({},n)).join(\"\")!=r}))?function(t,n){for(var e=a(t),s=arguments.length,f=1,l=o.f,h=u.f;s>f;)for(var d,p=c(arguments[f++]),v=l?i(p).concat(l(p)):i(p),g=v.length,y=0;g>y;)d=v[y++],r&&!h.call(p,d)||(e[d]=p[d]);return e}:s},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){\"use strict\";var r=e(20),i=e(4),o=e(104),u=[].slice,a={},c=function(t,n,e){if(!(n in a)){for(var r=[],i=0;i<n;i++)r[i]=\"a[\"+i+\"]\";a[n]=Function(\"F,a\",\"return new F(\"+r.join(\",\")+\")\")}return a[n](t,e)};t.exports=Function.bind||function(t){var n=r(this),e=u.call(arguments,1),a=function(){var r=e.concat(u.call(arguments));return this instanceof a?c(n,r.length,r):o(n,r,t)};return i(n.prototype)&&(a.prototype=n.prototype),a}},function(t,n){t.exports=function(t,n,e){var r=void 0===e;switch(n.length){case 0:return r?t():t.call(e);case 1:return r?t(n[0]):t.call(e,n[0]);case 2:return r?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return r?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return r?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},function(t,n,e){var r=e(1).parseInt,i=e(41).trim,o=e(68),u=/^[-+]?0[xX]/;t.exports=8!==r(o+\"08\")||22!==r(o+\"0x16\")?function(t,n){var e=i(String(t),3);return r(e,n>>>0||(u.test(e)?16:10))}:r},function(t,n,e){var r=e(1).parseFloat,i=e(41).trim;t.exports=1/r(e(68)+\"-0\")!=-1/0?function(t){var n=i(String(t),3),e=r(n);return 0===e&&\"-\"==n.charAt(0)?-0:e}:r},function(t,n,e){var r=e(25);t.exports=function(t,n){if(\"number\"!=typeof t&&\"Number\"!=r(t))throw TypeError(n);return+t}},function(t,n,e){var r=e(4),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,e){\"use strict\";var r=e(35),i=e(30),o=e(40),u={};e(14)(u,e(5)(\"iterator\"),(function(){return this})),t.exports=function(t,n,e){t.prototype=r(u,{next:i(1,e)}),o(t,n+\" Iterator\")}},function(t,n,e){var r=e(3);t.exports=function(t,n,e,i){try{return i?n(r(e)[0],e[1]):n(e)}catch(n){var o=t.return;throw void 0!==o&&r(o.call(t)),n}}},function(t,n,e){var r=e(224);t.exports=function(t,n){return new(r(t))(n)}},function(t,n,e){var r=e(20),i=e(10),o=e(46),u=e(6);t.exports=function(t,n,e,a,c){r(n);var s=i(t),f=o(s),l=u(s.length),h=c?l-1:0,d=c?-1:1;if(e<2)for(;;){if(h in f){a=f[h],h+=d;break}if(h+=d,c?h<0:l<=h)throw TypeError(\"Reduce of empty array with no initial value\")}for(;c?h>=0:l>h;h+=d)h in f&&(a=n(a,f[h],h,s));return a}},function(t,n,e){\"use strict\";var r=e(10),i=e(34),o=e(6);t.exports=[].copyWithin||function(t,n){var e=r(this),u=o(e.length),a=i(t,u),c=i(n,u),s=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===s?u:i(s,u))-c,u-a),l=1;for(c<a&&a<c+f&&(l=-1,c+=f-1,a+=f-1);f-- >0;)c in e?e[a]=e[c]:delete e[a],a+=l,c+=l;return e}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){\"use strict\";var r=e(83);e(0)({target:\"RegExp\",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,n,e){e(8)&&\"g\"!=/./g.flags&&e(9).f(RegExp.prototype,\"flags\",{configurable:!0,get:e(55)})},function(t,n,e){\"use strict\";var r,i,o,u,a=e(32),c=e(1),s=e(19),f=e(48),l=e(0),h=e(4),d=e(20),p=e(44),v=e(58),g=e(49),y=e(85).set,m=e(244)(),b=e(119),S=e(245),w=e(59),_=e(120),M=c.TypeError,x=c.process,P=x&&x.versions,O=P&&P.v8||\"\",A=c.Promise,F=\"process\"==f(x),E=function(){},N=i=b.f,R=!!function(){try{var t=A.resolve(1),n=(t.constructor={})[e(5)(\"species\")]=function(t){t(E,E)};return(F||\"function\"==typeof PromiseRejectionEvent)&&t.then(E)instanceof n&&0!==O.indexOf(\"6.6\")&&-1===w.indexOf(\"Chrome/66\")}catch(t){}}(),k=function(t){var n;return!(!h(t)||\"function\"!=typeof(n=t.then))&&n},T=function(t,n){if(!t._n){t._n=!0;var e=t._c;m((function(){for(var r=t._v,i=1==t._s,o=0,u=function(n){var e,o,u,a=i?n.ok:n.fail,c=n.resolve,s=n.reject,f=n.domain;try{a?(i||(2==t._h&&L(t),t._h=1),!0===a?e=r:(f&&f.enter(),e=a(r),f&&(f.exit(),u=!0)),e===n.promise?s(M(\"Promise-chain cycle\")):(o=k(e))?o.call(e,c,s):c(e)):s(r)}catch(t){f&&!u&&f.exit(),s(t)}};e.length>o;)u(e[o++]);t._c=[],t._n=!1,n&&!t._h&&I(t)}))}},I=function(t){y.call(c,(function(){var n,e,r,i=t._v,o=j(t);if(o&&(n=S((function(){F?x.emit(\"unhandledRejection\",i,t):(e=c.onunhandledrejection)?e({promise:t,reason:i}):(r=c.console)&&r.error&&r.error(\"Unhandled promise rejection\",i)})),t._h=F||j(t)?2:1),t._a=void 0,o&&n.e)throw n.v}))},j=function(t){return 1!==t._h&&0===(t._a||t._c).length},L=function(t){y.call(c,(function(){var n;F?x.emit(\"rejectionHandled\",t):(n=c.onrejectionhandled)&&n({promise:t,reason:t._v})}))},B=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),T(n,!0))},C=function(t){var n,e=this;if(!e._d){e._d=!0,e=e._w||e;try{if(e===t)throw M(\"Promise can't be resolved itself\");(n=k(t))?m((function(){var r={_w:e,_d:!1};try{n.call(t,s(C,r,1),s(B,r,1))}catch(t){B.call(r,t)}})):(e._v=t,e._s=1,T(e,!1))}catch(t){B.call({_w:e,_d:!1},t)}}};R||(A=function(t){p(this,A,\"Promise\",\"_h\"),d(t),r.call(this);try{t(s(C,this,1),s(B,this,1))}catch(t){B.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=e(45)(A.prototype,{then:function(t,n){var e=N(g(this,A));return e.ok=\"function\"!=typeof t||t,e.fail=\"function\"==typeof n&&n,e.domain=F?x.domain:void 0,this._c.push(e),this._a&&this._a.push(e),this._s&&T(this,!1),e.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r;this.promise=t,this.resolve=s(C,t,1),this.reject=s(B,t,1)},b.f=N=function(t){return t===A||t===u?new o(t):i(t)}),l(l.G+l.W+l.F*!R,{Promise:A}),e(40)(A,\"Promise\"),e(43)(\"Promise\"),u=e(7).Promise,l(l.S+l.F*!R,\"Promise\",{reject:function(t){var n=N(this);return(0,n.reject)(t),n.promise}}),l(l.S+l.F*(a||!R),\"Promise\",{resolve:function(t){return _(a&&this===u?A:this,t)}}),l(l.S+l.F*!(R&&e(54)((function(t){A.all(t).catch(E)}))),\"Promise\",{all:function(t){var n=this,e=N(n),r=e.resolve,i=e.reject,o=S((function(){var e=[],o=0,u=1;v(t,!1,(function(t){var a=o++,c=!1;e.push(void 0),u++,n.resolve(t).then((function(t){c||(c=!0,e[a]=t,--u||r(e))}),i)})),--u||r(e)}));return o.e&&i(o.v),e.promise},race:function(t){var n=this,e=N(n),r=e.reject,i=S((function(){v(t,!1,(function(t){n.resolve(t).then(e.resolve,r)}))}));return i.e&&r(i.v),e.promise}})},function(t,n,e){\"use strict\";var r=e(20);function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError(\"Bad Promise constructor\");n=t,e=r})),this.resolve=r(n),this.reject=r(e)}t.exports.f=function(t){return new i(t)}},function(t,n,e){var r=e(3),i=e(4),o=e(119);t.exports=function(t,n){if(r(t),i(n)&&n.constructor===t)return n;var e=o.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){\"use strict\";var r=e(9).f,i=e(35),o=e(45),u=e(19),a=e(44),c=e(58),s=e(74),f=e(115),l=e(43),h=e(8),d=e(29).fastKey,p=e(39),v=h?\"_s\":\"size\",g=function(t,n){var e,r=d(n);if(\"F\"!==r)return t._i[r];for(e=t._f;e;e=e.n)if(e.k==n)return e};t.exports={getConstructor:function(t,n,e,s){var f=t((function(t,r){a(t,f,n,\"_i\"),t._t=n,t._i=i(null),t._f=void 0,t._l=void 0,t[v]=0,null!=r&&c(r,e,t[s],t)}));return o(f.prototype,{clear:function(){for(var t=p(this,n),e=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete e[r.i];t._f=t._l=void 0,t[v]=0},delete:function(t){var e=p(this,n),r=g(e,t);if(r){var i=r.n,o=r.p;delete e._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),e._f==r&&(e._f=i),e._l==r&&(e._l=o),e[v]--}return!!r},forEach:function(t){p(this,n);for(var e,r=u(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!g(p(this,n),t)}}),h&&r(f.prototype,\"size\",{get:function(){return p(this,n)[v]}}),f},def:function(t,n,e){var r,i,o=g(t,n);return o?o.v=e:(t._l=o={i:i=d(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=o),r&&(r.n=o),t[v]++,\"F\"!==i&&(t._i[i]=o)),t},getEntry:g,setStrong:function(t,n,e){s(t,n,(function(t,e){this._t=p(t,n),this._k=e,this._l=void 0}),(function(){for(var t=this._k,n=this._l;n&&n.r;)n=n.p;return this._t&&(this._l=n=n?n.n:this._t._f)?f(0,\"keys\"==t?n.k:\"values\"==t?n.v:[n.k,n.v]):(this._t=void 0,f(1))}),e?\"entries\":\"values\",!e,!0),l(n)}}},function(t,n,e){\"use strict\";var r=e(45),i=e(29).getWeak,o=e(3),u=e(4),a=e(44),c=e(58),s=e(24),f=e(13),l=e(39),h=s(5),d=s(6),p=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,n){return h(t.a,(function(t){return t[0]===n}))};g.prototype={get:function(t){var n=y(this,t);if(n)return n[1]},has:function(t){return!!y(this,t)},set:function(t,n){var e=y(this,t);e?e[1]=n:this.a.push([t,n])},delete:function(t){var n=d(this.a,(function(n){return n[0]===t}));return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,o){var s=t((function(t,r){a(t,s,n,\"_i\"),t._t=n,t._i=p++,t._l=void 0,null!=r&&c(r,e,t[o],t)}));return r(s.prototype,{delete:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).delete(t):e&&f(e,this._i)&&delete e[this._i]},has:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).has(t):e&&f(e,this._i)}}),s},def:function(t,n,e){var r=i(o(n),!0);return!0===r?v(t).set(n,e):r[t._i]=e,t},ufstore:v}},function(t,n,e){var r=e(21),i=e(6);t.exports=function(t){if(void 0===t)return 0;var n=r(t),e=i(n);if(n!==e)throw RangeError(\"Wrong length!\");return e}},function(t,n,e){var r=e(36),i=e(52),o=e(3),u=e(1).Reflect;t.exports=u&&u.ownKeys||function(t){var n=r.f(o(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(6),i=e(70),o=e(26);t.exports=function(t,n,e,u){var a=String(o(t)),c=a.length,s=void 0===e?\" \":String(e),f=r(n);if(f<=c||\"\"==s)return a;var l=f-c,h=i.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+a:a+h}},function(t,n,e){var r=e(8),i=e(33),o=e(15),u=e(47).f;t.exports=function(t){return function(n){for(var e,a=o(n),c=i(a),s=c.length,f=0,l=[];s>f;)e=c[f++],r&&!u.call(a,e)||l.push(t?[e,a[e]]:a[e]);return l}}},function(t,n){var e=t.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){e(130),t.exports=e(90)},function(t,n,e){\"use strict\";e(131);var r,i=(r=e(303))&&r.__esModule?r:{default:r};i.default._babelPolyfill&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning.\"),i.default._babelPolyfill=!0},function(t,n,e){\"use strict\";e(132),e(275),e(277),e(280),e(282),e(284),e(286),e(288),e(290),e(292),e(294),e(296),e(298),e(302)},function(t,n,e){e(133),e(136),e(137),e(138),e(139),e(140),e(141),e(142),e(143),e(144),e(145),e(146),e(147),e(148),e(149),e(150),e(151),e(152),e(153),e(154),e(155),e(156),e(157),e(158),e(159),e(160),e(161),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(171),e(172),e(173),e(174),e(175),e(176),e(177),e(179),e(180),e(181),e(182),e(183),e(184),e(185),e(186),e(187),e(188),e(189),e(190),e(191),e(192),e(193),e(194),e(195),e(196),e(197),e(198),e(199),e(200),e(201),e(202),e(203),e(204),e(205),e(206),e(207),e(208),e(209),e(210),e(211),e(212),e(214),e(215),e(217),e(218),e(219),e(220),e(221),e(222),e(223),e(225),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(82),e(238),e(116),e(239),e(117),e(240),e(241),e(242),e(243),e(118),e(246),e(247),e(248),e(249),e(250),e(251),e(252),e(253),e(254),e(255),e(256),e(257),e(258),e(259),e(260),e(261),e(262),e(263),e(264),e(265),e(266),e(267),e(268),e(269),e(270),e(271),e(272),e(273),e(274),t.exports=e(7)},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(8),u=e(0),a=e(11),c=e(29).KEY,s=e(2),f=e(50),l=e(40),h=e(31),d=e(5),p=e(63),v=e(97),g=e(135),y=e(53),m=e(3),b=e(4),S=e(10),w=e(15),_=e(28),M=e(30),x=e(35),P=e(100),O=e(22),A=e(52),F=e(9),E=e(33),N=O.f,R=F.f,k=P.f,T=r.Symbol,I=r.JSON,j=I&&I.stringify,L=d(\"_hidden\"),B=d(\"toPrimitive\"),C={}.propertyIsEnumerable,W=f(\"symbol-registry\"),V=f(\"symbols\"),G=f(\"op-symbols\"),D=Object.prototype,U=\"function\"==typeof T&&!!A.f,z=r.QObject,q=!z||!z.prototype||!z.prototype.findChild,K=o&&s((function(){return 7!=x(R({},\"a\",{get:function(){return R(this,\"a\",{value:7}).a}})).a}))?function(t,n,e){var r=N(D,n);r&&delete D[n],R(t,n,e),r&&t!==D&&R(D,n,r)}:R,Y=function(t){var n=V[t]=x(T.prototype);return n._k=t,n},Q=U&&\"symbol\"==typeof T.iterator?function(t){return\"symbol\"==typeof t}:function(t){return t instanceof T},H=function(t,n,e){return t===D&&H(G,n,e),m(t),n=_(n,!0),m(e),i(V,n)?(e.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),e=x(e,{enumerable:M(0,!1)})):(i(t,L)||R(t,L,M(1,{})),t[L][n]=!0),K(t,n,e)):R(t,n,e)},J=function(t,n){m(t);for(var e,r=g(n=w(n)),i=0,o=r.length;o>i;)H(t,e=r[i++],n[e]);return t},X=function(t){var n=C.call(this,t=_(t,!0));return!(this===D&&i(V,t)&&!i(G,t))&&(!(n||!i(this,t)||!i(V,t)||i(this,L)&&this[L][t])||n)},Z=function(t,n){if(t=w(t),n=_(n,!0),t!==D||!i(V,n)||i(G,n)){var e=N(t,n);return!e||!i(V,n)||i(t,L)&&t[L][n]||(e.enumerable=!0),e}},$=function(t){for(var n,e=k(w(t)),r=[],o=0;e.length>o;)i(V,n=e[o++])||n==L||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===D,r=k(e?G:w(t)),o=[],u=0;r.length>u;)!i(V,n=r[u++])||e&&!i(D,n)||o.push(V[n]);return o};U||(a((T=function(){if(this instanceof T)throw TypeError(\"Symbol is not a constructor!\");var t=h(arguments.length>0?arguments[0]:void 0),n=function(e){this===D&&n.call(G,e),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),K(this,t,M(1,e))};return o&&q&&K(D,t,{configurable:!0,set:n}),Y(t)}).prototype,\"toString\",(function(){return this._k})),O.f=Z,F.f=H,e(36).f=P.f=$,e(47).f=X,A.f=tt,o&&!e(32)&&a(D,\"propertyIsEnumerable\",X,!0),p.f=function(t){return Y(d(t))}),u(u.G+u.W+u.F*!U,{Symbol:T});for(var nt=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),et=0;nt.length>et;)d(nt[et++]);for(var rt=E(d.store),it=0;rt.length>it;)v(rt[it++]);u(u.S+u.F*!U,\"Symbol\",{for:function(t){return i(W,t+=\"\")?W[t]:W[t]=T(t)},keyFor:function(t){if(!Q(t))throw TypeError(t+\" is not a symbol!\");for(var n in W)if(W[n]===t)return n},useSetter:function(){q=!0},useSimple:function(){q=!1}}),u(u.S+u.F*!U,\"Object\",{create:function(t,n){return void 0===n?x(t):J(x(t),n)},defineProperty:H,defineProperties:J,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:tt});var ot=s((function(){A.f(1)}));u(u.S+u.F*ot,\"Object\",{getOwnPropertySymbols:function(t){return A.f(S(t))}}),I&&u(u.S+u.F*(!U||s((function(){var t=T();return\"[null]\"!=j([t])||\"{}\"!=j({a:t})||\"{}\"!=j(Object(t))}))),\"JSON\",{stringify:function(t){for(var n,e,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(e=n=r[1],(b(n)||void 0!==t)&&!Q(t))return y(n)||(n=function(t,n){if(\"function\"==typeof e&&(n=e.call(this,t,n)),!Q(n))return n}),r[1]=n,j.apply(I,r)}}),T.prototype[B]||e(14)(T.prototype,B,T.prototype.valueOf),l(T,\"Symbol\"),l(Math,\"Math\",!0),l(r.JSON,\"JSON\",!0)},function(t,n,e){t.exports=e(50)(\"native-function-to-string\",Function.toString)},function(t,n,e){var r=e(33),i=e(52),o=e(47);t.exports=function(t){var n=r(t),e=i.f;if(e)for(var u,a=e(t),c=o.f,s=0;a.length>s;)c.call(t,u=a[s++])&&n.push(u);return n}},function(t,n,e){var r=e(0);r(r.S,\"Object\",{create:e(35)})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperty:e(9).f})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),\"Object\",{defineProperties:e(99)})},function(t,n,e){var r=e(15),i=e(22).f;e(23)(\"getOwnPropertyDescriptor\",(function(){return function(t,n){return i(r(t),n)}}))},function(t,n,e){var r=e(10),i=e(37);e(23)(\"getPrototypeOf\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){var r=e(10),i=e(33);e(23)(\"keys\",(function(){return function(t){return i(r(t))}}))},function(t,n,e){e(23)(\"getOwnPropertyNames\",(function(){return e(100).f}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"freeze\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"seal\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)(\"preventExtensions\",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4);e(23)(\"isFrozen\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isSealed\",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)(\"isExtensible\",(function(t){return function(n){return!!r(n)&&(!t||t(n))}}))},function(t,n,e){var r=e(0);r(r.S+r.F,\"Object\",{assign:e(101)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{is:e(102)})},function(t,n,e){var r=e(0);r(r.S,\"Object\",{setPrototypeOf:e(67).set})},function(t,n,e){\"use strict\";var r=e(48),i={};i[e(5)(\"toStringTag\")]=\"z\",i+\"\"!=\"[object z]\"&&e(11)(Object.prototype,\"toString\",(function(){return\"[object \"+r(this)+\"]\"}),!0)},function(t,n,e){var r=e(0);r(r.P,\"Function\",{bind:e(103)})},function(t,n,e){var r=e(9).f,i=Function.prototype,o=/^\\s*function ([^ (]*)/;\"name\"in i||e(8)&&r(i,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(o)[1]}catch(t){return\"\"}}})},function(t,n,e){\"use strict\";var r=e(4),i=e(37),o=e(5)(\"hasInstance\"),u=Function.prototype;o in u||e(9).f(u,o,{value:function(t){if(\"function\"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(0),i=e(105);r(r.G+r.F*(parseInt!=i),{parseInt:i})},function(t,n,e){var r=e(0),i=e(106);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,n,e){\"use strict\";var r=e(1),i=e(13),o=e(25),u=e(69),a=e(28),c=e(2),s=e(36).f,f=e(22).f,l=e(9).f,h=e(41).trim,d=r.Number,p=d,v=d.prototype,g=\"Number\"==o(e(35)(v)),y=\"trim\"in String.prototype,m=function(t){var n=a(t,!1);if(\"string\"==typeof n&&n.length>2){var e,r,i,o=(n=y?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(e=n.charCodeAt(2))||120===e)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+n}for(var u,c=n.slice(2),s=0,f=c.length;s<f;s++)if((u=c.charCodeAt(s))<48||u>i)return NaN;return parseInt(c,r)}}return+n};if(!d(\" 0o1\")||!d(\"0b1\")||d(\"+0x1\")){d=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof d&&(g?c((function(){v.valueOf.call(e)})):\"Number\"!=o(e))?u(new p(m(n)),e,d):m(n)};for(var b,S=e(8)?s(p):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),w=0;S.length>w;w++)i(p,b=S[w])&&!i(d,b)&&l(d,b,f(p,b));d.prototype=v,v.constructor=d,e(11)(r,\"Number\",d)}},function(t,n,e){\"use strict\";var r=e(0),i=e(21),o=e(107),u=e(70),a=1..toFixed,c=Math.floor,s=[0,0,0,0,0,0],f=\"Number.toFixed: incorrect invocation!\",l=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*s[e],s[e]=r%1e7,r=c(r/1e7)},h=function(t){for(var n=6,e=0;--n>=0;)e+=s[n],s[n]=c(e/t),e=e%t*1e7},d=function(){for(var t=6,n=\"\";--t>=0;)if(\"\"!==n||0===t||0!==s[t]){var e=String(s[t]);n=\"\"===n?e:n+u.call(\"0\",7-e.length)+e}return n},p=function(t,n,e){return 0===n?e:n%2==1?p(t,n-1,e*t):p(t*t,n/2,e)};r(r.P+r.F*(!!a&&(\"0.000\"!==8e-5.toFixed(3)||\"1\"!==.9.toFixed(0)||\"1.25\"!==1.255.toFixed(2)||\"1000000000000000128\"!==(0xde0b6b3a7640080).toFixed(0))||!e(2)((function(){a.call({})}))),\"Number\",{toFixed:function(t){var n,e,r,a,c=o(this,f),s=i(t),v=\"\",g=\"0\";if(s<0||s>20)throw RangeError(f);if(c!=c)return\"NaN\";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v=\"-\",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*p(2,69,1))-69)<0?c*p(2,-n,1):c/p(2,n,1),e*=4503599627370496,(n=52-n)>0){for(l(0,e),r=s;r>=7;)l(1e7,0),r-=7;for(l(p(10,r,1),0),r=n-1;r>=23;)h(1<<23),r-=23;h(1<<r),l(1,1),h(2),g=d()}else l(0,e),l(1<<-n,0),g=d()+u.call(\"0\",s);return g=s>0?v+((a=g.length)<=s?\"0.\"+u.call(\"0\",s-a)+g:g.slice(0,a-s)+\".\"+g.slice(a-s)):v+g}})},function(t,n,e){\"use strict\";var r=e(0),i=e(2),o=e(107),u=1..toPrecision;r(r.P+r.F*(i((function(){return\"1\"!==u.call(1,void 0)}))||!i((function(){u.call({})}))),\"Number\",{toPrecision:function(t){var n=o(this,\"Number#toPrecision: incorrect invocation!\");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{EPSILON:Math.pow(2,-52)})},function(t,n,e){var r=e(0),i=e(1).isFinite;r(r.S,\"Number\",{isFinite:function(t){return\"number\"==typeof t&&i(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isInteger:e(108)})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(0),i=e(108),o=Math.abs;r(r.S,\"Number\",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){var r=e(0);r(r.S,\"Number\",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(0),i=e(106);r(r.S+r.F*(Number.parseFloat!=i),\"Number\",{parseFloat:i})},function(t,n,e){var r=e(0),i=e(105);r(r.S+r.F*(Number.parseInt!=i),\"Number\",{parseInt:i})},function(t,n,e){var r=e(0),i=e(109),o=Math.sqrt,u=Math.acosh;r(r.S+r.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),\"Math\",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,e){var r=e(0),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),\"Math\",{asinh:function t(n){return isFinite(n=+n)&&0!=n?n<0?-t(-n):Math.log(n+Math.sqrt(n*n+1)):n}})},function(t,n,e){var r=e(0),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),\"Math\",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,e){var r=e(0),i=e(71);r(r.S,\"Math\",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,e){var r=e(0),i=Math.exp;r(r.S,\"Math\",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,e){var r=e(0),i=e(72);r(r.S+r.F*(i!=Math.expm1),\"Math\",{expm1:i})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{fround:e(178)})},function(t,n,e){var r=e(71),i=Math.pow,o=i(2,-52),u=i(2,-23),a=i(2,127)*(2-u),c=i(2,-126);t.exports=Math.fround||function(t){var n,e,i=Math.abs(t),s=r(t);return i<c?s*(i/c/u+1/o-1/o)*c*u:(e=(n=(1+u/o)*i)-(n-i))>a||e!=e?s*(1/0):s*e}},function(t,n,e){var r=e(0),i=Math.abs;r(r.S,\"Math\",{hypot:function(t,n){for(var e,r,o=0,u=0,a=arguments.length,c=0;u<a;)c<(e=i(arguments[u++]))?(o=o*(r=c/e)*r+1,c=e):o+=e>0?(r=e/c)*r:e;return c===1/0?1/0:c*Math.sqrt(o)}})},function(t,n,e){var r=e(0),i=Math.imul;r(r.S+r.F*e(2)((function(){return-5!=i(4294967295,5)||2!=i.length})),\"Math\",{imul:function(t,n){var e=+t,r=+n,i=65535&e,o=65535&r;return 0|i*o+((65535&e>>>16)*o+i*(65535&r>>>16)<<16>>>0)}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log1p:e(109)})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{sign:e(71)})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S+r.F*e(2)((function(){return-2e-17!=!Math.sinh(-2e-17)})),\"Math\",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S,\"Math\",{tanh:function(t){var n=i(t=+t),e=i(-t);return n==1/0?1:e==1/0?-1:(n-e)/(o(t)+o(-t))}})},function(t,n,e){var r=e(0);r(r.S,\"Math\",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,e){var r=e(0),i=e(34),o=String.fromCharCode,u=String.fromCodePoint;r(r.S+r.F*(!!u&&1!=u.length),\"String\",{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,u=0;r>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+\" is not a valid code point\");e.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return e.join(\"\")}})},function(t,n,e){var r=e(0),i=e(15),o=e(6);r(r.S,\"String\",{raw:function(t){for(var n=i(t.raw),e=o(n.length),r=arguments.length,u=[],a=0;e>a;)u.push(String(n[a++])),a<r&&u.push(String(arguments[a]));return u.join(\"\")}})},function(t,n,e){\"use strict\";e(41)(\"trim\",(function(t){return function(){return t(this,3)}}))},function(t,n,e){\"use strict\";var r=e(73)(!0);e(74)(String,\"String\",(function(t){this._t=String(t),this._i=0}),(function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})}))},function(t,n,e){\"use strict\";var r=e(0),i=e(73)(!1);r(r.P,\"String\",{codePointAt:function(t){return i(this,t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".endsWith;r(r.P+r.F*e(77)(\"endsWith\"),\"String\",{endsWith:function(t){var n=o(this,t,\"endsWith\"),e=arguments.length>1?arguments[1]:void 0,r=i(n.length),a=void 0===e?r:Math.min(i(e),r),c=String(t);return u?u.call(n,c,a):n.slice(a-c.length,a)===c}})},function(t,n,e){\"use strict\";var r=e(0),i=e(75);r(r.P+r.F*e(77)(\"includes\"),\"String\",{includes:function(t){return!!~i(this,t,\"includes\").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(0);r(r.P,\"String\",{repeat:e(70)})},function(t,n,e){\"use strict\";var r=e(0),i=e(6),o=e(75),u=\"\".startsWith;r(r.P+r.F*e(77)(\"startsWith\"),\"String\",{startsWith:function(t){var n=o(this,t,\"startsWith\"),e=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return u?u.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){\"use strict\";e(12)(\"anchor\",(function(t){return function(n){return t(this,\"a\",\"name\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"big\",(function(t){return function(){return t(this,\"big\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"blink\",(function(t){return function(){return t(this,\"blink\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"bold\",(function(t){return function(){return t(this,\"b\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fixed\",(function(t){return function(){return t(this,\"tt\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"fontcolor\",(function(t){return function(n){return t(this,\"font\",\"color\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"fontsize\",(function(t){return function(n){return t(this,\"font\",\"size\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"italics\",(function(t){return function(){return t(this,\"i\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"link\",(function(t){return function(n){return t(this,\"a\",\"href\",n)}}))},function(t,n,e){\"use strict\";e(12)(\"small\",(function(t){return function(){return t(this,\"small\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"strike\",(function(t){return function(){return t(this,\"strike\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sub\",(function(t){return function(){return t(this,\"sub\",\"\",\"\")}}))},function(t,n,e){\"use strict\";e(12)(\"sup\",(function(t){return function(){return t(this,\"sup\",\"\",\"\")}}))},function(t,n,e){var r=e(0);r(r.S,\"Date\",{now:function(){return(new Date).getTime()}})},function(t,n,e){\"use strict\";var r=e(0),i=e(10),o=e(28);r(r.P+r.F*e(2)((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})),\"Date\",{toJSON:function(t){var n=i(this),e=o(n);return\"number\"!=typeof e||isFinite(e)?n.toISOString():null}})},function(t,n,e){var r=e(0),i=e(213);r(r.P+r.F*(Date.prototype.toISOString!==i),\"Date\",{toISOString:i})},function(t,n,e){\"use strict\";var r=e(2),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:\"0\"+t};t.exports=r((function(){return\"0385-07-25T07:06:39.999Z\"!=o.call(new Date(-5e13-1))}))||!r((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError(\"Invalid time value\");var t=this,n=t.getUTCFullYear(),e=t.getUTCMilliseconds(),r=n<0?\"-\":n>9999?\"+\":\"\";return r+(\"00000\"+Math.abs(n)).slice(r?-6:-4)+\"-\"+u(t.getUTCMonth()+1)+\"-\"+u(t.getUTCDate())+\"T\"+u(t.getUTCHours())+\":\"+u(t.getUTCMinutes())+\":\"+u(t.getUTCSeconds())+\".\"+(e>99?e:\"0\"+u(e))+\"Z\"}:o},function(t,n,e){var r=Date.prototype,i=r.toString,o=r.getTime;new Date(NaN)+\"\"!=\"Invalid Date\"&&e(11)(r,\"toString\",(function(){var t=o.call(this);return t==t?i.call(this):\"Invalid Date\"}))},function(t,n,e){var r=e(5)(\"toPrimitive\"),i=Date.prototype;r in i||e(14)(i,r,e(216))},function(t,n,e){\"use strict\";var r=e(3),i=e(28);t.exports=function(t){if(\"string\"!==t&&\"number\"!==t&&\"default\"!==t)throw TypeError(\"Incorrect hint\");return i(r(this),\"number\"!=t)}},function(t,n,e){var r=e(0);r(r.S,\"Array\",{isArray:e(53)})},function(t,n,e){\"use strict\";var r=e(19),i=e(0),o=e(10),u=e(111),a=e(78),c=e(6),s=e(79),f=e(80);i(i.S+i.F*!e(54)((function(t){Array.from(t)})),\"Array\",{from:function(t){var n,e,i,l,h=o(t),d=\"function\"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v,y=0,m=f(h);if(g&&(v=r(v,p>2?arguments[2]:void 0,2)),null==m||d==Array&&a(m))for(e=new d(n=c(h.length));n>y;y++)s(e,y,g?v(h[y],y):h[y]);else for(l=m.call(h),e=new d;!(i=l.next()).done;y++)s(e,y,g?u(l,v,[i.value,y],!0):i.value);return e.length=y,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(79);r(r.S+r.F*e(2)((function(){function t(){}return!(Array.of.call(t)instanceof t)})),\"Array\",{of:function(){for(var t=0,n=arguments.length,e=new(\"function\"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=[].join;r(r.P+r.F*(e(46)!=Object||!e(16)(o)),\"Array\",{join:function(t){return o.call(i(this),void 0===t?\",\":t)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(66),o=e(25),u=e(34),a=e(6),c=[].slice;r(r.P+r.F*e(2)((function(){i&&c.call(i)})),\"Array\",{slice:function(t,n){var e=a(this.length),r=o(this);if(n=void 0===n?e:n,\"Array\"==r)return c.call(this,t,n);for(var i=u(t,e),s=u(n,e),f=a(s-i),l=new Array(f),h=0;h<f;h++)l[h]=\"String\"==r?this.charAt(i+h):this[i+h];return l}})},function(t,n,e){\"use strict\";var r=e(0),i=e(20),o=e(10),u=e(2),a=[].sort,c=[1,2,3];r(r.P+r.F*(u((function(){c.sort(void 0)}))||!u((function(){c.sort(null)}))||!e(16)(a)),\"Array\",{sort:function(t){return void 0===t?a.call(o(this)):a.call(o(this),i(t))}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(0),o=e(16)([].forEach,!0);r(r.P+r.F*!o,\"Array\",{forEach:function(t){return i(this,t,arguments[1])}})},function(t,n,e){var r=e(4),i=e(53),o=e(5)(\"species\");t.exports=function(t){var n;return i(t)&&(\"function\"!=typeof(n=t.constructor)||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&null===(n=n[o])&&(n=void 0)),void 0===n?Array:n}},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(1);r(r.P+r.F*!e(16)([].map,!0),\"Array\",{map:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(2);r(r.P+r.F*!e(16)([].filter,!0),\"Array\",{filter:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(3);r(r.P+r.F*!e(16)([].some,!0),\"Array\",{some:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(4);r(r.P+r.F*!e(16)([].every,!0),\"Array\",{every:function(t){return i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduce,!0),\"Array\",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(113);r(r.P+r.F*!e(16)([].reduceRight,!0),\"Array\",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(u||!e(16)(o)),\"Array\",{indexOf:function(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,e){\"use strict\";var r=e(0),i=e(15),o=e(21),u=e(6),a=[].lastIndexOf,c=!!a&&1/[1].lastIndexOf(1,-0)<0;r(r.P+r.F*(c||!e(16)(a)),\"Array\",{lastIndexOf:function(t){if(c)return a.apply(this,arguments)||0;var n=i(this),e=u(n.length),r=e-1;for(arguments.length>1&&(r=Math.min(r,o(arguments[1]))),r<0&&(r=e+r);r>=0;r--)if(r in n&&n[r]===t)return r||0;return-1}})},function(t,n,e){var r=e(0);r(r.P,\"Array\",{copyWithin:e(114)}),e(38)(\"copyWithin\")},function(t,n,e){var r=e(0);r(r.P,\"Array\",{fill:e(81)}),e(38)(\"fill\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(5),o=!0;\"find\"in[]&&Array(1).find((function(){o=!1})),r(r.P+r.F*o,\"Array\",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"find\")},function(t,n,e){\"use strict\";var r=e(0),i=e(24)(6),o=\"findIndex\",u=!0;o in[]&&Array(1)[o]((function(){u=!1})),r(r.P+r.F*u,\"Array\",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(o)},function(t,n,e){e(43)(\"Array\")},function(t,n,e){var r=e(1),i=e(69),o=e(9).f,u=e(36).f,a=e(76),c=e(55),s=r.RegExp,f=s,l=s.prototype,h=/a/g,d=/a/g,p=new s(h)!==h;if(e(8)&&(!p||e(2)((function(){return d[e(5)(\"match\")]=!1,s(h)!=h||s(d)==d||\"/a/i\"!=s(h,\"i\")})))){s=function(t,n){var e=this instanceof s,r=a(t),o=void 0===n;return!e&&r&&t.constructor===s&&o?t:i(p?new f(r&&!o?t.source:t,n):f((r=t instanceof s)?t.source:t,r&&o?c.call(t):n),e?this:l,s)};for(var v=function(t){t in s||o(s,t,{configurable:!0,get:function(){return f[t]},set:function(n){f[t]=n}})},g=u(f),y=0;g.length>y;)v(g[y++]);l.constructor=s,s.prototype=l,e(11)(r,\"RegExp\",s)}e(43)(\"RegExp\")},function(t,n,e){\"use strict\";e(117);var r=e(3),i=e(55),o=e(8),u=/./.toString,a=function(t){e(11)(RegExp.prototype,\"toString\",t,!0)};e(2)((function(){return\"/a/b\"!=u.call({source:\"a\",flags:\"b\"})}))?a((function(){var t=r(this);return\"/\".concat(t.source,\"/\",\"flags\"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)})):\"toString\"!=u.name&&a((function(){return u.call(this)}))},function(t,n,e){\"use strict\";var r=e(3),i=e(6),o=e(84),u=e(56);e(57)(\"match\",1,(function(t,n,e,a){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=a(e,t,this);if(n.done)return n.value;var c=r(t),s=String(this);if(!c.global)return u(c,s);var f=c.unicode;c.lastIndex=0;for(var l,h=[],d=0;null!==(l=u(c,s));){var p=String(l[0]);h[d]=p,\"\"===p&&(c.lastIndex=o(s,i(c.lastIndex),f)),d++}return 0===d?null:h}]}))},function(t,n,e){\"use strict\";var r=e(3),i=e(10),o=e(6),u=e(21),a=e(84),c=e(56),s=Math.max,f=Math.min,l=Math.floor,h=/\\$([$&`']|\\d\\d?|<[^>]*>)/g,d=/\\$([$&`']|\\d\\d?)/g;e(57)(\"replace\",2,(function(t,n,e,p){return[function(r,i){var o=t(this),u=null==r?void 0:r[n];return void 0!==u?u.call(r,o,i):e.call(String(o),r,i)},function(t,n){var i=p(e,t,this,n);if(i.done)return i.value;var l=r(t),h=String(this),d=\"function\"==typeof n;d||(n=String(n));var g=l.global;if(g){var y=l.unicode;l.lastIndex=0}for(var m=[];;){var b=c(l,h);if(null===b)break;if(m.push(b),!g)break;\"\"===String(b[0])&&(l.lastIndex=a(h,o(l.lastIndex),y))}for(var S,w=\"\",_=0,M=0;M<m.length;M++){b=m[M];for(var x=String(b[0]),P=s(f(u(b.index),h.length),0),O=[],A=1;A<b.length;A++)O.push(void 0===(S=b[A])?S:String(S));var F=b.groups;if(d){var E=[x].concat(O,P,h);void 0!==F&&E.push(F);var N=String(n.apply(void 0,E))}else N=v(x,h,P,O,F,n);P>=_&&(w+=h.slice(_,P)+N,_=P+x.length)}return w+h.slice(_)}];function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==u&&(u=i(u),f=h),e.call(a,f,(function(e,i){var a;switch(i.charAt(0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return n.slice(0,r);case\"'\":return n.slice(c);case\"<\":a=u[i.slice(1,-1)];break;default:var f=+i;if(0===f)return e;if(f>s){var h=l(f/10);return 0===h?e:h<=s?void 0===o[h-1]?i.charAt(1):o[h-1]+i.charAt(1):e}a=o[f-1]}return void 0===a?\"\":a}))}}))},function(t,n,e){\"use strict\";var r=e(3),i=e(102),o=e(56);e(57)(\"search\",1,(function(t,n,e,u){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=u(e,t,this);if(n.done)return n.value;var a=r(t),c=String(this),s=a.lastIndex;i(s,0)||(a.lastIndex=0);var f=o(a,c);return i(a.lastIndex,s)||(a.lastIndex=s),null===f?-1:f.index}]}))},function(t,n,e){\"use strict\";var r=e(76),i=e(3),o=e(49),u=e(84),a=e(6),c=e(56),s=e(83),f=e(2),l=Math.min,h=[].push,d=!f((function(){RegExp(4294967295,\"y\")}));e(57)(\"split\",2,(function(t,n,e,f){var p;return p=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var i=String(this);if(void 0===t&&0===n)return[];if(!r(t))return e.call(i,t,n);for(var o,u,a,c=[],f=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),l=0,d=void 0===n?4294967295:n>>>0,p=new RegExp(t.source,f+\"g\");(o=s.call(p,i))&&!((u=p.lastIndex)>l&&(c.push(i.slice(l,o.index)),o.length>1&&o.index<i.length&&h.apply(c,o.slice(1)),a=o[0].length,l=u,c.length>=d));)p.lastIndex===o.index&&p.lastIndex++;return l===i.length?!a&&p.test(\"\")||c.push(\"\"):c.push(i.slice(l)),c.length>d?c.slice(0,d):c}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,r){var i=t(this),o=null==e?void 0:e[n];return void 0!==o?o.call(e,i,r):p.call(String(i),e,r)},function(t,n){var r=f(p,t,this,n,p!==e);if(r.done)return r.value;var s=i(t),h=String(this),v=o(s,RegExp),g=s.unicode,y=(s.ignoreCase?\"i\":\"\")+(s.multiline?\"m\":\"\")+(s.unicode?\"u\":\"\")+(d?\"y\":\"g\"),m=new v(d?s:\"^(?:\"+s.source+\")\",y),b=void 0===n?4294967295:n>>>0;if(0===b)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var S=0,w=0,_=[];w<h.length;){m.lastIndex=d?w:0;var M,x=c(m,d?h:h.slice(w));if(null===x||(M=l(a(m.lastIndex+(d?0:w)),h.length))===S)w=u(h,w,g);else{if(_.push(h.slice(S,w)),_.length===b)return _;for(var P=1;P<=x.length-1;P++)if(_.push(x[P]),_.length===b)return _;w=S=M}}return _.push(h.slice(S)),_}]}))},function(t,n,e){var r=e(1),i=e(85).set,o=r.MutationObserver||r.WebKitMutationObserver,u=r.process,a=r.Promise,c=\"process\"==e(25)(u);t.exports=function(){var t,n,e,s=function(){var r,i;for(c&&(r=u.domain)&&r.exit();t;){i=t.fn,t=t.next;try{i()}catch(r){throw t?e():n=void 0,r}}n=void 0,r&&r.enter()};if(c)e=function(){u.nextTick(s)};else if(!o||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var f=a.resolve(void 0);e=function(){f.then(s)}}else e=function(){i.call(r,s)};else{var l=!0,h=document.createTextNode(\"\");new o(s).observe(h,{characterData:!0}),e=function(){h.data=l=!l}}return function(r){var i={fn:r,next:void 0};n&&(n.next=i),t||(t=i,e()),n=i}}},function(t,n){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Map\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{get:function(t){var n=r.getEntry(i(this,\"Map\"),t);return n&&n.v},set:function(t,n){return r.def(i(this,\"Map\"),0===t?0:t,n)}},r,!0)},function(t,n,e){\"use strict\";var r=e(121),i=e(39);t.exports=e(60)(\"Set\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"Set\"),t=0===t?0:t,t)}},r)},function(t,n,e){\"use strict\";var r,i=e(1),o=e(24)(0),u=e(11),a=e(29),c=e(101),s=e(122),f=e(4),l=e(39),h=e(39),d=!i.ActiveXObject&&\"ActiveXObject\"in i,p=a.getWeak,v=Object.isExtensible,g=s.ufstore,y=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(f(t)){var n=p(t);return!0===n?g(l(this,\"WeakMap\")).get(t):n?n[this._i]:void 0}},set:function(t,n){return s.def(l(this,\"WeakMap\"),t,n)}},b=t.exports=e(60)(\"WeakMap\",y,m,s,!0,!0);h&&d&&(c((r=s.getConstructor(y,\"WeakMap\")).prototype,m),a.NEED=!0,o([\"delete\",\"has\",\"get\",\"set\"],(function(t){var n=b.prototype,e=n[t];u(n,t,(function(n,i){if(f(n)&&!v(n)){this._f||(this._f=new r);var o=this._f[t](n,i);return\"set\"==t?this:o}return e.call(this,n,i)}))})))},function(t,n,e){\"use strict\";var r=e(122),i=e(39);e(60)(\"WeakSet\",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,\"WeakSet\"),t,!0)}},r,!1,!0)},function(t,n,e){\"use strict\";var r=e(0),i=e(61),o=e(86),u=e(3),a=e(34),c=e(6),s=e(4),f=e(1).ArrayBuffer,l=e(49),h=o.ArrayBuffer,d=o.DataView,p=i.ABV&&f.isView,v=h.prototype.slice,g=i.VIEW;r(r.G+r.W+r.F*(f!==h),{ArrayBuffer:h}),r(r.S+r.F*!i.CONSTR,\"ArrayBuffer\",{isView:function(t){return p&&p(t)||s(t)&&g in t}}),r(r.P+r.U+r.F*e(2)((function(){return!new h(2).slice(1,void 0).byteLength})),\"ArrayBuffer\",{slice:function(t,n){if(void 0!==v&&void 0===n)return v.call(u(this),t);for(var e=u(this).byteLength,r=a(t,e),i=a(void 0===n?e:n,e),o=new(l(this,h))(c(i-r)),s=new d(this),f=new d(o),p=0;r<i;)f.setUint8(p++,s.getUint8(r++));return o}}),e(43)(\"ArrayBuffer\")},function(t,n,e){var r=e(0);r(r.G+r.W+r.F*!e(61).ABV,{DataView:e(86).DataView})},function(t,n,e){e(27)(\"Int8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint8\",1,(function(t){return function(n,e,r){return t(this,n,e,r)}}),!0)},function(t,n,e){e(27)(\"Int16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint16\",2,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Int32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Uint32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float32\",4,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){e(27)(\"Float64\",8,(function(t){return function(n,e,r){return t(this,n,e,r)}}))},function(t,n,e){var r=e(0),i=e(20),o=e(3),u=(e(1).Reflect||{}).apply,a=Function.apply;r(r.S+r.F*!e(2)((function(){u((function(){}))})),\"Reflect\",{apply:function(t,n,e){var r=i(t),c=o(e);return u?u(r,n,c):a.call(r,n,c)}})},function(t,n,e){var r=e(0),i=e(35),o=e(20),u=e(3),a=e(4),c=e(2),s=e(103),f=(e(1).Reflect||{}).construct,l=c((function(){function t(){}return!(f((function(){}),[],t)instanceof t)})),h=!c((function(){f((function(){}))}));r(r.S+r.F*(l||h),\"Reflect\",{construct:function(t,n){o(t),u(n);var e=arguments.length<3?t:o(arguments[2]);if(h&&!l)return f(t,n,e);if(t==e){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var r=[null];return r.push.apply(r,n),new(s.apply(t,r))}var c=e.prototype,d=i(a(c)?c:Object.prototype),p=Function.apply.call(t,d,n);return a(p)?p:d}})},function(t,n,e){var r=e(9),i=e(0),o=e(3),u=e(28);i(i.S+i.F*e(2)((function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})})),\"Reflect\",{defineProperty:function(t,n,e){o(t),n=u(n,!0),o(e);try{return r.f(t,n,e),!0}catch(t){return!1}}})},function(t,n,e){var r=e(0),i=e(22).f,o=e(3);r(r.S,\"Reflect\",{deleteProperty:function(t,n){var e=i(o(t),n);return!(e&&!e.configurable)&&delete t[n]}})},function(t,n,e){\"use strict\";var r=e(0),i=e(3),o=function(t){this._t=i(t),this._i=0;var n,e=this._k=[];for(n in t)e.push(n)};e(110)(o,\"Object\",(function(){var t,n=this._k;do{if(this._i>=n.length)return{value:void 0,done:!0}}while(!((t=n[this._i++])in this._t));return{value:t,done:!1}})),r(r.S,\"Reflect\",{enumerate:function(t){return new o(t)}})},function(t,n,e){var r=e(22),i=e(37),o=e(13),u=e(0),a=e(4),c=e(3);u(u.S,\"Reflect\",{get:function t(n,e){var u,s,f=arguments.length<3?n:arguments[2];return c(n)===f?n[e]:(u=r.f(n,e))?o(u,\"value\")?u.value:void 0!==u.get?u.get.call(f):void 0:a(s=i(n))?t(s,e,f):void 0}})},function(t,n,e){var r=e(22),i=e(0),o=e(3);i(i.S,\"Reflect\",{getOwnPropertyDescriptor:function(t,n){return r.f(o(t),n)}})},function(t,n,e){var r=e(0),i=e(37),o=e(3);r(r.S,\"Reflect\",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{has:function(t,n){return n in t}})},function(t,n,e){var r=e(0),i=e(3),o=Object.isExtensible;r(r.S,\"Reflect\",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,e){var r=e(0);r(r.S,\"Reflect\",{ownKeys:e(124)})},function(t,n,e){var r=e(0),i=e(3),o=Object.preventExtensions;r(r.S,\"Reflect\",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,e){var r=e(9),i=e(22),o=e(37),u=e(13),a=e(0),c=e(30),s=e(3),f=e(4);a(a.S,\"Reflect\",{set:function t(n,e,a){var l,h,d=arguments.length<4?n:arguments[3],p=i.f(s(n),e);if(!p){if(f(h=o(n)))return t(h,e,a,d);p=c(0)}if(u(p,\"value\")){if(!1===p.writable||!f(d))return!1;if(l=i.f(d,e)){if(l.get||l.set||!1===l.writable)return!1;l.value=a,r.f(d,e,l)}else r.f(d,e,c(0,a));return!0}return void 0!==p.set&&(p.set.call(d,a),!0)}})},function(t,n,e){var r=e(0),i=e(67);i&&r(r.S,\"Reflect\",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,e){e(276),t.exports=e(7).Array.includes},function(t,n,e){\"use strict\";var r=e(0),i=e(51)(!0);r(r.P,\"Array\",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(\"includes\")},function(t,n,e){e(278),t.exports=e(7).Array.flatMap},function(t,n,e){\"use strict\";var r=e(0),i=e(279),o=e(10),u=e(6),a=e(20),c=e(112);r(r.P,\"Array\",{flatMap:function(t){var n,e,r=o(this);return a(t),n=u(r.length),e=c(r,0),i(e,r,r,n,0,1,t,arguments[1]),e}}),e(38)(\"flatMap\")},function(t,n,e){\"use strict\";var r=e(53),i=e(4),o=e(6),u=e(19),a=e(5)(\"isConcatSpreadable\");t.exports=function t(n,e,c,s,f,l,h,d){for(var p,v,g=f,y=0,m=!!h&&u(h,d,3);y<s;){if(y in c){if(p=m?m(c[y],y,e):c[y],v=!1,i(p)&&(v=void 0!==(v=p[a])?!!v:r(p)),v&&l>0)g=t(n,e,p,o(p.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();n[g]=p}g++}y++}return g}},function(t,n,e){e(281),t.exports=e(7).String.padStart},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,e){e(283),t.exports=e(7).String.padEnd},function(t,n,e){\"use strict\";var r=e(0),i=e(125),o=e(59),u=/Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(o);r(r.P+r.F*u,\"String\",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,e){e(285),t.exports=e(7).String.trimLeft},function(t,n,e){\"use strict\";e(41)(\"trimLeft\",(function(t){return function(){return t(this,1)}}),\"trimStart\")},function(t,n,e){e(287),t.exports=e(7).String.trimRight},function(t,n,e){\"use strict\";e(41)(\"trimRight\",(function(t){return function(){return t(this,2)}}),\"trimEnd\")},function(t,n,e){e(289),t.exports=e(63).f(\"asyncIterator\")},function(t,n,e){e(97)(\"asyncIterator\")},function(t,n,e){e(291),t.exports=e(7).Object.getOwnPropertyDescriptors},function(t,n,e){var r=e(0),i=e(124),o=e(15),u=e(22),a=e(79);r(r.S,\"Object\",{getOwnPropertyDescriptors:function(t){for(var n,e,r=o(t),c=u.f,s=i(r),f={},l=0;s.length>l;)void 0!==(e=c(r,n=s[l++]))&&a(f,n,e);return f}})},function(t,n,e){e(293),t.exports=e(7).Object.values},function(t,n,e){var r=e(0),i=e(126)(!1);r(r.S,\"Object\",{values:function(t){return i(t)}})},function(t,n,e){e(295),t.exports=e(7).Object.entries},function(t,n,e){var r=e(0),i=e(126)(!0);r(r.S,\"Object\",{entries:function(t){return i(t)}})},function(t,n,e){\"use strict\";e(118),e(297),t.exports=e(7).Promise.finally},function(t,n,e){\"use strict\";var r=e(0),i=e(7),o=e(1),u=e(49),a=e(120);r(r.P+r.R,\"Promise\",{finally:function(t){var n=u(this,i.Promise||o.Promise),e=\"function\"==typeof t;return this.then(e?function(e){return a(n,t()).then((function(){return e}))}:t,e?function(e){return a(n,t()).then((function(){throw e}))}:t)}})},function(t,n,e){e(299),e(300),e(301),t.exports=e(7)},function(t,n,e){var r=e(1),i=e(0),o=e(59),u=[].slice,a=/MSIE .\\./.test(o),c=function(t){return function(n,e){var r=arguments.length>2,i=!!r&&u.call(arguments,2);return t(r?function(){(\"function\"==typeof n?n:Function(n)).apply(this,i)}:n,e)}};i(i.G+i.B+i.F*a,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(t,n,e){var r=e(0),i=e(85);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,e){for(var r=e(82),i=e(33),o=e(11),u=e(1),a=e(14),c=e(42),s=e(5),f=s(\"iterator\"),l=s(\"toStringTag\"),h=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),v=0;v<p.length;v++){var g,y=p[v],m=d[y],b=u[y],S=b&&b.prototype;if(S&&(S[f]||a(S,f,h),S[l]||a(S,l,y),c[y]=h,m))for(g in r)S[g]||o(S,g,r[g],!0)}},function(t,n,e){var r=function(t){\"use strict\";var n,e=Object.prototype,r=e.hasOwnProperty,i=\"function\"==typeof Symbol?Symbol:{},o=i.iterator||\"@@iterator\",u=i.asyncIterator||\"@@asyncIterator\",a=i.toStringTag||\"@@toStringTag\";function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.create(i.prototype),u=new A(r||[]);return o._invoke=function(t,n,e){var r=f;return function(i,o){if(r===h)throw new Error(\"Generator is already running\");if(r===d){if(\"throw\"===i)throw o;return E()}for(e.method=i,e.arg=o;;){var u=e.delegate;if(u){var a=x(u,e);if(a){if(a===p)continue;return a}}if(\"next\"===e.method)e.sent=e._sent=e.arg;else if(\"throw\"===e.method){if(r===f)throw r=d,e.arg;e.dispatchException(e.arg)}else\"return\"===e.method&&e.abrupt(\"return\",e.arg);r=h;var c=s(t,n,e);if(\"normal\"===c.type){if(r=e.done?d:l,c.arg===p)continue;return{value:c.arg,done:e.done}}\"throw\"===c.type&&(r=d,e.method=\"throw\",e.arg=c.arg)}}}(t,e,u),o}function s(t,n,e){try{return{type:\"normal\",arg:t.call(n,e)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=c;var f=\"suspendedStart\",l=\"suspendedYield\",h=\"executing\",d=\"completed\",p={};function v(){}function g(){}function y(){}var m={};m[o]=function(){return this};var b=Object.getPrototypeOf,S=b&&b(b(F([])));S&&S!==e&&r.call(S,o)&&(m=S);var w=y.prototype=v.prototype=Object.create(m);function _(t){[\"next\",\"throw\",\"return\"].forEach((function(n){t[n]=function(t){return this._invoke(n,t)}}))}function M(t){var n;this._invoke=function(e,i){function o(){return new Promise((function(n,o){!function n(e,i,o,u){var a=s(t[e],t,i);if(\"throw\"!==a.type){var c=a.arg,f=c.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?Promise.resolve(f.__await).then((function(t){n(\"next\",t,o,u)}),(function(t){n(\"throw\",t,o,u)})):Promise.resolve(f).then((function(t){c.value=t,o(c)}),(function(t){return n(\"throw\",t,o,u)}))}u(a.arg)}(e,i,n,o)}))}return n=n?n.then(o,o):o()}}function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=n,x(t,e),\"throw\"===e.method))return p;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return p}var i=s(r,t.iterator,e.arg);if(\"throw\"===i.type)return e.method=\"throw\",e.arg=i.arg,e.delegate=null,p;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=n),e.delegate=null,p):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,p)}function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function O(t){var n=t.completion||{};n.type=\"normal\",delete n.arg,t.completion=n}function A(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(P,this),this.reset(!0)}function F(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,u=function e(){for(;++i<t.length;)if(r.call(t,i))return e.value=t[i],e.done=!1,e;return e.value=n,e.done=!0,e};return u.next=u}}return{next:E}}function E(){return{value:n,done:!0}}return g.prototype=w.constructor=y,y.constructor=g,y[a]=g.displayName=\"GeneratorFunction\",t.isGeneratorFunction=function(t){var n=\"function\"==typeof t&&t.constructor;return!!n&&(n===g||\"GeneratorFunction\"===(n.displayName||n.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,y):(t.__proto__=y,a in t||(t[a]=\"GeneratorFunction\")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},_(M.prototype),M.prototype[u]=function(){return this},t.AsyncIterator=M,t.async=function(n,e,r,i){var o=new M(c(n,e,r,i));return t.isGeneratorFunction(e)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},_(w),w[a]=\"Generator\",w[o]=function(){return this},w.toString=function(){return\"[object Generator]\"},t.keys=function(t){var n=[];for(var e in t)n.push(e);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=F,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=n,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=n)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function i(r,i){return a.type=\"throw\",a.arg=t,e.next=r,i&&(e.method=\"next\",e.arg=n),!!i}for(var o=this.tryEntries.length-1;o>=0;--o){var u=this.tryEntries[o],a=u.completion;if(\"root\"===u.tryLoc)return i(\"end\");if(u.tryLoc<=this.prev){var c=r.call(u,\"catchLoc\"),s=r.call(u,\"finallyLoc\");if(c&&s){if(this.prev<u.catchLoc)return i(u.catchLoc,!0);if(this.prev<u.finallyLoc)return i(u.finallyLoc)}else if(c){if(this.prev<u.catchLoc)return i(u.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<u.finallyLoc)return i(u.finallyLoc)}}}},abrupt:function(t,n){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc<=this.prev&&r.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var o=i;break}}o&&(\"break\"===t||\"continue\"===t)&&o.tryLoc<=n&&n<=o.finallyLoc&&(o=null);var u=o?o.completion:{};return u.type=t,u.arg=n,o?(this.method=\"next\",this.next=o.finallyLoc,p):this.complete(u)},complete:function(t,n){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&n&&(this.next=n),p},finish:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),O(e),p}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc===t){var r=e.completion;if(\"throw\"===r.type){var i=r.arg;O(e)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:F(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=n),p}},t}(t.exports);try{regeneratorRuntime=r}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(r)}},function(t,n,e){e(304),t.exports=e(127).global},function(t,n,e){var r=e(305);r(r.G,{global:e(87)})},function(t,n,e){var r=e(87),i=e(127),o=e(306),u=e(308),a=e(315),c=function(t,n,e){var s,f,l,h=t&c.F,d=t&c.G,p=t&c.S,v=t&c.P,g=t&c.B,y=t&c.W,m=d?i:i[n]||(i[n]={}),b=m.prototype,S=d?r:p?r[n]:(r[n]||{}).prototype;for(s in d&&(e=n),e)(f=!h&&S&&void 0!==S[s])&&a(m,s)||(l=f?S[s]:e[s],m[s]=d&&\"function\"!=typeof S[s]?e[s]:g&&f?o(l,r):y&&S[s]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n.prototype=t.prototype,n}(l):v&&\"function\"==typeof l?o(Function.call,l):l,v&&((m.virtual||(m.virtual={}))[s]=l,t&c.R&&b&&!b[s]&&u(b,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n,e){var r=e(307);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n,e){var r=e(309),i=e(314);t.exports=e(89)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(310),i=e(311),o=e(313),u=Object.defineProperty;n.f=e(89)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if(\"get\"in e||\"set\"in e)throw TypeError(\"Accessors not supported!\");return\"value\"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(88);t.exports=function(t){if(!r(t))throw TypeError(t+\" is not an object!\");return t}},function(t,n,e){t.exports=!e(89)&&!e(128)((function(){return 7!=Object.defineProperty(e(312)(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(88),i=e(87).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){var r=e(88);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if(\"function\"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&\"function\"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}}])}));\n    \n\n// begin:./golly/golly.js\n/* golly.js : v0.0.1 on 09/12/2012\n* http://dannygarcia.github.com/golly/\n* Copyright (c) 2012 Danny Garcia; Licensed MIT */\n\n/* changes by Ben Fisher 2017:\n    add event for resize.\n    remove support for mousedrag.\n    remove misleading 'key' because it's not actually the key\n    etc.\n    new options:\n        'eatallkeyevents'\n        'enablecontextmenu'\n        'includeallmousemoveevents'\n*/\n\n// Base\nwindow['GOLLY'] = function(params) {\n\n    if ( !params ) {\n        params = {};\n    }\n\n    // Do we support canvas?\n    if ( !document.createElement('canvas').getContext ) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    var _this = this,\n        k = 1e3,\n        _privateParts =\n        {\n            'ctx' : undefined,\n            'domElement' : undefined,\n            'width' : undefined,\n            'height' : undefined,\n            'desiredFrameTime' : k/60,\n            'frameCount' : 0,\n            'milliseconds' : 0,\n            'pmouseX' : 0,\n            'pmouseY' : 0,\n            'eatallkeyevents': params['eatallkeyevents'] === true,\n            'includeallmousemoveevents': params['includeallmousemoveevents'] === true,\n            'offset' : {x:0, y:0}\n        },\n        _actualFrameTime,\n        d; // shorthand for the dom element\n\n    var getOffset = function() {\n        var obj = d;\n        var x = 0, y = 0;\n        while (obj) {\n            y += obj.offsetTop;\n            x += obj.offsetLeft;\n            obj = obj.offsetParent;\n        }\n        _privateParts['offset'].x = x;\n        _privateParts['offset'].y = y;\n    };\n\n    // Default parameters\n\n    if ( !params['context'] ) {\n        params['context'] = '2d';\n    }\n\n\n    // Create domElement, grab context\n\n    d = _privateParts['domElement'] = document.createElement('canvas');\n    _privateParts['ctx'] = d.getContext( params['context'] );\n\n    // Are we capable of this context?\n\n    if (_privateParts['ctx'] === null) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    // Set up width and height setters / listeners\n    \n    if ( params['customsizing'] ) {\n        // mode introduced by Ben Fisher, 2017.\n        var onResize = function() {\n            getOffset();\n            if (_this['onresize']) {\n                return _this['onresize']();\n            }\n        }\n        \n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n        document.body.style.margin = '0px';\n        document.body.style.padding = '0px';\n        document.body.style.overflow = 'hidden';\n        params['container'] = document.body;\n        \n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n    }\n    else if ( params['fullscreen'] ) {\n\n        var onResize = function() {\n\n            getOffset();\n\n            if ( params['width'] ) {\n                _privateParts['width'] = d['width'] = params['width'];\n            } else {\n                _privateParts['width'] = d['width'] = window.innerWidth;\n            }\n\n            if ( params['height'] ) {\n                _privateParts['height'] = d['height'] = params['height'];\n            } else {\n\n                _privateParts['height'] = d['height'] = window.innerHeight;\n            }\n\n            if ( !_this.loop ) {\n                if ( _this['draw'] ) {\n                    _this['draw']();\n                }\n            }\n        };\n\n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n\n        if ( !params['container'] ) {\n            document.body.style.margin = '0px';\n            document.body.style.padding = '0px';\n            document.body.style.overflow = 'hidden';\n        }\n\n        params['container'] = params['container'] || document.body;\n\n\n    } else {\n\n        if ( !params['width'] ) {\n            params['width'] = 500;\n        }\n\n        if ( !params['height'] ) {\n            params['height'] = 500;\n        }\n\n\n\n        window.addEventListener( 'resize', getOffset, false );\n        getOffset();\n\n\n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n\n        _this['width'] = params['width'];\n        _this['height'] = params['height'];\n\n    }\n\n    // Put it where we talked about (if we talked about it).\n\n    if ( params['container'] ) {\n        if ( params['fnaddtodom'] ) {\n            params['fnaddtodom'](params['container'], d);\n        } else {\n            params['container'].appendChild(d);\n        }\n        getOffset();\n    }\n\n    var getter = function(n) {\n        _this.__defineGetter__(n, function() {\n            return _privateParts[n];\n        });\n    };\n\n    // Would love to reduce this to params.\n\n    getter('ctx');\n    getter('domElement');\n    getter('width');\n    getter('height');\n    getter('frameCount');\n    getter('milliseconds');\n    getter('pmouseX');\n    getter('pmouseY');\n\n    var no_op = function() {};\n\n    _this['loop'] = true;\n    _this['draw'] = no_op;\n    _this['onresize'] = no_op;\n    _this['keydown'] = no_op;\n    _this['keyup'] = no_op;\n    _this['mousedown'] = no_op;\n    _this['mouseup'] = no_op;\n    _this['mousemove'] = no_op;\n\n    // Custom Getters & Setters\n    _this.__defineGetter__('frameRate', function(v) {\n        return 1E3/_actualFrameTime;\n    });\n\n    _this.__defineGetter__('frameTime', function(v) {\n        return _actualFrameTime;\n    });\n\n    _this.__defineSetter__('frameTime', function(v) {\n        _privateParts['desiredFrameTime'] = v;\n    });\n\n    _this.__defineSetter__('frameRate', function(v) {\n        _privateParts['desiredFrameTime'] = k/v;\n    });\n    \n    // Disable context menu\n    if (!params['enablecontextmenu']) {\n        _privateParts['domElement'].oncontextmenu = function (e) {\n            e.preventDefault();\n            return false;\n        };\n    }\n\n    // Listeners\n    window.addEventListener('keydown', function(e) {\n        // note -- requires a fairly recent standards-compliant browser\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keydown'](keycode, keychar, e.repeat, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n    \n    window.addEventListener('keyup', function(e) {\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keyup'](keycode, keychar, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n\n    _privateParts['domElement'].addEventListener('mousedown', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mousedown'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    _privateParts['domElement'].addEventListener('mouseup', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mouseup'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    let listenOn = _privateParts['domElement']\n    if (_privateParts['includeallmousemoveevents']) {\n        listenOn = window\n    }\n\n    listenOn.addEventListener('mousemove', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        _this['mousemove'](x, y, e.button, e.buttons, _privateParts['pmouseX'], _privateParts['pmouseY'], e.ctrlKey, e.altKey, e.shiftKey);\n        _privateParts['pmouseX'] = x;\n        _privateParts['pmouseY'] = y;\n    }, false);\n\n    // Internal loop.\n    if (params['trackFrameTime'] === false) {\n        _privateParts['_idraw'] = function(milliseconds) {\n            _privateParts['milliseconds'] = milliseconds;\n            _privateParts['frameCount']++;\n            _this['draw']();\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw'](performance.now());\n        \n    } else {\n        window.requestAnimationFrame = (function(){\n            return window.requestAnimationFrame   ||\n                window.webkitRequestAnimationFrame ||\n                window.mozRequestAnimationFrame    ||\n                window.oRequestAnimationFrame      ||\n                window.msRequestAnimationFrame     ||\n                function( callback ){\n                    window.setTimeout(callback, 1000 / 60);\n                };\n        }());\n\n        _privateParts['_idraw'] = function() {\n            _privateParts['frameCount']++;\n            var prev = new Date().getTime();\n            _this['draw']();\n            var delta = new Date().getTime() - prev;\n\n            if (delta > _privateParts['desiredFrameTime']) {\n                _actualFrameTime = delta;\n            } else {\n                _actualFrameTime = _privateParts['desiredFrameTime'];\n            }\n\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw']();\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/external/golly/golly.js",
    "content": "/* golly.js : v0.0.1 on 09/12/2012\n* http://dannygarcia.github.com/golly/\n* Copyright (c) 2012 Danny Garcia; Licensed MIT */\n\n/* changes by Ben Fisher 2017:\n    add event for resize.\n    remove support for mousedrag.\n    remove misleading 'key' because it's not actually the key\n    etc.\n    new options:\n        'eatallkeyevents'\n        'enablecontextmenu'\n        'includeallmousemoveevents'\n*/\n\n// Base\nwindow['GOLLY'] = function(params) {\n\n    if ( !params ) {\n        params = {};\n    }\n\n    // Do we support canvas?\n    if ( !document.createElement('canvas').getContext ) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    var _this = this,\n        k = 1e3,\n        _privateParts =\n        {\n            'ctx' : undefined,\n            'domElement' : undefined,\n            'width' : undefined,\n            'height' : undefined,\n            'desiredFrameTime' : k/60,\n            'frameCount' : 0,\n            'milliseconds' : 0,\n            'pmouseX' : 0,\n            'pmouseY' : 0,\n            'eatallkeyevents': params['eatallkeyevents'] === true,\n            'includeallmousemoveevents': params['includeallmousemoveevents'] === true,\n            'offset' : {x:0, y:0}\n        },\n        _actualFrameTime,\n        d; // shorthand for the dom element\n\n    var getOffset = function() {\n        var obj = d;\n        var x = 0, y = 0;\n        while (obj) {\n            y += obj.offsetTop;\n            x += obj.offsetLeft;\n            obj = obj.offsetParent;\n        }\n        _privateParts['offset'].x = x;\n        _privateParts['offset'].y = y;\n    };\n\n    // Default parameters\n\n    if ( !params['context'] ) {\n        params['context'] = '2d';\n    }\n\n\n    // Create domElement, grab context\n\n    d = _privateParts['domElement'] = document.createElement('canvas');\n    _privateParts['ctx'] = d.getContext( params['context'] );\n\n    // Are we capable of this context?\n\n    if (_privateParts['ctx'] === null) {\n        if ( params.fallback ) {\n            params.fallback();\n        }\n        return;\n    }\n\n    // Set up width and height setters / listeners\n    \n    if ( params['customsizing'] ) {\n        // mode introduced by Ben Fisher, 2017.\n        var onResize = function() {\n            getOffset();\n            if (_this['onresize']) {\n                return _this['onresize']();\n            }\n        }\n        \n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n        document.body.style.margin = '0px';\n        document.body.style.padding = '0px';\n        document.body.style.overflow = 'hidden';\n        params['container'] = document.body;\n        \n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n    }\n    else if ( params['fullscreen'] ) {\n\n        var onResize = function() {\n\n            getOffset();\n\n            if ( params['width'] ) {\n                _privateParts['width'] = d['width'] = params['width'];\n            } else {\n                _privateParts['width'] = d['width'] = window.innerWidth;\n            }\n\n            if ( params['height'] ) {\n                _privateParts['height'] = d['height'] = params['height'];\n            } else {\n\n                _privateParts['height'] = d['height'] = window.innerHeight;\n            }\n\n            if ( !_this.loop ) {\n                if ( _this['draw'] ) {\n                    _this['draw']();\n                }\n            }\n        };\n\n        window.addEventListener( 'resize', onResize, false );\n        onResize();\n\n        if ( !params['container'] ) {\n            document.body.style.margin = '0px';\n            document.body.style.padding = '0px';\n            document.body.style.overflow = 'hidden';\n        }\n\n        params['container'] = params['container'] || document.body;\n\n\n    } else {\n\n        if ( !params['width'] ) {\n            params['width'] = 500;\n        }\n\n        if ( !params['height'] ) {\n            params['height'] = 500;\n        }\n\n\n\n        window.addEventListener( 'resize', getOffset, false );\n        getOffset();\n\n\n        _this.__defineSetter__('width', function(v) {\n            _privateParts['width'] = d['width'] = v;\n        });\n\n        _this.__defineSetter__('height', function(v) {\n            _privateParts['height'] = d['height'] = v;\n        });\n\n        _this['width'] = params['width'];\n        _this['height'] = params['height'];\n\n    }\n\n    // Put it where we talked about (if we talked about it).\n\n    if ( params['container'] ) {\n        if ( params['fnaddtodom'] ) {\n            params['fnaddtodom'](params['container'], d);\n        } else {\n            params['container'].appendChild(d);\n        }\n        getOffset();\n    }\n\n    var getter = function(n) {\n        _this.__defineGetter__(n, function() {\n            return _privateParts[n];\n        });\n    };\n\n    // Would love to reduce this to params.\n\n    getter('ctx');\n    getter('domElement');\n    getter('width');\n    getter('height');\n    getter('frameCount');\n    getter('milliseconds');\n    getter('pmouseX');\n    getter('pmouseY');\n\n    var no_op = function() {};\n\n    _this['loop'] = true;\n    _this['draw'] = no_op;\n    _this['onresize'] = no_op;\n    _this['keydown'] = no_op;\n    _this['keyup'] = no_op;\n    _this['mousedown'] = no_op;\n    _this['mouseup'] = no_op;\n    _this['mousemove'] = no_op;\n\n    // Custom Getters & Setters\n    _this.__defineGetter__('frameRate', function(v) {\n        return 1E3/_actualFrameTime;\n    });\n\n    _this.__defineGetter__('frameTime', function(v) {\n        return _actualFrameTime;\n    });\n\n    _this.__defineSetter__('frameTime', function(v) {\n        _privateParts['desiredFrameTime'] = v;\n    });\n\n    _this.__defineSetter__('frameRate', function(v) {\n        _privateParts['desiredFrameTime'] = k/v;\n    });\n    \n    // Disable context menu\n    if (!params['enablecontextmenu']) {\n        _privateParts['domElement'].oncontextmenu = function (e) {\n            e.preventDefault();\n            return false;\n        };\n    }\n\n    // Listeners\n    window.addEventListener('keydown', function(e) {\n        // note -- requires a fairly recent standards-compliant browser\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keydown'](keycode, keychar, e.repeat, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n    \n    window.addEventListener('keyup', function(e) {\n        var keycode = e.code;\n        var keychar = e.key;\n        var shouldContinue = _this['keyup'](keycode, keychar, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n        if (!shouldContinue && _privateParts['eatallkeyevents']) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n        } else {\n            return true\n        }\n    }, false);\n\n    _privateParts['domElement'].addEventListener('mousedown', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mousedown'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    _privateParts['domElement'].addEventListener('mouseup', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        var shouldContinue = _this['mouseup'](x, y, e.button, e.buttons, e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);\n    }, false);\n    \n    let listenOn = _privateParts['domElement']\n    if (_privateParts['includeallmousemoveevents']) {\n        listenOn = window\n    }\n\n    listenOn.addEventListener('mousemove', function(e) {\n        var x = e.pageX - _privateParts['offset'].x;\n        var y = e.pageY - _privateParts['offset'].y;\n        _this['mousemove'](x, y, e.button, e.buttons, _privateParts['pmouseX'], _privateParts['pmouseY'], e.ctrlKey, e.altKey, e.shiftKey);\n        _privateParts['pmouseX'] = x;\n        _privateParts['pmouseY'] = y;\n    }, false);\n\n    // Internal loop.\n    if (params['trackFrameTime'] === false) {\n        _privateParts['_idraw'] = function(milliseconds) {\n            _privateParts['milliseconds'] = milliseconds;\n            _privateParts['frameCount']++;\n            _this['draw']();\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw'](performance.now());\n        \n    } else {\n        window.requestAnimationFrame = (function(){\n            return window.requestAnimationFrame   ||\n                window.webkitRequestAnimationFrame ||\n                window.mozRequestAnimationFrame    ||\n                window.oRequestAnimationFrame      ||\n                window.msRequestAnimationFrame     ||\n                function( callback ){\n                    window.setTimeout(callback, 1000 / 60);\n                };\n        }());\n\n        _privateParts['_idraw'] = function() {\n            _privateParts['frameCount']++;\n            var prev = new Date().getTime();\n            _this['draw']();\n            var delta = new Date().getTime() - prev;\n\n            if (delta > _privateParts['desiredFrameTime']) {\n                _actualFrameTime = delta;\n            } else {\n                _actualFrameTime = _privateParts['desiredFrameTime'];\n            }\n\n            if ( _this['loop'] ) {\n                window.requestAnimationFrame( _privateParts['_idraw'] );\n            }\n        };\n        \n        _privateParts['_idraw']();\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/external/golly/golly.txt",
    "content": "https://github.com/dannygarcia/golly\n\ngolly.js (gee.js)\ngolly.js is a library that makes it quick to start sketching with the HTML5 canvas element.\n\nCheck the index page for usage.\n\ngee.js, now deprecated, was initiated by George Michael Brower and Jono Brandel of the Data Arts Team, Google Creative Lab.\n\nMIT License\ngolly.js is freely distributable under the terms of the MIT license.\n\nCopyright (c) 2012, Danny Garcia. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "vipercard/vipercard/external/golly/license.txt",
    "content": "MIT License\n\ngolly.js is freely distributable under the terms of the MIT license.\n\nCopyright (c) 2012, Danny Garcia. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vipercard/vipercard/external/js-lru/js-lru.d.ts",
    "content": "// An entry holds the key and value, and pointers to any older and newer entries.\ninterface Entry<K, V> {\n    key: K;\n    value: V;\n}\n\nexport class LRUMap<K, V> {\n    // Construct a new cache object which will hold up to limit entries.\n    // When the size === limit, a `put` operation will evict the oldest entry.\n    //\n    // If `entries` is provided, all entries are added to the new map.\n    // `entries` should be an Array or other iterable object whose elements are\n    // key-value pairs (2-element Arrays). Each key-value pair is added to the new Map.\n    // null is treated as undefined.\n    constructor(limit: number, entries?: Iterable<[K, V]>);\n\n    // Convenience constructor equivalent to `new LRUMap(count(entries), entries)`\n    constructor(entries: Iterable<[K, V]>);\n\n    // Current number of items\n    size: number;\n\n    // Maximum number of items this map can hold\n    limit: number;\n\n    // Least recently-used entry. Invalidated when map is modified.\n    oldest: Entry<K, V>;\n\n    // Most recently-used entry. Invalidated when map is modified.\n    newest: Entry<K, V>;\n\n    // Replace all values in this map with key-value pairs (2-element Arrays) from\n    // provided iterable.\n    assign(entries: Iterable<[K, V]>): void;\n\n    // Put <value> into the cache associated with <key>. Replaces any existing entry\n    // with the same key. Returns `this`.\n    set(key: K, value: V): LRUMap<K, V>;\n\n    // Purge the least recently used (oldest) entry from the cache.\n    // Returns the removed entry or undefined if the cache was empty.\n    shift(): [K, V] | undefined;\n\n    // Get and register recent use of <key>.\n    // Returns the value associated with <key> or undefined if not in cache.\n    get(key: K): V | undefined;\n\n    // Check if there's a value for key in the cache without registering recent use.\n    has(key: K): boolean;\n\n    // Access value for <key> without registering recent use. Useful if you do not\n    // want to chage the state of the map, but only \"peek\" at it.\n    // Returns the value associated with <key> if found, or undefined if not found.\n    find(key: K): V | undefined;\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/js-lru/js-lru.js",
    "content": "// https://github.com/rsms/js-lru/blob/master/lru.js\n/**\n * A doubly linked list-based Least Recently Used (LRU) cache. Will keep most\n * recently used items while discarding least recently used items when its limit\n * is reached.\n *\n * Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>\n * See README.md for details.\n *\n * Illustration of the design:\n *\n *       entry             entry             entry             entry\n *       ______            ______            ______            ______\n *      | head |.newer => |      |.newer => |      |.newer => | tail |\n *      |  A   |          |  B   |          |  C   |          |  D   |\n *      |______| <= older.|______| <= older.|______| <= older.|______|\n *\n *  removed  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  <--  added\n */\n(function(g, f) {\n    const e = typeof exports == \"object\" ? exports : typeof g == \"object\" ? g : {};\n    f(e);\n    if (typeof define == \"function\" && define.amd) {\n        define(\"lru\", e);\n    }\n})(this, function(exports) {\n    const NEWER = Symbol(\"newer\");\n    const OLDER = Symbol(\"older\");\n\n    function LRUMap(limit, entries) {\n        if (typeof limit !== \"number\") {\n            // called as (entries)\n            entries = limit;\n            limit = 0;\n        }\n\n        this.size = 0;\n        this.limit = limit;\n        this.oldest = this.newest = undefined;\n        this._keymap = new Map();\n\n        if (entries) {\n            this.assign(entries);\n            if (limit < 1) {\n                this.limit = this.size;\n            }\n        }\n    }\n\n    exports.LRUMap = LRUMap;\n\n    function Entry(key, value) {\n        this.key = key;\n        this.value = value;\n        this[NEWER] = undefined;\n        this[OLDER] = undefined;\n    }\n\n    LRUMap.prototype._markEntryAsUsed = function(entry) {\n        if (entry === this.newest) {\n            // Already the most recenlty used entry, so no need to update the list\n            return;\n        }\n        // HEAD--------------TAIL\n        //   <.older   .newer>\n        //  <--- add direction --\n        //   A  B  C  <D>  E\n        if (entry[NEWER]) {\n            if (entry === this.oldest) {\n                this.oldest = entry[NEWER];\n            }\n            entry[NEWER][OLDER] = entry[OLDER]; // C <-- E.\n        }\n        if (entry[OLDER]) {\n            entry[OLDER][NEWER] = entry[NEWER]; // C. --> E\n        }\n        entry[NEWER] = undefined; // D --x\n        entry[OLDER] = this.newest; // D. --> E\n        if (this.newest) {\n            this.newest[NEWER] = entry; // E. <-- D\n        }\n        this.newest = entry;\n    };\n\n    LRUMap.prototype.assign = function(entries) {\n        let entry,\n            limit = this.limit || Number.MAX_VALUE;\n        this._keymap.clear();\n        let it = entries[Symbol.iterator]();\n        for (let itv = it.next(); !itv.done; itv = it.next()) {\n            let e = new Entry(itv.value[0], itv.value[1]);\n            this._keymap.set(e.key, e);\n            if (!entry) {\n                this.oldest = e;\n            } else {\n                entry[NEWER] = e;\n                e[OLDER] = entry;\n            }\n            entry = e;\n            if (limit-- == 0) {\n                throw new Error(\"overflow\");\n            }\n        }\n        this.newest = entry;\n        this.size = this._keymap.size;\n    };\n\n    LRUMap.prototype.get = function(key) {\n        // First, find our cache entry\n        var entry = this._keymap.get(key);\n        if (!entry) return; // Not cached. Sorry.\n        // As <key> was found in the cache, register it as being requested recently\n        this._markEntryAsUsed(entry);\n        return entry.value;\n    };\n\n    LRUMap.prototype.set = function(key, value) {\n        var entry = this._keymap.get(key);\n\n        if (entry) {\n            // update existing\n            entry.value = value;\n            this._markEntryAsUsed(entry);\n            return this;\n        }\n\n        // new entry\n        this._keymap.set(key, (entry = new Entry(key, value)));\n\n        if (this.newest) {\n            // link previous tail to the new tail (entry)\n            this.newest[NEWER] = entry;\n            entry[OLDER] = this.newest;\n        } else {\n            // we're first in -- yay\n            this.oldest = entry;\n        }\n\n        // add new entry to the end of the linked list -- it's now the freshest entry.\n        this.newest = entry;\n        ++this.size;\n        if (this.size > this.limit) {\n            // we hit the limit -- remove the head\n            this.shift();\n        }\n\n        return this;\n    };\n\n    LRUMap.prototype.shift = function() {\n        // todo: handle special case when limit == 1\n        var entry = this.oldest;\n        if (entry) {\n            if (this.oldest[NEWER]) {\n                // advance the list\n                this.oldest = this.oldest[NEWER];\n                this.oldest[OLDER] = undefined;\n            } else {\n                // the cache is exhausted\n                this.oldest = undefined;\n                this.newest = undefined;\n            }\n            // Remove last strong reference to <entry> and remove links from the purged\n            // entry being returned:\n            entry[NEWER] = entry[OLDER] = undefined;\n            this._keymap.delete(entry.key);\n            --this.size;\n            return [entry.key, entry.value];\n        }\n    };\n\n    // ----------------------------------------------------------------------------\n    // Following code is optional and can be removed without breaking the core\n    // functionality.\n\n    LRUMap.prototype.find = function(key) {\n        let e = this._keymap.get(key);\n        return e ? e.value : undefined;\n    };\n\n    LRUMap.prototype.has = function(key) {\n        return this._keymap.has(key);\n    };\n});\n"
  },
  {
    "path": "vipercard/vipercard/external/js-lru/license.txt",
    "content": "MIT license\n\nCopyright (c) 2010-2016 Rasmus Andersson https://rsms.me/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/(loaded dynamically)",
    "content": ""
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/LICENSE",
    "content": "Copyright (c) 2010-2014 Kevin Kwok <antimatter15@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/jsgif.txt",
    "content": "https://github.com/antimatter15/jsgif\n\nPure JavaScript HTML5 to (Animated) GIF Conversion\nBased on as3gif Ported by Kevin Kwok\n\nThis is the raw canvas element saved as a non-animated PNG This is the GIF which was generated from the canvas. This is the GIF which was generated from the canvas.\n\nAS3GIF lets you play and encode animated GIF's with ActionScript 3\n\nSince web pages can usually natively play GIFs fine, it's only a port of the GIFEncoder portions of the library.\n\nBasic Usage\nSince it pretty much is GIFEncoder, you could consult the as3gif how-to page\n\nBut there are some differences so I'll cover it here anyway.\n\nYou first need to include the JS files. It's probably best if you include it in this order, but it shouldn't matter too much.\n\n<script type=\"text/javascript\" src=\"LZWEncoder.js\"></script>\n<script type=\"text/javascript\" src=\"NeuQuant.js\"></script>\n<script type=\"text/javascript\" src=\"GIFEncoder.js\"></script>\nIf you want to render the gif through an inline <img> tag or try to save to disk or send to server or anything that requires conversion into a non-binary string form, you should probably include b64.js too.\n\n<script type=\"text/javascript\" src=\"b64.js\"></script>\nSimple enough right? Now to convert stuff to GIF, you need to have a working or at least some imageData-esque array.\n\n<canvas id=\"bitmap\"></canvas>\n<script>\n  var canvas = document.getElementById('bitmap');\n  var context = canvas.getContext('2d');\n  context.fillStyle = 'rgb(255,255,255)';\n  context.fillRect(0,0,canvas.width, canvas.height); //GIF can't do transparent so do white\n  \n  context.fillStyle = \"rgb(200,0,0)\";  \n  context.fillRect (10, 10, 75, 50);   //draw a little red box\nNow we need to init the GIFEncoder.\n\n  var encoder = new GIFEncoder();\nIf you are making an animated gif, you need to add the following\n\n  encoder.setRepeat(0); //0  -> loop forever\n                        //1+ -> loop n times then stop\n  encoder.setDelay(500); //go to next frame every n milliseconds\nNow, you need to tell the magical thing that you're gonna start inserting frames (even if it's only one).\n\n  encoder.start();\nAnd for the part that took the longest to port: adding a real frame.\n\n  encoder.addFrame(context);\nIn the GIFEncoder version, it accepts a Bitmap. Well, that doesn't exist in Javascript (natively, anyway) so instead, I use what I feel is a decent analogue: the canvas context. However, if you're in a situation where you don't have a real <canvas> element. That's okay. You can set the second parameter to true and pass a imageData.data-esque array as your first argument. So in other words, you can do encoder.addFrame(fake_imageData, true) as an alternative. However, you must do an encoder.setSize(width, height); before you do any of the addFrames if you pass a imageData.data-like array. If you pass a canvas context, then that's all okay, because it will automagically do a setSize with the canvas width/height stuff.\n\nNow the last part is to finalize the animation and get it for display.\n\n  encoder.finish();\n  var binary_gif = encoder.stream().getData() //notice this is different from the as3gif package!\n  var data_url = 'data:image/gif;base64,'+encode64(binary_gif);\nOr download the gif file directly with a given filename as\n\n  encoder.finish();\n  encoder.download(\"download.gif\");"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/jsgifcombined.js",
    "content": "/**\n * This class handles LZW encoding\n * Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott.\n * @author Kevin Weiner (original Java version - kweiner@fmsware.com)\n * @author Thibault Imbert (AS3 version - bytearray.org)\n * @author Kevin Kwok (JavaScript version - https://github.com/antimatter15/jsgif)\n * @version 0.1 AS3 implementation\n */\n\nLZWEncoder = function() {\n\n    var exports = {};\n    var EOF = -1;\n    var imgW;\n    var imgH;\n    var pixAry;\n    var initCodeSize;\n    var remaining;\n    var curPixel;\n\n    // GIFCOMPR.C - GIF Image compression routines\n    // Lempel-Ziv compression based on 'compress'. GIF modifications by\n    // David Rowley (mgardi@watdcsu.waterloo.edu)\n    // General DEFINEs\n\n    var BITS = 12;\n    var HSIZE = 5003; // 80% occupancy\n\n    // GIF Image compression - modified 'compress'\n    // Based on: compress.c - File compression ala IEEE Computer, June 1984.\n    // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)\n    // Jim McKie (decvax!mcvax!jim)\n    // Steve Davies (decvax!vax135!petsd!peora!srd)\n    // Ken Turkowski (decvax!decwrl!turtlevax!ken)\n    // James A. Woods (decvax!ihnp4!ames!jaw)\n    // Joe Orost (decvax!vax135!petsd!joe)\n\n    var n_bits; // number of bits/code\n    var maxbits = BITS; // user settable max # bits/code\n    var maxcode; // maximum code, given n_bits\n    var maxmaxcode = 1 << BITS; // should NEVER generate this code\n    var htab = [];\n    var codetab = [];\n    var hsize = HSIZE; // for dynamic table sizing\n    var free_ent = 0; // first unused entry\n\n    // block compression parameters -- after all codes are used up,\n    // and compression rate changes, start over.\n\n    var clear_flg = false;\n\n    // Algorithm: use open addressing double hashing (no chaining) on the\n    // prefix code / next character combination. We do a variant of Knuth's\n    // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime\n    // secondary probe. Here, the modular division first probe is gives way\n    // to a faster exclusive-or manipulation. Also do block compression with\n    // an adaptive reset, whereby the code table is cleared when the compression\n    // ratio decreases, but after the table fills. The variable-length output\n    // codes are re-sized at this point, and a special CLEAR code is generated\n    // for the decompressor. Late addition: construct the table according to\n    // file size for noticeable speed improvement on small files. Please direct\n    // questions about this implementation to ames!jaw.\n\n    var g_init_bits;\n    var ClearCode;\n    var EOFCode;\n\n    // output\n    // Output the given code.\n    // Inputs:\n    // code: A n_bits-bit integer. If == -1, then EOF. This assumes\n    // that n_bits =< wordsize - 1.\n    // Outputs:\n    // Outputs code to the file.\n    // Assumptions:\n    // Chars are 8 bits long.\n    // Algorithm:\n    // Maintain a BITS character long buffer (so that 8 codes will\n    // fit in it exactly). Use the VAX insv instruction to insert each\n    // code in turn. When the buffer fills up empty it and start over.\n\n    var cur_accum = 0;\n    var cur_bits = 0;\n    var masks = [0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF];\n\n    // Number of characters so far in this 'packet'\n    var a_count;\n\n    // Define the storage for the packet accumulator\n    var accum = [];\n\n    var LZWEncoder = exports.LZWEncoder = function LZWEncoder(width, height, pixels, color_depth) {\n        imgW = width;\n        imgH = height;\n        pixAry = pixels;\n        initCodeSize = Math.max(2, color_depth);\n    };\n\n    // Add a character to the end of the current packet, and if it is 254\n    // characters, flush the packet to disk.\n    var char_out = function char_out(c, outs) {\n        accum[a_count++] = c;\n        if (a_count >= 254) flush_char(outs);\n    };\n\n    // Clear out the hash table\n    // table clear for block compress\n\n    var cl_block = function cl_block(outs) {\n        cl_hash(hsize);\n        free_ent = ClearCode + 2;\n        clear_flg = true;\n        output(ClearCode, outs);\n    };\n\n    // reset code table\n    var cl_hash = function cl_hash(hsize) {\n        for (var i = 0; i < hsize; ++i) htab[i] = -1;\n    };\n\n    var compress = exports.compress = function compress(init_bits, outs) {\n\n        var fcode;\n        var i; /* = 0 */\n        var c;\n        var ent;\n        var disp;\n        var hsize_reg;\n        var hshift;\n\n        // Set up the globals: g_init_bits - initial number of bits\n        g_init_bits = init_bits;\n\n        // Set up the necessary values\n        clear_flg = false;\n        n_bits = g_init_bits;\n        maxcode = MAXCODE(n_bits);\n\n        ClearCode = 1 << (init_bits - 1);\n        EOFCode = ClearCode + 1;\n        free_ent = ClearCode + 2;\n\n        a_count = 0; // clear packet\n\n        ent = nextPixel();\n\n        hshift = 0;\n        for (fcode = hsize; fcode < 65536; fcode *= 2)\n            ++hshift;\n        hshift = 8 - hshift; // set hash code range bound\n\n        hsize_reg = hsize;\n        cl_hash(hsize_reg); // clear hash table\n\n        output(ClearCode, outs);\n\n        outer_loop: while ((c = nextPixel()) != EOF) {\n            fcode = (c << maxbits) + ent;\n            i = (c << hshift) ^ ent; // xor hashing\n\n            if (htab[i] == fcode) {\n                ent = codetab[i];\n                continue;\n            }\n\n            else if (htab[i] >= 0) { // non-empty slot\n\n                disp = hsize_reg - i; // secondary hash (after G. Knott)\n                if (i === 0) disp = 1;\n\n                do {\n                    if ((i -= disp) < 0)\n                        i += hsize_reg;\n\n                    if (htab[i] == fcode) {\n                        ent = codetab[i];\n                        continue outer_loop;\n                    }\n                } while (htab[i] >= 0);\n            }\n\n            output(ent, outs);\n            ent = c;\n            if (free_ent < maxmaxcode) {\n                codetab[i] = free_ent++; // code -> hashtable\n                htab[i] = fcode;\n            }\n            else cl_block(outs);\n        }\n\n        // Put out the final code.\n        output(ent, outs);\n        output(EOFCode, outs);\n    };\n\n    // ----------------------------------------------------------------------------\n    var encode = exports.encode = function encode(os) {\n        os.writeByte(initCodeSize); // write \"initial code size\" byte\n        remaining = imgW * imgH; // reset navigation variables\n        curPixel = 0;\n        compress(initCodeSize + 1, os); // compress and write the pixel data\n        os.writeByte(0); // write block terminator\n    };\n\n    // Flush the packet to disk, and reset the accumulator\n    var flush_char = function flush_char(outs) {\n        if (a_count > 0) {\n            outs.writeByte(a_count);\n            outs.writeBytes(accum, 0, a_count);\n            a_count = 0;\n        }\n    };\n\n    var MAXCODE = function MAXCODE(n_bits) {\n        return (1 << n_bits) - 1;\n    };\n\n    // ----------------------------------------------------------------------------\n    // Return the next pixel from the image\n    // ----------------------------------------------------------------------------\n\n    var nextPixel = function nextPixel() {\n        if (remaining === 0) return EOF;\n        --remaining;\n        var pix = pixAry[curPixel++];\n        return pix & 0xff;\n    };\n\n    var output = function output(code, outs) {\n\n        cur_accum &= masks[cur_bits];\n\n        if (cur_bits > 0) cur_accum |= (code << cur_bits);\n        else cur_accum = code;\n\n        cur_bits += n_bits;\n\n        while (cur_bits >= 8) {\n            char_out((cur_accum & 0xff), outs);\n            cur_accum >>= 8;\n            cur_bits -= 8;\n        }\n\n        // If the next entry is going to be too big for the code size,\n        // then increase it, if possible.\n\n        if (free_ent > maxcode || clear_flg) {\n\n            if (clear_flg) {\n\n                maxcode = MAXCODE(n_bits = g_init_bits);\n                clear_flg = false;\n\n            } else {\n\n                ++n_bits;\n                if (n_bits == maxbits) maxcode = maxmaxcode;\n                else maxcode = MAXCODE(n_bits);\n            }\n        }\n\n        if (code == EOFCode) {\n\n            // At EOF, write the rest of the buffer.\n            while (cur_bits > 0) {\n                char_out((cur_accum & 0xff), outs);\n                cur_accum >>= 8;\n                cur_bits -= 8;\n            }\n\n            flush_char(outs);\n        }\n    };\n\n    LZWEncoder.apply(this, arguments);\n    return exports;\n};\n\n\n/*\n * NeuQuant Neural-Net Quantization Algorithm\n * ------------------------------------------\n *\n * Copyright (c) 1994 Anthony Dekker\n *\n * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See\n * \"Kohonen neural networks for optimal colour quantization\" in \"Network:\n * Computation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\n * the algorithm.\n *\n * Any party obtaining a copy of these files from the author, directly or\n * indirectly, is granted, free of charge, a full and unrestricted irrevocable,\n * world-wide, paid up, royalty-free, nonexclusive right and license to deal in\n * this software and documentation files (the \"Software\"), including without\n * limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons who\n * receive copies from any such party to do so, with the only requirement being\n * that this copyright notice remain intact.\n */\n\n/*\n * This class handles Neural-Net quantization algorithm\n * @author Kevin Weiner (original Java version - kweiner@fmsware.com)\n * @author Thibault Imbert (AS3 version - bytearray.org)\n * @author Kevin Kwok (JavaScript version - https://github.com/antimatter15/jsgif)\n * @version 0.1 AS3 implementation\n */\n\nNeuQuant = function() {\n\n    var exports = {};\n    var netsize = 256; /* number of colours used */\n\n    /* four primes near 500 - assume no image has a length so large */\n    /* that it is divisible by all four primes */\n\n    var prime1 = 499;\n    var prime2 = 491;\n    var prime3 = 487;\n    var prime4 = 503;\n    var minpicturebytes = (3 * prime4); /* minimum size for input image */\n\n    /*\n     * Program Skeleton ---------------- [select samplefac in range 1..30] [read\n     * image from input file] pic = (unsigned char*) malloc(3*width*height);\n     * initnet(pic,3*width*height,samplefac); learn(); unbiasnet(); [write output\n     * image header, using writecolourmap(f)] inxbuild(); write output image using\n     * inxsearch(b,g,r)\n     */\n\n    /*\n     * Network Definitions -------------------\n     */\n\n    var maxnetpos = (netsize - 1);\n    var netbiasshift = 4; /* bias for colour values */\n    var ncycles = 100; /* no. of learning cycles */\n\n    /* defs for freq and bias */\n    var intbiasshift = 16; /* bias for fractions */\n    var intbias = (1 << intbiasshift);\n    var gammashift = 10; /* gamma = 1024 */\n    var gamma = (1 << gammashift);\n    var betashift = 10;\n    var beta = (intbias >> betashift); /* beta = 1/1024 */\n    var betagamma = (intbias << (gammashift - betashift));\n\n    /* defs for decreasing radius factor */\n    var initrad = (netsize >> 3); /* for 256 cols, radius starts */\n    var radiusbiasshift = 6; /* at 32.0 biased by 6 bits */\n    var radiusbias = (1 << radiusbiasshift);\n    var initradius = (initrad * radiusbias); /* and decreases by a */\n    var radiusdec = 30; /* factor of 1/30 each cycle */\n\n    /* defs for decreasing alpha factor */\n    var alphabiasshift = 10; /* alpha starts at 1.0 */\n    var initalpha = (1 << alphabiasshift);\n    var alphadec; /* biased by 10 bits */\n\n    /* radbias and alpharadbias used for radpower calculation */\n    var radbiasshift = 8;\n    var radbias = (1 << radbiasshift);\n    var alpharadbshift = (alphabiasshift + radbiasshift);\n    var alpharadbias = (1 << alpharadbshift);\n\n    /*\n     * Types and Global Variables --------------------------\n     */\n\n    var thepicture; /* the input image itself */\n    var lengthcount; /* lengthcount = H*W*3 */\n    var samplefac; /* sampling factor 1..30 */\n\n    // typedef int pixel[4]; /* BGRc */\n    var network; /* the network itself - [netsize][4] */\n    var netindex = [];\n\n    /* for network lookup - really 256 */\n    var bias = [];\n\n    /* bias and freq arrays for learning */\n    var freq = [];\n    var radpower = [];\n\n    var NeuQuant = exports.NeuQuant = function NeuQuant(thepic, len, sample) {\n\n        var i;\n        var p;\n\n        thepicture = thepic;\n        lengthcount = len;\n        samplefac = sample;\n\n        network = new Array(netsize);\n\n        for (i = 0; i < netsize; i++) {\n\n            network[i] = new Array(4);\n            p = network[i];\n            p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize;\n            freq[i] = intbias / netsize; /* 1/netsize */\n            bias[i] = 0;\n        }\n    };\n\n    var colorMap = function colorMap() {\n\n        var map = [];\n        var index = new Array(netsize);\n\n        for (var i = 0; i < netsize; i++)\n            index[network[i][3]] = i;\n\n        var k = 0;\n        for (var l = 0; l < netsize; l++) {\n            var j = index[l];\n            map[k++] = (network[j][0]);\n            map[k++] = (network[j][1]);\n            map[k++] = (network[j][2]);\n        }\n\n        return map;\n    };\n\n    /*\n     * Insertion sort of network and building of netindex[0..255] (to do after\n     * unbias)\n     * -------------------------------------------------------------------------------\n     */\n\n    var inxbuild = function inxbuild() {\n\n        var i;\n        var j;\n        var smallpos;\n        var smallval;\n        var p;\n        var q;\n        var previouscol;\n        var startpos;\n\n        previouscol = 0;\n        startpos = 0;\n        for (i = 0; i < netsize; i++) {\n\n            p = network[i];\n            smallpos = i;\n            smallval = p[1]; /* index on g */\n\n            /* find smallest in i..netsize-1 */\n            for (j = i + 1; j < netsize; j++) {\n\n                q = network[j];\n                if (q[1] < smallval) { /* index on g */\n                    smallpos = j;\n                    smallval = q[1]; /* index on g */\n                }\n            }\n            q = network[smallpos];\n\n            /* swap p (i) and q (smallpos) entries */\n            if (i != smallpos) {\n                j = q[0];\n                q[0] = p[0];\n                p[0] = j;\n                j = q[1];\n                q[1] = p[1];\n                p[1] = j;\n                j = q[2];\n                q[2] = p[2];\n                p[2] = j;\n                j = q[3];\n                q[3] = p[3];\n                p[3] = j;\n            }\n\n            /* smallval entry is now in position i */\n\n            if (smallval != previouscol) {\n\n                netindex[previouscol] = (startpos + i) >> 1;\n\n                for (j = previouscol + 1; j < smallval; j++) netindex[j] = i;\n\n                previouscol = smallval;\n                startpos = i;\n            }\n        }\n\n        netindex[previouscol] = (startpos + maxnetpos) >> 1;\n        for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos; /* really 256 */\n    };\n\n    /*\n     * Main Learning Loop ------------------\n     */\n\n    var learn = function learn() {\n\n        var i;\n        var j;\n        var b;\n        var g;\n        var r;\n        var radius;\n        var rad;\n        var alpha;\n        var step;\n        var delta;\n        var samplepixels;\n        var p;\n        var pix;\n        var lim;\n\n        if (lengthcount < minpicturebytes) samplefac = 1;\n\n        alphadec = 30 + ((samplefac - 1) / 3);\n        p = thepicture;\n        pix = 0;\n        lim = lengthcount;\n        samplepixels = lengthcount / (3 * samplefac);\n        delta = (samplepixels / ncycles) | 0;\n        alpha = initalpha;\n        radius = initradius;\n\n        rad = radius >> radiusbiasshift;\n        if (rad <= 1) rad = 0;\n\n        for (i = 0; i < rad; i++) radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad));\n\n        if (lengthcount < minpicturebytes) step = 3;\n\n        else if ((lengthcount % prime1) !== 0) step = 3 * prime1;\n\n        else {\n\n            if ((lengthcount % prime2) !== 0) step = 3 * prime2;\n            else {\n                if ((lengthcount % prime3) !== 0) step = 3 * prime3;\n                else step = 3 * prime4;\n            }\n        }\n\n        i = 0;\n        while (i < samplepixels) {\n\n            b = (p[pix + 0] & 0xff) << netbiasshift;\n            g = (p[pix + 1] & 0xff) << netbiasshift;\n            r = (p[pix + 2] & 0xff) << netbiasshift;\n            j = contest(b, g, r);\n\n            altersingle(alpha, j, b, g, r);\n            if (rad !== 0) alterneigh(rad, j, b, g, r); /* alter neighbours */\n\n            pix += step;\n            if (pix >= lim) pix -= lengthcount;\n\n            i++;\n\n            if (delta === 0) delta = 1;\n\n            if (i % delta === 0) {\n                alpha -= alpha / alphadec;\n                radius -= radius / radiusdec;\n                rad = radius >> radiusbiasshift;\n\n                if (rad <= 1) rad = 0;\n\n                for (j = 0; j < rad; j++) radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad));\n            }\n        }\n    };\n\n    /*\n     ** Search for BGR values 0..255 (after net is unbiased) and return colour\n     * index\n     * ----------------------------------------------------------------------------\n     */\n\n    var map = exports.map = function map(b, g, r) {\n\n        var i;\n        var j;\n        var dist;\n        var a;\n        var bestd;\n        var p;\n        var best;\n\n        bestd = 1000; /* biggest possible dist is 256*3 */\n        best = -1;\n        i = netindex[g]; /* index on g */\n        j = i - 1; /* start at netindex[g] and work outwards */\n\n        while ((i < netsize) || (j >= 0)) {\n\n            if (i < netsize) {\n                p = network[i];\n                dist = p[1] - g; /* inx key */\n\n                if (dist >= bestd) i = netsize; /* stop iter */\n\n                else {\n\n                    i++;\n                    if (dist < 0) dist = -dist;\n                    a = p[0] - b;\n                    if (a < 0) a = -a;\n                    dist += a;\n\n                    if (dist < bestd) {\n                        a = p[2] - r;\n                        if (a < 0) a = -a;\n                        dist += a;\n\n                        if (dist < bestd) {\n                            bestd = dist;\n                            best = p[3];\n                        }\n                    }\n                }\n            }\n\n            if (j >= 0) {\n\n                p = network[j];\n                dist = g - p[1]; /* inx key - reverse dif */\n\n                if (dist >= bestd) j = -1; /* stop iter */\n\n                else {\n\n                    j--;\n                    if (dist < 0) dist = -dist;\n                    a = p[0] - b;\n                    if (a < 0) a = -a;\n                    dist += a;\n\n                    if (dist < bestd) {\n                        a = p[2] - r;\n                        if (a < 0) a = -a;\n                        dist += a;\n                        if (dist < bestd) {\n                            bestd = dist;\n                            best = p[3];\n                        }\n                    }\n                }\n            }\n        }\n\n        return (best);\n    };\n\n    var process = exports.process = function process() {\n        learn();\n        unbiasnet();\n        inxbuild();\n        return colorMap();\n    };\n\n    /*\n     * Unbias network to give byte values 0..255 and record position i to prepare\n     * for sort\n     * -----------------------------------------------------------------------------------\n     */\n\n    var unbiasnet = function unbiasnet() {\n\n        var i;\n        var j;\n\n        for (i = 0; i < netsize; i++) {\n            network[i][0] >>= netbiasshift;\n            network[i][1] >>= netbiasshift;\n            network[i][2] >>= netbiasshift;\n            network[i][3] = i; /* record colour no */\n        }\n    };\n\n    /*\n     * Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in\n     * radpower[|i-j|]\n     * ---------------------------------------------------------------------------------\n     */\n\n    var alterneigh = function alterneigh(rad, i, b, g, r) {\n\n        var j;\n        var k;\n        var lo;\n        var hi;\n        var a;\n        var m;\n        var p;\n\n        lo = i - rad;\n        if (lo < -1) lo = -1;\n\n        hi = i + rad;\n        if (hi > netsize) hi = netsize;\n\n        j = i + 1;\n        k = i - 1;\n        m = 1;\n\n        while ((j < hi) || (k > lo)) {\n            a = radpower[m++];\n\n            if (j < hi) {\n                p = network[j++];\n\n                try {\n                    p[0] -= (a * (p[0] - b)) / alpharadbias;\n                    p[1] -= (a * (p[1] - g)) / alpharadbias;\n                    p[2] -= (a * (p[2] - r)) / alpharadbias;\n                } catch (e) {} // prevents 1.3 miscompilation\n            }\n\n            if (k > lo) {\n                p = network[k--];\n\n                try {\n                    p[0] -= (a * (p[0] - b)) / alpharadbias;\n                    p[1] -= (a * (p[1] - g)) / alpharadbias;\n                    p[2] -= (a * (p[2] - r)) / alpharadbias;\n                } catch (e) {}\n            }\n        }\n    };\n\n    /*\n     * Move neuron i towards biased (b,g,r) by factor alpha\n     * ----------------------------------------------------\n     */\n\n    var altersingle = function altersingle(alpha, i, b, g, r) {\n\n        /* alter hit neuron */\n        var n = network[i];\n        n[0] -= (alpha * (n[0] - b)) / initalpha;\n        n[1] -= (alpha * (n[1] - g)) / initalpha;\n        n[2] -= (alpha * (n[2] - r)) / initalpha;\n    };\n\n    /*\n     * Search for biased BGR values ----------------------------\n     */\n\n    var contest = function contest(b, g, r) {\n\n        /* finds closest neuron (min dist) and updates freq */\n        /* finds best neuron (min dist-bias) and returns position */\n        /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */\n        /* bias[i] = gamma*((1/netsize)-freq[i]) */\n\n        var i;\n        var dist;\n        var a;\n        var biasdist;\n        var betafreq;\n        var bestpos;\n        var bestbiaspos;\n        var bestd;\n        var bestbiasd;\n        var n;\n\n        bestd = ~ (1 << 31);\n        bestbiasd = bestd;\n        bestpos = -1;\n        bestbiaspos = bestpos;\n\n        for (i = 0; i < netsize; i++) {\n            n = network[i];\n            dist = n[0] - b;\n            if (dist < 0) dist = -dist;\n            a = n[1] - g;\n            if (a < 0) a = -a;\n            dist += a;\n            a = n[2] - r;\n            if (a < 0) a = -a;\n            dist += a;\n\n            if (dist < bestd) {\n                bestd = dist;\n                bestpos = i;\n            }\n\n            biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift));\n\n            if (biasdist < bestbiasd) {\n                bestbiasd = biasdist;\n                bestbiaspos = i;\n            }\n\n            betafreq = (freq[i] >> betashift);\n            freq[i] -= betafreq;\n            bias[i] += (betafreq << gammashift);\n        }\n\n        freq[bestpos] += beta;\n        bias[bestpos] -= betagamma;\n        return (bestbiaspos);\n    };\n\n    NeuQuant.apply(this, arguments);\n    return exports;\n};\n\n/**\n * This class lets you encode animated GIF files\n * Base class :  http://www.java2s.com/Code/Java/2D-Graphics-GUI/AnimatedGifEncoder.htm\n * @author Kevin Weiner (original Java version - kweiner@fmsware.com)\n * @author Thibault Imbert (AS3 version - bytearray.org)\n * @author Kevin Kwok (JavaScript version - https://github.com/antimatter15/jsgif)\n * @version 0.1 AS3 implementation\n */\n\nGIFEncoder = function() {\n\n    for (var i = 0, chr = {}; i < 256; i++)\n        chr[i] = String.fromCharCode(i);\n\n    function ByteArray() {\n        this.bin = [];\n    }\n\n    ByteArray.prototype.getData = function() {\n        for (var v = '', l = this.bin.length, i = 0; i < l; i++)\n            v += chr[this.bin[i]];\n        return v;\n    };\n\n    ByteArray.prototype.writeByte = function(val) {\n        this.bin.push(val);\n    };\n\n    ByteArray.prototype.writeUTFBytes = function(string) {\n        for (var l = string.length, i = 0; i < l; i++)\n            this.writeByte(string.charCodeAt(i));\n    };\n\n    ByteArray.prototype.writeBytes = function(array, offset, length) {\n        for (var l = length || array.length, i = offset || 0; i < l; i++)\n            this.writeByte(array[i]);\n    };\n\n    var exports = {};\n    var width; // image size\n    var height;\n    var transparent = null; // transparent color if given\n    var transIndex; // transparent index in color table\n    var repeat = -1; // no repeat\n    var delay = 0; // frame delay (hundredths)\n    var started = false; // ready to output frames\n    var out;\n    var image; // current frame\n    var pixels; // BGR byte array from frame\n    var indexedPixels; // converted frame indexed to palette\n    var colorDepth; // number of bit planes\n    var colorTab; // RGB palette\n    var usedEntry = []; // active palette entries\n    var palSize = 7; // color table size (bits-1)\n    var dispose = -1; // disposal code (-1 = use default)\n    var closeStream = false; // close stream when finished\n    var firstFrame = true;\n    var sizeSet = false; // if false, get size from first frame\n    var sample = 10; // default sample interval for quantizer\n    var comment = \"Generated by jsgif (https://github.com/antimatter15/jsgif/)\"; // default comment for generated gif\n\n    /**\n     * Sets the delay time between each frame, or changes it for subsequent frames\n     * (applies to last frame added)\n     * int delay time in milliseconds\n     * @param ms\n     */\n\n    var setDelay = exports.setDelay = function setDelay(ms) {\n        delay = Math.round(ms / 10);\n    };\n\n    /**\n     * Sets the GIF frame disposal code for the last added frame and any\n     *\n     * subsequent frames. Default is 0 if no transparent color has been set,\n     * otherwise 2.\n     * @param code\n     * int disposal code.\n     */\n\n    var setDispose = exports.setDispose = function setDispose(code) {\n        if (code >= 0) dispose = code;\n    };\n\n    /**\n     * Sets the number of times the set of GIF frames should be played. Default is\n     * 1; 0 means play indefinitely. Must be invoked before the first image is\n     * added.\n     *\n     * @param iter\n     * int number of iterations.\n     * @return\n     */\n\n    var setRepeat = exports.setRepeat = function setRepeat(iter) {\n        if (iter >= 0) repeat = iter;\n    };\n\n    /**\n     * Sets the transparent color for the last added frame and any subsequent\n     * frames. Since all colors are subject to modification in the quantization\n     * process, the color in the final palette for each frame closest to the given\n     * color becomes the transparent color for that frame. May be set to null to\n     * indicate no transparent color.\n     * @param\n     * Color to be treated as transparent on display.\n     */\n\n    var setTransparent = exports.setTransparent = function setTransparent(c) {\n        transparent = c;\n    };\n\n\n    /**\n     * Sets the comment for the block comment\n     * @param\n     * string to be insterted as comment\n     */\n\n    var setComment = exports.setComment = function setComment(c) {\n        comment = c;\n    };\n\n\n\n    /**\n     * The addFrame method takes an incoming BitmapData object to create each frames\n     * @param\n     * BitmapData object to be treated as a GIF's frame\n     */\n\n    var addFrame = exports.addFrame = function addFrame(im, is_imageData) {\n\n        if ((im === null) || !started || out === null) {\n            throw new Error(\"Please call start method before calling addFrame\");\n        }\n\n        var ok = true;\n\n        try {\n            if (!is_imageData) {\n                image = im.getImageData(0, 0, im.canvas.width, im.canvas.height).data;\n                if (!sizeSet) setSize(im.canvas.width, im.canvas.height);\n            } else {\n                if(im instanceof ImageData) {\n                    image = im.data;\n                    if(!sizeset || width!=im.width || height!=im.height) {\n                        setSize(im.width,im.height);\n                    } else {\n                        \n                    }\n                } else if(im instanceof Uint8ClampedArray) {\n                    if(im.length==(width*height*4)) {\n                        image=im;\n                    } else {\n                        throw new Error(\"jsgif: Please set the correct size: ImageData length mismatch\");\n                        ok=false;\n                    }\n                } else {\n                    throw new Error(\"jsgif: Please provide correct input\");\n                    ok=false;\n                }\n            }\n            getImagePixels(); // convert to correct format if necessary\n            analyzePixels(); // build color table & map pixels\n\n            if (firstFrame) {\n                writeLSD(); // logical screen descriptior\n                writePalette(); // global color table\n                if (repeat >= 0) {\n                    // use NS app extension to indicate reps\n                    writeNetscapeExt();\n                }\n            }\n\n            writeGraphicCtrlExt(); // write graphic control extension\n            if (comment !== '') {\n                writeCommentExt(); // write comment extension\n            }\n            writeImageDesc(); // image descriptor\n            if (!firstFrame) writePalette(); // local color table\n            writePixels(); // encode and write pixel data\n            firstFrame = false;\n        } catch (e) {\n            ok = false;\n        }\n\n        return ok;\n    };\n    \n    /**\n    * @description: Downloads the encoded gif with the given name\n    * No need of any conversion from the stream data (out) to base64\n    * Solves the issue of large file sizes when there are more frames\n    * and does not involve in creation of any temporary data in the process\n    * so no wastage of memory, and speeds up the process of downloading\n    * to just calling this function.\n    * @parameter {String} filename filename used for downloading the gif\n    */\n    \n    var download = exports.download = function download(filename) {\n        if(out===null || closeStream==false) {\n            throw new Error(\"jsgif: Please call start method and add frames and call finish method before calling download\"); \n        } else {\n            filename= filename !== undefined ? ( filename.endsWith(\".gif\")? filename: filename+\".gif\" ): \"download.gif\";\n            var templink = document.createElement(\"a\");\n            templink.download=filename;\n            templink.href= URL.createObjectURL(new Blob([new Uint8Array(out.bin)], {type : \"image/gif\" } ));\n            templink.click();\n        }\n    }\n\n    /* added by Ben Fisher, 2018 */\n    var getUint8Array = exports.getUint8Array = function getUint8Array(filename) {\n        if(out===null || closeStream==false) {\n            throw new Error(\"jsgif: Please call start method and add frames and call finish method first.\");\n        } else {\n            return new Uint8Array(out.bin);\n        }\n    }\n\n    /**\n     * Adds final trailer to the GIF stream, if you don't call the finish method\n     * the GIF stream will not be valid.\n     */\n\n    var finish = exports.finish = function finish() {\n\n        if (!started) return false;\n\n        var ok = true;\n        started = false;\n\n        try {\n            out.writeByte(0x3b); // gif trailer\n            closeStream=true;\n        } catch (e) {\n            ok = false;\n        }\n\n        return ok;\n    };\n\n    /**\n     * Resets some members so that a new stream can be started.\n     * This method is actually called by the start method\n     */\n\n    var reset = function reset() {\n\n        // reset for subsequent use\n        transIndex = 0;\n        image = null;\n        pixels = null;\n        indexedPixels = null;\n        colorTab = null;\n        closeStream = false;\n        firstFrame = true;\n    };\n\n    /**\n     * * Sets frame rate in frames per second. Equivalent to\n     * <code>setDelay(1000/fps)</code>.\n     * @param fps\n     * float frame rate (frames per second)\n     */\n\n    var setFrameRate = exports.setFrameRate = function setFrameRate(fps) {\n        if (fps != 0xf) delay = Math.round(100 / fps);\n    };\n\n    /**\n     * Sets quality of color quantization (conversion of images to the maximum 256\n     * colors allowed by the GIF specification). Lower values (minimum = 1)\n     * produce better colors, but slow processing significantly. 10 is the\n     * default, and produces good color mapping at reasonable speeds. Values\n     * greater than 20 do not yield significant improvements in speed.\n     * @param quality\n     * int greater than 0.\n     * @return\n     */\n\n    var setQuality = exports.setQuality = function setQuality(quality) {\n        if (quality < 1) quality = 1;\n        sample = quality;\n    };\n\n    /**\n     * Sets the GIF frame size. The default size is the size of the first frame\n     * added if this method is not invoked.\n     * @param w\n     * int frame width.\n     * @param h\n     * int frame width.\n     */\n\n    var setSize = exports.setSize = function setSize(w, h) {\n\n        if (started && !firstFrame) return;\n        width = w;\n        height = h;\n        if (width < 1) width = 320;\n        if (height < 1) height = 240;\n        sizeSet = true;\n    };\n\n    /**\n     * Initiates GIF file creation on the given stream.\n     * @param os\n     * OutputStream on which GIF images are written.\n     * @return false if initial write failed.\n     */\n\n    var start = exports.start = function start() {\n\n        reset();\n        var ok = true;\n        closeStream = false;\n        out = new ByteArray();\n        try {\n            out.writeUTFBytes(\"GIF89a\"); // header\n        } catch (e) {\n            ok = false;\n        }\n\n        return started = ok;\n    };\n\n    var cont = exports.cont = function cont() {\n\n        reset();\n        var ok = true;\n        closeStream = false;\n        out = new ByteArray();\n\n        return started = ok;\n    };\n\n    /**\n     * Analyzes image colors and creates color map.\n     */\n\n    var analyzePixels = function analyzePixels() {\n\n        var len = pixels.length;\n        var nPix = len / 3;\n        indexedPixels = [];\n        var nq = new NeuQuant(pixels, len, sample);\n\n        // initialize quantizer\n        colorTab = nq.process(); // create reduced palette\n\n        // map image pixels to new palette\n        var k = 0;\n        for (var j = 0; j < nPix; j++) {\n            var index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff);\n            usedEntry[index] = true;\n            indexedPixels[j] = index;\n        }\n\n        pixels = null;\n        colorDepth = 8;\n        palSize = 7;\n\n        // get closest match to transparent color if specified\n        if (transparent !== null) {\n            transIndex = findClosest(transparent);\n        }\n    };\n\n    /**\n     * Returns index of palette color closest to c\n     */\n\n    var findClosest = function findClosest(c) {\n\n        if (colorTab === null) return -1;\n        var r = (c & 0xFF0000) >> 16;\n        var g = (c & 0x00FF00) >> 8;\n        var b = (c & 0x0000FF);\n        var minpos = 0;\n        var dmin = 256 * 256 * 256;\n        var len = colorTab.length;\n\n        for (var i = 0; i < len;) {\n            var dr = r - (colorTab[i++] & 0xff);\n            var dg = g - (colorTab[i++] & 0xff);\n            var db = b - (colorTab[i] & 0xff);\n            var d = dr * dr + dg * dg + db * db;\n            var index = i / 3;\n            if (usedEntry[index] && (d < dmin)) {\n                dmin = d;\n                minpos = index;\n            }\n            i++;\n        }\n        return minpos;\n    };\n\n    /**\n     * Extracts image pixels into byte array \"pixels\n     */\n\n    var getImagePixels = function getImagePixels() {\n        var w = width;\n        var h = height;\n        pixels = [];\n        var data = image;\n        var count = 0;\n\n        for (var i = 0; i < h; i++) {\n\n            for (var j = 0; j < w; j++) {\n\n                var b = (i * w * 4) + j * 4;\n                pixels[count++] = data[b];\n                pixels[count++] = data[b + 1];\n                pixels[count++] = data[b + 2];\n\n            }\n\n        }\n    };\n\n    /**\n     * Writes Graphic Control Extension\n     */\n\n    var writeGraphicCtrlExt = function writeGraphicCtrlExt() {\n        out.writeByte(0x21); // extension introducer\n        out.writeByte(0xf9); // GCE label\n        out.writeByte(4); // data block size\n        var transp;\n        var disp;\n        if (transparent === null) {\n            transp = 0;\n            disp = 0; // dispose = no action\n        } else {\n            transp = 1;\n            disp = 2; // force clear if using transparent color\n        }\n        if (dispose >= 0) {\n            disp = dispose & 7; // user override\n        }\n        disp <<= 2;\n        // packed fields\n        out.writeByte(0 | // 1:3 reserved\n            disp | // 4:6 disposal\n            0 | // 7 user input - 0 = none\n            transp); // 8 transparency flag\n\n        WriteShort(delay); // delay x 1/100 sec\n        out.writeByte(transIndex); // transparent color index\n        out.writeByte(0); // block terminator\n    };\n\n    /**\n     * Writes Comment Extention\n     */\n\n    var writeCommentExt = function writeCommentExt() {\n        out.writeByte(0x21); // extension introducer\n        out.writeByte(0xfe); // comment label\n        out.writeByte(comment.length); // Block Size (s)\n        out.writeUTFBytes(comment);\n        out.writeByte(0); // block terminator\n    };\n\n\n    /**\n     * Writes Image Descriptor\n     */\n\n    var writeImageDesc = function writeImageDesc() {\n\n        out.writeByte(0x2c); // image separator\n        WriteShort(0); // image position x,y = 0,0\n        WriteShort(0);\n        WriteShort(width); // image size\n        WriteShort(height);\n\n        // packed fields\n        if (firstFrame) {\n            // no LCT - GCT is used for first (or only) frame\n            out.writeByte(0);\n        } else {\n            // specify normal LCT\n            out.writeByte(0x80 | // 1 local color table 1=yes\n                0 | // 2 interlace - 0=no\n                0 | // 3 sorted - 0=no\n                0 | // 4-5 reserved\n                palSize); // 6-8 size of color table\n        }\n    };\n\n    /**\n     * Writes Logical Screen Descriptor\n     */\n\n    var writeLSD = function writeLSD() {\n\n        // logical screen size\n        WriteShort(width);\n        WriteShort(height);\n        // packed fields\n        out.writeByte((0x80 | // 1 : global color table flag = 1 (gct used)\n            0x70 | // 2-4 : color resolution = 7\n            0x00 | // 5 : gct sort flag = 0\n            palSize)); // 6-8 : gct size\n\n        out.writeByte(0); // background color index\n        out.writeByte(0); // pixel aspect ratio - assume 1:1\n    };\n\n    /**\n     * Writes Netscape application extension to define repeat count.\n     */\n\n    var writeNetscapeExt = function writeNetscapeExt() {\n        out.writeByte(0x21); // extension introducer\n        out.writeByte(0xff); // app extension label\n        out.writeByte(11); // block size\n        out.writeUTFBytes(\"NETSCAPE\" + \"2.0\"); // app id + auth code\n        out.writeByte(3); // sub-block size\n        out.writeByte(1); // loop sub-block id\n        WriteShort(repeat); // loop count (extra iterations, 0=repeat forever)\n        out.writeByte(0); // block terminator\n    };\n\n    /**\n     * Writes color table\n     */\n\n    var writePalette = function writePalette() {\n        out.writeBytes(colorTab);\n        var n = (3 * 256) - colorTab.length;\n        for (var i = 0; i < n; i++) out.writeByte(0);\n    };\n\n    var WriteShort = function WriteShort(pValue) {\n        out.writeByte(pValue & 0xFF);\n        out.writeByte((pValue >> 8) & 0xFF);\n    };\n\n    /**\n     * Encodes and writes pixel data\n     */\n\n    var writePixels = function writePixels() {\n        var myencoder = new LZWEncoder(width, height, indexedPixels, colorDepth);\n        myencoder.encode(out);\n    };\n\n    /**\n     * Retrieves the GIF stream\n     */\n\n    var stream = exports.stream = function stream() {\n        return out;\n    };\n\n    var setProperties = exports.setProperties = function setProperties(has_start, is_first) {\n        started = has_start;\n        firstFrame = is_first;\n    };\n\n    return exports;\n\n};\n\nfunction encode64(input) {\n    var output = \"\", i = 0, l = input.length,\n    key = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\", \n    chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    while (i < l) {\n        chr1 = input.charCodeAt(i++);\n        chr2 = input.charCodeAt(i++);\n        chr3 = input.charCodeAt(i++);\n        enc1 = chr1 >> 2;\n        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n        enc4 = chr3 & 63;\n        if (isNaN(chr2)) enc3 = enc4 = 64;\n        else if (isNaN(chr3)) enc4 = 64;\n        output = output + key.charAt(enc1) + key.charAt(enc2) + key.charAt(enc3) + key.charAt(enc4);\n    }\n    return output;\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/modified_to_expose_getblob.txt",
    "content": ""
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/LICENSE.txt",
    "content": "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE \n                    Version 2, December 2004 \n\n Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> \n\n Everyone is permitted to copy and distribute verbatim or modified \n copies of this license document, and changing it is allowed as long \n as the name is changed. \n\n            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE \n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION \n\n  0. You just DO WHAT THE FUCK YOU WANT TO.\n"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/README.md",
    "content": "lz-string\n=========\nLZ-based compression algorithm for JavaScript\n\n## Warning (migrating from version 1.3.4 - nov 2014)\nFiles have changed locations and name since a recent release. The new release file is in `libs/lz-string.min.js` (or in `libs/lz-string.js` if you don't care for the minified version)\n\nSorry about the mess in other repos. This will not happen again.\n\n## Install via [npm](https://npmjs.org/)\n\n```shell\n$ npm install -g lz-string\n$ lz-string input.js > output.txt\n```\n\n## Home page\nHome page for this program with examples, documentation and a live demo: http://pieroxy.net/blog/pages/lz-string/index.html\n"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/base64-string.js",
    "content": "// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// This lib is part of the lz-string project.\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/index.html\n//\n// Base64 compression / decompression for already compressed content (gif, png, jpg, mp3, ...) \n// version 1.4.1\nvar Base64String = {\n  \n  compressToUTF16 : function (input) {\n    var output = [],\n        i,c,\n        current,\n        status = 0;\n    \n    input = this.compress(input);\n    \n    for (i=0 ; i<input.length ; i++) {\n      c = input.charCodeAt(i);\n      switch (status++) {\n        case 0:\n          output.push(String.fromCharCode((c >> 1)+32));\n          current = (c & 1) << 14;\n          break;\n        case 1:\n          output.push(String.fromCharCode((current + (c >> 2))+32));\n          current = (c & 3) << 13;\n          break;\n        case 2:\n          output.push(String.fromCharCode((current + (c >> 3))+32));\n          current = (c & 7) << 12;\n          break;\n        case 3:\n          output.push(String.fromCharCode((current + (c >> 4))+32));\n          current = (c & 15) << 11;\n          break;\n        case 4:\n          output.push(String.fromCharCode((current + (c >> 5))+32));\n          current = (c & 31) << 10;\n          break;\n        case 5:\n          output.push(String.fromCharCode((current + (c >> 6))+32));\n          current = (c & 63) << 9;\n          break;\n        case 6:\n          output.push(String.fromCharCode((current + (c >> 7))+32));\n          current = (c & 127) << 8;\n          break;\n        case 7:\n          output.push(String.fromCharCode((current + (c >> 8))+32));\n          current = (c & 255) << 7;\n          break;\n        case 8:\n          output.push(String.fromCharCode((current + (c >> 9))+32));\n          current = (c & 511) << 6;\n          break;\n        case 9:\n          output.push(String.fromCharCode((current + (c >> 10))+32));\n          current = (c & 1023) << 5;\n          break;\n        case 10:\n          output.push(String.fromCharCode((current + (c >> 11))+32));\n          current = (c & 2047) << 4;\n          break;\n        case 11:\n          output.push(String.fromCharCode((current + (c >> 12))+32));\n          current = (c & 4095) << 3;\n          break;\n        case 12:\n          output.push(String.fromCharCode((current + (c >> 13))+32));\n          current = (c & 8191) << 2;\n          break;\n        case 13:\n          output.push(String.fromCharCode((current + (c >> 14))+32));\n          current = (c & 16383) << 1;\n          break;\n        case 14:\n          output.push(String.fromCharCode((current + (c >> 15))+32, (c & 32767)+32));\n          status = 0;\n          break;\n      }\n    }\n    output.push(String.fromCharCode(current + 32));\n    return output.join('');\n  },\n  \n\n  decompressFromUTF16 : function (input) {\n    var output = [],\n        current,c,\n        status=0,\n        i = 0;\n    \n    while (i < input.length) {\n      c = input.charCodeAt(i) - 32;\n      \n      switch (status++) {\n        case 0:\n          current = c << 1;\n          break;\n        case 1:\n          output.push(String.fromCharCode(current | (c >> 14)));\n          current = (c&16383) << 2;\n          break;\n        case 2:\n          output.push(String.fromCharCode(current | (c >> 13)));\n          current = (c&8191) << 3;\n          break;\n        case 3:\n          output.push(String.fromCharCode(current | (c >> 12)));\n          current = (c&4095) << 4;\n          break;\n        case 4:\n          output.push(String.fromCharCode(current | (c >> 11)));\n          current = (c&2047) << 5;\n          break;\n        case 5:\n          output.push(String.fromCharCode(current | (c >> 10)));\n          current = (c&1023) << 6;\n          break;\n        case 6:\n          output.push(String.fromCharCode(current | (c >> 9)));\n          current = (c&511) << 7;\n          break;\n        case 7:\n          output.push(String.fromCharCode(current | (c >> 8)));\n          current = (c&255) << 8;\n          break;\n        case 8:\n          output.push(String.fromCharCode(current | (c >> 7)));\n          current = (c&127) << 9;\n          break;\n        case 9:\n          output.push(String.fromCharCode(current | (c >> 6)));\n          current = (c&63) << 10;\n          break;\n        case 10:\n          output.push(String.fromCharCode(current | (c >> 5)));\n          current = (c&31) << 11;\n          break;\n        case 11:\n          output.push(String.fromCharCode(current | (c >> 4)));\n          current = (c&15) << 12;\n          break;\n        case 12:\n          output.push(String.fromCharCode(current | (c >> 3)));\n          current = (c&7) << 13;\n          break;\n        case 13:\n          output.push(String.fromCharCode(current | (c >> 2)));\n          current = (c&3) << 14;\n          break;\n        case 14:\n          output.push(String.fromCharCode(current | (c >> 1)));\n          current = (c&1) << 15;\n          break;\n        case 15:\n          output.push(String.fromCharCode(current | c));\n          status=0;\n          break;\n      }\n      \n      \n      i++;\n    }\n    \n    return this.decompress(output.join(''));\n    //return output;\n    \n  },\n\n\n  // private property\n  _keyStr : \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n  \n  decompress : function (input) {\n    var output = [];\n    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    var i = 1;\n    var odd = input.charCodeAt(0) >> 8;\n    \n    while (i < input.length*2 && (i < input.length*2-1 || odd==0)) {\n      \n      if (i%2==0) {\n        chr1 = input.charCodeAt(i/2) >> 8;\n        chr2 = input.charCodeAt(i/2) & 255;\n        if (i/2+1 < input.length) \n          chr3 = input.charCodeAt(i/2+1) >> 8;\n        else \n          chr3 = NaN;\n      } else {\n        chr1 = input.charCodeAt((i-1)/2) & 255;\n        if ((i+1)/2 < input.length) {\n          chr2 = input.charCodeAt((i+1)/2) >> 8;\n          chr3 = input.charCodeAt((i+1)/2) & 255;\n        } else \n          chr2=chr3=NaN;\n      }\n      i+=3;\n      \n      enc1 = chr1 >> 2;\n      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n      enc4 = chr3 & 63;\n      \n      if (isNaN(chr2) || (i==input.length*2+1 && odd)) {\n        enc3 = enc4 = 64;\n      } else if (isNaN(chr3) || (i==input.length*2 && odd)) {\n        enc4 = 64;\n      }\n      \n      output.push(this._keyStr.charAt(enc1));\n      output.push(this._keyStr.charAt(enc2));\n      output.push(this._keyStr.charAt(enc3));\n      output.push(this._keyStr.charAt(enc4));\n    }\n    \n    return output.join('');\n  },\n  \n  compress : function (input) {\n    var output = [],\n        ol = 1, \n        output_,\n        chr1, chr2, chr3,\n        enc1, enc2, enc3, enc4,\n        i = 0, flush=false;\n    \n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n    \n    while (i < input.length) {\n      \n      enc1 = this._keyStr.indexOf(input.charAt(i++));\n      enc2 = this._keyStr.indexOf(input.charAt(i++));\n      enc3 = this._keyStr.indexOf(input.charAt(i++));\n      enc4 = this._keyStr.indexOf(input.charAt(i++));\n      \n      chr1 = (enc1 << 2) | (enc2 >> 4);\n      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n      chr3 = ((enc3 & 3) << 6) | enc4;\n      \n      if (ol%2==0) {\n        output_ = chr1 << 8;\n        flush = true;\n        \n        if (enc3 != 64) {\n          output.push(String.fromCharCode(output_ | chr2));\n          flush = false;\n        }\n        if (enc4 != 64) {\n          output_ = chr3 << 8;\n          flush = true;\n        }\n      } else {\n        output.push(String.fromCharCode(output_ | chr1));\n        flush = false;\n        \n        if (enc3 != 64) {\n          output_ = chr2 << 8;\n          flush = true;\n        }\n        if (enc4 != 64) {\n          output.push(String.fromCharCode(output_ | chr3));\n          flush = false;\n        }\n      }\n      ol+=3;\n    }\n    \n    if (flush) {\n      output.push(String.fromCharCode(output_));\n      output = output.join('');\n      output = String.fromCharCode(output.charCodeAt(0)|256) + output.substring(1);\n    } else {\n      output = output.join('');\n    }\n    \n    return output;\n    \n  }\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/lz-string.js",
    "content": "// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.4\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n  if (!baseReverseDic[alphabet]) {\n    baseReverseDic[alphabet] = {};\n    for (var i=0 ; i<alphabet.length ; i++) {\n      baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n    }\n  }\n  return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n  compressToBase64 : function (input) {\n    if (input == null) return \"\";\n    var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n    switch (res.length % 4) { // To produce valid Base64\n    default: // When could this happen ?\n    case 0 : return res;\n    case 1 : return res+\"===\";\n    case 2 : return res+\"==\";\n    case 3 : return res+\"=\";\n    }\n  },\n\n  decompressFromBase64 : function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n  },\n\n  compressToUTF16 : function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n  },\n\n  decompressFromUTF16: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n  },\n\n  //compress into uint8array (UCS-2 big endian format)\n  compressToUint8Array: function (uncompressed) {\n    var compressed = LZString.compress(uncompressed);\n    var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n    for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n      var current_value = compressed.charCodeAt(i);\n      buf[i*2] = current_value >>> 8;\n      buf[i*2+1] = current_value % 256;\n    }\n    return buf;\n  },\n\n  //decompress from uint8array (UCS-2 big endian format)\n  decompressFromUint8Array:function (compressed) {\n    if (compressed===null || compressed===undefined){\n        return LZString.decompress(compressed);\n    } else {\n        var buf=new Array(compressed.length/2); // 2 bytes per character\n        for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n          buf[i]=compressed[i*2]*256+compressed[i*2+1];\n        }\n\n        var result = [];\n        buf.forEach(function (c) {\n          result.push(f(c));\n        });\n        return LZString.decompress(result.join(''));\n\n    }\n\n  },\n\n\n  //compress into a string that is already URI encoded\n  compressToEncodedURIComponent: function (input) {\n    if (input == null) return \"\";\n    return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n  },\n\n  //decompress from an output of compressToEncodedURIComponent\n  decompressFromEncodedURIComponent:function (input) {\n    if (input == null) return \"\";\n    if (input == \"\") return null;\n    input = input.replace(/ /g, \"+\");\n    return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n  },\n\n  compress: function (uncompressed) {\n    return LZString._compress(uncompressed, 16, function(a){return f(a);});\n  },\n  _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n    if (uncompressed == null) return \"\";\n    var i, value,\n        context_dictionary= {},\n        context_dictionaryToCreate= {},\n        context_c=\"\",\n        context_wc=\"\",\n        context_w=\"\",\n        context_enlargeIn= 2, // Compensate for the first entry which should not count\n        context_dictSize= 3,\n        context_numBits= 2,\n        context_data=[],\n        context_data_val=0,\n        context_data_position=0,\n        ii;\n\n    for (ii = 0; ii < uncompressed.length; ii += 1) {\n      context_c = uncompressed.charAt(ii);\n      if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n        context_dictionary[context_c] = context_dictSize++;\n        context_dictionaryToCreate[context_c] = true;\n      }\n\n      context_wc = context_w + context_c;\n      if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n        context_w = context_wc;\n      } else {\n        if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n          if (context_w.charCodeAt(0)<256) {\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<8 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          } else {\n            value = 1;\n            for (i=0 ; i<context_numBits ; i++) {\n              context_data_val = (context_data_val << 1) | value;\n              if (context_data_position ==bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = 0;\n            }\n            value = context_w.charCodeAt(0);\n            for (i=0 ; i<16 ; i++) {\n              context_data_val = (context_data_val << 1) | (value&1);\n              if (context_data_position == bitsPerChar-1) {\n                context_data_position = 0;\n                context_data.push(getCharFromInt(context_data_val));\n                context_data_val = 0;\n              } else {\n                context_data_position++;\n              }\n              value = value >> 1;\n            }\n          }\n          context_enlargeIn--;\n          if (context_enlargeIn == 0) {\n            context_enlargeIn = Math.pow(2, context_numBits);\n            context_numBits++;\n          }\n          delete context_dictionaryToCreate[context_w];\n        } else {\n          value = context_dictionary[context_w];\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n\n\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        // Add wc to the dictionary.\n        context_dictionary[context_wc] = context_dictSize++;\n        context_w = String(context_c);\n      }\n    }\n\n    // Output the code for w.\n    if (context_w !== \"\") {\n      if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n        if (context_w.charCodeAt(0)<256) {\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<8 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        } else {\n          value = 1;\n          for (i=0 ; i<context_numBits ; i++) {\n            context_data_val = (context_data_val << 1) | value;\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = 0;\n          }\n          value = context_w.charCodeAt(0);\n          for (i=0 ; i<16 ; i++) {\n            context_data_val = (context_data_val << 1) | (value&1);\n            if (context_data_position == bitsPerChar-1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n        }\n        context_enlargeIn--;\n        if (context_enlargeIn == 0) {\n          context_enlargeIn = Math.pow(2, context_numBits);\n          context_numBits++;\n        }\n        delete context_dictionaryToCreate[context_w];\n      } else {\n        value = context_dictionary[context_w];\n        for (i=0 ; i<context_numBits ; i++) {\n          context_data_val = (context_data_val << 1) | (value&1);\n          if (context_data_position == bitsPerChar-1) {\n            context_data_position = 0;\n            context_data.push(getCharFromInt(context_data_val));\n            context_data_val = 0;\n          } else {\n            context_data_position++;\n          }\n          value = value >> 1;\n        }\n\n\n      }\n      context_enlargeIn--;\n      if (context_enlargeIn == 0) {\n        context_enlargeIn = Math.pow(2, context_numBits);\n        context_numBits++;\n      }\n    }\n\n    // Mark the end of the stream\n    value = 2;\n    for (i=0 ; i<context_numBits ; i++) {\n      context_data_val = (context_data_val << 1) | (value&1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data_position = 0;\n        context_data.push(getCharFromInt(context_data_val));\n        context_data_val = 0;\n      } else {\n        context_data_position++;\n      }\n      value = value >> 1;\n    }\n\n    // Flush the last char\n    while (true) {\n      context_data_val = (context_data_val << 1);\n      if (context_data_position == bitsPerChar-1) {\n        context_data.push(getCharFromInt(context_data_val));\n        break;\n      }\n      else context_data_position++;\n    }\n    return context_data.join('');\n  },\n\n  decompress: function (compressed) {\n    if (compressed == null) return \"\";\n    if (compressed == \"\") return null;\n    return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n  },\n\n  _decompress: function (length, resetValue, getNextValue) {\n    var dictionary = [],\n        next,\n        enlargeIn = 4,\n        dictSize = 4,\n        numBits = 3,\n        entry = \"\",\n        result = [],\n        i,\n        w,\n        bits, resb, maxpower, power,\n        c,\n        data = {val:getNextValue(0), position:resetValue, index:1};\n\n    for (i = 0; i < 3; i += 1) {\n      dictionary[i] = i;\n    }\n\n    bits = 0;\n    maxpower = Math.pow(2,2);\n    power=1;\n    while (power!=maxpower) {\n      resb = data.val & data.position;\n      data.position >>= 1;\n      if (data.position == 0) {\n        data.position = resetValue;\n        data.val = getNextValue(data.index++);\n      }\n      bits |= (resb>0 ? 1 : 0) * power;\n      power <<= 1;\n    }\n\n    switch (next = bits) {\n      case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n        c = f(bits);\n        break;\n      case 2:\n        return \"\";\n    }\n    dictionary[3] = c;\n    w = c;\n    result.push(c);\n    while (true) {\n      if (data.index > length) {\n        return \"\";\n      }\n\n      bits = 0;\n      maxpower = Math.pow(2,numBits);\n      power=1;\n      while (power!=maxpower) {\n        resb = data.val & data.position;\n        data.position >>= 1;\n        if (data.position == 0) {\n          data.position = resetValue;\n          data.val = getNextValue(data.index++);\n        }\n        bits |= (resb>0 ? 1 : 0) * power;\n        power <<= 1;\n      }\n\n      switch (c = bits) {\n        case 0:\n          bits = 0;\n          maxpower = Math.pow(2,8);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 1:\n          bits = 0;\n          maxpower = Math.pow(2,16);\n          power=1;\n          while (power!=maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb>0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n          dictionary[dictSize++] = f(bits);\n          c = dictSize-1;\n          enlargeIn--;\n          break;\n        case 2:\n          return result.join('');\n      }\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n      if (dictionary[c]) {\n        entry = dictionary[c];\n      } else {\n        if (c === dictSize) {\n          entry = w + w.charAt(0);\n        } else {\n          return null;\n        }\n      }\n      result.push(entry);\n\n      // Add w+entry[0] to the dictionary.\n      dictionary[dictSize++] = w + entry.charAt(0);\n      enlargeIn--;\n\n      w = entry;\n\n      if (enlargeIn == 0) {\n        enlargeIn = Math.pow(2, numBits);\n        numBits++;\n      }\n\n    }\n  }\n};\n  return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n  define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n  module.exports = LZString\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/lzstring.d.ts",
    "content": "// Type definitions for lz-string 1.3\n// Project: https://github.com/pieroxy/lz-string, http://pieroxy.net/blog/pages/lz-string/index.html\n// Definitions by: Roman Nikitin <https://github.com/M0ns1gn0r>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\nexport declare namespace NsLZString {\n    /**\n     * LZ-based compression algorithm for JavaScript.\n     */\n    interface LZStringStatic {\n        /**\n         * Compresses input string producing an instance of an \"invalid\" UTF-16 string.\n         * Such string could be stored in localStorage only on webkit\n         * browsers (tested on Android, Chrome, Safari).\n         *\n         * @param uncompressed A string which should be compressed.\n         */\n        compress(uncompressed: string): string;\n\n        /**\n         * Decompresses \"invalid\" input string created by the method compress().\n         *\n         * @param compressed A string obtained from a call to compress().\n         */\n        decompress(compressed: string): null | string;\n\n        /**\n         * Compresses input string producing an instance of a \"valid\" UTF-16 string,\n         * in the sense that all browsers can store them safely.\n         *\n         * @param uncompressed A string which should be compressed.\n         */\n        compressToUTF16(uncompressed: string): string;\n\n        /**\n         * Decompresses \"valid\" input string created by the method compressToUTF16().\n         *\n         * @param compressed A string obtained from a call to compressToUTF16().\n         */\n        decompressFromUTF16(compressed: string): null | string;\n\n        /**\n         * Compresses input string producing an instance of a ASCII UTF-16 string,\n         * which represents the original string encoded in Base64.\n         * The result can be safely transported outside the browser with a\n         * guarantee that none of the characters produced need to be URL-encoded.\n         *\n         * @param uncompressed A string which should be compressed.\n         */\n        compressToBase64(uncompressed: string): string;\n\n        /**\n         * Decompresses ASCII UTF-16 input string created by the method compressToBase64().\n         *\n         * @param compressed A string obtained from a call to compressToBase64().\n         */\n        decompressFromBase64(compressed: string): null | string;\n\n        /**\n         * produces ASCII strings representing the original string encoded in Base64 with a few\n         * tweaks to make these URI safe. Hence, you can send them to the server without thinking\n         * about URL encoding them. This saves bandwidth and CPU\n         *\n         * @param uncompressed A string which should be compressed.\n         */\n        compressToEncodedURIComponent(uncompressed: string): string;\n\n        /**\n         * Decompresses \"valid\" input string created by the method compressToEncodedURIComponent().\n         *\n         * @param compressed A string obtained from a call to compressToEncodedURIComponent().\n         */\n        decompressFromEncodedURIComponent(compressed: string): null | string;\n\n        /**\n         * produces an uint8Array\n         *\n         * @param uncompressed A string which should be compressed.\n         */\n        compressToUint8Array(uncompressed: string): Uint8Array;\n\n        /**\n         * Decompresses \"valid\" array created by the method compressToUint8Array().\n         *\n         * @param compressed A string obtained from a call to compressToUint8Array().\n         */\n        decompressFromUint8Array(compressed: Uint8Array): null | string;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/manualbundle.py",
    "content": "\nimport os\nimport sys\nsys.path.append('../tools/typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_common import *\n\ndef go(smaller):\n    srcs = [\n        # in most cases we use the minification doesn't really matter, since it will be served over gzip it only saves a few kb\n        \"./base64-js-1.3.1/base64js.min.js\", # the non-minified version isn't packaged\n        \"./bowser-2.9/bowser-2.9-bundled.js\", # the non-minified version isn't packaged\n        \"./golly/golly.js\",\n        ]\n    \n    out = '\\n// externalmanualbundle\\n// changes here will be overwritten\\n\\n'\n    for src in srcs:\n        out += f'\\n\\n// begin:{src}\\n'\n        out += files.readAll(src, encoding='utf-8')\n\n    outname = './externalmanualbundlemin.js' if smaller else './externalmanualbundlebig.js'\n    trace('writing to', outname)\n    out = tabsToSpaces(out)\n    files.writeAll(outname, out, encoding='utf-8')\n    \n    srcs = [\n        # in most cases we use the minification doesn't really matter, since it will be served over gzip it only saves a few kb\n        \"./chevrotain-6.5.0/chevrotain.min.js\" if smaller else \"./chevrotain-6.5.0/chevrotain.js\",\n        \"./FileSaver.js-2.0.2/FileSaver.min.js\" if smaller else \"./FileSaver.js-2.0.2/FileSaver.js\",\n        \"./js-lru/js-lru.js\",\n        \"./lz-string-1.4.4/lz-string.min.js\" if smaller else \"./lz-string-1.4.4/lz-string.js\",\n        ]\n    \n    out = '\\n// externaldelaybundle\\n// changes here will be overwritten\\n\\n'\n    for src in srcs:\n        out += f'\\n\\n// begin:{src}\\n'\n        out += files.readAll(src, encoding='utf-8')\n\n    outname = './externaldelaybundlemin.js' if smaller else './externaldelaybundlebig.js'\n    trace('writing to', outname)\n    out = tabsToSpaces(out)\n    files.writeAll(outname, out, encoding='utf-8')\n    \ndef tabsToSpaces(s):\n    return s.replace('\\t', '    ')\n\ndef goAll():\n    go(True)\n    go(False)\n\nif __name__ == '__main__':\n    goAll()\n"
  },
  {
    "path": "vipercard/vipercard/external/pbkdf2/pbkdf2.txt",
    "content": " * 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",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Alejandro Mantecon Guillen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "vipercard/vipercard/external/pizzicato-dynamic/Pizzicato.js",
    "content": "(function(root) {\n    'use strict';\n\n    var Pizzicato = {};\n    var Pz = Pizzicato;\n    var commonJS = typeof module === \"object\" && module.exports;\n    var amd = typeof define === \"function\" && define.amd;\n\n    if (commonJS)\n        module.exports = Pizzicato;\n    else if (amd)\n        define([], Pizzicato);\n    else\n        root.Pizzicato = root.Pz = Pizzicato;\n\n    var AudioContext = root.AudioContext || root.webkitAudioContext; \n\n    if (!AudioContext) {\n        console.error('No AudioContext found in this environment. Please ensure your window or global object contains a working AudioContext constructor function.');\n        return;\n    }\n\n    Pizzicato.context = new AudioContext();\n\n    var masterGainNode = Pizzicato.context.createGain();\n    masterGainNode.connect(Pizzicato.context.destination);\n\n    Pizzicato.Util = {\n    \n        isString: function(arg) {\n            return toString.call(arg) === '[object String]';\n        },\n    \n        isObject: function(arg) {\n            return toString.call(arg) === '[object Object]';\n        },\n    \n        isFunction: function(arg) {\n            return toString.call(arg) === '[object Function]';\n        },\n    \n        isNumber: function(arg) {\n            return toString.call(arg) === '[object Number]' && arg === +arg;\n        },\n    \n        isArray: function(arg) {\n            return toString.call(arg) === '[object Array]';\n        },\n    \n        isInRange: function(arg, min, max) {\n            if (!Pz.Util.isNumber(arg) || !Pz.Util.isNumber(min) || !Pz.Util.isNumber(max))\n                return false;\n    \n            return arg >= min && arg <= max;\n        },\n    \n        isBool: function(arg) {\n            return typeof(arg) === \"boolean\";\n        },\n    \n        isOscillator: function(audioNode) {\n            return (audioNode && audioNode.toString() === \"[object OscillatorNode]\");\n        },\n    \n        isAudioBufferSourceNode: function(audioNode) {\n            return (audioNode && audioNode.toString() === \"[object AudioBufferSourceNode]\");\n        },\n    \n        isSound: function(sound) {\n            return sound instanceof Pz.Sound;\n        },\n    \n        isEffect: function(effect) {\n            for (var key in Pizzicato.Effects)\n                if (effect instanceof Pizzicato.Effects[key])\n                    return true;\n    \n            return false;\n        },\n    \n        // Takes a number from 0 to 1 and normalizes it to fit within range floor to ceiling\n        normalize: function(num, floor, ceil) {\n            if (!Pz.Util.isNumber(num) || !Pz.Util.isNumber(floor) || !Pz.Util.isNumber(ceil))\n                return;\n            \n            return ((ceil - floor) * num) / 1 + floor;\n        },\n    \n        getDryLevel: function(mix) {\n            if (!Pz.Util.isNumber(mix) || mix > 1 || mix < 0)\n                return 0;\n    \n            if (mix <= 0.5)\n                return 1;\n    \n            return 1 - ((mix - 0.5) * 2);\n        },\n    \n        getWetLevel: function(mix) {\n            if (!Pz.Util.isNumber(mix) || mix > 1 || mix < 0)\n                return 0;\n    \n            if (mix >= 0.5)\n                return 1;\n    \n            return 1 - ((0.5 - mix) * 2);\n        }\n    };\n    /* In order to allow an AudioNode to connect to a Pizzicato \n    Effect object, we must shim its connect method */\n    var gainNode = Pizzicato.context.createGain();\n    var audioNode = Object.getPrototypeOf(Object.getPrototypeOf(gainNode));\n    var connect = audioNode.connect;\n    \n    audioNode.connect = function(node) {\n        var endpoint = Pz.Util.isEffect(node) ? node.inputNode : node;\n        connect.call(this, endpoint);\n        return node;\n    };\n\n    Object.defineProperty(Pizzicato, 'volume', {\n        enumerable: true,\n            \n        get: function() {\n            return masterGainNode.gain.value;\n        },\n\n        set: function(volume) {\n            if (Pz.Util.isInRange(volume, 0, 1) && masterGainNode)\n                masterGainNode.gain.value = volume;\n        }\n    });\n\n    Object.defineProperty(Pizzicato, 'masterGainNode', {\n        enumerable: false,\n\n        get: function() {\n            return masterGainNode;\n        },\n\n        set: function(volume) {\n            console.error('Can\\'t set the master gain node');\n        }\n    });\n        Pizzicato.Events = {\n        \n            /**\n             * Adds an event handler that will be treated upon\n             * the triggering of that event.\n             */\n            on: function(name, callback, context) {\n                if (!name || !callback)\n                    return;\n        \n                this._events = this._events || {};\n                var _event = this._events[name] || (this._events[name] = []);\n        \n                _event.push({\n                    callback: callback,\n                    context: context || this,\n                    handler: this\n                });\n            },\n        \n            /**\n             * Triggers a particular event. If a handler\n             * is linked to that event, the handler will be\n             * executed.\n             */\n            trigger: function(name) {\n                if (!name)\n                    return;\n        \n                var _event, length, args, i;\n        \n                this._events = this._events || {};\n                _event = this._events[name] || (this._events[name] = []);\n        \n                if (!_event)\n                    return;\n        \n                length = Math.max(0, arguments.length - 1);\n                args = [];\n        \n                for (i = 0; i < length; i++) \n                    args[i] = arguments[i + 1];\n        \n                for (i = 0; i < _event.length; i++)\n                    _event[i].callback.apply(_event[i].context, args);\t\n            },\n        \n            /**\n             * Removes an event handler. If no name is provided,\n             * all handlers for this object will be removed.\n             */\n            off: function(name) {\n                if (name)\n                    this._events[name] = undefined;\n        \n                else\n                    this._events = {};\n            }\n        \n        };\n    Pizzicato.Sound = function(description, callback) {\n        var self = this;\n        var util = Pizzicato.Util;\n        var descriptionError = getDescriptionError(description);\n        var hasOptions = util.isObject(description) && util.isObject(description.options);\n        var defaultAttack = 0.04;\n        var defaultRelease = 0.04;\n    \n        if (descriptionError) {\n            console.error(descriptionError);\n            throw new Error('Error initializing Pizzicato Sound: ' + descriptionError);\n        }\n    \n        this.detached = hasOptions && description.options.detached;\n        this.masterVolume = Pizzicato.context.createGain();\n        this.fadeNode = Pizzicato.context.createGain();\n        this.fadeNode.gain.value = 0;\n    \n        if (!this.detached)\n            this.masterVolume.connect(Pizzicato.masterGainNode);\n    \n        this.lastTimePlayed = 0;\n        this.effects = [];\n        this.effectConnectors = [];\n        this.playing = this.paused = false;\n        this.loop = hasOptions && description.options.loop;\n        this.attack = hasOptions && util.isNumber(description.options.attack) ? description.options.attack : defaultAttack;\n        this.volume = hasOptions && util.isNumber(description.options.volume) ? description.options.volume : 1;\n    \n        if (hasOptions && util.isNumber(description.options.release)) {\n            this.release = description.options.release;\n        } else if (hasOptions && util.isNumber(description.options.sustain)) {\n            console.warn('\\'sustain\\' is deprecated. Use \\'release\\' instead.');\n            this.release = description.options.sustain;\n        } else {\n            this.release = defaultRelease;\n        }\n    \n        if (!description)\n            (initializeWithWave.bind(this))({}, callback);\n    \n        else if (util.isString(description))\n            (initializeWithUrl.bind(this))(description, callback);\n    \n        else if (util.isFunction(description))\n            (initializeWithFunction.bind(this))(description, callback);\n    \n        else if (description.source === 'file')\n            (initializeWithUrl.bind(this))(description.options.path, callback);\n    \n        else if (description.source === 'wave')\n            (initializeWithWave.bind(this))(description.options, callback);\n    \n        else if (description.source === 'input')\n            (initializeWithInput.bind(this))(description, callback);\n    \n        else if (description.source === 'script')\n            (initializeWithFunction.bind(this))(description.options, callback);\n    \n        else if (description.source === 'sound')\n            (initializeWithSoundObject.bind(this))(description.options, callback);\n    \n    \n        function getDescriptionError(description) {\n            var supportedSources = ['wave', 'file', 'input', 'script', 'sound'];\n    \n            if (description && (!util.isFunction(description) && !util.isString(description) && !util.isObject(description)))\n                return 'Description type not supported. Initialize a sound using an object, a function or a string.';\n    \n            if (util.isObject(description)) {\n    \n                if (!util.isString(description.source) || supportedSources.indexOf(description.source) === -1)\n                    return 'Specified source not supported. Sources can be wave, file, input or script';\n    \n                if (description.source === 'file' && (!description.options || !description.options.path))\n                    return 'A path is needed for sounds with a file source';\n    \n                if (description.source === 'script' && (!description.options || !description.options.audioFunction))\n                    return 'An audio function is needed for sounds with a script source';\n            }\n        }\n    \n    \n        function initializeWithWave(waveOptions, callback) {\n            waveOptions = waveOptions || {};\n            this.getRawSourceNode = function() {\n                var frequency = this.sourceNode ? this.sourceNode.frequency.value : waveOptions.frequency;\n                var node = Pizzicato.context.createOscillator();\n                node.type = waveOptions.type || 'sine';\n                node.frequency.value = (frequency || 440);\n    \n                return node;\n            };\n            this.sourceNode = this.getRawSourceNode();\n            this.sourceNode.gainSuccessor = Pz.context.createGain();\n            this.sourceNode.connect(this.sourceNode.gainSuccessor);\n    \n            if (util.isFunction(callback))\n                callback();\n        }\n    \n    \n        function initializeWithUrl(paths, callback) {\n            paths = util.isArray(paths) ? paths : [paths];\n    \n            var request = new XMLHttpRequest();\n            request.open('GET', paths[0], true);\n            request.responseType = 'arraybuffer';\n    \n            request.onload = function(progressEvent) {\n    \n                Pizzicato.context.decodeAudioData(progressEvent.target.response, (function(buffer) {\n    \n                    self.getRawSourceNode = function() {\n                        var node = Pizzicato.context.createBufferSource();\n                        node.loop = this.loop;\n                        node.buffer = buffer;\n                        return node;\n                    };\n                    if (util.isFunction(callback))\n                        callback();\n    \n                }).bind(self), (function(error) {\n    \n                    console.error('Error decoding audio file ' + paths[0]);\n    \n                    if (paths.length > 1) {\n                        paths.shift();\n                        initializeWithUrl(paths, callback);\n                        return;\n                    }\n    \n                    error = error || new Error('Error decoding audio file ' + paths[0]);\n    \n                    if (util.isFunction(callback))\n                        callback(error);\n    \n                }).bind(self));\n    \n            };\n            request.onreadystatechange = function(event) {\n    \n                if (request.readyState === 4 && request.status !== 200) {\n                    console.error('Error while fetching ' + paths[0] + '. ' + request.statusText);\n                }\n            };\n            request.send();\n        }\n    \n    \n        function initializeWithInput(options, callback) {\n            navigator.getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);\n    \n            if (!navigator.getUserMedia && (!navigator.mediaDevices || ! !navigator.mediaDevices.getUserMedia)) {\n                console.error('Your browser does not support getUserMedia. Note that the current document must be loaded securely for this to work');\n                return;\n            }\n    \n            var handleStream = (function(stream) {\n                self.getRawSourceNode = function() {\n                    return Pizzicato.context.createMediaStreamSource(stream);\n                };\n                if (util.isFunction(callback))\n                    callback();\n            }).bind(self);\n    \n            var handleError = function(error) {\n                if (util.isFunction(callback))\n                    callback(error);\n            };\n    \n            if (!!navigator.mediaDevices.getUserMedia)\n                navigator.mediaDevices.getUserMedia({ audio: true }).then(handleStream).catch(handleError);\n            else\n                navigator.getUserMedia({ audio: true }, handleStream, handleError);\n        }\n    \n    \n        function initializeWithFunction(options, callback) {\n            var audioFunction = util.isFunction(options) ? options : options.audioFunction;\n            var bufferSize = util.isObject(options) && options.bufferSize ? options.bufferSize : null;\n    \n            if (!bufferSize) {\n                try { // Webkit does not automatically chose the buffer size\n                    var test = Pizzicato.context.createScriptProcessor();\n                } catch (e) {\n                    bufferSize = 2048;\n                }\n            }\n    \n            this.getRawSourceNode = function() {\n                var node = Pizzicato.context.createScriptProcessor(bufferSize, 1, 1);\n                node.onaudioprocess = audioFunction;\n                return node;\n            };\n        }\n    \n    \n        function initializeWithSoundObject(options, callback) {\n            this.getRawSourceNode = options.sound.getRawSourceNode;\n    \n            if (options.sound.sourceNode && Pz.Util.isOscillator(options.sound.sourceNode)) {\n                this.sourceNode = this.getRawSourceNode();\n                this.frequency = options.sound.frequency;\n            }\n        }\n    };\n    \n    \n    Pizzicato.Sound.prototype = Object.create(Pizzicato.Events, {\n    \n        play: {\n            enumerable: true,\n    \n            value: function(when, offset) {\n    \n                if (this.playing)\n                    return;\n    \n                if (!Pz.Util.isNumber(offset))\n                    offset = this.offsetTime || 0;\n    \n                if (!Pz.Util.isNumber(when))\n                    when = 0;\n    \n                this.playing = true;\n                this.paused = false;\n                this.sourceNode = this.getSourceNode();\n    \n                this.applyAttack();\n    \n                if (Pz.Util.isFunction(this.sourceNode.start)) {\n                    this.lastTimePlayed = Pizzicato.context.currentTime - offset;\n                    this.sourceNode.start(Pz.context.currentTime + when, offset);\n                }\n    \n                this.trigger('play');\n            }\n        },\n    \n    \n        stop: {\n            enumerable: true,\n    \n            value: function() {\n                if (!this.paused && !this.playing)\n                    return;\n    \n                this.paused = this.playing = false;\n                this.stopWithRelease();\n    \n                this.offsetTime = 0;\n                this.trigger('stop');\n            }\n        },\n    \n    \n        pause: {\n            enumerable: true,\n    \n            value: function() {\n                if (this.paused || !this.playing)\n                    return;\n    \n                this.paused = true;\n                this.playing = false;\n    \n                this.stopWithRelease();\n    \n                var elapsedTime = Pz.context.currentTime - this.lastTimePlayed;\n    \n                // If we are using a buffer node - potentially in loop mode - we need to\n                // know where to re-start the sound independently of the loop it is in.\n                if (this.sourceNode.buffer)\n                    this.offsetTime = elapsedTime % (this.sourceNode.buffer.length / Pz.context.sampleRate);\n                else\n                    this.offsetTime = elapsedTime;\n    \n                this.trigger('pause');\n            }\n        },\n    \n    \n        clone: {\n            enumerable: true,\n    \n            value: function() {\n                var clone = new Pizzicato.Sound({\n                    source: 'sound',\n                    options: {\n                        loop: this.loop,\n                        attack: this.attack,\n                        release: this.release,\n                        volume: this.volume,\n                        sound: this\n                    }\n                });\n    \n                for (var i = 0; i < this.effects.length; i++)\n                    clone.addEffect(this.effects[i]);\n    \n                return clone;\n            }\n        },\n    \n    \n        onEnded: {\n            enumerable: true,\n    \n            value: function(node) {\n                return function() {\n                    // This function may've been called from the release\n                    // end. If in that time the Sound has been played again,\n                    // no action should be taken.\n                    if (!!this.sourceNode && this.sourceNode !== node)\n                        return;\n    \n                    if (this.playing)\n                        this.stop();\n                    if (!this.paused)\n                        this.trigger('end');\n                };\n            }\n        },\n    \n        /**\n         * Adding effects will create a graph in which there will be a\n         * gain node (effectConnector) in between every effect added. For example:\n         * [fadeNode]--->[effect 1]->[connector 1]--->[effect 2]->[connector 2]--->[masterGain]\n         * \n         * Connectors are used to know what nodes to disconnect and not disrupt the\n         * connections of another Pz.Sound object using the same effect.\n         */\n        addEffect: {\n            enumerable: true,\n    \n            value: function(effect) {\n                if (!Pz.Util.isEffect(effect)) {\n                    console.error('The object provided is not a Pizzicato effect.');\n                    return this;\n                }\n    \n                this.effects.push(effect);\n    \n                // Connects effect in the last position\n                var previousNode = this.effectConnectors.length > 0 ? this.effectConnectors[this.effectConnectors.length - 1] : this.fadeNode;\n                previousNode.disconnect();\n                previousNode.connect(effect);\n    \n                // Creates connector for the newly added effect\n                var gain = Pz.context.createGain();\n                this.effectConnectors.push(gain);\n                effect.connect(gain);\n                gain.connect(this.masterVolume);\n    \n                return this;\n            }\n        },\n    \n        /**\n         * When removing effects, the graph in which there will be a\n         * gain node (effectConnector) in between every effect should be \n         * conserved. For example:\n         * [fadeNode]--->[effect 1]->[connector 1]--->[effect 2]->[connector 2]--->[masterGain]\n         * \n         * Connectors are used to know what nodes to disconnect and not disrupt the\n         * connections of another Pz.Sound object using the same effect.\n         */\n        removeEffect: {\n            enumerable: true,\n    \n            value: function(effect) {\n    \n                var index = this.effects.indexOf(effect);\n    \n                if (index === -1) {\n                    console.warn('Cannot remove effect that is not applied to this sound.');\n                    return this;\n                }\n    \n                var shouldResumePlaying = this.playing;\n    \n                if (shouldResumePlaying)\n                    this.pause();\n    \n                var previousNode = (index === 0) ? this.fadeNode : this.effectConnectors[index - 1];\n                previousNode.disconnect();\n    \n                // Disconnect connector and effect\n                var effectConnector = this.effectConnectors[index];\n                effectConnector.disconnect();\n                effect.disconnect(effectConnector);\n    \n                // Remove connector and effect from our arrays\n                this.effectConnectors.splice(index, 1);\n                this.effects.splice(index, 1);\n    \n                var targetNode; \n                if (index > this.effects.length - 1 || this.effects.length === 0)\n                    targetNode = this.masterVolume;\n                else\n                    targetNode = this.effects[index];\n    \n                previousNode.connect(targetNode);\n    \n                if (shouldResumePlaying)\n                    this.play();\n    \n                return this;\n            }\n        },\n    \n    \n        connect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.masterVolume.connect(audioNode);\n                return this;\n            }\n        },\n    \n    \n        disconnect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.masterVolume.disconnect(audioNode);\n                return this;\n            }\n        },\n    \n    \n        connectEffects: {\n            enumerable: true,\n    \n            value: function() {\n    \n                var connectors = [];\n    \n                for (var i = 0; i < this.effects.length; i++) {\n    \n                    var isLastEffect = i === this.effects.length - 1;\n                    var destinationNode = isLastEffect ? this.masterVolume : this.effects[i + 1].inputNode;\n    \n                    connectors[i] = Pz.context.createGain();\n    \n                    this.effects[i].outputNode.disconnect(this.effectConnectors[i]);\n    \n                    this.effects[i].outputNode.connect(destinationNode);\n                }\n            }\n        },\n    \n    \n        volume: {\n            enumerable: true,\n    \n            get: function() {\n                if (this.masterVolume)\n                    return this.masterVolume.gain.value;\n            },\n    \n            set: function(volume) {\n                if (Pz.Util.isInRange(volume, 0, 1) && this.masterVolume)\n                    this.masterVolume.gain.value = volume;\n            }\n        },\n    \n    \n        frequency: {\n            enumerable: true,\n    \n            get: function() {\n                if (this.sourceNode && Pz.Util.isOscillator(this.sourceNode)) {\n                    return this.sourceNode.frequency.value;\n                }\n    \n                return null;\n            },\n    \n            set: function(frequency) {\n                if (this.sourceNode && Pz.Util.isOscillator(this.sourceNode)) {\n                    this.sourceNode.frequency.value = frequency;\n                }\n            }\n        },\n    \n        /**\n         * @deprecated - Use \"release\"\n         */\n        sustain: {\n            enumerable: true,\n    \n            get: function() {\n                console.warn('\\'sustain\\' is deprecated. Use \\'release\\' instead.');\n                return this.release;\n            },\n    \n            set: function(sustain){\n                console.warn('\\'sustain\\' is deprecated. Use \\'release\\' instead.');\n    \n                if (Pz.Util.isInRange(sustain, 0, 10))\n                    this.release = sustain;\n            }\n        },\n    \n    \n        /**\n         * Returns the node that produces the sound. For example, an oscillator\n         * if the Sound object was initialized with a wave option.\n         */\n        getSourceNode: {\n            enumerable: true,\n    \n            value: function() {\n                if (!!this.sourceNode) {\n    \n                    // Directly disconnecting the previous source node causes a \n                    // 'click' noise, especially noticeable if the sound is played \n                    // while the release is ongoing. To address this, we fadeout the \n                    // old source node before disonnecting it.\n    \n                    var previousSourceNode = this.sourceNode;\n                    previousSourceNode.gainSuccessor.gain.setValueAtTime(previousSourceNode.gainSuccessor.gain.value, Pz.context.currentTime);\n                    previousSourceNode.gainSuccessor.gain.linearRampToValueAtTime(0.0001, Pz.context.currentTime + 0.2);\n                    setTimeout(function() {\n                        previousSourceNode.disconnect();\n                        previousSourceNode.gainSuccessor.disconnect();\n                    }, 200);\n                }\n    \n                var sourceNode = this.getRawSourceNode();\n    \n                // A gain node will be placed after the source node to avoid\n                // clicking noises (by fading out the sound)\n                sourceNode.gainSuccessor = Pz.context.createGain();\n                sourceNode.connect(sourceNode.gainSuccessor);\n                sourceNode.gainSuccessor.connect(this.fadeNode);\n                this.fadeNode.connect(this.getInputNode());\n    \n                if (Pz.Util.isAudioBufferSourceNode(sourceNode))\n                    sourceNode.onended = this.onEnded(sourceNode).bind(this);\n    \n                return sourceNode;\n            }\n        },\n    \n    \n        /**\n         * Returns the first node in the graph. When there are effects,\n         * the first node is the input node of the first effect.\n         */\n        getInputNode: {\n            enumerable: true,\n    \n            value: function() {\n                if (this.effects.length > 0)\n                    return this.effects[0].inputNode;\n    \n                return this.masterVolume;\n            }\n        },\n    \n        /**\n         * Will take the current source node and work up the volume\n         * gradually in as much time as specified in the attack property\n         * of the sound.\n         */\n        applyAttack: {\n            enumerable: false,\n    \n            value: function() {\n                var currentValue = this.fadeNode.gain.value;\n                this.fadeNode.gain.cancelScheduledValues(Pz.context.currentTime);\n    \n                if (!this.attack) {\n                    this.fadeNode.gain.setTargetAtTime(1.0, Pz.context.currentTime, 0.001);\n                    return;\n                }\n    \n                // We can't calculate the remaining attack time \n                // in Firefox due to https://bugzilla.mozilla.org/show_bug.cgi?id=893020\n                var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n                var remainingAttackTime = this.attack;\n    \n                if (!isFirefox)\n                    remainingAttackTime = (1 - this.fadeNode.gain.value) * this.attack;\n    \n                this.fadeNode.gain.setTargetAtTime(1.0, Pz.context.currentTime, remainingAttackTime * 2);\n            }\n        },\n    \n        /**\n         * Will take the current source node and work down the volume\n         * gradually in as much time as specified in the release property\n         * of the sound before stopping the source node.\n         */\n        stopWithRelease: {\n            enumerable: false,\n    \n            value: function(callback) {\n    \n                var node = this.sourceNode;\n                var stopSound = function() {\n                    return Pz.Util.isFunction(node.stop) ? node.stop(0) : node.disconnect();\n                };\n    \n                var currentValue = this.fadeNode.gain.value;\n                this.fadeNode.gain.cancelScheduledValues(Pz.context.currentTime);\n    \n                if (!this.release) {\n                    this.fadeNode.gain.setTargetAtTime(0.0, Pz.context.currentTime, 0.001);\n                    stopSound();\n                    return;\n                }\n    \n                // We can't calculate the remaining attack time \n                // in Firefox due to https://bugzilla.mozilla.org/show_bug.cgi?id=893020\n                var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n                var remainingReleaseTime = this.release;\n    \n                if (!isFirefox)\n                    remainingReleaseTime = this.fadeNode.gain.value * this.release;\n    \n                this.fadeNode.gain.setTargetAtTime(0.00001, Pz.context.currentTime, remainingReleaseTime / 5);\n    \n                window.setTimeout(function() {\n                    stopSound();\n                }, remainingReleaseTime * 1000);\n            }\n        }\n    });\n    \n    Pizzicato.Group = function(sounds) {\n    \n        sounds = sounds || [];\n        \n        this.mergeGainNode = Pz.context.createGain();\n        this.masterVolume = Pz.context.createGain();\n        this.sounds = [];\n        this.effects = [];\n        this.effectConnectors = [];\n    \n        this.mergeGainNode.connect(this.masterVolume);\n        this.masterVolume.connect(Pz.masterGainNode);\n    \n        for (var i = 0; i < sounds.length; i++)\n            this.addSound(sounds[i]);\n    };\n    \n    Pizzicato.Group.prototype = Object.create(Pz.Events, {\n    \n        connect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.masterVolume.connect(audioNode);\n                return this;\n            }\n        },\n    \n    \n        disconnect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.masterVolume.disconnect(audioNode);\n                return this;\n            }\n        },\n    \n    \n        addSound: {\n            enumerable: true,\n    \n            value: function(sound) {\n                if (!Pz.Util.isSound(sound)) {\n                    console.error('You can only add Pizzicato.Sound objects');\n                    return;\n                }\n                if (this.sounds.indexOf(sound) > -1) {\n                    console.warn('The Pizzicato.Sound object was already added to this group');\n                    return;\n                }\n                if (sound.detached) {\n                    console.warn('Groups do not support detached sounds. You can manually create an audio graph to group detached sounds together.');\n                    return;\n                }\n    \n                sound.disconnect(Pz.masterGainNode);\n                sound.connect(this.mergeGainNode);\n                this.sounds.push(sound);\n            }\n        },\n    \n    \n        removeSound: {\n            enumerable: true,\n    \n            value: function(sound) {\n                var index = this.sounds.indexOf(sound);\n    \n                if (index === -1) {\n                    console.warn('Cannot remove a sound that is not part of this group.');\n                    return;\n                }\n    \n                sound.disconnect(this.mergeGainNode);\n                sound.connect(Pz.masterGainNode);\n                this.sounds.splice(index, 1);\n            }\n        },\n    \n    \n        volume: {\n            enumerable: true,\n    \n            get: function() {\n                if (this.masterVolume)\n                    return this.masterVolume.gain.value;\n            },\n    \n            set: function(volume) {\n                if (Pz.Util.isInRange(volume, 0, 1))\n                    this.masterVolume.gain.value = volume;\n            }\n        },\n    \n    \n        play: {\n            enumerable: true,\n    \n            value: function() {\n                for (var i = 0; i < this.sounds.length; i++)\n                    this.sounds[i].play();\n    \n                this.trigger('play');\n            }\n    \n        },\n    \n    \n        stop: {\n            enumerable: true,\n    \n            value: function() {\n                for (var i = 0; i < this.sounds.length; i++)\n                    this.sounds[i].stop();\n    \n                this.trigger('stop');\n            }\n    \n        },\n    \n    \n        pause: {\n            enumerable: true,\n    \n            value: function() {\n                for (var i = 0; i < this.sounds.length; i++)\n                    this.sounds[i].pause();\n    \n                this.trigger('pause');\n            }\n    \n        },\n    \n        /**\n         * Similarly to Sound objects, adding effects will create a graph in which there will be a\n         * gain node (effectConnector) in between every effect added. For example:\n         * [fadeNode]--->[effect 1]->[connector 1]--->[effect 2]->[connector 2]--->[masterGain]\n         * \n         * Connectors are used to know what nodes to disconnect and not disrupt the\n         * connections of another Pz.Group object using the same effect.\n         */\n        addEffect: {\n            enumerable: true,\n    \n            value: function(effect) {\n                if (!Pz.Util.isEffect(effect)) {\n                    console.error('The object provided is not a Pizzicato effect.');\n                    return this;\n                }\n    \n                this.effects.push(effect);\n    \n                // Connects effect in the last position\n                var previousNode = this.effectConnectors.length > 0 ? this.effectConnectors[this.effectConnectors.length - 1] : this.mergeGainNode;\n                previousNode.disconnect();\n                previousNode.connect(effect);\n    \n                // Creates connector for the newly added effect\n                var gain = Pz.context.createGain();\n                this.effectConnectors.push(gain);\n                effect.connect(gain);\n                gain.connect(this.masterVolume);\n    \n                return this;\n            }\n        },\n    \n        /**\n         * When removing effects, the graph in which there will be a\n         * gain node (effectConnector) in between every effect should be \n         * conserved. For example:\n         * [fadeNode]--->[effect 1]->[connector 1]--->[effect 2]->[connector 2]--->[masterGain]\n         * \n         * Connectors are used to know what nodes to disconnect and not disrupt the\n         * connections of another Pz.Group object using the same effect.\n         */\n        removeEffect: {\n            enumerable: true,\n    \n            value: function(effect) {\n                var index = this.effects.indexOf(effect);\n    \n                if (index === -1) {\n                    console.warn('Cannot remove effect that is not applied to this group.');\n                    return this;\n                }\n    \n                var previousNode = (index === 0) ? this.mergeGainNode : this.effectConnectors[index - 1];\n                previousNode.disconnect();\n    \n                // Disconnect connector and effect\n                var effectConnector = this.effectConnectors[index];\n                effectConnector.disconnect();\n                effect.disconnect(effectConnector);\n    \n                // Remove connector and effect from our arrays\n                this.effectConnectors.splice(index, 1);\n                this.effects.splice(index, 1);\n    \n                var targetNode; \n                if (index > this.effects.length - 1 || this.effects.length === 0)\n                    targetNode = this.masterVolume;\n                else\n                    targetNode = this.effects[index];\n    \n                previousNode.connect(targetNode);\n    \n                return this;\n            }\n        }\n    \n    });\n    Pizzicato.Effects = {};\n    \n    var baseEffect = Object.create(null, {\n    \n        connect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.outputNode.connect(audioNode);\n                return this;\n            }\n        },\n    \n        disconnect: {\n            enumerable: true,\n    \n            value: function(audioNode) {\n                this.outputNode.disconnect(audioNode);\n                return this;\n            }\n        }\n    });\n    Pizzicato.Effects.Delay = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            feedback: 0.5,\n            time: 0.3,\n            mix: 0.5\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n        this.feedbackGainNode = Pizzicato.context.createGain();\n        this.delayNode = Pizzicato.context.createDelay();\n    \n        // line in to dry mix\n        this.inputNode.connect(this.dryGainNode);\n        // dry line out\n        this.dryGainNode.connect(this.outputNode);\n    \n        // feedback loop\n        this.delayNode.connect(this.feedbackGainNode);\n        this.feedbackGainNode.connect(this.delayNode);\n    \n        // line in to wet mix\n        this.inputNode.connect(this.delayNode);\n        // wet out\n        this.delayNode.connect(this.wetGainNode);\n        \n        // wet line out\n        this.wetGainNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.Delay.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the dry/wet mix.\n         */\n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix\t;\t\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        /**\n         * Time between each delayed sound\n         */\n        time: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.time;\t\n            },\n    \n            set: function(time) {\n                if (!Pz.Util.isInRange(time, 0, 180))\n                    return;\n    \n                this.options.time = time;\n                this.delayNode.delayTime.value = time;\n            }\n        },\n    \n        /**\n         * Strength of each of the echoed delayed sounds.\n         */\n        feedback: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.feedback;\t\n            },\n    \n            set: function(feedback) {\n                if (!Pz.Util.isInRange(feedback, 0, 1))\n                    return;\n    \n                this.options.feedback = parseFloat(feedback, 10);\n                this.feedbackGainNode.gain.value = this.feedback;\n            }\n        }\n    \n    });\n    Pizzicato.Effects.Compressor = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            threshold: -24,\n            knee: 30,\n            attack: 0.003,\n            release: 0.250,\n            ratio: 12\n        };\n    \n        this.inputNode = this.compressorNode = Pizzicato.context.createDynamicsCompressor();\n        this.outputNode = Pizzicato.context.createGain();\n        \n        this.compressorNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.Compressor.prototype = Object.create(baseEffect, {\n    \n        /**\n         * The level above which compression is applied to the audio.\n         * MIN: -100\n         * MAX: 0\n         */\n        threshold: {\n            enumerable: true,\n            \n            get: function() {\n                return this.compressorNode.threshold.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, -100, 0))\n                    this.compressorNode.threshold.value = value;\n            }\n        },\n    \n        /**\n         * A value representing the range above the threshold where \n         * the curve smoothly transitions to the \"ratio\" portion. More info:\n         * http://www.homestudiocorner.com/what-is-knee-on-a-compressor/\n         * MIN 0\n         * MAX 40\n         */\n        knee: {\n            enumerable: true,\n            \n            get: function() {\n                return this.compressorNode.knee.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 0, 40))\n                    this.compressorNode.knee.value = value;\n            }\n        },\n    \n        /**\n         * How soon the compressor starts to compress the dynamics after \n         * the threshold is exceeded. If volume changes are slow, you can \n         * push this to a high value. Short attack times will result in a \n         * fast response to sudden, loud sounds, but will make the changes \n         * in volume much more obvious to listeners.\n         * MIN 0\n         * MAX 1\n         */\n        attack: {\n            enumerable: true,\n            \n            get: function() {\n                return this.compressorNode.attack.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 0, 1))\n                    this.compressorNode.attack.value = value;\n            }\n        },\n    \n        /**\n         * How soon the compressor starts to release the volume level \n         * back to normal after the level drops below the threshold. \n         * A long time value will tend to lose quiet sounds that come \n         * after loud ones, but will avoid the volume being raised too \n         * much during short quiet sections like pauses in speech.\n         * MIN 0\n         * MAX 1\n         */\n        release: {\n            enumerable: true,\n            \n            get: function() {\n                return this.compressorNode.release.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 0, 1))\n                    this.compressorNode.release.value = value;\n            }\n        },\n    \n        /**\n         * The amount of compression applied to the audio once it \n         * passes the threshold level. The higher the Ratio the more \n         * the loud parts of the audio will be compressed.\n         * MIN 1\n         * MAX 20\n         */\n        ratio: {\n            enumerable: true,\n            \n            get: function() {\n                return this.compressorNode.ratio.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 1, 20))\n                    this.compressorNode.ratio.value = value;\n            }\n        },\n    \n        getCurrentGainReduction: function() {\n            return this.compressorNode.reduction;\n        }\n    \n    });\n    /**\n     * Frequencies below the cutoff frequency pass \n     * through; frequencies above it are attenuated.\n     */\n    Pizzicato.Effects.LowPassFilter = function(options) {\n        Filter.call(this, options, 'lowpass');\n    };\n    \n    /**\n     * Frequencies below the cutoff frequency are \n     * attenuated; frequencies above it pass through.\n     */\n    Pizzicato.Effects.HighPassFilter = function(options) {\n        Filter.call(this, options, 'highpass');\n    };\n    \n    /**\n     * Filters used by Pizzicato stem from the biquad filter node. This \n     * function acts as a common constructor. The only thing that changes \n     * between filters is the 'type' of the biquad filter node.\n     */\n    function Filter(options, type) {\n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            frequency: 350,\n            peak: 1\n        };\n    \n        this.inputNode = this.filterNode = Pz.context.createBiquadFilter();\n        this.filterNode.type = type;\n    \n        this.outputNode = Pizzicato.context.createGain();\n    \n        this.filterNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    }\n    \n    var filterPrototype = Object.create(baseEffect, {\n        \n        /**\n         * The cutoff frequency of the filter.\n         * MIN: 10\n         * MAX: 22050 (half the sampling rate of the current context)\n         */\n        frequency: {\n            enumerable: true,\n            \n            get: function() {\n                return this.filterNode.frequency.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 10, 22050))\n                    this.filterNode.frequency.value = value;\n            }\n        },\n    \n        /**\n         * Indicates how peaked the frequency is around \n         * the cutoff. The greater the value is, the \n         * greater is the peak.\n         * MIN: 0.0001\n         * MAX: 1000\n         */\n        peak: {\n            enumerable: true,\n            \n            get: function() {\n                return this.filterNode.Q.value;\n            },\n            set: function(value) {\n                if (Pizzicato.Util.isInRange(value, 0.0001, 1000))\n                    this.filterNode.Q.value = value;\n            }\n        }\n    });\n    \n    Pizzicato.Effects.LowPassFilter.prototype = filterPrototype;\n    Pizzicato.Effects.HighPassFilter.prototype = filterPrototype;\n    Pizzicato.Effects.Distortion = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            gain: 0.5\n        };\n    \n        this.waveShaperNode = Pizzicato.context.createWaveShaper();\n        this.inputNode = this.outputNode = this.waveShaperNode;\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.Distortion.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the gain (amount of distortion).\n         */\n        gain: {\n            enumerable: true,\n            \n            get: function() {\n                return this.options.gain;\n            },\n    \n            set: function(gain) {\n                if (!Pz.Util.isInRange(gain, 0, 1))\n                    return;\n    \n                this.options.gain = gain;\n                this.adjustGain();\n            }\n        },\n    \n        /**\n         * Sets the wave curve with the correct gain. Taken from\n         * http://stackoverflow.com/questions/22312841/waveshaper-node-in-webaudio-how-to-emulate-distortion\n         */\n        adjustGain: {\n            writable: false,\n            configurable: false,\n            enumerable: false,\n            value: function() {\n                var gain = Pz.Util.isNumber(this.options.gain) ? parseInt(this.options.gain * 100, 10) : 50;\n                var n_samples = 44100;\n                var curve = new Float32Array(n_samples);\n                var deg = Math.PI / 180;\n                var x;\n    \n                for (var i = 0; i < n_samples; ++i ) {\n                    x = i * 2 / n_samples - 1;\n                    curve[i] = (3 + gain) * x * 20 * deg / (Math.PI + gain * Math.abs(x));\n                }\n    \n                this.waveShaperNode.curve = curve;\n            }\n        }\n    \n    });\n    Pizzicato.Effects.Flanger = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            time: 0.45,\n            speed: 0.2,\n            depth: 0.1,\n            feedback: 0.1,\n            mix: 0.5\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.inputFeedbackNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.delayNode = Pizzicato.context.createDelay();\n        this.oscillatorNode = Pizzicato.context.createOscillator();\n        this.gainNode = Pizzicato.context.createGain();\n        this.feedbackNode = Pizzicato.context.createGain();\n        this.oscillatorNode.type = 'sine';\n    \n        this.inputNode.connect(this.inputFeedbackNode);\n        this.inputNode.connect(this.dryGainNode);\n    \n        this.inputFeedbackNode.connect(this.delayNode);\n        this.inputFeedbackNode.connect(this.wetGainNode);\n    \n        this.delayNode.connect(this.wetGainNode);\n        this.delayNode.connect(this.feedbackNode);\n    \n        this.feedbackNode.connect(this.inputFeedbackNode);\n    \n        this.oscillatorNode.connect(this.gainNode);\n        this.gainNode.connect(this.delayNode.delayTime);\n    \n        this.dryGainNode.connect(this.outputNode);\n        this.wetGainNode.connect(this.outputNode);\n    \n        this.oscillatorNode.start(0);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.Flanger.prototype = Object.create(baseEffect, {\n        \n        time: {\n            enumberable: true,\n            \n            get: function() {\n                return this.options.time;\n            },\n    \n            set: function(time) {\n    \n                if (!Pz.Util.isInRange(time, 0, 1))\n                    return;\n    \n                this.options.time = time;\n                this.delayNode.delayTime.value = Pz.Util.normalize(time, 0.001, 0.02);\n            }\n        },\n    \n    \n        speed: {\n            enumberable: true,\n            \n            get: function() {\n                return this.options.speed;\n            },\n    \n            set: function(speed) {\n                if (!Pz.Util.isInRange(speed, 0, 1))\n                    return;\n    \n                this.options.speed = speed;\n                this.oscillatorNode.frequency.value = Pz.Util.normalize(speed, 0.5, 5);\n            }\n        },\n    \n    \n        depth: {\n            enumberable: true,\n            \n            get: function() {\n                return this.options.depth;\n            },\n    \n            set: function(depth) {\n                if (!Pz.Util.isInRange(depth, 0, 1))\n                    return;\n    \n                this.options.depth = depth;\n                this.gainNode.gain.value = Pz.Util.normalize(depth, 0.0005, 0.005);\n            }\n        },\n    \n    \n        feedback: {\n            enumberable: true,\n            \n            get: function() {\n                return this.options.feedback;\n            },\n    \n            set: function(feedback) {\n                if (!Pz.Util.isInRange(feedback, 0, 1))\n                    return;\n    \n                this.options.feedback = feedback;\n                this.feedbackNode.gain.value = Pz.Util.normalize(feedback, 0, 0.8);\n            }\n        },\n    \n    \n        mix: {\n            enumberable: true,\n            \n            get: function() {\n                return this.options.mix;\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        }\n    \n    });\n    Pizzicato.Effects.StereoPanner = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            pan: 0\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n    \n        if (Pizzicato.context.createStereoPanner) {\n            this.pannerNode = Pizzicato.context.createStereoPanner();\n            this.inputNode.connect(this.pannerNode);\n            this.pannerNode.connect(this.outputNode);\n    \n        } else if (Pizzicato.context.createPanner) {\n    \n            console.warn('Your browser does not support the StereoPannerNode. Will use PannerNode instead.');\n    \n            this.pannerNode = Pizzicato.context.createPanner();\n            this.pannerNode.type = 'equalpower';\n            this.inputNode.connect(this.pannerNode);\n            this.pannerNode.connect(this.outputNode);\n    \n        } else {\n            console.warn('Your browser does not support the Panner effect.');\n            this.inputNode.connect(this.outputNode);\n        }\n    \n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.StereoPanner.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Pan position\n         */\n        pan: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.pan;\t\n            },\n    \n            set: function(pan) {\n                if (!Pz.Util.isInRange(pan, -1, 1))\n                    return;\n    \n                this.options.pan = pan;\n    \n                if (!this.pannerNode)\n                    return;\n    \n                var isStereoPannerNode = this.pannerNode.toString().indexOf('StereoPannerNode') > -1;\n    \n                if (isStereoPannerNode) {\n                    this.pannerNode.pan.value = pan;\t\n                } else {\n                    this.pannerNode.setPosition(pan, 0, 1 - Math.abs(pan));\n                }\n            }\n        }\n    \n    });\n    Pizzicato.Effects.Convolver = function(options, callback) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var self = this;\n        var request = new XMLHttpRequest();\n        var defaults = {\n            mix: 0.5\n        };\n    \n        this.callback = callback;\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.convolverNode = Pizzicato.context.createConvolver();\n        this.outputNode = Pizzicato.context.createGain();\n    \n        this.wetGainNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n    \n        this.inputNode.connect(this.convolverNode);\n    \n        this.convolverNode.connect(this.wetGainNode);\n        this.inputNode.connect(this.dryGainNode);\n    \n        this.dryGainNode.connect(this.outputNode);\n        this.wetGainNode.connect(this.outputNode);\n    \n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    \n        if (!options.impulse) {\n            console.error('No impulse file specified.');\n            return;\n        }\n    \n        request.open('GET', options.impulse, true);\n        request.responseType = 'arraybuffer';\n        request.onload = function (e) {\n            var audioData = e.target.response;\n    \n            Pizzicato.context.decodeAudioData(audioData, function(buffer) {\n    \n                self.convolverNode.buffer = buffer;\n    \n                if (self.callback && Pz.Util.isFunction(self.callback))\n                    self.callback();\n    \n            }, function(error) {\n    \n                error = error || new Error('Error decoding impulse file');\n    \n                if (self.callback && Pz.Util.isFunction(self.callback))\n                    self.callback(error);\n            });\n        };\n    \n        request.onreadystatechange = function(event) {\n            if (request.readyState === 4 && request.status !== 200) {\n                console.error('Error while fetching ' + options.impulse + '. ' + request.statusText);\n            }\n        };\n    \n        request.send();\n    };\n    \n    Pizzicato.Effects.Convolver.prototype = Object.create(baseEffect, {\n    \n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix;\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        }\n    });\n    /**\n     * Adapted from https://github.com/mmckegg/web-audio-school/blob/master/lessons/3.%20Effects/18.%20Ping%20Pong%20Delay/answer.js\n     */\n    \n    Pizzicato.Effects.PingPongDelay = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            feedback: 0.5,\n            time: 0.3,\n            mix: 0.5\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.delayNodeLeft = Pizzicato.context.createDelay();\n        this.delayNodeRight = Pizzicato.context.createDelay();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n        this.feedbackGainNode = Pizzicato.context.createGain();\n        this.channelMerger = Pizzicato.context.createChannelMerger(2);\n    \n        // dry mix\n        this.inputNode.connect(this.dryGainNode);\n        // dry mix out\n        this.dryGainNode.connect(this.outputNode);\n    \n        // the feedback loop\n        this.delayNodeLeft.connect(this.channelMerger, 0, 0);\n        this.delayNodeRight.connect(this.channelMerger, 0, 1);\n        this.delayNodeLeft.connect(this.delayNodeRight);\n        this.feedbackGainNode.connect(this.delayNodeLeft);\n        this.delayNodeRight.connect(this.feedbackGainNode);\n    \n        // wet mix\n        this.inputNode.connect(this.feedbackGainNode);\n    \n        // wet out\n        this.channelMerger.connect(this.wetGainNode);\n        this.wetGainNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.PingPongDelay.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the dry/wet mix.\n         */\n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix\t;\t\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        /**\n         * Time between each delayed sound\n         */\n        time: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.time;\t\n            },\n    \n            set: function(time) {\n                if (!Pz.Util.isInRange(time, 0, 180))\n                    return;\n    \n                this.options.time = time;\n                this.delayNodeLeft.delayTime.value = time;\n                this.delayNodeRight.delayTime.value = time;\n            }\n        },\n    \n        /**\n         * Strength of each of the echoed delayed sounds.\n         */\n        feedback: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.feedback;\t\n            },\n    \n            set: function(feedback) {\n                if (!Pz.Util.isInRange(feedback, 0, 1))\n                    return;\n    \n                this.options.feedback = parseFloat(feedback, 10);\n                this.feedbackGainNode.gain.value = this.feedback;\n            }\n        }\n    \n    });\n    /**\n     * Adapted from https://github.com/web-audio-components/simple-reverb\n     */\n    \n    Pizzicato.Effects.Reverb = function(options) {\n        var self = this;\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            mix: 0.5,\n            time: 0.01,\n            decay: 0.01,\n            reverse: false\n        };\n        \n        this.inputNode = Pizzicato.context.createGain();\n        this.reverbNode = Pizzicato.context.createConvolver();\n        this.outputNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n    \n        this.inputNode.connect(this.reverbNode);\n        this.reverbNode.connect(this.wetGainNode);\n        this.inputNode.connect(this.dryGainNode);\n        this.dryGainNode.connect(this.outputNode);\n        this.wetGainNode.connect(this.outputNode);\n        \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    \n        (buildImpulse.bind(this))();\n    };\n    \n    Pizzicato.Effects.Reverb.prototype = Object.create(baseEffect, {\n    \n        mix: {\n            enumerable: true,\n            \n            get: function() {\n                return this.options.mix;\n            },\n    \n            set: function (mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        time: {\n            enumerable: true,\n    \n            get: function () {\n                return this.options.time;\n            },\n    \n            set: function (time) {\n                if (!Pz.Util.isInRange(time, 0.0001, 10))\n                    return;\n    \n                this.options.time = time;\n                (buildImpulse.bind(this))();\n            }\n        },\n    \n        decay: {\n            enumerable: true,\n    \n            get: function () {\n                return this.options.decay;\n            },\n    \n            set: function (decay) {\n                if (!Pz.Util.isInRange(decay, 0.0001, 10))\n                    return;\n    \n                this.options.decay = decay;\n                (buildImpulse.bind(this))();\n            }\n    \n        },\n    \n        reverse: {\n            enumerable: true,\n    \n            get: function () {\n                return this.options.reverse;\n            },\n    \n            set: function (reverse) {\n                if (!Pz.Util.isBool(reverse))\n                    return;\n    \n                this.options.reverse = reverse;\n                (buildImpulse.bind(this))();\n            }\n        }\n    \n    });\n    \n    function buildImpulse() {\n    \n        var length = Pz.context.sampleRate * this.time;\n        var impulse = Pizzicato.context.createBuffer(2, length, Pz.context.sampleRate);\n        var impulseL = impulse.getChannelData(0);\n        var impulseR = impulse.getChannelData(1);\n        var n, i;\n    \n        for (i = 0; i < length; i++) {\n            n = this.reverse ? length - i : i;\n            impulseL[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, this.decay);\n            impulseR[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, this.decay);\n        }\n    \n            // https://github.com/alemangui/pizzicato/issues/91\n            // ConvolverNode can be associated with only one buffer.\n            // Not sure what's the best way, but we are recreating ConvolverNode\n            // when properties change to work it around.\n            if (this.reverbNode.buffer) {\n              this.inputNode.disconnect(this.reverbNode);\n              this.reverbNode.disconnect(this.wetGainNode);\n    \n              this.reverbNode = Pizzicato.context.createConvolver();\n              this.inputNode.connect(this.reverbNode);\n              this.reverbNode.connect(this.wetGainNode);\n            }\n    \n        this.reverbNode.buffer = impulse;\n    }\n    \n    Pizzicato.Effects.Tremolo = function(options) {\n    \n        // adapted from\n        // https://github.com/mmckegg/web-audio-school/blob/master/lessons/3.%20Effects/13.%20Tremolo/answer.js\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            speed: 4,\n            depth: 1,\n            mix: 0.8\n        };\n    \n        // create nodes\n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n    \n        this.tremoloGainNode = Pizzicato.context.createGain();\n        this.tremoloGainNode.gain.value = 0;\n        this.lfoNode = Pizzicato.context.createOscillator();\n    \n        this.shaperNode = Pizzicato.context.createWaveShaper();\n        this.shaperNode.curve = new Float32Array([0, 1]);\n        this.shaperNode.connect(this.tremoloGainNode.gain);\n    \n        // dry mix\n        this.inputNode.connect(this.dryGainNode);\n        this.dryGainNode.connect(this.outputNode);\n        \n        // wet mix\n        this.lfoNode.connect(this.shaperNode);\n        this.lfoNode.type = 'sine';\n        this.lfoNode.start(0);\n    \n        this.inputNode.connect(this.tremoloGainNode);\n        this.tremoloGainNode.connect(this.wetGainNode);\n        this.wetGainNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.Tremolo.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the dry/wet mix.\n         */\n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix\t;\t\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1)) \n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        /**\n         * Speed of the tremolo\n         */\n        speed: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.speed;\t\n            },\n    \n            set: function(speed) {\n                if (!Pz.Util.isInRange(speed, 0, 20)) \n                    return;\n                \n                this.options.speed = speed;\n                this.lfoNode.frequency.value = speed;\n            }\n        },\n    \n        /**\n         * Depth of the tremolo\n         */\n        depth: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.depth;\t\n            },\n    \n            set: function(depth) {\n                if (!Pz.Util.isInRange(depth, 0, 1)) \n                    return;\n                \n                this.options.depth = depth;\n                this.shaperNode.curve = new Float32Array([1-depth, 1]);\n            }\n        }\n    \n    });\n    Pizzicato.Effects.DubDelay = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            feedback: 0.6,\n            time: 0.7,\n            mix: 0.5,\n            cutoff: 700\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n        this.feedbackGainNode = Pizzicato.context.createGain();\n        this.delayNode = Pizzicato.context.createDelay();\n        this.bqFilterNode = Pizzicato.context.createBiquadFilter(); \n    \n    \n        // dry mix\n        this.inputNode.connect(this.dryGainNode);\n        this.dryGainNode.connect(this.outputNode);\n    \n        // wet mix\n        this.inputNode.connect(this.wetGainNode);\n        this.inputNode.connect(this.feedbackGainNode);\n    \n        this.feedbackGainNode.connect(this.bqFilterNode);\n        this.bqFilterNode.connect(this.delayNode);\n        this.delayNode.connect(this.feedbackGainNode);\n        this.delayNode.connect(this.wetGainNode);\n    \n        this.wetGainNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    Pizzicato.Effects.DubDelay.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the dry/wet mix.\n         */\n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix\t;\t\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        /**\n         * Time between each delayed sound\n         */\n        time: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.time;\t\n            },\n    \n            set: function(time) {\n                if (!Pz.Util.isInRange(time, 0, 180))\n                    return;\n    \n                this.options.time = time;\n                this.delayNode.delayTime.value = time;\n            }\n        },\n    \n        /**\n         * Strength of each of the echoed delayed sounds.\n         */\n        feedback: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.feedback;\t\n            },\n    \n            set: function(feedback) {\n                if (!Pz.Util.isInRange(feedback, 0, 1))\n                    return;\n    \n                this.options.feedback = parseFloat(feedback, 10);\n                this.feedbackGainNode.gain.value = this.feedback;\n            }\n        },\n    \n        /**\n         * Frequency on delay repeats\n         */\n        cutoff: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.cutoff;\t\n            },\n    \n            set: function(cutoff) {\n                if (!Pz.Util.isInRange(cutoff, 0, 4000))\n                    return;\n    \n                this.options.cutoff = cutoff;\n                this.bqFilterNode.frequency.value = this.cutoff;\n            }\n        }\n    \n    \n    \n    });\n    /**\n     * See http://webaudio.prototyping.bbc.co.uk/ring-modulator/\n     */\n    Pizzicato.Effects.RingModulator = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            speed: 30,\n            distortion: 1,\n            mix: 0.5\n        };\n    \n        this.inputNode = Pizzicato.context.createGain();\n        this.outputNode = Pizzicato.context.createGain();\n        this.dryGainNode = Pizzicato.context.createGain();\n        this.wetGainNode = Pizzicato.context.createGain();\n    \n    \n        /**\n         * `vIn` is the modulation oscillator input \n         * `vc` is the audio input.\n         */\n        this.vIn = Pizzicato.context.createOscillator();\n        this.vIn.start(0);\n        this.vInGain = Pizzicato.context.createGain();\n        this.vInGain.gain.value = 0.5;\n        this.vInInverter1 = Pizzicato.context.createGain();\n        this.vInInverter1.gain.value = -1;\n        this.vInInverter2 = Pizzicato.context.createGain();\n        this.vInInverter2.gain.value = -1;\n        this.vInDiode1 = new DiodeNode(Pizzicato.context);\n        this.vInDiode2 = new DiodeNode(Pizzicato.context);\n        this.vInInverter3 = Pizzicato.context.createGain();\n        this.vInInverter3.gain.value = -1;\n        this.vcInverter1 = Pizzicato.context.createGain();\n        this.vcInverter1.gain.value = -1;\n        this.vcDiode3 = new DiodeNode(Pizzicato.context);\n        this.vcDiode4 = new DiodeNode(Pizzicato.context);\n    \n        this.outGain = Pizzicato.context.createGain();\n        this.outGain.gain.value = 3;\n    \n        this.compressor = Pizzicato.context.createDynamicsCompressor();\n        this.compressor.threshold.value = -24;\n        this.compressor.ratio.value = 16;\n    \n        // dry mix\n        this.inputNode.connect(this.dryGainNode);\n        this.dryGainNode.connect(this.outputNode);\n    \n        // wet mix\t\n        this.inputNode.connect(this.vcInverter1);\n        this.inputNode.connect(this.vcDiode4.node);\n        this.vcInverter1.connect(this.vcDiode3.node);\n        this.vIn.connect(this.vInGain);\n        this.vInGain.connect(this.vInInverter1);\n        this.vInGain.connect(this.vcInverter1);\n        this.vInGain.connect(this.vcDiode4.node);\n        this.vInInverter1.connect(this.vInInverter2);\n        this.vInInverter1.connect(this.vInDiode2.node);\n        this.vInInverter2.connect(this.vInDiode1.node);\n        this.vInDiode1.connect(this.vInInverter3);\n        this.vInDiode2.connect(this.vInInverter3);\n        this.vInInverter3.connect(this.compressor);\n        this.vcDiode3.connect(this.compressor);\n        this.vcDiode4.connect(this.compressor);\n        this.compressor.connect(this.outGain);\n        this.outGain.connect(this.wetGainNode);\n    \n        // line out\n        this.wetGainNode.connect(this.outputNode);\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    var DiodeNode = function(context_) {\n        this.context = context_;\n        this.node = this.context.createWaveShaper();\n        this.vb = 0.2;\n        this.vl = 0.4;\n        this.h = 1;\n        this.setCurve();\n    };\n    \n    DiodeNode.prototype.setDistortion = function (distortion) {\n        this.h = distortion;\n        return this.setCurve();\n    };\n    \n    DiodeNode.prototype.setCurve = function () {\n        var i, \n            samples, \n            v, \n            value, \n            wsCurve, \n            _i, \n            _ref, \n            retVal;\n    \n        samples = 1024;\n        wsCurve = new Float32Array(samples);\n        \n        for (i = _i = 0, _ref = wsCurve.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n            v = (i - samples / 2) / (samples / 2);\n            v = Math.abs(v);\n            if (v <= this.vb) {\n                value = 0;\n            } else if ((this.vb < v) && (v <= this.vl)) {\n                value = this.h * ((Math.pow(v - this.vb, 2)) / (2 * this.vl - 2 * this.vb));\n            } else {\n                value = this.h * v - this.h * this.vl + (this.h * ((Math.pow(this.vl - this.vb, 2)) / (2 * this.vl - 2 * this.vb)));\n            }\n            wsCurve[i] = value;\n        }\n    \n        retVal = this.node.curve = wsCurve;\n        return retVal;\n    };\n    \n    DiodeNode.prototype.connect = function(destination) {\n        return this.node.connect(destination);\n    };\n    \n    \n    Pizzicato.Effects.RingModulator.prototype = Object.create(baseEffect, {\n    \n        /**\n         * Gets and sets the dry/wet mix.\n         */\n        mix: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.mix\t;\t\n            },\n    \n            set: function(mix) {\n                if (!Pz.Util.isInRange(mix, 0, 1))\n                    return;\n    \n                this.options.mix = mix;\n                this.dryGainNode.gain.value = Pizzicato.Util.getDryLevel(this.mix);\n                this.wetGainNode.gain.value = Pizzicato.Util.getWetLevel(this.mix);\n            }\n        },\n    \n        /**\n         * Speed on the input oscillator\n         */\n        speed: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.speed;\t\n            },\n    \n            set: function(speed) {\n                if (!Pz.Util.isInRange(speed, 0, 2000))\n                    return;\n    \n                this.options.speed = speed;\n                this.vIn.frequency.value = speed;\n            }\n        },\n    \n        /**\n         * Level of distortion\n         */\n        distortion: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.distortion;\t\n            },\n    \n            set: function(distortion) {\n                if (!Pz.Util.isInRange(distortion, 0.2, 50))\n                    return;\n    \n                this.options.distortion = parseFloat(distortion, 10);\n    \n                var diodeNodes = [this.vInDiode1, this.vInDiode2, this.vcDiode3, this.vcDiode4];\n    \n                for (var i=0, l=diodeNodes.length; i<l; i++) {\n                    diodeNodes[i].setDistortion(distortion);\n                }\n            }\n        }\n    \n    });\n    Pizzicato.Effects.Quadrafuzz = function(options) {\n    \n        this.options = {};\n        options = options || this.options;\n    \n        var defaults = {\n            lowGain: 0.6,\n            midLowGain: 0.8,\n            midHighGain: 0.5,\n            highGain: 0.6\n        };\n    \n    \n        this.inputNode = Pz.context.createGain();\n        this.outputNode = Pz.context.createGain();\n        this.dryGainNode = Pz.context.createGain();\n        this.wetGainNode = Pz.context.createGain();\n    \n    \n        this.lowpassLeft = Pz.context.createBiquadFilter();\n        this.lowpassLeft.type = 'lowpass';\n        this.lowpassLeft.frequency.value = 147;\n        this.lowpassLeft.Q.value = 0.7071;\n    \n        this.bandpass1Left = Pz.context.createBiquadFilter();\n        this.bandpass1Left.type = 'bandpass';\n        this.bandpass1Left.frequency.value = 587;\n        this.bandpass1Left.Q.value = 0.7071;\n    \n        this.bandpass2Left = Pz.context.createBiquadFilter();\n        this.bandpass2Left.type = 'bandpass';\n        this.bandpass2Left.frequency.value = 2490;\n        this.bandpass2Left.Q.value = 0.7071;\n    \n        this.highpassLeft = Pz.context.createBiquadFilter();\n        this.highpassLeft.type = 'highpass';\n        this.highpassLeft.frequency.value = 4980;\n        this.highpassLeft.Q.value = 0.7071;\n    \n    \n        this.overdrives = [];\n        for (var i = 0; i < 4; i++) {\n            this.overdrives[i] = Pz.context.createWaveShaper();\n            this.overdrives[i].curve = getDistortionCurve();\n        }\n    \n    \n        this.inputNode.connect(this.wetGainNode);\n        this.inputNode.connect(this.dryGainNode);\n        this.dryGainNode.connect(this.outputNode);\n    \n        var filters = [this.lowpassLeft, this.bandpass1Left, this.bandpass2Left, this.highpassLeft];\n        for (i = 0; i < filters.length; i++) {\n            this.wetGainNode.connect(filters[i]);\n            filters[i].connect(this.overdrives[i]);\n            this.overdrives[i].connect(this.outputNode);\n        }\n    \n        for (var key in defaults) {\n            this[key] = options[key];\n            this[key] = (this[key] === undefined || this[key] === null) ? defaults[key] : this[key];\n        }\n    };\n    \n    function getDistortionCurve(gain) {\n        var sampleRate = Pz.context.sampleRate;\n        var curve = new Float32Array(sampleRate);\n        var deg = Math.PI / 180;\n    \n        for (var i = 0; i < sampleRate; i++) {\n            var x = i * 2 / sampleRate - 1;\n            curve[i] = (3 + gain) * x * 20 * deg / (Math.PI + gain * Math.abs(x));\n        }\n        return curve;\n    }\n    \n    Pizzicato.Effects.Quadrafuzz.prototype = Object.create(baseEffect, {\n    \n        lowGain: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.lowGain;\n            },\n    \n            set: function(lowGain) {\n                if (!Pz.Util.isInRange(lowGain, 0, 1))\n                    return;\n    \n                this.options.lowGain = lowGain;\n                this.overdrives[0].curve = getDistortionCurve(Pz.Util.normalize(this.lowGain, 0, 150));\n            }\n        },\n    \n        midLowGain: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.midLowGain;\n            },\n    \n            set: function(midLowGain) {\n                if (!Pz.Util.isInRange(midLowGain, 0, 1))\n                    return;\n    \n                this.options.midLowGain = midLowGain;\n                this.overdrives[1].curve = getDistortionCurve(Pz.Util.normalize(this.midLowGain, 0, 150));\n            }\n        },\n    \n        midHighGain: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.midHighGain;\n            },\n    \n            set: function(midHighGain) {\n                if (!Pz.Util.isInRange(midHighGain, 0, 1))\n                    return;\n    \n                this.options.midHighGain = midHighGain;\n                this.overdrives[2].curve = getDistortionCurve(Pz.Util.normalize(this.midHighGain, 0, 150));\n            }\n        },\n    \n        highGain: {\n            enumerable: true,\n    \n            get: function() {\n                return this.options.highGain;\n            },\n    \n            set: function(highGain) {\n                if (!Pz.Util.isInRange(highGain, 0, 1))\n                    return;\n    \n                this.options.highGain = highGain;\n                this.overdrives[3].curve = getDistortionCurve(Pz.Util.normalize(this.highGain, 0, 150));\n            }\n        }\n    });\n    \n    \n    \n    return Pizzicato;\n})(typeof window !== \"undefined\" ? window : global);"
  },
  {
    "path": "vipercard/vipercard/external/pizzicato-dynamic/README.md",
    "content": "<img align=\"center\" src=\"https://alemangui.github.io/pizzicato/img/horizontal-logo-outline.svg\" alt=\"Pizzicato.js\">\n\n[![Build Status](https://travis-ci.org/alemangui/pizzicato.svg?branch=master)](https://travis-ci.org/alemangui/pizzicato) [![npm](https://img.shields.io/npm/v/pizzicato.svg)](https://www.npmjs.com/package/pizzicato) [![Bower](https://img.shields.io/bower/v/pizzicato.svg)](https://bower.io/) [![CDNJS](https://img.shields.io/cdnjs/v/pizzicato.svg)](https://cdnjs.com/libraries/pizzicato)\n\n## A Web Audio library\n\nPizzicato aims to simplify the way you create and manipulate sounds via the Web Audio API. Take a look at the [demo site here](https://alemangui.github.io/pizzicato/).\n\n## Table of contents\n- [Get Pizzicato](#get-pizzicato)\n  - [npm](#npm)\n  - [bower](#bower)\n  - [cdnjs](#cdnjs)\n  - [Installing and testing](#installing-and-testing)\n- [TL;DR: How does it work?](#tldr)\n- [Create a sound](#create-a-sound)\n  - [Sounds from a wave](#sounds-from-a-wave)\n  - [Sounds from a file](#sounds-from-a-file)\n  - [Sounds from input](#sounds-from-input)\n  - [Sounds from a function](#sounds-from-a-function)\n- [Using sounds](#using-sounds)\n  - [play()](#sounds-play)\n  - [pause()](#sounds-pause)\n  - [stop()](#sounds-stop)\n  - [clone()](#sounds-clone)\n  - [addEffect()](#sounds-add-effect)\n  - [removeEffect()](#sounds-remove-effect)\n  - [volume](#sounds-volume)\n  - [attack](#sounds-attack)\n  - [release](#sounds-release)\n  - [frequency](#sounds-frequency)\n  - [Events](#sounds-events)\n    - [play](#sounds-events-play)\n    - [pause](#sounds-events-pause)\n    - [stop](#sounds-events-stop)\n    - [end](#sounds-events-end)\n  - [Connecting sounds to AudioNodes](#sounds-connect)\n- [Grouping sounds](#groups)\n  - [Create a group](#create-a-group)\n  - [addSound()](#group-add-sound)\n  - [removeSound()](#group-remove-sound)\n  - [addEffect()](#group-add-effect)\n  - [removeEffect()](#group-remove-effect)\n  - [play()](#group-play)\n  - [pause()](#group-pause)\n  - [stop()](#group-stop)\n  - [volume](#group-volume)\n- [Effects](#effects)\n  - [Delay](#delay)\n  - [Ping Pong Delay](#pingpongdelay)\n  - [Dub Delay](#dubdelay)\n  - [Distortion](#distortion)\n  - [Quadrafuzz](#quadrafuzz)\n  - [Flanger](#flanger)\n  - [Compressor](#compressor)\n  - [Low-pass filter](#low-pass-filter)\n  - [High-pass filter](#high-pass-filter)\n  - [Stereo Panner](#stereo-panner)\n  - [Convolver](#convolver)\n  - [Reverb](#reverb)\n  - [Ring Modulator](#ring-modulator)\n  - [Tremolo](#tremolo)\n  - [Connecting effects to and from AudioNodes](#effects-connect)\n- [Advanced](#advanced)\n  - [Accessing the audio context](#accessing-the-context)\n  - [Using Pizzicato objects in a web audio graph](#using-graph)\n  - [General volume](#general-volume)\n  - [Memory management](#memory-management)\n- [Support](#support)\n  - [Browsers](#browsers)\n  - [Audio formats](#audio-formats)\n\n<a name=\"get-pizzicato\"/>\n\n## Get Pizzicato\n\n<a name=\"npm\"/>\n\n### npm\n\n```\nnpm install pizzicato\n```\n\n<a name=\"bower\"/>\n\n### bower\n\n```\nbower install pizzicato\n```\n\n<a name=\"cdnjs\"/>\n\n### cdnjs\n\nFull source code:\n```html\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/pizzicato/0.6.4/Pizzicato.js\"></script>\n```\n\nMinified:\n```html\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/pizzicato/0.6.4/Pizzicato.min.js\"></script>\n```\n\n<a name=\"installing-and-testing\"/>\n\n### Installing and testing\n\n*Ensure you have gulp installed:* ```npm install -g gulp```.\n\nCheckout the project and install dependencies with :\n```\nnpm install\n```\n\nRun tests with:\n```\nnpm run test\n```\n\nBy default, Firefox is used for local testing. If you'd like to use Chrome you can use the setting active in TravisCI. To do so, go to ```karma.conf.js```, line 5, and change the browsers array to :\n\n```\nbrowsers: ['Chrome_travis_ci'],\n```\n\nBuild without tests with:\n```npm run build``` or ```npm run watch```\n\n<a name=\"tldr\"/>\n\n## TL;DR: How does it work?\nInclude Pizzicato in your site\n```html\n<script src=\"./Pizzicato.js\"></script>\n```\n\nCreate a sound\n```javascript\nvar sawtoothWave = new Pizzicato.Sound({ \n    source: 'wave',\n    options: {\n        type: 'sawtooth'\n    }\n});\n```\n\nAdd effects\n```javascript\nvar delay = new Pizzicato.Effects.Delay();\nsawtoothWave.addEffect(delay);\n```\n\nPlay it!\n```javascript\nsawtoothWave.play();\n```\n\n<a name=\"create-a-sound\"/>\n\n## Create a sound\nTo create a new sound, use the ```Pizzicato.Sound``` constructor, which takes an object with the sound's ```description``` as argument and a callback that will be executed when the sound is ready to be used. If an error occurs, the callback will be called with the error as a parameter.\n```javascript\nvar sound = new Pizzicato.Sound(Object description, [Function callback]);\n```\nFor example:\n```javascript\nvar click = new Pizzicato.Sound({ source: 'wave' }, function(error) {\n    if (!error)\n        console.log('Sound ready to use!');\n});\n```\n\nTypically, the ```description``` object contains a string ```source``` and an object ```options```. The ```options``` object varies depending on the source of the sound being created.\n\nFor example, this objects describes a sine waveform with a frequency of 440:\n```javascript\n{\n    source: 'wave',\n    options: {\n        type: 'sine',\n        frequency: 440\n    }\n}\n```\n\nSounds can be created from a variety of sources.\n\n<a name=\"sounds-from-a-wave\"/>\n\n### Sounds from a wave ([example](https://alemangui.github.io/pizzicato/#sound-from-waveform))\nTo create a sound from an oscillator with a certain waveform, use the ```source: wave``` in your description. Additionally, the following optional parameters are possible inside the ```options``` object:\n* ```type``` _(Optional; ```sine```, ```square```, ```triangle``` or ```sawtooth```, defaults to ```sine```)_: Specifies the type of waveform.\n* ```frequency``` _(Optional; defaults to 440)_: Indicates the frequency of the wave (i.e., a 440 value will yield an A note).\n* ```volume``` _(Optional; min: 0, max: 1, defaults to 1)_: Loudness of the sound.\n* ```release``` _(Optional; defaults to 0.4)_: Value in seconds that indicates the fade-out time when the sound is stopped.\n* ```attack``` _(Optional; defaults to 0.4)_: Value in seconds that indicates the fade-in time when the sound is played.\n* ```detached``` _(Optional; defaults to false)_: If true, the sound will not be connected to the context's destination, and thus, will not be audible.\n\n```javascript\nvar sound = new Pizzicato.Sound({ \n        source: 'wave',\n        options: { type: 'sawtooth', frequency: 440 }\n});\n```\n\nCreating a Pizzicato Sound with an empty constructor will create a sound with a sine wave and a frequency of 440.\n\n```javascript\nvar sound = new Pizzicato.Sound();\n```\n\n<a name=\"sounds-from-a-file\"/>\n\n### Sounds from a file ([example](https://alemangui.github.io/pizzicato/#sound-from-file))\nIn order to load a sound from a file, include the ```source: file``` in your description. Additionally, the following  parameters are possible inside the ```options``` object:\n* ```path``` _(Mandatory; string or array of strings)_: Specifies the path of the sound file. It is also possible to have an array of paths to fallback on. Pizzicato will attempt to load the paths in order, passing on to the next one in case of failure.\n* ```loop``` _(Optional; boolean, defaults to false)_: If set, the file will start playing again after the end.\n* ```volume``` _(Optional; min: 0, max: 1, defaults to 1)_: Loudness of the sound.\n* ```release``` _(Optional; defaults to 0)_: Value in seconds that indicates the fade-out time once the sound is stopped.\n* ```attack``` _(Optional; defaults to 0.4)_: Value in seconds that indicates the fade-in time when the sound is played.\n* ```detached``` _(Optional; defaults to false)_: If true, the sound will not be connected to the context's destination, and thus, will not be audible.\n\n```javascript\nvar sound = new Pizzicato.Sound({ \n    source: 'file',\n    options: { path: './audio/sound.wav' }\n}, function() {\n    console.log('sound file loaded!');\n});\n```\nIt is possible to pass several paths to fallback in case of error:\n```javascript\nvar sound = new Pizzicato.Sound({ \n    source: 'file',\n    options: { path: ['./audio/sound-special-format.wav', './audio/sound.wav'] }\n}, function() {\n    console.log('sound file loaded!');\n});\n```\n\nAlternatively, you can also simply pass a string to the constructor with the path of the sound file.\n```\nvar sound = new Pizzicato.Sound('./audio/sound.wav', function() {...});\n```\nCheck the [supported audio files](#audio-formats) that can be played with Pizzicato.\n\n<a name=\"sounds-from-input\"/>\n\n### Sounds from the user input ([example](https://alemangui.github.io/pizzicato/#sound-from-input))\nIt is also possible to use the sound input from the computer. This is usually the microphone, but it could also be a line-in input. To use this, add ```source: input``` in your description. The following optional parameters are possible inside ```options``` object:\n* ```volume``` _(Optional; min: 0, max: 1, defaults to 1)_: Loudness of the sound.\n* ```release``` _(Optional; defaults to 0)_: Value in seconds that indicates the fade-out time once the sound is stopped.\n* ```attack``` _(Optional; defaults to 0.4)_: Value in seconds that indicates the fade-in time when the sound is played.\n* ```detached``` _(Optional; defaults to false)_: If true, the sound will not be connected to the context's destination, and thus, will not be audible.\n\n```javascript\nvar voice = new Pizzicato.Sound({\n    source: 'input',\n    options: { volume: 0.8 }\n});\n```\n\n<a name=\"sounds-from-a-function\"/>\n\n### Sounds from a function ([example](https://alemangui.github.io/pizzicato/#sound-from-function))\nFor more creative freedom, Pizzicato also allows direct audio processing. Sounds can be created from a Javascript function by including ```source: script``` in the description. The following parameters are possible in the ```options``` object:\n* ```audioFunction``` _(Mandatory; function(<audio processing event>))_: Function that will be called with the audio processing event.\n* ```bufferSize``` _(Optional; number - must be a power of 2.)_: This value controls how many sample frames will be processed at each audio process event. Lower values will result in lower latency, higher values help prevent glitches.\n* ```volume``` _(Optional; min: 0, max: 1, defaults to 1)_: Loudness of the sound.\n* ```release``` _(Optional; defaults to 0)_: Value in seconds that indicates the fade-out time once the sound is stopped.\n* ```attack``` _(Optional; defaults to 0.4)_: Value in seconds that indicates the fade-in time when the sound is played.\n* ```detached``` _(Optional; defaults to false)_: If true, the sound will not be connected to the context's destination, and thus, will not be audible.\n\nFor example:\n```javascript\nvar whiteNoise = Pizzicato.Sound({\n    source: 'script',\n    options: {\n        audioFunction: function(e) {\n            var output = e.outputBuffer.getChannelData(0);\n            for (var i = 0; i < e.outputBuffer.length; i++)\n                output[i] = Math.random();\n        }\n    }\n});\n```\n\n<a name=\"using-sounds\"/>\n\n## Using sounds\n\n<a name=\"sounds-play\"/>\n\n### Play ([example](https://alemangui.github.io/pizzicato/#sound-from-waveform))\n\nYou can play a sound by calling it's ```play``` function. It takes two optional parameters:\n\n* ```when``` _(number, defaults to 0)_: Time in seconds to wait before playing the sound.\n* ```offset``` _(number, defaults to 0)_: Time in seconds where the sound will start.\n\nFor example, the following code will wait two seconds, then play a sound starting from position 00:04:\n\n```javascript\nsound.play(2, 4);\n```\n\n<a name=\"sounds-pause\"/>\n\n### Pause\n\nYou can pause a sound by calling it's ```pause``` function. Next time the sound is played, it will continue from where it left off.\n\n```javascript\nsound.pause();\n```\n\n<a name=\"sounds-stop\"/>\n\n### Stop\n\nYou can stop a sound by calling it's ```stop``` function. Next time the sound is played, it will continue from the start of the sound.\n\n```javascript\nsound.stop();\n```\n\n<a name=\"sounds-clone\"/>\n\n### Clone\n\nYou can clone a sound object by calling it's ```clone``` function. The object returned will have the same parameters as the original sound.\n\n```javascript\nsound.clone();\n```\n\n<a name=\"sounds-add-effect\"/>\n\n### Add effects ([example](https://alemangui.github.io/pizzicato/#delay))\n\nYou can add effects to a sound object by calling it's ```addEffect(effect)``` function. The function gets as parameter a Pizzicato Effect (see [effects](#effects)).\n\n* ```effect``` _(type: Pizzicato.Effect)_: The effect to add to the sound object.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\nvar delay = new Pizzicato.Effects.Delay();\nsound.addEffect(delay);\n```\n\n<a name=\"sounds-remove-effect\"/>\n\n### Remove effects\n\nYou can remove effects that have been added to a sound object by calling it's ```removeEffect(effect)``` function. The function gets as parameter a Pizzicato Effect (see [effects](#effects)) that is already applied to the sound object.\n\n* ```effect``` _(type: Pizzicato.Effect)_: The effect to remove from the sound object.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\nvar delay = new Pizzicato.Effects.Delay();\nsound.addEffect(delay);\n...\nsound.removeEffect(delay);\n```\n\n<a name=\"sounds-volume\"/>\n\n### Volume\n\nUse the sound's ```volume``` property to modify its volume.\n\n* ```volume``` _(min: 0, max: 1, defaults to 1)_: The sound's volume\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\nsound.volume = 0.5;\n```\n\n<a name=\"sounds-attack\"/>\n\n### Attack ([example](https://alemangui.github.io/pizzicato/#attack-release))\n\nUse the sound's ```attack``` property to modify its attack (or fade-in) value. This value eases the beginning of the sound, often avoiding unwanted clicks.\n\n* ```attack``` _(min: 0, max: 10, defaults to 0.04)_: The sound's attack.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\nsound.attack = 0.9;\n```\n\n<a name=\"sounds-release\"/>\n\n### Release ([example](https://alemangui.github.io/pizzicato/#attack-release))\n\nUse the sound's ```release``` property to modify its release (or fade-out) value. This value eases the end of the sound, often avoiding unwanted clicks.\n\n* ```release``` _(min: 0, max: 10, defaults to 0.04)_: The sound's release.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\nsound.release = 0.9;\n```\n\n<a name=\"sounds-frequency\"/>\n\n### Frequency\n\nIf you started a sound of type [wave](#sounds-from-a-wave), you can modify the frequency of the oscillator by altering the ```frequency``` property.\n\n* ```frequency``` _(defaults to 440)_: The oscillator's frequency of a sound of type wave.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\n\nsound.play();\n\n// go up an octave\nsound.frequency = 880; // a5\n```\n\n<a name=\"sounds-events\" />\n\n### Events\n\nIt is possible to subscribe to the following events that will occur on the Sound object: ```play```, ```pause```, ```stop```, ```end```.\n\n<a name=\"sounds-events-play\" />\n\n#### ```play``` event\n\nThe ```play``` event will be fired when the sound is played.\n\nExample:\n```javascript\nvar sound = new Pizzicato.Sound();\n\nsound.on('play', function() {\n  //...\n})\n```\n\n\n<a name=\"sounds-events-pause\" />\n\n#### ```pause``` event\n\nFired when the sound is paused. For example:\n\n```javascript\nvar sound = new Pizzicato.Sound();\n\nsound.on('pause', function() {\n  //...\n})\n```\n\n<a name=\"sounds-events-stop\" />\n\n#### ```stop``` event\n\nFired when the sound is stopped. For example:\n\n```javascript\nvar sound = new Pizzicato.Sound();\n\nsound.on('stop', function() {\n  //...\n})\n```\n\n<a name=\"sounds-events-end\" />\n\n#### ```end``` event\n\nFired when the sound has ended. This is only valid for sounds coming from a file. For example:\n\n```javascript\nvar sound = new Pizzicato.Sound();\n\nsound.on('end', function() {\n  //...\n})\n```\n\n\n<a name=\"sounds-connect\" />\n\n###Connecting sounds to AudioNodes\nIt is possible to connect AudioNodes to sound objects by using the ```connect``` method. More details in the [advanced section of this file](#using-graph-sound).\n\n<a name=\"groups\" />\n\n## Grouping sounds ([example](https://alemangui.github.io/pizzicato/#create-group))\nGroups are a way to handle multiple ```Pz.Sound``` objects at the same time.\n\n<a name=\"create-a-group\" />\n\n### Create a group ([example](https://alemangui.github.io/pizzicato/#create-group))\n\nThe ```Pizzicato.Group``` constructor takes an optional array of sound objects. Please note these sounds must be detached for them to be usable inside a group (more details about detached sounds [here](#using-graph-sound-detached)).\n\n* ```sounds``` _(array, defaults to [])_: The sounds to be added to the group.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\n\nvar group = new Pizzicato.Group([drums, guitar]);\n```\n\n<a name=\"group-add-sound\"/>\n\n### addSound()\n\nTo add a sound to a group, use the function ```addSound()```, which receives one parameter:\n\n* ```sound``` _(Pz.Sound, mandatory)_: The sound to be added to the group.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group();\n\ngroup.addSound(drums)\ngroup.addSound(guitar)\n```\n\n<a name=\"group-remove-sound\"/>\n\n### removeSound()\n\nTo remove a sound to a group, use the function ```removeSound()```, which receives one parameter:\n\n* ```sound``` _(Pz.Sound, mandatory)_: The sound to be removed from the group.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.removeSound(drums)\ngroup.removeSound(guitar)\n```\n\n<a name=\"group-add-effect\"/>\n\n### addEffect()\n\nTo add an effect to a group, use the function ```addEffect()```. Please note all sounds inside the group will be affected by the added effect. The function receives one parameter:\n\n* ```effect``` _(Pz.Effect, mandatory)_: The effect to be added to the group.\n\nExample:\n```javascript\nvar bass = new Pizzicato.Sound('./audio/bass.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar delay = new Pizzicato.Effects.Delay();\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.addEffect(delay)\n```\n\n<a name=\"group-remove-effect\"/>\n\n### removeEffect()\n\nTo remove an effect to a group, use the function ```removeEffect()```. The function receives one parameter:\n\n* ```effect``` _(Pz.Effect, mandatory)_: The effect to be removed from the group.\n\nExample:\n```javascript\nvar bass = new Pizzicato.Sound('./audio/bass.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar delay = new Pizzicato.Effects.Delay();\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.addEffect(delay)\n\ngroup.removeEffect(delay)\n```\n\n<a name=\"group-play\"/>\n\n### play()\n\nYou can play all sounds of a group simultaneously using the function ```play```, which takes no parameters.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.play();\n```\n\n<a name=\"group-pause\"/>\n\n### pause()\n\nYou can pause all sounds of a group simultaneously using the function ```pause```, which takes no parameters. Next time the group is played, it will continue from where it left off.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.play();\ngroup.pause();\n```\n\n<a name=\"group-stop\"/>\n\n### stop()\nYou can stop all sounds of a group simultaneously using the function ```stop```, which takes no parameters. Next time the group is played, it will continue from the start of the sounds composing it.\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.play();\ngroup.stop();\n```\n\n<a name=\"group-volume\"/>\n\n### volume\n\nUse the group's ```volume``` property to modify the volume of all the group.\n\n* ```volume``` _(min: 0, max: 1, defaults to 1)_: The sound's volume\n\nExample:\n```javascript\nvar drums = new Pizzicato.Sound('./audio/drums.mp3');\nvar guitar = new Pizzicato.Sound('./audio/guitar.mp3');\nvar group = new Pizzicato.Group([guitar, drums]);\n\ngroup.volume = 0.5;\n```\n\n<a name=\"effects\"/>\n\n## Effects\nOnce a sound is created you can add effects to it by using the ```addEffect``` function. To remove an effect, you can use the ```removeEffect``` function.\n```javascript\nvar delay = new Pizzicato.Effects.Delay();\nsound.addEffect(delay);\nsound.removeEffect(delay);\n```\n\n<a name=\"delay\"/>\n\n### Delay ([example](https://alemangui.github.io/pizzicato/#delay))\nThe delay effect plays back the sound a certain number of times in defined intervals, giving the impression of an echo. The following options are available when creating a delay effect:\n* ```feedback``` _(min: 0, max: 1, defaults to 0.5)_: The intensity with which the input will echo back. A larger value will result in more echo repetitions.\n* ```time``` _(min: 0, max: 1, defaults to 0.3)_: Interval time in seconds.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output (the delayed sound).\n\nExample:\n```javascript\nvar delay = new Pizzicato.Effects.Delay({\n    feedback: 0.8,\n    time: 0.22,\n    mix: 0.75\n});\nsound.addEffect(delay);\nsound.play();\n```\n\n<a name=\"ping-pong-delay\"/>\n\n### Ping Pong Delay ([example](https://alemangui.github.io/pizzicato/#ping-pong-delay))\nThe ping pong delay effect is similar to a regular [Delay](#delay) effect, however on each feedback loop the output is swapped between left and right channels. The following options are available when creating a delay effect:\n* ```feedback``` _(min: 0, max: 1, defaults to 0.5)_: The intensity with which the input will echo back. A larger value will result in more echo repetitions.\n* ```time``` _(min: 0, max: 1, defaults to 0.3)_: Interval time in seconds.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output (the delayed sound).\n\nExample:\n```javascript\nvar pingPongDelay = new Pizzicato.Effects.PingPongDelay({\n    feedback: 0.3,\n    time: 0.2,\n    mix: 0.68\n});\nsound.addEffect(pingPongDelay);\nsound.play();\n```\n\n<a name=\"dubdelay\"/>\n\n### Dub Delay ([example](https://alemangui.github.io/pizzicato/#dub-delay))\nThe dub delay effect is similar to a regular [Delay](#delay) effect, however on each feedback loop the output is routed through a biquad filter. \n\nThis effect is based on [Chris Lowis'](https://twitter.com/chrislowis) article [Creating dub delay effects with the Web Audio API](http://blog.chrislowis.co.uk/2014/07/23/dub-delay-web-audio-api.html).\n\nThe following options are available when creating a delay effect:\n* ```feedback``` _(min: 0, max: 1, defaults to 0.5)_: The intensity with which the input will echo back. A larger value will result in more echo repetitions.\n* ```time``` _(min: 0, max: 1, defaults to 0.3)_: Interval time in seconds.\n* ```cutoff``` _(min: 0, max: 4000, defaults to 700)_: Frequency value applied to each successive loop. The lower the value, the more different each repetition will be perceived.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output (the delayed sound).\n\nExample:\n```javascript\nvar dubDelay = new Pizzicato.Effects.DubDelay({\n    feedback: 0.6,\n    time: 0.7,\n    mix: 0.5,\n    cutoff: 700\n});\nsound.addEffect(dubDelay);\nsound.play();\n```\n\n<a name=\"distortion\"/>\n\n### Distortion ([example](https://alemangui.github.io/pizzicato/#distortion))\nThe distortion effect adds a basic \"override\" to the sound. The distortion effect only takes one parameter:\n* ```gain``` _(min: 0, max: 1, defaults to 0.5)_: Amount of distortion applied.\n\nExample:\n```javascript\nvar distortion = new Pizzicato.Effects.Distortion({\n    gain: 0.4\n});\nsound.addEffect(delay);\nsound.play();\n```\n\n<a name=\"quadrafuzz\">\n\n### Quadrafuzz ([example](https://alemangui.github.io/pizzicato/#quadrafuzz))\nThe quadrafuzz effect divides the sound into separate bands and then distorts each band independently, allowing you to control which frequencies you distort and how much.\n\nThe quadrafuzz code in Pizzicato is based on [Michel Buffa's](https://twitter.com/micbuffa) implementation of the quadrafuzz effect.\n\nThe effect takes the following parameters:\n* ```lowGain``` _(min: 0, max: 1, defaults to 0.6)_: \n* ```midLowGain``` _(min: 0, max: 1, defaults to 0.8)_: \n* ```midHighGain``` _(min: 0, max: 1, defaults to 0.5)_: \n* ```highGain``` _(min: 0, max: 1, defaults to 0.6)_: \n\nExample:\n```javascript\nvar quadrafuzz = new Pizzicato.Effects.Quadrafuzz({\n    lowGain: 0.6,\n    midLowGain: 0.8,\n    midHighGain: 0.5,\n    highGain: 0.6,\n});\n\nsound.addEffect(quadrafuzz);\nsound.play();\n```\n\n<a name=\"flanger\"/>\n\n### Flanger ([example](https://alemangui.github.io/pizzicato/#flanger))\nThe flanger produces a swirling effect by delaying a \"copy\" of the sound by a small, gradually changing period. The flanger effect takes the following parameters:\n* ```time``` _(min: 0, max: 1, defaults to 0.45)_: Changes the small delay time applied to the copied signal.\n* ```speed``` _(min: 0, max: 1, defaults to 0.2)_: Changes the speed at which the flanging occurs.\n* ```depth``` _(min: 0, max: 1, defaults to 0.1)_: Changes the depth/intensity of the swirling effect.\n* ```feedback``` _(min: 0, max: 1, defaults to 0.1)_: Changes the volume of the delayed sound.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\nExample:\n```javascript\nvar flanger = new Pizzicato.Effects.Flanger({\n    time: 0.45,\n    speed: 0.2,\n    depth: 0.1,\n    feedback: 0.1,\n    mix: 0.5\n});\n\nsound.addEffect(flanger);\nsound.play();\n```\n\n<a name=\"compressor\"/>\n\n### Compressor ([example](https://alemangui.github.io/pizzicato/#compressor))\nA compressor allows reducing the range between the loudest and the quietest parts of a sound. This is done by boosting the quiet segments and attenuating the loud ones.\n\nThe following options are available when creating a compressor effect:\n* ```threshold``` _(min: -100, max: 0, defaults to -24)_: The decibel value above which the compression will start taking effect.\n* ```knee``` _(min: 0, max: 40, defaults to 30)_: A value representing the range above the threshold where the curve smoothly transitions to the \"ratio\" portion.\n* ```attack``` _(min: 0, max: 1, defaults to 0.003)_: How soon the compressor starts to compress the dynamics after the threshold is exceeded. Short values will result in a fast response to sudden, loud sounds, but will make the changes in volume more obvious to listeners.\n* ```release``` _(min: 0, max: 1, defaults to 0.025)_: How soon the compressor starts to release the volume level back to normal after the level drops below the threshold. \n* ```ratio``` _(min: 1, max: 20, defaults to 12)_:  The amount of compression applied to the audio once it passes the threshold level. The higher the Ratio the more the loud parts of the audio will be compressed.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\nExample:\n```javascript\nvar compressor = new Pizzicato.Effects.Compressor({\n    threshold: -20,\n    knee: 22,\n    attack: 0.05,\n    release: 0.05,\n    ratio: 18\n});\nsound.addEffect(compressor);\nsound.play();\n```\n\n<a name=\"low-pass-filter\"/>\n\n### Low-pass filter ([example](https://alemangui.github.io/pizzicato/#low-pass-filter))\nA low-pass filter passes signals with a frequency lower than a pre-determined cutoff frequency and attenuates signals with frequencies higher than the cutoff frequency. \n\n* ```frequency``` _(min: 10, max: 22050, defaults to 350)_: The cutoff frequency of the low-pass filter.\n* ```peak``` _(min: 0.0001, max: 1000, defaults to 1)_: Indicates how peaked the frequency is around the cutoff frequency. The greater the value is, the greater is the peak.\n\nExample:\n```javascript\nvar lowPassFilter = new Pizzicato.Effects.LowPassFilter({\n    frequency: 400,\n    peak: 10\n});\n\nsound.addEffect(lowPassFilter);\nsound.play();\n```\n\n<a name=\"high-pass-filter\"/>\n\n### High-pass filter ([example](https://alemangui.github.io/pizzicato/#high-pass-filter))\nA high-pass filter is the opposite of a low-pass filter (described above). It attenuates signals with a frequency lower than a pre-determined cutoff frequency and passes signals with frequencies higher than the cutoff frequency. \n\n* ```frequency``` _(min: 10, max: 22050, defaults to 350)_: The cutoff frequency of the high-pass filter.\n* ```peak``` _(min: 0.0001, max: 1000, defaults to 1)_: Indicates how peaked the frequency is around the cutoff frequency. The greater the value is, the greater is the peak.\n\nExample:\n```javascript\nvar highPassFilter = new Pizzicato.Effects.HighPassFilter({\n    frequency: 120,\n    peak: 10\n});\n\nsound.addEffect(highPassFilter);\nsound.play();\n```\n\n<a name=\"stereo-panner\"/>\n\n### Stereo panner ([example](https://alemangui.github.io/pizzicato/#stereo-panner))\nThe stereo panner is used to adjust the level of a sound through the left and right speakers. A ```-1``` value will channel all the sound through the left speaker, whereas a ```1``` value will do so through the right speaker.\n\n* ```pan``` _(min: -1, max: 1, defaults to 0)_: Pan value between -1 (full left pan) and 1 (full right pan).\n\nExample:\n```javascript\nvar stereoPanner = new Pizzicato.Effects.StereoPanner({\n    pan: 0.5\n});\n\nsound.addEffect(stereoPanner);\nsound.play();\n```\n\n<a name=\"convolver\"/>\n\n### Convolver ([example](https://alemangui.github.io/pizzicato/#convolver))\nThe convolver effect allows the sound to be heard with a certain ressonance or repercussion. This can be useful to simulate certain environments such as auditoriums, concert halls, or small rooms. \n\nIn order to get this acoustic environment, an external audio file must be used as a sound sample. This audio file must contain the desired ambience that will shape the convolution. Due to this file, this effect is asynchronous, so a callback can be provided and will be executed once the effect is ready to be used.\n\nThe [reverb](#reverb) is similar but allows programatic adjustments instead of requiring an external impulse file.\n\n_options object_\n\n* ```impulse``` _(Mandatory; string)_: Path to your impulse file.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\n_callback_\n\n* ```callback``` _(function)_: function executed when the impulse file has been correctly loaded and the effect is ready to be used.\n\nExample:\n```javascript\nvar convolver = new Pizzicato.Effects.Convolver({\n    impulse: './path/to/your/impulse.wav',\n    mix: 0.5\n}, function() {\n    console.log('Convolver ready to be used.');\n});\n\nsound.addEffect(convolver);\nsound.play();\n```\n\n<a name=\"reverb\"/>\n\n### Reverb ([example](https://alemangui.github.io/pizzicato/#reverb))\nThe reverb effect is similar to the convolver effect in that it allows the sound to be heard with a certain ressonance or repercussion. This simulates a particular physical environment in which the sound could be played (e.g., an auditorium, a concert hall, etc).\n\nUnlike the convolver effect, the reverb can be adjusted programatically without the need for any external elements.\n\n* ```time``` _(min: 0.0001, max: 10, defaults to 0.01)_: Duration of impulse, in seconds.\n* ```decay``` _(min: 0, max: 10, defaults to 0.01)_: The rate for the reflections of sound to fade away.\n* ```reverse``` _(boolean)_: Whether or not to reverse the impulse shape.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\nExample:\n```javascript\nvar reverb = new Pizzicato.Effects.Reverb({\n    time: 1,\n    decay: 0.8,\n    reverse: true,\n    mix: 0.5\n});\n\nsound.addEffect(reverb);\nsound.play();\n```\n\n<a name=\"ring-modulator\"/>\n\n### Ring Modulator ([example](https://alemangui.github.io/pizzicato/#ring-modulator))\nThe ring modulator effect combines two input signals, where one of the inputs is a sine wave modulating the other. \n\n[This article from the BBC](http://webaudio.prototyping.bbc.co.uk/ring-modulator/) - from where this effect was based from - goes into deeper detail and explains how to recreate it. The 'ring' in this effect derives from the layout of diode nodes in the original analogue equipment, and also refers to the sound being increasingly modulated as it travels through the ring of diodes. \n\n* ```distortion``` _(min: 0.2, max: 50, defaults to 1)_: Level of distortion applied to the diode nodes.\n* ```speed``` _(min: 0, max: 2000, defaults to 30)_: The frequency of the modulating signal.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\nExample:\n```javascript\nvar ringModulator = new Pizzicato.Effects.RingModulator({\n    speed: 10,\n    distortion: 4,\n    mix: 0.5\n});\n\nsound.addEffect(ringModulator);\nsound.play();\n```\n\n<a name=\"tremolo\"/>\n\n### Tremolo ([example](https://alemangui.github.io/pizzicato/#tremolo))\nThe tremolo effect changes the volume of the sound over time. The outcome would be similar as if you turned the volume node up and down periodically.\n\n* ```speed``` _(min: 0, max: 20, defaults to 4)_: The speed at which the volume will change.\n* ```depth``` _(min: 0, max: 1, defaults to 1)_: The intensity of the volume change.\n* ```mix``` _(min: 0, max: 1, defaults to 0.5)_: Volume balance between the original audio and the effected output.\n\nExample:\n```javascript\nvar tremolo = new Pizzicato.Effects.Tremolo({\n    speed: 5,\n    depth: 1,\n    mix: 0.5\n});\n\nsound.addEffect(tremolo);\nsound.play();\n```\n\n<a name=\"effects-connect\">\n\n### Connecting effects to and from AudioNodes\nIt is possible to connect AudioNodes to effects (and viceversa) by using the ```connect``` method. More details in the [advanced section of this file](#using-graph-effect).\n\n<a name=\"advanced\">\n\n## Advanced\n\n<a name=\"accessing-the-context\">\n\n### Accessing the audio context\nIf needed, the audio context used by Pizzicato is always accessible:\n```javascript\nvar context = Pizzicato.context;\n```\n\n<a name=\"using-graph\">\n\n### Using Pizzicato objects in a web audio graph\nYou can use effects and sounds as part of an existing web audio graph.\n\n<a name=\"using-graph-sound\">\n\n#### Connecting nodes to a Pizzicato.Sound object\nUsing the ```connect``` method, you can connect audio nodes to a Pizzicato.Sound object. For example:\n```javascript\nvar analyser = Pizzicato.context.createAnalyser();\nvar sound = new Pizzicato.Sound();\n\nsound.connect(analyser);\n```\n\n<a name=\"using-graph-sound-detached\">\n\n#### Creating a detached Pizzicato.Sound object\nAll Pizzicato.Sound objects are connected to the context's destination by default. In the example above, the ```sound``` object will be connected to an analyser node and it will also remain connected to the context's destination node.\n\nTo have a Pizzicato.Sound object that is not connected to the context's destination, use the ```detached``` option as follows:\n\n```javascript\nvar analyser = Pizzicato.context.createAnalyser();\nvar sound = new Pizzicato.Sound({ \n    source: 'wave', \n    options: { \n        detached: true \n    } \n});\n\nsound.connect(analyser);\n```\n\n<a name=\"using-graph-effect\">\n\n#### Connecting nodes to effects\nPizzicato effects can also be used in a web audio graph without the need to create Pizzicato.Sound objects by using the ```connect``` method.\n\nAdditionally, the ```connect``` method in an AudioNode can receive a Pizzicato effect as a parameter.\n\n```javascript\nvar oscillator = Pizzicato.context.createOscillator();\nvar distortion = new Pizzicato.Effects.Distortion();\nvar analyser = Pizzicato.context.createAnalyser();\n\noscillator.connect(distortion);\ndistortion.connect(analyser);\n```\n\n<a name=\"general-volume\">\n\n### General volume\nIn order to change the general volume of all Pizzicato sounds, you can directly modify the property ```volume```:\n```javascript\nPizzicato.volume = 0.3;\n```\n\n<a name=\"memory-management\">\n\n### Memory management\n\nWhen creating large numbers of Pizzicato objects you may experience a tipping point after which all sounds in the site are muted. This can vary depending on your browser, operating system and computer running the code.\n\nTo release some of the load, you can call the ```disconnect``` function on the Pizzicato.Sound objects no longer in use. This will disconnect them from the context's destination and they will become orphaned graphs, which will be freed when necessary.\n\n<a name=\"support\"/>\n\n## Support\n\n<a name=\"browsers\"/>\n\n### Browsers\nPizzicato can only work in [browsers with Web Audio support](http://caniuse.com/#feat=audio-api). This means:\n* Firefox 31+\n* Chrome 31+\n* Safari 7+ (input source not available in Safari)\n* Opera 30+\n* Edge 13+\n\n<a name=\"audio-formats\"/>\n\n### Audio formats\nPizzicato supports audio formats [supported by your browser](https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats#Browser_compatibility). These may vary depending on your system version and browser.\n"
  },
  {
    "path": "vipercard/vipercard/external/text-encoding-types-notbundled/index.d.ts",
    "content": "// Type definitions for text-encoding\n// Project: https://github.com/inexorabletash/text-encoding\n// Definitions by: MIZUNE Pine <https://github.com/pine613>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\ndeclare namespace TextEncoding {\n    interface TextDecoderOptions {\n        fatal?: boolean;\n        ignoreBOM?: boolean;\n    }\n\n    interface TextDecodeOptions {\n        stream?: boolean;\n    }\n\n    interface TextEncoderOptions {\n        NONSTANDARD_allowLegacyEncoding?: boolean;\n    }\n\n    interface TextDecoder {\n        encoding: string;\n        fatal: boolean;\n        ignoreBOM: boolean;\n        decode(input?: ArrayBuffer | ArrayBufferView, options?: TextDecodeOptions): string;\n    }\n\n    interface TextEncoder {\n        encoding: string;\n        encode(input?: string, options?: TextEncodeOptions): Uint8Array;\n    }\n\n    interface TextEncodeOptions {\n        stream?: boolean;\n    }\n\n    interface TextEncoderStatic {\n        (utfLabel?: string, options?: TextEncoderOptions): TextEncoder;\n        new (utfLabel?: string, options?: TextEncoderOptions): TextEncoder;\n    }\n\n    interface TextDecoderStatic {\n        (label?: string, options?: TextDecoderOptions): TextDecoder;\n        new (label?: string, options?: TextDecoderOptions): TextDecoder;\n    }\n\n    interface TextEncodingStatic {\n        TextEncoder: TextEncoderStatic;\n        TextDecoder: TextDecoderStatic;\n    }\n}\n\ndeclare var TextDecoder: TextEncoding.TextDecoderStatic;\n\ndeclare var TextEncoder: TextEncoding.TextEncoderStatic;\n\ndeclare var TextEncoding: TextEncoding.TextEncodingStatic;\n\ndeclare module \"text-encoding\" {\n    export = TextEncoding;\n}\n"
  },
  {
    "path": "vipercard/vipercard/external/text-encoding-types-notbundled/license.txt",
    "content": "Definitions by: MIZUNE Pine <https://github.com/pine613>\n\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "vipercard/vipercard/index.html",
    "content": "\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)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n<meta charset=\"utf-8\">\n<title>ViperCard</title>\n<meta name=\"description\" content=\"ViperCard is an open source re-creation and re-imagination of 1987's HyperCard.   You can use it to make animations, games, and interactive art!\">\n<meta name=\"keywords\" content=\"ViperCard is an open source re-creation and re-imagination of 1987's HyperCard.   You can use it to make animations, games, and interactive art!\">\n\n<!-- Twitter Cards -->\n<meta name=\"twitter:title\" content=\"ViperCard\">\n<meta name=\"twitter:site\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:creator\" content=\"@vipercarddotnet\">\n<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"https://www.vipercard.net/resources03a/intro/twittercard.png\">\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"ViperCard\">\n<meta property=\"og:url\" content=\"https://www.vipercard.net\">\n<meta property=\"og:site_name\" content=\"ViperCard\">\n\n<link rel=\"canonical\" href=\"https://www.vipercard.net\">\n\n<meta name=\"HandheldFriendly\" content=\"True\">\n<meta name=\"MobileOptimized\" content=\"320\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n<link rel=\"stylesheet\" href=\"/resources03a/intro/style.css\">\n<meta http-equiv=\"cleartype\" content=\"on\">\n<script>\n\tif (location.protocol != 'https:' && window.location.href.indexOf('vipercard') != -1)\n\t{\n\t\tlocation.href = 'https:' + window.location.href.substring(window.location.protocol.length);\n\t}\n</script>\n</head>\n\n<body id=\"page\">\n\n\n<p style=\"margin-left:1em\"><img border=\"0\" src=\"/resources03a/intro/desc.png\" alt=\"ViperCard is an open source re-creation and re-imagination of 1987's HyperCard.   You can use it to make animations, games, and interactive art!\" /></p>\n<div class=\"navigation-wrapper\">\n\t<nav role=\"navigation\" id=\"site-nav\" class=\"\">\n\t    <ul class=\"mainnav\">\n\t\t    <li>\n\t\t\t<span id=\"spempty\"><a href=\"/0.3/\" ><img border=\"0\" src=\"/resources03a/intro/1btnempty.png\" alt=\"Start ViperCard 0.2\"></a></span>\n\t\t\t<span style=\"display:none\" id=\"spcouldstart\"><a href=\"/0.3/\" ><img border=\"0\" src=\"/resources03a/intro/1btnstart.png\" alt=\"Start ViperCard 0.2\"></a></span>\n\t\t\t<span style=\"display:none\" id=\"spcouldnotstart\"><a href=\"/0.3/\" ><img border=\"0\" src=\"/resources03a/intro/1btnwrongbrowser.png\" alt=\"This browser is not yet supported. Please use Firefox or Chrome, or click here to continue anyway.\"></a></span>\n\t\t\t<span style=\"display:none\" id=\"spcouldnotstartmobile\"><a href=\"/0.3/\" ><img border=\"0\" src=\"/resources03a/intro/1btncouldnotstartmobile.png\" alt=\"This browser is not yet supported. Please use Firefox or Chrome, or click here to continue anyway.\"></a></span>\n\t\t\t<noscript>ViperCard requires JavaScript.</noscript>\n\t\t\t</li>\n\t    </ul>\n\t</nav>\n</div>\n\t\t\t\n<p style=\"margin-left:1em\"><a href=\"/0.3/html/video.html\"><img border=\"0\" src=\"/resources03a/intro/000b.png\"  alt=\"Demo Video\" /></a></p>\n<!-- <p style=\"margin-left:1em\"><a href=\"/0.2/?s=ZGVtb19nbGlkZXI\"><img border=\"0\" src=\"/resources03a/intro/07.png\" alt=\"Play Glider in ViperCard\" /></a></p> -->\n<!-- <p style=\"margin-left:1em\"><a href=\"/0.2/?s=ZGVtb19zcGFjZWdhbWU\"><img border=\"0\" src=\"/resources03a/intro/09.png\" alt=\"Play Spaceman Gamma in ViperCard\" /></a></p> -->\n<p style=\"margin-left:1em\"><a href=\"https://twitter.com/vipercarddotnet\"><img border=\"0\" src=\"/resources03a/intro/02.png\" alt=\"@ViperCardDotNet on Twitter\" /></a></p>\n<p style=\"margin-left:1em\"><a href=\"https://github.com/moltenform/vipercard\"><img border=\"0\" src=\"/resources03a/intro/04.png\" alt=\"Source code on GitHub\" /></a></p>\n<p style=\"margin-left:1em\"><a href=\"https://donorbox.org/vipercard\"><img border=\"0\" src=\"/resources03a/intro/000a.png\" alt=\"Donate\" /></a></p>\n\n<p style=\"margin-left:1em\"><a href=\"https://groups.google.com/forum/#!forum/vipercard\"><img border=\"0\" src=\"/resources03a/intro/03.png\" alt=\"Ask questions or share your  projects on Google Groups here\" /></a></p>\n<p style=\"margin-left:.7em\"><img border=\"0\" src=\"/resources03a/intro/addend.png\" alt=\"    In addition to minor improvements,       When $1000 is raised:            Import HC stacks, visual effects+layers       When $2000 is raised:           Create/edit MIDI music       When $5000 is raised:           Typographic tools, interactive text\" /></p>\n<!-- <p style=\"margin-left:1em\"><img border=\"0\" src=\"/resources03a/intro/08.png\" alt=\"Add your project to this page: see 'Publish to featured' in the File menu.\" /></p> -->\n<p style=\"margin-left:1em\"><a href=\"/0.3/html/why.html\"><img border=\"0\" src=\"/resources03a/intro/05.png\" alt=\"Rationale\" /></a></p>\n<!-- <p style=\"margin-left:1em\"><a href=\"https://crime.team/~hypercard/\"><img border=\"0\" src=\"/resources03a/intro/06.png\" alt=\"This looks cool: HyperCard Zine\" /></a></p> -->\n<!-- <p style=\"margin-left:1em\"><a href=\"/0.3/\"><img border=\"0\" src=\"/resources03a/intro/06vnext.png\" alt=\"See a preview of the next ViperCard\" /></a></p> -->\n<p style=\"margin-left:.7em\"><a href=\"/0.3/html/script_reference/reference_01_overview.html\"><img border=\"0\" src=\"/resources03a/intro/scriptapidocs.png\" alt=\"Script API documentation\" /></a></p>\n<p style=\"margin-left:.7em\"><a href=\"/0.2/\"><img border=\"0\" src=\"/resources03a/intro/06fallback.png\" alt=\"Start Vipercard 0.2 (fewer features, possibly more stable)\" /></a></p>\n<link rel=\"prefetch\" href=\"/resources03a/images/opening.png\" />\n\n<script src=\"/external/bowser-2.9/bowser-2.9-bundled.js\"></script>\n<script src=\"/resources03a/intro/introjs.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "vipercard/vipercard/package.json",
    "content": "{\n  \"name\": \"vipercard\",\n  \"version\": \"0.0.3\",\n  \"description\": \"vipercard\",\n  \"scripts\": {\n    \"prestart\": \"node ./tools/set_tsconfig_flavor.js --development\",\n    \"start\": \"webpack-dev-server --progress --color --mode development --config webpack.config.development.js\",\n    \"prebuild\": \"rimraf ./dist/* && node ./tools/set_tsconfig_flavor.js --production\",\n    \"build\": \"webpack --color --mode production --config webpack.config.production.js\",\n    \"buildstyle\": \"npx sass src/style:static/style\",\n    \"buildstylewatch\": \"npx sass --watch src/style:static/style\",\n    \"autoimportmodules\": \"cd tools/typescript-super-auto-import && main.py\",\n    \"prettierexceptlongimports\": \"cd tools/prettier-except-long-imports && main.py\",\n    \"findmissingcomments\": \"cd tools/prettier-except-long-imports && find_missing_comments.py\",\n    \"addassertmarkers\": \"cd tools/add-assert-markers && main.py\",\n    \"lint\": \"node ./node_modules/eslint/bin/eslint.js -c .eslintrc.js src/**/*.ts\",\n    \"lint-rule-timings\": \"cross-env TIMING=1 node ./node_modules/eslint/bin/eslint.js -c .eslintrc.js src/**/*.ts\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/moltenform/vipercard\"\n  },\n  \"author\": \"Ben Fisher\",\n  \"license\": \"GPL-3.0\",\n  \"devDependencies\": {\n    \"@typescript-eslint/eslint-plugin\": \"^2.26.0\",\n    \"@typescript-eslint/parser\": \"^2.26.0\",\n    \"cross-env\": \"^7.0.2\",\n    \"eslint\": \"^6.8.0\",\n    \"eslint-config-prettier\": \"^6.10.1\",\n    \"eslint-plugin-ban\": \"^1.4.0\",\n    \"eslint-plugin-prettier\": \"^3.1.2\",\n    \"fork-ts-checker-notifier-webpack-plugin\": \"^2.0.0\",\n    \"fork-ts-checker-webpack-plugin\": \"^4.1.2\",\n    \"html-webpack-plugin\": \"^4.0.3\",\n    \"prettier\": \"^2.0.2\",\n    \"rimraf\": \"^3.0.2\",\n    \"sass\": \"^1.26.3\",\n    \"ts-loader\": \"^6.2.2\",\n    \"typescript\": \"^3.8.3\",\n    \"uglifyjs-webpack-plugin\": \"^2.2.0\",\n    \"webpack\": \"^4.42.1\",\n    \"webpack-cli\": \"^3.3.11\",\n    \"webpack-dev-server\": \"^3.11.0\"\n  },\n  \"dependencies\": {\n    \"bowser\": \"^2.9.0\"\n  }\n}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_anim.json",
    "content": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":\"c1d32ea6-8f02-467a-b032-7b6ab15bd41a\",\"elements\":[{\"__isUtil512Serializable\":true,\"type\":7,\"id\":\"921\",\"parent_id\":\"920\",\"insertIndex\":0,\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforelemname\":40,\"increasingnumberforid\":1022,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|SU0XwHNo6Y0ee1GC8Xw1qSg|demo1\"}},{\"__isUtil512Serializable\":true,\"type\":6,\"id\":\"1002\",\"parent_id\":\"921\",\"insertIndex\":1,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"__isUtil512Serializable\":true,\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"insertIndex\":2,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtM0UhAE9FWguICUkH0kuSKclSACyQZcwBUitsBcsLBWx2bcglbWueeSNeTUpmI4wlDWydOwhVPUGRGwhRNXp0LwsLjTtjT41S9Sp/aQ1gYxtVFDxWwyVPdD9T3UTqYLk6vQfyRKA/UyfOGM9VAxsuSLo79URKEHtY6ycMU4g5O2aITX0501aDJw9e2xqEO/s6CxieC38xXTf/XjI+pw/0Kfhxo1cMclhPK3AVOjtZNw5Vddo511XlHd8n6m7xQ3Fybx/ZIphxyxUVI8t0Dyi1Yhl1f2QRWBhZEoAXeLV+H39rKiA9YG5gAmZS4ANpQsACY1yAA4VeMHxvWrADbGTwAjRQUEM9RJBCN3QQRDhcqCI6YmhNimxIQmVgyCOrfwgjoG84Y6x3eGKmZ/hjqXvYYqFrmEMCRSQiNE2kEzp95BIxU0QTPWuEEjdHBBQyd7Rstmr0U7lG1FKzdpRTv14sUrRhrDO6SewysXlMM71VjDK3bQw0uEO8crJzfHO+W1xytWfcc7tPHHOwfyILfFBiCnZo4gt5RMIKc3SCC39cMgp0YrJLekrySnF6Ukt9VpJKd24STHhBqipycWorfllKKnVlyit7TQorcH06a3xTemp2a/preUfaanN3mmt/XyZq9GCmG/pI5hrxeEYb/VSGGvdsBhz4QrZa8nJ2W/5aVlr1ZtZb+04WW/B+Ljv8UW469mnuO/lFzjrzdY47/10+OvRjvnv6S/568Xtee/1Xnnr3bx58WEChBlJwYQdeWEEGVWTBB1tMAQdQfDFHWFKgOCAAIAA=\",\"marked\":false}},{\"__isUtil512Serializable\":true,\"type\":4,\"id\":\"1009\",\"parent_id\":\"1003\",\"insertIndex\":3,\"attrs\":{\"x\":8,\"y\":224,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":291,\"selend\":291,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00021\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"__isUtil512Serializable\":true,\"type\":5,\"id\":\"1004\",\"parent_id\":\"1002\",\"insertIndex\":4,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpIB4mA85a9VQuUM1VVURxQ49ULUE5YM5fFUVVGI1TTWulGI5WlTuYW8sDPTqnKI1enXpgXycx3Xp/RztWQ2pQKD4y43tzP4lcVRsMGQ49cCZ3T7hYUwVUdL0yMzvzdDpB6xbvcrhbwxYVc3tFEyLjang7zRmBC6Q4uzYlPME+YBqBY38x2zdPGkM3EzxiT10yuA4QcjtJIwaaW8w5C1gTOloMR3HgQI5/Sy+Rc9w1Nwg7Op84Q2/xJZ02T0hMEll7fR8LCPgy0n8XKLV+H39gKiADY3JgXGxG4ANpQsACY1yAA8VjMHxvUrADamTwQmZ4UAM0dJBCx0EQRMhVqCIyemgjPlZIIm1oyEM2WQgtMHE4Yz99eDxhRPhDqXfYYqNnmGOreyQib2CkY6pL5BKFSUQjPV+EErdgBBSha7QSrW10TblG1FKzdpRTv14sUrRhrDO6SewysXlMM71VjDK3bQw0uEO8crJzfHO+W1xytWfcc7tPHHOwfyILfFBiCnZo4gt5RMIKc3SCC39cMgp0YrJLekrySnF6Ukt9VpJKd24STHhBqipycWorfllKKnVlyit7TQorcH06a3xTemp2a/preUfaanN3mmt/XyZq9GCmG/pI5hrxeEYb/VSGGvdsBhz4QrZa8nJ2W/5aVlr1ZtZb+04WW/B+Ljv8UW469mnuO/lFzjrzdY47/10+OvRjvnv6S/568Xtee/1Xnnr3bx58WEChBlJwYQdeWEEGVWTBB1tMAQdQfDFHXFJxRiRFIAAgAA==\",\"marked\":false}},{\"__isUtil512Serializable\":true,\"type\":4,\"id\":\"1013\",\"parent_id\":\"1004\",\"insertIndex\":5,\"attrs\":{\"x\":8,\"y\":221,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":209,\"selend\":209,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00022\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"__isUtil512Serializable\":true,\"type\":5,\"id\":\"1005\",\"parent_id\":\"1002\",\"insertIndex\":6,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXeYSAwbRloM4ke7XyFaxZfYBuIe4kTdlp7ZydfjRt7GAtWPQ1fGDhQ0TqJH1RQXVsfMTpWDUIBQT8aekYQObkCcycyELg5CWcdRbgm82d2R3w4M3PuEnsgQyYKUXoxE3O8TDk1cEbwevtY+0VaZMw0onYZY1o0k0afHQY/m3bxUQ1RPFYLabw5gC/sXid3rA6Ma457nQ8aNnsOA2oUVtx0Fw/+fdsBq0kNbV19ZzYFZ2Z9pF8JZDt9318EZx1z/xAlJ9N9MgirAgUaH143EPgcxy8/XQUgGAQ0IDJDOgoCRAEi8kM9OoJCNy7CQjgBQiIyMeIiPhliIjUWMiI7JSIjMD0cZDwTnGM2K9xjOQdcYzM3R2I/H3xjtCC8E7oIPBOxOAwUvRSME7cszBO4AkxTwjP0U7lG1FKzdpRTv14sUrRhrDO6SewysXlMM71VjDK3bQw0uEO8crJzfHO+W1xytWfcc7tPHHOwfyILfFBiCnZo4gt5RMIKc3SCC39cMgp0YrJLekrySnF6Ukt9VpJKd24STHhBqipycWorfllKKnVlyit7TQorcH06a3xTemp2a/preUfaanN3mmt/XyZq9GCmG/pI5hrxeEYb/VSGGvdsBhz4QrZa8nJ2W/5aVlr1ZtZb+04WW/B+Ljv8UW469mnuO/lFzjrzdY47/10+OvRjvnv6S/568Xtee/1Xnnr3bx58WEChBlJwYQdeWEEGVWTBB1tMAQdQfDFHXFJxRlJqoCAgACAA\",\"marked\":false}},{\"__isUtil512Serializable\":true,\"type\":4,\"id\":\"1015\",\"parent_id\":\"1005\",\"insertIndex\":7,\"attrs\":{\"x\":7,\"y\":224,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":208,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00023\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"__isUtil512Serializable\":true,\"type\":5,\"id\":\"1006\",\"parent_id\":\"1002\",\"insertIndex\":8,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXeYSAwbRlxM3NUzRplc3ZQzVt9W4lfPVvTXA1T0juJdwta3TtuXwkuI3qwLKg27nv0MI0cgwC0Z5IyQwZZKL9cMzy8TSIz02fkWLsRjUzvVL5VQAfuGCg/5hYQC30LC1dFEL438TfgJHxvOzYLOfg1y1PHBno/HRj9Ml0QSxT4EqV0uXYICqA3JTb8BfojVyYDE009oi/6Od4MlytJD1szcyb+bf9ezTgNWfx0h26RX4RyL1f9S99+Yx4TUIFWu3YANw8DPAifHCIKBH4BHE99NwDbAg4UcAM6JGsRiB7wA4B3PXw0EnAgIXezDYgZkEMtfWg9b3JIQmVIyCNrUAgjYEA4Y6xfeGKmT/hjrlfYIml0mGMPTiR0NF+kE29k5GKhc0QTrWOEEq99BDa8UnRStmr0U7lG1FKzdpRTv14sUrRhrDO6SewysXlMM71VjDK3bQw0uEO8crJzfHO+W1xytWfcc7tPHHOwfyILfFBiCnZo4gt5RMIKc3SCC39cMgp0YrJLekrySnF6Ukt9VpJKd24STHhBqipycWorfllKKnVlyit7TQorcH06a3xTemp2a/preUfaanN3mmt/XyZq9GCmG/pI5hrxeEYb/VSGGvdsBhz4QrZa8nJ2W/5aVlr1ZtZb+04WW/B+Ljv8UW469mnuO/lFzjrzdY47/10+OvRjvnv6S/568Xtee/1Xnnr3bx58WEChBlJwYQdeWEEGVWTBB1tMAQdQfDFHJGUgACAA\",\"marked\":false}},{\"__isUtil512Serializable\":true,\"type\":4,\"id\":\"1017\",\"parent_id\":\"1006\",\"insertIndex\":9,\"attrs\":{\"x\":7,\"y\":222,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":207,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00024\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"__isUtil512Serializable\":true,\"type\":5,\"id\":\"1008\",\"parent_id\":\"1002\",\"insertIndex\":10,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXeYSAwbRlxM3NUzRplc3ZQzVt9W4lfPVvTXA1T0juJdwta3TtuXwkuI3qwLD0yHQjmcDom8kcMGbc6M0ayZLw8oyR6Y7Uy0yauOLk7E0b0An4kQhb5UjA2S1emEH0zy0UAe/ooHDgLFwc8WzY3b/w9C3n1Pjw5iw/oYTV053dEF1p1hzjjWVhPDC8SAgJ49y4ma9x511kZHt9HbG/xQ4F8bx9dQ55Rj179W5h/Pz8TKB1z/z7ndxp6338PIB94IH40YKADOkjgAjF4QAM9VIACN2wABDhCsEIycnBDPlpQQjVm0EM7ThBDMH4oIzxRaCI2aegjOUXIIjN1iCM/XTgiNGO4YzpL+GIxe1hjPVeYYjdvGGS4QKQSsnBkE75YRBK1ZMQTu0wEE7B8NFO8UnRStmr0U7lG1FKzdpRTv14sUrRhrDO6SewysXlMM71VjDK3bQw0uEO8crJzfHO+W1xytWfcc7tPHHOwfyILfFBiCnZo4gt5RMIKc3SCC39cMgp0YrJLekrySnF6Ukt9VpJKd24STHhBqipycWor5F8gACAA\",\"marked\":false}},{\"__isUtil512Serializable\":true,\"type\":4,\"id\":\"1019\",\"parent_id\":\"1008\",\"insertIndex\":11,\"attrs\":{\"x\":8,\"y\":223,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":207,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00025\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_game.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002060\",\"uuid\":\"e39fc80b-e84d-4b8b-bede-87a68c75949e\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforelemname\":40,\"increasingnumberforid\":1759,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|SU0XwHNo6Y0ee1GC8Xw1qSg|demo2\"}},{\"type\":6,\"id\":\"1002\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"on afterKeyDown\\n\\t-- get the x,y coordinates\\n\\tput the left of cd btn \\\"mr_fish\\\" into x\\n\\tput the top of cd btn \\\"mr_fish\\\" into y\\n\\t\\n\\t-- change x and y depending on which key was pressed\\n\\tif keychar() is \\\"ArrowLeft\\\" then\\n\\t\\tsubtract 10 from x\\n\\telse if keychar() is \\\"ArrowRight\\\" then\\n\\t\\tadd 10 to x\\n\\telse if keychar() is \\\"ArrowUp\\\" then\\n\\t\\tsubtract 10 from y\\n\\telse if keychar() is \\\"ArrowDown\\\" then\\n\\t\\tadd 10 to y\\n\\telse\\n\\t\\texit afterKeyDown\\n\\tend if\\n\\t\\n\\t-- if you're holding down a key, don't keep moving\\n\\tif keyrepeated() then\\n\\t\\texit afterKeyDown\\n\\tend if\\n\\t\\n\\tset the left of cd btn \\\"mr_fish\\\" to x\\n\\tset the top of cd btn \\\"mr_fish\\\" to y\\n\\t\\n\\t-- check if you have won\\n\\tif isWithinPlanet(the loc of cd btn \\\"mr_fish\\\") then\\n\\t\\tshow cd fld \\\"win\\\"\\n\\telse\\n\\t\\thide cd fld \\\"win\\\"\\n\\tend if\\nend afterKeyDown\\n\\nfunction isWithinPlanet coords\\n\\t-- returns true if the fish is at the planet\\n\\tput item 1 of coords into centerx\\n\\tput item 2 of coords into centery\\n\\treturn centerx > the left of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcenterx < the right of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcentery > the top of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcentery < the bottom of cd btn \\\"planet\\\"\\nend isWithinPlanet\\n\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"1004\",\"parent_id\":\"1003\",\"attrs\":{\"x\":363,\"y\":163,\"w\":64,\"h\":63,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":true,\"style\":4,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\t\\nend mouseUp\",\"name\":\"planet\"}},{\"type\":3,\"id\":\"1009\",\"parent_id\":\"1003\",\"attrs\":{\"x\":141,\"y\":167,\"w\":45,\"h\":48,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":22,\"showlabel\":true,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\t\\nend mouseUp\",\"name\":\"mr_fish\"}},{\"type\":4,\"id\":\"1017\",\"parent_id\":\"1003\",\"attrs\":{\"x\":198,\"y\":212,\"w\":305,\"h\":39,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":8,\"selend\":8,\"scroll\":0,\"style\":4,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"win\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":24,\"defaulttextstyle\":8,\"ftxt\":\"\\u0002geneva_24_biu+osdce\\u0002Victory!\"}},{\"type\":4,\"id\":\"1020\",\"parent_id\":\"1003\",\"attrs\":{\"x\":8,\"y\":4,\"w\":465,\"h\":94,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":51,\"selend\":51,\"scroll\":0,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 17\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_18_biuosdce\\u0002Click the Browse tool (looks like a hand)\\nthen type arrow keys (up down left right)\\nto move Mr. Fish so that he can return to\\nhis home planet.\"}},{\"type\":4,\"id\":\"1022\",\"parent_id\":\"1003\",\"attrs\":{\"x\":5,\"y\":286,\"w\":353,\"h\":58,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":31,\"selend\":31,\"scroll\":1,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 19\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002See and change the source code:\\nFrom Objects menu, click Card Info...\\nThen click the Script button in the lower right corner.\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_glider.json",
    "content": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":\"4b79262b-98c6-4844-9fe5-a8b7da8778e4\",\"elements\":[{\"type\":7,\"id\":\"921\",\"parent_id\":\"920\",\"insertIndex\":0,\"attrs\":{\"script\":\"\\n-- https://github.com/moltenform/glider_4\\n\\n-- when editing the game, it might be useful\\n-- to know that you can press Shift+N and click\\n-- Start Over to reset the game.\\n\\n-- script of stack:\\n\\nfunction rectIntersect x0, x1, y0, y1, \\\\\\n\\tboxX0, boxX1, boxY0, boxY1\\n\\t\\n\\tif (x0 >= boxX1 or y0 >= boxY1)  then\\n\\t\\t-- it's way outside on the right or bottom\\n\\t\\treturn 0 -- no overlap\\n\\telse if (x1 < boxX0 or y1 < boxY0)  then\\n\\t\\t-- it's way outside on the left or top\\n\\t\\treturn 0 -- no overlap\\n\\telse if (x0 >= boxX0 and x1 <= boxX1 and \\\\\\n\\t\\ty0 >= boxY0 and y1 <= boxY1)  then\\n\\t\\treturn 1 -- completely covers\\n\\telse if (boxX0 >= x0 and boxX1 <= x1 and \\\\\\n\\t\\tboxY0 >= y0 and boxY1 <= y1)  then\\n\\t\\treturn 2 -- completely within\\n\\telse\\n\\t\\treturn 3 -- partial overlap\\n\\tend if\\nend rectIntersect\\n\\nfunction getCollideResult objTypeName, isOn, \\\\\\n\\tamount, extra\\n\\tput \\\"\\\" into resultPt1\\n\\tput \\\"\\\" into resultPt2\\n\\tput \\\"/\\\" & objTypeName & \\\"/\\\" into objTypeNameTest\\n\\tif objTypeNameTest is in \\\\\\n\\t\\t\\\"/table/shelf/books/cabnet/obsRct/drip/toastr/ball/fshBwl/basket/macTsh/\\\" then\\n\\t\\tput \\\"crashIt\\\" into resultPt1\\n\\t\\treturn resultPt1 & \\\"|\\\" & resultPt2\\n\\tend if\\n\\t\\n\\tif objTypeName is \\\"extRct\\\" then\\n\\t\\tput \\\"moveIt\\\" into resultPt1\\n\\t\\tput amount into resultPt2\\n\\telse if objTypeName is \\\"flrVnt\\\" then\\n\\t\\tput \\\"liftIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"celVnt\\\" then\\n\\t\\tput \\\"dropIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"celDct\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"dropIt\\\" into resultPt1\\n\\t\\telse\\n\\t\\t\\tput \\\"moveIt\\\" into resultPt1\\n\\t\\t\\tput extra into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"candle\\\" then\\n\\t\\tput \\\"burnIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"lftFan\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"turnItLeft\\\" into resultPt1\\n\\t\\telse\\n\\t\\t\\tput \\\"ignoreIt\\\" into resultPt1\\n\\t\\tend if\\n\\telse if objTypeName is \\\"ritFan\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"turnItRight\\\" into resultPt1\\n\\t\\telse\\n\\t\\t\\tput \\\"ignoreIt\\\" into resultPt1\\n\\t\\tend if\\n\\telse if objTypeName is \\\"clock\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tplay \\\"glider_1_Clock\\\"\\n\\t\\t\\tput \\\"getitem_awardIt\\\" into resultPt1\\n\\t\\t\\tput amount into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"paper\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tplay \\\"glider_1_Extra\\\"\\n\\t\\t\\tput \\\"getitem_extraIt\\\" into resultPt1\\n\\t\\t\\tput amount into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"grease\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"spillIt\\\" into resultPt1\\n\\t\\telse\\n\\t\\t\\tput \\\"slideIt\\\" into resultPt1\\n\\t\\tend if\\n\\telse if objTypeName is \\\"bnsRct\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"trickIt\\\" into resultPt1\\n\\t\\t\\tput amount into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"battry\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tplay \\\"glider_1_Energize\\\"\\n\\t\\t\\tput \\\"getitem_energizeIt\\\" into resultPt1\\n\\t\\t\\tput amount into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"rbrBnd\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tplay \\\"glider_1_GetBand\\\"\\n\\t\\t\\tput \\\"getitem_bandIt\\\" into resultPt1\\n\\t\\t\\tput amount into resultPt2\\n\\t\\tend if\\n\\telse if objTypeName is \\\"litSwt\\\" then\\n\\t\\tput \\\"lightIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"outlet\\\" then\\n\\t\\tplay \\\"glider_1_Zap\\\"\\n\\t\\tput \\\"zapIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"thermo\\\" then\\n\\t\\tput \\\"airOnIt\\\" into resultPt1\\n\\telse if objTypeName is \\\"shredr\\\" then\\n\\t\\tif isOn is 1 then\\n\\t\\t\\tput \\\"shredIt\\\" into resultPt1\\n\\t\\telse\\n\\t\\t\\tput \\\"ignoreIt\\\" into resultPt1\\n\\t\\tend if\\n\\telse if objTypeName is \\\"pwrSwt\\\" then\\n\\t\\tput \\\"toggleIt\\\" into resultPt1\\n\\t\\tput amount into resultPt2 \\n\\t\\t-- {object# linked to}\\n\\telse if objTypeName is \\\"guitar\\\" then\\n\\t\\tplay \\\"glider_1_Guitar\\\" \\n\\t\\tput \\\"playIt\\\" into resultPt1\\n\\t\\tput \\\"0\\\" into resultPt2\\n\\telse if objTypeName is \\\"upStar\\\" then\\n\\t\\tput \\\"ascendIt\\\" into resultPt1\\n\\t\\tput amount into resultPt2\\n\\t\\t-- {room # linked to}\\n\\telse if objTypeName is \\\"dnStar\\\" then\\n\\t\\tput \\\"descendIt\\\" into resultPt1\\n\\t\\tput amount into resultPt2\\n\\t\\t-- {room # linked to}\\n\\telse\\n\\t\\tput \\\"ignoreIt\\\" into resultPt1\\n\\tend if\\n\\treturn resultPt1 & \\\"|\\\" & resultPt2\\nend getCollideResult\\n\\non initSpriteConstantsAndGameData\\n\\tglobal spriteShadoRght, spritesShadoLft\\n\\tglobal spritesRightForward, spritesRightTipped\\n\\tglobal spritesLeftForward, spritesLeftTipped\\n\\tglobal spritesTurnEndpoint, spritesRightForward2\\n\\tglobal spritesRightTipped2, spritesLeftForward2\\n\\tglobal spritesLeftTipped2, spritesTurnEndpoint2\\n\\tglobal spritesBurnRght1, spritesBurnRght2\\n\\tglobal spritesBurnLft1, spritesBurnLft2\\n\\tglobal spritesAllDeadRght, spritesAllDeadLft\\n\\tglobal spritesCelVnt, spritesCelDct\\n\\tglobal spritesFlrVnt, spritesPaper\\n\\tglobal spritesToastr, spritesToast1\\n\\tglobal spritesToast2, spritesToast3\\n\\tglobal spritesToast4, spritesToast5\\n\\tglobal spritesToast6, spritesTeaKtl\\n\\tglobal spritesLftFan, spritesRitFan\\n\\tglobal spritesTable, spritesShredr\\n\\tglobal spritesBooks, spritesClock\\n\\tglobal spritesCandle, spritesRbrBnd\\n\\tglobal spritesBall, spritesFshBwl\\n\\tglobal spritesFish1, spritesFish2\\n\\tglobal spritesFish3, spritesFish4\\n\\tglobal spritesGrease, spritesGreaseFall1\\n\\tglobal spritesGreaseFall2, spritesLitSwt\\n\\tglobal spritesThermo, spritesOutlet\\n\\tglobal spritesOutletSpark1, spritesOutletSpark2\\n\\tglobal spritesPwrSwt, spritesGuitar\\n\\tglobal spritesDrip, spritesShelf\\n\\tglobal spritesBasket, spritesPaintg\\n\\tglobal spritesBattry, spritesMacTsh\\n\\tglobal spritesUpStar, spritesDnStar\\n\\tglobal spritesCandleFlame1, spritesCandleFlame2\\n\\tglobal spritesCandleFlame3, spritesDrop1\\n\\tglobal spritesDrop2, spritesDrop3\\n\\tglobal spritesDrop4, spritesDrop5\\n\\t\\n\\tput 2 into spriteShadoRght\\n\\tput 3 into spritesShadoLft\\n\\tput 4 into spritesRightForward\\n\\tput 5 into spritesRightTipped\\n\\tput 6 into spritesLeftForward\\n\\tput 7 into spritesLeftTipped\\n\\tput 8 into spritesTurnEndpoint\\n\\tput 9 into spritesRightForward2\\n\\tput 10 into spritesRightTipped2\\n\\tput 11 into spritesLeftForward2\\n\\tput 12 into spritesLeftTipped2\\n\\tput 13 into spritesTurnEndpoint2\\n\\tput 14 into spritesBurnRght1\\n\\tput 15 into spritesBurnRght2\\n\\tput 16 into spritesBurnLft1\\n\\tput 17 into spritesBurnLft2\\n\\tput 18 into spritesAllDeadRght\\n\\tput 19 into spritesAllDeadLft\\n\\tput 20 into spritesCelVnt\\n\\tput 21 into spritesCelDct\\n\\tput 22 into spritesFlrVnt\\n\\tput 23 into spritesPaper\\n\\tput 24 into spritesToastr\\n\\tput 25 into spritesToast1\\n\\tput 26 into spritesToast2\\n\\tput 27 into spritesToast3\\n\\tput 28 into spritesToast4\\n\\tput 29 into spritesToast5\\n\\tput 30 into spritesToast6\\n\\tput 31 into spritesTeaKtl\\n\\tput 32 into spritesLftFan\\n\\tput 33 into spritesRitFan\\n\\tput 34 into spritesTable\\n\\tput 35 into spritesShredr\\n\\tput 36 into spritesBooks\\n\\tput 37 into spritesClock\\n\\tput 38 into spritesCandle\\n\\tput 39 into spritesRbrBnd\\n\\tput 40 into spritesBall\\n\\tput 41 into spritesFshBwl\\n\\tput 42 into spritesFish1\\n\\tput 43 into spritesFish2\\n\\tput 44 into spritesFish3\\n\\tput 45 into spritesFish4\\n\\tput 46 into spritesGrease\\n\\tput 47 into spritesGreaseFall1\\n\\tput 48 into spritesGreaseFall2\\n\\tput 49 into spritesLitSwt\\n\\tput 50 into spritesThermo\\n\\tput 51 into spritesOutlet\\n\\tput 52 into spritesOutletSpark1\\n\\tput 53 into spritesOutletSpark2\\n\\tput 54 into spritesPwrSwt\\n\\tput 55 into spritesGuitar\\n\\tput 56 into spritesDrip\\n\\tput 57 into spritesShelf\\n\\tput 58 into spritesBasket\\n\\tput 59 into spritesPaintg\\n\\tput 60 into spritesBattry\\n\\tput 61 into spritesMacTsh\\n\\tput 62 into spritesUpStar\\n\\tput 63 into spritesDnStar\\n\\tput 64 into spritesCandleFlame1\\n\\tput 65 into spritesCandleFlame2\\n\\tput 66 into spritesCandleFlame3\\n\\tput 67 into spritesDrop1\\n\\tput 68 into spritesDrop2\\n\\tput 69 into spritesDrop3\\n\\tput 70 into spritesDrop4\\n\\tput 71 into spritesDrop5\\n\\t\\n\\t-- not yet supported\\n\\tglobal spritesVentPatternX, spritesVentPatternY\\n\\tput 73 into spritesVentPatternX \\n\\tput 72 into spritesVentPatternY\\n\\t\\n\\tglobal lvlData, lvlObjects\\n\\tput \\\"Welcome...|5|0|1|0|0|0|0\\\" into line 1 of lvlData\\n\\tput \\\"Top of the reading list|7|1|1|0|0|0|0\\\" into line 2 of lvlData\\n\\tput \\\"Under Me!|5|1|1|0|0|0|0\\\" into line 3 of lvlData\\n\\tput \\\"Looking at you...|6|1|1|0|0|0|0\\\" into line 4 of lvlData\\n\\tput \\\"You're invited...|6|1|1|2|1|1|0\\\" into line 5 of lvlData\\n\\tput \\\"Jane be nimble...|5|1|1|1|1|1|0\\\" into line 6 of lvlData\\n\\tput \\\"Hmm... a tall cabinet|7|1|1|0|0|0|0\\\" into line 7 of lvlData\\n\\tput \\\"Timing is the key...|9|1|1|0|0|0|0\\\" into line 8 of lvlData\\n\\tput \\\"More enemies...|8|1|1|0|1|2|0\\\" into line 9 of lvlData\\n\\tput \\\"Up a Down Staircase|4|1|1|1|1|1|0\\\" into line 10 of lvlData\\n\\tput \\\"Still on this floor...|9|1|1|0|0|0|2\\\" into line 11 of lvlData\\n\\tput \\\"Deeper still...|3|1|0|1|2|0|0\\\" into line 12 of lvlData\\n\\tput \\\"What, a bombshelter?|11|0|1|0|0|0|0\\\" into line 13 of lvlData\\n\\tput \\\"Power station...|7|1|1|1|1|0|2\\\" into line 14 of lvlData\\n\\tput \\\"This is the basement|6|1|1|0|0|0|0\\\" into line 15 of lvlData\\n\\tput \\\"Nothing here...|4|1|1|0|0|0|2\\\" into line 16 of lvlData\\n\\tput \\\"The Looking Glass|3|1|0|0|0|0|0\\\" into line 17 of lvlData\\n\\tput \\\"Welcome, 2nd Floor|7|0|1|0|0|0|0\\\" into line 18 of lvlData\\n\\tput \\\"Zis Room|11|1|1|0|0|0|0\\\" into line 19 of lvlData\\n\\tput \\\"This Old House...|6|1|1|0|0|0|0\\\" into line 20 of lvlData\\n\\tput \\\"The North Room|9|1|1|0|0|0|0\\\" into line 21 of lvlData\\n\\tput \\\"Windtunnels|8|1|1|0|0|0|0\\\" into line 22 of lvlData\\n\\tput \\\"Noisy Kids!|5|1|1|0|0|0|0\\\" into line 23 of lvlData\\n\\tput \\\"LeadFish|8|1|1|0|0|0|0\\\" into line 24 of lvlData\\n\\tput \\\"Air Steps|7|1|1|0|0|0|0\\\" into line 25 of lvlData\\n\\tput \\\"Fan Fun!|9|1|1|0|0|0|0\\\" into line 26 of lvlData\\n\\tput \\\"Stormy Weather...|10|1|1|0|0|0|2\\\" into line 27 of lvlData\\n\\tput \\\"Slippery when greasy...|7|1|1|0|0|0|0\\\" into line 28 of lvlData\\n\\tput \\\"Turn me on...|6|1|1|0|0|0|1\\\" into line 29 of lvlData\\n\\tput \\\"Finally!!!|6|1|1|0|0|0|0\\\" into line 30 of lvlData\\n\\tput \\\"Tempted...|7|1|1|0|0|0|0\\\" into line 31 of lvlData\\n\\tput \\\"Look Familiar?|6|1|0|0|0|0|0\\\" into line 32 of lvlData\\n\\tput \\\"You found me!|7|0|1|0|0|0|0\\\" into line 33 of lvlData\\n\\tput \\\"Welcome to Floor 3|6|1|1|1|2|1|0\\\" into line 34 of lvlData\\n\\tput \\\"A toaster?  Here?|8|1|1|0|0|0|0\\\" into line 35 of lvlData\\n\\tput \\\"The galley...|6|1|1|0|1|0|0\\\" into line 36 of lvlData\\n\\tput \\\"Wow - High Shelf!|10|1|1|0|0|0|0\\\" into line 37 of lvlData\\n\\tput \\\"Love these Candles...|10|1|1|0|0|0|0\\\" into line 38 of lvlData\\n\\tput \\\"Windy Room...|10|1|1|2|2|0|0\\\" into line 39 of lvlData\\n\\tput \\\"Monty Hall|11|1|0|0|0|0|0\\\" into line 40 of lvlData\\n\\tput \\\"\\\" into line 1 of lvlObjects\\n\\tput \\\"flrVnt|8|69|325|117|338|44|0|0|table|1|186|223|356|232|0|0|0|flrVnt|8|421|325|469|338|44|0|0|macTsh|\\\" after line 1 of lvlObjects\\n\\tput \\\"43|186|165|231|223|0|0|0|clock|16|322|194|354|223|500|0|0\\\" after line 1 of lvlObjects\\n\\tput \\\"\\\" into line 2 of lvlObjects\\n\\tput \\\"flrVnt|8|60|325|108|338|44|0|0|shelf|2|181|112|368|119|0|0|0|books|3|183|58|247|113|0|0|0|flrVnt|8|3\\\" after line 2 of lvlObjects\\n\\tput \\\"94|325|442|338|44|0|0|clock|16|336|84|368|113|600|0|0|books|3|245|58|309|113|0|0|0|paintg|40|45|80|1\\\" after line 2 of lvlObjects\\n\\tput \\\"47|173|0|0|0\\\" after line 2 of lvlObjects\\n\\tput \\\"\\\" into line 3 of lvlObjects\\n\\tput \\\"flrVnt|8|53|325|101|338|44|0|0|table|1|209|178|408|187|0|0|0|flrVnt|8|345|325|393|338|208|0|0|flrVnt\\\" after line 3 of lvlObjects\\n\\tput \\\"|8|453|325|501|338|44|0|0|clock|16|211|149|243|178|700|0|0\\\" after line 3 of lvlObjects\\n\\tput \\\"\\\" into line 4 of lvlObjects\\n\\tput \\\"flrVnt|8|47|325|95|338|44|0|0|cabnet|4|121|220|312|318|0|0|0|flrVnt|8|337|325|385|338|44|0|0|shelf|2\\\" after line 4 of lvlObjects\\n\\tput \\\"|206|87|306|94|0|0|0|battry|20|291|63|309|89|50|0|0|mirror|41|13|61|182|207|0|0|0\\\" after line 4 of lvlObjects\\n\\tput \\\"\\\" into line 5 of lvlObjects\\n\\tput \\\"flrVnt|8|45|325|93|338|44|0|0|table|1|159|218|325|227|0|0|0|flrVnt|8|423|325|471|338|44|0|0|clock|16\\\" after line 5 of lvlObjects\\n\\tput \\\"|157|189|189|218|800|0|0|cabnet|4|260|37|383|103|0|0|0|window|37|20|73|141|224|0|0|0\\\" after line 5 of lvlObjects\\n\\tput \\\"\\\" into line 6 of lvlObjects\\n\\tput \\\"flrVnt|8|38|325|86|338|44|0|0|table|1|104|224|384|233|0|0|0|candle|11|215|203|247|224|57|0|0|flrVnt|\\\" after line 6 of lvlObjects\\n\\tput \\\"8|434|325|482|338|44|0|0|books|3|264|170|328|225|0|0|0\\\" after line 6 of lvlObjects\\n\\tput \\\"\\\" into line 7 of lvlObjects\\n\\tput \\\"flrVnt|8|58|325|106|338|44|0|0|celDct|10|37|24|85|37|57|7|0|celDct|10|388|24|436|37|109|7|1|cabnet|4\\\" after line 7 of lvlObjects\\n\\tput \\\"|167|120|357|318|0|0|0|flrVnt|8|446|325|494|338|44|0|0|paper|17|291|99|339|120|1500|0|0|bnsRct|19|25\\\" after line 7 of lvlObjects\\n\\tput \\\"6|88|288|120|1500|0|0\\\" after line 7 of lvlObjects\\n\\tput \\\"\\\" into line 8 of lvlObjects\\n\\tput \\\"table|1|154|237|284|246|0|0|0|shelf|2|268|144|418|151|0|0|0|clock|16|270|116|302|145|1000|0|0|outlet\\\" after line 8 of lvlObjects\\n\\tput \\\"|25|255|191|287|216|300|0|0|flrVnt|8|84|325|132|338|44|0|0|flrVnt|8|446|325|494|338|44|0|0|books|3|3\\\" after line 8 of lvlObjects\\n\\tput \\\"52|91|416|146|0|0|0|guitar|29|296|153|360|323|0|0|0|bnsRct|19|353|57|417|89|1000|0|0\\\" after line 8 of lvlObjects\\n\\tput \\\"\\\" into line 9 of lvlObjects\\n\\tput \\\"celVnt|9|191|24|239|36|193|0|0|flrVnt|8|56|325|104|338|44|0|0|flrVnt|8|382|325|430|338|44|0|0|books|\\\" after line 9 of lvlObjects\\n\\tput \\\"3|111|141|175|196|0|0|0|cabnet|4|251|263|351|323|0|0|0|cabnet|4|114|194|250|325|0|0|0|bnsRct|19|376|\\\" after line 9 of lvlObjects\\n\\tput \\\"35|440|67|1000|0|0|clock|16|219|165|251|194|1000|0|0\\\" after line 9 of lvlObjects\\n\\tput \\\"\\\" into line 10 of lvlObjects\\n\\tput \\\"upStar|44|224|54|385|308|18|0|0|flrVnt|8|31|325|79|338|44|0|0|flrVnt|8|275|325|323|338|44|0|0|table|\\\" after line 10 of lvlObjects\\n\\tput \\\"1|108|228|219|237|0|0|0\\\" after line 10 of lvlObjects\\n\\tput \\\"\\\" into line 11 of lvlObjects\\n\\tput \\\"shelf|2|93|140|195|147|0|0|0|shelf|2|303|129|488|136|0|0|0|books|3|333|76|397|131|0|0|0|flrVnt|8|20|\\\" after line 11 of lvlObjects\\n\\tput \\\"325|68|338|44|0|0|flrVnt|8|412|325|460|338|161|0|0|clock|16|206|149|238|178|2000|0|0|table|1|138|221\\\" after line 11 of lvlObjects\\n\\tput \\\"|267|230|0|0|0|litSwt|24|119|97|137|123|0|0|0|paper|17|439|109|487|130|2000|0|0\\\" after line 11 of lvlObjects\\n\\tput \\\"\\\" into line 12 of lvlObjects\\n\\tput \\\"dnStar|45|149|54|310|308|15|0|0|flrVnt|8|24|325|72|338|44|0|0|paintg|40|26|69|128|162|0|0|0\\\" after line 12 of lvlObjects\\n\\tput \\\"\\\" into line 13 of lvlObjects\\n\\tput \\\"cabnet|4|34|216|96|325|0|0|0|ritFan|13|51|163|86|217|157|0|1|flrVnt|8|127|325|175|338|44|0|0|cabnet|\\\" after line 13 of lvlObjects\\n\\tput \\\"4|174|264|481|328|0|0|0|grease|18|171|236|203|265|478|0|1|clock|16|431|236|463|265|3000|0|0|paper|17\\\" after line 13 of lvlObjects\\n\\tput \\\"|381|244|429|265|2000|0|0|battry|20|359|240|377|266|80|0|0|rbrBnd|21|321|242|353|265|4|0|0|clock|16|\\\" after line 13 of lvlObjects\\n\\tput \\\"289|236|321|265|1000|0|0|battry|20|271|240|289|266|40|0|0\\\" after line 13 of lvlObjects\\n\\tput \\\"\\\" into line 14 of lvlObjects\\n\\tput \\\"outlet|25|220|139|252|164|80|0|0|litSwt|24|293|139|311|165|0|0|0|flrVnt|8|50|325|98|338|44|0|0|outle\\\" after line 14 of lvlObjects\\n\\tput \\\"t|25|352|141|384|166|120|0|0|celDct|10|46|24|94|37|98|14|0|flrVnt|8|435|325|483|338|44|0|0|celDct|10\\\" after line 14 of lvlObjects\\n\\tput \\\"|398|24|446|37|141|14|1\\\" after line 14 of lvlObjects\\n\\tput \\\"\\\" into line 15 of lvlObjects\\n\\tput \\\"upStar|44|155|54|316|308|12|0|0|table|1|25|263|150|272|0|0|0|candle|11|111|243|143|264|44|0|0|flrVnt\\\" after line 15 of lvlObjects\\n\\tput \\\"|8|421|325|469|338|44|0|0|shelf|2|332|167|413|174|0|0|0|lftFan|12|371|113|406|168|140|0|1\\\" after line 15 of lvlObjects\\n\\tput \\\"\\\" into line 16 of lvlObjects\\n\\tput \\\"litSwt|24|172|205|190|231|0|0|0|drip|32|237|192|253|205|320|120|0|table|1|13|230|113|239|0|0|0|ritFa\\\" after line 16 of lvlObjects\\n\\tput \\\"n|13|12|177|47|231|512|0|1\\\" after line 16 of lvlObjects\\n\\tput \\\"\\\" into line 17 of lvlObjects\\n\\tput \\\"flrVnt|8|31|325|79|338|44|0|0|extRct|5|382|111|430|246|24|0|0|mirror|41|359|84|451|270|0|0|0\\\" after line 17 of lvlObjects\\n\\tput \\\"\\\" into line 18 of lvlObjects\\n\\tput \\\"dnStar|45|187|54|348|308|10|0|0|flrVnt|8|248|325|296|338|44|0|0|basket|42|97|247|160|318|0|0|0|table\\\" after line 18 of lvlObjects\\n\\tput \\\"|1|358|230|458|239|0|0|0|clock|16|426|202|458|231|1000|0|0|bnsRct|19|377|240|441|272|1000|0|0|paintg\\\" after line 18 of lvlObjects\\n\\tput \\\"|40|384|66|486|159|0|0|0\\\" after line 18 of lvlObjects\\n\\tput \\\"\\\" into line 19 of lvlObjects\\n\\tput \\\"flrVnt|8|11|325|59|338|44|0|0|celDct|10|67|24|115|37|305|19|1|shelf|2|155|151|255|158|0|0|0|shelf|2|\\\" after line 19 of lvlObjects\\n\\tput \\\"326|161|388|168|0|0|0|books|3|325|107|389|162|0|0|0|table|1|262|223|391|232|0|0|0|flrVnt|8|257|325|3\\\" after line 19 of lvlObjects\\n\\tput \\\"05|338|255|0|0|flrVnt|8|405|325|453|338|44|0|0|bnsRct|19|324|171|356|203|5000|0|0|paper|17|208|131|2\\\" after line 19 of lvlObjects\\n\\tput \\\"56|152|1000|0|0|bnsRct|19|258|142|322|174|1000|0|0\\\" after line 19 of lvlObjects\\n\\tput \\\"\\\" into line 20 of lvlObjects\\n\\tput \\\"flrVnt|8|38|325|86|338|44|0|0|celDct|10|37|24|85|37|57|19|0|cabnet|4|162|199|275|323|0|0|0|clock|16|\\\" after line 20 of lvlObjects\\n\\tput \\\"155|171|187|200|1000|0|0|flrVnt|8|277|325|325|338|44|0|0|drip|32|386|38|402|51|318|120|0\\\" after line 20 of lvlObjects\\n\\tput \\\"\\\" into line 21 of lvlObjects\\n\\tput \\\"flrVnt|8|60|325|108|338|44|0|0|shelf|2|200|96|361|103|0|0|0|pwrSwt|28|158|197|176|223|5|0|0|shelf|2|\\\" after line 21 of lvlObjects\\n\\tput \\\"157|185|257|192|0|0|0|shredr|27|260|184|324|208|0|0|1|rbrBnd|21|198|73|230|96|3|0|0|cabnet|4|376|75|\\\" after line 21 of lvlObjects\\n\\tput \\\"480|183|0|0|0|flrVnt|8|363|325|411|338|210|0|0|bnsRct|19|213|193|245|225|1000|0|0\\\" after line 21 of lvlObjects\\n\\tput \\\"\\\" into line 22 of lvlObjects\\n\\tput \\\"flrVnt|8|63|325|111|338|44|0|0|shelf|2|173|115|422|122|0|0|0|ritFan|13|182|189|217|243|512|0|1|lftFa\\\" after line 22 of lvlObjects\\n\\tput \\\"n|12|388|60|423|115|227|0|1|paper|17|345|94|393|115|1000|0|0|flrVnt|8|443|325|491|338|44|0|0|pwrSwt|\\\" after line 22 of lvlObjects\\n\\tput \\\"28|410|126|428|152|4|0|0|cabnet|4|172|242|363|327|0|0|0\\\" after line 22 of lvlObjects\\n\\tput \\\"\\\" into line 23 of lvlObjects\\n\\tput \\\"flrVnt|8|42|325|90|338|44|0|0|table|1|146|222|270|231|0|0|0|ball|34|207|190|239|222|44|0|0|ball|34|2\\\" after line 23 of lvlObjects\\n\\tput \\\"90|293|322|325|44|0|0|flrVnt|8|375|325|423|338|44|0|0\\\" after line 23 of lvlObjects\\n\\tput \\\"\\\" into line 24 of lvlObjects\\n\\tput \\\"flrVnt|8|58|325|106|338|44|0|0|cabnet|4|110|161|221|321|0|0|0|table|1|226|226|326|235|0|0|0|flrVnt|8\\\" after line 24 of lvlObjects\\n\\tput \\\"|420|325|468|338|44|0|0|rbrBnd|21|294|204|326|227|4|0|0|fshBwl|35|226|198|258|227|44|120|0|paper|17|\\\" after line 24 of lvlObjects\\n\\tput \\\"177|141|225|162|1000|0|0|books|3|113|107|177|162|0|0|0\\\" after line 24 of lvlObjects\\n\\tput \\\"\\\" into line 25 of lvlObjects\\n\\tput \\\"flrVnt|8|41|325|89|338|215|0|0|table|1|57|188|227|197|0|0|0|clock|16|181|161|213|190|1000|0|0|flrVnt\\\" after line 25 of lvlObjects\\n\\tput \\\"|8|241|325|289|338|128|0|0|table|1|302|231|412|240|0|0|0|drip|32|215|38|231|51|324|120|0|flrVnt|8|45\\\" after line 25 of lvlObjects\\n\\tput \\\"9|325|507|338|44|0|0\\\" after line 25 of lvlObjects\\n\\tput \\\"\\\" into line 26 of lvlObjects\\n\\tput \\\"shelf|2|32|186|294|193|0|0|0|ritFan|13|42|133|77|187|341|0|0|flrVnt|8|373|325|421|338|154|0|0|pwrSwt\\\" after line 26 of lvlObjects\\n\\tput \\\"|28|120|99|138|125|2|0|0|lftFan|12|458|202|493|257|88|0|0|shelf|2|431|256|511|263|0|0|0|pwrSwt|28|48\\\" after line 26 of lvlObjects\\n\\tput \\\"6|156|504|182|5|0|0|paper|17|65|307|113|328|1000|0|0|paper|17|112|307|160|328|1000|0|0\\\" after line 26 of lvlObjects\\n\\tput \\\"\\\" into line 27 of lvlObjects\\n\\tput \\\"flrVnt|8|13|325|61|338|44|0|0|flrVnt|8|227|325|275|338|44|0|0|cabnet|4|86|198|215|321|0|0|0|clock|16\\\" after line 27 of lvlObjects\\n\\tput \\\"|92|170|124|199|1000|0|0|litSwt|24|385|162|403|188|0|0|0|books|3|438|157|502|212|0|0|0|flrVnt|8|372|\\\" after line 27 of lvlObjects\\n\\tput \\\"325|420|338|217|0|0|table|1|375|210|509|219|0|0|0|celVnt|9|277|24|325|36|305|0|0|window|37|224|84|35\\\" after line 27 of lvlObjects\\n\\tput \\\"4|236|0|0|0\\\" after line 27 of lvlObjects\\n\\tput \\\"\\\" into line 28 of lvlObjects\\n\\tput \\\"flrVnt|8|24|325|72|338|44|0|0|cabnet|4|84|188|393|321|0|0|0|grease|18|82|159|114|188|392|0|1|ball|34\\\" after line 28 of lvlObjects\\n\\tput \\\"|202|157|234|189|96|0|0|clock|16|397|170|429|199|1000|0|0|flrVnt|8|424|325|472|338|44|0|0|paintg|40|\\\" after line 28 of lvlObjects\\n\\tput \\\"259|62|361|155|0|0|0\\\" after line 28 of lvlObjects\\n\\tput \\\"\\\" into line 29 of lvlObjects\\n\\tput \\\"guitar|29|131|151|195|321|0|0|0|thermo|26|215|170|233|197|0|0|0|flrVnt|8|41|325|89|338|44|0|0|flrVnt\\\" after line 29 of lvlObjects\\n\\tput \\\"|8|269|325|317|338|44|0|0|shelf|2|354|84|419|91|0|0|0|rbrBnd|21|357|62|389|85|2|0|0\\\" after line 29 of lvlObjects\\n\\tput \\\"\\\" into line 30 of lvlObjects\\n\\tput \\\"fshBwl|35|168|171|200|200|44|80|0|cabnet|4|279|62|486|141|0|0|0|flrVnt|8|327|325|375|338|162|0|0|flr\\\" after line 30 of lvlObjects\\n\\tput \\\"Vnt|8|19|325|67|338|44|0|0|outlet|25|244|159|276|184|80|0|0|mirror|41|88|58|179|160|0|0|0\\\" after line 30 of lvlObjects\\n\\tput \\\"\\\" into line 31 of lvlObjects\\n\\tput \\\"upStar|44|60|54|221|308|34|0|0|cabnet|4|237|71|361|325|0|0|0|table|1|417|221|511|230|0|0|0|flrVnt|8|\\\" after line 31 of lvlObjects\\n\\tput \\\"365|325|413|338|44|0|0|paper|17|416|201|464|222|1000|0|0|rbrBnd|21|480|199|512|222|5|0|0|flrVnt|8|10\\\" after line 31 of lvlObjects\\n\\tput \\\"5|325|153|338|44|0|0\\\" after line 31 of lvlObjects\\n\\tput \\\"\\\" into line 32 of lvlObjects\\n\\tput \\\"upStar|44|30|54|191|308|35|0|0|flrVnt|8|91|325|139|338|44|0|0|cabnet|4|217|219|426|320|0|0|0|candle|\\\" after line 32 of lvlObjects\\n\\tput \\\"11|222|199|254|220|74|0|0|battry|20|408|195|426|221|40|0|0|flrVnt|8|426|325|474|338|44|0|0\\\" after line 32 of lvlObjects\\n\\tput \\\"\\\" into line 33 of lvlObjects\\n\\tput \\\"flrVnt|8|59|325|107|338|44|0|0|celDct|10|56|24|104|37|305|34|0|flrVnt|8|438|325|486|338|44|0|0|cabne\\\" after line 33 of lvlObjects\\n\\tput \\\"t|4|321|137|431|324|0|0|0|table|1|202|238|316|247|0|0|0|clock|16|319|109|351|138|1000|0|0|paper|17|2\\\" after line 33 of lvlObjects\\n\\tput \\\"04|218|252|239|1000|0|0\\\" after line 33 of lvlObjects\\n\\tput \\\"\\\" into line 34 of lvlObjects\\n\\tput \\\"dnStar|45|139|54|300|308|31|0|0|flrVnt|8|209|325|257|338|44|0|0|celDct|10|65|24|113|37|305|34|1|shel\\\" after line 34 of lvlObjects\\n\\tput \\\"f|2|321|188|421|195|0|0|0|clock|16|390|160|422|189|1000|0|0|flrVnt|8|447|325|495|338|44|0|0\\\" after line 34 of lvlObjects\\n\\tput \\\"\\\" into line 35 of lvlObjects\\n\\tput \\\"dnStar|45|5|54|166|308|32|0|0|flrVnt|8|182|325|230|338|44|0|0|toastr|33|379|304|417|331|114|120|0|sh\\\" after line 35 of lvlObjects\\n\\tput \\\"elf|2|332|105|490|112|0|0|0|clock|16|410|173|442|202|1000|0|0|flrVnt|8|460|325|508|338|201|0|0|table\\\" after line 35 of lvlObjects\\n\\tput \\\"|1|410|201|510|210|0|0|0|books|3|343|52|407|107|0|0|0\\\" after line 35 of lvlObjects\\n\\tput \\\"\\\" into line 36 of lvlObjects\\n\\tput \\\"flrVnt|8|54|325|102|338|44|0|0|outlet|25|128|175|160|200|120|0|0|flrVnt|8|354|325|402|338|146|0|0|ca\\\" after line 36 of lvlObjects\\n\\tput \\\"bnet|4|335|25|457|115|0|0|0|teaKtl|36|436|172|477|202|120|0|0|cabnet|4|148|25|209|81|0|0|0\\\" after line 36 of lvlObjects\\n\\tput \\\"\\\" into line 37 of lvlObjects\\n\\tput \\\"shelf|2|132|95|448|102|0|0|0|flrVnt|8|73|325|121|338|76|0|0|grease|18|134|67|166|96|448|0|1|celDct|1\\\" after line 37 of lvlObjects\\n\\tput \\\"0|256|24|304|37|73|37|1|paper|17|321|75|369|96|1000|0|0|clock|16|368|67|400|96|1000|0|0|rbrBnd|21|39\\\" after line 37 of lvlObjects\\n\\tput \\\"9|73|431|96|5|0|0|flrVnt|8|326|325|374|338|96|0|0|battry|20|302|70|320|96|40|0|0|books|3|177|42|241|\\\" after line 37 of lvlObjects\\n\\tput \\\"97|0|0|0\\\" after line 37 of lvlObjects\\n\\tput \\\"\\\" into line 38 of lvlObjects\\n\\tput \\\"flrVnt|8|53|325|101|338|44|0|0|flrVnt|8|305|325|353|338|115|0|0|table|1|136|169|281|178|0|0|0|shelf|\\\" after line 38 of lvlObjects\\n\\tput \\\"2|136|90|469|97|0|0|0|books|3|141|115|205|170|0|0|0|table|1|359|225|493|234|0|0|0|candle|11|393|204|\\\" after line 38 of lvlObjects\\n\\tput \\\"425|225|116|0|0|clock|16|248|141|280|170|1000|0|0|books|3|180|37|244|92|0|0|0|paper|17|423|70|471|91\\\" after line 38 of lvlObjects\\n\\tput \\\"|1000|0|0\\\" after line 38 of lvlObjects\\n\\tput \\\"\\\" into line 39 of lvlObjects\\n\\tput \\\"flrVnt|8|11|325|59|338|44|0|0|flrVnt|8|446|325|494|338|44|0|0|flrVnt|8|243|325|291|338|44|0|0|celVnt\\\" after line 39 of lvlObjects\\n\\tput \\\"|9|103|24|151|36|325|0|0|celVnt|9|150|24|198|36|325|0|0|celVnt|9|197|24|245|36|325|0|0|celVnt|9|287|\\\" after line 39 of lvlObjects\\n\\tput \\\"24|335|36|325|0|0|celVnt|9|335|24|383|36|325|0|0|celVnt|9|383|24|431|36|325|0|0|paintg|40|212|68|314\\\" after line 39 of lvlObjects\\n\\tput \\\"|161|0|0|0\\\" after line 39 of lvlObjects\\n\\tput \\\"\\\" into line 40 of lvlObjects\\n\\tput \\\"celDct|10|35|24|83|37|305|31|1|celDct|10|127|24|175|37|66|36|0|celDct|10|221|24|269|37|67|37|0|celDc\\\" after line 40 of lvlObjects\\n\\tput \\\"t|10|313|24|361|37|64|41|0|celDct|10|398|24|446|37|57|40|0|flrVnt|8|126|325|174|338|44|0|0|flrVnt|8|\\\" after line 40 of lvlObjects\\n\\tput \\\"218|325|266|338|44|0|0|flrVnt|8|311|325|359|338|44|0|0|flrVnt|8|396|325|444|338|44|0|0|cabnet|4|11|2\\\" after line 40 of lvlObjects\\n\\tput \\\"13|76|324|0|0|0|paper|17|29|193|77|214|1000|0|0\\\" after line 40 of lvlObjects\\nend initSpriteConstantsAndGameData\\n\",\"name\":\"\",\"compatibilitymode\":false,\"increasingnumberforelemname\":31,\"increasingnumberforelemnamefld\":1,\"increasingnumberforid\":1035,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|SU0XwHNo6Y0ee1GC8Xw1qSg|demo3\",\"cardorder\":\"1001\"}},{\"type\":6,\"id\":\"1000\",\"parent_id\":\"921\",\"insertIndex\":1,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1001\",\"parent_id\":\"1000\",\"insertIndex\":2,\"attrs\":{\"script\":\"-- https://github.com/moltenform/glider_4\\n\\n-- when editing the game, it might be useful\\n-- to know that you can press Shift+N and click\\n-- Start Over to reset the game.\\n\\n-- script of cd \\\"cdglider\\\":\\n\\n-- level data:\\n-- item 1:  roomName\\n-- item 2:  numberOfObjects\\n-- item 3:  leftOpen\\n-- item 4:  rightOpen\\n-- item 5:  animateKind\\n-- item 6:  animateNumber\\n-- item 7:  animateDelay\\n-- item 8:  conditionCode\\n\\n-- level objects:\\n-- item 1:  typeName\\n-- item 2:  typeNumber\\n-- item 3:  c1\\n-- item 4:  c2\\n-- item 5:  c3\\n-- item 6:  c4\\n-- item 7:  amount\\n-- item 8:  extra\\n-- item 9:  isOn\\n\\nfunction intersectRoomObject meRect1, meRect2, \\\\\\n\\tmeRect3, meRect4\\n\\tglobal curLevel, lvlObjects, propsPerObj\\n\\tglobal gCurLvlData, gCurLvlObjects\\n\\t\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\tput item 2 of gCurLvlData into numObjects\\n\\tput \\\"\\\" into ret\\n\\tput the left of cd btn \\\"gliderSpritesMe\\\" into x0\\n\\tput the top of cd btn \\\"gliderSpritesMe\\\" into y0\\n\\tput the right of cd btn \\\"gliderSpritesMe\\\" into x1\\n\\tput the bottom of cd btn \\\"gliderSpritesMe\\\" into y1\\n\\trepeat with i = 1 to numObjects\\n\\t\\tput (propsPerObj * (i-1)) into j\\n\\t\\tput item (j+1) of gCurLvlObjects into objTypeName\\n\\t\\tif objTypeName is \\\"outlet\\\" then\\n\\t\\t\\tmainLoopOutletSpark i\\n\\t\\tend if\\n\\t\\t\\n\\t\\tput the left of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\tinto boxX0\\n\\t\\tput the top of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\tinto boxY0\\n\\t\\tput the right of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\tinto boxX1\\n\\t\\tput the bottom of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\tinto boxY1\\n\\t\\t\\n\\t\\tif (x0 >= boxX1 or y0 >= boxY1)  then\\n\\t\\t\\t-- it's way outside on the right or bottom\\n\\t\\telse if (x1 < boxX0 or y1 < boxY0)  then\\n\\t\\t\\t-- it's way outside on the left or top\\n\\t\\telse\\n\\t\\t\\tput \\\"|\\\" & i after ret\\n\\t\\tend if\\n\\tend repeat\\n\\treturn ret\\nend intersectRoomObject\\n\\non mainLoopMotion\\n\\tglobal curLevel, propsPerObj, dx, dy, \\n\\tglobal gCurLvlData, gCurLvlObjects, lastDirPressed\\n\\tif dy is \\\"\\\" then\\n\\t\\tput 0 into dy\\n\\tend if\\n\\tif lastDirPressed is \\\"-1\\\" then\\n\\t\\tadd -22 to dx\\n\\telse if lastDirPressed is \\\"1\\\" then\\n\\t\\tadd 22 to dx\\n\\tend if\\n\\t\\n\\tput \\\"\\\" into lastDirPressed\\n\\tset the topLeft of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\t(the left of cd btn \\\"gliderSpritesMe\\\" + dx), \\\\\\n\\t\\t(the top of cd btn \\\"gliderSpritesMe\\\" + dy)\\n\\t\\n\\tset the topLeft of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\t(the left of cd btn \\\"gliderSpritesMe\\\"), 320\\nend mainLoopMotion\\n\\non mainLoopCheckBounds\\n\\tglobal curLevel, propsPerObj, dx, dy\\n\\tglobal gCurLvlData, gCurLvlObjects\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\tput (item 3 of gCurLvlData is 1) into canGoRoomLeft\\n\\tput (item 4 of gCurLvlData is 1) into canGoRoomRght\\n\\tif the bottom of cd btn \\\"gliderSpritesMe\\\" > 328 then\\n\\t\\tbeginDeath\\n\\t\\tset bottom of cd btn \\\"gliderSpritesMe\\\" to 328\\n\\telse if the top of cd btn \\\"gliderSpritesMe\\\" < 30 then\\n\\t\\tset top of cd btn \\\"gliderSpritesMe\\\" to 30\\n\\tend if\\n\\t\\n\\tif the left of cd btn \\\"gliderSpritesMe\\\" <= 0 then\\n\\t\\tif canGoRoomLeft then\\n\\t\\t\\tbeginLoadLevel curLevel - 1\\n\\t\\t\\tset left of cd btn \\\"gliderSpritesMe\\\" to 450\\n\\t\\telse\\n\\t\\t\\tset left of cd btn \\\"gliderSpritesMe\\\" to 0\\n\\t\\tend if\\n\\telse if the right of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t>= 511 then\\n\\t\\tif canGoRoomRght then\\n\\t\\t\\tbeginLoadLevel curLevel + 1\\n\\t\\t\\tset left of cd btn \\\"gliderSpritesMe\\\" to 20\\n\\t\\telse\\n\\t\\t\\tset right of cd btn \\\"gliderSpritesMe\\\" to 511\\n\\t\\tend if\\n\\tend if\\nend mainLoopCheckBounds\\n\\non newLvlBonus\\n\\tglobal levelsSeen, curLevel\\n\\tif line curLevel of levelsSeen is \\\"\\\" then\\n\\t\\tput \\\"1\\\" into line curLevel of levelsSeen\\n\\t\\tadd 200 to cd fld \\\"score\\\"\\n\\tend if\\nend newLvlBonus\\n\\non mainLoopCollide\\n\\tglobal curLevel, propsPerObj, dx, dy\\n\\tglobal gCurLvlData, gCurLvlObjects\\n\\tglobal spritesBurnRght1, spritesOutletSpark1\\n\\t\\n\\tput intersectRoomObject(gCurLvlData, gCurLvlObjects, \\\\\\n\\t\\tthe left of cd btn \\\"gliderSpritesMe\\\", \\\\\\n\\t\\tthe top of cd btn \\\"gliderSpritesMe\\\", \\\\\\n\\t\\tthe right of cd btn \\\"gliderSpritesMe\\\", \\\\\\n\\t\\tthe bottom of cd btn \\\"gliderSpritesMe\\\") \\\\\\n\\t\\tinto intersects\\n\\t\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\tput the number of items in intersects into \\\\\\n\\t\\tnumIntersects\\n\\t\\n\\tput false into isdead\\n\\t\\n\\t-- by default, we fall 6 pixels\\n\\tput 0 into dx \\n\\tput 6 into dy\\n\\t\\n\\t-- ignore the first item of intersects\\n\\trepeat with numIntersect = 2 to numIntersects \\n\\t\\tput item numIntersect of intersects into i\\n\\t\\tput item ((i-1)*propsPerObj+1) of \\\\\\n\\t\\t\\tgCurLvlObjects into objTypeName\\n\\t\\tput item ((i-1)*propsPerObj+7) of \\\\\\n\\t\\t\\tgCurLvlObjects into amount\\n\\t\\tput item ((i-1)*propsPerObj+8) of \\\\\\n\\t\\t\\tgCurLvlObjects into extra\\n\\t\\tput item ((i-1)*propsPerObj+9) of \\\\\\n\\t\\t\\tgCurLvlObjects into isOn\\n\\t\\t\\n\\t\\tput getCollideResult(objTypeName, isOn, \\\\\\n\\t\\t\\tamount, extra) into clr\\n\\t\\t\\n\\t\\tput item 1 of clr into collideType\\n\\t\\tput item 2 of clr into collideAmt\\n\\t\\t\\n\\t\\tif collideType is \\\"crashIt\\\" then\\n\\t\\t\\tbeginDeath\\n\\t\\telse if collideType is \\\"moveIt\\\" then\\n\\t\\t\\t-- not yet supported\\n\\t\\telse if collideType is \\\"liftIt\\\" then\\n\\t\\t\\tput -6 into dy\\n\\t\\telse if collideType is \\\"dropIt\\\" then\\n\\t\\t\\tput 12 into dy\\n\\t\\telse if collideType is \\\"burnIt\\\" then\\n\\t\\t\\tif bottom of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t\\t\\t>= (bottom of cd btn \\\\\\n\\t\\t\\t\\t\\t(\\\"gliderSprites\\\" & i) - 30) then\\n\\t\\t\\t\\tbeginDeath\\n\\t\\t\\t\\tset the icon of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t\\t\\t\\tto spritesBurnRght1\\n\\t\\t\\telse\\n\\t\\t\\t\\tput -6 into dy\\n\\t\\t\\tend if\\n\\t\\telse if collideType is \\\"turnItLeft\\\" then\\n\\t\\t\\tput -20 into dx\\n\\t\\telse if collideType is \\\"turnItRight\\\" then\\n\\t\\t\\tput 20 into dx\\n\\t\\telse if collideType is \\\"lightIt\\\" then\\n\\t\\t\\t-- not yet supported\\n\\t\\telse if collideType is \\\"zapIt\\\" then\\n\\t\\t\\tif the icon of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\t\\tis spritesOutletSpark1 then\\n\\t\\t\\t\\tbeginDeath\\n\\t\\t\\t\\tset the icon of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t\\t\\t\\tto spritesBurnRght1\\n\\t\\t\\tend if\\n\\t\\telse if collideType is \\\"airOnIt\\\" then\\n\\t\\t\\t-- not yet supported\\n\\t\\telse if collideType is \\\"shredIt\\\" then\\n\\t\\t\\tbeginDeath\\n\\t\\telse if collideType is \\\"descendIt\\\" then\\n\\t\\t\\tbeginLoadLevel collideAmt\\n\\t\\t\\tset top of cd btn \\\"gliderSpritesMe\\\" to 20\\n\\t\\t\\tset left of cd btn \\\"gliderSpritesMe\\\" to 20\\n\\t\\telse if collideType is \\\"ascendIt\\\" then\\n\\t\\t\\tbeginLoadLevel collideAmt\\n\\t\\t\\tset top of cd btn \\\"gliderSpritesMe\\\" to 20\\n\\t\\t\\tset left of cd btn \\\"gliderSpritesMe\\\" to 20\\n\\t\\telse if collideType is \\\"getitem_extraIt\\\" then\\n\\t\\t\\tadd 1 to cd fld \\\"lives\\\"\\n\\t\\telse if collideType is \\\"getitem_awardIt\\\" then\\n\\t\\t\\tadd 50 to cd fld \\\"score\\\"\\n\\t\\telse if collideType is \\\"getitem_energizeIt\\\" then\\n\\t\\t\\tadd 100 to cd fld \\\"score\\\"\\n\\t\\telse if collideType is \\\"getitem_bandIt\\\" then\\n\\t\\t\\tadd 150 to cd fld \\\"score\\\"\\n\\t\\tend if\\n\\t\\t\\n\\t\\tif \\\"getitem_\\\" is in collideType then\\n\\t\\t\\t-- hide it since it is gone\\n\\t\\t\\tmodifyObjectState (((i-1)*propsPerObj) + 9) \\\\\\n\\t\\t\\t\\t, 0\\n\\t\\t\\t\\n\\t\\t\\thide cd btn (\\\"gliderSprites\\\" & i)\\n\\t\\tend if\\n\\tend repeat\\nend mainLoopCollide\\n\\non mainLoopOutletSpark i\\n\\tglobal clockCount, propsPerObj, spritesOutlet, \\n\\tglobal spritesOutletSpark1\\n\\tglobal gCurLvlData, gCurLvlObjects\\n\\t\\n\\tadd 1 to clockCount\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\tif clockCount mod 20 is 1 then\\n\\t\\tput (propsPerObj * (i-1)) into j\\n\\t\\tput item (j+1) of gCurLvlObjects into objTypeName\\n\\t\\tif objTypeName is \\\"outlet\\\" then\\n\\t\\t\\tif the icon of cd btn \\\\\\n\\t\\t\\t\\t(\\\"gliderSprites\\\" & i) is \\\\\\n\\t\\t\\t\\t\\tspritesOutletSpark1 then\\n\\t\\t\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\t\\t\\tto spritesOutlet\\n\\t\\t\\telse\\n\\t\\t\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\t\\t\\tto spritesOutletSpark1\\n\\t\\t\\tend if\\n\\t\\tend if\\n\\tend if\\nend mainLoopOutletSpark\\n\\non mainLoopDying\\n\\tglobal deathCount, state, curLevel\\n\\tglobal spritesRightForward\\n\\t\\n\\t-- use deathCount to intentionally delay the \\n\\t-- transition from alive to dead\\n\\tif deathCount < 30 then\\n\\t\\tput deathCount + 1 into deathCount\\n\\telse\\n\\t\\tsubtract 1 from cd fld \\\"lives\\\"\\n\\t\\tif cd fld \\\"lives\\\" < 0 then\\n\\t\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\t\\tput -3 into curLevel\\n\\t\\t\\trefreshOnLevelChange\\n\\t\\telse\\n\\t\\t\\tset the topLeft of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t\\t\\tto 20,20\\n\\t\\t\\tset the icon of cd btn \\\"gliderSpritesMe\\\" \\\\\\n\\t\\t\\t\\tto spritesRightForward\\n\\t\\t\\tput \\\"playing\\\" into state\\n\\t\\t\\tplay \\\"glider_1_BeamIn\\\"\\n\\t\\tend if\\n\\tend if\\nend mainLoopDying\\n\\non mainLoopLoadingLevel\\n\\tglobal loadLevelCount, state, curLevel\\n\\t\\n\\t-- use loadLevelCount to intentionally delay the \\n\\t-- transition between levels\\n\\tif loadLevelCount < 3 then\\n\\t\\tput loadLevelCount+1 into loadLevelCount\\n\\t\\tput \\\".\\\" after cd fld \\\"roomName\\\"\\n\\telse\\n\\t\\trefreshOnLevelChange\\n\\t\\tput \\\"playing\\\" into state\\n\\tend if\\nend mainLoopLoadingLevel\\n\\non beginLoadLevel nextLevel\\n\\tglobal loadLevelCount, state, curLevel\\n\\tif nextLevel > curLevel then\\n\\t\\tput 1 into incr\\n\\telse\\n\\t\\tput -1 into incr\\n\\tend if\\n\\t\\n\\tput nextLevel into curLevel\\n\\tnewLvlBonus\\n\\tif curLevel < 1 then\\n\\t\\tput 1 into curLevel -- sanity check\\n\\telse if curLevel > 40 then\\n\\t\\tput 40 into curLevel -- sanity check\\n\\tend if\\n\\t\\n\\t-- skip levels we don't yet support\\n\\tif curLevel is 7 then\\n\\t\\tput curLevel + incr into curLevel\\n\\tend if\\n\\tif curLevel is 13 then\\n\\t\\tput curLevel + incr into curLevel\\n\\tend if\\n\\tif curLevel is 28 then\\n\\t\\tput curLevel + incr into curLevel\\n\\tend if\\n\\tif curLevel is 29 then\\n\\t\\tput curLevel + incr into curLevel\\n\\tend if\\n\\tif curLevel is 37 then\\n\\t\\tput curLevel + incr into curLevel\\n\\tend if\\n\\t\\n\\tif curLevel is 26 then\\n\\t\\t-- victory!\\n\\t\\tput -3 into curLevel\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\trefreshOnLevelChange\\n\\telse\\n\\t\\tput 0 into loadLevelCount\\n\\t\\tput \\\"Loading\\\" into cd fld \\\"roomName\\\"\\n\\t\\tput \\\"loadingLevel\\\" into state\\n\\tend if\\nend beginLoadLevel\\n\\non idle\\n\\tglobal state, curLevel\\n\\t\\n\\t-- change the name of the card to \\\"stopAll\\\"\\n\\t-- to completely stop the game\\n\\tif the short name of this card is \\\"stopAll\\\" then\\n\\t\\tglobal curLevel, state\\n\\t\\tput \\\"needReset\\\" into curLevel\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\trefreshOnLevelChange\\n\\t\\tshow cd btn \\\"btnContinue\\\"\\n\\t\\tset the label of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t\\\"Start Over\\\"\\n\\tend if\\n\\t\\n\\tif state is \\\"playing\\\" then\\n\\t\\tglobal curLevel, lvlData, lvlObjects, dx, dy\\n\\t\\tglobal gCurLvlData, gCurLvlObjects\\n\\t\\t\\n\\t\\t-- be careful that we don't warp through \\n\\t\\t-- a solid object.\\n\\t\\t-- for example, if you are moving at 12 pixels\\n\\t\\t-- per update, and your height is 5 pixels, \\n\\t\\t-- it's possible to completely slip through\\n\\t\\t-- a solid object that is only 6 pixels wide\\n\\t\\t\\n\\t\\tput 0 into dx\\n\\t\\tput 0 into dy\\n\\t\\tmainLoopCollide\\n\\t\\tmainLoopCheckBounds\\n\\t\\tmainLoopMotion\\n\\telse if state is \\\"dying\\\" then\\n\\t\\tmainLoopDying\\n\\telse if state is \\\"loadingLevel\\\" then\\n\\t\\tmainLoopLoadingLevel\\n\\tend if\\nend idle\\n\\non afterKeyDown\\n\\tglobal lastDirPressed, cheatInvincible\\n\\tif \\\"intro\\\" is in the name of this cd then\\n\\t\\texit afterKeyDown\\n\\tend if\\n\\tif keychar() is \\\"ArrowLeft\\\" then\\n\\t\\tput \\\"-1\\\" into lastDirPressed\\n\\telse if keychar() is \\\"ArrowRight\\\" then\\n\\t\\tput \\\"1\\\" into lastDirPressed\\n\\telse if keyChar() is \\\"I\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"toggle cheatcode:invincible\\\"\\n\\t\\tif cheatInvincible is true then\\n\\t\\t\\tput false into cheatInvincible\\n\\t\\telse\\n\\t\\t\\tput true into cheatInvincible\\n\\t\\tend if\\n\\telse if keyChar() is \\\"L\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"cheatcode:new life\\\"\\n\\t\\tadd 1 to cd fld \\\"lives\\\"\\n\\telse if keyChar() is \\\"N\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tglobal curLevel, state\\n\\t\\tput \\\"needReset\\\" into curLevel\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\trefreshOnLevelChange\\n\\t\\tshow cd btn \\\"btnContinue\\\"\\n\\t\\tset the label of cd btn \\\"btnContinue\\\" \\\\\\n\\t\\t\\tto \\\"Start Over\\\"\\n\\tend if\\nend afterKeyDown\\n\\non modifyObjectState itemNumber, newValue\\n\\tglobal curLevel, gCurLvlData, gCurLvlObjects\\n\\tglobal lvlData, lvlObjects\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\t\\n\\t-- modify cached for this level\\n\\tput newValue into item (itemNumber) \\\\\\n\\t\\tof gCurLvlObjects\\n\\t\\n\\t-- modify global state\\n\\tput gCurLvlObjects into line (curLevel) \\\\\\n\\t\\tof lvlObjects\\nend modifyObjectState\\n\\non beginDeath\\n\\tglobal state, deathCount, spritesAllDeadRght\\n\\tglobal cheatInvincible\\n\\tif cheatInvincible is not true then\\n\\t\\tput \\\"dying\\\" into state\\n\\t\\tput 0 into deathCount\\n\\t\\tset the icon of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\t\\tspritesAllDeadRght\\n\\tend if\\nend beginDeath\\n\\non refreshOnLevelChange\\n\\tglobal curLevel, gCurLvlData, gCurLvlObjects\\n\\tglobal lvlData, lvlObjects\\n\\t\\n\\trepeat with x = 1 to 16\\n\\t\\thide cd btn (\\\"gliderSprites\\\" & x)\\n\\tend repeat\\n\\thide cd btn \\\"gliderSpritesMe\\\"\\n\\thide cd btn \\\"gliderSpritesShadow\\\"\\n\\t\\n\\tglobal lastDirPressed, propsPerObj\\n\\tput \\\"\\\" into lastDirPressed\\n\\tput 9 into propsPerObj\\n\\tset the itemdelimiter to \\\"|\\\"\\n\\tshow cd btn \\\"gliderBg0\\\"\\n\\thide cd fld \\\"roomName\\\"\\n\\thide cd fld \\\"score\\\"\\n\\thide cd fld \\\"lives\\\"\\n\\thide cd fld \\\"behindLives\\\"\\n\\thide cd btn \\\"gliderSpritesLivesIcn\\\"\\n\\thide cd fld \\\"gameOver\\\"\\n\\t\\n\\tshow cd btn \\\"btnContinue\\\"\\n\\tset the idlerate to \\\"default\\\"\\n\\tif curLevel is \\\"needReset\\\" then\\n\\t\\texit refreshOnLevelChange\\n\\telse if curLevel is \\\"\\\" or curLevel is -1 then\\n\\t\\tput -1 into curLevel\\n\\t\\tset the icon of cd btn \\\"gliderBg0\\\" to 1\\n\\t\\tset the rect of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t367,22,487,96\\n\\t\\tset the label of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t\\\"New Game\\\"\\n\\telse if curLevel is -2 then\\n\\t\\tset the icon of cd btn \\\"gliderBg0\\\" to 2\\n\\t\\tset the rect of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t126,300,126+254,300+36\\n\\t\\tset the label of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t\\\"Start\\\"\\n\\telse if curLevel is -3 then\\n\\t\\tset the icon of cd btn \\\"gliderBg0\\\" to 3\\n\\t\\tset the rect of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t126,300,126+254,300+36\\n\\t\\tset the label of cd btn \\\"btnContinue\\\" to \\\\\\n\\t\\t\\t\\\"Home\\\"\\n\\t\\tif cd fld \\\"lives\\\" > 0 then\\n\\t\\t\\thide cd fld \\\"gameOver\\\"\\n\\t\\telse\\n\\t\\t\\tshow cd fld \\\"gameOver\\\"\\n\\t\\t\\tput (newline & newline & \\\"Game Over...\\\" & \\\\\\n\\t\\t\\t\\tnewline & newline & \\\"Your score was \\\" & \\\\\\n\\t\\t\\t\\t(cd fld \\\"score\\\") & \\\".\\\") \\\\\\n\\t\\t\\t\\tinto cd fld \\\"gameOver\\\"\\n\\t\\tend if\\n\\telse\\n\\t\\tset the idlerate to \\\"faster2\\\"\\n\\t\\tset the skipArrowkeyMessages to true\\n\\t\\t\\n\\t\\tglobal spritesVentPatternY\\n\\t\\tshow cd btn \\\"gliderSpritesMe\\\"\\n\\t\\tshow cd btn \\\"gliderSpritesShadow\\\"\\n\\t\\tshow cd fld \\\"roomName\\\"\\n\\t\\tshow cd fld \\\"score\\\"\\n\\t\\tshow cd fld \\\"lives\\\"\\n\\t\\tshow cd fld \\\"behindLives\\\"\\n\\t\\tshow cd btn \\\"gliderSpritesLivesIcn\\\"\\n\\t\\thide cd btn \\\"btnContinue\\\"\\n\\t\\tset the icon of cd btn \\\"gliderBg0\\\" to \\\\\\n\\t\\t\\t3 + curLevel\\n\\t\\t\\n\\t\\t-- need to make everything larger,\\n\\t\\t-- to make the sprite show up\\n\\t\\tput 2 into q\\n\\t\\t\\n\\t\\t-- actually load the room\\n\\t\\tglobal curLevel, lvlData, lvlObjects, dx, dy\\n\\t\\tglobal propsPerObj\\n\\t\\tput line curLevel of lvlData into curLvlData\\n\\t\\tset the itemdelimiter to \\\"|\\\"\\n\\t\\tput item 1 of curLvlData into cd fld \\\"roomName\\\"\\n\\t\\tif cd fld \\\"roomName\\\" is \\\"Welcome...\\\" then\\n\\t\\t\\tput \\\"Across the room...\\\" into \\\\\\n\\t\\t\\t\\tcd fld \\\"roomName\\\"\\n\\t\\tend if\\n\\t\\t\\n\\t\\t-- actually load the room's objects\\n\\t\\tput line curLevel of lvlObjects into curLvlObjects\\n\\t\\tput item 2 of curLvlData into numObjects\\n\\t\\trepeat with i = 1 to numObjects\\n\\t\\t\\tput (propsPerObj * (i-1))  into j\\n\\t\\t\\tput item (j+3) of curLvlObjects into spritex0\\n\\t\\t\\tput item (j+4) of curLvlObjects into spritey0\\n\\t\\t\\tput item (j+5) of curLvlObjects into spritex1\\n\\t\\t\\tput item (j+6) of curLvlObjects into spritey1\\n\\t\\t\\tif spritex0 is \\\"\\\" then\\n\\t\\t\\t\\tanswer (i && j && curLvlObjects)\\n\\t\\t\\tend if\\n\\t\\t\\t\\n\\t\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t\\tspritex0, spritey0, max(1,spritex1), \\\\\\n\\t\\t\\t\\tmax(1,spritey1)\\n\\t\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t\\t0 -- invisible by default\\n\\t\\t\\t\\n\\t\\t\\tput item (j+1) of curLvlObjects into objTypeName\\n\\t\\t\\tput item (j+7) of curLvlObjects into amount\\n\\t\\t\\tput item (j+9) of curLvlObjects into isOn\\n\\t\\t\\t\\n\\t\\t\\tif isOn is 1 then\\n\\t\\t\\t\\tshow cd btn (\\\"gliderSprites\\\" & i)\\n\\t\\t\\telse\\n\\t\\t\\t\\thide cd btn (\\\"gliderSprites\\\" & i)\\n\\t\\t\\tend if\\n\\t\\t\\t\\n\\t\\t\\trefreshOnLevelChangeIcons objTypeName, i, \\\\\\n\\t\\t\\t\\tamount, spritex0, spritex1, spritey0, spritey1\\n\\t\\t\\t\\n\\t\\t\\tset width of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\t\\tto q + the width of cd btn \\\\\\n\\t\\t\\t\\t(\\\"gliderSprites\\\" & i)\\n\\t\\t\\tset height of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\t\\tto q + the height of cd btn \\\\\\n\\t\\t\\t\\t(\\\"gliderSprites\\\" & i)\\n\\t\\tend repeat\\n\\tend if\\n\\t\\n\\tif curLevel is not \\\"needReset\\\" and curLevel >= 1 then\\n\\t\\tput line curLevel of lvlData into gCurLvlData\\n\\t\\tput line curLevel of lvlObjects into gCurLvlObjects\\n\\tend if\\nend refreshOnLevelChange\\n\\non refreshOnLevelChangeIcons objTypeName, i, \\\\\\n\\tamount, spritex0, spritex1, spritey0, spritey1\\n\\tglobal spriteShadoRght, spritesShadoLft\\n\\tglobal spritesRightForward, spritesRightTipped\\n\\tglobal spritesLeftForward, spritesLeftTipped\\n\\tglobal spritesTurnEndpoint, spritesRightForward2\\n\\tglobal spritesRightTipped2, spritesLeftForward2\\n\\tglobal spritesLeftTipped2, spritesTurnEndpoint2\\n\\tglobal spritesBurnRght1, spritesBurnRght2\\n\\tglobal spritesBurnLft1, spritesBurnLft2\\n\\tglobal spritesAllDeadRght, spritesAllDeadLft\\n\\tglobal spritesCelVnt, spritesCelDct\\n\\tglobal spritesFlrVnt, spritesPaper\\n\\tglobal spritesToastr, spritesToast1\\n\\tglobal spritesToast2, spritesToast3\\n\\tglobal spritesToast4, spritesToast5\\n\\tglobal spritesToast6, spritesTeaKtl\\n\\tglobal spritesLftFan, spritesRitFan\\n\\tglobal spritesTable, spritesShredr\\n\\tglobal spritesBooks, spritesClock\\n\\tglobal spritesCandle, spritesRbrBnd\\n\\tglobal spritesBall, spritesFshBwl\\n\\tglobal spritesFish1, spritesFish2\\n\\tglobal spritesFish3, spritesFish4\\n\\tglobal spritesGrease, spritesGreaseFall1\\n\\tglobal spritesGreaseFall2, spritesLitSwt\\n\\tglobal spritesThermo, spritesOutlet\\n\\tglobal spritesOutletSpark1, spritesOutletSpark2\\n\\tglobal spritesPwrSwt, spritesGuitar\\n\\tglobal spritesDrip, spritesShelf\\n\\tglobal spritesBasket, spritesPaintg\\n\\tglobal spritesBattry, spritesMacTsh\\n\\tglobal spritesUpStar, spritesDnStar\\n\\tglobal spritesCandleFlame1, spritesCandleFlame2\\n\\tglobal spritesCandleFlame3, spritesDrop1\\n\\tglobal spritesDrop2, spritesDrop3\\n\\tglobal spritesDrop4, spritesDrop5\\n\\tglobal spritesVentPatternY\\n\\t\\n\\tput 24 into kCeilingVert\\n\\tput 325 into kFloorVert\\n\\t\\n\\tif objTypeName is \\\"flrVnt\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) \\\\\\n\\t\\t\\tto spritesVentPatternY\\n\\t\\t-- the event rect is different than\\n\\t\\t-- the sprite rect.\\n\\t\\t-- see tempInt := (boundRect.right + \\n\\t\\t-- boundRect.left) div 2;\\n\\t\\t\\n\\t\\tput round((spritex0 + spritex1)/2) \\\\\\n\\t\\t\\tinto tempInt\\n\\t\\tset the rect of cd btn \\\\\\n\\t\\t\\t(\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\ttempInt - 8, amount, \\\\\\n\\t\\t\\ttempInt + 8, kFloorVert\\n\\t\\t\\n\\telse if objTypeName is \\\"celVnt\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesVentPatternY\\n\\t\\tput round((spritex0 + spritex1)/2) into tempInt\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\ttempInt - 8, kCeilingVert, tempInt + 8, \\\\\\n\\t\\t\\tamount\\n\\telse if objTypeName is \\\"celDct\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesVentPatternY\\n\\t\\tput round((spritex0 + spritex1)/2) into tempInt\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\ttempInt - 8, kCeilingVert, tempInt + 8, \\\\\\n\\t\\t\\tamount\\n\\telse if objTypeName is \\\"lftFan\\\" then\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tamount, spritey0 + 10, spritex0, \\\\\\n\\t\\t\\tspritey0 + 30\\n\\telse if objTypeName is \\\"ritFan\\\" then\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritex1, spritey0 + 10, amount, \\\\\\n\\t\\t\\tspritey0 + 30\\n\\telse if objTypeName is \\\"guitar\\\" then\\n\\t\\t-- set rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t-- spritex0+36, spritey0 + 24, spritex0+38, \\n\\t\\t-- spritey1 -56\\n\\telse if objTypeName is \\\"upStar\\\" then\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritex0 + 32, spritey0, spritex1 - 32, \\\\\\n\\t\\t\\tspritey0 + 8\\n\\t\\tset height of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t70 + height of cd btn  (\\\"gliderSprites\\\" & i)\\n\\t\\tset top of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t-30 + top of cd btn  (\\\"gliderSprites\\\" & i)\\n\\telse if objTypeName is \\\"dnStar\\\" then\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritex0 + 32, spritey1 - 8, spritex1 - 32, \\\\\\n\\t\\t\\tspritey1\\n\\t\\tset height of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t60+the height of cd btn (\\\"gliderSprites\\\" & i)\\n\\t\\tset top of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\t-30 + the top of cd btn (\\\"gliderSprites\\\" & i)\\n\\telse if objTypeName is \\\"candle\\\" then\\n\\t\\tput round((spritex0 + spritex1)/2) into tempInt\\n\\t\\tset rect of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\ttempInt - 12, amount, tempInt + 4, spritey0\\n\\t\\t\\n\\telse if objTypeName is \\\"outlet\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesOutlet\\n\\telse if objTypeName is \\\"clock\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesClock\\n\\telse if objTypeName is \\\"battry\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesBattry\\n\\telse if objTypeName is \\\"paper\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesPaper\\n\\t\\t-- bnsRct is a bonus rectangle\\n\\telse if objTypeName is \\\"litSwt\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesLitSwt\\n\\telse if objTypeName is \\\"grease\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesGrease\\n\\telse if objTypeName is \\\"rbrBnd\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesRbrBnd\\n\\telse if objTypeName is \\\"drip\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesDrip\\n\\telse if objTypeName is \\\"shredr\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesShredr\\n\\telse if objTypeName is \\\"ball\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesBall\\n\\telse if objTypeName is \\\"fshBwl\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesFshBwl\\n\\telse if objTypeName is \\\"pwrSwt\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesPwrSwt\\n\\telse if objTypeName is \\\"thermo\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesThermo\\n\\telse if objTypeName is \\\"toastr\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesToastr\\n\\telse if objTypeName is \\\"teaKtl\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesTeaKtl\\n\\telse if objTypeName is \\\"macTsh\\\" then\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & i) to \\\\\\n\\t\\t\\tspritesMacTsh\\n\\tend if\\nend refreshOnLevelChangeIcons\\n\\n\",\"name\":\"cdglider\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"1002\",\"parent_id\":\"1001\",\"insertIndex\":3,\"attrs\":{\"x\":-3,\"y\":-1,\"w\":518,\"h\":346,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"glider_bg0\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"gliderBg0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1004\",\"parent_id\":\"1001\",\"insertIndex\":4,\"attrs\":{\"x\":69,\"y\":325,\"w\":48,\"h\":13,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites1\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites1\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1005\",\"parent_id\":\"1001\",\"insertIndex\":5,\"attrs\":{\"x\":121,\"y\":220,\"w\":193,\"h\":100,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites2\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites2\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1006\",\"parent_id\":\"1001\",\"insertIndex\":6,\"attrs\":{\"x\":353,\"y\":44,\"w\":18,\"h\":283,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites3\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites3\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1007\",\"parent_id\":\"1001\",\"insertIndex\":7,\"attrs\":{\"x\":206,\"y\":87,\"w\":102,\"h\":9,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites4\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites4\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1008\",\"parent_id\":\"1001\",\"insertIndex\":8,\"attrs\":{\"x\":291,\"y\":63,\"w\":20,\"h\":28,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites5\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites5\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1009\",\"parent_id\":\"1001\",\"insertIndex\":9,\"attrs\":{\"x\":13,\"y\":61,\"w\":171,\"h\":148,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites6\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites6\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1010\",\"parent_id\":\"1001\",\"insertIndex\":10,\"attrs\":{\"x\":45,\"y\":80,\"w\":104,\"h\":95,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites7\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites7\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1011\",\"parent_id\":\"1001\",\"insertIndex\":11,\"attrs\":{\"x\":296,\"y\":153,\"w\":66,\"h\":172,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites8\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites8\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1012\",\"parent_id\":\"1001\",\"insertIndex\":12,\"attrs\":{\"x\":353,\"y\":57,\"w\":66,\"h\":34,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites9\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites9\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1013\",\"parent_id\":\"1001\",\"insertIndex\":13,\"attrs\":{\"x\":208,\"y\":131,\"w\":50,\"h\":23,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites10\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites10\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1014\",\"parent_id\":\"1001\",\"insertIndex\":14,\"attrs\":{\"x\":258,\"y\":142,\"w\":66,\"h\":34,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites11\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites11\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1015\",\"parent_id\":\"1001\",\"insertIndex\":15,\"attrs\":{\"x\":116,\"y\":66,\"w\":100,\"h\":58,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites12\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites12\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1016\",\"parent_id\":\"1001\",\"insertIndex\":16,\"attrs\":{\"x\":113,\"y\":63,\"w\":100,\"h\":58,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites13\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites13\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1017\",\"parent_id\":\"1001\",\"insertIndex\":17,\"attrs\":{\"x\":89,\"y\":39,\"w\":100,\"h\":58,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites14\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites14\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1018\",\"parent_id\":\"1001\",\"insertIndex\":18,\"attrs\":{\"x\":100,\"y\":50,\"w\":100,\"h\":58,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites15\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites15\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1019\",\"parent_id\":\"1001\",\"insertIndex\":19,\"attrs\":{\"x\":117,\"y\":67,\"w\":100,\"h\":58,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites16\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSprites16\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"1020\",\"parent_id\":\"1001\",\"insertIndex\":20,\"attrs\":{\"x\":2,\"y\":2,\"w\":175,\"h\":20,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"roomName\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u0002Across the room...\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":4,\"id\":\"1021\",\"parent_id\":\"1001\",\"insertIndex\":21,\"attrs\":{\"x\":219,\"y\":2,\"w\":78,\"h\":20,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"score\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u00020\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":4,\"id\":\"1022\",\"parent_id\":\"1001\",\"insertIndex\":22,\"attrs\":{\"x\":302,\"y\":2,\"w\":207,\"h\":20,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"behindLives\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":4,\"id\":\"1023\",\"parent_id\":\"1001\",\"insertIndex\":23,\"attrs\":{\"x\":369,\"y\":5,\"w\":22,\"h\":17,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"lives\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u00023\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"1024\",\"parent_id\":\"1001\",\"insertIndex\":24,\"attrs\":{\"x\":393,\"y\":0,\"w\":42,\"h\":22,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":4,\"showlabel\":false,\"style\":2,\"label\":\"glider_spriteslivesicon\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"gliderSpritesLivesIcn\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"1025\",\"parent_id\":\"1001\",\"insertIndex\":25,\"attrs\":{\"x\":23,\"y\":23,\"w\":451,\"h\":236,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"gameOver\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002times_18_biuosdce\\u0002\\n\\nGame Over...\\n\\nYour score was 800.\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"times\",\"defaulttextsize\":18,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"1026\",\"parent_id\":\"1001\",\"insertIndex\":26,\"attrs\":{\"x\":0,\"y\":0,\"w\":49,\"h\":21,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":2,\"showlabel\":false,\"style\":2,\"label\":\"glider_spritesshadow\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSpritesShadow\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1027\",\"parent_id\":\"1001\",\"insertIndex\":27,\"attrs\":{\"x\":0,\"y\":0,\"w\":49,\"h\":21,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":4,\"showlabel\":false,\"style\":2,\"label\":\"glider_spritesme\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"gliderSpritesMe\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1028\",\"parent_id\":\"1001\",\"insertIndex\":28,\"attrs\":{\"x\":367,\"y\":22,\"w\":120,\"h\":74,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":9,\"label\":\"New Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\\n-- https://github.com/moltenform/glider_4\\n\\n-- when editing the game, it might be useful\\n-- to know that you can press Shift+N and click\\n-- Start Over to reset the game.\\n\\n-- script of cd btn \\\"btnContinue\\\":\\n\\n-- cd btn \\\"gliderBg0\\\"\\n-- cd btn \\\"gliderSprites1-16\\\"\\n-- cd btn \\\"gliderSpritesMe\\\"\\n-- cd btn \\\"gliderSpritesShadow\\\"\\n-- cd btn \\\"btnContinue\\\"\\n-- cd fld \\\"roomName\\\"\\n-- cd fld \\\"score\\\"\\n-- cd fld \\\"lives\\\"\\n-- cd fld \\\"behindLives\\\"\\n-- cd fld \\\"gameOver\\\"\\n-- cd btn \\\"gliderSpritesLivesIcn\\\"\\n\\non mouseUp\\n\\tglobal curLevel, state\\n\\tif curLevel is \\\"needReset\\\" then\\n\\t\\tinitSpriteConstantsAndGameData\\n\\t\\tinitUI\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\tput -1 into curLevel\\n\\t\\trefreshOnLevelChange\\n\\telse if curLevel is \\\"\\\" or curLevel is -1 then\\n\\t\\tinitSpriteConstantsAndGameData\\n\\t\\tinitUI\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\tput -2 into curLevel\\n\\t\\trefreshOnLevelChange\\n\\telse if curLevel is -2 then\\n\\t\\tstartNewGame\\n\\t\\trefreshOnLevelChange\\n\\telse if curLevel is -3 then\\n\\t\\tput \\\"gameInactive\\\" into state\\n\\t\\tput -1 into curLevel\\n\\t\\trefreshOnLevelChange\\n\\tend if\\nend mouseUp\\n\\non startNewGame\\n\\tglobal cheatInvincible, state, curLevel, clockCount\\n\\tglobal lastDirPressed, propsPerObj, dy\\n\\tglobal levelsSeen\\n\\tglobal spritesRightForward, spriteShadoRght\\n\\tinitSpriteConstantsAndGameData\\n\\tput false into cheatInvincible\\n\\tput \\\"playing\\\" into state\\n\\tput \\\"\\\" into cd fld \\\"behindLives\\\"\\n\\tput 5 into cd fld \\\"lives\\\"\\n\\tput 0 into cd fld \\\"score\\\"\\n\\tput 1 into curLevel\\n\\t\\n\\tset the icon of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\tspritesRightForward\\n\\tset the icon of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\tspriteShadoRght\\n\\tset the topLeft of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\t20, 20\\n\\tset the topLeft of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\t-400, -400\\n\\t\\n\\tput \\\"\\\" into lastDirPressed\\n\\tput \\\"\\\" into levelsSeen\\n\\tput 1 into line 1 of levelsSeen\\n\\tput 0 into dy\\n\\tput 0 into clockCount\\n\\tset the itemdelimiter to \\\"|\\\"    \\n\\tput 9 into propsPerObj\\n\\t\\n\\tglobal lvlData, lvlObjects\\n\\t\\n\\t-- turn on all objects in all levels\\n\\trepeat with lvl = 1 to 40\\n\\t\\tput line lvl of lvlData into curLvlData\\n\\t\\tput line lvl of lvlObjects into curLvlObjects\\n\\t\\tput item 2 of curLvlData into numObjects\\n\\t\\trepeat with i = 1 to numObjects\\n\\t\\t\\tput (propsPerObj * (i-1))  into j\\n\\t\\t\\tput line lvl of lvlObjects into tmp\\n\\t\\t\\tput 1 into item (j+9) of tmp\\n\\t\\t\\tput tmp into line lvl of lvlObjects\\n\\t\\tend repeat\\n\\tend repeat\\nend startNewGame\\n\\non initUI\\n\\tglobal curLevel\\n\\tglobal spritesRightForward\\n\\tset the style of cd btn \\\"gliderBg0\\\" to \\\"transparent\\\"\\n\\tset the showLabel of cd btn \\\"gliderBg0\\\" to false\\n\\tset the autoHilite of cd btn \\\"gliderBg0\\\" to false\\n\\tset the style of cd fld \\\"roomName\\\" to \\\"shadow\\\"\\n\\tset the style of cd fld \\\"score\\\" to \\\"shadow\\\"\\n\\tset the style of cd fld \\\"behindLives\\\" to \\\"shadow\\\"\\n\\tset the style of cd fld \\\"lives\\\" to \\\"transparent\\\"\\n\\tset the style of cd btn \\\"gliderSpritesLivesIcn\\\" to \\\\\\n\\t\\t\\\"transparent\\\"\\n\\tset the style of cd fld \\\"gameOver\\\" to \\\\\\n\\t\\t\\\"shadow\\\"\\n\\tset the defaultTextFont of cd fld \\\"gameOver\\\" to \\\\\\n\\t\\t\\\"times\\\"\\n\\tset the defaultTextSize of cd fld \\\"gameOver\\\" to \\\\\\n\\t\\t\\\"18\\\"\\n\\tset the textAlign of cd fld \\\"gameOver\\\" to \\\"center\\\"\\n\\t\\n\\tput 1 into q \\n\\t-- need to tweak the rect of everything larger, \\n\\t-- to make the sprite show up\\n\\t\\n\\tset the style of cd btn \\\"gliderBg0\\\" to \\\\\\n\\t\\t\\\"transparent\\\"\\n\\tset the style of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\t\\\"transparent\\\"\\n\\tset the style of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\t\\\"transparent\\\"\\n\\tset the showLabel of cd btn \\\"gliderBg0\\\" to \\\\\\n\\t\\tfalse\\n\\tset the showLabel of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\tfalse\\n\\tset the showLabel of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\tfalse\\n\\tset the rect of cd btn \\\"gliderBg0\\\" to \\\\\\n\\t\\t-3, -1, 515, 345\\n\\tset the rect of cd btn \\\"gliderSpritesMe\\\" to \\\\\\n\\t\\t0,0,48+q,20+q\\n\\tset the rect of cd btn \\\"gliderSpritesShadow\\\" to \\\\\\n\\t\\t0,0,48+q,20+q\\n\\t\\n\\tput 20 into basey\\n\\tput 22 into h\\n\\tset the rect of cd fld \\\"roomName\\\" to \\\\\\n\\t\\t28-26, basey-18, 177, h\\n\\tset the rect of cd fld \\\"score\\\" to \\\\\\n\\t\\t245-26, basey-18, (245-26)+78, h\\n\\tset the rect of cd fld \\\"behindLives\\\" to \\\\\\n\\t\\t328-26, basey-18, (328-26)+207, h\\n\\tset the rect of cd fld \\\"lives\\\" to \\\\\\n\\t\\t(395-26), basey+3-18, (395-26)+22, h\\n\\tset the rect of cd btn \\\"gliderSpritesLivesIcn\\\" to \\\\\\n\\t\\t419-26, (basey-18)-2, (419-26)+42, h\\n\\tset the rect of cd fld \\\"gameOver\\\" to \\\\\\n\\t\\t23,23,23+451,23+236\\n\\tset the icon of cd btn \\\"gliderSpritesLivesIcn\\\" to \\\\\\n\\t\\tspritesRightForward\\n\\tset showLabel of cd btn \\\"gliderSpritesLivesIcn\\\" to \\\\\\n\\t\\tfalse\\n\\t\\n\\tplay \\\"glider_1_Aww\\\" load\\n\\tplay \\\"glider_1_BeamIn\\\" load\\n\\tplay \\\"glider_1_Clock\\\" load\\n\\tplay \\\"glider_1_Energize\\\" load\\n\\tplay \\\"glider_1_Extra\\\" load\\n\\tplay \\\"glider_1_GetBand\\\" load\\n\\tplay \\\"glider_1_Guitar\\\" load\\n\\tplay \\\"glider_1_Zap\\\" load\\n\\t\\n\\tset defaultTextFont of cd fld \\\"roomName\\\" to \\\"chicago\\\" \\n\\tset defaultTextFont of cd fld \\\"score\\\" to \\\"chicago\\\" \\n\\tset defaultTextFont of cd fld \\\"lives\\\" to \\\"chicago\\\" \\n\\tset the lockText of cd fld \\\"roomName\\\" to true \\n\\tset the lockText of cd fld \\\"score\\\" to true \\n\\tset the lockText of cd fld \\\"lives\\\" to true \\n\\tset the lockText of cd fld \\\"behindLives\\\" to true \\n\\tset the lockText of cd fld \\\"gameOver\\\" to true \\n\\t\\n\\trepeat with x = 1 to 16\\n\\t\\thide cd btn (\\\"gliderSprites\\\" & x)\\n\\t\\tset style of cd btn (\\\"gliderSprites\\\" & x) to \\\\\\n\\t\\t\\t\\\"transparent\\\"\\n\\t\\tset showLabel of cd btn (\\\"gliderSprites\\\" & x) to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset autoHilite of cd btn (\\\"gliderSprites\\\"& x) to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset icon of cd btn (\\\"gliderSprites\\\" & x) to \\\\\\n\\t\\t\\t0\\n\\tend repeat\\n\\t\\n\\tset the style of cd btn \\\"btnContinue\\\" to \\\"osdefault\\\"\\n\\tput -1 into curLevel\\n\\trefreshOnLevelChange\\nend initUI\\n\",\"name\":\"btnContinue\",\"sharedhilite\":true}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_graphics.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002060\",\"uuid\":\"f883a96e-33db-4c81-9128-cf855fe0c203\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforelemname\":40,\"increasingnumberforid\":2187,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|SU0XwHNo6Y0ee1GC8Xw1qSg|demo4\"}},{\"type\":6,\"id\":\"1002\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\\n\\non mousewithin\\n\\tif the mouse is \\\"down\\\" then\\n\\t\\tglobal chargeAmount\\n\\t\\tif chargeAmount is \\\"\\\" then\\n\\t\\t\\tput 0 into chargeAmount\\n\\t\\tend if\\n\\t\\tadd 1 to chargeAmount\\n\\t\\tshow cd fld \\\"charging\\\"\\n\\t\\tif chargeAmount >= 15 then\\n\\t\\t\\tput \\\"max charge!\\\" into howMuch\\n\\t\\telse\\n\\t\\t\\tput (1 + round(chargeAmount/3)) into howMuch\\n\\t\\tend if\\n\\t\\tput \\\"Charging... \\\" & newline & howMuch \\\\\\n\\t\\t\\tinto cd fld \\\"charging\\\"\\n\\telse\\n\\t\\tglobal chargeAmount\\n\\t\\tput 0 into chargeAmount\\n\\t\\thide cd fld \\\"charging\\\"\\n\\tend if\\nend mousewithin\\n\\non mouseup\\n\\tglobal chargeAmount\\n\\t\\n\\tput min(15, chargeAmount) into c\\n\\tput round(c/3) into c\\n\\tput 5 + c*c into c\\n\\t\\n\\tchoose \\\"oval\\\" tool\\n\\tput mouseh() into mx\\n\\tput mousev() into my\\n\\tput 4+random(10) into radius\\n\\tput 2+random(5)+round(c/2) into howmany\\n\\trepeat with i = 1 to howmany\\n\\t\\trepeat with j = 1 to howmany\\n\\t\\t\\tput mx + (i - round(howmany/2)) * c into x\\n\\t\\t\\tput my + (j - round(howmany/2)) * c into y\\n\\t\\t\\tdrag from x-radius, y-radius to x+radius, \\\\\\n\\t\\t\\t\\ty+radius\\n\\t\\tend repeat\\n\\tend repeat\\n\\tput 0 into chargeAmount\\n\\thide cd fld \\\"charging\\\"\\nend mouseup\\n\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXIYVRuxk3cWdZodi3GddVtFm7RQ5dqTh3Na5Rvvj3bVxZqnn3Afy0c4QOUSC8bMUOKZKwe0WOeXG4YaROFcm0dCVSTRu8aWTOPbuwfpQuYUU5ZhUuCec1c9SuWTc9bLWuJY4xezVudWw5ZfTuHdw1eHXwQQT86QwcMaTw/sycaVb45k2cBfX086xcVS387O1cLZ/w+23cfX144Zw8Ecl19B1ASRt96Vy8Obtx/rx8ZVJ55j18DfB19/z8XUB98IH8qMOABLSSAASg8sEEuKlBBKzYQQiwhaCEpOcghLy04ISoz+GEtJ5hhKD+kEa4oRBGrNAQSrCJ0Uak61FGvLixRqjHsMa0ljDGoPbxxritccas3HHJsIGIJaTjCCW8sMglqMvJJbSaSSWg+qinCKiAAIAA=\"}},{\"type\":4,\"id\":\"1004\",\"parent_id\":\"1003\",\"attrs\":{\"x\":6,\"y\":286,\"w\":455,\"h\":76,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":125,\"selend\":125,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 1\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002See and change the source code:\\nFrom Objects menu, click Card Info...\\nThen click the Script button in the lower right corner.\"}},{\"type\":4,\"id\":\"1006\",\"parent_id\":\"1003\",\"attrs\":{\"x\":7,\"y\":8,\"w\":403,\"h\":58,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":79,\"selend\":79,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 1\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":18,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_18_biuosdce\\u0002Click the Browse tool (looks like a hand)\\nthen click/hold somewhere over here!\"}},{\"type\":4,\"id\":\"1016\",\"parent_id\":\"1003\",\"attrs\":{\"x\":144,\"y\":213,\"w\":171,\"h\":41,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":2,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"charging\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":14,\"defaulttextstyle\":8,\"ftxt\":\"\\u0002chicago_14_biu+osdce\\u0002Charging... \\n1\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_spacegame.json",
    "content": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":\"ab71640b-61e2-45f2-a4b2-b417661bbde9\",\"elements\":[{\"type\":7,\"id\":\"921\",\"parent_id\":\"920\",\"insertIndex\":0,\"attrs\":{\"script\":\"\\n-- https://github.com/moltenform/vipercard\\n-- re-created in ViperCard by Ben Fisher\\n\\non startNewGameState\\n\\tglobal curLevel, numLives, maxGridX, maxGridY\\n\\tglobal curScore\\n\\tset the skipArrowkeyMessages to true\\n\\tput 40 into maxGridX -- not 30\\n\\tput 40 into maxGridY -- not 22\\n\\tput 1 into curLevel\\n\\tput 3 into numLives\\n\\tput 0 into curScore\\n\\trepeat with lvl = 1 to 6\\n\\t\\tput (lvl-1)+2975 into idYou\\n\\t\\tset the showLabel of cd btn id idYou to false\\n\\t\\tset the autoHilite of cd btn id idYou to false\\n\\t\\tset the style of cd btn id idYou to \\\\\\n\\t\\t\\t\\\"transparent\\\"\\n\\t\\tset the name of cd btn id idYou to \\\\\\n\\t\\t\\t\\\"spacegameSprites_n_you\\\"\\n\\t\\tset the rect of cd btn id idYou to 1,1,18,18\\n\\t\\t\\n\\t\\tput (lvl-1)+3005 into idOxygenFull\\n\\t\\tset the showLabel of cd btn id idOxygenFull to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset the autoHilite of cd btn id idOxygenFull to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset the style of cd btn id idOxygenFull to \\\\\\n\\t\\t\\t\\\"rectangle\\\"\\n\\t\\tset the rect of cd btn id idOxygenFull to \\\\\\n\\t\\t\\t5, 47, 5+83, 47+10\\n\\t\\t\\n\\t\\tput (lvl-1)+3011 into idOxygenCurrent\\n\\t\\tset showLabel of cd btn id idOxygenCurrent to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset autoHilite of cd btn id idOxygenCurrent to \\\\\\n\\t\\t\\tfalse\\n\\t\\tset style of cd btn id idOxygenCurrent to \\\\\\n\\t\\t\\t\\\"rectangle\\\"\\n\\t\\tset rect of cd btn id idOxygenCurrent to \\\\\\n\\t\\t\\t5, 47, 5+83, 47+10\\n\\t\\tset hilite of cd btn id idOxygenCurrent to \\\\\\n\\t\\t\\ttrue\\n\\t\\t\\n\\t\\tset the rect of cd btn id idYou to 1,1,18,18\\n\\t\\tput (lvl-1)+2981 into idStatus\\n\\t\\tset style of cd fld id idStatus to \\\"transparent\\\"\\n\\t\\tset the top of cd fld id idStatus to 5\\n\\t\\tset the left of cd fld id idStatus to 5\\n\\t\\tset the lockText of cd fld id idStatus to true\\n\\t\\tput \\\"\\\" into cd fld id idStatus\\n\\t\\t\\n\\t\\tput (lvl-1)+2992 into idStartPos\\n\\t\\thide cd btn id idStartPos\\n\\t\\tput (lvl-1)+2998 into idNewGame\\n\\t\\tshow cd btn id idNewGame\\n\\t\\tset the rect of cd btn id idNewGame to \\\\\\n\\t\\t\\t5, 65, 5+83, 65+33\\n\\t\\tset the name of cd btn id idNewGame to \\\\\\n\\t\\t\\t\\\"startNewGame\\\"\\n\\t\\tset the label of cd btn id idNewGame to \\\\\\n\\t\\t\\t\\\"Exit Game\\\"\\n\\t\\t\\n\\tend repeat\\n\\t\\n\\tglobal cKey, cPltf, cPts, cRamp, cTank, cDoorTop\\n\\tglobal cDoorBtm, cChute\\n\\tput 13 into cKey\\n\\tput 1 into cPltf\\n\\tput 7 into cPts\\n\\tput 5 into cRamp\\n\\tput 6 into cTank\\n\\tput 14 into cDoorTop\\n\\tput 15 into cDoorBtm\\n\\tput 8 into cChute\\n\\t\\n\\tplay \\\"spacegame_1_airlock\\\" load\\n\\tplay \\\"spacegame_1_bonus\\\" load\\n\\tplay \\\"spacegame_1_boot\\\" load\\n\\tplay \\\"spacegame_1_cannon\\\" load\\n\\tplay \\\"spacegame_1_chute\\\" load\\n\\tplay \\\"spacegame_1_extra\\\" load\\n\\tplay \\\"spacegame_1_fry\\\" load\\n\\tplay \\\"spacegame_1_jump\\\" load\\n\\tplay \\\"spacegame_1_materialize\\\" load\\n\\tplay \\\"spacegame_1_nooxy\\\" load\\n\\tplay \\\"spacegame_1_scream\\\" load\\n\\tplay \\\"spacegame_1_splat\\\" load\\n\\tplay \\\"spacegame_1_spring\\\" load\\n\\tplay \\\"spacegame_1_walk\\\" load\\nend startNewGameState\\n\\non updateScoreStatus\\n\\tglobal curLevel, curScore, numLives, curOxy\\n\\tif curLevel is \\\"\\\" then\\n\\t\\texit updateScoreStatus\\n\\tend if\\n\\t\\n\\tput (curLevel-1)+2981 into idStatus\\n\\tput \\\"Score: \\\" & curScore & \\\" Lives: \\\" & numLives \\\\\\n\\t\\tinto cd fld id idStatus\\n\\t\\n\\tput (curLevel-1)+3005 into idOxygenFull\\n\\tput (curLevel-1)+3011 into idOxygenCurrent\\n\\tset the width of cd btn id idOxygenFull to 100\\n\\tset the width of cd btn id idOxygenCurrent to \\\\\\n\\t\\tround(max(1, curOxy/(300/100)))\\nend updateScoreStatus\\n\\n-- we use the positions of the buttons as level data\\n-- this way, you can easily edit a level by moving the \\n-- buttons around\\n-- because the grid size is 14pixels x 14 pixels, \\n-- we can convert from\\n-- pixel position to grid position by dividing by 14.\\n\\non loadLevel\\n\\tglobal curLevel, numLives, curOxy, curGrid\\n\\tglobal maxGridX, maxGridY, meGridX, meGridY, hasKey\\n\\tglobal cKey, cPltf, cPts, cRamp, cTank, cDoorTop\\n\\tglobal cDoorBtm, cChute\\n\\tglobal keysNeeded, doorsNeeded\\n\\tglobal itemLookups\\n\\tput \\\"\\\" into curGrid\\n\\tset the itemDelimiter to \\\",\\\"\\n\\tput 0 into hasKey\\n\\t\\n\\tput 300 into curOxy\\n\\tput 0 into keysNeeded\\n\\tput 0 into doorsNeeded\\n\\t\\n\\tput \\\"\\\" into templateLine\\n\\trepeat with y = 1 to maxGridX\\n\\t\\tput 0 into item y of templateLine\\n\\tend repeat\\n\\trepeat with x = 1 to maxGridY\\n\\t\\tput templateLine into line x of curGrid\\n\\tend repeat\\n\\t\\n\\tput 1928+172*(curLevel-1) into basisId\\n\\tput \\\"\\\" into itemLookups\\n\\trepeat with x = basisId to basisId + 172-3\\n\\t\\tif the icon of cd btn id x is not 0 then\\n\\t\\t\\tshow cd btn id x\\n\\t\\t\\tput the icon of cd btn id x into whatType\\n\\t\\t\\tput trunc((the left of cd btn id x)/14) into \\\\\\n\\t\\t\\t\\tgridX\\n\\t\\t\\tput trunc((the top of cd btn id x)/14) into \\\\\\n\\t\\t\\t\\tgridY\\n\\t\\t\\t\\n\\t\\t\\tput line gridX of curGrid into curLine\\n\\t\\t\\tput whatType into item gridY of curLine\\n\\t\\t\\tput curLine into line gridX of curGrid\\n\\t\\t\\t\\n\\t\\t\\tif whatType is cKey or whatType is cPts or \\\\\\n\\t\\t\\t\\twhatType is cTank or \\\\\\n\\t\\t\\t\\t\\twhatType is cDoorBtm then\\n\\t\\t\\t\\tput \\\"\\\" into itemLookup\\n\\t\\t\\t\\tput whatType into item 1 of itemLookup\\n\\t\\t\\t\\tput \\\"1\\\" into item 2 of itemLookup\\n\\t\\t\\t\\tput x into item 3 of itemLookup\\n\\t\\t\\t\\tput gridX into item 4 of itemLookup\\n\\t\\t\\t\\tput gridY into item 5 of itemLookup\\n\\t\\t\\t\\tput itemLookup & cr after itemLookups\\n\\t\\t\\tend if\\n\\t\\t\\tif whatType is cKey then\\n\\t\\t\\t\\tadd 1 to keysNeeded\\n\\t\\t\\tend if\\n\\t\\t\\tif whatType is cDoorBtm then\\n\\t\\t\\t\\tadd 1 to doorsNeeded\\n\\t\\t\\tend if\\n\\t\\tend if\\n\\tend repeat\\n\\t\\n\\tput (curLevel-1)+2992 into idStartPos\\n\\tput trunc((the left of cd btn id idStartPos)/14) \\\\\\n\\t\\tinto meGridX\\n\\tput trunc((the top of cd btn id idStartPos)/14) \\\\\\n\\t\\tinto meGridY\\n\\t\\n\\tput (curLevel-1)+2975 into idYou\\n\\tset the icon of cd btn id idYou to 40+1\\n\\tset the left of cd btn id idYou to meGridX*14\\n\\tset the top of cd btn id idYou to meGridY*14\\n\\tupdateScoreStatus\\nend loadLevel\\n\\non moveYou dir\\n\\tglobal curLevel, numLives, curOxy, curGrid\\n\\tglobal maxGridX, maxGridY, meGridX, meGridY\\n\\tglobal hasKey, cheatFloat, justBeatLevel\\n\\tglobal cKey, cPltf, cPts, cRamp, cTank, cDoorTop\\n\\tglobal cDoorBtm, cChute\\n\\tif curLevel is \\\"\\\" then\\n\\t\\texit moveYou\\n\\tend if\\n\\t\\n\\tglobal itemLookups\\n\\tput (curLevel-1)+2975 into idYou\\n\\tput 1 into canSurviveFall\\n\\tif cheatFloat is not \\\"\\\" then\\n\\t\\t-- completely override movement, \\n\\t\\t-- the floating cheat is on.\\n\\t\\tif dir is 1 then\\n\\t\\t\\tadd 1 to meGridX\\n\\t\\telse if dir is -1 then\\n\\t\\t\\tsubtract 1 from meGridX\\n\\t\\telse if dir is 10 then\\n\\t\\t\\tsubtract 1 from meGridY\\n\\t\\telse if dir is -10 then\\n\\t\\t\\tadd 1 to meGridY\\n\\t\\tend if\\n\\t\\t\\n\\t\\tput item meGridY of (line meGridX of curGrid) \\\\\\n\\t\\t\\tinto isThere\\n\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\tmeGridX*14, meGridY*14\\n\\t\\t\\n\\t\\tput 0 into justBeatLevel\\n\\t\\tcheckItemGet isThere\\n\\t\\tif justBeatLevel is 1 then\\n\\t\\t\\tonBeatLevel\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\t\\tupdateScoreStatus\\n\\t\\texit moveYou\\n\\tend if\\n\\t\\n\\tif dir is 1 or dir is -1 then\\n\\t\\t-- you pressed left or right\\n\\t\\tsubtract 1 from curOxy\\n\\t\\tput meGridX+dir into destx\\n\\t\\tput meGridY into desty\\n\\t\\tput item (desty) of (line destx of curGrid) \\\\\\n\\t\\t\\tinto isThere\\n\\t\\tif isThere is cPltf then\\n\\t\\t\\t-- can't walk into a platform\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\t\\t\\n\\t\\t-- do animation\\n\\t\\tif dir is 1 then\\n\\t\\t\\tset the icon of cd btn id idYou to 30+1\\n\\t\\t\\tset the left of cd btn id idYou to meGridX*14 + 7\\n\\t\\t\\twait 50 ms\\n\\t\\t\\tset the icon of cd btn id idYou to 40+1\\n\\t\\t\\tset the left of cd btn id idYou to destx\\n\\t\\telse\\n\\t\\t\\tset the icon of cd btn id idYou to 31+1\\n\\t\\t\\tset the left of cd btn id idYou to meGridX*14 - 7\\n\\t\\t\\twait 50 ms\\n\\t\\t\\tset the icon of cd btn id idYou to 41+1\\n\\t\\t\\tset the left of cd btn id idYou to destx\\n\\t\\tend if\\n\\t\\tput destx into meGridX\\n\\t\\tput desty into meGridY\\n\\telse if dir is 100 then\\n\\t\\t-- you pressed jump\\n\\t\\tsubtract 3.75 from curOxy\\n\\t\\t\\n\\t\\t-- hop one up and two across\\n\\t\\tif (the icon of cd btn id idYou) mod 2 is 0 then\\n\\t\\t\\tput -1 into jumpDir\\n\\t\\telse\\n\\t\\t\\tput 1 into jumpDir\\n\\t\\tend if\\n\\t\\tput meGridX into tempDestX\\n\\t\\tput meGridY - 1 into tempDestY\\n\\t\\tput item tempDestY of \\\\\\n\\t\\t\\t(line tempDestX of curGrid) into isThere\\n\\t\\tif isThere is cPltf then\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\t\\t\\n\\t\\tput meGridX + 1*jumpDir into tempDestX\\n\\t\\tput meGridY - 1 into tempDestY\\n\\t\\tput item tempDestY of \\\\\\n\\t\\t\\t(line tempDestX of curGrid) into isThere\\n\\t\\tif isThere is cPltf or isThere is cRamp then\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\t\\t\\n\\t\\tput meGridX + 2*jumpDir into tempDestX\\n\\t\\tput meGridY - 1 into tempDestY\\n\\t\\tput item tempDestY of \\\\\\n\\t\\t\\t(line tempDestX of curGrid) into isThere\\n\\t\\tput false into minijump\\n\\t\\tif isThere is cPltf or isThere is cRamp then\\n\\t\\t\\t-- we can still do it, \\n\\t\\t\\t-- we'll just do a minijump\\n\\t\\t\\tput true into minijump\\n\\t\\tend if\\n\\t\\t\\n\\t\\t-- play sound + animation\\n\\t\\tplay \\\"spacegame_1_jump\\\"\\n\\t\\tput meGridX into tempDestX\\n\\t\\tput meGridY - 1 into tempDestY\\n\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\ttempDestX*14, tempDestY*14\\n\\t\\twait 50 ms\\n\\t\\tput meGridX + 1*jumpDir into tempDestX\\n\\t\\tput meGridY - 1 into tempDestY\\n\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\ttempDestX*14, tempDestY*14\\n\\t\\t\\n\\t\\tif not minijump then\\n\\t\\t\\twait 50 ms\\n\\t\\t\\tput meGridX + 2*jumpDir into tempDestX\\n\\t\\t\\tput meGridY - 1 into tempDestY\\n\\t\\t\\tset the topLeft of cd btn id idYou to tempDestX*14, tempDestY*14\\n\\t\\tend if\\n\\t\\tput 3 into canSurviveFall\\n\\t\\tput tempDestX into meGridX\\n\\t\\tput tempDestY into meGridY\\n\\telse if dir is 10 then\\n\\t\\t-- you pressed up\\n\\t\\tsubtract 1 from curOxy\\n\\t\\tput item meGridY of \\\\\\n\\t\\t\\t(line meGridX of curGrid) into isThere\\n\\t\\t\\n\\t\\t-- if you are stuck inside a platform,\\n\\t\\t-- presumably you are coming up from a ramp\\n\\t\\tif isThere is cRamp or isThere is cPltf  then\\n\\t\\t\\tput meGridY-1 into meGridY\\n\\t\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\t\\tmeGridX*14, meGridY*14\\n\\t\\telse\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\telse if dir is -10 then\\n\\t\\t-- you pressed down\\n\\t\\tsubtract 1 from curOxy\\n\\t\\tput item (meGridY+1) of \\\\\\n\\t\\t\\t(line meGridX of curGrid) into isThere1\\n\\t\\tput item (meGridY+2) of \\\\\\n\\t\\t\\t(line meGridX of curGrid) into isThere2\\n\\t\\tif isThere1 is cRamp or isThere2 is cRamp then\\n\\t\\t\\tput meGridY+1 into meGridY\\n\\t\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\t\\tmeGridX*14, meGridY*14\\n\\t\\telse\\n\\t\\t\\texit moveYou\\n\\t\\tend if\\n\\tend if\\n\\t\\n\\t-- see if there's an item/key/door\\n\\tput item meGridY of (line meGridX of curGrid) \\\\\\n\\t\\tinto isThere\\n\\tput 0 into justBeatLevel\\n\\tcheckItemGet isThere\\n\\tif justBeatLevel is 1 then\\n\\t\\tonBeatLevel\\n\\t\\texit moveYou\\n\\tend if\\n\\tif isThere is cChute then\\n\\t\\tput 100 into canSurviveFall\\n\\tend if\\n\\t\\n\\t-- loop, you are falling downwards\\n\\trepeat\\n\\t\\t-- did you end up on solid ground?\\n\\t\\tput item (meGridY+1) of \\\\\\n\\t\\t\\t(line meGridX of curGrid) into isThereBeneath\\n\\t\\tif isThereBeneath is cPltf or \\\\\\n\\t\\t\\tisThereBeneath is cRamp then\\n\\t\\t\\t\\n\\t\\t\\texit repeat\\n\\t\\telse if isThereBeneath is cChute then\\n\\t\\t\\tput 100 into canSurviveFall\\n\\t\\tend if\\n\\t\\tif meGridY >= maxGridY then\\n\\t\\t\\texit repeat\\n\\t\\tend if\\n\\t\\t\\n\\t\\t-- keep falling\\n\\t\\tput meGridY+1 into meGridY\\n\\t\\tsubtract 1 from canSurviveFall\\n\\t\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\t\\tmeGridX*14, meGridY*14\\n\\t\\twait 50 ms\\n\\tend repeat\\n\\t\\n\\tset the topLeft of cd btn id idYou to \\\\\\n\\t\\tmeGridX*14, meGridY*14\\n\\t\\n\\tif canSurviveFall < 0 then\\n\\t\\tplay \\\"spacegame_1_splat\\\"\\n\\t\\tset the icon of cd btn id idYou to 65+1\\n\\t\\tbeginDeath\\n\\telse if meGridY >= (maxGridY-3) then\\n\\t\\tplay \\\"spacegame_1_scream\\\"\\n\\t\\tbeginDeath\\n\\telse if curOxy <= 0 then\\n\\t\\tplay \\\"spacegame_1_nooxy\\\"\\n\\t\\twait 400 ms\\n\\t\\tbeginDeath\\n\\tend if\\n\\tupdateScoreStatus\\nend moveYou\\n\\non beginDeath\\n\\tglobal curLevel, numLives, curOxy, curGrid\\n\\tglobal maxGridX, maxGridY, meGridX, meGridY\\n\\tglobal hasKey, curScore\\n\\t\\n\\twait 50 ms\\n\\tsubtract 1 from numLives\\n\\tif numLives <= 0 then\\n\\t\\tput \\\"\\\" into curLevel\\n\\t\\tanswer (\\\"Game Over\\\" & cr & cr & \\\\\\n\\t\\t\\t\\\"Score: \\\" & curScore)\\n\\t\\tgo to cd 1\\n\\telse\\n\\t\\tloadLevel\\n\\t\\tupdateScoreStatus\\n\\tend if\\nend beginDeath\\n\\non onBeatLevel\\n\\tglobal curLevel, numLives, curOxy, curGrid\\n\\tglobal maxGridX, maxGridY, meGridX, meGridY\\n\\tglobal hasKey, curScore\\n\\tput curLevel + 1 into curLevel\\n\\tif curLevel > 6 then\\n\\t\\tanswer (\\\"You beat the game! Score \\\" & curScore)\\n\\t\\tput \\\"\\\" into curLevel\\n\\t\\tgo to cd 1\\n\\t\\texit onBeatLevel\\n\\tend if\\n\\tgo to cd (curLevel + 1)\\n\\tloadLevel\\n\\tadd 200 to curScore\\n\\tupdateScoreStatus\\nend onBeatLevel\\n\\non checkItemGet isThere\\n\\tglobal curLevel, numLives, curOxy, curGrid\\n\\tglobal maxGridX, maxGridY, meGridX, meGridY\\n\\tglobal hasKey, curScore, justBeatLevel\\n\\tglobal cKey, cPltf, cPts, cRamp, cTank\\n\\tglobal cDoorTop, cDoorBtm, cChute\\n\\tglobal keysNeeded, doorsNeeded\\n\\t\\n\\tglobal itemLookups\\n\\trepeat with x = 1 to the number of lines in itemLookups\\n\\t\\tput line x of itemLookups into theLine\\n\\t\\tput item 4 of (theLine) into gridX\\n\\t\\tput item 5 of (theLine) into gridY\\n\\t\\tif gridX is meGridX and gridY is meGridY and \\\\\\n\\t\\t\\t(item 2 of theLine is \\\"1\\\") then\\n\\t\\t\\t-- we found an item!\\n\\t\\t\\tput true into gettingIt\\n\\t\\t\\tput item 1 of theLine into whatType \\n\\t\\t\\tif whatType is cKey then\\n\\t\\t\\t\\tplay \\\"spacegame_1_chute\\\"\\n\\t\\t\\t\\tadd 1 to hasKey\\n\\t\\t\\telse if whatType is cPts then\\n\\t\\t\\t\\tplay \\\"spacegame_1_extra\\\"\\n\\t\\t\\t\\tadd 100 to curScore\\n\\t\\t\\telse if whatType is cTank then\\n\\t\\t\\t\\tplay \\\"spacegame_1_extra\\\"\\n\\t\\t\\t\\tadd 50 to curScore\\n\\t\\t\\t\\tadd 75 to curOxy\\n\\t\\t\\t\\tput min(300, curOxy) into curOxy\\n\\t\\t\\telse if whatType is cDoorBtm then\\n\\t\\t\\t\\tif hasKey <= 0 then\\n\\t\\t\\t\\t\\tput false into gettingIt\\n\\t\\t\\t\\t\\tanswer \\\"key needed.\\\"\\n\\t\\t\\t\\telse\\n\\t\\t\\t\\t\\tsubtract 1 from hasKey\\n\\t\\t\\t\\t\\tsubtract 1 from doorsNeeded\\n\\t\\t\\t\\t\\tif doorsNeeded <= 0 then\\n\\t\\t\\t\\t\\t\\tplay \\\"spacegame_1_bonus\\\"\\n\\t\\t\\t\\t\\t\\tput 1 into justBeatLevel\\n\\t\\t\\t\\t\\telse\\n\\t\\t\\t\\t\\t\\tplay \\\"spacegame_1_airlock\\\"\\n\\t\\t\\t\\t\\tend if\\n\\t\\t\\t\\tend if\\n\\t\\t\\tend if\\n\\t\\t\\t\\n\\t\\t\\t-- delete the item since \\n\\t\\t\\t-- it's not there anymore\\n\\t\\t\\tif gettingIt then\\n\\t\\t\\t\\tput \\\"0\\\" into item 2 of theLine\\n\\t\\t\\t\\tput theLine into line x of itemLookups\\n\\t\\t\\t\\thide cd btn id (item 3 of theLine)\\n\\t\\t\\tend if\\n\\t\\tend if\\n\\tend repeat\\nend checkItemGet\\n\\non afterKeyDown\\n\\tglobal curLevel, lastDirPressed, cheatInvincible\\n\\tglobal numLives, cheatFloat\\n\\tif keyRepeated() then\\n\\t\\texit afterKeyDown\\n\\tend if\\n\\tif curLevel is \\\"\\\" then\\n\\t\\texit afterKeyDown\\n\\tend if\\n\\t\\n\\tif keychar() is \\\"ArrowLeft\\\" then\\n\\t\\tmoveYou -1\\n\\telse if keychar() is \\\"ArrowRight\\\" then\\n\\t\\tmoveYou 1\\n\\telse if keychar() is \\\"ArrowUp\\\" then\\n\\t\\tmoveYou 10\\n\\telse if keychar() is \\\"ArrowDown\\\" then\\n\\t\\tmoveYou -10\\n\\telse if keychar() is \\\" \\\" then\\n\\t\\tmoveYou 100\\n\\telse if keyChar() is \\\"T\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"cheatcode:float\\\"\\n\\t\\tif cheatFloat is not \\\"\\\" then\\n\\t\\t\\tput \\\"\\\" into cheatFloat\\n\\t\\telse\\n\\t\\t\\tput \\\"1\\\" into cheatFloat\\n\\t\\tend if\\n\\telse if keyChar() is \\\"X\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"going to next level\\\"\\n\\t\\tonBeatLevel\\n\\telse if keyChar() is \\\"L\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"cheatcode:new life\\\"\\n\\t\\tadd 1 to numLives\\n\\t\\t\\n\\telse if keyChar() is \\\"I\\\" and shiftKey() is down and \\\\\\n\\t\\tnot keyRepeated() then\\n\\t\\tanswer \\\"toggle cheatcode:invincible\\\"\\n\\t\\tif cheatInvincible is true then\\n\\t\\t\\tput false into cheatInvincible\\n\\t\\telse\\n\\t\\t\\tput true into cheatInvincible\\n\\t\\tend if\\n\\tend if\\n\\tupdateScoreStatus\\nend afterKeyDown\\n\\non mouseUp\\n\\tif \\\"startNewGame\\\" is in the short name of \\\\\\n\\t\\tthe target then\\n\\t\\tgo to cd 1\\n\\tend if\\nend mouseUp\\n\",\"name\":\"\",\"compatibilitymode\":false,\"increasingnumberforelemname\":70,\"increasingnumberforelemnamefld\":1,\"increasingnumberforid\":3026,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|SU0XwHNo6Y0ee1GC8Xw1qSg|demo5\",\"cardorder\":\"1001|1927|2099|2271|2443|2615|2787|2966\"}},{\"type\":6,\"id\":\"1000\",\"parent_id\":\"921\",\"insertIndex\":1,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1001\",\"parent_id\":\"1000\",\"insertIndex\":2,\"attrs\":{\"script\":\"-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click\\n-- Script\\n\",\"name\":\"intro1\",\"paint\":\"\",\"marked\":false}},{\"type\":4,\"id\":\"1003\",\"parent_id\":\"1001\",\"insertIndex\":3,\"attrs\":{\"x\":130,\"y\":192,\"w\":248,\"h\":107,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":49,\"selend\":49,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"center\",\"name\":\"my field 2\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002A ViperCard re-creation of the \\nfirst 5 levels of\\n1989's Spacestation Pheta 1.5,\\nhttps://www.tandtsoftware.com/ \\nre-created in ViperCard.\\n\\n\\n\\n\\n\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"1005\",\"parent_id\":\"1001\",\"insertIndex\":4,\"attrs\":{\"x\":60,\"y\":50,\"w\":385,\"h\":136,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":71,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSpritesTitle\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1006\",\"parent_id\":\"1001\",\"insertIndex\":5,\"attrs\":{\"x\":108,\"y\":289,\"w\":112,\"h\":46,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Level Editor\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer (\\\"To edit any level, choose the button \\\" & \\\\\\n\\t\\t\\\"tool. Then, Go to the next card to \\\" & \\\\\\n\\t\\t\\\"move to the first level. You can now click a\\\" & \\\\\\n\\t\\t\\\" platform or item to select and move it. \\\" & \\\\\\n\\t\\t\\\"To play the level, choose the browse (hand) tool, \\\" & \\\\\\n\\t\\t\\\"click \\\" & \\\"Exit Game, and then click New Game.\\\")\\nend mouseUp\\n\",\"name\":\"card button \\\"my button 5\\\"\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1007\",\"parent_id\":\"1001\",\"insertIndex\":6,\"attrs\":{\"x\":276,\"y\":290,\"w\":118,\"h\":46,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"New Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tgo to cd 8\\nend mouseUp\\n\\n-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click\\n-- Script\\n\",\"name\":\"card button \\\"my button 5\\\"\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2964\",\"parent_id\":\"1001\",\"insertIndex\":7,\"attrs\":{\"x\":124,\"y\":10,\"w\":259,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":73,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSpritesTitle\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"1927\",\"parent_id\":\"1000\",\"insertIndex\":8,\"attrs\":{\"script\":\"-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"2098\",\"parent_id\":\"1927\",\"insertIndex\":9,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2097\",\"parent_id\":\"1927\",\"insertIndex\":10,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2096\",\"parent_id\":\"1927\",\"insertIndex\":11,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2095\",\"parent_id\":\"1927\",\"insertIndex\":12,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2094\",\"parent_id\":\"1927\",\"insertIndex\":13,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2093\",\"parent_id\":\"1927\",\"insertIndex\":14,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2092\",\"parent_id\":\"1927\",\"insertIndex\":15,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2091\",\"parent_id\":\"1927\",\"insertIndex\":16,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2090\",\"parent_id\":\"1927\",\"insertIndex\":17,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2089\",\"parent_id\":\"1927\",\"insertIndex\":18,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2088\",\"parent_id\":\"1927\",\"insertIndex\":19,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2087\",\"parent_id\":\"1927\",\"insertIndex\":20,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2086\",\"parent_id\":\"1927\",\"insertIndex\":21,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2085\",\"parent_id\":\"1927\",\"insertIndex\":22,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2084\",\"parent_id\":\"1927\",\"insertIndex\":23,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2083\",\"parent_id\":\"1927\",\"insertIndex\":24,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2082\",\"parent_id\":\"1927\",\"insertIndex\":25,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2081\",\"parent_id\":\"1927\",\"insertIndex\":26,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2080\",\"parent_id\":\"1927\",\"insertIndex\":27,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2079\",\"parent_id\":\"1927\",\"insertIndex\":28,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2078\",\"parent_id\":\"1927\",\"insertIndex\":29,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2077\",\"parent_id\":\"1927\",\"insertIndex\":30,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2076\",\"parent_id\":\"1927\",\"insertIndex\":31,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2075\",\"parent_id\":\"1927\",\"insertIndex\":32,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2074\",\"parent_id\":\"1927\",\"insertIndex\":33,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2073\",\"parent_id\":\"1927\",\"insertIndex\":34,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2072\",\"parent_id\":\"1927\",\"insertIndex\":35,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2071\",\"parent_id\":\"1927\",\"insertIndex\":36,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2070\",\"parent_id\":\"1927\",\"insertIndex\":37,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2069\",\"parent_id\":\"1927\",\"insertIndex\":38,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2068\",\"parent_id\":\"1927\",\"insertIndex\":39,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2067\",\"parent_id\":\"1927\",\"insertIndex\":40,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2066\",\"parent_id\":\"1927\",\"insertIndex\":41,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2065\",\"parent_id\":\"1927\",\"insertIndex\":42,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2064\",\"parent_id\":\"1927\",\"insertIndex\":43,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2063\",\"parent_id\":\"1927\",\"insertIndex\":44,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2062\",\"parent_id\":\"1927\",\"insertIndex\":45,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2061\",\"parent_id\":\"1927\",\"insertIndex\":46,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2060\",\"parent_id\":\"1927\",\"insertIndex\":47,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2059\",\"parent_id\":\"1927\",\"insertIndex\":48,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2058\",\"parent_id\":\"1927\",\"insertIndex\":49,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2057\",\"parent_id\":\"1927\",\"insertIndex\":50,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2056\",\"parent_id\":\"1927\",\"insertIndex\":51,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2055\",\"parent_id\":\"1927\",\"insertIndex\":52,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2054\",\"parent_id\":\"1927\",\"insertIndex\":53,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2053\",\"parent_id\":\"1927\",\"insertIndex\":54,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2052\",\"parent_id\":\"1927\",\"insertIndex\":55,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2051\",\"parent_id\":\"1927\",\"insertIndex\":56,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2050\",\"parent_id\":\"1927\",\"insertIndex\":57,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2049\",\"parent_id\":\"1927\",\"insertIndex\":58,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2048\",\"parent_id\":\"1927\",\"insertIndex\":59,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2047\",\"parent_id\":\"1927\",\"insertIndex\":60,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2046\",\"parent_id\":\"1927\",\"insertIndex\":61,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2045\",\"parent_id\":\"1927\",\"insertIndex\":62,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2044\",\"parent_id\":\"1927\",\"insertIndex\":63,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2043\",\"parent_id\":\"1927\",\"insertIndex\":64,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2042\",\"parent_id\":\"1927\",\"insertIndex\":65,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2041\",\"parent_id\":\"1927\",\"insertIndex\":66,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2040\",\"parent_id\":\"1927\",\"insertIndex\":67,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2039\",\"parent_id\":\"1927\",\"insertIndex\":68,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2038\",\"parent_id\":\"1927\",\"insertIndex\":69,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2037\",\"parent_id\":\"1927\",\"insertIndex\":70,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2036\",\"parent_id\":\"1927\",\"insertIndex\":71,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2035\",\"parent_id\":\"1927\",\"insertIndex\":72,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2034\",\"parent_id\":\"1927\",\"insertIndex\":73,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2033\",\"parent_id\":\"1927\",\"insertIndex\":74,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2032\",\"parent_id\":\"1927\",\"insertIndex\":75,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2031\",\"parent_id\":\"1927\",\"insertIndex\":76,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2030\",\"parent_id\":\"1927\",\"insertIndex\":77,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2029\",\"parent_id\":\"1927\",\"insertIndex\":78,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2028\",\"parent_id\":\"1927\",\"insertIndex\":79,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2027\",\"parent_id\":\"1927\",\"insertIndex\":80,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2026\",\"parent_id\":\"1927\",\"insertIndex\":81,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2025\",\"parent_id\":\"1927\",\"insertIndex\":82,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2024\",\"parent_id\":\"1927\",\"insertIndex\":83,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2023\",\"parent_id\":\"1927\",\"insertIndex\":84,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2022\",\"parent_id\":\"1927\",\"insertIndex\":85,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2021\",\"parent_id\":\"1927\",\"insertIndex\":86,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2020\",\"parent_id\":\"1927\",\"insertIndex\":87,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2019\",\"parent_id\":\"1927\",\"insertIndex\":88,\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2018\",\"parent_id\":\"1927\",\"insertIndex\":89,\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2017\",\"parent_id\":\"1927\",\"insertIndex\":90,\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2016\",\"parent_id\":\"1927\",\"insertIndex\":91,\"attrs\":{\"x\":476,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2015\",\"parent_id\":\"1927\",\"insertIndex\":92,\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2014\",\"parent_id\":\"1927\",\"insertIndex\":93,\"attrs\":{\"x\":448,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2013\",\"parent_id\":\"1927\",\"insertIndex\":94,\"attrs\":{\"x\":448,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2012\",\"parent_id\":\"1927\",\"insertIndex\":95,\"attrs\":{\"x\":434,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2011\",\"parent_id\":\"1927\",\"insertIndex\":96,\"attrs\":{\"x\":434,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2010\",\"parent_id\":\"1927\",\"insertIndex\":97,\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2009\",\"parent_id\":\"1927\",\"insertIndex\":98,\"attrs\":{\"x\":420,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2008\",\"parent_id\":\"1927\",\"insertIndex\":99,\"attrs\":{\"x\":420,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2007\",\"parent_id\":\"1927\",\"insertIndex\":100,\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2006\",\"parent_id\":\"1927\",\"insertIndex\":101,\"attrs\":{\"x\":406,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2005\",\"parent_id\":\"1927\",\"insertIndex\":102,\"attrs\":{\"x\":406,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2004\",\"parent_id\":\"1927\",\"insertIndex\":103,\"attrs\":{\"x\":406,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2003\",\"parent_id\":\"1927\",\"insertIndex\":104,\"attrs\":{\"x\":392,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2002\",\"parent_id\":\"1927\",\"insertIndex\":105,\"attrs\":{\"x\":392,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2001\",\"parent_id\":\"1927\",\"insertIndex\":106,\"attrs\":{\"x\":392,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2000\",\"parent_id\":\"1927\",\"insertIndex\":107,\"attrs\":{\"x\":378,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1999\",\"parent_id\":\"1927\",\"insertIndex\":108,\"attrs\":{\"x\":378,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1998\",\"parent_id\":\"1927\",\"insertIndex\":109,\"attrs\":{\"x\":364,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1997\",\"parent_id\":\"1927\",\"insertIndex\":110,\"attrs\":{\"x\":364,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1996\",\"parent_id\":\"1927\",\"insertIndex\":111,\"attrs\":{\"x\":364,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1995\",\"parent_id\":\"1927\",\"insertIndex\":112,\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1994\",\"parent_id\":\"1927\",\"insertIndex\":113,\"attrs\":{\"x\":364,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1993\",\"parent_id\":\"1927\",\"insertIndex\":114,\"attrs\":{\"x\":350,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1992\",\"parent_id\":\"1927\",\"insertIndex\":115,\"attrs\":{\"x\":350,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1991\",\"parent_id\":\"1927\",\"insertIndex\":116,\"attrs\":{\"x\":350,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1990\",\"parent_id\":\"1927\",\"insertIndex\":117,\"attrs\":{\"x\":350,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1989\",\"parent_id\":\"1927\",\"insertIndex\":118,\"attrs\":{\"x\":350,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1988\",\"parent_id\":\"1927\",\"insertIndex\":119,\"attrs\":{\"x\":350,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1987\",\"parent_id\":\"1927\",\"insertIndex\":120,\"attrs\":{\"x\":350,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1986\",\"parent_id\":\"1927\",\"insertIndex\":121,\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1985\",\"parent_id\":\"1927\",\"insertIndex\":122,\"attrs\":{\"x\":336,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1984\",\"parent_id\":\"1927\",\"insertIndex\":123,\"attrs\":{\"x\":322,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1983\",\"parent_id\":\"1927\",\"insertIndex\":124,\"attrs\":{\"x\":322,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1982\",\"parent_id\":\"1927\",\"insertIndex\":125,\"attrs\":{\"x\":322,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1981\",\"parent_id\":\"1927\",\"insertIndex\":126,\"attrs\":{\"x\":308,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1980\",\"parent_id\":\"1927\",\"insertIndex\":127,\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1979\",\"parent_id\":\"1927\",\"insertIndex\":128,\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1978\",\"parent_id\":\"1927\",\"insertIndex\":129,\"attrs\":{\"x\":294,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1977\",\"parent_id\":\"1927\",\"insertIndex\":130,\"attrs\":{\"x\":294,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1976\",\"parent_id\":\"1927\",\"insertIndex\":131,\"attrs\":{\"x\":294,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1975\",\"parent_id\":\"1927\",\"insertIndex\":132,\"attrs\":{\"x\":280,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1974\",\"parent_id\":\"1927\",\"insertIndex\":133,\"attrs\":{\"x\":280,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1973\",\"parent_id\":\"1927\",\"insertIndex\":134,\"attrs\":{\"x\":280,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1972\",\"parent_id\":\"1927\",\"insertIndex\":135,\"attrs\":{\"x\":266,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1971\",\"parent_id\":\"1927\",\"insertIndex\":136,\"attrs\":{\"x\":266,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1970\",\"parent_id\":\"1927\",\"insertIndex\":137,\"attrs\":{\"x\":266,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1969\",\"parent_id\":\"1927\",\"insertIndex\":138,\"attrs\":{\"x\":266,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1968\",\"parent_id\":\"1927\",\"insertIndex\":139,\"attrs\":{\"x\":266,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1967\",\"parent_id\":\"1927\",\"insertIndex\":140,\"attrs\":{\"x\":266,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1966\",\"parent_id\":\"1927\",\"insertIndex\":141,\"attrs\":{\"x\":266,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1965\",\"parent_id\":\"1927\",\"insertIndex\":142,\"attrs\":{\"x\":266,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1964\",\"parent_id\":\"1927\",\"insertIndex\":143,\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1963\",\"parent_id\":\"1927\",\"insertIndex\":144,\"attrs\":{\"x\":266,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1962\",\"parent_id\":\"1927\",\"insertIndex\":145,\"attrs\":{\"x\":252,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1961\",\"parent_id\":\"1927\",\"insertIndex\":146,\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1960\",\"parent_id\":\"1927\",\"insertIndex\":147,\"attrs\":{\"x\":238,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1959\",\"parent_id\":\"1927\",\"insertIndex\":148,\"attrs\":{\"x\":224,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1958\",\"parent_id\":\"1927\",\"insertIndex\":149,\"attrs\":{\"x\":210,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1957\",\"parent_id\":\"1927\",\"insertIndex\":150,\"attrs\":{\"x\":196,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1956\",\"parent_id\":\"1927\",\"insertIndex\":151,\"attrs\":{\"x\":196,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1955\",\"parent_id\":\"1927\",\"insertIndex\":152,\"attrs\":{\"x\":196,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1954\",\"parent_id\":\"1927\",\"insertIndex\":153,\"attrs\":{\"x\":182,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1953\",\"parent_id\":\"1927\",\"insertIndex\":154,\"attrs\":{\"x\":182,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1952\",\"parent_id\":\"1927\",\"insertIndex\":155,\"attrs\":{\"x\":182,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1951\",\"parent_id\":\"1927\",\"insertIndex\":156,\"attrs\":{\"x\":182,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1950\",\"parent_id\":\"1927\",\"insertIndex\":157,\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1949\",\"parent_id\":\"1927\",\"insertIndex\":158,\"attrs\":{\"x\":182,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1948\",\"parent_id\":\"1927\",\"insertIndex\":159,\"attrs\":{\"x\":182,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1947\",\"parent_id\":\"1927\",\"insertIndex\":160,\"attrs\":{\"x\":168,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1946\",\"parent_id\":\"1927\",\"insertIndex\":161,\"attrs\":{\"x\":168,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1945\",\"parent_id\":\"1927\",\"insertIndex\":162,\"attrs\":{\"x\":168,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1944\",\"parent_id\":\"1927\",\"insertIndex\":163,\"attrs\":{\"x\":168,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1943\",\"parent_id\":\"1927\",\"insertIndex\":164,\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1942\",\"parent_id\":\"1927\",\"insertIndex\":165,\"attrs\":{\"x\":168,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1941\",\"parent_id\":\"1927\",\"insertIndex\":166,\"attrs\":{\"x\":154,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1940\",\"parent_id\":\"1927\",\"insertIndex\":167,\"attrs\":{\"x\":154,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1939\",\"parent_id\":\"1927\",\"insertIndex\":168,\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1938\",\"parent_id\":\"1927\",\"insertIndex\":169,\"attrs\":{\"x\":140,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1937\",\"parent_id\":\"1927\",\"insertIndex\":170,\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1936\",\"parent_id\":\"1927\",\"insertIndex\":171,\"attrs\":{\"x\":140,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1935\",\"parent_id\":\"1927\",\"insertIndex\":172,\"attrs\":{\"x\":126,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1934\",\"parent_id\":\"1927\",\"insertIndex\":173,\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1933\",\"parent_id\":\"1927\",\"insertIndex\":174,\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1932\",\"parent_id\":\"1927\",\"insertIndex\":175,\"attrs\":{\"x\":126,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1931\",\"parent_id\":\"1927\",\"insertIndex\":176,\"attrs\":{\"x\":126,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1930\",\"parent_id\":\"1927\",\"insertIndex\":177,\"attrs\":{\"x\":112,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1929\",\"parent_id\":\"1927\",\"insertIndex\":178,\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1928\",\"parent_id\":\"1927\",\"insertIndex\":179,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2975\",\"parent_id\":\"1927\",\"insertIndex\":180,\"attrs\":{\"x\":126,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2981\",\"parent_id\":\"1927\",\"insertIndex\":181,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":17,\"selend\":17,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 35\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002Score: 0 Lives: 3\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2992\",\"parent_id\":\"1927\",\"insertIndex\":182,\"attrs\":{\"x\":138,\"y\":274,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2998\",\"parent_id\":\"1927\",\"insertIndex\":183,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3005\",\"parent_id\":\"1927\",\"insertIndex\":184,\"attrs\":{\"x\":5,\"y\":47,\"w\":100,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"my button 58\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3011\",\"parent_id\":\"1927\",\"insertIndex\":185,\"attrs\":{\"x\":5,\"y\":47,\"w\":100,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 64\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2099\",\"parent_id\":\"1000\",\"insertIndex\":186,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXIYVRuxk3cWdZodi3GddVtFm7RQ5dqTh3Na5Rvvj3bVxZqnn3Afy0c4QOUSC8bMUOKZKwe0WOeXG4YaROFcm0dCVSTRu8aWTOPbuwfpQuYUU5ZhUuCec1c9SuWTc9bLWuJY4xezVudWw5ZfTuHdw1eHXwQQT86QwcMaTw/sycaVb45k2cBfX086xcVS387O1cLZ/w+23cfX144Zw8Ecl19B1ASRt96Vy8Obtx/rx8ZVJ55j18DfB19/z8XUB98IH8qMOABLSSAASg8sEEuKlBBKzYQQiwhaCEpOcghLy04ISoz+GEtJ5hhKD+kEa4oRBGrNAQSrCJ0Uak61FGvLixRqjHsMa0ljDGoPbxxritccas3HHJsIGIJaTjCCW8sMglqMvJJbSaSSWg+qinCKiAAIAA=\",\"marked\":false}},{\"type\":3,\"id\":\"2270\",\"parent_id\":\"2099\",\"insertIndex\":187,\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2269\",\"parent_id\":\"2099\",\"insertIndex\":188,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2268\",\"parent_id\":\"2099\",\"insertIndex\":189,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2267\",\"parent_id\":\"2099\",\"insertIndex\":190,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2266\",\"parent_id\":\"2099\",\"insertIndex\":191,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2265\",\"parent_id\":\"2099\",\"insertIndex\":192,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2264\",\"parent_id\":\"2099\",\"insertIndex\":193,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2263\",\"parent_id\":\"2099\",\"insertIndex\":194,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2262\",\"parent_id\":\"2099\",\"insertIndex\":195,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2261\",\"parent_id\":\"2099\",\"insertIndex\":196,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2260\",\"parent_id\":\"2099\",\"insertIndex\":197,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2259\",\"parent_id\":\"2099\",\"insertIndex\":198,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2258\",\"parent_id\":\"2099\",\"insertIndex\":199,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2257\",\"parent_id\":\"2099\",\"insertIndex\":200,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2256\",\"parent_id\":\"2099\",\"insertIndex\":201,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2255\",\"parent_id\":\"2099\",\"insertIndex\":202,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2254\",\"parent_id\":\"2099\",\"insertIndex\":203,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2253\",\"parent_id\":\"2099\",\"insertIndex\":204,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2252\",\"parent_id\":\"2099\",\"insertIndex\":205,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2251\",\"parent_id\":\"2099\",\"insertIndex\":206,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2250\",\"parent_id\":\"2099\",\"insertIndex\":207,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2249\",\"parent_id\":\"2099\",\"insertIndex\":208,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2248\",\"parent_id\":\"2099\",\"insertIndex\":209,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2247\",\"parent_id\":\"2099\",\"insertIndex\":210,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2246\",\"parent_id\":\"2099\",\"insertIndex\":211,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2245\",\"parent_id\":\"2099\",\"insertIndex\":212,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2244\",\"parent_id\":\"2099\",\"insertIndex\":213,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2243\",\"parent_id\":\"2099\",\"insertIndex\":214,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2242\",\"parent_id\":\"2099\",\"insertIndex\":215,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2241\",\"parent_id\":\"2099\",\"insertIndex\":216,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2240\",\"parent_id\":\"2099\",\"insertIndex\":217,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2239\",\"parent_id\":\"2099\",\"insertIndex\":218,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2238\",\"parent_id\":\"2099\",\"insertIndex\":219,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2237\",\"parent_id\":\"2099\",\"insertIndex\":220,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2236\",\"parent_id\":\"2099\",\"insertIndex\":221,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2235\",\"parent_id\":\"2099\",\"insertIndex\":222,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2234\",\"parent_id\":\"2099\",\"insertIndex\":223,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2233\",\"parent_id\":\"2099\",\"insertIndex\":224,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2232\",\"parent_id\":\"2099\",\"insertIndex\":225,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2231\",\"parent_id\":\"2099\",\"insertIndex\":226,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2230\",\"parent_id\":\"2099\",\"insertIndex\":227,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2229\",\"parent_id\":\"2099\",\"insertIndex\":228,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2228\",\"parent_id\":\"2099\",\"insertIndex\":229,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2227\",\"parent_id\":\"2099\",\"insertIndex\":230,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2226\",\"parent_id\":\"2099\",\"insertIndex\":231,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2225\",\"parent_id\":\"2099\",\"insertIndex\":232,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2224\",\"parent_id\":\"2099\",\"insertIndex\":233,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2223\",\"parent_id\":\"2099\",\"insertIndex\":234,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2222\",\"parent_id\":\"2099\",\"insertIndex\":235,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2221\",\"parent_id\":\"2099\",\"insertIndex\":236,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2220\",\"parent_id\":\"2099\",\"insertIndex\":237,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2219\",\"parent_id\":\"2099\",\"insertIndex\":238,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2218\",\"parent_id\":\"2099\",\"insertIndex\":239,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2217\",\"parent_id\":\"2099\",\"insertIndex\":240,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2216\",\"parent_id\":\"2099\",\"insertIndex\":241,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2215\",\"parent_id\":\"2099\",\"insertIndex\":242,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2214\",\"parent_id\":\"2099\",\"insertIndex\":243,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2213\",\"parent_id\":\"2099\",\"insertIndex\":244,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2212\",\"parent_id\":\"2099\",\"insertIndex\":245,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2211\",\"parent_id\":\"2099\",\"insertIndex\":246,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2210\",\"parent_id\":\"2099\",\"insertIndex\":247,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2209\",\"parent_id\":\"2099\",\"insertIndex\":248,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2208\",\"parent_id\":\"2099\",\"insertIndex\":249,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2207\",\"parent_id\":\"2099\",\"insertIndex\":250,\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2206\",\"parent_id\":\"2099\",\"insertIndex\":251,\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2205\",\"parent_id\":\"2099\",\"insertIndex\":252,\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2204\",\"parent_id\":\"2099\",\"insertIndex\":253,\"attrs\":{\"x\":476,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2203\",\"parent_id\":\"2099\",\"insertIndex\":254,\"attrs\":{\"x\":462,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2202\",\"parent_id\":\"2099\",\"insertIndex\":255,\"attrs\":{\"x\":462,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2201\",\"parent_id\":\"2099\",\"insertIndex\":256,\"attrs\":{\"x\":462,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2200\",\"parent_id\":\"2099\",\"insertIndex\":257,\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2199\",\"parent_id\":\"2099\",\"insertIndex\":258,\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2198\",\"parent_id\":\"2099\",\"insertIndex\":259,\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2197\",\"parent_id\":\"2099\",\"insertIndex\":260,\"attrs\":{\"x\":462,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2196\",\"parent_id\":\"2099\",\"insertIndex\":261,\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2195\",\"parent_id\":\"2099\",\"insertIndex\":262,\"attrs\":{\"x\":462,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2194\",\"parent_id\":\"2099\",\"insertIndex\":263,\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2193\",\"parent_id\":\"2099\",\"insertIndex\":264,\"attrs\":{\"x\":462,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2192\",\"parent_id\":\"2099\",\"insertIndex\":265,\"attrs\":{\"x\":462,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2191\",\"parent_id\":\"2099\",\"insertIndex\":266,\"attrs\":{\"x\":462,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2190\",\"parent_id\":\"2099\",\"insertIndex\":267,\"attrs\":{\"x\":462,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2189\",\"parent_id\":\"2099\",\"insertIndex\":268,\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2188\",\"parent_id\":\"2099\",\"insertIndex\":269,\"attrs\":{\"x\":462,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2187\",\"parent_id\":\"2099\",\"insertIndex\":270,\"attrs\":{\"x\":462,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2186\",\"parent_id\":\"2099\",\"insertIndex\":271,\"attrs\":{\"x\":448,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2185\",\"parent_id\":\"2099\",\"insertIndex\":272,\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2184\",\"parent_id\":\"2099\",\"insertIndex\":273,\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2183\",\"parent_id\":\"2099\",\"insertIndex\":274,\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2182\",\"parent_id\":\"2099\",\"insertIndex\":275,\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2181\",\"parent_id\":\"2099\",\"insertIndex\":276,\"attrs\":{\"x\":392,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2180\",\"parent_id\":\"2099\",\"insertIndex\":277,\"attrs\":{\"x\":392,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2179\",\"parent_id\":\"2099\",\"insertIndex\":278,\"attrs\":{\"x\":392,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2178\",\"parent_id\":\"2099\",\"insertIndex\":279,\"attrs\":{\"x\":392,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2177\",\"parent_id\":\"2099\",\"insertIndex\":280,\"attrs\":{\"x\":392,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2176\",\"parent_id\":\"2099\",\"insertIndex\":281,\"attrs\":{\"x\":392,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2175\",\"parent_id\":\"2099\",\"insertIndex\":282,\"attrs\":{\"x\":392,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2174\",\"parent_id\":\"2099\",\"insertIndex\":283,\"attrs\":{\"x\":392,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2173\",\"parent_id\":\"2099\",\"insertIndex\":284,\"attrs\":{\"x\":378,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2172\",\"parent_id\":\"2099\",\"insertIndex\":285,\"attrs\":{\"x\":378,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2171\",\"parent_id\":\"2099\",\"insertIndex\":286,\"attrs\":{\"x\":378,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2170\",\"parent_id\":\"2099\",\"insertIndex\":287,\"attrs\":{\"x\":364,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2169\",\"parent_id\":\"2099\",\"insertIndex\":288,\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2168\",\"parent_id\":\"2099\",\"insertIndex\":289,\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2167\",\"parent_id\":\"2099\",\"insertIndex\":290,\"attrs\":{\"x\":364,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2166\",\"parent_id\":\"2099\",\"insertIndex\":291,\"attrs\":{\"x\":350,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2165\",\"parent_id\":\"2099\",\"insertIndex\":292,\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2164\",\"parent_id\":\"2099\",\"insertIndex\":293,\"attrs\":{\"x\":350,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2163\",\"parent_id\":\"2099\",\"insertIndex\":294,\"attrs\":{\"x\":350,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2162\",\"parent_id\":\"2099\",\"insertIndex\":295,\"attrs\":{\"x\":336,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2161\",\"parent_id\":\"2099\",\"insertIndex\":296,\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2160\",\"parent_id\":\"2099\",\"insertIndex\":297,\"attrs\":{\"x\":336,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2159\",\"parent_id\":\"2099\",\"insertIndex\":298,\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2158\",\"parent_id\":\"2099\",\"insertIndex\":299,\"attrs\":{\"x\":336,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2157\",\"parent_id\":\"2099\",\"insertIndex\":300,\"attrs\":{\"x\":336,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2156\",\"parent_id\":\"2099\",\"insertIndex\":301,\"attrs\":{\"x\":336,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2155\",\"parent_id\":\"2099\",\"insertIndex\":302,\"attrs\":{\"x\":322,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2154\",\"parent_id\":\"2099\",\"insertIndex\":303,\"attrs\":{\"x\":322,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2153\",\"parent_id\":\"2099\",\"insertIndex\":304,\"attrs\":{\"x\":322,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2152\",\"parent_id\":\"2099\",\"insertIndex\":305,\"attrs\":{\"x\":322,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2151\",\"parent_id\":\"2099\",\"insertIndex\":306,\"attrs\":{\"x\":308,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2150\",\"parent_id\":\"2099\",\"insertIndex\":307,\"attrs\":{\"x\":308,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2149\",\"parent_id\":\"2099\",\"insertIndex\":308,\"attrs\":{\"x\":308,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2148\",\"parent_id\":\"2099\",\"insertIndex\":309,\"attrs\":{\"x\":308,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2147\",\"parent_id\":\"2099\",\"insertIndex\":310,\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2146\",\"parent_id\":\"2099\",\"insertIndex\":311,\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2145\",\"parent_id\":\"2099\",\"insertIndex\":312,\"attrs\":{\"x\":294,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2144\",\"parent_id\":\"2099\",\"insertIndex\":313,\"attrs\":{\"x\":294,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2143\",\"parent_id\":\"2099\",\"insertIndex\":314,\"attrs\":{\"x\":280,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2142\",\"parent_id\":\"2099\",\"insertIndex\":315,\"attrs\":{\"x\":280,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2141\",\"parent_id\":\"2099\",\"insertIndex\":316,\"attrs\":{\"x\":280,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2140\",\"parent_id\":\"2099\",\"insertIndex\":317,\"attrs\":{\"x\":280,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2139\",\"parent_id\":\"2099\",\"insertIndex\":318,\"attrs\":{\"x\":266,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2138\",\"parent_id\":\"2099\",\"insertIndex\":319,\"attrs\":{\"x\":266,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2137\",\"parent_id\":\"2099\",\"insertIndex\":320,\"attrs\":{\"x\":266,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2136\",\"parent_id\":\"2099\",\"insertIndex\":321,\"attrs\":{\"x\":252,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2135\",\"parent_id\":\"2099\",\"insertIndex\":322,\"attrs\":{\"x\":252,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2134\",\"parent_id\":\"2099\",\"insertIndex\":323,\"attrs\":{\"x\":252,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2133\",\"parent_id\":\"2099\",\"insertIndex\":324,\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2132\",\"parent_id\":\"2099\",\"insertIndex\":325,\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2131\",\"parent_id\":\"2099\",\"insertIndex\":326,\"attrs\":{\"x\":252,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2130\",\"parent_id\":\"2099\",\"insertIndex\":327,\"attrs\":{\"x\":252,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2129\",\"parent_id\":\"2099\",\"insertIndex\":328,\"attrs\":{\"x\":252,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2128\",\"parent_id\":\"2099\",\"insertIndex\":329,\"attrs\":{\"x\":238,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2127\",\"parent_id\":\"2099\",\"insertIndex\":330,\"attrs\":{\"x\":238,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2126\",\"parent_id\":\"2099\",\"insertIndex\":331,\"attrs\":{\"x\":238,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2125\",\"parent_id\":\"2099\",\"insertIndex\":332,\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2124\",\"parent_id\":\"2099\",\"insertIndex\":333,\"attrs\":{\"x\":224,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2123\",\"parent_id\":\"2099\",\"insertIndex\":334,\"attrs\":{\"x\":224,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2122\",\"parent_id\":\"2099\",\"insertIndex\":335,\"attrs\":{\"x\":210,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2121\",\"parent_id\":\"2099\",\"insertIndex\":336,\"attrs\":{\"x\":210,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2120\",\"parent_id\":\"2099\",\"insertIndex\":337,\"attrs\":{\"x\":210,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2119\",\"parent_id\":\"2099\",\"insertIndex\":338,\"attrs\":{\"x\":210,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2118\",\"parent_id\":\"2099\",\"insertIndex\":339,\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2117\",\"parent_id\":\"2099\",\"insertIndex\":340,\"attrs\":{\"x\":210,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2116\",\"parent_id\":\"2099\",\"insertIndex\":341,\"attrs\":{\"x\":210,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2115\",\"parent_id\":\"2099\",\"insertIndex\":342,\"attrs\":{\"x\":196,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2114\",\"parent_id\":\"2099\",\"insertIndex\":343,\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2113\",\"parent_id\":\"2099\",\"insertIndex\":344,\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2112\",\"parent_id\":\"2099\",\"insertIndex\":345,\"attrs\":{\"x\":182,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2111\",\"parent_id\":\"2099\",\"insertIndex\":346,\"attrs\":{\"x\":168,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2110\",\"parent_id\":\"2099\",\"insertIndex\":347,\"attrs\":{\"x\":168,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2109\",\"parent_id\":\"2099\",\"insertIndex\":348,\"attrs\":{\"x\":154,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2108\",\"parent_id\":\"2099\",\"insertIndex\":349,\"attrs\":{\"x\":154,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2107\",\"parent_id\":\"2099\",\"insertIndex\":350,\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2106\",\"parent_id\":\"2099\",\"insertIndex\":351,\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2105\",\"parent_id\":\"2099\",\"insertIndex\":352,\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2104\",\"parent_id\":\"2099\",\"insertIndex\":353,\"attrs\":{\"x\":126,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2103\",\"parent_id\":\"2099\",\"insertIndex\":354,\"attrs\":{\"x\":126,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2102\",\"parent_id\":\"2099\",\"insertIndex\":355,\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2101\",\"parent_id\":\"2099\",\"insertIndex\":356,\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2100\",\"parent_id\":\"2099\",\"insertIndex\":357,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2976\",\"parent_id\":\"2099\",\"insertIndex\":358,\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2982\",\"parent_id\":\"2099\",\"insertIndex\":359,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 36\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2993\",\"parent_id\":\"2099\",\"insertIndex\":360,\"attrs\":{\"x\":136,\"y\":203,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2999\",\"parent_id\":\"2099\",\"insertIndex\":361,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3006\",\"parent_id\":\"2099\",\"insertIndex\":362,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 59\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3012\",\"parent_id\":\"2099\",\"insertIndex\":363,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 65\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2271\",\"parent_id\":\"1000\",\"insertIndex\":364,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"2442\",\"parent_id\":\"2271\",\"insertIndex\":365,\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2441\",\"parent_id\":\"2271\",\"insertIndex\":366,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2440\",\"parent_id\":\"2271\",\"insertIndex\":367,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2439\",\"parent_id\":\"2271\",\"insertIndex\":368,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2438\",\"parent_id\":\"2271\",\"insertIndex\":369,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2437\",\"parent_id\":\"2271\",\"insertIndex\":370,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2436\",\"parent_id\":\"2271\",\"insertIndex\":371,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2435\",\"parent_id\":\"2271\",\"insertIndex\":372,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2434\",\"parent_id\":\"2271\",\"insertIndex\":373,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2433\",\"parent_id\":\"2271\",\"insertIndex\":374,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2432\",\"parent_id\":\"2271\",\"insertIndex\":375,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2431\",\"parent_id\":\"2271\",\"insertIndex\":376,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2430\",\"parent_id\":\"2271\",\"insertIndex\":377,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2429\",\"parent_id\":\"2271\",\"insertIndex\":378,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2428\",\"parent_id\":\"2271\",\"insertIndex\":379,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2427\",\"parent_id\":\"2271\",\"insertIndex\":380,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2426\",\"parent_id\":\"2271\",\"insertIndex\":381,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2425\",\"parent_id\":\"2271\",\"insertIndex\":382,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2424\",\"parent_id\":\"2271\",\"insertIndex\":383,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2423\",\"parent_id\":\"2271\",\"insertIndex\":384,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2422\",\"parent_id\":\"2271\",\"insertIndex\":385,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2421\",\"parent_id\":\"2271\",\"insertIndex\":386,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2420\",\"parent_id\":\"2271\",\"insertIndex\":387,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2419\",\"parent_id\":\"2271\",\"insertIndex\":388,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2418\",\"parent_id\":\"2271\",\"insertIndex\":389,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2417\",\"parent_id\":\"2271\",\"insertIndex\":390,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2416\",\"parent_id\":\"2271\",\"insertIndex\":391,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2415\",\"parent_id\":\"2271\",\"insertIndex\":392,\"attrs\":{\"x\":490,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2414\",\"parent_id\":\"2271\",\"insertIndex\":393,\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2413\",\"parent_id\":\"2271\",\"insertIndex\":394,\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2412\",\"parent_id\":\"2271\",\"insertIndex\":395,\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2411\",\"parent_id\":\"2271\",\"insertIndex\":396,\"attrs\":{\"x\":490,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2410\",\"parent_id\":\"2271\",\"insertIndex\":397,\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2409\",\"parent_id\":\"2271\",\"insertIndex\":398,\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2408\",\"parent_id\":\"2271\",\"insertIndex\":399,\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2407\",\"parent_id\":\"2271\",\"insertIndex\":400,\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2406\",\"parent_id\":\"2271\",\"insertIndex\":401,\"attrs\":{\"x\":490,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2405\",\"parent_id\":\"2271\",\"insertIndex\":402,\"attrs\":{\"x\":476,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2404\",\"parent_id\":\"2271\",\"insertIndex\":403,\"attrs\":{\"x\":476,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2403\",\"parent_id\":\"2271\",\"insertIndex\":404,\"attrs\":{\"x\":476,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2402\",\"parent_id\":\"2271\",\"insertIndex\":405,\"attrs\":{\"x\":476,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2401\",\"parent_id\":\"2271\",\"insertIndex\":406,\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2400\",\"parent_id\":\"2271\",\"insertIndex\":407,\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2399\",\"parent_id\":\"2271\",\"insertIndex\":408,\"attrs\":{\"x\":462,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2398\",\"parent_id\":\"2271\",\"insertIndex\":409,\"attrs\":{\"x\":462,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2397\",\"parent_id\":\"2271\",\"insertIndex\":410,\"attrs\":{\"x\":448,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2396\",\"parent_id\":\"2271\",\"insertIndex\":411,\"attrs\":{\"x\":448,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2395\",\"parent_id\":\"2271\",\"insertIndex\":412,\"attrs\":{\"x\":448,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2394\",\"parent_id\":\"2271\",\"insertIndex\":413,\"attrs\":{\"x\":448,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2393\",\"parent_id\":\"2271\",\"insertIndex\":414,\"attrs\":{\"x\":448,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2392\",\"parent_id\":\"2271\",\"insertIndex\":415,\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2391\",\"parent_id\":\"2271\",\"insertIndex\":416,\"attrs\":{\"x\":434,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2390\",\"parent_id\":\"2271\",\"insertIndex\":417,\"attrs\":{\"x\":434,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2389\",\"parent_id\":\"2271\",\"insertIndex\":418,\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2388\",\"parent_id\":\"2271\",\"insertIndex\":419,\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2387\",\"parent_id\":\"2271\",\"insertIndex\":420,\"attrs\":{\"x\":434,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2386\",\"parent_id\":\"2271\",\"insertIndex\":421,\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2385\",\"parent_id\":\"2271\",\"insertIndex\":422,\"attrs\":{\"x\":420,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2384\",\"parent_id\":\"2271\",\"insertIndex\":423,\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2383\",\"parent_id\":\"2271\",\"insertIndex\":424,\"attrs\":{\"x\":406,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2382\",\"parent_id\":\"2271\",\"insertIndex\":425,\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2381\",\"parent_id\":\"2271\",\"insertIndex\":426,\"attrs\":{\"x\":406,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2380\",\"parent_id\":\"2271\",\"insertIndex\":427,\"attrs\":{\"x\":406,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2379\",\"parent_id\":\"2271\",\"insertIndex\":428,\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2378\",\"parent_id\":\"2271\",\"insertIndex\":429,\"attrs\":{\"x\":392,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2377\",\"parent_id\":\"2271\",\"insertIndex\":430,\"attrs\":{\"x\":392,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2376\",\"parent_id\":\"2271\",\"insertIndex\":431,\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2375\",\"parent_id\":\"2271\",\"insertIndex\":432,\"attrs\":{\"x\":378,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2374\",\"parent_id\":\"2271\",\"insertIndex\":433,\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2373\",\"parent_id\":\"2271\",\"insertIndex\":434,\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2372\",\"parent_id\":\"2271\",\"insertIndex\":435,\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2371\",\"parent_id\":\"2271\",\"insertIndex\":436,\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2370\",\"parent_id\":\"2271\",\"insertIndex\":437,\"attrs\":{\"x\":364,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2369\",\"parent_id\":\"2271\",\"insertIndex\":438,\"attrs\":{\"x\":350,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2368\",\"parent_id\":\"2271\",\"insertIndex\":439,\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2367\",\"parent_id\":\"2271\",\"insertIndex\":440,\"attrs\":{\"x\":350,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2366\",\"parent_id\":\"2271\",\"insertIndex\":441,\"attrs\":{\"x\":350,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2365\",\"parent_id\":\"2271\",\"insertIndex\":442,\"attrs\":{\"x\":336,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2364\",\"parent_id\":\"2271\",\"insertIndex\":443,\"attrs\":{\"x\":336,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2363\",\"parent_id\":\"2271\",\"insertIndex\":444,\"attrs\":{\"x\":336,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2362\",\"parent_id\":\"2271\",\"insertIndex\":445,\"attrs\":{\"x\":336,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2361\",\"parent_id\":\"2271\",\"insertIndex\":446,\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2360\",\"parent_id\":\"2271\",\"insertIndex\":447,\"attrs\":{\"x\":336,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2359\",\"parent_id\":\"2271\",\"insertIndex\":448,\"attrs\":{\"x\":336,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2358\",\"parent_id\":\"2271\",\"insertIndex\":449,\"attrs\":{\"x\":322,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2357\",\"parent_id\":\"2271\",\"insertIndex\":450,\"attrs\":{\"x\":322,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2356\",\"parent_id\":\"2271\",\"insertIndex\":451,\"attrs\":{\"x\":322,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2355\",\"parent_id\":\"2271\",\"insertIndex\":452,\"attrs\":{\"x\":322,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2354\",\"parent_id\":\"2271\",\"insertIndex\":453,\"attrs\":{\"x\":322,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2353\",\"parent_id\":\"2271\",\"insertIndex\":454,\"attrs\":{\"x\":322,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2352\",\"parent_id\":\"2271\",\"insertIndex\":455,\"attrs\":{\"x\":308,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2351\",\"parent_id\":\"2271\",\"insertIndex\":456,\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2350\",\"parent_id\":\"2271\",\"insertIndex\":457,\"attrs\":{\"x\":308,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2349\",\"parent_id\":\"2271\",\"insertIndex\":458,\"attrs\":{\"x\":308,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2348\",\"parent_id\":\"2271\",\"insertIndex\":459,\"attrs\":{\"x\":294,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2347\",\"parent_id\":\"2271\",\"insertIndex\":460,\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2346\",\"parent_id\":\"2271\",\"insertIndex\":461,\"attrs\":{\"x\":294,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2345\",\"parent_id\":\"2271\",\"insertIndex\":462,\"attrs\":{\"x\":294,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2344\",\"parent_id\":\"2271\",\"insertIndex\":463,\"attrs\":{\"x\":294,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2343\",\"parent_id\":\"2271\",\"insertIndex\":464,\"attrs\":{\"x\":294,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2342\",\"parent_id\":\"2271\",\"insertIndex\":465,\"attrs\":{\"x\":294,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2341\",\"parent_id\":\"2271\",\"insertIndex\":466,\"attrs\":{\"x\":294,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2340\",\"parent_id\":\"2271\",\"insertIndex\":467,\"attrs\":{\"x\":294,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2339\",\"parent_id\":\"2271\",\"insertIndex\":468,\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2338\",\"parent_id\":\"2271\",\"insertIndex\":469,\"attrs\":{\"x\":280,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2337\",\"parent_id\":\"2271\",\"insertIndex\":470,\"attrs\":{\"x\":280,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2336\",\"parent_id\":\"2271\",\"insertIndex\":471,\"attrs\":{\"x\":280,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2335\",\"parent_id\":\"2271\",\"insertIndex\":472,\"attrs\":{\"x\":266,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2334\",\"parent_id\":\"2271\",\"insertIndex\":473,\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2333\",\"parent_id\":\"2271\",\"insertIndex\":474,\"attrs\":{\"x\":266,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2332\",\"parent_id\":\"2271\",\"insertIndex\":475,\"attrs\":{\"x\":252,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2331\",\"parent_id\":\"2271\",\"insertIndex\":476,\"attrs\":{\"x\":252,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2330\",\"parent_id\":\"2271\",\"insertIndex\":477,\"attrs\":{\"x\":252,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2329\",\"parent_id\":\"2271\",\"insertIndex\":478,\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2328\",\"parent_id\":\"2271\",\"insertIndex\":479,\"attrs\":{\"x\":252,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2327\",\"parent_id\":\"2271\",\"insertIndex\":480,\"attrs\":{\"x\":238,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2326\",\"parent_id\":\"2271\",\"insertIndex\":481,\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2325\",\"parent_id\":\"2271\",\"insertIndex\":482,\"attrs\":{\"x\":238,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2324\",\"parent_id\":\"2271\",\"insertIndex\":483,\"attrs\":{\"x\":238,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2323\",\"parent_id\":\"2271\",\"insertIndex\":484,\"attrs\":{\"x\":224,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2322\",\"parent_id\":\"2271\",\"insertIndex\":485,\"attrs\":{\"x\":224,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2321\",\"parent_id\":\"2271\",\"insertIndex\":486,\"attrs\":{\"x\":224,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2320\",\"parent_id\":\"2271\",\"insertIndex\":487,\"attrs\":{\"x\":224,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2319\",\"parent_id\":\"2271\",\"insertIndex\":488,\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2318\",\"parent_id\":\"2271\",\"insertIndex\":489,\"attrs\":{\"x\":210,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2317\",\"parent_id\":\"2271\",\"insertIndex\":490,\"attrs\":{\"x\":210,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2316\",\"parent_id\":\"2271\",\"insertIndex\":491,\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2315\",\"parent_id\":\"2271\",\"insertIndex\":492,\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2314\",\"parent_id\":\"2271\",\"insertIndex\":493,\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2313\",\"parent_id\":\"2271\",\"insertIndex\":494,\"attrs\":{\"x\":196,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2312\",\"parent_id\":\"2271\",\"insertIndex\":495,\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2311\",\"parent_id\":\"2271\",\"insertIndex\":496,\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2310\",\"parent_id\":\"2271\",\"insertIndex\":497,\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2309\",\"parent_id\":\"2271\",\"insertIndex\":498,\"attrs\":{\"x\":182,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2308\",\"parent_id\":\"2271\",\"insertIndex\":499,\"attrs\":{\"x\":182,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2307\",\"parent_id\":\"2271\",\"insertIndex\":500,\"attrs\":{\"x\":182,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2306\",\"parent_id\":\"2271\",\"insertIndex\":501,\"attrs\":{\"x\":182,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2305\",\"parent_id\":\"2271\",\"insertIndex\":502,\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2304\",\"parent_id\":\"2271\",\"insertIndex\":503,\"attrs\":{\"x\":182,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2303\",\"parent_id\":\"2271\",\"insertIndex\":504,\"attrs\":{\"x\":182,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2302\",\"parent_id\":\"2271\",\"insertIndex\":505,\"attrs\":{\"x\":182,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2301\",\"parent_id\":\"2271\",\"insertIndex\":506,\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2300\",\"parent_id\":\"2271\",\"insertIndex\":507,\"attrs\":{\"x\":168,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2299\",\"parent_id\":\"2271\",\"insertIndex\":508,\"attrs\":{\"x\":168,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2298\",\"parent_id\":\"2271\",\"insertIndex\":509,\"attrs\":{\"x\":168,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2297\",\"parent_id\":\"2271\",\"insertIndex\":510,\"attrs\":{\"x\":168,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2296\",\"parent_id\":\"2271\",\"insertIndex\":511,\"attrs\":{\"x\":154,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2295\",\"parent_id\":\"2271\",\"insertIndex\":512,\"attrs\":{\"x\":154,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2294\",\"parent_id\":\"2271\",\"insertIndex\":513,\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2293\",\"parent_id\":\"2271\",\"insertIndex\":514,\"attrs\":{\"x\":154,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2292\",\"parent_id\":\"2271\",\"insertIndex\":515,\"attrs\":{\"x\":140,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2291\",\"parent_id\":\"2271\",\"insertIndex\":516,\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2290\",\"parent_id\":\"2271\",\"insertIndex\":517,\"attrs\":{\"x\":140,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2289\",\"parent_id\":\"2271\",\"insertIndex\":518,\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2288\",\"parent_id\":\"2271\",\"insertIndex\":519,\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2287\",\"parent_id\":\"2271\",\"insertIndex\":520,\"attrs\":{\"x\":140,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2286\",\"parent_id\":\"2271\",\"insertIndex\":521,\"attrs\":{\"x\":140,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2285\",\"parent_id\":\"2271\",\"insertIndex\":522,\"attrs\":{\"x\":140,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2284\",\"parent_id\":\"2271\",\"insertIndex\":523,\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2283\",\"parent_id\":\"2271\",\"insertIndex\":524,\"attrs\":{\"x\":140,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2282\",\"parent_id\":\"2271\",\"insertIndex\":525,\"attrs\":{\"x\":126,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2281\",\"parent_id\":\"2271\",\"insertIndex\":526,\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2280\",\"parent_id\":\"2271\",\"insertIndex\":527,\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2279\",\"parent_id\":\"2271\",\"insertIndex\":528,\"attrs\":{\"x\":126,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2278\",\"parent_id\":\"2271\",\"insertIndex\":529,\"attrs\":{\"x\":112,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2277\",\"parent_id\":\"2271\",\"insertIndex\":530,\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2276\",\"parent_id\":\"2271\",\"insertIndex\":531,\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2275\",\"parent_id\":\"2271\",\"insertIndex\":532,\"attrs\":{\"x\":112,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2274\",\"parent_id\":\"2271\",\"insertIndex\":533,\"attrs\":{\"x\":112,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2273\",\"parent_id\":\"2271\",\"insertIndex\":534,\"attrs\":{\"x\":112,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2272\",\"parent_id\":\"2271\",\"insertIndex\":535,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2977\",\"parent_id\":\"2271\",\"insertIndex\":536,\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2983\",\"parent_id\":\"2271\",\"insertIndex\":537,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 37\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2994\",\"parent_id\":\"2271\",\"insertIndex\":538,\"attrs\":{\"x\":131,\"y\":288,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3000\",\"parent_id\":\"2271\",\"insertIndex\":539,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3007\",\"parent_id\":\"2271\",\"insertIndex\":540,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 60\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3013\",\"parent_id\":\"2271\",\"insertIndex\":541,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 66\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2443\",\"parent_id\":\"1000\",\"insertIndex\":542,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"2614\",\"parent_id\":\"2443\",\"insertIndex\":543,\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2613\",\"parent_id\":\"2443\",\"insertIndex\":544,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2612\",\"parent_id\":\"2443\",\"insertIndex\":545,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2611\",\"parent_id\":\"2443\",\"insertIndex\":546,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2610\",\"parent_id\":\"2443\",\"insertIndex\":547,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2609\",\"parent_id\":\"2443\",\"insertIndex\":548,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2608\",\"parent_id\":\"2443\",\"insertIndex\":549,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2607\",\"parent_id\":\"2443\",\"insertIndex\":550,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2606\",\"parent_id\":\"2443\",\"insertIndex\":551,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2605\",\"parent_id\":\"2443\",\"insertIndex\":552,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2604\",\"parent_id\":\"2443\",\"insertIndex\":553,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2603\",\"parent_id\":\"2443\",\"insertIndex\":554,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2602\",\"parent_id\":\"2443\",\"insertIndex\":555,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2601\",\"parent_id\":\"2443\",\"insertIndex\":556,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2600\",\"parent_id\":\"2443\",\"insertIndex\":557,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2599\",\"parent_id\":\"2443\",\"insertIndex\":558,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2598\",\"parent_id\":\"2443\",\"insertIndex\":559,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2597\",\"parent_id\":\"2443\",\"insertIndex\":560,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2596\",\"parent_id\":\"2443\",\"insertIndex\":561,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2595\",\"parent_id\":\"2443\",\"insertIndex\":562,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2594\",\"parent_id\":\"2443\",\"insertIndex\":563,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2593\",\"parent_id\":\"2443\",\"insertIndex\":564,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2592\",\"parent_id\":\"2443\",\"insertIndex\":565,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2591\",\"parent_id\":\"2443\",\"insertIndex\":566,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2590\",\"parent_id\":\"2443\",\"insertIndex\":567,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2589\",\"parent_id\":\"2443\",\"insertIndex\":568,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2588\",\"parent_id\":\"2443\",\"insertIndex\":569,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2587\",\"parent_id\":\"2443\",\"insertIndex\":570,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2586\",\"parent_id\":\"2443\",\"insertIndex\":571,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2585\",\"parent_id\":\"2443\",\"insertIndex\":572,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2584\",\"parent_id\":\"2443\",\"insertIndex\":573,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2583\",\"parent_id\":\"2443\",\"insertIndex\":574,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2582\",\"parent_id\":\"2443\",\"insertIndex\":575,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2581\",\"parent_id\":\"2443\",\"insertIndex\":576,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2580\",\"parent_id\":\"2443\",\"insertIndex\":577,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2579\",\"parent_id\":\"2443\",\"insertIndex\":578,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2578\",\"parent_id\":\"2443\",\"insertIndex\":579,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2577\",\"parent_id\":\"2443\",\"insertIndex\":580,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2576\",\"parent_id\":\"2443\",\"insertIndex\":581,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2575\",\"parent_id\":\"2443\",\"insertIndex\":582,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2574\",\"parent_id\":\"2443\",\"insertIndex\":583,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2573\",\"parent_id\":\"2443\",\"insertIndex\":584,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2572\",\"parent_id\":\"2443\",\"insertIndex\":585,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2571\",\"parent_id\":\"2443\",\"insertIndex\":586,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2570\",\"parent_id\":\"2443\",\"insertIndex\":587,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2569\",\"parent_id\":\"2443\",\"insertIndex\":588,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2568\",\"parent_id\":\"2443\",\"insertIndex\":589,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2567\",\"parent_id\":\"2443\",\"insertIndex\":590,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2566\",\"parent_id\":\"2443\",\"insertIndex\":591,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2565\",\"parent_id\":\"2443\",\"insertIndex\":592,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2564\",\"parent_id\":\"2443\",\"insertIndex\":593,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2563\",\"parent_id\":\"2443\",\"insertIndex\":594,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2562\",\"parent_id\":\"2443\",\"insertIndex\":595,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2561\",\"parent_id\":\"2443\",\"insertIndex\":596,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2560\",\"parent_id\":\"2443\",\"insertIndex\":597,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2559\",\"parent_id\":\"2443\",\"insertIndex\":598,\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2558\",\"parent_id\":\"2443\",\"insertIndex\":599,\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2557\",\"parent_id\":\"2443\",\"insertIndex\":600,\"attrs\":{\"x\":490,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2556\",\"parent_id\":\"2443\",\"insertIndex\":601,\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2555\",\"parent_id\":\"2443\",\"insertIndex\":602,\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2554\",\"parent_id\":\"2443\",\"insertIndex\":603,\"attrs\":{\"x\":490,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2553\",\"parent_id\":\"2443\",\"insertIndex\":604,\"attrs\":{\"x\":490,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2552\",\"parent_id\":\"2443\",\"insertIndex\":605,\"attrs\":{\"x\":490,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2551\",\"parent_id\":\"2443\",\"insertIndex\":606,\"attrs\":{\"x\":490,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2550\",\"parent_id\":\"2443\",\"insertIndex\":607,\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2549\",\"parent_id\":\"2443\",\"insertIndex\":608,\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2548\",\"parent_id\":\"2443\",\"insertIndex\":609,\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2547\",\"parent_id\":\"2443\",\"insertIndex\":610,\"attrs\":{\"x\":490,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2546\",\"parent_id\":\"2443\",\"insertIndex\":611,\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2545\",\"parent_id\":\"2443\",\"insertIndex\":612,\"attrs\":{\"x\":476,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2544\",\"parent_id\":\"2443\",\"insertIndex\":613,\"attrs\":{\"x\":476,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2543\",\"parent_id\":\"2443\",\"insertIndex\":614,\"attrs\":{\"x\":462,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2542\",\"parent_id\":\"2443\",\"insertIndex\":615,\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2541\",\"parent_id\":\"2443\",\"insertIndex\":616,\"attrs\":{\"x\":462,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2540\",\"parent_id\":\"2443\",\"insertIndex\":617,\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2539\",\"parent_id\":\"2443\",\"insertIndex\":618,\"attrs\":{\"x\":462,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2538\",\"parent_id\":\"2443\",\"insertIndex\":619,\"attrs\":{\"x\":448,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2537\",\"parent_id\":\"2443\",\"insertIndex\":620,\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2536\",\"parent_id\":\"2443\",\"insertIndex\":621,\"attrs\":{\"x\":448,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2535\",\"parent_id\":\"2443\",\"insertIndex\":622,\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2534\",\"parent_id\":\"2443\",\"insertIndex\":623,\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2533\",\"parent_id\":\"2443\",\"insertIndex\":624,\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2532\",\"parent_id\":\"2443\",\"insertIndex\":625,\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2531\",\"parent_id\":\"2443\",\"insertIndex\":626,\"attrs\":{\"x\":420,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2530\",\"parent_id\":\"2443\",\"insertIndex\":627,\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2529\",\"parent_id\":\"2443\",\"insertIndex\":628,\"attrs\":{\"x\":406,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2528\",\"parent_id\":\"2443\",\"insertIndex\":629,\"attrs\":{\"x\":406,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2527\",\"parent_id\":\"2443\",\"insertIndex\":630,\"attrs\":{\"x\":392,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2526\",\"parent_id\":\"2443\",\"insertIndex\":631,\"attrs\":{\"x\":392,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2525\",\"parent_id\":\"2443\",\"insertIndex\":632,\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2524\",\"parent_id\":\"2443\",\"insertIndex\":633,\"attrs\":{\"x\":378,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2523\",\"parent_id\":\"2443\",\"insertIndex\":634,\"attrs\":{\"x\":378,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2522\",\"parent_id\":\"2443\",\"insertIndex\":635,\"attrs\":{\"x\":378,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2521\",\"parent_id\":\"2443\",\"insertIndex\":636,\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2520\",\"parent_id\":\"2443\",\"insertIndex\":637,\"attrs\":{\"x\":364,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2519\",\"parent_id\":\"2443\",\"insertIndex\":638,\"attrs\":{\"x\":364,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2518\",\"parent_id\":\"2443\",\"insertIndex\":639,\"attrs\":{\"x\":364,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2517\",\"parent_id\":\"2443\",\"insertIndex\":640,\"attrs\":{\"x\":364,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2516\",\"parent_id\":\"2443\",\"insertIndex\":641,\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2515\",\"parent_id\":\"2443\",\"insertIndex\":642,\"attrs\":{\"x\":364,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2514\",\"parent_id\":\"2443\",\"insertIndex\":643,\"attrs\":{\"x\":350,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2513\",\"parent_id\":\"2443\",\"insertIndex\":644,\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2512\",\"parent_id\":\"2443\",\"insertIndex\":645,\"attrs\":{\"x\":350,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2511\",\"parent_id\":\"2443\",\"insertIndex\":646,\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2510\",\"parent_id\":\"2443\",\"insertIndex\":647,\"attrs\":{\"x\":336,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2509\",\"parent_id\":\"2443\",\"insertIndex\":648,\"attrs\":{\"x\":336,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2508\",\"parent_id\":\"2443\",\"insertIndex\":649,\"attrs\":{\"x\":336,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2507\",\"parent_id\":\"2443\",\"insertIndex\":650,\"attrs\":{\"x\":322,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2506\",\"parent_id\":\"2443\",\"insertIndex\":651,\"attrs\":{\"x\":322,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2505\",\"parent_id\":\"2443\",\"insertIndex\":652,\"attrs\":{\"x\":322,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2504\",\"parent_id\":\"2443\",\"insertIndex\":653,\"attrs\":{\"x\":308,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2503\",\"parent_id\":\"2443\",\"insertIndex\":654,\"attrs\":{\"x\":294,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2502\",\"parent_id\":\"2443\",\"insertIndex\":655,\"attrs\":{\"x\":294,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2501\",\"parent_id\":\"2443\",\"insertIndex\":656,\"attrs\":{\"x\":294,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2500\",\"parent_id\":\"2443\",\"insertIndex\":657,\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2499\",\"parent_id\":\"2443\",\"insertIndex\":658,\"attrs\":{\"x\":280,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2498\",\"parent_id\":\"2443\",\"insertIndex\":659,\"attrs\":{\"x\":280,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2497\",\"parent_id\":\"2443\",\"insertIndex\":660,\"attrs\":{\"x\":280,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2496\",\"parent_id\":\"2443\",\"insertIndex\":661,\"attrs\":{\"x\":266,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2495\",\"parent_id\":\"2443\",\"insertIndex\":662,\"attrs\":{\"x\":266,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2494\",\"parent_id\":\"2443\",\"insertIndex\":663,\"attrs\":{\"x\":252,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2493\",\"parent_id\":\"2443\",\"insertIndex\":664,\"attrs\":{\"x\":252,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2492\",\"parent_id\":\"2443\",\"insertIndex\":665,\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2491\",\"parent_id\":\"2443\",\"insertIndex\":666,\"attrs\":{\"x\":252,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2490\",\"parent_id\":\"2443\",\"insertIndex\":667,\"attrs\":{\"x\":252,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2489\",\"parent_id\":\"2443\",\"insertIndex\":668,\"attrs\":{\"x\":252,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2488\",\"parent_id\":\"2443\",\"insertIndex\":669,\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2487\",\"parent_id\":\"2443\",\"insertIndex\":670,\"attrs\":{\"x\":238,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2486\",\"parent_id\":\"2443\",\"insertIndex\":671,\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2485\",\"parent_id\":\"2443\",\"insertIndex\":672,\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2484\",\"parent_id\":\"2443\",\"insertIndex\":673,\"attrs\":{\"x\":224,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2483\",\"parent_id\":\"2443\",\"insertIndex\":674,\"attrs\":{\"x\":224,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2482\",\"parent_id\":\"2443\",\"insertIndex\":675,\"attrs\":{\"x\":224,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2481\",\"parent_id\":\"2443\",\"insertIndex\":676,\"attrs\":{\"x\":210,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2480\",\"parent_id\":\"2443\",\"insertIndex\":677,\"attrs\":{\"x\":210,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2479\",\"parent_id\":\"2443\",\"insertIndex\":678,\"attrs\":{\"x\":210,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2478\",\"parent_id\":\"2443\",\"insertIndex\":679,\"attrs\":{\"x\":196,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2477\",\"parent_id\":\"2443\",\"insertIndex\":680,\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2476\",\"parent_id\":\"2443\",\"insertIndex\":681,\"attrs\":{\"x\":196,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2475\",\"parent_id\":\"2443\",\"insertIndex\":682,\"attrs\":{\"x\":196,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2474\",\"parent_id\":\"2443\",\"insertIndex\":683,\"attrs\":{\"x\":196,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2473\",\"parent_id\":\"2443\",\"insertIndex\":684,\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2472\",\"parent_id\":\"2443\",\"insertIndex\":685,\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2471\",\"parent_id\":\"2443\",\"insertIndex\":686,\"attrs\":{\"x\":196,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2470\",\"parent_id\":\"2443\",\"insertIndex\":687,\"attrs\":{\"x\":196,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2469\",\"parent_id\":\"2443\",\"insertIndex\":688,\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2468\",\"parent_id\":\"2443\",\"insertIndex\":689,\"attrs\":{\"x\":182,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2467\",\"parent_id\":\"2443\",\"insertIndex\":690,\"attrs\":{\"x\":168,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2466\",\"parent_id\":\"2443\",\"insertIndex\":691,\"attrs\":{\"x\":168,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2465\",\"parent_id\":\"2443\",\"insertIndex\":692,\"attrs\":{\"x\":154,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2464\",\"parent_id\":\"2443\",\"insertIndex\":693,\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2463\",\"parent_id\":\"2443\",\"insertIndex\":694,\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2462\",\"parent_id\":\"2443\",\"insertIndex\":695,\"attrs\":{\"x\":154,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2461\",\"parent_id\":\"2443\",\"insertIndex\":696,\"attrs\":{\"x\":154,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2460\",\"parent_id\":\"2443\",\"insertIndex\":697,\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2459\",\"parent_id\":\"2443\",\"insertIndex\":698,\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2458\",\"parent_id\":\"2443\",\"insertIndex\":699,\"attrs\":{\"x\":140,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2457\",\"parent_id\":\"2443\",\"insertIndex\":700,\"attrs\":{\"x\":140,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2456\",\"parent_id\":\"2443\",\"insertIndex\":701,\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2455\",\"parent_id\":\"2443\",\"insertIndex\":702,\"attrs\":{\"x\":126,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2454\",\"parent_id\":\"2443\",\"insertIndex\":703,\"attrs\":{\"x\":126,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2453\",\"parent_id\":\"2443\",\"insertIndex\":704,\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2452\",\"parent_id\":\"2443\",\"insertIndex\":705,\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2451\",\"parent_id\":\"2443\",\"insertIndex\":706,\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2450\",\"parent_id\":\"2443\",\"insertIndex\":707,\"attrs\":{\"x\":112,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2449\",\"parent_id\":\"2443\",\"insertIndex\":708,\"attrs\":{\"x\":112,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2448\",\"parent_id\":\"2443\",\"insertIndex\":709,\"attrs\":{\"x\":112,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2447\",\"parent_id\":\"2443\",\"insertIndex\":710,\"attrs\":{\"x\":112,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2446\",\"parent_id\":\"2443\",\"insertIndex\":711,\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2445\",\"parent_id\":\"2443\",\"insertIndex\":712,\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2444\",\"parent_id\":\"2443\",\"insertIndex\":713,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2978\",\"parent_id\":\"2443\",\"insertIndex\":714,\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2984\",\"parent_id\":\"2443\",\"insertIndex\":715,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 38\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2995\",\"parent_id\":\"2443\",\"insertIndex\":716,\"attrs\":{\"x\":441,\"y\":257,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3001\",\"parent_id\":\"2443\",\"insertIndex\":717,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3008\",\"parent_id\":\"2443\",\"insertIndex\":718,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 61\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3014\",\"parent_id\":\"2443\",\"insertIndex\":719,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 67\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2615\",\"parent_id\":\"1000\",\"insertIndex\":720,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"2786\",\"parent_id\":\"2615\",\"insertIndex\":721,\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2785\",\"parent_id\":\"2615\",\"insertIndex\":722,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2784\",\"parent_id\":\"2615\",\"insertIndex\":723,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2783\",\"parent_id\":\"2615\",\"insertIndex\":724,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2782\",\"parent_id\":\"2615\",\"insertIndex\":725,\"attrs\":{\"x\":490,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2781\",\"parent_id\":\"2615\",\"insertIndex\":726,\"attrs\":{\"x\":490,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2780\",\"parent_id\":\"2615\",\"insertIndex\":727,\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2779\",\"parent_id\":\"2615\",\"insertIndex\":728,\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2778\",\"parent_id\":\"2615\",\"insertIndex\":729,\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2777\",\"parent_id\":\"2615\",\"insertIndex\":730,\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2776\",\"parent_id\":\"2615\",\"insertIndex\":731,\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2775\",\"parent_id\":\"2615\",\"insertIndex\":732,\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2774\",\"parent_id\":\"2615\",\"insertIndex\":733,\"attrs\":{\"x\":476,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2773\",\"parent_id\":\"2615\",\"insertIndex\":734,\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2772\",\"parent_id\":\"2615\",\"insertIndex\":735,\"attrs\":{\"x\":476,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2771\",\"parent_id\":\"2615\",\"insertIndex\":736,\"attrs\":{\"x\":476,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2770\",\"parent_id\":\"2615\",\"insertIndex\":737,\"attrs\":{\"x\":476,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2769\",\"parent_id\":\"2615\",\"insertIndex\":738,\"attrs\":{\"x\":476,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2768\",\"parent_id\":\"2615\",\"insertIndex\":739,\"attrs\":{\"x\":476,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2767\",\"parent_id\":\"2615\",\"insertIndex\":740,\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2766\",\"parent_id\":\"2615\",\"insertIndex\":741,\"attrs\":{\"x\":462,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2765\",\"parent_id\":\"2615\",\"insertIndex\":742,\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2764\",\"parent_id\":\"2615\",\"insertIndex\":743,\"attrs\":{\"x\":462,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2763\",\"parent_id\":\"2615\",\"insertIndex\":744,\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2762\",\"parent_id\":\"2615\",\"insertIndex\":745,\"attrs\":{\"x\":448,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2761\",\"parent_id\":\"2615\",\"insertIndex\":746,\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2760\",\"parent_id\":\"2615\",\"insertIndex\":747,\"attrs\":{\"x\":448,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2759\",\"parent_id\":\"2615\",\"insertIndex\":748,\"attrs\":{\"x\":448,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2758\",\"parent_id\":\"2615\",\"insertIndex\":749,\"attrs\":{\"x\":448,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2757\",\"parent_id\":\"2615\",\"insertIndex\":750,\"attrs\":{\"x\":448,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2756\",\"parent_id\":\"2615\",\"insertIndex\":751,\"attrs\":{\"x\":434,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2755\",\"parent_id\":\"2615\",\"insertIndex\":752,\"attrs\":{\"x\":434,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2754\",\"parent_id\":\"2615\",\"insertIndex\":753,\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2753\",\"parent_id\":\"2615\",\"insertIndex\":754,\"attrs\":{\"x\":434,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2752\",\"parent_id\":\"2615\",\"insertIndex\":755,\"attrs\":{\"x\":434,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2751\",\"parent_id\":\"2615\",\"insertIndex\":756,\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2750\",\"parent_id\":\"2615\",\"insertIndex\":757,\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2749\",\"parent_id\":\"2615\",\"insertIndex\":758,\"attrs\":{\"x\":420,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2748\",\"parent_id\":\"2615\",\"insertIndex\":759,\"attrs\":{\"x\":420,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2747\",\"parent_id\":\"2615\",\"insertIndex\":760,\"attrs\":{\"x\":420,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2746\",\"parent_id\":\"2615\",\"insertIndex\":761,\"attrs\":{\"x\":420,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2745\",\"parent_id\":\"2615\",\"insertIndex\":762,\"attrs\":{\"x\":406,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2744\",\"parent_id\":\"2615\",\"insertIndex\":763,\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2743\",\"parent_id\":\"2615\",\"insertIndex\":764,\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2742\",\"parent_id\":\"2615\",\"insertIndex\":765,\"attrs\":{\"x\":406,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2741\",\"parent_id\":\"2615\",\"insertIndex\":766,\"attrs\":{\"x\":406,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2740\",\"parent_id\":\"2615\",\"insertIndex\":767,\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2739\",\"parent_id\":\"2615\",\"insertIndex\":768,\"attrs\":{\"x\":392,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2738\",\"parent_id\":\"2615\",\"insertIndex\":769,\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2737\",\"parent_id\":\"2615\",\"insertIndex\":770,\"attrs\":{\"x\":378,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2736\",\"parent_id\":\"2615\",\"insertIndex\":771,\"attrs\":{\"x\":378,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2735\",\"parent_id\":\"2615\",\"insertIndex\":772,\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2734\",\"parent_id\":\"2615\",\"insertIndex\":773,\"attrs\":{\"x\":364,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2733\",\"parent_id\":\"2615\",\"insertIndex\":774,\"attrs\":{\"x\":364,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2732\",\"parent_id\":\"2615\",\"insertIndex\":775,\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2731\",\"parent_id\":\"2615\",\"insertIndex\":776,\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2730\",\"parent_id\":\"2615\",\"insertIndex\":777,\"attrs\":{\"x\":364,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2729\",\"parent_id\":\"2615\",\"insertIndex\":778,\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2728\",\"parent_id\":\"2615\",\"insertIndex\":779,\"attrs\":{\"x\":364,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2727\",\"parent_id\":\"2615\",\"insertIndex\":780,\"attrs\":{\"x\":364,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2726\",\"parent_id\":\"2615\",\"insertIndex\":781,\"attrs\":{\"x\":350,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2725\",\"parent_id\":\"2615\",\"insertIndex\":782,\"attrs\":{\"x\":350,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2724\",\"parent_id\":\"2615\",\"insertIndex\":783,\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2723\",\"parent_id\":\"2615\",\"insertIndex\":784,\"attrs\":{\"x\":336,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2722\",\"parent_id\":\"2615\",\"insertIndex\":785,\"attrs\":{\"x\":336,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2721\",\"parent_id\":\"2615\",\"insertIndex\":786,\"attrs\":{\"x\":336,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2720\",\"parent_id\":\"2615\",\"insertIndex\":787,\"attrs\":{\"x\":322,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2719\",\"parent_id\":\"2615\",\"insertIndex\":788,\"attrs\":{\"x\":322,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2718\",\"parent_id\":\"2615\",\"insertIndex\":789,\"attrs\":{\"x\":322,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2717\",\"parent_id\":\"2615\",\"insertIndex\":790,\"attrs\":{\"x\":322,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2716\",\"parent_id\":\"2615\",\"insertIndex\":791,\"attrs\":{\"x\":322,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2715\",\"parent_id\":\"2615\",\"insertIndex\":792,\"attrs\":{\"x\":308,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2714\",\"parent_id\":\"2615\",\"insertIndex\":793,\"attrs\":{\"x\":308,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2713\",\"parent_id\":\"2615\",\"insertIndex\":794,\"attrs\":{\"x\":308,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2712\",\"parent_id\":\"2615\",\"insertIndex\":795,\"attrs\":{\"x\":308,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2711\",\"parent_id\":\"2615\",\"insertIndex\":796,\"attrs\":{\"x\":308,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2710\",\"parent_id\":\"2615\",\"insertIndex\":797,\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2709\",\"parent_id\":\"2615\",\"insertIndex\":798,\"attrs\":{\"x\":308,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2708\",\"parent_id\":\"2615\",\"insertIndex\":799,\"attrs\":{\"x\":308,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2707\",\"parent_id\":\"2615\",\"insertIndex\":800,\"attrs\":{\"x\":308,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2706\",\"parent_id\":\"2615\",\"insertIndex\":801,\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2705\",\"parent_id\":\"2615\",\"insertIndex\":802,\"attrs\":{\"x\":294,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2704\",\"parent_id\":\"2615\",\"insertIndex\":803,\"attrs\":{\"x\":294,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2703\",\"parent_id\":\"2615\",\"insertIndex\":804,\"attrs\":{\"x\":280,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2702\",\"parent_id\":\"2615\",\"insertIndex\":805,\"attrs\":{\"x\":280,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2701\",\"parent_id\":\"2615\",\"insertIndex\":806,\"attrs\":{\"x\":280,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2700\",\"parent_id\":\"2615\",\"insertIndex\":807,\"attrs\":{\"x\":266,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2699\",\"parent_id\":\"2615\",\"insertIndex\":808,\"attrs\":{\"x\":266,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2698\",\"parent_id\":\"2615\",\"insertIndex\":809,\"attrs\":{\"x\":266,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2697\",\"parent_id\":\"2615\",\"insertIndex\":810,\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2696\",\"parent_id\":\"2615\",\"insertIndex\":811,\"attrs\":{\"x\":266,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2695\",\"parent_id\":\"2615\",\"insertIndex\":812,\"attrs\":{\"x\":266,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2694\",\"parent_id\":\"2615\",\"insertIndex\":813,\"attrs\":{\"x\":266,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2693\",\"parent_id\":\"2615\",\"insertIndex\":814,\"attrs\":{\"x\":266,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2692\",\"parent_id\":\"2615\",\"insertIndex\":815,\"attrs\":{\"x\":252,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2691\",\"parent_id\":\"2615\",\"insertIndex\":816,\"attrs\":{\"x\":252,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2690\",\"parent_id\":\"2615\",\"insertIndex\":817,\"attrs\":{\"x\":252,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2689\",\"parent_id\":\"2615\",\"insertIndex\":818,\"attrs\":{\"x\":252,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2688\",\"parent_id\":\"2615\",\"insertIndex\":819,\"attrs\":{\"x\":252,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2687\",\"parent_id\":\"2615\",\"insertIndex\":820,\"attrs\":{\"x\":252,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2686\",\"parent_id\":\"2615\",\"insertIndex\":821,\"attrs\":{\"x\":252,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2685\",\"parent_id\":\"2615\",\"insertIndex\":822,\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2684\",\"parent_id\":\"2615\",\"insertIndex\":823,\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2683\",\"parent_id\":\"2615\",\"insertIndex\":824,\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2682\",\"parent_id\":\"2615\",\"insertIndex\":825,\"attrs\":{\"x\":238,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2681\",\"parent_id\":\"2615\",\"insertIndex\":826,\"attrs\":{\"x\":238,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2680\",\"parent_id\":\"2615\",\"insertIndex\":827,\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2679\",\"parent_id\":\"2615\",\"insertIndex\":828,\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2678\",\"parent_id\":\"2615\",\"insertIndex\":829,\"attrs\":{\"x\":224,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2677\",\"parent_id\":\"2615\",\"insertIndex\":830,\"attrs\":{\"x\":224,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2676\",\"parent_id\":\"2615\",\"insertIndex\":831,\"attrs\":{\"x\":224,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2675\",\"parent_id\":\"2615\",\"insertIndex\":832,\"attrs\":{\"x\":224,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2674\",\"parent_id\":\"2615\",\"insertIndex\":833,\"attrs\":{\"x\":224,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2673\",\"parent_id\":\"2615\",\"insertIndex\":834,\"attrs\":{\"x\":224,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2672\",\"parent_id\":\"2615\",\"insertIndex\":835,\"attrs\":{\"x\":224,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2671\",\"parent_id\":\"2615\",\"insertIndex\":836,\"attrs\":{\"x\":224,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2670\",\"parent_id\":\"2615\",\"insertIndex\":837,\"attrs\":{\"x\":224,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2669\",\"parent_id\":\"2615\",\"insertIndex\":838,\"attrs\":{\"x\":224,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2668\",\"parent_id\":\"2615\",\"insertIndex\":839,\"attrs\":{\"x\":224,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2667\",\"parent_id\":\"2615\",\"insertIndex\":840,\"attrs\":{\"x\":224,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2666\",\"parent_id\":\"2615\",\"insertIndex\":841,\"attrs\":{\"x\":224,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2665\",\"parent_id\":\"2615\",\"insertIndex\":842,\"attrs\":{\"x\":224,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2664\",\"parent_id\":\"2615\",\"insertIndex\":843,\"attrs\":{\"x\":210,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2663\",\"parent_id\":\"2615\",\"insertIndex\":844,\"attrs\":{\"x\":210,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2662\",\"parent_id\":\"2615\",\"insertIndex\":845,\"attrs\":{\"x\":210,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2661\",\"parent_id\":\"2615\",\"insertIndex\":846,\"attrs\":{\"x\":210,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2660\",\"parent_id\":\"2615\",\"insertIndex\":847,\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2659\",\"parent_id\":\"2615\",\"insertIndex\":848,\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2658\",\"parent_id\":\"2615\",\"insertIndex\":849,\"attrs\":{\"x\":196,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2657\",\"parent_id\":\"2615\",\"insertIndex\":850,\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2656\",\"parent_id\":\"2615\",\"insertIndex\":851,\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2655\",\"parent_id\":\"2615\",\"insertIndex\":852,\"attrs\":{\"x\":196,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2654\",\"parent_id\":\"2615\",\"insertIndex\":853,\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2653\",\"parent_id\":\"2615\",\"insertIndex\":854,\"attrs\":{\"x\":182,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2652\",\"parent_id\":\"2615\",\"insertIndex\":855,\"attrs\":{\"x\":182,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2651\",\"parent_id\":\"2615\",\"insertIndex\":856,\"attrs\":{\"x\":182,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2650\",\"parent_id\":\"2615\",\"insertIndex\":857,\"attrs\":{\"x\":182,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2649\",\"parent_id\":\"2615\",\"insertIndex\":858,\"attrs\":{\"x\":182,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2648\",\"parent_id\":\"2615\",\"insertIndex\":859,\"attrs\":{\"x\":182,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2647\",\"parent_id\":\"2615\",\"insertIndex\":860,\"attrs\":{\"x\":182,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2646\",\"parent_id\":\"2615\",\"insertIndex\":861,\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2645\",\"parent_id\":\"2615\",\"insertIndex\":862,\"attrs\":{\"x\":168,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2644\",\"parent_id\":\"2615\",\"insertIndex\":863,\"attrs\":{\"x\":168,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2643\",\"parent_id\":\"2615\",\"insertIndex\":864,\"attrs\":{\"x\":168,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2642\",\"parent_id\":\"2615\",\"insertIndex\":865,\"attrs\":{\"x\":168,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2641\",\"parent_id\":\"2615\",\"insertIndex\":866,\"attrs\":{\"x\":168,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2640\",\"parent_id\":\"2615\",\"insertIndex\":867,\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2639\",\"parent_id\":\"2615\",\"insertIndex\":868,\"attrs\":{\"x\":168,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2638\",\"parent_id\":\"2615\",\"insertIndex\":869,\"attrs\":{\"x\":154,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2637\",\"parent_id\":\"2615\",\"insertIndex\":870,\"attrs\":{\"x\":154,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2636\",\"parent_id\":\"2615\",\"insertIndex\":871,\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2635\",\"parent_id\":\"2615\",\"insertIndex\":872,\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2634\",\"parent_id\":\"2615\",\"insertIndex\":873,\"attrs\":{\"x\":154,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2633\",\"parent_id\":\"2615\",\"insertIndex\":874,\"attrs\":{\"x\":154,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2632\",\"parent_id\":\"2615\",\"insertIndex\":875,\"attrs\":{\"x\":154,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2631\",\"parent_id\":\"2615\",\"insertIndex\":876,\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2630\",\"parent_id\":\"2615\",\"insertIndex\":877,\"attrs\":{\"x\":140,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2629\",\"parent_id\":\"2615\",\"insertIndex\":878,\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2628\",\"parent_id\":\"2615\",\"insertIndex\":879,\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2627\",\"parent_id\":\"2615\",\"insertIndex\":880,\"attrs\":{\"x\":140,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2626\",\"parent_id\":\"2615\",\"insertIndex\":881,\"attrs\":{\"x\":126,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2625\",\"parent_id\":\"2615\",\"insertIndex\":882,\"attrs\":{\"x\":126,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2624\",\"parent_id\":\"2615\",\"insertIndex\":883,\"attrs\":{\"x\":126,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2623\",\"parent_id\":\"2615\",\"insertIndex\":884,\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2622\",\"parent_id\":\"2615\",\"insertIndex\":885,\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2621\",\"parent_id\":\"2615\",\"insertIndex\":886,\"attrs\":{\"x\":126,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2620\",\"parent_id\":\"2615\",\"insertIndex\":887,\"attrs\":{\"x\":126,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2619\",\"parent_id\":\"2615\",\"insertIndex\":888,\"attrs\":{\"x\":112,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2618\",\"parent_id\":\"2615\",\"insertIndex\":889,\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2617\",\"parent_id\":\"2615\",\"insertIndex\":890,\"attrs\":{\"x\":112,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2616\",\"parent_id\":\"2615\",\"insertIndex\":891,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2979\",\"parent_id\":\"2615\",\"insertIndex\":892,\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2985\",\"parent_id\":\"2615\",\"insertIndex\":893,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 39\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2996\",\"parent_id\":\"2615\",\"insertIndex\":894,\"attrs\":{\"x\":124,\"y\":36,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3002\",\"parent_id\":\"2615\",\"insertIndex\":895,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3009\",\"parent_id\":\"2615\",\"insertIndex\":896,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 62\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3015\",\"parent_id\":\"2615\",\"insertIndex\":897,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 68\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2787\",\"parent_id\":\"1000\",\"insertIndex\":898,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXIYVRuxk3cWdZodi3GddVtFm7RQ5dqTh3Na5Rvvj3bVxZqnn3Afy0c4QOUSC8bMUOKZKwe0WOeXG4YaROFcm0dCVSTRu8aWTOPbuwfpQuYUU5ZhUuCec1c9SuWTc9bLWuJY4xezVudWw5ZfTuHdw1eHXwQQT86QwcMaTw/sycaVb45k2cBfX086xcVS387O1cLZ/w+23cfX144Zw8Ecl19B1ASRt96Vy8Obtx/rx8ZVJ55j18DfB19/z8XUB98IH8qMOABLSSAASg8sEEuKlBBKzYQQiwhaCEpOcghLy04ISoz+GEtJ5hhKD+kEa4oRBGrNAQSrCJ0Uak61FGvLixRqjHsMa0ljDGoPbxxritccas3HHJsIGIJaTjCCW8sMglqMvJJbSaSSWg+qinCKiAAIAA=\",\"marked\":false}},{\"type\":3,\"id\":\"2958\",\"parent_id\":\"2787\",\"insertIndex\":899,\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2957\",\"parent_id\":\"2787\",\"insertIndex\":900,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2956\",\"parent_id\":\"2787\",\"insertIndex\":901,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2955\",\"parent_id\":\"2787\",\"insertIndex\":902,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2954\",\"parent_id\":\"2787\",\"insertIndex\":903,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2953\",\"parent_id\":\"2787\",\"insertIndex\":904,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2952\",\"parent_id\":\"2787\",\"insertIndex\":905,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2951\",\"parent_id\":\"2787\",\"insertIndex\":906,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2950\",\"parent_id\":\"2787\",\"insertIndex\":907,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2949\",\"parent_id\":\"2787\",\"insertIndex\":908,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2948\",\"parent_id\":\"2787\",\"insertIndex\":909,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2947\",\"parent_id\":\"2787\",\"insertIndex\":910,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2946\",\"parent_id\":\"2787\",\"insertIndex\":911,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2945\",\"parent_id\":\"2787\",\"insertIndex\":912,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2944\",\"parent_id\":\"2787\",\"insertIndex\":913,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2943\",\"parent_id\":\"2787\",\"insertIndex\":914,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2942\",\"parent_id\":\"2787\",\"insertIndex\":915,\"attrs\":{\"x\":490,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2941\",\"parent_id\":\"2787\",\"insertIndex\":916,\"attrs\":{\"x\":490,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2940\",\"parent_id\":\"2787\",\"insertIndex\":917,\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2939\",\"parent_id\":\"2787\",\"insertIndex\":918,\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2938\",\"parent_id\":\"2787\",\"insertIndex\":919,\"attrs\":{\"x\":490,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2937\",\"parent_id\":\"2787\",\"insertIndex\":920,\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2936\",\"parent_id\":\"2787\",\"insertIndex\":921,\"attrs\":{\"x\":476,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2935\",\"parent_id\":\"2787\",\"insertIndex\":922,\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2934\",\"parent_id\":\"2787\",\"insertIndex\":923,\"attrs\":{\"x\":476,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2933\",\"parent_id\":\"2787\",\"insertIndex\":924,\"attrs\":{\"x\":476,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2932\",\"parent_id\":\"2787\",\"insertIndex\":925,\"attrs\":{\"x\":476,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2931\",\"parent_id\":\"2787\",\"insertIndex\":926,\"attrs\":{\"x\":476,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2930\",\"parent_id\":\"2787\",\"insertIndex\":927,\"attrs\":{\"x\":476,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2929\",\"parent_id\":\"2787\",\"insertIndex\":928,\"attrs\":{\"x\":476,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2928\",\"parent_id\":\"2787\",\"insertIndex\":929,\"attrs\":{\"x\":462,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2927\",\"parent_id\":\"2787\",\"insertIndex\":930,\"attrs\":{\"x\":462,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2926\",\"parent_id\":\"2787\",\"insertIndex\":931,\"attrs\":{\"x\":462,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2925\",\"parent_id\":\"2787\",\"insertIndex\":932,\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2924\",\"parent_id\":\"2787\",\"insertIndex\":933,\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2923\",\"parent_id\":\"2787\",\"insertIndex\":934,\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2922\",\"parent_id\":\"2787\",\"insertIndex\":935,\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2921\",\"parent_id\":\"2787\",\"insertIndex\":936,\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2920\",\"parent_id\":\"2787\",\"insertIndex\":937,\"attrs\":{\"x\":448,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2919\",\"parent_id\":\"2787\",\"insertIndex\":938,\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2918\",\"parent_id\":\"2787\",\"insertIndex\":939,\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2917\",\"parent_id\":\"2787\",\"insertIndex\":940,\"attrs\":{\"x\":434,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2916\",\"parent_id\":\"2787\",\"insertIndex\":941,\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2915\",\"parent_id\":\"2787\",\"insertIndex\":942,\"attrs\":{\"x\":434,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2914\",\"parent_id\":\"2787\",\"insertIndex\":943,\"attrs\":{\"x\":420,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2913\",\"parent_id\":\"2787\",\"insertIndex\":944,\"attrs\":{\"x\":420,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2912\",\"parent_id\":\"2787\",\"insertIndex\":945,\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2911\",\"parent_id\":\"2787\",\"insertIndex\":946,\"attrs\":{\"x\":420,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2910\",\"parent_id\":\"2787\",\"insertIndex\":947,\"attrs\":{\"x\":420,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2909\",\"parent_id\":\"2787\",\"insertIndex\":948,\"attrs\":{\"x\":420,\"y\":224,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2908\",\"parent_id\":\"2787\",\"insertIndex\":949,\"attrs\":{\"x\":420,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2907\",\"parent_id\":\"2787\",\"insertIndex\":950,\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2906\",\"parent_id\":\"2787\",\"insertIndex\":951,\"attrs\":{\"x\":420,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2905\",\"parent_id\":\"2787\",\"insertIndex\":952,\"attrs\":{\"x\":406,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2904\",\"parent_id\":\"2787\",\"insertIndex\":953,\"attrs\":{\"x\":406,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2903\",\"parent_id\":\"2787\",\"insertIndex\":954,\"attrs\":{\"x\":406,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2902\",\"parent_id\":\"2787\",\"insertIndex\":955,\"attrs\":{\"x\":406,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2901\",\"parent_id\":\"2787\",\"insertIndex\":956,\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2900\",\"parent_id\":\"2787\",\"insertIndex\":957,\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2899\",\"parent_id\":\"2787\",\"insertIndex\":958,\"attrs\":{\"x\":406,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2898\",\"parent_id\":\"2787\",\"insertIndex\":959,\"attrs\":{\"x\":392,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2897\",\"parent_id\":\"2787\",\"insertIndex\":960,\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2896\",\"parent_id\":\"2787\",\"insertIndex\":961,\"attrs\":{\"x\":392,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2895\",\"parent_id\":\"2787\",\"insertIndex\":962,\"attrs\":{\"x\":392,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2894\",\"parent_id\":\"2787\",\"insertIndex\":963,\"attrs\":{\"x\":392,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2893\",\"parent_id\":\"2787\",\"insertIndex\":964,\"attrs\":{\"x\":392,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2892\",\"parent_id\":\"2787\",\"insertIndex\":965,\"attrs\":{\"x\":378,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2891\",\"parent_id\":\"2787\",\"insertIndex\":966,\"attrs\":{\"x\":378,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2890\",\"parent_id\":\"2787\",\"insertIndex\":967,\"attrs\":{\"x\":378,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2889\",\"parent_id\":\"2787\",\"insertIndex\":968,\"attrs\":{\"x\":364,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2888\",\"parent_id\":\"2787\",\"insertIndex\":969,\"attrs\":{\"x\":364,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2887\",\"parent_id\":\"2787\",\"insertIndex\":970,\"attrs\":{\"x\":364,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2886\",\"parent_id\":\"2787\",\"insertIndex\":971,\"attrs\":{\"x\":364,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2885\",\"parent_id\":\"2787\",\"insertIndex\":972,\"attrs\":{\"x\":364,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2884\",\"parent_id\":\"2787\",\"insertIndex\":973,\"attrs\":{\"x\":350,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2883\",\"parent_id\":\"2787\",\"insertIndex\":974,\"attrs\":{\"x\":350,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2882\",\"parent_id\":\"2787\",\"insertIndex\":975,\"attrs\":{\"x\":350,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2881\",\"parent_id\":\"2787\",\"insertIndex\":976,\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2880\",\"parent_id\":\"2787\",\"insertIndex\":977,\"attrs\":{\"x\":336,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2879\",\"parent_id\":\"2787\",\"insertIndex\":978,\"attrs\":{\"x\":336,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2878\",\"parent_id\":\"2787\",\"insertIndex\":979,\"attrs\":{\"x\":322,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2877\",\"parent_id\":\"2787\",\"insertIndex\":980,\"attrs\":{\"x\":322,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2876\",\"parent_id\":\"2787\",\"insertIndex\":981,\"attrs\":{\"x\":322,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2875\",\"parent_id\":\"2787\",\"insertIndex\":982,\"attrs\":{\"x\":308,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2874\",\"parent_id\":\"2787\",\"insertIndex\":983,\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2873\",\"parent_id\":\"2787\",\"insertIndex\":984,\"attrs\":{\"x\":308,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2872\",\"parent_id\":\"2787\",\"insertIndex\":985,\"attrs\":{\"x\":294,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2871\",\"parent_id\":\"2787\",\"insertIndex\":986,\"attrs\":{\"x\":294,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2870\",\"parent_id\":\"2787\",\"insertIndex\":987,\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2869\",\"parent_id\":\"2787\",\"insertIndex\":988,\"attrs\":{\"x\":280,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2868\",\"parent_id\":\"2787\",\"insertIndex\":989,\"attrs\":{\"x\":280,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2867\",\"parent_id\":\"2787\",\"insertIndex\":990,\"attrs\":{\"x\":280,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2866\",\"parent_id\":\"2787\",\"insertIndex\":991,\"attrs\":{\"x\":280,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2865\",\"parent_id\":\"2787\",\"insertIndex\":992,\"attrs\":{\"x\":280,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2864\",\"parent_id\":\"2787\",\"insertIndex\":993,\"attrs\":{\"x\":280,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2863\",\"parent_id\":\"2787\",\"insertIndex\":994,\"attrs\":{\"x\":266,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2862\",\"parent_id\":\"2787\",\"insertIndex\":995,\"attrs\":{\"x\":266,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2861\",\"parent_id\":\"2787\",\"insertIndex\":996,\"attrs\":{\"x\":252,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2860\",\"parent_id\":\"2787\",\"insertIndex\":997,\"attrs\":{\"x\":252,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2859\",\"parent_id\":\"2787\",\"insertIndex\":998,\"attrs\":{\"x\":238,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2858\",\"parent_id\":\"2787\",\"insertIndex\":999,\"attrs\":{\"x\":238,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2857\",\"parent_id\":\"2787\",\"insertIndex\":1000,\"attrs\":{\"x\":238,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2856\",\"parent_id\":\"2787\",\"insertIndex\":1001,\"attrs\":{\"x\":238,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2855\",\"parent_id\":\"2787\",\"insertIndex\":1002,\"attrs\":{\"x\":238,\"y\":182,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2854\",\"parent_id\":\"2787\",\"insertIndex\":1003,\"attrs\":{\"x\":238,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2853\",\"parent_id\":\"2787\",\"insertIndex\":1004,\"attrs\":{\"x\":238,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2852\",\"parent_id\":\"2787\",\"insertIndex\":1005,\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2851\",\"parent_id\":\"2787\",\"insertIndex\":1006,\"attrs\":{\"x\":238,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2850\",\"parent_id\":\"2787\",\"insertIndex\":1007,\"attrs\":{\"x\":238,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2849\",\"parent_id\":\"2787\",\"insertIndex\":1008,\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2848\",\"parent_id\":\"2787\",\"insertIndex\":1009,\"attrs\":{\"x\":238,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2847\",\"parent_id\":\"2787\",\"insertIndex\":1010,\"attrs\":{\"x\":238,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2846\",\"parent_id\":\"2787\",\"insertIndex\":1011,\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2845\",\"parent_id\":\"2787\",\"insertIndex\":1012,\"attrs\":{\"x\":238,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2844\",\"parent_id\":\"2787\",\"insertIndex\":1013,\"attrs\":{\"x\":238,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2843\",\"parent_id\":\"2787\",\"insertIndex\":1014,\"attrs\":{\"x\":224,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2842\",\"parent_id\":\"2787\",\"insertIndex\":1015,\"attrs\":{\"x\":224,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2841\",\"parent_id\":\"2787\",\"insertIndex\":1016,\"attrs\":{\"x\":210,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2840\",\"parent_id\":\"2787\",\"insertIndex\":1017,\"attrs\":{\"x\":210,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2839\",\"parent_id\":\"2787\",\"insertIndex\":1018,\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2838\",\"parent_id\":\"2787\",\"insertIndex\":1019,\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2837\",\"parent_id\":\"2787\",\"insertIndex\":1020,\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2836\",\"parent_id\":\"2787\",\"insertIndex\":1021,\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2835\",\"parent_id\":\"2787\",\"insertIndex\":1022,\"attrs\":{\"x\":196,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2834\",\"parent_id\":\"2787\",\"insertIndex\":1023,\"attrs\":{\"x\":196,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2833\",\"parent_id\":\"2787\",\"insertIndex\":1024,\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2832\",\"parent_id\":\"2787\",\"insertIndex\":1025,\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2831\",\"parent_id\":\"2787\",\"insertIndex\":1026,\"attrs\":{\"x\":196,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2830\",\"parent_id\":\"2787\",\"insertIndex\":1027,\"attrs\":{\"x\":196,\"y\":56,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2829\",\"parent_id\":\"2787\",\"insertIndex\":1028,\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2828\",\"parent_id\":\"2787\",\"insertIndex\":1029,\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2827\",\"parent_id\":\"2787\",\"insertIndex\":1030,\"attrs\":{\"x\":182,\"y\":210,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2826\",\"parent_id\":\"2787\",\"insertIndex\":1031,\"attrs\":{\"x\":182,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2825\",\"parent_id\":\"2787\",\"insertIndex\":1032,\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2824\",\"parent_id\":\"2787\",\"insertIndex\":1033,\"attrs\":{\"x\":168,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2823\",\"parent_id\":\"2787\",\"insertIndex\":1034,\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2822\",\"parent_id\":\"2787\",\"insertIndex\":1035,\"attrs\":{\"x\":168,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2821\",\"parent_id\":\"2787\",\"insertIndex\":1036,\"attrs\":{\"x\":168,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2820\",\"parent_id\":\"2787\",\"insertIndex\":1037,\"attrs\":{\"x\":168,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2819\",\"parent_id\":\"2787\",\"insertIndex\":1038,\"attrs\":{\"x\":154,\"y\":280,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2818\",\"parent_id\":\"2787\",\"insertIndex\":1039,\"attrs\":{\"x\":154,\"y\":238,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2817\",\"parent_id\":\"2787\",\"insertIndex\":1040,\"attrs\":{\"x\":154,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2816\",\"parent_id\":\"2787\",\"insertIndex\":1041,\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2815\",\"parent_id\":\"2787\",\"insertIndex\":1042,\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2814\",\"parent_id\":\"2787\",\"insertIndex\":1043,\"attrs\":{\"x\":154,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2813\",\"parent_id\":\"2787\",\"insertIndex\":1044,\"attrs\":{\"x\":140,\"y\":266,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2812\",\"parent_id\":\"2787\",\"insertIndex\":1045,\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2811\",\"parent_id\":\"2787\",\"insertIndex\":1046,\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2810\",\"parent_id\":\"2787\",\"insertIndex\":1047,\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2809\",\"parent_id\":\"2787\",\"insertIndex\":1048,\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2808\",\"parent_id\":\"2787\",\"insertIndex\":1049,\"attrs\":{\"x\":140,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2807\",\"parent_id\":\"2787\",\"insertIndex\":1050,\"attrs\":{\"x\":140,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2806\",\"parent_id\":\"2787\",\"insertIndex\":1051,\"attrs\":{\"x\":126,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2805\",\"parent_id\":\"2787\",\"insertIndex\":1052,\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2804\",\"parent_id\":\"2787\",\"insertIndex\":1053,\"attrs\":{\"x\":126,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2803\",\"parent_id\":\"2787\",\"insertIndex\":1054,\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2802\",\"parent_id\":\"2787\",\"insertIndex\":1055,\"attrs\":{\"x\":126,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2801\",\"parent_id\":\"2787\",\"insertIndex\":1056,\"attrs\":{\"x\":126,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2800\",\"parent_id\":\"2787\",\"insertIndex\":1057,\"attrs\":{\"x\":112,\"y\":252,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2799\",\"parent_id\":\"2787\",\"insertIndex\":1058,\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2798\",\"parent_id\":\"2787\",\"insertIndex\":1059,\"attrs\":{\"x\":112,\"y\":168,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2797\",\"parent_id\":\"2787\",\"insertIndex\":1060,\"attrs\":{\"x\":112,\"y\":154,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2796\",\"parent_id\":\"2787\",\"insertIndex\":1061,\"attrs\":{\"x\":112,\"y\":140,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2795\",\"parent_id\":\"2787\",\"insertIndex\":1062,\"attrs\":{\"x\":112,\"y\":126,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2794\",\"parent_id\":\"2787\",\"insertIndex\":1063,\"attrs\":{\"x\":112,\"y\":112,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2793\",\"parent_id\":\"2787\",\"insertIndex\":1064,\"attrs\":{\"x\":112,\"y\":98,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2792\",\"parent_id\":\"2787\",\"insertIndex\":1065,\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2791\",\"parent_id\":\"2787\",\"insertIndex\":1066,\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2790\",\"parent_id\":\"2787\",\"insertIndex\":1067,\"attrs\":{\"x\":112,\"y\":28,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2789\",\"parent_id\":\"2787\",\"insertIndex\":1068,\"attrs\":{\"x\":112,\"y\":14,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2788\",\"parent_id\":\"2787\",\"insertIndex\":1069,\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegameSprites_n0\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2980\",\"parent_id\":\"2787\",\"insertIndex\":1070,\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegameSprites_n_you\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2986\",\"parent_id\":\"2787\",\"insertIndex\":1071,\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 40\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"sharedtext\":true}},{\"type\":3,\"id\":\"2997\",\"parent_id\":\"2787\",\"insertIndex\":1072,\"attrs\":{\"x\":136,\"y\":62,\"w\":66,\"h\":24,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3003\",\"parent_id\":\"2787\",\"insertIndex\":1073,\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3010\",\"parent_id\":\"2787\",\"insertIndex\":1074,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 63\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"3016\",\"parent_id\":\"2787\",\"insertIndex\":1075,\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 69\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"2966\",\"parent_id\":\"1000\",\"insertIndex\":1076,\"attrs\":{\"script\":\"\",\"name\":\"intro2\",\"paint\":\"\",\"marked\":false}},{\"type\":3,\"id\":\"2967\",\"parent_id\":\"2966\",\"insertIndex\":1077,\"attrs\":{\"x\":4,\"y\":65,\"w\":442,\"h\":287,\"is_bg_velement_id\":\"\",\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":72,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegameSpritestitle\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2968\",\"parent_id\":\"2966\",\"insertIndex\":1078,\"attrs\":{\"x\":8,\"y\":27,\"w\":30,\"h\":26,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":61,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2969\",\"parent_id\":\"2966\",\"insertIndex\":1079,\"attrs\":{\"x\":165,\"y\":27,\"w\":30,\"h\":26,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":62,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2970\",\"parent_id\":\"2966\",\"insertIndex\":1080,\"attrs\":{\"x\":335,\"y\":27,\"w\":73,\"h\":26,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":3,\"label\":\"spacebar\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"2971\",\"parent_id\":\"2966\",\"insertIndex\":1081,\"attrs\":{\"x\":357,\"y\":230,\"w\":140,\"h\":100,\"is_bg_velement_id\":\"\",\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"hilite_uniquetocard\":false,\"checkmark\":false,\"checkmark_uniquetocard\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Begin\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tstartNewGameState\\n\\tgo to cd 2\\n\\tloadLevel\\nend mouseUp\\n-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"my button 25\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"2972\",\"parent_id\":\"2966\",\"insertIndex\":1082,\"attrs\":{\"x\":38,\"y\":24,\"w\":126,\"h\":38,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":8,\"selend\":8,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002ARROWKEY LEFT TO MOVE LEFT\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"sharedtext\":true}},{\"type\":4,\"id\":\"2973\",\"parent_id\":\"2966\",\"insertIndex\":1083,\"attrs\":{\"x\":199,\"y\":23,\"w\":137,\"h\":38,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":28,\"selend\":28,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002ARROWKEY RIGHT TO MOVE RIGHT\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"sharedtext\":true}},{\"type\":4,\"id\":\"2974\",\"parent_id\":\"2966\",\"insertIndex\":1084,\"attrs\":{\"x\":415,\"y\":25,\"w\":126,\"h\":38,\"is_bg_velement_id\":\"\",\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":13,\"selend\":13,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"scroll\":0,\"scroll_uniquetocard\":0,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002SPACE TO\\nJUMP\",\"ftxt_uniquetocard\":\"\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"sharedtext\":true}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refcommands.json",
    "content": "{\"name\": \"lngCommands\", \"entries\": [{\"title\": \"add\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002add\\u0002times_12_biuosdce\\u0002\\n\\n\\nAdds the value of number to the number in a container.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput 2 into x\\nadd 3 to x\\nanswer x -- will display \\\"5\\\"\\n\\nput \\\"1,2,3\\\" into x\\nadd 3 to item 2 of x\\nanswer x -- will display \\\"1,5,3\\\"\\n\\nadd 5 to cd fld \\\"myFld\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"answer\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002answer\\u0002times_12_biuosdce\\u0002\\n\\n\\nDisplays a dialog box.\\n\\nThe button that is pressed (1, 2, or 3) will be assigned to the variable \\\"it\\\".\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nanswer \\\"abc\\\" -- will display \\\"abc\\\"\\n\\nanswer \\\"are you sure?\\\" with \\\"OK\\\" or \\\"cancel\\\" \\nput it into whichChosen\\nif whichChosen is 1 then\\nanswer \\\"clicked OK\\\"\\nelse if whichChosen is 2 then\\nanswer \\\"clicked cancel\\\"\\nend if\\n\\nanswer \\\"many choices\\\" with \\\"btn1\\\" or \\\"btn2\\\"  or \\\"btn3\\\" \\nanswer whichChosen\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"ask\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002ask\\u0002times_12_biuosdce\\u0002\\n\\n\\nDisplays a dialog box allowing the user to type in a response.\\n\\nThe text typed will be assigned to the variable \\u0002monaco_9_biuosdce\\u0002it\\u0002times_12_biuosdce\\u0002. If the user clicks \\u0002monaco_9_biuosdce\\u0002Cancel\\u0002times_12_biuosdce\\u0002, the result will be \\u0002monaco_9_biuosdce\\u0002\\\"\\\"\\u0002times_12_biuosdce\\u0002.\\n\\nYou can say \\u0002monaco_9_biuosdce\\u0002ask \\\"prompt\\\"\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002ask \\\"prompt\\\" with \\\"default text\\\"\\u0002times_12_biuosdce\\u0002.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nask \\\"what is your name?\\\" with \\\"ben\\\"\\nput it into yourName\\nif yourName is \\\"\\\" then\\n    answer \\\"you did not type a name\\\"\\nelse\\n    answer \\\"you typed\\\" && yourName\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"beep\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002beep\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nPlay the system beep sound.\\n\"}, {\"title\": \"choose tool\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002choose tool\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nYou can use the choose command to programmatically draw shapes and lines.\\n\\nWhen a script completes, you'll be taken back to the Browse tool regardless of which tool was chosen within a script.\\n\\nThe form \\u0002monaco_9_biuosdce\\u0002choose \\\"brush\\\" tool\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002choose tool 3\\u0002times_12_biuosdce\\u0002 is also supported.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nchoose pencil tool\\nclick at 10,20\\n-- this draws a black pixel at the coordinates x=10, y=20\\n\\nchoose line tool\\ndrag from 10,20 to 30,40\\n-- this draws a line starting at the coordinates (10,20) \\n-- ending at (30,40)\\n\\n-- tools include:\\nbrush\\nbucket\\npencil\\nline\\nrect\\noval\\nroundrect\\ncurve\\nspray\\nbrowse\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"click\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002click\\u0002times_12_biuosdce\\u0002\\n\\n\\nUse the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nchoose pencil tool\\nclick at 10,20\\n-- this draws a pixel at the coordinates x=10, y=20\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"create\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002create\\u0002times_12_biuosdce\\u0002\\n\\n\\nUse \\u0002monaco_9_biuosdce\\u0002domenu \\\"new button\\\"\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002domenu \\\"new field\\\"\\u0002times_12_biuosdce\\u0002 to create a button.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\ndoMenu \\\"New Button\\\"\\nput the result into newBtn\\nset the name of cd btn id newBtn to \\\"my new button\\\"\\nset the loc of cd btn id newBtn to 30, 30\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"do\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002do\\u0002times_12_biuosdce\\u0002\\n\\n\\nTake a string, and execute it as if it were a ViperCard script.\\n\\nSimilar to eval() in other languages.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput \\\"answer \\\" into buildScript\\nput quote & \\\"abc\\\" & quote after buildScript\\ndo buildScript\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"doMenu\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002doMenu\\u0002times_12_biuosdce\\u0002\\n\\n\\nDo a menu action.\\n\\nSupported actions include:\\n\\n\\u0002monaco_9_biuosdce\\u0002\\ndoMenu \\\"new card\\\"\\ndoMenu \\\"delete card\\\"\\ndoMenu \\\"first\\\"\\ndoMenu \\\"prev\\\"\\ndoMenu \\\"next\\\"\\ndoMenu \\\"last\\\"\\ndoMenu \\\"new button\\\"\\ndoMenu \\\"new field\\\"\\ndoMenu \\\"duplicate card paint\\\"\\n\\n-- all items from the Draw menu like\\ndoMenu \\\"black fill\\\"\\n-- all items from the Font menu like\\ndoMenu \\\"helvetica\\\"\\n-- all items from the Style menu like\\ndoMenu \\\"14\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"dial\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002dial\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe 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.\\n\\nNote: If you include a hypen in the number, place the entire expression in quotation marks. Otherwise, ViperCard performs a subtraction before dialing the number.\\n\\nThe first time the \\u0002monaco_9_biuosdce\\u0002dial\\u0002times_12_biuosdce\\u0002 command is run, the sounds might not be played because they might not have been loaded yet. Use \\u0002monaco_9_biuosdce\\u0002dial \\\"\\\" \\u0002times_12_biuosdce\\u0002 when your program starts to ensure that the sounds are loaded.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\ndial \\\"\\\" -- begin loading the dial tone sounds\\nwait 4 seconds\\ndial \\\"555-1234\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"disable\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002disable\\u0002times_12_biuosdce\\u0002\\n\\n\\nDisables a button (sets the \\\"enabled\\\" property to true, so that the button no longer responds to clicks).\\n\"}, {\"title\": \"divide\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002divide\\u0002times_12_biuosdce\\u0002\\n\\n\\nDivides the number in a container by a number.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput 12 into x\\ndivide x by 3\\nanswer x -- will display \\\"4\\\"\\n\\nput \\\"1,12,3\\\" into x\\ndivide item 2 of x by 3\\nanswer x -- will display \\\"1,4,3\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"delete (object or text)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002delete (object or text)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Deleting objects\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002-- delete objects\\ndelete cd btn \\\"myBtn\\\"\\ndelete card 14\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Deleting text\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abcde\\\" into x\\ndelete char 2 of x\\nanswer x -- shows \\\"acde\\\"\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abcde\\\" into x\\ndelete char 2 to 4 of x\\nanswer x -- shows \\\"ae\\\"\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abcde\\\" into cd fld 1\\ndelete char 2 to 4 of cd fld 1\\u0002times_12_biuosdce\\u0002\\n\\nDeleting 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.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- we support complex expressions\\ndelete char 2 to 4 of item 3 of line 5 of myVar\\ndelete item 3 of line 3 to 5 of myVar\\ndelete first item of myVar\\ndelete second item of myVar\\ndelete last item of myVar\\ndelete item 3 of myVar\\ndelete line 3 of myVar\\ndelete word 3 of myVar\\n\\n-- we do not support backwards ranges\\ndelete item 3 to 2 of myVar\\n\\n-- we do not support out-of-order scopes\\n-- (unless you go Object->Stack Info and turn on compatibility mode)\\ndelete line 3 of item 3 of myVar -- error\\ndelete item 3 of word 3 of myVar -- error\\ndelete word 3 of char 3 of myVar -- error\\ndelete word 3 of word 4 of myVar -- error\\n\\n-- we do not support deleting a range (unless chars)\\ndelete word 3 to 5 of myVar -- not yet supported\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"drag\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002drag\\u0002times_12_biuosdce\\u0002\\n\\n\\nUse the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nchoose line tool\\ndrag from 10,20 to 30,40\\n-- this draws a line starting at the coordinates (10,20) \\n-- ending at (30,40)\\n\\nchoose curve tool\\ndrag from 10,20 to 30,40 to 50,60\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"enable\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002enable\\u0002times_12_biuosdce\\u0002\\n\\n\\nEnables a button (sets the \\\"enabled\\\" property to false, so that the button is no longer disabled).\\n\"}, {\"title\": \"go to card\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002go to card\\u0002times_12_biuosdce\\u0002\\n\\n\\nGo to a different card.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\ngo to card 1 -- goes to first card\\ngo first -- goes to first card\\ngo last -- goes to last card\\ngo next -- goes to the next card\\ngo prev -- goes to the previous card\\n\\nThe following are supported:\\nlast\\nmiddle\\nany\\nfirst\\nsecond\\nthird\\nfourth\\nfifth\\nsixth\\nseventh\\neigth\\nninth\\ntenth\\nnext\\nprevious\\nthis\\nmid\\nprev\\n\\n('go back' and 'go forth' are supported for compatibility with old scripts.)\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"hide\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002hide\\u0002times_12_biuosdce\\u0002\\n\\n\\nHides a button or field.\\n(sets the \\\"visible\\\" to false)\\n\"}, {\"title\": \"multiply\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002multiply\\u0002times_12_biuosdce\\u0002\\n\\n\\nMultiplies the number in a container by a number.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput 12 into x\\nmultiply x by 3\\nanswer x -- will display \\\"36\\\"\\n\\nput \\\"1,12,3\\\" into x\\nmultiply item 2 of x by 3\\nanswer x -- will display \\\"1,36,3\\\"\\n\\nmultiply cd fld 1 by 5\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"lock screen\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002lock screen\\u0002times_12_biuosdce\\u0002\\n\\n\\nThis feature will arrive in a future version...\\n\"}, {\"title\": \"play\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002play\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nPlay a sound effect.\\n\\nFor example, to play a chime sound,\\n\\n\\u0002monaco_9_biuosdce\\u0002play \\\"glider_1_Extra\\\" load\\nwait 4 seconds\\nplay \\\"glider_1_Extra\\\"\\u0002times_12_biuosdce\\u0002\\n\\nYou 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.\\n\\nYou can't say \\u0002monaco_9_biuosdce\\u0002play (\\\"glider\\\" & x)\\u0002times_12_biuosdce\\u0002, instead do the equivalent \\u0002monaco_9_biuosdce\\u0002put \\\"glider\\\" & x into tmp; play tmp\\u0002times_12_biuosdce\\u0002\\n\\nViperCard can play the following sounds:\\n\\n\\u0002monaco_9_biuosdce\\u0002glider_1_Aww\\nglider_1_Bass\\nglider_1_BeamIn\\nglider_1_BlowerOn\\nglider_1_Bounce\\nglider_1_Clock\\nglider_1_Crunch\\nglider_1_Drip\\nglider_1_Energize\\nglider_1_Extra\\nglider_1_FireBand\\nglider_1_GetBand\\nglider_1_GoodMove\\nglider_1_GreaseFall\\nglider_1_Guitar\\nglider_1_Hey!\\nglider_1_Lightning\\nglider_1_LightsOn\\nglider_1_Pop\\nglider_1_Push\\nglider_1_Shredder\\nglider_1_Tick\\nglider_1_ToastDrop\\nglider_1_ToastJump\\nglider_1_Yow!\\nglider_1_Zap\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"put\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002put\\u0002times_12_biuosdce\\u0002\\n\\n\\nPut an expression into a variable or field.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput 2+3 into x\\nanswer x -- shows 5\\n\\nput \\\"hello\\\" into cd fld \\\"message\\\"\\n\\nput \\\"aa,bb,cc\\\" into x\\nput \\\"11\\\" into item 2 of x\\nanswer x -- shows \\\"aa,11,cc\\\"\\n\\nput \\\"abc\\\" into x\\nput \\\"q\\\" into char 2 of x\\nanswer x -- shows \\\"aqc\\\"\\n\\nput \\\"appended text\\\" after x\\nput \\\"prepended text\\\" before x\\n\\n-- if the message box is open, you can display the contents of a variable into the message box,\\n-- this is similar to \\\"print\\\" or \\\"writeline\\\" in other languages.\\nput 2+3 into x\\nput x into the msg box\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"replace\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002replace\\u0002times_12_biuosdce\\u0002\\n\\n\\nReplace all occurrences of a string.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"a-b-c\\\" into x\\nreplace \\\"-\\\" with \\\"_\\\" in x\\nanswer x -- shows a_b_c\\n\\n\\n-- you can also use replace in a field.\\nput \\\"-\\\" into search\\nput \\\"_\\\" into replacement\\nreplace search with replacement in cd fld \\\"myFld\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"select\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002select\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet the selection in a field. For this to take effect, the field must be on the current card.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- set the selection\\nselect char 2 to 4 of cd fld \\\"myFld\\\"\\nselect line 3 of cd fld \\\"myFld\\\"\\nselect item 2 to 3 of cd fld \\\"myFld\\\"\\n\\n-- set the caret position\\nselect before char 3 of cd fld \\\"myFld\\\"\\nselect before line 3 of cd fld \\\"myFld\\\"\\nselect after char 3 of cd fld \\\"myFld\\\"\\nselect before text of cd fld \\\"myFld\\\"\\nselect after text of cd fld \\\"myFld\\\"\\n\\n-- select all\\nselect text of cd fld \\\"myFld\\\"\\n\\n-- clear selection\\nselect empty\\n\\n-- look up field by string\\nselect char 1 of the selectedField\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"send\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002send\\u0002times_12_biuosdce\\u0002\\n\\n\\nTake a string, and execute it as if it were a ViperCard script in the context of an object.\\n\\nMessages in ViperCard automatically travel upwards from button to card, background, and then stack.\\n\\nBut 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.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- sending a message to a different card\\nsend \\\"prepareNextCard\\\" to card \\\"otherCard\\\"\\n\\n-- simulate a button click\\nsend \\\"mouseUp\\\" to cd btn \\\"myButton\\\"\\n\\n-- if you have hundreds of lines of code in one script, this\\n-- can feel disorganized. with \\\"send\\\" you can store code\\n-- in other objects, for example, moving\\n-- mathematical computation to a different card or button.\\n-- in the script of cd btn \\\"mathUtils\\\" of card \\\"otherCard\\\", write\\non myCompute a, b\\nreturn a * a + b\\nend myCompute\\n\\n-- from another script\\nsend \\\"myCompute 3, 4\\\" to cd btn \\\"mathUtils\\\" of card \\\"otherCard\\\"\\nput the result into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"set\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002set\\u0002times_12_biuosdce\\u0002\\n\\n\\nUse the set command to change a property.\\nA few examples:\\n\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn \\\"myButton\\\" to 100\\nset the topLeft of cd btn \\\"myButton\\\" to 24, 25\\nput the long name of btn \\\"myButton\\\" into x\\nset the textsize of char 2 to 4 of cd fld \\\"myFld\\\" to 18 \\nset the itemdelimiter to \\\"|\\\"\\u0002times_12_biuosdce\\u0002\\n\\nSee the \\\"Properties\\\" section of documentation for more.\\n\\n\"}, {\"title\": \"show\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002show\\u0002times_12_biuosdce\\u0002\\n\\n\\nShows a button or field.\\n(sets the \\\"visible\\\" to true)\\n\"}, {\"title\": \"sort\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002sort\\u0002times_12_biuosdce\\u0002\\n\\n\\nNew: 'sort by each' expressions.\\n\\nSort styles:\\n* text sorting (default), compares text, not case sensitive.\\n* numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\\n* ascending (default)\\n* descending\\n\\nSort granularity:\\n* sort items of x\\n* sort lines of x\\n* sort chars of x\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput \\\"aa,cc,bb\\\" into x\\nsort items of x\\nanswer x -- displays \\\"aa,bb,cc\\\"\\n\\nput \\\"aa|cc|bb\\\" into x\\nset the itemDelimiter to \\\"|\\\"\\nsort items of x\\nanswer x -- displays \\\"aa|b|cc\\\"\\n\\nput \\\"ac,bb,ca\\\" into x\\nsort items of x by char 2 of each\\nanswer x -- displays \\\"ca,bb,ac\\\"\\n\\n-- numeric is needed!\\nput \\\"12,24,1,5\\\" into x\\nsort items of x numeric\\nanswer x -- displays \\\"1,5,12,24\\\"\\n\\nput \\\"12,24,1,5\\\" into x\\nsort descending items of x numeric\\nanswer x -- displays \\\"24,12,5,1\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"subtract\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002subtract\\u0002times_12_biuosdce\\u0002\\n\\n\\nSubtracts a number from the number in a container.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput 12 into x\\nsubtract 3 from x\\nanswer x -- will display \\\"9\\\"\\n\\nput \\\"1,12,3\\\" into x\\nsubtract 3 from item 2 of x\\nanswer x -- will display \\\"1,9,3\\\"\\n\\nsubtract 1 from cd fld \\\"myFld\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"unlock screen\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002unlock screen\\u0002times_12_biuosdce\\u0002\\n\\n\\nThis feature will arrive in a future version...\\n\\n\"}, {\"title\": \"wait\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002wait\\u0002times_12_biuosdce\\u0002\\n\\n\\nPauses the script. By default waits in \\\"ticks\\\", which are 60th of a second.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nwait 500 ms -- pauses for half a second.\\n\\n--(A paused script can be terminated by clicking the Stop icon in the\\n--navigation palette, or by changing to the button or field tool.)\\n\\nwait until the mouseH > 120\\nwait until the shiftKey\\nwait until the mouseClick -- now supported\\n\\nwait 5 seconds\\nwait 5 ticks\\nwait 5 milliseconds\\nwait 5 ms\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"visual effect\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002visual effect\\u0002times_12_biuosdce\\u0002\\n\\n\\nThis feature will arrive in a future version...\\n\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refcompatibility.json",
    "content": "{\"name\": \"lngCompatibility\", \"entries\": [{\"title\": \"(Compatibility)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002(Compatibility)\\u0002times_12_biuosdce\\u0002\\n\\n\\nThese are provided for compatibility with HyperCard. They might have hard-coded values/reduced functionality, and are unlikely to be useful in new scripts.\\n\\nYou can enable compatibility mode for a stack by choosing \\u0002monaco_9_biuosdce\\u0002Object->Stack info...\\u0002times_12_biuosdce\\u0002 and clicking \\u0002monaco_9_biuosdce\\u0002Compatibility\\u0002times_12_biuosdce\\u0002 in the panel on the right. This setting is saved with the stack and makes these changes for compatibility.\\n* You can say \\u0002monaco_9_biuosdce\\u0002btn 2\\u0002times_12_biuosdce\\u0002 instead of \\u0002monaco_9_biuosdce\\u0002cd btn 2\\u0002times_12_biuosdce\\u0002\\n* You can say \\u0002monaco_9_biuosdce\\u0002put \\\"A\\\" into item 3 of char 2 of x\\u0002times_12_biuosdce\\u0002 which doesn't usually make sense\\n* You can say \\u0002monaco_9_biuosdce\\u0002put \\\"new\\\" into item 4 of line 3 of x\\u0002times_12_biuosdce\\u0002 and get more intuitive behavior\\n* Uses HyperCard's less useful form for \\u0002monaco_9_biuosdce\\u0002long id\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002owner\\u0002times_12_biuosdce\\u0002, and \\u0002monaco_9_biuosdce\\u0002the target\\u0002times_12_biuosdce\\u0002.\\n\"}, {\"title\": \"abbrev id\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002abbrev id\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the abbrev id of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"abbrev name\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002abbrev name\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the abbrev name of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"arrowKey\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002arrowKey\\u0002times_12_biuosdce\\u0002\\n\\n\\nSends an \\u0002monaco_9_biuosdce\\u0002arrowKey\\u0002times_12_biuosdce\\u0002 message. By default, \\u0002monaco_9_biuosdce\\u0002arrowKey left\\u0002times_12_biuosdce\\u0002 goes to the previous card, and \\u0002monaco_9_biuosdce\\u0002arrowKey right\\u0002times_12_biuosdce\\u0002 goes to the next card, but this can be overridden in a card script or stack script.\\n\"}, {\"title\": \"bottom\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002bottom\\u0002times_12_biuosdce\\u0002\\n\\n\\nEquivalent to the top of the object + the height of the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the bottom of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"botright\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002botright\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the botright of cd btn \\\"myBtn\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"diskSpace()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002diskSpace()\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput diskSpace() into x\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"environment\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002environment\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the environment into z\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"errorDialog\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002errorDialog\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nCauses a runtime error at the current line.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nerrorDialog \\\"Not a number\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exp1(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exp1(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n(e to the power of x) minus 1.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput exp1(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"freesize\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002freesize\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the freesize of this stack into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"get\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002get\\u0002times_12_biuosdce\\u0002\\n\\n\\nEvaluates any expression and saves the result to the variable \\\"it\\\".\\n\\nThe 'put' command is typically more useful.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nget 2+3\\nput it into x\\nanswer x -- shows 5\\n\\nget the width of cd btn \\\"myBtn\\\"\\nput it into x\\nanswer x -- shows the width of the specified button\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"heapSpace()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002heapSpace()\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput heapSpace() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"ln1(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002ln1(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nNatural logarithm of (x + 1)\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput ln1(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"long name\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002long name\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the long name of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mark\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mark\\u0002times_12_biuosdce\\u0002\\n\\n\\nFully functional, might not be useful.\\nSets the \\\"marked\\\" property on a card to true.\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nmark card id 1234\\nmark cards where the name of this card contains \\\"b\\\"\\nmark all cards\\n\\u0002times_12_biuosdce\\u0002\\n\\nWhen cards are marked, you can conveniently reference them:\\n\\u0002monaco_9_biuosdce\\u0002\\nmarked card 4\\nprev marked card\\nnext marked card\\nfirst marked card\\nsecond marked card\\nlast marked card\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"marked\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002marked\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can mark a card.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nanswer the marked of cd 4\\nset the marked of cd 4 to true\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"on errorDialog\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002on errorDialog\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\n(Included for compatibility, unlikely to be useful for writing scripts).\\n\\nA few error messages create an errorDialog event. The default response is\\nto show a script error at the offending line. If you write your own errorDialog\\nhandler you can catch these events. However, because nearly all errors do not\\ngo through errorDialog, this is unlikely to be useful.\\n\"}, {\"title\": \"right\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002right\\u0002times_12_biuosdce\\u0002\\n\\n\\nEquivalent to the left of the object + the width of the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the right of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"pop\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002pop\\u0002times_12_biuosdce\\u0002\\n\\n\\nFunctional, but not recommended in new code.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\npush card\\ngo to card 7\\npop card into x\\ngo to card x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"push\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002push\\u0002times_12_biuosdce\\u0002\\n\\n\\nFunctional, but not recommended in new code.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\npush card\\ngo to card 7\\npop card\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"size\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002size\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the size of this stack into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"stacksInUse\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002stacksInUse\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the stacksInUse into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"stackSpace()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002stackSpace()\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput stackSpace() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"suspended\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002suspended\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the suspended into z\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"systemVersion\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002systemVersion\\u0002times_12_biuosdce\\u0002\\n\\n\\n(Deprecated and hard-coded).\\nTo get the current software version, use\\n\\u0002monaco_9_biuosdce\\u0002put the version into x\\u0002times_12_biuosdce\\u0002\\nor\\n\\u0002monaco_9_biuosdce\\u0002put the long version into x\\u0002times_12_biuosdce\\u0002\\ninstead.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput systemVersion() into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"trappable: on arrowKey\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002trappable: on arrowKey\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can make a custom \\u0002monaco_9_biuosdce\\u0002arrowKey\\u0002times_12_biuosdce\\u0002 handler that overrides the default one.\\n\"}, {\"title\": \"trappable: on doMenu\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002trappable: on doMenu\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can make a custom \\u0002monaco_9_biuosdce\\u0002doMenu\\u0002times_12_biuosdce\\u0002 handler that overrides the default one.\\n\\nHold the Shift key to bypass a customized \\u0002monaco_9_biuosdce\\u0002doMenu\\u0002times_12_biuosdce\\u0002.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a card's script\\non doMenu p1, p2\\n    if p1 == \\\"New Card\\\" then\\n        answer \\\"Making a new card\\\"\\n    end if\\n    send \\\"doMenu \\\"&quote&p1&quote&\\\", \\\"&quote&p2&quote to this stack\\nend doMenu\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"trappable: on help\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002trappable: on help\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can make a custom \\u0002monaco_9_biuosdce\\u0002help\\u0002times_12_biuosdce\\u0002 handler that overrides the default one. However, the default one won't really ever be called, since you can't choose \\u0002monaco_9_biuosdce\\u0002Help\\u0002times_12_biuosdce\\u0002 from the \\u0002monaco_9_biuosdce\\u0002Go\\u0002times_12_biuosdce\\u0002 menu in ViperCard.\\n\"}, {\"title\": \"unmark\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002unmark\\u0002times_12_biuosdce\\u0002\\n\\n\\nFully functional, might not be useful.\\n\\nSets the \\\"marked\\\" property on a card to false.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nunmark card id 1234\\nunmark all cards\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"version\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002version\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the version into z\\nput the long version into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refevents.json",
    "content": "{\"name\": \"lngEvent Handlers\", \"entries\": [{\"title\": \"afterKeyDown\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002afterKeyDown\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nCalled when a key is pressed.\\n\\nYou can use the functions \\u0002monaco_9_biuosdce\\u0002keyChar()\\u0002times_12_biuosdce\\u0002,  \\u0002monaco_9_biuosdce\\u0002shiftKey()\\u0002times_12_biuosdce\\u0002,  \\u0002monaco_9_biuosdce\\u0002optionKey()\\u0002times_12_biuosdce\\u0002, and \\u0002monaco_9_biuosdce\\u0002commandKey()\\u0002times_12_biuosdce\\u0002, to determine which key(s) where pressed.\\n\\n\\u0002monaco_9_biuosdce\\u0002keyRepeated()\\u0002times_12_biuosdce\\u0002 can be used to see if the key event comes from the key having been held down.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non afterKeyDown\\n    if keyChar() is \\\"i\\\" and the shiftKey is up and \\\\\\n            the optionKey is down and the commandKey is up then\\n        answer \\\"you pressed option-i\\\"\\n    else if keyChar() is \\\"U\\\" and the shiftKey is down and \\\\\\n            the optionKey is up and the commandKey is up then\\n        answer \\\"you pressed shift-u\\\"\\n    end if\\nend afterKeyDown\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"afterKeyUp\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002afterKeyUp\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nCalled when a key is pressed and released.\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non afterKeyUp\\n    if keyChar() is \\\"i\\\" then\\n        answer \\\"you pressed i\\\"\\n    end if\\nend afterKeyUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"closeBackground\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002closeBackground\\u0002times_12_biuosdce\\u0002\\n\\n\\nWhen you go to a different card, if the card belongs to a different background, the closeBackground message will be sent. (You're leaving one background and going to another).\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a background's script\\non closeBackground\\n    answer \\\"you have left this background\\\"\\nend closeBackground\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"closeCard\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002closeCard\\u0002times_12_biuosdce\\u0002\\n\\n\\nMessage sent upon leaving a card.\\n\\nBecause messages continue up the hierarchy until they are handled, you can also respond to closeCard in a stack script.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a card's script\\non closeCard\\n    answer \\\"you have left this card\\\"\\nend closeCard\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"closeField\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002closeField\\u0002times_12_biuosdce\\u0002\\n\\n\\nSent when the user clicks on a field to select it, types text into the field, and then de-selects the field.\\n\\nIf the browse tool is active, this message will be sent by the following:\\n* When typing text into a field, click outside the field\\n* When typing text into a field, press Enter\\n* When typing text into a field, go to a different card\\n\\nSee also: \\u0002monaco_9_biuosdce\\u0002openField\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002exitField\\u0002times_12_biuosdce\\u0002.\\n\\nThe message is sent to the target field and travels upward to the current card as usual.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a field's script\\n\\non closeField\\n    -- do a simple check of what the user just typed\\n    if not \\\"@\\\" in the target then\\n        put \\\"not a e-mail address\\\" into cd fld \\\"status\\\"\\n    else\\n        put \\\"\\\" into cd fld \\\"status\\\"\\n    end if\\nend closeField\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exitField\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exitField\\u0002times_12_biuosdce\\u0002\\n\\n\\nSent when the user clicks on a field to select it, does not type text into the field, and then de-selects the field.\\n\\nIf the browse tool is active, this message will be sent by the following:\\n* When a field is selected, click outside the field\\n* When a field is selected, press Enter\\n* When a field is selected, go to a different card\\n\\nIt's possible for exitField to be sent to the field more than once if some of the above actions happen at the same time.\\n\\nSee also: \\u0002monaco_9_biuosdce\\u0002openField\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002closeField\\u0002times_12_biuosdce\\u0002.\\n\\nThe message is sent to the target field and travels upward to the current card as usual.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a field's script\\n\\non openField\\n    show cd btn \\\"indicateCurrentlyEditingField\\\"\\nend openField\\n\\non closeField\\n    hide cd btn \\\"indicateCurrentlyEditingField\\\"\\nend closeField\\n\\non exitField\\n    hide cd btn \\\"indicateCurrentlyEditingField\\\"\\nend exitField\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"idle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002idle\\u0002times_12_biuosdce\\u0002\\n\\n\\nSent repeatedly to the current card. Can be used for a game loop.\\n\\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\\n\\nTo get faster idle calls, at the expense of heavier cpu usage, use \\u0002monaco_9_biuosdce\\u0002set the idlerate to \\\"faster\\\"\\u0002times_12_biuosdce\\u0002\\n\\n\"}, {\"title\": \"mouseDoubleClick\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseDoubleClick\\u0002times_12_biuosdce\\u0002\\n\\n\\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Create a button, edit its script, and type the example below. Now when you choose the browse tool and double-click the button, your code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseDoubleClick\\n    answer \\\"you double-clicked this button.\\\"\\nend mouseDoubleClick\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseDown\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseDown\\u0002times_12_biuosdce\\u0002\\n\\n\\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is pressed down onto the object. Create a button, edit its script, and type the example below. Now when you choose the browse tool and click the button, your code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseDown\\n    answer \\\"code is running.\\\"\\nend mouseDown\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseEnter\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseEnter\\u0002times_12_biuosdce\\u0002\\n\\n\\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse enters the object.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseEnter\\n    set the icon of me to 12\\nend mouseDown\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseLeave\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseLeave\\u0002times_12_biuosdce\\u0002\\n\\n\\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse leaves the object.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseLeave\\n    set the icon of me to 10\\nend mouseLeave\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseUp\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseUp\\u0002times_12_biuosdce\\u0002\\n\\n\\nRemember that scripts are only run when you're in the Browse tool (hand-shape). Called whenever the mouse is clicked. To be precise, when the mouse is pressed down onto the object, and released on the same object. Create a button, edit its script, type the example below. Now when you choose the browse tool and click the button, your code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseUp\\n    answer \\\"hello, world.\\\"\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseWithin\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseWithin\\u0002times_12_biuosdce\\u0002\\n\\n\\nCalled repeatedly when the cursor is inside the object. You can use the \\u0002monaco_9_biuosdce\\u0002mouseloc()\\u0002times_12_biuosdce\\u0002 function to get the position of the cursor. This can be used to create drag/drop effects.\\n\\n(Note that to terminate a script that is being called repeatedly, you can change to the button or field tool.)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseWithin\\n    set the loc of cd btn \\\"follow\\\" to the mouseLoc\\nend mouseWithin\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"openBackground\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002openBackground\\u0002times_12_biuosdce\\u0002\\n\\n\\nWhen you go to a different card, if the card belongs to a different background, the openBackground message will be sent. (You're leaving one background and going to another).\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a background's script\\non openBackground\\n    answer \\\"welcome to this background\\\"\\nend openBackground\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"openCard\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002openCard\\u0002times_12_biuosdce\\u0002\\n\\n\\nMessage sent upon going to a card.\\n\\nBecause messages continue up the hierarchy until they are handled, you can also respond to openCard in a stack script.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a card's script\\non openCard\\n    answer \\\"welcome to this card\\\"\\nend openCard\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"openField\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002openField\\u0002times_12_biuosdce\\u0002\\n\\n\\nSent to a field, when text is first selected in it.\\n\\nSee also: \\u0002monaco_9_biuosdce\\u0002closeField\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002exitField\\u0002times_12_biuosdce\\u0002.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a field's script\\n\\non openField\\n    -- place default text in the field when you tab over to it...\\n    put \\\"abc\\\" into the target\\nend openField\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"openStack\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002openStack\\u0002times_12_biuosdce\\u0002\\n\\n\\nMessage sent upon first opening the stack.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- in a stack's script\\non openStack\\n    answer \\\"welcome to this card\\\"\\nend openStack\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/reffunctions.json",
    "content": "{\"name\": \"lngFunctions\", \"entries\": [{\"title\": \"abs(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002abs(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nAbsolute value.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput abs(-0.5) into x\\nput abs(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"atan(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002atan(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nArctangent, in radians.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput atan(0.5) into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"average()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002average()\\u0002times_12_biuosdce\\u0002\\n\\n\\nSimple mean of numbers.\\nSupports any number of arguments.\\nYou can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput average(1,2,3) into x\\nput average(\\\"1,2,3\\\") into x -- returns 2\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"charToNum(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002charToNum(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nFrom ascii-like number to a character. Note that characters in a field are displayed in Mac OS Roman encoding.\\n\\nNote that the newline character is always \\\\n (10).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput charToNum(97) into x\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"clickH()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002clickH()\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet x coordinate of a recent mouse click. See \\u0002monaco_9_biuosdce\\u0002clickLoc\\u0002times_12_biuosdce\\u0002 for more details.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput clickh() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"clickLoc()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002clickLoc()\\u0002times_12_biuosdce\\u0002\\n\\nGet the coordinates of a recent mouse click.\\n\\nThis isn't necessarily the most recent mouseClick, it is only updated \\n1) clicks before the script runs\\n2) when you check the \\u0002monaco_9_biuosdce\\u0002mouseClick\\u0002times_12_biuosdce\\u0002\\n3) when you simulate a click with \\u0002monaco_9_biuosdce\\u0002click\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002drag\\u0002times_12_biuosdce\\u0002\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nwait until the mouseClic\\nanswer \\\"you clicked at\\\" && the clickLoc\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"clickV()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002clickV()\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet y coordinate of a recent mouse click. See \\u0002monaco_9_biuosdce\\u0002clickLoc\\u0002times_12_biuosdce\\u0002 for more details.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput clickv() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"commandKey()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002commandKey()\\u0002times_12_biuosdce\\u0002\\n\\n\\nCheck if this modifier key is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif the commandKey is down then\\n    answer \\\"cmd key is down\\\"\\nend if\\n-- same as\\nif the cmdKey is down then\\n    answer \\\"cmd key is down\\\"\\nend if\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"contains\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002contains\\u0002times_12_biuosdce\\u0002\\n\\n\\nCan you find a string within a string?\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif \\\"abc\\\" contains \\\"b\\\" then\\n    answer \\\"yes\\\"\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"cos(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002cos(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput cos(0.5 * pi) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"date()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002date()\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nReturns the current date.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nthe date\\ndate()\\nthe abbrev date\\nthe short date\\nthe long date\\nthe English date\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exp(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exp(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\ne to the power of x.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput exp(0.5) into x\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exp2(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exp2(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n2 to the power of x.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput exp2(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"is a\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002is a\\u0002times_12_biuosdce\\u0002\\n\\n\\nCheck the type of an expression.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif x is a number then\\n    answer \\\"a\\\"\\nend if\\nif x is a integer then\\n    answer \\\"b\\\"\\nend if\\nif x is a logical then\\n    answer \\\"c\\\"\\nend if\\nif x is a point then\\n    answer \\\"d\\\"\\nend if\\nif x is a rect then\\n    answer \\\"e\\\"\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"is in\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002is in\\u0002times_12_biuosdce\\u0002\\n\\n\\nCan you find a string within a string?\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif \\\"b\\\" is in \\\"abc\\\" then\\n    answer \\\"yes\\\"\\nend if\\n\\n-- is within is the same,\\nif \\\"b\\\" is within \\\"abc\\\" then\\n    answer \\\"yes\\\"\\nend if\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"keyChar()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002keyChar()\\u0002times_12_biuosdce\\u0002\\n\\n\\nIn an afterkeydown or afterkeyup handler, check the character. Is affected by shift.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput keyChar() into x\\non afterKeyDown\\n    if keyChar() is \\\"i\\\" and the shiftKey is up and \\\\\\n            the optionKey is down and the commandKey is up then\\n        answer \\\"you pressed option-i\\\"\\n    else if keyChar() is \\\"U\\\" and the shiftKey is down and \\\\\\n            the optionKey is up and the commandKey is up then\\n        answer \\\"you pressed shift-u\\\"\\n    end if\\nend afterKeyDown\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"keyRepeated()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002keyRepeated()\\u0002times_12_biuosdce\\u0002\\n\\n\\nIn an afterkeydown handler, did this event come from the user holding the key down?\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif not keyRepeated() then\\n    add 1 to uniqueKeyPresses\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"length(s)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002length(s)\\u0002times_12_biuosdce\\u0002\\n\\n\\nReturns the length of a string, in characters.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nanswer length(\\\"abc\\\") -- displays 3\\nanswer the length of \\\"\\\" -- displays 0\\nanswer the length of \\\"abc\\\" -- displays 3\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"ln(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002ln(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput ln(0.5) into x\\n\\n\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"log2(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002log2(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nBase-2 logarithm.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput log2(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"max(...)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002max(...)\\u0002times_12_biuosdce\\u0002\\n\\n\\nSupports any number of arguments. You can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput max(1,2,3) into x\\nput max(\\\"45,49,40\\\") into x -- returns 49\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"me\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002me\\u0002times_12_biuosdce\\u0002\\n\\n\\nRefers to the object that owns the current script.\\n\\nSimilar to, but distinct from 'target'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the id of me into theTarget\\n\\nset the width of me to 100\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"min()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002min()\\u0002times_12_biuosdce\\u0002\\n\\n\\nSupports any number of arguments. You can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput min(1,2,3) into x\\nput min(\\\"45,49,40\\\") into x -- returns 40\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouse()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouse()\\u0002times_12_biuosdce\\u0002\\n\\n\\nIs the mouse button currently down. Returns one of the constants \\u0002monaco_9_biuosdce\\u0002down\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002up\\u0002times_12_biuosdce\\u0002.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif the mouse is down then\\n    answer \\\"mouse button is clicked\\\"\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseClick()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseClick()\\u0002times_12_biuosdce\\u0002\\n\\n\\nWas the mouse recently clicked? Doesn't include the click that created the message, it needs to be later.\\n\\nWhen you check the mouseClick, it will only return true once before resetting back to false. See also: clickloc, clickh, clickv.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nwait until the mouseClick\\nanswer the clickloc\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseH()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseH()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe x coordinate of the current mouse location.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput mouseH() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseLoc()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseLoc()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe coordinates of the current mouse location.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput mouseLoc() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"mouseV()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002mouseV()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe y coordinate of the current mouse location.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput mouseV() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"number\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002number\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Count parts of text\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002answer the number of chars in \\\"abc\\\"\\nanswer the number of items in \\\"a,b,c\\\"\\nanswer the number of lines in myList\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Count current objects\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002answer the number of cards in this stack\\nanswer the number of buttons in this card\\nanswer the number of fields in this card\\nrepeat with x = 1 to the number of cards in this stack\\n    set the name of card x of this stack to \\\"c\\\" & x\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Get the number of an object.\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002answer the number of this card\\nput the number of cd fld id 1234 into x\\nput \\\"abc\\\" into cd fld x\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"numberToStr(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002numberToStr(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nConvert number to string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput numberToStr(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"numToChar(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002numToChar(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nFrom a character to an ascii-like number. Note that characters in a field are displayed in Mac OS Roman encoding.\\n\\nNote that the newline character is always \\\\n (10).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput numToChar(\\\"a\\\") into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"objectById(id)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002objectById(id)\\u0002times_12_biuosdce\\u0002\\n\\n\\nGets the full id from the numeric id.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- assuming there is a cd btn id 1234\\nput objectById(1234) into x\\n-- x is now \\\"card button id 1234\\\".\\n-- you can now do this\\nset the topleft of x to 100, 200\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"offset(needle, haystack)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002offset(needle, haystack)\\u0002times_12_biuosdce\\u0002\\n\\n\\nSearch for a string within a string, and return the position where found. If not found, returns 0. (one-based indexing).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput offset(\\\"b\\\", \\\"abc\\\") into x\\n-- x is now 2.\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"optionKey()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002optionKey()\\u0002times_12_biuosdce\\u0002\\n\\n\\nCheck if this modifier key is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif the optionKey is down then\\n    answer \\\"opt key is down\\\"\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"param(n)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002param(n)\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet the nth value passed into the current procedure. Can be used to build a function that takes any number of arguments,  see example.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mySumOfNumbers\\n    put 0 into total\\n    repeat with x = 1 to paramCount()\\n        put total + param(x) into total\\n    end repeat\\n    answer \\\"total is\\\" && total\\nend mySumOfNumbers\\n\\non mouseUp\\n    mySumOfNumbers 1, 2, 3\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"paramCount()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002paramCount()\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet the number of values passed into the current procedure. Can be used to build a function that takes any number of arguments, see example.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mySumOfNumbers\\n    put 0 into total\\n    repeat with x = 1 to paramCount()\\n        put total + param(x) into total\\n    end repeat\\n    answer \\\"total is\\\" && total\\nend mySumOfNumbers\\n\\non mouseUp\\n    mySumOfNumbers 1, 2, 3\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"params()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002params()\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet all of the values passed into the current procedure.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput params() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"random(n)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002random(n)\\u0002times_12_biuosdce\\u0002\\n\\n\\nn must be an integer.\\nReturns random value between 1 and n.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput random(20) into roll\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"result()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002result()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe return value of the last called function or procedure.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non myProc\\n    return \\\"a\\\"\\nend myProc\\non mouseUp\\n    myProc\\n    answer the result\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"round(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002round(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nReturns integer nearest to number. Odd integers plus 0.5 round up, even integers plus 0.5 round down.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput round(1.7) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"screenRect()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002screenRect()\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput screenRect() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"seconds()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002seconds()\\u0002times_12_biuosdce\\u0002\\n\\n\\nSeconds since January 1, 1904.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput seconds() into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"selectedChunk()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002selectedChunk()\\u0002times_12_biuosdce\\u0002\\n\\n\\nA full description of the current selection, or \\\"\\\" if there is no selection.\\n\\nReturns a string that looks like this: \\u0002monaco_9_biuosdce\\u0002char 2 to 4 of cd fld id 567\\u0002times_12_biuosdce\\u0002.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textSize of the selectedChunk to 24\\nput the textFont of the selectedChunk into x\\nput word 2 of the selectedChunk into selStart \\nput word 4 of the selectedChunk into selEnd \\nput the selectedChunk into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"selectedField()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002selectedField()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe field that contains current selected text, or \\\"\\\" if there is no selection.\\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\\n\\\"card field 4\\\".)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput selectedField() into x\\nset the loc of the selectedField to 23, 45\\nset the textalign of the selectedField to \\\"center\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"selectedLine()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002selectedLine()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe number of the line of the current selected text, or \\\"\\\" if there is no selection.\\n(If compatibility mode is enabled, not recommended for new code, uses HyperCard's formatting and returns a string like\\n\\\"line 3 of card field 4\\\".)\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput selectedLine() into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"selectedText()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002selectedText()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe value of the current selected text, or the empty string if there is no selection.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput selectedText() into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"the selection\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002the selection\\u0002times_12_biuosdce\\u0002\\n\\n\\nReading from \\u0002monaco_9_biuosdce\\u0002the selection\\u0002times_12_biuosdce\\u0002 retrieves the value of the current selected text, or the empty string if there is no selection.\\n\\nWriting to \\u0002monaco_9_biuosdce\\u0002the selection\\u0002times_12_biuosdce\\u0002 replaces the currently selected text with new text.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the selection into x\\nput \\\"\\\" into the selection\\nput \\\"abc\\\" into the selection\\n\\n-- chunks are supported\\nput char 2 to 3 of the selection into x\\nput \\\"\\\" into char 2 to 3 of the selection\\nput \\\"abc\\\" into char 3 of the selection\\nput item 2 to 3 of the selection into x\\nput \\\"\\\" into item 2 to 3 of the selection\\nput \\\"abc\\\" into item 3 of the selection\\n\\n-- you can delete part of the selection\\ndelete char 2 to 4 of the selection\\ndelete item 3 of the selection\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"shiftKey()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002shiftKey()\\u0002times_12_biuosdce\\u0002\\n\\n\\nCheck if this modifier key is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif the shiftKey is down then\\n    answer \\\"shift key is down\\\"\\nend if\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"sqrt(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002sqrt(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput sqrt(0.5) into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"sin(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002sin(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput sin(0.5 * pi) into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"strToNumber(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002strToNumber(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nParse string to number. Supports scientific notation. If cannot be parsed, returns \\\"false\\\"\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput strToNumber(\\\"12\\\") into x\\nput strToNumber(\\\"-12\\\") into x\\nput strToNumber(\\\"1e6\\\") into x\\nask \\\"what is a number\\\"\\nput it into x\\nif strToNumber(x) is false then\\n    answer \\\"that was not a number\\\"\\nend if\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"sum()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002sum()\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nSupports any number of arguments.\\nYou can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput sum(1,2,3) into x\\nput sum(\\\"1,2,3\\\") into x -- returns 6\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"tan(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002tan(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput tan(0.125 * pi) into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"target\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002target\\u0002times_12_biuosdce\\u0002\\n\\n\\nRefers to the object that was most recently acted on.\\n\\nHere's one way this can be useful: If you have many buttons that all basically perform the same action, you could have an 'on mouseup' handler in the card script instead of a separate script within each button. This script in the card could check the target to see which of the buttons were clicked.\\n\\nDifferent than 'me', which is the owner of the currently running script, which might be different than the button that was clicked.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the width of the target to 100\\n\\nput the short id of the target into x\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"there is a\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002there is a\\u0002times_12_biuosdce\\u0002\\n\\n\\nCheck for the existence of an object.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif there is a cd btn id 12345 then\\n    answer \\\"found\\\"\\nend if\\nif there is not a cd btn id 12345 then\\n    answer \\\"not found\\\"\\nend if\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"ticks()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002ticks()\\u0002times_12_biuosdce\\u0002\\n\\n\\nTicks (60th of a second) since January 1, 1904.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput ticks() into x\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"tool()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002tool()\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe current simulated tool, as set by the \\u0002monaco_9_biuosdce\\u0002choose\\u0002times_12_biuosdce\\u0002 command. (The \\u0002monaco_9_biuosdce\\u0002choose\\u0002times_12_biuosdce\\u0002 command can be used to draw lines and shapes).\\n\\nThe actual current tool will be the browse tool when any script is running.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nchoose pencil tool\\nanswer tool() -- shows \\\"pencil\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"toLowerCase()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002toLowerCase()\\u0002times_12_biuosdce\\u0002\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nanswer toLowerCase(\\\"ABC\\\") -- shows \\\"abc\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"toUpperCase()\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002toUpperCase()\\u0002times_12_biuosdce\\u0002\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nanswer toUpperCase(\\\"abc\\\") -- shows \\\"ABC\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"trunc(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002trunc(x)\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet integer part of a number. i.e. for positive numbers, always round down to the nearest integer.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput trunc(0.5) into x\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"annuity(rate, periods)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002annuity(rate, periods)\\u0002times_12_biuosdce\\u0002\\n\\n\\nComputes the total cost of an annuity now that will pay you one unit per period, over the specific number of periods.\\n\\nYou want to purchase an annuity that pays you $10,000 a year for 10 years. The interest rate is 10%. How much will it cost you now? The amount loaned is 10000 * annuity(0.10, 10), or 61445.67.\\n\"}, {\"title\": \"compound(rate, periods)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002compound(rate, periods)\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nReturns the value of one unit of principal invested at the interest rate and compounded over the specified number of periods.\\n\\nExample: $100 invested for 20 years at 10% interest compounded yearly:\\n\\nfutureValue = 100 * compound(0.10, 20) = about $673\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refoverview.json",
    "content": "{\"name\": \"lngOverview\", \"entries\": [{\"title\": \"Introduction\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Introduction\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nWelcome to ViperCard, an open source re-creation and re-imagination of 1987's HyperCard. We suggest first watching the example videos.\\n\\n\\n\\n\"}, {\"title\": \"Scripting\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Scripting\\u0002times_12_biuosdce\\u0002\\n\\n\\nAll objects (all buttons, fields, and cards) have an associated set of code called a \\\"script.\\\"\\n\\nHere is an example script:\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"hello, world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nIf 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.\\n\\nA 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.\\n\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    -- this line is a comment\\n    answer \\\"hello, world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.\\n\\nA long line of code can be continued with a backslash, e.g.\\n\\n\\u0002monaco_9_biuosdce\\u0002answer (\\\"here is how to continue\\\" & \\\\\\n    \\\"code across two lines\\\")\\u0002times_12_biuosdce\\u0002\\n\\nTo have a comment spanning many lines, do this,\\n\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    --[[this line is a comment\\n    and so is this\\n    and also this]]\\n    answer \\\"hello, world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nThe language is not case sensitive. \\u0002monaco_9_biuosdce\\u0002on mouseup\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002on mouseUp\\u0002times_12_biuosdce\\u0002 are equivalent.\\n\\nA common data type is a string (i.e. text).\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abc\\\" into x\\u0002times_12_biuosdce\\u0002\\n\\nDouble-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:\\n\\n\\u0002monaco_9_biuosdce\\u0002if x is \\\"\\\" then\\n    answer \\\"empty string\\\"\\nend if\\u0002times_12_biuosdce\\u0002\\n\\nTo include a double-quote character in a string, use the quote constant,\\n\\n\\u0002monaco_9_biuosdce\\u0002answer (quote & \\\"a\\\" & quote) -- displays \\\"a\\\"\\u0002times_12_biuosdce\\u0002\\n\\nValid numbers include \\u0002monaco_9_biuosdce\\u0002123\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002123.456\\u0002times_12_biuosdce\\u0002, and scientific notation like \\u0002monaco_9_biuosdce\\u00021.23e6\\u0002times_12_biuosdce\\u0002 which means \\u0002monaco_9_biuosdce\\u00021.23\\u0002times_12_biuosdce\\u0002 multiplied by (\\u0002monaco_9_biuosdce\\u000210\\u0002times_12_biuosdce\\u0002 to the \\u0002monaco_9_biuosdce\\u00026\\u0002times_12_biuosdce\\u0002th power). Numbers can be in the range \\u0002monaco_9_biuosdce\\u0002[-1e18, 1e18]\\u0002times_12_biuosdce\\u0002, 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.\\n\\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\u0002times_12_biuosdce\\u0002 is a function call meaning to take the square root of \\u0002monaco_9_biuosdce\\u00020.5\\u0002times_12_biuosdce\\u0002. \\u0002monaco_9_biuosdce\\u0002sum(1, 2)\\u0002times_12_biuosdce\\u0002 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, \\u0002monaco_9_biuosdce\\u0002sum(1, sum(2, 3))\\u0002times_12_biuosdce\\u0002.\\n\\nYou can call a function in two ways. \\u0002monaco_9_biuosdce\\u0002the mouseLoc\\u0002times_12_biuosdce\\u0002 is the same as \\u0002monaco_9_biuosdce\\u0002mouseLoc()\\u0002times_12_biuosdce\\u0002. \\u0002monaco_9_biuosdce\\u0002the length of \\\"abc\\\"\\u0002times_12_biuosdce\\u0002 is the same as \\u0002monaco_9_biuosdce\\u0002length(\\\"abc\\\")\\u0002times_12_biuosdce\\u0002.\\n\\nButtons 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.\\n\\nA script can set properties of an object with syntax like:\\n\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn \\\"myBtn\\\" to 450\\u0002times_12_biuosdce\\u0002\\n\\nChoose 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:\\n\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn id 1234 to 450\\u0002times_12_biuosdce\\u0002\\n\\nWhen 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 \\u0002monaco_9_biuosdce\\u0002on mouseUp\\u0002times_12_biuosdce\\u0002 defined, then the code inside \\u0002monaco_9_biuosdce\\u0002on mouseUp\\u0002times_12_biuosdce\\u0002 will be run.\\n\\nThe documentation here has a list of Commands, Event Handlers, and Properties that can be set.\\n\\n\\n\"}, {\"title\": \"Expressions\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Expressions\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nYou can use expressions like \\u0002monaco_9_biuosdce\\u0002put 1+2+3+4 into x\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002put sqrt(0.5) + sqrt(0.6) into y\\u0002times_12_biuosdce\\u0002 in your code.\\n\\nExpressions can use parentheses to contain any level of nested sub-expressions, for example,\\n\\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\nsqrt(0.5 + sqrt(0.6))\\nsqrt(0.5 + sqrt(0.6 + sqrt(0.7)))\\u0002times_12_biuosdce\\u0002\\nare all valid.\\n\\nParentheses are used to dictate the order of operations, since\\n\\u0002monaco_9_biuosdce\\u00023*(4+5)\\u0002times_12_biuosdce\\u0002\\ngives a different answer than\\n\\u0002monaco_9_biuosdce\\u0002(3*4)+5\\u0002times_12_biuosdce\\u0002\\n\\nParentheses are also used for grouping an expression. For example, we needed to get the (n + 1)th line of a variable, we would type \\u0002monaco_9_biuosdce\\u0002(line (n + 1) of x)\\u0002times_12_biuosdce\\u0002\\n\\nDo not type something like\\n\\u0002monaco_9_biuosdce\\u0002answer (line n + 1 of x) -- this is hard to read.\\u0002times_12_biuosdce\\u0002\\nwhich is unclear,\\n\\u0002monaco_9_biuosdce\\u0002answer (line (n + 1) of x) -- this is preferred.\\u0002times_12_biuosdce\\u0002\\n\\nIn the expression \\u0002monaco_9_biuosdce\\u00022 + 3\\u0002times_12_biuosdce\\u0002, the symbol \\u0002monaco_9_biuosdce\\u0002+\\u0002times_12_biuosdce\\u0002 is called an operator. \\nViperCard also has logical operators like \\u0002monaco_9_biuosdce\\u0002and\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002or\\u0002times_12_biuosdce\\u0002, and \\u0002monaco_9_biuosdce\\u0002not\\u0002times_12_biuosdce\\u0002.\\nSee the \\u0002monaco_9_biuosdce\\u0002operators\\u0002times_12_biuosdce\\u0002 page in the Syntax documentation section\\nfor more information.\\n\\n\"}, {\"title\": \"Message Box\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Message Box\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nOpen the Message Box by choosing 'Message Box' from the Go menu, or by pressing Cmd+M.\\n\\nThe 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 \\u0002monaco_9_biuosdce\\u0002put 12*34\\u0002times_12_biuosdce\\u0002, and press Enter. The result will be shown below.\\n\\nAs another example, if you have two buttons, and you want to align the left sides of the buttons, you can type \\u0002monaco_9_biuosdce\\u0002set the left of cd btn 2 to the left of cd btn 1\\u0002times_12_biuosdce\\u0002, and press Enter, and the action will be performed.\\n\\nYou can use the Up and Down arrow keys to see previously typed commands.\\n\\nYou can use a semicolon to combine many lines, for example \\u0002monaco_9_biuosdce\\u0002put 2 into x; put x * 3\\u0002times_12_biuosdce\\u0002\\n\\nYou 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 \\u0002monaco_9_biuosdce\\u0002put 4 into myGlobal\\u0002times_12_biuosdce\\u0002 without first needing to declare \\u0002monaco_9_biuosdce\\u0002global myGlobal\\u0002times_12_biuosdce\\u0002.\\n\\nIn 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.\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput 45 * 56 into x\\n-- if the msg box is open, will show the value of x\\n-- otherwise, the line is ignored\\nput x into the msg box\\n-- code will continue running\\n\\u0002times_12_biuosdce\\u0002\\n\\nThe shortened form,\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput 45 * 56 into x\\n-- if the msg box is open, will show the value of x\\nput x\\u0002times_12_biuosdce\\u0002\\n\\nis also supported.\\n\\n\\n\"}, {\"title\": \"Lists/Arrays\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Lists/Arrays\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nHere's a common way to create a list:\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"\\\" into myList\\nrepeat with x = 1 to 5\\n    put 0 into line x of myList\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\nAppend a number to the list:\\n\\n\\u0002monaco_9_biuosdce\\u0002put newline & 20 after myList\\u0002times_12_biuosdce\\u0002\\n\\nInsert a number in the list (if the line doesn't yet exist, it will be added)\\n\\n\\u0002monaco_9_biuosdce\\u0002put 6 into line 8 of myList\\u0002times_12_biuosdce\\u0002\\n\\nAdd 10 to each element of the list:\\n\\n\\u0002monaco_9_biuosdce\\u0002repeat with x = 1 to the number of lines in myList\\n    put (line x of myList) + 10 into line x of myList\\nend repeat\\n\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002myList\\u0002times_12_biuosdce\\u0002 is a normal variable, it can be passed as an argument and so on.\\n\\n\\u0002times_12_+biuosdce\\u0002Two-dimensional lists\\u0002times_12_biuosdce\\u0002\\n\\nHere's a common way to create a 2-d list:\\n\\u0002monaco_9_biuosdce\\u0002put \\\"\\\" into myList\\nrepeat with x = 1 to 5\\n    repeat with y = 1 to 5\\n        put 0 into item x of line y of myList\\n    end repeat\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\nInsert a new number into the list (it's ok if the line or item does not yet exist, it will be created):\\n\\n\\u0002monaco_9_biuosdce\\u0002put 3 into item 6 of line 8\\u0002times_12_biuosdce\\u0002\\n\\nAdd 10 to each element of the list:\\n\\n\\u0002monaco_9_biuosdce\\u0002repeat with y = 1 to the number of lines in myList\\n    repeat with x = 1 to the number of items in line y of myList\\n        if length(item x of line y of theLine) > 0 theLine\\n            add 10 to item x of line y of theLine\\n        end if\\n    end repeat\\nend repeat\\n\\u0002times_12_biuosdce\\u0002\\n\\n\"}, {\"title\": \"Variables\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Variables\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nUse a statement like \\n\\n\\u0002monaco_9_biuosdce\\u0002put 3 into x\\u0002times_12_biuosdce\\u0002\\n\\nto put the value \\\"3\\\" into a variable named \\\"x\\\". You don't need to first declare x as a variable.\\n\\nVariable names and function names are case insensitive.\\n\\nVariable 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.\\n\\nIf you try to read from a variable before it has been introduced, a runtime error will occur. \\u0002monaco_9_biuosdce\\u0002put notSeenBefore into x\\u0002times_12_biuosdce\\u0002 will cause an error unless there is a statement assigning a value to \\u0002monaco_9_biuosdce\\u0002notSeenBefore\\u0002times_12_biuosdce\\u0002.\\n\\nUse \\\"global\\\" to declare a variable as a global.\\n1) it can be accessed from any other script\\n2) its contents are saved even after the function is complete.\\n\\nFor example,\\n\\n\\u0002monaco_9_biuosdce\\u0002global coordX, coordY\\nput 1 into coordX\\nput 2 into coordY\\u0002times_12_biuosdce\\u0002\\n\\nIf another script says\\n\\u0002monaco_9_biuosdce\\u0002global coordX, coordY\\nanswer coordX, coordY\\u0002times_12_biuosdce\\u0002\\nit will read the values that were set.\\n\\nGlobal variables are, though, reset when you close the stack (the values \\nare not saved as part of the project.)\\n\\n\\u0002times_12_+biuosdce\\u0002Data types\\u0002times_12_biuosdce\\u0002\\n\\nA runtime error can be thrown if a value has the wrong \\ntype, e.g.\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abc\\\" + 4 into z\\u0002times_12_biuosdce\\u0002\\ncauses a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string \\u0002monaco_9_biuosdce\\u0002\\\"abc\\\"\\u0002times_12_biuosdce\\u0002.\\n\\nIf you need to convert from a text type to a number, you can use the functions \\u0002monaco_9_biuosdce\\u0002strToNumber\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002numberToStr\\u0002times_12_biuosdce\\u0002. For example,\\n\\u0002monaco_9_biuosdce\\u0002ask \\\"please enter a number\\\"\\nput it into x\\nif strToNumber(x) is not false then\\n    answer \\\"the number plus one is\\\" && (strToNumber(x) + 1)\\nend if\\n\\u0002times_12_biuosdce\\u0002\\n\\nFor \\u0002monaco_9_biuosdce\\u0002if\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002else if\\u0002times_12_biuosdce\\u0002, only \\u0002monaco_9_biuosdce\\u0002true\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002false\\u0002times_12_biuosdce\\u0002 are accepted, any other value is a runtime error. For example, to check that a string is not empty, you cannot say \\u0002monaco_9_biuosdce\\u0002if myVar then\\u0002times_12_biuosdce\\u0002, you have to say something like \\u0002monaco_9_biuosdce\\u0002if length(myVar) > 0 then\\u0002times_12_biuosdce\\u0002 instead.\\n\\nNote that equality checks account for different data types: \\n\\n\\u0002monaco_9_biuosdce\\u0002if (456 is \\\"456.00\\\") then answer \\\"yes\\\" -- answers yes\\u0002times_12_biuosdce\\u0002\\n\\nA \\\"point\\\" data type is two numbers separated by a comma. You can write:\\n\\u0002monaco_9_biuosdce\\u0002\\nput 1 into x\\nput 2 into y\\nset the topleft of cd btn \\\"myBtn\\\" to x, y\\n\\u0002times_12_biuosdce\\u0002\\n\\nThis is the same as writing\\n\\u0002monaco_9_biuosdce\\u0002\\nset the topleft of cd btn \\\"myBtn\\\" to 1, 2\\nset the topleft of cd btn \\\"myBtn\\\" to \\\"1, 2\\\"\\n-- or\\nset the top of cd btn \\\"myBtn\\\" to 1\\nset the left of cd btn \\\"myBtn\\\" to 2\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"User Functions\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002User Functions\\u0002times_12_biuosdce\\u0002\\n\\n\\nAn example of how to define and call a custom function:\\n\\u0002monaco_9_biuosdce\\u0002function myAddition p1, p2\\n    return p1 + p2\\nend myAddition\\non mouseUp\\n    put myAddition(1,2) into x\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nAn example of how to define and call a custom handler:\\n\\u0002monaco_9_biuosdce\\u0002on showMessage p1, p2\\n    put p1 into cd fld \\\"results1\\\"\\n    put p2 into cd fld \\\"results2\\\"\\nend showMessage\\non mouseUp\\n    showMessage \\\"hello\\\", \\\"world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nYou can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.\\n\\nNo error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string (\\\"\\\").\\n\\u0002monaco_9_biuosdce\\u0002myAddition(7, 8, 9) -- the extra argument 9 is ignored\\nmyAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8\\nmyAddition(7) -- p1 is assigned 7, p2 is assigned \\\"\\\"\\nmyAddition() -- p1 is assigned \\\"\\\", p2 is assigned \\\"\\\"\\u0002times_12_biuosdce\\u0002\\n\\nYou can use recursion.\\n\\nYou 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:\\n\\nMessages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.\\n* If you click on a button:\\n    * A mouseUp message is created\\n    * Script of the button is examined. \\n    * If there is an 'on mouseUp' handler,\\n        * Run the code in the mouseUp handler.\\n        * If the handler completes, stop running code, we're done.\\n        * If the handler calls 'pass mouseUp', continue:\\n    * Script of the current card is examined.\\n    * If there is an 'on mouseUp' handler,\\n        * Run the code in the mouseUp handler.\\n        * If the handler completes, stop running code, we're done.\\n        * If the handler calls 'pass mouseUp', continue:\\n    * Script of the current stack is examined.\\n    * If there is an 'on mouseUp' handler,\\n        * Run the code in the mouseUp handler.\\n\\n* Similarly, if you are typing text in a field, and type the letter 'a':\\n    * A afterKeyUp message is created\\n    * Script of the current field is examined.\\n    * If there is an 'on afterKeyUp' handler,\\n        * Run the code in the afterKeyUp handler.\\n        * If the handler completes, stop running code, we're done.\\n        * If the handler calls 'pass afterKeyUp', continue:\\n    * Script of the current card is examined.\\n    * If there is an 'on afterKeyUp' handler,\\n        * Run the code in the afterKeyUp handler.\\n        * If the handler completes, stop running code, we're done.\\n        * If the handler calls 'pass afterKeyUp', continue:\\n    * Script of the current stack is examined.\\n    * If there is an 'on afterKeyUp' handler,\\n        * Run the code in the mouseUp handler.\\n\\nCalling \\u0002monaco_9_biuosdce\\u0002exit to ViperCard\\u0002times_12_biuosdce\\u0002 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.\\n\\nSee documentation of the 'pass' command for more information.\\n\\nCalls 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.\\n\\n\"}, {\"title\": \"Text and Chunks\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Text and Chunks\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Lines\\u0002times_12_biuosdce\\u0002\\n\\nUse \\u0002monaco_9_biuosdce\\u0002newline\\u0002times_12_biuosdce\\u0002 to refer to a new line character.\\n\\nLet's say you wanted two lines of text in a field, you would use \\nthe following:\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"first line\\\" & newline & \\\"second line\\\" into cd fld \\\"myFld\\\"\\u0002times_12_biuosdce\\u0002\\n\\n(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.)\\n\\n\\u0002times_12_+biuosdce\\u0002Chunks\\u0002times_12_biuosdce\\u0002\\n\\nViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"ab\\\" & tab & \\\"cd\\\" & tab & \\\"ef\\\" into myList\\nset the itemDelimiter to tab\\nput 2 into n\\nanswer \\\"Result:\\\" & item n of myList\\n\\u0002times_12_biuosdce\\u0002\\nIf you have a comma-separated list you can get the nth item like this:\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"ab,cd,ef\\\" into myList\\nset the itemDelimiter to \\\",\\\"\\nput 2 into n\\nanswer \\\"Result:\\\" & item n of myList\\n\\u0002times_12_biuosdce\\u0002\\n\\nMore advanced examples:\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer char 2 of \\\"abcd\\\"\\nanswer char (n + 1) of \\\"abcd\\\"\\nanswer char 2 to 4 of \\\"abcd\\\"\\n\\nanswer item 2 of \\\"ab,cd,ef,gh\\\"\\nanswer item (n + 1) of \\\"ab,cd,ef,gh\\\"\\nanswer item 2 to 4 of \\\"ab,cd,ef,gh\\\"\\n\\nanswer first item of \\\"ab,cd,ef,gh\\\"\\nanswer last item of \\\"ab,cd,ef,gh\\\"\\nanswer any item of \\\"ab,cd,ef,gh\\\"\\n\\nput \\\"ab\\\" & newline & \\\"cd\\\" & newline & \\\"ef\\\" into myList\\nanswer line 2 of myList\\nanswer line (n + 1) of myList\\nanswer line 2 to 3 of myList\\n\\u0002times_12_biuosdce\\u0002\\n\\nRecursive scopes:\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"ab,cd\\\" & newline & \\\"ef,gh\\\" & newline & \\\"ij,kl\\\" into myList\\n\\nanswer item 2 of line 2 of myList\\nanswer char 2 of line 2 of myList\\nanswer char 2 of item 2 of line 2 of myList\\n\\nanswer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\\n\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Modifying by chunk\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"abcd\\\" into x\\nput \\\"A\\\" into char 2 of x\\nput \\\"A\\\" into char 2 to 4 of x\\n\\nput \\\"10,20,30\\\" into myList\\nput \\\"A\\\" into item 2 of myList\\nput \\\"A\\\" into item 2 to 3 of myList\\nmultiply item 2 of myList by 5\\nadd 1 to item 2 of myList\\n\\nput \\\"A\\\" into first item of myList\\nput \\\"A\\\" into last item of myList\\nput \\\"A\\\" into any item of myList\\n\\nput \\\"A\\\" into before item 2 of myList\\nput \\\"A\\\" into after item 2 of myList\\nput \\\"A\\\" into before char 2 of item 2 of myList\\n\\nput \\\"A\\\" into before item 2 of cd fld \\\"myFld\\\"\\nput \\\"A\\\" into after item 2 of cd fld \\\"myFld\\\"\\nput \\\"A\\\" into before char 2 of item 2 of cd fld \\\"myFld\\\"\\n\\nput \\\"ab,cd\\\" & newline & \\\"ef,gh\\\" & newline & \\\"ij,kl\\\" into myList\\nput \\\"A\\\" into item 2 of line 2 of myList\\nput \\\"A\\\" into char 2 of line 2 of myList\\nput \\\"A\\\" into char 2 of item 2 of line 2 of myList\\n\\nput \\\"A\\\" into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList\\n\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Backwards compatiblity\\u0002times_12_biuosdce\\u0002\\n\\nWe went to much effort to maintain fidelity with HyperCard's chunk processing. All of the above can be done with words:\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"ab cd ef\\\" into x\\nanswer word 2 of x\\nanswer word 2 to 3 of x\\nput \\\"A\\\" into word 2 of x\\nput \\\"A\\\" into word 2 to 3 of x\\nput \\\"A\\\" into char 2 to 3 of word 2 to 3 of x\\n\\u0002times_12_biuosdce\\u0002\\n\\nTo enable full compatibility with HyperCard, go to \\u0002monaco_9_biuosdce\\u0002Object->Stack info...\\u0002times_12_biuosdce\\u0002 and turn on compatibility mode. Chunk handling will now be identical (including the non-intuitive behavior seen below).\\n\\n\\u0002monaco_9_biuosdce\\u0002\\n-- if compatibility mode is on:\\n-- we follow HyperCard's non-intuitive behavior for the following:\\nput \\\"ab,cd\\\" & newline & \\\"ef,gh\\\" & newline & \\\"ij,kl\\\" into myList\\nput \\\"A\\\" into item 3 of item 4 of myList\\nput \\\"A\\\" into item 3 of char 2 of myList\\ndelete item 3 of item 4 of myList\\ndelete item 3 of char 2 of myList\\nadd 1 to item 3 of item 4 of myList\\nadd 1 to item 3 of char 2 of myList\\nanswer item 0 of myList\\nput \\\"A\\\" into item 0 of myList\\nanswer item 4 to 1 of myList\\nput \\\"A\\\" into item 4 to 1 of myList\\n\\n\\n-- The only known cases we don't support (we'll throw a runtime error):\\nanswer item -1 of myList\\nput \\\"A\\\" into item -1 of myList\\ndelete item -1 of myList\\nanswer char 2 of item 4 to 1 of myList\\nput \\\"A\\\" into char 2 of item 4 to 1 of myList\\ndelete char 2 of item 4 to 1 of myList\\ndelete item 2 to 3 of myList\\n\\u0002times_12_biuosdce\\u0002\\n\\nSee also documentation for the \\u0002monaco_9_biuosdce\\u0002delete\\u0002times_12_biuosdce\\u0002 command.\\n\"}, {\"title\": \"Objects\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Objects\\u0002times_12_biuosdce\\u0002\\n\\n\\nWays to refer to a button or field:\\n\\u0002monaco_9_biuosdce\\u0002\\ncd btn id 1234\\ncd btn \\\"myBtn\\\"\\ncd btn 2\\nfirst cd btn\\nany cd btn\\nlast cd btn\\n\\u0002times_12_biuosdce\\u0002\\n\\nWays to refer to a card:\\n\\u0002monaco_9_biuosdce\\u0002\\nthis card\\nprev card\\nnext card\\nfirst card\\nsecond card\\nlast card\\ncard 1\\ncard id 1234\\ncard \\\"name\\\"\\n\\u0002times_12_biuosdce\\u0002\\n\\nWays to refer to a background:\\n\\u0002monaco_9_biuosdce\\u0002\\nthis background\\nprev background\\nnext background\\nfirst background\\nsecond background\\nlast background\\nbg 1\\nbg id 1234\\nbg \\\"name\\\"\\n\\u0002times_12_biuosdce\\u0002\\n\\nWays to refer to a stack:\\n\\u0002monaco_9_biuosdce\\u0002\\nthis stack\\nstack 1\\nstack \\\"name\\\"\\n\\u0002times_12_biuosdce\\u0002\\nOther ways to refer to objects:\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer the name of the target\\nanswer the name of me\\nanswer the name of the owner of cd btn id 1234\\nput \\\"cd btn id 1234\\\" into x\\nanswer the name of x\\n\\nfunction whichObject\\n    return \\\"cd btn id 1234\\\"\\nend whichObject\\nanswer the name of whichObject()\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"Structure\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Structure\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Loops\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002repeat with x = 1 to 3\\n    ...other code here...\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\nRefer to \\u0002monaco_9_biuosdce\\u0002repeat\\u0002times_12_biuosdce\\u0002 under \\\"syntax\\\" for more information.\\n\\n\\u0002times_12_+biuosdce\\u0002If statements\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002if x > 1 then\\n    ...other code here...\\nelse\\n    ...other code here...\\nend if\\u0002times_12_biuosdce\\u0002\\nRefer to \\u0002monaco_9_biuosdce\\u0002if\\u0002times_12_biuosdce\\u0002 under \\\"syntax\\\" for more information.\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Scripts\\u0002times_12_biuosdce\\u0002\\nNo code can exist outside of a handler or function.\\n\\n\\u0002times_12_+biuosdce\\u0002Handlers\\u0002times_12_biuosdce\\u0002\\nHandlers look like this\\n\\n\\u0002monaco_9_biuosdce\\u0002on mouseup \\n    answer \\\"hello world\\\"\\nend mouseup\\u0002times_12_biuosdce\\u0002\\n    \\nand respond to an event message.\\n    \\n\\u0002times_12_+biuosdce\\u0002Functions\\u0002times_12_biuosdce\\u0002\\nFunctions look like this\\n\\n\\u0002monaco_9_biuosdce\\u0002function myAddition p1, p2\\n    return p1 + p2\\nend myAddition\\u0002times_12_biuosdce\\u0002\\n\\nThey can then be called with code like\\n\\u0002monaco_9_biuosdce\\u0002put myAddition(1,2) into x\\u0002times_12_biuosdce\\u0002\\nFunctions inside of functions are not supported.\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Statements\\u0002times_12_biuosdce\\u0002\\nYou cannot have a line that is just\\n    \\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\u0002times_12_biuosdce\\u0002\\nwith no command, this is a syntax error.\\n    \\nStatements occur on separate lines, there's no way to have more than one statement on a line.\\n    \\n\\u0002times_12_+biuosdce\\u0002Expressions\\u0002times_12_biuosdce\\u0002\\n\\nA set of computations such as \\u0002monaco_9_biuosdce\\u00021+2+3+4\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002sqrt(0.5) + sqrt(0.6)\\u0002times_12_biuosdce\\u0002 is an expression. Most places that take a value can be given an expression, for example,\\n\\n\\u0002monaco_9_biuosdce\\u0002go card 2\\n-- is the same as\\nput 1 into x\\ngo card (x + 1)\\n\\nput \\\"abc\\\" into cd fld \\\"myFld1\\\"\\nput \\\"abc\\\" into cd fld (prefix & \\\"1\\\")\\n\\nput \\\"a\\\" into line 4 of myList\\nput \\\"a\\\" into line (x+1) of myList\\n\\nset the left of cd btn \\\"myBtn\\\" to x\\nset the left of cd btn \\\"myBtn\\\" to (45 + 50 * cos(theta))\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"Examples\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Examples\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe tutorial videos show helpful example code.\\n\\nExample 1:\\n\\u0002monaco_9_biuosdce\\u0002\\n-- after creating a field called \\\"myFld\\\":\\n-- create a btn and put this in its script:\\non mouseUp\\n    -- when you click button \\\"Go\\\", you get 10 points!\\n    put cd fld \\\"myFld\\\" into score\\n    put (score + 10) into score\\n    put score into cd fld \\\"myFld\\\"\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\\nExample 2:\\n\\u0002monaco_9_biuosdce\\u0002\\n-- after creating a btn called \\\"fish\\\":\\n-- create a btn and put this in its script:\\non mouseUp\\n    -- when you click this, the fish moves\\n    put the top of cd btn \\\"fish\\\" into y\\n    subtract 10 from y\\n    set the top of cd btn \\\"fish\\\" to y\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\nExample 3:\\n\\u0002monaco_9_biuosdce\\u0002\\n-- create interactive art.\\n-- put this in the card script,\\n-- then when you choose the browse tool and \\n-- click on the card, it will draw lines.\\n\\non mouseUp\\n    put the clickH into X\\n    put the clickV into y\\n    \\n    -- choose the line tool to draw lines\\n    choose \\\"line\\\" tool\\n    \\n    -- make a loop that will repeat 10 times\\n    repeat 10 times\\n        put random(80) into randx\\n        put random(80) into randy\\n        -- will get random # between 1 and 80\\n        drag from x, y to (x + randx), (y + randy)\\n    end repeat\\nend mouseUp\\n  \\n\\u0002times_12_biuosdce\\u0002\\n\\n\"}, {\"title\": \"Tips & Shortcuts\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Tips & Shortcuts\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nGeneral tips\\n\\n* If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script\\n* See more error details, when in the Script Editor, by clicking on the error excerpt\\n* Double-click the eraser tool to clear paint on the current card\\n\\nKeyboard shortcuts when editing text,\\n\\n* Cmd+C to copy\\n* Cmd+X to cut\\n* Cmd+V to paste\\n* Cmd+A to select all\\n* Cmd+Backspace to delete entire word\\n* PageUp / PageDown to scroll one page\\n* Shift+PageUp / Shift+PageDown to select one page\\n* Home to move to start of line\\n* Shift+Home to select to start of line\\n* Cmd+Home to move to the start\\n* Cmd+Shift+Home to select to the start\\n* Left Arrow to move to the left\\n* Shift+Left Arrow to select to the left\\n* Cmd+Left Arrow to move left one word\\n* Cmd+Shift+Left Arrow to select left one word\\n* Cmd+Arrow Up to scroll up\\n* Cmd+Arrow Down to scroll down\\n* Cmd+D to duplicate the current line\\n* Cmd+L to delete the current line\\n* Cmd+Q to quickly comment-out or uncomment the current line\\n* Cmd+Q when many lines are selected to comment-out all of them\\n* Cmd+Q to comment-out a block of code\\n* Tab key, to auto-indent code in a script\\n\\nSome of the main differences between ViperCard and HyperCard:\\n* ViperCard is open source software that can run in any modern web browser\\n* you can export stacks as a modern json format\\n* art-stamps feature for adding clip art\\n* new animation features like save-to-gif\\n* in ViperCard you have to hit Save to save changes\\n* but in ViperCard you have extensive undo history and can even undo changes made by a script\\n\\nA few of the differences between ViperCard and HyperCard:\\n* You can use \\u0002monaco_9_biuosdce\\u0002--[[block comments]]\\u0002times_12_biuosdce\\u0002 that span many lines.\\n* You can write \\u0002monaco_9_biuosdce\\u0002exit to ViperCard\\u0002times_12_biuosdce\\u0002 instead of \\u0002monaco_9_biuosdce\\u0002exit to HyperCard\\u0002times_12_biuosdce\\u0002\\n* You must specify \\u0002monaco_9_biuosdce\\u0002cd\\u0002times_12_biuosdce\\u0002 or \\u0002monaco_9_biuosdce\\u0002bg\\u0002times_12_biuosdce\\u0002 when referring to a button or field, unless compatibility mode is enabled (Object->Stack Info)\\n* Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.\\n* Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool\\n* You cannot read a variable that has not been set. \\u0002monaco_9_biuosdce\\u0002put unsetVar into x\\u0002times_12_biuosdce\\u0002 causes a runtime error.\\n* hilite and checkmark are separate properties\\n* label and name are separate properties\\n* You can't have a variable named id, short, long, first, and so on.\\n* The \\u0002monaco_9_biuosdce\\u0002choose\\u0002times_12_biuosdce\\u0002 command sets the emulated current tool, not the actual tool, and is limited to certain paint operations\\n* The newline character is \\\\n and not \\\\r\\n\\n\\n\"}, {\"title\": \"What's New\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002What's New\\u0002times_12_biuosdce\\u0002\\n\\n\\nNew in 0.24\\n* Script stack trace\\n* Use \\u0002monaco_9_biuosdce\\u0002get the shiftKey\\u0002times_12_biuosdce\\u0002, deprecate \\u0002monaco_9_biuosdce\\u0002get the shiftKey()\\u0002times_12_biuosdce\\u0002\\n* You can say \\u0002monaco_9_biuosdce\\u0002the sin of 4\\u0002times_12_biuosdce\\u0002\\n* You can say \\u0002monaco_9_biuosdce\\u0002sin of 4\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002sin of cd fld 1\\u0002times_12_biuosdce\\u0002\\n* Continue lines with logical-not, press \\u0002monaco_9_biuosdce\\u0002Alt-Enter\\u0002times_12_biuosdce\\u0002 in code editor\\n* Block comments \\u0002monaco_9_biuosdce\\u0002--[[a comment]]\\u0002times_12_biuosdce\\u0002\\n* You can use \\u0002monaco_9_biuosdce\\u0002select\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002mark\\u0002times_12_biuosdce\\u0002, \\u0002monaco_9_biuosdce\\u0002doMenu\\u0002times_12_biuosdce\\u0002 commands\\n* You can turn on compat mode to allow \\u0002monaco_9_biuosdce\\u0002put \\\"a\\\" into fld 1\\u0002times_12_biuosdce\\u0002\\n* Everything is case insensitive, even \\u0002monaco_9_biuosdce\\u0002cd btn \\\"aBcDe\\\"\\u0002times_12_biuosdce\\u0002\\n* Improvements to \\u0002monaco_9_biuosdce\\u0002send\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002do\\u0002times_12_biuosdce\\u0002, script error shown in more helpful line\\n* Improvements to built in functions like \\u0002monaco_9_biuosdce\\u0002selectedText\\u0002times_12_biuosdce\\u0002\\n* Improvements to click features like \\u0002monaco_9_biuosdce\\u0002wait until the mouseClick\\u0002times_12_biuosdce\\u0002\\n* You can say \\u0002monaco_9_biuosdce\\u0002put \\\"card id 2590\\\" into xx; put the name of xx into y\\u0002times_12_biuosdce\\u0002\\n* You can use values for coords, e.g. \\u0002monaco_9_biuosdce\\u0002put \\\"3,4\\\" into c; set the loc of cd btn 1 to c\\u0002times_12_biuosdce\\u0002\\n* Better match subtle differences between \\u0002monaco_9_biuosdce\\u0002target\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002the target\\u0002times_12_biuosdce\\u0002\\n* Single-line \\u0002monaco_9_biuosdce\\u0002if\\u0002times_12_biuosdce\\u0002 statements, fewer parentheses needed\\n* Call custom functions from anywhere\\n* Better cursors, better rendering on different screen resolutions\\n* More fonts, all fonts have pixel-perfect spacing\\n* You can use recursive chunks like \\u0002monaco_9_biuosdce\\u0002put \\\"a\\\" into char 7 of line 3 of x\\u0002times_12_biuosdce\\u0002\\n* Improvements to load time by loading some libraries asynchronously\\n* Common commands in script execution are faster\\n* Scripts can dynamically create/delete objects, and set scripts\\n* New features like \\u0002monaco_9_biuosdce\\u0002set the textstyle of line 3 of cd fld \\\"myFld\\\" to \\\"toggle-bold\\\"\\u0002times_12_biuosdce\\u0002\\n\\n\"}, {\"title\": \"Credits\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002Credits\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nViperCard\\nhttps://github.com/moltenform/vipercard\\nCopyright (C) 2020 Ben Fisher\\n\\nThis 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. \\n\\nThis 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.\\n\\nViperCard uses the following libraries:\\n\\n* Chevrotain\\n    * https://github.com/SAP/chevrotain\\n    * Apache License 2.0\\n* FileSaver.js\\n    * https://github.com/eligrey/FileSaver.js\\n    * MIT License\\n* Golly\\n    * https://github.com/dannygarcia/golly\\n    * MIT License\\n* js-lru\\n    * https://github.com/rsms/js-lru\\n    * MIT License\\n* Clipboard.js\\n    * https://github.com/zenorocha/clipboard.js\\n    * MIT License\\n* base64js\\n    * https://github.com/beatgammit/base64-js\\n    * MIT License\\n* JSGIF\\n    * https://github.com/antimatter15/jsgif\\n    * MIT License\\n* Bresenham easy.filter\\n    * http://members.chello.at/easyfilter/bresenham.html\\n    * written permission of author\\n* lz-string\\n    * https://github.com/pieroxy/lz-string\\n    * MIT License\\n* Pizzicato\\n    * https://github.com/alemangui/pizzicato\\n    * MIT License\\n* Bowser\\n    * https://github.com/lancedikson/bowser\\n    * MIT License\\n* types-text-encoding \\n    * https://www.npmjs.com/package/@types/text-encoding\\n    * MIT License\\n* deep-freeze\\n    * https://github.com/substack/deep-freeze\\n    * Public domain\\n* pbkdf2 gist by Chris Veness\\n* description of Mac OS Roman character set\\n    * https://en.wikipedia.org/wiki/Mac_OS_Roman\\n    * http://creativecommons.org/licenses/by-sa/3.0/\\n    * Creative Commons Attribution-ShareAlike\\n* and a small excerpt from the SciTE code editor,\\n* ported from C++ to TypeScript by Ben Fisher\\n* SciTE\\n    * https://www.scintilla.org/License.txt\\n\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refproperties.json",
    "content": "{\"name\": \"lngProperties\", \"entries\": [{\"title\": \"id\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002id\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe id uniquely identifies an object. In ViperCard, all objects will have different ids, even if they are different types or are on different cards.\\n\\nIf you put the long id of an object into a variable, you can use that variable to refer to the object.\\n\\n\\u0002monaco_9_biuosdce\\u0002put the long id of card id 1011 into z\\nset the name of z to \\\"changed\\\"\\u0002times_12_biuosdce\\u0002\\n\\nThe short id of an object is just the number. For example the short id of card id 1011 is 1011.\\n\\n\\u0002monaco_9_biuosdce\\u0002put the short id of card id 1011 into z\\nset the name of cd id z to \\\"changed\\\"\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"name\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002name\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can get or set the name of an object.\\n\\u0002monaco_9_biuosdce\\u0002\\ndoMenu \\\"New Button\\\"\\nset the name of the result to \\\"my new button\\\"\\n\\nset the name of cd btn id 1011 to \\\"changed\\\"\\nanswer the short name of cd btn id 1011 -- \\\"changed\\\"\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"number\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002number\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can get the number of an object.\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer the number of cd fld 2 -- 2\\nanswer the number of cd btn 3 -- 3\\nanswer the number of card 4 -- 4\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"owner\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002owner\\u0002times_12_biuosdce\\u0002\\n\\n\\nGets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the owner of cd btn \\\"myBtn\\\" into z\\nset the name of the owner of cd btn \\\"myBtn\\\" to \\\"changed\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"script\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002script\\u0002times_12_biuosdce\\u0002\\n\\n\\nIt's unlikely to be useful, but a script can dynamically change the contents of another script.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput return & \\\"on newCode\\\" & return & \\\"answer 234\\\" & \\\\\\n    return & \\\"end newCode\\\" into newCode\\nput the script of cd btn id 123 into oldCode\\nset the script of cd btn id 123 to oldCode & newCode\\nsend \\\"newCode\\\" to cd btn id 123\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: autohilite\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: autohilite\\u0002times_12_biuosdce\\u0002\\n\\n\\nDoes the button turn black when you click on it?\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the autohilite of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: checkmark\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: checkmark\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the checkmark of cd btn \\\"myBtn\\\" to true.\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: enabled\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: enabled\\u0002times_12_biuosdce\\u0002\\n\\n\\nIf a button is not enabled, it is greyed out and can't be clicked.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the enabled of cd btn \\\"myBtn\\\" to true\\nset the enabled of cd btn \\\"myBtn\\\" to false\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: left\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: left\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe 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.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the left of cd btn \\\"myBtn\\\" to 4\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: loc, location\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: loc, location\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe coordinates of the center of the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the location of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: height\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: height\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe height of the object on screen, in pixels.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the height of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: hilite\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: hilite\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the hilite of cd btn \\\"myBtn\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: label\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: label\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the label of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: icon\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: icon\\u0002times_12_biuosdce\\u0002\\n\\n\\nNumber of the icon.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the icon of cd btn \\\"myBtn\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: rect, rectangle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: rect, rectangle\\u0002times_12_biuosdce\\u0002\\n\\n\\nFour 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.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the rect of cd btn \\\"myBtn\\\" to 45,56,67,78\\nset the rectangle of cd btn \\\"myBtn\\\" to 45,56,67,78\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: showlabel\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: showlabel\\u0002times_12_biuosdce\\u0002\\n\\n\\nIs the label text shown?\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the showlabel of cd btn \\\"myBtn\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: style\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: style\\u0002times_12_biuosdce\\u0002\\n\\n\\nStyles include:\\nTransparent\\nRectangle\\nOpaque\\nRoundrect\\nPlain\\nShadow\\nOsStandard\\nOsDefault\\nOsBoxmodal\\nCheckbox\\nRadio\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the style of cd btn \\\"myBtn\\\" to \\\"Shadow\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: textalign\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: textalign\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet alignment of the label text.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textalign of cd btn \\\"myBtn\\\" to \\\"left\\\"\\nset the textalign of cd btn \\\"myBtn\\\" to \\\"center\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: textfont\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: textfont\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet typeface of the label text.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textfont of cd btn \\\"myBtn\\\" to \\\"courier\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: textsize\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: textsize\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet size of the label text.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textsize of cd btn \\\"myBtn\\\" to 24\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: textstyle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: textstyle\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet style of the label text.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textstyle of cd btn \\\"myBtn\\\" to \\\"bold\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: top\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: top\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe 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.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the top of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: topleft\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: topleft\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe x,y coordinates of the upper left corner.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the topleft of cd btn \\\"myBtn\\\" to 34, 56\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: visible\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: visible\\u0002times_12_biuosdce\\u0002\\n\\n\\nHide or show the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the visible of cd btn \\\"myBtn\\\" to false\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"btn: width\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002btn: width\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe width of the object on screen, in pixels.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the width of cd btn \\\"myBtn\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: alltext\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: alltext\\u0002times_12_biuosdce\\u0002\\n\\n\\nGet or set all contents of the field.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the alltext of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: dontwrap\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: dontwrap\\u0002times_12_biuosdce\\u0002\\n\\n\\nWrap text onto different lines.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the dontwrap of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: enabled\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: enabled\\u0002times_12_biuosdce\\u0002\\n\\n\\nA disabled field is greyed out and can't be edited.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the enabled of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: defaulttextfont\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: defaulttextfont\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nIf the user deletes all text in a field and then types a letter, the font of this letter will be determined by the defaulttextfont.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the defaulttextfont of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: defaulttextsize\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: defaulttextsize\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nIf the user deletes all text in a field and then types a letter, the size of this letter will be determined by the defaulttextsize.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the defaulttextsize of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: defaulttextstyle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: defaulttextstyle\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nIf the user deletes all text in a field and then types a letter, the style of this letter will be determined by the defaulttextstyle.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the defaulttextstyle of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: left\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: left\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe 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.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the left of cd fld \\\"myFld\\\" to 4\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: loc, location\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: loc, location\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe coordinates of the center of the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the location of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: locktext\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: locktext\\u0002times_12_biuosdce\\u0002\\n\\n\\nYou can't type new text into a 'locked' field. You can still set the contents via a script.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the locktext of cd fld \\\"myFld\\\" to true\\nput \\\"still can change\\\" into cd fld \\\"myFld\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: height\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: height\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe height of the object on screen, in pixels.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the height of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: rect, rectangle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: rect, rectangle\\u0002times_12_biuosdce\\u0002\\n\\n\\nFour 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.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the rect of cd fld \\\"myFld\\\" to 45,56,67,78\\nset the rectangle of cd fld \\\"myFld\\\" to 45,56,67,78\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: scroll\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: scroll\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe vertical scroll position.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the scroll of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: singleline\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: singleline\\u0002times_12_biuosdce\\u0002\\n\\n\\nField is a single line, cannot contain newlines.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the singleline of cd fld \\\"myFld\\\" into z\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: style\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: style\\u0002times_12_biuosdce\\u0002\\n\\n\\nStyles include:\\nOpaque\\nTransparent\\nRectangle\\nShadow\\nScrolling\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the style of cd fld \\\"myFld\\\" to \\\"shadow\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: textalign\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: textalign\\u0002times_12_biuosdce\\u0002\\n\\n\\nSet alignment of text\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the textalign of cd fld \\\"myFld\\\" to \\\"left\\\"\\nset the textalign of cd fld \\\"myFld\\\" to \\\"center\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: textfont\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: textfont\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nBy default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textfont of cd fld \\\"myFld\\\" to \\\"chicago\\\"\\nput the textfont of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textfont of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"geneva\\\"\\nput the textfont of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values, returns the string \\\"mixed\\\".\\n\\n\"}, {\"title\": \"fld: textsize\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: textsize\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nBy default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textsize of cd fld \\\"myFld\\\" to \\\"chicago\\\"\\nput the textsize of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textsize of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"geneva\\\"\\nput the textsize of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values, returns the string \\\"mixed\\\".\\n\\n\"}, {\"title\": \"fld: textstyle\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: textstyle\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nBy default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textstyle of cd fld \\\"myFld\\\" to \\\"bold\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"bold,italic\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"plain\\\"\\nput the textstyle of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textstyle of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"bold\\\"\\nput the textstyle of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values, returns the string \\\"mixed\\\".\\n\\nYou can also do the following:\\n\\u0002monaco_9_biuosdce\\u0002set the textstyle of cd fld \\\"myFld\\\" to \\\"add-bold\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"subtract-italic\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"toggle-outline\\\"\\nset the textstyle of line 2 of cd fld \\\"myFld\\\" to \\\"add-bold\\\"\\nset the textstyle of line 2 of cd fld \\\"myFld\\\" to \\\"subtract-italic\\\"\\nset the textstyle of line 2 of cd fld \\\"myFld\\\" to \\\"toggle-outline\\\"\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: top\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: top\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe 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.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the top of cd fld \\\"myFld\\\" into z\\n\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: topleft\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: topleft\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe x,y coordinates of the upper left corner.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the topleft of cd fld \\\"myFld\\\" to 34, 56\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: width\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: width\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe width of the object on screen, in pixels.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the width of cd fld \\\"myFld\\\" into z\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"fld: visible\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002fld: visible\\u0002times_12_biuosdce\\u0002\\n\\n\\nShow or hide the object.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the visible of cd fld \\\"myFld\\\" into z\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"cursor\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002cursor\\u0002times_12_biuosdce\\u0002\\n\\n\\nSets the current cursor.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\n-- show the watch\\nset the cursor to \\\"watch\\\"\\nwait 2 seconds\\n\\n-- spinning ball\\nrepeat with x = 1 to 30\\n    set the cursor to \\\"busy\\\"\\n    wait 0.2 seconds\\nend repeat\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"filled\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002filled\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe color/opacity for drawing. Currently can be \\\"true\\\" for black, \\\"false\\\" for transparent, or \\\"white\\\" for white.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the filled to \\\"white\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"lineColor\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002lineColor\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe lineColor for drawing. Currently can be 0 (black) or 1 (white).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the lineSize to 1\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"lineSize\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002lineSize\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe linesize for drawing. Currently can be 1 (thin) or 2 (thicker).\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the lineSize to 2\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"itemdelimiter\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002itemdelimiter\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nput the itemdelimiter into z\\nset the itemdel to tab\\nanswer item 2 of \\\"a\\\"&tab&\\\"b\\\"&tab&\\\"c\\\"\\nset the itemdel to \\\",\\\"\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"idlerate\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002idlerate\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe speed at which \\u0002monaco_9_biuosdce\\u0002on idle\\u0002times_12_biuosdce\\u0002 is called.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the idlerate to \\\"default\\\"\\nset the idlerate to \\\"faster\\\"\\nset the idlerate to \\\"faster2\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"multiple\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002multiple\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe \\\"draw multiple\\\" setting for drawing. Does not yet affect script drawing.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nset the multiple to true\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"pattern\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002pattern\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe current pattern number.\\n\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refsyntax.json",
    "content": "{\"name\": \"lngSyntax\", \"entries\": [{\"title\": \"(Operators)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002(Operators)\\u0002times_12_biuosdce\\u0002\\n\\n\\nHere are the operators that can be used.\\n\\u0002monaco_9_biuosdce\\u00022 * 3\\u0002times_12_biuosdce\\u0002\\nmultiplication\\n\\u0002monaco_9_biuosdce\\u00022 / 3\\u0002times_12_biuosdce\\u0002\\ndivision\\n\\u0002monaco_9_biuosdce\\u00022 ^ 3\\u0002times_12_biuosdce\\u0002\\nraise to the third power\\n\\u0002monaco_9_biuosdce\\u00027 div 5\\u0002times_12_biuosdce\\u0002\\ntruncated division\\n\\u0002monaco_9_biuosdce\\u00027 mod 5\\u0002times_12_biuosdce\\u0002\\nmodulo\\n\\u0002monaco_9_biuosdce\\u00022 > 3\\u0002times_12_biuosdce\\u0002\\ngreater than\\n\\u0002monaco_9_biuosdce\\u00022 < 3\\u0002times_12_biuosdce\\u0002\\nless than\\n\\u0002monaco_9_biuosdce\\u00022 >= 3\\u0002times_12_biuosdce\\u0002\\ngreater than or equal to\\n\\u0002monaco_9_biuosdce\\u00022 <= 3\\u0002times_12_biuosdce\\u0002\\nless than or equal to\\n\\u0002monaco_9_biuosdce\\u00022  ==  3\\u0002times_12_biuosdce\\u0002\\nequal to\\n\\u0002monaco_9_biuosdce\\u00022  !=  3\\u0002times_12_biuosdce\\u0002\\nnot equal to\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is \\\"def\\\"\\u0002times_12_biuosdce\\u0002\\nequal to\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is not \\\"def\\\"\\u0002times_12_biuosdce\\u0002\\nnot equal to\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is in \\\"123abcdef\\\"\\u0002times_12_biuosdce\\u0002\\ndoes string contain another string\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is not in \\\"123abcdef\\\"\\u0002times_12_biuosdce\\u0002\\nstring is not in another string\\n\\u0002monaco_9_biuosdce\\u00022 + 3\\u0002times_12_biuosdce\\u0002\\naddition\\n\\u0002monaco_9_biuosdce\\u00022 - 3\\u0002times_12_biuosdce\\u0002\\nsubtraction\\n\\n\\u0002monaco_9_biuosdce\\u0002&\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002&&\\u0002times_12_biuosdce\\u0002 combine two strings (concatenation).\\n\\u0002monaco_9_biuosdce\\u0002put \\\"a\\\" & \\\"b\\\" into x\\nanswer x -- displays \\\"ab\\\"\\nput \\\"a\\\" && \\\"b\\\" into x\\nanswer x -- displays \\\"a b\\\"\\u0002times_12_biuosdce\\u0002\\n\\nYou can also use \\u0002monaco_9_biuosdce\\u0002a = b\\u0002times_12_biuosdce\\u0002, which is equivalent to \\u0002monaco_9_biuosdce\\u0002a == b\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Logical operators\\u0002times_12_biuosdce\\u0002\\n\\nThe 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.\\n\\u0002monaco_9_biuosdce\\u0002true and false\\u0002times_12_biuosdce\\u0002\\nlogical and\\n\\u0002monaco_9_biuosdce\\u0002true or false\\u0002times_12_biuosdce\\u0002\\nlogical or\\n\\u0002monaco_9_biuosdce\\u0002not true\\u0002times_12_biuosdce\\u0002\\nlogical not\\n\\nLogical operations are not guaranteed to be short-circuiting. In other words,\\n\\u0002monaco_9_biuosdce\\u0002put (true or myfunction()) into x\\u0002times_12_biuosdce\\u0002\\nstill will call \\u0002monaco_9_biuosdce\\u0002myfunction\\u0002times_12_biuosdce\\u0002, when it hypothetically could have been skipped.\\n\\n\\n\"}, {\"title\": \"(Constants)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002(Constants)\\u0002times_12_biuosdce\\u0002\\n\\n\\nThe following constants are defined:\\n\\u0002monaco_9_biuosdce\\u0002\\npi\\nnewline\\ntab\\nempty\\nquote\\none\\ntwo\\nthree\\nfour\\nfive\\nsix\\nseven\\neight\\nnine\\nten\\ncolon\\ncomma\\ntrue\\nfalse\\nup\\ndown\\nspace\\nreturn\\ncr\\nformfeed\\nlinefeed\\u0002times_12_biuosdce\\u0002\\n\\n\"}, {\"title\": \"global\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002global\\u0002times_12_biuosdce\\u0002\\n\\n\\nDeclares that a variable is a global.\\n1) it can be accessed from any other script\\n2) the contents are saved even after the function is complete.\\nThe contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nglobal currentData1, currentData2\\nput \\\"stored 1\\\" into currentData1\\nput \\\"stored 2\\\" into currentData2\\n\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"if/then\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002if/then\\u0002times_12_biuosdce\\u0002\\n\\n\\n\\nUse to run certain code based on a condition that can be true or false.\\n\\nIn the example\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput 2 into x\\nif x > 0 then\\n    answer \\\"x is greater than 0\\\"\\nend if\\u0002times_12_biuosdce\\u0002\\n\\nFirst, we'll check the expression \\u0002monaco_9_biuosdce\\u0002x > 0\\u0002times_12_biuosdce\\u0002. Since it evaluates to true, the code inside is run. \\n\\nYou can also include an \\\"else\\\" section that will be run only if the expression evaluated to false.\\n\\n\\u0002monaco_9_biuosdce\\u0002if x > 0 then\\n    answer \\\"x is greater than 0\\\"\\nelse\\n    answer \\\"x is not greater than 0\\\"\\nend if\\u0002times_12_biuosdce\\u0002\\n\\nYou can chain together many different conditions with \\\"else if\\\". \\n\\n\\u0002monaco_9_biuosdce\\u0002\\nput 3 into x\\nif x > 3 then\\n    answer \\\"x is greater than 3\\\"\\nelse if x < 3 then\\n    answer \\\"x is less than 3\\\"\\nelse if x is 3 then\\n    answer \\\"x is 3\\\"\\nend if\\u0002times_12_biuosdce\\u0002\\n\\nAs soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.\\n\\n\\u0002monaco_9_biuosdce\\u0002\\nif 3+3 is 6 then\\n    answer \\\"aaa\\\"\\nelse if 2+2 is 4 then\\n    -- this not run, even though the expression is true\\n    answer \\\"bbb\\\"\\nend if\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"short if/then\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002short if/then\\u0002times_12_biuosdce\\u0002\\n\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nif 3+3 is 6 then answer \\\"it is\\\"\\n\\n-- you can even do this\\n\\nif 3+3 is 7 then answer \\\"it is not\\\"\\nelse answer \\\"it is\\\"\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exit repeat\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exit repeat\\u0002times_12_biuosdce\\u0002\\n\\n\\nExit the current loop. Equivalent to \\\"break\\\" in C.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nrepeat with x = 1 to 3\\n    if x == 2 then\\n        exit repeat\\n    end if\\n    answer x\\nend repeat\\n-- displays 1\\n-- and does not display 2 or 3\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exit\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exit\\u0002times_12_biuosdce\\u0002\\n\\n\\nSkips to the end of the current handler, skipping over all subsequent lines of code. Similar to return, but does not point to a value.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non mouseUp\\n    put cd fld \\\"fld1\\\" into x\\n    if x is not a number then\\n        answer \\\"you did not type a number\\\"\\n        exit mouseUp\\n        answer \\\"this will never get called\\\"\\n    end if\\n    put x * 2 into cd fld \\\"fld1\\\"\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"exit to ViperCard\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002exit to ViperCard\\u0002times_12_biuosdce\\u0002\\n\\n\\nExits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.\\n\\nFor compatibility, \\u0002monaco_9_biuosdce\\u0002exit to HyperCard\\u0002times_12_biuosdce\\u0002 is also accepted. \\u0002monaco_9_biuosdce\\u0002exit to ViperCard\\u0002times_12_biuosdce\\u0002 can also be useful if you have overridden a default message and want to defer to the default behavior.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\non myHandler\\n    exit to ViperCard\\n    answer \\\"this will never get called\\\"\\nend myHandler\\non mouseUp\\n    myHandler\\n    answer \\\"and even this will never get called\\\"\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"next repeat\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002next repeat\\u0002times_12_biuosdce\\u0002\\n\\n\\nInside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to \\\"continue\\\" in C.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nrepeat with x = 1 to 3\\n    if x == 2 then\\n        next repeat\\n    end if\\n    answer x\\nend repeat\\n-- displays 1\\n-- displays 3\\n-- and does not display 2\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"pass\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002pass\\u0002times_12_biuosdce\\u0002\\n\\n\\nExits the current function and calls a function higher in the message hierarchy. For example, if a button has the script\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"button handling the event\\\"\\nend mouseUp\\n-- and the current card has the script\\non mouseUp\\n    answer \\\"card handling the event\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\nand the button is clicked, only the button's code will be run.\\n\\nIf you want both to be run, you can use the pass command. If a button has the script\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"button handling the event\\\"\\n    pass mouseUp\\n    -- any code here will be skipped\\nend mouseUp\\n--and the current card has the script\\non mouseUp\\n    answer \\\"card handling the event\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\nand the button is clicked,\\nboth will be run.\\n\\n\"}, {\"title\": \"repeat\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002repeat\\u0002times_12_biuosdce\\u0002\\n\\n\\nUse to create a loop.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nrepeat with x = 1 to 5\\n    answer \\\"x is now\\\" & x\\nend repeat\\n\\nrepeat with x = 5 down to 1\\n    answer \\\"x is now\\\" & x\\nend repeat\\n\\nrepeat 3 times\\n    answer \\\"hi\\\"\\nend repeat\\n\\nrepeat forever\\n    answer \\\"this is an infinite loop\\\"\\nend repeat\\n\\nput 0 into counter\\nrepeat forever\\n    answer \\\"but not this\\\"\\n    add 1 to counter\\n    if counter > 3 then\\n        exit repeat\\n    end if\\nend repeat\\n\\nput 0 into counter\\nrepeat until counter > 3\\n    add 1 to counter\\nend repeat\\n\\nput 0 into counter\\nrepeat while counter <= 3\\n    add 1 to counter\\nend repeat\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}, {\"title\": \"return\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002return\\u0002times_12_biuosdce\\u0002\\n\\n\\nReturns a value from the current function.\\nNote: no lines of code after the return statement will be run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\n\\nfunction myAddition p1, p2\\n    return p1 + p2\\n    answer \\\"this line will never be reached\\\"\\nend myAddition\\non mouseUp\\n    put myAddition(1,2) into x\\nend mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\n\"}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 12, 10, 11, 2], [1, 105, 13, 5, 11, 2], [1, 156, 15, 9, 13, 2], [1, 206, 13, 12, 12, 1], [1, 258, 14, 10, 14, 2], [1, 309, 14, 10, 13, 2], [1, 360, 10, 5, 8, 2], [1, 410, 12, 12, 9, 1], [1, 461, 10, 12, 9, 1], [1, 514, 13, 7, 11, 3], [1, 566, 12, 7, 11, 4], [1, 621, 9, 6, 9, 8], [1, 670, 11, 3, 11, 6], [1, 723, 9, 4, 9, 8], [1, 767, 13, 11, 11, 1], [62, 3, 13, 10, 12, 2], [62, 54, 13, 10, 12, 2], [62, 105, 13, 10, 12, 2], [62, 156, 14, 10, 12, 2], [62, 207, 13, 10, 12, 2], [62, 258, 14, 10, 12, 2], [62, 309, 12, 10, 12, 2], [62, 360, 14, 10, 12, 2], [62, 411, 13, 10, 12, 2], [62, 462, 13, 10, 12, 2], [62, 515, 10, 8, 9, 4], [62, 566, 10, 10, 9, 4], [62, 615, 11, 9, 10, 2], [62, 669, 13, 5, 12, 5], [62, 717, 12, 9, 10, 2], [62, 768, 13, 10, 12, 2], [123, 3, 16, 10, 14, 2], [123, 54, 13, 10, 12, 2], [123, 105, 13, 10, 12, 2], [123, 156, 13, 10, 12, 2], [123, 207, 13, 10, 12, 2], [123, 258, 13, 10, 11, 2], [123, 309, 13, 10, 11, 2], [123, 360, 13, 10, 12, 2], [123, 411, 14, 10, 12, 2], [123, 462, 12, 10, 11, 2], [123, 513, 13, 10, 11, 2], [123, 564, 14, 10, 13, 2], [123, 615, 11, 10, 11, 2], [123, 666, 17, 10, 15, 2], [123, 717, 15, 10, 13, 2], [123, 768, 13, 10, 12, 2], [184, 3, 13, 10, 12, 2], [184, 54, 13, 11, 12, 2], [184, 105, 13, 10, 12, 2], [184, 156, 12, 10, 11, 2], [184, 207, 14, 10, 11, 2], [184, 258, 14, 10, 12, 2], [184, 309, 14, 10, 12, 2], [184, 360, 17, 10, 15, 2], [184, 411, 14, 10, 12, 2], [184, 462, 15, 10, 13, 2], [184, 513, 14, 10, 12, 2], [184, 563, 12, 12, 10, 1], [184, 614, 10, 11, 11, 1], [184, 665, 12, 12, 10, 1], [184, 718, 12, 4, 12, 3], [184, 776, 12, 3, 12, 10], [245, 2, 11, 4, 10, 1], [245, 56, 12, 8, 12, 4], [245, 105, 12, 10, 12, 2], [245, 158, 11, 8, 11, 4], [245, 207, 14, 10, 12, 2], [245, 260, 12, 8, 12, 4], [245, 309, 14, 10, 11, 2], [245, 362, 13, 10, 12, 4], [245, 411, 12, 10, 12, 2], [245, 462, 11, 10, 9, 2], [245, 513, 12, 12, 10, 2], [245, 564, 13, 10, 12, 2], [245, 615, 11, 10, 9, 2], [245, 668, 15, 8, 15, 4], [245, 719, 12, 8, 12, 4], [245, 770, 12, 8, 12, 4], [306, 5, 12, 10, 12, 4], [306, 56, 13, 10, 12, 4], [306, 107, 12, 8, 10, 4], [306, 158, 11, 8, 11, 4], [306, 207, 12, 10, 11, 2], [306, 260, 13, 8, 12, 4], [306, 311, 13, 8, 12, 4], [306, 362, 16, 8, 15, 4], [306, 413, 13, 8, 12, 4], [306, 464, 13, 10, 12, 4], [306, 515, 13, 8, 12, 4], [306, 563, 12, 12, 10, 1], [306, 615, 11, 11, 9, 2], [306, 665, 11, 12, 10, 1], [306, 719, 13, 4, 12, 4], [306, 768, 12, 10, 10, 2], [367, 1, 13, 12, 12, 0], [367, 52, 13, 12, 12, 0], [367, 105, 13, 12, 12, 2], [367, 154, 12, 12, 11, 0], [367, 205, 14, 12, 13, 0], [367, 256, 13, 12, 12, 0], [367, 307, 14, 12, 12, 0], [367, 359, 12, 11, 12, 1], [367, 410, 12, 11, 12, 1], [367, 461, 12, 11, 12, 1], [367, 513, 13, 10, 12, 2], [367, 563, 14, 11, 12, 1], [367, 613, 13, 12, 12, 0], [367, 668, 11, 10, 11, 4], [367, 716, 12, 11, 12, 1], [367, 767, 12, 11, 12, 1], [428, 2, 12, 11, 12, 1], [428, 54, 13, 10, 12, 2], [428, 104, 10, 11, 9, 1], [428, 155, 10, 11, 9, 1], [428, 206, 10, 11, 9, 1], [428, 258, 11, 10, 9, 2], [428, 308, 14, 11, 12, 1], [428, 359, 12, 11, 12, 1], [428, 410, 12, 11, 12, 1], [428, 461, 12, 11, 12, 1], [428, 513, 13, 10, 12, 2], [428, 563, 14, 11, 12, 1], [428, 614, 13, 11, 12, 1], [428, 665, 13, 11, 12, 1], [428, 716, 13, 11, 12, 1], [428, 768, 13, 10, 12, 2], [489, 3, 11, 7, 10, 2], [489, 54, 11, 5, 10, 2], [489, 104, 13, 10, 11, 1], [489, 156, 13, 10, 13, 2], [489, 207, 12, 12, 11, 2], [489, 260, 11, 6, 11, 4], [489, 309, 15, 10, 12, 2], [489, 360, 13, 10, 12, 2], [489, 411, 14, 10, 13, 2], [489, 462, 14, 10, 13, 2], [489, 513, 16, 5, 14, 2], [489, 563, 11, 4, 10, 1], [489, 615, 12, 3, 10, 2], [489, 668, 14, 7, 13, 4], [489, 717, 16, 10, 14, 2], [489, 768, 13, 10, 12, 2], [550, 5, 17, 6, 17, 4], [550, 55, 13, 9, 12, 3], [550, 107, 11, 8, 11, 4], [550, 159, 11, 7, 11, 5], [550, 207, 15, 10, 13, 2], [550, 260, 14, 10, 13, 4], [550, 309, 12, 10, 11, 2], [550, 360, 15, 11, 13, 2], [550, 411, 17, 10, 15, 2], [550, 463, 17, 9, 15, 3], [550, 513, 13, 12, 11, 2], [550, 564, 12, 9, 11, 2], [550, 615, 12, 9, 11, 2], [550, 666, 14, 10, 13, 2], [550, 719, 15, 8, 15, 4], [550, 770, 13, 8, 12, 4], [611, 3, 13, 10, 12, 2], [611, 54, 11, 10, 10, 2], [611, 110, 11, 5, 11, 7], [611, 155, 17, 11, 15, 1], [611, 207, 13, 12, 11, 2], [611, 260, 13, 7, 12, 4], [611, 309, 14, 10, 14, 2], [611, 363, 14, 6, 13, 5], [611, 414, 13, 7, 13, 5], [611, 468, 16, 4, 17, 8], [611, 511, 1, 1, 12, 1], [611, 562, 13, 12, 12, 0], [611, 613, 14, 12, 12, 0], [611, 664, 14, 12, 12, 0], [611, 717, 16, 10, 14, 2], [611, 770, 16, 8, 15, 4], [672, 7, 10, 3, 10, 6], [672, 58, 13, 3, 13, 6], [672, 105, 14, 6, 12, 2], [672, 156, 14, 6, 12, 2], [672, 207, 11, 6, 9, 2], [672, 258, 11, 6, 9, 2], [672, 311, 12, 7, 11, 4], [672, 363, 12, 7, 12, 5], [672, 411, 13, 12, 12, 2], [1, 1, 1, 1, 8, 1], [794, 767, 12, 4, 10, 1], [672, 565, 13, 7, 12, 3], [672, 618, 11, 6, 10, 5], [672, 669, 10, 7, 10, 5], [672, 717, 15, 10, 13, 2], [672, 768, 15, 10, 13, 2], [733, 3, 11, 7, 10, 2], [733, 57, 10, 4, 9, 5], [733, 111, 9, 6, 9, 8], [733, 162, 12, 6, 12, 8], [733, 207, 17, 10, 18, 2], [733, 256, 13, 12, 12, 0], [733, 307, 12, 12, 11, 0], [733, 358, 13, 12, 12, 0], [733, 409, 13, 12, 11, 0], [733, 460, 12, 12, 11, 0], [733, 511, 11, 12, 11, 0], [733, 562, 12, 12, 11, 0], [733, 613, 12, 12, 11, 0], [733, 664, 12, 12, 11, 0], [733, 715, 13, 12, 12, 0], [733, 766, 13, 12, 12, 0], [1, 1, 1, 1, 8, 1], [794, 52, 13, 12, 12, 0], [794, 103, 13, 12, 12, 0], [794, 154, 13, 12, 12, 0], [794, 205, 13, 12, 12, 0], [794, 260, 10, 8, 9, 4], [794, 308, 11, 4, 10, 1], [794, 359, 14, 4, 12, 1], [794, 411, 12, 3, 10, 2], [794, 461, 12, 4, 10, 1], [794, 513, 11, 3, 10, 2], [794, 562, 12, 5, 10, 0], [794, 623, 9, 4, 10, 10], [794, 665, 13, 4, 10, 1], [794, 725, 9, 4, 10, 10], [794, 767, 12, 4, 10, 1], [855, 2, 12, 4, 10, 1], [855, 53, 12, 4, 10, 1], [855, 104, 12, 4, 10, 1], [855, 155, 12, 4, 10, 1], [855, 206, 12, 4, 10, 1], [855, 257, 12, 4, 10, 1], [855, 308, 12, 4, 10, 1], [855, 359, 12, 4, 10, 1], [855, 410, 12, 4, 10, 1], [855, 461, 12, 4, 10, 1], [855, 512, 12, 4, 10, 1], [855, 563, 12, 4, 10, 1], [855, 614, 12, 4, 10, 1], [855, 665, 12, 4, 10, 1], [855, 716, 12, 4, 10, 1], [855, 767, 12, 4, 10, 1]], \"capHeight\": 11, \"widestlogicalchar\": 18, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 8, 10, 2], [1, 105, 12, 3, 10, 2], [1, 156, 14, 7, 12, 2], [1, 206, 12, 10, 11, 1], [1, 258, 13, 8, 13, 2], [1, 309, 13, 8, 12, 2], [1, 360, 9, 3, 7, 2], [1, 410, 11, 10, 8, 1], [1, 461, 9, 10, 8, 1], [1, 514, 12, 5, 10, 3], [1, 566, 11, 5, 10, 4], [1, 621, 8, 4, 8, 8], [1, 670, 10, 1, 10, 6], [1, 723, 8, 2, 8, 8], [1, 767, 12, 9, 10, 1], [62, 3, 12, 8, 11, 2], [62, 54, 12, 8, 11, 2], [62, 105, 12, 8, 11, 2], [62, 156, 13, 8, 11, 2], [62, 207, 12, 8, 11, 2], [62, 258, 13, 8, 11, 2], [62, 309, 11, 8, 11, 2], [62, 360, 13, 8, 11, 2], [62, 411, 12, 8, 11, 2], [62, 462, 12, 8, 11, 2], [62, 515, 9, 6, 8, 4], [62, 566, 9, 8, 8, 4], [62, 615, 10, 7, 9, 2], [62, 669, 12, 3, 11, 5], [62, 717, 11, 7, 9, 2], [62, 768, 12, 8, 11, 2], [123, 3, 15, 8, 13, 2], [123, 54, 12, 8, 11, 2], [123, 105, 12, 8, 11, 2], [123, 156, 12, 8, 11, 2], [123, 207, 12, 8, 11, 2], [123, 258, 12, 8, 10, 2], [123, 309, 12, 8, 10, 2], [123, 360, 12, 8, 11, 2], [123, 411, 13, 8, 11, 2], [123, 462, 11, 8, 10, 2], [123, 513, 12, 8, 10, 2], [123, 564, 13, 8, 12, 2], [123, 615, 10, 8, 10, 2], [123, 666, 16, 8, 14, 2], [123, 717, 14, 8, 12, 2], [123, 768, 12, 8, 11, 2], [184, 3, 12, 8, 11, 2], [184, 54, 12, 9, 11, 2], [184, 105, 12, 8, 11, 2], [184, 156, 11, 8, 10, 2], [184, 207, 13, 8, 10, 2], [184, 258, 13, 8, 11, 2], [184, 309, 13, 8, 11, 2], [184, 360, 16, 8, 14, 2], [184, 411, 13, 8, 11, 2], [184, 462, 14, 8, 12, 2], [184, 513, 13, 8, 11, 2], [184, 563, 11, 10, 9, 1], [184, 614, 9, 9, 10, 1], [184, 665, 11, 10, 9, 1], [184, 718, 11, 2, 11, 3], [184, 776, 11, 1, 11, 10], [245, 2, 10, 2, 9, 1], [245, 56, 11, 6, 11, 4], [245, 105, 11, 8, 11, 2], [245, 158, 10, 6, 10, 4], [245, 207, 13, 8, 11, 2], [245, 260, 11, 6, 11, 4], [245, 309, 13, 8, 10, 2], [245, 362, 12, 8, 11, 4], [245, 411, 11, 8, 11, 2], [245, 462, 10, 8, 8, 2], [245, 513, 11, 10, 9, 2], [245, 564, 12, 8, 11, 2], [245, 615, 10, 8, 8, 2], [245, 668, 14, 6, 14, 4], [245, 719, 11, 6, 11, 4], [245, 770, 11, 6, 11, 4], [306, 5, 11, 8, 11, 4], [306, 56, 12, 8, 11, 4], [306, 107, 11, 6, 9, 4], [306, 158, 10, 6, 10, 4], [306, 207, 11, 8, 10, 2], [306, 260, 12, 6, 11, 4], [306, 311, 12, 6, 11, 4], [306, 362, 15, 6, 14, 4], [306, 413, 12, 6, 11, 4], [306, 464, 12, 8, 11, 4], [306, 515, 12, 6, 11, 4], [306, 563, 11, 10, 9, 1], [306, 615, 10, 9, 8, 2], [306, 665, 10, 10, 9, 1], [306, 719, 12, 2, 11, 4], [306, 768, 11, 8, 9, 2], [367, 1, 12, 10, 11, 0], [367, 52, 12, 10, 11, 0], [367, 105, 12, 10, 11, 2], [367, 154, 11, 10, 10, 0], [367, 205, 13, 10, 12, 0], [367, 256, 12, 10, 11, 0], [367, 307, 13, 10, 11, 0], [367, 359, 11, 9, 11, 1], [367, 410, 11, 9, 11, 1], [367, 461, 11, 9, 11, 1], [367, 513, 12, 8, 11, 2], [367, 563, 13, 9, 11, 1], [367, 613, 12, 10, 11, 0], [367, 668, 10, 8, 10, 4], [367, 716, 11, 9, 11, 1], [367, 767, 11, 9, 11, 1], [428, 2, 11, 9, 11, 1], [428, 54, 12, 8, 11, 2], [428, 104, 9, 9, 8, 1], [428, 155, 9, 9, 8, 1], [428, 206, 9, 9, 8, 1], [428, 258, 10, 8, 8, 2], [428, 308, 13, 9, 11, 1], [428, 359, 11, 9, 11, 1], [428, 410, 11, 9, 11, 1], [428, 461, 11, 9, 11, 1], [428, 513, 12, 8, 11, 2], [428, 563, 13, 9, 11, 1], [428, 614, 12, 9, 11, 1], [428, 665, 12, 9, 11, 1], [428, 716, 12, 9, 11, 1], [428, 768, 12, 8, 11, 2], [489, 3, 10, 5, 9, 2], [489, 54, 10, 3, 9, 2], [489, 104, 12, 8, 10, 1], [489, 156, 12, 8, 12, 2], [489, 207, 11, 10, 10, 2], [489, 260, 10, 4, 10, 4], [489, 309, 14, 8, 11, 2], [489, 360, 12, 8, 11, 2], [489, 411, 13, 8, 12, 2], [489, 462, 13, 8, 12, 2], [489, 513, 15, 3, 13, 2], [489, 563, 10, 2, 9, 1], [489, 615, 11, 1, 9, 2], [489, 668, 13, 5, 12, 4], [489, 717, 15, 8, 13, 2], [489, 768, 12, 8, 11, 2], [550, 5, 16, 4, 16, 4], [550, 55, 12, 7, 11, 3], [550, 107, 10, 6, 10, 4], [550, 159, 10, 5, 10, 5], [550, 207, 14, 8, 12, 2], [550, 260, 13, 8, 12, 4], [550, 309, 11, 8, 10, 2], [550, 360, 14, 9, 12, 2], [550, 411, 16, 8, 14, 2], [550, 463, 16, 7, 14, 3], [550, 513, 12, 10, 10, 2], [550, 564, 11, 7, 10, 2], [550, 615, 11, 7, 10, 2], [550, 666, 13, 8, 12, 2], [550, 719, 14, 6, 14, 4], [550, 770, 12, 6, 11, 4], [611, 3, 12, 8, 11, 2], [611, 54, 10, 8, 9, 2], [611, 110, 10, 3, 10, 7], [611, 155, 16, 9, 14, 1], [611, 207, 12, 10, 10, 2], [611, 260, 12, 5, 11, 4], [611, 309, 13, 8, 13, 2], [611, 363, 13, 4, 12, 5], [611, 414, 12, 5, 12, 5], [611, 468, 15, 2, 16, 8], [611, 511, 1, 1, 11, 1], [611, 562, 12, 10, 11, 0], [611, 613, 13, 10, 11, 0], [611, 664, 13, 10, 11, 0], [611, 717, 15, 8, 13, 2], [611, 770, 15, 6, 14, 4], [672, 7, 9, 1, 9, 6], [672, 58, 12, 1, 12, 6], [672, 105, 13, 4, 11, 2], [672, 156, 13, 4, 11, 2], [672, 207, 10, 4, 8, 2], [672, 258, 10, 4, 8, 2], [672, 311, 11, 5, 10, 4], [672, 363, 11, 5, 11, 5], [672, 411, 12, 10, 11, 2], [1, 1, 1, 1, 7, 1], [794, 767, 11, 2, 9, 1], [672, 565, 12, 5, 11, 3], [672, 618, 10, 4, 9, 5], [672, 669, 9, 5, 9, 5], [672, 717, 14, 8, 12, 2], [672, 768, 14, 8, 12, 2], [733, 3, 10, 5, 9, 2], [733, 57, 9, 2, 8, 5], [733, 111, 8, 4, 8, 8], [733, 162, 11, 4, 11, 8], [733, 207, 16, 8, 17, 2], [733, 256, 12, 10, 11, 0], [733, 307, 11, 10, 10, 0], [733, 358, 12, 10, 11, 0], [733, 409, 12, 10, 10, 0], [733, 460, 11, 10, 10, 0], [733, 511, 10, 10, 10, 0], [733, 562, 11, 10, 10, 0], [733, 613, 11, 10, 10, 0], [733, 664, 11, 10, 10, 0], [733, 715, 12, 10, 11, 0], [733, 766, 12, 10, 11, 0], [1, 1, 1, 1, 7, 1], [794, 52, 12, 10, 11, 0], [794, 103, 12, 10, 11, 0], [794, 154, 12, 10, 11, 0], [794, 205, 12, 10, 11, 0], [794, 260, 9, 6, 8, 4], [794, 308, 10, 2, 9, 1], [794, 359, 13, 2, 11, 1], [794, 411, 11, 1, 9, 2], [794, 461, 11, 2, 9, 1], [794, 513, 10, 1, 9, 2], [794, 562, 11, 3, 9, 0], [794, 623, 8, 2, 9, 10], [794, 665, 12, 2, 9, 1], [794, 725, 8, 2, 9, 10], [794, 767, 11, 2, 9, 1], [855, 2, 11, 2, 9, 1], [855, 53, 11, 2, 9, 1], [855, 104, 11, 2, 9, 1], [855, 155, 11, 2, 9, 1], [855, 206, 11, 2, 9, 1], [855, 257, 11, 2, 9, 1], [855, 308, 11, 2, 9, 1], [855, 359, 11, 2, 9, 1], [855, 410, 11, 2, 9, 1], [855, 461, 11, 2, 9, 1], [855, 512, 11, 2, 9, 1], [855, 563, 11, 2, 9, 1], [855, 614, 11, 2, 9, 1], [855, 665, 11, 2, 9, 1], [855, 716, 11, 2, 9, 1], [855, 767, 11, 2, 9, 1]], \"capHeight\": 10, \"widestlogicalchar\": 17, \"widestglyph\": 16, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 54, 11, 10, 11, 2], [1, 105, 11, 9, 11, 2], [1, 156, 13, 9, 13, 2], [1, 206, 12, 12, 12, 1], [1, 258, 14, 10, 14, 2], [1, 309, 13, 10, 13, 2], [1, 360, 8, 9, 8, 2], [1, 410, 9, 12, 9, 1], [1, 461, 9, 12, 9, 1], [1, 514, 11, 8, 11, 3], [1, 566, 11, 7, 11, 4], [1, 618, 9, 9, 9, 5], [1, 669, 11, 6, 11, 5], [1, 720, 9, 7, 9, 5], [1, 767, 11, 11, 11, 1], [62, 3, 12, 10, 12, 2], [62, 54, 12, 10, 12, 2], [62, 105, 12, 10, 12, 2], [62, 156, 12, 10, 12, 2], [62, 207, 12, 10, 12, 2], [62, 258, 12, 10, 12, 2], [62, 309, 12, 10, 12, 2], [62, 360, 12, 10, 12, 2], [62, 411, 12, 10, 12, 2], [62, 462, 12, 10, 12, 2], [62, 515, 9, 8, 9, 4], [62, 566, 9, 10, 9, 4], [62, 615, 10, 9, 10, 2], [62, 669, 12, 6, 12, 5], [62, 717, 10, 9, 10, 2], [62, 768, 12, 10, 12, 2], [123, 3, 14, 10, 14, 2], [123, 54, 12, 10, 12, 2], [123, 105, 12, 10, 12, 2], [123, 156, 12, 10, 12, 2], [123, 207, 12, 10, 12, 2], [123, 258, 11, 10, 11, 2], [123, 309, 11, 10, 11, 2], [123, 360, 12, 10, 12, 2], [123, 411, 12, 10, 12, 2], [123, 462, 11, 10, 11, 2], [123, 513, 11, 10, 11, 2], [123, 564, 13, 10, 13, 2], [123, 615, 11, 10, 11, 2], [123, 666, 15, 10, 15, 2], [123, 717, 13, 10, 13, 2], [123, 768, 12, 10, 12, 2], [184, 3, 12, 10, 12, 2], [184, 54, 12, 11, 12, 2], [184, 105, 12, 10, 12, 2], [184, 156, 11, 10, 11, 2], [184, 207, 11, 10, 11, 2], [184, 258, 12, 10, 12, 2], [184, 309, 12, 10, 12, 2], [184, 360, 15, 10, 15, 2], [184, 411, 12, 10, 12, 2], [184, 462, 13, 10, 13, 2], [184, 513, 12, 10, 12, 2], [184, 563, 10, 12, 10, 1], [184, 614, 11, 11, 11, 1], [184, 665, 10, 12, 10, 1], [184, 717, 12, 9, 12, 2], [184, 771, 12, 8, 12, 5], [245, 2, 10, 10, 10, 1], [245, 56, 12, 8, 12, 4], [245, 105, 12, 10, 12, 2], [245, 158, 11, 8, 11, 4], [245, 207, 12, 10, 12, 2], [245, 260, 12, 8, 12, 4], [245, 309, 11, 10, 11, 2], [245, 362, 12, 10, 12, 4], [245, 411, 12, 10, 12, 2], [245, 462, 9, 10, 9, 2], [245, 513, 10, 12, 10, 2], [245, 564, 12, 10, 12, 2], [245, 615, 9, 10, 9, 2], [245, 668, 15, 8, 15, 4], [245, 719, 12, 8, 12, 4], [245, 770, 12, 8, 12, 4], [306, 5, 12, 10, 12, 4], [306, 56, 12, 10, 12, 4], [306, 107, 10, 8, 10, 4], [306, 158, 11, 8, 11, 4], [306, 207, 11, 10, 11, 2], [306, 260, 12, 8, 12, 4], [306, 311, 12, 8, 12, 4], [306, 362, 15, 8, 15, 4], [306, 413, 12, 8, 12, 4], [306, 464, 12, 10, 12, 4], [306, 515, 12, 8, 12, 4], [306, 563, 10, 12, 10, 1], [306, 615, 9, 11, 9, 2], [306, 665, 10, 12, 10, 1], [306, 719, 12, 7, 12, 4], [306, 768, 10, 10, 10, 2], [367, 1, 12, 12, 12, 0], [367, 52, 12, 12, 12, 0], [367, 105, 12, 12, 12, 2], [367, 154, 11, 12, 11, 0], [367, 205, 13, 12, 13, 0], [367, 256, 12, 12, 12, 0], [367, 307, 12, 12, 12, 0], [367, 359, 12, 11, 12, 1], [367, 410, 12, 11, 12, 1], [367, 461, 12, 11, 12, 1], [367, 513, 12, 10, 12, 2], [367, 563, 12, 11, 12, 1], [367, 613, 12, 12, 12, 0], [367, 668, 11, 10, 11, 4], [367, 716, 12, 11, 12, 1], [367, 767, 12, 11, 12, 1], [428, 2, 12, 11, 12, 1], [428, 54, 12, 10, 12, 2], [428, 104, 9, 11, 9, 1], [428, 155, 9, 11, 9, 1], [428, 206, 9, 11, 9, 1], [428, 258, 9, 10, 9, 2], [428, 308, 12, 11, 12, 1], [428, 359, 12, 11, 12, 1], [428, 410, 12, 11, 12, 1], [428, 461, 12, 11, 12, 1], [428, 513, 12, 10, 12, 2], [428, 563, 12, 11, 12, 1], [428, 614, 12, 11, 12, 1], [428, 665, 12, 11, 12, 1], [428, 716, 12, 11, 12, 1], [428, 768, 12, 10, 12, 2], [489, 3, 10, 9, 10, 2], [489, 54, 10, 9, 10, 2], [489, 104, 11, 10, 11, 1], [489, 156, 13, 10, 13, 2], [489, 207, 11, 12, 11, 2], [489, 260, 11, 7, 11, 4], [489, 309, 12, 10, 12, 2], [489, 360, 12, 10, 12, 2], [489, 411, 13, 10, 13, 2], [489, 462, 13, 10, 13, 2], [489, 513, 14, 9, 14, 2], [489, 563, 10, 10, 10, 1], [489, 615, 10, 9, 10, 2], [489, 668, 13, 7, 13, 4], [489, 717, 14, 10, 14, 2], [489, 768, 12, 10, 12, 2], [550, 5, 17, 7, 17, 4], [550, 55, 12, 9, 12, 3], [550, 107, 11, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 207, 13, 10, 13, 2], [550, 260, 13, 10, 13, 4], [550, 309, 11, 10, 11, 2], [550, 360, 13, 11, 13, 2], [550, 411, 15, 10, 15, 2], [550, 463, 15, 9, 15, 3], [550, 513, 11, 12, 11, 2], [550, 564, 11, 9, 11, 2], [550, 615, 11, 9, 11, 2], [550, 666, 13, 10, 13, 2], [550, 719, 15, 8, 15, 4], [550, 770, 12, 8, 12, 4], [611, 3, 12, 10, 12, 2], [611, 54, 10, 10, 10, 2], [611, 108, 11, 7, 11, 5], [611, 155, 15, 11, 15, 1], [611, 207, 11, 12, 11, 2], [611, 260, 12, 7, 12, 4], [611, 309, 14, 10, 14, 2], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 465, 17, 7, 17, 5], [611, 516, 12, 6, 12, 5], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 12, 12, 12, 0], [611, 717, 14, 10, 14, 2], [611, 770, 15, 8, 15, 4], [672, 6, 10, 6, 10, 5], [672, 57, 13, 6, 13, 5], [672, 105, 12, 9, 12, 2], [672, 156, 12, 9, 12, 2], [672, 207, 9, 9, 9, 2], [672, 258, 9, 9, 9, 2], [672, 311, 11, 7, 11, 4], [672, 363, 12, 7, 12, 5], [672, 411, 12, 12, 12, 2], [1, 6, 8, 6, 8, 5], [794, 767, 10, 10, 10, 1], [672, 565, 12, 8, 12, 3], [672, 618, 10, 7, 10, 5], [672, 669, 10, 7, 10, 5], [672, 717, 13, 10, 13, 2], [672, 768, 13, 10, 13, 2], [733, 3, 10, 9, 10, 2], [733, 57, 9, 6, 9, 5], [733, 108, 9, 9, 9, 5], [733, 159, 12, 9, 12, 5], [733, 207, 18, 10, 18, 2], [733, 256, 12, 12, 12, 0], [733, 307, 11, 12, 11, 0], [733, 358, 12, 12, 12, 0], [733, 409, 11, 12, 11, 0], [733, 460, 11, 12, 11, 0], [733, 511, 11, 12, 11, 0], [733, 562, 11, 12, 11, 0], [733, 613, 11, 12, 11, 0], [733, 664, 11, 12, 11, 0], [733, 715, 12, 12, 12, 0], [733, 766, 12, 12, 12, 0], [1, 6, 8, 6, 8, 5], [794, 52, 12, 12, 12, 0], [794, 103, 12, 12, 12, 0], [794, 154, 12, 12, 12, 0], [794, 205, 12, 12, 12, 0], [794, 260, 9, 8, 9, 4], [794, 308, 10, 10, 10, 1], [794, 359, 12, 10, 12, 1], [794, 411, 10, 9, 10, 2], [794, 461, 10, 10, 10, 1], [794, 513, 10, 9, 10, 2], [794, 562, 10, 11, 10, 0], [794, 618, 10, 9, 10, 5], [794, 665, 10, 10, 10, 1], [794, 720, 10, 9, 10, 5], [794, 767, 10, 10, 10, 1], [855, 2, 10, 10, 10, 1], [855, 53, 10, 10, 10, 1], [855, 104, 10, 10, 10, 1], [855, 155, 10, 10, 10, 1], [855, 206, 10, 10, 10, 1], [855, 257, 10, 10, 10, 1], [855, 308, 10, 10, 10, 1], [855, 359, 10, 10, 10, 1], [855, 410, 10, 10, 10, 1], [855, 461, 10, 10, 10, 1], [855, 512, 10, 10, 10, 1], [855, 563, 10, 10, 10, 1], [855, 614, 10, 10, 10, 1], [855, 665, 10, 10, 10, 1], [855, 716, 10, 10, 10, 1], [855, 767, 10, 10, 10, 1]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 10, 8, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 12, 8, 12, 2], [1, 206, 11, 10, 11, 1], [1, 258, 13, 8, 13, 2], [1, 309, 12, 8, 12, 2], [1, 360, 7, 8, 7, 2], [1, 410, 8, 10, 8, 1], [1, 461, 8, 10, 8, 1], [1, 514, 10, 7, 10, 3], [1, 566, 10, 6, 10, 4], [1, 617, 8, 8, 8, 4], [1, 668, 10, 6, 10, 4], [1, 719, 8, 6, 8, 4], [1, 767, 10, 9, 10, 1], [62, 3, 11, 8, 11, 2], [62, 54, 11, 8, 11, 2], [62, 105, 11, 8, 11, 2], [62, 156, 11, 8, 11, 2], [62, 207, 11, 8, 11, 2], [62, 258, 11, 8, 11, 2], [62, 309, 11, 8, 11, 2], [62, 360, 11, 8, 11, 2], [62, 411, 11, 8, 11, 2], [62, 462, 11, 8, 11, 2], [62, 515, 8, 6, 8, 4], [62, 566, 8, 8, 8, 4], [62, 615, 9, 8, 9, 2], [62, 668, 11, 6, 11, 4], [62, 717, 9, 8, 9, 2], [62, 768, 11, 8, 11, 2], [123, 3, 13, 8, 13, 2], [123, 54, 11, 8, 11, 2], [123, 105, 11, 8, 11, 2], [123, 156, 11, 8, 11, 2], [123, 207, 11, 8, 11, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 11, 8, 11, 2], [123, 411, 11, 8, 11, 2], [123, 462, 10, 8, 10, 2], [123, 513, 10, 8, 10, 2], [123, 564, 12, 8, 12, 2], [123, 615, 10, 8, 10, 2], [123, 666, 14, 8, 14, 2], [123, 717, 12, 8, 12, 2], [123, 768, 11, 8, 11, 2], [184, 3, 11, 8, 11, 2], [184, 54, 11, 9, 11, 2], [184, 105, 11, 8, 11, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 11, 8, 11, 2], [184, 309, 11, 8, 11, 2], [184, 360, 14, 8, 14, 2], [184, 411, 11, 8, 11, 2], [184, 462, 12, 8, 12, 2], [184, 513, 11, 8, 11, 2], [184, 563, 9, 10, 9, 1], [184, 614, 10, 9, 10, 1], [184, 665, 9, 10, 9, 1], [184, 717, 11, 8, 11, 2], [184, 770, 11, 7, 11, 4], [245, 2, 9, 9, 9, 1], [245, 56, 11, 6, 11, 4], [245, 105, 11, 8, 11, 2], [245, 158, 10, 6, 10, 4], [245, 207, 11, 8, 11, 2], [245, 260, 11, 6, 11, 4], [245, 309, 10, 8, 10, 2], [245, 362, 11, 8, 11, 4], [245, 411, 11, 8, 11, 2], [245, 462, 8, 8, 8, 2], [245, 513, 9, 10, 9, 2], [245, 564, 11, 8, 11, 2], [245, 615, 8, 8, 8, 2], [245, 668, 14, 6, 14, 4], [245, 719, 11, 6, 11, 4], [245, 770, 11, 6, 11, 4], [306, 5, 11, 8, 11, 4], [306, 56, 11, 8, 11, 4], [306, 107, 9, 6, 9, 4], [306, 158, 10, 6, 10, 4], [306, 207, 10, 8, 10, 2], [306, 260, 11, 6, 11, 4], [306, 311, 11, 6, 11, 4], [306, 362, 14, 6, 14, 4], [306, 413, 11, 6, 11, 4], [306, 464, 11, 8, 11, 4], [306, 515, 11, 6, 11, 4], [306, 563, 9, 10, 9, 1], [306, 615, 8, 9, 8, 2], [306, 665, 9, 10, 9, 1], [306, 719, 11, 6, 11, 4], [306, 768, 9, 8, 9, 2], [367, 1, 11, 10, 11, 0], [367, 52, 11, 10, 11, 0], [367, 105, 11, 10, 11, 2], [367, 154, 10, 10, 10, 0], [367, 205, 12, 10, 12, 0], [367, 256, 11, 10, 11, 0], [367, 307, 11, 10, 11, 0], [367, 359, 11, 9, 11, 1], [367, 410, 11, 9, 11, 1], [367, 461, 11, 9, 11, 1], [367, 513, 11, 8, 11, 2], [367, 563, 11, 9, 11, 1], [367, 613, 11, 10, 11, 0], [367, 668, 10, 8, 10, 4], [367, 716, 11, 9, 11, 1], [367, 767, 11, 9, 11, 1], [428, 2, 11, 9, 11, 1], [428, 54, 11, 8, 11, 2], [428, 104, 8, 9, 8, 1], [428, 155, 8, 9, 8, 1], [428, 206, 8, 9, 8, 1], [428, 258, 8, 8, 8, 2], [428, 308, 11, 9, 11, 1], [428, 359, 11, 9, 11, 1], [428, 410, 11, 9, 11, 1], [428, 461, 11, 9, 11, 1], [428, 513, 11, 8, 11, 2], [428, 563, 11, 9, 11, 1], [428, 614, 11, 9, 11, 1], [428, 665, 11, 9, 11, 1], [428, 716, 11, 9, 11, 1], [428, 768, 11, 8, 11, 2], [489, 3, 9, 8, 9, 2], [489, 54, 9, 8, 9, 2], [489, 104, 10, 9, 10, 1], [489, 156, 12, 8, 12, 2], [489, 207, 10, 10, 10, 2], [489, 260, 10, 6, 10, 4], [489, 309, 11, 8, 11, 2], [489, 360, 11, 8, 11, 2], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 513, 13, 8, 13, 2], [489, 563, 9, 9, 9, 1], [489, 615, 9, 8, 9, 2], [489, 668, 12, 6, 12, 4], [489, 717, 13, 8, 13, 2], [489, 768, 11, 8, 11, 2], [550, 5, 16, 6, 16, 4], [550, 55, 11, 7, 11, 3], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 207, 12, 8, 12, 2], [550, 260, 12, 8, 12, 4], [550, 309, 10, 8, 10, 2], [550, 360, 12, 9, 12, 2], [550, 411, 14, 8, 14, 2], [550, 463, 14, 7, 14, 3], [550, 513, 10, 10, 10, 2], [550, 564, 10, 8, 10, 2], [550, 615, 10, 8, 10, 2], [550, 666, 12, 8, 12, 2], [550, 719, 14, 6, 14, 4], [550, 770, 11, 6, 11, 4], [611, 3, 11, 8, 11, 2], [611, 54, 9, 8, 9, 2], [611, 107, 10, 6, 10, 4], [611, 155, 14, 9, 14, 1], [611, 207, 10, 10, 10, 2], [611, 260, 11, 6, 11, 4], [611, 309, 13, 8, 13, 2], [611, 362, 12, 6, 12, 4], [611, 413, 12, 6, 12, 4], [611, 464, 16, 6, 16, 4], [611, 515, 11, 6, 11, 4], [611, 562, 11, 10, 11, 0], [611, 613, 11, 10, 11, 0], [611, 664, 11, 10, 11, 0], [611, 717, 13, 8, 13, 2], [611, 770, 14, 6, 14, 4], [672, 5, 9, 6, 9, 4], [672, 56, 12, 6, 12, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 8, 8, 8, 2], [672, 258, 8, 8, 8, 2], [672, 311, 10, 6, 10, 4], [672, 362, 11, 6, 11, 4], [672, 411, 11, 10, 11, 2], [1, 5, 7, 6, 7, 4], [794, 767, 9, 9, 9, 1], [672, 565, 11, 7, 11, 3], [672, 617, 9, 6, 9, 4], [672, 668, 9, 6, 9, 4], [672, 717, 12, 8, 12, 2], [672, 768, 12, 8, 12, 2], [733, 3, 9, 8, 9, 2], [733, 56, 8, 6, 8, 4], [733, 107, 8, 8, 8, 4], [733, 158, 11, 8, 11, 4], [733, 207, 17, 8, 17, 2], [733, 256, 11, 10, 11, 0], [733, 307, 10, 10, 10, 0], [733, 358, 11, 10, 11, 0], [733, 409, 10, 10, 10, 0], [733, 460, 10, 10, 10, 0], [733, 511, 10, 10, 10, 0], [733, 562, 10, 10, 10, 0], [733, 613, 10, 10, 10, 0], [733, 664, 10, 10, 10, 0], [733, 715, 11, 10, 11, 0], [733, 766, 11, 10, 11, 0], [1, 5, 7, 6, 7, 4], [794, 52, 11, 10, 11, 0], [794, 103, 11, 10, 11, 0], [794, 154, 11, 10, 11, 0], [794, 205, 11, 10, 11, 0], [794, 260, 8, 6, 8, 4], [794, 308, 9, 9, 9, 1], [794, 359, 11, 9, 11, 1], [794, 411, 9, 8, 9, 2], [794, 461, 9, 9, 9, 1], [794, 513, 9, 8, 9, 2], [794, 562, 9, 10, 9, 0], [794, 617, 9, 8, 9, 4], [794, 665, 9, 9, 9, 1], [794, 719, 9, 8, 9, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 10, 10, 2], [1, 105, 12, 5, 10, 2], [1, 156, 14, 9, 12, 2], [1, 206, 12, 12, 11, 1], [1, 258, 13, 10, 13, 2], [1, 309, 13, 10, 12, 2], [1, 360, 9, 5, 7, 2], [1, 410, 11, 12, 8, 1], [1, 461, 9, 12, 8, 1], [1, 514, 12, 7, 10, 3], [1, 566, 11, 7, 10, 4], [1, 621, 8, 6, 8, 8], [1, 670, 10, 3, 10, 6], [1, 723, 8, 4, 8, 8], [1, 767, 12, 11, 10, 1], [62, 3, 12, 10, 11, 2], [62, 54, 12, 10, 11, 2], [62, 105, 12, 10, 11, 2], [62, 156, 13, 10, 11, 2], [62, 207, 12, 10, 11, 2], [62, 258, 13, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 13, 10, 11, 2], [62, 411, 12, 10, 11, 2], [62, 462, 12, 10, 11, 2], [62, 515, 9, 8, 8, 4], [62, 566, 9, 10, 8, 4], [62, 615, 10, 9, 9, 2], [62, 669, 12, 5, 11, 5], [62, 717, 11, 9, 9, 2], [62, 768, 12, 10, 11, 2], [123, 3, 15, 10, 13, 2], [123, 54, 12, 10, 11, 2], [123, 105, 12, 10, 11, 2], [123, 156, 12, 10, 11, 2], [123, 207, 12, 10, 11, 2], [123, 258, 12, 10, 10, 2], [123, 309, 12, 10, 10, 2], [123, 360, 12, 10, 11, 2], [123, 411, 13, 10, 11, 2], [123, 462, 11, 10, 10, 2], [123, 513, 12, 10, 10, 2], [123, 564, 13, 10, 12, 2], [123, 615, 10, 10, 10, 2], [123, 666, 16, 10, 14, 2], [123, 717, 14, 10, 12, 2], [123, 768, 12, 10, 11, 2], [184, 3, 12, 10, 11, 2], [184, 54, 12, 11, 11, 2], [184, 105, 12, 10, 11, 2], [184, 156, 11, 10, 10, 2], [184, 207, 13, 10, 10, 2], [184, 258, 13, 10, 11, 2], [184, 309, 13, 10, 11, 2], [184, 360, 16, 10, 14, 2], [184, 411, 13, 10, 11, 2], [184, 462, 14, 10, 12, 2], [184, 513, 13, 10, 11, 2], [184, 563, 11, 12, 9, 1], [184, 614, 9, 11, 10, 1], [184, 665, 11, 12, 9, 1], [184, 718, 11, 4, 11, 3], [184, 776, 11, 3, 11, 10], [245, 2, 10, 4, 9, 1], [245, 56, 11, 8, 11, 4], [245, 105, 11, 10, 11, 2], [245, 158, 10, 8, 10, 4], [245, 207, 13, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 13, 10, 10, 2], [245, 362, 12, 10, 11, 4], [245, 411, 11, 10, 11, 2], [245, 462, 10, 10, 8, 2], [245, 513, 11, 12, 9, 2], [245, 564, 12, 10, 11, 2], [245, 615, 10, 10, 8, 2], [245, 668, 14, 8, 14, 4], [245, 719, 11, 8, 11, 4], [245, 770, 11, 8, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 12, 10, 11, 4], [306, 107, 11, 8, 9, 4], [306, 158, 10, 8, 10, 4], [306, 207, 11, 10, 10, 2], [306, 260, 12, 8, 11, 4], [306, 311, 12, 8, 11, 4], [306, 362, 15, 8, 14, 4], [306, 413, 12, 8, 11, 4], [306, 464, 12, 10, 11, 4], [306, 515, 12, 8, 11, 4], [306, 563, 11, 12, 9, 1], [306, 615, 10, 11, 8, 2], [306, 665, 10, 12, 9, 1], [306, 719, 12, 4, 11, 4], [306, 768, 11, 10, 9, 2], [367, 1, 12, 12, 11, 0], [367, 52, 12, 12, 11, 0], [367, 105, 12, 12, 11, 2], [367, 154, 11, 12, 10, 0], [367, 205, 13, 12, 12, 0], [367, 256, 12, 12, 11, 0], [367, 307, 13, 12, 11, 0], [367, 359, 11, 11, 11, 1], [367, 410, 11, 11, 11, 1], [367, 461, 11, 11, 11, 1], [367, 513, 12, 10, 11, 2], [367, 563, 13, 11, 11, 1], [367, 613, 12, 12, 11, 0], [367, 668, 10, 10, 10, 4], [367, 716, 11, 11, 11, 1], [367, 767, 11, 11, 11, 1], [428, 2, 11, 11, 11, 1], [428, 54, 12, 10, 11, 2], [428, 104, 9, 11, 8, 1], [428, 155, 9, 11, 8, 1], [428, 206, 9, 11, 8, 1], [428, 258, 10, 10, 8, 2], [428, 308, 13, 11, 11, 1], [428, 359, 11, 11, 11, 1], [428, 410, 11, 11, 11, 1], [428, 461, 11, 11, 11, 1], [428, 513, 12, 10, 11, 2], [428, 563, 13, 11, 11, 1], [428, 614, 12, 11, 11, 1], [428, 665, 12, 11, 11, 1], [428, 716, 12, 11, 11, 1], [428, 768, 12, 10, 11, 2], [489, 3, 10, 7, 9, 2], [489, 54, 10, 5, 9, 2], [489, 104, 12, 10, 10, 1], [489, 156, 12, 10, 12, 2], [489, 207, 11, 12, 10, 2], [489, 260, 10, 6, 10, 4], [489, 309, 14, 10, 11, 2], [489, 360, 12, 10, 11, 2], [489, 411, 13, 10, 12, 2], [489, 462, 13, 10, 12, 2], [489, 513, 15, 5, 13, 2], [489, 563, 10, 4, 9, 1], [489, 615, 11, 3, 9, 2], [489, 668, 13, 7, 12, 4], [489, 717, 15, 10, 13, 2], [489, 768, 12, 10, 11, 2], [550, 5, 16, 6, 16, 4], [550, 55, 12, 9, 11, 3], [550, 107, 10, 8, 10, 4], [550, 159, 10, 7, 10, 5], [550, 207, 14, 10, 12, 2], [550, 260, 13, 10, 12, 4], [550, 309, 11, 10, 10, 2], [550, 360, 14, 11, 12, 2], [550, 411, 16, 10, 14, 2], [550, 463, 16, 9, 14, 3], [550, 513, 12, 12, 10, 2], [550, 564, 11, 9, 10, 2], [550, 615, 11, 9, 10, 2], [550, 666, 13, 10, 12, 2], [550, 719, 14, 8, 14, 4], [550, 770, 12, 8, 11, 4], [611, 3, 12, 10, 11, 2], [611, 54, 10, 10, 9, 2], [611, 110, 10, 5, 10, 7], [611, 155, 16, 11, 14, 1], [611, 207, 12, 12, 10, 2], [611, 260, 12, 7, 11, 4], [611, 309, 13, 10, 13, 2], [611, 363, 13, 6, 12, 5], [611, 414, 12, 7, 12, 5], [611, 468, 15, 4, 16, 8], [611, 511, 1, 1, 11, 1], [611, 562, 12, 12, 11, 0], [611, 613, 13, 12, 11, 0], [611, 664, 13, 12, 11, 0], [611, 717, 15, 10, 13, 2], [611, 770, 15, 8, 14, 4], [672, 7, 9, 3, 9, 6], [672, 58, 12, 3, 12, 6], [672, 105, 13, 6, 11, 2], [672, 156, 13, 6, 11, 2], [672, 207, 10, 6, 8, 2], [672, 258, 10, 6, 8, 2], [672, 311, 11, 7, 10, 4], [672, 363, 11, 7, 11, 5], [672, 411, 12, 12, 11, 2], [1, 1, 1, 1, 7, 1], [794, 767, 11, 4, 9, 1], [672, 565, 12, 7, 11, 3], [672, 618, 10, 6, 9, 5], [672, 669, 9, 7, 9, 5], [672, 717, 14, 10, 12, 2], [672, 768, 14, 10, 12, 2], [733, 3, 10, 7, 9, 2], [733, 57, 9, 4, 8, 5], [733, 111, 8, 6, 8, 8], [733, 162, 11, 6, 11, 8], [733, 207, 16, 10, 17, 2], [733, 256, 12, 12, 11, 0], [733, 307, 11, 12, 10, 0], [733, 358, 12, 12, 11, 0], [733, 409, 12, 12, 10, 0], [733, 460, 11, 12, 10, 0], [733, 511, 10, 12, 10, 0], [733, 562, 11, 12, 10, 0], [733, 613, 11, 12, 10, 0], [733, 664, 11, 12, 10, 0], [733, 715, 12, 12, 11, 0], [733, 766, 12, 12, 11, 0], [1, 1, 1, 1, 7, 1], [794, 52, 12, 12, 11, 0], [794, 103, 12, 12, 11, 0], [794, 154, 12, 12, 11, 0], [794, 205, 12, 12, 11, 0], [794, 260, 9, 8, 8, 4], [794, 308, 10, 4, 9, 1], [794, 359, 13, 4, 11, 1], [794, 411, 11, 3, 9, 2], [794, 461, 11, 4, 9, 1], [794, 513, 10, 3, 9, 2], [794, 562, 11, 5, 9, 0], [794, 623, 8, 4, 9, 10], [794, 665, 12, 4, 9, 1], [794, 725, 8, 4, 9, 10], [794, 767, 11, 4, 9, 1], [855, 2, 11, 4, 9, 1], [855, 53, 11, 4, 9, 1], [855, 104, 11, 4, 9, 1], [855, 155, 11, 4, 9, 1], [855, 206, 11, 4, 9, 1], [855, 257, 11, 4, 9, 1], [855, 308, 11, 4, 9, 1], [855, 359, 11, 4, 9, 1], [855, 410, 11, 4, 9, 1], [855, 461, 11, 4, 9, 1], [855, 512, 11, 4, 9, 1], [855, 563, 11, 4, 9, 1], [855, 614, 11, 4, 9, 1], [855, 665, 11, 4, 9, 1], [855, 716, 11, 4, 9, 1], [855, 767, 11, 4, 9, 1]], \"capHeight\": 11, \"widestlogicalchar\": 17, \"widestglyph\": 16, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 10, 8, 9, 2], [1, 105, 11, 3, 9, 2], [1, 156, 13, 7, 11, 2], [1, 206, 11, 10, 10, 1], [1, 258, 12, 8, 12, 2], [1, 309, 12, 8, 11, 2], [1, 360, 8, 3, 6, 2], [1, 410, 10, 10, 7, 1], [1, 461, 8, 10, 7, 1], [1, 514, 11, 5, 9, 3], [1, 566, 10, 5, 9, 4], [1, 621, 7, 4, 7, 8], [1, 670, 9, 1, 9, 6], [1, 723, 7, 2, 7, 8], [1, 767, 11, 9, 9, 1], [62, 3, 11, 8, 10, 2], [62, 54, 11, 8, 10, 2], [62, 105, 11, 8, 10, 2], [62, 156, 12, 8, 10, 2], [62, 207, 11, 8, 10, 2], [62, 258, 12, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 12, 8, 10, 2], [62, 411, 11, 8, 10, 2], [62, 462, 11, 8, 10, 2], [62, 515, 8, 6, 7, 4], [62, 566, 8, 8, 7, 4], [62, 615, 9, 7, 8, 2], [62, 669, 11, 3, 10, 5], [62, 717, 10, 7, 8, 2], [62, 768, 11, 8, 10, 2], [123, 3, 14, 8, 12, 2], [123, 54, 11, 8, 10, 2], [123, 105, 11, 8, 10, 2], [123, 156, 11, 8, 10, 2], [123, 207, 11, 8, 10, 2], [123, 258, 11, 8, 9, 2], [123, 309, 11, 8, 9, 2], [123, 360, 11, 8, 10, 2], [123, 411, 12, 8, 10, 2], [123, 462, 10, 8, 9, 2], [123, 513, 11, 8, 9, 2], [123, 564, 12, 8, 11, 2], [123, 615, 9, 8, 9, 2], [123, 666, 15, 8, 13, 2], [123, 717, 13, 8, 11, 2], [123, 768, 11, 8, 10, 2], [184, 3, 11, 8, 10, 2], [184, 54, 11, 9, 10, 2], [184, 105, 11, 8, 10, 2], [184, 156, 10, 8, 9, 2], [184, 207, 12, 8, 9, 2], [184, 258, 12, 8, 10, 2], [184, 309, 12, 8, 10, 2], [184, 360, 15, 8, 13, 2], [184, 411, 12, 8, 10, 2], [184, 462, 13, 8, 11, 2], [184, 513, 12, 8, 10, 2], [184, 563, 10, 10, 8, 1], [184, 614, 8, 9, 9, 1], [184, 665, 10, 10, 8, 1], [184, 718, 10, 2, 10, 3], [184, 776, 10, 1, 10, 10], [245, 2, 9, 2, 8, 1], [245, 56, 10, 6, 10, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 12, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 12, 8, 9, 2], [245, 362, 11, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 9, 8, 7, 2], [245, 513, 10, 10, 8, 2], [245, 564, 11, 8, 10, 2], [245, 615, 9, 8, 7, 2], [245, 668, 13, 6, 13, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 11, 8, 10, 4], [306, 107, 10, 6, 8, 4], [306, 158, 9, 6, 9, 4], [306, 207, 10, 8, 9, 2], [306, 260, 11, 6, 10, 4], [306, 311, 11, 6, 10, 4], [306, 362, 14, 6, 13, 4], [306, 413, 11, 6, 10, 4], [306, 464, 11, 8, 10, 4], [306, 515, 11, 6, 10, 4], [306, 563, 10, 10, 8, 1], [306, 615, 9, 9, 7, 2], [306, 665, 9, 10, 8, 1], [306, 719, 11, 2, 10, 4], [306, 768, 10, 8, 8, 2], [367, 1, 11, 10, 10, 0], [367, 52, 11, 10, 10, 0], [367, 105, 11, 10, 10, 2], [367, 154, 10, 10, 9, 0], [367, 205, 12, 10, 11, 0], [367, 256, 11, 10, 10, 0], [367, 307, 12, 10, 10, 0], [367, 359, 10, 9, 10, 1], [367, 410, 10, 9, 10, 1], [367, 461, 10, 9, 10, 1], [367, 513, 11, 8, 10, 2], [367, 563, 12, 9, 10, 1], [367, 613, 11, 10, 10, 0], [367, 668, 9, 8, 9, 4], [367, 716, 10, 9, 10, 1], [367, 767, 10, 9, 10, 1], [428, 2, 10, 9, 10, 1], [428, 54, 11, 8, 10, 2], [428, 104, 8, 9, 7, 1], [428, 155, 8, 9, 7, 1], [428, 206, 8, 9, 7, 1], [428, 258, 9, 8, 7, 2], [428, 308, 12, 9, 10, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 11, 8, 10, 2], [428, 563, 12, 9, 10, 1], [428, 614, 11, 9, 10, 1], [428, 665, 11, 9, 10, 1], [428, 716, 11, 9, 10, 1], [428, 768, 11, 8, 10, 2], [489, 3, 9, 5, 8, 2], [489, 54, 9, 3, 8, 2], [489, 104, 11, 8, 9, 1], [489, 156, 11, 8, 11, 2], [489, 207, 10, 10, 9, 2], [489, 260, 9, 4, 9, 4], [489, 309, 13, 8, 10, 2], [489, 360, 11, 8, 10, 2], [489, 411, 12, 8, 11, 2], [489, 462, 12, 8, 11, 2], [489, 513, 14, 3, 12, 2], [489, 563, 9, 2, 8, 1], [489, 615, 10, 1, 8, 2], [489, 668, 12, 5, 11, 4], [489, 717, 14, 8, 12, 2], [489, 768, 11, 8, 10, 2], [550, 5, 15, 4, 15, 4], [550, 55, 11, 7, 10, 3], [550, 107, 9, 6, 9, 4], [550, 159, 9, 5, 9, 5], [550, 207, 13, 8, 11, 2], [550, 260, 12, 8, 11, 4], [550, 309, 10, 8, 9, 2], [550, 360, 13, 9, 11, 2], [550, 411, 15, 8, 13, 2], [550, 463, 15, 7, 13, 3], [550, 513, 11, 10, 9, 2], [550, 564, 10, 7, 9, 2], [550, 615, 10, 7, 9, 2], [550, 666, 12, 8, 11, 2], [550, 719, 13, 6, 13, 4], [550, 770, 11, 6, 10, 4], [611, 3, 11, 8, 10, 2], [611, 54, 9, 8, 8, 2], [611, 110, 9, 3, 9, 7], [611, 155, 15, 9, 13, 1], [611, 207, 11, 10, 9, 2], [611, 260, 11, 5, 10, 4], [611, 309, 12, 8, 12, 2], [611, 363, 12, 4, 11, 5], [611, 414, 11, 5, 11, 5], [611, 468, 14, 2, 15, 8], [611, 511, 1, 1, 10, 1], [611, 562, 11, 10, 10, 0], [611, 613, 12, 10, 10, 0], [611, 664, 12, 10, 10, 0], [611, 717, 14, 8, 12, 2], [611, 770, 14, 6, 13, 4], [672, 7, 8, 1, 8, 6], [672, 58, 11, 1, 11, 6], [672, 105, 12, 4, 10, 2], [672, 156, 12, 4, 10, 2], [672, 207, 9, 4, 7, 2], [672, 258, 9, 4, 7, 2], [672, 311, 10, 5, 9, 4], [672, 363, 10, 5, 10, 5], [672, 411, 11, 10, 10, 2], [1, 1, 1, 1, 6, 1], [794, 767, 10, 2, 8, 1], [672, 565, 11, 5, 10, 3], [672, 618, 9, 4, 8, 5], [672, 669, 8, 5, 8, 5], [672, 717, 13, 8, 11, 2], [672, 768, 13, 8, 11, 2], [733, 3, 9, 5, 8, 2], [733, 57, 8, 2, 7, 5], [733, 111, 7, 4, 7, 8], [733, 162, 10, 4, 10, 8], [733, 207, 15, 8, 16, 2], [733, 256, 11, 10, 10, 0], [733, 307, 10, 10, 9, 0], [733, 358, 11, 10, 10, 0], [733, 409, 11, 10, 9, 0], [733, 460, 10, 10, 9, 0], [733, 511, 9, 10, 9, 0], [733, 562, 10, 10, 9, 0], [733, 613, 10, 10, 9, 0], [733, 664, 10, 10, 9, 0], [733, 715, 11, 10, 10, 0], [733, 766, 11, 10, 10, 0], [1, 1, 1, 1, 6, 1], [794, 52, 11, 10, 10, 0], [794, 103, 11, 10, 10, 0], [794, 154, 11, 10, 10, 0], [794, 205, 11, 10, 10, 0], [794, 260, 8, 6, 7, 4], [794, 308, 9, 2, 8, 1], [794, 359, 12, 2, 10, 1], [794, 411, 10, 1, 8, 2], [794, 461, 10, 2, 8, 1], [794, 513, 9, 1, 8, 2], [794, 562, 10, 3, 8, 0], [794, 623, 7, 2, 8, 10], [794, 665, 11, 2, 8, 1], [794, 725, 7, 2, 8, 10], [794, 767, 10, 2, 8, 1], [855, 2, 10, 2, 8, 1], [855, 53, 10, 2, 8, 1], [855, 104, 10, 2, 8, 1], [855, 155, 10, 2, 8, 1], [855, 206, 10, 2, 8, 1], [855, 257, 10, 2, 8, 1], [855, 308, 10, 2, 8, 1], [855, 359, 10, 2, 8, 1], [855, 410, 10, 2, 8, 1], [855, 461, 10, 2, 8, 1], [855, 512, 10, 2, 8, 1], [855, 563, 10, 2, 8, 1], [855, 614, 10, 2, 8, 1], [855, 665, 10, 2, 8, 1], [855, 716, 10, 2, 8, 1], [855, 767, 10, 2, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 16, \"widestglyph\": 15, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 54, 10, 10, 10, 2], [1, 105, 10, 9, 10, 2], [1, 156, 12, 9, 12, 2], [1, 206, 11, 12, 11, 1], [1, 258, 13, 10, 13, 2], [1, 309, 12, 10, 12, 2], [1, 360, 7, 9, 7, 2], [1, 410, 8, 12, 8, 1], [1, 461, 8, 12, 8, 1], [1, 514, 10, 8, 10, 3], [1, 566, 10, 7, 10, 4], [1, 618, 8, 9, 8, 5], [1, 669, 10, 6, 10, 5], [1, 720, 8, 7, 8, 5], [1, 767, 10, 11, 10, 1], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 10, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 515, 8, 8, 8, 4], [62, 566, 8, 10, 8, 4], [62, 615, 9, 9, 9, 2], [62, 669, 11, 6, 11, 5], [62, 717, 9, 9, 9, 2], [62, 768, 11, 10, 11, 2], [123, 3, 13, 10, 13, 2], [123, 54, 11, 10, 11, 2], [123, 105, 11, 10, 11, 2], [123, 156, 11, 10, 11, 2], [123, 207, 11, 10, 11, 2], [123, 258, 10, 10, 10, 2], [123, 309, 10, 10, 10, 2], [123, 360, 11, 10, 11, 2], [123, 411, 11, 10, 11, 2], [123, 462, 10, 10, 10, 2], [123, 513, 10, 10, 10, 2], [123, 564, 12, 10, 12, 2], [123, 615, 10, 10, 10, 2], [123, 666, 14, 10, 14, 2], [123, 717, 12, 10, 12, 2], [123, 768, 11, 10, 11, 2], [184, 3, 11, 10, 11, 2], [184, 54, 11, 11, 11, 2], [184, 105, 11, 10, 11, 2], [184, 156, 10, 10, 10, 2], [184, 207, 10, 10, 10, 2], [184, 258, 11, 10, 11, 2], [184, 309, 11, 10, 11, 2], [184, 360, 14, 10, 14, 2], [184, 411, 11, 10, 11, 2], [184, 462, 12, 10, 12, 2], [184, 513, 11, 10, 11, 2], [184, 563, 9, 12, 9, 1], [184, 614, 10, 11, 10, 1], [184, 665, 9, 12, 9, 1], [184, 717, 11, 9, 11, 2], [184, 771, 11, 8, 11, 5], [245, 2, 9, 10, 9, 1], [245, 56, 11, 8, 11, 4], [245, 105, 11, 10, 11, 2], [245, 158, 10, 8, 10, 4], [245, 207, 11, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 10, 10, 10, 2], [245, 362, 11, 10, 11, 4], [245, 411, 11, 10, 11, 2], [245, 462, 8, 10, 8, 2], [245, 513, 9, 12, 9, 2], [245, 564, 11, 10, 11, 2], [245, 615, 8, 10, 8, 2], [245, 668, 14, 8, 14, 4], [245, 719, 11, 8, 11, 4], [245, 770, 11, 8, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 11, 10, 11, 4], [306, 107, 9, 8, 9, 4], [306, 158, 10, 8, 10, 4], [306, 207, 10, 10, 10, 2], [306, 260, 11, 8, 11, 4], [306, 311, 11, 8, 11, 4], [306, 362, 14, 8, 14, 4], [306, 413, 11, 8, 11, 4], [306, 464, 11, 10, 11, 4], [306, 515, 11, 8, 11, 4], [306, 563, 9, 12, 9, 1], [306, 615, 8, 11, 8, 2], [306, 665, 9, 12, 9, 1], [306, 719, 11, 7, 11, 4], [306, 768, 9, 10, 9, 2], [367, 1, 11, 12, 11, 0], [367, 52, 11, 12, 11, 0], [367, 105, 11, 12, 11, 2], [367, 154, 10, 12, 10, 0], [367, 205, 12, 12, 12, 0], [367, 256, 11, 12, 11, 0], [367, 307, 11, 12, 11, 0], [367, 359, 11, 11, 11, 1], [367, 410, 11, 11, 11, 1], [367, 461, 11, 11, 11, 1], [367, 513, 11, 10, 11, 2], [367, 563, 11, 11, 11, 1], [367, 613, 11, 12, 11, 0], [367, 668, 10, 10, 10, 4], [367, 716, 11, 11, 11, 1], [367, 767, 11, 11, 11, 1], [428, 2, 11, 11, 11, 1], [428, 54, 11, 10, 11, 2], [428, 104, 8, 11, 8, 1], [428, 155, 8, 11, 8, 1], [428, 206, 8, 11, 8, 1], [428, 258, 8, 10, 8, 2], [428, 308, 11, 11, 11, 1], [428, 359, 11, 11, 11, 1], [428, 410, 11, 11, 11, 1], [428, 461, 11, 11, 11, 1], [428, 513, 11, 10, 11, 2], [428, 563, 11, 11, 11, 1], [428, 614, 11, 11, 11, 1], [428, 665, 11, 11, 11, 1], [428, 716, 11, 11, 11, 1], [428, 768, 11, 10, 11, 2], [489, 3, 9, 9, 9, 2], [489, 54, 9, 9, 9, 2], [489, 104, 10, 10, 10, 1], [489, 156, 12, 10, 12, 2], [489, 207, 10, 12, 10, 2], [489, 260, 10, 7, 10, 4], [489, 309, 11, 10, 11, 2], [489, 360, 11, 10, 11, 2], [489, 411, 12, 10, 12, 2], [489, 462, 12, 10, 12, 2], [489, 513, 13, 9, 13, 2], [489, 563, 9, 10, 9, 1], [489, 615, 9, 9, 9, 2], [489, 668, 12, 7, 12, 4], [489, 717, 13, 10, 13, 2], [489, 768, 11, 10, 11, 2], [550, 5, 16, 7, 16, 4], [550, 55, 11, 9, 11, 3], [550, 107, 10, 8, 10, 4], [550, 158, 10, 8, 10, 4], [550, 207, 12, 10, 12, 2], [550, 260, 12, 10, 12, 4], [550, 309, 10, 10, 10, 2], [550, 360, 12, 11, 12, 2], [550, 411, 14, 10, 14, 2], [550, 463, 14, 9, 14, 3], [550, 513, 10, 12, 10, 2], [550, 564, 10, 9, 10, 2], [550, 615, 10, 9, 10, 2], [550, 666, 12, 10, 12, 2], [550, 719, 14, 8, 14, 4], [550, 770, 11, 8, 11, 4], [611, 3, 11, 10, 11, 2], [611, 54, 9, 10, 9, 2], [611, 108, 10, 7, 10, 5], [611, 155, 14, 11, 14, 1], [611, 207, 10, 12, 10, 2], [611, 260, 11, 7, 11, 4], [611, 309, 13, 10, 13, 2], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 465, 16, 7, 16, 5], [611, 516, 11, 6, 11, 5], [611, 562, 11, 12, 11, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 717, 13, 10, 13, 2], [611, 770, 14, 8, 14, 4], [672, 6, 9, 6, 9, 5], [672, 57, 12, 6, 12, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 8, 9, 8, 2], [672, 258, 8, 9, 8, 2], [672, 311, 10, 7, 10, 4], [672, 363, 11, 7, 11, 5], [672, 411, 11, 12, 11, 2], [1, 6, 7, 6, 7, 5], [794, 767, 9, 10, 9, 1], [672, 565, 11, 8, 11, 3], [672, 618, 9, 7, 9, 5], [672, 669, 9, 7, 9, 5], [672, 717, 12, 10, 12, 2], [672, 768, 12, 10, 12, 2], [733, 3, 9, 9, 9, 2], [733, 57, 8, 6, 8, 5], [733, 108, 8, 9, 8, 5], [733, 159, 11, 9, 11, 5], [733, 207, 17, 10, 17, 2], [733, 256, 11, 12, 11, 0], [733, 307, 10, 12, 10, 0], [733, 358, 11, 12, 11, 0], [733, 409, 10, 12, 10, 0], [733, 460, 10, 12, 10, 0], [733, 511, 10, 12, 10, 0], [733, 562, 10, 12, 10, 0], [733, 613, 10, 12, 10, 0], [733, 664, 10, 12, 10, 0], [733, 715, 11, 12, 11, 0], [733, 766, 11, 12, 11, 0], [1, 6, 7, 6, 7, 5], [794, 52, 11, 12, 11, 0], [794, 103, 11, 12, 11, 0], [794, 154, 11, 12, 11, 0], [794, 205, 11, 12, 11, 0], [794, 260, 8, 8, 8, 4], [794, 308, 9, 10, 9, 1], [794, 359, 11, 10, 11, 1], [794, 411, 9, 9, 9, 2], [794, 461, 9, 10, 9, 1], [794, 513, 9, 9, 9, 2], [794, 562, 9, 11, 9, 0], [794, 618, 9, 9, 9, 5], [794, 665, 9, 10, 9, 1], [794, 720, 9, 9, 9, 5], [794, 767, 9, 10, 9, 1], [855, 2, 9, 10, 9, 1], [855, 53, 9, 10, 9, 1], [855, 104, 9, 10, 9, 1], [855, 155, 9, 10, 9, 1], [855, 206, 9, 10, 9, 1], [855, 257, 9, 10, 9, 1], [855, 308, 9, 10, 9, 1], [855, 359, 9, 10, 9, 1], [855, 410, 9, 10, 9, 1], [855, 461, 9, 10, 9, 1], [855, 512, 9, 10, 9, 1], [855, 563, 9, 10, 9, 1], [855, 614, 9, 10, 9, 1], [855, 665, 9, 10, 9, 1], [855, 716, 9, 10, 9, 1], [855, 767, 9, 10, 9, 1]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 9, 8, 9, 2], [1, 105, 9, 8, 9, 2], [1, 156, 11, 8, 11, 2], [1, 206, 10, 10, 10, 1], [1, 258, 12, 8, 12, 2], [1, 309, 11, 8, 11, 2], [1, 360, 6, 8, 6, 2], [1, 410, 7, 10, 7, 1], [1, 461, 7, 10, 7, 1], [1, 514, 9, 7, 9, 3], [1, 566, 9, 6, 9, 4], [1, 617, 7, 8, 7, 4], [1, 668, 9, 6, 9, 4], [1, 719, 7, 6, 7, 4], [1, 767, 9, 9, 9, 1], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 615, 8, 8, 8, 2], [62, 668, 10, 6, 10, 4], [62, 717, 8, 8, 8, 2], [62, 768, 10, 8, 10, 2], [123, 3, 12, 8, 12, 2], [123, 54, 10, 8, 10, 2], [123, 105, 10, 8, 10, 2], [123, 156, 10, 8, 10, 2], [123, 207, 10, 8, 10, 2], [123, 258, 9, 8, 9, 2], [123, 309, 9, 8, 9, 2], [123, 360, 10, 8, 10, 2], [123, 411, 10, 8, 10, 2], [123, 462, 9, 8, 9, 2], [123, 513, 9, 8, 9, 2], [123, 564, 11, 8, 11, 2], [123, 615, 9, 8, 9, 2], [123, 666, 13, 8, 13, 2], [123, 717, 11, 8, 11, 2], [123, 768, 10, 8, 10, 2], [184, 3, 10, 8, 10, 2], [184, 54, 10, 9, 10, 2], [184, 105, 10, 8, 10, 2], [184, 156, 9, 8, 9, 2], [184, 207, 9, 8, 9, 2], [184, 258, 10, 8, 10, 2], [184, 309, 10, 8, 10, 2], [184, 360, 13, 8, 13, 2], [184, 411, 10, 8, 10, 2], [184, 462, 11, 8, 11, 2], [184, 513, 10, 8, 10, 2], [184, 563, 8, 10, 8, 1], [184, 614, 9, 9, 9, 1], [184, 665, 8, 10, 8, 1], [184, 717, 10, 8, 10, 2], [184, 770, 10, 7, 10, 4], [245, 2, 8, 9, 8, 1], [245, 56, 10, 6, 10, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 10, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 9, 8, 9, 2], [245, 362, 10, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 7, 8, 7, 2], [245, 513, 8, 10, 8, 2], [245, 564, 10, 8, 10, 2], [245, 615, 7, 8, 7, 2], [245, 668, 13, 6, 13, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 8, 6, 8, 4], [306, 158, 9, 6, 9, 4], [306, 207, 9, 8, 9, 2], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 13, 6, 13, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 563, 8, 10, 8, 1], [306, 615, 7, 9, 7, 2], [306, 665, 8, 10, 8, 1], [306, 719, 10, 6, 10, 4], [306, 768, 8, 8, 8, 2], [367, 1, 10, 10, 10, 0], [367, 52, 10, 10, 10, 0], [367, 105, 10, 10, 10, 2], [367, 154, 9, 10, 9, 0], [367, 205, 11, 10, 11, 0], [367, 256, 10, 10, 10, 0], [367, 307, 10, 10, 10, 0], [367, 359, 10, 9, 10, 1], [367, 410, 10, 9, 10, 1], [367, 461, 10, 9, 10, 1], [367, 513, 10, 8, 10, 2], [367, 563, 10, 9, 10, 1], [367, 613, 10, 10, 10, 0], [367, 668, 9, 8, 9, 4], [367, 716, 10, 9, 10, 1], [367, 767, 10, 9, 10, 1], [428, 2, 10, 9, 10, 1], [428, 54, 10, 8, 10, 2], [428, 104, 7, 9, 7, 1], [428, 155, 7, 9, 7, 1], [428, 206, 7, 9, 7, 1], [428, 258, 7, 8, 7, 2], [428, 308, 10, 9, 10, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 10, 8, 10, 2], [428, 563, 10, 9, 10, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 3, 8, 8, 8, 2], [489, 54, 8, 8, 8, 2], [489, 104, 9, 9, 9, 1], [489, 156, 11, 8, 11, 2], [489, 207, 9, 10, 9, 2], [489, 260, 9, 6, 9, 4], [489, 309, 10, 8, 10, 2], [489, 360, 10, 8, 10, 2], [489, 411, 11, 8, 11, 2], [489, 462, 11, 8, 11, 2], [489, 513, 12, 8, 12, 2], [489, 563, 8, 9, 8, 1], [489, 615, 8, 8, 8, 2], [489, 668, 11, 6, 11, 4], [489, 717, 12, 8, 12, 2], [489, 768, 10, 8, 10, 2], [550, 5, 15, 6, 15, 4], [550, 55, 10, 7, 10, 3], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 207, 11, 8, 11, 2], [550, 260, 11, 8, 11, 4], [550, 309, 9, 8, 9, 2], [550, 360, 11, 9, 11, 2], [550, 411, 13, 8, 13, 2], [550, 463, 13, 7, 13, 3], [550, 513, 9, 10, 9, 2], [550, 564, 9, 8, 9, 2], [550, 615, 9, 8, 9, 2], [550, 666, 11, 8, 11, 2], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 3, 10, 8, 10, 2], [611, 54, 8, 8, 8, 2], [611, 107, 9, 6, 9, 4], [611, 155, 13, 9, 13, 1], [611, 207, 9, 10, 9, 2], [611, 260, 10, 6, 10, 4], [611, 309, 12, 8, 12, 2], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 15, 6, 15, 4], [611, 515, 10, 6, 10, 4], [611, 562, 10, 10, 10, 0], [611, 613, 10, 10, 10, 0], [611, 664, 10, 10, 10, 0], [611, 717, 12, 8, 12, 2], [611, 770, 13, 6, 13, 4], [672, 5, 8, 6, 8, 4], [672, 56, 11, 6, 11, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 9, 6, 9, 4], [672, 362, 10, 6, 10, 4], [672, 411, 10, 10, 10, 2], [1, 5, 6, 6, 6, 4], [794, 767, 8, 9, 8, 1], [672, 565, 10, 7, 10, 3], [672, 617, 8, 6, 8, 4], [672, 668, 8, 6, 8, 4], [672, 717, 11, 8, 11, 2], [672, 768, 11, 8, 11, 2], [733, 3, 8, 8, 8, 2], [733, 56, 7, 6, 7, 4], [733, 107, 7, 8, 7, 4], [733, 158, 10, 8, 10, 4], [733, 207, 16, 8, 16, 2], [733, 256, 10, 10, 10, 0], [733, 307, 9, 10, 9, 0], [733, 358, 10, 10, 10, 0], [733, 409, 9, 10, 9, 0], [733, 460, 9, 10, 9, 0], [733, 511, 9, 10, 9, 0], [733, 562, 9, 10, 9, 0], [733, 613, 9, 10, 9, 0], [733, 664, 9, 10, 9, 0], [733, 715, 10, 10, 10, 0], [733, 766, 10, 10, 10, 0], [1, 5, 6, 6, 6, 4], [794, 52, 10, 10, 10, 0], [794, 103, 10, 10, 10, 0], [794, 154, 10, 10, 10, 0], [794, 205, 10, 10, 10, 0], [794, 260, 7, 6, 7, 4], [794, 308, 8, 9, 8, 1], [794, 359, 10, 9, 10, 1], [794, 411, 8, 8, 8, 2], [794, 461, 8, 9, 8, 1], [794, 513, 8, 8, 8, 2], [794, 562, 8, 10, 8, 0], [794, 617, 8, 8, 8, 4], [794, 665, 8, 9, 8, 1], [794, 719, 8, 8, 8, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 14, 11, 11, 3], [1, 106, 15, 5, 12, 3], [1, 156, 19, 10, 15, 2], [1, 207, 16, 13, 12, 2], [1, 258, 19, 12, 16, 2], [1, 310, 18, 11, 15, 3], [1, 361, 12, 5, 8, 3], [1, 411, 15, 13, 10, 2], [1, 462, 14, 13, 10, 2], [1, 514, 16, 7, 12, 3], [1, 567, 14, 7, 12, 5], [1, 623, 10, 6, 9, 10], [1, 671, 14, 3, 12, 7], [1, 725, 10, 4, 9, 10], [1, 768, 17, 12, 12, 2], [62, 4, 17, 11, 13, 3], [62, 55, 15, 11, 13, 3], [62, 106, 17, 11, 13, 3], [62, 157, 17, 11, 13, 3], [62, 208, 17, 11, 13, 3], [62, 259, 17, 11, 13, 3], [62, 310, 16, 11, 13, 3], [62, 361, 17, 11, 13, 3], [62, 412, 17, 11, 13, 3], [62, 463, 17, 11, 13, 3], [62, 516, 12, 9, 9, 5], [62, 567, 12, 11, 9, 5], [62, 617, 15, 9, 11, 4], [62, 670, 16, 5, 13, 6], [62, 719, 13, 9, 11, 4], [62, 769, 17, 11, 13, 3], [123, 5, 19, 10, 16, 4], [123, 55, 17, 11, 13, 3], [123, 106, 17, 11, 13, 3], [123, 157, 17, 11, 13, 3], [123, 208, 17, 11, 13, 3], [123, 259, 16, 11, 12, 3], [123, 310, 16, 11, 12, 3], [123, 361, 17, 11, 13, 3], [123, 412, 17, 11, 13, 3], [123, 463, 14, 11, 11, 3], [123, 514, 16, 11, 12, 3], [123, 565, 18, 11, 14, 3], [123, 616, 13, 11, 12, 3], [123, 667, 21, 11, 17, 3], [123, 718, 18, 11, 14, 3], [123, 769, 17, 11, 13, 3], [184, 4, 17, 11, 13, 3], [184, 55, 17, 12, 13, 3], [184, 106, 17, 11, 13, 3], [184, 157, 16, 11, 12, 3], [184, 208, 16, 11, 11, 3], [184, 259, 17, 11, 13, 3], [184, 310, 17, 11, 13, 3], [184, 361, 21, 11, 17, 3], [184, 412, 17, 11, 13, 3], [184, 463, 17, 11, 13, 3], [184, 514, 17, 11, 13, 3], [184, 564, 15, 13, 10, 2], [184, 615, 13, 12, 12, 2], [184, 666, 15, 13, 10, 2], [184, 718, 16, 5, 13, 3], [184, 777, 14, 3, 13, 11], [245, 3, 14, 5, 11, 2], [245, 57, 16, 9, 13, 5], [245, 106, 16, 11, 13, 3], [245, 159, 15, 9, 12, 5], [245, 208, 17, 11, 13, 3], [245, 261, 16, 9, 13, 5], [245, 310, 16, 11, 11, 3], [245, 363, 16, 12, 13, 5], [245, 412, 16, 11, 13, 3], [245, 463, 13, 11, 9, 3], [245, 514, 15, 14, 11, 3], [245, 565, 16, 11, 13, 3], [245, 616, 13, 11, 9, 3], [245, 669, 20, 9, 17, 5], [245, 720, 16, 9, 13, 5], [245, 771, 16, 9, 13, 5], [306, 6, 16, 11, 13, 5], [306, 57, 16, 11, 13, 5], [306, 108, 15, 9, 11, 5], [306, 159, 15, 9, 12, 5], [306, 208, 14, 11, 11, 3], [306, 261, 16, 9, 13, 5], [306, 312, 16, 9, 13, 5], [306, 363, 20, 9, 17, 5], [306, 414, 16, 9, 13, 5], [306, 465, 16, 12, 13, 5], [306, 516, 16, 9, 13, 5], [306, 564, 15, 13, 10, 2], [306, 615, 14, 13, 10, 2], [306, 666, 13, 13, 10, 2], [306, 720, 16, 4, 13, 5], [306, 766, 1, 1, 13, 1], [367, 2, 17, 13, 13, 1], [367, 52, 17, 14, 13, 0], [367, 106, 17, 14, 13, 3], [367, 154, 17, 14, 12, 0], [367, 205, 19, 14, 14, 0], [367, 257, 17, 13, 13, 1], [367, 308, 17, 13, 13, 1], [367, 360, 16, 12, 13, 2], [367, 411, 16, 12, 13, 2], [367, 462, 16, 12, 13, 2], [367, 514, 16, 11, 13, 3], [367, 564, 18, 12, 13, 2], [367, 613, 17, 14, 13, 0], [367, 669, 16, 12, 13, 5], [367, 717, 16, 12, 13, 2], [367, 768, 16, 12, 13, 2], [428, 3, 16, 12, 13, 2], [428, 55, 16, 11, 13, 3], [428, 105, 15, 12, 11, 2], [428, 156, 14, 12, 11, 2], [428, 207, 15, 12, 11, 2], [428, 259, 15, 11, 11, 3], [428, 309, 18, 12, 13, 2], [428, 360, 16, 12, 13, 2], [428, 411, 16, 12, 13, 2], [428, 462, 16, 12, 13, 2], [428, 514, 16, 11, 13, 3], [428, 564, 18, 12, 13, 2], [428, 615, 16, 12, 13, 2], [428, 666, 16, 12, 13, 2], [428, 717, 16, 12, 13, 2], [428, 769, 16, 11, 13, 3], [489, 4, 14, 7, 10, 3], [489, 55, 15, 6, 11, 3], [489, 105, 16, 10, 12, 2], [489, 157, 17, 11, 14, 3], [489, 207, 16, 14, 12, 2], [489, 261, 15, 7, 12, 5], [489, 310, 18, 11, 14, 3], [489, 361, 18, 11, 14, 3], [489, 412, 18, 11, 15, 3], [489, 463, 18, 11, 15, 3], [489, 514, 20, 6, 16, 3], [489, 565, 14, 5, 10, 3], [489, 616, 15, 3, 11, 3], [489, 669, 17, 7, 14, 5], [489, 718, 20, 11, 16, 3], [489, 769, 19, 11, 14, 3], [550, 6, 22, 7, 19, 5], [550, 57, 14, 9, 12, 5], [550, 108, 13, 9, 11, 5], [550, 159, 13, 9, 11, 5], [550, 208, 19, 11, 15, 3], [550, 261, 17, 11, 15, 5], [550, 311, 16, 10, 13, 4], [550, 361, 18, 11, 14, 3], [550, 412, 19, 11, 15, 3], [550, 464, 20, 10, 16, 4], [550, 514, 15, 13, 11, 3], [550, 565, 16, 10, 12, 3], [550, 616, 16, 10, 12, 3], [550, 667, 18, 11, 15, 3], [550, 720, 20, 9, 17, 5], [550, 771, 17, 9, 13, 5], [611, 4, 15, 11, 13, 3], [611, 55, 14, 11, 11, 3], [611, 110, 14, 5, 12, 7], [611, 156, 22, 12, 17, 2], [611, 208, 15, 13, 11, 3], [611, 261, 17, 7, 15, 5], [611, 311, 15, 10, 14, 4], [611, 363, 17, 9, 14, 5], [611, 414, 16, 9, 14, 5], [611, 470, 19, 4, 19, 10], [611, 511, 1, 1, 13, 1], [611, 562, 17, 14, 13, 0], [611, 613, 18, 14, 13, 0], [611, 664, 18, 14, 13, 0], [611, 718, 20, 11, 16, 3], [611, 771, 20, 9, 17, 5], [672, 8, 13, 3, 11, 7], [672, 59, 17, 3, 15, 7], [672, 106, 16, 6, 12, 3], [672, 157, 16, 6, 12, 3], [672, 208, 13, 6, 9, 3], [672, 259, 13, 6, 9, 3], [672, 312, 14, 7, 12, 5], [672, 362, 16, 9, 14, 4], [672, 412, 16, 14, 13, 3], [1, 1, 1, 1, 9, 1], [794, 769, 19, 12, 15, 3], [672, 565, 19, 12, 15, 3], [672, 616, 19, 12, 15, 3], [672, 667, 19, 12, 15, 3], [672, 718, 19, 12, 15, 3], [672, 769, 19, 12, 15, 3], [733, 4, 19, 12, 15, 3], [733, 55, 19, 12, 15, 3], [733, 106, 19, 12, 15, 3], [733, 157, 19, 12, 15, 3], [733, 208, 19, 12, 15, 3], [733, 259, 19, 12, 15, 3], [733, 310, 19, 12, 15, 3], [733, 361, 19, 12, 15, 3], [733, 412, 19, 12, 15, 3], [733, 463, 19, 12, 15, 3], [733, 514, 19, 12, 15, 3], [733, 565, 19, 12, 15, 3], [733, 616, 19, 12, 15, 3], [733, 667, 19, 12, 15, 3], [733, 718, 19, 12, 15, 3], [733, 769, 19, 12, 15, 3], [1, 1, 1, 1, 9, 1], [794, 55, 19, 12, 15, 3], [794, 106, 19, 12, 15, 3], [794, 157, 19, 12, 15, 3], [794, 208, 19, 12, 15, 3], [794, 259, 19, 12, 15, 3], [794, 310, 19, 12, 15, 3], [794, 361, 19, 12, 15, 3], [794, 412, 19, 12, 15, 3], [794, 463, 19, 12, 15, 3], [794, 514, 19, 12, 15, 3], [794, 565, 19, 12, 15, 3], [794, 616, 19, 12, 15, 3], [794, 667, 19, 12, 15, 3], [794, 718, 19, 12, 15, 3], [794, 769, 19, 12, 15, 3], [855, 4, 19, 12, 15, 3], [855, 55, 19, 12, 15, 3], [855, 106, 19, 12, 15, 3], [855, 157, 19, 12, 15, 3], [855, 208, 19, 12, 15, 3], [855, 259, 19, 12, 15, 3], [855, 310, 19, 12, 15, 3], [855, 361, 19, 12, 15, 3], [855, 412, 19, 12, 15, 3], [855, 463, 19, 12, 15, 3], [855, 514, 19, 12, 15, 3], [855, 565, 19, 12, 15, 3], [855, 616, 19, 12, 15, 3], [855, 667, 19, 12, 15, 3], [855, 718, 19, 12, 15, 3], [855, 769, 19, 12, 15, 3]], \"capHeight\": 13, \"widestlogicalchar\": 19, \"widestglyph\": 22, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 13, 9, 10, 3], [1, 106, 14, 3, 11, 3], [1, 156, 18, 8, 14, 2], [1, 207, 15, 11, 11, 2], [1, 258, 18, 10, 15, 2], [1, 310, 17, 9, 14, 3], [1, 361, 11, 3, 7, 3], [1, 411, 14, 11, 9, 2], [1, 462, 13, 11, 9, 2], [1, 514, 15, 5, 11, 3], [1, 567, 13, 5, 11, 5], [1, 623, 9, 4, 8, 10], [1, 671, 13, 1, 11, 7], [1, 725, 9, 2, 8, 10], [1, 768, 16, 10, 11, 2], [62, 4, 16, 9, 12, 3], [62, 55, 14, 9, 12, 3], [62, 106, 16, 9, 12, 3], [62, 157, 16, 9, 12, 3], [62, 208, 16, 9, 12, 3], [62, 259, 16, 9, 12, 3], [62, 310, 15, 9, 12, 3], [62, 361, 16, 9, 12, 3], [62, 412, 16, 9, 12, 3], [62, 463, 16, 9, 12, 3], [62, 516, 11, 7, 8, 5], [62, 567, 11, 9, 8, 5], [62, 617, 14, 7, 10, 4], [62, 670, 15, 3, 12, 6], [62, 719, 12, 7, 10, 4], [62, 769, 16, 9, 12, 3], [123, 5, 18, 8, 15, 4], [123, 55, 16, 9, 12, 3], [123, 106, 16, 9, 12, 3], [123, 157, 16, 9, 12, 3], [123, 208, 16, 9, 12, 3], [123, 259, 15, 9, 11, 3], [123, 310, 15, 9, 11, 3], [123, 361, 16, 9, 12, 3], [123, 412, 16, 9, 12, 3], [123, 463, 13, 9, 10, 3], [123, 514, 15, 9, 11, 3], [123, 565, 17, 9, 13, 3], [123, 616, 12, 9, 11, 3], [123, 667, 20, 9, 16, 3], [123, 718, 17, 9, 13, 3], [123, 769, 16, 9, 12, 3], [184, 4, 16, 9, 12, 3], [184, 55, 16, 10, 12, 3], [184, 106, 16, 9, 12, 3], [184, 157, 15, 9, 11, 3], [184, 208, 15, 9, 10, 3], [184, 259, 16, 9, 12, 3], [184, 310, 16, 9, 12, 3], [184, 361, 20, 9, 16, 3], [184, 412, 16, 9, 12, 3], [184, 463, 16, 9, 12, 3], [184, 514, 16, 9, 12, 3], [184, 564, 14, 11, 9, 2], [184, 615, 12, 10, 11, 2], [184, 666, 14, 11, 9, 2], [184, 718, 15, 3, 12, 3], [184, 777, 13, 1, 12, 11], [245, 3, 13, 3, 10, 2], [245, 57, 15, 7, 12, 5], [245, 106, 15, 9, 12, 3], [245, 159, 14, 7, 11, 5], [245, 208, 16, 9, 12, 3], [245, 261, 15, 7, 12, 5], [245, 310, 15, 9, 10, 3], [245, 363, 15, 10, 12, 5], [245, 412, 15, 9, 12, 3], [245, 463, 12, 9, 8, 3], [245, 514, 14, 12, 10, 3], [245, 565, 15, 9, 12, 3], [245, 616, 12, 9, 8, 3], [245, 669, 19, 7, 16, 5], [245, 720, 15, 7, 12, 5], [245, 771, 15, 7, 12, 5], [306, 6, 15, 9, 12, 5], [306, 57, 15, 9, 12, 5], [306, 108, 14, 7, 10, 5], [306, 159, 14, 7, 11, 5], [306, 208, 13, 9, 10, 3], [306, 261, 15, 7, 12, 5], [306, 312, 15, 7, 12, 5], [306, 363, 19, 7, 16, 5], [306, 414, 15, 7, 12, 5], [306, 465, 15, 10, 12, 5], [306, 516, 15, 7, 12, 5], [306, 564, 14, 11, 9, 2], [306, 615, 13, 11, 9, 2], [306, 666, 12, 11, 9, 2], [306, 720, 15, 2, 12, 5], [306, 766, 1, 1, 12, 1], [367, 2, 16, 11, 12, 1], [367, 52, 16, 12, 12, 0], [367, 106, 16, 12, 12, 3], [367, 154, 15, 12, 11, 0], [367, 205, 17, 12, 13, 0], [367, 257, 16, 11, 12, 1], [367, 308, 16, 11, 12, 1], [367, 360, 15, 10, 12, 2], [367, 411, 15, 10, 12, 2], [367, 462, 15, 10, 12, 2], [367, 514, 15, 9, 12, 3], [367, 564, 17, 10, 12, 2], [367, 613, 16, 12, 12, 0], [367, 669, 15, 10, 12, 5], [367, 717, 15, 10, 12, 2], [367, 768, 15, 10, 12, 2], [428, 3, 15, 10, 12, 2], [428, 55, 15, 9, 12, 3], [428, 105, 14, 10, 10, 2], [428, 156, 13, 10, 10, 2], [428, 207, 14, 10, 10, 2], [428, 259, 14, 9, 10, 3], [428, 309, 17, 10, 12, 2], [428, 360, 15, 10, 12, 2], [428, 411, 15, 10, 12, 2], [428, 462, 15, 10, 12, 2], [428, 514, 15, 9, 12, 3], [428, 564, 17, 10, 12, 2], [428, 615, 15, 10, 12, 2], [428, 666, 15, 10, 12, 2], [428, 717, 15, 10, 12, 2], [428, 769, 15, 9, 12, 3], [489, 4, 13, 5, 9, 3], [489, 55, 14, 4, 10, 3], [489, 105, 15, 8, 11, 2], [489, 157, 16, 9, 13, 3], [489, 207, 15, 12, 11, 2], [489, 261, 14, 5, 11, 5], [489, 310, 17, 9, 13, 3], [489, 361, 17, 9, 13, 3], [489, 412, 17, 9, 14, 3], [489, 463, 17, 9, 14, 3], [489, 514, 19, 4, 15, 3], [489, 565, 13, 3, 9, 3], [489, 616, 14, 1, 10, 3], [489, 669, 16, 5, 13, 5], [489, 718, 19, 9, 15, 3], [489, 769, 18, 9, 13, 3], [550, 6, 21, 5, 18, 5], [550, 57, 13, 7, 11, 5], [550, 108, 12, 7, 10, 5], [550, 159, 12, 7, 10, 5], [550, 208, 18, 9, 14, 3], [550, 261, 16, 9, 14, 5], [550, 311, 15, 8, 12, 4], [550, 361, 17, 9, 13, 3], [550, 412, 18, 9, 14, 3], [550, 464, 19, 8, 15, 4], [550, 514, 14, 11, 10, 3], [550, 565, 15, 8, 11, 3], [550, 616, 15, 8, 11, 3], [550, 667, 17, 9, 14, 3], [550, 720, 19, 7, 16, 5], [550, 771, 16, 7, 12, 5], [611, 4, 14, 9, 12, 3], [611, 55, 13, 9, 10, 3], [611, 110, 13, 3, 11, 7], [611, 156, 21, 10, 16, 2], [611, 208, 14, 11, 10, 3], [611, 261, 16, 5, 14, 5], [611, 311, 14, 8, 13, 4], [611, 363, 16, 7, 13, 5], [611, 414, 15, 7, 13, 5], [611, 470, 18, 2, 18, 10], [611, 511, 1, 1, 12, 1], [611, 562, 16, 12, 12, 0], [611, 613, 16, 12, 12, 0], [611, 664, 16, 12, 12, 0], [611, 718, 19, 9, 15, 3], [611, 771, 19, 7, 16, 5], [672, 8, 12, 1, 10, 7], [672, 59, 16, 1, 14, 7], [672, 106, 15, 4, 11, 3], [672, 157, 15, 4, 11, 3], [672, 208, 12, 4, 8, 3], [672, 259, 12, 4, 8, 3], [672, 312, 13, 5, 11, 5], [672, 362, 15, 7, 13, 4], [672, 412, 15, 12, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 18, 10, 14, 3], [672, 565, 18, 10, 14, 3], [672, 616, 18, 10, 14, 3], [672, 667, 18, 10, 14, 3], [672, 718, 18, 10, 14, 3], [672, 769, 18, 10, 14, 3], [733, 4, 18, 10, 14, 3], [733, 55, 18, 10, 14, 3], [733, 106, 18, 10, 14, 3], [733, 157, 18, 10, 14, 3], [733, 208, 18, 10, 14, 3], [733, 259, 18, 10, 14, 3], [733, 310, 18, 10, 14, 3], [733, 361, 18, 10, 14, 3], [733, 412, 18, 10, 14, 3], [733, 463, 18, 10, 14, 3], [733, 514, 18, 10, 14, 3], [733, 565, 18, 10, 14, 3], [733, 616, 18, 10, 14, 3], [733, 667, 18, 10, 14, 3], [733, 718, 18, 10, 14, 3], [733, 769, 18, 10, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 18, 10, 14, 3], [794, 106, 18, 10, 14, 3], [794, 157, 18, 10, 14, 3], [794, 208, 18, 10, 14, 3], [794, 259, 18, 10, 14, 3], [794, 310, 18, 10, 14, 3], [794, 361, 18, 10, 14, 3], [794, 412, 18, 10, 14, 3], [794, 463, 18, 10, 14, 3], [794, 514, 18, 10, 14, 3], [794, 565, 18, 10, 14, 3], [794, 616, 18, 10, 14, 3], [794, 667, 18, 10, 14, 3], [794, 718, 18, 10, 14, 3], [794, 769, 18, 10, 14, 3], [855, 4, 18, 10, 14, 3], [855, 55, 18, 10, 14, 3], [855, 106, 18, 10, 14, 3], [855, 157, 18, 10, 14, 3], [855, 208, 18, 10, 14, 3], [855, 259, 18, 10, 14, 3], [855, 310, 18, 10, 14, 3], [855, 361, 18, 10, 14, 3], [855, 412, 18, 10, 14, 3], [855, 463, 18, 10, 14, 3], [855, 514, 18, 10, 14, 3], [855, 565, 18, 10, 14, 3], [855, 616, 18, 10, 14, 3], [855, 667, 18, 10, 14, 3], [855, 718, 18, 10, 14, 3], [855, 769, 18, 10, 14, 3]], \"capHeight\": 12, \"widestlogicalchar\": 18, \"widestglyph\": 21, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 9, 6, 9, 7], [1, 55, 11, 11, 11, 3], [1, 106, 12, 10, 12, 3], [1, 156, 15, 11, 15, 2], [1, 207, 12, 13, 12, 2], [1, 258, 16, 12, 16, 2], [1, 310, 15, 11, 15, 3], [1, 361, 8, 10, 8, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 514, 12, 10, 12, 3], [1, 567, 12, 8, 12, 5], [1, 620, 9, 9, 9, 7], [1, 671, 12, 6, 12, 7], [1, 722, 9, 7, 9, 7], [1, 768, 12, 12, 12, 2], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 11, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 11, 13, 3], [62, 310, 13, 11, 13, 3], [62, 361, 13, 11, 13, 3], [62, 412, 13, 11, 13, 3], [62, 463, 13, 11, 13, 3], [62, 516, 9, 9, 9, 5], [62, 567, 9, 11, 9, 5], [62, 617, 11, 9, 11, 4], [62, 670, 13, 7, 13, 6], [62, 719, 11, 9, 11, 4], [62, 769, 13, 11, 13, 3], [123, 5, 16, 10, 16, 4], [123, 55, 13, 11, 13, 3], [123, 106, 13, 11, 13, 3], [123, 157, 13, 11, 13, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 13, 11, 13, 3], [123, 412, 13, 11, 13, 3], [123, 463, 11, 11, 11, 3], [123, 514, 12, 11, 12, 3], [123, 565, 14, 11, 14, 3], [123, 616, 12, 11, 12, 3], [123, 667, 17, 11, 17, 3], [123, 718, 14, 11, 14, 3], [123, 769, 13, 11, 13, 3], [184, 4, 13, 11, 13, 3], [184, 55, 13, 12, 13, 3], [184, 106, 13, 11, 13, 3], [184, 157, 12, 11, 12, 3], [184, 208, 11, 11, 11, 3], [184, 259, 13, 11, 13, 3], [184, 310, 13, 11, 13, 3], [184, 361, 17, 11, 17, 3], [184, 412, 13, 11, 13, 3], [184, 463, 13, 11, 13, 3], [184, 514, 13, 11, 13, 3], [184, 564, 10, 13, 10, 2], [184, 615, 12, 12, 12, 2], [184, 666, 10, 13, 10, 2], [184, 718, 13, 10, 13, 3], [184, 773, 13, 7, 13, 7], [245, 3, 11, 11, 11, 2], [245, 57, 13, 9, 13, 5], [245, 106, 13, 11, 13, 3], [245, 159, 12, 9, 12, 5], [245, 208, 13, 11, 13, 3], [245, 261, 13, 9, 13, 5], [245, 310, 11, 11, 11, 3], [245, 363, 13, 12, 13, 5], [245, 412, 13, 11, 13, 3], [245, 463, 9, 11, 9, 3], [245, 514, 11, 14, 11, 3], [245, 565, 13, 11, 13, 3], [245, 616, 9, 11, 9, 3], [245, 669, 17, 9, 17, 5], [245, 720, 13, 9, 13, 5], [245, 771, 13, 9, 13, 5], [306, 6, 13, 11, 13, 5], [306, 57, 13, 11, 13, 5], [306, 108, 11, 9, 11, 5], [306, 159, 12, 9, 12, 5], [306, 208, 11, 11, 11, 3], [306, 261, 13, 9, 13, 5], [306, 312, 13, 9, 13, 5], [306, 363, 17, 9, 17, 5], [306, 414, 13, 9, 13, 5], [306, 465, 13, 12, 13, 5], [306, 516, 13, 9, 13, 5], [306, 564, 10, 13, 10, 2], [306, 615, 10, 13, 10, 2], [306, 666, 10, 13, 10, 2], [306, 720, 13, 8, 13, 5], [306, 773, 13, 6, 13, 7], [367, 2, 13, 13, 13, 1], [367, 52, 13, 14, 13, 0], [367, 106, 13, 14, 13, 3], [367, 154, 12, 14, 12, 0], [367, 205, 14, 14, 14, 0], [367, 257, 13, 13, 13, 1], [367, 308, 13, 13, 13, 1], [367, 360, 13, 12, 13, 2], [367, 411, 13, 12, 13, 2], [367, 462, 13, 12, 13, 2], [367, 514, 13, 11, 13, 3], [367, 564, 13, 12, 13, 2], [367, 613, 13, 14, 13, 0], [367, 669, 13, 12, 13, 5], [367, 717, 13, 12, 13, 2], [367, 768, 13, 12, 13, 2], [428, 3, 13, 12, 13, 2], [428, 55, 13, 11, 13, 3], [428, 105, 11, 12, 11, 2], [428, 156, 11, 12, 11, 2], [428, 207, 11, 12, 11, 2], [428, 259, 11, 11, 11, 3], [428, 309, 13, 12, 13, 2], [428, 360, 13, 12, 13, 2], [428, 411, 13, 12, 13, 2], [428, 462, 13, 12, 13, 2], [428, 514, 13, 11, 13, 3], [428, 564, 13, 12, 13, 2], [428, 615, 13, 12, 13, 2], [428, 666, 13, 12, 13, 2], [428, 717, 13, 12, 13, 2], [428, 769, 13, 11, 13, 3], [489, 4, 10, 10, 10, 3], [489, 55, 11, 10, 11, 3], [489, 105, 12, 11, 12, 2], [489, 157, 14, 11, 14, 3], [489, 207, 12, 14, 12, 2], [489, 261, 12, 8, 12, 5], [489, 310, 14, 11, 14, 3], [489, 361, 14, 11, 14, 3], [489, 412, 15, 11, 15, 3], [489, 463, 15, 11, 15, 3], [489, 514, 16, 10, 16, 3], [489, 565, 10, 10, 10, 3], [489, 616, 11, 10, 11, 3], [489, 669, 14, 8, 14, 5], [489, 718, 16, 11, 16, 3], [489, 769, 14, 11, 14, 3], [550, 6, 19, 8, 19, 5], [550, 57, 12, 9, 12, 5], [550, 108, 11, 9, 11, 5], [550, 159, 11, 9, 11, 5], [550, 208, 15, 11, 15, 3], [550, 261, 15, 11, 15, 5], [550, 311, 13, 10, 13, 4], [550, 361, 14, 11, 14, 3], [550, 412, 15, 11, 15, 3], [550, 464, 16, 10, 16, 4], [550, 514, 11, 13, 11, 3], [550, 565, 12, 10, 12, 3], [550, 616, 12, 10, 12, 3], [550, 667, 15, 11, 15, 3], [550, 720, 17, 9, 17, 5], [550, 771, 13, 9, 13, 5], [611, 4, 13, 11, 13, 3], [611, 55, 11, 11, 11, 3], [611, 110, 12, 6, 12, 7], [611, 156, 17, 12, 17, 2], [611, 208, 11, 13, 11, 3], [611, 261, 15, 8, 15, 5], [611, 311, 14, 10, 14, 4], [611, 363, 14, 9, 14, 5], [611, 414, 14, 9, 14, 5], [611, 467, 19, 7, 19, 7], [611, 518, 13, 6, 13, 7], [611, 562, 13, 14, 13, 0], [611, 613, 13, 14, 13, 0], [611, 664, 13, 14, 13, 0], [611, 718, 16, 11, 16, 3], [611, 771, 17, 9, 17, 5], [672, 8, 11, 6, 11, 7], [672, 59, 15, 6, 15, 7], [672, 106, 12, 10, 12, 3], [672, 157, 12, 10, 12, 3], [672, 208, 9, 10, 9, 3], [672, 259, 9, 10, 9, 3], [672, 312, 12, 8, 12, 5], [672, 362, 14, 9, 14, 4], [672, 412, 13, 14, 13, 3], [1, 8, 9, 6, 9, 7], [794, 769, 15, 12, 15, 3], [672, 565, 15, 12, 15, 3], [672, 616, 15, 12, 15, 3], [672, 667, 15, 12, 15, 3], [672, 718, 15, 12, 15, 3], [672, 769, 15, 12, 15, 3], [733, 4, 15, 12, 15, 3], [733, 55, 15, 12, 15, 3], [733, 106, 15, 12, 15, 3], [733, 157, 15, 12, 15, 3], [733, 208, 15, 12, 15, 3], [733, 259, 15, 12, 15, 3], [733, 310, 15, 12, 15, 3], [733, 361, 15, 12, 15, 3], [733, 412, 15, 12, 15, 3], [733, 463, 15, 12, 15, 3], [733, 514, 15, 12, 15, 3], [733, 565, 15, 12, 15, 3], [733, 616, 15, 12, 15, 3], [733, 667, 15, 12, 15, 3], [733, 718, 15, 12, 15, 3], [733, 769, 15, 12, 15, 3], [1, 8, 9, 6, 9, 7], [794, 55, 15, 12, 15, 3], [794, 106, 15, 12, 15, 3], [794, 157, 15, 12, 15, 3], [794, 208, 15, 12, 15, 3], [794, 259, 15, 12, 15, 3], [794, 310, 15, 12, 15, 3], [794, 361, 15, 12, 15, 3], [794, 412, 15, 12, 15, 3], [794, 463, 15, 12, 15, 3], [794, 514, 15, 12, 15, 3], [794, 565, 15, 12, 15, 3], [794, 616, 15, 12, 15, 3], [794, 667, 15, 12, 15, 3], [794, 718, 15, 12, 15, 3], [794, 769, 15, 12, 15, 3], [855, 4, 15, 12, 15, 3], [855, 55, 15, 12, 15, 3], [855, 106, 15, 12, 15, 3], [855, 157, 15, 12, 15, 3], [855, 208, 15, 12, 15, 3], [855, 259, 15, 12, 15, 3], [855, 310, 15, 12, 15, 3], [855, 361, 15, 12, 15, 3], [855, 412, 15, 12, 15, 3], [855, 463, 15, 12, 15, 3], [855, 514, 15, 12, 15, 3], [855, 565, 15, 12, 15, 3], [855, 616, 15, 12, 15, 3], [855, 667, 15, 12, 15, 3], [855, 718, 15, 12, 15, 3], [855, 769, 15, 12, 15, 3]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 8, 6, 8, 6], [1, 55, 10, 9, 10, 3], [1, 106, 11, 9, 11, 3], [1, 156, 14, 10, 14, 2], [1, 207, 11, 11, 11, 2], [1, 258, 15, 10, 15, 2], [1, 310, 14, 9, 14, 3], [1, 361, 7, 9, 7, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 514, 11, 9, 11, 3], [1, 567, 11, 7, 11, 5], [1, 619, 8, 8, 8, 6], [1, 670, 11, 6, 11, 6], [1, 721, 8, 6, 8, 6], [1, 768, 11, 10, 11, 2], [62, 4, 12, 9, 12, 3], [62, 55, 12, 9, 12, 3], [62, 106, 12, 9, 12, 3], [62, 157, 12, 9, 12, 3], [62, 208, 12, 9, 12, 3], [62, 259, 12, 9, 12, 3], [62, 310, 12, 9, 12, 3], [62, 361, 12, 9, 12, 3], [62, 412, 12, 9, 12, 3], [62, 463, 12, 9, 12, 3], [62, 516, 8, 7, 8, 5], [62, 567, 8, 9, 8, 5], [62, 617, 10, 8, 10, 4], [62, 670, 12, 6, 12, 6], [62, 719, 10, 8, 10, 4], [62, 769, 12, 9, 12, 3], [123, 5, 15, 8, 15, 4], [123, 55, 12, 9, 12, 3], [123, 106, 12, 9, 12, 3], [123, 157, 12, 9, 12, 3], [123, 208, 12, 9, 12, 3], [123, 259, 11, 9, 11, 3], [123, 310, 11, 9, 11, 3], [123, 361, 12, 9, 12, 3], [123, 412, 12, 9, 12, 3], [123, 463, 10, 9, 10, 3], [123, 514, 11, 9, 11, 3], [123, 565, 13, 9, 13, 3], [123, 616, 11, 9, 11, 3], [123, 667, 16, 9, 16, 3], [123, 718, 13, 9, 13, 3], [123, 769, 12, 9, 12, 3], [184, 4, 12, 9, 12, 3], [184, 55, 12, 10, 12, 3], [184, 106, 12, 9, 12, 3], [184, 157, 11, 9, 11, 3], [184, 208, 10, 9, 10, 3], [184, 259, 12, 9, 12, 3], [184, 310, 12, 9, 12, 3], [184, 361, 16, 9, 16, 3], [184, 412, 12, 9, 12, 3], [184, 463, 12, 9, 12, 3], [184, 514, 12, 9, 12, 3], [184, 564, 9, 11, 9, 2], [184, 615, 11, 10, 11, 2], [184, 666, 9, 11, 9, 2], [184, 718, 12, 9, 12, 3], [184, 772, 12, 6, 12, 6], [245, 3, 10, 10, 10, 2], [245, 57, 12, 7, 12, 5], [245, 106, 12, 9, 12, 3], [245, 159, 11, 7, 11, 5], [245, 208, 12, 9, 12, 3], [245, 261, 12, 7, 12, 5], [245, 310, 10, 9, 10, 3], [245, 363, 12, 10, 12, 5], [245, 412, 12, 9, 12, 3], [245, 463, 8, 9, 8, 3], [245, 514, 10, 12, 10, 3], [245, 565, 12, 9, 12, 3], [245, 616, 8, 9, 8, 3], [245, 669, 16, 7, 16, 5], [245, 720, 12, 7, 12, 5], [245, 771, 12, 7, 12, 5], [306, 6, 12, 9, 12, 5], [306, 57, 12, 9, 12, 5], [306, 108, 10, 7, 10, 5], [306, 159, 11, 7, 11, 5], [306, 208, 10, 9, 10, 3], [306, 261, 12, 7, 12, 5], [306, 312, 12, 7, 12, 5], [306, 363, 16, 7, 16, 5], [306, 414, 12, 7, 12, 5], [306, 465, 12, 10, 12, 5], [306, 516, 12, 7, 12, 5], [306, 564, 9, 11, 9, 2], [306, 615, 9, 11, 9, 2], [306, 666, 9, 11, 9, 2], [306, 720, 12, 7, 12, 5], [306, 772, 12, 6, 12, 6], [367, 2, 12, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 106, 12, 12, 12, 3], [367, 154, 11, 12, 11, 0], [367, 205, 13, 12, 13, 0], [367, 257, 12, 11, 12, 1], [367, 308, 12, 11, 12, 1], [367, 360, 12, 10, 12, 2], [367, 411, 12, 10, 12, 2], [367, 462, 12, 10, 12, 2], [367, 514, 12, 9, 12, 3], [367, 564, 12, 10, 12, 2], [367, 613, 12, 12, 12, 0], [367, 669, 12, 10, 12, 5], [367, 717, 12, 10, 12, 2], [367, 768, 12, 10, 12, 2], [428, 3, 12, 10, 12, 2], [428, 55, 12, 9, 12, 3], [428, 105, 10, 10, 10, 2], [428, 156, 10, 10, 10, 2], [428, 207, 10, 10, 10, 2], [428, 259, 10, 9, 10, 3], [428, 309, 12, 10, 12, 2], [428, 360, 12, 10, 12, 2], [428, 411, 12, 10, 12, 2], [428, 462, 12, 10, 12, 2], [428, 514, 12, 9, 12, 3], [428, 564, 12, 10, 12, 2], [428, 615, 12, 10, 12, 2], [428, 666, 12, 10, 12, 2], [428, 717, 12, 10, 12, 2], [428, 769, 12, 9, 12, 3], [489, 4, 9, 9, 9, 3], [489, 55, 10, 9, 10, 3], [489, 105, 11, 10, 11, 2], [489, 157, 13, 9, 13, 3], [489, 207, 11, 12, 11, 2], [489, 261, 11, 7, 11, 5], [489, 310, 13, 9, 13, 3], [489, 361, 13, 9, 13, 3], [489, 412, 14, 9, 14, 3], [489, 463, 14, 9, 14, 3], [489, 514, 15, 9, 15, 3], [489, 565, 9, 9, 9, 3], [489, 616, 10, 9, 10, 3], [489, 669, 13, 7, 13, 5], [489, 718, 15, 9, 15, 3], [489, 769, 13, 9, 13, 3], [550, 6, 18, 7, 18, 5], [550, 57, 11, 7, 11, 5], [550, 108, 10, 7, 10, 5], [550, 159, 10, 7, 10, 5], [550, 208, 14, 9, 14, 3], [550, 261, 14, 9, 14, 5], [550, 311, 12, 8, 12, 4], [550, 361, 13, 9, 13, 3], [550, 412, 14, 9, 14, 3], [550, 464, 15, 8, 15, 4], [550, 514, 10, 11, 10, 3], [550, 565, 11, 9, 11, 3], [550, 616, 11, 9, 11, 3], [550, 667, 14, 9, 14, 3], [550, 720, 16, 7, 16, 5], [550, 771, 12, 7, 12, 5], [611, 4, 12, 9, 12, 3], [611, 55, 10, 9, 10, 3], [611, 109, 11, 6, 11, 6], [611, 156, 16, 10, 16, 2], [611, 208, 10, 11, 10, 3], [611, 261, 14, 7, 14, 5], [611, 311, 13, 8, 13, 4], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 466, 18, 6, 18, 6], [611, 517, 12, 6, 12, 6], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 12, 12, 12, 0], [611, 718, 15, 9, 15, 3], [611, 771, 16, 7, 16, 5], [672, 7, 10, 6, 10, 6], [672, 58, 14, 6, 14, 6], [672, 106, 11, 9, 11, 3], [672, 157, 11, 9, 11, 3], [672, 208, 8, 9, 8, 3], [672, 259, 8, 9, 8, 3], [672, 312, 11, 7, 11, 5], [672, 362, 13, 8, 13, 4], [672, 412, 12, 12, 12, 3], [1, 7, 8, 6, 8, 6], [794, 769, 14, 10, 14, 3], [672, 565, 14, 10, 14, 3], [672, 616, 14, 10, 14, 3], [672, 667, 14, 10, 14, 3], [672, 718, 14, 10, 14, 3], [672, 769, 14, 10, 14, 3], [733, 4, 14, 10, 14, 3], [733, 55, 14, 10, 14, 3], [733, 106, 14, 10, 14, 3], [733, 157, 14, 10, 14, 3], [733, 208, 14, 10, 14, 3], [733, 259, 14, 10, 14, 3], [733, 310, 14, 10, 14, 3], [733, 361, 14, 10, 14, 3], [733, 412, 14, 10, 14, 3], [733, 463, 14, 10, 14, 3], [733, 514, 14, 10, 14, 3], [733, 565, 14, 10, 14, 3], [733, 616, 14, 10, 14, 3], [733, 667, 14, 10, 14, 3], [733, 718, 14, 10, 14, 3], [733, 769, 14, 10, 14, 3], [1, 7, 8, 6, 8, 6], [794, 55, 14, 10, 14, 3], [794, 106, 14, 10, 14, 3], [794, 157, 14, 10, 14, 3], [794, 208, 14, 10, 14, 3], [794, 259, 14, 10, 14, 3], [794, 310, 14, 10, 14, 3], [794, 361, 14, 10, 14, 3], [794, 412, 14, 10, 14, 3], [794, 463, 14, 10, 14, 3], [794, 514, 14, 10, 14, 3], [794, 565, 14, 10, 14, 3], [794, 616, 14, 10, 14, 3], [794, 667, 14, 10, 14, 3], [794, 718, 14, 10, 14, 3], [794, 769, 14, 10, 14, 3], [855, 4, 14, 10, 14, 3], [855, 55, 14, 10, 14, 3], [855, 106, 14, 10, 14, 3], [855, 157, 14, 10, 14, 3], [855, 208, 14, 10, 14, 3], [855, 259, 14, 10, 14, 3], [855, 310, 14, 10, 14, 3], [855, 361, 14, 10, 14, 3], [855, 412, 14, 10, 14, 3], [855, 463, 14, 10, 14, 3], [855, 514, 14, 10, 14, 3], [855, 565, 14, 10, 14, 3], [855, 616, 14, 10, 14, 3], [855, 667, 14, 10, 14, 3], [855, 718, 14, 10, 14, 3], [855, 769, 14, 10, 14, 3]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 13, 11, 10, 3], [1, 106, 14, 5, 11, 3], [1, 156, 18, 10, 14, 2], [1, 207, 15, 13, 11, 2], [1, 258, 18, 12, 15, 2], [1, 310, 17, 11, 14, 3], [1, 361, 11, 5, 7, 3], [1, 411, 14, 13, 9, 2], [1, 462, 13, 13, 9, 2], [1, 514, 15, 7, 11, 3], [1, 567, 13, 7, 11, 5], [1, 623, 9, 6, 8, 10], [1, 671, 13, 3, 11, 7], [1, 725, 9, 4, 8, 10], [1, 768, 16, 12, 11, 2], [62, 4, 16, 11, 12, 3], [62, 55, 14, 11, 12, 3], [62, 106, 16, 11, 12, 3], [62, 157, 16, 11, 12, 3], [62, 208, 16, 11, 12, 3], [62, 259, 16, 11, 12, 3], [62, 310, 15, 11, 12, 3], [62, 361, 16, 11, 12, 3], [62, 412, 16, 11, 12, 3], [62, 463, 16, 11, 12, 3], [62, 516, 11, 9, 8, 5], [62, 567, 11, 11, 8, 5], [62, 617, 14, 9, 10, 4], [62, 670, 15, 5, 12, 6], [62, 719, 12, 9, 10, 4], [62, 769, 16, 11, 12, 3], [123, 5, 18, 10, 15, 4], [123, 55, 16, 11, 12, 3], [123, 106, 16, 11, 12, 3], [123, 157, 16, 11, 12, 3], [123, 208, 16, 11, 12, 3], [123, 259, 15, 11, 11, 3], [123, 310, 15, 11, 11, 3], [123, 361, 16, 11, 12, 3], [123, 412, 16, 11, 12, 3], [123, 463, 13, 11, 10, 3], [123, 514, 15, 11, 11, 3], [123, 565, 17, 11, 13, 3], [123, 616, 12, 11, 11, 3], [123, 667, 20, 11, 16, 3], [123, 718, 17, 11, 13, 3], [123, 769, 16, 11, 12, 3], [184, 4, 16, 11, 12, 3], [184, 55, 16, 12, 12, 3], [184, 106, 16, 11, 12, 3], [184, 157, 15, 11, 11, 3], [184, 208, 15, 11, 10, 3], [184, 259, 16, 11, 12, 3], [184, 310, 16, 11, 12, 3], [184, 361, 20, 11, 16, 3], [184, 412, 16, 11, 12, 3], [184, 463, 16, 11, 12, 3], [184, 514, 16, 11, 12, 3], [184, 564, 14, 13, 9, 2], [184, 615, 12, 12, 11, 2], [184, 666, 14, 13, 9, 2], [184, 718, 15, 5, 12, 3], [184, 777, 13, 3, 12, 11], [245, 3, 13, 5, 10, 2], [245, 57, 15, 9, 12, 5], [245, 106, 15, 11, 12, 3], [245, 159, 14, 9, 11, 5], [245, 208, 16, 11, 12, 3], [245, 261, 15, 9, 12, 5], [245, 310, 15, 11, 10, 3], [245, 363, 15, 12, 12, 5], [245, 412, 15, 11, 12, 3], [245, 463, 12, 11, 8, 3], [245, 514, 14, 14, 10, 3], [245, 565, 15, 11, 12, 3], [245, 616, 12, 11, 8, 3], [245, 669, 19, 9, 16, 5], [245, 720, 15, 9, 12, 5], [245, 771, 15, 9, 12, 5], [306, 6, 15, 11, 12, 5], [306, 57, 15, 11, 12, 5], [306, 108, 14, 9, 10, 5], [306, 159, 14, 9, 11, 5], [306, 208, 13, 11, 10, 3], [306, 261, 15, 9, 12, 5], [306, 312, 15, 9, 12, 5], [306, 363, 19, 9, 16, 5], [306, 414, 15, 9, 12, 5], [306, 465, 15, 12, 12, 5], [306, 516, 15, 9, 12, 5], [306, 564, 14, 13, 9, 2], [306, 615, 13, 13, 9, 2], [306, 666, 12, 13, 9, 2], [306, 720, 15, 4, 12, 5], [306, 766, 1, 1, 12, 1], [367, 2, 16, 13, 12, 1], [367, 52, 16, 14, 12, 0], [367, 106, 16, 14, 12, 3], [367, 154, 16, 14, 11, 0], [367, 205, 18, 14, 13, 0], [367, 257, 16, 13, 12, 1], [367, 308, 16, 13, 12, 1], [367, 360, 15, 12, 12, 2], [367, 411, 15, 12, 12, 2], [367, 462, 15, 12, 12, 2], [367, 514, 15, 11, 12, 3], [367, 564, 17, 12, 12, 2], [367, 613, 16, 14, 12, 0], [367, 669, 15, 12, 12, 5], [367, 717, 15, 12, 12, 2], [367, 768, 15, 12, 12, 2], [428, 3, 15, 12, 12, 2], [428, 55, 15, 11, 12, 3], [428, 105, 14, 12, 10, 2], [428, 156, 13, 12, 10, 2], [428, 207, 14, 12, 10, 2], [428, 259, 14, 11, 10, 3], [428, 309, 17, 12, 12, 2], [428, 360, 15, 12, 12, 2], [428, 411, 15, 12, 12, 2], [428, 462, 15, 12, 12, 2], [428, 514, 15, 11, 12, 3], [428, 564, 17, 12, 12, 2], [428, 615, 15, 12, 12, 2], [428, 666, 15, 12, 12, 2], [428, 717, 15, 12, 12, 2], [428, 769, 15, 11, 12, 3], [489, 4, 13, 7, 9, 3], [489, 55, 14, 6, 10, 3], [489, 105, 15, 10, 11, 2], [489, 157, 16, 11, 13, 3], [489, 207, 15, 14, 11, 2], [489, 261, 14, 7, 11, 5], [489, 310, 17, 11, 13, 3], [489, 361, 17, 11, 13, 3], [489, 412, 17, 11, 14, 3], [489, 463, 17, 11, 14, 3], [489, 514, 19, 6, 15, 3], [489, 565, 13, 5, 9, 3], [489, 616, 14, 3, 10, 3], [489, 669, 16, 7, 13, 5], [489, 718, 19, 11, 15, 3], [489, 769, 18, 11, 13, 3], [550, 6, 21, 7, 18, 5], [550, 57, 13, 9, 11, 5], [550, 108, 12, 9, 10, 5], [550, 159, 12, 9, 10, 5], [550, 208, 18, 11, 14, 3], [550, 261, 16, 11, 14, 5], [550, 311, 15, 10, 12, 4], [550, 361, 17, 11, 13, 3], [550, 412, 18, 11, 14, 3], [550, 464, 19, 10, 15, 4], [550, 514, 14, 13, 10, 3], [550, 565, 15, 10, 11, 3], [550, 616, 15, 10, 11, 3], [550, 667, 17, 11, 14, 3], [550, 720, 19, 9, 16, 5], [550, 771, 16, 9, 12, 5], [611, 4, 14, 11, 12, 3], [611, 55, 13, 11, 10, 3], [611, 110, 13, 5, 11, 7], [611, 156, 21, 12, 16, 2], [611, 208, 14, 13, 10, 3], [611, 261, 16, 7, 14, 5], [611, 311, 14, 10, 13, 4], [611, 363, 16, 9, 13, 5], [611, 414, 15, 9, 13, 5], [611, 470, 18, 4, 18, 10], [611, 511, 1, 1, 12, 1], [611, 562, 16, 14, 12, 0], [611, 613, 17, 14, 12, 0], [611, 664, 17, 14, 12, 0], [611, 718, 19, 11, 15, 3], [611, 771, 19, 9, 16, 5], [672, 8, 12, 3, 10, 7], [672, 59, 16, 3, 14, 7], [672, 106, 15, 6, 11, 3], [672, 157, 15, 6, 11, 3], [672, 208, 12, 6, 8, 3], [672, 259, 12, 6, 8, 3], [672, 312, 13, 7, 11, 5], [672, 362, 15, 9, 13, 4], [672, 412, 15, 14, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 18, 12, 14, 3], [672, 565, 18, 12, 14, 3], [672, 616, 18, 12, 14, 3], [672, 667, 18, 12, 14, 3], [672, 718, 18, 12, 14, 3], [672, 769, 18, 12, 14, 3], [733, 4, 18, 12, 14, 3], [733, 55, 18, 12, 14, 3], [733, 106, 18, 12, 14, 3], [733, 157, 18, 12, 14, 3], [733, 208, 18, 12, 14, 3], [733, 259, 18, 12, 14, 3], [733, 310, 18, 12, 14, 3], [733, 361, 18, 12, 14, 3], [733, 412, 18, 12, 14, 3], [733, 463, 18, 12, 14, 3], [733, 514, 18, 12, 14, 3], [733, 565, 18, 12, 14, 3], [733, 616, 18, 12, 14, 3], [733, 667, 18, 12, 14, 3], [733, 718, 18, 12, 14, 3], [733, 769, 18, 12, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 18, 12, 14, 3], [794, 106, 18, 12, 14, 3], [794, 157, 18, 12, 14, 3], [794, 208, 18, 12, 14, 3], [794, 259, 18, 12, 14, 3], [794, 310, 18, 12, 14, 3], [794, 361, 18, 12, 14, 3], [794, 412, 18, 12, 14, 3], [794, 463, 18, 12, 14, 3], [794, 514, 18, 12, 14, 3], [794, 565, 18, 12, 14, 3], [794, 616, 18, 12, 14, 3], [794, 667, 18, 12, 14, 3], [794, 718, 18, 12, 14, 3], [794, 769, 18, 12, 14, 3], [855, 4, 18, 12, 14, 3], [855, 55, 18, 12, 14, 3], [855, 106, 18, 12, 14, 3], [855, 157, 18, 12, 14, 3], [855, 208, 18, 12, 14, 3], [855, 259, 18, 12, 14, 3], [855, 310, 18, 12, 14, 3], [855, 361, 18, 12, 14, 3], [855, 412, 18, 12, 14, 3], [855, 463, 18, 12, 14, 3], [855, 514, 18, 12, 14, 3], [855, 565, 18, 12, 14, 3], [855, 616, 18, 12, 14, 3], [855, 667, 18, 12, 14, 3], [855, 718, 18, 12, 14, 3], [855, 769, 18, 12, 14, 3]], \"capHeight\": 13, \"widestlogicalchar\": 18, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 12, 9, 9, 3], [1, 106, 13, 3, 10, 3], [1, 156, 17, 8, 13, 2], [1, 207, 14, 11, 10, 2], [1, 258, 17, 10, 14, 2], [1, 310, 16, 9, 13, 3], [1, 361, 10, 3, 6, 3], [1, 411, 13, 11, 8, 2], [1, 462, 12, 11, 8, 2], [1, 514, 14, 5, 10, 3], [1, 567, 12, 5, 10, 5], [1, 623, 8, 4, 7, 10], [1, 671, 12, 1, 10, 7], [1, 725, 8, 2, 7, 10], [1, 768, 15, 10, 10, 2], [62, 4, 15, 9, 11, 3], [62, 55, 13, 9, 11, 3], [62, 106, 15, 9, 11, 3], [62, 157, 15, 9, 11, 3], [62, 208, 15, 9, 11, 3], [62, 259, 15, 9, 11, 3], [62, 310, 14, 9, 11, 3], [62, 361, 15, 9, 11, 3], [62, 412, 15, 9, 11, 3], [62, 463, 15, 9, 11, 3], [62, 516, 10, 7, 7, 5], [62, 567, 10, 9, 7, 5], [62, 617, 13, 7, 9, 4], [62, 670, 14, 3, 11, 6], [62, 719, 11, 7, 9, 4], [62, 769, 15, 9, 11, 3], [123, 5, 17, 8, 14, 4], [123, 55, 15, 9, 11, 3], [123, 106, 15, 9, 11, 3], [123, 157, 15, 9, 11, 3], [123, 208, 15, 9, 11, 3], [123, 259, 14, 9, 10, 3], [123, 310, 14, 9, 10, 3], [123, 361, 15, 9, 11, 3], [123, 412, 15, 9, 11, 3], [123, 463, 12, 9, 9, 3], [123, 514, 14, 9, 10, 3], [123, 565, 16, 9, 12, 3], [123, 616, 11, 9, 10, 3], [123, 667, 19, 9, 15, 3], [123, 718, 16, 9, 12, 3], [123, 769, 15, 9, 11, 3], [184, 4, 15, 9, 11, 3], [184, 55, 15, 10, 11, 3], [184, 106, 15, 9, 11, 3], [184, 157, 14, 9, 10, 3], [184, 208, 14, 9, 9, 3], [184, 259, 15, 9, 11, 3], [184, 310, 15, 9, 11, 3], [184, 361, 19, 9, 15, 3], [184, 412, 15, 9, 11, 3], [184, 463, 15, 9, 11, 3], [184, 514, 15, 9, 11, 3], [184, 564, 13, 11, 8, 2], [184, 615, 11, 10, 10, 2], [184, 666, 13, 11, 8, 2], [184, 718, 14, 3, 11, 3], [184, 777, 12, 1, 11, 11], [245, 3, 12, 3, 9, 2], [245, 57, 14, 7, 11, 5], [245, 106, 14, 9, 11, 3], [245, 159, 13, 7, 10, 5], [245, 208, 15, 9, 11, 3], [245, 261, 14, 7, 11, 5], [245, 310, 14, 9, 9, 3], [245, 363, 14, 10, 11, 5], [245, 412, 14, 9, 11, 3], [245, 463, 11, 9, 7, 3], [245, 514, 13, 12, 9, 3], [245, 565, 14, 9, 11, 3], [245, 616, 11, 9, 7, 3], [245, 669, 18, 7, 15, 5], [245, 720, 14, 7, 11, 5], [245, 771, 14, 7, 11, 5], [306, 6, 14, 9, 11, 5], [306, 57, 14, 9, 11, 5], [306, 108, 13, 7, 9, 5], [306, 159, 13, 7, 10, 5], [306, 208, 12, 9, 9, 3], [306, 261, 14, 7, 11, 5], [306, 312, 14, 7, 11, 5], [306, 363, 18, 7, 15, 5], [306, 414, 14, 7, 11, 5], [306, 465, 14, 10, 11, 5], [306, 516, 14, 7, 11, 5], [306, 564, 13, 11, 8, 2], [306, 615, 12, 11, 8, 2], [306, 666, 11, 11, 8, 2], [306, 720, 14, 2, 11, 5], [306, 766, 1, 1, 11, 1], [367, 2, 15, 11, 11, 1], [367, 52, 15, 12, 11, 0], [367, 106, 15, 12, 11, 3], [367, 154, 14, 12, 10, 0], [367, 205, 16, 12, 12, 0], [367, 257, 15, 11, 11, 1], [367, 308, 15, 11, 11, 1], [367, 360, 14, 10, 11, 2], [367, 411, 14, 10, 11, 2], [367, 462, 14, 10, 11, 2], [367, 514, 14, 9, 11, 3], [367, 564, 16, 10, 11, 2], [367, 613, 15, 12, 11, 0], [367, 669, 14, 10, 11, 5], [367, 717, 14, 10, 11, 2], [367, 768, 14, 10, 11, 2], [428, 3, 14, 10, 11, 2], [428, 55, 14, 9, 11, 3], [428, 105, 13, 10, 9, 2], [428, 156, 12, 10, 9, 2], [428, 207, 13, 10, 9, 2], [428, 259, 13, 9, 9, 3], [428, 309, 16, 10, 11, 2], [428, 360, 14, 10, 11, 2], [428, 411, 14, 10, 11, 2], [428, 462, 14, 10, 11, 2], [428, 514, 14, 9, 11, 3], [428, 564, 16, 10, 11, 2], [428, 615, 14, 10, 11, 2], [428, 666, 14, 10, 11, 2], [428, 717, 14, 10, 11, 2], [428, 769, 14, 9, 11, 3], [489, 4, 12, 5, 8, 3], [489, 55, 13, 4, 9, 3], [489, 105, 14, 8, 10, 2], [489, 157, 15, 9, 12, 3], [489, 207, 14, 12, 10, 2], [489, 261, 13, 5, 10, 5], [489, 310, 16, 9, 12, 3], [489, 361, 16, 9, 12, 3], [489, 412, 16, 9, 13, 3], [489, 463, 16, 9, 13, 3], [489, 514, 18, 4, 14, 3], [489, 565, 12, 3, 8, 3], [489, 616, 13, 1, 9, 3], [489, 669, 15, 5, 12, 5], [489, 718, 18, 9, 14, 3], [489, 769, 17, 9, 12, 3], [550, 6, 20, 5, 17, 5], [550, 57, 12, 7, 10, 5], [550, 108, 11, 7, 9, 5], [550, 159, 11, 7, 9, 5], [550, 208, 17, 9, 13, 3], [550, 261, 15, 9, 13, 5], [550, 311, 14, 8, 11, 4], [550, 361, 16, 9, 12, 3], [550, 412, 17, 9, 13, 3], [550, 464, 18, 8, 14, 4], [550, 514, 13, 11, 9, 3], [550, 565, 14, 8, 10, 3], [550, 616, 14, 8, 10, 3], [550, 667, 16, 9, 13, 3], [550, 720, 18, 7, 15, 5], [550, 771, 15, 7, 11, 5], [611, 4, 13, 9, 11, 3], [611, 55, 12, 9, 9, 3], [611, 110, 12, 3, 10, 7], [611, 156, 20, 10, 15, 2], [611, 208, 13, 11, 9, 3], [611, 261, 15, 5, 13, 5], [611, 311, 13, 8, 12, 4], [611, 363, 15, 7, 12, 5], [611, 414, 14, 7, 12, 5], [611, 470, 17, 2, 17, 10], [611, 511, 1, 1, 11, 1], [611, 562, 15, 12, 11, 0], [611, 613, 15, 12, 11, 0], [611, 664, 15, 12, 11, 0], [611, 718, 18, 9, 14, 3], [611, 771, 18, 7, 15, 5], [672, 8, 11, 1, 9, 7], [672, 59, 15, 1, 13, 7], [672, 106, 14, 4, 10, 3], [672, 157, 14, 4, 10, 3], [672, 208, 11, 4, 7, 3], [672, 259, 11, 4, 7, 3], [672, 312, 12, 5, 10, 5], [672, 362, 14, 7, 12, 4], [672, 412, 14, 12, 11, 3], [1, 1, 1, 1, 7, 1], [794, 769, 17, 10, 13, 3], [672, 565, 17, 10, 13, 3], [672, 616, 17, 10, 13, 3], [672, 667, 17, 10, 13, 3], [672, 718, 17, 10, 13, 3], [672, 769, 17, 10, 13, 3], [733, 4, 17, 10, 13, 3], [733, 55, 17, 10, 13, 3], [733, 106, 17, 10, 13, 3], [733, 157, 17, 10, 13, 3], [733, 208, 17, 10, 13, 3], [733, 259, 17, 10, 13, 3], [733, 310, 17, 10, 13, 3], [733, 361, 17, 10, 13, 3], [733, 412, 17, 10, 13, 3], [733, 463, 17, 10, 13, 3], [733, 514, 17, 10, 13, 3], [733, 565, 17, 10, 13, 3], [733, 616, 17, 10, 13, 3], [733, 667, 17, 10, 13, 3], [733, 718, 17, 10, 13, 3], [733, 769, 17, 10, 13, 3], [1, 1, 1, 1, 7, 1], [794, 55, 17, 10, 13, 3], [794, 106, 17, 10, 13, 3], [794, 157, 17, 10, 13, 3], [794, 208, 17, 10, 13, 3], [794, 259, 17, 10, 13, 3], [794, 310, 17, 10, 13, 3], [794, 361, 17, 10, 13, 3], [794, 412, 17, 10, 13, 3], [794, 463, 17, 10, 13, 3], [794, 514, 17, 10, 13, 3], [794, 565, 17, 10, 13, 3], [794, 616, 17, 10, 13, 3], [794, 667, 17, 10, 13, 3], [794, 718, 17, 10, 13, 3], [794, 769, 17, 10, 13, 3], [855, 4, 17, 10, 13, 3], [855, 55, 17, 10, 13, 3], [855, 106, 17, 10, 13, 3], [855, 157, 17, 10, 13, 3], [855, 208, 17, 10, 13, 3], [855, 259, 17, 10, 13, 3], [855, 310, 17, 10, 13, 3], [855, 361, 17, 10, 13, 3], [855, 412, 17, 10, 13, 3], [855, 463, 17, 10, 13, 3], [855, 514, 17, 10, 13, 3], [855, 565, 17, 10, 13, 3], [855, 616, 17, 10, 13, 3], [855, 667, 17, 10, 13, 3], [855, 718, 17, 10, 13, 3], [855, 769, 17, 10, 13, 3]], \"capHeight\": 12, \"widestlogicalchar\": 17, \"widestglyph\": 20, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 55, 10, 11, 10, 3], [1, 106, 11, 10, 11, 3], [1, 156, 14, 11, 14, 2], [1, 207, 11, 13, 11, 2], [1, 258, 15, 12, 15, 2], [1, 310, 14, 11, 14, 3], [1, 361, 7, 10, 7, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 514, 11, 10, 11, 3], [1, 567, 11, 8, 11, 5], [1, 620, 8, 9, 8, 7], [1, 671, 11, 6, 11, 7], [1, 722, 8, 7, 8, 7], [1, 768, 11, 12, 11, 2], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 516, 8, 9, 8, 5], [62, 567, 8, 11, 8, 5], [62, 617, 10, 9, 10, 4], [62, 670, 12, 7, 12, 6], [62, 719, 10, 9, 10, 4], [62, 769, 12, 11, 12, 3], [123, 5, 15, 10, 15, 4], [123, 55, 12, 11, 12, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 12, 11, 12, 3], [123, 412, 12, 11, 12, 3], [123, 463, 10, 11, 10, 3], [123, 514, 11, 11, 11, 3], [123, 565, 13, 11, 13, 3], [123, 616, 11, 11, 11, 3], [123, 667, 16, 11, 16, 3], [123, 718, 13, 11, 13, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 12, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 11, 11, 11, 3], [184, 208, 10, 11, 10, 3], [184, 259, 12, 11, 12, 3], [184, 310, 12, 11, 12, 3], [184, 361, 16, 11, 16, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 12, 11, 12, 3], [184, 564, 9, 13, 9, 2], [184, 615, 11, 12, 11, 2], [184, 666, 9, 13, 9, 2], [184, 718, 12, 10, 12, 3], [184, 773, 12, 7, 12, 7], [245, 3, 10, 11, 10, 2], [245, 57, 12, 9, 12, 5], [245, 106, 12, 11, 12, 3], [245, 159, 11, 9, 11, 5], [245, 208, 12, 11, 12, 3], [245, 261, 12, 9, 12, 5], [245, 310, 10, 11, 10, 3], [245, 363, 12, 12, 12, 5], [245, 412, 12, 11, 12, 3], [245, 463, 8, 11, 8, 3], [245, 514, 10, 14, 10, 3], [245, 565, 12, 11, 12, 3], [245, 616, 8, 11, 8, 3], [245, 669, 16, 9, 16, 5], [245, 720, 12, 9, 12, 5], [245, 771, 12, 9, 12, 5], [306, 6, 12, 11, 12, 5], [306, 57, 12, 11, 12, 5], [306, 108, 10, 9, 10, 5], [306, 159, 11, 9, 11, 5], [306, 208, 10, 11, 10, 3], [306, 261, 12, 9, 12, 5], [306, 312, 12, 9, 12, 5], [306, 363, 16, 9, 16, 5], [306, 414, 12, 9, 12, 5], [306, 465, 12, 12, 12, 5], [306, 516, 12, 9, 12, 5], [306, 564, 9, 13, 9, 2], [306, 615, 9, 13, 9, 2], [306, 666, 9, 13, 9, 2], [306, 720, 12, 8, 12, 5], [306, 773, 12, 6, 12, 7], [367, 2, 12, 13, 12, 1], [367, 52, 12, 14, 12, 0], [367, 106, 12, 14, 12, 3], [367, 154, 11, 14, 11, 0], [367, 205, 13, 14, 13, 0], [367, 257, 12, 13, 12, 1], [367, 308, 12, 13, 12, 1], [367, 360, 12, 12, 12, 2], [367, 411, 12, 12, 12, 2], [367, 462, 12, 12, 12, 2], [367, 514, 12, 11, 12, 3], [367, 564, 12, 12, 12, 2], [367, 613, 12, 14, 12, 0], [367, 669, 12, 12, 12, 5], [367, 717, 12, 12, 12, 2], [367, 768, 12, 12, 12, 2], [428, 3, 12, 12, 12, 2], [428, 55, 12, 11, 12, 3], [428, 105, 10, 12, 10, 2], [428, 156, 10, 12, 10, 2], [428, 207, 10, 12, 10, 2], [428, 259, 10, 11, 10, 3], [428, 309, 12, 12, 12, 2], [428, 360, 12, 12, 12, 2], [428, 411, 12, 12, 12, 2], [428, 462, 12, 12, 12, 2], [428, 514, 12, 11, 12, 3], [428, 564, 12, 12, 12, 2], [428, 615, 12, 12, 12, 2], [428, 666, 12, 12, 12, 2], [428, 717, 12, 12, 12, 2], [428, 769, 12, 11, 12, 3], [489, 4, 9, 10, 9, 3], [489, 55, 10, 10, 10, 3], [489, 105, 11, 11, 11, 2], [489, 157, 13, 11, 13, 3], [489, 207, 11, 14, 11, 2], [489, 261, 11, 8, 11, 5], [489, 310, 13, 11, 13, 3], [489, 361, 13, 11, 13, 3], [489, 412, 14, 11, 14, 3], [489, 463, 14, 11, 14, 3], [489, 514, 15, 10, 15, 3], [489, 565, 9, 10, 9, 3], [489, 616, 10, 10, 10, 3], [489, 669, 13, 8, 13, 5], [489, 718, 15, 11, 15, 3], [489, 769, 13, 11, 13, 3], [550, 6, 18, 8, 18, 5], [550, 57, 11, 9, 11, 5], [550, 108, 10, 9, 10, 5], [550, 159, 10, 9, 10, 5], [550, 208, 14, 11, 14, 3], [550, 261, 14, 11, 14, 5], [550, 311, 12, 10, 12, 4], [550, 361, 13, 11, 13, 3], [550, 412, 14, 11, 14, 3], [550, 464, 15, 10, 15, 4], [550, 514, 10, 13, 10, 3], [550, 565, 11, 10, 11, 3], [550, 616, 11, 10, 11, 3], [550, 667, 14, 11, 14, 3], [550, 720, 16, 9, 16, 5], [550, 771, 12, 9, 12, 5], [611, 4, 12, 11, 12, 3], [611, 55, 10, 11, 10, 3], [611, 110, 11, 6, 11, 7], [611, 156, 16, 12, 16, 2], [611, 208, 10, 13, 10, 3], [611, 261, 14, 8, 14, 5], [611, 311, 13, 10, 13, 4], [611, 363, 13, 9, 13, 5], [611, 414, 13, 9, 13, 5], [611, 467, 18, 7, 18, 7], [611, 518, 12, 6, 12, 7], [611, 562, 12, 14, 12, 0], [611, 613, 12, 14, 12, 0], [611, 664, 12, 14, 12, 0], [611, 718, 15, 11, 15, 3], [611, 771, 16, 9, 16, 5], [672, 8, 10, 6, 10, 7], [672, 59, 14, 6, 14, 7], [672, 106, 11, 10, 11, 3], [672, 157, 11, 10, 11, 3], [672, 208, 8, 10, 8, 3], [672, 259, 8, 10, 8, 3], [672, 312, 11, 8, 11, 5], [672, 362, 13, 9, 13, 4], [672, 412, 12, 14, 12, 3], [1, 8, 8, 6, 8, 7], [794, 769, 14, 12, 14, 3], [672, 565, 14, 12, 14, 3], [672, 616, 14, 12, 14, 3], [672, 667, 14, 12, 14, 3], [672, 718, 14, 12, 14, 3], [672, 769, 14, 12, 14, 3], [733, 4, 14, 12, 14, 3], [733, 55, 14, 12, 14, 3], [733, 106, 14, 12, 14, 3], [733, 157, 14, 12, 14, 3], [733, 208, 14, 12, 14, 3], [733, 259, 14, 12, 14, 3], [733, 310, 14, 12, 14, 3], [733, 361, 14, 12, 14, 3], [733, 412, 14, 12, 14, 3], [733, 463, 14, 12, 14, 3], [733, 514, 14, 12, 14, 3], [733, 565, 14, 12, 14, 3], [733, 616, 14, 12, 14, 3], [733, 667, 14, 12, 14, 3], [733, 718, 14, 12, 14, 3], [733, 769, 14, 12, 14, 3], [1, 8, 8, 6, 8, 7], [794, 55, 14, 12, 14, 3], [794, 106, 14, 12, 14, 3], [794, 157, 14, 12, 14, 3], [794, 208, 14, 12, 14, 3], [794, 259, 14, 12, 14, 3], [794, 310, 14, 12, 14, 3], [794, 361, 14, 12, 14, 3], [794, 412, 14, 12, 14, 3], [794, 463, 14, 12, 14, 3], [794, 514, 14, 12, 14, 3], [794, 565, 14, 12, 14, 3], [794, 616, 14, 12, 14, 3], [794, 667, 14, 12, 14, 3], [794, 718, 14, 12, 14, 3], [794, 769, 14, 12, 14, 3], [855, 4, 14, 12, 14, 3], [855, 55, 14, 12, 14, 3], [855, 106, 14, 12, 14, 3], [855, 157, 14, 12, 14, 3], [855, 208, 14, 12, 14, 3], [855, 259, 14, 12, 14, 3], [855, 310, 14, 12, 14, 3], [855, 361, 14, 12, 14, 3], [855, 412, 14, 12, 14, 3], [855, 463, 14, 12, 14, 3], [855, 514, 14, 12, 14, 3], [855, 565, 14, 12, 14, 3], [855, 616, 14, 12, 14, 3], [855, 667, 14, 12, 14, 3], [855, 718, 14, 12, 14, 3], [855, 769, 14, 12, 14, 3]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biuos+dce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 55, 9, 9, 9, 3], [1, 106, 10, 9, 10, 3], [1, 156, 13, 10, 13, 2], [1, 207, 10, 11, 10, 2], [1, 258, 14, 10, 14, 2], [1, 310, 13, 9, 13, 3], [1, 361, 6, 9, 6, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 514, 10, 9, 10, 3], [1, 567, 10, 7, 10, 5], [1, 619, 7, 8, 7, 6], [1, 670, 10, 6, 10, 6], [1, 721, 7, 6, 7, 6], [1, 768, 10, 10, 10, 2], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 11, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 617, 9, 8, 9, 4], [62, 670, 11, 6, 11, 6], [62, 719, 9, 8, 9, 4], [62, 769, 11, 9, 11, 3], [123, 5, 14, 8, 14, 4], [123, 55, 11, 9, 11, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 9, 9, 9, 3], [123, 514, 10, 9, 10, 3], [123, 565, 12, 9, 12, 3], [123, 616, 10, 9, 10, 3], [123, 667, 15, 9, 15, 3], [123, 718, 12, 9, 12, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 10, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 10, 9, 10, 3], [184, 208, 9, 9, 9, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 15, 9, 15, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 11, 9, 11, 3], [184, 564, 8, 11, 8, 2], [184, 615, 10, 10, 10, 2], [184, 666, 8, 11, 8, 2], [184, 718, 11, 9, 11, 3], [184, 772, 11, 6, 11, 6], [245, 3, 9, 10, 9, 2], [245, 57, 11, 7, 11, 5], [245, 106, 11, 9, 11, 3], [245, 159, 10, 7, 10, 5], [245, 208, 11, 9, 11, 3], [245, 261, 11, 7, 11, 5], [245, 310, 9, 9, 9, 3], [245, 363, 11, 10, 11, 5], [245, 412, 11, 9, 11, 3], [245, 463, 7, 9, 7, 3], [245, 514, 9, 12, 9, 3], [245, 565, 11, 9, 11, 3], [245, 616, 7, 9, 7, 3], [245, 669, 15, 7, 15, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 9, 11, 5], [306, 57, 11, 9, 11, 5], [306, 108, 9, 7, 9, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 11, 7, 11, 5], [306, 312, 11, 7, 11, 5], [306, 363, 15, 7, 15, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 10, 11, 5], [306, 516, 11, 7, 11, 5], [306, 564, 8, 11, 8, 2], [306, 615, 8, 11, 8, 2], [306, 666, 8, 11, 8, 2], [306, 720, 11, 7, 11, 5], [306, 772, 11, 6, 11, 6], [367, 2, 11, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 106, 11, 12, 11, 3], [367, 154, 10, 12, 10, 0], [367, 205, 12, 12, 12, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 462, 11, 10, 11, 2], [367, 514, 11, 9, 11, 3], [367, 564, 11, 10, 11, 2], [367, 613, 11, 12, 11, 0], [367, 669, 11, 10, 11, 5], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 3, 11, 10, 11, 2], [428, 55, 11, 9, 11, 3], [428, 105, 9, 10, 9, 2], [428, 156, 9, 10, 9, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 11, 10, 11, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 4, 8, 9, 8, 3], [489, 55, 9, 9, 9, 3], [489, 105, 10, 10, 10, 2], [489, 157, 12, 9, 12, 3], [489, 207, 10, 12, 10, 2], [489, 261, 10, 7, 10, 5], [489, 310, 12, 9, 12, 3], [489, 361, 12, 9, 12, 3], [489, 412, 13, 9, 13, 3], [489, 463, 13, 9, 13, 3], [489, 514, 14, 9, 14, 3], [489, 565, 8, 9, 8, 3], [489, 616, 9, 9, 9, 3], [489, 669, 12, 7, 12, 5], [489, 718, 14, 9, 14, 3], [489, 769, 12, 9, 12, 3], [550, 6, 17, 7, 17, 5], [550, 57, 10, 7, 10, 5], [550, 108, 9, 7, 9, 5], [550, 159, 9, 7, 9, 5], [550, 208, 13, 9, 13, 3], [550, 261, 13, 9, 13, 5], [550, 311, 11, 8, 11, 4], [550, 361, 12, 9, 12, 3], [550, 412, 13, 9, 13, 3], [550, 464, 14, 8, 14, 4], [550, 514, 9, 11, 9, 3], [550, 565, 10, 9, 10, 3], [550, 616, 10, 9, 10, 3], [550, 667, 13, 9, 13, 3], [550, 720, 15, 7, 15, 5], [550, 771, 11, 7, 11, 5], [611, 4, 11, 9, 11, 3], [611, 55, 9, 9, 9, 3], [611, 109, 10, 6, 10, 6], [611, 156, 15, 10, 15, 2], [611, 208, 9, 11, 9, 3], [611, 261, 13, 7, 13, 5], [611, 311, 12, 8, 12, 4], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 466, 17, 6, 17, 6], [611, 517, 11, 6, 11, 6], [611, 562, 11, 12, 11, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 718, 14, 9, 14, 3], [611, 771, 15, 7, 15, 5], [672, 7, 9, 6, 9, 6], [672, 58, 13, 6, 13, 6], [672, 106, 10, 9, 10, 3], [672, 157, 10, 9, 10, 3], [672, 208, 7, 9, 7, 3], [672, 259, 7, 9, 7, 3], [672, 312, 10, 7, 10, 5], [672, 362, 12, 8, 12, 4], [672, 412, 11, 12, 11, 3], [1, 7, 7, 6, 7, 6], [794, 769, 13, 10, 13, 3], [672, 565, 13, 10, 13, 3], [672, 616, 13, 10, 13, 3], [672, 667, 13, 10, 13, 3], [672, 718, 13, 10, 13, 3], [672, 769, 13, 10, 13, 3], [733, 4, 13, 10, 13, 3], [733, 55, 13, 10, 13, 3], [733, 106, 13, 10, 13, 3], [733, 157, 13, 10, 13, 3], [733, 208, 13, 10, 13, 3], [733, 259, 13, 10, 13, 3], [733, 310, 13, 10, 13, 3], [733, 361, 13, 10, 13, 3], [733, 412, 13, 10, 13, 3], [733, 463, 13, 10, 13, 3], [733, 514, 13, 10, 13, 3], [733, 565, 13, 10, 13, 3], [733, 616, 13, 10, 13, 3], [733, 667, 13, 10, 13, 3], [733, 718, 13, 10, 13, 3], [733, 769, 13, 10, 13, 3], [1, 7, 7, 6, 7, 6], [794, 55, 13, 10, 13, 3], [794, 106, 13, 10, 13, 3], [794, 157, 13, 10, 13, 3], [794, 208, 13, 10, 13, 3], [794, 259, 13, 10, 13, 3], [794, 310, 13, 10, 13, 3], [794, 361, 13, 10, 13, 3], [794, 412, 13, 10, 13, 3], [794, 463, 13, 10, 13, 3], [794, 514, 13, 10, 13, 3], [794, 565, 13, 10, 13, 3], [794, 616, 13, 10, 13, 3], [794, 667, 13, 10, 13, 3], [794, 718, 13, 10, 13, 3], [794, 769, 13, 10, 13, 3], [855, 4, 13, 10, 13, 3], [855, 55, 13, 10, 13, 3], [855, 106, 13, 10, 13, 3], [855, 157, 13, 10, 13, 3], [855, 208, 13, 10, 13, 3], [855, 259, 13, 10, 13, 3], [855, 310, 13, 10, 13, 3], [855, 361, 13, 10, 13, 3], [855, 412, 13, 10, 13, 3], [855, 463, 13, 10, 13, 3], [855, 514, 13, 10, 13, 3], [855, 565, 13, 10, 13, 3], [855, 616, 13, 10, 13, 3], [855, 667, 13, 10, 13, 3], [855, 718, 13, 10, 13, 3], [855, 769, 13, 10, 13, 3]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 55, 9, 9, 9, 3], [1, 106, 10, 9, 10, 3], [1, 156, 13, 10, 13, 2], [1, 207, 10, 11, 10, 2], [1, 258, 14, 10, 14, 2], [1, 310, 13, 9, 13, 3], [1, 361, 6, 9, 6, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 514, 10, 9, 10, 3], [1, 567, 10, 7, 10, 5], [1, 619, 7, 8, 7, 6], [1, 670, 10, 6, 10, 6], [1, 721, 7, 6, 7, 6], [1, 768, 10, 10, 10, 2], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 11, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 617, 9, 8, 9, 4], [62, 670, 11, 6, 11, 6], [62, 719, 9, 8, 9, 4], [62, 769, 11, 9, 11, 3], [123, 5, 14, 8, 14, 4], [123, 55, 11, 9, 11, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 9, 9, 9, 3], [123, 514, 10, 9, 10, 3], [123, 565, 12, 9, 12, 3], [123, 616, 10, 9, 10, 3], [123, 667, 15, 9, 15, 3], [123, 718, 12, 9, 12, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 10, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 10, 9, 10, 3], [184, 208, 9, 9, 9, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 15, 9, 15, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 11, 9, 11, 3], [184, 564, 8, 11, 8, 2], [184, 615, 10, 10, 10, 2], [184, 666, 8, 11, 8, 2], [184, 718, 11, 9, 11, 3], [184, 772, 11, 6, 11, 6], [245, 3, 9, 10, 9, 2], [245, 57, 11, 7, 11, 5], [245, 106, 11, 9, 11, 3], [245, 159, 10, 7, 10, 5], [245, 208, 11, 9, 11, 3], [245, 261, 11, 7, 11, 5], [245, 310, 9, 9, 9, 3], [245, 363, 11, 10, 11, 5], [245, 412, 11, 9, 11, 3], [245, 463, 7, 9, 7, 3], [245, 514, 9, 12, 9, 3], [245, 565, 11, 9, 11, 3], [245, 616, 7, 9, 7, 3], [245, 669, 15, 7, 15, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 9, 11, 5], [306, 57, 11, 9, 11, 5], [306, 108, 9, 7, 9, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 11, 7, 11, 5], [306, 312, 11, 7, 11, 5], [306, 363, 15, 7, 15, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 10, 11, 5], [306, 516, 11, 7, 11, 5], [306, 564, 8, 11, 8, 2], [306, 615, 8, 11, 8, 2], [306, 666, 8, 11, 8, 2], [306, 720, 11, 7, 11, 5], [306, 772, 11, 6, 11, 6], [367, 2, 11, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 106, 11, 12, 11, 3], [367, 154, 10, 12, 10, 0], [367, 205, 12, 12, 12, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 462, 11, 10, 11, 2], [367, 514, 11, 9, 11, 3], [367, 564, 11, 10, 11, 2], [367, 613, 11, 12, 11, 0], [367, 669, 11, 10, 11, 5], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 3, 11, 10, 11, 2], [428, 55, 11, 9, 11, 3], [428, 105, 9, 10, 9, 2], [428, 156, 9, 10, 9, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 11, 10, 11, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 4, 8, 9, 8, 3], [489, 55, 9, 9, 9, 3], [489, 105, 10, 10, 10, 2], [489, 157, 12, 9, 12, 3], [489, 207, 10, 12, 10, 2], [489, 261, 10, 7, 10, 5], [489, 310, 12, 9, 12, 3], [489, 361, 12, 9, 12, 3], [489, 412, 13, 9, 13, 3], [489, 463, 13, 9, 13, 3], [489, 514, 14, 9, 14, 3], [489, 565, 8, 9, 8, 3], [489, 616, 9, 9, 9, 3], [489, 669, 12, 7, 12, 5], [489, 718, 14, 9, 14, 3], [489, 769, 12, 9, 12, 3], [550, 6, 17, 7, 17, 5], [550, 57, 10, 7, 10, 5], [550, 108, 9, 7, 9, 5], [550, 159, 9, 7, 9, 5], [550, 208, 13, 9, 13, 3], [550, 261, 13, 9, 13, 5], [550, 311, 11, 8, 11, 4], [550, 361, 12, 9, 12, 3], [550, 412, 13, 9, 13, 3], [550, 464, 14, 8, 14, 4], [550, 514, 9, 11, 9, 3], [550, 565, 10, 9, 10, 3], [550, 616, 10, 9, 10, 3], [550, 667, 13, 9, 13, 3], [550, 720, 15, 7, 15, 5], [550, 771, 11, 7, 11, 5], [611, 4, 11, 9, 11, 3], [611, 55, 9, 9, 9, 3], [611, 109, 10, 6, 10, 6], [611, 156, 15, 10, 15, 2], [611, 208, 9, 11, 9, 3], [611, 261, 13, 7, 13, 5], [611, 311, 12, 8, 12, 4], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 466, 17, 6, 17, 6], [611, 517, 11, 6, 11, 6], [611, 562, 11, 12, 11, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 718, 14, 9, 14, 3], [611, 771, 15, 7, 15, 5], [672, 7, 9, 6, 9, 6], [672, 58, 13, 6, 13, 6], [672, 106, 10, 9, 10, 3], [672, 157, 10, 9, 10, 3], [672, 208, 7, 9, 7, 3], [672, 259, 7, 9, 7, 3], [672, 312, 10, 7, 10, 5], [672, 362, 12, 8, 12, 4], [672, 412, 11, 12, 11, 3], [1, 7, 7, 6, 7, 6], [794, 769, 13, 10, 13, 3], [672, 565, 13, 10, 13, 3], [672, 616, 13, 10, 13, 3], [672, 667, 13, 10, 13, 3], [672, 718, 13, 10, 13, 3], [672, 769, 13, 10, 13, 3], [733, 4, 13, 10, 13, 3], [733, 55, 13, 10, 13, 3], [733, 106, 13, 10, 13, 3], [733, 157, 13, 10, 13, 3], [733, 208, 13, 10, 13, 3], [733, 259, 13, 10, 13, 3], [733, 310, 13, 10, 13, 3], [733, 361, 13, 10, 13, 3], [733, 412, 13, 10, 13, 3], [733, 463, 13, 10, 13, 3], [733, 514, 13, 10, 13, 3], [733, 565, 13, 10, 13, 3], [733, 616, 13, 10, 13, 3], [733, 667, 13, 10, 13, 3], [733, 718, 13, 10, 13, 3], [733, 769, 13, 10, 13, 3], [1, 7, 7, 6, 7, 6], [794, 55, 13, 10, 13, 3], [794, 106, 13, 10, 13, 3], [794, 157, 13, 10, 13, 3], [794, 208, 13, 10, 13, 3], [794, 259, 13, 10, 13, 3], [794, 310, 13, 10, 13, 3], [794, 361, 13, 10, 13, 3], [794, 412, 13, 10, 13, 3], [794, 463, 13, 10, 13, 3], [794, 514, 13, 10, 13, 3], [794, 565, 13, 10, 13, 3], [794, 616, 13, 10, 13, 3], [794, 667, 13, 10, 13, 3], [794, 718, 13, 10, 13, 3], [794, 769, 13, 10, 13, 3], [855, 4, 13, 10, 13, 3], [855, 55, 13, 10, 13, 3], [855, 106, 13, 10, 13, 3], [855, 157, 13, 10, 13, 3], [855, 208, 13, 10, 13, 3], [855, 259, 13, 10, 13, 3], [855, 310, 13, 10, 13, 3], [855, 361, 13, 10, 13, 3], [855, 412, 13, 10, 13, 3], [855, 463, 13, 10, 13, 3], [855, 514, 13, 10, 13, 3], [855, 565, 13, 10, 13, 3], [855, 616, 13, 10, 13, 3], [855, 667, 13, 10, 13, 3], [855, 718, 13, 10, 13, 3], [855, 769, 13, 10, 13, 3]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 13, 13, 11, 3], [1, 106, 14, 6, 13, 3], [1, 157, 18, 12, 17, 3], [1, 207, 16, 15, 14, 2], [1, 259, 18, 13, 18, 3], [1, 310, 18, 13, 17, 3], [1, 361, 11, 6, 9, 3], [1, 411, 13, 15, 11, 2], [1, 462, 13, 15, 11, 2], [1, 515, 13, 9, 13, 4], [1, 570, 12, 7, 13, 8], [1, 625, 9, 6, 9, 12], [1, 673, 14, 3, 13, 9], [1, 727, 9, 4, 9, 12], [1, 768, 16, 14, 13, 2], [62, 4, 16, 13, 14, 3], [62, 55, 15, 13, 14, 3], [62, 106, 16, 13, 14, 3], [62, 157, 17, 13, 14, 3], [62, 208, 16, 13, 14, 3], [62, 259, 17, 13, 14, 3], [62, 310, 16, 13, 14, 3], [62, 361, 17, 13, 14, 3], [62, 412, 16, 13, 14, 3], [62, 463, 16, 13, 14, 3], [62, 517, 11, 10, 9, 6], [62, 568, 11, 12, 9, 6], [62, 617, 14, 11, 12, 4], [62, 673, 15, 5, 14, 9], [62, 719, 14, 11, 12, 4], [62, 769, 16, 13, 14, 3], [123, 4, 19, 13, 18, 3], [123, 55, 16, 13, 14, 3], [123, 106, 16, 13, 14, 3], [123, 157, 16, 13, 14, 3], [123, 208, 16, 13, 14, 3], [123, 259, 16, 13, 13, 3], [123, 310, 16, 13, 13, 3], [123, 361, 16, 13, 14, 3], [123, 412, 17, 13, 14, 3], [123, 463, 13, 13, 11, 3], [123, 514, 16, 13, 13, 3], [123, 565, 18, 13, 16, 3], [123, 616, 12, 13, 13, 3], [123, 667, 22, 13, 19, 3], [123, 718, 19, 13, 16, 3], [123, 769, 16, 13, 14, 3], [184, 4, 16, 13, 14, 3], [184, 55, 16, 14, 14, 3], [184, 106, 16, 13, 14, 3], [184, 157, 15, 13, 13, 3], [184, 208, 15, 13, 11, 3], [184, 259, 17, 13, 14, 3], [184, 310, 17, 13, 14, 3], [184, 361, 22, 13, 19, 3], [184, 412, 17, 13, 14, 3], [184, 463, 16, 13, 13, 3], [184, 514, 17, 13, 14, 3], [184, 564, 13, 15, 10, 2], [184, 615, 12, 14, 13, 2], [184, 666, 13, 15, 10, 2], [184, 719, 15, 5, 14, 4], [184, 780, 14, 3, 14, 14], [245, 3, 12, 4, 12, 2], [245, 58, 15, 10, 14, 6], [245, 106, 15, 13, 14, 3], [245, 160, 14, 10, 13, 6], [245, 208, 17, 13, 14, 3], [245, 262, 15, 10, 14, 6], [245, 310, 15, 13, 11, 3], [245, 364, 16, 13, 14, 6], [245, 412, 15, 13, 14, 3], [245, 463, 12, 13, 9, 3], [245, 514, 15, 15, 12, 3], [245, 565, 16, 13, 14, 3], [245, 616, 12, 13, 9, 3], [245, 670, 20, 10, 19, 6], [245, 721, 15, 10, 14, 6], [245, 772, 15, 10, 14, 6], [306, 7, 15, 12, 14, 6], [306, 58, 16, 12, 14, 6], [306, 109, 15, 10, 12, 6], [306, 160, 14, 10, 13, 6], [306, 208, 13, 13, 11, 3], [306, 262, 16, 10, 14, 6], [306, 313, 16, 10, 14, 6], [306, 364, 21, 10, 19, 6], [306, 415, 16, 10, 14, 6], [306, 466, 16, 13, 14, 6], [306, 517, 16, 10, 14, 6], [306, 564, 13, 15, 10, 2], [306, 615, 12, 15, 11, 2], [306, 666, 11, 15, 10, 2], [306, 721, 15, 4, 14, 6], [306, 769, 15, 13, 12, 3], [367, 2, 16, 15, 14, 1], [367, 52, 16, 16, 14, 0], [367, 106, 16, 16, 14, 3], [367, 154, 16, 16, 13, 0], [367, 205, 19, 16, 16, 0], [367, 257, 16, 15, 14, 1], [367, 308, 17, 15, 14, 1], [367, 360, 15, 14, 14, 2], [367, 411, 15, 14, 14, 2], [367, 462, 15, 14, 14, 2], [367, 514, 15, 13, 14, 3], [367, 564, 17, 14, 14, 2], [367, 613, 16, 16, 14, 0], [367, 670, 14, 13, 13, 6], [367, 717, 15, 14, 14, 2], [367, 768, 15, 14, 14, 2], [428, 3, 15, 14, 14, 2], [428, 55, 15, 13, 14, 3], [428, 105, 13, 14, 9, 2], [428, 156, 11, 14, 9, 2], [428, 207, 13, 14, 9, 2], [428, 259, 13, 13, 9, 3], [428, 309, 17, 14, 14, 2], [428, 360, 15, 14, 14, 2], [428, 411, 15, 14, 14, 2], [428, 462, 15, 14, 14, 2], [428, 514, 15, 13, 14, 3], [428, 564, 17, 14, 14, 2], [428, 615, 16, 14, 14, 2], [428, 666, 16, 14, 14, 2], [428, 717, 16, 14, 14, 2], [428, 769, 16, 13, 14, 3], [489, 4, 12, 8, 10, 3], [489, 55, 14, 7, 12, 3], [489, 105, 14, 10, 13, 2], [489, 157, 17, 13, 16, 3], [489, 208, 15, 16, 13, 3], [489, 262, 14, 8, 13, 6], [489, 310, 17, 13, 14, 3], [489, 361, 16, 13, 14, 3], [489, 412, 19, 13, 17, 3], [489, 463, 19, 13, 17, 3], [489, 514, 21, 7, 18, 3], [489, 564, 14, 4, 12, 2], [489, 616, 14, 3, 11, 3], [489, 672, 16, 7, 16, 8], [489, 718, 21, 13, 18, 3], [489, 769, 16, 13, 14, 3], [550, 7, 21, 8, 21, 6], [550, 59, 13, 9, 12, 7], [550, 108, 13, 11, 12, 5], [550, 160, 13, 10, 12, 6], [550, 208, 16, 13, 13, 3], [550, 262, 17, 12, 17, 6], [550, 310, 17, 13, 15, 3], [550, 361, 19, 14, 16, 3], [550, 412, 18, 14, 15, 3], [550, 465, 19, 11, 17, 5], [550, 514, 14, 15, 11, 3], [550, 565, 15, 11, 13, 3], [550, 616, 15, 11, 13, 3], [550, 667, 19, 13, 17, 3], [550, 721, 20, 10, 19, 6], [550, 772, 15, 10, 14, 6], [611, 4, 14, 13, 14, 3], [611, 55, 13, 13, 12, 3], [611, 112, 14, 6, 13, 9], [611, 156, 22, 14, 19, 2], [611, 208, 14, 15, 11, 3], [611, 262, 15, 7, 14, 6], [611, 310, 16, 13, 16, 3], [611, 363, 16, 10, 16, 5], [611, 415, 17, 10, 16, 6], [611, 472, 20, 4, 21, 12], [611, 511, 1, 1, 14, 1], [611, 562, 16, 16, 14, 0], [611, 613, 17, 16, 14, 0], [611, 664, 17, 16, 14, 0], [611, 718, 21, 13, 18, 3], [611, 772, 20, 10, 19, 6], [672, 10, 13, 3, 12, 9], [672, 61, 18, 3, 17, 9], [672, 106, 15, 6, 12, 3], [672, 157, 15, 6, 12, 3], [672, 208, 12, 6, 9, 3], [672, 259, 12, 6, 9, 3], [672, 315, 12, 7, 13, 8], [672, 363, 17, 11, 16, 5], [672, 412, 16, 16, 14, 3], [1, 1, 1, 1, 10, 1], [794, 768, 14, 4, 12, 2], [672, 567, 16, 9, 14, 5], [672, 618, 13, 10, 12, 5], [672, 670, 13, 10, 12, 6], [672, 718, 20, 13, 17, 3], [672, 769, 20, 13, 17, 3], [733, 4, 12, 9, 10, 3], [733, 60, 10, 4, 9, 8], [733, 115, 9, 6, 9, 12], [733, 166, 12, 6, 12, 12], [733, 208, 23, 13, 23, 3], [733, 256, 16, 16, 14, 0], [733, 307, 16, 16, 13, 0], [733, 358, 16, 16, 14, 0], [733, 410, 16, 15, 13, 1], [733, 460, 16, 16, 13, 0], [733, 511, 14, 16, 11, 0], [733, 562, 15, 16, 11, 0], [733, 614, 14, 15, 11, 1], [733, 664, 13, 16, 11, 0], [733, 715, 16, 16, 14, 0], [733, 766, 16, 16, 14, 0], [1, 1, 1, 1, 10, 1], [794, 52, 16, 16, 14, 0], [794, 103, 17, 16, 14, 0], [794, 154, 17, 16, 14, 0], [794, 205, 17, 16, 14, 0], [794, 262, 11, 10, 9, 6], [794, 309, 14, 4, 12, 2], [794, 360, 17, 4, 14, 2], [794, 413, 14, 3, 12, 4], [794, 462, 15, 4, 12, 2], [794, 514, 13, 3, 12, 3], [794, 562, 15, 7, 12, 0], [794, 627, 9, 5, 12, 14], [794, 666, 14, 4, 12, 2], [794, 729, 9, 5, 12, 14], [794, 768, 14, 4, 12, 2], [855, 3, 14, 4, 12, 2], [855, 54, 14, 4, 12, 2], [855, 105, 14, 4, 12, 2], [855, 156, 14, 4, 12, 2], [855, 207, 14, 4, 12, 2], [855, 258, 14, 4, 12, 2], [855, 309, 14, 4, 12, 2], [855, 360, 14, 4, 12, 2], [855, 411, 14, 4, 12, 2], [855, 462, 14, 4, 12, 2], [855, 513, 14, 4, 12, 2], [855, 564, 14, 4, 12, 2], [855, 615, 14, 4, 12, 2], [855, 666, 14, 4, 12, 2], [855, 717, 14, 4, 12, 2], [855, 768, 14, 4, 12, 2]], \"capHeight\": 15, \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 12, 11, 10, 3], [1, 106, 13, 4, 12, 3], [1, 157, 17, 10, 16, 3], [1, 207, 15, 13, 13, 2], [1, 259, 17, 11, 17, 3], [1, 310, 17, 11, 16, 3], [1, 361, 10, 4, 8, 3], [1, 411, 12, 13, 10, 2], [1, 462, 12, 13, 10, 2], [1, 515, 12, 7, 12, 4], [1, 570, 11, 5, 12, 8], [1, 625, 8, 4, 8, 12], [1, 673, 13, 1, 12, 9], [1, 727, 8, 2, 8, 12], [1, 768, 15, 12, 12, 2], [62, 4, 15, 11, 13, 3], [62, 55, 14, 11, 13, 3], [62, 106, 15, 11, 13, 3], [62, 157, 16, 11, 13, 3], [62, 208, 15, 11, 13, 3], [62, 259, 16, 11, 13, 3], [62, 310, 15, 11, 13, 3], [62, 361, 16, 11, 13, 3], [62, 412, 15, 11, 13, 3], [62, 463, 15, 11, 13, 3], [62, 517, 10, 8, 8, 6], [62, 568, 10, 10, 8, 6], [62, 617, 13, 9, 11, 4], [62, 673, 14, 3, 13, 9], [62, 719, 13, 9, 11, 4], [62, 769, 15, 11, 13, 3], [123, 4, 18, 11, 17, 3], [123, 55, 15, 11, 13, 3], [123, 106, 15, 11, 13, 3], [123, 157, 15, 11, 13, 3], [123, 208, 15, 11, 13, 3], [123, 259, 15, 11, 12, 3], [123, 310, 15, 11, 12, 3], [123, 361, 15, 11, 13, 3], [123, 412, 16, 11, 13, 3], [123, 463, 12, 11, 10, 3], [123, 514, 15, 11, 12, 3], [123, 565, 17, 11, 15, 3], [123, 616, 11, 11, 12, 3], [123, 667, 21, 11, 18, 3], [123, 718, 18, 11, 15, 3], [123, 769, 15, 11, 13, 3], [184, 4, 15, 11, 13, 3], [184, 55, 15, 12, 13, 3], [184, 106, 15, 11, 13, 3], [184, 157, 14, 11, 12, 3], [184, 208, 14, 11, 10, 3], [184, 259, 16, 11, 13, 3], [184, 310, 16, 11, 13, 3], [184, 361, 21, 11, 18, 3], [184, 412, 16, 11, 13, 3], [184, 463, 15, 11, 12, 3], [184, 514, 16, 11, 13, 3], [184, 564, 12, 13, 9, 2], [184, 615, 11, 12, 12, 2], [184, 666, 12, 13, 9, 2], [184, 719, 14, 3, 13, 4], [184, 780, 13, 1, 13, 14], [245, 3, 11, 2, 11, 2], [245, 58, 14, 8, 13, 6], [245, 106, 14, 11, 13, 3], [245, 160, 13, 8, 12, 6], [245, 208, 16, 11, 13, 3], [245, 262, 14, 8, 13, 6], [245, 310, 14, 11, 10, 3], [245, 364, 15, 11, 13, 6], [245, 412, 14, 11, 13, 3], [245, 463, 11, 11, 8, 3], [245, 514, 14, 13, 11, 3], [245, 565, 15, 11, 13, 3], [245, 616, 11, 11, 8, 3], [245, 670, 19, 8, 18, 6], [245, 721, 14, 8, 13, 6], [245, 772, 14, 8, 13, 6], [306, 7, 14, 10, 13, 6], [306, 58, 15, 10, 13, 6], [306, 109, 14, 8, 11, 6], [306, 160, 13, 8, 12, 6], [306, 208, 12, 11, 10, 3], [306, 262, 15, 8, 13, 6], [306, 313, 15, 8, 13, 6], [306, 364, 20, 8, 18, 6], [306, 415, 15, 8, 13, 6], [306, 466, 15, 11, 13, 6], [306, 517, 15, 8, 13, 6], [306, 564, 12, 13, 9, 2], [306, 615, 11, 13, 10, 2], [306, 666, 10, 13, 9, 2], [306, 721, 14, 2, 13, 6], [306, 769, 14, 11, 11, 3], [367, 2, 15, 13, 13, 1], [367, 52, 15, 14, 13, 0], [367, 106, 15, 14, 13, 3], [367, 154, 15, 14, 12, 0], [367, 205, 18, 14, 15, 0], [367, 257, 15, 13, 13, 1], [367, 308, 16, 13, 13, 1], [367, 360, 14, 12, 13, 2], [367, 411, 14, 12, 13, 2], [367, 462, 14, 12, 13, 2], [367, 514, 14, 11, 13, 3], [367, 564, 16, 12, 13, 2], [367, 613, 15, 14, 13, 0], [367, 670, 13, 11, 12, 6], [367, 717, 14, 12, 13, 2], [367, 768, 14, 12, 13, 2], [428, 3, 14, 12, 13, 2], [428, 55, 14, 11, 13, 3], [428, 105, 12, 12, 8, 2], [428, 156, 10, 12, 8, 2], [428, 207, 12, 12, 8, 2], [428, 259, 12, 11, 8, 3], [428, 309, 16, 12, 13, 2], [428, 360, 14, 12, 13, 2], [428, 411, 14, 12, 13, 2], [428, 462, 14, 12, 13, 2], [428, 514, 14, 11, 13, 3], [428, 564, 16, 12, 13, 2], [428, 615, 15, 12, 13, 2], [428, 666, 15, 12, 13, 2], [428, 717, 15, 12, 13, 2], [428, 769, 15, 11, 13, 3], [489, 4, 11, 6, 9, 3], [489, 55, 13, 5, 11, 3], [489, 105, 13, 8, 12, 2], [489, 157, 16, 11, 15, 3], [489, 208, 14, 14, 12, 3], [489, 262, 13, 6, 12, 6], [489, 310, 16, 11, 13, 3], [489, 361, 15, 11, 13, 3], [489, 412, 18, 11, 16, 3], [489, 463, 18, 11, 16, 3], [489, 514, 20, 5, 17, 3], [489, 564, 13, 2, 11, 2], [489, 616, 13, 1, 10, 3], [489, 672, 15, 5, 15, 8], [489, 718, 20, 11, 17, 3], [489, 769, 15, 11, 13, 3], [550, 7, 20, 6, 20, 6], [550, 59, 12, 7, 11, 7], [550, 108, 12, 9, 11, 5], [550, 160, 12, 8, 11, 6], [550, 208, 15, 11, 12, 3], [550, 262, 16, 10, 16, 6], [550, 310, 16, 11, 14, 3], [550, 361, 18, 12, 15, 3], [550, 412, 17, 12, 14, 3], [550, 465, 18, 9, 16, 5], [550, 514, 13, 13, 10, 3], [550, 565, 14, 9, 12, 3], [550, 616, 14, 9, 12, 3], [550, 667, 18, 11, 16, 3], [550, 721, 19, 8, 18, 6], [550, 772, 14, 8, 13, 6], [611, 4, 13, 11, 13, 3], [611, 55, 12, 11, 11, 3], [611, 112, 13, 4, 12, 9], [611, 156, 21, 12, 18, 2], [611, 208, 13, 13, 10, 3], [611, 262, 14, 5, 13, 6], [611, 310, 15, 11, 15, 3], [611, 363, 15, 8, 15, 5], [611, 415, 16, 8, 15, 6], [611, 472, 19, 2, 20, 12], [611, 511, 1, 1, 13, 1], [611, 562, 15, 14, 13, 0], [611, 613, 15, 14, 13, 0], [611, 664, 15, 14, 13, 0], [611, 718, 20, 11, 17, 3], [611, 772, 19, 8, 18, 6], [672, 10, 12, 1, 11, 9], [672, 61, 17, 1, 16, 9], [672, 106, 14, 4, 11, 3], [672, 157, 14, 4, 11, 3], [672, 208, 11, 4, 8, 3], [672, 259, 11, 4, 8, 3], [672, 315, 11, 5, 12, 8], [672, 363, 16, 9, 15, 5], [672, 412, 15, 14, 13, 3], [1, 1, 1, 1, 9, 1], [794, 768, 13, 2, 11, 2], [672, 567, 15, 7, 13, 5], [672, 618, 12, 8, 11, 5], [672, 670, 12, 8, 11, 6], [672, 718, 19, 11, 16, 3], [672, 769, 19, 11, 16, 3], [733, 4, 11, 7, 9, 3], [733, 60, 9, 2, 8, 8], [733, 115, 8, 4, 8, 12], [733, 166, 11, 4, 11, 12], [733, 208, 22, 11, 22, 3], [733, 256, 15, 14, 13, 0], [733, 307, 15, 14, 12, 0], [733, 358, 15, 14, 13, 0], [733, 410, 15, 13, 12, 1], [733, 460, 15, 14, 12, 0], [733, 511, 12, 14, 10, 0], [733, 562, 14, 14, 10, 0], [733, 614, 13, 13, 10, 1], [733, 664, 12, 14, 10, 0], [733, 715, 15, 14, 13, 0], [733, 766, 15, 14, 13, 0], [1, 1, 1, 1, 9, 1], [794, 52, 15, 14, 13, 0], [794, 103, 16, 14, 13, 0], [794, 154, 16, 14, 13, 0], [794, 205, 16, 14, 13, 0], [794, 262, 10, 8, 8, 6], [794, 309, 13, 2, 11, 2], [794, 360, 16, 2, 13, 2], [794, 413, 13, 1, 11, 4], [794, 462, 14, 2, 11, 2], [794, 514, 12, 1, 11, 3], [794, 562, 14, 5, 11, 0], [794, 627, 8, 3, 11, 14], [794, 666, 13, 2, 11, 2], [794, 729, 8, 3, 11, 14], [794, 768, 13, 2, 11, 2], [855, 3, 13, 2, 11, 2], [855, 54, 13, 2, 11, 2], [855, 105, 13, 2, 11, 2], [855, 156, 13, 2, 11, 2], [855, 207, 13, 2, 11, 2], [855, 258, 13, 2, 11, 2], [855, 309, 13, 2, 11, 2], [855, 360, 13, 2, 11, 2], [855, 411, 13, 2, 11, 2], [855, 462, 13, 2, 11, 2], [855, 513, 13, 2, 11, 2], [855, 564, 13, 2, 11, 2], [855, 615, 13, 2, 11, 2], [855, 666, 13, 2, 11, 2], [855, 717, 13, 2, 11, 2], [855, 768, 13, 2, 11, 2]], \"capHeight\": 14, \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 10, 6, 10, 9], [1, 55, 11, 13, 11, 3], [1, 106, 13, 12, 13, 3], [1, 157, 17, 12, 17, 3], [1, 207, 14, 15, 14, 2], [1, 259, 18, 13, 18, 3], [1, 310, 17, 13, 17, 3], [1, 361, 9, 12, 9, 3], [1, 411, 11, 15, 11, 2], [1, 462, 11, 15, 11, 2], [1, 515, 13, 11, 13, 4], [1, 570, 13, 7, 13, 8], [1, 622, 9, 9, 9, 9], [1, 673, 13, 6, 13, 9], [1, 724, 9, 7, 9, 9], [1, 768, 13, 14, 13, 2], [62, 4, 14, 13, 14, 3], [62, 55, 14, 13, 14, 3], [62, 106, 14, 13, 14, 3], [62, 157, 14, 13, 14, 3], [62, 208, 14, 13, 14, 3], [62, 259, 14, 13, 14, 3], [62, 310, 14, 13, 14, 3], [62, 361, 14, 13, 14, 3], [62, 412, 14, 13, 14, 3], [62, 463, 14, 13, 14, 3], [62, 517, 9, 10, 9, 6], [62, 568, 9, 12, 9, 6], [62, 617, 12, 11, 12, 4], [62, 673, 14, 6, 14, 9], [62, 719, 12, 11, 12, 4], [62, 769, 14, 13, 14, 3], [123, 4, 18, 13, 18, 3], [123, 55, 14, 13, 14, 3], [123, 106, 14, 13, 14, 3], [123, 157, 14, 13, 14, 3], [123, 208, 14, 13, 14, 3], [123, 259, 13, 13, 13, 3], [123, 310, 13, 13, 13, 3], [123, 361, 14, 13, 14, 3], [123, 412, 14, 13, 14, 3], [123, 463, 11, 13, 11, 3], [123, 514, 13, 13, 13, 3], [123, 565, 16, 13, 16, 3], [123, 616, 13, 13, 13, 3], [123, 667, 19, 13, 19, 3], [123, 718, 16, 13, 16, 3], [123, 769, 14, 13, 14, 3], [184, 4, 14, 13, 14, 3], [184, 55, 14, 14, 14, 3], [184, 106, 14, 13, 14, 3], [184, 157, 13, 13, 13, 3], [184, 208, 11, 13, 11, 3], [184, 259, 14, 13, 14, 3], [184, 310, 14, 13, 14, 3], [184, 361, 19, 13, 19, 3], [184, 412, 14, 13, 14, 3], [184, 463, 13, 13, 13, 3], [184, 514, 14, 13, 14, 3], [184, 564, 10, 15, 10, 2], [184, 615, 13, 14, 13, 2], [184, 666, 10, 15, 10, 2], [184, 718, 14, 12, 14, 3], [184, 775, 14, 8, 14, 9], [245, 3, 12, 13, 12, 2], [245, 58, 14, 10, 14, 6], [245, 106, 14, 13, 14, 3], [245, 160, 13, 10, 13, 6], [245, 208, 14, 13, 14, 3], [245, 262, 14, 10, 14, 6], [245, 310, 11, 13, 11, 3], [245, 364, 14, 13, 14, 6], [245, 412, 14, 13, 14, 3], [245, 463, 9, 13, 9, 3], [245, 514, 12, 15, 12, 3], [245, 565, 14, 13, 14, 3], [245, 616, 9, 13, 9, 3], [245, 670, 19, 10, 19, 6], [245, 721, 14, 10, 14, 6], [245, 772, 14, 10, 14, 6], [306, 7, 14, 12, 14, 6], [306, 58, 14, 12, 14, 6], [306, 109, 12, 10, 12, 6], [306, 160, 13, 10, 13, 6], [306, 208, 11, 13, 11, 3], [306, 262, 14, 10, 14, 6], [306, 313, 14, 10, 14, 6], [306, 364, 19, 10, 19, 6], [306, 415, 14, 10, 14, 6], [306, 466, 14, 13, 14, 6], [306, 517, 14, 10, 14, 6], [306, 564, 10, 15, 10, 2], [306, 615, 11, 15, 11, 2], [306, 666, 10, 15, 10, 2], [306, 721, 14, 9, 14, 6], [306, 769, 12, 13, 12, 3], [367, 2, 14, 15, 14, 1], [367, 52, 14, 16, 14, 0], [367, 106, 14, 16, 14, 3], [367, 154, 13, 16, 13, 0], [367, 205, 16, 16, 16, 0], [367, 257, 14, 15, 14, 1], [367, 308, 14, 15, 14, 1], [367, 360, 14, 14, 14, 2], [367, 411, 14, 14, 14, 2], [367, 462, 14, 14, 14, 2], [367, 514, 14, 13, 14, 3], [367, 564, 14, 14, 14, 2], [367, 613, 14, 16, 14, 0], [367, 670, 13, 13, 13, 6], [367, 717, 14, 14, 14, 2], [367, 768, 14, 14, 14, 2], [428, 3, 14, 14, 14, 2], [428, 55, 14, 13, 14, 3], [428, 105, 9, 14, 9, 2], [428, 156, 9, 14, 9, 2], [428, 207, 9, 14, 9, 2], [428, 259, 9, 13, 9, 3], [428, 309, 14, 14, 14, 2], [428, 360, 14, 14, 14, 2], [428, 411, 14, 14, 14, 2], [428, 462, 14, 14, 14, 2], [428, 514, 14, 13, 14, 3], [428, 564, 14, 14, 14, 2], [428, 615, 14, 14, 14, 2], [428, 666, 14, 14, 14, 2], [428, 717, 14, 14, 14, 2], [428, 769, 14, 13, 14, 3], [489, 4, 10, 12, 10, 3], [489, 55, 12, 12, 12, 3], [489, 105, 13, 13, 13, 2], [489, 157, 16, 13, 16, 3], [489, 208, 13, 16, 13, 3], [489, 262, 13, 9, 13, 6], [489, 310, 14, 13, 14, 3], [489, 361, 14, 13, 14, 3], [489, 412, 17, 13, 17, 3], [489, 463, 17, 13, 17, 3], [489, 514, 18, 12, 18, 3], [489, 564, 12, 13, 12, 2], [489, 616, 11, 12, 11, 3], [489, 672, 16, 7, 16, 8], [489, 718, 18, 13, 18, 3], [489, 769, 14, 13, 14, 3], [550, 7, 21, 9, 21, 6], [550, 59, 12, 9, 12, 7], [550, 108, 12, 11, 12, 5], [550, 159, 12, 11, 12, 5], [550, 208, 13, 13, 13, 3], [550, 262, 17, 12, 17, 6], [550, 310, 15, 13, 15, 3], [550, 361, 16, 14, 16, 3], [550, 412, 15, 14, 15, 3], [550, 465, 17, 11, 17, 5], [550, 514, 11, 15, 11, 3], [550, 565, 13, 12, 13, 3], [550, 616, 13, 12, 13, 3], [550, 667, 17, 13, 17, 3], [550, 721, 19, 10, 19, 6], [550, 772, 14, 10, 14, 6], [611, 4, 14, 13, 14, 3], [611, 55, 12, 13, 12, 3], [611, 112, 13, 6, 13, 9], [611, 156, 19, 14, 19, 2], [611, 208, 11, 15, 11, 3], [611, 262, 14, 9, 14, 6], [611, 310, 16, 13, 16, 3], [611, 364, 16, 9, 16, 6], [611, 415, 16, 9, 16, 6], [611, 469, 21, 7, 21, 9], [611, 520, 14, 6, 14, 9], [611, 562, 14, 16, 14, 0], [611, 613, 14, 16, 14, 0], [611, 664, 14, 16, 14, 0], [611, 718, 18, 13, 18, 3], [611, 772, 19, 10, 19, 6], [672, 10, 12, 6, 12, 9], [672, 61, 17, 6, 17, 9], [672, 106, 12, 12, 12, 3], [672, 157, 12, 12, 12, 3], [672, 208, 9, 12, 9, 3], [672, 259, 9, 12, 9, 3], [672, 315, 13, 7, 13, 8], [672, 363, 16, 11, 16, 5], [672, 412, 14, 16, 14, 3], [1, 10, 10, 6, 10, 9], [794, 768, 12, 13, 12, 2], [672, 567, 14, 10, 14, 5], [672, 619, 12, 9, 12, 6], [672, 670, 12, 9, 12, 6], [672, 718, 17, 13, 17, 3], [672, 769, 17, 13, 17, 3], [733, 4, 10, 12, 10, 3], [733, 60, 9, 7, 9, 8], [733, 112, 9, 9, 9, 9], [733, 163, 12, 9, 12, 9], [733, 208, 23, 13, 23, 3], [733, 256, 14, 16, 14, 0], [733, 307, 13, 16, 13, 0], [733, 358, 14, 16, 14, 0], [733, 410, 13, 15, 13, 1], [733, 460, 13, 16, 13, 0], [733, 511, 11, 16, 11, 0], [733, 562, 11, 16, 11, 0], [733, 614, 11, 15, 11, 1], [733, 664, 11, 16, 11, 0], [733, 715, 14, 16, 14, 0], [733, 766, 14, 16, 14, 0], [1, 10, 10, 6, 10, 9], [794, 52, 14, 16, 14, 0], [794, 103, 14, 16, 14, 0], [794, 154, 14, 16, 14, 0], [794, 205, 14, 16, 14, 0], [794, 262, 9, 10, 9, 6], [794, 309, 12, 13, 12, 2], [794, 360, 14, 13, 14, 2], [794, 413, 12, 11, 12, 4], [794, 462, 12, 13, 12, 2], [794, 514, 12, 12, 12, 3], [794, 562, 12, 15, 12, 0], [794, 622, 12, 10, 12, 9], [794, 666, 12, 13, 12, 2], [794, 724, 12, 10, 12, 9], [794, 768, 12, 13, 12, 2], [855, 3, 12, 13, 12, 2], [855, 54, 12, 13, 12, 2], [855, 105, 12, 13, 12, 2], [855, 156, 12, 13, 12, 2], [855, 207, 12, 13, 12, 2], [855, 258, 12, 13, 12, 2], [855, 309, 12, 13, 12, 2], [855, 360, 12, 13, 12, 2], [855, 411, 12, 13, 12, 2], [855, 462, 12, 13, 12, 2], [855, 513, 12, 13, 12, 2], [855, 564, 12, 13, 12, 2], [855, 615, 12, 13, 12, 2], [855, 666, 12, 13, 12, 2], [855, 717, 12, 13, 12, 2], [855, 768, 12, 13, 12, 2]], \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 9, 6, 9, 8], [1, 55, 10, 11, 10, 3], [1, 106, 12, 11, 12, 3], [1, 157, 16, 11, 16, 3], [1, 207, 13, 13, 13, 2], [1, 259, 17, 11, 17, 3], [1, 310, 16, 11, 16, 3], [1, 361, 8, 11, 8, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 515, 12, 10, 12, 4], [1, 570, 12, 6, 12, 8], [1, 621, 8, 8, 8, 8], [1, 672, 12, 6, 12, 8], [1, 723, 8, 6, 8, 8], [1, 768, 12, 12, 12, 2], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 11, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 11, 13, 3], [62, 310, 13, 11, 13, 3], [62, 361, 13, 11, 13, 3], [62, 412, 13, 11, 13, 3], [62, 463, 13, 11, 13, 3], [62, 517, 8, 8, 8, 6], [62, 568, 8, 10, 8, 6], [62, 617, 11, 10, 11, 4], [62, 672, 13, 6, 13, 8], [62, 719, 11, 10, 11, 4], [62, 769, 13, 11, 13, 3], [123, 4, 17, 11, 17, 3], [123, 55, 13, 11, 13, 3], [123, 106, 13, 11, 13, 3], [123, 157, 13, 11, 13, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 13, 11, 13, 3], [123, 412, 13, 11, 13, 3], [123, 463, 10, 11, 10, 3], [123, 514, 12, 11, 12, 3], [123, 565, 15, 11, 15, 3], [123, 616, 12, 11, 12, 3], [123, 667, 18, 11, 18, 3], [123, 718, 15, 11, 15, 3], [123, 769, 13, 11, 13, 3], [184, 4, 13, 11, 13, 3], [184, 55, 13, 12, 13, 3], [184, 106, 13, 11, 13, 3], [184, 157, 12, 11, 12, 3], [184, 208, 10, 11, 10, 3], [184, 259, 13, 11, 13, 3], [184, 310, 13, 11, 13, 3], [184, 361, 18, 11, 18, 3], [184, 412, 13, 11, 13, 3], [184, 463, 12, 11, 12, 3], [184, 514, 13, 11, 13, 3], [184, 564, 9, 13, 9, 2], [184, 615, 12, 12, 12, 2], [184, 666, 9, 13, 9, 2], [184, 718, 13, 11, 13, 3], [184, 774, 13, 7, 13, 8], [245, 3, 11, 12, 11, 2], [245, 58, 13, 8, 13, 6], [245, 106, 13, 11, 13, 3], [245, 160, 12, 8, 12, 6], [245, 208, 13, 11, 13, 3], [245, 262, 13, 8, 13, 6], [245, 310, 10, 11, 10, 3], [245, 364, 13, 11, 13, 6], [245, 412, 13, 11, 13, 3], [245, 463, 8, 11, 8, 3], [245, 514, 11, 13, 11, 3], [245, 565, 13, 11, 13, 3], [245, 616, 8, 11, 8, 3], [245, 670, 18, 8, 18, 6], [245, 721, 13, 8, 13, 6], [245, 772, 13, 8, 13, 6], [306, 7, 13, 10, 13, 6], [306, 58, 13, 10, 13, 6], [306, 109, 11, 8, 11, 6], [306, 160, 12, 8, 12, 6], [306, 208, 10, 11, 10, 3], [306, 262, 13, 8, 13, 6], [306, 313, 13, 8, 13, 6], [306, 364, 18, 8, 18, 6], [306, 415, 13, 8, 13, 6], [306, 466, 13, 11, 13, 6], [306, 517, 13, 8, 13, 6], [306, 564, 9, 13, 9, 2], [306, 615, 10, 13, 10, 2], [306, 666, 9, 13, 9, 2], [306, 721, 13, 8, 13, 6], [306, 769, 11, 11, 11, 3], [367, 2, 13, 13, 13, 1], [367, 52, 13, 14, 13, 0], [367, 106, 13, 14, 13, 3], [367, 154, 12, 14, 12, 0], [367, 205, 15, 14, 15, 0], [367, 257, 13, 13, 13, 1], [367, 308, 13, 13, 13, 1], [367, 360, 13, 12, 13, 2], [367, 411, 13, 12, 13, 2], [367, 462, 13, 12, 13, 2], [367, 514, 13, 11, 13, 3], [367, 564, 13, 12, 13, 2], [367, 613, 13, 14, 13, 0], [367, 670, 12, 11, 12, 6], [367, 717, 13, 12, 13, 2], [367, 768, 13, 12, 13, 2], [428, 3, 13, 12, 13, 2], [428, 55, 13, 11, 13, 3], [428, 105, 8, 12, 8, 2], [428, 156, 8, 12, 8, 2], [428, 207, 8, 12, 8, 2], [428, 259, 8, 11, 8, 3], [428, 309, 13, 12, 13, 2], [428, 360, 13, 12, 13, 2], [428, 411, 13, 12, 13, 2], [428, 462, 13, 12, 13, 2], [428, 514, 13, 11, 13, 3], [428, 564, 13, 12, 13, 2], [428, 615, 13, 12, 13, 2], [428, 666, 13, 12, 13, 2], [428, 717, 13, 12, 13, 2], [428, 769, 13, 11, 13, 3], [489, 4, 9, 11, 9, 3], [489, 55, 11, 11, 11, 3], [489, 105, 12, 12, 12, 2], [489, 157, 15, 11, 15, 3], [489, 208, 12, 14, 12, 3], [489, 262, 12, 8, 12, 6], [489, 310, 13, 11, 13, 3], [489, 361, 13, 11, 13, 3], [489, 412, 16, 11, 16, 3], [489, 463, 16, 11, 16, 3], [489, 514, 17, 11, 17, 3], [489, 564, 11, 12, 11, 2], [489, 616, 10, 11, 10, 3], [489, 672, 15, 6, 15, 8], [489, 718, 17, 11, 17, 3], [489, 769, 13, 11, 13, 3], [550, 7, 20, 8, 20, 6], [550, 59, 11, 7, 11, 7], [550, 108, 11, 9, 11, 5], [550, 159, 11, 9, 11, 5], [550, 208, 12, 11, 12, 3], [550, 262, 16, 10, 16, 6], [550, 310, 14, 11, 14, 3], [550, 361, 15, 12, 15, 3], [550, 412, 14, 12, 14, 3], [550, 465, 16, 9, 16, 5], [550, 514, 10, 13, 10, 3], [550, 565, 12, 11, 12, 3], [550, 616, 12, 11, 12, 3], [550, 667, 16, 11, 16, 3], [550, 721, 18, 8, 18, 6], [550, 772, 13, 8, 13, 6], [611, 4, 13, 11, 13, 3], [611, 55, 11, 11, 11, 3], [611, 111, 12, 6, 12, 8], [611, 156, 18, 12, 18, 2], [611, 208, 10, 13, 10, 3], [611, 262, 13, 8, 13, 6], [611, 310, 15, 11, 15, 3], [611, 364, 15, 8, 15, 6], [611, 415, 15, 8, 15, 6], [611, 468, 20, 6, 20, 8], [611, 519, 13, 6, 13, 8], [611, 562, 13, 14, 13, 0], [611, 613, 13, 14, 13, 0], [611, 664, 13, 14, 13, 0], [611, 718, 17, 11, 17, 3], [611, 772, 18, 8, 18, 6], [672, 9, 11, 6, 11, 8], [672, 60, 16, 6, 16, 8], [672, 106, 11, 11, 11, 3], [672, 157, 11, 11, 11, 3], [672, 208, 8, 11, 8, 3], [672, 259, 8, 11, 8, 3], [672, 315, 12, 6, 12, 8], [672, 363, 15, 9, 15, 5], [672, 412, 13, 14, 13, 3], [1, 9, 9, 6, 9, 8], [794, 768, 11, 12, 11, 2], [672, 567, 13, 9, 13, 5], [672, 619, 11, 8, 11, 6], [672, 670, 11, 8, 11, 6], [672, 718, 16, 11, 16, 3], [672, 769, 16, 11, 16, 3], [733, 4, 9, 11, 9, 3], [733, 60, 8, 6, 8, 8], [733, 111, 8, 8, 8, 8], [733, 162, 11, 8, 11, 8], [733, 208, 22, 11, 22, 3], [733, 256, 13, 14, 13, 0], [733, 307, 12, 14, 12, 0], [733, 358, 13, 14, 13, 0], [733, 410, 12, 13, 12, 1], [733, 460, 12, 14, 12, 0], [733, 511, 10, 14, 10, 0], [733, 562, 10, 14, 10, 0], [733, 614, 10, 13, 10, 1], [733, 664, 10, 14, 10, 0], [733, 715, 13, 14, 13, 0], [733, 766, 13, 14, 13, 0], [1, 9, 9, 6, 9, 8], [794, 52, 13, 14, 13, 0], [794, 103, 13, 14, 13, 0], [794, 154, 13, 14, 13, 0], [794, 205, 13, 14, 13, 0], [794, 262, 8, 8, 8, 6], [794, 309, 11, 12, 11, 2], [794, 360, 13, 12, 13, 2], [794, 413, 11, 10, 11, 4], [794, 462, 11, 12, 11, 2], [794, 514, 11, 11, 11, 3], [794, 562, 11, 14, 11, 0], [794, 621, 11, 9, 11, 8], [794, 666, 11, 12, 11, 2], [794, 723, 11, 9, 11, 8], [794, 768, 11, 12, 11, 2], [855, 3, 11, 12, 11, 2], [855, 54, 11, 12, 11, 2], [855, 105, 11, 12, 11, 2], [855, 156, 11, 12, 11, 2], [855, 207, 11, 12, 11, 2], [855, 258, 11, 12, 11, 2], [855, 309, 11, 12, 11, 2], [855, 360, 11, 12, 11, 2], [855, 411, 11, 12, 11, 2], [855, 462, 11, 12, 11, 2], [855, 513, 11, 12, 11, 2], [855, 564, 11, 12, 11, 2], [855, 615, 11, 12, 11, 2], [855, 666, 11, 12, 11, 2], [855, 717, 11, 12, 11, 2], [855, 768, 11, 12, 11, 2]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 12, 13, 10, 3], [1, 106, 13, 6, 12, 3], [1, 157, 17, 12, 16, 3], [1, 207, 15, 15, 13, 2], [1, 259, 17, 13, 17, 3], [1, 310, 17, 13, 16, 3], [1, 361, 10, 6, 8, 3], [1, 411, 12, 15, 10, 2], [1, 462, 12, 15, 10, 2], [1, 515, 12, 9, 12, 4], [1, 570, 11, 7, 12, 8], [1, 625, 8, 6, 8, 12], [1, 673, 13, 3, 12, 9], [1, 727, 8, 4, 8, 12], [1, 768, 15, 14, 12, 2], [62, 4, 15, 13, 13, 3], [62, 55, 14, 13, 13, 3], [62, 106, 15, 13, 13, 3], [62, 157, 16, 13, 13, 3], [62, 208, 15, 13, 13, 3], [62, 259, 16, 13, 13, 3], [62, 310, 15, 13, 13, 3], [62, 361, 16, 13, 13, 3], [62, 412, 15, 13, 13, 3], [62, 463, 15, 13, 13, 3], [62, 517, 10, 10, 8, 6], [62, 568, 10, 12, 8, 6], [62, 617, 13, 11, 11, 4], [62, 673, 14, 5, 13, 9], [62, 719, 13, 11, 11, 4], [62, 769, 15, 13, 13, 3], [123, 4, 18, 13, 17, 3], [123, 55, 15, 13, 13, 3], [123, 106, 15, 13, 13, 3], [123, 157, 15, 13, 13, 3], [123, 208, 15, 13, 13, 3], [123, 259, 15, 13, 12, 3], [123, 310, 15, 13, 12, 3], [123, 361, 15, 13, 13, 3], [123, 412, 16, 13, 13, 3], [123, 463, 12, 13, 10, 3], [123, 514, 15, 13, 12, 3], [123, 565, 17, 13, 15, 3], [123, 616, 11, 13, 12, 3], [123, 667, 21, 13, 18, 3], [123, 718, 18, 13, 15, 3], [123, 769, 15, 13, 13, 3], [184, 4, 15, 13, 13, 3], [184, 55, 15, 14, 13, 3], [184, 106, 15, 13, 13, 3], [184, 157, 14, 13, 12, 3], [184, 208, 14, 13, 10, 3], [184, 259, 16, 13, 13, 3], [184, 310, 16, 13, 13, 3], [184, 361, 21, 13, 18, 3], [184, 412, 16, 13, 13, 3], [184, 463, 15, 13, 12, 3], [184, 514, 16, 13, 13, 3], [184, 564, 12, 15, 9, 2], [184, 615, 11, 14, 12, 2], [184, 666, 12, 15, 9, 2], [184, 719, 14, 5, 13, 4], [184, 780, 13, 3, 13, 14], [245, 3, 11, 4, 11, 2], [245, 58, 14, 10, 13, 6], [245, 106, 14, 13, 13, 3], [245, 160, 13, 10, 12, 6], [245, 208, 16, 13, 13, 3], [245, 262, 14, 10, 13, 6], [245, 310, 14, 13, 10, 3], [245, 364, 15, 13, 13, 6], [245, 412, 14, 13, 13, 3], [245, 463, 11, 13, 8, 3], [245, 514, 14, 15, 11, 3], [245, 565, 15, 13, 13, 3], [245, 616, 11, 13, 8, 3], [245, 670, 19, 10, 18, 6], [245, 721, 14, 10, 13, 6], [245, 772, 14, 10, 13, 6], [306, 7, 14, 12, 13, 6], [306, 58, 15, 12, 13, 6], [306, 109, 14, 10, 11, 6], [306, 160, 13, 10, 12, 6], [306, 208, 12, 13, 10, 3], [306, 262, 15, 10, 13, 6], [306, 313, 15, 10, 13, 6], [306, 364, 20, 10, 18, 6], [306, 415, 15, 10, 13, 6], [306, 466, 15, 13, 13, 6], [306, 517, 15, 10, 13, 6], [306, 564, 12, 15, 9, 2], [306, 615, 11, 15, 10, 2], [306, 666, 10, 15, 9, 2], [306, 721, 14, 4, 13, 6], [306, 769, 14, 13, 11, 3], [367, 2, 15, 15, 13, 1], [367, 52, 15, 16, 13, 0], [367, 106, 15, 16, 13, 3], [367, 154, 15, 16, 12, 0], [367, 205, 18, 16, 15, 0], [367, 257, 15, 15, 13, 1], [367, 308, 16, 15, 13, 1], [367, 360, 14, 14, 13, 2], [367, 411, 14, 14, 13, 2], [367, 462, 14, 14, 13, 2], [367, 514, 14, 13, 13, 3], [367, 564, 16, 14, 13, 2], [367, 613, 15, 16, 13, 0], [367, 670, 13, 13, 12, 6], [367, 717, 14, 14, 13, 2], [367, 768, 14, 14, 13, 2], [428, 3, 14, 14, 13, 2], [428, 55, 14, 13, 13, 3], [428, 105, 12, 14, 8, 2], [428, 156, 10, 14, 8, 2], [428, 207, 12, 14, 8, 2], [428, 259, 12, 13, 8, 3], [428, 309, 16, 14, 13, 2], [428, 360, 14, 14, 13, 2], [428, 411, 14, 14, 13, 2], [428, 462, 14, 14, 13, 2], [428, 514, 14, 13, 13, 3], [428, 564, 16, 14, 13, 2], [428, 615, 15, 14, 13, 2], [428, 666, 15, 14, 13, 2], [428, 717, 15, 14, 13, 2], [428, 769, 15, 13, 13, 3], [489, 4, 11, 8, 9, 3], [489, 55, 13, 7, 11, 3], [489, 105, 13, 10, 12, 2], [489, 157, 16, 13, 15, 3], [489, 208, 14, 16, 12, 3], [489, 262, 13, 8, 12, 6], [489, 310, 16, 13, 13, 3], [489, 361, 15, 13, 13, 3], [489, 412, 18, 13, 16, 3], [489, 463, 18, 13, 16, 3], [489, 514, 20, 7, 17, 3], [489, 564, 13, 4, 11, 2], [489, 616, 13, 3, 10, 3], [489, 672, 15, 7, 15, 8], [489, 718, 20, 13, 17, 3], [489, 769, 15, 13, 13, 3], [550, 7, 20, 8, 20, 6], [550, 59, 12, 9, 11, 7], [550, 108, 12, 11, 11, 5], [550, 160, 12, 10, 11, 6], [550, 208, 15, 13, 12, 3], [550, 262, 16, 12, 16, 6], [550, 310, 16, 13, 14, 3], [550, 361, 18, 14, 15, 3], [550, 412, 17, 14, 14, 3], [550, 465, 18, 11, 16, 5], [550, 514, 13, 15, 10, 3], [550, 565, 14, 11, 12, 3], [550, 616, 14, 11, 12, 3], [550, 667, 18, 13, 16, 3], [550, 721, 19, 10, 18, 6], [550, 772, 14, 10, 13, 6], [611, 4, 13, 13, 13, 3], [611, 55, 12, 13, 11, 3], [611, 112, 13, 6, 12, 9], [611, 156, 21, 14, 18, 2], [611, 208, 13, 15, 10, 3], [611, 262, 14, 7, 13, 6], [611, 310, 15, 13, 15, 3], [611, 363, 15, 10, 15, 5], [611, 415, 16, 10, 15, 6], [611, 472, 19, 4, 20, 12], [611, 511, 1, 1, 13, 1], [611, 562, 15, 16, 13, 0], [611, 613, 16, 16, 13, 0], [611, 664, 16, 16, 13, 0], [611, 718, 20, 13, 17, 3], [611, 772, 19, 10, 18, 6], [672, 10, 12, 3, 11, 9], [672, 61, 17, 3, 16, 9], [672, 106, 14, 6, 11, 3], [672, 157, 14, 6, 11, 3], [672, 208, 11, 6, 8, 3], [672, 259, 11, 6, 8, 3], [672, 315, 11, 7, 12, 8], [672, 363, 16, 11, 15, 5], [672, 412, 15, 16, 13, 3], [1, 1, 1, 1, 9, 1], [794, 768, 13, 4, 11, 2], [672, 567, 15, 9, 13, 5], [672, 618, 12, 10, 11, 5], [672, 670, 12, 10, 11, 6], [672, 718, 19, 13, 16, 3], [672, 769, 19, 13, 16, 3], [733, 4, 11, 9, 9, 3], [733, 60, 9, 4, 8, 8], [733, 115, 8, 6, 8, 12], [733, 166, 11, 6, 11, 12], [733, 208, 22, 13, 22, 3], [733, 256, 15, 16, 13, 0], [733, 307, 15, 16, 12, 0], [733, 358, 15, 16, 13, 0], [733, 410, 15, 15, 12, 1], [733, 460, 15, 16, 12, 0], [733, 511, 13, 16, 10, 0], [733, 562, 14, 16, 10, 0], [733, 614, 13, 15, 10, 1], [733, 664, 12, 16, 10, 0], [733, 715, 15, 16, 13, 0], [733, 766, 15, 16, 13, 0], [1, 1, 1, 1, 9, 1], [794, 52, 15, 16, 13, 0], [794, 103, 16, 16, 13, 0], [794, 154, 16, 16, 13, 0], [794, 205, 16, 16, 13, 0], [794, 262, 10, 10, 8, 6], [794, 309, 13, 4, 11, 2], [794, 360, 16, 4, 13, 2], [794, 413, 13, 3, 11, 4], [794, 462, 14, 4, 11, 2], [794, 514, 12, 3, 11, 3], [794, 562, 14, 7, 11, 0], [794, 627, 8, 5, 11, 14], [794, 666, 13, 4, 11, 2], [794, 729, 8, 5, 11, 14], [794, 768, 13, 4, 11, 2], [855, 3, 13, 4, 11, 2], [855, 54, 13, 4, 11, 2], [855, 105, 13, 4, 11, 2], [855, 156, 13, 4, 11, 2], [855, 207, 13, 4, 11, 2], [855, 258, 13, 4, 11, 2], [855, 309, 13, 4, 11, 2], [855, 360, 13, 4, 11, 2], [855, 411, 13, 4, 11, 2], [855, 462, 13, 4, 11, 2], [855, 513, 13, 4, 11, 2], [855, 564, 13, 4, 11, 2], [855, 615, 13, 4, 11, 2], [855, 666, 13, 4, 11, 2], [855, 717, 13, 4, 11, 2], [855, 768, 13, 4, 11, 2]], \"capHeight\": 15, \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 11, 11, 9, 3], [1, 106, 12, 4, 11, 3], [1, 157, 16, 10, 15, 3], [1, 207, 14, 13, 12, 2], [1, 259, 16, 11, 16, 3], [1, 310, 16, 11, 15, 3], [1, 361, 9, 4, 7, 3], [1, 411, 11, 13, 9, 2], [1, 462, 11, 13, 9, 2], [1, 515, 11, 7, 11, 4], [1, 570, 10, 5, 11, 8], [1, 625, 7, 4, 7, 12], [1, 673, 12, 1, 11, 9], [1, 727, 7, 2, 7, 12], [1, 768, 14, 12, 11, 2], [62, 4, 14, 11, 12, 3], [62, 55, 13, 11, 12, 3], [62, 106, 14, 11, 12, 3], [62, 157, 15, 11, 12, 3], [62, 208, 14, 11, 12, 3], [62, 259, 15, 11, 12, 3], [62, 310, 14, 11, 12, 3], [62, 361, 15, 11, 12, 3], [62, 412, 14, 11, 12, 3], [62, 463, 14, 11, 12, 3], [62, 517, 9, 8, 7, 6], [62, 568, 9, 10, 7, 6], [62, 617, 12, 9, 10, 4], [62, 673, 13, 3, 12, 9], [62, 719, 12, 9, 10, 4], [62, 769, 14, 11, 12, 3], [123, 4, 17, 11, 16, 3], [123, 55, 14, 11, 12, 3], [123, 106, 14, 11, 12, 3], [123, 157, 14, 11, 12, 3], [123, 208, 14, 11, 12, 3], [123, 259, 14, 11, 11, 3], [123, 310, 14, 11, 11, 3], [123, 361, 14, 11, 12, 3], [123, 412, 15, 11, 12, 3], [123, 463, 11, 11, 9, 3], [123, 514, 14, 11, 11, 3], [123, 565, 16, 11, 14, 3], [123, 616, 10, 11, 11, 3], [123, 667, 20, 11, 17, 3], [123, 718, 17, 11, 14, 3], [123, 769, 14, 11, 12, 3], [184, 4, 14, 11, 12, 3], [184, 55, 14, 12, 12, 3], [184, 106, 14, 11, 12, 3], [184, 157, 13, 11, 11, 3], [184, 208, 13, 11, 9, 3], [184, 259, 15, 11, 12, 3], [184, 310, 15, 11, 12, 3], [184, 361, 20, 11, 17, 3], [184, 412, 15, 11, 12, 3], [184, 463, 14, 11, 11, 3], [184, 514, 15, 11, 12, 3], [184, 564, 11, 13, 8, 2], [184, 615, 10, 12, 11, 2], [184, 666, 11, 13, 8, 2], [184, 719, 13, 3, 12, 4], [184, 780, 12, 1, 12, 14], [245, 3, 10, 2, 10, 2], [245, 58, 13, 8, 12, 6], [245, 106, 13, 11, 12, 3], [245, 160, 12, 8, 11, 6], [245, 208, 15, 11, 12, 3], [245, 262, 13, 8, 12, 6], [245, 310, 13, 11, 9, 3], [245, 364, 14, 11, 12, 6], [245, 412, 13, 11, 12, 3], [245, 463, 10, 11, 7, 3], [245, 514, 13, 13, 10, 3], [245, 565, 14, 11, 12, 3], [245, 616, 10, 11, 7, 3], [245, 670, 18, 8, 17, 6], [245, 721, 13, 8, 12, 6], [245, 772, 13, 8, 12, 6], [306, 7, 13, 10, 12, 6], [306, 58, 14, 10, 12, 6], [306, 109, 13, 8, 10, 6], [306, 160, 12, 8, 11, 6], [306, 208, 11, 11, 9, 3], [306, 262, 14, 8, 12, 6], [306, 313, 14, 8, 12, 6], [306, 364, 19, 8, 17, 6], [306, 415, 14, 8, 12, 6], [306, 466, 14, 11, 12, 6], [306, 517, 14, 8, 12, 6], [306, 564, 11, 13, 8, 2], [306, 615, 10, 13, 9, 2], [306, 666, 9, 13, 8, 2], [306, 721, 13, 2, 12, 6], [306, 769, 13, 11, 10, 3], [367, 2, 14, 13, 12, 1], [367, 52, 14, 14, 12, 0], [367, 106, 14, 14, 12, 3], [367, 154, 14, 14, 11, 0], [367, 205, 17, 14, 14, 0], [367, 257, 14, 13, 12, 1], [367, 308, 15, 13, 12, 1], [367, 360, 13, 12, 12, 2], [367, 411, 13, 12, 12, 2], [367, 462, 13, 12, 12, 2], [367, 514, 13, 11, 12, 3], [367, 564, 15, 12, 12, 2], [367, 613, 14, 14, 12, 0], [367, 670, 12, 11, 11, 6], [367, 717, 13, 12, 12, 2], [367, 768, 13, 12, 12, 2], [428, 3, 13, 12, 12, 2], [428, 55, 13, 11, 12, 3], [428, 105, 11, 12, 7, 2], [428, 156, 9, 12, 7, 2], [428, 207, 11, 12, 7, 2], [428, 259, 11, 11, 7, 3], [428, 309, 15, 12, 12, 2], [428, 360, 13, 12, 12, 2], [428, 411, 13, 12, 12, 2], [428, 462, 13, 12, 12, 2], [428, 514, 13, 11, 12, 3], [428, 564, 15, 12, 12, 2], [428, 615, 14, 12, 12, 2], [428, 666, 14, 12, 12, 2], [428, 717, 14, 12, 12, 2], [428, 769, 14, 11, 12, 3], [489, 4, 10, 6, 8, 3], [489, 55, 12, 5, 10, 3], [489, 105, 12, 8, 11, 2], [489, 157, 15, 11, 14, 3], [489, 208, 13, 14, 11, 3], [489, 262, 12, 6, 11, 6], [489, 310, 15, 11, 12, 3], [489, 361, 14, 11, 12, 3], [489, 412, 17, 11, 15, 3], [489, 463, 17, 11, 15, 3], [489, 514, 19, 5, 16, 3], [489, 564, 12, 2, 10, 2], [489, 616, 12, 1, 9, 3], [489, 672, 14, 5, 14, 8], [489, 718, 19, 11, 16, 3], [489, 769, 14, 11, 12, 3], [550, 7, 19, 6, 19, 6], [550, 59, 11, 7, 10, 7], [550, 108, 11, 9, 10, 5], [550, 160, 11, 8, 10, 6], [550, 208, 14, 11, 11, 3], [550, 262, 15, 10, 15, 6], [550, 310, 15, 11, 13, 3], [550, 361, 17, 12, 14, 3], [550, 412, 16, 12, 13, 3], [550, 465, 17, 9, 15, 5], [550, 514, 12, 13, 9, 3], [550, 565, 13, 9, 11, 3], [550, 616, 13, 9, 11, 3], [550, 667, 17, 11, 15, 3], [550, 721, 18, 8, 17, 6], [550, 772, 13, 8, 12, 6], [611, 4, 12, 11, 12, 3], [611, 55, 11, 11, 10, 3], [611, 112, 12, 4, 11, 9], [611, 156, 20, 12, 17, 2], [611, 208, 12, 13, 9, 3], [611, 262, 13, 5, 12, 6], [611, 310, 14, 11, 14, 3], [611, 363, 14, 8, 14, 5], [611, 415, 15, 8, 14, 6], [611, 472, 18, 2, 19, 12], [611, 511, 1, 1, 12, 1], [611, 562, 14, 14, 12, 0], [611, 613, 14, 14, 12, 0], [611, 664, 14, 14, 12, 0], [611, 718, 19, 11, 16, 3], [611, 772, 18, 8, 17, 6], [672, 10, 11, 1, 10, 9], [672, 61, 16, 1, 15, 9], [672, 106, 13, 4, 10, 3], [672, 157, 13, 4, 10, 3], [672, 208, 10, 4, 7, 3], [672, 259, 10, 4, 7, 3], [672, 315, 10, 5, 11, 8], [672, 363, 15, 9, 14, 5], [672, 412, 14, 14, 12, 3], [1, 1, 1, 1, 8, 1], [794, 768, 12, 2, 10, 2], [672, 567, 14, 7, 12, 5], [672, 618, 11, 8, 10, 5], [672, 670, 11, 8, 10, 6], [672, 718, 18, 11, 15, 3], [672, 769, 18, 11, 15, 3], [733, 4, 10, 7, 8, 3], [733, 60, 8, 2, 7, 8], [733, 115, 7, 4, 7, 12], [733, 166, 10, 4, 10, 12], [733, 208, 21, 11, 21, 3], [733, 256, 14, 14, 12, 0], [733, 307, 14, 14, 11, 0], [733, 358, 14, 14, 12, 0], [733, 410, 14, 13, 11, 1], [733, 460, 14, 14, 11, 0], [733, 511, 11, 14, 9, 0], [733, 562, 13, 14, 9, 0], [733, 614, 12, 13, 9, 1], [733, 664, 11, 14, 9, 0], [733, 715, 14, 14, 12, 0], [733, 766, 14, 14, 12, 0], [1, 1, 1, 1, 8, 1], [794, 52, 14, 14, 12, 0], [794, 103, 15, 14, 12, 0], [794, 154, 15, 14, 12, 0], [794, 205, 15, 14, 12, 0], [794, 262, 9, 8, 7, 6], [794, 309, 12, 2, 10, 2], [794, 360, 15, 2, 12, 2], [794, 413, 12, 1, 10, 4], [794, 462, 13, 2, 10, 2], [794, 514, 11, 1, 10, 3], [794, 562, 13, 5, 10, 0], [794, 627, 7, 3, 10, 14], [794, 666, 12, 2, 10, 2], [794, 729, 7, 3, 10, 14], [794, 768, 12, 2, 10, 2], [855, 3, 12, 2, 10, 2], [855, 54, 12, 2, 10, 2], [855, 105, 12, 2, 10, 2], [855, 156, 12, 2, 10, 2], [855, 207, 12, 2, 10, 2], [855, 258, 12, 2, 10, 2], [855, 309, 12, 2, 10, 2], [855, 360, 12, 2, 10, 2], [855, 411, 12, 2, 10, 2], [855, 462, 12, 2, 10, 2], [855, 513, 12, 2, 10, 2], [855, 564, 12, 2, 10, 2], [855, 615, 12, 2, 10, 2], [855, 666, 12, 2, 10, 2], [855, 717, 12, 2, 10, 2], [855, 768, 12, 2, 10, 2]], \"capHeight\": 14, \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 9, 6, 9, 9], [1, 55, 10, 13, 10, 3], [1, 106, 12, 12, 12, 3], [1, 157, 16, 12, 16, 3], [1, 207, 13, 15, 13, 2], [1, 259, 17, 13, 17, 3], [1, 310, 16, 13, 16, 3], [1, 361, 8, 12, 8, 3], [1, 411, 10, 15, 10, 2], [1, 462, 10, 15, 10, 2], [1, 515, 12, 11, 12, 4], [1, 570, 12, 7, 12, 8], [1, 622, 8, 9, 8, 9], [1, 673, 12, 6, 12, 9], [1, 724, 8, 7, 8, 9], [1, 768, 12, 14, 12, 2], [62, 4, 13, 13, 13, 3], [62, 55, 13, 13, 13, 3], [62, 106, 13, 13, 13, 3], [62, 157, 13, 13, 13, 3], [62, 208, 13, 13, 13, 3], [62, 259, 13, 13, 13, 3], [62, 310, 13, 13, 13, 3], [62, 361, 13, 13, 13, 3], [62, 412, 13, 13, 13, 3], [62, 463, 13, 13, 13, 3], [62, 517, 8, 10, 8, 6], [62, 568, 8, 12, 8, 6], [62, 617, 11, 11, 11, 4], [62, 673, 13, 6, 13, 9], [62, 719, 11, 11, 11, 4], [62, 769, 13, 13, 13, 3], [123, 4, 17, 13, 17, 3], [123, 55, 13, 13, 13, 3], [123, 106, 13, 13, 13, 3], [123, 157, 13, 13, 13, 3], [123, 208, 13, 13, 13, 3], [123, 259, 12, 13, 12, 3], [123, 310, 12, 13, 12, 3], [123, 361, 13, 13, 13, 3], [123, 412, 13, 13, 13, 3], [123, 463, 10, 13, 10, 3], [123, 514, 12, 13, 12, 3], [123, 565, 15, 13, 15, 3], [123, 616, 12, 13, 12, 3], [123, 667, 18, 13, 18, 3], [123, 718, 15, 13, 15, 3], [123, 769, 13, 13, 13, 3], [184, 4, 13, 13, 13, 3], [184, 55, 13, 14, 13, 3], [184, 106, 13, 13, 13, 3], [184, 157, 12, 13, 12, 3], [184, 208, 10, 13, 10, 3], [184, 259, 13, 13, 13, 3], [184, 310, 13, 13, 13, 3], [184, 361, 18, 13, 18, 3], [184, 412, 13, 13, 13, 3], [184, 463, 12, 13, 12, 3], [184, 514, 13, 13, 13, 3], [184, 564, 9, 15, 9, 2], [184, 615, 12, 14, 12, 2], [184, 666, 9, 15, 9, 2], [184, 718, 13, 12, 13, 3], [184, 775, 13, 8, 13, 9], [245, 3, 11, 13, 11, 2], [245, 58, 13, 10, 13, 6], [245, 106, 13, 13, 13, 3], [245, 160, 12, 10, 12, 6], [245, 208, 13, 13, 13, 3], [245, 262, 13, 10, 13, 6], [245, 310, 10, 13, 10, 3], [245, 364, 13, 13, 13, 6], [245, 412, 13, 13, 13, 3], [245, 463, 8, 13, 8, 3], [245, 514, 11, 15, 11, 3], [245, 565, 13, 13, 13, 3], [245, 616, 8, 13, 8, 3], [245, 670, 18, 10, 18, 6], [245, 721, 13, 10, 13, 6], [245, 772, 13, 10, 13, 6], [306, 7, 13, 12, 13, 6], [306, 58, 13, 12, 13, 6], [306, 109, 11, 10, 11, 6], [306, 160, 12, 10, 12, 6], [306, 208, 10, 13, 10, 3], [306, 262, 13, 10, 13, 6], [306, 313, 13, 10, 13, 6], [306, 364, 18, 10, 18, 6], [306, 415, 13, 10, 13, 6], [306, 466, 13, 13, 13, 6], [306, 517, 13, 10, 13, 6], [306, 564, 9, 15, 9, 2], [306, 615, 10, 15, 10, 2], [306, 666, 9, 15, 9, 2], [306, 721, 13, 9, 13, 6], [306, 769, 11, 13, 11, 3], [367, 2, 13, 15, 13, 1], [367, 52, 13, 16, 13, 0], [367, 106, 13, 16, 13, 3], [367, 154, 12, 16, 12, 0], [367, 205, 15, 16, 15, 0], [367, 257, 13, 15, 13, 1], [367, 308, 13, 15, 13, 1], [367, 360, 13, 14, 13, 2], [367, 411, 13, 14, 13, 2], [367, 462, 13, 14, 13, 2], [367, 514, 13, 13, 13, 3], [367, 564, 13, 14, 13, 2], [367, 613, 13, 16, 13, 0], [367, 670, 12, 13, 12, 6], [367, 717, 13, 14, 13, 2], [367, 768, 13, 14, 13, 2], [428, 3, 13, 14, 13, 2], [428, 55, 13, 13, 13, 3], [428, 105, 8, 14, 8, 2], [428, 156, 8, 14, 8, 2], [428, 207, 8, 14, 8, 2], [428, 259, 8, 13, 8, 3], [428, 309, 13, 14, 13, 2], [428, 360, 13, 14, 13, 2], [428, 411, 13, 14, 13, 2], [428, 462, 13, 14, 13, 2], [428, 514, 13, 13, 13, 3], [428, 564, 13, 14, 13, 2], [428, 615, 13, 14, 13, 2], [428, 666, 13, 14, 13, 2], [428, 717, 13, 14, 13, 2], [428, 769, 13, 13, 13, 3], [489, 4, 9, 12, 9, 3], [489, 55, 11, 12, 11, 3], [489, 105, 12, 13, 12, 2], [489, 157, 15, 13, 15, 3], [489, 208, 12, 16, 12, 3], [489, 262, 12, 9, 12, 6], [489, 310, 13, 13, 13, 3], [489, 361, 13, 13, 13, 3], [489, 412, 16, 13, 16, 3], [489, 463, 16, 13, 16, 3], [489, 514, 17, 12, 17, 3], [489, 564, 11, 13, 11, 2], [489, 616, 10, 12, 10, 3], [489, 672, 15, 7, 15, 8], [489, 718, 17, 13, 17, 3], [489, 769, 13, 13, 13, 3], [550, 7, 20, 9, 20, 6], [550, 59, 11, 9, 11, 7], [550, 108, 11, 11, 11, 5], [550, 159, 11, 11, 11, 5], [550, 208, 12, 13, 12, 3], [550, 262, 16, 12, 16, 6], [550, 310, 14, 13, 14, 3], [550, 361, 15, 14, 15, 3], [550, 412, 14, 14, 14, 3], [550, 465, 16, 11, 16, 5], [550, 514, 10, 15, 10, 3], [550, 565, 12, 12, 12, 3], [550, 616, 12, 12, 12, 3], [550, 667, 16, 13, 16, 3], [550, 721, 18, 10, 18, 6], [550, 772, 13, 10, 13, 6], [611, 4, 13, 13, 13, 3], [611, 55, 11, 13, 11, 3], [611, 112, 12, 6, 12, 9], [611, 156, 18, 14, 18, 2], [611, 208, 10, 15, 10, 3], [611, 262, 13, 9, 13, 6], [611, 310, 15, 13, 15, 3], [611, 364, 15, 9, 15, 6], [611, 415, 15, 9, 15, 6], [611, 469, 20, 7, 20, 9], [611, 520, 13, 6, 13, 9], [611, 562, 13, 16, 13, 0], [611, 613, 13, 16, 13, 0], [611, 664, 13, 16, 13, 0], [611, 718, 17, 13, 17, 3], [611, 772, 18, 10, 18, 6], [672, 10, 11, 6, 11, 9], [672, 61, 16, 6, 16, 9], [672, 106, 11, 12, 11, 3], [672, 157, 11, 12, 11, 3], [672, 208, 8, 12, 8, 3], [672, 259, 8, 12, 8, 3], [672, 315, 12, 7, 12, 8], [672, 363, 15, 11, 15, 5], [672, 412, 13, 16, 13, 3], [1, 10, 9, 6, 9, 9], [794, 768, 11, 13, 11, 2], [672, 567, 13, 10, 13, 5], [672, 619, 11, 9, 11, 6], [672, 670, 11, 9, 11, 6], [672, 718, 16, 13, 16, 3], [672, 769, 16, 13, 16, 3], [733, 4, 9, 12, 9, 3], [733, 60, 8, 7, 8, 8], [733, 112, 8, 9, 8, 9], [733, 163, 11, 9, 11, 9], [733, 208, 22, 13, 22, 3], [733, 256, 13, 16, 13, 0], [733, 307, 12, 16, 12, 0], [733, 358, 13, 16, 13, 0], [733, 410, 12, 15, 12, 1], [733, 460, 12, 16, 12, 0], [733, 511, 10, 16, 10, 0], [733, 562, 10, 16, 10, 0], [733, 614, 10, 15, 10, 1], [733, 664, 10, 16, 10, 0], [733, 715, 13, 16, 13, 0], [733, 766, 13, 16, 13, 0], [1, 10, 9, 6, 9, 9], [794, 52, 13, 16, 13, 0], [794, 103, 13, 16, 13, 0], [794, 154, 13, 16, 13, 0], [794, 205, 13, 16, 13, 0], [794, 262, 8, 10, 8, 6], [794, 309, 11, 13, 11, 2], [794, 360, 13, 13, 13, 2], [794, 413, 11, 11, 11, 4], [794, 462, 11, 13, 11, 2], [794, 514, 11, 12, 11, 3], [794, 562, 11, 15, 11, 0], [794, 622, 11, 10, 11, 9], [794, 666, 11, 13, 11, 2], [794, 724, 11, 10, 11, 9], [794, 768, 11, 13, 11, 2], [855, 3, 11, 13, 11, 2], [855, 54, 11, 13, 11, 2], [855, 105, 11, 13, 11, 2], [855, 156, 11, 13, 11, 2], [855, 207, 11, 13, 11, 2], [855, 258, 11, 13, 11, 2], [855, 309, 11, 13, 11, 2], [855, 360, 11, 13, 11, 2], [855, 411, 11, 13, 11, 2], [855, 462, 11, 13, 11, 2], [855, 513, 11, 13, 11, 2], [855, 564, 11, 13, 11, 2], [855, 615, 11, 13, 11, 2], [855, 666, 11, 13, 11, 2], [855, 717, 11, 13, 11, 2], [855, 768, 11, 13, 11, 2]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 8, 6, 8, 8], [1, 55, 9, 11, 9, 3], [1, 106, 11, 11, 11, 3], [1, 157, 15, 11, 15, 3], [1, 207, 12, 13, 12, 2], [1, 259, 16, 11, 16, 3], [1, 310, 15, 11, 15, 3], [1, 361, 7, 11, 7, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 515, 11, 10, 11, 4], [1, 570, 11, 6, 11, 8], [1, 621, 7, 8, 7, 8], [1, 672, 11, 6, 11, 8], [1, 723, 7, 6, 7, 8], [1, 768, 11, 12, 11, 2], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 517, 7, 8, 7, 6], [62, 568, 7, 10, 7, 6], [62, 617, 10, 10, 10, 4], [62, 672, 12, 6, 12, 8], [62, 719, 10, 10, 10, 4], [62, 769, 12, 11, 12, 3], [123, 4, 16, 11, 16, 3], [123, 55, 12, 11, 12, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 12, 11, 12, 3], [123, 412, 12, 11, 12, 3], [123, 463, 9, 11, 9, 3], [123, 514, 11, 11, 11, 3], [123, 565, 14, 11, 14, 3], [123, 616, 11, 11, 11, 3], [123, 667, 17, 11, 17, 3], [123, 718, 14, 11, 14, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 12, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 11, 11, 11, 3], [184, 208, 9, 11, 9, 3], [184, 259, 12, 11, 12, 3], [184, 310, 12, 11, 12, 3], [184, 361, 17, 11, 17, 3], [184, 412, 12, 11, 12, 3], [184, 463, 11, 11, 11, 3], [184, 514, 12, 11, 12, 3], [184, 564, 8, 13, 8, 2], [184, 615, 11, 12, 11, 2], [184, 666, 8, 13, 8, 2], [184, 718, 12, 11, 12, 3], [184, 774, 12, 7, 12, 8], [245, 3, 10, 12, 10, 2], [245, 58, 12, 8, 12, 6], [245, 106, 12, 11, 12, 3], [245, 160, 11, 8, 11, 6], [245, 208, 12, 11, 12, 3], [245, 262, 12, 8, 12, 6], [245, 310, 9, 11, 9, 3], [245, 364, 12, 11, 12, 6], [245, 412, 12, 11, 12, 3], [245, 463, 7, 11, 7, 3], [245, 514, 10, 13, 10, 3], [245, 565, 12, 11, 12, 3], [245, 616, 7, 11, 7, 3], [245, 670, 17, 8, 17, 6], [245, 721, 12, 8, 12, 6], [245, 772, 12, 8, 12, 6], [306, 7, 12, 10, 12, 6], [306, 58, 12, 10, 12, 6], [306, 109, 10, 8, 10, 6], [306, 160, 11, 8, 11, 6], [306, 208, 9, 11, 9, 3], [306, 262, 12, 8, 12, 6], [306, 313, 12, 8, 12, 6], [306, 364, 17, 8, 17, 6], [306, 415, 12, 8, 12, 6], [306, 466, 12, 11, 12, 6], [306, 517, 12, 8, 12, 6], [306, 564, 8, 13, 8, 2], [306, 615, 9, 13, 9, 2], [306, 666, 8, 13, 8, 2], [306, 721, 12, 8, 12, 6], [306, 769, 10, 11, 10, 3], [367, 2, 12, 13, 12, 1], [367, 52, 12, 14, 12, 0], [367, 106, 12, 14, 12, 3], [367, 154, 11, 14, 11, 0], [367, 205, 14, 14, 14, 0], [367, 257, 12, 13, 12, 1], [367, 308, 12, 13, 12, 1], [367, 360, 12, 12, 12, 2], [367, 411, 12, 12, 12, 2], [367, 462, 12, 12, 12, 2], [367, 514, 12, 11, 12, 3], [367, 564, 12, 12, 12, 2], [367, 613, 12, 14, 12, 0], [367, 670, 11, 11, 11, 6], [367, 717, 12, 12, 12, 2], [367, 768, 12, 12, 12, 2], [428, 3, 12, 12, 12, 2], [428, 55, 12, 11, 12, 3], [428, 105, 7, 12, 7, 2], [428, 156, 7, 12, 7, 2], [428, 207, 7, 12, 7, 2], [428, 259, 7, 11, 7, 3], [428, 309, 12, 12, 12, 2], [428, 360, 12, 12, 12, 2], [428, 411, 12, 12, 12, 2], [428, 462, 12, 12, 12, 2], [428, 514, 12, 11, 12, 3], [428, 564, 12, 12, 12, 2], [428, 615, 12, 12, 12, 2], [428, 666, 12, 12, 12, 2], [428, 717, 12, 12, 12, 2], [428, 769, 12, 11, 12, 3], [489, 4, 8, 11, 8, 3], [489, 55, 10, 11, 10, 3], [489, 105, 11, 12, 11, 2], [489, 157, 14, 11, 14, 3], [489, 208, 11, 14, 11, 3], [489, 262, 11, 8, 11, 6], [489, 310, 12, 11, 12, 3], [489, 361, 12, 11, 12, 3], [489, 412, 15, 11, 15, 3], [489, 463, 15, 11, 15, 3], [489, 514, 16, 11, 16, 3], [489, 564, 10, 12, 10, 2], [489, 616, 9, 11, 9, 3], [489, 672, 14, 6, 14, 8], [489, 718, 16, 11, 16, 3], [489, 769, 12, 11, 12, 3], [550, 7, 19, 8, 19, 6], [550, 59, 10, 7, 10, 7], [550, 108, 10, 9, 10, 5], [550, 159, 10, 9, 10, 5], [550, 208, 11, 11, 11, 3], [550, 262, 15, 10, 15, 6], [550, 310, 13, 11, 13, 3], [550, 361, 14, 12, 14, 3], [550, 412, 13, 12, 13, 3], [550, 465, 15, 9, 15, 5], [550, 514, 9, 13, 9, 3], [550, 565, 11, 11, 11, 3], [550, 616, 11, 11, 11, 3], [550, 667, 15, 11, 15, 3], [550, 721, 17, 8, 17, 6], [550, 772, 12, 8, 12, 6], [611, 4, 12, 11, 12, 3], [611, 55, 10, 11, 10, 3], [611, 111, 11, 6, 11, 8], [611, 156, 17, 12, 17, 2], [611, 208, 9, 13, 9, 3], [611, 262, 12, 8, 12, 6], [611, 310, 14, 11, 14, 3], [611, 364, 14, 8, 14, 6], [611, 415, 14, 8, 14, 6], [611, 468, 19, 6, 19, 8], [611, 519, 12, 6, 12, 8], [611, 562, 12, 14, 12, 0], [611, 613, 12, 14, 12, 0], [611, 664, 12, 14, 12, 0], [611, 718, 16, 11, 16, 3], [611, 772, 17, 8, 17, 6], [672, 9, 10, 6, 10, 8], [672, 60, 15, 6, 15, 8], [672, 106, 10, 11, 10, 3], [672, 157, 10, 11, 10, 3], [672, 208, 7, 11, 7, 3], [672, 259, 7, 11, 7, 3], [672, 315, 11, 6, 11, 8], [672, 363, 14, 9, 14, 5], [672, 412, 12, 14, 12, 3], [1, 9, 8, 6, 8, 8], [794, 768, 10, 12, 10, 2], [672, 567, 12, 9, 12, 5], [672, 619, 10, 8, 10, 6], [672, 670, 10, 8, 10, 6], [672, 718, 15, 11, 15, 3], [672, 769, 15, 11, 15, 3], [733, 4, 8, 11, 8, 3], [733, 60, 7, 6, 7, 8], [733, 111, 7, 8, 7, 8], [733, 162, 10, 8, 10, 8], [733, 208, 21, 11, 21, 3], [733, 256, 12, 14, 12, 0], [733, 307, 11, 14, 11, 0], [733, 358, 12, 14, 12, 0], [733, 410, 11, 13, 11, 1], [733, 460, 11, 14, 11, 0], [733, 511, 9, 14, 9, 0], [733, 562, 9, 14, 9, 0], [733, 614, 9, 13, 9, 1], [733, 664, 9, 14, 9, 0], [733, 715, 12, 14, 12, 0], [733, 766, 12, 14, 12, 0], [1, 9, 8, 6, 8, 8], [794, 52, 12, 14, 12, 0], [794, 103, 12, 14, 12, 0], [794, 154, 12, 14, 12, 0], [794, 205, 12, 14, 12, 0], [794, 262, 7, 8, 7, 6], [794, 309, 10, 12, 10, 2], [794, 360, 12, 12, 12, 2], [794, 413, 10, 10, 10, 4], [794, 462, 10, 12, 10, 2], [794, 514, 10, 11, 10, 3], [794, 562, 10, 14, 10, 0], [794, 621, 10, 9, 10, 8], [794, 666, 10, 12, 10, 2], [794, 723, 10, 9, 10, 8], [794, 768, 10, 12, 10, 2], [855, 3, 10, 12, 10, 2], [855, 54, 10, 12, 10, 2], [855, 105, 10, 12, 10, 2], [855, 156, 10, 12, 10, 2], [855, 207, 10, 12, 10, 2], [855, 258, 10, 12, 10, 2], [855, 309, 10, 12, 10, 2], [855, 360, 10, 12, 10, 2], [855, 411, 10, 12, 10, 2], [855, 462, 10, 12, 10, 2], [855, 513, 10, 12, 10, 2], [855, 564, 10, 12, 10, 2], [855, 615, 10, 12, 10, 2], [855, 666, 10, 12, 10, 2], [855, 717, 10, 12, 10, 2], [855, 768, 10, 12, 10, 2]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 56, 14, 16, 14, 4], [1, 107, 17, 7, 16, 4], [1, 158, 22, 14, 20, 4], [1, 207, 18, 20, 16, 2], [1, 260, 22, 16, 22, 4], [1, 311, 21, 16, 20, 4], [1, 362, 12, 7, 10, 4], [1, 411, 16, 20, 13, 2], [1, 462, 14, 20, 13, 2], [1, 516, 16, 11, 16, 5], [1, 570, 17, 10, 16, 8], [1, 628, 11, 8, 11, 15], [1, 675, 17, 4, 16, 11], [1, 730, 11, 5, 11, 15], [1, 768, 19, 18, 16, 2], [62, 5, 19, 16, 17, 4], [62, 56, 16, 16, 17, 4], [62, 107, 19, 16, 17, 4], [62, 158, 19, 16, 17, 4], [62, 209, 17, 16, 17, 4], [62, 260, 19, 16, 17, 4], [62, 311, 18, 16, 17, 4], [62, 362, 19, 16, 17, 4], [62, 413, 19, 16, 17, 4], [62, 464, 19, 16, 17, 4], [62, 518, 13, 13, 11, 7], [62, 569, 13, 16, 11, 7], [62, 618, 15, 13, 14, 5], [62, 674, 18, 7, 17, 10], [62, 720, 16, 13, 14, 5], [62, 770, 19, 16, 17, 4], [123, 5, 23, 16, 22, 4], [123, 56, 19, 16, 17, 4], [123, 107, 19, 16, 17, 4], [123, 158, 19, 16, 17, 4], [123, 209, 19, 16, 17, 4], [123, 260, 18, 16, 16, 4], [123, 311, 18, 16, 16, 4], [123, 362, 19, 16, 17, 4], [123, 413, 19, 16, 17, 4], [123, 464, 14, 16, 14, 4], [123, 515, 17, 16, 16, 4], [123, 566, 21, 16, 19, 4], [123, 617, 15, 16, 16, 4], [123, 668, 25, 16, 23, 4], [123, 719, 21, 16, 19, 4], [123, 770, 19, 16, 17, 4], [184, 5, 19, 16, 17, 4], [184, 56, 19, 18, 17, 4], [184, 107, 19, 16, 17, 4], [184, 158, 18, 16, 16, 4], [184, 209, 17, 16, 14, 4], [184, 260, 19, 16, 17, 4], [184, 311, 19, 16, 17, 4], [184, 362, 25, 16, 23, 4], [184, 413, 19, 16, 17, 4], [184, 464, 19, 16, 17, 4], [184, 515, 19, 16, 17, 4], [184, 564, 16, 20, 13, 2], [184, 615, 15, 18, 16, 2], [184, 666, 15, 20, 12, 2], [184, 719, 18, 7, 17, 4], [184, 784, 17, 4, 17, 18], [245, 4, 15, 5, 14, 3], [245, 59, 18, 13, 17, 7], [245, 107, 18, 16, 17, 4], [245, 161, 17, 13, 16, 7], [245, 209, 19, 16, 17, 4], [245, 263, 18, 13, 17, 7], [245, 311, 18, 16, 15, 4], [245, 365, 19, 17, 17, 7], [245, 413, 18, 16, 17, 4], [245, 464, 13, 16, 11, 4], [245, 515, 16, 19, 14, 4], [245, 566, 19, 16, 17, 4], [245, 617, 13, 16, 11, 4], [245, 671, 24, 13, 23, 7], [245, 722, 18, 13, 17, 7], [245, 773, 18, 13, 17, 7], [306, 8, 18, 16, 17, 7], [306, 59, 19, 16, 17, 7], [306, 110, 17, 13, 14, 7], [306, 161, 18, 13, 16, 7], [306, 209, 17, 16, 15, 4], [306, 263, 19, 13, 17, 7], [306, 314, 19, 13, 17, 7], [306, 365, 25, 13, 23, 7], [306, 416, 19, 13, 17, 7], [306, 467, 19, 17, 17, 7], [306, 518, 19, 13, 17, 7], [306, 564, 17, 20, 14, 2], [306, 616, 14, 19, 13, 3], [306, 666, 15, 20, 14, 2], [306, 722, 19, 6, 17, 7], [306, 770, 15, 16, 13, 4], [367, 2, 19, 19, 17, 1], [367, 53, 19, 19, 17, 1], [367, 107, 19, 20, 17, 4], [367, 154, 18, 20, 16, 0], [367, 207, 21, 18, 19, 2], [367, 257, 19, 19, 17, 1], [367, 308, 19, 19, 17, 1], [367, 361, 18, 17, 17, 3], [367, 412, 18, 17, 17, 3], [367, 463, 18, 17, 17, 3], [367, 515, 18, 16, 17, 4], [367, 564, 20, 18, 17, 2], [367, 613, 19, 20, 17, 0], [367, 671, 17, 17, 16, 7], [367, 718, 18, 17, 17, 3], [367, 769, 18, 17, 17, 3], [428, 4, 18, 17, 17, 3], [428, 56, 18, 16, 17, 4], [428, 106, 12, 17, 11, 3], [428, 157, 13, 17, 11, 3], [428, 208, 15, 17, 11, 3], [428, 260, 15, 16, 11, 4], [428, 309, 20, 18, 17, 2], [428, 361, 18, 17, 17, 3], [428, 412, 18, 17, 17, 3], [428, 463, 18, 17, 17, 3], [428, 515, 18, 16, 17, 4], [428, 564, 20, 18, 17, 2], [428, 616, 19, 17, 17, 3], [428, 667, 19, 17, 17, 3], [428, 718, 19, 17, 17, 3], [428, 770, 19, 16, 17, 4], [489, 5, 16, 11, 14, 4], [489, 56, 16, 8, 14, 4], [489, 105, 18, 17, 16, 2], [489, 158, 19, 16, 19, 4], [489, 209, 18, 20, 16, 4], [489, 263, 17, 10, 16, 7], [489, 311, 22, 16, 21, 4], [489, 362, 19, 16, 17, 4], [489, 413, 21, 16, 20, 4], [489, 464, 21, 16, 20, 4], [489, 515, 24, 8, 22, 4], [489, 565, 14, 5, 14, 3], [489, 617, 16, 4, 14, 4], [489, 672, 19, 11, 19, 8], [489, 719, 24, 16, 22, 4], [489, 770, 19, 16, 17, 4], [550, 8, 26, 10, 26, 7], [550, 58, 17, 14, 17, 6], [550, 109, 15, 14, 16, 6], [550, 161, 16, 13, 16, 7], [550, 209, 19, 16, 17, 4], [550, 263, 21, 16, 20, 7], [550, 311, 18, 16, 17, 4], [550, 362, 20, 18, 19, 4], [550, 413, 23, 17, 22, 4], [550, 465, 25, 15, 23, 5], [550, 515, 17, 19, 15, 4], [550, 566, 18, 15, 16, 4], [550, 617, 18, 15, 16, 4], [550, 668, 22, 16, 20, 4], [550, 722, 24, 13, 23, 7], [550, 773, 18, 13, 17, 7], [611, 5, 17, 16, 17, 4], [611, 56, 14, 16, 14, 4], [611, 115, 16, 7, 16, 12], [611, 156, 25, 18, 23, 2], [611, 209, 17, 19, 15, 4], [611, 263, 19, 12, 17, 7], [611, 311, 20, 16, 20, 4], [611, 365, 19, 12, 19, 7], [611, 417, 19, 12, 19, 8], [611, 475, 24, 5, 26, 15], [611, 511, 1, 1, 17, 1], [611, 562, 19, 20, 17, 0], [611, 615, 20, 18, 17, 2], [611, 666, 20, 18, 17, 2], [611, 719, 24, 16, 22, 4], [611, 773, 24, 13, 23, 7], [672, 12, 15, 4, 14, 11], [672, 63, 21, 4, 20, 11], [672, 107, 18, 8, 16, 4], [672, 158, 18, 8, 16, 4], [672, 209, 13, 8, 11, 4], [672, 260, 13, 8, 11, 4], [672, 315, 17, 10, 16, 8], [672, 365, 19, 13, 20, 7], [672, 413, 19, 20, 17, 4], [1, 1, 1, 1, 11, 1], [794, 769, 16, 5, 14, 3], [672, 568, 20, 10, 19, 6], [672, 620, 15, 12, 14, 7], [672, 672, 14, 12, 14, 8], [672, 719, 22, 16, 20, 4], [672, 770, 22, 16, 20, 4], [733, 5, 16, 12, 14, 4], [733, 62, 12, 5, 11, 10], [733, 118, 11, 8, 11, 15], [733, 169, 16, 8, 16, 15], [733, 209, 28, 16, 28, 4], [733, 256, 19, 20, 17, 0], [733, 307, 18, 20, 16, 0], [733, 358, 19, 20, 17, 0], [733, 410, 18, 19, 16, 1], [733, 460, 18, 20, 16, 0], [733, 511, 15, 20, 14, 0], [733, 562, 17, 20, 14, 0], [733, 614, 17, 19, 14, 1], [733, 664, 16, 20, 14, 0], [733, 715, 19, 20, 17, 0], [733, 766, 19, 20, 17, 0], [1, 1, 1, 1, 11, 1], [794, 52, 19, 20, 17, 0], [794, 103, 19, 20, 17, 0], [794, 154, 19, 20, 17, 0], [794, 205, 19, 20, 17, 0], [794, 263, 13, 13, 11, 7], [794, 310, 16, 5, 14, 3], [794, 360, 20, 6, 17, 2], [794, 413, 16, 4, 14, 4], [794, 463, 17, 5, 14, 3], [794, 515, 14, 4, 14, 4], [794, 562, 17, 8, 14, 0], [794, 631, 11, 6, 14, 18], [794, 667, 16, 5, 14, 3], [794, 733, 12, 6, 14, 18], [794, 769, 16, 5, 14, 3], [855, 4, 16, 5, 14, 3], [855, 55, 16, 5, 14, 3], [855, 106, 16, 5, 14, 3], [855, 157, 16, 5, 14, 3], [855, 208, 16, 5, 14, 3], [855, 259, 16, 5, 14, 3], [855, 310, 16, 5, 14, 3], [855, 361, 16, 5, 14, 3], [855, 412, 16, 5, 14, 3], [855, 463, 16, 5, 14, 3], [855, 514, 16, 5, 14, 3], [855, 565, 16, 5, 14, 3], [855, 616, 16, 5, 14, 3], [855, 667, 16, 5, 14, 3], [855, 718, 16, 5, 14, 3], [855, 769, 16, 5, 14, 3]], \"capHeight\": 19, \"widestlogicalchar\": 28, \"widestglyph\": 28, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 56, 13, 14, 13, 4], [1, 107, 16, 5, 15, 4], [1, 158, 21, 12, 19, 4], [1, 207, 17, 18, 15, 2], [1, 260, 21, 14, 21, 4], [1, 311, 20, 14, 19, 4], [1, 362, 11, 5, 9, 4], [1, 411, 15, 18, 12, 2], [1, 462, 13, 18, 12, 2], [1, 516, 15, 9, 15, 5], [1, 570, 16, 8, 15, 8], [1, 628, 10, 6, 10, 15], [1, 675, 16, 2, 15, 11], [1, 730, 10, 3, 10, 15], [1, 768, 18, 16, 15, 2], [62, 5, 18, 14, 16, 4], [62, 56, 15, 14, 16, 4], [62, 107, 18, 14, 16, 4], [62, 158, 18, 14, 16, 4], [62, 209, 16, 14, 16, 4], [62, 260, 18, 14, 16, 4], [62, 311, 17, 14, 16, 4], [62, 362, 18, 14, 16, 4], [62, 413, 18, 14, 16, 4], [62, 464, 18, 14, 16, 4], [62, 518, 12, 11, 10, 7], [62, 569, 12, 14, 10, 7], [62, 618, 14, 11, 13, 5], [62, 674, 17, 5, 16, 10], [62, 720, 15, 11, 13, 5], [62, 770, 18, 14, 16, 4], [123, 5, 22, 14, 21, 4], [123, 56, 18, 14, 16, 4], [123, 107, 18, 14, 16, 4], [123, 158, 18, 14, 16, 4], [123, 209, 18, 14, 16, 4], [123, 260, 17, 14, 15, 4], [123, 311, 17, 14, 15, 4], [123, 362, 18, 14, 16, 4], [123, 413, 18, 14, 16, 4], [123, 464, 13, 14, 13, 4], [123, 515, 16, 14, 15, 4], [123, 566, 20, 14, 18, 4], [123, 617, 14, 14, 15, 4], [123, 668, 24, 14, 22, 4], [123, 719, 20, 14, 18, 4], [123, 770, 18, 14, 16, 4], [184, 5, 18, 14, 16, 4], [184, 56, 18, 16, 16, 4], [184, 107, 18, 14, 16, 4], [184, 158, 17, 14, 15, 4], [184, 209, 16, 14, 13, 4], [184, 260, 18, 14, 16, 4], [184, 311, 18, 14, 16, 4], [184, 362, 24, 14, 22, 4], [184, 413, 18, 14, 16, 4], [184, 464, 18, 14, 16, 4], [184, 515, 18, 14, 16, 4], [184, 564, 15, 18, 12, 2], [184, 615, 14, 16, 15, 2], [184, 666, 14, 18, 11, 2], [184, 719, 17, 5, 16, 4], [184, 784, 16, 2, 16, 18], [245, 4, 14, 3, 13, 3], [245, 59, 17, 11, 16, 7], [245, 107, 17, 14, 16, 4], [245, 161, 16, 11, 15, 7], [245, 209, 18, 14, 16, 4], [245, 263, 17, 11, 16, 7], [245, 311, 17, 14, 14, 4], [245, 365, 18, 15, 16, 7], [245, 413, 17, 14, 16, 4], [245, 464, 12, 14, 10, 4], [245, 515, 15, 17, 13, 4], [245, 566, 18, 14, 16, 4], [245, 617, 12, 14, 10, 4], [245, 671, 23, 11, 22, 7], [245, 722, 17, 11, 16, 7], [245, 773, 17, 11, 16, 7], [306, 8, 17, 14, 16, 7], [306, 59, 18, 14, 16, 7], [306, 110, 16, 11, 13, 7], [306, 161, 17, 11, 15, 7], [306, 209, 16, 14, 14, 4], [306, 263, 18, 11, 16, 7], [306, 314, 18, 11, 16, 7], [306, 365, 24, 11, 22, 7], [306, 416, 18, 11, 16, 7], [306, 467, 18, 15, 16, 7], [306, 518, 18, 11, 16, 7], [306, 564, 16, 18, 13, 2], [306, 616, 13, 17, 12, 3], [306, 666, 14, 18, 13, 2], [306, 722, 18, 4, 16, 7], [306, 770, 14, 14, 12, 4], [367, 2, 18, 17, 16, 1], [367, 53, 18, 17, 16, 1], [367, 107, 18, 18, 16, 4], [367, 154, 17, 18, 15, 0], [367, 207, 20, 16, 18, 2], [367, 257, 18, 17, 16, 1], [367, 308, 18, 17, 16, 1], [367, 361, 17, 15, 16, 3], [367, 412, 17, 15, 16, 3], [367, 463, 17, 15, 16, 3], [367, 515, 17, 14, 16, 4], [367, 564, 19, 16, 16, 2], [367, 613, 18, 18, 16, 0], [367, 671, 16, 15, 15, 7], [367, 718, 17, 15, 16, 3], [367, 769, 17, 15, 16, 3], [428, 4, 17, 15, 16, 3], [428, 56, 17, 14, 16, 4], [428, 106, 11, 15, 10, 3], [428, 157, 12, 15, 10, 3], [428, 208, 14, 15, 10, 3], [428, 260, 14, 14, 10, 4], [428, 309, 19, 16, 16, 2], [428, 361, 17, 15, 16, 3], [428, 412, 17, 15, 16, 3], [428, 463, 17, 15, 16, 3], [428, 515, 17, 14, 16, 4], [428, 564, 19, 16, 16, 2], [428, 616, 18, 15, 16, 3], [428, 667, 18, 15, 16, 3], [428, 718, 18, 15, 16, 3], [428, 770, 18, 14, 16, 4], [489, 5, 15, 9, 13, 4], [489, 56, 15, 6, 13, 4], [489, 105, 17, 15, 15, 2], [489, 158, 18, 14, 18, 4], [489, 209, 17, 18, 15, 4], [489, 263, 16, 8, 15, 7], [489, 311, 21, 14, 20, 4], [489, 362, 18, 14, 16, 4], [489, 413, 20, 14, 19, 4], [489, 464, 20, 14, 19, 4], [489, 515, 23, 6, 21, 4], [489, 565, 13, 3, 13, 3], [489, 617, 15, 2, 13, 4], [489, 672, 18, 9, 18, 8], [489, 719, 23, 14, 21, 4], [489, 770, 18, 14, 16, 4], [550, 8, 25, 8, 25, 7], [550, 58, 16, 12, 16, 6], [550, 109, 14, 12, 15, 6], [550, 161, 15, 11, 15, 7], [550, 209, 18, 14, 16, 4], [550, 263, 20, 14, 19, 7], [550, 311, 17, 14, 16, 4], [550, 362, 19, 16, 18, 4], [550, 413, 22, 15, 21, 4], [550, 465, 24, 13, 22, 5], [550, 515, 16, 17, 14, 4], [550, 566, 17, 13, 15, 4], [550, 617, 17, 13, 15, 4], [550, 668, 21, 14, 19, 4], [550, 722, 23, 11, 22, 7], [550, 773, 17, 11, 16, 7], [611, 5, 16, 14, 16, 4], [611, 56, 13, 14, 13, 4], [611, 115, 15, 5, 15, 12], [611, 156, 24, 16, 22, 2], [611, 209, 16, 17, 14, 4], [611, 263, 18, 10, 16, 7], [611, 311, 19, 14, 19, 4], [611, 365, 18, 10, 18, 7], [611, 417, 18, 10, 18, 8], [611, 475, 23, 3, 25, 15], [611, 511, 1, 1, 16, 1], [611, 562, 18, 18, 16, 0], [611, 615, 19, 16, 16, 2], [611, 666, 19, 16, 16, 2], [611, 719, 23, 14, 21, 4], [611, 773, 23, 11, 22, 7], [672, 12, 14, 2, 13, 11], [672, 63, 20, 2, 19, 11], [672, 107, 17, 6, 15, 4], [672, 158, 17, 6, 15, 4], [672, 209, 12, 6, 10, 4], [672, 260, 12, 6, 10, 4], [672, 315, 16, 8, 15, 8], [672, 365, 18, 11, 19, 7], [672, 413, 18, 18, 16, 4], [1, 1, 1, 1, 10, 1], [794, 769, 15, 3, 13, 3], [672, 568, 19, 8, 18, 6], [672, 620, 14, 10, 13, 7], [672, 672, 13, 10, 13, 8], [672, 719, 21, 14, 19, 4], [672, 770, 21, 14, 19, 4], [733, 5, 15, 10, 13, 4], [733, 62, 11, 3, 10, 10], [733, 118, 10, 6, 10, 15], [733, 169, 15, 6, 15, 15], [733, 209, 27, 14, 27, 4], [733, 256, 18, 18, 16, 0], [733, 307, 17, 18, 15, 0], [733, 358, 18, 18, 16, 0], [733, 410, 17, 17, 15, 1], [733, 460, 17, 18, 15, 0], [733, 511, 13, 18, 13, 0], [733, 562, 16, 18, 13, 0], [733, 614, 16, 17, 13, 1], [733, 664, 15, 18, 13, 0], [733, 715, 18, 18, 16, 0], [733, 766, 18, 18, 16, 0], [1, 1, 1, 1, 10, 1], [794, 52, 18, 18, 16, 0], [794, 103, 18, 18, 16, 0], [794, 154, 18, 18, 16, 0], [794, 205, 18, 18, 16, 0], [794, 263, 12, 11, 10, 7], [794, 310, 15, 3, 13, 3], [794, 360, 19, 4, 16, 2], [794, 413, 15, 2, 13, 4], [794, 463, 16, 3, 13, 3], [794, 515, 13, 2, 13, 4], [794, 562, 16, 6, 13, 0], [794, 631, 10, 4, 13, 18], [794, 667, 15, 3, 13, 3], [794, 733, 11, 4, 13, 18], [794, 769, 15, 3, 13, 3], [855, 4, 15, 3, 13, 3], [855, 55, 15, 3, 13, 3], [855, 106, 15, 3, 13, 3], [855, 157, 15, 3, 13, 3], [855, 208, 15, 3, 13, 3], [855, 259, 15, 3, 13, 3], [855, 310, 15, 3, 13, 3], [855, 361, 15, 3, 13, 3], [855, 412, 15, 3, 13, 3], [855, 463, 15, 3, 13, 3], [855, 514, 15, 3, 13, 3], [855, 565, 15, 3, 13, 3], [855, 616, 15, 3, 13, 3], [855, 667, 15, 3, 13, 3], [855, 718, 15, 3, 13, 3], [855, 769, 15, 3, 13, 3]], \"capHeight\": 18, \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 11, 6, 11, 13], [1, 56, 14, 16, 14, 4], [1, 107, 16, 15, 16, 4], [1, 158, 20, 15, 20, 4], [1, 207, 16, 20, 16, 2], [1, 260, 22, 16, 22, 4], [1, 311, 20, 16, 20, 4], [1, 362, 10, 15, 10, 4], [1, 411, 13, 20, 13, 2], [1, 462, 13, 20, 13, 2], [1, 516, 16, 14, 16, 5], [1, 570, 16, 11, 16, 8], [1, 626, 11, 10, 11, 13], [1, 675, 16, 8, 16, 11], [1, 728, 11, 7, 11, 13], [1, 768, 16, 18, 16, 2], [62, 5, 17, 16, 17, 4], [62, 56, 17, 16, 17, 4], [62, 107, 17, 16, 17, 4], [62, 158, 17, 16, 17, 4], [62, 209, 17, 16, 17, 4], [62, 260, 17, 16, 17, 4], [62, 311, 17, 16, 17, 4], [62, 362, 17, 16, 17, 4], [62, 413, 17, 16, 17, 4], [62, 464, 17, 16, 17, 4], [62, 518, 11, 13, 11, 7], [62, 569, 11, 16, 11, 7], [62, 618, 14, 14, 14, 5], [62, 674, 17, 9, 17, 10], [62, 720, 14, 14, 14, 5], [62, 770, 17, 16, 17, 4], [123, 5, 22, 16, 22, 4], [123, 56, 17, 16, 17, 4], [123, 107, 17, 16, 17, 4], [123, 158, 17, 16, 17, 4], [123, 209, 17, 16, 17, 4], [123, 260, 16, 16, 16, 4], [123, 311, 16, 16, 16, 4], [123, 362, 17, 16, 17, 4], [123, 413, 17, 16, 17, 4], [123, 464, 14, 16, 14, 4], [123, 515, 16, 16, 16, 4], [123, 566, 19, 16, 19, 4], [123, 617, 16, 16, 16, 4], [123, 668, 23, 16, 23, 4], [123, 719, 19, 16, 19, 4], [123, 770, 17, 16, 17, 4], [184, 5, 17, 16, 17, 4], [184, 56, 17, 18, 17, 4], [184, 107, 17, 16, 17, 4], [184, 158, 16, 16, 16, 4], [184, 209, 14, 16, 14, 4], [184, 260, 17, 16, 17, 4], [184, 311, 17, 16, 17, 4], [184, 362, 23, 16, 23, 4], [184, 413, 17, 16, 17, 4], [184, 464, 17, 16, 17, 4], [184, 515, 17, 16, 17, 4], [184, 564, 13, 20, 13, 2], [184, 615, 16, 18, 16, 2], [184, 666, 12, 20, 12, 2], [184, 719, 17, 15, 17, 4], [184, 779, 17, 9, 17, 13], [245, 4, 14, 16, 14, 3], [245, 59, 17, 13, 17, 7], [245, 107, 17, 16, 17, 4], [245, 161, 16, 13, 16, 7], [245, 209, 17, 16, 17, 4], [245, 263, 17, 13, 17, 7], [245, 311, 15, 16, 15, 4], [245, 365, 17, 17, 17, 7], [245, 413, 17, 16, 17, 4], [245, 464, 11, 16, 11, 4], [245, 515, 14, 19, 14, 4], [245, 566, 17, 16, 17, 4], [245, 617, 11, 16, 11, 4], [245, 671, 23, 13, 23, 7], [245, 722, 17, 13, 17, 7], [245, 773, 17, 13, 17, 7], [306, 8, 17, 16, 17, 7], [306, 59, 17, 16, 17, 7], [306, 110, 14, 13, 14, 7], [306, 161, 16, 13, 16, 7], [306, 209, 15, 16, 15, 4], [306, 263, 17, 13, 17, 7], [306, 314, 17, 13, 17, 7], [306, 365, 23, 13, 23, 7], [306, 416, 17, 13, 17, 7], [306, 467, 17, 17, 17, 7], [306, 518, 17, 13, 17, 7], [306, 564, 14, 20, 14, 2], [306, 616, 13, 19, 13, 3], [306, 666, 14, 20, 14, 2], [306, 722, 17, 12, 17, 7], [306, 770, 13, 16, 13, 4], [367, 2, 17, 19, 17, 1], [367, 53, 17, 19, 17, 1], [367, 107, 17, 20, 17, 4], [367, 154, 16, 20, 16, 0], [367, 207, 19, 18, 19, 2], [367, 257, 17, 19, 17, 1], [367, 308, 17, 19, 17, 1], [367, 361, 17, 17, 17, 3], [367, 412, 17, 17, 17, 3], [367, 463, 17, 17, 17, 3], [367, 515, 17, 16, 17, 4], [367, 564, 17, 18, 17, 2], [367, 613, 17, 20, 17, 0], [367, 671, 16, 17, 16, 7], [367, 718, 17, 17, 17, 3], [367, 769, 17, 17, 17, 3], [428, 4, 17, 17, 17, 3], [428, 56, 17, 16, 17, 4], [428, 106, 11, 17, 11, 3], [428, 157, 11, 17, 11, 3], [428, 208, 11, 17, 11, 3], [428, 260, 11, 16, 11, 4], [428, 309, 17, 18, 17, 2], [428, 361, 17, 17, 17, 3], [428, 412, 17, 17, 17, 3], [428, 463, 17, 17, 17, 3], [428, 515, 17, 16, 17, 4], [428, 564, 17, 18, 17, 2], [428, 616, 17, 17, 17, 3], [428, 667, 17, 17, 17, 3], [428, 718, 17, 17, 17, 3], [428, 770, 17, 16, 17, 4], [489, 5, 14, 15, 14, 4], [489, 56, 14, 15, 14, 4], [489, 105, 16, 17, 16, 2], [489, 158, 19, 16, 19, 4], [489, 209, 16, 20, 16, 4], [489, 263, 16, 12, 16, 7], [489, 311, 21, 16, 21, 4], [489, 362, 17, 16, 17, 4], [489, 413, 20, 16, 20, 4], [489, 464, 20, 16, 20, 4], [489, 515, 22, 15, 22, 4], [489, 565, 14, 16, 14, 3], [489, 617, 14, 15, 14, 4], [489, 672, 19, 11, 19, 8], [489, 719, 22, 16, 22, 4], [489, 770, 17, 16, 17, 4], [550, 8, 26, 12, 26, 7], [550, 58, 17, 14, 17, 6], [550, 109, 16, 14, 16, 6], [550, 160, 16, 14, 16, 6], [550, 209, 17, 16, 17, 4], [550, 263, 20, 16, 20, 7], [550, 311, 17, 16, 17, 4], [550, 362, 19, 18, 19, 4], [550, 413, 22, 17, 22, 4], [550, 465, 23, 15, 23, 5], [550, 515, 15, 19, 15, 4], [550, 566, 16, 15, 16, 4], [550, 617, 16, 15, 16, 4], [550, 668, 20, 16, 20, 4], [550, 722, 23, 13, 23, 7], [550, 773, 17, 13, 17, 7], [611, 5, 17, 16, 17, 4], [611, 56, 14, 16, 14, 4], [611, 115, 16, 7, 16, 12], [611, 156, 23, 18, 23, 2], [611, 209, 15, 19, 15, 4], [611, 263, 17, 12, 17, 7], [611, 311, 20, 16, 20, 4], [611, 366, 19, 11, 19, 8], [611, 417, 19, 11, 19, 8], [611, 473, 26, 7, 26, 13], [611, 524, 17, 6, 17, 13], [611, 562, 17, 20, 17, 0], [611, 615, 17, 18, 17, 2], [611, 666, 17, 18, 17, 2], [611, 719, 22, 16, 22, 4], [611, 773, 23, 13, 23, 7], [672, 12, 14, 8, 14, 11], [672, 63, 20, 8, 20, 11], [672, 107, 16, 15, 16, 4], [672, 158, 16, 15, 16, 4], [672, 209, 11, 15, 11, 4], [672, 260, 11, 15, 11, 4], [672, 315, 16, 11, 16, 8], [672, 365, 20, 13, 20, 7], [672, 413, 17, 20, 17, 4], [1, 14, 11, 6, 11, 13], [794, 769, 14, 16, 14, 3], [672, 568, 19, 13, 19, 6], [672, 621, 14, 11, 14, 8], [672, 672, 14, 11, 14, 8], [672, 719, 20, 16, 20, 4], [672, 770, 20, 16, 20, 4], [733, 5, 14, 15, 14, 4], [733, 62, 11, 9, 11, 10], [733, 116, 11, 10, 11, 13], [733, 167, 16, 10, 16, 13], [733, 209, 28, 16, 28, 4], [733, 256, 17, 20, 17, 0], [733, 307, 16, 20, 16, 0], [733, 358, 17, 20, 17, 0], [733, 410, 16, 19, 16, 1], [733, 460, 16, 20, 16, 0], [733, 511, 14, 20, 14, 0], [733, 562, 14, 20, 14, 0], [733, 614, 14, 19, 14, 1], [733, 664, 14, 20, 14, 0], [733, 715, 17, 20, 17, 0], [733, 766, 17, 20, 17, 0], [1, 14, 11, 6, 11, 13], [794, 52, 17, 20, 17, 0], [794, 103, 17, 20, 17, 0], [794, 154, 17, 20, 17, 0], [794, 205, 17, 20, 17, 0], [794, 263, 11, 13, 11, 7], [794, 310, 14, 16, 14, 3], [794, 360, 17, 17, 17, 2], [794, 413, 14, 15, 14, 4], [794, 463, 14, 16, 14, 3], [794, 515, 14, 15, 14, 4], [794, 562, 14, 19, 14, 0], [794, 626, 14, 11, 14, 13], [794, 667, 14, 16, 14, 3], [794, 728, 14, 11, 14, 13], [794, 769, 14, 16, 14, 3], [855, 4, 14, 16, 14, 3], [855, 55, 14, 16, 14, 3], [855, 106, 14, 16, 14, 3], [855, 157, 14, 16, 14, 3], [855, 208, 14, 16, 14, 3], [855, 259, 14, 16, 14, 3], [855, 310, 14, 16, 14, 3], [855, 361, 14, 16, 14, 3], [855, 412, 14, 16, 14, 3], [855, 463, 14, 16, 14, 3], [855, 514, 14, 16, 14, 3], [855, 565, 14, 16, 14, 3], [855, 616, 14, 16, 14, 3], [855, 667, 14, 16, 14, 3], [855, 718, 14, 16, 14, 3], [855, 769, 14, 16, 14, 3]], \"widestlogicalchar\": 28, \"widestglyph\": 28, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 10, 6, 10, 12], [1, 56, 13, 14, 13, 4], [1, 107, 15, 14, 15, 4], [1, 158, 19, 14, 19, 4], [1, 207, 15, 18, 15, 2], [1, 260, 21, 14, 21, 4], [1, 311, 19, 14, 19, 4], [1, 362, 9, 14, 9, 4], [1, 411, 12, 18, 12, 2], [1, 462, 12, 18, 12, 2], [1, 516, 15, 13, 15, 5], [1, 570, 15, 10, 15, 8], [1, 625, 10, 9, 10, 12], [1, 675, 15, 7, 15, 11], [1, 727, 10, 6, 10, 12], [1, 768, 15, 16, 15, 2], [62, 5, 16, 14, 16, 4], [62, 56, 16, 14, 16, 4], [62, 107, 16, 14, 16, 4], [62, 158, 16, 14, 16, 4], [62, 209, 16, 14, 16, 4], [62, 260, 16, 14, 16, 4], [62, 311, 16, 14, 16, 4], [62, 362, 16, 14, 16, 4], [62, 413, 16, 14, 16, 4], [62, 464, 16, 14, 16, 4], [62, 518, 10, 11, 10, 7], [62, 569, 10, 14, 10, 7], [62, 618, 13, 13, 13, 5], [62, 674, 16, 8, 16, 10], [62, 720, 13, 13, 13, 5], [62, 770, 16, 14, 16, 4], [123, 5, 21, 14, 21, 4], [123, 56, 16, 14, 16, 4], [123, 107, 16, 14, 16, 4], [123, 158, 16, 14, 16, 4], [123, 209, 16, 14, 16, 4], [123, 260, 15, 14, 15, 4], [123, 311, 15, 14, 15, 4], [123, 362, 16, 14, 16, 4], [123, 413, 16, 14, 16, 4], [123, 464, 13, 14, 13, 4], [123, 515, 15, 14, 15, 4], [123, 566, 18, 14, 18, 4], [123, 617, 15, 14, 15, 4], [123, 668, 22, 14, 22, 4], [123, 719, 18, 14, 18, 4], [123, 770, 16, 14, 16, 4], [184, 5, 16, 14, 16, 4], [184, 56, 16, 16, 16, 4], [184, 107, 16, 14, 16, 4], [184, 158, 15, 14, 15, 4], [184, 209, 13, 14, 13, 4], [184, 260, 16, 14, 16, 4], [184, 311, 16, 14, 16, 4], [184, 362, 22, 14, 22, 4], [184, 413, 16, 14, 16, 4], [184, 464, 16, 14, 16, 4], [184, 515, 16, 14, 16, 4], [184, 564, 12, 18, 12, 2], [184, 615, 15, 16, 15, 2], [184, 666, 11, 18, 11, 2], [184, 719, 16, 14, 16, 4], [184, 778, 16, 8, 16, 12], [245, 4, 13, 15, 13, 3], [245, 59, 16, 11, 16, 7], [245, 107, 16, 14, 16, 4], [245, 161, 15, 11, 15, 7], [245, 209, 16, 14, 16, 4], [245, 263, 16, 11, 16, 7], [245, 311, 14, 14, 14, 4], [245, 365, 16, 15, 16, 7], [245, 413, 16, 14, 16, 4], [245, 464, 10, 14, 10, 4], [245, 515, 13, 17, 13, 4], [245, 566, 16, 14, 16, 4], [245, 617, 10, 14, 10, 4], [245, 671, 22, 11, 22, 7], [245, 722, 16, 11, 16, 7], [245, 773, 16, 11, 16, 7], [306, 8, 16, 14, 16, 7], [306, 59, 16, 14, 16, 7], [306, 110, 13, 11, 13, 7], [306, 161, 15, 11, 15, 7], [306, 209, 14, 14, 14, 4], [306, 263, 16, 11, 16, 7], [306, 314, 16, 11, 16, 7], [306, 365, 22, 11, 22, 7], [306, 416, 16, 11, 16, 7], [306, 467, 16, 15, 16, 7], [306, 518, 16, 11, 16, 7], [306, 564, 13, 18, 13, 2], [306, 616, 12, 17, 12, 3], [306, 666, 13, 18, 13, 2], [306, 722, 16, 11, 16, 7], [306, 770, 12, 14, 12, 4], [367, 2, 16, 17, 16, 1], [367, 53, 16, 17, 16, 1], [367, 107, 16, 18, 16, 4], [367, 154, 15, 18, 15, 0], [367, 207, 18, 16, 18, 2], [367, 257, 16, 17, 16, 1], [367, 308, 16, 17, 16, 1], [367, 361, 16, 15, 16, 3], [367, 412, 16, 15, 16, 3], [367, 463, 16, 15, 16, 3], [367, 515, 16, 14, 16, 4], [367, 564, 16, 16, 16, 2], [367, 613, 16, 18, 16, 0], [367, 671, 15, 15, 15, 7], [367, 718, 16, 15, 16, 3], [367, 769, 16, 15, 16, 3], [428, 4, 16, 15, 16, 3], [428, 56, 16, 14, 16, 4], [428, 106, 10, 15, 10, 3], [428, 157, 10, 15, 10, 3], [428, 208, 10, 15, 10, 3], [428, 260, 10, 14, 10, 4], [428, 309, 16, 16, 16, 2], [428, 361, 16, 15, 16, 3], [428, 412, 16, 15, 16, 3], [428, 463, 16, 15, 16, 3], [428, 515, 16, 14, 16, 4], [428, 564, 16, 16, 16, 2], [428, 616, 16, 15, 16, 3], [428, 667, 16, 15, 16, 3], [428, 718, 16, 15, 16, 3], [428, 770, 16, 14, 16, 4], [489, 5, 13, 14, 13, 4], [489, 56, 13, 14, 13, 4], [489, 105, 15, 16, 15, 2], [489, 158, 18, 14, 18, 4], [489, 209, 15, 18, 15, 4], [489, 263, 15, 11, 15, 7], [489, 311, 20, 14, 20, 4], [489, 362, 16, 14, 16, 4], [489, 413, 19, 14, 19, 4], [489, 464, 19, 14, 19, 4], [489, 515, 21, 14, 21, 4], [489, 565, 13, 15, 13, 3], [489, 617, 13, 14, 13, 4], [489, 672, 18, 10, 18, 8], [489, 719, 21, 14, 21, 4], [489, 770, 16, 14, 16, 4], [550, 8, 25, 11, 25, 7], [550, 58, 16, 12, 16, 6], [550, 109, 15, 12, 15, 6], [550, 160, 15, 12, 15, 6], [550, 209, 16, 14, 16, 4], [550, 263, 19, 14, 19, 7], [550, 311, 16, 14, 16, 4], [550, 362, 18, 16, 18, 4], [550, 413, 21, 15, 21, 4], [550, 465, 22, 13, 22, 5], [550, 515, 14, 17, 14, 4], [550, 566, 15, 14, 15, 4], [550, 617, 15, 14, 15, 4], [550, 668, 19, 14, 19, 4], [550, 722, 22, 11, 22, 7], [550, 773, 16, 11, 16, 7], [611, 5, 16, 14, 16, 4], [611, 56, 13, 14, 13, 4], [611, 115, 15, 6, 15, 12], [611, 156, 22, 16, 22, 2], [611, 209, 14, 17, 14, 4], [611, 263, 16, 11, 16, 7], [611, 311, 19, 14, 19, 4], [611, 366, 18, 10, 18, 8], [611, 417, 18, 10, 18, 8], [611, 472, 25, 6, 25, 12], [611, 523, 16, 6, 16, 12], [611, 562, 16, 18, 16, 0], [611, 615, 16, 16, 16, 2], [611, 666, 16, 16, 16, 2], [611, 719, 21, 14, 21, 4], [611, 773, 22, 11, 22, 7], [672, 12, 13, 7, 13, 11], [672, 63, 19, 7, 19, 11], [672, 107, 15, 14, 15, 4], [672, 158, 15, 14, 15, 4], [672, 209, 10, 14, 10, 4], [672, 260, 10, 14, 10, 4], [672, 315, 15, 10, 15, 8], [672, 365, 19, 11, 19, 7], [672, 413, 16, 18, 16, 4], [1, 13, 10, 6, 10, 12], [794, 769, 13, 15, 13, 3], [672, 568, 18, 12, 18, 6], [672, 621, 13, 10, 13, 8], [672, 672, 13, 10, 13, 8], [672, 719, 19, 14, 19, 4], [672, 770, 19, 14, 19, 4], [733, 5, 13, 14, 13, 4], [733, 62, 10, 8, 10, 10], [733, 115, 10, 9, 10, 12], [733, 166, 15, 9, 15, 12], [733, 209, 27, 14, 27, 4], [733, 256, 16, 18, 16, 0], [733, 307, 15, 18, 15, 0], [733, 358, 16, 18, 16, 0], [733, 410, 15, 17, 15, 1], [733, 460, 15, 18, 15, 0], [733, 511, 13, 18, 13, 0], [733, 562, 13, 18, 13, 0], [733, 614, 13, 17, 13, 1], [733, 664, 13, 18, 13, 0], [733, 715, 16, 18, 16, 0], [733, 766, 16, 18, 16, 0], [1, 13, 10, 6, 10, 12], [794, 52, 16, 18, 16, 0], [794, 103, 16, 18, 16, 0], [794, 154, 16, 18, 16, 0], [794, 205, 16, 18, 16, 0], [794, 263, 10, 11, 10, 7], [794, 310, 13, 15, 13, 3], [794, 360, 16, 16, 16, 2], [794, 413, 13, 14, 13, 4], [794, 463, 13, 15, 13, 3], [794, 515, 13, 14, 13, 4], [794, 562, 13, 18, 13, 0], [794, 625, 13, 10, 13, 12], [794, 667, 13, 15, 13, 3], [794, 727, 13, 10, 13, 12], [794, 769, 13, 15, 13, 3], [855, 4, 13, 15, 13, 3], [855, 55, 13, 15, 13, 3], [855, 106, 13, 15, 13, 3], [855, 157, 13, 15, 13, 3], [855, 208, 13, 15, 13, 3], [855, 259, 13, 15, 13, 3], [855, 310, 13, 15, 13, 3], [855, 361, 13, 15, 13, 3], [855, 412, 13, 15, 13, 3], [855, 463, 13, 15, 13, 3], [855, 514, 13, 15, 13, 3], [855, 565, 13, 15, 13, 3], [855, 616, 13, 15, 13, 3], [855, 667, 13, 15, 13, 3], [855, 718, 13, 15, 13, 3], [855, 769, 13, 15, 13, 3]], \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 56, 13, 16, 13, 4], [1, 107, 16, 7, 15, 4], [1, 158, 21, 14, 19, 4], [1, 207, 17, 20, 15, 2], [1, 260, 21, 16, 21, 4], [1, 311, 20, 16, 19, 4], [1, 362, 11, 7, 9, 4], [1, 411, 15, 20, 12, 2], [1, 462, 13, 20, 12, 2], [1, 516, 15, 11, 15, 5], [1, 570, 16, 10, 15, 8], [1, 628, 10, 8, 10, 15], [1, 675, 16, 4, 15, 11], [1, 730, 10, 5, 10, 15], [1, 768, 18, 18, 15, 2], [62, 5, 18, 16, 16, 4], [62, 56, 15, 16, 16, 4], [62, 107, 18, 16, 16, 4], [62, 158, 18, 16, 16, 4], [62, 209, 16, 16, 16, 4], [62, 260, 18, 16, 16, 4], [62, 311, 17, 16, 16, 4], [62, 362, 18, 16, 16, 4], [62, 413, 18, 16, 16, 4], [62, 464, 18, 16, 16, 4], [62, 518, 12, 13, 10, 7], [62, 569, 12, 16, 10, 7], [62, 618, 14, 13, 13, 5], [62, 674, 17, 7, 16, 10], [62, 720, 15, 13, 13, 5], [62, 770, 18, 16, 16, 4], [123, 5, 22, 16, 21, 4], [123, 56, 18, 16, 16, 4], [123, 107, 18, 16, 16, 4], [123, 158, 18, 16, 16, 4], [123, 209, 18, 16, 16, 4], [123, 260, 17, 16, 15, 4], [123, 311, 17, 16, 15, 4], [123, 362, 18, 16, 16, 4], [123, 413, 18, 16, 16, 4], [123, 464, 13, 16, 13, 4], [123, 515, 16, 16, 15, 4], [123, 566, 20, 16, 18, 4], [123, 617, 14, 16, 15, 4], [123, 668, 24, 16, 22, 4], [123, 719, 20, 16, 18, 4], [123, 770, 18, 16, 16, 4], [184, 5, 18, 16, 16, 4], [184, 56, 18, 18, 16, 4], [184, 107, 18, 16, 16, 4], [184, 158, 17, 16, 15, 4], [184, 209, 16, 16, 13, 4], [184, 260, 18, 16, 16, 4], [184, 311, 18, 16, 16, 4], [184, 362, 24, 16, 22, 4], [184, 413, 18, 16, 16, 4], [184, 464, 18, 16, 16, 4], [184, 515, 18, 16, 16, 4], [184, 564, 15, 20, 12, 2], [184, 615, 14, 18, 15, 2], [184, 666, 14, 20, 11, 2], [184, 719, 17, 7, 16, 4], [184, 784, 16, 4, 16, 18], [245, 4, 14, 5, 13, 3], [245, 59, 17, 13, 16, 7], [245, 107, 17, 16, 16, 4], [245, 161, 16, 13, 15, 7], [245, 209, 18, 16, 16, 4], [245, 263, 17, 13, 16, 7], [245, 311, 17, 16, 14, 4], [245, 365, 18, 17, 16, 7], [245, 413, 17, 16, 16, 4], [245, 464, 12, 16, 10, 4], [245, 515, 15, 19, 13, 4], [245, 566, 18, 16, 16, 4], [245, 617, 12, 16, 10, 4], [245, 671, 23, 13, 22, 7], [245, 722, 17, 13, 16, 7], [245, 773, 17, 13, 16, 7], [306, 8, 17, 16, 16, 7], [306, 59, 18, 16, 16, 7], [306, 110, 16, 13, 13, 7], [306, 161, 17, 13, 15, 7], [306, 209, 16, 16, 14, 4], [306, 263, 18, 13, 16, 7], [306, 314, 18, 13, 16, 7], [306, 365, 24, 13, 22, 7], [306, 416, 18, 13, 16, 7], [306, 467, 18, 17, 16, 7], [306, 518, 18, 13, 16, 7], [306, 564, 16, 20, 13, 2], [306, 616, 13, 19, 12, 3], [306, 666, 14, 20, 13, 2], [306, 722, 18, 6, 16, 7], [306, 770, 14, 16, 12, 4], [367, 2, 18, 19, 16, 1], [367, 53, 18, 19, 16, 1], [367, 107, 18, 20, 16, 4], [367, 154, 17, 20, 15, 0], [367, 207, 20, 18, 18, 2], [367, 257, 18, 19, 16, 1], [367, 308, 18, 19, 16, 1], [367, 361, 17, 17, 16, 3], [367, 412, 17, 17, 16, 3], [367, 463, 17, 17, 16, 3], [367, 515, 17, 16, 16, 4], [367, 564, 19, 18, 16, 2], [367, 613, 18, 20, 16, 0], [367, 671, 16, 17, 15, 7], [367, 718, 17, 17, 16, 3], [367, 769, 17, 17, 16, 3], [428, 4, 17, 17, 16, 3], [428, 56, 17, 16, 16, 4], [428, 106, 11, 17, 10, 3], [428, 157, 12, 17, 10, 3], [428, 208, 14, 17, 10, 3], [428, 260, 14, 16, 10, 4], [428, 309, 19, 18, 16, 2], [428, 361, 17, 17, 16, 3], [428, 412, 17, 17, 16, 3], [428, 463, 17, 17, 16, 3], [428, 515, 17, 16, 16, 4], [428, 564, 19, 18, 16, 2], [428, 616, 18, 17, 16, 3], [428, 667, 18, 17, 16, 3], [428, 718, 18, 17, 16, 3], [428, 770, 18, 16, 16, 4], [489, 5, 15, 11, 13, 4], [489, 56, 15, 8, 13, 4], [489, 105, 17, 17, 15, 2], [489, 158, 18, 16, 18, 4], [489, 209, 17, 20, 15, 4], [489, 263, 16, 10, 15, 7], [489, 311, 21, 16, 20, 4], [489, 362, 18, 16, 16, 4], [489, 413, 20, 16, 19, 4], [489, 464, 20, 16, 19, 4], [489, 515, 23, 8, 21, 4], [489, 565, 13, 5, 13, 3], [489, 617, 15, 4, 13, 4], [489, 672, 18, 11, 18, 8], [489, 719, 23, 16, 21, 4], [489, 770, 18, 16, 16, 4], [550, 8, 25, 10, 25, 7], [550, 58, 16, 14, 16, 6], [550, 109, 14, 14, 15, 6], [550, 161, 15, 13, 15, 7], [550, 209, 18, 16, 16, 4], [550, 263, 20, 16, 19, 7], [550, 311, 17, 16, 16, 4], [550, 362, 19, 18, 18, 4], [550, 413, 22, 17, 21, 4], [550, 465, 24, 15, 22, 5], [550, 515, 16, 19, 14, 4], [550, 566, 17, 15, 15, 4], [550, 617, 17, 15, 15, 4], [550, 668, 21, 16, 19, 4], [550, 722, 23, 13, 22, 7], [550, 773, 17, 13, 16, 7], [611, 5, 16, 16, 16, 4], [611, 56, 13, 16, 13, 4], [611, 115, 15, 7, 15, 12], [611, 156, 24, 18, 22, 2], [611, 209, 16, 19, 14, 4], [611, 263, 18, 12, 16, 7], [611, 311, 19, 16, 19, 4], [611, 365, 18, 12, 18, 7], [611, 417, 18, 12, 18, 8], [611, 475, 23, 5, 25, 15], [611, 511, 1, 1, 16, 1], [611, 562, 18, 20, 16, 0], [611, 615, 19, 18, 16, 2], [611, 666, 19, 18, 16, 2], [611, 719, 23, 16, 21, 4], [611, 773, 23, 13, 22, 7], [672, 12, 14, 4, 13, 11], [672, 63, 20, 4, 19, 11], [672, 107, 17, 8, 15, 4], [672, 158, 17, 8, 15, 4], [672, 209, 12, 8, 10, 4], [672, 260, 12, 8, 10, 4], [672, 315, 16, 10, 15, 8], [672, 365, 18, 13, 19, 7], [672, 413, 18, 20, 16, 4], [1, 1, 1, 1, 10, 1], [794, 769, 15, 5, 13, 3], [672, 568, 19, 10, 18, 6], [672, 620, 14, 12, 13, 7], [672, 672, 13, 12, 13, 8], [672, 719, 21, 16, 19, 4], [672, 770, 21, 16, 19, 4], [733, 5, 15, 12, 13, 4], [733, 62, 11, 5, 10, 10], [733, 118, 10, 8, 10, 15], [733, 169, 15, 8, 15, 15], [733, 209, 27, 16, 27, 4], [733, 256, 18, 20, 16, 0], [733, 307, 17, 20, 15, 0], [733, 358, 18, 20, 16, 0], [733, 410, 17, 19, 15, 1], [733, 460, 17, 20, 15, 0], [733, 511, 14, 20, 13, 0], [733, 562, 16, 20, 13, 0], [733, 614, 16, 19, 13, 1], [733, 664, 15, 20, 13, 0], [733, 715, 18, 20, 16, 0], [733, 766, 18, 20, 16, 0], [1, 1, 1, 1, 10, 1], [794, 52, 18, 20, 16, 0], [794, 103, 18, 20, 16, 0], [794, 154, 18, 20, 16, 0], [794, 205, 18, 20, 16, 0], [794, 263, 12, 13, 10, 7], [794, 310, 15, 5, 13, 3], [794, 360, 19, 6, 16, 2], [794, 413, 15, 4, 13, 4], [794, 463, 16, 5, 13, 3], [794, 515, 13, 4, 13, 4], [794, 562, 16, 8, 13, 0], [794, 631, 10, 6, 13, 18], [794, 667, 15, 5, 13, 3], [794, 733, 11, 6, 13, 18], [794, 769, 15, 5, 13, 3], [855, 4, 15, 5, 13, 3], [855, 55, 15, 5, 13, 3], [855, 106, 15, 5, 13, 3], [855, 157, 15, 5, 13, 3], [855, 208, 15, 5, 13, 3], [855, 259, 15, 5, 13, 3], [855, 310, 15, 5, 13, 3], [855, 361, 15, 5, 13, 3], [855, 412, 15, 5, 13, 3], [855, 463, 15, 5, 13, 3], [855, 514, 15, 5, 13, 3], [855, 565, 15, 5, 13, 3], [855, 616, 15, 5, 13, 3], [855, 667, 15, 5, 13, 3], [855, 718, 15, 5, 13, 3], [855, 769, 15, 5, 13, 3]], \"capHeight\": 19, \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 56, 12, 14, 12, 4], [1, 107, 15, 5, 14, 4], [1, 158, 20, 12, 18, 4], [1, 207, 16, 18, 14, 2], [1, 260, 20, 14, 20, 4], [1, 311, 19, 14, 18, 4], [1, 362, 10, 5, 8, 4], [1, 411, 14, 18, 11, 2], [1, 462, 12, 18, 11, 2], [1, 516, 14, 9, 14, 5], [1, 570, 15, 8, 14, 8], [1, 628, 9, 6, 9, 15], [1, 675, 15, 2, 14, 11], [1, 730, 9, 3, 9, 15], [1, 768, 17, 16, 14, 2], [62, 5, 17, 14, 15, 4], [62, 56, 14, 14, 15, 4], [62, 107, 17, 14, 15, 4], [62, 158, 17, 14, 15, 4], [62, 209, 15, 14, 15, 4], [62, 260, 17, 14, 15, 4], [62, 311, 16, 14, 15, 4], [62, 362, 17, 14, 15, 4], [62, 413, 17, 14, 15, 4], [62, 464, 17, 14, 15, 4], [62, 518, 11, 11, 9, 7], [62, 569, 11, 14, 9, 7], [62, 618, 13, 11, 12, 5], [62, 674, 16, 5, 15, 10], [62, 720, 14, 11, 12, 5], [62, 770, 17, 14, 15, 4], [123, 5, 21, 14, 20, 4], [123, 56, 17, 14, 15, 4], [123, 107, 17, 14, 15, 4], [123, 158, 17, 14, 15, 4], [123, 209, 17, 14, 15, 4], [123, 260, 16, 14, 14, 4], [123, 311, 16, 14, 14, 4], [123, 362, 17, 14, 15, 4], [123, 413, 17, 14, 15, 4], [123, 464, 12, 14, 12, 4], [123, 515, 15, 14, 14, 4], [123, 566, 19, 14, 17, 4], [123, 617, 13, 14, 14, 4], [123, 668, 23, 14, 21, 4], [123, 719, 19, 14, 17, 4], [123, 770, 17, 14, 15, 4], [184, 5, 17, 14, 15, 4], [184, 56, 17, 16, 15, 4], [184, 107, 17, 14, 15, 4], [184, 158, 16, 14, 14, 4], [184, 209, 15, 14, 12, 4], [184, 260, 17, 14, 15, 4], [184, 311, 17, 14, 15, 4], [184, 362, 23, 14, 21, 4], [184, 413, 17, 14, 15, 4], [184, 464, 17, 14, 15, 4], [184, 515, 17, 14, 15, 4], [184, 564, 14, 18, 11, 2], [184, 615, 13, 16, 14, 2], [184, 666, 13, 18, 10, 2], [184, 719, 16, 5, 15, 4], [184, 784, 15, 2, 15, 18], [245, 4, 13, 3, 12, 3], [245, 59, 16, 11, 15, 7], [245, 107, 16, 14, 15, 4], [245, 161, 15, 11, 14, 7], [245, 209, 17, 14, 15, 4], [245, 263, 16, 11, 15, 7], [245, 311, 16, 14, 13, 4], [245, 365, 17, 15, 15, 7], [245, 413, 16, 14, 15, 4], [245, 464, 11, 14, 9, 4], [245, 515, 14, 17, 12, 4], [245, 566, 17, 14, 15, 4], [245, 617, 11, 14, 9, 4], [245, 671, 22, 11, 21, 7], [245, 722, 16, 11, 15, 7], [245, 773, 16, 11, 15, 7], [306, 8, 16, 14, 15, 7], [306, 59, 17, 14, 15, 7], [306, 110, 15, 11, 12, 7], [306, 161, 16, 11, 14, 7], [306, 209, 15, 14, 13, 4], [306, 263, 17, 11, 15, 7], [306, 314, 17, 11, 15, 7], [306, 365, 23, 11, 21, 7], [306, 416, 17, 11, 15, 7], [306, 467, 17, 15, 15, 7], [306, 518, 17, 11, 15, 7], [306, 564, 15, 18, 12, 2], [306, 616, 12, 17, 11, 3], [306, 666, 13, 18, 12, 2], [306, 722, 17, 4, 15, 7], [306, 770, 13, 14, 11, 4], [367, 2, 17, 17, 15, 1], [367, 53, 17, 17, 15, 1], [367, 107, 17, 18, 15, 4], [367, 154, 16, 18, 14, 0], [367, 207, 19, 16, 17, 2], [367, 257, 17, 17, 15, 1], [367, 308, 17, 17, 15, 1], [367, 361, 16, 15, 15, 3], [367, 412, 16, 15, 15, 3], [367, 463, 16, 15, 15, 3], [367, 515, 16, 14, 15, 4], [367, 564, 18, 16, 15, 2], [367, 613, 17, 18, 15, 0], [367, 671, 15, 15, 14, 7], [367, 718, 16, 15, 15, 3], [367, 769, 16, 15, 15, 3], [428, 4, 16, 15, 15, 3], [428, 56, 16, 14, 15, 4], [428, 106, 10, 15, 9, 3], [428, 157, 11, 15, 9, 3], [428, 208, 13, 15, 9, 3], [428, 260, 13, 14, 9, 4], [428, 309, 18, 16, 15, 2], [428, 361, 16, 15, 15, 3], [428, 412, 16, 15, 15, 3], [428, 463, 16, 15, 15, 3], [428, 515, 16, 14, 15, 4], [428, 564, 18, 16, 15, 2], [428, 616, 17, 15, 15, 3], [428, 667, 17, 15, 15, 3], [428, 718, 17, 15, 15, 3], [428, 770, 17, 14, 15, 4], [489, 5, 14, 9, 12, 4], [489, 56, 14, 6, 12, 4], [489, 105, 16, 15, 14, 2], [489, 158, 17, 14, 17, 4], [489, 209, 16, 18, 14, 4], [489, 263, 15, 8, 14, 7], [489, 311, 20, 14, 19, 4], [489, 362, 17, 14, 15, 4], [489, 413, 19, 14, 18, 4], [489, 464, 19, 14, 18, 4], [489, 515, 22, 6, 20, 4], [489, 565, 12, 3, 12, 3], [489, 617, 14, 2, 12, 4], [489, 672, 17, 9, 17, 8], [489, 719, 22, 14, 20, 4], [489, 770, 17, 14, 15, 4], [550, 8, 24, 8, 24, 7], [550, 58, 15, 12, 15, 6], [550, 109, 13, 12, 14, 6], [550, 161, 14, 11, 14, 7], [550, 209, 17, 14, 15, 4], [550, 263, 19, 14, 18, 7], [550, 311, 16, 14, 15, 4], [550, 362, 18, 16, 17, 4], [550, 413, 21, 15, 20, 4], [550, 465, 23, 13, 21, 5], [550, 515, 15, 17, 13, 4], [550, 566, 16, 13, 14, 4], [550, 617, 16, 13, 14, 4], [550, 668, 20, 14, 18, 4], [550, 722, 22, 11, 21, 7], [550, 773, 16, 11, 15, 7], [611, 5, 15, 14, 15, 4], [611, 56, 12, 14, 12, 4], [611, 115, 14, 5, 14, 12], [611, 156, 23, 16, 21, 2], [611, 209, 15, 17, 13, 4], [611, 263, 17, 10, 15, 7], [611, 311, 18, 14, 18, 4], [611, 365, 17, 10, 17, 7], [611, 417, 17, 10, 17, 8], [611, 475, 22, 3, 24, 15], [611, 511, 1, 1, 15, 1], [611, 562, 17, 18, 15, 0], [611, 615, 18, 16, 15, 2], [611, 666, 18, 16, 15, 2], [611, 719, 22, 14, 20, 4], [611, 773, 22, 11, 21, 7], [672, 12, 13, 2, 12, 11], [672, 63, 19, 2, 18, 11], [672, 107, 16, 6, 14, 4], [672, 158, 16, 6, 14, 4], [672, 209, 11, 6, 9, 4], [672, 260, 11, 6, 9, 4], [672, 315, 15, 8, 14, 8], [672, 365, 17, 11, 18, 7], [672, 413, 17, 18, 15, 4], [1, 1, 1, 1, 9, 1], [794, 769, 14, 3, 8, 3], [672, 568, 18, 8, 17, 6], [672, 620, 13, 10, 12, 7], [672, 672, 12, 10, 12, 8], [672, 719, 20, 14, 18, 4], [672, 770, 20, 14, 18, 4], [733, 5, 14, 10, 12, 4], [733, 62, 10, 3, 9, 10], [733, 118, 9, 6, 9, 15], [733, 169, 14, 6, 14, 15], [733, 209, 26, 14, 26, 4], [733, 256, 17, 18, 15, 0], [733, 307, 16, 18, 14, 0], [733, 358, 17, 18, 15, 0], [733, 410, 16, 17, 14, 1], [733, 460, 16, 18, 14, 0], [733, 511, 12, 18, 12, 0], [733, 562, 15, 18, 12, 0], [733, 614, 15, 17, 12, 1], [733, 664, 14, 18, 12, 0], [733, 715, 17, 18, 15, 0], [733, 766, 17, 18, 15, 0], [1, 1, 1, 1, 9, 1], [794, 52, 17, 18, 15, 0], [794, 103, 17, 18, 15, 0], [794, 154, 17, 18, 15, 0], [794, 205, 17, 18, 15, 0], [794, 263, 11, 11, 9, 7], [794, 310, 14, 3, 12, 3], [794, 360, 18, 4, 15, 2], [794, 413, 14, 2, 12, 4], [794, 463, 15, 3, 12, 3], [794, 515, 12, 2, 12, 4], [794, 562, 15, 6, 12, 0], [794, 631, 9, 4, 12, 18], [794, 667, 14, 3, 12, 3], [794, 733, 10, 4, 12, 18], [794, 769, 14, 3, 12, 3], [855, 4, 14, 3, 12, 3], [855, 55, 14, 3, 12, 3], [855, 106, 14, 3, 12, 3], [855, 157, 14, 3, 12, 3], [855, 208, 14, 3, 12, 3], [855, 259, 14, 3, 12, 3], [855, 310, 14, 3, 12, 3], [855, 361, 14, 3, 12, 3], [855, 412, 14, 3, 12, 3], [855, 463, 14, 3, 12, 3], [855, 514, 14, 3, 12, 3], [855, 565, 14, 3, 12, 3], [855, 616, 14, 3, 12, 3], [855, 667, 14, 3, 12, 3], [855, 718, 14, 3, 12, 3], [855, 769, 14, 3, 12, 3]], \"capHeight\": 18, \"widestlogicalchar\": 26, \"widestglyph\": 26, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 10, 6, 10, 13], [1, 56, 13, 16, 13, 4], [1, 107, 15, 15, 15, 4], [1, 158, 19, 15, 19, 4], [1, 207, 15, 20, 15, 2], [1, 260, 21, 16, 21, 4], [1, 311, 19, 16, 19, 4], [1, 362, 9, 15, 9, 4], [1, 411, 12, 20, 12, 2], [1, 462, 12, 20, 12, 2], [1, 516, 15, 14, 15, 5], [1, 570, 15, 11, 15, 8], [1, 626, 10, 10, 10, 13], [1, 675, 15, 8, 15, 11], [1, 728, 10, 7, 10, 13], [1, 768, 15, 18, 15, 2], [62, 5, 16, 16, 16, 4], [62, 56, 16, 16, 16, 4], [62, 107, 16, 16, 16, 4], [62, 158, 16, 16, 16, 4], [62, 209, 16, 16, 16, 4], [62, 260, 16, 16, 16, 4], [62, 311, 16, 16, 16, 4], [62, 362, 16, 16, 16, 4], [62, 413, 16, 16, 16, 4], [62, 464, 16, 16, 16, 4], [62, 518, 10, 13, 10, 7], [62, 569, 10, 16, 10, 7], [62, 618, 13, 14, 13, 5], [62, 674, 16, 9, 16, 10], [62, 720, 13, 14, 13, 5], [62, 770, 16, 16, 16, 4], [123, 5, 21, 16, 21, 4], [123, 56, 16, 16, 16, 4], [123, 107, 16, 16, 16, 4], [123, 158, 16, 16, 16, 4], [123, 209, 16, 16, 16, 4], [123, 260, 15, 16, 15, 4], [123, 311, 15, 16, 15, 4], [123, 362, 16, 16, 16, 4], [123, 413, 16, 16, 16, 4], [123, 464, 13, 16, 13, 4], [123, 515, 15, 16, 15, 4], [123, 566, 18, 16, 18, 4], [123, 617, 15, 16, 15, 4], [123, 668, 22, 16, 22, 4], [123, 719, 18, 16, 18, 4], [123, 770, 16, 16, 16, 4], [184, 5, 16, 16, 16, 4], [184, 56, 16, 18, 16, 4], [184, 107, 16, 16, 16, 4], [184, 158, 15, 16, 15, 4], [184, 209, 13, 16, 13, 4], [184, 260, 16, 16, 16, 4], [184, 311, 16, 16, 16, 4], [184, 362, 22, 16, 22, 4], [184, 413, 16, 16, 16, 4], [184, 464, 16, 16, 16, 4], [184, 515, 16, 16, 16, 4], [184, 564, 12, 20, 12, 2], [184, 615, 15, 18, 15, 2], [184, 666, 11, 20, 11, 2], [184, 719, 16, 15, 16, 4], [184, 779, 16, 9, 16, 13], [245, 4, 13, 16, 13, 3], [245, 59, 16, 13, 16, 7], [245, 107, 16, 16, 16, 4], [245, 161, 15, 13, 15, 7], [245, 209, 16, 16, 16, 4], [245, 263, 16, 13, 16, 7], [245, 311, 14, 16, 14, 4], [245, 365, 16, 17, 16, 7], [245, 413, 16, 16, 16, 4], [245, 464, 10, 16, 10, 4], [245, 515, 13, 19, 13, 4], [245, 566, 16, 16, 16, 4], [245, 617, 10, 16, 10, 4], [245, 671, 22, 13, 22, 7], [245, 722, 16, 13, 16, 7], [245, 773, 16, 13, 16, 7], [306, 8, 16, 16, 16, 7], [306, 59, 16, 16, 16, 7], [306, 110, 13, 13, 13, 7], [306, 161, 15, 13, 15, 7], [306, 209, 14, 16, 14, 4], [306, 263, 16, 13, 16, 7], [306, 314, 16, 13, 16, 7], [306, 365, 22, 13, 22, 7], [306, 416, 16, 13, 16, 7], [306, 467, 16, 17, 16, 7], [306, 518, 16, 13, 16, 7], [306, 564, 13, 20, 13, 2], [306, 616, 12, 19, 12, 3], [306, 666, 13, 20, 13, 2], [306, 722, 16, 12, 16, 7], [306, 770, 12, 16, 12, 4], [367, 2, 16, 19, 16, 1], [367, 53, 16, 19, 16, 1], [367, 107, 16, 20, 16, 4], [367, 154, 15, 20, 15, 0], [367, 207, 18, 18, 18, 2], [367, 257, 16, 19, 16, 1], [367, 308, 16, 19, 16, 1], [367, 361, 16, 17, 16, 3], [367, 412, 16, 17, 16, 3], [367, 463, 16, 17, 16, 3], [367, 515, 16, 16, 16, 4], [367, 564, 16, 18, 16, 2], [367, 613, 16, 20, 16, 0], [367, 671, 15, 17, 15, 7], [367, 718, 16, 17, 16, 3], [367, 769, 16, 17, 16, 3], [428, 4, 16, 17, 16, 3], [428, 56, 16, 16, 16, 4], [428, 106, 10, 17, 10, 3], [428, 157, 10, 17, 10, 3], [428, 208, 10, 17, 10, 3], [428, 260, 10, 16, 10, 4], [428, 309, 16, 18, 16, 2], [428, 361, 16, 17, 16, 3], [428, 412, 16, 17, 16, 3], [428, 463, 16, 17, 16, 3], [428, 515, 16, 16, 16, 4], [428, 564, 16, 18, 16, 2], [428, 616, 16, 17, 16, 3], [428, 667, 16, 17, 16, 3], [428, 718, 16, 17, 16, 3], [428, 770, 16, 16, 16, 4], [489, 5, 13, 15, 13, 4], [489, 56, 13, 15, 13, 4], [489, 105, 15, 17, 15, 2], [489, 158, 18, 16, 18, 4], [489, 209, 15, 20, 15, 4], [489, 263, 15, 12, 15, 7], [489, 311, 20, 16, 20, 4], [489, 362, 16, 16, 16, 4], [489, 413, 19, 16, 19, 4], [489, 464, 19, 16, 19, 4], [489, 515, 21, 15, 21, 4], [489, 565, 13, 16, 13, 3], [489, 617, 13, 15, 13, 4], [489, 672, 18, 11, 18, 8], [489, 719, 21, 16, 21, 4], [489, 770, 16, 16, 16, 4], [550, 8, 25, 12, 25, 7], [550, 58, 16, 14, 16, 6], [550, 109, 15, 14, 15, 6], [550, 160, 15, 14, 15, 6], [550, 209, 16, 16, 16, 4], [550, 263, 19, 16, 19, 7], [550, 311, 16, 16, 16, 4], [550, 362, 18, 18, 18, 4], [550, 413, 21, 17, 21, 4], [550, 465, 22, 15, 22, 5], [550, 515, 14, 19, 14, 4], [550, 566, 15, 15, 15, 4], [550, 617, 15, 15, 15, 4], [550, 668, 19, 16, 19, 4], [550, 722, 22, 13, 22, 7], [550, 773, 16, 13, 16, 7], [611, 5, 16, 16, 16, 4], [611, 56, 13, 16, 13, 4], [611, 115, 15, 7, 15, 12], [611, 156, 22, 18, 22, 2], [611, 209, 14, 19, 14, 4], [611, 263, 16, 12, 16, 7], [611, 311, 19, 16, 19, 4], [611, 366, 18, 11, 18, 8], [611, 417, 18, 11, 18, 8], [611, 473, 25, 7, 25, 13], [611, 524, 16, 6, 16, 13], [611, 562, 16, 20, 16, 0], [611, 615, 16, 18, 16, 2], [611, 666, 16, 18, 16, 2], [611, 719, 21, 16, 21, 4], [611, 773, 22, 13, 22, 7], [672, 12, 13, 8, 13, 11], [672, 63, 19, 8, 19, 11], [672, 107, 15, 15, 15, 4], [672, 158, 15, 15, 15, 4], [672, 209, 10, 15, 10, 4], [672, 260, 10, 15, 10, 4], [672, 315, 15, 11, 15, 8], [672, 365, 19, 13, 19, 7], [672, 413, 16, 20, 16, 4], [1, 14, 10, 6, 10, 13], [794, 769, 13, 16, 13, 3], [672, 568, 18, 13, 18, 6], [672, 621, 13, 11, 13, 8], [672, 672, 13, 11, 13, 8], [672, 719, 19, 16, 19, 4], [672, 770, 19, 16, 19, 4], [733, 5, 13, 15, 13, 4], [733, 62, 10, 9, 10, 10], [733, 116, 10, 10, 10, 13], [733, 167, 15, 10, 15, 13], [733, 209, 27, 16, 27, 4], [733, 256, 16, 20, 16, 0], [733, 307, 15, 20, 15, 0], [733, 358, 16, 20, 16, 0], [733, 410, 15, 19, 15, 1], [733, 460, 15, 20, 15, 0], [733, 511, 13, 20, 13, 0], [733, 562, 13, 20, 13, 0], [733, 614, 13, 19, 13, 1], [733, 664, 13, 20, 13, 0], [733, 715, 16, 20, 16, 0], [733, 766, 16, 20, 16, 0], [1, 14, 10, 6, 10, 13], [794, 52, 16, 20, 16, 0], [794, 103, 16, 20, 16, 0], [794, 154, 16, 20, 16, 0], [794, 205, 16, 20, 16, 0], [794, 263, 10, 13, 10, 7], [794, 310, 13, 16, 13, 3], [794, 360, 16, 17, 16, 2], [794, 413, 13, 15, 13, 4], [794, 463, 13, 16, 13, 3], [794, 515, 13, 15, 13, 4], [794, 562, 13, 19, 13, 0], [794, 626, 13, 11, 13, 13], [794, 667, 13, 16, 13, 3], [794, 728, 13, 11, 13, 13], [794, 769, 13, 16, 13, 3], [855, 4, 13, 16, 13, 3], [855, 55, 13, 16, 13, 3], [855, 106, 13, 16, 13, 3], [855, 157, 13, 16, 13, 3], [855, 208, 13, 16, 13, 3], [855, 259, 13, 16, 13, 3], [855, 310, 13, 16, 13, 3], [855, 361, 13, 16, 13, 3], [855, 412, 13, 16, 13, 3], [855, 463, 13, 16, 13, 3], [855, 514, 13, 16, 13, 3], [855, 565, 13, 16, 13, 3], [855, 616, 13, 16, 13, 3], [855, 667, 13, 16, 13, 3], [855, 718, 13, 16, 13, 3], [855, 769, 13, 16, 13, 3]], \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 9, 6, 9, 12], [1, 56, 12, 14, 12, 4], [1, 107, 14, 14, 14, 4], [1, 158, 18, 14, 18, 4], [1, 207, 14, 18, 14, 2], [1, 260, 20, 14, 20, 4], [1, 311, 18, 14, 18, 4], [1, 362, 8, 14, 8, 4], [1, 411, 11, 18, 11, 2], [1, 462, 11, 18, 11, 2], [1, 516, 14, 13, 14, 5], [1, 570, 14, 10, 14, 8], [1, 625, 9, 9, 9, 12], [1, 675, 14, 7, 14, 11], [1, 727, 9, 6, 9, 12], [1, 768, 14, 16, 14, 2], [62, 5, 15, 14, 15, 4], [62, 56, 15, 14, 15, 4], [62, 107, 15, 14, 15, 4], [62, 158, 15, 14, 15, 4], [62, 209, 15, 14, 15, 4], [62, 260, 15, 14, 15, 4], [62, 311, 15, 14, 15, 4], [62, 362, 15, 14, 15, 4], [62, 413, 15, 14, 15, 4], [62, 464, 15, 14, 15, 4], [62, 518, 9, 11, 9, 7], [62, 569, 9, 14, 9, 7], [62, 618, 12, 13, 12, 5], [62, 674, 15, 8, 15, 10], [62, 720, 12, 13, 12, 5], [62, 770, 15, 14, 15, 4], [123, 5, 20, 14, 20, 4], [123, 56, 15, 14, 15, 4], [123, 107, 15, 14, 15, 4], [123, 158, 15, 14, 15, 4], [123, 209, 15, 14, 15, 4], [123, 260, 14, 14, 14, 4], [123, 311, 14, 14, 14, 4], [123, 362, 15, 14, 15, 4], [123, 413, 15, 14, 15, 4], [123, 464, 12, 14, 12, 4], [123, 515, 14, 14, 14, 4], [123, 566, 17, 14, 17, 4], [123, 617, 14, 14, 14, 4], [123, 668, 21, 14, 21, 4], [123, 719, 17, 14, 17, 4], [123, 770, 15, 14, 15, 4], [184, 5, 15, 14, 15, 4], [184, 56, 15, 16, 15, 4], [184, 107, 15, 14, 15, 4], [184, 158, 14, 14, 14, 4], [184, 209, 12, 14, 12, 4], [184, 260, 15, 14, 15, 4], [184, 311, 15, 14, 15, 4], [184, 362, 21, 14, 21, 4], [184, 413, 15, 14, 15, 4], [184, 464, 15, 14, 15, 4], [184, 515, 15, 14, 15, 4], [184, 564, 11, 18, 11, 2], [184, 615, 14, 16, 14, 2], [184, 666, 10, 18, 10, 2], [184, 719, 15, 14, 15, 4], [184, 778, 15, 8, 15, 12], [245, 4, 12, 15, 12, 3], [245, 59, 15, 11, 15, 7], [245, 107, 15, 14, 15, 4], [245, 161, 14, 11, 14, 7], [245, 209, 15, 14, 15, 4], [245, 263, 15, 11, 15, 7], [245, 311, 13, 14, 13, 4], [245, 365, 15, 15, 15, 7], [245, 413, 15, 14, 15, 4], [245, 464, 9, 14, 9, 4], [245, 515, 12, 17, 12, 4], [245, 566, 15, 14, 15, 4], [245, 617, 9, 14, 9, 4], [245, 671, 21, 11, 21, 7], [245, 722, 15, 11, 15, 7], [245, 773, 15, 11, 15, 7], [306, 8, 15, 14, 15, 7], [306, 59, 15, 14, 15, 7], [306, 110, 12, 11, 12, 7], [306, 161, 14, 11, 14, 7], [306, 209, 13, 14, 13, 4], [306, 263, 15, 11, 15, 7], [306, 314, 15, 11, 15, 7], [306, 365, 21, 11, 21, 7], [306, 416, 15, 11, 15, 7], [306, 467, 15, 15, 15, 7], [306, 518, 15, 11, 15, 7], [306, 564, 12, 18, 12, 2], [306, 616, 11, 17, 11, 3], [306, 666, 12, 18, 12, 2], [306, 722, 15, 11, 15, 7], [306, 770, 11, 14, 11, 4], [367, 2, 15, 17, 15, 1], [367, 53, 15, 17, 15, 1], [367, 107, 15, 18, 15, 4], [367, 154, 14, 18, 14, 0], [367, 207, 17, 16, 17, 2], [367, 257, 15, 17, 15, 1], [367, 308, 15, 17, 15, 1], [367, 361, 15, 15, 15, 3], [367, 412, 15, 15, 15, 3], [367, 463, 15, 15, 15, 3], [367, 515, 15, 14, 15, 4], [367, 564, 15, 16, 15, 2], [367, 613, 15, 18, 15, 0], [367, 671, 14, 15, 14, 7], [367, 718, 15, 15, 15, 3], [367, 769, 15, 15, 15, 3], [428, 4, 15, 15, 15, 3], [428, 56, 15, 14, 15, 4], [428, 106, 9, 15, 9, 3], [428, 157, 9, 15, 9, 3], [428, 208, 9, 15, 9, 3], [428, 260, 9, 14, 9, 4], [428, 309, 15, 16, 15, 2], [428, 361, 15, 15, 15, 3], [428, 412, 15, 15, 15, 3], [428, 463, 15, 15, 15, 3], [428, 515, 15, 14, 15, 4], [428, 564, 15, 16, 15, 2], [428, 616, 15, 15, 15, 3], [428, 667, 15, 15, 15, 3], [428, 718, 15, 15, 15, 3], [428, 770, 15, 14, 15, 4], [489, 5, 12, 14, 12, 4], [489, 56, 12, 14, 12, 4], [489, 105, 14, 16, 14, 2], [489, 158, 17, 14, 17, 4], [489, 209, 14, 18, 14, 4], [489, 263, 14, 11, 14, 7], [489, 311, 19, 14, 19, 4], [489, 362, 15, 14, 15, 4], [489, 413, 18, 14, 18, 4], [489, 464, 18, 14, 18, 4], [489, 515, 20, 14, 20, 4], [489, 565, 12, 15, 12, 3], [489, 617, 12, 14, 12, 4], [489, 672, 17, 10, 17, 8], [489, 719, 20, 14, 20, 4], [489, 770, 15, 14, 15, 4], [550, 8, 24, 11, 24, 7], [550, 58, 15, 12, 15, 6], [550, 109, 14, 12, 14, 6], [550, 160, 14, 12, 14, 6], [550, 209, 15, 14, 15, 4], [550, 263, 18, 14, 18, 7], [550, 311, 15, 14, 15, 4], [550, 362, 17, 16, 17, 4], [550, 413, 20, 15, 20, 4], [550, 465, 21, 13, 21, 5], [550, 515, 13, 17, 13, 4], [550, 566, 14, 14, 14, 4], [550, 617, 14, 14, 14, 4], [550, 668, 18, 14, 18, 4], [550, 722, 21, 11, 21, 7], [550, 773, 15, 11, 15, 7], [611, 5, 15, 14, 15, 4], [611, 56, 12, 14, 12, 4], [611, 115, 14, 6, 14, 12], [611, 156, 21, 16, 21, 2], [611, 209, 13, 17, 13, 4], [611, 263, 15, 11, 15, 7], [611, 311, 18, 14, 18, 4], [611, 366, 17, 10, 17, 8], [611, 417, 17, 10, 17, 8], [611, 472, 24, 6, 24, 12], [611, 523, 15, 6, 15, 12], [611, 562, 15, 18, 15, 0], [611, 615, 15, 16, 15, 2], [611, 666, 15, 16, 15, 2], [611, 719, 20, 14, 20, 4], [611, 773, 21, 11, 21, 7], [672, 12, 12, 7, 12, 11], [672, 63, 18, 7, 18, 11], [672, 107, 14, 14, 14, 4], [672, 158, 14, 14, 14, 4], [672, 209, 9, 14, 9, 4], [672, 260, 9, 14, 9, 4], [672, 315, 14, 10, 14, 8], [672, 365, 18, 11, 18, 7], [672, 413, 15, 18, 15, 4], [1, 13, 9, 6, 9, 12], [794, 769, 12, 15, 12, 3], [672, 568, 17, 12, 17, 6], [672, 621, 12, 10, 12, 8], [672, 672, 12, 10, 12, 8], [672, 719, 18, 14, 18, 4], [672, 770, 18, 14, 18, 4], [733, 5, 12, 14, 12, 4], [733, 62, 9, 8, 9, 10], [733, 115, 9, 9, 9, 12], [733, 166, 14, 9, 14, 12], [733, 209, 26, 14, 26, 4], [733, 256, 15, 18, 15, 0], [733, 307, 14, 18, 14, 0], [733, 358, 15, 18, 15, 0], [733, 410, 14, 17, 14, 1], [733, 460, 14, 18, 14, 0], [733, 511, 12, 18, 12, 0], [733, 562, 12, 18, 12, 0], [733, 614, 12, 17, 12, 1], [733, 664, 12, 18, 12, 0], [733, 715, 15, 18, 15, 0], [733, 766, 15, 18, 15, 0], [1, 13, 9, 6, 9, 12], [794, 52, 15, 18, 15, 0], [794, 103, 15, 18, 15, 0], [794, 154, 15, 18, 15, 0], [794, 205, 15, 18, 15, 0], [794, 263, 9, 11, 9, 7], [794, 310, 12, 15, 12, 3], [794, 360, 15, 16, 15, 2], [794, 413, 12, 14, 12, 4], [794, 463, 12, 15, 12, 3], [794, 515, 12, 14, 12, 4], [794, 562, 12, 18, 12, 0], [794, 625, 12, 10, 12, 12], [794, 667, 12, 15, 12, 3], [794, 727, 12, 10, 12, 12], [794, 769, 12, 15, 12, 3], [855, 4, 12, 15, 12, 3], [855, 55, 12, 15, 12, 3], [855, 106, 12, 15, 12, 3], [855, 157, 12, 15, 12, 3], [855, 208, 12, 15, 12, 3], [855, 259, 12, 15, 12, 3], [855, 310, 12, 15, 12, 3], [855, 361, 12, 15, 12, 3], [855, 412, 12, 15, 12, 3], [855, 463, 12, 15, 12, 3], [855, 514, 12, 15, 12, 3], [855, 565, 12, 15, 12, 3], [855, 616, 12, 15, 12, 3], [855, 667, 12, 15, 12, 3], [855, 718, 12, 15, 12, 3], [855, 769, 12, 15, 12, 3]], \"widestlogicalchar\": 26, \"widestglyph\": 26, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 13, 1], [1, 58, 16, 20, 17, 6], [1, 109, 18, 8, 19, 6], [1, 160, 26, 18, 25, 6], [1, 209, 20, 24, 19, 4], [1, 262, 26, 20, 27, 6], [1, 313, 25, 20, 25, 6], [1, 364, 12, 8, 11, 6], [1, 413, 17, 24, 15, 4], [1, 464, 16, 24, 15, 4], [1, 518, 20, 13, 19, 7], [1, 574, 18, 12, 19, 12], [1, 633, 12, 10, 13, 20], [1, 680, 18, 4, 19, 16], [1, 735, 12, 6, 13, 20], [1, 770, 21, 22, 19, 4], [62, 7, 22, 20, 21, 6], [62, 58, 18, 20, 21, 6], [62, 109, 22, 20, 21, 6], [62, 160, 22, 20, 21, 6], [62, 211, 20, 20, 21, 6], [62, 262, 22, 20, 21, 6], [62, 313, 21, 20, 21, 6], [62, 364, 22, 20, 21, 6], [62, 415, 22, 20, 21, 6], [62, 466, 22, 20, 21, 6], [62, 521, 14, 16, 13, 10], [62, 572, 14, 20, 13, 10], [62, 620, 17, 17, 17, 7], [62, 678, 21, 8, 21, 14], [62, 722, 19, 17, 17, 7], [62, 772, 22, 20, 21, 6], [123, 7, 27, 20, 27, 6], [123, 58, 22, 20, 21, 6], [123, 109, 22, 20, 21, 6], [123, 160, 22, 20, 21, 6], [123, 211, 22, 20, 21, 6], [123, 262, 20, 20, 19, 6], [123, 313, 20, 20, 19, 6], [123, 364, 22, 20, 21, 6], [123, 415, 22, 20, 21, 6], [123, 466, 16, 20, 17, 6], [123, 517, 20, 20, 19, 6], [123, 568, 24, 20, 23, 6], [123, 619, 17, 20, 19, 6], [123, 670, 30, 20, 29, 6], [123, 721, 24, 20, 23, 6], [123, 772, 22, 20, 21, 6], [184, 7, 22, 20, 21, 6], [184, 58, 22, 22, 21, 6], [184, 109, 22, 20, 21, 6], [184, 160, 20, 20, 19, 6], [184, 211, 20, 20, 17, 6], [184, 262, 22, 20, 21, 6], [184, 313, 22, 20, 21, 6], [184, 364, 30, 20, 29, 6], [184, 415, 22, 20, 21, 6], [184, 466, 22, 20, 21, 6], [184, 517, 22, 20, 21, 6], [184, 566, 17, 24, 15, 4], [184, 617, 17, 22, 19, 4], [184, 668, 17, 24, 15, 4], [184, 721, 22, 8, 21, 6], [184, 790, 21, 4, 21, 24], [245, 5, 16, 6, 17, 4], [245, 62, 21, 16, 21, 10], [245, 109, 21, 20, 21, 6], [245, 164, 19, 16, 19, 10], [245, 211, 22, 20, 21, 6], [245, 266, 21, 16, 21, 10], [245, 313, 20, 20, 17, 6], [245, 368, 22, 22, 21, 10], [245, 415, 21, 20, 21, 6], [245, 466, 14, 20, 13, 6], [245, 517, 18, 24, 17, 6], [245, 568, 23, 20, 21, 6], [245, 619, 14, 20, 13, 6], [245, 674, 29, 16, 29, 10], [245, 725, 21, 16, 21, 10], [245, 776, 21, 16, 21, 10], [306, 11, 21, 20, 21, 10], [306, 62, 22, 20, 21, 10], [306, 113, 20, 16, 17, 10], [306, 164, 19, 16, 19, 10], [306, 211, 18, 20, 17, 6], [306, 266, 22, 16, 21, 10], [306, 317, 22, 16, 21, 10], [306, 368, 30, 16, 29, 10], [306, 419, 22, 16, 21, 10], [306, 470, 22, 22, 21, 10], [306, 521, 22, 16, 21, 10], [306, 566, 17, 24, 15, 4], [306, 617, 15, 24, 15, 4], [306, 668, 15, 24, 15, 4], [306, 725, 22, 6, 21, 10], [306, 772, 18, 20, 17, 6], [367, 3, 22, 24, 21, 2], [367, 52, 22, 26, 21, 0], [367, 109, 22, 26, 21, 6], [367, 154, 20, 26, 19, 0], [367, 205, 25, 26, 23, 0], [367, 258, 22, 24, 21, 2], [367, 309, 22, 24, 21, 2], [367, 362, 21, 22, 21, 4], [367, 413, 21, 22, 21, 4], [367, 464, 21, 22, 21, 4], [367, 517, 21, 20, 21, 6], [367, 566, 23, 22, 21, 4], [367, 613, 21, 26, 21, 0], [367, 674, 19, 22, 19, 10], [367, 719, 21, 22, 21, 4], [367, 770, 21, 22, 21, 4], [428, 5, 21, 22, 21, 4], [428, 58, 21, 20, 21, 6], [428, 107, 14, 22, 13, 4], [428, 158, 13, 22, 13, 4], [428, 209, 16, 22, 13, 4], [428, 262, 15, 20, 13, 6], [428, 311, 23, 22, 21, 4], [428, 362, 21, 22, 21, 4], [428, 413, 21, 22, 21, 4], [428, 464, 21, 22, 21, 4], [428, 517, 21, 20, 21, 6], [428, 566, 23, 22, 21, 4], [428, 617, 22, 22, 21, 4], [428, 668, 22, 22, 21, 4], [428, 719, 22, 22, 21, 4], [428, 772, 22, 20, 21, 6], [489, 7, 16, 12, 15, 6], [489, 58, 18, 10, 17, 6], [489, 107, 20, 18, 19, 4], [489, 160, 22, 20, 23, 6], [489, 211, 20, 26, 19, 6], [489, 266, 19, 12, 19, 10], [489, 313, 24, 20, 23, 6], [489, 364, 22, 20, 21, 6], [489, 415, 26, 20, 25, 6], [489, 466, 26, 20, 25, 6], [489, 517, 28, 10, 27, 6], [489, 566, 17, 6, 17, 4], [489, 619, 17, 4, 16, 6], [489, 676, 22, 12, 23, 12], [489, 721, 28, 20, 27, 6], [489, 772, 22, 20, 21, 6], [550, 11, 32, 12, 33, 10], [550, 62, 19, 16, 19, 10], [550, 112, 16, 17, 17, 9], [550, 162, 17, 18, 17, 8], [550, 211, 22, 20, 21, 6], [550, 266, 26, 20, 25, 10], [550, 313, 22, 20, 21, 6], [550, 364, 24, 22, 23, 6], [550, 415, 26, 22, 25, 6], [550, 468, 29, 18, 27, 8], [550, 517, 18, 24, 17, 6], [550, 568, 20, 18, 19, 6], [550, 619, 20, 18, 19, 6], [550, 670, 26, 20, 25, 6], [550, 725, 29, 16, 29, 10], [550, 776, 21, 16, 21, 10], [611, 7, 20, 20, 21, 6], [611, 58, 16, 20, 17, 6], [611, 119, 18, 8, 19, 16], [611, 158, 31, 22, 29, 4], [611, 211, 18, 24, 17, 6], [611, 266, 22, 12, 21, 10], [611, 313, 22, 20, 23, 6], [611, 367, 23, 16, 23, 9], [611, 419, 23, 16, 23, 10], [611, 480, 30, 6, 33, 20], [611, 511, 1, 1, 21, 1], [611, 562, 22, 26, 21, 0], [611, 613, 24, 26, 21, 0], [611, 664, 24, 26, 21, 0], [611, 721, 28, 20, 27, 6], [611, 776, 29, 16, 29, 10], [672, 17, 16, 4, 17, 16], [672, 68, 24, 4, 25, 16], [672, 109, 20, 10, 19, 6], [672, 160, 20, 10, 19, 6], [672, 211, 14, 10, 13, 6], [672, 262, 14, 10, 13, 6], [672, 319, 18, 12, 19, 12], [672, 367, 24, 17, 24, 9], [672, 415, 22, 26, 21, 6], [1, 1, 1, 1, 13, 1], [794, 770, 19, 6, 17, 4], [672, 571, 22, 12, 21, 9], [672, 622, 17, 16, 17, 9], [672, 674, 17, 16, 17, 10], [672, 721, 26, 20, 25, 6], [672, 772, 26, 20, 25, 6], [733, 7, 16, 14, 15, 6], [733, 66, 13, 6, 13, 14], [733, 123, 12, 10, 13, 20], [733, 174, 18, 10, 19, 20], [733, 211, 34, 20, 35, 6], [733, 256, 22, 26, 21, 0], [733, 307, 20, 26, 19, 0], [733, 358, 22, 26, 21, 0], [733, 411, 20, 24, 19, 2], [733, 460, 20, 26, 19, 0], [733, 511, 17, 26, 17, 0], [733, 562, 19, 26, 17, 0], [733, 615, 18, 24, 17, 2], [733, 664, 17, 26, 17, 0], [733, 715, 22, 26, 21, 0], [733, 766, 22, 26, 21, 0], [1, 1, 1, 1, 13, 1], [794, 52, 22, 26, 21, 0], [794, 103, 22, 26, 21, 0], [794, 154, 22, 26, 21, 0], [794, 205, 22, 26, 21, 0], [794, 266, 14, 16, 13, 10], [794, 311, 18, 6, 17, 4], [794, 362, 23, 6, 21, 4], [794, 415, 18, 4, 17, 6], [794, 464, 19, 6, 17, 4], [794, 517, 15, 4, 17, 6], [794, 562, 19, 10, 17, 0], [794, 637, 13, 8, 17, 24], [794, 668, 19, 6, 17, 4], [794, 739, 13, 8, 17, 24], [794, 770, 19, 6, 17, 4], [855, 5, 19, 6, 17, 4], [855, 56, 19, 6, 17, 4], [855, 107, 19, 6, 17, 4], [855, 158, 19, 6, 17, 4], [855, 209, 19, 6, 17, 4], [855, 260, 19, 6, 17, 4], [855, 311, 19, 6, 17, 4], [855, 362, 19, 6, 17, 4], [855, 413, 19, 6, 17, 4], [855, 464, 19, 6, 17, 4], [855, 515, 19, 6, 17, 4], [855, 566, 19, 6, 17, 4], [855, 617, 19, 6, 17, 4], [855, 668, 19, 6, 17, 4], [855, 719, 19, 6, 17, 4], [855, 770, 19, 6, 17, 4]], \"capHeight\": 25, \"widestlogicalchar\": 35, \"widestglyph\": 34, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 58, 15, 18, 16, 6], [1, 109, 17, 6, 18, 6], [1, 160, 25, 16, 24, 6], [1, 209, 19, 22, 18, 4], [1, 262, 25, 18, 26, 6], [1, 313, 24, 18, 24, 6], [1, 364, 11, 6, 10, 6], [1, 413, 16, 22, 14, 4], [1, 464, 15, 22, 14, 4], [1, 518, 19, 11, 18, 7], [1, 574, 17, 10, 18, 12], [1, 633, 11, 8, 12, 20], [1, 680, 17, 2, 18, 16], [1, 735, 11, 4, 12, 20], [1, 770, 20, 20, 18, 4], [62, 7, 21, 18, 20, 6], [62, 58, 17, 18, 20, 6], [62, 109, 21, 18, 20, 6], [62, 160, 21, 18, 20, 6], [62, 211, 19, 18, 20, 6], [62, 262, 21, 18, 20, 6], [62, 313, 20, 18, 20, 6], [62, 364, 21, 18, 20, 6], [62, 415, 21, 18, 20, 6], [62, 466, 21, 18, 20, 6], [62, 521, 13, 14, 12, 10], [62, 572, 13, 18, 12, 10], [62, 620, 16, 15, 16, 7], [62, 678, 20, 6, 20, 14], [62, 722, 18, 15, 16, 7], [62, 772, 21, 18, 20, 6], [123, 7, 26, 18, 26, 6], [123, 58, 21, 18, 20, 6], [123, 109, 21, 18, 20, 6], [123, 160, 21, 18, 20, 6], [123, 211, 21, 18, 20, 6], [123, 262, 19, 18, 18, 6], [123, 313, 19, 18, 18, 6], [123, 364, 21, 18, 20, 6], [123, 415, 21, 18, 20, 6], [123, 466, 15, 18, 16, 6], [123, 517, 19, 18, 18, 6], [123, 568, 23, 18, 22, 6], [123, 619, 16, 18, 18, 6], [123, 670, 29, 18, 28, 6], [123, 721, 23, 18, 22, 6], [123, 772, 21, 18, 20, 6], [184, 7, 21, 18, 20, 6], [184, 58, 21, 20, 20, 6], [184, 109, 21, 18, 20, 6], [184, 160, 19, 18, 18, 6], [184, 211, 19, 18, 16, 6], [184, 262, 21, 18, 20, 6], [184, 313, 21, 18, 20, 6], [184, 364, 29, 18, 28, 6], [184, 415, 21, 18, 20, 6], [184, 466, 21, 18, 20, 6], [184, 517, 21, 18, 20, 6], [184, 566, 16, 22, 14, 4], [184, 617, 16, 20, 18, 4], [184, 668, 16, 22, 14, 4], [184, 721, 21, 6, 20, 6], [184, 790, 20, 2, 20, 24], [245, 5, 15, 4, 16, 4], [245, 62, 20, 14, 20, 10], [245, 109, 20, 18, 20, 6], [245, 164, 18, 14, 18, 10], [245, 211, 21, 18, 20, 6], [245, 266, 20, 14, 20, 10], [245, 313, 19, 18, 16, 6], [245, 368, 21, 20, 20, 10], [245, 415, 20, 18, 20, 6], [245, 466, 13, 18, 12, 6], [245, 517, 17, 22, 16, 6], [245, 568, 22, 18, 20, 6], [245, 619, 13, 18, 12, 6], [245, 674, 28, 14, 28, 10], [245, 725, 20, 14, 20, 10], [245, 776, 20, 14, 20, 10], [306, 11, 20, 18, 20, 10], [306, 62, 21, 18, 20, 10], [306, 113, 19, 14, 16, 10], [306, 164, 18, 14, 18, 10], [306, 211, 17, 18, 16, 6], [306, 266, 21, 14, 20, 10], [306, 317, 21, 14, 20, 10], [306, 368, 29, 14, 28, 10], [306, 419, 21, 14, 20, 10], [306, 470, 21, 20, 20, 10], [306, 521, 21, 14, 20, 10], [306, 566, 16, 22, 14, 4], [306, 617, 14, 22, 14, 4], [306, 668, 14, 22, 14, 4], [306, 725, 21, 4, 20, 10], [306, 772, 17, 18, 16, 6], [367, 3, 21, 22, 20, 2], [367, 52, 21, 24, 20, 0], [367, 109, 21, 24, 20, 6], [367, 154, 19, 24, 18, 0], [367, 205, 23, 24, 22, 0], [367, 258, 21, 22, 20, 2], [367, 309, 21, 22, 20, 2], [367, 362, 20, 20, 20, 4], [367, 413, 20, 20, 20, 4], [367, 464, 20, 20, 20, 4], [367, 517, 20, 18, 20, 6], [367, 566, 22, 20, 20, 4], [367, 613, 20, 24, 20, 0], [367, 674, 18, 20, 18, 10], [367, 719, 20, 20, 20, 4], [367, 770, 20, 20, 20, 4], [428, 5, 20, 20, 20, 4], [428, 58, 20, 18, 20, 6], [428, 107, 13, 20, 12, 4], [428, 158, 12, 20, 12, 4], [428, 209, 15, 20, 12, 4], [428, 262, 14, 18, 12, 6], [428, 311, 22, 20, 20, 4], [428, 362, 20, 20, 20, 4], [428, 413, 20, 20, 20, 4], [428, 464, 20, 20, 20, 4], [428, 517, 20, 18, 20, 6], [428, 566, 22, 20, 20, 4], [428, 617, 21, 20, 20, 4], [428, 668, 21, 20, 20, 4], [428, 719, 21, 20, 20, 4], [428, 772, 21, 18, 20, 6], [489, 7, 15, 10, 14, 6], [489, 58, 17, 8, 16, 6], [489, 107, 19, 16, 18, 4], [489, 160, 21, 18, 22, 6], [489, 211, 19, 24, 18, 6], [489, 266, 18, 10, 18, 10], [489, 313, 23, 18, 22, 6], [489, 364, 21, 18, 20, 6], [489, 415, 25, 18, 24, 6], [489, 466, 25, 18, 24, 6], [489, 517, 27, 8, 26, 6], [489, 566, 16, 4, 16, 4], [489, 619, 16, 2, 15, 6], [489, 676, 21, 10, 22, 12], [489, 721, 27, 18, 26, 6], [489, 772, 21, 18, 20, 6], [550, 11, 31, 10, 32, 10], [550, 62, 18, 14, 18, 10], [550, 112, 15, 15, 16, 9], [550, 162, 16, 16, 16, 8], [550, 211, 21, 18, 20, 6], [550, 266, 25, 18, 24, 10], [550, 313, 21, 18, 20, 6], [550, 364, 23, 20, 22, 6], [550, 415, 25, 20, 24, 6], [550, 468, 28, 16, 26, 8], [550, 517, 17, 22, 16, 6], [550, 568, 19, 16, 18, 6], [550, 619, 19, 16, 18, 6], [550, 670, 25, 18, 24, 6], [550, 725, 28, 14, 28, 10], [550, 776, 20, 14, 20, 10], [611, 7, 19, 18, 20, 6], [611, 58, 15, 18, 16, 6], [611, 119, 17, 6, 18, 16], [611, 158, 30, 20, 28, 4], [611, 211, 17, 22, 16, 6], [611, 266, 21, 10, 20, 10], [611, 313, 21, 18, 22, 6], [611, 367, 22, 14, 22, 9], [611, 419, 22, 14, 22, 10], [611, 480, 29, 4, 32, 20], [611, 511, 1, 1, 20, 1], [611, 562, 21, 24, 20, 0], [611, 613, 22, 24, 20, 0], [611, 664, 22, 24, 20, 0], [611, 721, 27, 18, 26, 6], [611, 776, 28, 14, 28, 10], [672, 17, 15, 2, 16, 16], [672, 68, 23, 2, 24, 16], [672, 109, 19, 8, 18, 6], [672, 160, 19, 8, 18, 6], [672, 211, 13, 8, 12, 6], [672, 262, 13, 8, 12, 6], [672, 319, 17, 10, 18, 12], [672, 367, 23, 15, 23, 9], [672, 415, 21, 24, 20, 6], [1, 1, 1, 1, 12, 1], [794, 770, 18, 4, 16, 4], [672, 571, 21, 10, 20, 9], [672, 622, 16, 14, 16, 9], [672, 674, 16, 14, 16, 10], [672, 721, 25, 18, 24, 6], [672, 772, 25, 18, 24, 6], [733, 7, 15, 12, 14, 6], [733, 66, 12, 4, 12, 14], [733, 123, 11, 8, 12, 20], [733, 174, 17, 8, 18, 20], [733, 211, 33, 18, 34, 6], [733, 256, 21, 24, 20, 0], [733, 307, 19, 24, 18, 0], [733, 358, 21, 24, 20, 0], [733, 411, 19, 22, 18, 2], [733, 460, 19, 24, 18, 0], [733, 511, 16, 24, 16, 0], [733, 562, 18, 24, 16, 0], [733, 615, 17, 22, 16, 2], [733, 664, 16, 24, 16, 0], [733, 715, 21, 24, 20, 0], [733, 766, 21, 24, 20, 0], [1, 1, 1, 1, 12, 1], [794, 52, 21, 24, 20, 0], [794, 103, 21, 24, 20, 0], [794, 154, 21, 24, 20, 0], [794, 205, 21, 24, 20, 0], [794, 266, 13, 14, 12, 10], [794, 311, 17, 4, 16, 4], [794, 362, 22, 4, 20, 4], [794, 415, 17, 2, 16, 6], [794, 464, 18, 4, 16, 4], [794, 517, 14, 2, 16, 6], [794, 562, 18, 8, 16, 0], [794, 637, 12, 6, 16, 24], [794, 668, 18, 4, 16, 4], [794, 739, 12, 6, 16, 24], [794, 770, 18, 4, 16, 4], [855, 5, 18, 4, 16, 4], [855, 56, 18, 4, 16, 4], [855, 107, 18, 4, 16, 4], [855, 158, 18, 4, 16, 4], [855, 209, 18, 4, 16, 4], [855, 260, 18, 4, 16, 4], [855, 311, 18, 4, 16, 4], [855, 362, 18, 4, 16, 4], [855, 413, 18, 4, 16, 4], [855, 464, 18, 4, 16, 4], [855, 515, 18, 4, 16, 4], [855, 566, 18, 4, 16, 4], [855, 617, 18, 4, 16, 4], [855, 668, 18, 4, 16, 4], [855, 719, 18, 4, 16, 4], [855, 770, 18, 4, 16, 4]], \"capHeight\": 24, \"widestlogicalchar\": 34, \"widestglyph\": 33, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 20, 13, 6, 13, 19], [1, 58, 17, 20, 17, 6], [1, 109, 19, 19, 19, 6], [1, 160, 25, 19, 25, 6], [1, 209, 19, 24, 19, 4], [1, 262, 27, 20, 27, 6], [1, 313, 25, 20, 25, 6], [1, 364, 11, 19, 11, 6], [1, 413, 15, 24, 15, 4], [1, 464, 15, 24, 15, 4], [1, 518, 19, 18, 19, 7], [1, 574, 19, 13, 19, 12], [1, 632, 13, 11, 13, 19], [1, 680, 19, 9, 19, 16], [1, 734, 13, 7, 13, 19], [1, 770, 19, 22, 19, 4], [62, 7, 21, 20, 21, 6], [62, 58, 21, 20, 21, 6], [62, 109, 21, 20, 21, 6], [62, 160, 21, 20, 21, 6], [62, 211, 21, 20, 21, 6], [62, 262, 21, 20, 21, 6], [62, 313, 21, 20, 21, 6], [62, 364, 21, 20, 21, 6], [62, 415, 21, 20, 21, 6], [62, 466, 21, 20, 21, 6], [62, 521, 13, 16, 13, 10], [62, 572, 13, 20, 13, 10], [62, 620, 17, 18, 17, 7], [62, 678, 21, 11, 21, 14], [62, 722, 17, 18, 17, 7], [62, 772, 21, 20, 21, 6], [123, 7, 27, 20, 27, 6], [123, 58, 21, 20, 21, 6], [123, 109, 21, 20, 21, 6], [123, 160, 21, 20, 21, 6], [123, 211, 21, 20, 21, 6], [123, 262, 19, 20, 19, 6], [123, 313, 19, 20, 19, 6], [123, 364, 21, 20, 21, 6], [123, 415, 21, 20, 21, 6], [123, 466, 17, 20, 17, 6], [123, 517, 19, 20, 19, 6], [123, 568, 23, 20, 23, 6], [123, 619, 19, 20, 19, 6], [123, 670, 29, 20, 29, 6], [123, 721, 23, 20, 23, 6], [123, 772, 21, 20, 21, 6], [184, 7, 21, 20, 21, 6], [184, 58, 21, 22, 21, 6], [184, 109, 21, 20, 21, 6], [184, 160, 19, 20, 19, 6], [184, 211, 17, 20, 17, 6], [184, 262, 21, 20, 21, 6], [184, 313, 21, 20, 21, 6], [184, 364, 29, 20, 29, 6], [184, 415, 21, 20, 21, 6], [184, 466, 21, 20, 21, 6], [184, 517, 21, 20, 21, 6], [184, 566, 15, 24, 15, 4], [184, 617, 19, 22, 19, 4], [184, 668, 15, 24, 15, 4], [184, 721, 21, 19, 21, 6], [184, 785, 21, 9, 21, 19], [245, 5, 17, 21, 17, 4], [245, 62, 21, 16, 21, 10], [245, 109, 21, 20, 21, 6], [245, 164, 19, 16, 19, 10], [245, 211, 21, 20, 21, 6], [245, 266, 21, 16, 21, 10], [245, 313, 17, 20, 17, 6], [245, 368, 21, 22, 21, 10], [245, 415, 21, 20, 21, 6], [245, 466, 13, 20, 13, 6], [245, 517, 17, 24, 17, 6], [245, 568, 21, 20, 21, 6], [245, 619, 13, 20, 13, 6], [245, 674, 29, 16, 29, 10], [245, 725, 21, 16, 21, 10], [245, 776, 21, 16, 21, 10], [306, 11, 21, 20, 21, 10], [306, 62, 21, 20, 21, 10], [306, 113, 17, 16, 17, 10], [306, 164, 19, 16, 19, 10], [306, 211, 17, 20, 17, 6], [306, 266, 21, 16, 21, 10], [306, 317, 21, 16, 21, 10], [306, 368, 29, 16, 29, 10], [306, 419, 21, 16, 21, 10], [306, 470, 21, 22, 21, 10], [306, 521, 21, 16, 21, 10], [306, 566, 15, 24, 15, 4], [306, 617, 15, 24, 15, 4], [306, 668, 15, 24, 15, 4], [306, 725, 21, 15, 21, 10], [306, 772, 17, 20, 17, 6], [367, 3, 21, 24, 21, 2], [367, 52, 21, 26, 21, 0], [367, 109, 21, 26, 21, 6], [367, 154, 19, 26, 19, 0], [367, 205, 23, 26, 23, 0], [367, 258, 21, 24, 21, 2], [367, 309, 21, 24, 21, 2], [367, 362, 21, 22, 21, 4], [367, 413, 21, 22, 21, 4], [367, 464, 21, 22, 21, 4], [367, 517, 21, 20, 21, 6], [367, 566, 21, 22, 21, 4], [367, 613, 21, 26, 21, 0], [367, 674, 19, 22, 19, 10], [367, 719, 21, 22, 21, 4], [367, 770, 21, 22, 21, 4], [428, 5, 21, 22, 21, 4], [428, 58, 21, 20, 21, 6], [428, 107, 13, 22, 13, 4], [428, 158, 13, 22, 13, 4], [428, 209, 13, 22, 13, 4], [428, 262, 13, 20, 13, 6], [428, 311, 21, 22, 21, 4], [428, 362, 21, 22, 21, 4], [428, 413, 21, 22, 21, 4], [428, 464, 21, 22, 21, 4], [428, 517, 21, 20, 21, 6], [428, 566, 21, 22, 21, 4], [428, 617, 21, 22, 21, 4], [428, 668, 21, 22, 21, 4], [428, 719, 21, 22, 21, 4], [428, 772, 21, 20, 21, 6], [489, 7, 15, 19, 15, 6], [489, 58, 17, 19, 17, 6], [489, 107, 19, 21, 19, 4], [489, 160, 23, 20, 23, 6], [489, 211, 19, 26, 19, 6], [489, 266, 19, 15, 19, 10], [489, 313, 23, 20, 23, 6], [489, 364, 21, 20, 21, 6], [489, 415, 25, 20, 25, 6], [489, 466, 25, 20, 25, 6], [489, 517, 27, 19, 27, 6], [489, 566, 17, 21, 17, 4], [489, 619, 16, 19, 16, 6], [489, 676, 23, 13, 23, 12], [489, 721, 27, 20, 27, 6], [489, 772, 21, 20, 21, 6], [550, 11, 33, 15, 33, 10], [550, 62, 19, 16, 19, 10], [550, 112, 17, 17, 17, 9], [550, 163, 17, 17, 17, 9], [550, 211, 21, 20, 21, 6], [550, 266, 25, 20, 25, 10], [550, 313, 21, 20, 21, 6], [550, 364, 23, 22, 23, 6], [550, 415, 25, 22, 25, 6], [550, 468, 27, 18, 27, 8], [550, 517, 17, 24, 17, 6], [550, 568, 19, 19, 19, 6], [550, 619, 19, 19, 19, 6], [550, 670, 25, 20, 25, 6], [550, 725, 29, 16, 29, 10], [550, 776, 21, 16, 21, 10], [611, 7, 21, 20, 21, 6], [611, 58, 17, 20, 17, 6], [611, 119, 19, 9, 19, 16], [611, 158, 29, 22, 29, 4], [611, 211, 17, 24, 17, 6], [611, 266, 21, 15, 21, 10], [611, 313, 23, 20, 23, 6], [611, 368, 23, 15, 23, 10], [611, 419, 23, 15, 23, 10], [611, 479, 33, 7, 33, 19], [611, 530, 21, 6, 21, 19], [611, 562, 21, 26, 21, 0], [611, 613, 21, 26, 21, 0], [611, 664, 21, 26, 21, 0], [611, 721, 27, 20, 27, 6], [611, 776, 29, 16, 29, 10], [672, 17, 17, 9, 17, 16], [672, 68, 25, 9, 25, 16], [672, 109, 19, 19, 19, 6], [672, 160, 19, 19, 19, 6], [672, 211, 13, 19, 13, 6], [672, 262, 13, 19, 13, 6], [672, 319, 19, 13, 19, 12], [672, 367, 24, 17, 24, 9], [672, 415, 21, 26, 21, 6], [1, 20, 13, 6, 13, 19], [794, 770, 17, 21, 17, 4], [672, 571, 21, 16, 21, 9], [672, 623, 17, 15, 17, 10], [672, 674, 17, 15, 17, 10], [672, 721, 25, 20, 25, 6], [672, 772, 25, 20, 25, 6], [733, 7, 15, 19, 15, 6], [733, 66, 13, 11, 13, 14], [733, 122, 13, 11, 13, 19], [733, 173, 19, 11, 19, 19], [733, 211, 35, 20, 35, 6], [733, 256, 21, 26, 21, 0], [733, 307, 19, 26, 19, 0], [733, 358, 21, 26, 21, 0], [733, 411, 19, 24, 19, 2], [733, 460, 19, 26, 19, 0], [733, 511, 17, 26, 17, 0], [733, 562, 17, 26, 17, 0], [733, 615, 17, 24, 17, 2], [733, 664, 17, 26, 17, 0], [733, 715, 21, 26, 21, 0], [733, 766, 21, 26, 21, 0], [1, 20, 13, 6, 13, 19], [794, 52, 21, 26, 21, 0], [794, 103, 21, 26, 21, 0], [794, 154, 21, 26, 21, 0], [794, 205, 21, 26, 21, 0], [794, 266, 13, 16, 13, 10], [794, 311, 17, 21, 17, 4], [794, 362, 21, 21, 21, 4], [794, 415, 17, 19, 17, 6], [794, 464, 17, 21, 17, 4], [794, 517, 17, 19, 17, 6], [794, 562, 17, 25, 17, 0], [794, 632, 17, 13, 17, 19], [794, 668, 17, 21, 17, 4], [794, 734, 17, 13, 17, 19], [794, 770, 17, 21, 17, 4], [855, 5, 17, 21, 17, 4], [855, 56, 17, 21, 17, 4], [855, 107, 17, 21, 17, 4], [855, 158, 17, 21, 17, 4], [855, 209, 17, 21, 17, 4], [855, 260, 17, 21, 17, 4], [855, 311, 17, 21, 17, 4], [855, 362, 17, 21, 17, 4], [855, 413, 17, 21, 17, 4], [855, 464, 17, 21, 17, 4], [855, 515, 17, 21, 17, 4], [855, 566, 17, 21, 17, 4], [855, 617, 17, 21, 17, 4], [855, 668, 17, 21, 17, 4], [855, 719, 17, 21, 17, 4], [855, 770, 17, 21, 17, 4]], \"widestlogicalchar\": 35, \"widestglyph\": 35, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 12, 6, 12, 18], [1, 58, 16, 18, 16, 6], [1, 109, 18, 18, 18, 6], [1, 160, 24, 18, 24, 6], [1, 209, 18, 22, 18, 4], [1, 262, 26, 18, 26, 6], [1, 313, 24, 18, 24, 6], [1, 364, 10, 18, 10, 6], [1, 413, 14, 22, 14, 4], [1, 464, 14, 22, 14, 4], [1, 518, 18, 17, 18, 7], [1, 574, 18, 12, 18, 12], [1, 631, 12, 10, 12, 18], [1, 680, 18, 8, 18, 16], [1, 733, 12, 6, 12, 18], [1, 770, 18, 20, 18, 4], [62, 7, 20, 18, 20, 6], [62, 58, 20, 18, 20, 6], [62, 109, 20, 18, 20, 6], [62, 160, 20, 18, 20, 6], [62, 211, 20, 18, 20, 6], [62, 262, 20, 18, 20, 6], [62, 313, 20, 18, 20, 6], [62, 364, 20, 18, 20, 6], [62, 415, 20, 18, 20, 6], [62, 466, 20, 18, 20, 6], [62, 521, 12, 14, 12, 10], [62, 572, 12, 18, 12, 10], [62, 620, 16, 17, 16, 7], [62, 678, 20, 10, 20, 14], [62, 722, 16, 17, 16, 7], [62, 772, 20, 18, 20, 6], [123, 7, 26, 18, 26, 6], [123, 58, 20, 18, 20, 6], [123, 109, 20, 18, 20, 6], [123, 160, 20, 18, 20, 6], [123, 211, 20, 18, 20, 6], [123, 262, 18, 18, 18, 6], [123, 313, 18, 18, 18, 6], [123, 364, 20, 18, 20, 6], [123, 415, 20, 18, 20, 6], [123, 466, 16, 18, 16, 6], [123, 517, 18, 18, 18, 6], [123, 568, 22, 18, 22, 6], [123, 619, 18, 18, 18, 6], [123, 670, 28, 18, 28, 6], [123, 721, 22, 18, 22, 6], [123, 772, 20, 18, 20, 6], [184, 7, 20, 18, 20, 6], [184, 58, 20, 20, 20, 6], [184, 109, 20, 18, 20, 6], [184, 160, 18, 18, 18, 6], [184, 211, 16, 18, 16, 6], [184, 262, 20, 18, 20, 6], [184, 313, 20, 18, 20, 6], [184, 364, 28, 18, 28, 6], [184, 415, 20, 18, 20, 6], [184, 466, 20, 18, 20, 6], [184, 517, 20, 18, 20, 6], [184, 566, 14, 22, 14, 4], [184, 617, 18, 20, 18, 4], [184, 668, 14, 22, 14, 4], [184, 721, 20, 18, 20, 6], [184, 784, 20, 8, 20, 18], [245, 5, 16, 20, 16, 4], [245, 62, 20, 14, 20, 10], [245, 109, 20, 18, 20, 6], [245, 164, 18, 14, 18, 10], [245, 211, 20, 18, 20, 6], [245, 266, 20, 14, 20, 10], [245, 313, 16, 18, 16, 6], [245, 368, 20, 20, 20, 10], [245, 415, 20, 18, 20, 6], [245, 466, 12, 18, 12, 6], [245, 517, 16, 22, 16, 6], [245, 568, 20, 18, 20, 6], [245, 619, 12, 18, 12, 6], [245, 674, 28, 14, 28, 10], [245, 725, 20, 14, 20, 10], [245, 776, 20, 14, 20, 10], [306, 11, 20, 18, 20, 10], [306, 62, 20, 18, 20, 10], [306, 113, 16, 14, 16, 10], [306, 164, 18, 14, 18, 10], [306, 211, 16, 18, 16, 6], [306, 266, 20, 14, 20, 10], [306, 317, 20, 14, 20, 10], [306, 368, 28, 14, 28, 10], [306, 419, 20, 14, 20, 10], [306, 470, 20, 20, 20, 10], [306, 521, 20, 14, 20, 10], [306, 566, 14, 22, 14, 4], [306, 617, 14, 22, 14, 4], [306, 668, 14, 22, 14, 4], [306, 725, 20, 14, 20, 10], [306, 772, 16, 18, 16, 6], [367, 3, 20, 22, 20, 2], [367, 52, 20, 24, 20, 0], [367, 109, 20, 24, 20, 6], [367, 154, 18, 24, 18, 0], [367, 205, 22, 24, 22, 0], [367, 258, 20, 22, 20, 2], [367, 309, 20, 22, 20, 2], [367, 362, 20, 20, 20, 4], [367, 413, 20, 20, 20, 4], [367, 464, 20, 20, 20, 4], [367, 517, 20, 18, 20, 6], [367, 566, 20, 20, 20, 4], [367, 613, 20, 24, 20, 0], [367, 674, 18, 20, 18, 10], [367, 719, 20, 20, 20, 4], [367, 770, 20, 20, 20, 4], [428, 5, 20, 20, 20, 4], [428, 58, 20, 18, 20, 6], [428, 107, 12, 20, 12, 4], [428, 158, 12, 20, 12, 4], [428, 209, 12, 20, 12, 4], [428, 262, 12, 18, 12, 6], [428, 311, 20, 20, 20, 4], [428, 362, 20, 20, 20, 4], [428, 413, 20, 20, 20, 4], [428, 464, 20, 20, 20, 4], [428, 517, 20, 18, 20, 6], [428, 566, 20, 20, 20, 4], [428, 617, 20, 20, 20, 4], [428, 668, 20, 20, 20, 4], [428, 719, 20, 20, 20, 4], [428, 772, 20, 18, 20, 6], [489, 7, 14, 18, 14, 6], [489, 58, 16, 18, 16, 6], [489, 107, 18, 20, 18, 4], [489, 160, 22, 18, 22, 6], [489, 211, 18, 24, 18, 6], [489, 266, 18, 14, 18, 10], [489, 313, 22, 18, 22, 6], [489, 364, 20, 18, 20, 6], [489, 415, 24, 18, 24, 6], [489, 466, 24, 18, 24, 6], [489, 517, 26, 18, 26, 6], [489, 566, 16, 20, 16, 4], [489, 619, 15, 18, 15, 6], [489, 676, 22, 12, 22, 12], [489, 721, 26, 18, 26, 6], [489, 772, 20, 18, 20, 6], [550, 11, 32, 14, 32, 10], [550, 62, 18, 14, 18, 10], [550, 112, 16, 15, 16, 9], [550, 163, 16, 15, 16, 9], [550, 211, 20, 18, 20, 6], [550, 266, 24, 18, 24, 10], [550, 313, 20, 18, 20, 6], [550, 364, 22, 20, 22, 6], [550, 415, 24, 20, 24, 6], [550, 468, 26, 16, 26, 8], [550, 517, 16, 22, 16, 6], [550, 568, 18, 18, 18, 6], [550, 619, 18, 18, 18, 6], [550, 670, 24, 18, 24, 6], [550, 725, 28, 14, 28, 10], [550, 776, 20, 14, 20, 10], [611, 7, 20, 18, 20, 6], [611, 58, 16, 18, 16, 6], [611, 119, 18, 8, 18, 16], [611, 158, 28, 20, 28, 4], [611, 211, 16, 22, 16, 6], [611, 266, 20, 14, 20, 10], [611, 313, 22, 18, 22, 6], [611, 368, 22, 14, 22, 10], [611, 419, 22, 14, 22, 10], [611, 478, 32, 6, 32, 18], [611, 529, 20, 6, 20, 18], [611, 562, 20, 24, 20, 0], [611, 613, 20, 24, 20, 0], [611, 664, 20, 24, 20, 0], [611, 721, 26, 18, 26, 6], [611, 776, 28, 14, 28, 10], [672, 17, 16, 8, 16, 16], [672, 68, 24, 8, 24, 16], [672, 109, 18, 18, 18, 6], [672, 160, 18, 18, 18, 6], [672, 211, 12, 18, 12, 6], [672, 262, 12, 18, 12, 6], [672, 319, 18, 12, 18, 12], [672, 367, 23, 15, 23, 9], [672, 415, 20, 24, 20, 6], [1, 19, 12, 6, 12, 18], [794, 770, 16, 20, 16, 4], [672, 571, 20, 15, 20, 9], [672, 623, 16, 14, 16, 10], [672, 674, 16, 14, 16, 10], [672, 721, 24, 18, 24, 6], [672, 772, 24, 18, 24, 6], [733, 7, 14, 18, 14, 6], [733, 66, 12, 10, 12, 14], [733, 121, 12, 10, 12, 18], [733, 172, 18, 10, 18, 18], [733, 211, 34, 18, 34, 6], [733, 256, 20, 24, 20, 0], [733, 307, 18, 24, 18, 0], [733, 358, 20, 24, 20, 0], [733, 411, 18, 22, 18, 2], [733, 460, 18, 24, 18, 0], [733, 511, 16, 24, 16, 0], [733, 562, 16, 24, 16, 0], [733, 615, 16, 22, 16, 2], [733, 664, 16, 24, 16, 0], [733, 715, 20, 24, 20, 0], [733, 766, 20, 24, 20, 0], [1, 19, 12, 6, 12, 18], [794, 52, 20, 24, 20, 0], [794, 103, 20, 24, 20, 0], [794, 154, 20, 24, 20, 0], [794, 205, 20, 24, 20, 0], [794, 266, 12, 14, 12, 10], [794, 311, 16, 20, 16, 4], [794, 362, 20, 20, 20, 4], [794, 415, 16, 18, 16, 6], [794, 464, 16, 20, 16, 4], [794, 517, 16, 18, 16, 6], [794, 562, 16, 24, 16, 0], [794, 631, 16, 12, 16, 18], [794, 668, 16, 20, 16, 4], [794, 733, 16, 12, 16, 18], [794, 770, 16, 20, 16, 4], [855, 5, 16, 20, 16, 4], [855, 56, 16, 20, 16, 4], [855, 107, 16, 20, 16, 4], [855, 158, 16, 20, 16, 4], [855, 209, 16, 20, 16, 4], [855, 260, 16, 20, 16, 4], [855, 311, 16, 20, 16, 4], [855, 362, 16, 20, 16, 4], [855, 413, 16, 20, 16, 4], [855, 464, 16, 20, 16, 4], [855, 515, 16, 20, 16, 4], [855, 566, 16, 20, 16, 4], [855, 617, 16, 20, 16, 4], [855, 668, 16, 20, 16, 4], [855, 719, 16, 20, 16, 4], [855, 770, 16, 20, 16, 4]], \"widestlogicalchar\": 34, \"widestglyph\": 34, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 58, 15, 20, 16, 6], [1, 109, 17, 8, 18, 6], [1, 160, 25, 18, 24, 6], [1, 209, 19, 24, 18, 4], [1, 262, 25, 20, 26, 6], [1, 313, 24, 20, 24, 6], [1, 364, 11, 8, 10, 6], [1, 413, 16, 24, 14, 4], [1, 464, 15, 24, 14, 4], [1, 518, 19, 13, 18, 7], [1, 574, 17, 12, 18, 12], [1, 633, 11, 10, 12, 20], [1, 680, 17, 4, 18, 16], [1, 735, 11, 6, 12, 20], [1, 770, 20, 22, 18, 4], [62, 7, 21, 20, 20, 6], [62, 58, 17, 20, 20, 6], [62, 109, 21, 20, 20, 6], [62, 160, 21, 20, 20, 6], [62, 211, 19, 20, 20, 6], [62, 262, 21, 20, 20, 6], [62, 313, 20, 20, 20, 6], [62, 364, 21, 20, 20, 6], [62, 415, 21, 20, 20, 6], [62, 466, 21, 20, 20, 6], [62, 521, 13, 16, 12, 10], [62, 572, 13, 20, 12, 10], [62, 620, 16, 17, 16, 7], [62, 678, 20, 8, 20, 14], [62, 722, 18, 17, 16, 7], [62, 772, 21, 20, 20, 6], [123, 7, 26, 20, 26, 6], [123, 58, 21, 20, 20, 6], [123, 109, 21, 20, 20, 6], [123, 160, 21, 20, 20, 6], [123, 211, 21, 20, 20, 6], [123, 262, 19, 20, 18, 6], [123, 313, 19, 20, 18, 6], [123, 364, 21, 20, 20, 6], [123, 415, 21, 20, 20, 6], [123, 466, 15, 20, 16, 6], [123, 517, 19, 20, 18, 6], [123, 568, 23, 20, 22, 6], [123, 619, 16, 20, 18, 6], [123, 670, 29, 20, 28, 6], [123, 721, 23, 20, 22, 6], [123, 772, 21, 20, 20, 6], [184, 7, 21, 20, 20, 6], [184, 58, 21, 22, 20, 6], [184, 109, 21, 20, 20, 6], [184, 160, 19, 20, 18, 6], [184, 211, 19, 20, 16, 6], [184, 262, 21, 20, 20, 6], [184, 313, 21, 20, 20, 6], [184, 364, 29, 20, 28, 6], [184, 415, 21, 20, 20, 6], [184, 466, 21, 20, 20, 6], [184, 517, 21, 20, 20, 6], [184, 566, 16, 24, 14, 4], [184, 617, 16, 22, 18, 4], [184, 668, 16, 24, 14, 4], [184, 721, 21, 8, 20, 6], [184, 790, 20, 4, 20, 24], [245, 5, 15, 6, 16, 4], [245, 62, 20, 16, 20, 10], [245, 109, 20, 20, 20, 6], [245, 164, 18, 16, 18, 10], [245, 211, 21, 20, 20, 6], [245, 266, 20, 16, 20, 10], [245, 313, 19, 20, 16, 6], [245, 368, 21, 22, 20, 10], [245, 415, 20, 20, 20, 6], [245, 466, 13, 20, 12, 6], [245, 517, 17, 24, 16, 6], [245, 568, 22, 20, 20, 6], [245, 619, 13, 20, 12, 6], [245, 674, 28, 16, 28, 10], [245, 725, 20, 16, 20, 10], [245, 776, 20, 16, 20, 10], [306, 11, 20, 20, 20, 10], [306, 62, 21, 20, 20, 10], [306, 113, 19, 16, 16, 10], [306, 164, 18, 16, 18, 10], [306, 211, 17, 20, 16, 6], [306, 266, 21, 16, 20, 10], [306, 317, 21, 16, 20, 10], [306, 368, 29, 16, 28, 10], [306, 419, 21, 16, 20, 10], [306, 470, 21, 22, 20, 10], [306, 521, 21, 16, 20, 10], [306, 566, 16, 24, 14, 4], [306, 617, 14, 24, 14, 4], [306, 668, 14, 24, 14, 4], [306, 725, 21, 6, 20, 10], [306, 772, 17, 20, 16, 6], [367, 3, 21, 24, 20, 2], [367, 52, 21, 26, 20, 0], [367, 109, 21, 26, 20, 6], [367, 154, 19, 26, 18, 0], [367, 205, 24, 26, 22, 0], [367, 258, 21, 24, 20, 2], [367, 309, 21, 24, 20, 2], [367, 362, 20, 22, 20, 4], [367, 413, 20, 22, 20, 4], [367, 464, 20, 22, 20, 4], [367, 517, 20, 20, 20, 6], [367, 566, 22, 22, 20, 4], [367, 613, 20, 26, 20, 0], [367, 674, 18, 22, 18, 10], [367, 719, 20, 22, 20, 4], [367, 770, 20, 22, 20, 4], [428, 5, 20, 22, 20, 4], [428, 58, 20, 20, 20, 6], [428, 107, 13, 22, 12, 4], [428, 158, 12, 22, 12, 4], [428, 209, 15, 22, 12, 4], [428, 262, 14, 20, 12, 6], [428, 311, 22, 22, 20, 4], [428, 362, 20, 22, 20, 4], [428, 413, 20, 22, 20, 4], [428, 464, 20, 22, 20, 4], [428, 517, 20, 20, 20, 6], [428, 566, 22, 22, 20, 4], [428, 617, 21, 22, 20, 4], [428, 668, 21, 22, 20, 4], [428, 719, 21, 22, 20, 4], [428, 772, 21, 20, 20, 6], [489, 7, 15, 12, 14, 6], [489, 58, 17, 10, 16, 6], [489, 107, 19, 18, 18, 4], [489, 160, 21, 20, 22, 6], [489, 211, 19, 26, 18, 6], [489, 266, 18, 12, 18, 10], [489, 313, 23, 20, 22, 6], [489, 364, 21, 20, 20, 6], [489, 415, 25, 20, 24, 6], [489, 466, 25, 20, 24, 6], [489, 517, 27, 10, 26, 6], [489, 566, 16, 6, 16, 4], [489, 619, 16, 4, 15, 6], [489, 676, 21, 12, 22, 12], [489, 721, 27, 20, 26, 6], [489, 772, 21, 20, 20, 6], [550, 11, 31, 12, 32, 10], [550, 62, 18, 16, 18, 10], [550, 112, 15, 17, 16, 9], [550, 162, 16, 18, 16, 8], [550, 211, 21, 20, 20, 6], [550, 266, 25, 20, 24, 10], [550, 313, 21, 20, 20, 6], [550, 364, 23, 22, 22, 6], [550, 415, 25, 22, 24, 6], [550, 468, 28, 18, 26, 8], [550, 517, 17, 24, 16, 6], [550, 568, 19, 18, 18, 6], [550, 619, 19, 18, 18, 6], [550, 670, 25, 20, 24, 6], [550, 725, 28, 16, 28, 10], [550, 776, 20, 16, 20, 10], [611, 7, 19, 20, 20, 6], [611, 58, 15, 20, 16, 6], [611, 119, 17, 8, 18, 16], [611, 158, 30, 22, 28, 4], [611, 211, 17, 24, 16, 6], [611, 266, 21, 12, 20, 10], [611, 313, 21, 20, 22, 6], [611, 367, 22, 16, 22, 9], [611, 419, 22, 16, 22, 10], [611, 480, 29, 6, 32, 20], [611, 511, 1, 1, 20, 1], [611, 562, 21, 26, 20, 0], [611, 613, 23, 26, 20, 0], [611, 664, 23, 26, 20, 0], [611, 721, 27, 20, 26, 6], [611, 776, 28, 16, 28, 10], [672, 17, 15, 4, 16, 16], [672, 68, 23, 4, 24, 16], [672, 109, 19, 10, 18, 6], [672, 160, 19, 10, 18, 6], [672, 211, 13, 10, 12, 6], [672, 262, 13, 10, 12, 6], [672, 319, 17, 12, 18, 12], [672, 367, 23, 17, 23, 9], [672, 415, 21, 26, 20, 6], [1, 1, 1, 1, 12, 1], [794, 770, 18, 6, 16, 4], [672, 571, 21, 12, 20, 9], [672, 622, 16, 16, 16, 9], [672, 674, 16, 16, 16, 10], [672, 721, 25, 20, 24, 6], [672, 772, 25, 20, 24, 6], [733, 7, 15, 14, 14, 6], [733, 66, 12, 6, 12, 14], [733, 123, 11, 10, 12, 20], [733, 174, 17, 10, 18, 20], [733, 211, 33, 20, 34, 6], [733, 256, 21, 26, 20, 0], [733, 307, 19, 26, 18, 0], [733, 358, 21, 26, 20, 0], [733, 411, 19, 24, 18, 2], [733, 460, 19, 26, 18, 0], [733, 511, 16, 26, 16, 0], [733, 562, 18, 26, 16, 0], [733, 615, 17, 24, 16, 2], [733, 664, 16, 26, 16, 0], [733, 715, 21, 26, 20, 0], [733, 766, 21, 26, 20, 0], [1, 1, 1, 1, 12, 1], [794, 52, 21, 26, 20, 0], [794, 103, 21, 26, 20, 0], [794, 154, 21, 26, 20, 0], [794, 205, 21, 26, 20, 0], [794, 266, 13, 16, 12, 10], [794, 311, 17, 6, 16, 4], [794, 362, 22, 6, 20, 4], [794, 415, 17, 4, 16, 6], [794, 464, 18, 6, 16, 4], [794, 517, 14, 4, 16, 6], [794, 562, 18, 10, 16, 0], [794, 637, 12, 8, 16, 24], [794, 668, 18, 6, 16, 4], [794, 739, 12, 8, 16, 24], [794, 770, 18, 6, 16, 4], [855, 5, 18, 6, 16, 4], [855, 56, 18, 6, 16, 4], [855, 107, 18, 6, 16, 4], [855, 158, 18, 6, 16, 4], [855, 209, 18, 6, 16, 4], [855, 260, 18, 6, 16, 4], [855, 311, 18, 6, 16, 4], [855, 362, 18, 6, 16, 4], [855, 413, 18, 6, 16, 4], [855, 464, 18, 6, 16, 4], [855, 515, 18, 6, 16, 4], [855, 566, 18, 6, 16, 4], [855, 617, 18, 6, 16, 4], [855, 668, 18, 6, 16, 4], [855, 719, 18, 6, 16, 4], [855, 770, 18, 6, 16, 4]], \"capHeight\": 25, \"widestlogicalchar\": 34, \"widestglyph\": 33, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 58, 14, 18, 15, 6], [1, 109, 16, 6, 17, 6], [1, 160, 24, 16, 23, 6], [1, 209, 18, 22, 17, 4], [1, 262, 24, 18, 25, 6], [1, 313, 23, 18, 23, 6], [1, 364, 10, 6, 9, 6], [1, 413, 15, 22, 13, 4], [1, 464, 14, 22, 13, 4], [1, 518, 18, 11, 17, 7], [1, 574, 16, 10, 17, 12], [1, 633, 10, 8, 11, 20], [1, 680, 16, 2, 17, 16], [1, 735, 10, 4, 11, 20], [1, 770, 19, 20, 17, 4], [62, 7, 20, 18, 19, 6], [62, 58, 16, 18, 19, 6], [62, 109, 20, 18, 19, 6], [62, 160, 20, 18, 19, 6], [62, 211, 18, 18, 19, 6], [62, 262, 20, 18, 19, 6], [62, 313, 19, 18, 19, 6], [62, 364, 20, 18, 19, 6], [62, 415, 20, 18, 19, 6], [62, 466, 20, 18, 19, 6], [62, 521, 12, 14, 11, 10], [62, 572, 12, 18, 11, 10], [62, 620, 15, 15, 15, 7], [62, 678, 19, 6, 19, 14], [62, 722, 17, 15, 15, 7], [62, 772, 20, 18, 19, 6], [123, 7, 25, 18, 25, 6], [123, 58, 20, 18, 19, 6], [123, 109, 20, 18, 19, 6], [123, 160, 20, 18, 19, 6], [123, 211, 20, 18, 19, 6], [123, 262, 18, 18, 17, 6], [123, 313, 18, 18, 17, 6], [123, 364, 20, 18, 19, 6], [123, 415, 20, 18, 19, 6], [123, 466, 14, 18, 15, 6], [123, 517, 18, 18, 17, 6], [123, 568, 22, 18, 21, 6], [123, 619, 15, 18, 17, 6], [123, 670, 28, 18, 27, 6], [123, 721, 22, 18, 21, 6], [123, 772, 20, 18, 19, 6], [184, 7, 20, 18, 19, 6], [184, 58, 20, 20, 19, 6], [184, 109, 20, 18, 19, 6], [184, 160, 18, 18, 17, 6], [184, 211, 18, 18, 15, 6], [184, 262, 20, 18, 19, 6], [184, 313, 20, 18, 19, 6], [184, 364, 28, 18, 27, 6], [184, 415, 20, 18, 19, 6], [184, 466, 20, 18, 19, 6], [184, 517, 20, 18, 19, 6], [184, 566, 15, 22, 13, 4], [184, 617, 15, 20, 17, 4], [184, 668, 15, 22, 13, 4], [184, 721, 20, 6, 19, 6], [184, 790, 19, 2, 19, 24], [245, 5, 14, 4, 15, 4], [245, 62, 19, 14, 19, 10], [245, 109, 19, 18, 19, 6], [245, 164, 17, 14, 17, 10], [245, 211, 20, 18, 19, 6], [245, 266, 19, 14, 19, 10], [245, 313, 18, 18, 15, 6], [245, 368, 20, 20, 19, 10], [245, 415, 19, 18, 19, 6], [245, 466, 12, 18, 11, 6], [245, 517, 16, 22, 15, 6], [245, 568, 21, 18, 19, 6], [245, 619, 12, 18, 11, 6], [245, 674, 27, 14, 27, 10], [245, 725, 19, 14, 19, 10], [245, 776, 19, 14, 19, 10], [306, 11, 19, 18, 19, 10], [306, 62, 20, 18, 19, 10], [306, 113, 18, 14, 15, 10], [306, 164, 17, 14, 17, 10], [306, 211, 16, 18, 15, 6], [306, 266, 20, 14, 19, 10], [306, 317, 20, 14, 19, 10], [306, 368, 28, 14, 27, 10], [306, 419, 20, 14, 19, 10], [306, 470, 20, 20, 19, 10], [306, 521, 20, 14, 19, 10], [306, 566, 15, 22, 13, 4], [306, 617, 13, 22, 13, 4], [306, 668, 13, 22, 13, 4], [306, 725, 20, 4, 19, 10], [306, 772, 16, 18, 15, 6], [367, 3, 20, 22, 19, 2], [367, 52, 20, 24, 19, 0], [367, 109, 20, 24, 19, 6], [367, 154, 18, 24, 17, 0], [367, 205, 22, 24, 21, 0], [367, 258, 20, 22, 19, 2], [367, 309, 20, 22, 19, 2], [367, 362, 19, 20, 19, 4], [367, 413, 19, 20, 19, 4], [367, 464, 19, 20, 19, 4], [367, 517, 19, 18, 19, 6], [367, 566, 21, 20, 19, 4], [367, 613, 19, 24, 19, 0], [367, 674, 17, 20, 17, 10], [367, 719, 19, 20, 19, 4], [367, 770, 19, 20, 19, 4], [428, 5, 19, 20, 19, 4], [428, 58, 19, 18, 19, 6], [428, 107, 12, 20, 11, 4], [428, 158, 11, 20, 11, 4], [428, 209, 14, 20, 11, 4], [428, 262, 13, 18, 11, 6], [428, 311, 21, 20, 19, 4], [428, 362, 19, 20, 19, 4], [428, 413, 19, 20, 19, 4], [428, 464, 19, 20, 19, 4], [428, 517, 19, 18, 19, 6], [428, 566, 21, 20, 19, 4], [428, 617, 20, 20, 19, 4], [428, 668, 20, 20, 19, 4], [428, 719, 20, 20, 19, 4], [428, 772, 20, 18, 19, 6], [489, 7, 14, 10, 13, 6], [489, 58, 16, 8, 15, 6], [489, 107, 18, 16, 17, 4], [489, 160, 20, 18, 21, 6], [489, 211, 18, 24, 17, 6], [489, 266, 17, 10, 17, 10], [489, 313, 22, 18, 21, 6], [489, 364, 20, 18, 19, 6], [489, 415, 24, 18, 23, 6], [489, 466, 24, 18, 23, 6], [489, 517, 26, 8, 25, 6], [489, 566, 15, 4, 15, 4], [489, 619, 15, 2, 14, 6], [489, 676, 20, 10, 21, 12], [489, 721, 26, 18, 25, 6], [489, 772, 20, 18, 19, 6], [550, 11, 30, 10, 31, 10], [550, 62, 17, 14, 17, 10], [550, 112, 14, 15, 15, 9], [550, 162, 15, 16, 15, 8], [550, 211, 20, 18, 19, 6], [550, 266, 24, 18, 23, 10], [550, 313, 20, 18, 19, 6], [550, 364, 22, 20, 21, 6], [550, 415, 24, 20, 23, 6], [550, 468, 27, 16, 25, 8], [550, 517, 16, 22, 15, 6], [550, 568, 18, 16, 17, 6], [550, 619, 18, 16, 17, 6], [550, 670, 24, 18, 23, 6], [550, 725, 27, 14, 27, 10], [550, 776, 19, 14, 19, 10], [611, 7, 18, 18, 19, 6], [611, 58, 14, 18, 15, 6], [611, 119, 16, 6, 17, 16], [611, 158, 29, 20, 27, 4], [611, 211, 16, 22, 15, 6], [611, 266, 20, 10, 19, 10], [611, 313, 20, 18, 21, 6], [611, 367, 21, 14, 21, 9], [611, 419, 21, 14, 21, 10], [611, 480, 28, 4, 31, 20], [611, 511, 1, 1, 19, 1], [611, 562, 20, 24, 19, 0], [611, 613, 21, 24, 19, 0], [611, 664, 21, 24, 19, 0], [611, 721, 26, 18, 25, 6], [611, 776, 27, 14, 27, 10], [672, 17, 14, 2, 15, 16], [672, 68, 22, 2, 23, 16], [672, 109, 18, 8, 17, 6], [672, 160, 18, 8, 17, 6], [672, 211, 12, 8, 11, 6], [672, 262, 12, 8, 11, 6], [672, 319, 16, 10, 17, 12], [672, 367, 22, 15, 22, 9], [672, 415, 20, 24, 19, 6], [1, 1, 1, 1, 11, 1], [794, 770, 17, 4, 9, 4], [672, 571, 20, 10, 19, 9], [672, 622, 15, 14, 15, 9], [672, 674, 15, 14, 15, 10], [672, 721, 24, 18, 23, 6], [672, 772, 24, 18, 23, 6], [733, 7, 14, 12, 13, 6], [733, 66, 11, 4, 11, 14], [733, 123, 10, 8, 11, 20], [733, 174, 16, 8, 17, 20], [733, 211, 32, 18, 33, 6], [733, 256, 20, 24, 19, 0], [733, 307, 18, 24, 17, 0], [733, 358, 20, 24, 19, 0], [733, 411, 18, 22, 17, 2], [733, 460, 18, 24, 17, 0], [733, 511, 15, 24, 15, 0], [733, 562, 17, 24, 15, 0], [733, 615, 16, 22, 15, 2], [733, 664, 15, 24, 15, 0], [733, 715, 20, 24, 19, 0], [733, 766, 20, 24, 19, 0], [1, 1, 1, 1, 11, 1], [794, 52, 20, 24, 19, 0], [794, 103, 20, 24, 19, 0], [794, 154, 20, 24, 19, 0], [794, 205, 20, 24, 19, 0], [794, 266, 12, 14, 11, 10], [794, 311, 16, 4, 15, 4], [794, 362, 21, 4, 19, 4], [794, 415, 16, 2, 15, 6], [794, 464, 17, 4, 15, 4], [794, 517, 13, 2, 15, 6], [794, 562, 17, 8, 15, 0], [794, 637, 11, 6, 15, 24], [794, 668, 17, 4, 15, 4], [794, 739, 11, 6, 15, 24], [794, 770, 17, 4, 15, 4], [855, 5, 17, 4, 15, 4], [855, 56, 17, 4, 15, 4], [855, 107, 17, 4, 15, 4], [855, 158, 17, 4, 15, 4], [855, 209, 17, 4, 15, 4], [855, 260, 17, 4, 15, 4], [855, 311, 17, 4, 15, 4], [855, 362, 17, 4, 15, 4], [855, 413, 17, 4, 15, 4], [855, 464, 17, 4, 15, 4], [855, 515, 17, 4, 15, 4], [855, 566, 17, 4, 15, 4], [855, 617, 17, 4, 15, 4], [855, 668, 17, 4, 15, 4], [855, 719, 17, 4, 15, 4], [855, 770, 17, 4, 15, 4]], \"capHeight\": 24, \"widestlogicalchar\": 33, \"widestglyph\": 32, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 20, 12, 6, 12, 19], [1, 58, 16, 20, 16, 6], [1, 109, 18, 19, 18, 6], [1, 160, 24, 19, 24, 6], [1, 209, 18, 24, 18, 4], [1, 262, 26, 20, 26, 6], [1, 313, 24, 20, 24, 6], [1, 364, 10, 19, 10, 6], [1, 413, 14, 24, 14, 4], [1, 464, 14, 24, 14, 4], [1, 518, 18, 18, 18, 7], [1, 574, 18, 13, 18, 12], [1, 632, 12, 11, 12, 19], [1, 680, 18, 9, 18, 16], [1, 734, 12, 7, 12, 19], [1, 770, 18, 22, 18, 4], [62, 7, 20, 20, 20, 6], [62, 58, 20, 20, 20, 6], [62, 109, 20, 20, 20, 6], [62, 160, 20, 20, 20, 6], [62, 211, 20, 20, 20, 6], [62, 262, 20, 20, 20, 6], [62, 313, 20, 20, 20, 6], [62, 364, 20, 20, 20, 6], [62, 415, 20, 20, 20, 6], [62, 466, 20, 20, 20, 6], [62, 521, 12, 16, 12, 10], [62, 572, 12, 20, 12, 10], [62, 620, 16, 18, 16, 7], [62, 678, 20, 11, 20, 14], [62, 722, 16, 18, 16, 7], [62, 772, 20, 20, 20, 6], [123, 7, 26, 20, 26, 6], [123, 58, 20, 20, 20, 6], [123, 109, 20, 20, 20, 6], [123, 160, 20, 20, 20, 6], [123, 211, 20, 20, 20, 6], [123, 262, 18, 20, 18, 6], [123, 313, 18, 20, 18, 6], [123, 364, 20, 20, 20, 6], [123, 415, 20, 20, 20, 6], [123, 466, 16, 20, 16, 6], [123, 517, 18, 20, 18, 6], [123, 568, 22, 20, 22, 6], [123, 619, 18, 20, 18, 6], [123, 670, 28, 20, 28, 6], [123, 721, 22, 20, 22, 6], [123, 772, 20, 20, 20, 6], [184, 7, 20, 20, 20, 6], [184, 58, 20, 22, 20, 6], [184, 109, 20, 20, 20, 6], [184, 160, 18, 20, 18, 6], [184, 211, 16, 20, 16, 6], [184, 262, 20, 20, 20, 6], [184, 313, 20, 20, 20, 6], [184, 364, 28, 20, 28, 6], [184, 415, 20, 20, 20, 6], [184, 466, 20, 20, 20, 6], [184, 517, 20, 20, 20, 6], [184, 566, 14, 24, 14, 4], [184, 617, 18, 22, 18, 4], [184, 668, 14, 24, 14, 4], [184, 721, 20, 19, 20, 6], [184, 785, 20, 9, 20, 19], [245, 5, 16, 21, 16, 4], [245, 62, 20, 16, 20, 10], [245, 109, 20, 20, 20, 6], [245, 164, 18, 16, 18, 10], [245, 211, 20, 20, 20, 6], [245, 266, 20, 16, 20, 10], [245, 313, 16, 20, 16, 6], [245, 368, 20, 22, 20, 10], [245, 415, 20, 20, 20, 6], [245, 466, 12, 20, 12, 6], [245, 517, 16, 24, 16, 6], [245, 568, 20, 20, 20, 6], [245, 619, 12, 20, 12, 6], [245, 674, 28, 16, 28, 10], [245, 725, 20, 16, 20, 10], [245, 776, 20, 16, 20, 10], [306, 11, 20, 20, 20, 10], [306, 62, 20, 20, 20, 10], [306, 113, 16, 16, 16, 10], [306, 164, 18, 16, 18, 10], [306, 211, 16, 20, 16, 6], [306, 266, 20, 16, 20, 10], [306, 317, 20, 16, 20, 10], [306, 368, 28, 16, 28, 10], [306, 419, 20, 16, 20, 10], [306, 470, 20, 22, 20, 10], [306, 521, 20, 16, 20, 10], [306, 566, 14, 24, 14, 4], [306, 617, 14, 24, 14, 4], [306, 668, 14, 24, 14, 4], [306, 725, 20, 15, 20, 10], [306, 772, 16, 20, 16, 6], [367, 3, 20, 24, 20, 2], [367, 52, 20, 26, 20, 0], [367, 109, 20, 26, 20, 6], [367, 154, 18, 26, 18, 0], [367, 205, 22, 26, 22, 0], [367, 258, 20, 24, 20, 2], [367, 309, 20, 24, 20, 2], [367, 362, 20, 22, 20, 4], [367, 413, 20, 22, 20, 4], [367, 464, 20, 22, 20, 4], [367, 517, 20, 20, 20, 6], [367, 566, 20, 22, 20, 4], [367, 613, 20, 26, 20, 0], [367, 674, 18, 22, 18, 10], [367, 719, 20, 22, 20, 4], [367, 770, 20, 22, 20, 4], [428, 5, 20, 22, 20, 4], [428, 58, 20, 20, 20, 6], [428, 107, 12, 22, 12, 4], [428, 158, 12, 22, 12, 4], [428, 209, 12, 22, 12, 4], [428, 262, 12, 20, 12, 6], [428, 311, 20, 22, 20, 4], [428, 362, 20, 22, 20, 4], [428, 413, 20, 22, 20, 4], [428, 464, 20, 22, 20, 4], [428, 517, 20, 20, 20, 6], [428, 566, 20, 22, 20, 4], [428, 617, 20, 22, 20, 4], [428, 668, 20, 22, 20, 4], [428, 719, 20, 22, 20, 4], [428, 772, 20, 20, 20, 6], [489, 7, 14, 19, 14, 6], [489, 58, 16, 19, 16, 6], [489, 107, 18, 21, 18, 4], [489, 160, 22, 20, 22, 6], [489, 211, 18, 26, 18, 6], [489, 266, 18, 15, 18, 10], [489, 313, 22, 20, 22, 6], [489, 364, 20, 20, 20, 6], [489, 415, 24, 20, 24, 6], [489, 466, 24, 20, 24, 6], [489, 517, 26, 19, 26, 6], [489, 566, 16, 21, 16, 4], [489, 619, 15, 19, 15, 6], [489, 676, 22, 13, 22, 12], [489, 721, 26, 20, 26, 6], [489, 772, 20, 20, 20, 6], [550, 11, 32, 15, 32, 10], [550, 62, 18, 16, 18, 10], [550, 112, 16, 17, 16, 9], [550, 163, 16, 17, 16, 9], [550, 211, 20, 20, 20, 6], [550, 266, 24, 20, 24, 10], [550, 313, 20, 20, 20, 6], [550, 364, 22, 22, 22, 6], [550, 415, 24, 22, 24, 6], [550, 468, 26, 18, 26, 8], [550, 517, 16, 24, 16, 6], [550, 568, 18, 19, 18, 6], [550, 619, 18, 19, 18, 6], [550, 670, 24, 20, 24, 6], [550, 725, 28, 16, 28, 10], [550, 776, 20, 16, 20, 10], [611, 7, 20, 20, 20, 6], [611, 58, 16, 20, 16, 6], [611, 119, 18, 9, 18, 16], [611, 158, 28, 22, 28, 4], [611, 211, 16, 24, 16, 6], [611, 266, 20, 15, 20, 10], [611, 313, 22, 20, 22, 6], [611, 368, 22, 15, 22, 10], [611, 419, 22, 15, 22, 10], [611, 479, 32, 7, 32, 19], [611, 530, 20, 6, 20, 19], [611, 562, 20, 26, 20, 0], [611, 613, 20, 26, 20, 0], [611, 664, 20, 26, 20, 0], [611, 721, 26, 20, 26, 6], [611, 776, 28, 16, 28, 10], [672, 17, 16, 9, 16, 16], [672, 68, 24, 9, 24, 16], [672, 109, 18, 19, 18, 6], [672, 160, 18, 19, 18, 6], [672, 211, 12, 19, 12, 6], [672, 262, 12, 19, 12, 6], [672, 319, 18, 13, 18, 12], [672, 367, 23, 17, 23, 9], [672, 415, 20, 26, 20, 6], [1, 20, 12, 6, 12, 19], [794, 770, 16, 21, 16, 4], [672, 571, 20, 16, 20, 9], [672, 623, 16, 15, 16, 10], [672, 674, 16, 15, 16, 10], [672, 721, 24, 20, 24, 6], [672, 772, 24, 20, 24, 6], [733, 7, 14, 19, 14, 6], [733, 66, 12, 11, 12, 14], [733, 122, 12, 11, 12, 19], [733, 173, 18, 11, 18, 19], [733, 211, 34, 20, 34, 6], [733, 256, 20, 26, 20, 0], [733, 307, 18, 26, 18, 0], [733, 358, 20, 26, 20, 0], [733, 411, 18, 24, 18, 2], [733, 460, 18, 26, 18, 0], [733, 511, 16, 26, 16, 0], [733, 562, 16, 26, 16, 0], [733, 615, 16, 24, 16, 2], [733, 664, 16, 26, 16, 0], [733, 715, 20, 26, 20, 0], [733, 766, 20, 26, 20, 0], [1, 20, 12, 6, 12, 19], [794, 52, 20, 26, 20, 0], [794, 103, 20, 26, 20, 0], [794, 154, 20, 26, 20, 0], [794, 205, 20, 26, 20, 0], [794, 266, 12, 16, 12, 10], [794, 311, 16, 21, 16, 4], [794, 362, 20, 21, 20, 4], [794, 415, 16, 19, 16, 6], [794, 464, 16, 21, 16, 4], [794, 517, 16, 19, 16, 6], [794, 562, 16, 25, 16, 0], [794, 632, 16, 13, 16, 19], [794, 668, 16, 21, 16, 4], [794, 734, 16, 13, 16, 19], [794, 770, 16, 21, 16, 4], [855, 5, 16, 21, 16, 4], [855, 56, 16, 21, 16, 4], [855, 107, 16, 21, 16, 4], [855, 158, 16, 21, 16, 4], [855, 209, 16, 21, 16, 4], [855, 260, 16, 21, 16, 4], [855, 311, 16, 21, 16, 4], [855, 362, 16, 21, 16, 4], [855, 413, 16, 21, 16, 4], [855, 464, 16, 21, 16, 4], [855, 515, 16, 21, 16, 4], [855, 566, 16, 21, 16, 4], [855, 617, 16, 21, 16, 4], [855, 668, 16, 21, 16, 4], [855, 719, 16, 21, 16, 4], [855, 770, 16, 21, 16, 4]], \"widestlogicalchar\": 34, \"widestglyph\": 34, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 11, 6, 11, 18], [1, 58, 15, 18, 15, 6], [1, 109, 17, 18, 17, 6], [1, 160, 23, 18, 23, 6], [1, 209, 17, 22, 17, 4], [1, 262, 25, 18, 25, 6], [1, 313, 23, 18, 23, 6], [1, 364, 9, 18, 9, 6], [1, 413, 13, 22, 13, 4], [1, 464, 13, 22, 13, 4], [1, 518, 17, 17, 17, 7], [1, 574, 17, 12, 17, 12], [1, 631, 11, 10, 11, 18], [1, 680, 17, 8, 17, 16], [1, 733, 11, 6, 11, 18], [1, 770, 17, 20, 17, 4], [62, 7, 19, 18, 19, 6], [62, 58, 19, 18, 19, 6], [62, 109, 19, 18, 19, 6], [62, 160, 19, 18, 19, 6], [62, 211, 19, 18, 19, 6], [62, 262, 19, 18, 19, 6], [62, 313, 19, 18, 19, 6], [62, 364, 19, 18, 19, 6], [62, 415, 19, 18, 19, 6], [62, 466, 19, 18, 19, 6], [62, 521, 11, 14, 11, 10], [62, 572, 11, 18, 11, 10], [62, 620, 15, 17, 15, 7], [62, 678, 19, 10, 19, 14], [62, 722, 15, 17, 15, 7], [62, 772, 19, 18, 19, 6], [123, 7, 25, 18, 25, 6], [123, 58, 19, 18, 19, 6], [123, 109, 19, 18, 19, 6], [123, 160, 19, 18, 19, 6], [123, 211, 19, 18, 19, 6], [123, 262, 17, 18, 17, 6], [123, 313, 17, 18, 17, 6], [123, 364, 19, 18, 19, 6], [123, 415, 19, 18, 19, 6], [123, 466, 15, 18, 15, 6], [123, 517, 17, 18, 17, 6], [123, 568, 21, 18, 21, 6], [123, 619, 17, 18, 17, 6], [123, 670, 27, 18, 27, 6], [123, 721, 21, 18, 21, 6], [123, 772, 19, 18, 19, 6], [184, 7, 19, 18, 19, 6], [184, 58, 19, 20, 19, 6], [184, 109, 19, 18, 19, 6], [184, 160, 17, 18, 17, 6], [184, 211, 15, 18, 15, 6], [184, 262, 19, 18, 19, 6], [184, 313, 19, 18, 19, 6], [184, 364, 27, 18, 27, 6], [184, 415, 19, 18, 19, 6], [184, 466, 19, 18, 19, 6], [184, 517, 19, 18, 19, 6], [184, 566, 13, 22, 13, 4], [184, 617, 17, 20, 17, 4], [184, 668, 13, 22, 13, 4], [184, 721, 19, 18, 19, 6], [184, 784, 19, 8, 19, 18], [245, 5, 15, 20, 15, 4], [245, 62, 19, 14, 19, 10], [245, 109, 19, 18, 19, 6], [245, 164, 17, 14, 17, 10], [245, 211, 19, 18, 19, 6], [245, 266, 19, 14, 19, 10], [245, 313, 15, 18, 15, 6], [245, 368, 19, 20, 19, 10], [245, 415, 19, 18, 19, 6], [245, 466, 11, 18, 11, 6], [245, 517, 15, 22, 15, 6], [245, 568, 19, 18, 19, 6], [245, 619, 11, 18, 11, 6], [245, 674, 27, 14, 27, 10], [245, 725, 19, 14, 19, 10], [245, 776, 19, 14, 19, 10], [306, 11, 19, 18, 19, 10], [306, 62, 19, 18, 19, 10], [306, 113, 15, 14, 15, 10], [306, 164, 17, 14, 17, 10], [306, 211, 15, 18, 15, 6], [306, 266, 19, 14, 19, 10], [306, 317, 19, 14, 19, 10], [306, 368, 27, 14, 27, 10], [306, 419, 19, 14, 19, 10], [306, 470, 19, 20, 19, 10], [306, 521, 19, 14, 19, 10], [306, 566, 13, 22, 13, 4], [306, 617, 13, 22, 13, 4], [306, 668, 13, 22, 13, 4], [306, 725, 19, 14, 19, 10], [306, 772, 15, 18, 15, 6], [367, 3, 19, 22, 19, 2], [367, 52, 19, 24, 19, 0], [367, 109, 19, 24, 19, 6], [367, 154, 17, 24, 17, 0], [367, 205, 21, 24, 21, 0], [367, 258, 19, 22, 19, 2], [367, 309, 19, 22, 19, 2], [367, 362, 19, 20, 19, 4], [367, 413, 19, 20, 19, 4], [367, 464, 19, 20, 19, 4], [367, 517, 19, 18, 19, 6], [367, 566, 19, 20, 19, 4], [367, 613, 19, 24, 19, 0], [367, 674, 17, 20, 17, 10], [367, 719, 19, 20, 19, 4], [367, 770, 19, 20, 19, 4], [428, 5, 19, 20, 19, 4], [428, 58, 19, 18, 19, 6], [428, 107, 11, 20, 11, 4], [428, 158, 11, 20, 11, 4], [428, 209, 11, 20, 11, 4], [428, 262, 11, 18, 11, 6], [428, 311, 19, 20, 19, 4], [428, 362, 19, 20, 19, 4], [428, 413, 19, 20, 19, 4], [428, 464, 19, 20, 19, 4], [428, 517, 19, 18, 19, 6], [428, 566, 19, 20, 19, 4], [428, 617, 19, 20, 19, 4], [428, 668, 19, 20, 19, 4], [428, 719, 19, 20, 19, 4], [428, 772, 19, 18, 19, 6], [489, 7, 13, 18, 13, 6], [489, 58, 15, 18, 15, 6], [489, 107, 17, 20, 17, 4], [489, 160, 21, 18, 21, 6], [489, 211, 17, 24, 17, 6], [489, 266, 17, 14, 17, 10], [489, 313, 21, 18, 21, 6], [489, 364, 19, 18, 19, 6], [489, 415, 23, 18, 23, 6], [489, 466, 23, 18, 23, 6], [489, 517, 25, 18, 25, 6], [489, 566, 15, 20, 15, 4], [489, 619, 14, 18, 14, 6], [489, 676, 21, 12, 21, 12], [489, 721, 25, 18, 25, 6], [489, 772, 19, 18, 19, 6], [550, 11, 31, 14, 31, 10], [550, 62, 17, 14, 17, 10], [550, 112, 15, 15, 15, 9], [550, 163, 15, 15, 15, 9], [550, 211, 19, 18, 19, 6], [550, 266, 23, 18, 23, 10], [550, 313, 19, 18, 19, 6], [550, 364, 21, 20, 21, 6], [550, 415, 23, 20, 23, 6], [550, 468, 25, 16, 25, 8], [550, 517, 15, 22, 15, 6], [550, 568, 17, 18, 17, 6], [550, 619, 17, 18, 17, 6], [550, 670, 23, 18, 23, 6], [550, 725, 27, 14, 27, 10], [550, 776, 19, 14, 19, 10], [611, 7, 19, 18, 19, 6], [611, 58, 15, 18, 15, 6], [611, 119, 17, 8, 17, 16], [611, 158, 27, 20, 27, 4], [611, 211, 15, 22, 15, 6], [611, 266, 19, 14, 19, 10], [611, 313, 21, 18, 21, 6], [611, 368, 21, 14, 21, 10], [611, 419, 21, 14, 21, 10], [611, 478, 31, 6, 31, 18], [611, 529, 19, 6, 19, 18], [611, 562, 19, 24, 19, 0], [611, 613, 19, 24, 19, 0], [611, 664, 19, 24, 19, 0], [611, 721, 25, 18, 25, 6], [611, 776, 27, 14, 27, 10], [672, 17, 15, 8, 15, 16], [672, 68, 23, 8, 23, 16], [672, 109, 17, 18, 17, 6], [672, 160, 17, 18, 17, 6], [672, 211, 11, 18, 11, 6], [672, 262, 11, 18, 11, 6], [672, 319, 17, 12, 17, 12], [672, 367, 22, 15, 22, 9], [672, 415, 19, 24, 19, 6], [1, 19, 11, 6, 11, 18], [794, 770, 15, 20, 15, 4], [672, 571, 19, 15, 19, 9], [672, 623, 15, 14, 15, 10], [672, 674, 15, 14, 15, 10], [672, 721, 23, 18, 23, 6], [672, 772, 23, 18, 23, 6], [733, 7, 13, 18, 13, 6], [733, 66, 11, 10, 11, 14], [733, 121, 11, 10, 11, 18], [733, 172, 17, 10, 17, 18], [733, 211, 33, 18, 33, 6], [733, 256, 19, 24, 19, 0], [733, 307, 17, 24, 17, 0], [733, 358, 19, 24, 19, 0], [733, 411, 17, 22, 17, 2], [733, 460, 17, 24, 17, 0], [733, 511, 15, 24, 15, 0], [733, 562, 15, 24, 15, 0], [733, 615, 15, 22, 15, 2], [733, 664, 15, 24, 15, 0], [733, 715, 19, 24, 19, 0], [733, 766, 19, 24, 19, 0], [1, 19, 11, 6, 11, 18], [794, 52, 19, 24, 19, 0], [794, 103, 19, 24, 19, 0], [794, 154, 19, 24, 19, 0], [794, 205, 19, 24, 19, 0], [794, 266, 11, 14, 11, 10], [794, 311, 15, 20, 15, 4], [794, 362, 19, 20, 19, 4], [794, 415, 15, 18, 15, 6], [794, 464, 15, 20, 15, 4], [794, 517, 15, 18, 15, 6], [794, 562, 15, 24, 15, 0], [794, 631, 15, 12, 15, 18], [794, 668, 15, 20, 15, 4], [794, 733, 15, 12, 15, 18], [794, 770, 15, 20, 15, 4], [855, 5, 15, 20, 15, 4], [855, 56, 15, 20, 15, 4], [855, 107, 15, 20, 15, 4], [855, 158, 15, 20, 15, 4], [855, 209, 15, 20, 15, 4], [855, 260, 15, 20, 15, 4], [855, 311, 15, 20, 15, 4], [855, 362, 15, 20, 15, 4], [855, 413, 15, 20, 15, 4], [855, 464, 15, 20, 15, 4], [855, 515, 15, 20, 15, 4], [855, 566, 15, 20, 15, 4], [855, 617, 15, 20, 15, 4], [855, 668, 15, 20, 15, 4], [855, 719, 15, 20, 15, 4], [855, 770, 15, 20, 15, 4]], \"widestlogicalchar\": 33, \"widestglyph\": 33, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 10, 9, 10, 2], [1, 105, 12, 4, 10, 2], [1, 156, 14, 9, 13, 2], [1, 206, 11, 11, 9, 1], [1, 258, 14, 9, 13, 2], [1, 309, 13, 9, 13, 2], [1, 360, 9, 4, 7, 2], [1, 410, 11, 11, 9, 1], [1, 461, 10, 11, 9, 1], [1, 513, 13, 7, 10, 2], [1, 565, 12, 7, 10, 3], [1, 621, 7, 5, 7, 8], [1, 670, 11, 3, 10, 6], [1, 723, 7, 3, 7, 8], [1, 767, 12, 10, 10, 1], [62, 3, 13, 9, 11, 2], [62, 54, 11, 9, 11, 2], [62, 105, 13, 9, 11, 2], [62, 156, 13, 9, 11, 2], [62, 207, 12, 9, 11, 2], [62, 258, 13, 9, 11, 2], [62, 309, 13, 9, 11, 2], [62, 360, 13, 9, 11, 2], [62, 411, 13, 9, 11, 2], [62, 462, 13, 9, 11, 2], [62, 514, 9, 8, 7, 3], [62, 565, 9, 10, 7, 3], [62, 616, 10, 7, 10, 3], [62, 668, 12, 5, 11, 4], [62, 718, 11, 7, 10, 3], [62, 768, 13, 9, 11, 2], [123, 3, 15, 9, 13, 2], [123, 54, 13, 9, 11, 2], [123, 105, 13, 9, 11, 2], [123, 156, 13, 9, 11, 2], [123, 207, 13, 9, 11, 2], [123, 258, 12, 9, 10, 2], [123, 309, 12, 9, 10, 2], [123, 360, 13, 9, 11, 2], [123, 411, 13, 9, 11, 2], [123, 462, 10, 9, 10, 2], [123, 513, 11, 9, 10, 2], [123, 564, 14, 9, 12, 2], [123, 615, 10, 9, 10, 2], [123, 666, 15, 9, 13, 2], [123, 717, 14, 9, 12, 2], [123, 768, 13, 9, 11, 2], [184, 3, 13, 9, 11, 2], [184, 54, 13, 10, 11, 2], [184, 105, 13, 9, 11, 2], [184, 156, 12, 9, 10, 2], [184, 207, 12, 9, 10, 2], [184, 258, 13, 9, 11, 2], [184, 309, 13, 9, 11, 2], [184, 360, 15, 9, 13, 2], [184, 411, 13, 9, 11, 2], [184, 462, 11, 9, 9, 2], [184, 513, 13, 9, 11, 2], [184, 563, 11, 11, 8, 1], [184, 614, 10, 10, 10, 1], [184, 665, 11, 11, 8, 1], [184, 717, 12, 4, 11, 2], [184, 775, 11, 3, 11, 9], [245, 2, 11, 4, 10, 1], [245, 55, 11, 8, 11, 3], [245, 105, 11, 9, 11, 2], [245, 157, 11, 8, 10, 3], [245, 207, 12, 9, 11, 2], [245, 259, 11, 8, 11, 3], [245, 309, 12, 9, 10, 2], [245, 361, 12, 10, 11, 3], [245, 411, 11, 9, 11, 2], [245, 462, 9, 9, 8, 2], [245, 513, 11, 11, 10, 2], [245, 564, 12, 9, 11, 2], [245, 615, 9, 9, 8, 2], [245, 667, 14, 8, 14, 3], [245, 718, 11, 8, 11, 3], [245, 769, 11, 8, 11, 3], [306, 4, 11, 10, 11, 3], [306, 55, 12, 10, 11, 3], [306, 106, 11, 8, 9, 3], [306, 157, 10, 8, 10, 3], [306, 207, 11, 9, 10, 2], [306, 259, 12, 8, 11, 3], [306, 310, 12, 8, 11, 3], [306, 361, 15, 8, 14, 3], [306, 412, 12, 8, 11, 3], [306, 463, 12, 10, 11, 3], [306, 514, 12, 8, 11, 3], [306, 563, 12, 11, 10, 1], [306, 614, 11, 11, 9, 1], [306, 665, 10, 11, 10, 1], [306, 718, 12, 4, 11, 3], [306, 768, 10, 9, 9, 2], [367, 1, 13, 11, 11, 0], [367, 53, 13, 10, 11, 1], [367, 105, 13, 11, 11, 2], [367, 155, 12, 10, 10, 1], [367, 206, 14, 10, 12, 1], [367, 256, 13, 11, 11, 0], [367, 307, 13, 11, 11, 0], [367, 359, 11, 10, 11, 1], [367, 410, 12, 10, 11, 1], [367, 461, 12, 10, 11, 1], [367, 513, 12, 9, 11, 2], [367, 563, 13, 10, 11, 1], [367, 613, 13, 11, 11, 0], [367, 667, 11, 10, 10, 3], [367, 716, 11, 10, 11, 1], [367, 767, 12, 10, 11, 1], [428, 2, 12, 10, 11, 1], [428, 54, 12, 9, 11, 2], [428, 104, 9, 10, 8, 1], [428, 155, 10, 10, 8, 1], [428, 206, 10, 10, 8, 1], [428, 258, 10, 9, 8, 2], [428, 308, 13, 10, 11, 1], [428, 359, 11, 10, 11, 1], [428, 410, 12, 10, 11, 1], [428, 461, 12, 10, 11, 1], [428, 513, 12, 9, 11, 2], [428, 563, 13, 10, 11, 1], [428, 614, 12, 10, 11, 1], [428, 665, 12, 10, 11, 1], [428, 716, 12, 10, 11, 1], [428, 768, 12, 9, 11, 2], [489, 3, 11, 6, 10, 2], [489, 54, 11, 5, 9, 2], [489, 104, 13, 10, 10, 1], [489, 156, 12, 9, 12, 2], [489, 207, 12, 11, 10, 2], [489, 259, 11, 6, 10, 3], [489, 309, 14, 9, 12, 2], [489, 360, 12, 9, 11, 2], [489, 411, 14, 9, 13, 2], [489, 462, 14, 9, 13, 2], [489, 513, 15, 5, 13, 2], [489, 563, 10, 4, 10, 1], [489, 615, 11, 3, 9, 2], [489, 667, 13, 7, 12, 3], [489, 717, 15, 9, 13, 2], [489, 768, 13, 9, 11, 2], [550, 4, 16, 6, 16, 3], [550, 54, 13, 9, 12, 2], [550, 106, 10, 8, 10, 3], [550, 158, 10, 7, 10, 4], [550, 207, 11, 9, 9, 2], [550, 259, 13, 10, 13, 3], [550, 309, 13, 9, 11, 2], [550, 360, 13, 10, 12, 2], [550, 411, 14, 10, 13, 2], [550, 462, 15, 9, 13, 2], [550, 513, 11, 11, 10, 2], [550, 564, 12, 9, 10, 2], [550, 615, 12, 9, 10, 2], [550, 666, 14, 9, 13, 2], [550, 718, 14, 8, 14, 3], [550, 769, 12, 8, 11, 3], [611, 3, 11, 9, 11, 2], [611, 54, 9, 9, 9, 2], [611, 109, 11, 4, 10, 6], [611, 155, 16, 10, 14, 1], [611, 207, 11, 11, 10, 2], [611, 259, 12, 7, 11, 3], [611, 309, 11, 9, 12, 2], [611, 362, 14, 6, 12, 4], [611, 413, 13, 7, 12, 4], [611, 468, 13, 3, 16, 8], [611, 511, 1, 1, 11, 1], [611, 563, 13, 10, 11, 1], [611, 614, 14, 10, 11, 1], [611, 665, 14, 10, 11, 1], [611, 717, 14, 9, 13, 2], [611, 769, 15, 8, 14, 3], [672, 7, 11, 3, 10, 6], [672, 58, 14, 3, 13, 6], [672, 105, 11, 5, 9, 2], [672, 156, 11, 5, 9, 2], [672, 207, 9, 5, 7, 2], [672, 258, 9, 5, 7, 2], [672, 310, 12, 7, 10, 3], [672, 362, 12, 7, 12, 4], [672, 411, 12, 11, 11, 2], [1, 1, 1, 1, 8, 1], [794, 767, 11, 4, 10, 1], [672, 564, 13, 7, 12, 2], [672, 617, 11, 6, 10, 4], [672, 668, 11, 7, 10, 4], [672, 717, 14, 9, 13, 2], [672, 768, 14, 9, 13, 2], [733, 3, 11, 7, 10, 2], [733, 58, 8, 3, 7, 6], [733, 111, 7, 5, 7, 8], [733, 162, 9, 5, 9, 8], [733, 207, 17, 9, 16, 2], [733, 257, 13, 10, 11, 1], [733, 308, 12, 10, 10, 1], [733, 359, 13, 10, 11, 1], [733, 409, 12, 11, 10, 0], [733, 461, 12, 10, 10, 1], [733, 512, 10, 10, 10, 1], [733, 563, 11, 10, 10, 1], [733, 613, 12, 11, 10, 0], [733, 665, 11, 10, 10, 1], [733, 716, 13, 10, 11, 1], [733, 767, 13, 10, 11, 1], [1, 1, 1, 1, 8, 1], [794, 53, 13, 10, 11, 1], [794, 104, 13, 10, 11, 1], [794, 155, 13, 10, 11, 1], [794, 206, 13, 10, 11, 1], [794, 259, 9, 8, 8, 3], [794, 308, 11, 4, 10, 1], [794, 359, 13, 4, 11, 1], [794, 411, 12, 3, 10, 2], [794, 461, 12, 4, 10, 1], [794, 513, 10, 3, 10, 2], [794, 562, 12, 5, 10, 0], [794, 622, 9, 4, 10, 9], [794, 665, 12, 4, 10, 1], [794, 724, 8, 4, 10, 9], [794, 767, 11, 4, 10, 1], [855, 2, 11, 4, 10, 1], [855, 53, 11, 4, 10, 1], [855, 104, 11, 4, 10, 1], [855, 155, 11, 4, 10, 1], [855, 206, 11, 4, 10, 1], [855, 257, 11, 4, 10, 1], [855, 308, 11, 4, 10, 1], [855, 359, 11, 4, 10, 1], [855, 410, 11, 4, 10, 1], [855, 461, 11, 4, 10, 1], [855, 512, 11, 4, 10, 1], [855, 563, 11, 4, 10, 1], [855, 614, 11, 4, 10, 1], [855, 665, 11, 4, 10, 1], [855, 716, 11, 4, 10, 1], [855, 767, 11, 4, 10, 1]], \"capHeight\": 10, \"widestlogicalchar\": 16, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 9, 7, 9, 2], [1, 105, 11, 2, 9, 2], [1, 156, 13, 7, 12, 2], [1, 206, 10, 9, 8, 1], [1, 258, 13, 7, 12, 2], [1, 309, 12, 7, 12, 2], [1, 360, 8, 2, 6, 2], [1, 410, 10, 9, 8, 1], [1, 461, 9, 9, 8, 1], [1, 513, 12, 5, 9, 2], [1, 565, 11, 5, 9, 3], [1, 621, 6, 3, 6, 8], [1, 670, 10, 1, 9, 6], [1, 723, 6, 1, 6, 8], [1, 767, 11, 8, 9, 1], [62, 3, 12, 7, 10, 2], [62, 54, 10, 7, 10, 2], [62, 105, 12, 7, 10, 2], [62, 156, 12, 7, 10, 2], [62, 207, 11, 7, 10, 2], [62, 258, 12, 7, 10, 2], [62, 309, 12, 7, 10, 2], [62, 360, 12, 7, 10, 2], [62, 411, 12, 7, 10, 2], [62, 462, 12, 7, 10, 2], [62, 514, 8, 6, 6, 3], [62, 565, 8, 8, 6, 3], [62, 616, 9, 5, 9, 3], [62, 668, 11, 3, 10, 4], [62, 718, 10, 5, 9, 3], [62, 768, 12, 7, 10, 2], [123, 3, 14, 7, 12, 2], [123, 54, 12, 7, 10, 2], [123, 105, 12, 7, 10, 2], [123, 156, 12, 7, 10, 2], [123, 207, 12, 7, 10, 2], [123, 258, 11, 7, 9, 2], [123, 309, 11, 7, 9, 2], [123, 360, 12, 7, 10, 2], [123, 411, 12, 7, 10, 2], [123, 462, 9, 7, 9, 2], [123, 513, 10, 7, 9, 2], [123, 564, 13, 7, 11, 2], [123, 615, 9, 7, 9, 2], [123, 666, 14, 7, 12, 2], [123, 717, 13, 7, 11, 2], [123, 768, 12, 7, 10, 2], [184, 3, 12, 7, 10, 2], [184, 54, 12, 8, 10, 2], [184, 105, 12, 7, 10, 2], [184, 156, 11, 7, 9, 2], [184, 207, 11, 7, 9, 2], [184, 258, 12, 7, 10, 2], [184, 309, 12, 7, 10, 2], [184, 360, 14, 7, 12, 2], [184, 411, 12, 7, 10, 2], [184, 462, 10, 7, 8, 2], [184, 513, 12, 7, 10, 2], [184, 563, 10, 9, 7, 1], [184, 614, 9, 8, 9, 1], [184, 665, 10, 9, 7, 1], [184, 717, 11, 2, 10, 2], [184, 775, 10, 1, 10, 9], [245, 2, 10, 2, 9, 1], [245, 55, 10, 6, 10, 3], [245, 105, 10, 7, 10, 2], [245, 157, 10, 6, 9, 3], [245, 207, 11, 7, 10, 2], [245, 259, 10, 6, 10, 3], [245, 309, 11, 7, 9, 2], [245, 361, 11, 8, 10, 3], [245, 411, 10, 7, 10, 2], [245, 462, 8, 7, 7, 2], [245, 513, 10, 9, 9, 2], [245, 564, 11, 7, 10, 2], [245, 615, 8, 7, 7, 2], [245, 667, 13, 6, 13, 3], [245, 718, 10, 6, 10, 3], [245, 769, 10, 6, 10, 3], [306, 4, 10, 8, 10, 3], [306, 55, 11, 8, 10, 3], [306, 106, 10, 6, 8, 3], [306, 157, 9, 6, 9, 3], [306, 207, 10, 7, 9, 2], [306, 259, 11, 6, 10, 3], [306, 310, 11, 6, 10, 3], [306, 361, 14, 6, 13, 3], [306, 412, 11, 6, 10, 3], [306, 463, 11, 8, 10, 3], [306, 514, 11, 6, 10, 3], [306, 563, 11, 9, 9, 1], [306, 614, 10, 9, 8, 1], [306, 665, 9, 9, 9, 1], [306, 718, 11, 2, 10, 3], [306, 768, 9, 7, 8, 2], [367, 1, 12, 9, 10, 0], [367, 53, 12, 8, 10, 1], [367, 105, 12, 9, 10, 2], [367, 155, 11, 8, 9, 1], [367, 206, 13, 8, 11, 1], [367, 256, 12, 9, 10, 0], [367, 307, 12, 9, 10, 0], [367, 359, 10, 8, 10, 1], [367, 410, 11, 8, 10, 1], [367, 461, 11, 8, 10, 1], [367, 513, 11, 7, 10, 2], [367, 563, 12, 8, 10, 1], [367, 613, 12, 9, 10, 0], [367, 667, 10, 8, 9, 3], [367, 716, 10, 8, 10, 1], [367, 767, 11, 8, 10, 1], [428, 2, 11, 8, 10, 1], [428, 54, 11, 7, 10, 2], [428, 104, 8, 8, 7, 1], [428, 155, 9, 8, 7, 1], [428, 206, 9, 8, 7, 1], [428, 258, 9, 7, 7, 2], [428, 308, 12, 8, 10, 1], [428, 359, 10, 8, 10, 1], [428, 410, 11, 8, 10, 1], [428, 461, 11, 8, 10, 1], [428, 513, 11, 7, 10, 2], [428, 563, 12, 8, 10, 1], [428, 614, 11, 8, 10, 1], [428, 665, 11, 8, 10, 1], [428, 716, 11, 8, 10, 1], [428, 768, 11, 7, 10, 2], [489, 3, 10, 4, 9, 2], [489, 54, 10, 3, 8, 2], [489, 104, 12, 8, 9, 1], [489, 156, 11, 7, 11, 2], [489, 207, 11, 9, 9, 2], [489, 259, 10, 4, 9, 3], [489, 309, 13, 7, 11, 2], [489, 360, 11, 7, 10, 2], [489, 411, 13, 7, 12, 2], [489, 462, 13, 7, 12, 2], [489, 513, 14, 3, 12, 2], [489, 563, 9, 2, 9, 1], [489, 615, 10, 1, 8, 2], [489, 667, 12, 5, 11, 3], [489, 717, 14, 7, 12, 2], [489, 768, 12, 7, 10, 2], [550, 4, 15, 4, 15, 3], [550, 54, 12, 7, 11, 2], [550, 106, 9, 6, 9, 3], [550, 158, 9, 5, 9, 4], [550, 207, 10, 7, 8, 2], [550, 259, 12, 8, 12, 3], [550, 309, 12, 7, 10, 2], [550, 360, 12, 8, 11, 2], [550, 411, 13, 8, 12, 2], [550, 462, 14, 7, 12, 2], [550, 513, 10, 9, 9, 2], [550, 564, 11, 7, 9, 2], [550, 615, 11, 7, 9, 2], [550, 666, 13, 7, 12, 2], [550, 718, 13, 6, 13, 3], [550, 769, 11, 6, 10, 3], [611, 3, 10, 7, 10, 2], [611, 54, 8, 7, 8, 2], [611, 109, 10, 2, 9, 6], [611, 155, 15, 8, 13, 1], [611, 207, 10, 9, 9, 2], [611, 259, 11, 5, 10, 3], [611, 309, 10, 7, 11, 2], [611, 362, 13, 4, 11, 4], [611, 413, 12, 5, 11, 4], [611, 468, 12, 1, 15, 8], [611, 511, 1, 1, 10, 1], [611, 563, 12, 8, 10, 1], [611, 614, 13, 8, 10, 1], [611, 665, 13, 8, 10, 1], [611, 717, 13, 7, 12, 2], [611, 769, 14, 6, 13, 3], [672, 7, 10, 1, 9, 6], [672, 58, 13, 1, 12, 6], [672, 105, 10, 3, 8, 2], [672, 156, 10, 3, 8, 2], [672, 207, 8, 3, 6, 2], [672, 258, 8, 3, 6, 2], [672, 310, 11, 5, 9, 3], [672, 362, 11, 5, 11, 4], [672, 411, 11, 9, 10, 2], [1, 1, 1, 1, 7, 1], [794, 767, 10, 2, 9, 1], [672, 564, 12, 5, 11, 2], [672, 617, 10, 4, 9, 4], [672, 668, 10, 5, 9, 4], [672, 717, 13, 7, 12, 2], [672, 768, 13, 7, 12, 2], [733, 3, 10, 5, 9, 2], [733, 58, 7, 1, 6, 6], [733, 111, 6, 3, 6, 8], [733, 162, 8, 3, 8, 8], [733, 207, 16, 7, 15, 2], [733, 257, 12, 8, 10, 1], [733, 308, 11, 8, 9, 1], [733, 359, 12, 8, 10, 1], [733, 409, 11, 9, 9, 0], [733, 461, 11, 8, 9, 1], [733, 512, 9, 8, 9, 1], [733, 563, 10, 8, 9, 1], [733, 613, 9, 9, 9, 0], [733, 665, 10, 8, 9, 1], [733, 716, 12, 8, 10, 1], [733, 767, 12, 8, 10, 1], [1, 1, 1, 1, 7, 1], [794, 53, 12, 8, 10, 1], [794, 104, 12, 8, 10, 1], [794, 155, 12, 8, 10, 1], [794, 206, 12, 8, 10, 1], [794, 259, 8, 6, 7, 3], [794, 308, 10, 2, 9, 1], [794, 359, 12, 2, 10, 1], [794, 411, 11, 1, 9, 2], [794, 461, 11, 2, 9, 1], [794, 513, 9, 1, 9, 2], [794, 562, 11, 3, 9, 0], [794, 622, 8, 2, 9, 9], [794, 665, 11, 2, 9, 1], [794, 724, 7, 2, 9, 9], [794, 767, 10, 2, 9, 1], [855, 2, 10, 2, 9, 1], [855, 53, 10, 2, 9, 1], [855, 104, 10, 2, 9, 1], [855, 155, 10, 2, 9, 1], [855, 206, 10, 2, 9, 1], [855, 257, 10, 2, 9, 1], [855, 308, 10, 2, 9, 1], [855, 359, 10, 2, 9, 1], [855, 410, 10, 2, 9, 1], [855, 461, 10, 2, 9, 1], [855, 512, 10, 2, 9, 1], [855, 563, 10, 2, 9, 1], [855, 614, 10, 2, 9, 1], [855, 665, 10, 2, 9, 1], [855, 716, 10, 2, 9, 1], [855, 767, 10, 2, 9, 1]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 16, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 8, 6, 8, 4], [1, 54, 10, 9, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 13, 9, 13, 2], [1, 206, 9, 11, 9, 1], [1, 258, 13, 9, 13, 2], [1, 309, 13, 9, 13, 2], [1, 360, 7, 8, 7, 2], [1, 410, 9, 11, 9, 1], [1, 461, 9, 11, 9, 1], [1, 513, 10, 8, 10, 2], [1, 565, 10, 7, 10, 3], [1, 617, 7, 9, 7, 4], [1, 668, 10, 6, 10, 4], [1, 719, 7, 7, 7, 4], [1, 767, 10, 10, 10, 1], [62, 3, 11, 9, 11, 2], [62, 54, 11, 9, 11, 2], [62, 105, 11, 9, 11, 2], [62, 156, 11, 9, 11, 2], [62, 207, 11, 9, 11, 2], [62, 258, 11, 9, 11, 2], [62, 309, 11, 9, 11, 2], [62, 360, 11, 9, 11, 2], [62, 411, 11, 9, 11, 2], [62, 462, 11, 9, 11, 2], [62, 514, 7, 8, 7, 3], [62, 565, 7, 10, 7, 3], [62, 616, 10, 7, 10, 3], [62, 668, 11, 6, 11, 4], [62, 718, 10, 7, 10, 3], [62, 768, 11, 9, 11, 2], [123, 3, 13, 9, 13, 2], [123, 54, 11, 9, 11, 2], [123, 105, 11, 9, 11, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 10, 9, 10, 2], [123, 309, 10, 9, 10, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 10, 9, 10, 2], [123, 513, 10, 9, 10, 2], [123, 564, 12, 9, 12, 2], [123, 615, 10, 9, 10, 2], [123, 666, 13, 9, 13, 2], [123, 717, 12, 9, 12, 2], [123, 768, 11, 9, 11, 2], [184, 3, 11, 9, 11, 2], [184, 54, 11, 10, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 13, 9, 13, 2], [184, 411, 11, 9, 11, 2], [184, 462, 9, 9, 9, 2], [184, 513, 11, 9, 11, 2], [184, 563, 8, 11, 8, 1], [184, 614, 10, 10, 10, 1], [184, 665, 8, 11, 8, 1], [184, 717, 11, 8, 11, 2], [184, 770, 11, 8, 11, 4], [245, 2, 10, 9, 10, 1], [245, 55, 11, 8, 11, 3], [245, 105, 11, 9, 11, 2], [245, 157, 10, 8, 10, 3], [245, 207, 11, 9, 11, 2], [245, 259, 11, 8, 11, 3], [245, 309, 10, 9, 10, 2], [245, 361, 11, 10, 11, 3], [245, 411, 11, 9, 11, 2], [245, 462, 8, 9, 8, 2], [245, 513, 10, 11, 10, 2], [245, 564, 11, 9, 11, 2], [245, 615, 8, 9, 8, 2], [245, 667, 14, 8, 14, 3], [245, 718, 11, 8, 11, 3], [245, 769, 11, 8, 11, 3], [306, 4, 11, 10, 11, 3], [306, 55, 11, 10, 11, 3], [306, 106, 9, 8, 9, 3], [306, 157, 10, 8, 10, 3], [306, 207, 10, 9, 10, 2], [306, 259, 11, 8, 11, 3], [306, 310, 11, 8, 11, 3], [306, 361, 14, 8, 14, 3], [306, 412, 11, 8, 11, 3], [306, 463, 11, 10, 11, 3], [306, 514, 11, 8, 11, 3], [306, 563, 10, 11, 10, 1], [306, 614, 9, 11, 9, 1], [306, 665, 10, 11, 10, 1], [306, 718, 11, 7, 11, 3], [306, 768, 9, 9, 9, 2], [367, 1, 11, 11, 11, 0], [367, 53, 11, 10, 11, 1], [367, 105, 11, 11, 11, 2], [367, 155, 10, 10, 10, 1], [367, 206, 12, 10, 12, 1], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 11, 10, 11, 1], [367, 410, 11, 10, 11, 1], [367, 461, 11, 10, 11, 1], [367, 513, 11, 9, 11, 2], [367, 563, 11, 10, 11, 1], [367, 613, 11, 11, 11, 0], [367, 667, 10, 10, 10, 3], [367, 716, 11, 10, 11, 1], [367, 767, 11, 10, 11, 1], [428, 2, 11, 10, 11, 1], [428, 54, 11, 9, 11, 2], [428, 104, 8, 10, 8, 1], [428, 155, 8, 10, 8, 1], [428, 206, 8, 10, 8, 1], [428, 258, 8, 9, 8, 2], [428, 308, 11, 10, 11, 1], [428, 359, 11, 10, 11, 1], [428, 410, 11, 10, 11, 1], [428, 461, 11, 10, 11, 1], [428, 513, 11, 9, 11, 2], [428, 563, 11, 10, 11, 1], [428, 614, 11, 10, 11, 1], [428, 665, 11, 10, 11, 1], [428, 716, 11, 10, 11, 1], [428, 768, 11, 9, 11, 2], [489, 3, 10, 8, 10, 2], [489, 54, 9, 8, 9, 2], [489, 104, 10, 10, 10, 1], [489, 156, 12, 9, 12, 2], [489, 207, 10, 11, 10, 2], [489, 259, 10, 7, 10, 3], [489, 309, 12, 9, 12, 2], [489, 360, 11, 9, 11, 2], [489, 411, 13, 9, 13, 2], [489, 462, 13, 9, 13, 2], [489, 513, 13, 8, 13, 2], [489, 563, 10, 9, 10, 1], [489, 615, 9, 8, 9, 2], [489, 667, 12, 7, 12, 3], [489, 717, 13, 9, 13, 2], [489, 768, 11, 9, 11, 2], [550, 4, 16, 7, 16, 3], [550, 54, 12, 9, 12, 2], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 207, 9, 9, 9, 2], [550, 259, 13, 10, 13, 3], [550, 309, 11, 9, 11, 2], [550, 360, 12, 10, 12, 2], [550, 411, 13, 10, 13, 2], [550, 462, 13, 9, 13, 2], [550, 513, 10, 11, 10, 2], [550, 564, 10, 9, 10, 2], [550, 615, 10, 9, 10, 2], [550, 666, 13, 9, 13, 2], [550, 718, 14, 8, 14, 3], [550, 769, 11, 8, 11, 3], [611, 3, 11, 9, 11, 2], [611, 54, 9, 9, 9, 2], [611, 107, 10, 6, 10, 4], [611, 155, 14, 10, 14, 1], [611, 207, 10, 11, 10, 2], [611, 259, 11, 7, 11, 3], [611, 309, 12, 9, 12, 2], [611, 362, 12, 7, 12, 4], [611, 413, 12, 7, 12, 4], [611, 464, 16, 7, 16, 4], [611, 515, 11, 6, 11, 4], [611, 563, 11, 10, 11, 1], [611, 614, 11, 10, 11, 1], [611, 665, 11, 10, 11, 1], [611, 717, 13, 9, 13, 2], [611, 769, 14, 8, 14, 3], [672, 5, 10, 6, 10, 4], [672, 56, 13, 6, 13, 4], [672, 105, 9, 8, 9, 2], [672, 156, 9, 8, 9, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 310, 10, 7, 10, 3], [672, 362, 12, 7, 12, 4], [672, 411, 11, 11, 11, 2], [1, 5, 8, 6, 8, 4], [794, 767, 10, 9, 10, 1], [672, 564, 12, 8, 12, 2], [672, 617, 10, 7, 10, 4], [672, 668, 10, 7, 10, 4], [672, 717, 13, 9, 13, 2], [672, 768, 13, 9, 13, 2], [733, 3, 10, 8, 10, 2], [733, 56, 7, 6, 7, 4], [733, 107, 7, 9, 7, 4], [733, 158, 9, 9, 9, 4], [733, 207, 16, 9, 16, 2], [733, 257, 11, 10, 11, 1], [733, 308, 10, 10, 10, 1], [733, 359, 11, 10, 11, 1], [733, 409, 10, 11, 10, 0], [733, 461, 10, 10, 10, 1], [733, 512, 10, 10, 10, 1], [733, 563, 10, 10, 10, 1], [733, 613, 10, 11, 10, 0], [733, 665, 10, 10, 10, 1], [733, 716, 11, 10, 11, 1], [733, 767, 11, 10, 11, 1], [1, 5, 8, 6, 8, 4], [794, 53, 11, 10, 11, 1], [794, 104, 11, 10, 11, 1], [794, 155, 11, 10, 11, 1], [794, 206, 11, 10, 11, 1], [794, 259, 8, 8, 8, 3], [794, 308, 10, 9, 10, 1], [794, 359, 11, 9, 11, 1], [794, 411, 10, 8, 10, 2], [794, 461, 10, 9, 10, 1], [794, 513, 10, 8, 10, 2], [794, 562, 10, 10, 10, 0], [794, 617, 10, 9, 10, 4], [794, 665, 10, 9, 10, 1], [794, 719, 10, 9, 10, 4], [794, 767, 10, 9, 10, 1], [855, 2, 10, 9, 10, 1], [855, 53, 10, 9, 10, 1], [855, 104, 10, 9, 10, 1], [855, 155, 10, 9, 10, 1], [855, 206, 10, 9, 10, 1], [855, 257, 10, 9, 10, 1], [855, 308, 10, 9, 10, 1], [855, 359, 10, 9, 10, 1], [855, 410, 10, 9, 10, 1], [855, 461, 10, 9, 10, 1], [855, 512, 10, 9, 10, 1], [855, 563, 10, 9, 10, 1], [855, 614, 10, 9, 10, 1], [855, 665, 10, 9, 10, 1], [855, 716, 10, 9, 10, 1], [855, 767, 10, 9, 10, 1]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 55, 9, 7, 9, 3], [1, 106, 9, 7, 9, 3], [1, 157, 12, 7, 12, 3], [1, 207, 8, 9, 8, 2], [1, 259, 12, 7, 12, 3], [1, 310, 12, 7, 12, 3], [1, 361, 6, 7, 6, 3], [1, 411, 8, 9, 8, 2], [1, 462, 8, 9, 8, 2], [1, 514, 9, 7, 9, 3], [1, 566, 9, 6, 9, 4], [1, 617, 6, 8, 6, 4], [1, 668, 9, 6, 9, 4], [1, 719, 6, 6, 6, 4], [1, 768, 9, 8, 9, 2], [62, 4, 10, 7, 10, 3], [62, 55, 10, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 7, 10, 3], [62, 208, 10, 7, 10, 3], [62, 259, 10, 7, 10, 3], [62, 310, 10, 7, 10, 3], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 7, 10, 3], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 9, 6, 9, 4], [62, 668, 10, 6, 10, 4], [62, 719, 9, 6, 9, 4], [62, 769, 10, 7, 10, 3], [123, 4, 12, 7, 12, 3], [123, 55, 10, 7, 10, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 9, 7, 9, 3], [123, 514, 9, 7, 9, 3], [123, 565, 11, 7, 11, 3], [123, 616, 9, 7, 9, 3], [123, 667, 12, 7, 12, 3], [123, 718, 11, 7, 11, 3], [123, 769, 10, 7, 10, 3], [184, 4, 10, 7, 10, 3], [184, 55, 10, 8, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 8, 7, 8, 3], [184, 514, 10, 7, 10, 3], [184, 564, 7, 9, 7, 2], [184, 615, 9, 8, 9, 2], [184, 666, 7, 9, 7, 2], [184, 718, 10, 7, 10, 3], [184, 770, 10, 7, 10, 4], [245, 3, 9, 8, 9, 2], [245, 56, 10, 6, 10, 4], [245, 106, 10, 7, 10, 3], [245, 158, 9, 6, 9, 4], [245, 208, 10, 7, 10, 3], [245, 260, 10, 6, 10, 4], [245, 310, 9, 7, 9, 3], [245, 362, 10, 8, 10, 4], [245, 412, 10, 7, 10, 3], [245, 463, 7, 7, 7, 3], [245, 514, 9, 9, 9, 3], [245, 565, 10, 7, 10, 3], [245, 616, 7, 7, 7, 3], [245, 668, 13, 6, 13, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 8, 6, 8, 4], [306, 158, 9, 6, 9, 4], [306, 208, 9, 7, 9, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 13, 6, 13, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 564, 9, 9, 9, 2], [306, 615, 8, 9, 8, 2], [306, 666, 9, 9, 9, 2], [306, 719, 10, 6, 10, 4], [306, 769, 8, 7, 8, 3], [367, 2, 10, 9, 10, 1], [367, 54, 10, 8, 10, 2], [367, 106, 10, 9, 10, 3], [367, 156, 9, 8, 9, 2], [367, 207, 11, 8, 11, 2], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 10, 8, 10, 2], [367, 411, 10, 8, 10, 2], [367, 462, 10, 8, 10, 2], [367, 514, 10, 7, 10, 3], [367, 564, 10, 8, 10, 2], [367, 614, 10, 9, 10, 1], [367, 668, 9, 8, 9, 4], [367, 717, 10, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 3, 10, 8, 10, 2], [428, 55, 10, 7, 10, 3], [428, 105, 7, 8, 7, 2], [428, 156, 7, 8, 7, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 10, 8, 10, 2], [428, 360, 10, 8, 10, 2], [428, 411, 10, 8, 10, 2], [428, 462, 10, 8, 10, 2], [428, 514, 10, 7, 10, 3], [428, 564, 10, 8, 10, 2], [428, 615, 10, 8, 10, 2], [428, 666, 10, 8, 10, 2], [428, 717, 10, 8, 10, 2], [428, 769, 10, 7, 10, 3], [489, 4, 9, 7, 9, 3], [489, 55, 8, 7, 8, 3], [489, 105, 9, 8, 9, 2], [489, 157, 11, 7, 11, 3], [489, 208, 9, 9, 9, 3], [489, 260, 9, 6, 9, 4], [489, 310, 11, 7, 11, 3], [489, 361, 10, 7, 10, 3], [489, 412, 12, 7, 12, 3], [489, 463, 12, 7, 12, 3], [489, 514, 12, 7, 12, 3], [489, 564, 9, 8, 9, 2], [489, 616, 8, 7, 8, 3], [489, 668, 11, 6, 11, 4], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 5, 15, 6, 15, 4], [550, 55, 11, 7, 11, 3], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 208, 8, 7, 8, 3], [550, 260, 12, 8, 12, 4], [550, 310, 10, 7, 10, 3], [550, 361, 11, 8, 11, 3], [550, 412, 12, 8, 12, 3], [550, 463, 12, 7, 12, 3], [550, 514, 9, 9, 9, 3], [550, 565, 9, 7, 9, 3], [550, 616, 9, 7, 9, 3], [550, 667, 12, 7, 12, 3], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 4, 10, 7, 10, 3], [611, 55, 8, 7, 8, 3], [611, 107, 9, 6, 9, 4], [611, 156, 13, 8, 13, 2], [611, 208, 9, 9, 9, 3], [611, 260, 10, 6, 10, 4], [611, 310, 11, 7, 11, 3], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 15, 6, 15, 4], [611, 515, 10, 6, 10, 4], [611, 564, 10, 8, 10, 2], [611, 615, 10, 8, 10, 2], [611, 666, 10, 8, 10, 2], [611, 718, 12, 7, 12, 3], [611, 770, 13, 6, 13, 4], [672, 5, 9, 6, 9, 4], [672, 56, 12, 6, 12, 4], [672, 106, 8, 7, 8, 3], [672, 157, 8, 7, 8, 3], [672, 208, 6, 7, 6, 3], [672, 259, 6, 7, 6, 3], [672, 311, 9, 6, 9, 4], [672, 362, 11, 6, 11, 4], [672, 412, 10, 9, 10, 3], [1, 5, 7, 6, 7, 4], [794, 768, 9, 8, 9, 2], [672, 565, 11, 7, 11, 3], [672, 617, 9, 6, 9, 4], [672, 668, 9, 6, 9, 4], [672, 718, 12, 7, 12, 3], [672, 769, 12, 7, 12, 3], [733, 4, 9, 7, 9, 3], [733, 56, 6, 6, 6, 4], [733, 107, 6, 8, 6, 4], [733, 158, 8, 8, 8, 4], [733, 208, 15, 7, 15, 3], [733, 258, 10, 8, 10, 2], [733, 309, 9, 8, 9, 2], [733, 360, 10, 8, 10, 2], [733, 410, 9, 9, 9, 1], [733, 462, 9, 8, 9, 2], [733, 513, 9, 8, 9, 2], [733, 564, 9, 8, 9, 2], [733, 614, 9, 9, 9, 1], [733, 666, 9, 8, 9, 2], [733, 717, 10, 8, 10, 2], [733, 768, 10, 8, 10, 2], [1, 5, 7, 6, 7, 4], [794, 54, 10, 8, 10, 2], [794, 105, 10, 8, 10, 2], [794, 156, 10, 8, 10, 2], [794, 207, 10, 8, 10, 2], [794, 260, 7, 6, 7, 4], [794, 309, 9, 8, 9, 2], [794, 360, 10, 8, 10, 2], [794, 412, 9, 7, 9, 3], [794, 462, 9, 8, 9, 2], [794, 514, 9, 7, 9, 3], [794, 563, 9, 9, 9, 1], [794, 617, 9, 8, 9, 4], [794, 666, 9, 8, 9, 2], [794, 719, 9, 8, 9, 4], [794, 768, 9, 8, 9, 2], [855, 3, 9, 8, 9, 2], [855, 54, 9, 8, 9, 2], [855, 105, 9, 8, 9, 2], [855, 156, 9, 8, 9, 2], [855, 207, 9, 8, 9, 2], [855, 258, 9, 8, 9, 2], [855, 309, 9, 8, 9, 2], [855, 360, 9, 8, 9, 2], [855, 411, 9, 8, 9, 2], [855, 462, 9, 8, 9, 2], [855, 513, 9, 8, 9, 2], [855, 564, 9, 8, 9, 2], [855, 615, 9, 8, 9, 2], [855, 666, 9, 8, 9, 2], [855, 717, 9, 8, 9, 2], [855, 768, 9, 8, 9, 2]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 9, 9, 9, 2], [1, 105, 11, 4, 9, 2], [1, 156, 13, 9, 12, 2], [1, 206, 10, 11, 8, 1], [1, 258, 13, 9, 12, 2], [1, 309, 12, 9, 12, 2], [1, 360, 8, 4, 6, 2], [1, 410, 10, 11, 8, 1], [1, 461, 9, 11, 8, 1], [1, 513, 12, 7, 9, 2], [1, 565, 11, 7, 9, 3], [1, 621, 6, 5, 6, 8], [1, 670, 10, 3, 9, 6], [1, 723, 6, 3, 6, 8], [1, 767, 11, 10, 9, 1], [62, 3, 12, 9, 10, 2], [62, 54, 10, 9, 10, 2], [62, 105, 12, 9, 10, 2], [62, 156, 12, 9, 10, 2], [62, 207, 11, 9, 10, 2], [62, 258, 12, 9, 10, 2], [62, 309, 12, 9, 10, 2], [62, 360, 12, 9, 10, 2], [62, 411, 12, 9, 10, 2], [62, 462, 12, 9, 10, 2], [62, 514, 8, 8, 6, 3], [62, 565, 8, 10, 6, 3], [62, 616, 9, 7, 9, 3], [62, 668, 11, 5, 10, 4], [62, 718, 10, 7, 9, 3], [62, 768, 12, 9, 10, 2], [123, 3, 14, 9, 12, 2], [123, 54, 12, 9, 10, 2], [123, 105, 12, 9, 10, 2], [123, 156, 12, 9, 10, 2], [123, 207, 12, 9, 10, 2], [123, 258, 11, 9, 9, 2], [123, 309, 11, 9, 9, 2], [123, 360, 12, 9, 10, 2], [123, 411, 12, 9, 10, 2], [123, 462, 9, 9, 9, 2], [123, 513, 10, 9, 9, 2], [123, 564, 13, 9, 11, 2], [123, 615, 9, 9, 9, 2], [123, 666, 14, 9, 12, 2], [123, 717, 13, 9, 11, 2], [123, 768, 12, 9, 10, 2], [184, 3, 12, 9, 10, 2], [184, 54, 12, 10, 10, 2], [184, 105, 12, 9, 10, 2], [184, 156, 11, 9, 9, 2], [184, 207, 11, 9, 9, 2], [184, 258, 12, 9, 10, 2], [184, 309, 12, 9, 10, 2], [184, 360, 14, 9, 12, 2], [184, 411, 12, 9, 10, 2], [184, 462, 10, 9, 8, 2], [184, 513, 12, 9, 10, 2], [184, 563, 10, 11, 7, 1], [184, 614, 9, 10, 9, 1], [184, 665, 10, 11, 7, 1], [184, 717, 11, 4, 10, 2], [184, 775, 10, 3, 10, 9], [245, 2, 10, 4, 9, 1], [245, 55, 10, 8, 10, 3], [245, 105, 10, 9, 10, 2], [245, 157, 10, 8, 9, 3], [245, 207, 11, 9, 10, 2], [245, 259, 10, 8, 10, 3], [245, 309, 11, 9, 9, 2], [245, 361, 11, 10, 10, 3], [245, 411, 10, 9, 10, 2], [245, 462, 8, 9, 7, 2], [245, 513, 10, 11, 9, 2], [245, 564, 11, 9, 10, 2], [245, 615, 8, 9, 7, 2], [245, 667, 13, 8, 13, 3], [245, 718, 10, 8, 10, 3], [245, 769, 10, 8, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 11, 10, 10, 3], [306, 106, 10, 8, 8, 3], [306, 157, 9, 8, 9, 3], [306, 207, 10, 9, 9, 2], [306, 259, 11, 8, 10, 3], [306, 310, 11, 8, 10, 3], [306, 361, 14, 8, 13, 3], [306, 412, 11, 8, 10, 3], [306, 463, 11, 10, 10, 3], [306, 514, 11, 8, 10, 3], [306, 563, 11, 11, 9, 1], [306, 614, 10, 11, 8, 1], [306, 665, 9, 11, 9, 1], [306, 718, 11, 4, 10, 3], [306, 768, 9, 9, 8, 2], [367, 1, 12, 11, 10, 0], [367, 53, 12, 10, 10, 1], [367, 105, 12, 11, 10, 2], [367, 155, 11, 10, 9, 1], [367, 206, 13, 10, 11, 1], [367, 256, 12, 11, 10, 0], [367, 307, 12, 11, 10, 0], [367, 359, 10, 10, 10, 1], [367, 410, 11, 10, 10, 1], [367, 461, 11, 10, 10, 1], [367, 513, 11, 9, 10, 2], [367, 563, 12, 10, 10, 1], [367, 613, 12, 11, 10, 0], [367, 667, 10, 10, 9, 3], [367, 716, 10, 10, 10, 1], [367, 767, 11, 10, 10, 1], [428, 2, 11, 10, 10, 1], [428, 54, 11, 9, 10, 2], [428, 104, 8, 10, 7, 1], [428, 155, 9, 10, 7, 1], [428, 206, 9, 10, 7, 1], [428, 258, 9, 9, 7, 2], [428, 308, 12, 10, 10, 1], [428, 359, 10, 10, 10, 1], [428, 410, 11, 10, 10, 1], [428, 461, 11, 10, 10, 1], [428, 513, 11, 9, 10, 2], [428, 563, 12, 10, 10, 1], [428, 614, 11, 10, 10, 1], [428, 665, 11, 10, 10, 1], [428, 716, 11, 10, 10, 1], [428, 768, 11, 9, 10, 2], [489, 3, 10, 6, 9, 2], [489, 54, 10, 5, 8, 2], [489, 104, 12, 10, 9, 1], [489, 156, 11, 9, 11, 2], [489, 207, 11, 11, 9, 2], [489, 259, 10, 6, 9, 3], [489, 309, 13, 9, 11, 2], [489, 360, 11, 9, 10, 2], [489, 411, 13, 9, 12, 2], [489, 462, 13, 9, 12, 2], [489, 513, 14, 5, 12, 2], [489, 563, 9, 4, 9, 1], [489, 615, 10, 3, 8, 2], [489, 667, 12, 7, 11, 3], [489, 717, 14, 9, 12, 2], [489, 768, 12, 9, 10, 2], [550, 4, 15, 6, 15, 3], [550, 54, 12, 9, 11, 2], [550, 106, 9, 8, 9, 3], [550, 158, 9, 7, 9, 4], [550, 207, 10, 9, 8, 2], [550, 259, 12, 10, 12, 3], [550, 309, 12, 9, 10, 2], [550, 360, 12, 10, 11, 2], [550, 411, 13, 10, 12, 2], [550, 462, 14, 9, 12, 2], [550, 513, 10, 11, 9, 2], [550, 564, 11, 9, 9, 2], [550, 615, 11, 9, 9, 2], [550, 666, 13, 9, 12, 2], [550, 718, 13, 8, 13, 3], [550, 769, 11, 8, 10, 3], [611, 3, 10, 9, 10, 2], [611, 54, 8, 9, 8, 2], [611, 109, 10, 4, 9, 6], [611, 155, 15, 10, 13, 1], [611, 207, 10, 11, 9, 2], [611, 259, 11, 7, 10, 3], [611, 309, 10, 9, 11, 2], [611, 362, 13, 6, 11, 4], [611, 413, 12, 7, 11, 4], [611, 468, 12, 3, 15, 8], [611, 511, 1, 1, 10, 1], [611, 563, 12, 10, 10, 1], [611, 614, 13, 10, 10, 1], [611, 665, 13, 10, 10, 1], [611, 717, 13, 9, 12, 2], [611, 769, 14, 8, 13, 3], [672, 7, 10, 3, 9, 6], [672, 58, 13, 3, 12, 6], [672, 105, 10, 5, 8, 2], [672, 156, 10, 5, 8, 2], [672, 207, 8, 5, 6, 2], [672, 258, 8, 5, 6, 2], [672, 310, 11, 7, 9, 3], [672, 362, 11, 7, 11, 4], [672, 411, 11, 11, 10, 2], [1, 1, 1, 1, 7, 1], [794, 767, 10, 4, 9, 1], [672, 564, 12, 7, 11, 2], [672, 617, 10, 6, 9, 4], [672, 668, 10, 7, 9, 4], [672, 717, 13, 9, 12, 2], [672, 768, 13, 9, 12, 2], [733, 3, 10, 7, 9, 2], [733, 58, 7, 3, 6, 6], [733, 111, 6, 5, 6, 8], [733, 162, 8, 5, 8, 8], [733, 207, 16, 9, 15, 2], [733, 257, 12, 10, 10, 1], [733, 308, 11, 10, 9, 1], [733, 359, 12, 10, 10, 1], [733, 409, 11, 11, 9, 0], [733, 461, 11, 10, 9, 1], [733, 512, 9, 10, 9, 1], [733, 563, 10, 10, 9, 1], [733, 613, 11, 11, 9, 0], [733, 665, 10, 10, 9, 1], [733, 716, 12, 10, 10, 1], [733, 767, 12, 10, 10, 1], [1, 1, 1, 1, 7, 1], [794, 53, 12, 10, 10, 1], [794, 104, 12, 10, 10, 1], [794, 155, 12, 10, 10, 1], [794, 206, 12, 10, 10, 1], [794, 259, 8, 8, 7, 3], [794, 308, 10, 4, 9, 1], [794, 359, 12, 4, 10, 1], [794, 411, 11, 3, 9, 2], [794, 461, 11, 4, 9, 1], [794, 513, 9, 3, 9, 2], [794, 562, 11, 5, 9, 0], [794, 622, 8, 4, 9, 9], [794, 665, 11, 4, 9, 1], [794, 724, 7, 4, 9, 9], [794, 767, 10, 4, 9, 1], [855, 2, 10, 4, 9, 1], [855, 53, 10, 4, 9, 1], [855, 104, 10, 4, 9, 1], [855, 155, 10, 4, 9, 1], [855, 206, 10, 4, 9, 1], [855, 257, 10, 4, 9, 1], [855, 308, 10, 4, 9, 1], [855, 359, 10, 4, 9, 1], [855, 410, 10, 4, 9, 1], [855, 461, 10, 4, 9, 1], [855, 512, 10, 4, 9, 1], [855, 563, 10, 4, 9, 1], [855, 614, 10, 4, 9, 1], [855, 665, 10, 4, 9, 1], [855, 716, 10, 4, 9, 1], [855, 767, 10, 4, 9, 1]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 8, 7, 8, 2], [1, 105, 10, 2, 8, 2], [1, 156, 12, 7, 11, 2], [1, 206, 9, 9, 7, 1], [1, 258, 12, 7, 11, 2], [1, 309, 11, 7, 11, 2], [1, 360, 7, 2, 5, 2], [1, 410, 9, 9, 7, 1], [1, 461, 8, 9, 7, 1], [1, 513, 11, 5, 8, 2], [1, 565, 10, 5, 8, 3], [1, 621, 5, 3, 5, 8], [1, 670, 9, 1, 8, 6], [1, 723, 5, 1, 5, 8], [1, 767, 10, 8, 8, 1], [62, 3, 11, 7, 9, 2], [62, 54, 9, 7, 9, 2], [62, 105, 11, 7, 9, 2], [62, 156, 11, 7, 9, 2], [62, 207, 10, 7, 9, 2], [62, 258, 11, 7, 9, 2], [62, 309, 11, 7, 9, 2], [62, 360, 11, 7, 9, 2], [62, 411, 11, 7, 9, 2], [62, 462, 11, 7, 9, 2], [62, 514, 7, 6, 5, 3], [62, 565, 7, 8, 5, 3], [62, 616, 8, 5, 8, 3], [62, 668, 10, 3, 9, 4], [62, 718, 9, 5, 8, 3], [62, 768, 11, 7, 9, 2], [123, 3, 13, 7, 11, 2], [123, 54, 11, 7, 9, 2], [123, 105, 11, 7, 9, 2], [123, 156, 11, 7, 9, 2], [123, 207, 11, 7, 9, 2], [123, 258, 10, 7, 8, 2], [123, 309, 10, 7, 8, 2], [123, 360, 11, 7, 9, 2], [123, 411, 11, 7, 9, 2], [123, 462, 8, 7, 8, 2], [123, 513, 9, 7, 8, 2], [123, 564, 12, 7, 10, 2], [123, 615, 8, 7, 8, 2], [123, 666, 13, 7, 11, 2], [123, 717, 12, 7, 10, 2], [123, 768, 11, 7, 9, 2], [184, 3, 11, 7, 9, 2], [184, 54, 11, 8, 9, 2], [184, 105, 11, 7, 9, 2], [184, 156, 10, 7, 8, 2], [184, 207, 10, 7, 8, 2], [184, 258, 11, 7, 9, 2], [184, 309, 11, 7, 9, 2], [184, 360, 13, 7, 11, 2], [184, 411, 11, 7, 9, 2], [184, 462, 9, 7, 7, 2], [184, 513, 11, 7, 9, 2], [184, 563, 9, 9, 6, 1], [184, 614, 8, 8, 8, 1], [184, 665, 9, 9, 6, 1], [184, 717, 10, 2, 9, 2], [184, 775, 9, 1, 9, 9], [245, 2, 9, 2, 8, 1], [245, 55, 9, 6, 9, 3], [245, 105, 9, 7, 9, 2], [245, 157, 9, 6, 8, 3], [245, 207, 10, 7, 9, 2], [245, 259, 9, 6, 9, 3], [245, 309, 10, 7, 8, 2], [245, 361, 10, 8, 9, 3], [245, 411, 9, 7, 9, 2], [245, 462, 7, 7, 6, 2], [245, 513, 9, 9, 8, 2], [245, 564, 10, 7, 9, 2], [245, 615, 7, 7, 6, 2], [245, 667, 12, 6, 12, 3], [245, 718, 9, 6, 9, 3], [245, 769, 9, 6, 9, 3], [306, 4, 9, 8, 9, 3], [306, 55, 10, 8, 9, 3], [306, 106, 9, 6, 7, 3], [306, 157, 8, 6, 8, 3], [306, 207, 9, 7, 8, 2], [306, 259, 10, 6, 9, 3], [306, 310, 10, 6, 9, 3], [306, 361, 13, 6, 12, 3], [306, 412, 10, 6, 9, 3], [306, 463, 10, 8, 9, 3], [306, 514, 10, 6, 9, 3], [306, 563, 10, 9, 8, 1], [306, 614, 9, 9, 7, 1], [306, 665, 8, 9, 8, 1], [306, 718, 10, 2, 9, 3], [306, 768, 8, 7, 7, 2], [367, 1, 11, 9, 9, 0], [367, 53, 11, 8, 9, 1], [367, 105, 11, 9, 9, 2], [367, 155, 10, 8, 8, 1], [367, 206, 12, 8, 10, 1], [367, 256, 11, 9, 9, 0], [367, 307, 11, 9, 9, 0], [367, 359, 9, 8, 9, 1], [367, 410, 10, 8, 9, 1], [367, 461, 10, 8, 9, 1], [367, 513, 10, 7, 9, 2], [367, 563, 11, 8, 9, 1], [367, 613, 11, 9, 9, 0], [367, 667, 9, 8, 8, 3], [367, 716, 9, 8, 9, 1], [367, 767, 10, 8, 9, 1], [428, 2, 10, 8, 9, 1], [428, 54, 10, 7, 9, 2], [428, 104, 7, 8, 6, 1], [428, 155, 8, 8, 6, 1], [428, 206, 8, 8, 6, 1], [428, 258, 8, 7, 6, 2], [428, 308, 11, 8, 9, 1], [428, 359, 9, 8, 9, 1], [428, 410, 10, 8, 9, 1], [428, 461, 10, 8, 9, 1], [428, 513, 10, 7, 9, 2], [428, 563, 11, 8, 9, 1], [428, 614, 10, 8, 9, 1], [428, 665, 10, 8, 9, 1], [428, 716, 10, 8, 9, 1], [428, 768, 10, 7, 9, 2], [489, 3, 9, 4, 8, 2], [489, 54, 9, 3, 7, 2], [489, 104, 11, 8, 8, 1], [489, 156, 10, 7, 10, 2], [489, 207, 10, 9, 8, 2], [489, 259, 9, 4, 8, 3], [489, 309, 12, 7, 10, 2], [489, 360, 10, 7, 9, 2], [489, 411, 12, 7, 11, 2], [489, 462, 12, 7, 11, 2], [489, 513, 13, 3, 11, 2], [489, 563, 8, 2, 8, 1], [489, 615, 9, 1, 7, 2], [489, 667, 11, 5, 10, 3], [489, 717, 13, 7, 11, 2], [489, 768, 11, 7, 9, 2], [550, 4, 14, 4, 14, 3], [550, 54, 11, 7, 10, 2], [550, 106, 8, 6, 8, 3], [550, 158, 8, 5, 8, 4], [550, 207, 9, 7, 7, 2], [550, 259, 11, 8, 11, 3], [550, 309, 11, 7, 9, 2], [550, 360, 11, 8, 10, 2], [550, 411, 12, 8, 11, 2], [550, 462, 13, 7, 11, 2], [550, 513, 9, 9, 8, 2], [550, 564, 10, 7, 8, 2], [550, 615, 10, 7, 8, 2], [550, 666, 12, 7, 11, 2], [550, 718, 12, 6, 12, 3], [550, 769, 10, 6, 9, 3], [611, 3, 9, 7, 9, 2], [611, 54, 7, 7, 7, 2], [611, 109, 9, 2, 8, 6], [611, 155, 14, 8, 12, 1], [611, 207, 9, 9, 8, 2], [611, 259, 10, 5, 9, 3], [611, 309, 9, 7, 10, 2], [611, 362, 12, 4, 10, 4], [611, 413, 11, 5, 10, 4], [611, 468, 11, 1, 14, 8], [611, 511, 1, 1, 9, 1], [611, 563, 11, 8, 9, 1], [611, 614, 12, 8, 9, 1], [611, 665, 12, 8, 9, 1], [611, 717, 12, 7, 11, 2], [611, 769, 13, 6, 12, 3], [672, 7, 9, 1, 8, 6], [672, 58, 12, 1, 11, 6], [672, 105, 9, 3, 7, 2], [672, 156, 9, 3, 7, 2], [672, 207, 7, 3, 5, 2], [672, 258, 7, 3, 5, 2], [672, 310, 10, 5, 8, 3], [672, 362, 10, 5, 10, 4], [672, 411, 10, 9, 9, 2], [1, 1, 1, 1, 6, 1], [794, 767, 9, 2, 8, 1], [672, 564, 11, 5, 10, 2], [672, 617, 9, 4, 8, 4], [672, 668, 9, 5, 8, 4], [672, 717, 12, 7, 11, 2], [672, 768, 12, 7, 11, 2], [733, 3, 9, 5, 8, 2], [733, 58, 6, 1, 5, 6], [733, 111, 5, 3, 5, 8], [733, 162, 7, 3, 7, 8], [733, 207, 15, 7, 14, 2], [733, 257, 11, 8, 9, 1], [733, 308, 10, 8, 8, 1], [733, 359, 11, 8, 9, 1], [733, 409, 10, 9, 8, 0], [733, 461, 10, 8, 8, 1], [733, 512, 8, 8, 8, 1], [733, 563, 9, 8, 8, 1], [733, 613, 8, 9, 8, 0], [733, 665, 9, 8, 8, 1], [733, 716, 11, 8, 9, 1], [733, 767, 11, 8, 9, 1], [1, 1, 1, 1, 6, 1], [794, 53, 11, 8, 9, 1], [794, 104, 11, 8, 9, 1], [794, 155, 11, 8, 9, 1], [794, 206, 11, 8, 9, 1], [794, 259, 7, 6, 6, 3], [794, 308, 9, 2, 8, 1], [794, 359, 11, 2, 9, 1], [794, 411, 10, 1, 8, 2], [794, 461, 10, 2, 8, 1], [794, 513, 8, 1, 8, 2], [794, 562, 10, 3, 8, 0], [794, 622, 7, 2, 8, 9], [794, 665, 10, 2, 8, 1], [794, 724, 6, 2, 8, 9], [794, 767, 9, 2, 8, 1], [855, 2, 9, 2, 8, 1], [855, 53, 9, 2, 8, 1], [855, 104, 9, 2, 8, 1], [855, 155, 9, 2, 8, 1], [855, 206, 9, 2, 8, 1], [855, 257, 9, 2, 8, 1], [855, 308, 9, 2, 8, 1], [855, 359, 9, 2, 8, 1], [855, 410, 9, 2, 8, 1], [855, 461, 9, 2, 8, 1], [855, 512, 9, 2, 8, 1], [855, 563, 9, 2, 8, 1], [855, 614, 9, 2, 8, 1], [855, 665, 9, 2, 8, 1], [855, 716, 9, 2, 8, 1], [855, 767, 9, 2, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 15, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 9, 9, 9, 2], [1, 105, 9, 8, 9, 2], [1, 156, 12, 9, 12, 2], [1, 206, 8, 11, 8, 1], [1, 258, 12, 9, 12, 2], [1, 309, 12, 9, 12, 2], [1, 360, 6, 8, 6, 2], [1, 410, 8, 11, 8, 1], [1, 461, 8, 11, 8, 1], [1, 513, 9, 8, 9, 2], [1, 565, 9, 7, 9, 3], [1, 617, 6, 9, 6, 4], [1, 668, 9, 6, 9, 4], [1, 719, 6, 7, 6, 4], [1, 767, 9, 10, 9, 1], [62, 3, 10, 9, 10, 2], [62, 54, 10, 9, 10, 2], [62, 105, 10, 9, 10, 2], [62, 156, 10, 9, 10, 2], [62, 207, 10, 9, 10, 2], [62, 258, 10, 9, 10, 2], [62, 309, 10, 9, 10, 2], [62, 360, 10, 9, 10, 2], [62, 411, 10, 9, 10, 2], [62, 462, 10, 9, 10, 2], [62, 514, 6, 8, 6, 3], [62, 565, 6, 10, 6, 3], [62, 616, 9, 7, 9, 3], [62, 668, 10, 6, 10, 4], [62, 718, 9, 7, 9, 3], [62, 768, 10, 9, 10, 2], [123, 3, 12, 9, 12, 2], [123, 54, 10, 9, 10, 2], [123, 105, 10, 9, 10, 2], [123, 156, 10, 9, 10, 2], [123, 207, 10, 9, 10, 2], [123, 258, 9, 9, 9, 2], [123, 309, 9, 9, 9, 2], [123, 360, 10, 9, 10, 2], [123, 411, 10, 9, 10, 2], [123, 462, 9, 9, 9, 2], [123, 513, 9, 9, 9, 2], [123, 564, 11, 9, 11, 2], [123, 615, 9, 9, 9, 2], [123, 666, 12, 9, 12, 2], [123, 717, 11, 9, 11, 2], [123, 768, 10, 9, 10, 2], [184, 3, 10, 9, 10, 2], [184, 54, 10, 10, 10, 2], [184, 105, 10, 9, 10, 2], [184, 156, 9, 9, 9, 2], [184, 207, 9, 9, 9, 2], [184, 258, 10, 9, 10, 2], [184, 309, 10, 9, 10, 2], [184, 360, 12, 9, 12, 2], [184, 411, 10, 9, 10, 2], [184, 462, 8, 9, 8, 2], [184, 513, 10, 9, 10, 2], [184, 563, 7, 11, 7, 1], [184, 614, 9, 10, 9, 1], [184, 665, 7, 11, 7, 1], [184, 717, 10, 8, 10, 2], [184, 770, 10, 8, 10, 4], [245, 2, 9, 9, 9, 1], [245, 55, 10, 8, 10, 3], [245, 105, 10, 9, 10, 2], [245, 157, 9, 8, 9, 3], [245, 207, 10, 9, 10, 2], [245, 259, 10, 8, 10, 3], [245, 309, 9, 9, 9, 2], [245, 361, 10, 10, 10, 3], [245, 411, 10, 9, 10, 2], [245, 462, 7, 9, 7, 2], [245, 513, 9, 11, 9, 2], [245, 564, 10, 9, 10, 2], [245, 615, 7, 9, 7, 2], [245, 667, 13, 8, 13, 3], [245, 718, 10, 8, 10, 3], [245, 769, 10, 8, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 10, 10, 10, 3], [306, 106, 8, 8, 8, 3], [306, 157, 9, 8, 9, 3], [306, 207, 9, 9, 9, 2], [306, 259, 10, 8, 10, 3], [306, 310, 10, 8, 10, 3], [306, 361, 13, 8, 13, 3], [306, 412, 10, 8, 10, 3], [306, 463, 10, 10, 10, 3], [306, 514, 10, 8, 10, 3], [306, 563, 9, 11, 9, 1], [306, 614, 8, 11, 8, 1], [306, 665, 9, 11, 9, 1], [306, 718, 10, 7, 10, 3], [306, 768, 8, 9, 8, 2], [367, 1, 10, 11, 10, 0], [367, 53, 10, 10, 10, 1], [367, 105, 10, 11, 10, 2], [367, 155, 9, 10, 9, 1], [367, 206, 11, 10, 11, 1], [367, 256, 10, 11, 10, 0], [367, 307, 10, 11, 10, 0], [367, 359, 10, 10, 10, 1], [367, 410, 10, 10, 10, 1], [367, 461, 10, 10, 10, 1], [367, 513, 10, 9, 10, 2], [367, 563, 10, 10, 10, 1], [367, 613, 10, 11, 10, 0], [367, 667, 9, 10, 9, 3], [367, 716, 10, 10, 10, 1], [367, 767, 10, 10, 10, 1], [428, 2, 10, 10, 10, 1], [428, 54, 10, 9, 10, 2], [428, 104, 7, 10, 7, 1], [428, 155, 7, 10, 7, 1], [428, 206, 7, 10, 7, 1], [428, 258, 7, 9, 7, 2], [428, 308, 10, 10, 10, 1], [428, 359, 10, 10, 10, 1], [428, 410, 10, 10, 10, 1], [428, 461, 10, 10, 10, 1], [428, 513, 10, 9, 10, 2], [428, 563, 10, 10, 10, 1], [428, 614, 10, 10, 10, 1], [428, 665, 10, 10, 10, 1], [428, 716, 10, 10, 10, 1], [428, 768, 10, 9, 10, 2], [489, 3, 9, 8, 9, 2], [489, 54, 8, 8, 8, 2], [489, 104, 9, 10, 9, 1], [489, 156, 11, 9, 11, 2], [489, 207, 9, 11, 9, 2], [489, 259, 9, 7, 9, 3], [489, 309, 11, 9, 11, 2], [489, 360, 10, 9, 10, 2], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 12, 8, 12, 2], [489, 563, 9, 9, 9, 1], [489, 615, 8, 8, 8, 2], [489, 667, 11, 7, 11, 3], [489, 717, 12, 9, 12, 2], [489, 768, 10, 9, 10, 2], [550, 4, 15, 7, 15, 3], [550, 54, 11, 9, 11, 2], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 207, 8, 9, 8, 2], [550, 259, 12, 10, 12, 3], [550, 309, 10, 9, 10, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 462, 12, 9, 12, 2], [550, 513, 9, 11, 9, 2], [550, 564, 9, 9, 9, 2], [550, 615, 9, 9, 9, 2], [550, 666, 12, 9, 12, 2], [550, 718, 13, 8, 13, 3], [550, 769, 10, 8, 10, 3], [611, 3, 10, 9, 10, 2], [611, 54, 8, 9, 8, 2], [611, 107, 9, 6, 9, 4], [611, 155, 13, 10, 13, 1], [611, 207, 9, 11, 9, 2], [611, 259, 10, 7, 10, 3], [611, 309, 11, 9, 11, 2], [611, 362, 11, 7, 11, 4], [611, 413, 11, 7, 11, 4], [611, 464, 15, 7, 15, 4], [611, 515, 10, 6, 10, 4], [611, 563, 10, 10, 10, 1], [611, 614, 10, 10, 10, 1], [611, 665, 10, 10, 10, 1], [611, 717, 12, 9, 12, 2], [611, 769, 13, 8, 13, 3], [672, 5, 9, 6, 9, 4], [672, 56, 12, 6, 12, 4], [672, 105, 8, 8, 8, 2], [672, 156, 8, 8, 8, 2], [672, 207, 6, 8, 6, 2], [672, 258, 6, 8, 6, 2], [672, 310, 9, 7, 9, 3], [672, 362, 11, 7, 11, 4], [672, 411, 10, 11, 10, 2], [1, 5, 7, 6, 7, 4], [794, 767, 9, 9, 9, 1], [672, 564, 11, 8, 11, 2], [672, 617, 9, 7, 9, 4], [672, 668, 9, 7, 9, 4], [672, 717, 12, 9, 12, 2], [672, 768, 12, 9, 12, 2], [733, 3, 9, 8, 9, 2], [733, 56, 6, 6, 6, 4], [733, 107, 6, 9, 6, 4], [733, 158, 8, 9, 8, 4], [733, 207, 15, 9, 15, 2], [733, 257, 10, 10, 10, 1], [733, 308, 9, 10, 9, 1], [733, 359, 10, 10, 10, 1], [733, 409, 9, 11, 9, 0], [733, 461, 9, 10, 9, 1], [733, 512, 9, 10, 9, 1], [733, 563, 9, 10, 9, 1], [733, 613, 9, 11, 9, 0], [733, 665, 9, 10, 9, 1], [733, 716, 10, 10, 10, 1], [733, 767, 10, 10, 10, 1], [1, 5, 7, 6, 7, 4], [794, 53, 10, 10, 10, 1], [794, 104, 10, 10, 10, 1], [794, 155, 10, 10, 10, 1], [794, 206, 10, 10, 10, 1], [794, 259, 7, 8, 7, 3], [794, 308, 9, 9, 9, 1], [794, 359, 10, 9, 10, 1], [794, 411, 9, 8, 9, 2], [794, 461, 9, 9, 9, 1], [794, 513, 9, 8, 9, 2], [794, 562, 9, 10, 9, 0], [794, 617, 9, 9, 9, 4], [794, 665, 9, 9, 9, 1], [794, 719, 9, 9, 9, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 8, 7, 8, 3], [1, 106, 8, 7, 8, 3], [1, 157, 11, 7, 11, 3], [1, 207, 7, 9, 7, 2], [1, 259, 11, 7, 11, 3], [1, 310, 11, 7, 11, 3], [1, 361, 5, 7, 5, 3], [1, 411, 7, 9, 7, 2], [1, 462, 7, 9, 7, 2], [1, 514, 8, 7, 8, 3], [1, 566, 8, 6, 8, 4], [1, 617, 5, 8, 5, 4], [1, 668, 8, 6, 8, 4], [1, 719, 5, 6, 5, 4], [1, 768, 8, 8, 8, 2], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 5, 6, 5, 4], [62, 566, 5, 8, 5, 4], [62, 617, 8, 6, 8, 4], [62, 668, 9, 6, 9, 4], [62, 719, 8, 6, 8, 4], [62, 769, 9, 7, 9, 3], [123, 4, 11, 7, 11, 3], [123, 55, 9, 7, 9, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 8, 7, 8, 3], [123, 310, 8, 7, 8, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 8, 7, 8, 3], [123, 514, 8, 7, 8, 3], [123, 565, 10, 7, 10, 3], [123, 616, 8, 7, 8, 3], [123, 667, 11, 7, 11, 3], [123, 718, 10, 7, 10, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 8, 7, 8, 3], [184, 208, 8, 7, 8, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 11, 7, 11, 3], [184, 412, 9, 7, 9, 3], [184, 463, 7, 7, 7, 3], [184, 514, 9, 7, 9, 3], [184, 564, 6, 9, 6, 2], [184, 615, 8, 8, 8, 2], [184, 666, 6, 9, 6, 2], [184, 718, 9, 7, 9, 3], [184, 770, 9, 7, 9, 4], [245, 3, 8, 8, 8, 2], [245, 56, 9, 6, 9, 4], [245, 106, 9, 7, 9, 3], [245, 158, 8, 6, 8, 4], [245, 208, 9, 7, 9, 3], [245, 260, 9, 6, 9, 4], [245, 310, 8, 7, 8, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 6, 7, 6, 3], [245, 514, 8, 9, 8, 3], [245, 565, 9, 7, 9, 3], [245, 616, 6, 7, 6, 3], [245, 668, 12, 6, 12, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 7, 6, 7, 4], [306, 158, 8, 6, 8, 4], [306, 208, 8, 7, 8, 3], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 12, 6, 12, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 564, 8, 9, 8, 2], [306, 615, 7, 9, 7, 2], [306, 666, 8, 9, 8, 2], [306, 719, 9, 6, 9, 4], [306, 769, 7, 7, 7, 3], [367, 2, 9, 9, 9, 1], [367, 54, 9, 8, 9, 2], [367, 106, 9, 9, 9, 3], [367, 156, 8, 8, 8, 2], [367, 207, 10, 8, 10, 2], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 614, 9, 9, 9, 1], [367, 668, 8, 8, 8, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 6, 8, 6, 2], [428, 259, 6, 7, 6, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 4, 8, 7, 8, 3], [489, 55, 7, 7, 7, 3], [489, 105, 8, 8, 8, 2], [489, 157, 10, 7, 10, 3], [489, 208, 8, 9, 8, 3], [489, 260, 8, 6, 8, 4], [489, 310, 10, 7, 10, 3], [489, 361, 9, 7, 9, 3], [489, 412, 11, 7, 11, 3], [489, 463, 11, 7, 11, 3], [489, 514, 11, 7, 11, 3], [489, 564, 8, 8, 8, 2], [489, 616, 7, 7, 7, 3], [489, 668, 10, 6, 10, 4], [489, 718, 11, 7, 11, 3], [489, 769, 9, 7, 9, 3], [550, 5, 14, 6, 14, 4], [550, 55, 10, 7, 10, 3], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 208, 7, 7, 7, 3], [550, 260, 11, 8, 11, 4], [550, 310, 9, 7, 9, 3], [550, 361, 10, 8, 10, 3], [550, 412, 11, 8, 11, 3], [550, 463, 11, 7, 11, 3], [550, 514, 8, 9, 8, 3], [550, 565, 8, 7, 8, 3], [550, 616, 8, 7, 8, 3], [550, 667, 11, 7, 11, 3], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 4, 9, 7, 9, 3], [611, 55, 7, 7, 7, 3], [611, 107, 8, 6, 8, 4], [611, 156, 12, 8, 12, 2], [611, 208, 8, 9, 8, 3], [611, 260, 9, 6, 9, 4], [611, 310, 10, 7, 10, 3], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 14, 6, 14, 4], [611, 515, 9, 6, 9, 4], [611, 564, 9, 8, 9, 2], [611, 615, 9, 8, 9, 2], [611, 666, 9, 8, 9, 2], [611, 718, 11, 7, 11, 3], [611, 770, 12, 6, 12, 4], [672, 5, 8, 6, 8, 4], [672, 56, 11, 6, 11, 4], [672, 106, 7, 7, 7, 3], [672, 157, 7, 7, 7, 3], [672, 208, 5, 7, 5, 3], [672, 259, 5, 7, 5, 3], [672, 311, 8, 6, 8, 4], [672, 362, 10, 6, 10, 4], [672, 412, 9, 9, 9, 3], [1, 5, 6, 6, 6, 4], [794, 768, 8, 8, 8, 2], [672, 565, 10, 7, 10, 3], [672, 617, 8, 6, 8, 4], [672, 668, 8, 6, 8, 4], [672, 718, 11, 7, 11, 3], [672, 769, 11, 7, 11, 3], [733, 4, 8, 7, 8, 3], [733, 56, 5, 6, 5, 4], [733, 107, 5, 8, 5, 4], [733, 158, 7, 8, 7, 4], [733, 208, 14, 7, 14, 3], [733, 258, 9, 8, 9, 2], [733, 309, 8, 8, 8, 2], [733, 360, 9, 8, 9, 2], [733, 410, 8, 9, 8, 1], [733, 462, 8, 8, 8, 2], [733, 513, 8, 8, 8, 2], [733, 564, 8, 8, 8, 2], [733, 614, 8, 9, 8, 1], [733, 666, 8, 8, 8, 2], [733, 717, 9, 8, 9, 2], [733, 768, 9, 8, 9, 2], [1, 5, 6, 6, 6, 4], [794, 54, 9, 8, 9, 2], [794, 105, 9, 8, 9, 2], [794, 156, 9, 8, 9, 2], [794, 207, 9, 8, 9, 2], [794, 260, 6, 6, 6, 4], [794, 309, 8, 8, 8, 2], [794, 360, 9, 8, 9, 2], [794, 412, 8, 7, 8, 3], [794, 462, 8, 8, 8, 2], [794, 514, 8, 7, 8, 3], [794, 563, 8, 9, 8, 1], [794, 617, 8, 8, 8, 4], [794, 666, 8, 8, 8, 2], [794, 719, 8, 8, 8, 4], [794, 768, 8, 8, 8, 2], [855, 3, 8, 8, 8, 2], [855, 54, 8, 8, 8, 2], [855, 105, 8, 8, 8, 2], [855, 156, 8, 8, 8, 2], [855, 207, 8, 8, 8, 2], [855, 258, 8, 8, 8, 2], [855, 309, 8, 8, 8, 2], [855, 360, 8, 8, 8, 2], [855, 411, 8, 8, 8, 2], [855, 462, 8, 8, 8, 2], [855, 513, 8, 8, 8, 2], [855, 564, 8, 8, 8, 2], [855, 615, 8, 8, 8, 2], [855, 666, 8, 8, 8, 2], [855, 717, 8, 8, 8, 2], [855, 768, 8, 8, 8, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 12, 9, 11, 2], [1, 105, 13, 4, 11, 2], [1, 156, 13, 9, 11, 2], [1, 206, 13, 11, 11, 1], [1, 257, 15, 10, 11, 1], [1, 309, 13, 9, 11, 2], [1, 360, 12, 4, 11, 2], [1, 411, 13, 11, 11, 2], [1, 462, 12, 11, 11, 2], [1, 513, 13, 7, 11, 2], [1, 566, 12, 7, 11, 4], [1, 621, 10, 5, 11, 8], [1, 670, 12, 3, 11, 6], [1, 723, 9, 3, 11, 8], [1, 768, 14, 9, 11, 2], [62, 3, 13, 9, 11, 2], [62, 54, 12, 9, 11, 2], [62, 105, 13, 9, 11, 2], [62, 156, 13, 9, 11, 2], [62, 207, 13, 9, 11, 2], [62, 258, 14, 9, 11, 2], [62, 309, 13, 9, 11, 2], [62, 360, 14, 9, 11, 2], [62, 411, 13, 9, 11, 2], [62, 462, 13, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 12, 9, 11, 4], [62, 617, 12, 7, 11, 4], [62, 669, 12, 5, 11, 5], [62, 719, 11, 7, 11, 4], [62, 768, 13, 9, 11, 2], [123, 3, 13, 10, 11, 2], [123, 54, 12, 9, 11, 2], [123, 105, 13, 9, 11, 2], [123, 156, 14, 9, 11, 2], [123, 207, 13, 9, 11, 2], [123, 258, 14, 9, 11, 2], [123, 309, 14, 9, 11, 2], [123, 360, 13, 9, 11, 2], [123, 411, 15, 9, 11, 2], [123, 462, 14, 9, 11, 2], [123, 513, 14, 9, 11, 2], [123, 564, 15, 9, 11, 2], [123, 615, 12, 9, 11, 2], [123, 666, 15, 9, 11, 2], [123, 717, 15, 9, 11, 2], [123, 768, 13, 9, 11, 2], [184, 3, 13, 9, 11, 2], [184, 54, 13, 10, 11, 2], [184, 105, 13, 9, 11, 2], [184, 156, 14, 9, 11, 2], [184, 207, 14, 9, 11, 2], [184, 258, 15, 9, 11, 2], [184, 309, 14, 9, 11, 2], [184, 360, 15, 9, 11, 2], [184, 411, 14, 9, 11, 2], [184, 462, 14, 9, 11, 2], [184, 513, 14, 9, 11, 2], [184, 564, 13, 11, 11, 2], [184, 615, 11, 9, 11, 2], [184, 666, 13, 11, 11, 2], [184, 717, 14, 5, 11, 2], [184, 776, 11, 3, 11, 10], [245, 3, 12, 4, 11, 2], [245, 56, 11, 7, 11, 4], [245, 105, 12, 9, 11, 2], [245, 158, 12, 7, 11, 4], [245, 207, 13, 9, 11, 2], [245, 260, 12, 7, 11, 4], [245, 309, 14, 9, 11, 2], [245, 362, 14, 9, 11, 4], [245, 411, 12, 9, 11, 2], [245, 462, 12, 9, 11, 2], [245, 513, 13, 11, 11, 2], [245, 564, 13, 9, 11, 2], [245, 615, 12, 9, 11, 2], [245, 668, 12, 7, 11, 4], [245, 719, 12, 7, 11, 4], [245, 770, 12, 7, 11, 4], [306, 5, 12, 9, 11, 4], [306, 56, 13, 9, 11, 4], [306, 107, 13, 7, 11, 4], [306, 158, 13, 7, 11, 4], [306, 207, 12, 9, 11, 2], [306, 260, 13, 7, 11, 4], [306, 311, 13, 7, 11, 4], [306, 362, 14, 7, 11, 4], [306, 413, 13, 7, 11, 4], [306, 464, 13, 9, 11, 4], [306, 515, 13, 7, 11, 4], [306, 564, 13, 11, 11, 2], [306, 615, 12, 11, 11, 2], [306, 666, 11, 11, 11, 2], [306, 717, 14, 4, 11, 2], [306, 768, 14, 9, 11, 2], [367, 1, 14, 11, 11, 0], [367, 52, 14, 11, 11, 0], [367, 105, 13, 11, 11, 2], [367, 154, 14, 11, 11, 0], [367, 205, 15, 11, 11, 0], [367, 256, 14, 11, 11, 0], [367, 307, 15, 11, 11, 0], [367, 359, 13, 10, 11, 1], [367, 410, 12, 10, 11, 1], [367, 461, 13, 10, 11, 1], [367, 513, 13, 9, 11, 2], [367, 563, 14, 10, 11, 1], [367, 614, 13, 10, 11, 1], [367, 668, 12, 9, 11, 4], [367, 716, 13, 10, 11, 1], [367, 767, 12, 10, 11, 1], [428, 2, 13, 10, 11, 1], [428, 54, 13, 9, 11, 2], [428, 104, 13, 10, 11, 1], [428, 155, 12, 10, 11, 1], [428, 206, 13, 10, 11, 1], [428, 258, 13, 9, 11, 2], [428, 308, 14, 10, 11, 1], [428, 359, 13, 10, 11, 1], [428, 410, 12, 10, 11, 1], [428, 461, 13, 10, 11, 1], [428, 513, 13, 9, 11, 2], [428, 563, 14, 10, 11, 1], [428, 614, 13, 10, 11, 1], [428, 665, 13, 10, 11, 1], [428, 716, 13, 10, 11, 1], [428, 768, 13, 9, 11, 2], [489, 3, 13, 11, 11, 2], [489, 53, 14, 6, 11, 1], [489, 106, 12, 9, 11, 3], [489, 156, 13, 9, 11, 2], [489, 207, 13, 11, 11, 2], [489, 260, 11, 6, 11, 4], [489, 309, 15, 11, 11, 2], [489, 360, 13, 9, 11, 2], [489, 411, 15, 9, 13, 2], [489, 462, 15, 9, 13, 2], [489, 513, 17, 6, 14, 2], [489, 564, 13, 4, 11, 2], [489, 615, 13, 3, 11, 2], [489, 668, 12, 7, 10, 4], [489, 717, 15, 9, 11, 2], [489, 768, 13, 9, 11, 2], [550, 5, 12, 6, 11, 4], [550, 56, 12, 7, 11, 4], [550, 107, 12, 7, 11, 4], [550, 158, 11, 7, 11, 4], [550, 207, 14, 9, 11, 2], [550, 260, 12, 9, 11, 4], [550, 309, 12, 9, 10, 2], [550, 360, 15, 10, 12, 2], [550, 411, 16, 10, 13, 2], [550, 464, 13, 7, 11, 4], [550, 513, 12, 11, 8, 2], [550, 564, 13, 8, 11, 2], [550, 615, 12, 8, 11, 2], [550, 666, 15, 9, 13, 2], [550, 719, 13, 7, 11, 4], [550, 770, 14, 7, 11, 4], [611, 5, 11, 9, 11, 4], [611, 56, 11, 9, 11, 4], [611, 109, 12, 5, 11, 6], [611, 156, 14, 9, 10, 2], [611, 207, 14, 11, 11, 2], [611, 260, 12, 7, 10, 4], [611, 309, 12, 9, 11, 2], [611, 362, 13, 7, 11, 4], [611, 413, 12, 7, 11, 4], [611, 468, 11, 3, 11, 8], [611, 511, 1, 1, 11, 1], [611, 562, 12, 11, 11, 0], [611, 613, 15, 11, 11, 0], [611, 664, 15, 11, 11, 0], [611, 717, 15, 9, 11, 2], [611, 770, 14, 7, 11, 4], [672, 6, 11, 3, 11, 5], [672, 57, 12, 3, 11, 5], [672, 105, 14, 5, 11, 2], [672, 156, 14, 5, 11, 2], [672, 207, 12, 5, 11, 2], [672, 258, 12, 5, 11, 2], [672, 311, 12, 7, 11, 4], [672, 360, 12, 9, 10, 2], [672, 411, 13, 11, 11, 2], [1, 1, 1, 1, 11, 1], [794, 766, 14, 4, 10, 0], [672, 565, 13, 6, 11, 3], [672, 617, 12, 7, 11, 4], [672, 668, 11, 7, 11, 4], [672, 717, 14, 9, 11, 2], [672, 768, 14, 9, 11, 2], [733, 3, 13, 11, 11, 2], [733, 57, 10, 3, 11, 5], [733, 111, 10, 5, 11, 8], [733, 162, 11, 5, 11, 8], [733, 205, 14, 11, 11, 0], [733, 256, 13, 11, 11, 0], [733, 307, 14, 11, 11, 0], [733, 358, 14, 11, 11, 0], [733, 409, 14, 11, 11, 0], [733, 460, 14, 11, 11, 0], [733, 511, 14, 11, 11, 0], [733, 562, 14, 11, 11, 0], [733, 613, 14, 11, 11, 0], [733, 664, 14, 11, 11, 0], [733, 715, 14, 11, 11, 0], [733, 766, 13, 11, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 13, 11, 11, 0], [794, 103, 15, 11, 11, 0], [794, 154, 15, 11, 11, 0], [794, 205, 15, 11, 11, 0], [794, 260, 11, 7, 11, 4], [794, 309, 12, 4, 11, 2], [794, 360, 14, 4, 11, 2], [794, 411, 14, 3, 11, 2], [794, 462, 14, 4, 11, 2], [794, 513, 12, 3, 11, 2], [794, 564, 12, 4, 11, 2], [794, 620, 10, 6, 11, 7], [794, 666, 14, 4, 11, 2], [794, 723, 9, 5, 11, 8], [794, 766, 14, 4, 10, 0], [855, 1, 14, 4, 10, 0], [855, 52, 14, 4, 10, 0], [855, 103, 14, 4, 10, 0], [855, 154, 14, 4, 10, 0], [855, 205, 14, 4, 10, 0], [855, 256, 14, 4, 10, 0], [855, 307, 14, 4, 10, 0], [855, 358, 14, 4, 10, 0], [855, 409, 14, 4, 10, 0], [855, 460, 14, 4, 10, 0], [855, 511, 14, 4, 10, 0], [855, 562, 14, 4, 10, 0], [855, 613, 14, 4, 10, 0], [855, 664, 14, 4, 10, 0], [855, 715, 14, 4, 10, 0], [855, 766, 14, 4, 10, 0]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 7, 10, 2], [1, 105, 12, 2, 10, 2], [1, 156, 12, 7, 10, 2], [1, 206, 12, 9, 10, 1], [1, 257, 14, 8, 10, 1], [1, 309, 12, 7, 10, 2], [1, 360, 11, 2, 10, 2], [1, 411, 12, 9, 10, 2], [1, 462, 11, 9, 10, 2], [1, 513, 12, 5, 10, 2], [1, 566, 11, 5, 10, 4], [1, 621, 9, 3, 10, 8], [1, 670, 11, 1, 10, 6], [1, 723, 8, 1, 10, 8], [1, 768, 13, 7, 10, 2], [62, 3, 12, 7, 10, 2], [62, 54, 11, 7, 10, 2], [62, 105, 12, 7, 10, 2], [62, 156, 12, 7, 10, 2], [62, 207, 12, 7, 10, 2], [62, 258, 13, 7, 10, 2], [62, 309, 12, 7, 10, 2], [62, 360, 13, 7, 10, 2], [62, 411, 12, 7, 10, 2], [62, 462, 12, 7, 10, 2], [62, 515, 10, 5, 10, 4], [62, 566, 11, 7, 10, 4], [62, 617, 11, 5, 10, 4], [62, 669, 11, 3, 10, 5], [62, 719, 10, 5, 10, 4], [62, 768, 12, 7, 10, 2], [123, 3, 12, 8, 10, 2], [123, 54, 11, 7, 10, 2], [123, 105, 12, 7, 10, 2], [123, 156, 13, 7, 10, 2], [123, 207, 12, 7, 10, 2], [123, 258, 13, 7, 10, 2], [123, 309, 13, 7, 10, 2], [123, 360, 12, 7, 10, 2], [123, 411, 14, 7, 10, 2], [123, 462, 13, 7, 10, 2], [123, 513, 13, 7, 10, 2], [123, 564, 14, 7, 10, 2], [123, 615, 11, 7, 10, 2], [123, 666, 14, 7, 10, 2], [123, 717, 14, 7, 10, 2], [123, 768, 12, 7, 10, 2], [184, 3, 12, 7, 10, 2], [184, 54, 12, 8, 10, 2], [184, 105, 12, 7, 10, 2], [184, 156, 13, 7, 10, 2], [184, 207, 13, 7, 10, 2], [184, 258, 14, 7, 10, 2], [184, 309, 13, 7, 10, 2], [184, 360, 14, 7, 10, 2], [184, 411, 13, 7, 10, 2], [184, 462, 13, 7, 10, 2], [184, 513, 13, 7, 10, 2], [184, 564, 12, 9, 10, 2], [184, 615, 10, 7, 10, 2], [184, 666, 12, 9, 10, 2], [184, 717, 13, 3, 10, 2], [184, 776, 10, 1, 10, 10], [245, 3, 11, 2, 10, 2], [245, 56, 10, 5, 10, 4], [245, 105, 11, 7, 10, 2], [245, 158, 11, 5, 10, 4], [245, 207, 12, 7, 10, 2], [245, 260, 11, 5, 10, 4], [245, 309, 13, 7, 10, 2], [245, 362, 13, 7, 10, 4], [245, 411, 11, 7, 10, 2], [245, 462, 11, 7, 10, 2], [245, 513, 12, 9, 10, 2], [245, 564, 12, 7, 10, 2], [245, 615, 11, 7, 10, 2], [245, 668, 11, 5, 10, 4], [245, 719, 11, 5, 10, 4], [245, 770, 11, 5, 10, 4], [306, 5, 11, 7, 10, 4], [306, 56, 12, 7, 10, 4], [306, 107, 12, 5, 10, 4], [306, 158, 12, 5, 10, 4], [306, 207, 11, 7, 10, 2], [306, 260, 12, 5, 10, 4], [306, 311, 12, 5, 10, 4], [306, 362, 13, 5, 10, 4], [306, 413, 12, 5, 10, 4], [306, 464, 12, 7, 10, 4], [306, 515, 12, 5, 10, 4], [306, 564, 12, 9, 10, 2], [306, 615, 11, 9, 10, 2], [306, 666, 10, 9, 10, 2], [306, 717, 13, 2, 10, 2], [306, 768, 13, 7, 10, 2], [367, 1, 11, 9, 10, 0], [367, 52, 13, 9, 10, 0], [367, 105, 12, 9, 10, 2], [367, 154, 13, 9, 10, 0], [367, 205, 14, 9, 10, 0], [367, 256, 12, 9, 10, 0], [367, 307, 14, 9, 10, 0], [367, 359, 12, 8, 10, 1], [367, 410, 11, 8, 10, 1], [367, 461, 12, 8, 10, 1], [367, 513, 12, 7, 10, 2], [367, 563, 13, 8, 10, 1], [367, 614, 12, 8, 10, 1], [367, 668, 11, 7, 10, 4], [367, 716, 12, 8, 10, 1], [367, 767, 11, 8, 10, 1], [428, 2, 12, 8, 10, 1], [428, 54, 12, 7, 10, 2], [428, 104, 12, 8, 10, 1], [428, 155, 11, 8, 10, 1], [428, 206, 12, 8, 10, 1], [428, 258, 12, 7, 10, 2], [428, 308, 13, 8, 10, 1], [428, 359, 12, 8, 10, 1], [428, 410, 11, 8, 10, 1], [428, 461, 12, 8, 10, 1], [428, 513, 12, 7, 10, 2], [428, 563, 13, 8, 10, 1], [428, 614, 12, 8, 10, 1], [428, 665, 12, 8, 10, 1], [428, 716, 12, 8, 10, 1], [428, 768, 12, 7, 10, 2], [489, 3, 12, 9, 10, 2], [489, 53, 13, 4, 10, 1], [489, 106, 11, 7, 10, 3], [489, 156, 12, 7, 10, 2], [489, 207, 12, 9, 10, 2], [489, 260, 10, 4, 10, 4], [489, 309, 14, 9, 10, 2], [489, 360, 12, 7, 10, 2], [489, 411, 14, 7, 12, 2], [489, 462, 14, 7, 12, 2], [489, 513, 16, 4, 13, 2], [489, 564, 12, 2, 10, 2], [489, 615, 12, 1, 10, 2], [489, 668, 11, 5, 9, 4], [489, 717, 14, 7, 10, 2], [489, 768, 12, 7, 10, 2], [550, 5, 11, 4, 10, 4], [550, 56, 11, 5, 10, 4], [550, 107, 11, 5, 10, 4], [550, 158, 10, 5, 10, 4], [550, 207, 13, 7, 10, 2], [550, 260, 11, 7, 10, 4], [550, 309, 11, 7, 9, 2], [550, 360, 14, 8, 11, 2], [550, 411, 15, 8, 12, 2], [550, 464, 12, 5, 10, 4], [550, 513, 11, 9, 7, 2], [550, 564, 12, 6, 10, 2], [550, 615, 11, 6, 10, 2], [550, 666, 14, 7, 12, 2], [550, 719, 12, 5, 10, 4], [550, 770, 13, 5, 10, 4], [611, 5, 10, 7, 10, 4], [611, 56, 10, 7, 10, 4], [611, 109, 11, 3, 10, 6], [611, 156, 13, 7, 9, 2], [611, 207, 13, 9, 10, 2], [611, 260, 11, 5, 9, 4], [611, 309, 11, 7, 10, 2], [611, 362, 12, 5, 10, 4], [611, 413, 11, 5, 10, 4], [611, 468, 10, 1, 10, 8], [611, 511, 1, 1, 10, 1], [611, 562, 11, 9, 10, 0], [611, 613, 12, 9, 10, 0], [611, 664, 12, 9, 10, 0], [611, 717, 14, 7, 10, 2], [611, 770, 13, 5, 10, 4], [672, 6, 10, 1, 10, 5], [672, 57, 11, 1, 10, 5], [672, 105, 13, 3, 10, 2], [672, 156, 13, 3, 10, 2], [672, 207, 11, 3, 10, 2], [672, 258, 11, 3, 10, 2], [672, 311, 11, 5, 10, 4], [672, 360, 11, 7, 9, 2], [672, 411, 12, 9, 10, 2], [1, 1, 1, 1, 10, 1], [794, 766, 11, 2, 9, 0], [672, 565, 12, 4, 10, 3], [672, 617, 11, 5, 10, 4], [672, 668, 10, 5, 10, 4], [672, 717, 13, 7, 10, 2], [672, 768, 13, 7, 10, 2], [733, 3, 12, 9, 10, 2], [733, 57, 9, 1, 10, 5], [733, 111, 9, 3, 10, 8], [733, 162, 10, 3, 10, 8], [733, 205, 13, 9, 10, 0], [733, 256, 12, 9, 10, 0], [733, 307, 13, 9, 10, 0], [733, 358, 11, 9, 10, 0], [733, 409, 13, 9, 10, 0], [733, 460, 13, 9, 10, 0], [733, 511, 13, 9, 10, 0], [733, 562, 13, 9, 10, 0], [733, 613, 13, 9, 10, 0], [733, 664, 13, 9, 10, 0], [733, 715, 12, 9, 10, 0], [733, 766, 12, 9, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 12, 9, 10, 0], [794, 103, 14, 9, 10, 0], [794, 154, 14, 9, 10, 0], [794, 205, 14, 9, 10, 0], [794, 260, 10, 5, 10, 4], [794, 309, 11, 2, 10, 2], [794, 360, 13, 2, 10, 2], [794, 411, 13, 1, 10, 2], [794, 462, 13, 2, 10, 2], [794, 513, 11, 1, 10, 2], [794, 564, 11, 2, 10, 2], [794, 620, 9, 4, 10, 7], [794, 666, 13, 2, 10, 2], [794, 723, 8, 3, 10, 8], [794, 766, 11, 2, 9, 0], [855, 1, 11, 2, 9, 0], [855, 52, 11, 2, 9, 0], [855, 103, 11, 2, 9, 0], [855, 154, 11, 2, 9, 0], [855, 205, 11, 2, 9, 0], [855, 256, 11, 2, 9, 0], [855, 307, 11, 2, 9, 0], [855, 358, 11, 2, 9, 0], [855, 409, 11, 2, 9, 0], [855, 460, 11, 2, 9, 0], [855, 511, 11, 2, 9, 0], [855, 562, 11, 2, 9, 0], [855, 613, 11, 2, 9, 0], [855, 664, 11, 2, 9, 0], [855, 715, 11, 2, 9, 0], [855, 766, 11, 2, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 11, 6, 11, 4], [1, 54, 11, 9, 11, 2], [1, 105, 11, 8, 11, 2], [1, 156, 11, 9, 11, 2], [1, 206, 11, 11, 11, 1], [1, 257, 11, 10, 11, 1], [1, 309, 11, 9, 11, 2], [1, 360, 11, 8, 11, 2], [1, 411, 11, 11, 11, 2], [1, 462, 11, 11, 11, 2], [1, 513, 11, 8, 11, 2], [1, 566, 11, 7, 11, 4], [1, 617, 11, 9, 11, 4], [1, 668, 11, 6, 11, 4], [1, 719, 11, 7, 11, 4], [1, 768, 11, 9, 11, 2], [62, 3, 11, 9, 11, 2], [62, 54, 11, 9, 11, 2], [62, 105, 11, 9, 11, 2], [62, 156, 11, 9, 11, 2], [62, 207, 11, 9, 11, 2], [62, 258, 11, 9, 11, 2], [62, 309, 11, 9, 11, 2], [62, 360, 11, 9, 11, 2], [62, 411, 11, 9, 11, 2], [62, 462, 11, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 11, 9, 11, 4], [62, 617, 11, 7, 11, 4], [62, 668, 11, 6, 11, 4], [62, 719, 11, 7, 11, 4], [62, 768, 11, 9, 11, 2], [123, 3, 11, 10, 11, 2], [123, 54, 11, 9, 11, 2], [123, 105, 11, 9, 11, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 11, 9, 11, 2], [123, 309, 11, 9, 11, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 11, 9, 11, 2], [123, 513, 11, 9, 11, 2], [123, 564, 11, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 11, 9, 11, 2], [123, 717, 11, 9, 11, 2], [123, 768, 11, 9, 11, 2], [184, 3, 11, 9, 11, 2], [184, 54, 11, 10, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 11, 9, 11, 2], [184, 207, 11, 9, 11, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 11, 9, 11, 2], [184, 411, 11, 9, 11, 2], [184, 462, 11, 9, 11, 2], [184, 513, 11, 9, 11, 2], [184, 564, 11, 11, 11, 2], [184, 615, 11, 9, 11, 2], [184, 666, 11, 11, 11, 2], [184, 717, 11, 8, 11, 2], [184, 770, 11, 9, 11, 4], [245, 3, 11, 8, 11, 2], [245, 56, 11, 7, 11, 4], [245, 105, 11, 9, 11, 2], [245, 158, 11, 7, 11, 4], [245, 207, 11, 9, 11, 2], [245, 260, 11, 7, 11, 4], [245, 309, 11, 9, 11, 2], [245, 362, 11, 9, 11, 4], [245, 411, 11, 9, 11, 2], [245, 462, 11, 9, 11, 2], [245, 513, 11, 11, 11, 2], [245, 564, 11, 9, 11, 2], [245, 615, 11, 9, 11, 2], [245, 668, 11, 7, 11, 4], [245, 719, 11, 7, 11, 4], [245, 770, 11, 7, 11, 4], [306, 5, 11, 9, 11, 4], [306, 56, 11, 9, 11, 4], [306, 107, 11, 7, 11, 4], [306, 158, 11, 7, 11, 4], [306, 207, 11, 9, 11, 2], [306, 260, 11, 7, 11, 4], [306, 311, 11, 7, 11, 4], [306, 362, 11, 7, 11, 4], [306, 413, 11, 7, 11, 4], [306, 464, 11, 9, 11, 4], [306, 515, 11, 7, 11, 4], [306, 564, 11, 11, 11, 2], [306, 615, 11, 11, 11, 2], [306, 666, 11, 11, 11, 2], [306, 717, 11, 8, 11, 2], [306, 768, 11, 9, 11, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 105, 11, 11, 11, 2], [367, 154, 11, 11, 11, 0], [367, 205, 11, 11, 11, 0], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 11, 10, 11, 1], [367, 410, 11, 10, 11, 1], [367, 461, 11, 10, 11, 1], [367, 513, 11, 9, 11, 2], [367, 563, 11, 10, 11, 1], [367, 614, 11, 10, 11, 1], [367, 668, 11, 9, 11, 4], [367, 716, 11, 10, 11, 1], [367, 767, 11, 10, 11, 1], [428, 2, 11, 10, 11, 1], [428, 54, 11, 9, 11, 2], [428, 104, 11, 10, 11, 1], [428, 155, 11, 10, 11, 1], [428, 206, 11, 10, 11, 1], [428, 258, 11, 9, 11, 2], [428, 308, 11, 10, 11, 1], [428, 359, 11, 10, 11, 1], [428, 410, 11, 10, 11, 1], [428, 461, 11, 10, 11, 1], [428, 513, 11, 9, 11, 2], [428, 563, 11, 10, 11, 1], [428, 614, 11, 10, 11, 1], [428, 665, 11, 10, 11, 1], [428, 716, 11, 10, 11, 1], [428, 768, 11, 9, 11, 2], [489, 3, 11, 11, 11, 2], [489, 53, 11, 9, 11, 1], [489, 106, 11, 9, 11, 3], [489, 156, 11, 9, 11, 2], [489, 207, 11, 11, 11, 2], [489, 260, 11, 6, 11, 4], [489, 309, 11, 11, 11, 2], [489, 360, 11, 9, 11, 2], [489, 411, 13, 9, 13, 2], [489, 462, 13, 9, 13, 2], [489, 513, 14, 8, 14, 2], [489, 564, 11, 8, 11, 2], [489, 615, 11, 8, 11, 2], [489, 668, 10, 7, 10, 4], [489, 717, 11, 9, 11, 2], [489, 768, 11, 9, 11, 2], [550, 5, 11, 6, 11, 4], [550, 56, 11, 7, 11, 4], [550, 107, 11, 7, 11, 4], [550, 158, 11, 7, 11, 4], [550, 207, 11, 9, 11, 2], [550, 260, 11, 9, 11, 4], [550, 309, 10, 9, 10, 2], [550, 360, 12, 10, 12, 2], [550, 411, 13, 10, 13, 2], [550, 464, 11, 7, 11, 4], [550, 513, 8, 11, 8, 2], [550, 564, 11, 8, 11, 2], [550, 615, 11, 8, 11, 2], [550, 666, 13, 9, 13, 2], [550, 719, 11, 7, 11, 4], [550, 770, 11, 7, 11, 4], [611, 5, 11, 9, 11, 4], [611, 56, 11, 9, 11, 4], [611, 107, 11, 7, 11, 4], [611, 156, 10, 9, 10, 2], [611, 207, 11, 11, 11, 2], [611, 260, 10, 7, 10, 4], [611, 309, 11, 9, 11, 2], [611, 362, 11, 7, 11, 4], [611, 413, 11, 7, 11, 4], [611, 464, 11, 7, 11, 4], [611, 515, 11, 6, 11, 4], [611, 562, 11, 11, 11, 0], [611, 613, 11, 11, 11, 0], [611, 664, 11, 11, 11, 0], [611, 717, 11, 9, 11, 2], [611, 770, 11, 7, 11, 4], [672, 5, 11, 6, 11, 4], [672, 56, 11, 6, 11, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 11, 8, 11, 2], [672, 258, 11, 8, 11, 2], [672, 311, 11, 7, 11, 4], [672, 360, 10, 9, 10, 2], [672, 411, 11, 11, 11, 2], [1, 5, 11, 6, 11, 4], [794, 766, 10, 10, 10, 0], [672, 565, 11, 7, 11, 3], [672, 617, 11, 7, 11, 4], [672, 668, 11, 7, 11, 4], [672, 717, 11, 9, 11, 2], [672, 768, 11, 9, 11, 2], [733, 3, 11, 11, 11, 2], [733, 56, 11, 6, 11, 4], [733, 107, 11, 9, 11, 4], [733, 158, 11, 9, 11, 4], [733, 205, 11, 11, 11, 0], [733, 256, 11, 11, 11, 0], [733, 307, 11, 11, 11, 0], [733, 358, 11, 11, 11, 0], [733, 409, 11, 11, 11, 0], [733, 460, 11, 11, 11, 0], [733, 511, 11, 11, 11, 0], [733, 562, 11, 11, 11, 0], [733, 613, 11, 11, 11, 0], [733, 664, 11, 11, 11, 0], [733, 715, 11, 11, 11, 0], [733, 766, 11, 11, 11, 0], [1, 5, 11, 6, 11, 4], [794, 52, 11, 11, 11, 0], [794, 103, 11, 11, 11, 0], [794, 154, 11, 11, 11, 0], [794, 205, 11, 11, 11, 0], [794, 260, 11, 7, 11, 4], [794, 309, 11, 8, 11, 2], [794, 360, 11, 8, 11, 2], [794, 411, 11, 8, 11, 2], [794, 462, 11, 8, 11, 2], [794, 513, 11, 8, 11, 2], [794, 564, 11, 8, 11, 2], [794, 617, 11, 9, 11, 4], [794, 666, 11, 8, 11, 2], [794, 719, 11, 9, 11, 4], [794, 766, 10, 10, 10, 0], [855, 1, 10, 10, 10, 0], [855, 52, 10, 10, 10, 0], [855, 103, 10, 10, 10, 0], [855, 154, 10, 10, 10, 0], [855, 205, 10, 10, 10, 0], [855, 256, 10, 10, 10, 0], [855, 307, 10, 10, 10, 0], [855, 358, 10, 10, 10, 0], [855, 409, 10, 10, 10, 0], [855, 460, 10, 10, 10, 0], [855, 511, 10, 10, 10, 0], [855, 562, 10, 10, 10, 0], [855, 613, 10, 10, 10, 0], [855, 664, 10, 10, 10, 0], [855, 715, 10, 10, 10, 0], [855, 766, 10, 10, 10, 0]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 55, 10, 7, 10, 3], [1, 106, 10, 7, 10, 3], [1, 157, 10, 7, 10, 3], [1, 207, 10, 9, 10, 2], [1, 258, 10, 8, 10, 2], [1, 310, 10, 7, 10, 3], [1, 361, 10, 7, 10, 3], [1, 412, 10, 9, 10, 3], [1, 463, 10, 9, 10, 3], [1, 514, 10, 7, 10, 3], [1, 566, 10, 6, 10, 4], [1, 617, 10, 8, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 6, 10, 4], [1, 769, 10, 7, 10, 3], [62, 4, 10, 7, 10, 3], [62, 55, 10, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 7, 10, 3], [62, 208, 10, 7, 10, 3], [62, 259, 10, 7, 10, 3], [62, 310, 10, 7, 10, 3], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 7, 10, 3], [62, 515, 10, 6, 10, 4], [62, 566, 10, 8, 10, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 769, 10, 7, 10, 3], [123, 4, 10, 8, 10, 3], [123, 55, 10, 7, 10, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 10, 7, 10, 3], [123, 310, 10, 7, 10, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 10, 7, 10, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 10, 7, 10, 3], [123, 667, 10, 7, 10, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 10, 7, 10, 3], [184, 55, 10, 8, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 10, 7, 10, 3], [184, 208, 10, 7, 10, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 10, 7, 10, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 10, 7, 10, 3], [184, 565, 10, 9, 10, 3], [184, 616, 10, 7, 10, 3], [184, 667, 10, 9, 10, 3], [184, 718, 10, 7, 10, 3], [184, 770, 10, 8, 10, 4], [245, 4, 10, 7, 10, 3], [245, 56, 10, 6, 10, 4], [245, 106, 10, 7, 10, 3], [245, 158, 10, 6, 10, 4], [245, 208, 10, 7, 10, 3], [245, 260, 10, 6, 10, 4], [245, 310, 10, 7, 10, 3], [245, 362, 10, 8, 10, 4], [245, 412, 10, 7, 10, 3], [245, 463, 10, 7, 10, 3], [245, 514, 10, 9, 10, 3], [245, 565, 10, 7, 10, 3], [245, 616, 10, 7, 10, 3], [245, 668, 10, 6, 10, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 10, 6, 10, 4], [306, 158, 10, 6, 10, 4], [306, 208, 10, 7, 10, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 10, 6, 10, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 565, 10, 9, 10, 3], [306, 616, 10, 9, 10, 3], [306, 667, 10, 9, 10, 3], [306, 718, 10, 7, 10, 3], [306, 769, 10, 7, 10, 3], [367, 2, 10, 9, 10, 1], [367, 53, 10, 9, 10, 1], [367, 106, 10, 9, 10, 3], [367, 155, 10, 9, 10, 1], [367, 206, 10, 9, 10, 1], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 10, 8, 10, 2], [367, 411, 10, 8, 10, 2], [367, 462, 10, 8, 10, 2], [367, 514, 10, 7, 10, 3], [367, 564, 10, 8, 10, 2], [367, 615, 10, 8, 10, 2], [367, 668, 10, 8, 10, 4], [367, 717, 10, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 3, 10, 8, 10, 2], [428, 55, 10, 7, 10, 3], [428, 105, 10, 8, 10, 2], [428, 156, 10, 8, 10, 2], [428, 207, 10, 8, 10, 2], [428, 259, 10, 7, 10, 3], [428, 309, 10, 8, 10, 2], [428, 360, 10, 8, 10, 2], [428, 411, 10, 8, 10, 2], [428, 462, 10, 8, 10, 2], [428, 514, 10, 7, 10, 3], [428, 564, 10, 8, 10, 2], [428, 615, 10, 8, 10, 2], [428, 666, 10, 8, 10, 2], [428, 717, 10, 8, 10, 2], [428, 769, 10, 7, 10, 3], [489, 4, 10, 9, 10, 3], [489, 54, 10, 8, 10, 2], [489, 107, 10, 7, 10, 4], [489, 157, 10, 7, 10, 3], [489, 208, 10, 9, 10, 3], [489, 260, 10, 6, 10, 4], [489, 310, 10, 9, 10, 3], [489, 361, 10, 7, 10, 3], [489, 412, 12, 7, 12, 3], [489, 463, 12, 7, 12, 3], [489, 514, 13, 7, 13, 3], [489, 565, 10, 7, 10, 3], [489, 616, 10, 7, 10, 3], [489, 668, 9, 6, 9, 4], [489, 718, 10, 7, 10, 3], [489, 769, 10, 7, 10, 3], [550, 5, 10, 6, 10, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 208, 10, 7, 10, 3], [550, 260, 10, 8, 10, 4], [550, 310, 9, 7, 9, 3], [550, 361, 11, 8, 11, 3], [550, 412, 12, 8, 12, 3], [550, 464, 10, 6, 10, 4], [550, 514, 7, 9, 7, 3], [550, 565, 10, 7, 10, 3], [550, 616, 10, 7, 10, 3], [550, 667, 12, 7, 12, 3], [550, 719, 10, 6, 10, 4], [550, 770, 10, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 7, 9, 3], [611, 208, 10, 9, 10, 3], [611, 260, 9, 6, 9, 4], [611, 310, 10, 7, 10, 3], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 6, 10, 4], [611, 563, 10, 9, 10, 1], [611, 614, 10, 9, 10, 1], [611, 665, 10, 9, 10, 1], [611, 718, 10, 7, 10, 3], [611, 770, 10, 6, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 106, 10, 7, 10, 3], [672, 157, 10, 7, 10, 3], [672, 208, 10, 7, 10, 3], [672, 259, 10, 7, 10, 3], [672, 311, 10, 6, 10, 4], [672, 361, 9, 7, 9, 3], [672, 412, 10, 9, 10, 3], [1, 5, 10, 6, 10, 4], [794, 767, 9, 9, 9, 1], [672, 566, 10, 6, 10, 4], [672, 617, 10, 6, 10, 4], [672, 668, 10, 6, 10, 4], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 10, 9, 10, 3], [733, 56, 10, 6, 10, 4], [733, 107, 10, 8, 10, 4], [733, 158, 10, 8, 10, 4], [733, 206, 10, 9, 10, 1], [733, 257, 10, 9, 10, 1], [733, 308, 10, 9, 10, 1], [733, 359, 10, 9, 10, 1], [733, 410, 10, 9, 10, 1], [733, 461, 10, 9, 10, 1], [733, 512, 10, 9, 10, 1], [733, 563, 10, 9, 10, 1], [733, 614, 10, 9, 10, 1], [733, 665, 10, 9, 10, 1], [733, 716, 10, 9, 10, 1], [733, 767, 10, 9, 10, 1], [1, 5, 10, 6, 10, 4], [794, 53, 10, 9, 10, 1], [794, 104, 10, 9, 10, 1], [794, 155, 10, 9, 10, 1], [794, 206, 10, 9, 10, 1], [794, 260, 10, 6, 10, 4], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 617, 10, 8, 10, 4], [794, 667, 10, 7, 10, 3], [794, 719, 10, 8, 10, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 9, 10, 2], [1, 105, 12, 4, 10, 2], [1, 156, 12, 9, 10, 2], [1, 206, 12, 11, 10, 1], [1, 257, 14, 10, 10, 1], [1, 309, 12, 9, 10, 2], [1, 360, 11, 4, 10, 2], [1, 411, 12, 11, 10, 2], [1, 462, 11, 11, 10, 2], [1, 513, 12, 7, 10, 2], [1, 566, 11, 7, 10, 4], [1, 621, 9, 5, 10, 8], [1, 670, 11, 3, 10, 6], [1, 723, 8, 3, 10, 8], [1, 768, 13, 9, 10, 2], [62, 3, 12, 9, 10, 2], [62, 54, 11, 9, 10, 2], [62, 105, 12, 9, 10, 2], [62, 156, 12, 9, 10, 2], [62, 207, 12, 9, 10, 2], [62, 258, 13, 9, 10, 2], [62, 309, 12, 9, 10, 2], [62, 360, 13, 9, 10, 2], [62, 411, 12, 9, 10, 2], [62, 462, 12, 9, 10, 2], [62, 515, 10, 7, 10, 4], [62, 566, 11, 9, 10, 4], [62, 617, 11, 7, 10, 4], [62, 669, 11, 5, 10, 5], [62, 719, 10, 7, 10, 4], [62, 768, 12, 9, 10, 2], [123, 3, 12, 10, 10, 2], [123, 54, 11, 9, 10, 2], [123, 105, 12, 9, 10, 2], [123, 156, 13, 9, 10, 2], [123, 207, 12, 9, 10, 2], [123, 258, 13, 9, 10, 2], [123, 309, 13, 9, 10, 2], [123, 360, 12, 9, 10, 2], [123, 411, 14, 9, 10, 2], [123, 462, 13, 9, 10, 2], [123, 513, 13, 9, 10, 2], [123, 564, 14, 9, 10, 2], [123, 615, 11, 9, 10, 2], [123, 666, 14, 9, 10, 2], [123, 717, 14, 9, 10, 2], [123, 768, 12, 9, 10, 2], [184, 3, 12, 9, 10, 2], [184, 54, 12, 10, 10, 2], [184, 105, 12, 9, 10, 2], [184, 156, 13, 9, 10, 2], [184, 207, 13, 9, 10, 2], [184, 258, 14, 9, 10, 2], [184, 309, 13, 9, 10, 2], [184, 360, 14, 9, 10, 2], [184, 411, 13, 9, 10, 2], [184, 462, 13, 9, 10, 2], [184, 513, 13, 9, 10, 2], [184, 564, 12, 11, 10, 2], [184, 615, 10, 9, 10, 2], [184, 666, 12, 11, 10, 2], [184, 717, 13, 5, 10, 2], [184, 776, 10, 3, 10, 10], [245, 3, 11, 4, 10, 2], [245, 56, 10, 7, 10, 4], [245, 105, 11, 9, 10, 2], [245, 158, 11, 7, 10, 4], [245, 207, 12, 9, 10, 2], [245, 260, 11, 7, 10, 4], [245, 309, 13, 9, 10, 2], [245, 362, 13, 9, 10, 4], [245, 411, 11, 9, 10, 2], [245, 462, 11, 9, 10, 2], [245, 513, 12, 11, 10, 2], [245, 564, 12, 9, 10, 2], [245, 615, 11, 9, 10, 2], [245, 668, 11, 7, 10, 4], [245, 719, 11, 7, 10, 4], [245, 770, 11, 7, 10, 4], [306, 5, 11, 9, 10, 4], [306, 56, 12, 9, 10, 4], [306, 107, 12, 7, 10, 4], [306, 158, 12, 7, 10, 4], [306, 207, 11, 9, 10, 2], [306, 260, 12, 7, 10, 4], [306, 311, 12, 7, 10, 4], [306, 362, 13, 7, 10, 4], [306, 413, 12, 7, 10, 4], [306, 464, 12, 9, 10, 4], [306, 515, 12, 7, 10, 4], [306, 564, 12, 11, 10, 2], [306, 615, 11, 11, 10, 2], [306, 666, 10, 11, 10, 2], [306, 717, 13, 4, 10, 2], [306, 768, 13, 9, 10, 2], [367, 1, 13, 11, 10, 0], [367, 52, 13, 11, 10, 0], [367, 105, 12, 11, 10, 2], [367, 154, 13, 11, 10, 0], [367, 205, 14, 11, 10, 0], [367, 256, 13, 11, 10, 0], [367, 307, 14, 11, 10, 0], [367, 359, 12, 10, 10, 1], [367, 410, 11, 10, 10, 1], [367, 461, 12, 10, 10, 1], [367, 513, 12, 9, 10, 2], [367, 563, 13, 10, 10, 1], [367, 614, 12, 10, 10, 1], [367, 668, 11, 9, 10, 4], [367, 716, 12, 10, 10, 1], [367, 767, 11, 10, 10, 1], [428, 2, 12, 10, 10, 1], [428, 54, 12, 9, 10, 2], [428, 104, 12, 10, 10, 1], [428, 155, 11, 10, 10, 1], [428, 206, 12, 10, 10, 1], [428, 258, 12, 9, 10, 2], [428, 308, 13, 10, 10, 1], [428, 359, 12, 10, 10, 1], [428, 410, 11, 10, 10, 1], [428, 461, 12, 10, 10, 1], [428, 513, 12, 9, 10, 2], [428, 563, 13, 10, 10, 1], [428, 614, 12, 10, 10, 1], [428, 665, 12, 10, 10, 1], [428, 716, 12, 10, 10, 1], [428, 768, 12, 9, 10, 2], [489, 3, 12, 11, 10, 2], [489, 53, 13, 6, 10, 1], [489, 106, 11, 9, 10, 3], [489, 156, 12, 9, 10, 2], [489, 207, 12, 11, 10, 2], [489, 260, 10, 6, 10, 4], [489, 309, 14, 11, 10, 2], [489, 360, 12, 9, 10, 2], [489, 411, 14, 9, 12, 2], [489, 462, 14, 9, 12, 2], [489, 513, 16, 6, 13, 2], [489, 564, 12, 4, 10, 2], [489, 615, 12, 3, 10, 2], [489, 668, 11, 7, 9, 4], [489, 717, 14, 9, 10, 2], [489, 768, 12, 9, 10, 2], [550, 5, 11, 6, 10, 4], [550, 56, 11, 7, 10, 4], [550, 107, 11, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 207, 13, 9, 10, 2], [550, 260, 11, 9, 10, 4], [550, 309, 11, 9, 9, 2], [550, 360, 14, 10, 11, 2], [550, 411, 15, 10, 12, 2], [550, 464, 12, 7, 10, 4], [550, 513, 11, 11, 7, 2], [550, 564, 12, 8, 10, 2], [550, 615, 11, 8, 10, 2], [550, 666, 14, 9, 12, 2], [550, 719, 12, 7, 10, 4], [550, 770, 13, 7, 10, 4], [611, 5, 10, 9, 10, 4], [611, 56, 10, 9, 10, 4], [611, 109, 11, 5, 10, 6], [611, 156, 13, 9, 9, 2], [611, 207, 13, 11, 10, 2], [611, 260, 11, 7, 9, 4], [611, 309, 11, 9, 10, 2], [611, 362, 12, 7, 10, 4], [611, 413, 11, 7, 10, 4], [611, 468, 10, 3, 10, 8], [611, 511, 1, 1, 10, 1], [611, 562, 11, 11, 10, 0], [611, 613, 14, 11, 10, 0], [611, 664, 14, 11, 10, 0], [611, 717, 14, 9, 10, 2], [611, 770, 13, 7, 10, 4], [672, 6, 10, 3, 10, 5], [672, 57, 11, 3, 10, 5], [672, 105, 13, 5, 10, 2], [672, 156, 13, 5, 10, 2], [672, 207, 11, 5, 10, 2], [672, 258, 11, 5, 10, 2], [672, 311, 11, 7, 10, 4], [672, 360, 11, 9, 9, 2], [672, 411, 12, 11, 10, 2], [1, 1, 1, 1, 10, 1], [794, 766, 13, 4, 9, 0], [672, 565, 12, 6, 10, 3], [672, 617, 11, 7, 10, 4], [672, 668, 10, 7, 10, 4], [672, 717, 13, 9, 10, 2], [672, 768, 13, 9, 10, 2], [733, 3, 12, 11, 10, 2], [733, 57, 9, 3, 10, 5], [733, 111, 9, 5, 10, 8], [733, 162, 10, 5, 10, 8], [733, 205, 13, 11, 10, 0], [733, 256, 12, 11, 10, 0], [733, 307, 13, 11, 10, 0], [733, 358, 13, 11, 10, 0], [733, 409, 13, 11, 10, 0], [733, 460, 13, 11, 10, 0], [733, 511, 13, 11, 10, 0], [733, 562, 13, 11, 10, 0], [733, 613, 13, 11, 10, 0], [733, 664, 13, 11, 10, 0], [733, 715, 13, 11, 10, 0], [733, 766, 12, 11, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 12, 11, 10, 0], [794, 103, 14, 11, 10, 0], [794, 154, 14, 11, 10, 0], [794, 205, 14, 11, 10, 0], [794, 260, 10, 7, 10, 4], [794, 309, 11, 4, 10, 2], [794, 360, 13, 4, 10, 2], [794, 411, 13, 3, 10, 2], [794, 462, 13, 4, 10, 2], [794, 513, 11, 3, 10, 2], [794, 564, 11, 4, 10, 2], [794, 620, 9, 6, 10, 7], [794, 666, 13, 4, 10, 2], [794, 723, 8, 5, 10, 8], [794, 766, 13, 4, 9, 0], [855, 1, 13, 4, 9, 0], [855, 52, 13, 4, 9, 0], [855, 103, 13, 4, 9, 0], [855, 154, 13, 4, 9, 0], [855, 205, 13, 4, 9, 0], [855, 256, 13, 4, 9, 0], [855, 307, 13, 4, 9, 0], [855, 358, 13, 4, 9, 0], [855, 409, 13, 4, 9, 0], [855, 460, 13, 4, 9, 0], [855, 511, 13, 4, 9, 0], [855, 562, 13, 4, 9, 0], [855, 613, 13, 4, 9, 0], [855, 664, 13, 4, 9, 0], [855, 715, 13, 4, 9, 0], [855, 766, 13, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 10, 7, 9, 2], [1, 105, 11, 2, 9, 2], [1, 156, 11, 7, 9, 2], [1, 206, 11, 9, 9, 1], [1, 257, 13, 8, 9, 1], [1, 309, 11, 7, 9, 2], [1, 360, 10, 2, 9, 2], [1, 411, 11, 9, 9, 2], [1, 462, 10, 9, 9, 2], [1, 513, 11, 5, 9, 2], [1, 566, 10, 5, 9, 4], [1, 621, 8, 3, 9, 8], [1, 670, 10, 1, 9, 6], [1, 723, 7, 1, 9, 8], [1, 768, 12, 7, 9, 2], [62, 3, 11, 7, 9, 2], [62, 54, 10, 7, 9, 2], [62, 105, 11, 7, 9, 2], [62, 156, 11, 7, 9, 2], [62, 207, 11, 7, 9, 2], [62, 258, 12, 7, 9, 2], [62, 309, 11, 7, 9, 2], [62, 360, 12, 7, 9, 2], [62, 411, 11, 7, 9, 2], [62, 462, 11, 7, 9, 2], [62, 515, 9, 5, 9, 4], [62, 566, 10, 7, 9, 4], [62, 617, 10, 5, 9, 4], [62, 669, 10, 3, 9, 5], [62, 719, 9, 5, 9, 4], [62, 768, 11, 7, 9, 2], [123, 3, 11, 8, 9, 2], [123, 54, 10, 7, 9, 2], [123, 105, 11, 7, 9, 2], [123, 156, 12, 7, 9, 2], [123, 207, 11, 7, 9, 2], [123, 258, 12, 7, 9, 2], [123, 309, 12, 7, 9, 2], [123, 360, 11, 7, 9, 2], [123, 411, 13, 7, 9, 2], [123, 462, 12, 7, 9, 2], [123, 513, 12, 7, 9, 2], [123, 564, 13, 7, 9, 2], [123, 615, 10, 7, 9, 2], [123, 666, 13, 7, 9, 2], [123, 717, 13, 7, 9, 2], [123, 768, 11, 7, 9, 2], [184, 3, 11, 7, 9, 2], [184, 54, 11, 8, 9, 2], [184, 105, 11, 7, 9, 2], [184, 156, 12, 7, 9, 2], [184, 207, 12, 7, 9, 2], [184, 258, 13, 7, 9, 2], [184, 309, 12, 7, 9, 2], [184, 360, 13, 7, 9, 2], [184, 411, 12, 7, 9, 2], [184, 462, 12, 7, 9, 2], [184, 513, 12, 7, 9, 2], [184, 564, 11, 9, 9, 2], [184, 615, 9, 7, 9, 2], [184, 666, 11, 9, 9, 2], [184, 717, 12, 3, 9, 2], [184, 776, 9, 1, 9, 10], [245, 3, 10, 2, 9, 2], [245, 56, 9, 5, 9, 4], [245, 105, 10, 7, 9, 2], [245, 158, 10, 5, 9, 4], [245, 207, 11, 7, 9, 2], [245, 260, 10, 5, 9, 4], [245, 309, 12, 7, 9, 2], [245, 362, 12, 7, 9, 4], [245, 411, 10, 7, 9, 2], [245, 462, 10, 7, 9, 2], [245, 513, 11, 9, 9, 2], [245, 564, 11, 7, 9, 2], [245, 615, 10, 7, 9, 2], [245, 668, 10, 5, 9, 4], [245, 719, 10, 5, 9, 4], [245, 770, 10, 5, 9, 4], [306, 5, 10, 7, 9, 4], [306, 56, 11, 7, 9, 4], [306, 107, 11, 5, 9, 4], [306, 158, 11, 5, 9, 4], [306, 207, 10, 7, 9, 2], [306, 260, 11, 5, 9, 4], [306, 311, 11, 5, 9, 4], [306, 362, 12, 5, 9, 4], [306, 413, 11, 5, 9, 4], [306, 464, 11, 7, 9, 4], [306, 515, 11, 5, 9, 4], [306, 564, 11, 9, 9, 2], [306, 615, 10, 9, 9, 2], [306, 666, 9, 9, 9, 2], [306, 717, 12, 2, 9, 2], [306, 768, 12, 7, 9, 2], [367, 1, 10, 9, 9, 0], [367, 52, 12, 9, 9, 0], [367, 105, 11, 9, 9, 2], [367, 154, 12, 9, 9, 0], [367, 205, 13, 9, 9, 0], [367, 256, 11, 9, 9, 0], [367, 307, 13, 9, 9, 0], [367, 359, 11, 8, 9, 1], [367, 410, 10, 8, 9, 1], [367, 461, 11, 8, 9, 1], [367, 513, 11, 7, 9, 2], [367, 563, 12, 8, 9, 1], [367, 614, 11, 8, 9, 1], [367, 668, 10, 7, 9, 4], [367, 716, 11, 8, 9, 1], [367, 767, 10, 8, 9, 1], [428, 2, 11, 8, 9, 1], [428, 54, 11, 7, 9, 2], [428, 104, 11, 8, 9, 1], [428, 155, 10, 8, 9, 1], [428, 206, 11, 8, 9, 1], [428, 258, 11, 7, 9, 2], [428, 308, 12, 8, 9, 1], [428, 359, 11, 8, 9, 1], [428, 410, 10, 8, 9, 1], [428, 461, 11, 8, 9, 1], [428, 513, 11, 7, 9, 2], [428, 563, 12, 8, 9, 1], [428, 614, 11, 8, 9, 1], [428, 665, 11, 8, 9, 1], [428, 716, 11, 8, 9, 1], [428, 768, 11, 7, 9, 2], [489, 3, 11, 9, 9, 2], [489, 53, 12, 4, 9, 1], [489, 106, 10, 7, 9, 3], [489, 156, 11, 7, 9, 2], [489, 207, 11, 9, 9, 2], [489, 260, 9, 4, 9, 4], [489, 309, 13, 9, 9, 2], [489, 360, 11, 7, 9, 2], [489, 411, 13, 7, 11, 2], [489, 462, 13, 7, 11, 2], [489, 513, 15, 4, 12, 2], [489, 564, 11, 2, 9, 2], [489, 615, 11, 1, 9, 2], [489, 668, 10, 5, 8, 4], [489, 717, 13, 7, 9, 2], [489, 768, 11, 7, 9, 2], [550, 5, 10, 4, 9, 4], [550, 56, 10, 5, 9, 4], [550, 107, 10, 5, 9, 4], [550, 158, 9, 5, 9, 4], [550, 207, 12, 7, 9, 2], [550, 260, 10, 7, 9, 4], [550, 309, 10, 7, 8, 2], [550, 360, 13, 8, 10, 2], [550, 411, 14, 8, 11, 2], [550, 464, 11, 5, 9, 4], [550, 513, 10, 9, 6, 2], [550, 564, 11, 6, 9, 2], [550, 615, 10, 6, 9, 2], [550, 666, 13, 7, 11, 2], [550, 719, 11, 5, 9, 4], [550, 770, 12, 5, 9, 4], [611, 5, 9, 7, 9, 4], [611, 56, 9, 7, 9, 4], [611, 109, 10, 3, 9, 6], [611, 156, 12, 7, 8, 2], [611, 207, 12, 9, 9, 2], [611, 260, 10, 5, 8, 4], [611, 309, 10, 7, 9, 2], [611, 362, 11, 5, 9, 4], [611, 413, 10, 5, 9, 4], [611, 468, 9, 1, 9, 8], [611, 511, 1, 1, 9, 1], [611, 562, 10, 9, 9, 0], [611, 613, 11, 9, 9, 0], [611, 664, 11, 9, 9, 0], [611, 717, 13, 7, 9, 2], [611, 770, 12, 5, 9, 4], [672, 6, 9, 1, 9, 5], [672, 57, 10, 1, 9, 5], [672, 105, 12, 3, 9, 2], [672, 156, 12, 3, 9, 2], [672, 207, 10, 3, 9, 2], [672, 258, 10, 3, 9, 2], [672, 311, 10, 5, 9, 4], [672, 360, 10, 7, 8, 2], [672, 411, 11, 9, 9, 2], [1, 1, 1, 1, 9, 1], [794, 766, 10, 2, 8, 0], [672, 565, 11, 4, 9, 3], [672, 617, 10, 5, 9, 4], [672, 668, 9, 5, 9, 4], [672, 717, 12, 7, 9, 2], [672, 768, 12, 7, 9, 2], [733, 3, 11, 9, 9, 2], [733, 57, 8, 1, 9, 5], [733, 111, 8, 3, 9, 8], [733, 162, 9, 3, 9, 8], [733, 205, 12, 9, 9, 0], [733, 256, 11, 9, 9, 0], [733, 307, 12, 9, 9, 0], [733, 358, 10, 9, 9, 0], [733, 409, 12, 9, 9, 0], [733, 460, 12, 9, 9, 0], [733, 511, 12, 9, 9, 0], [733, 562, 12, 9, 9, 0], [733, 613, 12, 9, 9, 0], [733, 664, 12, 9, 9, 0], [733, 715, 11, 9, 9, 0], [733, 766, 11, 9, 9, 0], [1, 1, 1, 1, 9, 1], [794, 52, 11, 9, 9, 0], [794, 103, 13, 9, 9, 0], [794, 154, 13, 9, 9, 0], [794, 205, 13, 9, 9, 0], [794, 260, 9, 5, 9, 4], [794, 309, 10, 2, 9, 2], [794, 360, 12, 2, 9, 2], [794, 411, 12, 1, 9, 2], [794, 462, 12, 2, 9, 2], [794, 513, 10, 1, 9, 2], [794, 564, 10, 2, 9, 2], [794, 620, 8, 4, 9, 7], [794, 666, 12, 2, 9, 2], [794, 723, 7, 3, 9, 8], [794, 766, 10, 2, 8, 0], [855, 1, 10, 2, 8, 0], [855, 52, 10, 2, 8, 0], [855, 103, 10, 2, 8, 0], [855, 154, 10, 2, 8, 0], [855, 205, 10, 2, 8, 0], [855, 256, 10, 2, 8, 0], [855, 307, 10, 2, 8, 0], [855, 358, 10, 2, 8, 0], [855, 409, 10, 2, 8, 0], [855, 460, 10, 2, 8, 0], [855, 511, 10, 2, 8, 0], [855, 562, 10, 2, 8, 0], [855, 613, 10, 2, 8, 0], [855, 664, 10, 2, 8, 0], [855, 715, 10, 2, 8, 0], [855, 766, 10, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 15, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 54, 10, 9, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 10, 9, 10, 2], [1, 206, 10, 11, 10, 1], [1, 257, 10, 10, 10, 1], [1, 309, 10, 9, 10, 2], [1, 360, 10, 8, 10, 2], [1, 411, 10, 11, 10, 2], [1, 462, 10, 11, 10, 2], [1, 513, 10, 8, 10, 2], [1, 566, 10, 7, 10, 4], [1, 617, 10, 9, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 7, 10, 4], [1, 768, 10, 9, 10, 2], [62, 3, 10, 9, 10, 2], [62, 54, 10, 9, 10, 2], [62, 105, 10, 9, 10, 2], [62, 156, 10, 9, 10, 2], [62, 207, 10, 9, 10, 2], [62, 258, 10, 9, 10, 2], [62, 309, 10, 9, 10, 2], [62, 360, 10, 9, 10, 2], [62, 411, 10, 9, 10, 2], [62, 462, 10, 9, 10, 2], [62, 515, 10, 7, 10, 4], [62, 566, 10, 9, 10, 4], [62, 617, 10, 7, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 7, 10, 4], [62, 768, 10, 9, 10, 2], [123, 3, 10, 10, 10, 2], [123, 54, 10, 9, 10, 2], [123, 105, 10, 9, 10, 2], [123, 156, 10, 9, 10, 2], [123, 207, 10, 9, 10, 2], [123, 258, 10, 9, 10, 2], [123, 309, 10, 9, 10, 2], [123, 360, 10, 9, 10, 2], [123, 411, 10, 9, 10, 2], [123, 462, 10, 9, 10, 2], [123, 513, 10, 9, 10, 2], [123, 564, 10, 9, 10, 2], [123, 615, 10, 9, 10, 2], [123, 666, 10, 9, 10, 2], [123, 717, 10, 9, 10, 2], [123, 768, 10, 9, 10, 2], [184, 3, 10, 9, 10, 2], [184, 54, 10, 10, 10, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 10, 9, 10, 2], [184, 309, 10, 9, 10, 2], [184, 360, 10, 9, 10, 2], [184, 411, 10, 9, 10, 2], [184, 462, 10, 9, 10, 2], [184, 513, 10, 9, 10, 2], [184, 564, 10, 11, 10, 2], [184, 615, 10, 9, 10, 2], [184, 666, 10, 11, 10, 2], [184, 717, 10, 8, 10, 2], [184, 770, 10, 9, 10, 4], [245, 3, 10, 8, 10, 2], [245, 56, 10, 7, 10, 4], [245, 105, 10, 9, 10, 2], [245, 158, 10, 7, 10, 4], [245, 207, 10, 9, 10, 2], [245, 260, 10, 7, 10, 4], [245, 309, 10, 9, 10, 2], [245, 362, 10, 9, 10, 4], [245, 411, 10, 9, 10, 2], [245, 462, 10, 9, 10, 2], [245, 513, 10, 11, 10, 2], [245, 564, 10, 9, 10, 2], [245, 615, 10, 9, 10, 2], [245, 668, 10, 7, 10, 4], [245, 719, 10, 7, 10, 4], [245, 770, 10, 7, 10, 4], [306, 5, 10, 9, 10, 4], [306, 56, 10, 9, 10, 4], [306, 107, 10, 7, 10, 4], [306, 158, 10, 7, 10, 4], [306, 207, 10, 9, 10, 2], [306, 260, 10, 7, 10, 4], [306, 311, 10, 7, 10, 4], [306, 362, 10, 7, 10, 4], [306, 413, 10, 7, 10, 4], [306, 464, 10, 9, 10, 4], [306, 515, 10, 7, 10, 4], [306, 564, 10, 11, 10, 2], [306, 615, 10, 11, 10, 2], [306, 666, 10, 11, 10, 2], [306, 717, 10, 8, 10, 2], [306, 768, 10, 9, 10, 2], [367, 1, 10, 11, 10, 0], [367, 52, 10, 11, 10, 0], [367, 105, 10, 11, 10, 2], [367, 154, 10, 11, 10, 0], [367, 205, 10, 11, 10, 0], [367, 256, 10, 11, 10, 0], [367, 307, 10, 11, 10, 0], [367, 359, 10, 10, 10, 1], [367, 410, 10, 10, 10, 1], [367, 461, 10, 10, 10, 1], [367, 513, 10, 9, 10, 2], [367, 563, 10, 10, 10, 1], [367, 614, 10, 10, 10, 1], [367, 668, 10, 9, 10, 4], [367, 716, 10, 10, 10, 1], [367, 767, 10, 10, 10, 1], [428, 2, 10, 10, 10, 1], [428, 54, 10, 9, 10, 2], [428, 104, 10, 10, 10, 1], [428, 155, 10, 10, 10, 1], [428, 206, 10, 10, 10, 1], [428, 258, 10, 9, 10, 2], [428, 308, 10, 10, 10, 1], [428, 359, 10, 10, 10, 1], [428, 410, 10, 10, 10, 1], [428, 461, 10, 10, 10, 1], [428, 513, 10, 9, 10, 2], [428, 563, 10, 10, 10, 1], [428, 614, 10, 10, 10, 1], [428, 665, 10, 10, 10, 1], [428, 716, 10, 10, 10, 1], [428, 768, 10, 9, 10, 2], [489, 3, 10, 11, 10, 2], [489, 53, 10, 9, 10, 1], [489, 106, 10, 9, 10, 3], [489, 156, 10, 9, 10, 2], [489, 207, 10, 11, 10, 2], [489, 260, 10, 6, 10, 4], [489, 309, 10, 11, 10, 2], [489, 360, 10, 9, 10, 2], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 13, 8, 13, 2], [489, 564, 10, 8, 10, 2], [489, 615, 10, 8, 10, 2], [489, 668, 9, 7, 9, 4], [489, 717, 10, 9, 10, 2], [489, 768, 10, 9, 10, 2], [550, 5, 10, 6, 10, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 207, 10, 9, 10, 2], [550, 260, 10, 9, 10, 4], [550, 309, 9, 9, 9, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 464, 10, 7, 10, 4], [550, 513, 7, 11, 7, 2], [550, 564, 10, 8, 10, 2], [550, 615, 10, 8, 10, 2], [550, 666, 12, 9, 12, 2], [550, 719, 10, 7, 10, 4], [550, 770, 10, 7, 10, 4], [611, 5, 10, 9, 10, 4], [611, 56, 10, 9, 10, 4], [611, 107, 10, 7, 10, 4], [611, 156, 9, 9, 9, 2], [611, 207, 10, 11, 10, 2], [611, 260, 9, 7, 9, 4], [611, 309, 10, 9, 10, 2], [611, 362, 10, 7, 10, 4], [611, 413, 10, 7, 10, 4], [611, 464, 10, 7, 10, 4], [611, 515, 10, 6, 10, 4], [611, 562, 10, 11, 10, 0], [611, 613, 10, 11, 10, 0], [611, 664, 10, 11, 10, 0], [611, 717, 10, 9, 10, 2], [611, 770, 10, 7, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 10, 8, 10, 2], [672, 258, 10, 8, 10, 2], [672, 311, 10, 7, 10, 4], [672, 360, 9, 9, 9, 2], [672, 411, 10, 11, 10, 2], [1, 5, 10, 6, 10, 4], [794, 766, 9, 10, 9, 0], [672, 565, 10, 7, 10, 3], [672, 617, 10, 7, 10, 4], [672, 668, 10, 7, 10, 4], [672, 717, 10, 9, 10, 2], [672, 768, 10, 9, 10, 2], [733, 3, 10, 11, 10, 2], [733, 56, 10, 6, 10, 4], [733, 107, 10, 9, 10, 4], [733, 158, 10, 9, 10, 4], [733, 205, 10, 11, 10, 0], [733, 256, 10, 11, 10, 0], [733, 307, 10, 11, 10, 0], [733, 358, 10, 11, 10, 0], [733, 409, 10, 11, 10, 0], [733, 460, 10, 11, 10, 0], [733, 511, 10, 11, 10, 0], [733, 562, 10, 11, 10, 0], [733, 613, 10, 11, 10, 0], [733, 664, 10, 11, 10, 0], [733, 715, 10, 11, 10, 0], [733, 766, 10, 11, 10, 0], [1, 5, 10, 6, 10, 4], [794, 52, 10, 11, 10, 0], [794, 103, 10, 11, 10, 0], [794, 154, 10, 11, 10, 0], [794, 205, 10, 11, 10, 0], [794, 260, 10, 7, 10, 4], [794, 309, 10, 8, 10, 2], [794, 360, 10, 8, 10, 2], [794, 411, 10, 8, 10, 2], [794, 462, 10, 8, 10, 2], [794, 513, 10, 8, 10, 2], [794, 564, 10, 8, 10, 2], [794, 617, 10, 9, 10, 4], [794, 666, 10, 8, 10, 2], [794, 719, 10, 9, 10, 4], [794, 766, 9, 10, 9, 0], [855, 1, 9, 10, 9, 0], [855, 52, 9, 10, 9, 0], [855, 103, 9, 10, 9, 0], [855, 154, 9, 10, 9, 0], [855, 205, 9, 10, 9, 0], [855, 256, 9, 10, 9, 0], [855, 307, 9, 10, 9, 0], [855, 358, 9, 10, 9, 0], [855, 409, 9, 10, 9, 0], [855, 460, 9, 10, 9, 0], [855, 511, 9, 10, 9, 0], [855, 562, 9, 10, 9, 0], [855, 613, 9, 10, 9, 0], [855, 664, 9, 10, 9, 0], [855, 715, 9, 10, 9, 0], [855, 766, 9, 10, 9, 0]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 9, 6, 9, 4], [1, 55, 9, 7, 9, 3], [1, 106, 9, 7, 9, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 9, 9, 2], [1, 258, 9, 8, 9, 2], [1, 310, 9, 7, 9, 3], [1, 361, 9, 7, 9, 3], [1, 412, 9, 9, 9, 3], [1, 463, 9, 9, 9, 3], [1, 514, 9, 7, 9, 3], [1, 566, 9, 6, 9, 4], [1, 617, 9, 8, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 6, 9, 4], [1, 769, 9, 7, 9, 3], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 769, 9, 7, 9, 3], [123, 4, 9, 8, 9, 3], [123, 55, 9, 7, 9, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 9, 7, 9, 3], [123, 514, 9, 7, 9, 3], [123, 565, 9, 7, 9, 3], [123, 616, 9, 7, 9, 3], [123, 667, 9, 7, 9, 3], [123, 718, 9, 7, 9, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 9, 7, 9, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 9, 7, 9, 3], [184, 565, 9, 9, 9, 3], [184, 616, 9, 7, 9, 3], [184, 667, 9, 9, 9, 3], [184, 718, 9, 7, 9, 3], [184, 770, 9, 8, 9, 4], [245, 4, 9, 7, 9, 3], [245, 56, 9, 6, 9, 4], [245, 106, 9, 7, 9, 3], [245, 158, 9, 6, 9, 4], [245, 208, 9, 7, 9, 3], [245, 260, 9, 6, 9, 4], [245, 310, 9, 7, 9, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 9, 7, 9, 3], [245, 514, 9, 9, 9, 3], [245, 565, 9, 7, 9, 3], [245, 616, 9, 7, 9, 3], [245, 668, 9, 6, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 208, 9, 7, 9, 3], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 565, 9, 9, 9, 3], [306, 616, 9, 9, 9, 3], [306, 667, 9, 9, 9, 3], [306, 718, 9, 7, 9, 3], [306, 769, 9, 7, 9, 3], [367, 2, 9, 9, 9, 1], [367, 53, 9, 9, 9, 1], [367, 106, 9, 9, 9, 3], [367, 155, 9, 9, 9, 1], [367, 206, 9, 9, 9, 1], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 615, 9, 8, 9, 2], [367, 668, 9, 8, 9, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 9, 8, 9, 2], [428, 156, 9, 8, 9, 2], [428, 207, 9, 8, 9, 2], [428, 259, 9, 7, 9, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 4, 9, 9, 9, 3], [489, 54, 9, 8, 9, 2], [489, 107, 9, 7, 9, 4], [489, 157, 9, 7, 9, 3], [489, 208, 9, 9, 9, 3], [489, 260, 9, 6, 9, 4], [489, 310, 9, 9, 9, 3], [489, 361, 9, 7, 9, 3], [489, 412, 11, 7, 11, 3], [489, 463, 11, 7, 11, 3], [489, 514, 12, 7, 12, 3], [489, 565, 9, 7, 9, 3], [489, 616, 9, 7, 9, 3], [489, 668, 8, 6, 8, 4], [489, 718, 9, 7, 9, 3], [489, 769, 9, 7, 9, 3], [550, 5, 9, 6, 9, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 208, 9, 7, 9, 3], [550, 260, 9, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 10, 8, 10, 3], [550, 412, 11, 8, 11, 3], [550, 464, 9, 6, 9, 4], [550, 514, 6, 9, 6, 3], [550, 565, 9, 7, 9, 3], [550, 616, 9, 7, 9, 3], [550, 667, 11, 7, 11, 3], [550, 719, 9, 6, 9, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 9, 8, 9, 4], [611, 107, 9, 6, 9, 4], [611, 157, 8, 7, 8, 3], [611, 208, 9, 9, 9, 3], [611, 260, 8, 6, 8, 4], [611, 310, 9, 7, 9, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 6, 9, 4], [611, 563, 9, 9, 9, 1], [611, 614, 9, 9, 9, 1], [611, 665, 9, 9, 9, 1], [611, 718, 9, 7, 9, 3], [611, 770, 9, 6, 9, 4], [672, 5, 9, 6, 9, 4], [672, 56, 9, 6, 9, 4], [672, 106, 9, 7, 9, 3], [672, 157, 9, 7, 9, 3], [672, 208, 9, 7, 9, 3], [672, 259, 9, 7, 9, 3], [672, 311, 9, 6, 9, 4], [672, 361, 8, 7, 8, 3], [672, 412, 9, 9, 9, 3], [1, 5, 9, 6, 9, 4], [794, 767, 8, 9, 8, 1], [672, 566, 9, 6, 9, 4], [672, 617, 9, 6, 9, 4], [672, 668, 9, 6, 9, 4], [672, 718, 9, 7, 9, 3], [672, 769, 9, 7, 9, 3], [733, 4, 9, 9, 9, 3], [733, 56, 9, 6, 9, 4], [733, 107, 9, 8, 9, 4], [733, 158, 9, 8, 9, 4], [733, 206, 9, 9, 9, 1], [733, 257, 9, 9, 9, 1], [733, 308, 9, 9, 9, 1], [733, 359, 9, 9, 9, 1], [733, 410, 9, 9, 9, 1], [733, 461, 9, 9, 9, 1], [733, 512, 9, 9, 9, 1], [733, 563, 9, 9, 9, 1], [733, 614, 9, 9, 9, 1], [733, 665, 9, 9, 9, 1], [733, 716, 9, 9, 9, 1], [733, 767, 9, 9, 9, 1], [1, 5, 9, 6, 9, 4], [794, 53, 9, 9, 9, 1], [794, 104, 9, 9, 9, 1], [794, 155, 9, 9, 9, 1], [794, 206, 9, 9, 9, 1], [794, 260, 9, 6, 9, 4], [794, 310, 9, 7, 9, 3], [794, 361, 9, 7, 9, 3], [794, 412, 9, 7, 9, 3], [794, 463, 9, 7, 9, 3], [794, 514, 9, 7, 9, 3], [794, 565, 9, 7, 9, 3], [794, 617, 9, 8, 9, 4], [794, 667, 9, 7, 9, 3], [794, 719, 9, 8, 9, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 54, 13, 10, 12, 2], [1, 105, 14, 5, 12, 2], [1, 156, 14, 9, 12, 2], [1, 206, 15, 12, 12, 1], [1, 258, 15, 10, 12, 2], [1, 309, 13, 10, 12, 2], [1, 360, 12, 5, 12, 2], [1, 411, 14, 12, 12, 2], [1, 462, 13, 12, 12, 2], [1, 513, 15, 8, 12, 2], [1, 566, 13, 7, 12, 4], [1, 622, 10, 4, 12, 9], [1, 670, 13, 3, 12, 6], [1, 724, 9, 3, 12, 9], [1, 768, 14, 10, 12, 2], [62, 3, 15, 10, 12, 2], [62, 54, 13, 10, 12, 2], [62, 105, 15, 10, 12, 2], [62, 156, 15, 10, 12, 2], [62, 207, 14, 10, 12, 2], [62, 258, 15, 10, 12, 2], [62, 309, 14, 10, 12, 2], [62, 360, 15, 10, 12, 2], [62, 411, 15, 10, 12, 2], [62, 462, 15, 10, 12, 2], [62, 515, 12, 8, 12, 4], [62, 566, 12, 9, 12, 4], [62, 617, 14, 7, 12, 4], [62, 669, 14, 5, 12, 5], [62, 719, 13, 7, 12, 4], [62, 768, 15, 10, 12, 2], [123, 3, 15, 11, 12, 2], [123, 54, 13, 10, 12, 2], [123, 105, 15, 10, 12, 2], [123, 156, 15, 10, 12, 2], [123, 207, 14, 10, 12, 2], [123, 258, 15, 10, 12, 2], [123, 309, 15, 10, 12, 2], [123, 360, 15, 10, 12, 2], [123, 411, 16, 10, 12, 2], [123, 462, 15, 10, 12, 2], [123, 513, 15, 10, 12, 2], [123, 564, 15, 10, 12, 2], [123, 615, 13, 10, 12, 2], [123, 666, 16, 10, 12, 2], [123, 717, 16, 10, 12, 2], [123, 768, 14, 10, 12, 2], [184, 3, 15, 10, 12, 2], [184, 54, 14, 11, 12, 2], [184, 105, 15, 10, 12, 2], [184, 156, 15, 10, 12, 2], [184, 207, 16, 10, 12, 2], [184, 258, 16, 10, 12, 2], [184, 309, 16, 10, 12, 2], [184, 360, 16, 10, 12, 2], [184, 411, 16, 10, 12, 2], [184, 462, 16, 10, 12, 2], [184, 513, 15, 10, 12, 2], [184, 564, 13, 12, 12, 2], [184, 615, 11, 10, 12, 2], [184, 666, 13, 12, 12, 2], [184, 717, 14, 5, 12, 2], [184, 777, 12, 3, 12, 11], [245, 3, 13, 4, 12, 2], [245, 56, 13, 8, 12, 4], [245, 105, 14, 10, 12, 2], [245, 158, 14, 8, 12, 4], [245, 207, 14, 10, 12, 2], [245, 260, 14, 8, 12, 4], [245, 309, 14, 10, 12, 2], [245, 362, 14, 10, 12, 4], [245, 411, 14, 10, 12, 2], [245, 462, 13, 10, 12, 2], [245, 513, 14, 12, 12, 2], [245, 564, 14, 10, 12, 2], [245, 615, 13, 10, 12, 2], [245, 668, 14, 8, 12, 4], [245, 719, 14, 8, 12, 4], [245, 770, 14, 8, 12, 4], [306, 5, 14, 10, 12, 4], [306, 56, 15, 10, 12, 4], [306, 107, 14, 8, 12, 4], [306, 158, 14, 8, 12, 4], [306, 207, 13, 10, 12, 2], [306, 260, 14, 8, 12, 4], [306, 311, 15, 8, 12, 4], [306, 362, 15, 8, 12, 4], [306, 413, 14, 8, 12, 4], [306, 464, 15, 10, 12, 4], [306, 515, 14, 8, 12, 4], [306, 564, 14, 12, 12, 2], [306, 615, 13, 12, 12, 2], [306, 666, 13, 12, 12, 2], [306, 720, 14, 4, 12, 5], [306, 768, 15, 10, 12, 2], [367, 1, 15, 12, 12, 0], [367, 52, 16, 12, 12, 0], [367, 105, 15, 12, 12, 2], [367, 154, 15, 12, 12, 0], [367, 205, 16, 12, 12, 0], [367, 256, 15, 12, 12, 0], [367, 307, 16, 12, 12, 0], [367, 360, 13, 10, 12, 2], [367, 411, 13, 10, 12, 2], [367, 461, 13, 11, 12, 1], [367, 513, 13, 10, 12, 2], [367, 563, 15, 11, 12, 1], [367, 614, 13, 11, 12, 1], [367, 668, 14, 10, 12, 4], [367, 717, 14, 10, 12, 2], [367, 768, 14, 10, 12, 2], [428, 2, 14, 11, 12, 1], [428, 54, 14, 10, 12, 2], [428, 104, 14, 11, 12, 1], [428, 155, 13, 11, 12, 1], [428, 206, 14, 11, 12, 1], [428, 258, 14, 10, 12, 2], [428, 308, 16, 11, 12, 1], [428, 359, 15, 11, 12, 1], [428, 410, 14, 11, 12, 1], [428, 461, 14, 11, 12, 1], [428, 513, 14, 10, 12, 2], [428, 563, 16, 11, 12, 1], [428, 614, 15, 11, 12, 1], [428, 665, 14, 11, 12, 1], [428, 716, 14, 11, 12, 1], [428, 768, 14, 10, 12, 2], [489, 3, 14, 12, 12, 2], [489, 54, 14, 6, 12, 2], [489, 106, 14, 9, 12, 3], [489, 156, 14, 10, 12, 2], [489, 206, 15, 13, 12, 1], [489, 260, 13, 7, 12, 4], [489, 309, 15, 12, 12, 2], [489, 360, 15, 10, 12, 2], [489, 411, 16, 10, 14, 2], [489, 462, 16, 10, 14, 2], [489, 513, 19, 7, 16, 2], [489, 564, 13, 4, 12, 2], [489, 615, 14, 3, 12, 2], [489, 668, 14, 7, 12, 4], [489, 717, 16, 10, 12, 2], [489, 768, 15, 10, 12, 2], [550, 6, 15, 5, 14, 5], [550, 56, 13, 8, 12, 4], [550, 107, 14, 8, 12, 4], [550, 158, 13, 8, 12, 4], [550, 207, 16, 10, 12, 2], [550, 260, 13, 10, 12, 4], [550, 309, 14, 10, 11, 2], [550, 360, 16, 11, 14, 2], [550, 411, 18, 11, 15, 2], [550, 464, 14, 8, 12, 4], [550, 513, 12, 12, 8, 2], [550, 564, 14, 9, 12, 2], [550, 615, 14, 9, 12, 2], [550, 666, 16, 10, 14, 2], [550, 719, 15, 8, 12, 4], [550, 770, 14, 8, 12, 4], [611, 5, 12, 10, 12, 4], [611, 56, 12, 10, 12, 4], [611, 109, 15, 5, 14, 6], [611, 156, 15, 10, 12, 2], [611, 207, 15, 12, 12, 2], [611, 261, 14, 6, 12, 5], [611, 309, 13, 10, 12, 2], [611, 363, 14, 7, 12, 5], [611, 414, 13, 7, 12, 5], [611, 469, 12, 3, 12, 9], [611, 511, 1, 1, 12, 1], [611, 562, 13, 12, 12, 0], [611, 613, 16, 12, 12, 0], [611, 664, 15, 12, 12, 0], [611, 717, 16, 10, 12, 2], [611, 770, 15, 8, 12, 4], [672, 7, 12, 3, 12, 6], [672, 58, 13, 3, 12, 6], [672, 105, 14, 4, 12, 2], [672, 156, 14, 4, 12, 2], [672, 207, 13, 4, 12, 2], [672, 258, 13, 4, 12, 2], [672, 311, 13, 7, 12, 4], [672, 360, 13, 10, 11, 2], [672, 411, 15, 12, 12, 2], [1, 1, 1, 1, 12, 1], [794, 766, 14, 4, 12, 0], [672, 565, 15, 8, 12, 3], [672, 618, 12, 7, 12, 5], [672, 669, 12, 7, 12, 5], [672, 717, 14, 10, 12, 2], [672, 768, 14, 10, 12, 2], [733, 3, 14, 12, 12, 2], [733, 58, 10, 3, 12, 6], [733, 112, 10, 4, 12, 9], [733, 163, 11, 4, 12, 9], [733, 206, 15, 10, 12, 1], [733, 256, 15, 12, 12, 0], [733, 307, 15, 12, 12, 0], [733, 358, 15, 12, 12, 0], [733, 409, 15, 12, 12, 0], [733, 460, 15, 12, 12, 0], [733, 511, 15, 12, 12, 0], [733, 562, 15, 12, 12, 0], [733, 613, 15, 12, 12, 0], [733, 664, 15, 12, 12, 0], [733, 715, 14, 12, 12, 0], [733, 766, 15, 12, 12, 0], [1, 1, 1, 1, 12, 1], [794, 52, 14, 12, 12, 0], [794, 103, 16, 12, 12, 0], [794, 154, 16, 12, 12, 0], [794, 205, 16, 12, 12, 0], [794, 260, 12, 8, 12, 4], [794, 309, 13, 5, 12, 2], [794, 361, 14, 4, 12, 3], [794, 413, 13, 3, 12, 4], [794, 463, 14, 4, 12, 3], [794, 514, 12, 3, 12, 3], [794, 564, 14, 6, 12, 2], [794, 621, 11, 6, 12, 8], [794, 666, 14, 4, 12, 2], [794, 723, 10, 6, 12, 8], [794, 766, 14, 4, 12, 0], [855, 1, 14, 4, 12, 0], [855, 52, 14, 4, 12, 0], [855, 103, 14, 4, 12, 0], [855, 154, 14, 4, 12, 0], [855, 205, 14, 4, 12, 0], [855, 256, 14, 4, 12, 0], [855, 307, 14, 4, 12, 0], [855, 358, 14, 4, 12, 0], [855, 409, 14, 4, 12, 0], [855, 460, 14, 4, 12, 0], [855, 511, 14, 4, 12, 0], [855, 562, 14, 4, 12, 0], [855, 613, 14, 4, 12, 0], [855, 664, 14, 4, 12, 0], [855, 715, 14, 4, 12, 0], [855, 766, 14, 4, 12, 0]], \"capHeight\": 11, \"widestlogicalchar\": 16, \"widestglyph\": 19, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 12, 8, 11, 2], [1, 105, 13, 3, 11, 2], [1, 156, 13, 7, 11, 2], [1, 206, 14, 10, 11, 1], [1, 258, 14, 8, 11, 2], [1, 309, 12, 8, 11, 2], [1, 360, 11, 3, 11, 2], [1, 411, 13, 10, 11, 2], [1, 462, 12, 10, 11, 2], [1, 513, 14, 6, 11, 2], [1, 566, 12, 5, 11, 4], [1, 622, 9, 2, 11, 9], [1, 670, 12, 1, 11, 6], [1, 724, 8, 1, 11, 9], [1, 768, 13, 8, 11, 2], [62, 3, 14, 8, 11, 2], [62, 54, 12, 8, 11, 2], [62, 105, 14, 8, 11, 2], [62, 156, 14, 8, 11, 2], [62, 207, 13, 8, 11, 2], [62, 258, 14, 8, 11, 2], [62, 309, 13, 8, 11, 2], [62, 360, 14, 8, 11, 2], [62, 411, 14, 8, 11, 2], [62, 462, 14, 8, 11, 2], [62, 515, 11, 6, 11, 4], [62, 566, 11, 7, 11, 4], [62, 617, 13, 5, 11, 4], [62, 669, 13, 3, 11, 5], [62, 719, 12, 5, 11, 4], [62, 768, 14, 8, 11, 2], [123, 3, 14, 9, 11, 2], [123, 54, 12, 8, 11, 2], [123, 105, 14, 8, 11, 2], [123, 156, 14, 8, 11, 2], [123, 207, 13, 8, 11, 2], [123, 258, 14, 8, 11, 2], [123, 309, 14, 8, 11, 2], [123, 360, 14, 8, 11, 2], [123, 411, 15, 8, 11, 2], [123, 462, 14, 8, 11, 2], [123, 513, 14, 8, 11, 2], [123, 564, 14, 8, 11, 2], [123, 615, 12, 8, 11, 2], [123, 666, 15, 8, 11, 2], [123, 717, 15, 8, 11, 2], [123, 768, 13, 8, 11, 2], [184, 3, 14, 8, 11, 2], [184, 54, 13, 9, 11, 2], [184, 105, 14, 8, 11, 2], [184, 156, 14, 8, 11, 2], [184, 207, 15, 8, 11, 2], [184, 258, 15, 8, 11, 2], [184, 309, 15, 8, 11, 2], [184, 360, 15, 8, 11, 2], [184, 411, 15, 8, 11, 2], [184, 462, 15, 8, 11, 2], [184, 513, 14, 8, 11, 2], [184, 564, 12, 10, 11, 2], [184, 615, 10, 8, 11, 2], [184, 666, 12, 10, 11, 2], [184, 717, 13, 3, 11, 2], [184, 777, 11, 1, 11, 11], [245, 3, 12, 2, 11, 2], [245, 56, 12, 6, 11, 4], [245, 105, 13, 8, 11, 2], [245, 158, 13, 6, 11, 4], [245, 207, 13, 8, 11, 2], [245, 260, 13, 6, 11, 4], [245, 309, 13, 8, 11, 2], [245, 362, 13, 8, 11, 4], [245, 411, 13, 8, 11, 2], [245, 462, 12, 8, 11, 2], [245, 513, 13, 10, 11, 2], [245, 564, 13, 8, 11, 2], [245, 615, 12, 8, 11, 2], [245, 668, 13, 6, 11, 4], [245, 719, 13, 6, 11, 4], [245, 770, 13, 6, 11, 4], [306, 5, 13, 8, 11, 4], [306, 56, 14, 8, 11, 4], [306, 107, 13, 6, 11, 4], [306, 158, 13, 6, 11, 4], [306, 207, 12, 8, 11, 2], [306, 260, 13, 6, 11, 4], [306, 311, 14, 6, 11, 4], [306, 362, 14, 6, 11, 4], [306, 413, 13, 6, 11, 4], [306, 464, 14, 8, 11, 4], [306, 515, 13, 6, 11, 4], [306, 564, 13, 10, 11, 2], [306, 615, 12, 10, 11, 2], [306, 666, 12, 10, 11, 2], [306, 720, 13, 2, 11, 5], [306, 768, 14, 8, 11, 2], [367, 1, 12, 10, 11, 0], [367, 52, 15, 10, 11, 0], [367, 105, 14, 10, 11, 2], [367, 154, 14, 10, 11, 0], [367, 205, 15, 10, 11, 0], [367, 256, 13, 10, 11, 0], [367, 307, 15, 10, 11, 0], [367, 360, 12, 8, 11, 2], [367, 411, 12, 8, 11, 2], [367, 461, 12, 9, 11, 1], [367, 513, 12, 8, 11, 2], [367, 563, 14, 9, 11, 1], [367, 614, 12, 9, 11, 1], [367, 668, 13, 8, 11, 4], [367, 717, 13, 8, 11, 2], [367, 768, 13, 8, 11, 2], [428, 2, 13, 9, 11, 1], [428, 54, 13, 8, 11, 2], [428, 104, 13, 9, 11, 1], [428, 155, 12, 9, 11, 1], [428, 206, 13, 9, 11, 1], [428, 258, 13, 8, 11, 2], [428, 308, 15, 9, 11, 1], [428, 359, 14, 9, 11, 1], [428, 410, 13, 9, 11, 1], [428, 461, 13, 9, 11, 1], [428, 513, 13, 8, 11, 2], [428, 563, 15, 9, 11, 1], [428, 614, 14, 9, 11, 1], [428, 665, 13, 9, 11, 1], [428, 716, 13, 9, 11, 1], [428, 768, 13, 8, 11, 2], [489, 3, 13, 10, 11, 2], [489, 54, 13, 4, 11, 2], [489, 106, 13, 7, 11, 3], [489, 156, 13, 8, 11, 2], [489, 206, 14, 11, 11, 1], [489, 260, 12, 5, 11, 4], [489, 309, 14, 10, 11, 2], [489, 360, 14, 8, 11, 2], [489, 411, 15, 8, 13, 2], [489, 462, 15, 8, 13, 2], [489, 513, 18, 5, 15, 2], [489, 564, 12, 2, 11, 2], [489, 615, 13, 1, 11, 2], [489, 668, 13, 5, 11, 4], [489, 717, 15, 8, 11, 2], [489, 768, 14, 8, 11, 2], [550, 6, 14, 3, 13, 5], [550, 56, 12, 6, 11, 4], [550, 107, 13, 6, 11, 4], [550, 158, 12, 6, 11, 4], [550, 207, 15, 8, 11, 2], [550, 260, 12, 8, 11, 4], [550, 309, 13, 8, 10, 2], [550, 360, 15, 9, 13, 2], [550, 411, 17, 9, 14, 2], [550, 464, 13, 6, 11, 4], [550, 513, 11, 10, 7, 2], [550, 564, 13, 7, 11, 2], [550, 615, 13, 7, 11, 2], [550, 666, 15, 8, 13, 2], [550, 719, 14, 6, 11, 4], [550, 770, 13, 6, 11, 4], [611, 5, 11, 8, 11, 4], [611, 56, 11, 8, 11, 4], [611, 109, 14, 3, 13, 6], [611, 156, 14, 8, 11, 2], [611, 207, 14, 10, 11, 2], [611, 261, 13, 4, 11, 5], [611, 309, 12, 8, 11, 2], [611, 363, 13, 5, 11, 5], [611, 414, 12, 5, 11, 5], [611, 469, 11, 1, 11, 9], [611, 511, 1, 1, 11, 1], [611, 562, 12, 10, 11, 0], [611, 613, 14, 10, 11, 0], [611, 664, 13, 10, 11, 0], [611, 717, 15, 8, 11, 2], [611, 770, 14, 6, 11, 4], [672, 7, 11, 1, 11, 6], [672, 58, 12, 1, 11, 6], [672, 105, 13, 2, 11, 2], [672, 156, 13, 2, 11, 2], [672, 207, 12, 2, 11, 2], [672, 258, 12, 2, 11, 2], [672, 311, 12, 5, 11, 4], [672, 360, 12, 8, 10, 2], [672, 411, 14, 10, 11, 2], [1, 1, 1, 1, 11, 1], [794, 766, 12, 2, 11, 0], [672, 565, 14, 6, 11, 3], [672, 618, 11, 5, 11, 5], [672, 669, 11, 5, 11, 5], [672, 717, 13, 8, 11, 2], [672, 768, 13, 8, 11, 2], [733, 3, 13, 10, 11, 2], [733, 58, 9, 1, 11, 6], [733, 112, 9, 2, 11, 9], [733, 163, 10, 2, 11, 9], [733, 206, 14, 8, 11, 1], [733, 256, 14, 10, 11, 0], [733, 307, 14, 10, 11, 0], [733, 358, 13, 10, 11, 0], [733, 409, 14, 10, 11, 0], [733, 460, 14, 10, 11, 0], [733, 511, 14, 10, 11, 0], [733, 562, 14, 10, 11, 0], [733, 613, 14, 10, 11, 0], [733, 664, 14, 10, 11, 0], [733, 715, 13, 10, 11, 0], [733, 766, 14, 10, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 13, 10, 11, 0], [794, 103, 15, 10, 11, 0], [794, 154, 15, 10, 11, 0], [794, 205, 15, 10, 11, 0], [794, 260, 11, 6, 11, 4], [794, 309, 12, 3, 11, 2], [794, 361, 13, 2, 11, 3], [794, 413, 12, 1, 11, 4], [794, 463, 13, 2, 11, 3], [794, 514, 11, 1, 11, 3], [794, 564, 13, 4, 11, 2], [794, 621, 10, 4, 11, 8], [794, 666, 13, 2, 11, 2], [794, 723, 9, 4, 11, 8], [794, 766, 12, 2, 11, 0], [855, 1, 12, 2, 11, 0], [855, 52, 12, 2, 11, 0], [855, 103, 12, 2, 11, 0], [855, 154, 12, 2, 11, 0], [855, 205, 12, 2, 11, 0], [855, 256, 12, 2, 11, 0], [855, 307, 12, 2, 11, 0], [855, 358, 12, 2, 11, 0], [855, 409, 12, 2, 11, 0], [855, 460, 12, 2, 11, 0], [855, 511, 12, 2, 11, 0], [855, 562, 12, 2, 11, 0], [855, 613, 12, 2, 11, 0], [855, 664, 12, 2, 11, 0], [855, 715, 12, 2, 11, 0], [855, 766, 12, 2, 11, 0]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 12, 6, 12, 5], [1, 54, 12, 10, 12, 2], [1, 105, 12, 9, 12, 2], [1, 156, 12, 9, 12, 2], [1, 206, 12, 12, 12, 1], [1, 258, 12, 10, 12, 2], [1, 309, 12, 10, 12, 2], [1, 360, 12, 9, 12, 2], [1, 411, 12, 12, 12, 2], [1, 462, 12, 12, 12, 2], [1, 513, 12, 9, 12, 2], [1, 566, 12, 7, 12, 4], [1, 618, 12, 8, 12, 5], [1, 669, 12, 6, 12, 5], [1, 720, 12, 7, 12, 5], [1, 768, 12, 10, 12, 2], [62, 3, 12, 10, 12, 2], [62, 54, 12, 10, 12, 2], [62, 105, 12, 10, 12, 2], [62, 156, 12, 10, 12, 2], [62, 207, 12, 10, 12, 2], [62, 258, 12, 10, 12, 2], [62, 309, 12, 10, 12, 2], [62, 360, 12, 10, 12, 2], [62, 411, 12, 10, 12, 2], [62, 462, 12, 10, 12, 2], [62, 515, 12, 8, 12, 4], [62, 566, 12, 9, 12, 4], [62, 617, 12, 7, 12, 4], [62, 669, 12, 6, 12, 5], [62, 719, 12, 7, 12, 4], [62, 768, 12, 10, 12, 2], [123, 3, 12, 11, 12, 2], [123, 54, 12, 10, 12, 2], [123, 105, 12, 10, 12, 2], [123, 156, 12, 10, 12, 2], [123, 207, 12, 10, 12, 2], [123, 258, 12, 10, 12, 2], [123, 309, 12, 10, 12, 2], [123, 360, 12, 10, 12, 2], [123, 411, 12, 10, 12, 2], [123, 462, 12, 10, 12, 2], [123, 513, 12, 10, 12, 2], [123, 564, 12, 10, 12, 2], [123, 615, 12, 10, 12, 2], [123, 666, 12, 10, 12, 2], [123, 717, 12, 10, 12, 2], [123, 768, 12, 10, 12, 2], [184, 3, 12, 10, 12, 2], [184, 54, 12, 11, 12, 2], [184, 105, 12, 10, 12, 2], [184, 156, 12, 10, 12, 2], [184, 207, 12, 10, 12, 2], [184, 258, 12, 10, 12, 2], [184, 309, 12, 10, 12, 2], [184, 360, 12, 10, 12, 2], [184, 411, 12, 10, 12, 2], [184, 462, 12, 10, 12, 2], [184, 513, 12, 10, 12, 2], [184, 564, 12, 12, 12, 2], [184, 615, 12, 10, 12, 2], [184, 666, 12, 12, 12, 2], [184, 717, 12, 9, 12, 2], [184, 771, 12, 9, 12, 5], [245, 3, 12, 9, 12, 2], [245, 56, 12, 8, 12, 4], [245, 105, 12, 10, 12, 2], [245, 158, 12, 8, 12, 4], [245, 207, 12, 10, 12, 2], [245, 260, 12, 8, 12, 4], [245, 309, 12, 10, 12, 2], [245, 362, 12, 10, 12, 4], [245, 411, 12, 10, 12, 2], [245, 462, 12, 10, 12, 2], [245, 513, 12, 12, 12, 2], [245, 564, 12, 10, 12, 2], [245, 615, 12, 10, 12, 2], [245, 668, 12, 8, 12, 4], [245, 719, 12, 8, 12, 4], [245, 770, 12, 8, 12, 4], [306, 5, 12, 10, 12, 4], [306, 56, 12, 10, 12, 4], [306, 107, 12, 8, 12, 4], [306, 158, 12, 8, 12, 4], [306, 207, 12, 10, 12, 2], [306, 260, 12, 8, 12, 4], [306, 311, 12, 8, 12, 4], [306, 362, 12, 8, 12, 4], [306, 413, 12, 8, 12, 4], [306, 464, 12, 10, 12, 4], [306, 515, 12, 8, 12, 4], [306, 564, 12, 12, 12, 2], [306, 615, 12, 12, 12, 2], [306, 666, 12, 12, 12, 2], [306, 720, 12, 6, 12, 5], [306, 768, 12, 10, 12, 2], [367, 1, 12, 12, 12, 0], [367, 52, 12, 12, 12, 0], [367, 105, 12, 12, 12, 2], [367, 154, 12, 12, 12, 0], [367, 205, 12, 12, 12, 0], [367, 256, 12, 12, 12, 0], [367, 307, 12, 12, 12, 0], [367, 360, 12, 10, 12, 2], [367, 411, 12, 10, 12, 2], [367, 461, 12, 11, 12, 1], [367, 513, 12, 10, 12, 2], [367, 563, 12, 11, 12, 1], [367, 614, 12, 11, 12, 1], [367, 668, 12, 10, 12, 4], [367, 717, 12, 10, 12, 2], [367, 768, 12, 10, 12, 2], [428, 2, 12, 11, 12, 1], [428, 54, 12, 10, 12, 2], [428, 104, 12, 11, 12, 1], [428, 155, 12, 11, 12, 1], [428, 206, 12, 11, 12, 1], [428, 258, 12, 10, 12, 2], [428, 308, 12, 11, 12, 1], [428, 359, 12, 11, 12, 1], [428, 410, 12, 11, 12, 1], [428, 461, 12, 11, 12, 1], [428, 513, 12, 10, 12, 2], [428, 563, 12, 11, 12, 1], [428, 614, 12, 11, 12, 1], [428, 665, 12, 11, 12, 1], [428, 716, 12, 11, 12, 1], [428, 768, 12, 10, 12, 2], [489, 3, 12, 12, 12, 2], [489, 54, 12, 9, 12, 2], [489, 106, 12, 9, 12, 3], [489, 156, 12, 10, 12, 2], [489, 206, 12, 13, 12, 1], [489, 260, 12, 7, 12, 4], [489, 309, 12, 12, 12, 2], [489, 360, 12, 10, 12, 2], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 513, 16, 9, 16, 2], [489, 564, 12, 9, 12, 2], [489, 615, 12, 9, 12, 2], [489, 668, 12, 7, 12, 4], [489, 717, 12, 10, 12, 2], [489, 768, 12, 10, 12, 2], [550, 6, 14, 6, 14, 5], [550, 56, 12, 8, 12, 4], [550, 107, 12, 8, 12, 4], [550, 158, 12, 8, 12, 4], [550, 207, 12, 10, 12, 2], [550, 260, 12, 10, 12, 4], [550, 309, 11, 10, 11, 2], [550, 360, 14, 11, 14, 2], [550, 411, 15, 11, 15, 2], [550, 464, 12, 8, 12, 4], [550, 513, 8, 12, 8, 2], [550, 564, 12, 9, 12, 2], [550, 615, 12, 9, 12, 2], [550, 666, 14, 10, 14, 2], [550, 719, 12, 8, 12, 4], [550, 770, 12, 8, 12, 4], [611, 5, 12, 10, 12, 4], [611, 56, 12, 10, 12, 4], [611, 108, 14, 6, 14, 5], [611, 156, 12, 10, 12, 2], [611, 207, 12, 12, 12, 2], [611, 261, 12, 6, 12, 5], [611, 309, 12, 10, 12, 2], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 465, 12, 7, 12, 5], [611, 516, 12, 6, 12, 5], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 12, 12, 12, 0], [611, 717, 12, 10, 12, 2], [611, 770, 12, 8, 12, 4], [672, 6, 12, 6, 12, 5], [672, 57, 12, 6, 12, 5], [672, 105, 12, 9, 12, 2], [672, 156, 12, 9, 12, 2], [672, 207, 12, 9, 12, 2], [672, 258, 12, 9, 12, 2], [672, 311, 12, 7, 12, 4], [672, 360, 11, 10, 11, 2], [672, 411, 12, 12, 12, 2], [1, 6, 12, 6, 12, 5], [794, 766, 12, 11, 12, 0], [672, 565, 12, 8, 12, 3], [672, 618, 12, 7, 12, 5], [672, 669, 12, 7, 12, 5], [672, 717, 12, 10, 12, 2], [672, 768, 12, 10, 12, 2], [733, 3, 12, 12, 12, 2], [733, 57, 12, 6, 12, 5], [733, 108, 12, 8, 12, 5], [733, 159, 12, 8, 12, 5], [733, 206, 12, 10, 12, 1], [733, 256, 12, 12, 12, 0], [733, 307, 12, 12, 12, 0], [733, 358, 12, 12, 12, 0], [733, 409, 12, 12, 12, 0], [733, 460, 12, 12, 12, 0], [733, 511, 12, 12, 12, 0], [733, 562, 12, 12, 12, 0], [733, 613, 12, 12, 12, 0], [733, 664, 12, 12, 12, 0], [733, 715, 12, 12, 12, 0], [733, 766, 12, 12, 12, 0], [1, 6, 12, 6, 12, 5], [794, 52, 12, 12, 12, 0], [794, 103, 12, 12, 12, 0], [794, 154, 12, 12, 12, 0], [794, 205, 12, 12, 12, 0], [794, 260, 12, 8, 12, 4], [794, 309, 12, 9, 12, 2], [794, 361, 12, 8, 12, 3], [794, 413, 12, 7, 12, 4], [794, 463, 12, 8, 12, 3], [794, 514, 12, 8, 12, 3], [794, 564, 12, 9, 12, 2], [794, 618, 12, 9, 12, 5], [794, 666, 12, 9, 12, 2], [794, 720, 12, 9, 12, 5], [794, 766, 12, 11, 12, 0], [855, 1, 12, 11, 12, 0], [855, 52, 12, 11, 12, 0], [855, 103, 12, 11, 12, 0], [855, 154, 12, 11, 12, 0], [855, 205, 12, 11, 12, 0], [855, 256, 12, 11, 12, 0], [855, 307, 12, 11, 12, 0], [855, 358, 12, 11, 12, 0], [855, 409, 12, 11, 12, 0], [855, 460, 12, 11, 12, 0], [855, 511, 12, 11, 12, 0], [855, 562, 12, 11, 12, 0], [855, 613, 12, 11, 12, 0], [855, 664, 12, 11, 12, 0], [855, 715, 12, 11, 12, 0], [855, 766, 12, 11, 12, 0]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 11, 6, 11, 4], [1, 54, 11, 8, 11, 2], [1, 105, 11, 8, 11, 2], [1, 156, 11, 8, 11, 2], [1, 206, 11, 10, 11, 1], [1, 258, 11, 8, 11, 2], [1, 309, 11, 8, 11, 2], [1, 360, 11, 8, 11, 2], [1, 411, 11, 10, 11, 2], [1, 462, 11, 10, 11, 2], [1, 513, 11, 8, 11, 2], [1, 566, 11, 6, 11, 4], [1, 617, 11, 7, 11, 4], [1, 668, 11, 6, 11, 4], [1, 719, 11, 6, 11, 4], [1, 768, 11, 8, 11, 2], [62, 3, 11, 8, 11, 2], [62, 54, 11, 8, 11, 2], [62, 105, 11, 8, 11, 2], [62, 156, 11, 8, 11, 2], [62, 207, 11, 8, 11, 2], [62, 258, 11, 8, 11, 2], [62, 309, 11, 8, 11, 2], [62, 360, 11, 8, 11, 2], [62, 411, 11, 8, 11, 2], [62, 462, 11, 8, 11, 2], [62, 515, 11, 6, 11, 4], [62, 566, 11, 7, 11, 4], [62, 617, 11, 6, 11, 4], [62, 668, 11, 6, 11, 4], [62, 719, 11, 6, 11, 4], [62, 768, 11, 8, 11, 2], [123, 3, 11, 9, 11, 2], [123, 54, 11, 8, 11, 2], [123, 105, 11, 8, 11, 2], [123, 156, 11, 8, 11, 2], [123, 207, 11, 8, 11, 2], [123, 258, 11, 8, 11, 2], [123, 309, 11, 8, 11, 2], [123, 360, 11, 8, 11, 2], [123, 411, 11, 8, 11, 2], [123, 462, 11, 8, 11, 2], [123, 513, 11, 8, 11, 2], [123, 564, 11, 8, 11, 2], [123, 615, 11, 8, 11, 2], [123, 666, 11, 8, 11, 2], [123, 717, 11, 8, 11, 2], [123, 768, 11, 8, 11, 2], [184, 3, 11, 8, 11, 2], [184, 54, 11, 9, 11, 2], [184, 105, 11, 8, 11, 2], [184, 156, 11, 8, 11, 2], [184, 207, 11, 8, 11, 2], [184, 258, 11, 8, 11, 2], [184, 309, 11, 8, 11, 2], [184, 360, 11, 8, 11, 2], [184, 411, 11, 8, 11, 2], [184, 462, 11, 8, 11, 2], [184, 513, 11, 8, 11, 2], [184, 564, 11, 10, 11, 2], [184, 615, 11, 8, 11, 2], [184, 666, 11, 10, 11, 2], [184, 717, 11, 8, 11, 2], [184, 770, 11, 8, 11, 4], [245, 3, 11, 8, 11, 2], [245, 56, 11, 6, 11, 4], [245, 105, 11, 8, 11, 2], [245, 158, 11, 6, 11, 4], [245, 207, 11, 8, 11, 2], [245, 260, 11, 6, 11, 4], [245, 309, 11, 8, 11, 2], [245, 362, 11, 8, 11, 4], [245, 411, 11, 8, 11, 2], [245, 462, 11, 8, 11, 2], [245, 513, 11, 10, 11, 2], [245, 564, 11, 8, 11, 2], [245, 615, 11, 8, 11, 2], [245, 668, 11, 6, 11, 4], [245, 719, 11, 6, 11, 4], [245, 770, 11, 6, 11, 4], [306, 5, 11, 8, 11, 4], [306, 56, 11, 8, 11, 4], [306, 107, 11, 6, 11, 4], [306, 158, 11, 6, 11, 4], [306, 207, 11, 8, 11, 2], [306, 260, 11, 6, 11, 4], [306, 311, 11, 6, 11, 4], [306, 362, 11, 6, 11, 4], [306, 413, 11, 6, 11, 4], [306, 464, 11, 8, 11, 4], [306, 515, 11, 6, 11, 4], [306, 564, 11, 10, 11, 2], [306, 615, 11, 10, 11, 2], [306, 666, 11, 10, 11, 2], [306, 719, 11, 6, 11, 4], [306, 768, 11, 8, 11, 2], [367, 1, 11, 10, 11, 0], [367, 52, 11, 10, 11, 0], [367, 105, 11, 10, 11, 2], [367, 154, 11, 10, 11, 0], [367, 205, 11, 10, 11, 0], [367, 256, 11, 10, 11, 0], [367, 307, 11, 10, 11, 0], [367, 360, 11, 8, 11, 2], [367, 411, 11, 8, 11, 2], [367, 461, 11, 9, 11, 1], [367, 513, 11, 8, 11, 2], [367, 563, 11, 9, 11, 1], [367, 614, 11, 9, 11, 1], [367, 668, 11, 8, 11, 4], [367, 717, 11, 8, 11, 2], [367, 768, 11, 8, 11, 2], [428, 2, 11, 9, 11, 1], [428, 54, 11, 8, 11, 2], [428, 104, 11, 9, 11, 1], [428, 155, 11, 9, 11, 1], [428, 206, 11, 9, 11, 1], [428, 258, 11, 8, 11, 2], [428, 308, 11, 9, 11, 1], [428, 359, 11, 9, 11, 1], [428, 410, 11, 9, 11, 1], [428, 461, 11, 9, 11, 1], [428, 513, 11, 8, 11, 2], [428, 563, 11, 9, 11, 1], [428, 614, 11, 9, 11, 1], [428, 665, 11, 9, 11, 1], [428, 716, 11, 9, 11, 1], [428, 768, 11, 8, 11, 2], [489, 3, 11, 10, 11, 2], [489, 54, 11, 8, 11, 2], [489, 106, 11, 7, 11, 3], [489, 156, 11, 8, 11, 2], [489, 206, 11, 11, 11, 1], [489, 260, 11, 6, 11, 4], [489, 309, 11, 10, 11, 2], [489, 360, 11, 8, 11, 2], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 513, 15, 8, 15, 2], [489, 564, 11, 8, 11, 2], [489, 615, 11, 8, 11, 2], [489, 668, 11, 6, 11, 4], [489, 717, 11, 8, 11, 2], [489, 768, 11, 8, 11, 2], [550, 5, 13, 6, 13, 4], [550, 56, 11, 6, 11, 4], [550, 107, 11, 6, 11, 4], [550, 158, 11, 6, 11, 4], [550, 207, 11, 8, 11, 2], [550, 260, 11, 8, 11, 4], [550, 309, 10, 8, 10, 2], [550, 360, 13, 9, 13, 2], [550, 411, 14, 9, 14, 2], [550, 464, 11, 6, 11, 4], [550, 513, 7, 10, 7, 2], [550, 564, 11, 8, 11, 2], [550, 615, 11, 8, 11, 2], [550, 666, 13, 8, 13, 2], [550, 719, 11, 6, 11, 4], [550, 770, 11, 6, 11, 4], [611, 5, 11, 8, 11, 4], [611, 56, 11, 8, 11, 4], [611, 107, 13, 6, 13, 4], [611, 156, 11, 8, 11, 2], [611, 207, 11, 10, 11, 2], [611, 260, 11, 6, 11, 4], [611, 309, 11, 8, 11, 2], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 11, 6, 11, 4], [611, 515, 11, 6, 11, 4], [611, 562, 11, 10, 11, 0], [611, 613, 11, 10, 11, 0], [611, 664, 11, 10, 11, 0], [611, 717, 11, 8, 11, 2], [611, 770, 11, 6, 11, 4], [672, 5, 11, 6, 11, 4], [672, 56, 11, 6, 11, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 11, 8, 11, 2], [672, 258, 11, 8, 11, 2], [672, 311, 11, 6, 11, 4], [672, 360, 10, 8, 10, 2], [672, 411, 11, 10, 11, 2], [1, 5, 11, 6, 11, 4], [794, 766, 11, 10, 11, 0], [672, 565, 11, 7, 11, 3], [672, 617, 11, 6, 11, 4], [672, 668, 11, 6, 11, 4], [672, 717, 11, 8, 11, 2], [672, 768, 11, 8, 11, 2], [733, 3, 11, 10, 11, 2], [733, 56, 11, 6, 11, 4], [733, 107, 11, 7, 11, 4], [733, 158, 11, 7, 11, 4], [733, 206, 11, 9, 11, 1], [733, 256, 11, 10, 11, 0], [733, 307, 11, 10, 11, 0], [733, 358, 11, 10, 11, 0], [733, 409, 11, 10, 11, 0], [733, 460, 11, 10, 11, 0], [733, 511, 11, 10, 11, 0], [733, 562, 11, 10, 11, 0], [733, 613, 11, 10, 11, 0], [733, 664, 11, 10, 11, 0], [733, 715, 11, 10, 11, 0], [733, 766, 11, 10, 11, 0], [1, 5, 11, 6, 11, 4], [794, 52, 11, 10, 11, 0], [794, 103, 11, 10, 11, 0], [794, 154, 11, 10, 11, 0], [794, 205, 11, 10, 11, 0], [794, 260, 11, 6, 11, 4], [794, 309, 11, 8, 11, 2], [794, 361, 11, 7, 11, 3], [794, 413, 11, 6, 11, 4], [794, 463, 11, 7, 11, 3], [794, 514, 11, 7, 11, 3], [794, 564, 11, 8, 11, 2], [794, 617, 11, 8, 11, 4], [794, 666, 11, 8, 11, 2], [794, 719, 11, 8, 11, 4], [794, 766, 11, 10, 11, 0], [855, 1, 11, 10, 11, 0], [855, 52, 11, 10, 11, 0], [855, 103, 11, 10, 11, 0], [855, 154, 11, 10, 11, 0], [855, 205, 11, 10, 11, 0], [855, 256, 11, 10, 11, 0], [855, 307, 11, 10, 11, 0], [855, 358, 11, 10, 11, 0], [855, 409, 11, 10, 11, 0], [855, 460, 11, 10, 11, 0], [855, 511, 11, 10, 11, 0], [855, 562, 11, 10, 11, 0], [855, 613, 11, 10, 11, 0], [855, 664, 11, 10, 11, 0], [855, 715, 11, 10, 11, 0], [855, 766, 11, 10, 11, 0]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 12, 10, 11, 2], [1, 105, 13, 5, 11, 2], [1, 156, 13, 9, 11, 2], [1, 206, 14, 12, 11, 1], [1, 258, 14, 10, 11, 2], [1, 309, 12, 10, 11, 2], [1, 360, 11, 5, 11, 2], [1, 411, 13, 12, 11, 2], [1, 462, 12, 12, 11, 2], [1, 513, 14, 8, 11, 2], [1, 566, 12, 7, 11, 4], [1, 622, 9, 4, 11, 9], [1, 670, 12, 3, 11, 6], [1, 724, 8, 3, 11, 9], [1, 768, 13, 10, 11, 2], [62, 3, 14, 10, 11, 2], [62, 54, 12, 10, 11, 2], [62, 105, 14, 10, 11, 2], [62, 156, 14, 10, 11, 2], [62, 207, 13, 10, 11, 2], [62, 258, 14, 10, 11, 2], [62, 309, 13, 10, 11, 2], [62, 360, 14, 10, 11, 2], [62, 411, 14, 10, 11, 2], [62, 462, 14, 10, 11, 2], [62, 515, 11, 8, 11, 4], [62, 566, 11, 9, 11, 4], [62, 617, 13, 7, 11, 4], [62, 669, 13, 5, 11, 5], [62, 719, 12, 7, 11, 4], [62, 768, 14, 10, 11, 2], [123, 3, 14, 11, 11, 2], [123, 54, 12, 10, 11, 2], [123, 105, 14, 10, 11, 2], [123, 156, 14, 10, 11, 2], [123, 207, 13, 10, 11, 2], [123, 258, 14, 10, 11, 2], [123, 309, 14, 10, 11, 2], [123, 360, 14, 10, 11, 2], [123, 411, 15, 10, 11, 2], [123, 462, 14, 10, 11, 2], [123, 513, 14, 10, 11, 2], [123, 564, 14, 10, 11, 2], [123, 615, 12, 10, 11, 2], [123, 666, 15, 10, 11, 2], [123, 717, 15, 10, 11, 2], [123, 768, 13, 10, 11, 2], [184, 3, 14, 10, 11, 2], [184, 54, 13, 11, 11, 2], [184, 105, 14, 10, 11, 2], [184, 156, 14, 10, 11, 2], [184, 207, 15, 10, 11, 2], [184, 258, 15, 10, 11, 2], [184, 309, 15, 10, 11, 2], [184, 360, 15, 10, 11, 2], [184, 411, 15, 10, 11, 2], [184, 462, 15, 10, 11, 2], [184, 513, 14, 10, 11, 2], [184, 564, 12, 12, 11, 2], [184, 615, 10, 10, 11, 2], [184, 666, 12, 12, 11, 2], [184, 717, 13, 5, 11, 2], [184, 777, 11, 3, 11, 11], [245, 3, 12, 4, 11, 2], [245, 56, 12, 8, 11, 4], [245, 105, 13, 10, 11, 2], [245, 158, 13, 8, 11, 4], [245, 207, 13, 10, 11, 2], [245, 260, 13, 8, 11, 4], [245, 309, 13, 10, 11, 2], [245, 362, 13, 10, 11, 4], [245, 411, 13, 10, 11, 2], [245, 462, 12, 10, 11, 2], [245, 513, 13, 12, 11, 2], [245, 564, 13, 10, 11, 2], [245, 615, 12, 10, 11, 2], [245, 668, 13, 8, 11, 4], [245, 719, 13, 8, 11, 4], [245, 770, 13, 8, 11, 4], [306, 5, 13, 10, 11, 4], [306, 56, 14, 10, 11, 4], [306, 107, 13, 8, 11, 4], [306, 158, 13, 8, 11, 4], [306, 207, 12, 10, 11, 2], [306, 260, 13, 8, 11, 4], [306, 311, 14, 8, 11, 4], [306, 362, 14, 8, 11, 4], [306, 413, 13, 8, 11, 4], [306, 464, 14, 10, 11, 4], [306, 515, 13, 8, 11, 4], [306, 564, 13, 12, 11, 2], [306, 615, 12, 12, 11, 2], [306, 666, 12, 12, 11, 2], [306, 720, 13, 4, 11, 5], [306, 768, 14, 10, 11, 2], [367, 1, 14, 12, 11, 0], [367, 52, 15, 12, 11, 0], [367, 105, 14, 12, 11, 2], [367, 154, 14, 12, 11, 0], [367, 205, 15, 12, 11, 0], [367, 256, 14, 12, 11, 0], [367, 307, 15, 12, 11, 0], [367, 360, 12, 10, 11, 2], [367, 411, 12, 10, 11, 2], [367, 461, 12, 11, 11, 1], [367, 513, 12, 10, 11, 2], [367, 563, 14, 11, 11, 1], [367, 614, 12, 11, 11, 1], [367, 668, 13, 10, 11, 4], [367, 717, 13, 10, 11, 2], [367, 768, 13, 10, 11, 2], [428, 2, 13, 11, 11, 1], [428, 54, 13, 10, 11, 2], [428, 104, 13, 11, 11, 1], [428, 155, 12, 11, 11, 1], [428, 206, 13, 11, 11, 1], [428, 258, 13, 10, 11, 2], [428, 308, 15, 11, 11, 1], [428, 359, 14, 11, 11, 1], [428, 410, 13, 11, 11, 1], [428, 461, 13, 11, 11, 1], [428, 513, 13, 10, 11, 2], [428, 563, 15, 11, 11, 1], [428, 614, 14, 11, 11, 1], [428, 665, 13, 11, 11, 1], [428, 716, 13, 11, 11, 1], [428, 768, 13, 10, 11, 2], [489, 3, 13, 12, 11, 2], [489, 54, 13, 6, 11, 2], [489, 106, 13, 9, 11, 3], [489, 156, 13, 10, 11, 2], [489, 206, 14, 13, 11, 1], [489, 260, 12, 7, 11, 4], [489, 309, 14, 12, 11, 2], [489, 360, 14, 10, 11, 2], [489, 411, 15, 10, 13, 2], [489, 462, 15, 10, 13, 2], [489, 513, 18, 7, 15, 2], [489, 564, 12, 4, 11, 2], [489, 615, 13, 3, 11, 2], [489, 668, 13, 7, 11, 4], [489, 717, 15, 10, 11, 2], [489, 768, 14, 10, 11, 2], [550, 6, 14, 5, 13, 5], [550, 56, 12, 8, 11, 4], [550, 107, 13, 8, 11, 4], [550, 158, 12, 8, 11, 4], [550, 207, 15, 10, 11, 2], [550, 260, 12, 10, 11, 4], [550, 309, 13, 10, 10, 2], [550, 360, 15, 11, 13, 2], [550, 411, 17, 11, 14, 2], [550, 464, 13, 8, 11, 4], [550, 513, 11, 12, 7, 2], [550, 564, 13, 9, 11, 2], [550, 615, 13, 9, 11, 2], [550, 666, 15, 10, 13, 2], [550, 719, 14, 8, 11, 4], [550, 770, 13, 8, 11, 4], [611, 5, 11, 10, 11, 4], [611, 56, 11, 10, 11, 4], [611, 109, 14, 5, 13, 6], [611, 156, 14, 10, 11, 2], [611, 207, 14, 12, 11, 2], [611, 261, 13, 6, 11, 5], [611, 309, 12, 10, 11, 2], [611, 363, 13, 7, 11, 5], [611, 414, 12, 7, 11, 5], [611, 469, 11, 3, 11, 9], [611, 511, 1, 1, 11, 1], [611, 562, 12, 12, 11, 0], [611, 613, 15, 12, 11, 0], [611, 664, 14, 12, 11, 0], [611, 717, 15, 10, 11, 2], [611, 770, 14, 8, 11, 4], [672, 7, 11, 3, 11, 6], [672, 58, 12, 3, 11, 6], [672, 105, 13, 4, 11, 2], [672, 156, 13, 4, 11, 2], [672, 207, 12, 4, 11, 2], [672, 258, 12, 4, 11, 2], [672, 311, 12, 7, 11, 4], [672, 360, 12, 10, 10, 2], [672, 411, 14, 12, 11, 2], [1, 1, 1, 1, 11, 1], [794, 766, 13, 4, 11, 0], [672, 565, 14, 8, 11, 3], [672, 618, 11, 7, 11, 5], [672, 669, 11, 7, 11, 5], [672, 717, 13, 10, 11, 2], [672, 768, 13, 10, 11, 2], [733, 3, 13, 12, 11, 2], [733, 58, 9, 3, 11, 6], [733, 112, 9, 4, 11, 9], [733, 163, 10, 4, 11, 9], [733, 206, 14, 10, 11, 1], [733, 256, 14, 12, 11, 0], [733, 307, 14, 12, 11, 0], [733, 358, 14, 12, 11, 0], [733, 409, 14, 12, 11, 0], [733, 460, 14, 12, 11, 0], [733, 511, 14, 12, 11, 0], [733, 562, 14, 12, 11, 0], [733, 613, 14, 12, 11, 0], [733, 664, 14, 12, 11, 0], [733, 715, 13, 12, 11, 0], [733, 766, 14, 12, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 13, 12, 11, 0], [794, 103, 15, 12, 11, 0], [794, 154, 15, 12, 11, 0], [794, 205, 15, 12, 11, 0], [794, 260, 11, 8, 11, 4], [794, 309, 12, 5, 11, 2], [794, 361, 13, 4, 11, 3], [794, 413, 12, 3, 11, 4], [794, 463, 13, 4, 11, 3], [794, 514, 11, 3, 11, 3], [794, 564, 13, 6, 11, 2], [794, 621, 10, 6, 11, 8], [794, 666, 13, 4, 11, 2], [794, 723, 9, 6, 11, 8], [794, 766, 13, 4, 11, 0], [855, 1, 13, 4, 11, 0], [855, 52, 13, 4, 11, 0], [855, 103, 13, 4, 11, 0], [855, 154, 13, 4, 11, 0], [855, 205, 13, 4, 11, 0], [855, 256, 13, 4, 11, 0], [855, 307, 13, 4, 11, 0], [855, 358, 13, 4, 11, 0], [855, 409, 13, 4, 11, 0], [855, 460, 13, 4, 11, 0], [855, 511, 13, 4, 11, 0], [855, 562, 13, 4, 11, 0], [855, 613, 13, 4, 11, 0], [855, 664, 13, 4, 11, 0], [855, 715, 13, 4, 11, 0], [855, 766, 13, 4, 11, 0]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 8, 10, 2], [1, 105, 12, 3, 10, 2], [1, 156, 12, 7, 10, 2], [1, 206, 13, 10, 10, 1], [1, 258, 13, 8, 10, 2], [1, 309, 11, 8, 10, 2], [1, 360, 10, 3, 10, 2], [1, 411, 12, 10, 10, 2], [1, 462, 11, 10, 10, 2], [1, 513, 13, 6, 10, 2], [1, 566, 11, 5, 10, 4], [1, 622, 8, 2, 10, 9], [1, 670, 11, 1, 10, 6], [1, 724, 7, 1, 10, 9], [1, 768, 12, 8, 10, 2], [62, 3, 13, 8, 10, 2], [62, 54, 11, 8, 10, 2], [62, 105, 13, 8, 10, 2], [62, 156, 13, 8, 10, 2], [62, 207, 12, 8, 10, 2], [62, 258, 13, 8, 10, 2], [62, 309, 12, 8, 10, 2], [62, 360, 13, 8, 10, 2], [62, 411, 13, 8, 10, 2], [62, 462, 13, 8, 10, 2], [62, 515, 10, 6, 10, 4], [62, 566, 10, 7, 10, 4], [62, 617, 12, 5, 10, 4], [62, 669, 12, 3, 10, 5], [62, 719, 11, 5, 10, 4], [62, 768, 13, 8, 10, 2], [123, 3, 13, 9, 10, 2], [123, 54, 11, 8, 10, 2], [123, 105, 13, 8, 10, 2], [123, 156, 13, 8, 10, 2], [123, 207, 12, 8, 10, 2], [123, 258, 13, 8, 10, 2], [123, 309, 13, 8, 10, 2], [123, 360, 13, 8, 10, 2], [123, 411, 14, 8, 10, 2], [123, 462, 13, 8, 10, 2], [123, 513, 13, 8, 10, 2], [123, 564, 13, 8, 10, 2], [123, 615, 11, 8, 10, 2], [123, 666, 14, 8, 10, 2], [123, 717, 14, 8, 10, 2], [123, 768, 12, 8, 10, 2], [184, 3, 13, 8, 10, 2], [184, 54, 12, 9, 10, 2], [184, 105, 13, 8, 10, 2], [184, 156, 13, 8, 10, 2], [184, 207, 14, 8, 10, 2], [184, 258, 14, 8, 10, 2], [184, 309, 14, 8, 10, 2], [184, 360, 14, 8, 10, 2], [184, 411, 14, 8, 10, 2], [184, 462, 14, 8, 10, 2], [184, 513, 13, 8, 10, 2], [184, 564, 11, 10, 10, 2], [184, 615, 9, 8, 10, 2], [184, 666, 11, 10, 10, 2], [184, 717, 12, 3, 10, 2], [184, 777, 10, 1, 10, 11], [245, 3, 11, 2, 10, 2], [245, 56, 11, 6, 10, 4], [245, 105, 12, 8, 10, 2], [245, 158, 12, 6, 10, 4], [245, 207, 12, 8, 10, 2], [245, 260, 12, 6, 10, 4], [245, 309, 12, 8, 10, 2], [245, 362, 12, 8, 10, 4], [245, 411, 12, 8, 10, 2], [245, 462, 11, 8, 10, 2], [245, 513, 12, 10, 10, 2], [245, 564, 12, 8, 10, 2], [245, 615, 11, 8, 10, 2], [245, 668, 12, 6, 10, 4], [245, 719, 12, 6, 10, 4], [245, 770, 12, 6, 10, 4], [306, 5, 12, 8, 10, 4], [306, 56, 13, 8, 10, 4], [306, 107, 12, 6, 10, 4], [306, 158, 12, 6, 10, 4], [306, 207, 11, 8, 10, 2], [306, 260, 12, 6, 10, 4], [306, 311, 13, 6, 10, 4], [306, 362, 13, 6, 10, 4], [306, 413, 12, 6, 10, 4], [306, 464, 13, 8, 10, 4], [306, 515, 12, 6, 10, 4], [306, 564, 12, 10, 10, 2], [306, 615, 11, 10, 10, 2], [306, 666, 11, 10, 10, 2], [306, 720, 12, 2, 10, 5], [306, 768, 13, 8, 10, 2], [367, 1, 11, 10, 10, 0], [367, 52, 14, 10, 10, 0], [367, 105, 13, 10, 10, 2], [367, 154, 13, 10, 10, 0], [367, 205, 14, 10, 10, 0], [367, 256, 12, 10, 10, 0], [367, 307, 14, 10, 10, 0], [367, 360, 11, 8, 10, 2], [367, 411, 11, 8, 10, 2], [367, 461, 11, 9, 10, 1], [367, 513, 11, 8, 10, 2], [367, 563, 13, 9, 10, 1], [367, 614, 11, 9, 10, 1], [367, 668, 12, 8, 10, 4], [367, 717, 12, 8, 10, 2], [367, 768, 12, 8, 10, 2], [428, 2, 12, 9, 10, 1], [428, 54, 12, 8, 10, 2], [428, 104, 12, 9, 10, 1], [428, 155, 11, 9, 10, 1], [428, 206, 12, 9, 10, 1], [428, 258, 12, 8, 10, 2], [428, 308, 14, 9, 10, 1], [428, 359, 13, 9, 10, 1], [428, 410, 12, 9, 10, 1], [428, 461, 12, 9, 10, 1], [428, 513, 12, 8, 10, 2], [428, 563, 14, 9, 10, 1], [428, 614, 13, 9, 10, 1], [428, 665, 12, 9, 10, 1], [428, 716, 12, 9, 10, 1], [428, 768, 12, 8, 10, 2], [489, 3, 12, 10, 10, 2], [489, 54, 12, 4, 10, 2], [489, 106, 12, 7, 10, 3], [489, 156, 12, 8, 10, 2], [489, 206, 13, 11, 10, 1], [489, 260, 11, 5, 10, 4], [489, 309, 13, 10, 10, 2], [489, 360, 13, 8, 10, 2], [489, 411, 14, 8, 12, 2], [489, 462, 14, 8, 12, 2], [489, 513, 17, 5, 14, 2], [489, 564, 11, 2, 10, 2], [489, 615, 12, 1, 10, 2], [489, 668, 12, 5, 10, 4], [489, 717, 14, 8, 10, 2], [489, 768, 13, 8, 10, 2], [550, 6, 13, 3, 12, 5], [550, 56, 11, 6, 10, 4], [550, 107, 12, 6, 10, 4], [550, 158, 11, 6, 10, 4], [550, 207, 14, 8, 10, 2], [550, 260, 11, 8, 10, 4], [550, 309, 12, 8, 9, 2], [550, 360, 14, 9, 12, 2], [550, 411, 16, 9, 13, 2], [550, 464, 12, 6, 10, 4], [550, 513, 10, 10, 6, 2], [550, 564, 12, 7, 10, 2], [550, 615, 12, 7, 10, 2], [550, 666, 14, 8, 12, 2], [550, 719, 13, 6, 10, 4], [550, 770, 12, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 109, 13, 3, 12, 6], [611, 156, 13, 8, 10, 2], [611, 207, 13, 10, 10, 2], [611, 261, 12, 4, 10, 5], [611, 309, 11, 8, 10, 2], [611, 363, 12, 5, 10, 5], [611, 414, 11, 5, 10, 5], [611, 469, 10, 1, 10, 9], [611, 511, 1, 1, 10, 1], [611, 562, 11, 10, 10, 0], [611, 613, 13, 10, 10, 0], [611, 664, 12, 10, 10, 0], [611, 717, 14, 8, 10, 2], [611, 770, 13, 6, 10, 4], [672, 7, 10, 1, 10, 6], [672, 58, 11, 1, 10, 6], [672, 105, 12, 2, 10, 2], [672, 156, 12, 2, 10, 2], [672, 207, 11, 2, 10, 2], [672, 258, 11, 2, 10, 2], [672, 311, 11, 5, 10, 4], [672, 360, 11, 8, 9, 2], [672, 411, 13, 10, 10, 2], [1, 1, 1, 1, 10, 1], [794, 766, 11, 2, 10, 0], [672, 565, 13, 6, 10, 3], [672, 618, 10, 5, 10, 5], [672, 669, 10, 5, 10, 5], [672, 717, 12, 8, 10, 2], [672, 768, 12, 8, 10, 2], [733, 3, 12, 10, 10, 2], [733, 58, 8, 1, 10, 6], [733, 112, 8, 2, 10, 9], [733, 163, 9, 2, 10, 9], [733, 206, 13, 8, 10, 1], [733, 256, 13, 10, 10, 0], [733, 307, 13, 10, 10, 0], [733, 358, 12, 10, 10, 0], [733, 409, 13, 10, 10, 0], [733, 460, 13, 10, 10, 0], [733, 511, 13, 10, 10, 0], [733, 562, 13, 10, 10, 0], [733, 613, 13, 10, 10, 0], [733, 664, 13, 10, 10, 0], [733, 715, 12, 10, 10, 0], [733, 766, 13, 10, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 12, 10, 10, 0], [794, 103, 14, 10, 10, 0], [794, 154, 14, 10, 10, 0], [794, 205, 14, 10, 10, 0], [794, 260, 10, 6, 10, 4], [794, 309, 11, 3, 10, 2], [794, 361, 12, 2, 10, 3], [794, 413, 11, 1, 10, 4], [794, 463, 12, 2, 10, 3], [794, 514, 10, 1, 10, 3], [794, 564, 12, 4, 10, 2], [794, 621, 9, 4, 10, 8], [794, 666, 12, 2, 10, 2], [794, 723, 8, 4, 10, 8], [794, 766, 11, 2, 10, 0], [855, 1, 11, 2, 10, 0], [855, 52, 11, 2, 10, 0], [855, 103, 11, 2, 10, 0], [855, 154, 11, 2, 10, 0], [855, 205, 11, 2, 10, 0], [855, 256, 11, 2, 10, 0], [855, 307, 11, 2, 10, 0], [855, 358, 11, 2, 10, 0], [855, 409, 11, 2, 10, 0], [855, 460, 11, 2, 10, 0], [855, 511, 11, 2, 10, 0], [855, 562, 11, 2, 10, 0], [855, 613, 11, 2, 10, 0], [855, 664, 11, 2, 10, 0], [855, 715, 11, 2, 10, 0], [855, 766, 11, 2, 10, 0]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 11, 6, 11, 5], [1, 54, 11, 10, 11, 2], [1, 105, 11, 9, 11, 2], [1, 156, 11, 9, 11, 2], [1, 206, 11, 12, 11, 1], [1, 258, 11, 10, 11, 2], [1, 309, 11, 10, 11, 2], [1, 360, 11, 9, 11, 2], [1, 411, 11, 12, 11, 2], [1, 462, 11, 12, 11, 2], [1, 513, 11, 9, 11, 2], [1, 566, 11, 7, 11, 4], [1, 618, 11, 8, 11, 5], [1, 669, 11, 6, 11, 5], [1, 720, 11, 7, 11, 5], [1, 768, 11, 10, 11, 2], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 10, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 515, 11, 8, 11, 4], [62, 566, 11, 9, 11, 4], [62, 617, 11, 7, 11, 4], [62, 669, 11, 6, 11, 5], [62, 719, 11, 7, 11, 4], [62, 768, 11, 10, 11, 2], [123, 3, 11, 11, 11, 2], [123, 54, 11, 10, 11, 2], [123, 105, 11, 10, 11, 2], [123, 156, 11, 10, 11, 2], [123, 207, 11, 10, 11, 2], [123, 258, 11, 10, 11, 2], [123, 309, 11, 10, 11, 2], [123, 360, 11, 10, 11, 2], [123, 411, 11, 10, 11, 2], [123, 462, 11, 10, 11, 2], [123, 513, 11, 10, 11, 2], [123, 564, 11, 10, 11, 2], [123, 615, 11, 10, 11, 2], [123, 666, 11, 10, 11, 2], [123, 717, 11, 10, 11, 2], [123, 768, 11, 10, 11, 2], [184, 3, 11, 10, 11, 2], [184, 54, 11, 11, 11, 2], [184, 105, 11, 10, 11, 2], [184, 156, 11, 10, 11, 2], [184, 207, 11, 10, 11, 2], [184, 258, 11, 10, 11, 2], [184, 309, 11, 10, 11, 2], [184, 360, 11, 10, 11, 2], [184, 411, 11, 10, 11, 2], [184, 462, 11, 10, 11, 2], [184, 513, 11, 10, 11, 2], [184, 564, 11, 12, 11, 2], [184, 615, 11, 10, 11, 2], [184, 666, 11, 12, 11, 2], [184, 717, 11, 9, 11, 2], [184, 771, 11, 9, 11, 5], [245, 3, 11, 9, 11, 2], [245, 56, 11, 8, 11, 4], [245, 105, 11, 10, 11, 2], [245, 158, 11, 8, 11, 4], [245, 207, 11, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 11, 10, 11, 2], [245, 362, 11, 10, 11, 4], [245, 411, 11, 10, 11, 2], [245, 462, 11, 10, 11, 2], [245, 513, 11, 12, 11, 2], [245, 564, 11, 10, 11, 2], [245, 615, 11, 10, 11, 2], [245, 668, 11, 8, 11, 4], [245, 719, 11, 8, 11, 4], [245, 770, 11, 8, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 11, 10, 11, 4], [306, 107, 11, 8, 11, 4], [306, 158, 11, 8, 11, 4], [306, 207, 11, 10, 11, 2], [306, 260, 11, 8, 11, 4], [306, 311, 11, 8, 11, 4], [306, 362, 11, 8, 11, 4], [306, 413, 11, 8, 11, 4], [306, 464, 11, 10, 11, 4], [306, 515, 11, 8, 11, 4], [306, 564, 11, 12, 11, 2], [306, 615, 11, 12, 11, 2], [306, 666, 11, 12, 11, 2], [306, 720, 11, 6, 11, 5], [306, 768, 11, 10, 11, 2], [367, 1, 11, 12, 11, 0], [367, 52, 11, 12, 11, 0], [367, 105, 11, 12, 11, 2], [367, 154, 11, 12, 11, 0], [367, 205, 11, 12, 11, 0], [367, 256, 11, 12, 11, 0], [367, 307, 11, 12, 11, 0], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 461, 11, 11, 11, 1], [367, 513, 11, 10, 11, 2], [367, 563, 11, 11, 11, 1], [367, 614, 11, 11, 11, 1], [367, 668, 11, 10, 11, 4], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 2, 11, 11, 11, 1], [428, 54, 11, 10, 11, 2], [428, 104, 11, 11, 11, 1], [428, 155, 11, 11, 11, 1], [428, 206, 11, 11, 11, 1], [428, 258, 11, 10, 11, 2], [428, 308, 11, 11, 11, 1], [428, 359, 11, 11, 11, 1], [428, 410, 11, 11, 11, 1], [428, 461, 11, 11, 11, 1], [428, 513, 11, 10, 11, 2], [428, 563, 11, 11, 11, 1], [428, 614, 11, 11, 11, 1], [428, 665, 11, 11, 11, 1], [428, 716, 11, 11, 11, 1], [428, 768, 11, 10, 11, 2], [489, 3, 11, 12, 11, 2], [489, 54, 11, 9, 11, 2], [489, 106, 11, 9, 11, 3], [489, 156, 11, 10, 11, 2], [489, 206, 11, 13, 11, 1], [489, 260, 11, 7, 11, 4], [489, 309, 11, 12, 11, 2], [489, 360, 11, 10, 11, 2], [489, 411, 13, 10, 13, 2], [489, 462, 13, 10, 13, 2], [489, 513, 15, 9, 15, 2], [489, 564, 11, 9, 11, 2], [489, 615, 11, 9, 11, 2], [489, 668, 11, 7, 11, 4], [489, 717, 11, 10, 11, 2], [489, 768, 11, 10, 11, 2], [550, 6, 13, 6, 13, 5], [550, 56, 11, 8, 11, 4], [550, 107, 11, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 207, 11, 10, 11, 2], [550, 260, 11, 10, 11, 4], [550, 309, 10, 10, 10, 2], [550, 360, 13, 11, 13, 2], [550, 411, 14, 11, 14, 2], [550, 464, 11, 8, 11, 4], [550, 513, 7, 12, 7, 2], [550, 564, 11, 9, 11, 2], [550, 615, 11, 9, 11, 2], [550, 666, 13, 10, 13, 2], [550, 719, 11, 8, 11, 4], [550, 770, 11, 8, 11, 4], [611, 5, 11, 10, 11, 4], [611, 56, 11, 10, 11, 4], [611, 108, 13, 6, 13, 5], [611, 156, 11, 10, 11, 2], [611, 207, 11, 12, 11, 2], [611, 261, 11, 6, 11, 5], [611, 309, 11, 10, 11, 2], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 11, 7, 11, 5], [611, 516, 11, 6, 11, 5], [611, 562, 11, 12, 11, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 717, 11, 10, 11, 2], [611, 770, 11, 8, 11, 4], [672, 6, 11, 6, 11, 5], [672, 57, 11, 6, 11, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 11, 9, 11, 2], [672, 258, 11, 9, 11, 2], [672, 311, 11, 7, 11, 4], [672, 360, 10, 10, 10, 2], [672, 411, 11, 12, 11, 2], [1, 6, 11, 6, 11, 5], [794, 766, 11, 11, 11, 0], [672, 565, 11, 8, 11, 3], [672, 618, 11, 7, 11, 5], [672, 669, 11, 7, 11, 5], [672, 717, 11, 10, 11, 2], [672, 768, 11, 10, 11, 2], [733, 3, 11, 12, 11, 2], [733, 57, 11, 6, 11, 5], [733, 108, 11, 8, 11, 5], [733, 159, 11, 8, 11, 5], [733, 206, 11, 10, 11, 1], [733, 256, 11, 12, 11, 0], [733, 307, 11, 12, 11, 0], [733, 358, 11, 12, 11, 0], [733, 409, 11, 12, 11, 0], [733, 460, 11, 12, 11, 0], [733, 511, 11, 12, 11, 0], [733, 562, 11, 12, 11, 0], [733, 613, 11, 12, 11, 0], [733, 664, 11, 12, 11, 0], [733, 715, 11, 12, 11, 0], [733, 766, 11, 12, 11, 0], [1, 6, 11, 6, 11, 5], [794, 52, 11, 12, 11, 0], [794, 103, 11, 12, 11, 0], [794, 154, 11, 12, 11, 0], [794, 205, 11, 12, 11, 0], [794, 260, 11, 8, 11, 4], [794, 309, 11, 9, 11, 2], [794, 361, 11, 8, 11, 3], [794, 413, 11, 7, 11, 4], [794, 463, 11, 8, 11, 3], [794, 514, 11, 8, 11, 3], [794, 564, 11, 9, 11, 2], [794, 618, 11, 9, 11, 5], [794, 666, 11, 9, 11, 2], [794, 720, 11, 9, 11, 5], [794, 766, 11, 11, 11, 0], [855, 1, 11, 11, 11, 0], [855, 52, 11, 11, 11, 0], [855, 103, 11, 11, 11, 0], [855, 154, 11, 11, 11, 0], [855, 205, 11, 11, 11, 0], [855, 256, 11, 11, 11, 0], [855, 307, 11, 11, 11, 0], [855, 358, 11, 11, 11, 0], [855, 409, 11, 11, 11, 0], [855, 460, 11, 11, 11, 0], [855, 511, 11, 11, 11, 0], [855, 562, 11, 11, 11, 0], [855, 613, 11, 11, 11, 0], [855, 664, 11, 11, 11, 0], [855, 715, 11, 11, 11, 0], [855, 766, 11, 11, 11, 0]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 54, 10, 8, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 10, 8, 10, 2], [1, 206, 10, 10, 10, 1], [1, 258, 10, 8, 10, 2], [1, 309, 10, 8, 10, 2], [1, 360, 10, 8, 10, 2], [1, 411, 10, 10, 10, 2], [1, 462, 10, 10, 10, 2], [1, 513, 10, 8, 10, 2], [1, 566, 10, 6, 10, 4], [1, 617, 10, 7, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 6, 10, 4], [1, 768, 10, 8, 10, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 10, 6, 10, 4], [62, 566, 10, 7, 10, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 768, 10, 8, 10, 2], [123, 3, 10, 9, 10, 2], [123, 54, 10, 8, 10, 2], [123, 105, 10, 8, 10, 2], [123, 156, 10, 8, 10, 2], [123, 207, 10, 8, 10, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 10, 8, 10, 2], [123, 411, 10, 8, 10, 2], [123, 462, 10, 8, 10, 2], [123, 513, 10, 8, 10, 2], [123, 564, 10, 8, 10, 2], [123, 615, 10, 8, 10, 2], [123, 666, 10, 8, 10, 2], [123, 717, 10, 8, 10, 2], [123, 768, 10, 8, 10, 2], [184, 3, 10, 8, 10, 2], [184, 54, 10, 9, 10, 2], [184, 105, 10, 8, 10, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 10, 8, 10, 2], [184, 309, 10, 8, 10, 2], [184, 360, 10, 8, 10, 2], [184, 411, 10, 8, 10, 2], [184, 462, 10, 8, 10, 2], [184, 513, 10, 8, 10, 2], [184, 564, 10, 10, 10, 2], [184, 615, 10, 8, 10, 2], [184, 666, 10, 10, 10, 2], [184, 717, 10, 8, 10, 2], [184, 770, 10, 8, 10, 4], [245, 3, 10, 8, 10, 2], [245, 56, 10, 6, 10, 4], [245, 105, 10, 8, 10, 2], [245, 158, 10, 6, 10, 4], [245, 207, 10, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 10, 8, 10, 2], [245, 362, 10, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 10, 8, 10, 2], [245, 513, 10, 10, 10, 2], [245, 564, 10, 8, 10, 2], [245, 615, 10, 8, 10, 2], [245, 668, 10, 6, 10, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 10, 6, 10, 4], [306, 158, 10, 6, 10, 4], [306, 207, 10, 8, 10, 2], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 10, 6, 10, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 564, 10, 10, 10, 2], [306, 615, 10, 10, 10, 2], [306, 666, 10, 10, 10, 2], [306, 719, 10, 6, 10, 4], [306, 768, 10, 8, 10, 2], [367, 1, 10, 10, 10, 0], [367, 52, 10, 10, 10, 0], [367, 105, 10, 10, 10, 2], [367, 154, 10, 10, 10, 0], [367, 205, 10, 10, 10, 0], [367, 256, 10, 10, 10, 0], [367, 307, 10, 10, 10, 0], [367, 360, 10, 8, 10, 2], [367, 411, 10, 8, 10, 2], [367, 461, 10, 9, 10, 1], [367, 513, 10, 8, 10, 2], [367, 563, 10, 9, 10, 1], [367, 614, 10, 9, 10, 1], [367, 668, 10, 8, 10, 4], [367, 717, 10, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 2, 10, 9, 10, 1], [428, 54, 10, 8, 10, 2], [428, 104, 10, 9, 10, 1], [428, 155, 10, 9, 10, 1], [428, 206, 10, 9, 10, 1], [428, 258, 10, 8, 10, 2], [428, 308, 10, 9, 10, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 10, 8, 10, 2], [428, 563, 10, 9, 10, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 3, 10, 10, 10, 2], [489, 54, 10, 8, 10, 2], [489, 106, 10, 7, 10, 3], [489, 156, 10, 8, 10, 2], [489, 206, 10, 11, 10, 1], [489, 260, 10, 6, 10, 4], [489, 309, 10, 10, 10, 2], [489, 360, 10, 8, 10, 2], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 513, 14, 8, 14, 2], [489, 564, 10, 8, 10, 2], [489, 615, 10, 8, 10, 2], [489, 668, 10, 6, 10, 4], [489, 717, 10, 8, 10, 2], [489, 768, 10, 8, 10, 2], [550, 5, 12, 6, 12, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 207, 10, 8, 10, 2], [550, 260, 10, 8, 10, 4], [550, 309, 9, 8, 9, 2], [550, 360, 12, 9, 12, 2], [550, 411, 13, 9, 13, 2], [550, 464, 10, 6, 10, 4], [550, 513, 6, 10, 6, 2], [550, 564, 10, 8, 10, 2], [550, 615, 10, 8, 10, 2], [550, 666, 12, 8, 12, 2], [550, 719, 10, 6, 10, 4], [550, 770, 10, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 107, 12, 6, 12, 4], [611, 156, 10, 8, 10, 2], [611, 207, 10, 10, 10, 2], [611, 260, 10, 6, 10, 4], [611, 309, 10, 8, 10, 2], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 6, 10, 4], [611, 562, 10, 10, 10, 0], [611, 613, 10, 10, 10, 0], [611, 664, 10, 10, 10, 0], [611, 717, 10, 8, 10, 2], [611, 770, 10, 6, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 10, 8, 10, 2], [672, 258, 10, 8, 10, 2], [672, 311, 10, 6, 10, 4], [672, 360, 9, 8, 9, 2], [672, 411, 10, 10, 10, 2], [1, 5, 10, 6, 10, 4], [794, 766, 10, 10, 10, 0], [672, 565, 10, 7, 10, 3], [672, 617, 10, 6, 10, 4], [672, 668, 10, 6, 10, 4], [672, 717, 10, 8, 10, 2], [672, 768, 10, 8, 10, 2], [733, 3, 10, 10, 10, 2], [733, 56, 10, 6, 10, 4], [733, 107, 10, 7, 10, 4], [733, 158, 10, 7, 10, 4], [733, 206, 10, 9, 10, 1], [733, 256, 10, 10, 10, 0], [733, 307, 10, 10, 10, 0], [733, 358, 10, 10, 10, 0], [733, 409, 10, 10, 10, 0], [733, 460, 10, 10, 10, 0], [733, 511, 10, 10, 10, 0], [733, 562, 10, 10, 10, 0], [733, 613, 10, 10, 10, 0], [733, 664, 10, 10, 10, 0], [733, 715, 10, 10, 10, 0], [733, 766, 10, 10, 10, 0], [1, 5, 10, 6, 10, 4], [794, 52, 10, 10, 10, 0], [794, 103, 10, 10, 10, 0], [794, 154, 10, 10, 10, 0], [794, 205, 10, 10, 10, 0], [794, 260, 10, 6, 10, 4], [794, 309, 10, 8, 10, 2], [794, 361, 10, 7, 10, 3], [794, 413, 10, 6, 10, 4], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 564, 10, 8, 10, 2], [794, 617, 10, 8, 10, 4], [794, 666, 10, 8, 10, 2], [794, 719, 10, 8, 10, 4], [794, 766, 10, 10, 10, 0], [855, 1, 10, 10, 10, 0], [855, 52, 10, 10, 10, 0], [855, 103, 10, 10, 10, 0], [855, 154, 10, 10, 10, 0], [855, 205, 10, 10, 10, 0], [855, 256, 10, 10, 10, 0], [855, 307, 10, 10, 10, 0], [855, 358, 10, 10, 10, 0], [855, 409, 10, 10, 10, 0], [855, 460, 10, 10, 10, 0], [855, 511, 10, 10, 10, 0], [855, 562, 10, 10, 10, 0], [855, 613, 10, 10, 10, 0], [855, 664, 10, 10, 10, 0], [855, 715, 10, 10, 10, 0], [855, 766, 10, 10, 10, 0]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 13, 1], [1, 54, 14, 11, 13, 2], [1, 105, 15, 5, 13, 2], [1, 156, 16, 10, 13, 2], [1, 206, 15, 14, 13, 1], [1, 258, 15, 11, 13, 2], [1, 309, 15, 11, 13, 2], [1, 360, 14, 5, 13, 2], [1, 411, 15, 14, 13, 2], [1, 462, 14, 14, 13, 2], [1, 512, 16, 8, 13, 1], [1, 566, 15, 9, 13, 4], [1, 623, 10, 5, 13, 10], [1, 671, 15, 3, 13, 7], [1, 725, 10, 3, 13, 10], [1, 768, 17, 11, 13, 2], [62, 3, 16, 11, 13, 2], [62, 54, 14, 11, 13, 2], [62, 105, 17, 11, 13, 2], [62, 156, 17, 11, 13, 2], [62, 207, 16, 11, 13, 2], [62, 258, 17, 11, 13, 2], [62, 309, 15, 11, 13, 2], [62, 360, 17, 11, 13, 2], [62, 411, 17, 11, 13, 2], [62, 462, 16, 11, 13, 2], [62, 515, 13, 9, 13, 4], [62, 566, 13, 11, 13, 4], [62, 618, 15, 7, 13, 5], [62, 670, 14, 5, 13, 6], [62, 720, 14, 7, 13, 5], [62, 768, 15, 11, 13, 2], [123, 3, 17, 11, 13, 2], [123, 54, 14, 11, 13, 2], [123, 105, 17, 11, 13, 2], [123, 156, 16, 11, 13, 2], [123, 207, 16, 11, 13, 2], [123, 258, 17, 11, 13, 2], [123, 309, 17, 11, 13, 2], [123, 360, 17, 11, 13, 2], [123, 411, 17, 11, 13, 2], [123, 462, 16, 11, 13, 2], [123, 513, 17, 11, 13, 2], [123, 564, 17, 11, 13, 2], [123, 615, 14, 11, 13, 2], [123, 666, 17, 11, 13, 2], [123, 717, 18, 11, 13, 2], [123, 768, 16, 11, 13, 2], [184, 3, 17, 11, 13, 2], [184, 54, 16, 12, 13, 2], [184, 105, 16, 11, 13, 2], [184, 156, 17, 11, 13, 2], [184, 207, 17, 11, 13, 2], [184, 258, 18, 11, 13, 2], [184, 309, 17, 11, 13, 2], [184, 360, 17, 11, 13, 2], [184, 411, 17, 11, 13, 2], [184, 462, 17, 11, 13, 2], [184, 513, 17, 11, 13, 2], [184, 564, 15, 14, 13, 2], [184, 615, 13, 11, 13, 2], [184, 666, 15, 14, 13, 2], [184, 717, 16, 5, 13, 2], [184, 779, 13, 3, 13, 13], [245, 3, 14, 4, 13, 2], [245, 56, 15, 9, 13, 4], [245, 105, 15, 11, 13, 2], [245, 158, 16, 9, 13, 4], [245, 207, 16, 11, 13, 2], [245, 260, 15, 9, 13, 4], [245, 309, 16, 11, 13, 2], [245, 362, 16, 12, 13, 4], [245, 411, 15, 11, 13, 2], [245, 462, 14, 11, 13, 2], [245, 513, 15, 14, 13, 2], [245, 564, 16, 11, 13, 2], [245, 615, 14, 11, 13, 2], [245, 668, 16, 9, 13, 4], [245, 719, 16, 9, 13, 4], [245, 770, 15, 9, 13, 4], [306, 5, 15, 12, 13, 4], [306, 56, 16, 12, 13, 4], [306, 107, 16, 9, 13, 4], [306, 158, 16, 9, 13, 4], [306, 207, 15, 11, 13, 2], [306, 260, 16, 9, 13, 4], [306, 311, 16, 9, 13, 4], [306, 362, 16, 9, 13, 4], [306, 413, 16, 9, 13, 4], [306, 464, 16, 12, 13, 4], [306, 515, 16, 9, 13, 4], [306, 564, 15, 14, 13, 2], [306, 615, 14, 14, 13, 2], [306, 666, 14, 14, 13, 2], [306, 718, 17, 4, 13, 3], [306, 768, 17, 11, 13, 2], [367, 1, 16, 13, 13, 0], [367, 52, 16, 13, 13, 0], [367, 105, 17, 14, 13, 2], [367, 154, 17, 13, 13, 0], [367, 205, 17, 13, 13, 0], [367, 256, 16, 13, 13, 0], [367, 307, 18, 13, 13, 0], [367, 359, 16, 12, 13, 1], [367, 410, 15, 12, 13, 1], [367, 461, 15, 12, 13, 1], [367, 513, 15, 11, 13, 2], [367, 563, 17, 12, 13, 1], [367, 613, 16, 13, 13, 0], [367, 668, 16, 12, 13, 4], [367, 716, 16, 12, 13, 1], [367, 767, 15, 12, 13, 1], [428, 2, 15, 12, 13, 1], [428, 54, 15, 11, 13, 2], [428, 104, 15, 12, 13, 1], [428, 155, 14, 12, 13, 1], [428, 206, 15, 12, 13, 1], [428, 258, 14, 11, 13, 2], [428, 308, 18, 12, 13, 1], [428, 359, 16, 12, 13, 1], [428, 410, 15, 12, 13, 1], [428, 461, 15, 12, 13, 1], [428, 513, 15, 11, 13, 2], [428, 563, 17, 12, 13, 1], [428, 614, 16, 12, 13, 1], [428, 665, 16, 12, 13, 1], [428, 716, 16, 12, 13, 1], [428, 768, 16, 11, 13, 2], [489, 3, 15, 13, 13, 2], [489, 54, 15, 6, 13, 2], [489, 105, 15, 12, 13, 2], [489, 156, 16, 11, 13, 2], [489, 207, 17, 14, 13, 2], [489, 261, 14, 7, 13, 5], [489, 309, 17, 14, 13, 2], [489, 360, 16, 11, 13, 2], [489, 410, 19, 12, 16, 1], [489, 461, 19, 12, 16, 1], [489, 512, 22, 7, 17, 1], [489, 564, 15, 4, 13, 2], [489, 615, 16, 3, 13, 2], [489, 669, 15, 7, 13, 5], [489, 717, 18, 11, 13, 2], [489, 768, 17, 11, 13, 2], [550, 5, 18, 7, 15, 4], [550, 56, 15, 9, 13, 4], [550, 108, 16, 8, 13, 5], [550, 159, 15, 8, 13, 5], [550, 207, 17, 11, 13, 2], [550, 260, 14, 11, 13, 4], [550, 308, 16, 12, 12, 1], [550, 359, 20, 13, 15, 1], [550, 410, 21, 13, 17, 1], [550, 463, 17, 10, 13, 3], [550, 513, 13, 14, 9, 2], [550, 564, 15, 9, 13, 2], [550, 615, 15, 9, 13, 2], [550, 665, 19, 12, 16, 1], [550, 719, 16, 9, 13, 4], [550, 770, 16, 9, 13, 4], [611, 6, 13, 11, 13, 5], [611, 56, 13, 12, 13, 4], [611, 110, 17, 5, 15, 7], [611, 156, 17, 11, 13, 2], [611, 207, 16, 14, 13, 2], [611, 262, 15, 6, 13, 6], [611, 309, 15, 11, 14, 2], [611, 363, 15, 7, 13, 5], [611, 414, 15, 7, 13, 5], [611, 470, 13, 3, 13, 10], [611, 511, 1, 1, 13, 1], [611, 562, 15, 13, 13, 0], [611, 613, 17, 13, 13, 0], [611, 664, 18, 13, 13, 0], [611, 717, 18, 11, 13, 2], [611, 770, 16, 9, 13, 4], [672, 8, 14, 3, 13, 7], [672, 59, 15, 3, 13, 7], [672, 105, 16, 5, 13, 2], [672, 156, 17, 5, 13, 2], [672, 207, 15, 5, 13, 2], [672, 258, 15, 5, 13, 2], [672, 312, 15, 7, 13, 5], [672, 359, 15, 12, 12, 1], [672, 411, 16, 14, 13, 2], [1, 1, 1, 1, 13, 1], [794, 766, 16, 4, 13, 0], [672, 565, 17, 9, 13, 3], [672, 618, 13, 7, 13, 5], [672, 669, 13, 7, 13, 5], [672, 717, 16, 11, 13, 2], [672, 768, 16, 11, 13, 2], [733, 3, 15, 13, 13, 2], [733, 58, 12, 3, 13, 6], [733, 113, 10, 5, 13, 10], [733, 164, 12, 5, 13, 10], [733, 206, 18, 11, 13, 1], [733, 256, 16, 13, 13, 0], [733, 307, 17, 13, 13, 0], [733, 358, 16, 13, 13, 0], [733, 409, 17, 13, 13, 0], [733, 460, 17, 13, 13, 0], [733, 511, 16, 13, 13, 0], [733, 562, 16, 13, 13, 0], [733, 613, 16, 13, 13, 0], [733, 664, 16, 13, 13, 0], [733, 715, 16, 13, 13, 0], [733, 766, 16, 13, 13, 0], [1, 1, 1, 1, 13, 1], [794, 52, 16, 13, 13, 0], [794, 103, 18, 13, 13, 0], [794, 154, 18, 13, 13, 0], [794, 205, 18, 13, 13, 0], [794, 260, 13, 9, 13, 4], [794, 309, 15, 5, 13, 2], [794, 361, 17, 4, 13, 3], [794, 413, 15, 3, 13, 4], [794, 463, 16, 4, 13, 3], [794, 514, 14, 3, 13, 3], [794, 564, 15, 6, 13, 2], [794, 622, 11, 7, 13, 9], [794, 665, 16, 6, 13, 1], [794, 725, 11, 6, 13, 10], [794, 766, 16, 4, 13, 0], [855, 1, 16, 4, 13, 0], [855, 52, 16, 4, 13, 0], [855, 103, 16, 4, 13, 0], [855, 154, 16, 4, 13, 0], [855, 205, 16, 4, 13, 0], [855, 256, 16, 4, 13, 0], [855, 307, 16, 4, 13, 0], [855, 358, 16, 4, 13, 0], [855, 409, 16, 4, 13, 0], [855, 460, 16, 4, 13, 0], [855, 511, 16, 4, 13, 0], [855, 562, 16, 4, 13, 0], [855, 613, 16, 4, 13, 0], [855, 664, 16, 4, 13, 0], [855, 715, 16, 4, 13, 0], [855, 766, 16, 4, 13, 0]], \"capHeight\": 12, \"widestlogicalchar\": 17, \"widestglyph\": 22, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 54, 13, 9, 12, 2], [1, 105, 14, 3, 12, 2], [1, 156, 15, 8, 12, 2], [1, 206, 14, 12, 12, 1], [1, 258, 14, 9, 12, 2], [1, 309, 14, 9, 12, 2], [1, 360, 13, 3, 12, 2], [1, 411, 14, 12, 12, 2], [1, 462, 13, 12, 12, 2], [1, 512, 15, 6, 12, 1], [1, 566, 14, 7, 12, 4], [1, 623, 9, 3, 12, 10], [1, 671, 14, 1, 12, 7], [1, 725, 9, 1, 12, 10], [1, 768, 16, 9, 12, 2], [62, 3, 15, 9, 12, 2], [62, 54, 13, 9, 12, 2], [62, 105, 16, 9, 12, 2], [62, 156, 16, 9, 12, 2], [62, 207, 15, 9, 12, 2], [62, 258, 16, 9, 12, 2], [62, 309, 14, 9, 12, 2], [62, 360, 16, 9, 12, 2], [62, 411, 16, 9, 12, 2], [62, 462, 15, 9, 12, 2], [62, 515, 12, 7, 12, 4], [62, 566, 12, 9, 12, 4], [62, 618, 14, 5, 12, 5], [62, 670, 13, 3, 12, 6], [62, 720, 13, 5, 12, 5], [62, 768, 14, 9, 12, 2], [123, 3, 16, 9, 12, 2], [123, 54, 13, 9, 12, 2], [123, 105, 16, 9, 12, 2], [123, 156, 15, 9, 12, 2], [123, 207, 15, 9, 12, 2], [123, 258, 16, 9, 12, 2], [123, 309, 16, 9, 12, 2], [123, 360, 16, 9, 12, 2], [123, 411, 16, 9, 12, 2], [123, 462, 15, 9, 12, 2], [123, 513, 16, 9, 12, 2], [123, 564, 16, 9, 12, 2], [123, 615, 13, 9, 12, 2], [123, 666, 16, 9, 12, 2], [123, 717, 17, 9, 12, 2], [123, 768, 15, 9, 12, 2], [184, 3, 16, 9, 12, 2], [184, 54, 15, 10, 12, 2], [184, 105, 15, 9, 12, 2], [184, 156, 16, 9, 12, 2], [184, 207, 16, 9, 12, 2], [184, 258, 17, 9, 12, 2], [184, 309, 16, 9, 12, 2], [184, 360, 16, 9, 12, 2], [184, 411, 16, 9, 12, 2], [184, 462, 16, 9, 12, 2], [184, 513, 16, 9, 12, 2], [184, 564, 14, 12, 12, 2], [184, 615, 12, 9, 12, 2], [184, 666, 14, 12, 12, 2], [184, 717, 15, 3, 12, 2], [184, 779, 12, 1, 12, 13], [245, 3, 13, 2, 12, 2], [245, 56, 14, 7, 12, 4], [245, 105, 14, 9, 12, 2], [245, 158, 15, 7, 12, 4], [245, 207, 15, 9, 12, 2], [245, 260, 14, 7, 12, 4], [245, 309, 15, 9, 12, 2], [245, 362, 15, 10, 12, 4], [245, 411, 14, 9, 12, 2], [245, 462, 13, 9, 12, 2], [245, 513, 14, 12, 12, 2], [245, 564, 15, 9, 12, 2], [245, 615, 13, 9, 12, 2], [245, 668, 15, 7, 12, 4], [245, 719, 15, 7, 12, 4], [245, 770, 14, 7, 12, 4], [306, 5, 14, 10, 12, 4], [306, 56, 15, 10, 12, 4], [306, 107, 15, 7, 12, 4], [306, 158, 15, 7, 12, 4], [306, 207, 14, 9, 12, 2], [306, 260, 15, 7, 12, 4], [306, 311, 15, 7, 12, 4], [306, 362, 15, 7, 12, 4], [306, 413, 15, 7, 12, 4], [306, 464, 15, 10, 12, 4], [306, 515, 15, 7, 12, 4], [306, 564, 14, 12, 12, 2], [306, 615, 13, 12, 12, 2], [306, 666, 13, 12, 12, 2], [306, 718, 16, 2, 12, 3], [306, 768, 16, 9, 12, 2], [367, 1, 13, 11, 12, 0], [367, 52, 15, 11, 12, 0], [367, 105, 16, 12, 12, 2], [367, 154, 16, 11, 12, 0], [367, 205, 16, 11, 12, 0], [367, 256, 15, 11, 12, 0], [367, 307, 17, 11, 12, 0], [367, 359, 15, 10, 12, 1], [367, 410, 14, 10, 12, 1], [367, 461, 14, 10, 12, 1], [367, 513, 14, 9, 12, 2], [367, 563, 16, 10, 12, 1], [367, 613, 15, 11, 12, 0], [367, 668, 15, 10, 12, 4], [367, 716, 15, 10, 12, 1], [367, 767, 14, 10, 12, 1], [428, 2, 14, 10, 12, 1], [428, 54, 14, 9, 12, 2], [428, 104, 14, 10, 12, 1], [428, 155, 13, 10, 12, 1], [428, 206, 14, 10, 12, 1], [428, 258, 13, 9, 12, 2], [428, 308, 17, 10, 12, 1], [428, 359, 15, 10, 12, 1], [428, 410, 14, 10, 12, 1], [428, 461, 14, 10, 12, 1], [428, 513, 14, 9, 12, 2], [428, 563, 16, 10, 12, 1], [428, 614, 15, 10, 12, 1], [428, 665, 15, 10, 12, 1], [428, 716, 15, 10, 12, 1], [428, 768, 15, 9, 12, 2], [489, 3, 14, 11, 12, 2], [489, 54, 14, 4, 12, 2], [489, 105, 14, 10, 12, 2], [489, 156, 15, 9, 12, 2], [489, 207, 16, 12, 12, 2], [489, 261, 13, 5, 12, 5], [489, 309, 16, 12, 12, 2], [489, 360, 15, 9, 12, 2], [489, 410, 18, 10, 15, 1], [489, 461, 18, 10, 15, 1], [489, 512, 21, 5, 16, 1], [489, 564, 14, 2, 12, 2], [489, 615, 15, 1, 12, 2], [489, 669, 14, 5, 12, 5], [489, 717, 17, 9, 12, 2], [489, 768, 16, 9, 12, 2], [550, 5, 17, 5, 14, 4], [550, 56, 14, 7, 12, 4], [550, 108, 15, 6, 12, 5], [550, 159, 14, 6, 12, 5], [550, 207, 16, 9, 12, 2], [550, 260, 13, 9, 12, 4], [550, 308, 15, 10, 11, 1], [550, 359, 19, 11, 14, 1], [550, 410, 20, 11, 16, 1], [550, 463, 16, 8, 12, 3], [550, 513, 12, 12, 8, 2], [550, 564, 14, 7, 12, 2], [550, 615, 14, 7, 12, 2], [550, 665, 18, 10, 15, 1], [550, 719, 15, 7, 12, 4], [550, 770, 15, 7, 12, 4], [611, 6, 12, 9, 12, 5], [611, 56, 12, 10, 12, 4], [611, 110, 16, 3, 14, 7], [611, 156, 16, 9, 12, 2], [611, 207, 15, 12, 12, 2], [611, 262, 14, 4, 12, 6], [611, 309, 14, 9, 13, 2], [611, 363, 14, 5, 12, 5], [611, 414, 14, 5, 12, 5], [611, 470, 12, 1, 12, 10], [611, 511, 1, 1, 12, 1], [611, 562, 14, 11, 12, 0], [611, 613, 15, 11, 12, 0], [611, 664, 16, 11, 12, 0], [611, 717, 17, 9, 12, 2], [611, 770, 15, 7, 12, 4], [672, 8, 13, 1, 12, 7], [672, 59, 14, 1, 12, 7], [672, 105, 15, 3, 12, 2], [672, 156, 16, 3, 12, 2], [672, 207, 14, 3, 12, 2], [672, 258, 14, 3, 12, 2], [672, 312, 14, 5, 12, 5], [672, 359, 14, 10, 11, 1], [672, 411, 15, 12, 12, 2], [1, 1, 1, 1, 12, 1], [794, 766, 14, 2, 12, 0], [672, 565, 16, 7, 12, 3], [672, 618, 12, 5, 12, 5], [672, 669, 12, 5, 12, 5], [672, 717, 15, 9, 12, 2], [672, 768, 15, 9, 12, 2], [733, 3, 14, 11, 12, 2], [733, 58, 11, 1, 12, 6], [733, 113, 9, 3, 12, 10], [733, 164, 11, 3, 12, 10], [733, 206, 17, 9, 12, 1], [733, 256, 15, 11, 12, 0], [733, 307, 16, 11, 12, 0], [733, 358, 14, 11, 12, 0], [733, 409, 16, 11, 12, 0], [733, 460, 16, 11, 12, 0], [733, 511, 15, 11, 12, 0], [733, 562, 15, 11, 12, 0], [733, 613, 15, 11, 12, 0], [733, 664, 15, 11, 12, 0], [733, 715, 15, 11, 12, 0], [733, 766, 15, 11, 12, 0], [1, 1, 1, 1, 12, 1], [794, 52, 15, 11, 12, 0], [794, 103, 17, 11, 12, 0], [794, 154, 17, 11, 12, 0], [794, 205, 17, 11, 12, 0], [794, 260, 12, 7, 12, 4], [794, 309, 14, 3, 12, 2], [794, 361, 16, 2, 12, 3], [794, 413, 14, 1, 12, 4], [794, 463, 15, 2, 12, 3], [794, 514, 13, 1, 12, 3], [794, 564, 14, 4, 12, 2], [794, 622, 10, 5, 12, 9], [794, 665, 15, 4, 12, 1], [794, 725, 10, 4, 12, 10], [794, 766, 14, 2, 12, 0], [855, 1, 14, 2, 12, 0], [855, 52, 14, 2, 12, 0], [855, 103, 14, 2, 12, 0], [855, 154, 14, 2, 12, 0], [855, 205, 14, 2, 12, 0], [855, 256, 14, 2, 12, 0], [855, 307, 14, 2, 12, 0], [855, 358, 14, 2, 12, 0], [855, 409, 14, 2, 12, 0], [855, 460, 14, 2, 12, 0], [855, 511, 14, 2, 12, 0], [855, 562, 14, 2, 12, 0], [855, 613, 14, 2, 12, 0], [855, 664, 14, 2, 12, 0], [855, 715, 14, 2, 12, 0], [855, 766, 14, 2, 12, 0]], \"capHeight\": 11, \"widestlogicalchar\": 16, \"widestglyph\": 21, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 13, 6, 13, 6], [1, 54, 13, 11, 13, 2], [1, 105, 13, 10, 13, 2], [1, 156, 13, 10, 13, 2], [1, 206, 13, 14, 13, 1], [1, 258, 13, 11, 13, 2], [1, 309, 13, 11, 13, 2], [1, 360, 13, 10, 13, 2], [1, 411, 13, 14, 13, 2], [1, 462, 13, 14, 13, 2], [1, 512, 13, 11, 13, 1], [1, 566, 13, 9, 13, 4], [1, 619, 13, 9, 13, 6], [1, 670, 13, 6, 13, 6], [1, 721, 13, 7, 13, 6], [1, 768, 13, 11, 13, 2], [62, 3, 13, 11, 13, 2], [62, 54, 13, 11, 13, 2], [62, 105, 13, 11, 13, 2], [62, 156, 13, 11, 13, 2], [62, 207, 13, 11, 13, 2], [62, 258, 13, 11, 13, 2], [62, 309, 13, 11, 13, 2], [62, 360, 13, 11, 13, 2], [62, 411, 13, 11, 13, 2], [62, 462, 13, 11, 13, 2], [62, 515, 13, 9, 13, 4], [62, 566, 13, 11, 13, 4], [62, 618, 13, 7, 13, 5], [62, 670, 13, 6, 13, 6], [62, 720, 13, 7, 13, 5], [62, 768, 13, 11, 13, 2], [123, 3, 13, 11, 13, 2], [123, 54, 13, 11, 13, 2], [123, 105, 13, 11, 13, 2], [123, 156, 13, 11, 13, 2], [123, 207, 13, 11, 13, 2], [123, 258, 13, 11, 13, 2], [123, 309, 13, 11, 13, 2], [123, 360, 13, 11, 13, 2], [123, 411, 13, 11, 13, 2], [123, 462, 13, 11, 13, 2], [123, 513, 13, 11, 13, 2], [123, 564, 13, 11, 13, 2], [123, 615, 13, 11, 13, 2], [123, 666, 13, 11, 13, 2], [123, 717, 13, 11, 13, 2], [123, 768, 13, 11, 13, 2], [184, 3, 13, 11, 13, 2], [184, 54, 13, 12, 13, 2], [184, 105, 13, 11, 13, 2], [184, 156, 13, 11, 13, 2], [184, 207, 13, 11, 13, 2], [184, 258, 13, 11, 13, 2], [184, 309, 13, 11, 13, 2], [184, 360, 13, 11, 13, 2], [184, 411, 13, 11, 13, 2], [184, 462, 13, 11, 13, 2], [184, 513, 13, 11, 13, 2], [184, 564, 13, 14, 13, 2], [184, 615, 13, 11, 13, 2], [184, 666, 13, 14, 13, 2], [184, 717, 13, 10, 13, 2], [184, 772, 13, 10, 13, 6], [245, 3, 13, 10, 13, 2], [245, 56, 13, 9, 13, 4], [245, 105, 13, 11, 13, 2], [245, 158, 13, 9, 13, 4], [245, 207, 13, 11, 13, 2], [245, 260, 13, 9, 13, 4], [245, 309, 13, 11, 13, 2], [245, 362, 13, 12, 13, 4], [245, 411, 13, 11, 13, 2], [245, 462, 13, 11, 13, 2], [245, 513, 13, 14, 13, 2], [245, 564, 13, 11, 13, 2], [245, 615, 13, 11, 13, 2], [245, 668, 13, 9, 13, 4], [245, 719, 13, 9, 13, 4], [245, 770, 13, 9, 13, 4], [306, 5, 13, 12, 13, 4], [306, 56, 13, 12, 13, 4], [306, 107, 13, 9, 13, 4], [306, 158, 13, 9, 13, 4], [306, 207, 13, 11, 13, 2], [306, 260, 13, 9, 13, 4], [306, 311, 13, 9, 13, 4], [306, 362, 13, 9, 13, 4], [306, 413, 13, 9, 13, 4], [306, 464, 13, 12, 13, 4], [306, 515, 13, 9, 13, 4], [306, 564, 13, 14, 13, 2], [306, 615, 13, 14, 13, 2], [306, 666, 13, 14, 13, 2], [306, 718, 13, 9, 13, 3], [306, 768, 13, 11, 13, 2], [367, 1, 13, 13, 13, 0], [367, 52, 13, 13, 13, 0], [367, 105, 13, 14, 13, 2], [367, 154, 13, 13, 13, 0], [367, 205, 13, 13, 13, 0], [367, 256, 13, 13, 13, 0], [367, 307, 13, 13, 13, 0], [367, 359, 13, 12, 13, 1], [367, 410, 13, 12, 13, 1], [367, 461, 13, 12, 13, 1], [367, 513, 13, 11, 13, 2], [367, 563, 13, 12, 13, 1], [367, 613, 13, 13, 13, 0], [367, 668, 13, 12, 13, 4], [367, 716, 13, 12, 13, 1], [367, 767, 13, 12, 13, 1], [428, 2, 13, 12, 13, 1], [428, 54, 13, 11, 13, 2], [428, 104, 13, 12, 13, 1], [428, 155, 13, 12, 13, 1], [428, 206, 13, 12, 13, 1], [428, 258, 13, 11, 13, 2], [428, 308, 13, 12, 13, 1], [428, 359, 13, 12, 13, 1], [428, 410, 13, 12, 13, 1], [428, 461, 13, 12, 13, 1], [428, 513, 13, 11, 13, 2], [428, 563, 13, 12, 13, 1], [428, 614, 13, 12, 13, 1], [428, 665, 13, 12, 13, 1], [428, 716, 13, 12, 13, 1], [428, 768, 13, 11, 13, 2], [489, 3, 13, 13, 13, 2], [489, 54, 13, 10, 13, 2], [489, 105, 13, 12, 13, 2], [489, 156, 13, 11, 13, 2], [489, 207, 13, 14, 13, 2], [489, 261, 13, 7, 13, 5], [489, 309, 13, 14, 13, 2], [489, 360, 13, 11, 13, 2], [489, 410, 16, 12, 16, 1], [489, 461, 16, 12, 16, 1], [489, 512, 17, 11, 17, 1], [489, 564, 13, 10, 13, 2], [489, 615, 13, 10, 13, 2], [489, 669, 13, 7, 13, 5], [489, 717, 13, 11, 13, 2], [489, 768, 13, 11, 13, 2], [550, 5, 15, 8, 15, 4], [550, 56, 13, 9, 13, 4], [550, 108, 13, 8, 13, 5], [550, 159, 13, 8, 13, 5], [550, 207, 13, 11, 13, 2], [550, 260, 13, 11, 13, 4], [550, 308, 12, 12, 12, 1], [550, 359, 15, 13, 15, 1], [550, 410, 17, 13, 17, 1], [550, 463, 13, 10, 13, 3], [550, 513, 9, 14, 9, 2], [550, 564, 13, 10, 13, 2], [550, 615, 13, 10, 13, 2], [550, 665, 16, 12, 16, 1], [550, 719, 13, 9, 13, 4], [550, 770, 13, 9, 13, 4], [611, 6, 13, 11, 13, 5], [611, 56, 13, 12, 13, 4], [611, 109, 15, 6, 15, 6], [611, 156, 13, 11, 13, 2], [611, 207, 13, 14, 13, 2], [611, 262, 13, 6, 13, 6], [611, 309, 14, 11, 14, 2], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 466, 13, 7, 13, 6], [611, 517, 13, 6, 13, 6], [611, 562, 13, 13, 13, 0], [611, 613, 13, 13, 13, 0], [611, 664, 13, 13, 13, 0], [611, 717, 13, 11, 13, 2], [611, 770, 13, 9, 13, 4], [672, 7, 13, 6, 13, 6], [672, 58, 13, 6, 13, 6], [672, 105, 13, 10, 13, 2], [672, 156, 13, 10, 13, 2], [672, 207, 13, 10, 13, 2], [672, 258, 13, 10, 13, 2], [672, 312, 13, 7, 13, 5], [672, 359, 12, 12, 12, 1], [672, 411, 13, 14, 13, 2], [1, 7, 13, 6, 13, 6], [794, 766, 13, 12, 13, 0], [672, 565, 13, 9, 13, 3], [672, 618, 13, 7, 13, 5], [672, 669, 13, 7, 13, 5], [672, 717, 13, 11, 13, 2], [672, 768, 13, 11, 13, 2], [733, 3, 13, 13, 13, 2], [733, 58, 13, 6, 13, 6], [733, 109, 13, 9, 13, 6], [733, 160, 13, 9, 13, 6], [733, 206, 13, 11, 13, 1], [733, 256, 13, 13, 13, 0], [733, 307, 13, 13, 13, 0], [733, 358, 13, 13, 13, 0], [733, 409, 13, 13, 13, 0], [733, 460, 13, 13, 13, 0], [733, 511, 13, 13, 13, 0], [733, 562, 13, 13, 13, 0], [733, 613, 13, 13, 13, 0], [733, 664, 13, 13, 13, 0], [733, 715, 13, 13, 13, 0], [733, 766, 13, 13, 13, 0], [1, 7, 13, 6, 13, 6], [794, 52, 13, 13, 13, 0], [794, 103, 13, 13, 13, 0], [794, 154, 13, 13, 13, 0], [794, 205, 13, 13, 13, 0], [794, 260, 13, 9, 13, 4], [794, 309, 13, 10, 13, 2], [794, 361, 13, 9, 13, 3], [794, 413, 13, 8, 13, 4], [794, 463, 13, 9, 13, 3], [794, 514, 13, 9, 13, 3], [794, 564, 13, 10, 13, 2], [794, 619, 13, 10, 13, 6], [794, 665, 13, 11, 13, 1], [794, 721, 13, 10, 13, 6], [794, 766, 13, 12, 13, 0], [855, 1, 13, 12, 13, 0], [855, 52, 13, 12, 13, 0], [855, 103, 13, 12, 13, 0], [855, 154, 13, 12, 13, 0], [855, 205, 13, 12, 13, 0], [855, 256, 13, 12, 13, 0], [855, 307, 13, 12, 13, 0], [855, 358, 13, 12, 13, 0], [855, 409, 13, 12, 13, 0], [855, 460, 13, 12, 13, 0], [855, 511, 13, 12, 13, 0], [855, 562, 13, 12, 13, 0], [855, 613, 13, 12, 13, 0], [855, 664, 13, 12, 13, 0], [855, 715, 13, 12, 13, 0], [855, 766, 13, 12, 13, 0]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 12, 6, 12, 5], [1, 54, 12, 9, 12, 2], [1, 105, 12, 9, 12, 2], [1, 156, 12, 9, 12, 2], [1, 206, 12, 12, 12, 1], [1, 258, 12, 9, 12, 2], [1, 309, 12, 9, 12, 2], [1, 360, 12, 9, 12, 2], [1, 411, 12, 12, 12, 2], [1, 462, 12, 12, 12, 2], [1, 512, 12, 10, 12, 1], [1, 566, 12, 7, 12, 4], [1, 618, 12, 8, 12, 5], [1, 669, 12, 6, 12, 5], [1, 720, 12, 6, 12, 5], [1, 768, 12, 9, 12, 2], [62, 3, 12, 9, 12, 2], [62, 54, 12, 9, 12, 2], [62, 105, 12, 9, 12, 2], [62, 156, 12, 9, 12, 2], [62, 207, 12, 9, 12, 2], [62, 258, 12, 9, 12, 2], [62, 309, 12, 9, 12, 2], [62, 360, 12, 9, 12, 2], [62, 411, 12, 9, 12, 2], [62, 462, 12, 9, 12, 2], [62, 515, 12, 7, 12, 4], [62, 566, 12, 9, 12, 4], [62, 618, 12, 6, 12, 5], [62, 669, 12, 6, 12, 5], [62, 720, 12, 6, 12, 5], [62, 768, 12, 9, 12, 2], [123, 3, 12, 9, 12, 2], [123, 54, 12, 9, 12, 2], [123, 105, 12, 9, 12, 2], [123, 156, 12, 9, 12, 2], [123, 207, 12, 9, 12, 2], [123, 258, 12, 9, 12, 2], [123, 309, 12, 9, 12, 2], [123, 360, 12, 9, 12, 2], [123, 411, 12, 9, 12, 2], [123, 462, 12, 9, 12, 2], [123, 513, 12, 9, 12, 2], [123, 564, 12, 9, 12, 2], [123, 615, 12, 9, 12, 2], [123, 666, 12, 9, 12, 2], [123, 717, 12, 9, 12, 2], [123, 768, 12, 9, 12, 2], [184, 3, 12, 9, 12, 2], [184, 54, 12, 10, 12, 2], [184, 105, 12, 9, 12, 2], [184, 156, 12, 9, 12, 2], [184, 207, 12, 9, 12, 2], [184, 258, 12, 9, 12, 2], [184, 309, 12, 9, 12, 2], [184, 360, 12, 9, 12, 2], [184, 411, 12, 9, 12, 2], [184, 462, 12, 9, 12, 2], [184, 513, 12, 9, 12, 2], [184, 564, 12, 12, 12, 2], [184, 615, 12, 9, 12, 2], [184, 666, 12, 12, 12, 2], [184, 717, 12, 9, 12, 2], [184, 771, 12, 9, 12, 5], [245, 3, 12, 9, 12, 2], [245, 56, 12, 7, 12, 4], [245, 105, 12, 9, 12, 2], [245, 158, 12, 7, 12, 4], [245, 207, 12, 9, 12, 2], [245, 260, 12, 7, 12, 4], [245, 309, 12, 9, 12, 2], [245, 362, 12, 10, 12, 4], [245, 411, 12, 9, 12, 2], [245, 462, 12, 9, 12, 2], [245, 513, 12, 12, 12, 2], [245, 564, 12, 9, 12, 2], [245, 615, 12, 9, 12, 2], [245, 668, 12, 7, 12, 4], [245, 719, 12, 7, 12, 4], [245, 770, 12, 7, 12, 4], [306, 5, 12, 10, 12, 4], [306, 56, 12, 10, 12, 4], [306, 107, 12, 7, 12, 4], [306, 158, 12, 7, 12, 4], [306, 207, 12, 9, 12, 2], [306, 260, 12, 7, 12, 4], [306, 311, 12, 7, 12, 4], [306, 362, 12, 7, 12, 4], [306, 413, 12, 7, 12, 4], [306, 464, 12, 10, 12, 4], [306, 515, 12, 7, 12, 4], [306, 564, 12, 12, 12, 2], [306, 615, 12, 12, 12, 2], [306, 666, 12, 12, 12, 2], [306, 718, 12, 8, 12, 3], [306, 768, 12, 9, 12, 2], [367, 1, 12, 11, 12, 0], [367, 52, 12, 11, 12, 0], [367, 105, 12, 12, 12, 2], [367, 154, 12, 11, 12, 0], [367, 205, 12, 11, 12, 0], [367, 256, 12, 11, 12, 0], [367, 307, 12, 11, 12, 0], [367, 359, 12, 10, 12, 1], [367, 410, 12, 10, 12, 1], [367, 461, 12, 10, 12, 1], [367, 513, 12, 9, 12, 2], [367, 563, 12, 10, 12, 1], [367, 613, 12, 11, 12, 0], [367, 668, 12, 10, 12, 4], [367, 716, 12, 10, 12, 1], [367, 767, 12, 10, 12, 1], [428, 2, 12, 10, 12, 1], [428, 54, 12, 9, 12, 2], [428, 104, 12, 10, 12, 1], [428, 155, 12, 10, 12, 1], [428, 206, 12, 10, 12, 1], [428, 258, 12, 9, 12, 2], [428, 308, 12, 10, 12, 1], [428, 359, 12, 10, 12, 1], [428, 410, 12, 10, 12, 1], [428, 461, 12, 10, 12, 1], [428, 513, 12, 9, 12, 2], [428, 563, 12, 10, 12, 1], [428, 614, 12, 10, 12, 1], [428, 665, 12, 10, 12, 1], [428, 716, 12, 10, 12, 1], [428, 768, 12, 9, 12, 2], [489, 3, 12, 11, 12, 2], [489, 54, 12, 9, 12, 2], [489, 105, 12, 10, 12, 2], [489, 156, 12, 9, 12, 2], [489, 207, 12, 12, 12, 2], [489, 261, 12, 6, 12, 5], [489, 309, 12, 12, 12, 2], [489, 360, 12, 9, 12, 2], [489, 410, 15, 10, 15, 1], [489, 461, 15, 10, 15, 1], [489, 512, 16, 10, 16, 1], [489, 564, 12, 9, 12, 2], [489, 615, 12, 9, 12, 2], [489, 669, 12, 6, 12, 5], [489, 717, 12, 9, 12, 2], [489, 768, 12, 9, 12, 2], [550, 5, 14, 7, 14, 4], [550, 56, 12, 7, 12, 4], [550, 108, 12, 6, 12, 5], [550, 159, 12, 6, 12, 5], [550, 207, 12, 9, 12, 2], [550, 260, 12, 9, 12, 4], [550, 308, 11, 10, 11, 1], [550, 359, 14, 11, 14, 1], [550, 410, 16, 11, 16, 1], [550, 463, 12, 8, 12, 3], [550, 513, 8, 12, 8, 2], [550, 564, 12, 9, 12, 2], [550, 615, 12, 9, 12, 2], [550, 665, 15, 10, 15, 1], [550, 719, 12, 7, 12, 4], [550, 770, 12, 7, 12, 4], [611, 6, 12, 9, 12, 5], [611, 56, 12, 10, 12, 4], [611, 108, 14, 6, 14, 5], [611, 156, 12, 9, 12, 2], [611, 207, 12, 12, 12, 2], [611, 261, 12, 6, 12, 5], [611, 309, 13, 9, 13, 2], [611, 363, 12, 6, 12, 5], [611, 414, 12, 6, 12, 5], [611, 465, 12, 6, 12, 5], [611, 516, 12, 6, 12, 5], [611, 562, 12, 11, 12, 0], [611, 613, 12, 11, 12, 0], [611, 664, 12, 11, 12, 0], [611, 717, 12, 9, 12, 2], [611, 770, 12, 7, 12, 4], [672, 6, 12, 6, 12, 5], [672, 57, 12, 6, 12, 5], [672, 105, 12, 9, 12, 2], [672, 156, 12, 9, 12, 2], [672, 207, 12, 9, 12, 2], [672, 258, 12, 9, 12, 2], [672, 312, 12, 6, 12, 5], [672, 359, 11, 10, 11, 1], [672, 411, 12, 12, 12, 2], [1, 6, 12, 6, 12, 5], [794, 766, 12, 11, 12, 0], [672, 565, 12, 8, 12, 3], [672, 618, 12, 6, 12, 5], [672, 669, 12, 6, 12, 5], [672, 717, 12, 9, 12, 2], [672, 768, 12, 9, 12, 2], [733, 3, 12, 11, 12, 2], [733, 57, 12, 6, 12, 5], [733, 108, 12, 8, 12, 5], [733, 159, 12, 8, 12, 5], [733, 206, 12, 10, 12, 1], [733, 256, 12, 11, 12, 0], [733, 307, 12, 11, 12, 0], [733, 358, 12, 11, 12, 0], [733, 409, 12, 11, 12, 0], [733, 460, 12, 11, 12, 0], [733, 511, 12, 11, 12, 0], [733, 562, 12, 11, 12, 0], [733, 613, 12, 11, 12, 0], [733, 664, 12, 11, 12, 0], [733, 715, 12, 11, 12, 0], [733, 766, 12, 11, 12, 0], [1, 6, 12, 6, 12, 5], [794, 52, 12, 11, 12, 0], [794, 103, 12, 11, 12, 0], [794, 154, 12, 11, 12, 0], [794, 205, 12, 11, 12, 0], [794, 260, 12, 7, 12, 4], [794, 309, 12, 9, 12, 2], [794, 361, 12, 8, 12, 3], [794, 413, 12, 7, 12, 4], [794, 463, 12, 8, 12, 3], [794, 514, 12, 8, 12, 3], [794, 564, 12, 9, 12, 2], [794, 618, 12, 9, 12, 5], [794, 665, 12, 10, 12, 1], [794, 720, 12, 9, 12, 5], [794, 766, 12, 11, 12, 0], [855, 1, 12, 11, 12, 0], [855, 52, 12, 11, 12, 0], [855, 103, 12, 11, 12, 0], [855, 154, 12, 11, 12, 0], [855, 205, 12, 11, 12, 0], [855, 256, 12, 11, 12, 0], [855, 307, 12, 11, 12, 0], [855, 358, 12, 11, 12, 0], [855, 409, 12, 11, 12, 0], [855, 460, 12, 11, 12, 0], [855, 511, 12, 11, 12, 0], [855, 562, 12, 11, 12, 0], [855, 613, 12, 11, 12, 0], [855, 664, 12, 11, 12, 0], [855, 715, 12, 11, 12, 0], [855, 766, 12, 11, 12, 0]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 54, 13, 11, 12, 2], [1, 105, 14, 5, 12, 2], [1, 156, 15, 10, 12, 2], [1, 206, 14, 14, 12, 1], [1, 258, 14, 11, 12, 2], [1, 309, 14, 11, 12, 2], [1, 360, 13, 5, 12, 2], [1, 411, 14, 14, 12, 2], [1, 462, 13, 14, 12, 2], [1, 512, 15, 8, 12, 1], [1, 566, 14, 9, 12, 4], [1, 623, 9, 5, 12, 10], [1, 671, 14, 3, 12, 7], [1, 725, 9, 3, 12, 10], [1, 768, 16, 11, 12, 2], [62, 3, 15, 11, 12, 2], [62, 54, 13, 11, 12, 2], [62, 105, 16, 11, 12, 2], [62, 156, 16, 11, 12, 2], [62, 207, 15, 11, 12, 2], [62, 258, 16, 11, 12, 2], [62, 309, 14, 11, 12, 2], [62, 360, 16, 11, 12, 2], [62, 411, 16, 11, 12, 2], [62, 462, 15, 11, 12, 2], [62, 515, 12, 9, 12, 4], [62, 566, 12, 11, 12, 4], [62, 618, 14, 7, 12, 5], [62, 670, 13, 5, 12, 6], [62, 720, 13, 7, 12, 5], [62, 768, 14, 11, 12, 2], [123, 3, 16, 11, 12, 2], [123, 54, 13, 11, 12, 2], [123, 105, 16, 11, 12, 2], [123, 156, 15, 11, 12, 2], [123, 207, 15, 11, 12, 2], [123, 258, 16, 11, 12, 2], [123, 309, 16, 11, 12, 2], [123, 360, 16, 11, 12, 2], [123, 411, 16, 11, 12, 2], [123, 462, 15, 11, 12, 2], [123, 513, 16, 11, 12, 2], [123, 564, 16, 11, 12, 2], [123, 615, 13, 11, 12, 2], [123, 666, 16, 11, 12, 2], [123, 717, 17, 11, 12, 2], [123, 768, 15, 11, 12, 2], [184, 3, 16, 11, 12, 2], [184, 54, 15, 12, 12, 2], [184, 105, 15, 11, 12, 2], [184, 156, 16, 11, 12, 2], [184, 207, 16, 11, 12, 2], [184, 258, 17, 11, 12, 2], [184, 309, 16, 11, 12, 2], [184, 360, 16, 11, 12, 2], [184, 411, 16, 11, 12, 2], [184, 462, 16, 11, 12, 2], [184, 513, 16, 11, 12, 2], [184, 564, 14, 14, 12, 2], [184, 615, 12, 11, 12, 2], [184, 666, 14, 14, 12, 2], [184, 717, 15, 5, 12, 2], [184, 779, 12, 3, 12, 13], [245, 3, 13, 4, 12, 2], [245, 56, 14, 9, 12, 4], [245, 105, 14, 11, 12, 2], [245, 158, 15, 9, 12, 4], [245, 207, 15, 11, 12, 2], [245, 260, 14, 9, 12, 4], [245, 309, 15, 11, 12, 2], [245, 362, 15, 12, 12, 4], [245, 411, 14, 11, 12, 2], [245, 462, 13, 11, 12, 2], [245, 513, 14, 14, 12, 2], [245, 564, 15, 11, 12, 2], [245, 615, 13, 11, 12, 2], [245, 668, 15, 9, 12, 4], [245, 719, 15, 9, 12, 4], [245, 770, 14, 9, 12, 4], [306, 5, 14, 12, 12, 4], [306, 56, 15, 12, 12, 4], [306, 107, 15, 9, 12, 4], [306, 158, 15, 9, 12, 4], [306, 207, 14, 11, 12, 2], [306, 260, 15, 9, 12, 4], [306, 311, 15, 9, 12, 4], [306, 362, 15, 9, 12, 4], [306, 413, 15, 9, 12, 4], [306, 464, 15, 12, 12, 4], [306, 515, 15, 9, 12, 4], [306, 564, 14, 14, 12, 2], [306, 615, 13, 14, 12, 2], [306, 666, 13, 14, 12, 2], [306, 718, 16, 4, 12, 3], [306, 768, 16, 11, 12, 2], [367, 1, 15, 13, 12, 0], [367, 52, 15, 13, 12, 0], [367, 105, 16, 14, 12, 2], [367, 154, 16, 13, 12, 0], [367, 205, 16, 13, 12, 0], [367, 256, 15, 13, 12, 0], [367, 307, 17, 13, 12, 0], [367, 359, 15, 12, 12, 1], [367, 410, 14, 12, 12, 1], [367, 461, 14, 12, 12, 1], [367, 513, 14, 11, 12, 2], [367, 563, 16, 12, 12, 1], [367, 613, 15, 13, 12, 0], [367, 668, 15, 12, 12, 4], [367, 716, 15, 12, 12, 1], [367, 767, 14, 12, 12, 1], [428, 2, 14, 12, 12, 1], [428, 54, 14, 11, 12, 2], [428, 104, 14, 12, 12, 1], [428, 155, 13, 12, 12, 1], [428, 206, 14, 12, 12, 1], [428, 258, 13, 11, 12, 2], [428, 308, 17, 12, 12, 1], [428, 359, 15, 12, 12, 1], [428, 410, 14, 12, 12, 1], [428, 461, 14, 12, 12, 1], [428, 513, 14, 11, 12, 2], [428, 563, 16, 12, 12, 1], [428, 614, 15, 12, 12, 1], [428, 665, 15, 12, 12, 1], [428, 716, 15, 12, 12, 1], [428, 768, 15, 11, 12, 2], [489, 3, 14, 13, 12, 2], [489, 54, 14, 6, 12, 2], [489, 105, 14, 12, 12, 2], [489, 156, 15, 11, 12, 2], [489, 207, 16, 14, 12, 2], [489, 261, 13, 7, 12, 5], [489, 309, 16, 14, 12, 2], [489, 360, 15, 11, 12, 2], [489, 410, 18, 12, 15, 1], [489, 461, 18, 12, 15, 1], [489, 512, 21, 7, 16, 1], [489, 564, 14, 4, 12, 2], [489, 615, 15, 3, 12, 2], [489, 669, 14, 7, 12, 5], [489, 717, 17, 11, 12, 2], [489, 768, 16, 11, 12, 2], [550, 5, 17, 7, 14, 4], [550, 56, 14, 9, 12, 4], [550, 108, 15, 8, 12, 5], [550, 159, 14, 8, 12, 5], [550, 207, 16, 11, 12, 2], [550, 260, 13, 11, 12, 4], [550, 308, 15, 12, 11, 1], [550, 359, 19, 13, 14, 1], [550, 410, 20, 13, 16, 1], [550, 463, 16, 10, 12, 3], [550, 513, 12, 14, 8, 2], [550, 564, 14, 9, 12, 2], [550, 615, 14, 9, 12, 2], [550, 665, 18, 12, 15, 1], [550, 719, 15, 9, 12, 4], [550, 770, 15, 9, 12, 4], [611, 6, 12, 11, 12, 5], [611, 56, 12, 12, 12, 4], [611, 110, 16, 5, 14, 7], [611, 156, 16, 11, 12, 2], [611, 207, 15, 14, 12, 2], [611, 262, 14, 6, 12, 6], [611, 309, 14, 11, 13, 2], [611, 363, 14, 7, 12, 5], [611, 414, 14, 7, 12, 5], [611, 470, 12, 3, 12, 10], [611, 511, 1, 1, 12, 1], [611, 562, 14, 13, 12, 0], [611, 613, 16, 13, 12, 0], [611, 664, 17, 13, 12, 0], [611, 717, 17, 11, 12, 2], [611, 770, 15, 9, 12, 4], [672, 8, 13, 3, 12, 7], [672, 59, 14, 3, 12, 7], [672, 105, 15, 5, 12, 2], [672, 156, 16, 5, 12, 2], [672, 207, 14, 5, 12, 2], [672, 258, 14, 5, 12, 2], [672, 312, 14, 7, 12, 5], [672, 359, 14, 12, 11, 1], [672, 411, 15, 14, 12, 2], [1, 1, 1, 1, 12, 1], [794, 766, 15, 4, 12, 0], [672, 565, 16, 9, 12, 3], [672, 618, 12, 7, 12, 5], [672, 669, 12, 7, 12, 5], [672, 717, 15, 11, 12, 2], [672, 768, 15, 11, 12, 2], [733, 3, 14, 13, 12, 2], [733, 58, 11, 3, 12, 6], [733, 113, 9, 5, 12, 10], [733, 164, 11, 5, 12, 10], [733, 206, 17, 11, 12, 1], [733, 256, 15, 13, 12, 0], [733, 307, 16, 13, 12, 0], [733, 358, 15, 13, 12, 0], [733, 409, 16, 13, 12, 0], [733, 460, 16, 13, 12, 0], [733, 511, 15, 13, 12, 0], [733, 562, 15, 13, 12, 0], [733, 613, 15, 13, 12, 0], [733, 664, 15, 13, 12, 0], [733, 715, 15, 13, 12, 0], [733, 766, 15, 13, 12, 0], [1, 1, 1, 1, 12, 1], [794, 52, 15, 13, 12, 0], [794, 103, 17, 13, 12, 0], [794, 154, 17, 13, 12, 0], [794, 205, 17, 13, 12, 0], [794, 260, 12, 9, 12, 4], [794, 309, 14, 5, 12, 2], [794, 361, 16, 4, 12, 3], [794, 413, 14, 3, 12, 4], [794, 463, 15, 4, 12, 3], [794, 514, 13, 3, 12, 3], [794, 564, 14, 6, 12, 2], [794, 622, 10, 7, 12, 9], [794, 665, 15, 6, 12, 1], [794, 725, 10, 6, 12, 10], [794, 766, 15, 4, 12, 0], [855, 1, 15, 4, 12, 0], [855, 52, 15, 4, 12, 0], [855, 103, 15, 4, 12, 0], [855, 154, 15, 4, 12, 0], [855, 205, 15, 4, 12, 0], [855, 256, 15, 4, 12, 0], [855, 307, 15, 4, 12, 0], [855, 358, 15, 4, 12, 0], [855, 409, 15, 4, 12, 0], [855, 460, 15, 4, 12, 0], [855, 511, 15, 4, 12, 0], [855, 562, 15, 4, 12, 0], [855, 613, 15, 4, 12, 0], [855, 664, 15, 4, 12, 0], [855, 715, 15, 4, 12, 0], [855, 766, 15, 4, 12, 0]], \"capHeight\": 12, \"widestlogicalchar\": 16, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 12, 9, 11, 2], [1, 105, 13, 3, 11, 2], [1, 156, 14, 8, 11, 2], [1, 206, 13, 12, 11, 1], [1, 258, 13, 9, 11, 2], [1, 309, 13, 9, 11, 2], [1, 360, 12, 3, 11, 2], [1, 411, 13, 12, 11, 2], [1, 462, 12, 12, 11, 2], [1, 512, 14, 6, 11, 1], [1, 566, 13, 7, 11, 4], [1, 623, 8, 3, 11, 10], [1, 671, 13, 1, 11, 7], [1, 725, 8, 1, 11, 10], [1, 768, 15, 9, 11, 2], [62, 3, 14, 9, 11, 2], [62, 54, 12, 9, 11, 2], [62, 105, 15, 9, 11, 2], [62, 156, 15, 9, 11, 2], [62, 207, 14, 9, 11, 2], [62, 258, 15, 9, 11, 2], [62, 309, 13, 9, 11, 2], [62, 360, 15, 9, 11, 2], [62, 411, 15, 9, 11, 2], [62, 462, 14, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 11, 9, 11, 4], [62, 618, 13, 5, 11, 5], [62, 670, 12, 3, 11, 6], [62, 720, 12, 5, 11, 5], [62, 768, 13, 9, 11, 2], [123, 3, 15, 9, 11, 2], [123, 54, 12, 9, 11, 2], [123, 105, 15, 9, 11, 2], [123, 156, 14, 9, 11, 2], [123, 207, 14, 9, 11, 2], [123, 258, 15, 9, 11, 2], [123, 309, 15, 9, 11, 2], [123, 360, 15, 9, 11, 2], [123, 411, 15, 9, 11, 2], [123, 462, 14, 9, 11, 2], [123, 513, 15, 9, 11, 2], [123, 564, 15, 9, 11, 2], [123, 615, 12, 9, 11, 2], [123, 666, 15, 9, 11, 2], [123, 717, 16, 9, 11, 2], [123, 768, 14, 9, 11, 2], [184, 3, 15, 9, 11, 2], [184, 54, 14, 10, 11, 2], [184, 105, 14, 9, 11, 2], [184, 156, 15, 9, 11, 2], [184, 207, 15, 9, 11, 2], [184, 258, 16, 9, 11, 2], [184, 309, 15, 9, 11, 2], [184, 360, 15, 9, 11, 2], [184, 411, 15, 9, 11, 2], [184, 462, 15, 9, 11, 2], [184, 513, 15, 9, 11, 2], [184, 564, 13, 12, 11, 2], [184, 615, 11, 9, 11, 2], [184, 666, 13, 12, 11, 2], [184, 717, 14, 3, 11, 2], [184, 779, 11, 1, 11, 13], [245, 3, 12, 2, 11, 2], [245, 56, 13, 7, 11, 4], [245, 105, 13, 9, 11, 2], [245, 158, 14, 7, 11, 4], [245, 207, 14, 9, 11, 2], [245, 260, 13, 7, 11, 4], [245, 309, 14, 9, 11, 2], [245, 362, 14, 10, 11, 4], [245, 411, 13, 9, 11, 2], [245, 462, 12, 9, 11, 2], [245, 513, 13, 12, 11, 2], [245, 564, 14, 9, 11, 2], [245, 615, 12, 9, 11, 2], [245, 668, 14, 7, 11, 4], [245, 719, 14, 7, 11, 4], [245, 770, 13, 7, 11, 4], [306, 5, 13, 10, 11, 4], [306, 56, 14, 10, 11, 4], [306, 107, 14, 7, 11, 4], [306, 158, 14, 7, 11, 4], [306, 207, 13, 9, 11, 2], [306, 260, 14, 7, 11, 4], [306, 311, 14, 7, 11, 4], [306, 362, 14, 7, 11, 4], [306, 413, 14, 7, 11, 4], [306, 464, 14, 10, 11, 4], [306, 515, 14, 7, 11, 4], [306, 564, 13, 12, 11, 2], [306, 615, 12, 12, 11, 2], [306, 666, 12, 12, 11, 2], [306, 718, 15, 2, 11, 3], [306, 768, 15, 9, 11, 2], [367, 1, 12, 11, 11, 0], [367, 52, 14, 11, 11, 0], [367, 105, 15, 12, 11, 2], [367, 154, 15, 11, 11, 0], [367, 205, 15, 11, 11, 0], [367, 256, 14, 11, 11, 0], [367, 307, 16, 11, 11, 0], [367, 359, 14, 10, 11, 1], [367, 410, 13, 10, 11, 1], [367, 461, 13, 10, 11, 1], [367, 513, 13, 9, 11, 2], [367, 563, 15, 10, 11, 1], [367, 613, 14, 11, 11, 0], [367, 668, 14, 10, 11, 4], [367, 716, 14, 10, 11, 1], [367, 767, 13, 10, 11, 1], [428, 2, 13, 10, 11, 1], [428, 54, 13, 9, 11, 2], [428, 104, 13, 10, 11, 1], [428, 155, 12, 10, 11, 1], [428, 206, 13, 10, 11, 1], [428, 258, 12, 9, 11, 2], [428, 308, 16, 10, 11, 1], [428, 359, 14, 10, 11, 1], [428, 410, 13, 10, 11, 1], [428, 461, 13, 10, 11, 1], [428, 513, 13, 9, 11, 2], [428, 563, 15, 10, 11, 1], [428, 614, 14, 10, 11, 1], [428, 665, 14, 10, 11, 1], [428, 716, 14, 10, 11, 1], [428, 768, 14, 9, 11, 2], [489, 3, 13, 11, 11, 2], [489, 54, 13, 4, 11, 2], [489, 105, 13, 10, 11, 2], [489, 156, 14, 9, 11, 2], [489, 207, 15, 12, 11, 2], [489, 261, 12, 5, 11, 5], [489, 309, 15, 12, 11, 2], [489, 360, 14, 9, 11, 2], [489, 410, 17, 10, 14, 1], [489, 461, 17, 10, 14, 1], [489, 512, 20, 5, 15, 1], [489, 564, 13, 2, 11, 2], [489, 615, 14, 1, 11, 2], [489, 669, 13, 5, 11, 5], [489, 717, 16, 9, 11, 2], [489, 768, 15, 9, 11, 2], [550, 5, 16, 5, 13, 4], [550, 56, 13, 7, 11, 4], [550, 108, 14, 6, 11, 5], [550, 159, 13, 6, 11, 5], [550, 207, 15, 9, 11, 2], [550, 260, 12, 9, 11, 4], [550, 308, 14, 10, 10, 1], [550, 359, 18, 11, 13, 1], [550, 410, 19, 11, 15, 1], [550, 463, 15, 8, 11, 3], [550, 513, 11, 12, 7, 2], [550, 564, 13, 7, 11, 2], [550, 615, 13, 7, 11, 2], [550, 665, 17, 10, 14, 1], [550, 719, 14, 7, 11, 4], [550, 770, 14, 7, 11, 4], [611, 6, 11, 9, 11, 5], [611, 56, 11, 10, 11, 4], [611, 110, 15, 3, 13, 7], [611, 156, 15, 9, 11, 2], [611, 207, 14, 12, 11, 2], [611, 262, 13, 4, 11, 6], [611, 309, 13, 9, 12, 2], [611, 363, 13, 5, 11, 5], [611, 414, 13, 5, 11, 5], [611, 470, 11, 1, 11, 10], [611, 511, 1, 1, 11, 1], [611, 562, 13, 11, 11, 0], [611, 613, 14, 11, 11, 0], [611, 664, 15, 11, 11, 0], [611, 717, 16, 9, 11, 2], [611, 770, 14, 7, 11, 4], [672, 8, 12, 1, 11, 7], [672, 59, 13, 1, 11, 7], [672, 105, 14, 3, 11, 2], [672, 156, 15, 3, 11, 2], [672, 207, 13, 3, 11, 2], [672, 258, 13, 3, 11, 2], [672, 312, 13, 5, 11, 5], [672, 359, 13, 10, 10, 1], [672, 411, 14, 12, 11, 2], [1, 1, 1, 1, 11, 1], [794, 766, 13, 2, 11, 0], [672, 565, 15, 7, 11, 3], [672, 618, 11, 5, 11, 5], [672, 669, 11, 5, 11, 5], [672, 717, 14, 9, 11, 2], [672, 768, 14, 9, 11, 2], [733, 3, 13, 11, 11, 2], [733, 58, 10, 1, 11, 6], [733, 113, 8, 3, 11, 10], [733, 164, 10, 3, 11, 10], [733, 206, 16, 9, 11, 1], [733, 256, 14, 11, 11, 0], [733, 307, 15, 11, 11, 0], [733, 358, 13, 11, 11, 0], [733, 409, 15, 11, 11, 0], [733, 460, 15, 11, 11, 0], [733, 511, 14, 11, 11, 0], [733, 562, 14, 11, 11, 0], [733, 613, 14, 11, 11, 0], [733, 664, 14, 11, 11, 0], [733, 715, 14, 11, 11, 0], [733, 766, 14, 11, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 14, 11, 11, 0], [794, 103, 16, 11, 11, 0], [794, 154, 16, 11, 11, 0], [794, 205, 16, 11, 11, 0], [794, 260, 11, 7, 11, 4], [794, 309, 13, 3, 11, 2], [794, 361, 15, 2, 11, 3], [794, 413, 13, 1, 11, 4], [794, 463, 14, 2, 11, 3], [794, 514, 12, 1, 11, 3], [794, 564, 13, 4, 11, 2], [794, 622, 9, 5, 11, 9], [794, 665, 14, 4, 11, 1], [794, 725, 9, 4, 11, 10], [794, 766, 13, 2, 11, 0], [855, 1, 13, 2, 11, 0], [855, 52, 13, 2, 11, 0], [855, 103, 13, 2, 11, 0], [855, 154, 13, 2, 11, 0], [855, 205, 13, 2, 11, 0], [855, 256, 13, 2, 11, 0], [855, 307, 13, 2, 11, 0], [855, 358, 13, 2, 11, 0], [855, 409, 13, 2, 11, 0], [855, 460, 13, 2, 11, 0], [855, 511, 13, 2, 11, 0], [855, 562, 13, 2, 11, 0], [855, 613, 13, 2, 11, 0], [855, 664, 13, 2, 11, 0], [855, 715, 13, 2, 11, 0], [855, 766, 13, 2, 11, 0]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 20, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 12, 6, 12, 6], [1, 54, 12, 11, 12, 2], [1, 105, 12, 10, 12, 2], [1, 156, 12, 10, 12, 2], [1, 206, 12, 14, 12, 1], [1, 258, 12, 11, 12, 2], [1, 309, 12, 11, 12, 2], [1, 360, 12, 10, 12, 2], [1, 411, 12, 14, 12, 2], [1, 462, 12, 14, 12, 2], [1, 512, 12, 11, 12, 1], [1, 566, 12, 9, 12, 4], [1, 619, 12, 9, 12, 6], [1, 670, 12, 6, 12, 6], [1, 721, 12, 7, 12, 6], [1, 768, 12, 11, 12, 2], [62, 3, 12, 11, 12, 2], [62, 54, 12, 11, 12, 2], [62, 105, 12, 11, 12, 2], [62, 156, 12, 11, 12, 2], [62, 207, 12, 11, 12, 2], [62, 258, 12, 11, 12, 2], [62, 309, 12, 11, 12, 2], [62, 360, 12, 11, 12, 2], [62, 411, 12, 11, 12, 2], [62, 462, 12, 11, 12, 2], [62, 515, 12, 9, 12, 4], [62, 566, 12, 11, 12, 4], [62, 618, 12, 7, 12, 5], [62, 670, 12, 6, 12, 6], [62, 720, 12, 7, 12, 5], [62, 768, 12, 11, 12, 2], [123, 3, 12, 11, 12, 2], [123, 54, 12, 11, 12, 2], [123, 105, 12, 11, 12, 2], [123, 156, 12, 11, 12, 2], [123, 207, 12, 11, 12, 2], [123, 258, 12, 11, 12, 2], [123, 309, 12, 11, 12, 2], [123, 360, 12, 11, 12, 2], [123, 411, 12, 11, 12, 2], [123, 462, 12, 11, 12, 2], [123, 513, 12, 11, 12, 2], [123, 564, 12, 11, 12, 2], [123, 615, 12, 11, 12, 2], [123, 666, 12, 11, 12, 2], [123, 717, 12, 11, 12, 2], [123, 768, 12, 11, 12, 2], [184, 3, 12, 11, 12, 2], [184, 54, 12, 12, 12, 2], [184, 105, 12, 11, 12, 2], [184, 156, 12, 11, 12, 2], [184, 207, 12, 11, 12, 2], [184, 258, 12, 11, 12, 2], [184, 309, 12, 11, 12, 2], [184, 360, 12, 11, 12, 2], [184, 411, 12, 11, 12, 2], [184, 462, 12, 11, 12, 2], [184, 513, 12, 11, 12, 2], [184, 564, 12, 14, 12, 2], [184, 615, 12, 11, 12, 2], [184, 666, 12, 14, 12, 2], [184, 717, 12, 10, 12, 2], [184, 772, 12, 10, 12, 6], [245, 3, 12, 10, 12, 2], [245, 56, 12, 9, 12, 4], [245, 105, 12, 11, 12, 2], [245, 158, 12, 9, 12, 4], [245, 207, 12, 11, 12, 2], [245, 260, 12, 9, 12, 4], [245, 309, 12, 11, 12, 2], [245, 362, 12, 12, 12, 4], [245, 411, 12, 11, 12, 2], [245, 462, 12, 11, 12, 2], [245, 513, 12, 14, 12, 2], [245, 564, 12, 11, 12, 2], [245, 615, 12, 11, 12, 2], [245, 668, 12, 9, 12, 4], [245, 719, 12, 9, 12, 4], [245, 770, 12, 9, 12, 4], [306, 5, 12, 12, 12, 4], [306, 56, 12, 12, 12, 4], [306, 107, 12, 9, 12, 4], [306, 158, 12, 9, 12, 4], [306, 207, 12, 11, 12, 2], [306, 260, 12, 9, 12, 4], [306, 311, 12, 9, 12, 4], [306, 362, 12, 9, 12, 4], [306, 413, 12, 9, 12, 4], [306, 464, 12, 12, 12, 4], [306, 515, 12, 9, 12, 4], [306, 564, 12, 14, 12, 2], [306, 615, 12, 14, 12, 2], [306, 666, 12, 14, 12, 2], [306, 718, 12, 9, 12, 3], [306, 768, 12, 11, 12, 2], [367, 1, 12, 13, 12, 0], [367, 52, 12, 13, 12, 0], [367, 105, 12, 14, 12, 2], [367, 154, 12, 13, 12, 0], [367, 205, 12, 13, 12, 0], [367, 256, 12, 13, 12, 0], [367, 307, 12, 13, 12, 0], [367, 359, 12, 12, 12, 1], [367, 410, 12, 12, 12, 1], [367, 461, 12, 12, 12, 1], [367, 513, 12, 11, 12, 2], [367, 563, 12, 12, 12, 1], [367, 613, 12, 13, 12, 0], [367, 668, 12, 12, 12, 4], [367, 716, 12, 12, 12, 1], [367, 767, 12, 12, 12, 1], [428, 2, 12, 12, 12, 1], [428, 54, 12, 11, 12, 2], [428, 104, 12, 12, 12, 1], [428, 155, 12, 12, 12, 1], [428, 206, 12, 12, 12, 1], [428, 258, 12, 11, 12, 2], [428, 308, 12, 12, 12, 1], [428, 359, 12, 12, 12, 1], [428, 410, 12, 12, 12, 1], [428, 461, 12, 12, 12, 1], [428, 513, 12, 11, 12, 2], [428, 563, 12, 12, 12, 1], [428, 614, 12, 12, 12, 1], [428, 665, 12, 12, 12, 1], [428, 716, 12, 12, 12, 1], [428, 768, 12, 11, 12, 2], [489, 3, 12, 13, 12, 2], [489, 54, 12, 10, 12, 2], [489, 105, 12, 12, 12, 2], [489, 156, 12, 11, 12, 2], [489, 207, 12, 14, 12, 2], [489, 261, 12, 7, 12, 5], [489, 309, 12, 14, 12, 2], [489, 360, 12, 11, 12, 2], [489, 410, 15, 12, 15, 1], [489, 461, 15, 12, 15, 1], [489, 512, 16, 11, 16, 1], [489, 564, 12, 10, 12, 2], [489, 615, 12, 10, 12, 2], [489, 669, 12, 7, 12, 5], [489, 717, 12, 11, 12, 2], [489, 768, 12, 11, 12, 2], [550, 5, 14, 8, 14, 4], [550, 56, 12, 9, 12, 4], [550, 108, 12, 8, 12, 5], [550, 159, 12, 8, 12, 5], [550, 207, 12, 11, 12, 2], [550, 260, 12, 11, 12, 4], [550, 308, 11, 12, 11, 1], [550, 359, 14, 13, 14, 1], [550, 410, 16, 13, 16, 1], [550, 463, 12, 10, 12, 3], [550, 513, 8, 14, 8, 2], [550, 564, 12, 10, 12, 2], [550, 615, 12, 10, 12, 2], [550, 665, 15, 12, 15, 1], [550, 719, 12, 9, 12, 4], [550, 770, 12, 9, 12, 4], [611, 6, 12, 11, 12, 5], [611, 56, 12, 12, 12, 4], [611, 109, 14, 6, 14, 6], [611, 156, 12, 11, 12, 2], [611, 207, 12, 14, 12, 2], [611, 262, 12, 6, 12, 6], [611, 309, 13, 11, 13, 2], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 466, 12, 7, 12, 6], [611, 517, 12, 6, 12, 6], [611, 562, 12, 13, 12, 0], [611, 613, 12, 13, 12, 0], [611, 664, 12, 13, 12, 0], [611, 717, 12, 11, 12, 2], [611, 770, 12, 9, 12, 4], [672, 7, 12, 6, 12, 6], [672, 58, 12, 6, 12, 6], [672, 105, 12, 10, 12, 2], [672, 156, 12, 10, 12, 2], [672, 207, 12, 10, 12, 2], [672, 258, 12, 10, 12, 2], [672, 312, 12, 7, 12, 5], [672, 359, 11, 12, 11, 1], [672, 411, 12, 14, 12, 2], [1, 7, 12, 6, 12, 6], [794, 766, 12, 12, 12, 0], [672, 565, 12, 9, 12, 3], [672, 618, 12, 7, 12, 5], [672, 669, 12, 7, 12, 5], [672, 717, 12, 11, 12, 2], [672, 768, 12, 11, 12, 2], [733, 3, 12, 13, 12, 2], [733, 58, 12, 6, 12, 6], [733, 109, 12, 9, 12, 6], [733, 160, 12, 9, 12, 6], [733, 206, 12, 11, 12, 1], [733, 256, 12, 13, 12, 0], [733, 307, 12, 13, 12, 0], [733, 358, 12, 13, 12, 0], [733, 409, 12, 13, 12, 0], [733, 460, 12, 13, 12, 0], [733, 511, 12, 13, 12, 0], [733, 562, 12, 13, 12, 0], [733, 613, 12, 13, 12, 0], [733, 664, 12, 13, 12, 0], [733, 715, 12, 13, 12, 0], [733, 766, 12, 13, 12, 0], [1, 7, 12, 6, 12, 6], [794, 52, 12, 13, 12, 0], [794, 103, 12, 13, 12, 0], [794, 154, 12, 13, 12, 0], [794, 205, 12, 13, 12, 0], [794, 260, 12, 9, 12, 4], [794, 309, 12, 10, 12, 2], [794, 361, 12, 9, 12, 3], [794, 413, 12, 8, 12, 4], [794, 463, 12, 9, 12, 3], [794, 514, 12, 9, 12, 3], [794, 564, 12, 10, 12, 2], [794, 619, 12, 10, 12, 6], [794, 665, 12, 11, 12, 1], [794, 721, 12, 10, 12, 6], [794, 766, 12, 12, 12, 0], [855, 1, 12, 12, 12, 0], [855, 52, 12, 12, 12, 0], [855, 103, 12, 12, 12, 0], [855, 154, 12, 12, 12, 0], [855, 205, 12, 12, 12, 0], [855, 256, 12, 12, 12, 0], [855, 307, 12, 12, 12, 0], [855, 358, 12, 12, 12, 0], [855, 409, 12, 12, 12, 0], [855, 460, 12, 12, 12, 0], [855, 511, 12, 12, 12, 0], [855, 562, 12, 12, 12, 0], [855, 613, 12, 12, 12, 0], [855, 664, 12, 12, 12, 0], [855, 715, 12, 12, 12, 0], [855, 766, 12, 12, 12, 0]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 11, 6, 11, 5], [1, 54, 11, 9, 11, 2], [1, 105, 11, 9, 11, 2], [1, 156, 11, 9, 11, 2], [1, 206, 11, 12, 11, 1], [1, 258, 11, 9, 11, 2], [1, 309, 11, 9, 11, 2], [1, 360, 11, 9, 11, 2], [1, 411, 11, 12, 11, 2], [1, 462, 11, 12, 11, 2], [1, 512, 11, 10, 11, 1], [1, 566, 11, 7, 11, 4], [1, 618, 11, 8, 11, 5], [1, 669, 11, 6, 11, 5], [1, 720, 11, 6, 11, 5], [1, 768, 11, 9, 11, 2], [62, 3, 11, 9, 11, 2], [62, 54, 11, 9, 11, 2], [62, 105, 11, 9, 11, 2], [62, 156, 11, 9, 11, 2], [62, 207, 11, 9, 11, 2], [62, 258, 11, 9, 11, 2], [62, 309, 11, 9, 11, 2], [62, 360, 11, 9, 11, 2], [62, 411, 11, 9, 11, 2], [62, 462, 11, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 11, 9, 11, 4], [62, 618, 11, 6, 11, 5], [62, 669, 11, 6, 11, 5], [62, 720, 11, 6, 11, 5], [62, 768, 11, 9, 11, 2], [123, 3, 11, 9, 11, 2], [123, 54, 11, 9, 11, 2], [123, 105, 11, 9, 11, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 11, 9, 11, 2], [123, 309, 11, 9, 11, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 11, 9, 11, 2], [123, 513, 11, 9, 11, 2], [123, 564, 11, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 11, 9, 11, 2], [123, 717, 11, 9, 11, 2], [123, 768, 11, 9, 11, 2], [184, 3, 11, 9, 11, 2], [184, 54, 11, 10, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 11, 9, 11, 2], [184, 207, 11, 9, 11, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 11, 9, 11, 2], [184, 411, 11, 9, 11, 2], [184, 462, 11, 9, 11, 2], [184, 513, 11, 9, 11, 2], [184, 564, 11, 12, 11, 2], [184, 615, 11, 9, 11, 2], [184, 666, 11, 12, 11, 2], [184, 717, 11, 9, 11, 2], [184, 771, 11, 9, 11, 5], [245, 3, 11, 9, 11, 2], [245, 56, 11, 7, 11, 4], [245, 105, 11, 9, 11, 2], [245, 158, 11, 7, 11, 4], [245, 207, 11, 9, 11, 2], [245, 260, 11, 7, 11, 4], [245, 309, 11, 9, 11, 2], [245, 362, 11, 10, 11, 4], [245, 411, 11, 9, 11, 2], [245, 462, 11, 9, 11, 2], [245, 513, 11, 12, 11, 2], [245, 564, 11, 9, 11, 2], [245, 615, 11, 9, 11, 2], [245, 668, 11, 7, 11, 4], [245, 719, 11, 7, 11, 4], [245, 770, 11, 7, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 11, 10, 11, 4], [306, 107, 11, 7, 11, 4], [306, 158, 11, 7, 11, 4], [306, 207, 11, 9, 11, 2], [306, 260, 11, 7, 11, 4], [306, 311, 11, 7, 11, 4], [306, 362, 11, 7, 11, 4], [306, 413, 11, 7, 11, 4], [306, 464, 11, 10, 11, 4], [306, 515, 11, 7, 11, 4], [306, 564, 11, 12, 11, 2], [306, 615, 11, 12, 11, 2], [306, 666, 11, 12, 11, 2], [306, 718, 11, 8, 11, 3], [306, 768, 11, 9, 11, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 105, 11, 12, 11, 2], [367, 154, 11, 11, 11, 0], [367, 205, 11, 11, 11, 0], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 11, 10, 11, 1], [367, 410, 11, 10, 11, 1], [367, 461, 11, 10, 11, 1], [367, 513, 11, 9, 11, 2], [367, 563, 11, 10, 11, 1], [367, 613, 11, 11, 11, 0], [367, 668, 11, 10, 11, 4], [367, 716, 11, 10, 11, 1], [367, 767, 11, 10, 11, 1], [428, 2, 11, 10, 11, 1], [428, 54, 11, 9, 11, 2], [428, 104, 11, 10, 11, 1], [428, 155, 11, 10, 11, 1], [428, 206, 11, 10, 11, 1], [428, 258, 11, 9, 11, 2], [428, 308, 11, 10, 11, 1], [428, 359, 11, 10, 11, 1], [428, 410, 11, 10, 11, 1], [428, 461, 11, 10, 11, 1], [428, 513, 11, 9, 11, 2], [428, 563, 11, 10, 11, 1], [428, 614, 11, 10, 11, 1], [428, 665, 11, 10, 11, 1], [428, 716, 11, 10, 11, 1], [428, 768, 11, 9, 11, 2], [489, 3, 11, 11, 11, 2], [489, 54, 11, 9, 11, 2], [489, 105, 11, 10, 11, 2], [489, 156, 11, 9, 11, 2], [489, 207, 11, 12, 11, 2], [489, 261, 11, 6, 11, 5], [489, 309, 11, 12, 11, 2], [489, 360, 11, 9, 11, 2], [489, 410, 14, 10, 14, 1], [489, 461, 14, 10, 14, 1], [489, 512, 15, 10, 15, 1], [489, 564, 11, 9, 11, 2], [489, 615, 11, 9, 11, 2], [489, 669, 11, 6, 11, 5], [489, 717, 11, 9, 11, 2], [489, 768, 11, 9, 11, 2], [550, 5, 13, 7, 13, 4], [550, 56, 11, 7, 11, 4], [550, 108, 11, 6, 11, 5], [550, 159, 11, 6, 11, 5], [550, 207, 11, 9, 11, 2], [550, 260, 11, 9, 11, 4], [550, 308, 10, 10, 10, 1], [550, 359, 13, 11, 13, 1], [550, 410, 15, 11, 15, 1], [550, 463, 11, 8, 11, 3], [550, 513, 7, 12, 7, 2], [550, 564, 11, 9, 11, 2], [550, 615, 11, 9, 11, 2], [550, 665, 14, 10, 14, 1], [550, 719, 11, 7, 11, 4], [550, 770, 11, 7, 11, 4], [611, 6, 11, 9, 11, 5], [611, 56, 11, 10, 11, 4], [611, 108, 13, 6, 13, 5], [611, 156, 11, 9, 11, 2], [611, 207, 11, 12, 11, 2], [611, 261, 11, 6, 11, 5], [611, 309, 12, 9, 12, 2], [611, 363, 11, 6, 11, 5], [611, 414, 11, 6, 11, 5], [611, 465, 11, 6, 11, 5], [611, 516, 11, 6, 11, 5], [611, 562, 11, 11, 11, 0], [611, 613, 11, 11, 11, 0], [611, 664, 11, 11, 11, 0], [611, 717, 11, 9, 11, 2], [611, 770, 11, 7, 11, 4], [672, 6, 11, 6, 11, 5], [672, 57, 11, 6, 11, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 11, 9, 11, 2], [672, 258, 11, 9, 11, 2], [672, 312, 11, 6, 11, 5], [672, 359, 10, 10, 10, 1], [672, 411, 11, 12, 11, 2], [1, 6, 11, 6, 11, 5], [794, 766, 11, 11, 11, 0], [672, 565, 11, 8, 11, 3], [672, 618, 11, 6, 11, 5], [672, 669, 11, 6, 11, 5], [672, 717, 11, 9, 11, 2], [672, 768, 11, 9, 11, 2], [733, 3, 11, 11, 11, 2], [733, 57, 11, 6, 11, 5], [733, 108, 11, 8, 11, 5], [733, 159, 11, 8, 11, 5], [733, 206, 11, 10, 11, 1], [733, 256, 11, 11, 11, 0], [733, 307, 11, 11, 11, 0], [733, 358, 11, 11, 11, 0], [733, 409, 11, 11, 11, 0], [733, 460, 11, 11, 11, 0], [733, 511, 11, 11, 11, 0], [733, 562, 11, 11, 11, 0], [733, 613, 11, 11, 11, 0], [733, 664, 11, 11, 11, 0], [733, 715, 11, 11, 11, 0], [733, 766, 11, 11, 11, 0], [1, 6, 11, 6, 11, 5], [794, 52, 11, 11, 11, 0], [794, 103, 11, 11, 11, 0], [794, 154, 11, 11, 11, 0], [794, 205, 11, 11, 11, 0], [794, 260, 11, 7, 11, 4], [794, 309, 11, 9, 11, 2], [794, 361, 11, 8, 11, 3], [794, 413, 11, 7, 11, 4], [794, 463, 11, 8, 11, 3], [794, 514, 11, 8, 11, 3], [794, 564, 11, 9, 11, 2], [794, 618, 11, 9, 11, 5], [794, 665, 11, 10, 11, 1], [794, 720, 11, 9, 11, 5], [794, 766, 11, 11, 11, 0], [855, 1, 11, 11, 11, 0], [855, 52, 11, 11, 11, 0], [855, 103, 11, 11, 11, 0], [855, 154, 11, 11, 11, 0], [855, 205, 11, 11, 11, 0], [855, 256, 11, 11, 11, 0], [855, 307, 11, 11, 11, 0], [855, 358, 11, 11, 11, 0], [855, 409, 11, 11, 11, 0], [855, 460, 11, 11, 11, 0], [855, 511, 11, 11, 11, 0], [855, 562, 11, 11, 11, 0], [855, 613, 11, 11, 11, 0], [855, 664, 11, 11, 11, 0], [855, 715, 11, 11, 11, 0], [855, 766, 11, 11, 11, 0]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 16, 1], [1, 54, 18, 13, 16, 2], [1, 105, 19, 5, 16, 2], [1, 156, 19, 13, 16, 2], [1, 206, 20, 16, 16, 1], [1, 258, 19, 13, 16, 2], [1, 309, 19, 13, 16, 2], [1, 360, 17, 5, 16, 2], [1, 411, 19, 17, 16, 2], [1, 462, 17, 17, 16, 2], [1, 513, 19, 8, 16, 2], [1, 567, 18, 9, 16, 5], [1, 624, 15, 6, 16, 11], [1, 672, 19, 3, 16, 8], [1, 726, 12, 4, 16, 11], [1, 768, 21, 13, 16, 2], [62, 3, 20, 13, 16, 2], [62, 54, 18, 13, 16, 2], [62, 105, 20, 13, 16, 2], [62, 156, 20, 13, 16, 2], [62, 207, 20, 13, 16, 2], [62, 258, 21, 13, 16, 2], [62, 309, 19, 13, 16, 2], [62, 360, 21, 13, 16, 2], [62, 411, 20, 13, 16, 2], [62, 462, 20, 13, 16, 2], [62, 516, 16, 10, 16, 5], [62, 567, 16, 12, 16, 5], [62, 618, 19, 9, 16, 5], [62, 671, 19, 6, 16, 7], [62, 720, 18, 9, 16, 5], [62, 767, 19, 14, 16, 1], [123, 3, 20, 13, 16, 2], [123, 54, 18, 13, 16, 2], [123, 105, 21, 13, 16, 2], [123, 156, 22, 13, 16, 2], [123, 207, 20, 13, 16, 2], [123, 258, 21, 13, 16, 2], [123, 309, 21, 13, 16, 2], [123, 360, 22, 13, 16, 2], [123, 411, 22, 13, 16, 2], [123, 462, 21, 13, 16, 2], [123, 513, 22, 13, 16, 2], [123, 564, 21, 13, 16, 2], [123, 615, 18, 13, 16, 2], [123, 666, 22, 13, 16, 2], [123, 717, 22, 13, 16, 2], [123, 768, 20, 13, 16, 2], [184, 3, 20, 13, 16, 2], [184, 54, 20, 14, 16, 2], [184, 105, 19, 13, 16, 2], [184, 156, 21, 13, 16, 2], [184, 207, 22, 13, 16, 2], [184, 258, 21, 13, 16, 2], [184, 309, 22, 13, 16, 2], [184, 360, 22, 13, 16, 2], [184, 411, 22, 13, 16, 2], [184, 462, 22, 13, 16, 2], [184, 513, 21, 13, 16, 2], [184, 564, 19, 17, 16, 2], [184, 615, 15, 13, 16, 2], [184, 666, 18, 17, 16, 2], [184, 717, 19, 6, 16, 2], [184, 781, 16, 3, 16, 15], [245, 3, 17, 5, 16, 2], [245, 57, 18, 10, 16, 5], [245, 105, 19, 13, 16, 2], [245, 159, 18, 10, 16, 5], [245, 207, 21, 13, 16, 2], [245, 261, 18, 10, 16, 5], [245, 309, 22, 13, 16, 2], [245, 363, 19, 14, 16, 5], [245, 411, 18, 13, 16, 2], [245, 462, 18, 13, 16, 2], [245, 513, 20, 17, 16, 2], [245, 564, 20, 13, 16, 2], [245, 615, 18, 13, 16, 2], [245, 669, 20, 10, 16, 5], [245, 720, 18, 10, 16, 5], [245, 771, 18, 10, 16, 5], [306, 6, 19, 14, 16, 5], [306, 57, 20, 14, 16, 5], [306, 108, 19, 10, 16, 5], [306, 159, 19, 10, 16, 5], [306, 207, 18, 13, 16, 2], [306, 261, 19, 10, 16, 5], [306, 312, 20, 10, 16, 5], [306, 363, 21, 10, 16, 5], [306, 414, 20, 10, 16, 5], [306, 465, 21, 14, 16, 5], [306, 516, 19, 10, 16, 5], [306, 564, 20, 17, 16, 2], [306, 615, 18, 17, 16, 2], [306, 666, 17, 17, 16, 2], [306, 717, 21, 4, 16, 2], [306, 769, 20, 12, 16, 3], [367, 1, 21, 15, 16, 0], [367, 52, 20, 15, 16, 0], [367, 105, 22, 16, 16, 2], [367, 154, 21, 15, 16, 0], [367, 205, 22, 15, 16, 0], [367, 256, 21, 15, 16, 0], [367, 307, 22, 15, 16, 0], [367, 359, 19, 14, 16, 1], [367, 410, 18, 14, 16, 1], [367, 461, 19, 14, 16, 1], [367, 513, 19, 13, 16, 2], [367, 564, 20, 13, 16, 2], [367, 613, 19, 15, 16, 0], [367, 669, 18, 13, 16, 5], [367, 716, 19, 14, 16, 1], [367, 767, 18, 14, 16, 1], [428, 2, 19, 14, 16, 1], [428, 54, 19, 13, 16, 2], [428, 104, 19, 14, 16, 1], [428, 155, 17, 14, 16, 1], [428, 206, 19, 14, 16, 1], [428, 258, 20, 13, 16, 2], [428, 309, 20, 13, 16, 2], [428, 359, 19, 14, 16, 1], [428, 410, 18, 14, 16, 1], [428, 461, 19, 14, 16, 1], [428, 513, 19, 13, 16, 2], [428, 564, 20, 13, 16, 2], [428, 614, 19, 14, 16, 1], [428, 665, 19, 14, 16, 1], [428, 716, 19, 14, 16, 1], [428, 768, 19, 13, 16, 2], [489, 3, 18, 16, 16, 2], [489, 54, 18, 7, 16, 2], [489, 105, 18, 13, 16, 2], [489, 156, 19, 13, 16, 2], [489, 206, 20, 17, 16, 1], [489, 261, 17, 7, 16, 5], [489, 308, 21, 18, 16, 1], [489, 359, 20, 14, 16, 1], [489, 410, 23, 14, 19, 1], [489, 461, 23, 14, 19, 1], [489, 513, 26, 8, 21, 2], [489, 564, 19, 5, 16, 2], [489, 615, 20, 3, 16, 2], [489, 669, 19, 10, 15, 5], [489, 717, 22, 13, 16, 2], [489, 768, 22, 13, 16, 2], [550, 7, 21, 7, 18, 6], [550, 57, 17, 10, 15, 5], [550, 108, 19, 10, 15, 5], [550, 159, 18, 10, 15, 5], [550, 207, 22, 13, 16, 2], [550, 261, 18, 13, 15, 5], [550, 308, 19, 14, 14, 1], [550, 359, 22, 15, 18, 1], [550, 410, 25, 15, 20, 1], [550, 465, 19, 10, 14, 5], [550, 512, 16, 18, 10, 1], [550, 564, 17, 10, 16, 2], [550, 615, 18, 10, 16, 2], [550, 665, 23, 14, 19, 1], [550, 720, 21, 10, 16, 5], [550, 771, 19, 10, 16, 5], [611, 5, 17, 14, 16, 4], [611, 56, 17, 14, 16, 4], [611, 111, 20, 6, 18, 8], [611, 155, 21, 14, 15, 1], [611, 207, 20, 17, 16, 2], [611, 262, 19, 7, 15, 6], [611, 308, 18, 14, 16, 1], [611, 363, 19, 9, 16, 5], [611, 414, 19, 9, 16, 5], [611, 471, 17, 4, 16, 11], [611, 511, 1, 1, 16, 1], [611, 562, 19, 15, 16, 0], [611, 613, 22, 15, 16, 0], [611, 664, 22, 15, 16, 0], [611, 717, 22, 13, 16, 2], [611, 771, 21, 10, 16, 5], [672, 9, 17, 3, 16, 8], [672, 60, 19, 3, 16, 8], [672, 105, 19, 6, 16, 2], [672, 156, 21, 6, 16, 2], [672, 207, 17, 6, 16, 2], [672, 258, 19, 6, 16, 2], [672, 312, 18, 9, 15, 5], [672, 359, 18, 14, 14, 1], [672, 412, 21, 16, 16, 3], [1, 1, 1, 1, 16, 1], [794, 767, 19, 5, 16, 1], [672, 566, 19, 9, 16, 4], [672, 618, 16, 9, 16, 5], [672, 669, 17, 9, 16, 5], [672, 717, 20, 13, 16, 2], [672, 768, 20, 13, 16, 2], [733, 3, 18, 16, 16, 2], [733, 59, 14, 4, 16, 7], [733, 114, 15, 6, 16, 11], [733, 165, 16, 6, 16, 11], [733, 208, 19, 12, 16, 3], [733, 256, 20, 15, 16, 0], [733, 307, 21, 15, 16, 0], [733, 358, 20, 15, 16, 0], [733, 409, 21, 15, 16, 0], [733, 460, 21, 15, 16, 0], [733, 511, 21, 15, 16, 0], [733, 562, 21, 15, 16, 0], [733, 613, 21, 15, 16, 0], [733, 664, 21, 15, 16, 0], [733, 715, 20, 15, 16, 0], [733, 766, 20, 15, 16, 0], [1, 1, 1, 1, 16, 1], [794, 52, 20, 15, 16, 0], [794, 103, 21, 15, 16, 0], [794, 154, 21, 15, 16, 0], [794, 205, 21, 15, 16, 0], [794, 261, 16, 10, 16, 5], [794, 309, 19, 5, 16, 2], [794, 361, 19, 4, 16, 3], [794, 412, 19, 3, 16, 3], [794, 462, 20, 4, 16, 2], [794, 513, 17, 4, 16, 2], [794, 564, 18, 6, 16, 2], [794, 624, 14, 7, 16, 11], [794, 666, 21, 6, 16, 2], [794, 727, 14, 6, 16, 12], [794, 767, 19, 5, 16, 1], [855, 2, 19, 5, 16, 1], [855, 53, 19, 5, 16, 1], [855, 104, 19, 5, 16, 1], [855, 155, 19, 5, 16, 1], [855, 206, 19, 5, 16, 1], [855, 257, 19, 5, 16, 1], [855, 308, 19, 5, 16, 1], [855, 359, 19, 5, 16, 1], [855, 410, 19, 5, 16, 1], [855, 461, 19, 5, 16, 1], [855, 512, 19, 5, 16, 1], [855, 563, 19, 5, 16, 1], [855, 614, 19, 5, 16, 1], [855, 665, 19, 5, 16, 1], [855, 716, 19, 5, 16, 1], [855, 767, 19, 5, 16, 1]], \"capHeight\": 14, \"widestlogicalchar\": 21, \"widestglyph\": 26, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 15, 1], [1, 54, 17, 11, 15, 2], [1, 105, 18, 3, 15, 2], [1, 156, 18, 11, 15, 2], [1, 206, 19, 14, 15, 1], [1, 258, 18, 11, 15, 2], [1, 309, 18, 11, 15, 2], [1, 360, 16, 3, 15, 2], [1, 411, 18, 15, 15, 2], [1, 462, 16, 15, 15, 2], [1, 513, 18, 6, 15, 2], [1, 567, 17, 7, 15, 5], [1, 624, 14, 4, 15, 11], [1, 672, 18, 1, 15, 8], [1, 726, 11, 2, 15, 11], [1, 768, 20, 11, 15, 2], [62, 3, 19, 11, 15, 2], [62, 54, 17, 11, 15, 2], [62, 105, 19, 11, 15, 2], [62, 156, 19, 11, 15, 2], [62, 207, 19, 11, 15, 2], [62, 258, 20, 11, 15, 2], [62, 309, 18, 11, 15, 2], [62, 360, 20, 11, 15, 2], [62, 411, 19, 11, 15, 2], [62, 462, 19, 11, 15, 2], [62, 516, 15, 8, 15, 5], [62, 567, 15, 10, 15, 5], [62, 618, 18, 7, 15, 5], [62, 671, 18, 4, 15, 7], [62, 720, 17, 7, 15, 5], [62, 767, 18, 12, 15, 1], [123, 3, 19, 11, 15, 2], [123, 54, 17, 11, 15, 2], [123, 105, 20, 11, 15, 2], [123, 156, 21, 11, 15, 2], [123, 207, 19, 11, 15, 2], [123, 258, 20, 11, 15, 2], [123, 309, 20, 11, 15, 2], [123, 360, 21, 11, 15, 2], [123, 411, 21, 11, 15, 2], [123, 462, 20, 11, 15, 2], [123, 513, 21, 11, 15, 2], [123, 564, 20, 11, 15, 2], [123, 615, 17, 11, 15, 2], [123, 666, 21, 11, 15, 2], [123, 717, 21, 11, 15, 2], [123, 768, 19, 11, 15, 2], [184, 3, 19, 11, 15, 2], [184, 54, 19, 12, 15, 2], [184, 105, 18, 11, 15, 2], [184, 156, 20, 11, 15, 2], [184, 207, 21, 11, 15, 2], [184, 258, 20, 11, 15, 2], [184, 309, 21, 11, 15, 2], [184, 360, 21, 11, 15, 2], [184, 411, 21, 11, 15, 2], [184, 462, 21, 11, 15, 2], [184, 513, 20, 11, 15, 2], [184, 564, 18, 15, 15, 2], [184, 615, 14, 11, 15, 2], [184, 666, 17, 15, 15, 2], [184, 717, 18, 4, 15, 2], [184, 781, 15, 1, 15, 15], [245, 3, 16, 3, 15, 2], [245, 57, 17, 8, 15, 5], [245, 105, 18, 11, 15, 2], [245, 159, 17, 8, 15, 5], [245, 207, 20, 11, 15, 2], [245, 261, 17, 8, 15, 5], [245, 309, 21, 11, 15, 2], [245, 363, 18, 12, 15, 5], [245, 411, 17, 11, 15, 2], [245, 462, 17, 11, 15, 2], [245, 513, 19, 15, 15, 2], [245, 564, 19, 11, 15, 2], [245, 615, 17, 11, 15, 2], [245, 669, 19, 8, 15, 5], [245, 720, 17, 8, 15, 5], [245, 771, 17, 8, 15, 5], [306, 6, 18, 12, 15, 5], [306, 57, 19, 12, 15, 5], [306, 108, 18, 8, 15, 5], [306, 159, 18, 8, 15, 5], [306, 207, 17, 11, 15, 2], [306, 261, 18, 8, 15, 5], [306, 312, 19, 8, 15, 5], [306, 363, 20, 8, 15, 5], [306, 414, 19, 8, 15, 5], [306, 465, 20, 12, 15, 5], [306, 516, 18, 8, 15, 5], [306, 564, 19, 15, 15, 2], [306, 615, 17, 15, 15, 2], [306, 666, 16, 15, 15, 2], [306, 717, 20, 2, 15, 2], [306, 769, 19, 10, 15, 3], [367, 1, 19, 13, 15, 0], [367, 52, 19, 13, 15, 0], [367, 105, 21, 14, 15, 2], [367, 154, 20, 13, 15, 0], [367, 205, 21, 13, 15, 0], [367, 256, 19, 13, 15, 0], [367, 307, 21, 13, 15, 0], [367, 359, 18, 12, 15, 1], [367, 410, 17, 12, 15, 1], [367, 461, 18, 12, 15, 1], [367, 513, 18, 11, 15, 2], [367, 564, 19, 11, 15, 2], [367, 613, 18, 13, 15, 0], [367, 669, 17, 11, 15, 5], [367, 716, 18, 12, 15, 1], [367, 767, 17, 12, 15, 1], [428, 2, 18, 12, 15, 1], [428, 54, 18, 11, 15, 2], [428, 104, 18, 12, 15, 1], [428, 155, 16, 12, 15, 1], [428, 206, 18, 12, 15, 1], [428, 258, 19, 11, 15, 2], [428, 309, 19, 11, 15, 2], [428, 359, 18, 12, 15, 1], [428, 410, 17, 12, 15, 1], [428, 461, 18, 12, 15, 1], [428, 513, 18, 11, 15, 2], [428, 564, 19, 11, 15, 2], [428, 614, 18, 12, 15, 1], [428, 665, 18, 12, 15, 1], [428, 716, 18, 12, 15, 1], [428, 768, 18, 11, 15, 2], [489, 3, 17, 14, 15, 2], [489, 54, 17, 5, 15, 2], [489, 105, 17, 11, 15, 2], [489, 156, 18, 11, 15, 2], [489, 206, 19, 15, 15, 1], [489, 261, 16, 5, 15, 5], [489, 308, 20, 16, 15, 1], [489, 359, 19, 12, 15, 1], [489, 410, 22, 12, 18, 1], [489, 461, 22, 12, 18, 1], [489, 513, 25, 6, 20, 2], [489, 564, 18, 3, 15, 2], [489, 615, 19, 1, 15, 2], [489, 669, 18, 8, 14, 5], [489, 717, 21, 11, 15, 2], [489, 768, 21, 11, 15, 2], [550, 7, 20, 5, 17, 6], [550, 57, 16, 8, 14, 5], [550, 108, 18, 8, 14, 5], [550, 159, 17, 8, 14, 5], [550, 207, 21, 11, 15, 2], [550, 261, 17, 11, 14, 5], [550, 308, 18, 12, 13, 1], [550, 359, 21, 13, 17, 1], [550, 410, 24, 13, 19, 1], [550, 465, 18, 8, 13, 5], [550, 512, 15, 16, 9, 1], [550, 564, 16, 8, 15, 2], [550, 615, 17, 8, 15, 2], [550, 665, 22, 12, 18, 1], [550, 720, 20, 8, 15, 5], [550, 771, 18, 8, 15, 5], [611, 5, 16, 12, 15, 4], [611, 56, 16, 12, 15, 4], [611, 111, 19, 4, 17, 8], [611, 155, 20, 12, 14, 1], [611, 207, 19, 15, 15, 2], [611, 262, 18, 5, 14, 6], [611, 308, 17, 12, 15, 1], [611, 363, 18, 7, 15, 5], [611, 414, 18, 7, 15, 5], [611, 471, 16, 2, 15, 11], [611, 511, 1, 1, 15, 1], [611, 562, 18, 13, 15, 0], [611, 613, 19, 13, 15, 0], [611, 664, 19, 13, 15, 0], [611, 717, 21, 11, 15, 2], [611, 771, 20, 8, 15, 5], [672, 9, 16, 1, 15, 8], [672, 60, 18, 1, 15, 8], [672, 105, 18, 4, 15, 2], [672, 156, 20, 4, 15, 2], [672, 207, 16, 4, 15, 2], [672, 258, 18, 4, 15, 2], [672, 312, 17, 7, 14, 5], [672, 359, 17, 12, 13, 1], [672, 412, 20, 14, 15, 3], [1, 1, 1, 1, 15, 1], [794, 767, 18, 3, 15, 1], [672, 566, 18, 7, 15, 4], [672, 618, 15, 7, 15, 5], [672, 669, 16, 7, 15, 5], [672, 717, 19, 11, 15, 2], [672, 768, 19, 11, 15, 2], [733, 3, 17, 14, 15, 2], [733, 59, 13, 2, 15, 7], [733, 114, 14, 4, 15, 11], [733, 165, 15, 4, 15, 11], [733, 208, 18, 10, 15, 3], [733, 256, 19, 13, 15, 0], [733, 307, 20, 13, 15, 0], [733, 358, 17, 13, 15, 0], [733, 409, 20, 13, 15, 0], [733, 460, 20, 13, 15, 0], [733, 511, 20, 13, 15, 0], [733, 562, 20, 13, 15, 0], [733, 613, 20, 13, 15, 0], [733, 664, 20, 13, 15, 0], [733, 715, 19, 13, 15, 0], [733, 766, 19, 13, 15, 0], [1, 1, 1, 1, 15, 1], [794, 52, 19, 13, 15, 0], [794, 103, 20, 13, 15, 0], [794, 154, 20, 13, 15, 0], [794, 205, 20, 13, 15, 0], [794, 261, 15, 8, 15, 5], [794, 309, 18, 3, 15, 2], [794, 361, 18, 2, 15, 3], [794, 412, 18, 1, 15, 3], [794, 462, 19, 2, 15, 2], [794, 513, 16, 2, 15, 2], [794, 564, 17, 4, 15, 2], [794, 624, 13, 5, 15, 11], [794, 666, 20, 4, 15, 2], [794, 727, 13, 4, 15, 12], [794, 767, 18, 3, 15, 1], [855, 2, 18, 3, 15, 1], [855, 53, 18, 3, 15, 1], [855, 104, 18, 3, 15, 1], [855, 155, 18, 3, 15, 1], [855, 206, 18, 3, 15, 1], [855, 257, 18, 3, 15, 1], [855, 308, 18, 3, 15, 1], [855, 359, 18, 3, 15, 1], [855, 410, 18, 3, 15, 1], [855, 461, 18, 3, 15, 1], [855, 512, 18, 3, 15, 1], [855, 563, 18, 3, 15, 1], [855, 614, 18, 3, 15, 1], [855, 665, 18, 3, 15, 1], [855, 716, 18, 3, 15, 1], [855, 767, 18, 3, 15, 1]], \"capHeight\": 13, \"widestlogicalchar\": 20, \"widestglyph\": 25, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 16, 6, 16, 8], [1, 54, 16, 13, 16, 2], [1, 105, 16, 12, 16, 2], [1, 156, 16, 13, 16, 2], [1, 206, 16, 16, 16, 1], [1, 258, 16, 13, 16, 2], [1, 309, 16, 13, 16, 2], [1, 360, 16, 12, 16, 2], [1, 411, 16, 17, 16, 2], [1, 462, 16, 17, 16, 2], [1, 513, 16, 12, 16, 2], [1, 567, 16, 9, 16, 5], [1, 621, 16, 9, 16, 8], [1, 672, 16, 6, 16, 8], [1, 723, 16, 7, 16, 8], [1, 768, 16, 13, 16, 2], [62, 3, 16, 13, 16, 2], [62, 54, 16, 13, 16, 2], [62, 105, 16, 13, 16, 2], [62, 156, 16, 13, 16, 2], [62, 207, 16, 13, 16, 2], [62, 258, 16, 13, 16, 2], [62, 309, 16, 13, 16, 2], [62, 360, 16, 13, 16, 2], [62, 411, 16, 13, 16, 2], [62, 462, 16, 13, 16, 2], [62, 516, 16, 10, 16, 5], [62, 567, 16, 12, 16, 5], [62, 618, 16, 9, 16, 5], [62, 671, 16, 7, 16, 7], [62, 720, 16, 9, 16, 5], [62, 767, 16, 14, 16, 1], [123, 3, 16, 13, 16, 2], [123, 54, 16, 13, 16, 2], [123, 105, 16, 13, 16, 2], [123, 156, 16, 13, 16, 2], [123, 207, 16, 13, 16, 2], [123, 258, 16, 13, 16, 2], [123, 309, 16, 13, 16, 2], [123, 360, 16, 13, 16, 2], [123, 411, 16, 13, 16, 2], [123, 462, 16, 13, 16, 2], [123, 513, 16, 13, 16, 2], [123, 564, 16, 13, 16, 2], [123, 615, 16, 13, 16, 2], [123, 666, 16, 13, 16, 2], [123, 717, 16, 13, 16, 2], [123, 768, 16, 13, 16, 2], [184, 3, 16, 13, 16, 2], [184, 54, 16, 14, 16, 2], [184, 105, 16, 13, 16, 2], [184, 156, 16, 13, 16, 2], [184, 207, 16, 13, 16, 2], [184, 258, 16, 13, 16, 2], [184, 309, 16, 13, 16, 2], [184, 360, 16, 13, 16, 2], [184, 411, 16, 13, 16, 2], [184, 462, 16, 13, 16, 2], [184, 513, 16, 13, 16, 2], [184, 564, 16, 17, 16, 2], [184, 615, 16, 13, 16, 2], [184, 666, 16, 17, 16, 2], [184, 717, 16, 12, 16, 2], [184, 774, 16, 10, 16, 8], [245, 3, 16, 12, 16, 2], [245, 57, 16, 10, 16, 5], [245, 105, 16, 13, 16, 2], [245, 159, 16, 10, 16, 5], [245, 207, 16, 13, 16, 2], [245, 261, 16, 10, 16, 5], [245, 309, 16, 13, 16, 2], [245, 363, 16, 14, 16, 5], [245, 411, 16, 13, 16, 2], [245, 462, 16, 13, 16, 2], [245, 513, 16, 17, 16, 2], [245, 564, 16, 13, 16, 2], [245, 615, 16, 13, 16, 2], [245, 669, 16, 10, 16, 5], [245, 720, 16, 10, 16, 5], [245, 771, 16, 10, 16, 5], [306, 6, 16, 14, 16, 5], [306, 57, 16, 14, 16, 5], [306, 108, 16, 10, 16, 5], [306, 159, 16, 10, 16, 5], [306, 207, 16, 13, 16, 2], [306, 261, 16, 10, 16, 5], [306, 312, 16, 10, 16, 5], [306, 363, 16, 10, 16, 5], [306, 414, 16, 10, 16, 5], [306, 465, 16, 14, 16, 5], [306, 516, 16, 10, 16, 5], [306, 564, 16, 17, 16, 2], [306, 615, 16, 17, 16, 2], [306, 666, 16, 17, 16, 2], [306, 717, 16, 12, 16, 2], [306, 769, 16, 12, 16, 3], [367, 1, 16, 15, 16, 0], [367, 52, 16, 15, 16, 0], [367, 105, 16, 16, 16, 2], [367, 154, 16, 15, 16, 0], [367, 205, 16, 15, 16, 0], [367, 256, 16, 15, 16, 0], [367, 307, 16, 15, 16, 0], [367, 359, 16, 14, 16, 1], [367, 410, 16, 14, 16, 1], [367, 461, 16, 14, 16, 1], [367, 513, 16, 13, 16, 2], [367, 564, 16, 13, 16, 2], [367, 613, 16, 15, 16, 0], [367, 669, 16, 13, 16, 5], [367, 716, 16, 14, 16, 1], [367, 767, 16, 14, 16, 1], [428, 2, 16, 14, 16, 1], [428, 54, 16, 13, 16, 2], [428, 104, 16, 14, 16, 1], [428, 155, 16, 14, 16, 1], [428, 206, 16, 14, 16, 1], [428, 258, 16, 13, 16, 2], [428, 309, 16, 13, 16, 2], [428, 359, 16, 14, 16, 1], [428, 410, 16, 14, 16, 1], [428, 461, 16, 14, 16, 1], [428, 513, 16, 13, 16, 2], [428, 564, 16, 13, 16, 2], [428, 614, 16, 14, 16, 1], [428, 665, 16, 14, 16, 1], [428, 716, 16, 14, 16, 1], [428, 768, 16, 13, 16, 2], [489, 3, 16, 16, 16, 2], [489, 54, 16, 12, 16, 2], [489, 105, 16, 13, 16, 2], [489, 156, 16, 13, 16, 2], [489, 206, 16, 17, 16, 1], [489, 261, 16, 9, 16, 5], [489, 308, 16, 18, 16, 1], [489, 359, 16, 14, 16, 1], [489, 410, 19, 14, 19, 1], [489, 461, 19, 14, 19, 1], [489, 513, 21, 12, 21, 2], [489, 564, 16, 12, 16, 2], [489, 615, 16, 12, 16, 2], [489, 669, 15, 10, 15, 5], [489, 717, 16, 13, 16, 2], [489, 768, 16, 13, 16, 2], [550, 7, 18, 8, 18, 6], [550, 57, 15, 10, 15, 5], [550, 108, 15, 10, 15, 5], [550, 159, 15, 10, 15, 5], [550, 207, 16, 13, 16, 2], [550, 261, 15, 13, 15, 5], [550, 308, 14, 14, 14, 1], [550, 359, 18, 15, 18, 1], [550, 410, 20, 15, 20, 1], [550, 465, 14, 10, 14, 5], [550, 512, 10, 18, 10, 1], [550, 564, 16, 12, 16, 2], [550, 615, 16, 12, 16, 2], [550, 665, 19, 14, 19, 1], [550, 720, 16, 10, 16, 5], [550, 771, 16, 10, 16, 5], [611, 5, 16, 14, 16, 4], [611, 56, 16, 14, 16, 4], [611, 111, 18, 6, 18, 8], [611, 155, 15, 14, 15, 1], [611, 207, 16, 17, 16, 2], [611, 262, 15, 8, 15, 6], [611, 308, 16, 14, 16, 1], [611, 363, 16, 9, 16, 5], [611, 414, 16, 9, 16, 5], [611, 468, 16, 7, 16, 8], [611, 519, 16, 6, 16, 8], [611, 562, 16, 15, 16, 0], [611, 613, 16, 15, 16, 0], [611, 664, 16, 15, 16, 0], [611, 717, 16, 13, 16, 2], [611, 771, 16, 10, 16, 5], [672, 9, 16, 6, 16, 8], [672, 60, 16, 6, 16, 8], [672, 105, 16, 12, 16, 2], [672, 156, 16, 12, 16, 2], [672, 207, 16, 12, 16, 2], [672, 258, 16, 12, 16, 2], [672, 312, 15, 9, 15, 5], [672, 359, 14, 14, 14, 1], [672, 412, 16, 16, 16, 3], [1, 9, 16, 6, 16, 8], [794, 767, 16, 13, 16, 1], [672, 566, 16, 10, 16, 4], [672, 618, 16, 9, 16, 5], [672, 669, 16, 9, 16, 5], [672, 717, 16, 13, 16, 2], [672, 768, 16, 13, 16, 2], [733, 3, 16, 16, 16, 2], [733, 59, 16, 7, 16, 7], [733, 111, 16, 9, 16, 8], [733, 162, 16, 9, 16, 8], [733, 208, 16, 12, 16, 3], [733, 256, 16, 15, 16, 0], [733, 307, 16, 15, 16, 0], [733, 358, 16, 15, 16, 0], [733, 409, 16, 15, 16, 0], [733, 460, 16, 15, 16, 0], [733, 511, 16, 15, 16, 0], [733, 562, 16, 15, 16, 0], [733, 613, 16, 15, 16, 0], [733, 664, 16, 15, 16, 0], [733, 715, 16, 15, 16, 0], [733, 766, 16, 15, 16, 0], [1, 9, 16, 6, 16, 8], [794, 52, 16, 15, 16, 0], [794, 103, 16, 15, 16, 0], [794, 154, 16, 15, 16, 0], [794, 205, 16, 15, 16, 0], [794, 261, 16, 10, 16, 5], [794, 309, 16, 12, 16, 2], [794, 361, 16, 11, 16, 3], [794, 412, 16, 11, 16, 3], [794, 462, 16, 12, 16, 2], [794, 513, 16, 12, 16, 2], [794, 564, 16, 12, 16, 2], [794, 621, 16, 10, 16, 8], [794, 666, 16, 12, 16, 2], [794, 723, 16, 10, 16, 8], [794, 767, 16, 13, 16, 1], [855, 2, 16, 13, 16, 1], [855, 53, 16, 13, 16, 1], [855, 104, 16, 13, 16, 1], [855, 155, 16, 13, 16, 1], [855, 206, 16, 13, 16, 1], [855, 257, 16, 13, 16, 1], [855, 308, 16, 13, 16, 1], [855, 359, 16, 13, 16, 1], [855, 410, 16, 13, 16, 1], [855, 461, 16, 13, 16, 1], [855, 512, 16, 13, 16, 1], [855, 563, 16, 13, 16, 1], [855, 614, 16, 13, 16, 1], [855, 665, 16, 13, 16, 1], [855, 716, 16, 13, 16, 1], [855, 767, 16, 13, 16, 1]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 15, 6, 15, 7], [1, 54, 15, 11, 15, 2], [1, 105, 15, 11, 15, 2], [1, 156, 15, 11, 15, 2], [1, 206, 15, 14, 15, 1], [1, 258, 15, 11, 15, 2], [1, 309, 15, 11, 15, 2], [1, 360, 15, 11, 15, 2], [1, 411, 15, 15, 15, 2], [1, 462, 15, 15, 15, 2], [1, 513, 15, 11, 15, 2], [1, 567, 15, 8, 15, 5], [1, 620, 15, 8, 15, 7], [1, 671, 15, 6, 15, 7], [1, 722, 15, 6, 15, 7], [1, 768, 15, 11, 15, 2], [62, 3, 15, 11, 15, 2], [62, 54, 15, 11, 15, 2], [62, 105, 15, 11, 15, 2], [62, 156, 15, 11, 15, 2], [62, 207, 15, 11, 15, 2], [62, 258, 15, 11, 15, 2], [62, 309, 15, 11, 15, 2], [62, 360, 15, 11, 15, 2], [62, 411, 15, 11, 15, 2], [62, 462, 15, 11, 15, 2], [62, 516, 15, 8, 15, 5], [62, 567, 15, 10, 15, 5], [62, 618, 15, 8, 15, 5], [62, 671, 15, 6, 15, 7], [62, 720, 15, 8, 15, 5], [62, 767, 15, 12, 15, 1], [123, 3, 15, 11, 15, 2], [123, 54, 15, 11, 15, 2], [123, 105, 15, 11, 15, 2], [123, 156, 15, 11, 15, 2], [123, 207, 15, 11, 15, 2], [123, 258, 15, 11, 15, 2], [123, 309, 15, 11, 15, 2], [123, 360, 15, 11, 15, 2], [123, 411, 15, 11, 15, 2], [123, 462, 15, 11, 15, 2], [123, 513, 15, 11, 15, 2], [123, 564, 15, 11, 15, 2], [123, 615, 15, 11, 15, 2], [123, 666, 15, 11, 15, 2], [123, 717, 15, 11, 15, 2], [123, 768, 15, 11, 15, 2], [184, 3, 15, 11, 15, 2], [184, 54, 15, 12, 15, 2], [184, 105, 15, 11, 15, 2], [184, 156, 15, 11, 15, 2], [184, 207, 15, 11, 15, 2], [184, 258, 15, 11, 15, 2], [184, 309, 15, 11, 15, 2], [184, 360, 15, 11, 15, 2], [184, 411, 15, 11, 15, 2], [184, 462, 15, 11, 15, 2], [184, 513, 15, 11, 15, 2], [184, 564, 15, 15, 15, 2], [184, 615, 15, 11, 15, 2], [184, 666, 15, 15, 15, 2], [184, 717, 15, 11, 15, 2], [184, 773, 15, 9, 15, 7], [245, 3, 15, 11, 15, 2], [245, 57, 15, 8, 15, 5], [245, 105, 15, 11, 15, 2], [245, 159, 15, 8, 15, 5], [245, 207, 15, 11, 15, 2], [245, 261, 15, 8, 15, 5], [245, 309, 15, 11, 15, 2], [245, 363, 15, 12, 15, 5], [245, 411, 15, 11, 15, 2], [245, 462, 15, 11, 15, 2], [245, 513, 15, 15, 15, 2], [245, 564, 15, 11, 15, 2], [245, 615, 15, 11, 15, 2], [245, 669, 15, 8, 15, 5], [245, 720, 15, 8, 15, 5], [245, 771, 15, 8, 15, 5], [306, 6, 15, 12, 15, 5], [306, 57, 15, 12, 15, 5], [306, 108, 15, 8, 15, 5], [306, 159, 15, 8, 15, 5], [306, 207, 15, 11, 15, 2], [306, 261, 15, 8, 15, 5], [306, 312, 15, 8, 15, 5], [306, 363, 15, 8, 15, 5], [306, 414, 15, 8, 15, 5], [306, 465, 15, 12, 15, 5], [306, 516, 15, 8, 15, 5], [306, 564, 15, 15, 15, 2], [306, 615, 15, 15, 15, 2], [306, 666, 15, 15, 15, 2], [306, 717, 15, 11, 15, 2], [306, 769, 15, 10, 15, 3], [367, 1, 15, 13, 15, 0], [367, 52, 15, 13, 15, 0], [367, 105, 15, 14, 15, 2], [367, 154, 15, 13, 15, 0], [367, 205, 15, 13, 15, 0], [367, 256, 15, 13, 15, 0], [367, 307, 15, 13, 15, 0], [367, 359, 15, 12, 15, 1], [367, 410, 15, 12, 15, 1], [367, 461, 15, 12, 15, 1], [367, 513, 15, 11, 15, 2], [367, 564, 15, 11, 15, 2], [367, 613, 15, 13, 15, 0], [367, 669, 15, 11, 15, 5], [367, 716, 15, 12, 15, 1], [367, 767, 15, 12, 15, 1], [428, 2, 15, 12, 15, 1], [428, 54, 15, 11, 15, 2], [428, 104, 15, 12, 15, 1], [428, 155, 15, 12, 15, 1], [428, 206, 15, 12, 15, 1], [428, 258, 15, 11, 15, 2], [428, 309, 15, 11, 15, 2], [428, 359, 15, 12, 15, 1], [428, 410, 15, 12, 15, 1], [428, 461, 15, 12, 15, 1], [428, 513, 15, 11, 15, 2], [428, 564, 15, 11, 15, 2], [428, 614, 15, 12, 15, 1], [428, 665, 15, 12, 15, 1], [428, 716, 15, 12, 15, 1], [428, 768, 15, 11, 15, 2], [489, 3, 15, 14, 15, 2], [489, 54, 15, 11, 15, 2], [489, 105, 15, 11, 15, 2], [489, 156, 15, 11, 15, 2], [489, 206, 15, 15, 15, 1], [489, 261, 15, 8, 15, 5], [489, 308, 15, 16, 15, 1], [489, 359, 15, 12, 15, 1], [489, 410, 18, 12, 18, 1], [489, 461, 18, 12, 18, 1], [489, 513, 20, 11, 20, 2], [489, 564, 15, 11, 15, 2], [489, 615, 15, 11, 15, 2], [489, 669, 14, 8, 14, 5], [489, 717, 15, 11, 15, 2], [489, 768, 15, 11, 15, 2], [550, 7, 17, 7, 17, 6], [550, 57, 14, 8, 14, 5], [550, 108, 14, 8, 14, 5], [550, 159, 14, 8, 14, 5], [550, 207, 15, 11, 15, 2], [550, 261, 14, 11, 14, 5], [550, 308, 13, 12, 13, 1], [550, 359, 17, 13, 17, 1], [550, 410, 19, 13, 19, 1], [550, 465, 13, 8, 13, 5], [550, 512, 9, 16, 9, 1], [550, 564, 15, 11, 15, 2], [550, 615, 15, 11, 15, 2], [550, 665, 18, 12, 18, 1], [550, 720, 15, 8, 15, 5], [550, 771, 15, 8, 15, 5], [611, 5, 15, 12, 15, 4], [611, 56, 15, 12, 15, 4], [611, 110, 17, 6, 17, 7], [611, 155, 14, 12, 14, 1], [611, 207, 15, 15, 15, 2], [611, 262, 14, 7, 14, 6], [611, 308, 15, 12, 15, 1], [611, 363, 15, 8, 15, 5], [611, 414, 15, 8, 15, 5], [611, 467, 15, 6, 15, 7], [611, 518, 15, 6, 15, 7], [611, 562, 15, 13, 15, 0], [611, 613, 15, 13, 15, 0], [611, 664, 15, 13, 15, 0], [611, 717, 15, 11, 15, 2], [611, 771, 15, 8, 15, 5], [672, 8, 15, 6, 15, 7], [672, 59, 15, 6, 15, 7], [672, 105, 15, 11, 15, 2], [672, 156, 15, 11, 15, 2], [672, 207, 15, 11, 15, 2], [672, 258, 15, 11, 15, 2], [672, 312, 14, 8, 14, 5], [672, 359, 13, 12, 13, 1], [672, 412, 15, 14, 15, 3], [1, 8, 15, 6, 15, 7], [794, 767, 15, 12, 15, 1], [672, 566, 15, 9, 15, 4], [672, 618, 15, 8, 15, 5], [672, 669, 15, 8, 15, 5], [672, 717, 15, 11, 15, 2], [672, 768, 15, 11, 15, 2], [733, 3, 15, 14, 15, 2], [733, 59, 15, 6, 15, 7], [733, 110, 15, 8, 15, 7], [733, 161, 15, 8, 15, 7], [733, 208, 15, 10, 15, 3], [733, 256, 15, 13, 15, 0], [733, 307, 15, 13, 15, 0], [733, 358, 15, 13, 15, 0], [733, 409, 15, 13, 15, 0], [733, 460, 15, 13, 15, 0], [733, 511, 15, 13, 15, 0], [733, 562, 15, 13, 15, 0], [733, 613, 15, 13, 15, 0], [733, 664, 15, 13, 15, 0], [733, 715, 15, 13, 15, 0], [733, 766, 15, 13, 15, 0], [1, 8, 15, 6, 15, 7], [794, 52, 15, 13, 15, 0], [794, 103, 15, 13, 15, 0], [794, 154, 15, 13, 15, 0], [794, 205, 15, 13, 15, 0], [794, 261, 15, 8, 15, 5], [794, 309, 15, 11, 15, 2], [794, 361, 15, 10, 15, 3], [794, 412, 15, 10, 15, 3], [794, 462, 15, 11, 15, 2], [794, 513, 15, 11, 15, 2], [794, 564, 15, 11, 15, 2], [794, 620, 15, 9, 15, 7], [794, 666, 15, 11, 15, 2], [794, 722, 15, 9, 15, 7], [794, 767, 15, 12, 15, 1], [855, 2, 15, 12, 15, 1], [855, 53, 15, 12, 15, 1], [855, 104, 15, 12, 15, 1], [855, 155, 15, 12, 15, 1], [855, 206, 15, 12, 15, 1], [855, 257, 15, 12, 15, 1], [855, 308, 15, 12, 15, 1], [855, 359, 15, 12, 15, 1], [855, 410, 15, 12, 15, 1], [855, 461, 15, 12, 15, 1], [855, 512, 15, 12, 15, 1], [855, 563, 15, 12, 15, 1], [855, 614, 15, 12, 15, 1], [855, 665, 15, 12, 15, 1], [855, 716, 15, 12, 15, 1], [855, 767, 15, 12, 15, 1]], \"widestlogicalchar\": 20, \"widestglyph\": 20, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 15, 1], [1, 54, 17, 13, 15, 2], [1, 105, 18, 5, 15, 2], [1, 156, 18, 13, 15, 2], [1, 206, 19, 16, 15, 1], [1, 258, 18, 13, 15, 2], [1, 309, 18, 13, 15, 2], [1, 360, 16, 5, 15, 2], [1, 411, 18, 17, 15, 2], [1, 462, 16, 17, 15, 2], [1, 513, 18, 8, 15, 2], [1, 567, 17, 9, 15, 5], [1, 624, 14, 6, 15, 11], [1, 672, 18, 3, 15, 8], [1, 726, 11, 4, 15, 11], [1, 768, 20, 13, 15, 2], [62, 3, 19, 13, 15, 2], [62, 54, 17, 13, 15, 2], [62, 105, 19, 13, 15, 2], [62, 156, 19, 13, 15, 2], [62, 207, 19, 13, 15, 2], [62, 258, 20, 13, 15, 2], [62, 309, 18, 13, 15, 2], [62, 360, 20, 13, 15, 2], [62, 411, 19, 13, 15, 2], [62, 462, 19, 13, 15, 2], [62, 516, 15, 10, 15, 5], [62, 567, 15, 12, 15, 5], [62, 618, 18, 9, 15, 5], [62, 671, 18, 6, 15, 7], [62, 720, 17, 9, 15, 5], [62, 767, 18, 14, 15, 1], [123, 3, 19, 13, 15, 2], [123, 54, 17, 13, 15, 2], [123, 105, 20, 13, 15, 2], [123, 156, 21, 13, 15, 2], [123, 207, 19, 13, 15, 2], [123, 258, 20, 13, 15, 2], [123, 309, 20, 13, 15, 2], [123, 360, 21, 13, 15, 2], [123, 411, 21, 13, 15, 2], [123, 462, 20, 13, 15, 2], [123, 513, 21, 13, 15, 2], [123, 564, 20, 13, 15, 2], [123, 615, 17, 13, 15, 2], [123, 666, 21, 13, 15, 2], [123, 717, 21, 13, 15, 2], [123, 768, 19, 13, 15, 2], [184, 3, 19, 13, 15, 2], [184, 54, 19, 14, 15, 2], [184, 105, 18, 13, 15, 2], [184, 156, 20, 13, 15, 2], [184, 207, 21, 13, 15, 2], [184, 258, 20, 13, 15, 2], [184, 309, 21, 13, 15, 2], [184, 360, 21, 13, 15, 2], [184, 411, 21, 13, 15, 2], [184, 462, 21, 13, 15, 2], [184, 513, 20, 13, 15, 2], [184, 564, 18, 17, 15, 2], [184, 615, 14, 13, 15, 2], [184, 666, 17, 17, 15, 2], [184, 717, 18, 6, 15, 2], [184, 781, 15, 3, 15, 15], [245, 3, 16, 5, 15, 2], [245, 57, 17, 10, 15, 5], [245, 105, 18, 13, 15, 2], [245, 159, 17, 10, 15, 5], [245, 207, 20, 13, 15, 2], [245, 261, 17, 10, 15, 5], [245, 309, 21, 13, 15, 2], [245, 363, 18, 14, 15, 5], [245, 411, 17, 13, 15, 2], [245, 462, 17, 13, 15, 2], [245, 513, 19, 17, 15, 2], [245, 564, 19, 13, 15, 2], [245, 615, 17, 13, 15, 2], [245, 669, 19, 10, 15, 5], [245, 720, 17, 10, 15, 5], [245, 771, 17, 10, 15, 5], [306, 6, 18, 14, 15, 5], [306, 57, 19, 14, 15, 5], [306, 108, 18, 10, 15, 5], [306, 159, 18, 10, 15, 5], [306, 207, 17, 13, 15, 2], [306, 261, 18, 10, 15, 5], [306, 312, 19, 10, 15, 5], [306, 363, 20, 10, 15, 5], [306, 414, 19, 10, 15, 5], [306, 465, 20, 14, 15, 5], [306, 516, 18, 10, 15, 5], [306, 564, 19, 17, 15, 2], [306, 615, 17, 17, 15, 2], [306, 666, 16, 17, 15, 2], [306, 717, 20, 4, 15, 2], [306, 769, 19, 12, 15, 3], [367, 1, 20, 15, 15, 0], [367, 52, 19, 15, 15, 0], [367, 105, 21, 16, 15, 2], [367, 154, 20, 15, 15, 0], [367, 205, 21, 15, 15, 0], [367, 256, 20, 15, 15, 0], [367, 307, 21, 15, 15, 0], [367, 359, 18, 14, 15, 1], [367, 410, 17, 14, 15, 1], [367, 461, 18, 14, 15, 1], [367, 513, 18, 13, 15, 2], [367, 564, 19, 13, 15, 2], [367, 613, 18, 15, 15, 0], [367, 669, 17, 13, 15, 5], [367, 716, 18, 14, 15, 1], [367, 767, 17, 14, 15, 1], [428, 2, 18, 14, 15, 1], [428, 54, 18, 13, 15, 2], [428, 104, 18, 14, 15, 1], [428, 155, 16, 14, 15, 1], [428, 206, 18, 14, 15, 1], [428, 258, 19, 13, 15, 2], [428, 309, 19, 13, 15, 2], [428, 359, 18, 14, 15, 1], [428, 410, 17, 14, 15, 1], [428, 461, 18, 14, 15, 1], [428, 513, 18, 13, 15, 2], [428, 564, 19, 13, 15, 2], [428, 614, 18, 14, 15, 1], [428, 665, 18, 14, 15, 1], [428, 716, 18, 14, 15, 1], [428, 768, 18, 13, 15, 2], [489, 3, 17, 16, 15, 2], [489, 54, 17, 7, 15, 2], [489, 105, 17, 13, 15, 2], [489, 156, 18, 13, 15, 2], [489, 206, 19, 17, 15, 1], [489, 261, 16, 7, 15, 5], [489, 308, 20, 18, 15, 1], [489, 359, 19, 14, 15, 1], [489, 410, 22, 14, 18, 1], [489, 461, 22, 14, 18, 1], [489, 513, 25, 8, 20, 2], [489, 564, 18, 5, 15, 2], [489, 615, 19, 3, 15, 2], [489, 669, 18, 10, 14, 5], [489, 717, 21, 13, 15, 2], [489, 768, 21, 13, 15, 2], [550, 7, 20, 7, 17, 6], [550, 57, 16, 10, 14, 5], [550, 108, 18, 10, 14, 5], [550, 159, 17, 10, 14, 5], [550, 207, 21, 13, 15, 2], [550, 261, 17, 13, 14, 5], [550, 308, 18, 14, 13, 1], [550, 359, 21, 15, 17, 1], [550, 410, 24, 15, 19, 1], [550, 465, 18, 10, 13, 5], [550, 512, 15, 18, 9, 1], [550, 564, 16, 10, 15, 2], [550, 615, 17, 10, 15, 2], [550, 665, 22, 14, 18, 1], [550, 720, 20, 10, 15, 5], [550, 771, 18, 10, 15, 5], [611, 5, 16, 14, 15, 4], [611, 56, 16, 14, 15, 4], [611, 111, 19, 6, 17, 8], [611, 155, 20, 14, 14, 1], [611, 207, 19, 17, 15, 2], [611, 262, 18, 7, 14, 6], [611, 308, 17, 14, 15, 1], [611, 363, 18, 9, 15, 5], [611, 414, 18, 9, 15, 5], [611, 471, 16, 4, 15, 11], [611, 511, 1, 1, 15, 1], [611, 562, 18, 15, 15, 0], [611, 613, 21, 15, 15, 0], [611, 664, 21, 15, 15, 0], [611, 717, 21, 13, 15, 2], [611, 771, 20, 10, 15, 5], [672, 9, 16, 3, 15, 8], [672, 60, 18, 3, 15, 8], [672, 105, 18, 6, 15, 2], [672, 156, 20, 6, 15, 2], [672, 207, 16, 6, 15, 2], [672, 258, 18, 6, 15, 2], [672, 312, 17, 9, 14, 5], [672, 359, 17, 14, 13, 1], [672, 412, 20, 16, 15, 3], [1, 1, 1, 1, 15, 1], [794, 767, 18, 5, 15, 1], [672, 566, 18, 9, 15, 4], [672, 618, 15, 9, 15, 5], [672, 669, 16, 9, 15, 5], [672, 717, 19, 13, 15, 2], [672, 768, 19, 13, 15, 2], [733, 3, 17, 16, 15, 2], [733, 59, 13, 4, 15, 7], [733, 114, 14, 6, 15, 11], [733, 165, 15, 6, 15, 11], [733, 208, 18, 12, 15, 3], [733, 256, 19, 15, 15, 0], [733, 307, 20, 15, 15, 0], [733, 358, 19, 15, 15, 0], [733, 409, 20, 15, 15, 0], [733, 460, 20, 15, 15, 0], [733, 511, 20, 15, 15, 0], [733, 562, 20, 15, 15, 0], [733, 613, 20, 15, 15, 0], [733, 664, 20, 15, 15, 0], [733, 715, 19, 15, 15, 0], [733, 766, 19, 15, 15, 0], [1, 1, 1, 1, 15, 1], [794, 52, 19, 15, 15, 0], [794, 103, 20, 15, 15, 0], [794, 154, 20, 15, 15, 0], [794, 205, 20, 15, 15, 0], [794, 261, 15, 10, 15, 5], [794, 309, 18, 5, 15, 2], [794, 361, 18, 4, 15, 3], [794, 412, 18, 3, 15, 3], [794, 462, 19, 4, 15, 2], [794, 513, 16, 4, 15, 2], [794, 564, 17, 6, 15, 2], [794, 624, 13, 7, 15, 11], [794, 666, 20, 6, 15, 2], [794, 727, 13, 6, 15, 12], [794, 767, 18, 5, 15, 1], [855, 2, 18, 5, 15, 1], [855, 53, 18, 5, 15, 1], [855, 104, 18, 5, 15, 1], [855, 155, 18, 5, 15, 1], [855, 206, 18, 5, 15, 1], [855, 257, 18, 5, 15, 1], [855, 308, 18, 5, 15, 1], [855, 359, 18, 5, 15, 1], [855, 410, 18, 5, 15, 1], [855, 461, 18, 5, 15, 1], [855, 512, 18, 5, 15, 1], [855, 563, 18, 5, 15, 1], [855, 614, 18, 5, 15, 1], [855, 665, 18, 5, 15, 1], [855, 716, 18, 5, 15, 1], [855, 767, 18, 5, 15, 1]], \"capHeight\": 14, \"widestlogicalchar\": 20, \"widestglyph\": 25, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 14, 1], [1, 54, 16, 11, 14, 2], [1, 105, 17, 3, 14, 2], [1, 156, 17, 11, 14, 2], [1, 206, 18, 14, 14, 1], [1, 258, 17, 11, 14, 2], [1, 309, 17, 11, 14, 2], [1, 360, 15, 3, 14, 2], [1, 411, 17, 15, 14, 2], [1, 462, 15, 15, 14, 2], [1, 513, 17, 6, 14, 2], [1, 567, 16, 7, 14, 5], [1, 624, 13, 4, 14, 11], [1, 672, 17, 1, 14, 8], [1, 726, 10, 2, 14, 11], [1, 768, 19, 11, 14, 2], [62, 3, 18, 11, 14, 2], [62, 54, 16, 11, 14, 2], [62, 105, 18, 11, 14, 2], [62, 156, 18, 11, 14, 2], [62, 207, 18, 11, 14, 2], [62, 258, 19, 11, 14, 2], [62, 309, 17, 11, 14, 2], [62, 360, 19, 11, 14, 2], [62, 411, 18, 11, 14, 2], [62, 462, 18, 11, 14, 2], [62, 516, 14, 8, 14, 5], [62, 567, 14, 10, 14, 5], [62, 618, 17, 7, 14, 5], [62, 671, 17, 4, 14, 7], [62, 720, 16, 7, 14, 5], [62, 767, 17, 12, 14, 1], [123, 3, 18, 11, 14, 2], [123, 54, 16, 11, 14, 2], [123, 105, 19, 11, 14, 2], [123, 156, 20, 11, 14, 2], [123, 207, 18, 11, 14, 2], [123, 258, 19, 11, 14, 2], [123, 309, 19, 11, 14, 2], [123, 360, 20, 11, 14, 2], [123, 411, 20, 11, 14, 2], [123, 462, 19, 11, 14, 2], [123, 513, 20, 11, 14, 2], [123, 564, 19, 11, 14, 2], [123, 615, 16, 11, 14, 2], [123, 666, 20, 11, 14, 2], [123, 717, 20, 11, 14, 2], [123, 768, 18, 11, 14, 2], [184, 3, 18, 11, 14, 2], [184, 54, 18, 12, 14, 2], [184, 105, 17, 11, 14, 2], [184, 156, 19, 11, 14, 2], [184, 207, 20, 11, 14, 2], [184, 258, 19, 11, 14, 2], [184, 309, 20, 11, 14, 2], [184, 360, 20, 11, 14, 2], [184, 411, 20, 11, 14, 2], [184, 462, 20, 11, 14, 2], [184, 513, 19, 11, 14, 2], [184, 564, 17, 15, 14, 2], [184, 615, 13, 11, 14, 2], [184, 666, 16, 15, 14, 2], [184, 717, 17, 4, 14, 2], [184, 781, 14, 1, 14, 15], [245, 3, 15, 3, 14, 2], [245, 57, 16, 8, 14, 5], [245, 105, 17, 11, 14, 2], [245, 159, 16, 8, 14, 5], [245, 207, 19, 11, 14, 2], [245, 261, 16, 8, 14, 5], [245, 309, 20, 11, 14, 2], [245, 363, 17, 12, 14, 5], [245, 411, 16, 11, 14, 2], [245, 462, 16, 11, 14, 2], [245, 513, 18, 15, 14, 2], [245, 564, 18, 11, 14, 2], [245, 615, 16, 11, 14, 2], [245, 669, 18, 8, 14, 5], [245, 720, 16, 8, 14, 5], [245, 771, 16, 8, 14, 5], [306, 6, 17, 12, 14, 5], [306, 57, 18, 12, 14, 5], [306, 108, 17, 8, 14, 5], [306, 159, 17, 8, 14, 5], [306, 207, 16, 11, 14, 2], [306, 261, 17, 8, 14, 5], [306, 312, 18, 8, 14, 5], [306, 363, 19, 8, 14, 5], [306, 414, 18, 8, 14, 5], [306, 465, 19, 12, 14, 5], [306, 516, 17, 8, 14, 5], [306, 564, 18, 15, 14, 2], [306, 615, 16, 15, 14, 2], [306, 666, 15, 15, 14, 2], [306, 717, 19, 2, 14, 2], [306, 769, 18, 10, 14, 3], [367, 1, 18, 13, 14, 0], [367, 52, 18, 13, 14, 0], [367, 105, 20, 14, 14, 2], [367, 154, 19, 13, 14, 0], [367, 205, 20, 13, 14, 0], [367, 256, 18, 13, 14, 0], [367, 307, 20, 13, 14, 0], [367, 359, 17, 12, 14, 1], [367, 410, 16, 12, 14, 1], [367, 461, 17, 12, 14, 1], [367, 513, 17, 11, 14, 2], [367, 564, 18, 11, 14, 2], [367, 613, 17, 13, 14, 0], [367, 669, 16, 11, 14, 5], [367, 716, 17, 12, 14, 1], [367, 767, 16, 12, 14, 1], [428, 2, 17, 12, 14, 1], [428, 54, 17, 11, 14, 2], [428, 104, 17, 12, 14, 1], [428, 155, 15, 12, 14, 1], [428, 206, 17, 12, 14, 1], [428, 258, 18, 11, 14, 2], [428, 309, 18, 11, 14, 2], [428, 359, 17, 12, 14, 1], [428, 410, 16, 12, 14, 1], [428, 461, 17, 12, 14, 1], [428, 513, 17, 11, 14, 2], [428, 564, 18, 11, 14, 2], [428, 614, 17, 12, 14, 1], [428, 665, 17, 12, 14, 1], [428, 716, 17, 12, 14, 1], [428, 768, 17, 11, 14, 2], [489, 3, 16, 14, 14, 2], [489, 54, 16, 5, 14, 2], [489, 105, 16, 11, 14, 2], [489, 156, 17, 11, 14, 2], [489, 206, 18, 15, 14, 1], [489, 261, 15, 5, 14, 5], [489, 308, 19, 16, 14, 1], [489, 359, 18, 12, 14, 1], [489, 410, 21, 12, 17, 1], [489, 461, 21, 12, 17, 1], [489, 513, 24, 6, 19, 2], [489, 564, 17, 3, 14, 2], [489, 615, 18, 1, 14, 2], [489, 669, 17, 8, 13, 5], [489, 717, 20, 11, 14, 2], [489, 768, 20, 11, 14, 2], [550, 7, 19, 5, 16, 6], [550, 57, 15, 8, 13, 5], [550, 108, 17, 8, 13, 5], [550, 159, 16, 8, 13, 5], [550, 207, 20, 11, 14, 2], [550, 261, 16, 11, 13, 5], [550, 308, 17, 12, 12, 1], [550, 359, 20, 13, 16, 1], [550, 410, 23, 13, 18, 1], [550, 465, 17, 8, 12, 5], [550, 513, 14, 15, 8, 2], [550, 564, 15, 8, 14, 2], [550, 615, 16, 8, 14, 2], [550, 665, 21, 12, 17, 1], [550, 720, 19, 8, 14, 5], [550, 771, 17, 8, 14, 5], [611, 5, 15, 12, 14, 4], [611, 56, 15, 12, 14, 4], [611, 111, 18, 4, 16, 8], [611, 155, 19, 12, 13, 1], [611, 207, 18, 15, 14, 2], [611, 262, 17, 5, 13, 6], [611, 308, 16, 12, 14, 1], [611, 363, 17, 7, 14, 5], [611, 414, 17, 7, 14, 5], [611, 471, 15, 2, 14, 11], [611, 511, 1, 1, 14, 1], [611, 562, 17, 13, 14, 0], [611, 613, 18, 13, 14, 0], [611, 664, 18, 13, 14, 0], [611, 717, 20, 11, 14, 2], [611, 771, 19, 8, 14, 5], [672, 9, 15, 1, 14, 8], [672, 60, 17, 1, 14, 8], [672, 105, 17, 4, 14, 2], [672, 156, 19, 4, 14, 2], [672, 207, 15, 4, 14, 2], [672, 258, 17, 4, 14, 2], [672, 312, 16, 7, 13, 5], [672, 359, 16, 12, 12, 1], [672, 412, 19, 14, 14, 3], [1, 1, 1, 1, 14, 1], [794, 767, 17, 3, 14, 1], [672, 566, 17, 7, 14, 4], [672, 618, 14, 7, 14, 5], [672, 669, 15, 7, 14, 5], [672, 717, 18, 11, 14, 2], [672, 768, 18, 11, 14, 2], [733, 3, 16, 14, 14, 2], [733, 59, 12, 2, 14, 7], [733, 114, 13, 4, 14, 11], [733, 165, 14, 4, 14, 11], [733, 208, 17, 10, 14, 3], [733, 256, 18, 13, 14, 0], [733, 307, 19, 13, 14, 0], [733, 358, 16, 13, 14, 0], [733, 409, 19, 13, 14, 0], [733, 460, 19, 13, 14, 0], [733, 511, 19, 13, 14, 0], [733, 562, 19, 13, 14, 0], [733, 613, 19, 13, 14, 0], [733, 664, 19, 13, 14, 0], [733, 715, 18, 13, 14, 0], [733, 766, 18, 13, 14, 0], [1, 1, 1, 1, 14, 1], [794, 52, 18, 13, 14, 0], [794, 103, 19, 13, 14, 0], [794, 154, 19, 13, 14, 0], [794, 205, 19, 13, 14, 0], [794, 261, 14, 8, 14, 5], [794, 309, 17, 3, 14, 2], [794, 361, 17, 2, 14, 3], [794, 412, 17, 1, 14, 3], [794, 462, 18, 2, 14, 2], [794, 513, 15, 2, 14, 2], [794, 564, 16, 4, 14, 2], [794, 624, 12, 5, 14, 11], [794, 666, 19, 4, 14, 2], [794, 727, 12, 4, 14, 12], [794, 767, 17, 3, 14, 1], [855, 2, 17, 3, 14, 1], [855, 53, 17, 3, 14, 1], [855, 104, 17, 3, 14, 1], [855, 155, 17, 3, 14, 1], [855, 206, 17, 3, 14, 1], [855, 257, 17, 3, 14, 1], [855, 308, 17, 3, 14, 1], [855, 359, 17, 3, 14, 1], [855, 410, 17, 3, 14, 1], [855, 461, 17, 3, 14, 1], [855, 512, 17, 3, 14, 1], [855, 563, 17, 3, 14, 1], [855, 614, 17, 3, 14, 1], [855, 665, 17, 3, 14, 1], [855, 716, 17, 3, 14, 1], [855, 767, 17, 3, 14, 1]], \"capHeight\": 13, \"widestlogicalchar\": 19, \"widestglyph\": 24, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 15, 6, 15, 8], [1, 54, 15, 13, 15, 2], [1, 105, 15, 12, 15, 2], [1, 156, 15, 13, 15, 2], [1, 206, 15, 16, 15, 1], [1, 258, 15, 13, 15, 2], [1, 309, 15, 13, 15, 2], [1, 360, 15, 12, 15, 2], [1, 411, 15, 17, 15, 2], [1, 462, 15, 17, 15, 2], [1, 513, 15, 12, 15, 2], [1, 567, 15, 9, 15, 5], [1, 621, 15, 9, 15, 8], [1, 672, 15, 6, 15, 8], [1, 723, 15, 7, 15, 8], [1, 768, 15, 13, 15, 2], [62, 3, 15, 13, 15, 2], [62, 54, 15, 13, 15, 2], [62, 105, 15, 13, 15, 2], [62, 156, 15, 13, 15, 2], [62, 207, 15, 13, 15, 2], [62, 258, 15, 13, 15, 2], [62, 309, 15, 13, 15, 2], [62, 360, 15, 13, 15, 2], [62, 411, 15, 13, 15, 2], [62, 462, 15, 13, 15, 2], [62, 516, 15, 10, 15, 5], [62, 567, 15, 12, 15, 5], [62, 618, 15, 9, 15, 5], [62, 671, 15, 7, 15, 7], [62, 720, 15, 9, 15, 5], [62, 767, 15, 14, 15, 1], [123, 3, 15, 13, 15, 2], [123, 54, 15, 13, 15, 2], [123, 105, 15, 13, 15, 2], [123, 156, 15, 13, 15, 2], [123, 207, 15, 13, 15, 2], [123, 258, 15, 13, 15, 2], [123, 309, 15, 13, 15, 2], [123, 360, 15, 13, 15, 2], [123, 411, 15, 13, 15, 2], [123, 462, 15, 13, 15, 2], [123, 513, 15, 13, 15, 2], [123, 564, 15, 13, 15, 2], [123, 615, 15, 13, 15, 2], [123, 666, 15, 13, 15, 2], [123, 717, 15, 13, 15, 2], [123, 768, 15, 13, 15, 2], [184, 3, 15, 13, 15, 2], [184, 54, 15, 14, 15, 2], [184, 105, 15, 13, 15, 2], [184, 156, 15, 13, 15, 2], [184, 207, 15, 13, 15, 2], [184, 258, 15, 13, 15, 2], [184, 309, 15, 13, 15, 2], [184, 360, 15, 13, 15, 2], [184, 411, 15, 13, 15, 2], [184, 462, 15, 13, 15, 2], [184, 513, 15, 13, 15, 2], [184, 564, 15, 17, 15, 2], [184, 615, 15, 13, 15, 2], [184, 666, 15, 17, 15, 2], [184, 717, 15, 12, 15, 2], [184, 774, 15, 10, 15, 8], [245, 3, 15, 12, 15, 2], [245, 57, 15, 10, 15, 5], [245, 105, 15, 13, 15, 2], [245, 159, 15, 10, 15, 5], [245, 207, 15, 13, 15, 2], [245, 261, 15, 10, 15, 5], [245, 309, 15, 13, 15, 2], [245, 363, 15, 14, 15, 5], [245, 411, 15, 13, 15, 2], [245, 462, 15, 13, 15, 2], [245, 513, 15, 17, 15, 2], [245, 564, 15, 13, 15, 2], [245, 615, 15, 13, 15, 2], [245, 669, 15, 10, 15, 5], [245, 720, 15, 10, 15, 5], [245, 771, 15, 10, 15, 5], [306, 6, 15, 14, 15, 5], [306, 57, 15, 14, 15, 5], [306, 108, 15, 10, 15, 5], [306, 159, 15, 10, 15, 5], [306, 207, 15, 13, 15, 2], [306, 261, 15, 10, 15, 5], [306, 312, 15, 10, 15, 5], [306, 363, 15, 10, 15, 5], [306, 414, 15, 10, 15, 5], [306, 465, 15, 14, 15, 5], [306, 516, 15, 10, 15, 5], [306, 564, 15, 17, 15, 2], [306, 615, 15, 17, 15, 2], [306, 666, 15, 17, 15, 2], [306, 717, 15, 12, 15, 2], [306, 769, 15, 12, 15, 3], [367, 1, 15, 15, 15, 0], [367, 52, 15, 15, 15, 0], [367, 105, 15, 16, 15, 2], [367, 154, 15, 15, 15, 0], [367, 205, 15, 15, 15, 0], [367, 256, 15, 15, 15, 0], [367, 307, 15, 15, 15, 0], [367, 359, 15, 14, 15, 1], [367, 410, 15, 14, 15, 1], [367, 461, 15, 14, 15, 1], [367, 513, 15, 13, 15, 2], [367, 564, 15, 13, 15, 2], [367, 613, 15, 15, 15, 0], [367, 669, 15, 13, 15, 5], [367, 716, 15, 14, 15, 1], [367, 767, 15, 14, 15, 1], [428, 2, 15, 14, 15, 1], [428, 54, 15, 13, 15, 2], [428, 104, 15, 14, 15, 1], [428, 155, 15, 14, 15, 1], [428, 206, 15, 14, 15, 1], [428, 258, 15, 13, 15, 2], [428, 309, 15, 13, 15, 2], [428, 359, 15, 14, 15, 1], [428, 410, 15, 14, 15, 1], [428, 461, 15, 14, 15, 1], [428, 513, 15, 13, 15, 2], [428, 564, 15, 13, 15, 2], [428, 614, 15, 14, 15, 1], [428, 665, 15, 14, 15, 1], [428, 716, 15, 14, 15, 1], [428, 768, 15, 13, 15, 2], [489, 3, 15, 16, 15, 2], [489, 54, 15, 12, 15, 2], [489, 105, 15, 13, 15, 2], [489, 156, 15, 13, 15, 2], [489, 206, 15, 17, 15, 1], [489, 261, 15, 9, 15, 5], [489, 308, 15, 18, 15, 1], [489, 359, 15, 14, 15, 1], [489, 410, 18, 14, 18, 1], [489, 461, 18, 14, 18, 1], [489, 513, 20, 12, 20, 2], [489, 564, 15, 12, 15, 2], [489, 615, 15, 12, 15, 2], [489, 669, 14, 10, 14, 5], [489, 717, 15, 13, 15, 2], [489, 768, 15, 13, 15, 2], [550, 7, 17, 8, 17, 6], [550, 57, 14, 10, 14, 5], [550, 108, 14, 10, 14, 5], [550, 159, 14, 10, 14, 5], [550, 207, 15, 13, 15, 2], [550, 261, 14, 13, 14, 5], [550, 308, 13, 14, 13, 1], [550, 359, 17, 15, 17, 1], [550, 410, 19, 15, 19, 1], [550, 465, 13, 10, 13, 5], [550, 512, 9, 18, 9, 1], [550, 564, 15, 12, 15, 2], [550, 615, 15, 12, 15, 2], [550, 665, 18, 14, 18, 1], [550, 720, 15, 10, 15, 5], [550, 771, 15, 10, 15, 5], [611, 5, 15, 14, 15, 4], [611, 56, 15, 14, 15, 4], [611, 111, 17, 6, 17, 8], [611, 155, 14, 14, 14, 1], [611, 207, 15, 17, 15, 2], [611, 262, 14, 8, 14, 6], [611, 308, 15, 14, 15, 1], [611, 363, 15, 9, 15, 5], [611, 414, 15, 9, 15, 5], [611, 468, 15, 7, 15, 8], [611, 519, 15, 6, 15, 8], [611, 562, 15, 15, 15, 0], [611, 613, 15, 15, 15, 0], [611, 664, 15, 15, 15, 0], [611, 717, 15, 13, 15, 2], [611, 771, 15, 10, 15, 5], [672, 9, 15, 6, 15, 8], [672, 60, 15, 6, 15, 8], [672, 105, 15, 12, 15, 2], [672, 156, 15, 12, 15, 2], [672, 207, 15, 12, 15, 2], [672, 258, 15, 12, 15, 2], [672, 312, 14, 9, 14, 5], [672, 359, 13, 14, 13, 1], [672, 412, 15, 16, 15, 3], [1, 9, 15, 6, 15, 8], [794, 767, 15, 13, 15, 1], [672, 566, 15, 10, 15, 4], [672, 618, 15, 9, 15, 5], [672, 669, 15, 9, 15, 5], [672, 717, 15, 13, 15, 2], [672, 768, 15, 13, 15, 2], [733, 3, 15, 16, 15, 2], [733, 59, 15, 7, 15, 7], [733, 111, 15, 9, 15, 8], [733, 162, 15, 9, 15, 8], [733, 208, 15, 12, 15, 3], [733, 256, 15, 15, 15, 0], [733, 307, 15, 15, 15, 0], [733, 358, 15, 15, 15, 0], [733, 409, 15, 15, 15, 0], [733, 460, 15, 15, 15, 0], [733, 511, 15, 15, 15, 0], [733, 562, 15, 15, 15, 0], [733, 613, 15, 15, 15, 0], [733, 664, 15, 15, 15, 0], [733, 715, 15, 15, 15, 0], [733, 766, 15, 15, 15, 0], [1, 9, 15, 6, 15, 8], [794, 52, 15, 15, 15, 0], [794, 103, 15, 15, 15, 0], [794, 154, 15, 15, 15, 0], [794, 205, 15, 15, 15, 0], [794, 261, 15, 10, 15, 5], [794, 309, 15, 12, 15, 2], [794, 361, 15, 11, 15, 3], [794, 412, 15, 11, 15, 3], [794, 462, 15, 12, 15, 2], [794, 513, 15, 12, 15, 2], [794, 564, 15, 12, 15, 2], [794, 621, 15, 10, 15, 8], [794, 666, 15, 12, 15, 2], [794, 723, 15, 10, 15, 8], [794, 767, 15, 13, 15, 1], [855, 2, 15, 13, 15, 1], [855, 53, 15, 13, 15, 1], [855, 104, 15, 13, 15, 1], [855, 155, 15, 13, 15, 1], [855, 206, 15, 13, 15, 1], [855, 257, 15, 13, 15, 1], [855, 308, 15, 13, 15, 1], [855, 359, 15, 13, 15, 1], [855, 410, 15, 13, 15, 1], [855, 461, 15, 13, 15, 1], [855, 512, 15, 13, 15, 1], [855, 563, 15, 13, 15, 1], [855, 614, 15, 13, 15, 1], [855, 665, 15, 13, 15, 1], [855, 716, 15, 13, 15, 1], [855, 767, 15, 13, 15, 1]], \"widestlogicalchar\": 20, \"widestglyph\": 20, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 14, 6, 14, 7], [1, 54, 14, 11, 14, 2], [1, 105, 14, 11, 14, 2], [1, 156, 14, 11, 14, 2], [1, 206, 14, 14, 14, 1], [1, 258, 14, 11, 14, 2], [1, 309, 14, 11, 14, 2], [1, 360, 14, 11, 14, 2], [1, 411, 14, 15, 14, 2], [1, 462, 14, 15, 14, 2], [1, 513, 14, 11, 14, 2], [1, 567, 14, 8, 14, 5], [1, 620, 14, 8, 14, 7], [1, 671, 14, 6, 14, 7], [1, 722, 14, 6, 14, 7], [1, 768, 14, 11, 14, 2], [62, 3, 14, 11, 14, 2], [62, 54, 14, 11, 14, 2], [62, 105, 14, 11, 14, 2], [62, 156, 14, 11, 14, 2], [62, 207, 14, 11, 14, 2], [62, 258, 14, 11, 14, 2], [62, 309, 14, 11, 14, 2], [62, 360, 14, 11, 14, 2], [62, 411, 14, 11, 14, 2], [62, 462, 14, 11, 14, 2], [62, 516, 14, 8, 14, 5], [62, 567, 14, 10, 14, 5], [62, 618, 14, 8, 14, 5], [62, 671, 14, 6, 14, 7], [62, 720, 14, 8, 14, 5], [62, 767, 14, 12, 14, 1], [123, 3, 14, 11, 14, 2], [123, 54, 14, 11, 14, 2], [123, 105, 14, 11, 14, 2], [123, 156, 14, 11, 14, 2], [123, 207, 14, 11, 14, 2], [123, 258, 14, 11, 14, 2], [123, 309, 14, 11, 14, 2], [123, 360, 14, 11, 14, 2], [123, 411, 14, 11, 14, 2], [123, 462, 14, 11, 14, 2], [123, 513, 14, 11, 14, 2], [123, 564, 14, 11, 14, 2], [123, 615, 14, 11, 14, 2], [123, 666, 14, 11, 14, 2], [123, 717, 14, 11, 14, 2], [123, 768, 14, 11, 14, 2], [184, 3, 14, 11, 14, 2], [184, 54, 14, 12, 14, 2], [184, 105, 14, 11, 14, 2], [184, 156, 14, 11, 14, 2], [184, 207, 14, 11, 14, 2], [184, 258, 14, 11, 14, 2], [184, 309, 14, 11, 14, 2], [184, 360, 14, 11, 14, 2], [184, 411, 14, 11, 14, 2], [184, 462, 14, 11, 14, 2], [184, 513, 14, 11, 14, 2], [184, 564, 14, 15, 14, 2], [184, 615, 14, 11, 14, 2], [184, 666, 14, 15, 14, 2], [184, 717, 14, 11, 14, 2], [184, 773, 14, 9, 14, 7], [245, 3, 14, 11, 14, 2], [245, 57, 14, 8, 14, 5], [245, 105, 14, 11, 14, 2], [245, 159, 14, 8, 14, 5], [245, 207, 14, 11, 14, 2], [245, 261, 14, 8, 14, 5], [245, 309, 14, 11, 14, 2], [245, 363, 14, 12, 14, 5], [245, 411, 14, 11, 14, 2], [245, 462, 14, 11, 14, 2], [245, 513, 14, 15, 14, 2], [245, 564, 14, 11, 14, 2], [245, 615, 14, 11, 14, 2], [245, 669, 14, 8, 14, 5], [245, 720, 14, 8, 14, 5], [245, 771, 14, 8, 14, 5], [306, 6, 14, 12, 14, 5], [306, 57, 14, 12, 14, 5], [306, 108, 14, 8, 14, 5], [306, 159, 14, 8, 14, 5], [306, 207, 14, 11, 14, 2], [306, 261, 14, 8, 14, 5], [306, 312, 14, 8, 14, 5], [306, 363, 14, 8, 14, 5], [306, 414, 14, 8, 14, 5], [306, 465, 14, 12, 14, 5], [306, 516, 14, 8, 14, 5], [306, 564, 14, 15, 14, 2], [306, 615, 14, 15, 14, 2], [306, 666, 14, 15, 14, 2], [306, 717, 14, 11, 14, 2], [306, 769, 14, 10, 14, 3], [367, 1, 14, 13, 14, 0], [367, 52, 14, 13, 14, 0], [367, 105, 14, 14, 14, 2], [367, 154, 14, 13, 14, 0], [367, 205, 14, 13, 14, 0], [367, 256, 14, 13, 14, 0], [367, 307, 14, 13, 14, 0], [367, 359, 14, 12, 14, 1], [367, 410, 14, 12, 14, 1], [367, 461, 14, 12, 14, 1], [367, 513, 14, 11, 14, 2], [367, 564, 14, 11, 14, 2], [367, 613, 14, 13, 14, 0], [367, 669, 14, 11, 14, 5], [367, 716, 14, 12, 14, 1], [367, 767, 14, 12, 14, 1], [428, 2, 14, 12, 14, 1], [428, 54, 14, 11, 14, 2], [428, 104, 14, 12, 14, 1], [428, 155, 14, 12, 14, 1], [428, 206, 14, 12, 14, 1], [428, 258, 14, 11, 14, 2], [428, 309, 14, 11, 14, 2], [428, 359, 14, 12, 14, 1], [428, 410, 14, 12, 14, 1], [428, 461, 14, 12, 14, 1], [428, 513, 14, 11, 14, 2], [428, 564, 14, 11, 14, 2], [428, 614, 14, 12, 14, 1], [428, 665, 14, 12, 14, 1], [428, 716, 14, 12, 14, 1], [428, 768, 14, 11, 14, 2], [489, 3, 14, 14, 14, 2], [489, 54, 14, 11, 14, 2], [489, 105, 14, 11, 14, 2], [489, 156, 14, 11, 14, 2], [489, 206, 14, 15, 14, 1], [489, 261, 14, 8, 14, 5], [489, 308, 14, 16, 14, 1], [489, 359, 14, 12, 14, 1], [489, 410, 17, 12, 17, 1], [489, 461, 17, 12, 17, 1], [489, 513, 19, 11, 19, 2], [489, 564, 14, 11, 14, 2], [489, 615, 14, 11, 14, 2], [489, 669, 13, 8, 13, 5], [489, 717, 14, 11, 14, 2], [489, 768, 14, 11, 14, 2], [550, 7, 16, 7, 16, 6], [550, 57, 13, 8, 13, 5], [550, 108, 13, 8, 13, 5], [550, 159, 13, 8, 13, 5], [550, 207, 14, 11, 14, 2], [550, 261, 13, 11, 13, 5], [550, 308, 12, 12, 12, 1], [550, 359, 16, 13, 16, 1], [550, 410, 18, 13, 18, 1], [550, 465, 12, 8, 12, 5], [550, 512, 8, 16, 8, 1], [550, 564, 14, 11, 14, 2], [550, 615, 14, 11, 14, 2], [550, 665, 17, 12, 17, 1], [550, 720, 14, 8, 14, 5], [550, 771, 14, 8, 14, 5], [611, 5, 14, 12, 14, 4], [611, 56, 14, 12, 14, 4], [611, 110, 16, 6, 16, 7], [611, 155, 13, 12, 13, 1], [611, 207, 14, 15, 14, 2], [611, 262, 13, 7, 13, 6], [611, 308, 14, 12, 14, 1], [611, 363, 14, 8, 14, 5], [611, 414, 14, 8, 14, 5], [611, 467, 14, 6, 14, 7], [611, 518, 14, 6, 14, 7], [611, 562, 14, 13, 14, 0], [611, 613, 14, 13, 14, 0], [611, 664, 14, 13, 14, 0], [611, 717, 14, 11, 14, 2], [611, 771, 14, 8, 14, 5], [672, 8, 14, 6, 14, 7], [672, 59, 14, 6, 14, 7], [672, 105, 14, 11, 14, 2], [672, 156, 14, 11, 14, 2], [672, 207, 14, 11, 14, 2], [672, 258, 14, 11, 14, 2], [672, 312, 13, 8, 13, 5], [672, 359, 12, 12, 12, 1], [672, 412, 14, 14, 14, 3], [1, 8, 14, 6, 14, 7], [794, 767, 14, 12, 14, 1], [672, 566, 14, 9, 14, 4], [672, 618, 14, 8, 14, 5], [672, 669, 14, 8, 14, 5], [672, 717, 14, 11, 14, 2], [672, 768, 14, 11, 14, 2], [733, 3, 14, 14, 14, 2], [733, 59, 14, 6, 14, 7], [733, 110, 14, 8, 14, 7], [733, 161, 14, 8, 14, 7], [733, 208, 14, 10, 14, 3], [733, 256, 14, 13, 14, 0], [733, 307, 14, 13, 14, 0], [733, 358, 14, 13, 14, 0], [733, 409, 14, 13, 14, 0], [733, 460, 14, 13, 14, 0], [733, 511, 14, 13, 14, 0], [733, 562, 14, 13, 14, 0], [733, 613, 14, 13, 14, 0], [733, 664, 14, 13, 14, 0], [733, 715, 14, 13, 14, 0], [733, 766, 14, 13, 14, 0], [1, 8, 14, 6, 14, 7], [794, 52, 14, 13, 14, 0], [794, 103, 14, 13, 14, 0], [794, 154, 14, 13, 14, 0], [794, 205, 14, 13, 14, 0], [794, 261, 14, 8, 14, 5], [794, 309, 14, 11, 14, 2], [794, 361, 14, 10, 14, 3], [794, 412, 14, 10, 14, 3], [794, 462, 14, 11, 14, 2], [794, 513, 14, 11, 14, 2], [794, 564, 14, 11, 14, 2], [794, 620, 14, 9, 14, 7], [794, 666, 14, 11, 14, 2], [794, 722, 14, 9, 14, 7], [794, 767, 14, 12, 14, 1], [855, 2, 14, 12, 14, 1], [855, 53, 14, 12, 14, 1], [855, 104, 14, 12, 14, 1], [855, 155, 14, 12, 14, 1], [855, 206, 14, 12, 14, 1], [855, 257, 14, 12, 14, 1], [855, 308, 14, 12, 14, 1], [855, 359, 14, 12, 14, 1], [855, 410, 14, 12, 14, 1], [855, 461, 14, 12, 14, 1], [855, 512, 14, 12, 14, 1], [855, 563, 14, 12, 14, 1], [855, 614, 14, 12, 14, 1], [855, 665, 14, 12, 14, 1], [855, 716, 14, 12, 14, 1], [855, 767, 14, 12, 14, 1]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 19, 1], [1, 54, 22, 17, 19, 2], [1, 105, 24, 6, 19, 2], [1, 155, 27, 18, 19, 1], [1, 205, 25, 22, 19, 0], [1, 257, 27, 18, 19, 1], [1, 309, 22, 17, 19, 2], [1, 360, 22, 6, 19, 2], [1, 411, 23, 22, 19, 2], [1, 462, 21, 22, 19, 2], [1, 513, 25, 11, 19, 2], [1, 568, 22, 12, 19, 6], [1, 626, 18, 10, 19, 13], [1, 674, 22, 4, 19, 10], [1, 728, 17, 6, 19, 13], [1, 768, 24, 17, 19, 2], [62, 3, 24, 17, 19, 2], [62, 54, 22, 17, 19, 2], [62, 105, 24, 17, 19, 2], [62, 156, 23, 17, 19, 2], [62, 207, 24, 17, 19, 2], [62, 258, 25, 17, 19, 2], [62, 309, 24, 17, 19, 2], [62, 360, 25, 17, 19, 2], [62, 411, 24, 17, 19, 2], [62, 462, 24, 17, 19, 2], [62, 517, 21, 13, 19, 6], [62, 568, 21, 17, 19, 6], [62, 619, 24, 13, 19, 6], [62, 672, 23, 8, 19, 8], [62, 721, 22, 13, 19, 6], [62, 768, 24, 17, 19, 2], [123, 3, 25, 19, 19, 2], [123, 54, 22, 17, 19, 2], [123, 105, 25, 17, 19, 2], [123, 156, 27, 17, 19, 2], [123, 207, 25, 17, 19, 2], [123, 258, 27, 17, 19, 2], [123, 309, 27, 17, 19, 2], [123, 360, 27, 17, 19, 2], [123, 411, 27, 17, 19, 2], [123, 462, 26, 17, 19, 2], [123, 513, 27, 17, 19, 2], [123, 564, 27, 17, 19, 2], [123, 615, 22, 17, 19, 2], [123, 666, 27, 17, 19, 2], [123, 717, 27, 17, 19, 2], [123, 768, 25, 17, 19, 2], [184, 3, 25, 17, 19, 2], [184, 54, 25, 21, 19, 2], [184, 105, 24, 17, 19, 2], [184, 156, 26, 17, 19, 2], [184, 207, 27, 17, 19, 2], [184, 258, 27, 17, 19, 2], [184, 309, 27, 17, 19, 2], [184, 360, 27, 17, 19, 2], [184, 411, 27, 17, 19, 2], [184, 462, 27, 17, 19, 2], [184, 513, 26, 17, 19, 2], [184, 564, 23, 22, 19, 2], [184, 615, 20, 17, 19, 2], [184, 666, 23, 22, 19, 2], [184, 717, 23, 8, 19, 2], [184, 785, 20, 4, 19, 19], [245, 3, 22, 6, 19, 2], [245, 59, 21, 12, 19, 7], [245, 105, 23, 17, 19, 2], [245, 161, 24, 12, 19, 7], [245, 207, 25, 17, 19, 2], [245, 263, 22, 12, 19, 7], [245, 309, 25, 17, 19, 2], [245, 365, 25, 17, 19, 7], [245, 411, 22, 17, 19, 2], [245, 462, 22, 17, 19, 2], [245, 513, 25, 22, 19, 2], [245, 564, 25, 17, 19, 2], [245, 615, 22, 17, 19, 2], [245, 671, 24, 12, 19, 7], [245, 722, 22, 12, 19, 7], [245, 773, 22, 12, 19, 7], [306, 8, 23, 17, 19, 7], [306, 59, 25, 17, 19, 7], [306, 110, 23, 12, 19, 7], [306, 161, 23, 12, 19, 7], [306, 209, 23, 15, 19, 4], [306, 263, 23, 12, 19, 7], [306, 314, 25, 12, 19, 7], [306, 365, 26, 12, 19, 7], [306, 416, 24, 12, 19, 7], [306, 467, 25, 17, 19, 7], [306, 518, 23, 12, 19, 7], [306, 564, 25, 22, 19, 2], [306, 615, 22, 22, 19, 2], [306, 666, 22, 22, 19, 2], [306, 724, 23, 6, 19, 9], [306, 769, 26, 16, 19, 3], [367, 1, 25, 19, 19, 0], [367, 52, 24, 19, 19, 0], [367, 105, 27, 22, 19, 2], [367, 154, 27, 19, 19, 0], [367, 205, 27, 19, 19, 0], [367, 256, 25, 19, 19, 0], [367, 307, 27, 19, 19, 0], [367, 360, 24, 17, 19, 2], [367, 411, 21, 17, 19, 2], [367, 462, 22, 17, 19, 2], [367, 513, 23, 17, 19, 2], [367, 564, 24, 17, 19, 2], [367, 614, 23, 18, 19, 1], [367, 671, 24, 16, 19, 7], [367, 717, 25, 17, 19, 2], [367, 768, 22, 17, 19, 2], [428, 3, 23, 17, 19, 2], [428, 54, 24, 17, 19, 2], [428, 105, 25, 17, 19, 2], [428, 156, 21, 17, 19, 2], [428, 206, 24, 18, 19, 1], [428, 258, 24, 17, 19, 2], [428, 309, 23, 17, 19, 2], [428, 360, 25, 17, 19, 2], [428, 411, 22, 17, 19, 2], [428, 462, 23, 17, 19, 2], [428, 514, 24, 16, 19, 3], [428, 565, 24, 16, 19, 3], [428, 615, 24, 17, 19, 2], [428, 666, 23, 17, 19, 2], [428, 717, 23, 17, 19, 2], [428, 768, 23, 17, 19, 2], [489, 3, 24, 17, 19, 2], [489, 53, 22, 8, 15, 1], [489, 105, 23, 17, 19, 2], [489, 156, 24, 17, 19, 2], [489, 207, 24, 20, 19, 2], [489, 263, 21, 8, 19, 7], [489, 309, 26, 17, 19, 2], [489, 360, 25, 17, 19, 2], [489, 410, 29, 18, 24, 1], [489, 461, 29, 18, 24, 1], [489, 513, 34, 9, 26, 2], [489, 564, 23, 6, 19, 2], [489, 615, 24, 5, 19, 2], [489, 670, 24, 12, 18, 6], [489, 717, 27, 17, 19, 2], [489, 767, 27, 19, 19, 1], [550, 7, 26, 10, 22, 6], [550, 56, 23, 15, 19, 4], [550, 108, 25, 14, 19, 5], [550, 159, 23, 14, 19, 5], [550, 207, 27, 17, 19, 2], [550, 263, 25, 17, 19, 7], [550, 308, 25, 18, 17, 1], [550, 359, 28, 23, 22, 1], [550, 410, 33, 23, 25, 1], [550, 467, 26, 12, 19, 7], [550, 512, 20, 23, 12, 1], [550, 563, 24, 15, 19, 1], [550, 614, 25, 15, 19, 1], [550, 666, 27, 17, 23, 2], [550, 722, 24, 12, 19, 7], [550, 772, 25, 14, 19, 6], [611, 3, 23, 17, 19, 2], [611, 54, 23, 17, 19, 2], [611, 113, 23, 8, 22, 10], [611, 155, 26, 18, 18, 1], [611, 207, 27, 21, 19, 2], [611, 263, 23, 9, 18, 7], [611, 309, 22, 17, 20, 2], [611, 365, 24, 11, 19, 7], [611, 416, 22, 11, 19, 7], [611, 474, 21, 5, 19, 14], [611, 511, 1, 1, 19, 1], [611, 562, 22, 19, 19, 0], [611, 613, 25, 19, 19, 0], [611, 664, 26, 19, 19, 0], [611, 717, 27, 17, 19, 2], [611, 773, 24, 12, 19, 7], [672, 11, 22, 4, 19, 10], [672, 62, 23, 4, 19, 10], [672, 105, 26, 7, 19, 2], [672, 156, 26, 7, 19, 2], [672, 207, 23, 7, 19, 2], [672, 258, 23, 7, 19, 2], [672, 314, 21, 12, 18, 7], [672, 359, 21, 21, 17, 1], [672, 411, 25, 22, 19, 2], [1, 1, 1, 1, 19, 1], [794, 767, 25, 6, 19, 1], [672, 566, 25, 12, 19, 4], [672, 620, 22, 11, 19, 7], [672, 671, 20, 11, 19, 7], [672, 717, 25, 17, 19, 2], [672, 768, 25, 17, 19, 2], [733, 3, 24, 17, 19, 2], [733, 60, 20, 6, 19, 8], [733, 118, 17, 7, 19, 15], [733, 169, 20, 7, 19, 15], [733, 207, 27, 17, 19, 2], [733, 256, 23, 19, 19, 0], [733, 307, 27, 19, 19, 0], [733, 358, 24, 19, 19, 0], [733, 409, 27, 19, 19, 0], [733, 460, 27, 19, 19, 0], [733, 511, 26, 19, 19, 0], [733, 562, 26, 19, 19, 0], [733, 613, 26, 19, 19, 0], [733, 664, 26, 19, 19, 0], [733, 715, 25, 19, 19, 0], [733, 766, 25, 19, 19, 0], [1, 1, 1, 1, 19, 1], [794, 52, 25, 19, 19, 0], [794, 103, 27, 19, 19, 0], [794, 154, 27, 19, 19, 0], [794, 205, 27, 19, 19, 0], [794, 263, 20, 12, 19, 7], [794, 308, 24, 6, 19, 1], [794, 360, 24, 5, 19, 2], [794, 411, 24, 4, 19, 2], [794, 462, 24, 5, 19, 2], [794, 513, 22, 5, 19, 2], [794, 564, 23, 7, 19, 2], [794, 630, 15, 7, 19, 17], [794, 666, 25, 6, 19, 2], [794, 732, 15, 7, 19, 17], [794, 767, 25, 6, 19, 1], [855, 2, 25, 6, 19, 1], [855, 53, 25, 6, 19, 1], [855, 104, 25, 6, 19, 1], [855, 155, 25, 6, 19, 1], [855, 206, 25, 6, 19, 1], [855, 257, 25, 6, 19, 1], [855, 308, 25, 6, 19, 1], [855, 359, 25, 6, 19, 1], [855, 410, 25, 6, 19, 1], [855, 461, 25, 6, 19, 1], [855, 512, 25, 6, 19, 1], [855, 563, 25, 6, 19, 1], [855, 614, 25, 6, 19, 1], [855, 665, 25, 6, 19, 1], [855, 716, 25, 6, 19, 1], [855, 767, 25, 6, 19, 1]], \"capHeight\": 18, \"widestlogicalchar\": 26, \"widestglyph\": 34, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 18, 1], [1, 54, 21, 15, 18, 2], [1, 105, 23, 4, 18, 2], [1, 155, 26, 16, 18, 1], [1, 205, 24, 20, 18, 0], [1, 257, 26, 16, 18, 1], [1, 309, 21, 15, 18, 2], [1, 360, 21, 4, 18, 2], [1, 411, 22, 20, 18, 2], [1, 462, 20, 20, 18, 2], [1, 513, 24, 9, 18, 2], [1, 568, 21, 10, 18, 6], [1, 626, 17, 8, 18, 13], [1, 674, 21, 2, 18, 10], [1, 728, 16, 4, 18, 13], [1, 768, 23, 15, 18, 2], [62, 3, 23, 15, 18, 2], [62, 54, 21, 15, 18, 2], [62, 105, 23, 15, 18, 2], [62, 156, 22, 15, 18, 2], [62, 207, 23, 15, 18, 2], [62, 258, 24, 15, 18, 2], [62, 309, 23, 15, 18, 2], [62, 360, 24, 15, 18, 2], [62, 411, 23, 15, 18, 2], [62, 462, 23, 15, 18, 2], [62, 517, 20, 11, 18, 6], [62, 568, 20, 15, 18, 6], [62, 619, 23, 11, 18, 6], [62, 672, 22, 6, 18, 8], [62, 721, 21, 11, 18, 6], [62, 768, 23, 15, 18, 2], [123, 3, 24, 17, 18, 2], [123, 54, 21, 15, 18, 2], [123, 105, 24, 15, 18, 2], [123, 156, 26, 15, 18, 2], [123, 207, 24, 15, 18, 2], [123, 258, 26, 15, 18, 2], [123, 309, 26, 15, 18, 2], [123, 360, 26, 15, 18, 2], [123, 411, 26, 15, 18, 2], [123, 462, 25, 15, 18, 2], [123, 513, 26, 15, 18, 2], [123, 564, 26, 15, 18, 2], [123, 615, 21, 15, 18, 2], [123, 666, 26, 15, 18, 2], [123, 717, 26, 15, 18, 2], [123, 768, 24, 15, 18, 2], [184, 3, 24, 15, 18, 2], [184, 54, 24, 19, 18, 2], [184, 105, 23, 15, 18, 2], [184, 156, 25, 15, 18, 2], [184, 207, 26, 15, 18, 2], [184, 258, 26, 15, 18, 2], [184, 309, 26, 15, 18, 2], [184, 360, 26, 15, 18, 2], [184, 411, 26, 15, 18, 2], [184, 462, 26, 15, 18, 2], [184, 513, 25, 15, 18, 2], [184, 564, 22, 20, 18, 2], [184, 615, 19, 15, 18, 2], [184, 666, 22, 20, 18, 2], [184, 717, 22, 6, 18, 2], [184, 785, 19, 2, 18, 19], [245, 3, 21, 4, 18, 2], [245, 59, 20, 10, 18, 7], [245, 105, 22, 15, 18, 2], [245, 161, 23, 10, 18, 7], [245, 207, 24, 15, 18, 2], [245, 263, 21, 10, 18, 7], [245, 309, 24, 15, 18, 2], [245, 365, 24, 15, 18, 7], [245, 411, 21, 15, 18, 2], [245, 462, 21, 15, 18, 2], [245, 513, 24, 20, 18, 2], [245, 564, 24, 15, 18, 2], [245, 615, 21, 15, 18, 2], [245, 671, 23, 10, 18, 7], [245, 722, 21, 10, 18, 7], [245, 773, 21, 10, 18, 7], [306, 8, 22, 15, 18, 7], [306, 59, 24, 15, 18, 7], [306, 110, 22, 10, 18, 7], [306, 161, 22, 10, 18, 7], [306, 209, 22, 13, 18, 4], [306, 263, 22, 10, 18, 7], [306, 314, 24, 10, 18, 7], [306, 365, 25, 10, 18, 7], [306, 416, 23, 10, 18, 7], [306, 467, 24, 15, 18, 7], [306, 518, 22, 10, 18, 7], [306, 564, 24, 20, 18, 2], [306, 615, 21, 20, 18, 2], [306, 666, 21, 20, 18, 2], [306, 724, 22, 4, 18, 9], [306, 769, 25, 14, 18, 3], [367, 1, 24, 17, 18, 0], [367, 52, 23, 17, 18, 0], [367, 105, 26, 20, 18, 2], [367, 154, 26, 17, 18, 0], [367, 205, 26, 17, 18, 0], [367, 256, 24, 17, 18, 0], [367, 307, 26, 17, 18, 0], [367, 360, 23, 15, 18, 2], [367, 411, 20, 15, 18, 2], [367, 462, 21, 15, 18, 2], [367, 513, 22, 15, 18, 2], [367, 564, 23, 15, 18, 2], [367, 614, 22, 16, 18, 1], [367, 671, 23, 14, 18, 7], [367, 717, 24, 15, 18, 2], [367, 768, 21, 15, 18, 2], [428, 3, 22, 15, 18, 2], [428, 54, 23, 15, 18, 2], [428, 105, 24, 15, 18, 2], [428, 156, 20, 15, 18, 2], [428, 206, 23, 16, 18, 1], [428, 258, 23, 15, 18, 2], [428, 309, 22, 15, 18, 2], [428, 360, 24, 15, 18, 2], [428, 411, 21, 15, 18, 2], [428, 462, 22, 15, 18, 2], [428, 514, 23, 14, 18, 3], [428, 565, 23, 14, 18, 3], [428, 615, 23, 15, 18, 2], [428, 666, 22, 15, 18, 2], [428, 717, 22, 15, 18, 2], [428, 768, 22, 15, 18, 2], [489, 3, 23, 15, 18, 2], [489, 53, 21, 6, 14, 1], [489, 105, 22, 15, 18, 2], [489, 156, 23, 15, 18, 2], [489, 207, 23, 18, 18, 2], [489, 263, 20, 6, 18, 7], [489, 309, 25, 15, 18, 2], [489, 360, 24, 15, 18, 2], [489, 410, 28, 16, 23, 1], [489, 461, 28, 16, 23, 1], [489, 513, 33, 7, 25, 2], [489, 564, 22, 4, 18, 2], [489, 615, 23, 3, 18, 2], [489, 670, 23, 10, 17, 6], [489, 717, 26, 15, 18, 2], [489, 767, 26, 17, 18, 1], [550, 7, 25, 8, 21, 6], [550, 56, 22, 13, 18, 4], [550, 108, 24, 12, 18, 5], [550, 159, 22, 12, 18, 5], [550, 207, 26, 15, 18, 2], [550, 263, 24, 15, 18, 7], [550, 308, 24, 16, 16, 1], [550, 359, 27, 21, 21, 1], [550, 410, 32, 21, 24, 1], [550, 467, 25, 10, 18, 7], [550, 512, 19, 21, 11, 1], [550, 563, 23, 13, 18, 1], [550, 614, 24, 13, 18, 1], [550, 666, 26, 15, 22, 2], [550, 722, 23, 10, 18, 7], [550, 772, 24, 12, 18, 6], [611, 3, 22, 15, 18, 2], [611, 54, 22, 15, 18, 2], [611, 113, 22, 6, 21, 10], [611, 155, 25, 16, 17, 1], [611, 207, 26, 19, 18, 2], [611, 263, 22, 7, 17, 7], [611, 309, 21, 15, 19, 2], [611, 365, 23, 9, 18, 7], [611, 416, 21, 9, 18, 7], [611, 474, 20, 3, 18, 14], [611, 511, 1, 1, 18, 1], [611, 562, 21, 17, 18, 0], [611, 613, 24, 17, 18, 0], [611, 664, 25, 17, 18, 0], [611, 717, 26, 15, 18, 2], [611, 773, 23, 10, 18, 7], [672, 11, 21, 2, 18, 10], [672, 62, 22, 2, 18, 10], [672, 105, 25, 5, 18, 2], [672, 156, 25, 5, 18, 2], [672, 207, 22, 5, 18, 2], [672, 258, 22, 5, 18, 2], [672, 314, 20, 10, 17, 7], [672, 359, 20, 19, 16, 1], [672, 411, 24, 20, 18, 2], [1, 1, 1, 1, 18, 1], [794, 767, 24, 4, 18, 1], [672, 566, 24, 10, 18, 4], [672, 620, 21, 9, 18, 7], [672, 671, 19, 9, 18, 7], [672, 717, 24, 15, 18, 2], [672, 768, 24, 15, 18, 2], [733, 3, 23, 15, 18, 2], [733, 60, 19, 4, 18, 8], [733, 118, 16, 5, 18, 15], [733, 169, 19, 5, 18, 15], [733, 207, 26, 15, 18, 2], [733, 256, 22, 17, 18, 0], [733, 307, 26, 17, 18, 0], [733, 358, 22, 17, 18, 0], [733, 409, 26, 17, 18, 0], [733, 460, 26, 17, 18, 0], [733, 511, 25, 17, 18, 0], [733, 562, 25, 17, 18, 0], [733, 613, 25, 17, 18, 0], [733, 664, 25, 17, 18, 0], [733, 715, 24, 17, 18, 0], [733, 766, 24, 17, 18, 0], [1, 1, 1, 1, 18, 1], [794, 52, 24, 17, 18, 0], [794, 103, 26, 17, 18, 0], [794, 154, 26, 17, 18, 0], [794, 205, 26, 17, 18, 0], [794, 263, 19, 10, 18, 7], [794, 308, 23, 4, 18, 1], [794, 360, 23, 3, 18, 2], [794, 411, 23, 2, 18, 2], [794, 462, 23, 3, 18, 2], [794, 513, 21, 3, 18, 2], [794, 564, 22, 5, 18, 2], [794, 630, 14, 5, 18, 17], [794, 666, 24, 4, 18, 2], [794, 732, 14, 5, 18, 17], [794, 767, 24, 4, 18, 1], [855, 2, 24, 4, 18, 1], [855, 53, 24, 4, 18, 1], [855, 104, 24, 4, 18, 1], [855, 155, 24, 4, 18, 1], [855, 206, 24, 4, 18, 1], [855, 257, 24, 4, 18, 1], [855, 308, 24, 4, 18, 1], [855, 359, 24, 4, 18, 1], [855, 410, 24, 4, 18, 1], [855, 461, 24, 4, 18, 1], [855, 512, 24, 4, 18, 1], [855, 563, 24, 4, 18, 1], [855, 614, 24, 4, 18, 1], [855, 665, 24, 4, 18, 1], [855, 716, 24, 4, 18, 1], [855, 767, 24, 4, 18, 1]], \"capHeight\": 17, \"widestlogicalchar\": 25, \"widestglyph\": 33, \"tallestglyph\": 21}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 19, 6, 19, 12], [1, 54, 19, 17, 19, 2], [1, 105, 19, 16, 19, 2], [1, 155, 19, 18, 19, 1], [1, 205, 19, 22, 19, 0], [1, 257, 19, 18, 19, 1], [1, 309, 19, 17, 19, 2], [1, 360, 19, 16, 19, 2], [1, 411, 19, 22, 19, 2], [1, 462, 19, 22, 19, 2], [1, 513, 19, 16, 19, 2], [1, 568, 19, 12, 19, 6], [1, 625, 19, 11, 19, 12], [1, 674, 19, 8, 19, 10], [1, 727, 19, 7, 19, 12], [1, 768, 19, 17, 19, 2], [62, 3, 19, 17, 19, 2], [62, 54, 19, 17, 19, 2], [62, 105, 19, 17, 19, 2], [62, 156, 19, 17, 19, 2], [62, 207, 19, 17, 19, 2], [62, 258, 19, 17, 19, 2], [62, 309, 19, 17, 19, 2], [62, 360, 19, 17, 19, 2], [62, 411, 19, 17, 19, 2], [62, 462, 19, 17, 19, 2], [62, 517, 19, 13, 19, 6], [62, 568, 19, 17, 19, 6], [62, 619, 19, 13, 19, 6], [62, 672, 19, 10, 19, 8], [62, 721, 19, 13, 19, 6], [62, 768, 19, 17, 19, 2], [123, 3, 19, 19, 19, 2], [123, 54, 19, 17, 19, 2], [123, 105, 19, 17, 19, 2], [123, 156, 19, 17, 19, 2], [123, 207, 19, 17, 19, 2], [123, 258, 19, 17, 19, 2], [123, 309, 19, 17, 19, 2], [123, 360, 19, 17, 19, 2], [123, 411, 19, 17, 19, 2], [123, 462, 19, 17, 19, 2], [123, 513, 19, 17, 19, 2], [123, 564, 19, 17, 19, 2], [123, 615, 19, 17, 19, 2], [123, 666, 19, 17, 19, 2], [123, 717, 19, 17, 19, 2], [123, 768, 19, 17, 19, 2], [184, 3, 19, 17, 19, 2], [184, 54, 19, 21, 19, 2], [184, 105, 19, 17, 19, 2], [184, 156, 19, 17, 19, 2], [184, 207, 19, 17, 19, 2], [184, 258, 19, 17, 19, 2], [184, 309, 19, 17, 19, 2], [184, 360, 19, 17, 19, 2], [184, 411, 19, 17, 19, 2], [184, 462, 19, 17, 19, 2], [184, 513, 19, 17, 19, 2], [184, 564, 19, 22, 19, 2], [184, 615, 19, 17, 19, 2], [184, 666, 19, 22, 19, 2], [184, 717, 19, 16, 19, 2], [184, 778, 19, 11, 19, 12], [245, 3, 19, 16, 19, 2], [245, 59, 19, 12, 19, 7], [245, 105, 19, 17, 19, 2], [245, 161, 19, 12, 19, 7], [245, 207, 19, 17, 19, 2], [245, 263, 19, 12, 19, 7], [245, 309, 19, 17, 19, 2], [245, 365, 19, 17, 19, 7], [245, 411, 19, 17, 19, 2], [245, 462, 19, 17, 19, 2], [245, 513, 19, 22, 19, 2], [245, 564, 19, 17, 19, 2], [245, 615, 19, 17, 19, 2], [245, 671, 19, 12, 19, 7], [245, 722, 19, 12, 19, 7], [245, 773, 19, 12, 19, 7], [306, 8, 19, 17, 19, 7], [306, 59, 19, 17, 19, 7], [306, 110, 19, 12, 19, 7], [306, 161, 19, 12, 19, 7], [306, 209, 19, 15, 19, 4], [306, 263, 19, 12, 19, 7], [306, 314, 19, 12, 19, 7], [306, 365, 19, 12, 19, 7], [306, 416, 19, 12, 19, 7], [306, 467, 19, 17, 19, 7], [306, 518, 19, 12, 19, 7], [306, 564, 19, 22, 19, 2], [306, 615, 19, 22, 19, 2], [306, 666, 19, 22, 19, 2], [306, 724, 19, 9, 19, 9], [306, 769, 19, 16, 19, 3], [367, 1, 19, 19, 19, 0], [367, 52, 19, 19, 19, 0], [367, 105, 19, 22, 19, 2], [367, 154, 19, 19, 19, 0], [367, 205, 19, 19, 19, 0], [367, 256, 19, 19, 19, 0], [367, 307, 19, 19, 19, 0], [367, 360, 19, 17, 19, 2], [367, 411, 19, 17, 19, 2], [367, 462, 19, 17, 19, 2], [367, 513, 19, 17, 19, 2], [367, 564, 19, 17, 19, 2], [367, 614, 19, 18, 19, 1], [367, 671, 19, 16, 19, 7], [367, 717, 19, 17, 19, 2], [367, 768, 19, 17, 19, 2], [428, 3, 19, 17, 19, 2], [428, 54, 19, 17, 19, 2], [428, 105, 19, 17, 19, 2], [428, 156, 19, 17, 19, 2], [428, 206, 19, 18, 19, 1], [428, 258, 19, 17, 19, 2], [428, 309, 19, 17, 19, 2], [428, 360, 19, 17, 19, 2], [428, 411, 19, 17, 19, 2], [428, 462, 19, 17, 19, 2], [428, 514, 19, 16, 19, 3], [428, 565, 19, 16, 19, 3], [428, 615, 19, 17, 19, 2], [428, 666, 19, 17, 19, 2], [428, 717, 19, 17, 19, 2], [428, 768, 19, 17, 19, 2], [489, 3, 19, 17, 19, 2], [489, 53, 15, 17, 15, 1], [489, 105, 19, 17, 19, 2], [489, 156, 19, 17, 19, 2], [489, 207, 19, 20, 19, 2], [489, 263, 19, 11, 19, 7], [489, 309, 19, 17, 19, 2], [489, 360, 19, 17, 19, 2], [489, 410, 24, 18, 24, 1], [489, 461, 24, 18, 24, 1], [489, 513, 26, 16, 26, 2], [489, 564, 19, 16, 19, 2], [489, 615, 19, 16, 19, 2], [489, 670, 18, 12, 18, 6], [489, 717, 19, 17, 19, 2], [489, 767, 19, 19, 19, 1], [550, 7, 22, 12, 22, 6], [550, 56, 19, 15, 19, 4], [550, 108, 19, 14, 19, 5], [550, 159, 19, 14, 19, 5], [550, 207, 19, 17, 19, 2], [550, 263, 19, 17, 19, 7], [550, 308, 17, 18, 17, 1], [550, 359, 22, 23, 22, 1], [550, 410, 25, 23, 25, 1], [550, 467, 19, 12, 19, 7], [550, 512, 12, 23, 12, 1], [550, 563, 19, 17, 19, 1], [550, 614, 19, 17, 19, 1], [550, 666, 23, 17, 23, 2], [550, 722, 19, 12, 19, 7], [550, 772, 19, 14, 19, 6], [611, 3, 19, 17, 19, 2], [611, 54, 19, 17, 19, 2], [611, 113, 22, 8, 22, 10], [611, 155, 18, 18, 18, 1], [611, 207, 19, 21, 19, 2], [611, 263, 18, 11, 18, 7], [611, 309, 20, 17, 20, 2], [611, 365, 19, 11, 19, 7], [611, 416, 19, 11, 19, 7], [611, 472, 19, 7, 19, 12], [611, 523, 19, 6, 19, 12], [611, 562, 19, 19, 19, 0], [611, 613, 19, 19, 19, 0], [611, 664, 19, 19, 19, 0], [611, 717, 19, 17, 19, 2], [611, 773, 19, 12, 19, 7], [672, 11, 19, 8, 19, 10], [672, 62, 19, 8, 19, 10], [672, 105, 19, 16, 19, 2], [672, 156, 19, 16, 19, 2], [672, 207, 19, 16, 19, 2], [672, 258, 19, 16, 19, 2], [672, 314, 18, 12, 18, 7], [672, 359, 17, 21, 17, 1], [672, 411, 19, 22, 19, 2], [1, 13, 19, 6, 19, 12], [794, 767, 19, 17, 19, 1], [672, 566, 19, 14, 19, 4], [672, 620, 19, 11, 19, 7], [672, 671, 19, 11, 19, 7], [672, 717, 19, 17, 19, 2], [672, 768, 19, 17, 19, 2], [733, 3, 19, 17, 19, 2], [733, 60, 19, 10, 19, 8], [733, 115, 19, 10, 19, 12], [733, 166, 19, 10, 19, 12], [733, 207, 19, 17, 19, 2], [733, 256, 19, 19, 19, 0], [733, 307, 19, 19, 19, 0], [733, 358, 19, 19, 19, 0], [733, 409, 19, 19, 19, 0], [733, 460, 19, 19, 19, 0], [733, 511, 19, 19, 19, 0], [733, 562, 19, 19, 19, 0], [733, 613, 19, 19, 19, 0], [733, 664, 19, 19, 19, 0], [733, 715, 19, 19, 19, 0], [733, 766, 19, 19, 19, 0], [1, 13, 19, 6, 19, 12], [794, 52, 19, 19, 19, 0], [794, 103, 19, 19, 19, 0], [794, 154, 19, 19, 19, 0], [794, 205, 19, 19, 19, 0], [794, 263, 19, 12, 19, 7], [794, 308, 19, 17, 19, 1], [794, 360, 19, 16, 19, 2], [794, 411, 19, 16, 19, 2], [794, 462, 19, 16, 19, 2], [794, 513, 19, 16, 19, 2], [794, 564, 19, 16, 19, 2], [794, 625, 19, 12, 19, 12], [794, 666, 19, 16, 19, 2], [794, 727, 19, 12, 19, 12], [794, 767, 19, 17, 19, 1], [855, 2, 19, 17, 19, 1], [855, 53, 19, 17, 19, 1], [855, 104, 19, 17, 19, 1], [855, 155, 19, 17, 19, 1], [855, 206, 19, 17, 19, 1], [855, 257, 19, 17, 19, 1], [855, 308, 19, 17, 19, 1], [855, 359, 19, 17, 19, 1], [855, 410, 19, 17, 19, 1], [855, 461, 19, 17, 19, 1], [855, 512, 19, 17, 19, 1], [855, 563, 19, 17, 19, 1], [855, 614, 19, 17, 19, 1], [855, 665, 19, 17, 19, 1], [855, 716, 19, 17, 19, 1], [855, 767, 19, 17, 19, 1]], \"widestlogicalchar\": 26, \"widestglyph\": 26, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 17, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 12, 18, 6, 18, 11], [1, 54, 18, 15, 18, 2], [1, 105, 18, 15, 18, 2], [1, 155, 18, 16, 18, 1], [1, 205, 18, 20, 18, 0], [1, 257, 18, 16, 18, 1], [1, 309, 18, 15, 18, 2], [1, 360, 18, 15, 18, 2], [1, 411, 18, 20, 18, 2], [1, 462, 18, 20, 18, 2], [1, 513, 18, 15, 18, 2], [1, 568, 18, 11, 18, 6], [1, 624, 18, 10, 18, 11], [1, 674, 18, 7, 18, 10], [1, 726, 18, 6, 18, 11], [1, 768, 18, 15, 18, 2], [62, 3, 18, 15, 18, 2], [62, 54, 18, 15, 18, 2], [62, 105, 18, 15, 18, 2], [62, 156, 18, 15, 18, 2], [62, 207, 18, 15, 18, 2], [62, 258, 18, 15, 18, 2], [62, 309, 18, 15, 18, 2], [62, 360, 18, 15, 18, 2], [62, 411, 18, 15, 18, 2], [62, 462, 18, 15, 18, 2], [62, 517, 18, 11, 18, 6], [62, 568, 18, 15, 18, 6], [62, 619, 18, 11, 18, 6], [62, 672, 18, 9, 18, 8], [62, 721, 18, 11, 18, 6], [62, 768, 18, 15, 18, 2], [123, 3, 18, 17, 18, 2], [123, 54, 18, 15, 18, 2], [123, 105, 18, 15, 18, 2], [123, 156, 18, 15, 18, 2], [123, 207, 18, 15, 18, 2], [123, 258, 18, 15, 18, 2], [123, 309, 18, 15, 18, 2], [123, 360, 18, 15, 18, 2], [123, 411, 18, 15, 18, 2], [123, 462, 18, 15, 18, 2], [123, 513, 18, 15, 18, 2], [123, 564, 18, 15, 18, 2], [123, 615, 18, 15, 18, 2], [123, 666, 18, 15, 18, 2], [123, 717, 18, 15, 18, 2], [123, 768, 18, 15, 18, 2], [184, 3, 18, 15, 18, 2], [184, 54, 18, 19, 18, 2], [184, 105, 18, 15, 18, 2], [184, 156, 18, 15, 18, 2], [184, 207, 18, 15, 18, 2], [184, 258, 18, 15, 18, 2], [184, 309, 18, 15, 18, 2], [184, 360, 18, 15, 18, 2], [184, 411, 18, 15, 18, 2], [184, 462, 18, 15, 18, 2], [184, 513, 18, 15, 18, 2], [184, 564, 18, 20, 18, 2], [184, 615, 18, 15, 18, 2], [184, 666, 18, 20, 18, 2], [184, 717, 18, 15, 18, 2], [184, 777, 18, 10, 18, 11], [245, 3, 18, 15, 18, 2], [245, 59, 18, 10, 18, 7], [245, 105, 18, 15, 18, 2], [245, 161, 18, 10, 18, 7], [245, 207, 18, 15, 18, 2], [245, 263, 18, 10, 18, 7], [245, 309, 18, 15, 18, 2], [245, 365, 18, 15, 18, 7], [245, 411, 18, 15, 18, 2], [245, 462, 18, 15, 18, 2], [245, 513, 18, 20, 18, 2], [245, 564, 18, 15, 18, 2], [245, 615, 18, 15, 18, 2], [245, 671, 18, 10, 18, 7], [245, 722, 18, 10, 18, 7], [245, 773, 18, 10, 18, 7], [306, 8, 18, 15, 18, 7], [306, 59, 18, 15, 18, 7], [306, 110, 18, 10, 18, 7], [306, 161, 18, 10, 18, 7], [306, 209, 18, 13, 18, 4], [306, 263, 18, 10, 18, 7], [306, 314, 18, 10, 18, 7], [306, 365, 18, 10, 18, 7], [306, 416, 18, 10, 18, 7], [306, 467, 18, 15, 18, 7], [306, 518, 18, 10, 18, 7], [306, 564, 18, 20, 18, 2], [306, 615, 18, 20, 18, 2], [306, 666, 18, 20, 18, 2], [306, 724, 18, 8, 18, 9], [306, 769, 18, 14, 18, 3], [367, 1, 18, 17, 18, 0], [367, 52, 18, 17, 18, 0], [367, 105, 18, 20, 18, 2], [367, 154, 18, 17, 18, 0], [367, 205, 18, 17, 18, 0], [367, 256, 18, 17, 18, 0], [367, 307, 18, 17, 18, 0], [367, 360, 18, 15, 18, 2], [367, 411, 18, 15, 18, 2], [367, 462, 18, 15, 18, 2], [367, 513, 18, 15, 18, 2], [367, 564, 18, 15, 18, 2], [367, 614, 18, 16, 18, 1], [367, 671, 18, 14, 18, 7], [367, 717, 18, 15, 18, 2], [367, 768, 18, 15, 18, 2], [428, 3, 18, 15, 18, 2], [428, 54, 18, 15, 18, 2], [428, 105, 18, 15, 18, 2], [428, 156, 18, 15, 18, 2], [428, 206, 18, 16, 18, 1], [428, 258, 18, 15, 18, 2], [428, 309, 18, 15, 18, 2], [428, 360, 18, 15, 18, 2], [428, 411, 18, 15, 18, 2], [428, 462, 18, 15, 18, 2], [428, 514, 18, 14, 18, 3], [428, 565, 18, 14, 18, 3], [428, 615, 18, 15, 18, 2], [428, 666, 18, 15, 18, 2], [428, 717, 18, 15, 18, 2], [428, 768, 18, 15, 18, 2], [489, 3, 18, 15, 18, 2], [489, 53, 14, 16, 14, 1], [489, 105, 18, 15, 18, 2], [489, 156, 18, 15, 18, 2], [489, 207, 18, 18, 18, 2], [489, 263, 18, 10, 18, 7], [489, 309, 18, 15, 18, 2], [489, 360, 18, 15, 18, 2], [489, 410, 23, 16, 23, 1], [489, 461, 23, 16, 23, 1], [489, 513, 25, 15, 25, 2], [489, 564, 18, 15, 18, 2], [489, 615, 18, 15, 18, 2], [489, 670, 17, 11, 17, 6], [489, 717, 18, 15, 18, 2], [489, 767, 18, 17, 18, 1], [550, 7, 21, 11, 21, 6], [550, 56, 18, 13, 18, 4], [550, 108, 18, 12, 18, 5], [550, 159, 18, 12, 18, 5], [550, 207, 18, 15, 18, 2], [550, 263, 18, 15, 18, 7], [550, 308, 16, 16, 16, 1], [550, 359, 21, 21, 21, 1], [550, 410, 24, 21, 24, 1], [550, 467, 18, 10, 18, 7], [550, 512, 11, 21, 11, 1], [550, 563, 18, 16, 18, 1], [550, 614, 18, 16, 18, 1], [550, 666, 22, 15, 22, 2], [550, 722, 18, 10, 18, 7], [550, 772, 18, 12, 18, 6], [611, 3, 18, 15, 18, 2], [611, 54, 18, 15, 18, 2], [611, 113, 21, 7, 21, 10], [611, 155, 17, 16, 17, 1], [611, 207, 18, 19, 18, 2], [611, 263, 17, 10, 17, 7], [611, 309, 19, 15, 19, 2], [611, 365, 18, 10, 18, 7], [611, 416, 18, 10, 18, 7], [611, 471, 18, 6, 18, 11], [611, 522, 18, 6, 18, 11], [611, 562, 18, 17, 18, 0], [611, 613, 18, 17, 18, 0], [611, 664, 18, 17, 18, 0], [611, 717, 18, 15, 18, 2], [611, 773, 18, 10, 18, 7], [672, 11, 18, 7, 18, 10], [672, 62, 18, 7, 18, 10], [672, 105, 18, 15, 18, 2], [672, 156, 18, 15, 18, 2], [672, 207, 18, 15, 18, 2], [672, 258, 18, 15, 18, 2], [672, 314, 17, 10, 17, 7], [672, 359, 16, 19, 16, 1], [672, 411, 18, 20, 18, 2], [1, 12, 18, 6, 18, 11], [794, 767, 18, 16, 18, 1], [672, 566, 18, 13, 18, 4], [672, 620, 18, 10, 18, 7], [672, 671, 18, 10, 18, 7], [672, 717, 18, 15, 18, 2], [672, 768, 18, 15, 18, 2], [733, 3, 18, 15, 18, 2], [733, 60, 18, 9, 18, 8], [733, 114, 18, 9, 18, 11], [733, 165, 18, 9, 18, 11], [733, 207, 18, 15, 18, 2], [733, 256, 18, 17, 18, 0], [733, 307, 18, 17, 18, 0], [733, 358, 18, 17, 18, 0], [733, 409, 18, 17, 18, 0], [733, 460, 18, 17, 18, 0], [733, 511, 18, 17, 18, 0], [733, 562, 18, 17, 18, 0], [733, 613, 18, 17, 18, 0], [733, 664, 18, 17, 18, 0], [733, 715, 18, 17, 18, 0], [733, 766, 18, 17, 18, 0], [1, 12, 18, 6, 18, 11], [794, 52, 18, 17, 18, 0], [794, 103, 18, 17, 18, 0], [794, 154, 18, 17, 18, 0], [794, 205, 18, 17, 18, 0], [794, 263, 18, 10, 18, 7], [794, 308, 18, 16, 18, 1], [794, 360, 18, 15, 18, 2], [794, 411, 18, 15, 18, 2], [794, 462, 18, 15, 18, 2], [794, 513, 18, 15, 18, 2], [794, 564, 18, 15, 18, 2], [794, 624, 18, 11, 18, 11], [794, 666, 18, 15, 18, 2], [794, 726, 18, 11, 18, 11], [794, 767, 18, 16, 18, 1], [855, 2, 18, 16, 18, 1], [855, 53, 18, 16, 18, 1], [855, 104, 18, 16, 18, 1], [855, 155, 18, 16, 18, 1], [855, 206, 18, 16, 18, 1], [855, 257, 18, 16, 18, 1], [855, 308, 18, 16, 18, 1], [855, 359, 18, 16, 18, 1], [855, 410, 18, 16, 18, 1], [855, 461, 18, 16, 18, 1], [855, 512, 18, 16, 18, 1], [855, 563, 18, 16, 18, 1], [855, 614, 18, 16, 18, 1], [855, 665, 18, 16, 18, 1], [855, 716, 18, 16, 18, 1], [855, 767, 18, 16, 18, 1]], \"widestlogicalchar\": 25, \"widestglyph\": 25, \"tallestglyph\": 21}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 18, 1], [1, 54, 21, 17, 18, 2], [1, 105, 23, 6, 18, 2], [1, 155, 26, 18, 18, 1], [1, 205, 24, 22, 18, 0], [1, 257, 26, 18, 18, 1], [1, 309, 21, 17, 18, 2], [1, 360, 21, 6, 18, 2], [1, 411, 22, 22, 18, 2], [1, 462, 20, 22, 18, 2], [1, 513, 24, 11, 18, 2], [1, 568, 21, 12, 18, 6], [1, 626, 17, 10, 18, 13], [1, 674, 21, 4, 18, 10], [1, 728, 16, 6, 18, 13], [1, 768, 23, 17, 18, 2], [62, 3, 23, 17, 18, 2], [62, 54, 21, 17, 18, 2], [62, 105, 23, 17, 18, 2], [62, 156, 22, 17, 18, 2], [62, 207, 23, 17, 18, 2], [62, 258, 24, 17, 18, 2], [62, 309, 23, 17, 18, 2], [62, 360, 24, 17, 18, 2], [62, 411, 23, 17, 18, 2], [62, 462, 23, 17, 18, 2], [62, 517, 20, 13, 18, 6], [62, 568, 20, 17, 18, 6], [62, 619, 23, 13, 18, 6], [62, 672, 22, 8, 18, 8], [62, 721, 21, 13, 18, 6], [62, 768, 23, 17, 18, 2], [123, 3, 24, 19, 18, 2], [123, 54, 21, 17, 18, 2], [123, 105, 24, 17, 18, 2], [123, 156, 26, 17, 18, 2], [123, 207, 24, 17, 18, 2], [123, 258, 26, 17, 18, 2], [123, 309, 26, 17, 18, 2], [123, 360, 26, 17, 18, 2], [123, 411, 26, 17, 18, 2], [123, 462, 25, 17, 18, 2], [123, 513, 26, 17, 18, 2], [123, 564, 26, 17, 18, 2], [123, 615, 21, 17, 18, 2], [123, 666, 26, 17, 18, 2], [123, 717, 26, 17, 18, 2], [123, 768, 24, 17, 18, 2], [184, 3, 24, 17, 18, 2], [184, 54, 24, 21, 18, 2], [184, 105, 23, 17, 18, 2], [184, 156, 25, 17, 18, 2], [184, 207, 26, 17, 18, 2], [184, 258, 26, 17, 18, 2], [184, 309, 26, 17, 18, 2], [184, 360, 26, 17, 18, 2], [184, 411, 26, 17, 18, 2], [184, 462, 26, 17, 18, 2], [184, 513, 25, 17, 18, 2], [184, 564, 22, 22, 18, 2], [184, 615, 19, 17, 18, 2], [184, 666, 22, 22, 18, 2], [184, 717, 22, 8, 18, 2], [184, 785, 19, 4, 18, 19], [245, 3, 21, 6, 18, 2], [245, 59, 20, 12, 18, 7], [245, 105, 22, 17, 18, 2], [245, 161, 23, 12, 18, 7], [245, 207, 24, 17, 18, 2], [245, 263, 21, 12, 18, 7], [245, 309, 24, 17, 18, 2], [245, 365, 24, 17, 18, 7], [245, 411, 21, 17, 18, 2], [245, 462, 21, 17, 18, 2], [245, 513, 24, 22, 18, 2], [245, 564, 24, 17, 18, 2], [245, 615, 21, 17, 18, 2], [245, 671, 23, 12, 18, 7], [245, 722, 21, 12, 18, 7], [245, 773, 21, 12, 18, 7], [306, 8, 22, 17, 18, 7], [306, 59, 24, 17, 18, 7], [306, 110, 22, 12, 18, 7], [306, 161, 22, 12, 18, 7], [306, 209, 22, 15, 18, 4], [306, 263, 22, 12, 18, 7], [306, 314, 24, 12, 18, 7], [306, 365, 25, 12, 18, 7], [306, 416, 23, 12, 18, 7], [306, 467, 24, 17, 18, 7], [306, 518, 22, 12, 18, 7], [306, 564, 24, 22, 18, 2], [306, 615, 21, 22, 18, 2], [306, 666, 21, 22, 18, 2], [306, 724, 22, 6, 18, 9], [306, 769, 25, 16, 18, 3], [367, 1, 24, 19, 18, 0], [367, 52, 23, 19, 18, 0], [367, 105, 26, 22, 18, 2], [367, 154, 26, 19, 18, 0], [367, 205, 26, 19, 18, 0], [367, 256, 24, 19, 18, 0], [367, 307, 26, 19, 18, 0], [367, 360, 23, 17, 18, 2], [367, 411, 20, 17, 18, 2], [367, 462, 21, 17, 18, 2], [367, 513, 22, 17, 18, 2], [367, 564, 23, 17, 18, 2], [367, 614, 22, 18, 18, 1], [367, 671, 23, 16, 18, 7], [367, 717, 24, 17, 18, 2], [367, 768, 21, 17, 18, 2], [428, 3, 22, 17, 18, 2], [428, 54, 23, 17, 18, 2], [428, 105, 24, 17, 18, 2], [428, 156, 20, 17, 18, 2], [428, 206, 23, 18, 18, 1], [428, 258, 23, 17, 18, 2], [428, 309, 22, 17, 18, 2], [428, 360, 24, 17, 18, 2], [428, 411, 21, 17, 18, 2], [428, 462, 22, 17, 18, 2], [428, 514, 23, 16, 18, 3], [428, 565, 23, 16, 18, 3], [428, 615, 23, 17, 18, 2], [428, 666, 22, 17, 18, 2], [428, 717, 22, 17, 18, 2], [428, 768, 22, 17, 18, 2], [489, 3, 23, 17, 18, 2], [489, 53, 21, 8, 14, 1], [489, 105, 22, 17, 18, 2], [489, 156, 23, 17, 18, 2], [489, 207, 23, 20, 18, 2], [489, 263, 20, 8, 18, 7], [489, 309, 25, 17, 18, 2], [489, 360, 24, 17, 18, 2], [489, 410, 28, 18, 23, 1], [489, 461, 28, 18, 23, 1], [489, 513, 33, 9, 25, 2], [489, 564, 22, 6, 18, 2], [489, 615, 23, 5, 18, 2], [489, 670, 23, 12, 17, 6], [489, 717, 26, 17, 18, 2], [489, 767, 26, 19, 18, 1], [550, 7, 25, 10, 21, 6], [550, 56, 22, 15, 18, 4], [550, 108, 24, 14, 18, 5], [550, 159, 22, 14, 18, 5], [550, 207, 26, 17, 18, 2], [550, 263, 24, 17, 18, 7], [550, 308, 24, 18, 16, 1], [550, 359, 27, 23, 21, 1], [550, 410, 32, 23, 24, 1], [550, 467, 25, 12, 18, 7], [550, 512, 19, 23, 11, 1], [550, 563, 23, 15, 18, 1], [550, 614, 24, 15, 18, 1], [550, 666, 26, 17, 22, 2], [550, 722, 23, 12, 18, 7], [550, 772, 24, 14, 18, 6], [611, 3, 22, 17, 18, 2], [611, 54, 22, 17, 18, 2], [611, 113, 22, 8, 21, 10], [611, 155, 25, 18, 17, 1], [611, 207, 26, 21, 18, 2], [611, 263, 22, 9, 17, 7], [611, 309, 21, 17, 19, 2], [611, 365, 23, 11, 18, 7], [611, 416, 21, 11, 18, 7], [611, 474, 20, 5, 18, 14], [611, 511, 1, 1, 18, 1], [611, 562, 21, 19, 18, 0], [611, 613, 24, 19, 18, 0], [611, 664, 25, 19, 18, 0], [611, 717, 26, 17, 18, 2], [611, 773, 23, 12, 18, 7], [672, 11, 21, 4, 18, 10], [672, 62, 22, 4, 18, 10], [672, 105, 25, 7, 18, 2], [672, 156, 25, 7, 18, 2], [672, 207, 22, 7, 18, 2], [672, 258, 22, 7, 18, 2], [672, 314, 20, 12, 17, 7], [672, 359, 20, 21, 16, 1], [672, 411, 24, 22, 18, 2], [1, 1, 1, 1, 18, 1], [794, 767, 24, 6, 18, 1], [672, 566, 24, 12, 18, 4], [672, 620, 21, 11, 18, 7], [672, 671, 19, 11, 18, 7], [672, 717, 24, 17, 18, 2], [672, 768, 24, 17, 18, 2], [733, 3, 23, 17, 18, 2], [733, 60, 19, 6, 18, 8], [733, 118, 16, 7, 18, 15], [733, 169, 19, 7, 18, 15], [733, 207, 26, 17, 18, 2], [733, 256, 22, 19, 18, 0], [733, 307, 26, 19, 18, 0], [733, 358, 23, 19, 18, 0], [733, 409, 26, 19, 18, 0], [733, 460, 26, 19, 18, 0], [733, 511, 25, 19, 18, 0], [733, 562, 25, 19, 18, 0], [733, 613, 25, 19, 18, 0], [733, 664, 25, 19, 18, 0], [733, 715, 24, 19, 18, 0], [733, 766, 24, 19, 18, 0], [1, 1, 1, 1, 18, 1], [794, 52, 24, 19, 18, 0], [794, 103, 26, 19, 18, 0], [794, 154, 26, 19, 18, 0], [794, 205, 26, 19, 18, 0], [794, 263, 19, 12, 18, 7], [794, 308, 23, 6, 18, 1], [794, 360, 23, 5, 18, 2], [794, 411, 23, 4, 18, 2], [794, 462, 23, 5, 18, 2], [794, 513, 21, 5, 18, 2], [794, 564, 22, 7, 18, 2], [794, 630, 14, 7, 18, 17], [794, 666, 24, 6, 18, 2], [794, 732, 14, 7, 18, 17], [794, 767, 24, 6, 18, 1], [855, 2, 24, 6, 18, 1], [855, 53, 24, 6, 18, 1], [855, 104, 24, 6, 18, 1], [855, 155, 24, 6, 18, 1], [855, 206, 24, 6, 18, 1], [855, 257, 24, 6, 18, 1], [855, 308, 24, 6, 18, 1], [855, 359, 24, 6, 18, 1], [855, 410, 24, 6, 18, 1], [855, 461, 24, 6, 18, 1], [855, 512, 24, 6, 18, 1], [855, 563, 24, 6, 18, 1], [855, 614, 24, 6, 18, 1], [855, 665, 24, 6, 18, 1], [855, 716, 24, 6, 18, 1], [855, 767, 24, 6, 18, 1]], \"capHeight\": 18, \"widestlogicalchar\": 25, \"widestglyph\": 33, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 17, 1], [1, 54, 20, 15, 17, 2], [1, 105, 22, 4, 17, 2], [1, 155, 25, 16, 17, 1], [1, 205, 23, 20, 17, 0], [1, 257, 25, 16, 17, 1], [1, 309, 20, 15, 17, 2], [1, 360, 20, 4, 17, 2], [1, 411, 21, 20, 17, 2], [1, 462, 19, 20, 17, 2], [1, 513, 23, 9, 17, 2], [1, 568, 20, 10, 17, 6], [1, 626, 16, 8, 17, 13], [1, 674, 20, 2, 17, 10], [1, 728, 15, 4, 17, 13], [1, 768, 22, 15, 17, 2], [62, 3, 22, 15, 17, 2], [62, 54, 20, 15, 17, 2], [62, 105, 22, 15, 17, 2], [62, 156, 21, 15, 17, 2], [62, 207, 22, 15, 17, 2], [62, 258, 23, 15, 17, 2], [62, 309, 22, 15, 17, 2], [62, 360, 23, 15, 17, 2], [62, 411, 22, 15, 17, 2], [62, 462, 22, 15, 17, 2], [62, 517, 19, 11, 17, 6], [62, 568, 19, 15, 17, 6], [62, 619, 22, 11, 17, 6], [62, 672, 21, 6, 17, 8], [62, 721, 20, 11, 17, 6], [62, 768, 22, 15, 17, 2], [123, 3, 23, 17, 17, 2], [123, 54, 20, 15, 17, 2], [123, 105, 23, 15, 17, 2], [123, 156, 25, 15, 17, 2], [123, 207, 23, 15, 17, 2], [123, 258, 25, 15, 17, 2], [123, 309, 25, 15, 17, 2], [123, 360, 25, 15, 17, 2], [123, 411, 25, 15, 17, 2], [123, 462, 24, 15, 17, 2], [123, 513, 25, 15, 17, 2], [123, 564, 25, 15, 17, 2], [123, 615, 20, 15, 17, 2], [123, 666, 25, 15, 17, 2], [123, 717, 25, 15, 17, 2], [123, 768, 23, 15, 17, 2], [184, 3, 23, 15, 17, 2], [184, 54, 23, 19, 17, 2], [184, 105, 22, 15, 17, 2], [184, 156, 24, 15, 17, 2], [184, 207, 25, 15, 17, 2], [184, 258, 25, 15, 17, 2], [184, 309, 25, 15, 17, 2], [184, 360, 25, 15, 17, 2], [184, 411, 25, 15, 17, 2], [184, 462, 25, 15, 17, 2], [184, 513, 24, 15, 17, 2], [184, 564, 21, 20, 17, 2], [184, 615, 18, 15, 17, 2], [184, 666, 21, 20, 17, 2], [184, 717, 21, 6, 17, 2], [184, 785, 18, 2, 17, 19], [245, 3, 20, 4, 17, 2], [245, 59, 19, 10, 17, 7], [245, 105, 21, 15, 17, 2], [245, 161, 22, 10, 17, 7], [245, 207, 23, 15, 17, 2], [245, 263, 20, 10, 17, 7], [245, 309, 23, 15, 17, 2], [245, 365, 23, 15, 17, 7], [245, 411, 20, 15, 17, 2], [245, 462, 20, 15, 17, 2], [245, 513, 23, 20, 17, 2], [245, 564, 23, 15, 17, 2], [245, 615, 20, 15, 17, 2], [245, 671, 22, 10, 17, 7], [245, 722, 20, 10, 17, 7], [245, 773, 20, 10, 17, 7], [306, 8, 21, 15, 17, 7], [306, 59, 23, 15, 17, 7], [306, 110, 21, 10, 17, 7], [306, 161, 21, 10, 17, 7], [306, 209, 21, 13, 17, 4], [306, 263, 21, 10, 17, 7], [306, 314, 23, 10, 17, 7], [306, 365, 24, 10, 17, 7], [306, 416, 22, 10, 17, 7], [306, 467, 23, 15, 17, 7], [306, 518, 21, 10, 17, 7], [306, 564, 23, 20, 17, 2], [306, 615, 20, 20, 17, 2], [306, 666, 20, 20, 17, 2], [306, 724, 21, 4, 17, 9], [306, 769, 24, 14, 17, 3], [367, 1, 23, 17, 17, 0], [367, 52, 22, 17, 17, 0], [367, 105, 25, 20, 17, 2], [367, 154, 25, 17, 17, 0], [367, 205, 25, 17, 17, 0], [367, 256, 23, 17, 17, 0], [367, 307, 25, 17, 17, 0], [367, 360, 22, 15, 17, 2], [367, 411, 19, 15, 17, 2], [367, 462, 20, 15, 17, 2], [367, 513, 21, 15, 17, 2], [367, 564, 22, 15, 17, 2], [367, 614, 21, 16, 17, 1], [367, 671, 22, 14, 17, 7], [367, 717, 23, 15, 17, 2], [367, 768, 20, 15, 17, 2], [428, 3, 21, 15, 17, 2], [428, 54, 22, 15, 17, 2], [428, 105, 23, 15, 17, 2], [428, 156, 19, 15, 17, 2], [428, 206, 22, 16, 17, 1], [428, 258, 22, 15, 17, 2], [428, 309, 21, 15, 17, 2], [428, 360, 23, 15, 17, 2], [428, 411, 20, 15, 17, 2], [428, 462, 21, 15, 17, 2], [428, 514, 22, 14, 17, 3], [428, 565, 22, 14, 17, 3], [428, 615, 22, 15, 17, 2], [428, 666, 21, 15, 17, 2], [428, 717, 21, 15, 17, 2], [428, 768, 21, 15, 17, 2], [489, 3, 22, 15, 17, 2], [489, 53, 20, 6, 13, 1], [489, 105, 21, 15, 17, 2], [489, 156, 22, 15, 17, 2], [489, 207, 22, 18, 17, 2], [489, 263, 19, 6, 17, 7], [489, 309, 24, 15, 17, 2], [489, 360, 23, 15, 17, 2], [489, 410, 27, 16, 22, 1], [489, 461, 27, 16, 22, 1], [489, 513, 32, 7, 24, 2], [489, 564, 21, 4, 17, 2], [489, 615, 22, 3, 17, 2], [489, 670, 22, 10, 16, 6], [489, 717, 25, 15, 17, 2], [489, 767, 25, 17, 17, 1], [550, 7, 24, 8, 20, 6], [550, 56, 21, 13, 17, 4], [550, 108, 23, 12, 17, 5], [550, 159, 21, 12, 17, 5], [550, 207, 25, 15, 17, 2], [550, 263, 23, 15, 17, 7], [550, 308, 23, 16, 15, 1], [550, 359, 26, 21, 20, 1], [550, 410, 31, 21, 23, 1], [550, 467, 24, 10, 17, 7], [550, 513, 18, 20, 10, 2], [550, 563, 22, 13, 17, 1], [550, 614, 23, 13, 17, 1], [550, 666, 25, 15, 21, 2], [550, 722, 22, 10, 17, 7], [550, 772, 23, 12, 17, 6], [611, 3, 21, 15, 17, 2], [611, 54, 21, 15, 17, 2], [611, 113, 21, 6, 20, 10], [611, 156, 24, 15, 16, 2], [611, 207, 25, 19, 17, 2], [611, 263, 21, 7, 16, 7], [611, 309, 20, 15, 18, 2], [611, 365, 22, 9, 17, 7], [611, 416, 20, 9, 17, 7], [611, 474, 19, 3, 17, 14], [611, 511, 1, 1, 17, 1], [611, 562, 20, 17, 17, 0], [611, 613, 23, 17, 17, 0], [611, 664, 24, 17, 17, 0], [611, 717, 25, 15, 17, 2], [611, 773, 22, 10, 17, 7], [672, 11, 20, 2, 17, 10], [672, 62, 21, 2, 17, 10], [672, 105, 24, 5, 17, 2], [672, 156, 24, 5, 17, 2], [672, 207, 21, 5, 17, 2], [672, 258, 21, 5, 17, 2], [672, 314, 19, 10, 16, 7], [672, 359, 19, 19, 15, 1], [672, 411, 23, 20, 17, 2], [1, 1, 1, 1, 17, 1], [794, 767, 23, 4, 17, 1], [672, 566, 23, 10, 17, 4], [672, 620, 20, 9, 17, 7], [672, 671, 18, 9, 17, 7], [672, 717, 23, 15, 17, 2], [672, 768, 23, 15, 17, 2], [733, 3, 22, 15, 17, 2], [733, 60, 18, 4, 17, 8], [733, 118, 15, 5, 17, 15], [733, 169, 18, 5, 17, 15], [733, 207, 25, 15, 17, 2], [733, 256, 21, 17, 17, 0], [733, 307, 25, 17, 17, 0], [733, 358, 21, 17, 17, 0], [733, 409, 25, 17, 17, 0], [733, 460, 25, 17, 17, 0], [733, 511, 24, 17, 17, 0], [733, 562, 24, 17, 17, 0], [733, 613, 24, 17, 17, 0], [733, 664, 24, 17, 17, 0], [733, 715, 23, 17, 17, 0], [733, 766, 23, 17, 17, 0], [1, 1, 1, 1, 17, 1], [794, 52, 23, 17, 17, 0], [794, 103, 25, 17, 17, 0], [794, 154, 25, 17, 17, 0], [794, 205, 25, 17, 17, 0], [794, 263, 18, 10, 17, 7], [794, 308, 22, 4, 17, 1], [794, 360, 22, 3, 17, 2], [794, 411, 22, 2, 17, 2], [794, 462, 22, 3, 17, 2], [794, 513, 20, 3, 17, 2], [794, 564, 21, 5, 17, 2], [794, 630, 13, 5, 17, 17], [794, 666, 23, 4, 17, 2], [794, 732, 13, 5, 17, 17], [794, 767, 23, 4, 17, 1], [855, 2, 23, 4, 17, 1], [855, 53, 23, 4, 17, 1], [855, 104, 23, 4, 17, 1], [855, 155, 23, 4, 17, 1], [855, 206, 23, 4, 17, 1], [855, 257, 23, 4, 17, 1], [855, 308, 23, 4, 17, 1], [855, 359, 23, 4, 17, 1], [855, 410, 23, 4, 17, 1], [855, 461, 23, 4, 17, 1], [855, 512, 23, 4, 17, 1], [855, 563, 23, 4, 17, 1], [855, 614, 23, 4, 17, 1], [855, 665, 23, 4, 17, 1], [855, 716, 23, 4, 17, 1], [855, 767, 23, 4, 17, 1]], \"capHeight\": 17, \"widestlogicalchar\": 24, \"widestglyph\": 32, \"tallestglyph\": 21}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 18, 6, 18, 12], [1, 54, 18, 17, 18, 2], [1, 105, 18, 16, 18, 2], [1, 155, 18, 18, 18, 1], [1, 205, 18, 22, 18, 0], [1, 257, 18, 18, 18, 1], [1, 309, 18, 17, 18, 2], [1, 360, 18, 16, 18, 2], [1, 411, 18, 22, 18, 2], [1, 462, 18, 22, 18, 2], [1, 513, 18, 16, 18, 2], [1, 568, 18, 12, 18, 6], [1, 625, 18, 11, 18, 12], [1, 674, 18, 8, 18, 10], [1, 727, 18, 7, 18, 12], [1, 768, 18, 17, 18, 2], [62, 3, 18, 17, 18, 2], [62, 54, 18, 17, 18, 2], [62, 105, 18, 17, 18, 2], [62, 156, 18, 17, 18, 2], [62, 207, 18, 17, 18, 2], [62, 258, 18, 17, 18, 2], [62, 309, 18, 17, 18, 2], [62, 360, 18, 17, 18, 2], [62, 411, 18, 17, 18, 2], [62, 462, 18, 17, 18, 2], [62, 517, 18, 13, 18, 6], [62, 568, 18, 17, 18, 6], [62, 619, 18, 13, 18, 6], [62, 672, 18, 10, 18, 8], [62, 721, 18, 13, 18, 6], [62, 768, 18, 17, 18, 2], [123, 3, 18, 19, 18, 2], [123, 54, 18, 17, 18, 2], [123, 105, 18, 17, 18, 2], [123, 156, 18, 17, 18, 2], [123, 207, 18, 17, 18, 2], [123, 258, 18, 17, 18, 2], [123, 309, 18, 17, 18, 2], [123, 360, 18, 17, 18, 2], [123, 411, 18, 17, 18, 2], [123, 462, 18, 17, 18, 2], [123, 513, 18, 17, 18, 2], [123, 564, 18, 17, 18, 2], [123, 615, 18, 17, 18, 2], [123, 666, 18, 17, 18, 2], [123, 717, 18, 17, 18, 2], [123, 768, 18, 17, 18, 2], [184, 3, 18, 17, 18, 2], [184, 54, 18, 21, 18, 2], [184, 105, 18, 17, 18, 2], [184, 156, 18, 17, 18, 2], [184, 207, 18, 17, 18, 2], [184, 258, 18, 17, 18, 2], [184, 309, 18, 17, 18, 2], [184, 360, 18, 17, 18, 2], [184, 411, 18, 17, 18, 2], [184, 462, 18, 17, 18, 2], [184, 513, 18, 17, 18, 2], [184, 564, 18, 22, 18, 2], [184, 615, 18, 17, 18, 2], [184, 666, 18, 22, 18, 2], [184, 717, 18, 16, 18, 2], [184, 778, 18, 11, 18, 12], [245, 3, 18, 16, 18, 2], [245, 59, 18, 12, 18, 7], [245, 105, 18, 17, 18, 2], [245, 161, 18, 12, 18, 7], [245, 207, 18, 17, 18, 2], [245, 263, 18, 12, 18, 7], [245, 309, 18, 17, 18, 2], [245, 365, 18, 17, 18, 7], [245, 411, 18, 17, 18, 2], [245, 462, 18, 17, 18, 2], [245, 513, 18, 22, 18, 2], [245, 564, 18, 17, 18, 2], [245, 615, 18, 17, 18, 2], [245, 671, 18, 12, 18, 7], [245, 722, 18, 12, 18, 7], [245, 773, 18, 12, 18, 7], [306, 8, 18, 17, 18, 7], [306, 59, 18, 17, 18, 7], [306, 110, 18, 12, 18, 7], [306, 161, 18, 12, 18, 7], [306, 209, 18, 15, 18, 4], [306, 263, 18, 12, 18, 7], [306, 314, 18, 12, 18, 7], [306, 365, 18, 12, 18, 7], [306, 416, 18, 12, 18, 7], [306, 467, 18, 17, 18, 7], [306, 518, 18, 12, 18, 7], [306, 564, 18, 22, 18, 2], [306, 615, 18, 22, 18, 2], [306, 666, 18, 22, 18, 2], [306, 724, 18, 9, 18, 9], [306, 769, 18, 16, 18, 3], [367, 1, 18, 19, 18, 0], [367, 52, 18, 19, 18, 0], [367, 105, 18, 22, 18, 2], [367, 154, 18, 19, 18, 0], [367, 205, 18, 19, 18, 0], [367, 256, 18, 19, 18, 0], [367, 307, 18, 19, 18, 0], [367, 360, 18, 17, 18, 2], [367, 411, 18, 17, 18, 2], [367, 462, 18, 17, 18, 2], [367, 513, 18, 17, 18, 2], [367, 564, 18, 17, 18, 2], [367, 614, 18, 18, 18, 1], [367, 671, 18, 16, 18, 7], [367, 717, 18, 17, 18, 2], [367, 768, 18, 17, 18, 2], [428, 3, 18, 17, 18, 2], [428, 54, 18, 17, 18, 2], [428, 105, 18, 17, 18, 2], [428, 156, 18, 17, 18, 2], [428, 206, 18, 18, 18, 1], [428, 258, 18, 17, 18, 2], [428, 309, 18, 17, 18, 2], [428, 360, 18, 17, 18, 2], [428, 411, 18, 17, 18, 2], [428, 462, 18, 17, 18, 2], [428, 514, 18, 16, 18, 3], [428, 565, 18, 16, 18, 3], [428, 615, 18, 17, 18, 2], [428, 666, 18, 17, 18, 2], [428, 717, 18, 17, 18, 2], [428, 768, 18, 17, 18, 2], [489, 3, 18, 17, 18, 2], [489, 53, 14, 17, 14, 1], [489, 105, 18, 17, 18, 2], [489, 156, 18, 17, 18, 2], [489, 207, 18, 20, 18, 2], [489, 263, 18, 11, 18, 7], [489, 309, 18, 17, 18, 2], [489, 360, 18, 17, 18, 2], [489, 410, 23, 18, 23, 1], [489, 461, 23, 18, 23, 1], [489, 513, 25, 16, 25, 2], [489, 564, 18, 16, 18, 2], [489, 615, 18, 16, 18, 2], [489, 670, 17, 12, 17, 6], [489, 717, 18, 17, 18, 2], [489, 767, 18, 19, 18, 1], [550, 7, 21, 12, 21, 6], [550, 56, 18, 15, 18, 4], [550, 108, 18, 14, 18, 5], [550, 159, 18, 14, 18, 5], [550, 207, 18, 17, 18, 2], [550, 263, 18, 17, 18, 7], [550, 308, 16, 18, 16, 1], [550, 359, 21, 23, 21, 1], [550, 410, 24, 23, 24, 1], [550, 467, 18, 12, 18, 7], [550, 512, 11, 23, 11, 1], [550, 563, 18, 17, 18, 1], [550, 614, 18, 17, 18, 1], [550, 666, 22, 17, 22, 2], [550, 722, 18, 12, 18, 7], [550, 772, 18, 14, 18, 6], [611, 3, 18, 17, 18, 2], [611, 54, 18, 17, 18, 2], [611, 113, 21, 8, 21, 10], [611, 155, 17, 18, 17, 1], [611, 207, 18, 21, 18, 2], [611, 263, 17, 11, 17, 7], [611, 309, 19, 17, 19, 2], [611, 365, 18, 11, 18, 7], [611, 416, 18, 11, 18, 7], [611, 472, 18, 7, 18, 12], [611, 523, 18, 6, 18, 12], [611, 562, 18, 19, 18, 0], [611, 613, 18, 19, 18, 0], [611, 664, 18, 19, 18, 0], [611, 717, 18, 17, 18, 2], [611, 773, 18, 12, 18, 7], [672, 11, 18, 8, 18, 10], [672, 62, 18, 8, 18, 10], [672, 105, 18, 16, 18, 2], [672, 156, 18, 16, 18, 2], [672, 207, 18, 16, 18, 2], [672, 258, 18, 16, 18, 2], [672, 314, 17, 12, 17, 7], [672, 359, 16, 21, 16, 1], [672, 411, 18, 22, 18, 2], [1, 13, 18, 6, 18, 12], [794, 767, 18, 17, 18, 1], [672, 566, 18, 14, 18, 4], [672, 620, 18, 11, 18, 7], [672, 671, 18, 11, 18, 7], [672, 717, 18, 17, 18, 2], [672, 768, 18, 17, 18, 2], [733, 3, 18, 17, 18, 2], [733, 60, 18, 10, 18, 8], [733, 115, 18, 10, 18, 12], [733, 166, 18, 10, 18, 12], [733, 207, 18, 17, 18, 2], [733, 256, 18, 19, 18, 0], [733, 307, 18, 19, 18, 0], [733, 358, 18, 19, 18, 0], [733, 409, 18, 19, 18, 0], [733, 460, 18, 19, 18, 0], [733, 511, 18, 19, 18, 0], [733, 562, 18, 19, 18, 0], [733, 613, 18, 19, 18, 0], [733, 664, 18, 19, 18, 0], [733, 715, 18, 19, 18, 0], [733, 766, 18, 19, 18, 0], [1, 13, 18, 6, 18, 12], [794, 52, 18, 19, 18, 0], [794, 103, 18, 19, 18, 0], [794, 154, 18, 19, 18, 0], [794, 205, 18, 19, 18, 0], [794, 263, 18, 12, 18, 7], [794, 308, 18, 17, 18, 1], [794, 360, 18, 16, 18, 2], [794, 411, 18, 16, 18, 2], [794, 462, 18, 16, 18, 2], [794, 513, 18, 16, 18, 2], [794, 564, 18, 16, 18, 2], [794, 625, 18, 12, 18, 12], [794, 666, 18, 16, 18, 2], [794, 727, 18, 12, 18, 12], [794, 767, 18, 17, 18, 1], [855, 2, 18, 17, 18, 1], [855, 53, 18, 17, 18, 1], [855, 104, 18, 17, 18, 1], [855, 155, 18, 17, 18, 1], [855, 206, 18, 17, 18, 1], [855, 257, 18, 17, 18, 1], [855, 308, 18, 17, 18, 1], [855, 359, 18, 17, 18, 1], [855, 410, 18, 17, 18, 1], [855, 461, 18, 17, 18, 1], [855, 512, 18, 17, 18, 1], [855, 563, 18, 17, 18, 1], [855, 614, 18, 17, 18, 1], [855, 665, 18, 17, 18, 1], [855, 716, 18, 17, 18, 1], [855, 767, 18, 17, 18, 1]], \"widestlogicalchar\": 25, \"widestglyph\": 25, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 17, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 12, 17, 6, 17, 11], [1, 54, 17, 15, 17, 2], [1, 105, 17, 15, 17, 2], [1, 155, 17, 16, 17, 1], [1, 205, 17, 20, 17, 0], [1, 257, 17, 16, 17, 1], [1, 309, 17, 15, 17, 2], [1, 360, 17, 15, 17, 2], [1, 411, 17, 20, 17, 2], [1, 462, 17, 20, 17, 2], [1, 513, 17, 15, 17, 2], [1, 568, 17, 11, 17, 6], [1, 624, 17, 10, 17, 11], [1, 674, 17, 7, 17, 10], [1, 726, 17, 6, 17, 11], [1, 768, 17, 15, 17, 2], [62, 3, 17, 15, 17, 2], [62, 54, 17, 15, 17, 2], [62, 105, 17, 15, 17, 2], [62, 156, 17, 15, 17, 2], [62, 207, 17, 15, 17, 2], [62, 258, 17, 15, 17, 2], [62, 309, 17, 15, 17, 2], [62, 360, 17, 15, 17, 2], [62, 411, 17, 15, 17, 2], [62, 462, 17, 15, 17, 2], [62, 517, 17, 11, 17, 6], [62, 568, 17, 15, 17, 6], [62, 619, 17, 11, 17, 6], [62, 672, 17, 9, 17, 8], [62, 721, 17, 11, 17, 6], [62, 768, 17, 15, 17, 2], [123, 3, 17, 17, 17, 2], [123, 54, 17, 15, 17, 2], [123, 105, 17, 15, 17, 2], [123, 156, 17, 15, 17, 2], [123, 207, 17, 15, 17, 2], [123, 258, 17, 15, 17, 2], [123, 309, 17, 15, 17, 2], [123, 360, 17, 15, 17, 2], [123, 411, 17, 15, 17, 2], [123, 462, 17, 15, 17, 2], [123, 513, 17, 15, 17, 2], [123, 564, 17, 15, 17, 2], [123, 615, 17, 15, 17, 2], [123, 666, 17, 15, 17, 2], [123, 717, 17, 15, 17, 2], [123, 768, 17, 15, 17, 2], [184, 3, 17, 15, 17, 2], [184, 54, 17, 19, 17, 2], [184, 105, 17, 15, 17, 2], [184, 156, 17, 15, 17, 2], [184, 207, 17, 15, 17, 2], [184, 258, 17, 15, 17, 2], [184, 309, 17, 15, 17, 2], [184, 360, 17, 15, 17, 2], [184, 411, 17, 15, 17, 2], [184, 462, 17, 15, 17, 2], [184, 513, 17, 15, 17, 2], [184, 564, 17, 20, 17, 2], [184, 615, 17, 15, 17, 2], [184, 666, 17, 20, 17, 2], [184, 717, 17, 15, 17, 2], [184, 777, 17, 10, 17, 11], [245, 3, 17, 15, 17, 2], [245, 59, 17, 10, 17, 7], [245, 105, 17, 15, 17, 2], [245, 161, 17, 10, 17, 7], [245, 207, 17, 15, 17, 2], [245, 263, 17, 10, 17, 7], [245, 309, 17, 15, 17, 2], [245, 365, 17, 15, 17, 7], [245, 411, 17, 15, 17, 2], [245, 462, 17, 15, 17, 2], [245, 513, 17, 20, 17, 2], [245, 564, 17, 15, 17, 2], [245, 615, 17, 15, 17, 2], [245, 671, 17, 10, 17, 7], [245, 722, 17, 10, 17, 7], [245, 773, 17, 10, 17, 7], [306, 8, 17, 15, 17, 7], [306, 59, 17, 15, 17, 7], [306, 110, 17, 10, 17, 7], [306, 161, 17, 10, 17, 7], [306, 209, 17, 13, 17, 4], [306, 263, 17, 10, 17, 7], [306, 314, 17, 10, 17, 7], [306, 365, 17, 10, 17, 7], [306, 416, 17, 10, 17, 7], [306, 467, 17, 15, 17, 7], [306, 518, 17, 10, 17, 7], [306, 564, 17, 20, 17, 2], [306, 615, 17, 20, 17, 2], [306, 666, 17, 20, 17, 2], [306, 724, 17, 8, 17, 9], [306, 769, 17, 14, 17, 3], [367, 1, 17, 17, 17, 0], [367, 52, 17, 17, 17, 0], [367, 105, 17, 20, 17, 2], [367, 154, 17, 17, 17, 0], [367, 205, 17, 17, 17, 0], [367, 256, 17, 17, 17, 0], [367, 307, 17, 17, 17, 0], [367, 360, 17, 15, 17, 2], [367, 411, 17, 15, 17, 2], [367, 462, 17, 15, 17, 2], [367, 513, 17, 15, 17, 2], [367, 564, 17, 15, 17, 2], [367, 614, 17, 16, 17, 1], [367, 671, 17, 14, 17, 7], [367, 717, 17, 15, 17, 2], [367, 768, 17, 15, 17, 2], [428, 3, 17, 15, 17, 2], [428, 54, 17, 15, 17, 2], [428, 105, 17, 15, 17, 2], [428, 156, 17, 15, 17, 2], [428, 206, 17, 16, 17, 1], [428, 258, 17, 15, 17, 2], [428, 309, 17, 15, 17, 2], [428, 360, 17, 15, 17, 2], [428, 411, 17, 15, 17, 2], [428, 462, 17, 15, 17, 2], [428, 514, 17, 14, 17, 3], [428, 565, 17, 14, 17, 3], [428, 615, 17, 15, 17, 2], [428, 666, 17, 15, 17, 2], [428, 717, 17, 15, 17, 2], [428, 768, 17, 15, 17, 2], [489, 3, 17, 15, 17, 2], [489, 53, 13, 16, 13, 1], [489, 105, 17, 15, 17, 2], [489, 156, 17, 15, 17, 2], [489, 207, 17, 18, 17, 2], [489, 263, 17, 10, 17, 7], [489, 309, 17, 15, 17, 2], [489, 360, 17, 15, 17, 2], [489, 410, 22, 16, 22, 1], [489, 461, 22, 16, 22, 1], [489, 513, 24, 15, 24, 2], [489, 564, 17, 15, 17, 2], [489, 615, 17, 15, 17, 2], [489, 670, 16, 11, 16, 6], [489, 717, 17, 15, 17, 2], [489, 767, 17, 17, 17, 1], [550, 7, 20, 11, 20, 6], [550, 56, 17, 13, 17, 4], [550, 108, 17, 12, 17, 5], [550, 159, 17, 12, 17, 5], [550, 207, 17, 15, 17, 2], [550, 263, 17, 15, 17, 7], [550, 308, 15, 16, 15, 1], [550, 359, 20, 21, 20, 1], [550, 410, 23, 21, 23, 1], [550, 467, 17, 10, 17, 7], [550, 512, 10, 21, 10, 1], [550, 563, 17, 16, 17, 1], [550, 614, 17, 16, 17, 1], [550, 666, 21, 15, 21, 2], [550, 722, 17, 10, 17, 7], [550, 772, 17, 12, 17, 6], [611, 3, 17, 15, 17, 2], [611, 54, 17, 15, 17, 2], [611, 113, 20, 7, 20, 10], [611, 155, 16, 16, 16, 1], [611, 207, 17, 19, 17, 2], [611, 263, 16, 10, 16, 7], [611, 309, 18, 15, 18, 2], [611, 365, 17, 10, 17, 7], [611, 416, 17, 10, 17, 7], [611, 471, 17, 6, 17, 11], [611, 522, 17, 6, 17, 11], [611, 562, 17, 17, 17, 0], [611, 613, 17, 17, 17, 0], [611, 664, 17, 17, 17, 0], [611, 717, 17, 15, 17, 2], [611, 773, 17, 10, 17, 7], [672, 11, 17, 7, 17, 10], [672, 62, 17, 7, 17, 10], [672, 105, 17, 15, 17, 2], [672, 156, 17, 15, 17, 2], [672, 207, 17, 15, 17, 2], [672, 258, 17, 15, 17, 2], [672, 314, 16, 10, 16, 7], [672, 359, 15, 19, 15, 1], [672, 411, 17, 20, 17, 2], [1, 12, 17, 6, 17, 11], [794, 767, 17, 16, 17, 1], [672, 566, 17, 13, 17, 4], [672, 620, 17, 10, 17, 7], [672, 671, 17, 10, 17, 7], [672, 717, 17, 15, 17, 2], [672, 768, 17, 15, 17, 2], [733, 3, 17, 15, 17, 2], [733, 60, 17, 9, 17, 8], [733, 114, 17, 9, 17, 11], [733, 165, 17, 9, 17, 11], [733, 207, 17, 15, 17, 2], [733, 256, 17, 17, 17, 0], [733, 307, 17, 17, 17, 0], [733, 358, 17, 17, 17, 0], [733, 409, 17, 17, 17, 0], [733, 460, 17, 17, 17, 0], [733, 511, 17, 17, 17, 0], [733, 562, 17, 17, 17, 0], [733, 613, 17, 17, 17, 0], [733, 664, 17, 17, 17, 0], [733, 715, 17, 17, 17, 0], [733, 766, 17, 17, 17, 0], [1, 12, 17, 6, 17, 11], [794, 52, 17, 17, 17, 0], [794, 103, 17, 17, 17, 0], [794, 154, 17, 17, 17, 0], [794, 205, 17, 17, 17, 0], [794, 263, 17, 10, 17, 7], [794, 308, 17, 16, 17, 1], [794, 360, 17, 15, 17, 2], [794, 411, 17, 15, 17, 2], [794, 462, 17, 15, 17, 2], [794, 513, 17, 15, 17, 2], [794, 564, 17, 15, 17, 2], [794, 624, 17, 11, 17, 11], [794, 666, 17, 15, 17, 2], [794, 726, 17, 11, 17, 11], [794, 767, 17, 16, 17, 1], [855, 2, 17, 16, 17, 1], [855, 53, 17, 16, 17, 1], [855, 104, 17, 16, 17, 1], [855, 155, 17, 16, 17, 1], [855, 206, 17, 16, 17, 1], [855, 257, 17, 16, 17, 1], [855, 308, 17, 16, 17, 1], [855, 359, 17, 16, 17, 1], [855, 410, 17, 16, 17, 1], [855, 461, 17, 16, 17, 1], [855, 512, 17, 16, 17, 1], [855, 563, 17, 16, 17, 1], [855, 614, 17, 16, 17, 1], [855, 665, 17, 16, 17, 1], [855, 716, 17, 16, 17, 1], [855, 767, 17, 16, 17, 1]], \"widestlogicalchar\": 24, \"widestglyph\": 24, \"tallestglyph\": 21}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 8, 10, 2], [1, 105, 12, 4, 10, 2], [1, 156, 13, 7, 10, 2], [1, 206, 12, 10, 10, 1], [1, 258, 12, 8, 10, 2], [1, 309, 12, 8, 10, 2], [1, 360, 10, 4, 10, 2], [1, 411, 11, 9, 10, 2], [1, 462, 11, 9, 10, 2], [1, 513, 12, 6, 10, 2], [1, 565, 12, 7, 10, 3], [1, 620, 9, 5, 10, 7], [1, 669, 11, 3, 10, 5], [1, 722, 9, 3, 10, 7], [1, 768, 12, 8, 10, 2], [62, 3, 12, 8, 10, 2], [62, 54, 11, 8, 10, 2], [62, 105, 12, 8, 10, 2], [62, 156, 12, 8, 10, 2], [62, 207, 12, 8, 10, 2], [62, 258, 12, 8, 10, 2], [62, 309, 11, 8, 10, 2], [62, 360, 12, 8, 10, 2], [62, 411, 12, 8, 10, 2], [62, 462, 12, 8, 10, 2], [62, 515, 10, 6, 10, 4], [62, 566, 10, 8, 10, 4], [62, 616, 11, 7, 10, 3], [62, 668, 11, 5, 10, 4], [62, 718, 11, 7, 10, 3], [62, 768, 12, 8, 10, 2], [123, 3, 12, 9, 10, 2], [123, 54, 12, 8, 10, 2], [123, 105, 12, 8, 10, 2], [123, 156, 12, 8, 10, 2], [123, 207, 12, 8, 10, 2], [123, 258, 12, 8, 10, 2], [123, 309, 12, 8, 10, 2], [123, 360, 12, 8, 10, 2], [123, 411, 13, 8, 10, 2], [123, 462, 12, 8, 10, 2], [123, 513, 13, 8, 10, 2], [123, 564, 12, 8, 10, 2], [123, 615, 11, 8, 10, 2], [123, 666, 13, 8, 10, 2], [123, 717, 12, 8, 10, 2], [123, 768, 12, 8, 10, 2], [184, 3, 12, 8, 10, 2], [184, 54, 12, 9, 10, 2], [184, 105, 12, 8, 10, 2], [184, 156, 12, 8, 10, 2], [184, 207, 13, 8, 10, 2], [184, 258, 13, 8, 10, 2], [184, 309, 13, 8, 10, 2], [184, 360, 13, 8, 10, 2], [184, 411, 13, 8, 10, 2], [184, 462, 13, 8, 10, 2], [184, 513, 12, 8, 10, 2], [184, 564, 11, 10, 10, 2], [184, 615, 10, 8, 10, 2], [184, 666, 11, 10, 10, 2], [184, 717, 12, 4, 10, 2], [184, 775, 10, 3, 10, 9], [245, 3, 11, 4, 10, 2], [245, 56, 11, 6, 10, 4], [245, 105, 11, 8, 10, 2], [245, 158, 11, 6, 10, 4], [245, 207, 12, 8, 10, 2], [245, 260, 11, 6, 10, 4], [245, 309, 12, 8, 10, 2], [245, 362, 11, 8, 10, 4], [245, 411, 11, 8, 10, 2], [245, 462, 11, 8, 10, 2], [245, 513, 11, 10, 10, 2], [245, 564, 11, 8, 10, 2], [245, 615, 11, 8, 10, 2], [245, 668, 12, 6, 10, 4], [245, 719, 11, 6, 10, 4], [245, 770, 11, 6, 10, 4], [306, 5, 11, 8, 10, 4], [306, 56, 11, 8, 10, 4], [306, 107, 11, 6, 10, 4], [306, 158, 11, 6, 10, 4], [306, 208, 11, 7, 10, 3], [306, 260, 11, 6, 10, 4], [306, 311, 12, 6, 10, 4], [306, 362, 12, 6, 10, 4], [306, 413, 11, 6, 10, 4], [306, 464, 12, 8, 10, 4], [306, 515, 11, 6, 10, 4], [306, 564, 11, 9, 10, 2], [306, 615, 11, 9, 10, 2], [306, 666, 11, 9, 10, 2], [306, 719, 11, 4, 10, 4], [306, 766, 1, 1, 10, 1], [367, 2, 13, 9, 10, 1], [367, 53, 12, 9, 10, 1], [367, 105, 12, 10, 10, 2], [367, 155, 12, 9, 10, 1], [367, 206, 13, 9, 10, 1], [367, 257, 13, 9, 10, 1], [367, 308, 13, 9, 10, 1], [367, 360, 11, 8, 10, 2], [367, 411, 12, 8, 10, 2], [367, 461, 12, 9, 10, 1], [367, 513, 11, 8, 10, 2], [367, 563, 13, 9, 10, 1], [367, 614, 12, 9, 10, 1], [367, 668, 11, 8, 10, 4], [367, 717, 11, 8, 10, 2], [367, 768, 12, 8, 10, 2], [428, 2, 12, 9, 10, 1], [428, 54, 12, 8, 10, 2], [428, 104, 12, 9, 10, 1], [428, 155, 11, 9, 10, 1], [428, 206, 12, 9, 10, 1], [428, 258, 12, 8, 10, 2], [428, 308, 13, 9, 10, 1], [428, 359, 12, 9, 10, 1], [428, 410, 11, 9, 10, 1], [428, 461, 12, 9, 10, 1], [428, 513, 12, 8, 10, 2], [428, 563, 13, 9, 10, 1], [428, 614, 12, 9, 10, 1], [428, 665, 11, 9, 10, 1], [428, 716, 12, 9, 10, 1], [428, 768, 12, 8, 10, 2], [489, 3, 12, 9, 10, 2], [489, 54, 12, 5, 10, 2], [489, 105, 12, 8, 10, 2], [489, 156, 12, 8, 10, 2], [489, 207, 12, 9, 10, 2], [489, 260, 10, 4, 10, 4], [489, 309, 13, 9, 10, 2], [489, 360, 12, 8, 10, 2], [489, 411, 14, 8, 12, 2], [489, 462, 14, 8, 12, 2], [489, 513, 15, 5, 13, 2], [489, 564, 12, 4, 10, 2], [489, 616, 12, 3, 10, 3], [489, 667, 11, 7, 10, 3], [489, 717, 13, 8, 10, 2], [489, 768, 12, 8, 10, 2], [550, 5, 12, 5, 11, 4], [550, 55, 12, 7, 10, 3], [550, 106, 11, 7, 10, 3], [550, 157, 11, 7, 10, 3], [550, 207, 13, 8, 10, 2], [550, 260, 11, 7, 10, 4], [550, 309, 11, 8, 9, 2], [550, 360, 13, 9, 11, 2], [550, 411, 15, 9, 13, 2], [550, 463, 13, 7, 10, 3], [550, 513, 11, 10, 8, 2], [550, 564, 12, 8, 10, 2], [550, 615, 12, 8, 10, 2], [550, 666, 14, 8, 12, 2], [550, 719, 12, 6, 10, 4], [550, 770, 11, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 108, 12, 4, 11, 5], [611, 156, 13, 8, 10, 2], [611, 207, 12, 10, 10, 2], [611, 259, 12, 7, 10, 3], [611, 309, 11, 8, 11, 2], [611, 363, 11, 5, 10, 5], [611, 414, 10, 5, 10, 5], [611, 467, 11, 3, 10, 7], [611, 511, 1, 1, 10, 1], [611, 563, 12, 9, 10, 1], [611, 614, 13, 9, 10, 1], [611, 665, 13, 9, 10, 1], [611, 717, 13, 8, 10, 2], [611, 770, 12, 6, 10, 4], [672, 6, 10, 3, 10, 5], [672, 57, 11, 3, 10, 5], [672, 105, 12, 5, 10, 2], [672, 156, 12, 5, 10, 2], [672, 207, 11, 5, 10, 2], [672, 258, 11, 5, 10, 2], [672, 310, 12, 7, 10, 3], [672, 360, 10, 8, 9, 2], [672, 411, 12, 10, 10, 2], [1, 1, 1, 1, 10, 1], [794, 766, 13, 4, 10, 0], [672, 565, 11, 6, 10, 3], [672, 618, 10, 5, 10, 5], [672, 669, 9, 5, 10, 5], [672, 717, 12, 8, 10, 2], [672, 768, 12, 8, 10, 2], [733, 3, 12, 9, 10, 2], [733, 57, 10, 3, 10, 5], [733, 110, 9, 5, 10, 7], [733, 161, 10, 5, 10, 7], [733, 205, 13, 10, 10, 0], [733, 256, 13, 10, 10, 0], [733, 307, 13, 10, 10, 0], [733, 358, 12, 10, 10, 0], [733, 409, 13, 10, 10, 0], [733, 460, 12, 10, 10, 0], [733, 511, 13, 10, 10, 0], [733, 562, 13, 10, 10, 0], [733, 613, 13, 10, 10, 0], [733, 664, 12, 10, 10, 0], [733, 715, 12, 10, 10, 0], [733, 766, 13, 10, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 12, 10, 10, 0], [794, 103, 13, 10, 10, 0], [794, 154, 13, 10, 10, 0], [794, 205, 13, 10, 10, 0], [794, 260, 10, 6, 10, 4], [794, 309, 12, 4, 10, 2], [794, 360, 12, 4, 10, 2], [794, 411, 12, 3, 10, 2], [794, 462, 12, 4, 10, 2], [794, 513, 11, 3, 10, 2], [794, 564, 11, 3, 10, 2], [794, 619, 9, 6, 10, 6], [794, 666, 11, 4, 10, 2], [794, 721, 9, 6, 10, 6], [794, 766, 13, 4, 10, 0], [855, 1, 13, 4, 10, 0], [855, 52, 13, 4, 10, 0], [855, 103, 13, 4, 10, 0], [855, 154, 13, 4, 10, 0], [855, 205, 13, 4, 10, 0], [855, 256, 13, 4, 10, 0], [855, 307, 13, 4, 10, 0], [855, 358, 13, 4, 10, 0], [855, 409, 13, 4, 10, 0], [855, 460, 13, 4, 10, 0], [855, 511, 13, 4, 10, 0], [855, 562, 13, 4, 10, 0], [855, 613, 13, 4, 10, 0], [855, 664, 13, 4, 10, 0], [855, 715, 13, 4, 10, 0], [855, 766, 13, 4, 10, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 15, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 10, 6, 9, 2], [1, 105, 11, 2, 9, 2], [1, 156, 12, 5, 9, 2], [1, 206, 11, 8, 9, 1], [1, 258, 11, 6, 9, 2], [1, 309, 11, 6, 9, 2], [1, 360, 9, 2, 9, 2], [1, 411, 10, 7, 9, 2], [1, 462, 10, 7, 9, 2], [1, 513, 11, 4, 9, 2], [1, 565, 11, 5, 9, 3], [1, 620, 8, 3, 9, 7], [1, 669, 10, 1, 9, 5], [1, 722, 8, 1, 9, 7], [1, 768, 11, 6, 9, 2], [62, 3, 11, 6, 9, 2], [62, 54, 10, 6, 9, 2], [62, 105, 11, 6, 9, 2], [62, 156, 11, 6, 9, 2], [62, 207, 11, 6, 9, 2], [62, 258, 11, 6, 9, 2], [62, 309, 10, 6, 9, 2], [62, 360, 11, 6, 9, 2], [62, 411, 11, 6, 9, 2], [62, 462, 11, 6, 9, 2], [62, 515, 9, 4, 9, 4], [62, 566, 9, 6, 9, 4], [62, 616, 10, 5, 9, 3], [62, 668, 10, 3, 9, 4], [62, 718, 10, 5, 9, 3], [62, 768, 11, 6, 9, 2], [123, 3, 11, 7, 9, 2], [123, 54, 11, 6, 9, 2], [123, 105, 11, 6, 9, 2], [123, 156, 11, 6, 9, 2], [123, 207, 11, 6, 9, 2], [123, 258, 11, 6, 9, 2], [123, 309, 11, 6, 9, 2], [123, 360, 11, 6, 9, 2], [123, 411, 12, 6, 9, 2], [123, 462, 11, 6, 9, 2], [123, 513, 12, 6, 9, 2], [123, 564, 11, 6, 9, 2], [123, 615, 10, 6, 9, 2], [123, 666, 12, 6, 9, 2], [123, 717, 11, 6, 9, 2], [123, 768, 11, 6, 9, 2], [184, 3, 11, 6, 9, 2], [184, 54, 11, 7, 9, 2], [184, 105, 11, 6, 9, 2], [184, 156, 11, 6, 9, 2], [184, 207, 12, 6, 9, 2], [184, 258, 12, 6, 9, 2], [184, 309, 12, 6, 9, 2], [184, 360, 12, 6, 9, 2], [184, 411, 12, 6, 9, 2], [184, 462, 12, 6, 9, 2], [184, 513, 11, 6, 9, 2], [184, 564, 10, 8, 9, 2], [184, 615, 9, 6, 9, 2], [184, 666, 10, 8, 9, 2], [184, 717, 11, 2, 9, 2], [184, 775, 9, 1, 9, 9], [245, 3, 10, 2, 9, 2], [245, 56, 10, 4, 9, 4], [245, 105, 10, 6, 9, 2], [245, 158, 10, 4, 9, 4], [245, 207, 11, 6, 9, 2], [245, 260, 10, 4, 9, 4], [245, 309, 11, 6, 9, 2], [245, 362, 10, 6, 9, 4], [245, 411, 10, 6, 9, 2], [245, 462, 10, 6, 9, 2], [245, 513, 10, 8, 9, 2], [245, 564, 10, 6, 9, 2], [245, 615, 10, 6, 9, 2], [245, 668, 11, 4, 9, 4], [245, 719, 10, 4, 9, 4], [245, 770, 10, 4, 9, 4], [306, 5, 10, 6, 9, 4], [306, 56, 10, 6, 9, 4], [306, 107, 10, 4, 9, 4], [306, 158, 10, 4, 9, 4], [306, 208, 10, 5, 9, 3], [306, 260, 10, 4, 9, 4], [306, 311, 11, 4, 9, 4], [306, 362, 11, 4, 9, 4], [306, 413, 10, 4, 9, 4], [306, 464, 11, 6, 9, 4], [306, 515, 10, 4, 9, 4], [306, 564, 10, 7, 9, 2], [306, 615, 10, 7, 9, 2], [306, 666, 10, 7, 9, 2], [306, 719, 10, 2, 9, 4], [306, 766, 1, 1, 9, 1], [367, 2, 12, 7, 9, 1], [367, 53, 11, 7, 9, 1], [367, 105, 11, 8, 9, 2], [367, 155, 11, 7, 9, 1], [367, 206, 12, 7, 9, 1], [367, 257, 12, 7, 9, 1], [367, 308, 12, 7, 9, 1], [367, 360, 10, 6, 9, 2], [367, 411, 11, 6, 9, 2], [367, 461, 11, 7, 9, 1], [367, 513, 10, 6, 9, 2], [367, 563, 12, 7, 9, 1], [367, 614, 11, 7, 9, 1], [367, 668, 10, 6, 9, 4], [367, 717, 10, 6, 9, 2], [367, 768, 11, 6, 9, 2], [428, 2, 11, 7, 9, 1], [428, 54, 11, 6, 9, 2], [428, 104, 11, 7, 9, 1], [428, 155, 10, 7, 9, 1], [428, 206, 11, 7, 9, 1], [428, 258, 11, 6, 9, 2], [428, 308, 12, 7, 9, 1], [428, 359, 11, 7, 9, 1], [428, 410, 10, 7, 9, 1], [428, 461, 11, 7, 9, 1], [428, 513, 11, 6, 9, 2], [428, 563, 12, 7, 9, 1], [428, 614, 11, 7, 9, 1], [428, 665, 10, 7, 9, 1], [428, 716, 11, 7, 9, 1], [428, 768, 11, 6, 9, 2], [489, 3, 11, 7, 9, 2], [489, 54, 11, 3, 9, 2], [489, 105, 11, 6, 9, 2], [489, 156, 11, 6, 9, 2], [489, 207, 11, 7, 9, 2], [489, 260, 9, 2, 9, 4], [489, 309, 12, 7, 9, 2], [489, 360, 11, 6, 9, 2], [489, 411, 13, 6, 11, 2], [489, 462, 13, 6, 11, 2], [489, 513, 14, 3, 12, 2], [489, 564, 11, 2, 9, 2], [489, 616, 11, 1, 9, 3], [489, 667, 10, 5, 9, 3], [489, 717, 12, 6, 9, 2], [489, 768, 11, 6, 9, 2], [550, 5, 11, 3, 10, 4], [550, 55, 11, 5, 9, 3], [550, 106, 10, 5, 9, 3], [550, 157, 10, 5, 9, 3], [550, 207, 12, 6, 9, 2], [550, 260, 10, 5, 9, 4], [550, 309, 10, 6, 8, 2], [550, 360, 12, 7, 10, 2], [550, 411, 14, 7, 12, 2], [550, 463, 12, 5, 9, 3], [550, 513, 10, 8, 7, 2], [550, 564, 11, 6, 9, 2], [550, 615, 11, 6, 9, 2], [550, 666, 13, 6, 11, 2], [550, 719, 11, 4, 9, 4], [550, 770, 10, 4, 9, 4], [611, 5, 9, 6, 9, 4], [611, 56, 9, 6, 9, 4], [611, 108, 11, 2, 10, 5], [611, 156, 12, 6, 9, 2], [611, 207, 11, 8, 9, 2], [611, 259, 11, 5, 9, 3], [611, 309, 10, 6, 10, 2], [611, 363, 10, 3, 9, 5], [611, 414, 9, 3, 9, 5], [611, 467, 10, 1, 9, 7], [611, 511, 1, 1, 9, 1], [611, 563, 11, 7, 9, 1], [611, 614, 12, 7, 9, 1], [611, 665, 12, 7, 9, 1], [611, 717, 12, 6, 9, 2], [611, 770, 11, 4, 9, 4], [672, 6, 9, 1, 9, 5], [672, 57, 10, 1, 9, 5], [672, 105, 11, 3, 9, 2], [672, 156, 11, 3, 9, 2], [672, 207, 10, 3, 9, 2], [672, 258, 10, 3, 9, 2], [672, 310, 11, 5, 9, 3], [672, 360, 9, 6, 8, 2], [672, 411, 11, 8, 9, 2], [1, 1, 1, 1, 9, 1], [794, 766, 11, 2, 9, 0], [672, 565, 10, 4, 9, 3], [672, 618, 9, 3, 9, 5], [672, 669, 8, 3, 9, 5], [672, 717, 11, 6, 9, 2], [672, 768, 11, 6, 9, 2], [733, 3, 11, 7, 9, 2], [733, 57, 9, 1, 9, 5], [733, 110, 8, 3, 9, 7], [733, 161, 9, 3, 9, 7], [733, 205, 12, 8, 9, 0], [733, 256, 12, 8, 9, 0], [733, 307, 12, 8, 9, 0], [733, 358, 11, 8, 9, 0], [733, 409, 11, 8, 9, 0], [733, 460, 11, 8, 9, 0], [733, 511, 11, 8, 9, 0], [733, 562, 12, 8, 9, 0], [733, 613, 11, 8, 9, 0], [733, 664, 11, 8, 9, 0], [733, 715, 11, 8, 9, 0], [733, 766, 12, 8, 9, 0], [1, 1, 1, 1, 9, 1], [794, 52, 11, 8, 9, 0], [794, 103, 12, 8, 9, 0], [794, 154, 12, 8, 9, 0], [794, 205, 12, 8, 9, 0], [794, 260, 9, 4, 9, 4], [794, 309, 11, 2, 9, 2], [794, 360, 11, 2, 9, 2], [794, 411, 11, 1, 9, 2], [794, 462, 11, 2, 9, 2], [794, 513, 10, 1, 9, 2], [794, 564, 10, 1, 9, 2], [794, 619, 8, 4, 9, 6], [794, 666, 10, 2, 9, 2], [794, 721, 8, 4, 9, 6], [794, 766, 11, 2, 9, 0], [855, 1, 11, 2, 9, 0], [855, 52, 11, 2, 9, 0], [855, 103, 11, 2, 9, 0], [855, 154, 11, 2, 9, 0], [855, 205, 11, 2, 9, 0], [855, 256, 11, 2, 9, 0], [855, 307, 11, 2, 9, 0], [855, 358, 11, 2, 9, 0], [855, 409, 11, 2, 9, 0], [855, 460, 11, 2, 9, 0], [855, 511, 11, 2, 9, 0], [855, 562, 11, 2, 9, 0], [855, 613, 11, 2, 9, 0], [855, 664, 11, 2, 9, 0], [855, 715, 11, 2, 9, 0], [855, 766, 11, 2, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 14, \"tallestglyph\": 8}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 55, 10, 8, 10, 3], [1, 106, 10, 7, 10, 3], [1, 157, 10, 7, 10, 3], [1, 207, 10, 10, 10, 2], [1, 259, 10, 8, 10, 3], [1, 310, 10, 8, 10, 3], [1, 361, 10, 7, 10, 3], [1, 412, 10, 9, 10, 3], [1, 463, 10, 9, 10, 3], [1, 514, 10, 7, 10, 3], [1, 566, 10, 7, 10, 4], [1, 617, 10, 9, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 7, 10, 4], [1, 769, 10, 8, 10, 3], [62, 4, 10, 8, 10, 3], [62, 55, 10, 8, 10, 3], [62, 106, 10, 8, 10, 3], [62, 157, 10, 8, 10, 3], [62, 208, 10, 8, 10, 3], [62, 259, 10, 8, 10, 3], [62, 310, 10, 8, 10, 3], [62, 361, 10, 8, 10, 3], [62, 412, 10, 8, 10, 3], [62, 463, 10, 8, 10, 3], [62, 515, 10, 7, 10, 4], [62, 566, 10, 9, 10, 4], [62, 617, 10, 7, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 7, 10, 4], [62, 769, 10, 8, 10, 3], [123, 4, 10, 9, 10, 3], [123, 55, 10, 8, 10, 3], [123, 106, 10, 8, 10, 3], [123, 157, 10, 8, 10, 3], [123, 208, 10, 8, 10, 3], [123, 259, 10, 8, 10, 3], [123, 310, 10, 8, 10, 3], [123, 361, 10, 8, 10, 3], [123, 412, 10, 8, 10, 3], [123, 463, 10, 8, 10, 3], [123, 514, 10, 8, 10, 3], [123, 565, 10, 8, 10, 3], [123, 616, 10, 8, 10, 3], [123, 667, 10, 8, 10, 3], [123, 718, 10, 8, 10, 3], [123, 769, 10, 8, 10, 3], [184, 4, 10, 8, 10, 3], [184, 55, 10, 9, 10, 3], [184, 106, 10, 8, 10, 3], [184, 157, 10, 8, 10, 3], [184, 208, 10, 8, 10, 3], [184, 259, 10, 8, 10, 3], [184, 310, 10, 8, 10, 3], [184, 361, 10, 8, 10, 3], [184, 412, 10, 8, 10, 3], [184, 463, 10, 8, 10, 3], [184, 514, 10, 8, 10, 3], [184, 565, 10, 10, 10, 3], [184, 616, 10, 8, 10, 3], [184, 667, 10, 10, 10, 3], [184, 718, 10, 7, 10, 3], [184, 770, 10, 9, 10, 4], [245, 4, 10, 7, 10, 3], [245, 56, 10, 7, 10, 4], [245, 106, 10, 8, 10, 3], [245, 158, 10, 7, 10, 4], [245, 208, 10, 8, 10, 3], [245, 260, 10, 7, 10, 4], [245, 310, 10, 8, 10, 3], [245, 362, 10, 9, 10, 4], [245, 412, 10, 8, 10, 3], [245, 463, 10, 8, 10, 3], [245, 514, 10, 10, 10, 3], [245, 565, 10, 8, 10, 3], [245, 616, 10, 8, 10, 3], [245, 668, 10, 7, 10, 4], [245, 719, 10, 7, 10, 4], [245, 770, 10, 7, 10, 4], [306, 5, 10, 9, 10, 4], [306, 56, 10, 9, 10, 4], [306, 107, 10, 7, 10, 4], [306, 158, 10, 7, 10, 4], [306, 209, 10, 7, 10, 4], [306, 260, 10, 7, 10, 4], [306, 311, 10, 7, 10, 4], [306, 362, 10, 7, 10, 4], [306, 413, 10, 7, 10, 4], [306, 464, 10, 9, 10, 4], [306, 515, 10, 7, 10, 4], [306, 565, 10, 9, 10, 3], [306, 616, 10, 9, 10, 3], [306, 667, 10, 9, 10, 3], [306, 719, 10, 6, 10, 4], [306, 770, 10, 6, 10, 4], [367, 3, 10, 9, 10, 2], [367, 54, 10, 9, 10, 2], [367, 106, 10, 10, 10, 3], [367, 156, 10, 9, 10, 2], [367, 207, 10, 9, 10, 2], [367, 258, 10, 9, 10, 2], [367, 309, 10, 9, 10, 2], [367, 361, 10, 8, 10, 3], [367, 412, 10, 8, 10, 3], [367, 462, 10, 9, 10, 2], [367, 514, 10, 8, 10, 3], [367, 564, 10, 9, 10, 2], [367, 615, 10, 9, 10, 2], [367, 668, 10, 9, 10, 4], [367, 718, 10, 8, 10, 3], [367, 769, 10, 8, 10, 3], [428, 3, 10, 9, 10, 2], [428, 55, 10, 8, 10, 3], [428, 105, 10, 9, 10, 2], [428, 156, 10, 9, 10, 2], [428, 207, 10, 9, 10, 2], [428, 259, 10, 8, 10, 3], [428, 309, 10, 9, 10, 2], [428, 360, 10, 9, 10, 2], [428, 411, 10, 9, 10, 2], [428, 462, 10, 9, 10, 2], [428, 514, 10, 8, 10, 3], [428, 564, 10, 9, 10, 2], [428, 615, 10, 9, 10, 2], [428, 666, 10, 9, 10, 2], [428, 717, 10, 9, 10, 2], [428, 769, 10, 8, 10, 3], [489, 4, 10, 9, 10, 3], [489, 55, 10, 7, 10, 3], [489, 106, 10, 8, 10, 3], [489, 157, 10, 8, 10, 3], [489, 208, 10, 9, 10, 3], [489, 260, 10, 6, 10, 4], [489, 310, 10, 9, 10, 3], [489, 361, 10, 8, 10, 3], [489, 412, 12, 8, 12, 3], [489, 463, 12, 8, 12, 3], [489, 514, 13, 7, 13, 3], [489, 565, 10, 7, 10, 3], [489, 617, 10, 6, 10, 4], [489, 668, 10, 7, 10, 4], [489, 718, 10, 8, 10, 3], [489, 769, 10, 8, 10, 3], [550, 5, 11, 6, 11, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 208, 10, 8, 10, 3], [550, 260, 10, 8, 10, 4], [550, 310, 9, 8, 9, 3], [550, 361, 11, 9, 11, 3], [550, 412, 13, 9, 13, 3], [550, 464, 10, 7, 10, 4], [550, 514, 8, 10, 8, 3], [550, 565, 10, 8, 10, 3], [550, 616, 10, 8, 10, 3], [550, 667, 12, 8, 12, 3], [550, 719, 10, 7, 10, 4], [550, 770, 10, 7, 10, 4], [611, 5, 10, 9, 10, 4], [611, 56, 10, 9, 10, 4], [611, 107, 11, 6, 11, 4], [611, 157, 10, 8, 10, 3], [611, 208, 10, 10, 10, 3], [611, 260, 10, 7, 10, 4], [611, 310, 11, 8, 11, 3], [611, 362, 10, 7, 10, 4], [611, 413, 10, 7, 10, 4], [611, 464, 10, 7, 10, 4], [611, 515, 10, 6, 10, 4], [611, 564, 10, 9, 10, 2], [611, 615, 10, 9, 10, 2], [611, 666, 10, 9, 10, 2], [611, 718, 10, 8, 10, 3], [611, 770, 10, 7, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 106, 10, 7, 10, 3], [672, 157, 10, 7, 10, 3], [672, 208, 10, 7, 10, 3], [672, 259, 10, 7, 10, 3], [672, 311, 10, 7, 10, 4], [672, 361, 9, 8, 9, 3], [672, 412, 10, 10, 10, 3], [1, 5, 10, 6, 10, 4], [794, 767, 10, 9, 10, 1], [672, 566, 10, 6, 10, 4], [672, 617, 10, 7, 10, 4], [672, 668, 10, 7, 10, 4], [672, 718, 10, 8, 10, 3], [672, 769, 10, 8, 10, 3], [733, 4, 10, 9, 10, 3], [733, 56, 10, 6, 10, 4], [733, 107, 10, 9, 10, 4], [733, 158, 10, 9, 10, 4], [733, 206, 10, 10, 10, 1], [733, 257, 10, 10, 10, 1], [733, 308, 10, 10, 10, 1], [733, 359, 10, 10, 10, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 512, 10, 10, 10, 1], [733, 563, 10, 10, 10, 1], [733, 614, 10, 10, 10, 1], [733, 665, 10, 10, 10, 1], [733, 716, 10, 10, 10, 1], [733, 767, 10, 10, 10, 1], [1, 5, 10, 6, 10, 4], [794, 53, 10, 10, 10, 1], [794, 104, 10, 10, 10, 1], [794, 155, 10, 10, 10, 1], [794, 206, 10, 10, 10, 1], [794, 260, 10, 7, 10, 4], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 617, 10, 9, 10, 4], [794, 667, 10, 7, 10, 3], [794, 719, 10, 9, 10, 4], [794, 767, 10, 9, 10, 1], [855, 2, 10, 9, 10, 1], [855, 53, 10, 9, 10, 1], [855, 104, 10, 9, 10, 1], [855, 155, 10, 9, 10, 1], [855, 206, 10, 9, 10, 1], [855, 257, 10, 9, 10, 1], [855, 308, 10, 9, 10, 1], [855, 359, 10, 9, 10, 1], [855, 410, 10, 9, 10, 1], [855, 461, 10, 9, 10, 1], [855, 512, 10, 9, 10, 1], [855, 563, 10, 9, 10, 1], [855, 614, 10, 9, 10, 1], [855, 665, 10, 9, 10, 1], [855, 716, 10, 9, 10, 1], [855, 767, 10, 9, 10, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 9, 6, 9, 4], [1, 56, 9, 6, 9, 4], [1, 107, 9, 6, 9, 4], [1, 158, 9, 6, 9, 4], [1, 208, 9, 8, 9, 3], [1, 260, 9, 6, 9, 4], [1, 311, 9, 6, 9, 4], [1, 362, 9, 6, 9, 4], [1, 413, 9, 7, 9, 4], [1, 464, 9, 7, 9, 4], [1, 515, 9, 6, 9, 4], [1, 566, 9, 6, 9, 4], [1, 617, 9, 8, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 6, 9, 4], [1, 770, 9, 6, 9, 4], [62, 5, 9, 6, 9, 4], [62, 56, 9, 6, 9, 4], [62, 107, 9, 6, 9, 4], [62, 158, 9, 6, 9, 4], [62, 209, 9, 6, 9, 4], [62, 260, 9, 6, 9, 4], [62, 311, 9, 6, 9, 4], [62, 362, 9, 6, 9, 4], [62, 413, 9, 6, 9, 4], [62, 464, 9, 6, 9, 4], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 770, 9, 6, 9, 4], [123, 5, 9, 7, 9, 4], [123, 56, 9, 6, 9, 4], [123, 107, 9, 6, 9, 4], [123, 158, 9, 6, 9, 4], [123, 209, 9, 6, 9, 4], [123, 260, 9, 6, 9, 4], [123, 311, 9, 6, 9, 4], [123, 362, 9, 6, 9, 4], [123, 413, 9, 6, 9, 4], [123, 464, 9, 6, 9, 4], [123, 515, 9, 6, 9, 4], [123, 566, 9, 6, 9, 4], [123, 617, 9, 6, 9, 4], [123, 668, 9, 6, 9, 4], [123, 719, 9, 6, 9, 4], [123, 770, 9, 6, 9, 4], [184, 5, 9, 6, 9, 4], [184, 56, 9, 7, 9, 4], [184, 107, 9, 6, 9, 4], [184, 158, 9, 6, 9, 4], [184, 209, 9, 6, 9, 4], [184, 260, 9, 6, 9, 4], [184, 311, 9, 6, 9, 4], [184, 362, 9, 6, 9, 4], [184, 413, 9, 6, 9, 4], [184, 464, 9, 6, 9, 4], [184, 515, 9, 6, 9, 4], [184, 566, 9, 8, 9, 4], [184, 617, 9, 6, 9, 4], [184, 668, 9, 8, 9, 4], [184, 719, 9, 6, 9, 4], [184, 770, 9, 8, 9, 4], [245, 5, 9, 6, 9, 4], [245, 56, 9, 6, 9, 4], [245, 107, 9, 6, 9, 4], [245, 158, 9, 6, 9, 4], [245, 209, 9, 6, 9, 4], [245, 260, 9, 6, 9, 4], [245, 311, 9, 6, 9, 4], [245, 362, 9, 8, 9, 4], [245, 413, 9, 6, 9, 4], [245, 464, 9, 6, 9, 4], [245, 515, 9, 8, 9, 4], [245, 566, 9, 6, 9, 4], [245, 617, 9, 6, 9, 4], [245, 668, 9, 6, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 209, 9, 6, 9, 4], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 566, 9, 7, 9, 4], [306, 617, 9, 7, 9, 4], [306, 668, 9, 7, 9, 4], [306, 719, 9, 6, 9, 4], [306, 770, 9, 6, 9, 4], [367, 4, 9, 7, 9, 3], [367, 55, 9, 7, 9, 3], [367, 107, 9, 8, 9, 4], [367, 157, 9, 7, 9, 3], [367, 208, 9, 7, 9, 3], [367, 259, 9, 7, 9, 3], [367, 310, 9, 7, 9, 3], [367, 362, 9, 6, 9, 4], [367, 413, 9, 6, 9, 4], [367, 463, 9, 7, 9, 3], [367, 515, 9, 6, 9, 4], [367, 565, 9, 7, 9, 3], [367, 616, 9, 7, 9, 3], [367, 668, 9, 8, 9, 4], [367, 719, 9, 6, 9, 4], [367, 770, 9, 6, 9, 4], [428, 4, 9, 7, 9, 3], [428, 56, 9, 6, 9, 4], [428, 106, 9, 7, 9, 3], [428, 157, 9, 7, 9, 3], [428, 208, 9, 7, 9, 3], [428, 260, 9, 6, 9, 4], [428, 310, 9, 7, 9, 3], [428, 361, 9, 7, 9, 3], [428, 412, 9, 7, 9, 3], [428, 463, 9, 7, 9, 3], [428, 515, 9, 6, 9, 4], [428, 565, 9, 7, 9, 3], [428, 616, 9, 7, 9, 3], [428, 667, 9, 7, 9, 3], [428, 718, 9, 7, 9, 3], [428, 770, 9, 6, 9, 4], [489, 5, 9, 7, 9, 4], [489, 56, 9, 6, 9, 4], [489, 107, 9, 6, 9, 4], [489, 158, 9, 6, 9, 4], [489, 209, 9, 7, 9, 4], [489, 260, 9, 6, 9, 4], [489, 311, 9, 7, 9, 4], [489, 362, 9, 6, 9, 4], [489, 413, 11, 6, 11, 4], [489, 464, 11, 6, 11, 4], [489, 515, 12, 6, 12, 4], [489, 566, 9, 6, 9, 4], [489, 617, 9, 6, 9, 4], [489, 668, 9, 6, 9, 4], [489, 719, 9, 6, 9, 4], [489, 770, 9, 6, 9, 4], [550, 5, 10, 6, 10, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 209, 9, 6, 9, 4], [550, 260, 9, 7, 9, 4], [550, 311, 8, 6, 8, 4], [550, 362, 10, 7, 10, 4], [550, 413, 12, 7, 12, 4], [550, 464, 9, 6, 9, 4], [550, 515, 7, 8, 7, 4], [550, 566, 9, 6, 9, 4], [550, 617, 9, 6, 9, 4], [550, 668, 11, 6, 11, 4], [550, 719, 9, 6, 9, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 9, 8, 9, 4], [611, 107, 10, 6, 10, 4], [611, 158, 9, 6, 9, 4], [611, 209, 9, 8, 9, 4], [611, 260, 9, 6, 9, 4], [611, 311, 10, 6, 10, 4], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 6, 9, 4], [611, 565, 9, 7, 9, 3], [611, 616, 9, 7, 9, 3], [611, 667, 9, 7, 9, 3], [611, 719, 9, 6, 9, 4], [611, 770, 9, 6, 9, 4], [672, 5, 9, 6, 9, 4], [672, 56, 9, 6, 9, 4], [672, 107, 9, 6, 9, 4], [672, 158, 9, 6, 9, 4], [672, 209, 9, 6, 9, 4], [672, 260, 9, 6, 9, 4], [672, 311, 9, 6, 9, 4], [672, 362, 8, 6, 8, 4], [672, 413, 9, 8, 9, 4], [1, 5, 9, 6, 9, 4], [794, 768, 9, 8, 9, 2], [672, 566, 9, 6, 9, 4], [672, 617, 9, 6, 9, 4], [672, 668, 9, 6, 9, 4], [672, 719, 9, 6, 9, 4], [672, 770, 9, 6, 9, 4], [733, 5, 9, 7, 9, 4], [733, 56, 9, 6, 9, 4], [733, 107, 9, 8, 9, 4], [733, 158, 9, 8, 9, 4], [733, 207, 9, 8, 9, 2], [733, 258, 9, 8, 9, 2], [733, 309, 9, 8, 9, 2], [733, 360, 9, 8, 9, 2], [733, 411, 9, 8, 9, 2], [733, 462, 9, 8, 9, 2], [733, 513, 9, 8, 9, 2], [733, 564, 9, 8, 9, 2], [733, 615, 9, 8, 9, 2], [733, 666, 9, 8, 9, 2], [733, 717, 9, 8, 9, 2], [733, 768, 9, 8, 9, 2], [1, 5, 9, 6, 9, 4], [794, 54, 9, 8, 9, 2], [794, 105, 9, 8, 9, 2], [794, 156, 9, 8, 9, 2], [794, 207, 9, 8, 9, 2], [794, 260, 9, 6, 9, 4], [794, 311, 9, 6, 9, 4], [794, 362, 9, 6, 9, 4], [794, 413, 9, 6, 9, 4], [794, 464, 9, 6, 9, 4], [794, 515, 9, 6, 9, 4], [794, 566, 9, 6, 9, 4], [794, 617, 9, 8, 9, 4], [794, 668, 9, 6, 9, 4], [794, 719, 9, 8, 9, 4], [794, 768, 9, 8, 9, 2], [855, 3, 9, 8, 9, 2], [855, 54, 9, 8, 9, 2], [855, 105, 9, 8, 9, 2], [855, 156, 9, 8, 9, 2], [855, 207, 9, 8, 9, 2], [855, 258, 9, 8, 9, 2], [855, 309, 9, 8, 9, 2], [855, 360, 9, 8, 9, 2], [855, 411, 9, 8, 9, 2], [855, 462, 9, 8, 9, 2], [855, 513, 9, 8, 9, 2], [855, 564, 9, 8, 9, 2], [855, 615, 9, 8, 9, 2], [855, 666, 9, 8, 9, 2], [855, 717, 9, 8, 9, 2], [855, 768, 9, 8, 9, 2]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 8}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 10, 8, 9, 2], [1, 105, 11, 4, 9, 2], [1, 156, 12, 7, 9, 2], [1, 206, 11, 10, 9, 1], [1, 258, 11, 8, 9, 2], [1, 309, 11, 8, 9, 2], [1, 360, 9, 4, 9, 2], [1, 411, 10, 9, 9, 2], [1, 462, 10, 9, 9, 2], [1, 513, 11, 6, 9, 2], [1, 565, 11, 7, 9, 3], [1, 620, 8, 5, 9, 7], [1, 669, 10, 3, 9, 5], [1, 722, 8, 3, 9, 7], [1, 768, 11, 8, 9, 2], [62, 3, 11, 8, 9, 2], [62, 54, 10, 8, 9, 2], [62, 105, 11, 8, 9, 2], [62, 156, 11, 8, 9, 2], [62, 207, 11, 8, 9, 2], [62, 258, 11, 8, 9, 2], [62, 309, 10, 8, 9, 2], [62, 360, 11, 8, 9, 2], [62, 411, 11, 8, 9, 2], [62, 462, 11, 8, 9, 2], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 616, 10, 7, 9, 3], [62, 668, 10, 5, 9, 4], [62, 718, 10, 7, 9, 3], [62, 768, 11, 8, 9, 2], [123, 3, 11, 9, 9, 2], [123, 54, 11, 8, 9, 2], [123, 105, 11, 8, 9, 2], [123, 156, 11, 8, 9, 2], [123, 207, 11, 8, 9, 2], [123, 258, 11, 8, 9, 2], [123, 309, 11, 8, 9, 2], [123, 360, 11, 8, 9, 2], [123, 411, 12, 8, 9, 2], [123, 462, 11, 8, 9, 2], [123, 513, 12, 8, 9, 2], [123, 564, 11, 8, 9, 2], [123, 615, 10, 8, 9, 2], [123, 666, 12, 8, 9, 2], [123, 717, 11, 8, 9, 2], [123, 768, 11, 8, 9, 2], [184, 3, 11, 8, 9, 2], [184, 54, 11, 9, 9, 2], [184, 105, 11, 8, 9, 2], [184, 156, 11, 8, 9, 2], [184, 207, 12, 8, 9, 2], [184, 258, 12, 8, 9, 2], [184, 309, 12, 8, 9, 2], [184, 360, 12, 8, 9, 2], [184, 411, 12, 8, 9, 2], [184, 462, 12, 8, 9, 2], [184, 513, 11, 8, 9, 2], [184, 564, 10, 10, 9, 2], [184, 615, 9, 8, 9, 2], [184, 666, 10, 10, 9, 2], [184, 717, 11, 4, 9, 2], [184, 775, 9, 3, 9, 9], [245, 3, 10, 4, 9, 2], [245, 56, 10, 6, 9, 4], [245, 105, 10, 8, 9, 2], [245, 158, 10, 6, 9, 4], [245, 207, 11, 8, 9, 2], [245, 260, 10, 6, 9, 4], [245, 309, 11, 8, 9, 2], [245, 362, 10, 8, 9, 4], [245, 411, 10, 8, 9, 2], [245, 462, 10, 8, 9, 2], [245, 513, 10, 10, 9, 2], [245, 564, 10, 8, 9, 2], [245, 615, 10, 8, 9, 2], [245, 668, 11, 6, 9, 4], [245, 719, 10, 6, 9, 4], [245, 770, 10, 6, 9, 4], [306, 5, 10, 8, 9, 4], [306, 56, 10, 8, 9, 4], [306, 107, 10, 6, 9, 4], [306, 158, 10, 6, 9, 4], [306, 208, 10, 7, 9, 3], [306, 260, 10, 6, 9, 4], [306, 311, 11, 6, 9, 4], [306, 362, 11, 6, 9, 4], [306, 413, 10, 6, 9, 4], [306, 464, 11, 8, 9, 4], [306, 515, 10, 6, 9, 4], [306, 564, 10, 9, 9, 2], [306, 615, 10, 9, 9, 2], [306, 666, 10, 9, 9, 2], [306, 719, 10, 4, 9, 4], [306, 766, 1, 1, 9, 1], [367, 2, 12, 9, 9, 1], [367, 53, 11, 9, 9, 1], [367, 105, 11, 10, 9, 2], [367, 155, 11, 9, 9, 1], [367, 206, 12, 9, 9, 1], [367, 257, 12, 9, 9, 1], [367, 308, 12, 9, 9, 1], [367, 360, 10, 8, 9, 2], [367, 411, 11, 8, 9, 2], [367, 461, 11, 9, 9, 1], [367, 513, 10, 8, 9, 2], [367, 563, 12, 9, 9, 1], [367, 614, 11, 9, 9, 1], [367, 668, 10, 8, 9, 4], [367, 717, 10, 8, 9, 2], [367, 768, 11, 8, 9, 2], [428, 2, 11, 9, 9, 1], [428, 54, 11, 8, 9, 2], [428, 104, 11, 9, 9, 1], [428, 155, 10, 9, 9, 1], [428, 206, 11, 9, 9, 1], [428, 258, 11, 8, 9, 2], [428, 308, 12, 9, 9, 1], [428, 359, 11, 9, 9, 1], [428, 410, 10, 9, 9, 1], [428, 461, 11, 9, 9, 1], [428, 513, 11, 8, 9, 2], [428, 563, 12, 9, 9, 1], [428, 614, 11, 9, 9, 1], [428, 665, 10, 9, 9, 1], [428, 716, 11, 9, 9, 1], [428, 768, 11, 8, 9, 2], [489, 3, 11, 9, 9, 2], [489, 54, 11, 5, 9, 2], [489, 105, 11, 8, 9, 2], [489, 156, 11, 8, 9, 2], [489, 207, 11, 9, 9, 2], [489, 260, 9, 4, 9, 4], [489, 309, 12, 9, 9, 2], [489, 360, 11, 8, 9, 2], [489, 411, 13, 8, 11, 2], [489, 462, 13, 8, 11, 2], [489, 513, 14, 5, 12, 2], [489, 564, 11, 4, 9, 2], [489, 616, 11, 3, 9, 3], [489, 667, 10, 7, 9, 3], [489, 717, 12, 8, 9, 2], [489, 768, 11, 8, 9, 2], [550, 5, 11, 5, 10, 4], [550, 55, 11, 7, 9, 3], [550, 106, 10, 7, 9, 3], [550, 157, 10, 7, 9, 3], [550, 207, 12, 8, 9, 2], [550, 260, 10, 7, 9, 4], [550, 309, 10, 8, 8, 2], [550, 360, 12, 9, 10, 2], [550, 411, 14, 9, 12, 2], [550, 463, 12, 7, 9, 3], [550, 513, 10, 10, 7, 2], [550, 564, 11, 8, 9, 2], [550, 615, 11, 8, 9, 2], [550, 666, 13, 8, 11, 2], [550, 719, 11, 6, 9, 4], [550, 770, 10, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 9, 8, 9, 4], [611, 108, 11, 4, 10, 5], [611, 156, 12, 8, 9, 2], [611, 207, 11, 10, 9, 2], [611, 259, 11, 7, 9, 3], [611, 309, 10, 8, 10, 2], [611, 363, 10, 5, 9, 5], [611, 414, 9, 5, 9, 5], [611, 467, 10, 3, 9, 7], [611, 511, 1, 1, 9, 1], [611, 563, 11, 9, 9, 1], [611, 614, 12, 9, 9, 1], [611, 665, 12, 9, 9, 1], [611, 717, 12, 8, 9, 2], [611, 770, 11, 6, 9, 4], [672, 6, 9, 3, 9, 5], [672, 57, 10, 3, 9, 5], [672, 105, 11, 5, 9, 2], [672, 156, 11, 5, 9, 2], [672, 207, 10, 5, 9, 2], [672, 258, 10, 5, 9, 2], [672, 310, 11, 7, 9, 3], [672, 360, 9, 8, 8, 2], [672, 411, 11, 10, 9, 2], [1, 1, 1, 1, 9, 1], [794, 766, 12, 4, 9, 0], [672, 565, 10, 6, 9, 3], [672, 618, 9, 5, 9, 5], [672, 669, 8, 5, 9, 5], [672, 717, 11, 8, 9, 2], [672, 768, 11, 8, 9, 2], [733, 3, 11, 9, 9, 2], [733, 57, 9, 3, 9, 5], [733, 110, 8, 5, 9, 7], [733, 161, 9, 5, 9, 7], [733, 205, 12, 10, 9, 0], [733, 256, 12, 10, 9, 0], [733, 307, 12, 10, 9, 0], [733, 358, 11, 10, 9, 0], [733, 409, 12, 10, 9, 0], [733, 460, 11, 10, 9, 0], [733, 511, 12, 10, 9, 0], [733, 562, 12, 10, 9, 0], [733, 613, 12, 10, 9, 0], [733, 664, 11, 10, 9, 0], [733, 715, 11, 10, 9, 0], [733, 766, 12, 10, 9, 0], [1, 1, 1, 1, 9, 1], [794, 52, 11, 10, 9, 0], [794, 103, 12, 10, 9, 0], [794, 154, 12, 10, 9, 0], [794, 205, 12, 10, 9, 0], [794, 260, 9, 6, 9, 4], [794, 309, 11, 4, 9, 2], [794, 360, 11, 4, 9, 2], [794, 411, 11, 3, 9, 2], [794, 462, 11, 4, 9, 2], [794, 513, 10, 3, 9, 2], [794, 564, 10, 3, 9, 2], [794, 619, 8, 6, 9, 6], [794, 666, 10, 4, 9, 2], [794, 721, 8, 6, 9, 6], [794, 766, 12, 4, 9, 0], [855, 1, 12, 4, 9, 0], [855, 52, 12, 4, 9, 0], [855, 103, 12, 4, 9, 0], [855, 154, 12, 4, 9, 0], [855, 205, 12, 4, 9, 0], [855, 256, 12, 4, 9, 0], [855, 307, 12, 4, 9, 0], [855, 358, 12, 4, 9, 0], [855, 409, 12, 4, 9, 0], [855, 460, 12, 4, 9, 0], [855, 511, 12, 4, 9, 0], [855, 562, 12, 4, 9, 0], [855, 613, 12, 4, 9, 0], [855, 664, 12, 4, 9, 0], [855, 715, 12, 4, 9, 0], [855, 766, 12, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 14, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 9, 6, 8, 2], [1, 105, 10, 2, 8, 2], [1, 156, 11, 5, 8, 2], [1, 206, 10, 8, 8, 1], [1, 258, 10, 6, 8, 2], [1, 309, 10, 6, 8, 2], [1, 360, 8, 2, 8, 2], [1, 411, 9, 7, 8, 2], [1, 462, 9, 7, 8, 2], [1, 513, 10, 4, 8, 2], [1, 565, 10, 5, 8, 3], [1, 620, 7, 3, 8, 7], [1, 669, 9, 1, 8, 5], [1, 722, 7, 1, 8, 7], [1, 768, 10, 6, 8, 2], [62, 3, 10, 6, 8, 2], [62, 54, 9, 6, 8, 2], [62, 105, 10, 6, 8, 2], [62, 156, 10, 6, 8, 2], [62, 207, 10, 6, 8, 2], [62, 258, 10, 6, 8, 2], [62, 309, 9, 6, 8, 2], [62, 360, 10, 6, 8, 2], [62, 411, 10, 6, 8, 2], [62, 462, 10, 6, 8, 2], [62, 515, 8, 4, 8, 4], [62, 566, 8, 6, 8, 4], [62, 616, 9, 5, 8, 3], [62, 668, 9, 3, 8, 4], [62, 718, 9, 5, 8, 3], [62, 768, 10, 6, 8, 2], [123, 3, 10, 7, 8, 2], [123, 54, 10, 6, 8, 2], [123, 105, 10, 6, 8, 2], [123, 156, 10, 6, 8, 2], [123, 207, 10, 6, 8, 2], [123, 258, 10, 6, 8, 2], [123, 309, 10, 6, 8, 2], [123, 360, 10, 6, 8, 2], [123, 411, 11, 6, 8, 2], [123, 462, 10, 6, 8, 2], [123, 513, 11, 6, 8, 2], [123, 564, 10, 6, 8, 2], [123, 615, 9, 6, 8, 2], [123, 666, 11, 6, 8, 2], [123, 717, 10, 6, 8, 2], [123, 768, 10, 6, 8, 2], [184, 3, 10, 6, 8, 2], [184, 54, 10, 7, 8, 2], [184, 105, 10, 6, 8, 2], [184, 156, 10, 6, 8, 2], [184, 207, 11, 6, 8, 2], [184, 258, 11, 6, 8, 2], [184, 309, 11, 6, 8, 2], [184, 360, 11, 6, 8, 2], [184, 411, 11, 6, 8, 2], [184, 462, 11, 6, 8, 2], [184, 513, 10, 6, 8, 2], [184, 564, 9, 8, 8, 2], [184, 615, 8, 6, 8, 2], [184, 666, 9, 8, 8, 2], [184, 717, 10, 2, 8, 2], [184, 775, 8, 1, 8, 9], [245, 3, 9, 2, 8, 2], [245, 56, 9, 4, 8, 4], [245, 105, 9, 6, 8, 2], [245, 158, 9, 4, 8, 4], [245, 207, 10, 6, 8, 2], [245, 260, 9, 4, 8, 4], [245, 309, 10, 6, 8, 2], [245, 362, 9, 6, 8, 4], [245, 411, 9, 6, 8, 2], [245, 462, 9, 6, 8, 2], [245, 513, 9, 8, 8, 2], [245, 564, 9, 6, 8, 2], [245, 615, 9, 6, 8, 2], [245, 668, 10, 4, 8, 4], [245, 719, 9, 4, 8, 4], [245, 770, 9, 4, 8, 4], [306, 5, 9, 6, 8, 4], [306, 56, 9, 6, 8, 4], [306, 107, 9, 4, 8, 4], [306, 158, 9, 4, 8, 4], [306, 208, 9, 5, 8, 3], [306, 260, 9, 4, 8, 4], [306, 311, 10, 4, 8, 4], [306, 362, 10, 4, 8, 4], [306, 413, 9, 4, 8, 4], [306, 464, 10, 6, 8, 4], [306, 515, 9, 4, 8, 4], [306, 564, 9, 7, 8, 2], [306, 615, 9, 7, 8, 2], [306, 666, 9, 7, 8, 2], [306, 719, 9, 2, 8, 4], [306, 766, 1, 1, 8, 1], [367, 2, 11, 7, 8, 1], [367, 53, 10, 7, 8, 1], [367, 105, 10, 8, 8, 2], [367, 155, 10, 7, 8, 1], [367, 206, 10, 7, 8, 1], [367, 257, 11, 7, 8, 1], [367, 308, 11, 7, 8, 1], [367, 360, 9, 6, 8, 2], [367, 411, 10, 6, 8, 2], [367, 461, 10, 7, 8, 1], [367, 513, 9, 6, 8, 2], [367, 563, 11, 7, 8, 1], [367, 614, 10, 7, 8, 1], [367, 668, 9, 6, 8, 4], [367, 717, 9, 6, 8, 2], [367, 768, 10, 6, 8, 2], [428, 2, 10, 7, 8, 1], [428, 54, 10, 6, 8, 2], [428, 104, 10, 7, 8, 1], [428, 155, 9, 7, 8, 1], [428, 206, 10, 7, 8, 1], [428, 258, 10, 6, 8, 2], [428, 308, 11, 7, 8, 1], [428, 359, 10, 7, 8, 1], [428, 410, 9, 7, 8, 1], [428, 461, 10, 7, 8, 1], [428, 513, 10, 6, 8, 2], [428, 563, 11, 7, 8, 1], [428, 614, 10, 7, 8, 1], [428, 665, 9, 7, 8, 1], [428, 716, 10, 7, 8, 1], [428, 768, 10, 6, 8, 2], [489, 3, 10, 7, 8, 2], [489, 54, 10, 3, 8, 2], [489, 105, 10, 6, 8, 2], [489, 156, 10, 6, 8, 2], [489, 207, 10, 7, 8, 2], [489, 260, 8, 2, 8, 4], [489, 309, 11, 7, 8, 2], [489, 360, 10, 6, 8, 2], [489, 411, 12, 6, 10, 2], [489, 462, 12, 6, 10, 2], [489, 513, 13, 3, 11, 2], [489, 564, 10, 2, 8, 2], [489, 616, 10, 1, 8, 3], [489, 667, 9, 5, 8, 3], [489, 717, 11, 6, 8, 2], [489, 768, 10, 6, 8, 2], [550, 5, 10, 3, 9, 4], [550, 55, 10, 5, 8, 3], [550, 106, 9, 5, 8, 3], [550, 157, 9, 5, 8, 3], [550, 207, 11, 6, 8, 2], [550, 260, 9, 5, 8, 4], [550, 309, 9, 6, 7, 2], [550, 360, 11, 7, 9, 2], [550, 411, 13, 7, 11, 2], [550, 463, 11, 5, 8, 3], [550, 513, 9, 8, 6, 2], [550, 564, 10, 6, 8, 2], [550, 615, 10, 6, 8, 2], [550, 666, 12, 6, 10, 2], [550, 719, 10, 4, 8, 4], [550, 770, 9, 4, 8, 4], [611, 5, 8, 6, 8, 4], [611, 56, 8, 6, 8, 4], [611, 108, 10, 2, 9, 5], [611, 156, 11, 6, 8, 2], [611, 207, 10, 8, 8, 2], [611, 259, 10, 5, 8, 3], [611, 309, 9, 6, 9, 2], [611, 363, 9, 3, 8, 5], [611, 414, 8, 3, 8, 5], [611, 467, 9, 1, 8, 7], [611, 511, 1, 1, 8, 1], [611, 563, 10, 7, 8, 1], [611, 614, 11, 7, 8, 1], [611, 665, 11, 7, 8, 1], [611, 717, 11, 6, 8, 2], [611, 770, 10, 4, 8, 4], [672, 6, 8, 1, 8, 5], [672, 57, 9, 1, 8, 5], [672, 105, 10, 3, 8, 2], [672, 156, 10, 3, 8, 2], [672, 207, 9, 3, 8, 2], [672, 258, 9, 3, 8, 2], [672, 310, 10, 5, 8, 3], [672, 360, 8, 6, 7, 2], [672, 411, 10, 8, 8, 2], [1, 1, 1, 1, 8, 1], [794, 766, 10, 2, 8, 0], [672, 565, 9, 4, 8, 3], [672, 618, 8, 3, 8, 5], [672, 669, 7, 3, 8, 5], [672, 717, 10, 6, 8, 2], [672, 768, 10, 6, 8, 2], [733, 3, 10, 7, 8, 2], [733, 57, 8, 1, 8, 5], [733, 110, 7, 3, 8, 7], [733, 161, 8, 3, 8, 7], [733, 205, 11, 8, 8, 0], [733, 256, 11, 8, 8, 0], [733, 307, 11, 8, 8, 0], [733, 358, 10, 8, 8, 0], [733, 409, 10, 8, 8, 0], [733, 460, 10, 8, 8, 0], [733, 511, 10, 8, 8, 0], [733, 562, 11, 8, 8, 0], [733, 613, 10, 8, 8, 0], [733, 664, 10, 8, 8, 0], [733, 715, 10, 8, 8, 0], [733, 766, 11, 8, 8, 0], [1, 1, 1, 1, 8, 1], [794, 52, 10, 8, 8, 0], [794, 103, 11, 8, 8, 0], [794, 154, 11, 8, 8, 0], [794, 205, 11, 8, 8, 0], [794, 260, 8, 4, 8, 4], [794, 309, 10, 2, 8, 2], [794, 360, 10, 2, 8, 2], [794, 411, 10, 1, 8, 2], [794, 462, 10, 2, 8, 2], [794, 513, 9, 1, 8, 2], [794, 564, 9, 1, 8, 2], [794, 619, 7, 4, 8, 6], [794, 666, 9, 2, 8, 2], [794, 721, 7, 4, 8, 6], [794, 766, 10, 2, 8, 0], [855, 1, 10, 2, 8, 0], [855, 52, 10, 2, 8, 0], [855, 103, 10, 2, 8, 0], [855, 154, 10, 2, 8, 0], [855, 205, 10, 2, 8, 0], [855, 256, 10, 2, 8, 0], [855, 307, 10, 2, 8, 0], [855, 358, 10, 2, 8, 0], [855, 409, 10, 2, 8, 0], [855, 460, 10, 2, 8, 0], [855, 511, 10, 2, 8, 0], [855, 562, 10, 2, 8, 0], [855, 613, 10, 2, 8, 0], [855, 664, 10, 2, 8, 0], [855, 715, 10, 2, 8, 0], [855, 766, 10, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 11, \"widestglyph\": 13, \"tallestglyph\": 8}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 9, 6, 9, 4], [1, 55, 9, 8, 9, 3], [1, 106, 9, 7, 9, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 10, 9, 2], [1, 259, 9, 8, 9, 3], [1, 310, 9, 8, 9, 3], [1, 361, 9, 7, 9, 3], [1, 412, 9, 9, 9, 3], [1, 463, 9, 9, 9, 3], [1, 514, 9, 7, 9, 3], [1, 566, 9, 7, 9, 4], [1, 617, 9, 9, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 7, 9, 4], [1, 769, 9, 8, 9, 3], [62, 4, 9, 8, 9, 3], [62, 55, 9, 8, 9, 3], [62, 106, 9, 8, 9, 3], [62, 157, 9, 8, 9, 3], [62, 208, 9, 8, 9, 3], [62, 259, 9, 8, 9, 3], [62, 310, 9, 8, 9, 3], [62, 361, 9, 8, 9, 3], [62, 412, 9, 8, 9, 3], [62, 463, 9, 8, 9, 3], [62, 515, 9, 7, 9, 4], [62, 566, 9, 9, 9, 4], [62, 617, 9, 7, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 7, 9, 4], [62, 769, 9, 8, 9, 3], [123, 4, 9, 9, 9, 3], [123, 55, 9, 8, 9, 3], [123, 106, 9, 8, 9, 3], [123, 157, 9, 8, 9, 3], [123, 208, 9, 8, 9, 3], [123, 259, 9, 8, 9, 3], [123, 310, 9, 8, 9, 3], [123, 361, 9, 8, 9, 3], [123, 412, 9, 8, 9, 3], [123, 463, 9, 8, 9, 3], [123, 514, 9, 8, 9, 3], [123, 565, 9, 8, 9, 3], [123, 616, 9, 8, 9, 3], [123, 667, 9, 8, 9, 3], [123, 718, 9, 8, 9, 3], [123, 769, 9, 8, 9, 3], [184, 4, 9, 8, 9, 3], [184, 55, 9, 9, 9, 3], [184, 106, 9, 8, 9, 3], [184, 157, 9, 8, 9, 3], [184, 208, 9, 8, 9, 3], [184, 259, 9, 8, 9, 3], [184, 310, 9, 8, 9, 3], [184, 361, 9, 8, 9, 3], [184, 412, 9, 8, 9, 3], [184, 463, 9, 8, 9, 3], [184, 514, 9, 8, 9, 3], [184, 565, 9, 10, 9, 3], [184, 616, 9, 8, 9, 3], [184, 667, 9, 10, 9, 3], [184, 718, 9, 7, 9, 3], [184, 770, 9, 9, 9, 4], [245, 4, 9, 7, 9, 3], [245, 56, 9, 7, 9, 4], [245, 106, 9, 8, 9, 3], [245, 158, 9, 7, 9, 4], [245, 208, 9, 8, 9, 3], [245, 260, 9, 7, 9, 4], [245, 310, 9, 8, 9, 3], [245, 362, 9, 9, 9, 4], [245, 412, 9, 8, 9, 3], [245, 463, 9, 8, 9, 3], [245, 514, 9, 10, 9, 3], [245, 565, 9, 8, 9, 3], [245, 616, 9, 8, 9, 3], [245, 668, 9, 7, 9, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 9, 9, 9, 4], [306, 107, 9, 7, 9, 4], [306, 158, 9, 7, 9, 4], [306, 209, 9, 7, 9, 4], [306, 260, 9, 7, 9, 4], [306, 311, 9, 7, 9, 4], [306, 362, 9, 7, 9, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 9, 7, 9, 4], [306, 565, 9, 9, 9, 3], [306, 616, 9, 9, 9, 3], [306, 667, 9, 9, 9, 3], [306, 719, 9, 6, 9, 4], [306, 770, 9, 6, 9, 4], [367, 3, 9, 9, 9, 2], [367, 54, 9, 9, 9, 2], [367, 106, 9, 10, 9, 3], [367, 156, 9, 9, 9, 2], [367, 207, 9, 9, 9, 2], [367, 258, 9, 9, 9, 2], [367, 309, 9, 9, 9, 2], [367, 361, 9, 8, 9, 3], [367, 412, 9, 8, 9, 3], [367, 462, 9, 9, 9, 2], [367, 514, 9, 8, 9, 3], [367, 564, 9, 9, 9, 2], [367, 615, 9, 9, 9, 2], [367, 668, 9, 9, 9, 4], [367, 718, 9, 8, 9, 3], [367, 769, 9, 8, 9, 3], [428, 3, 9, 9, 9, 2], [428, 55, 9, 8, 9, 3], [428, 105, 9, 9, 9, 2], [428, 156, 9, 9, 9, 2], [428, 207, 9, 9, 9, 2], [428, 259, 9, 8, 9, 3], [428, 309, 9, 9, 9, 2], [428, 360, 9, 9, 9, 2], [428, 411, 9, 9, 9, 2], [428, 462, 9, 9, 9, 2], [428, 514, 9, 8, 9, 3], [428, 564, 9, 9, 9, 2], [428, 615, 9, 9, 9, 2], [428, 666, 9, 9, 9, 2], [428, 717, 9, 9, 9, 2], [428, 769, 9, 8, 9, 3], [489, 4, 9, 9, 9, 3], [489, 55, 9, 7, 9, 3], [489, 106, 9, 8, 9, 3], [489, 157, 9, 8, 9, 3], [489, 208, 9, 9, 9, 3], [489, 260, 9, 6, 9, 4], [489, 310, 9, 9, 9, 3], [489, 361, 9, 8, 9, 3], [489, 412, 11, 8, 11, 3], [489, 463, 11, 8, 11, 3], [489, 514, 12, 7, 12, 3], [489, 565, 9, 7, 9, 3], [489, 617, 9, 6, 9, 4], [489, 668, 9, 7, 9, 4], [489, 718, 9, 8, 9, 3], [489, 769, 9, 8, 9, 3], [550, 5, 10, 6, 10, 4], [550, 56, 9, 7, 9, 4], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 208, 9, 8, 9, 3], [550, 260, 9, 8, 9, 4], [550, 310, 8, 8, 8, 3], [550, 361, 10, 9, 10, 3], [550, 412, 12, 9, 12, 3], [550, 464, 9, 7, 9, 4], [550, 514, 7, 10, 7, 3], [550, 565, 9, 8, 9, 3], [550, 616, 9, 8, 9, 3], [550, 667, 11, 8, 11, 3], [550, 719, 9, 7, 9, 4], [550, 770, 9, 7, 9, 4], [611, 5, 9, 9, 9, 4], [611, 56, 9, 9, 9, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 8, 9, 3], [611, 208, 9, 10, 9, 3], [611, 260, 9, 7, 9, 4], [611, 310, 10, 8, 10, 3], [611, 362, 9, 7, 9, 4], [611, 413, 9, 7, 9, 4], [611, 464, 9, 7, 9, 4], [611, 515, 9, 6, 9, 4], [611, 564, 9, 9, 9, 2], [611, 615, 9, 9, 9, 2], [611, 666, 9, 9, 9, 2], [611, 718, 9, 8, 9, 3], [611, 770, 9, 7, 9, 4], [672, 5, 9, 6, 9, 4], [672, 56, 9, 6, 9, 4], [672, 106, 9, 7, 9, 3], [672, 157, 9, 7, 9, 3], [672, 208, 9, 7, 9, 3], [672, 259, 9, 7, 9, 3], [672, 311, 9, 7, 9, 4], [672, 361, 8, 8, 8, 3], [672, 412, 9, 10, 9, 3], [1, 5, 9, 6, 9, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 9, 7, 9, 4], [672, 668, 9, 7, 9, 4], [672, 718, 9, 8, 9, 3], [672, 769, 9, 8, 9, 3], [733, 4, 9, 9, 9, 3], [733, 56, 9, 6, 9, 4], [733, 107, 9, 9, 9, 4], [733, 158, 9, 9, 9, 4], [733, 206, 9, 10, 9, 1], [733, 257, 9, 10, 9, 1], [733, 308, 9, 10, 9, 1], [733, 359, 9, 10, 9, 1], [733, 410, 9, 10, 9, 1], [733, 461, 9, 10, 9, 1], [733, 512, 9, 10, 9, 1], [733, 563, 9, 10, 9, 1], [733, 614, 9, 10, 9, 1], [733, 665, 9, 10, 9, 1], [733, 716, 9, 10, 9, 1], [733, 767, 9, 10, 9, 1], [1, 5, 9, 6, 9, 4], [794, 53, 9, 10, 9, 1], [794, 104, 9, 10, 9, 1], [794, 155, 9, 10, 9, 1], [794, 206, 9, 10, 9, 1], [794, 260, 9, 7, 9, 4], [794, 310, 9, 7, 9, 3], [794, 361, 9, 7, 9, 3], [794, 412, 9, 7, 9, 3], [794, 463, 9, 7, 9, 3], [794, 514, 9, 7, 9, 3], [794, 565, 9, 7, 9, 3], [794, 617, 9, 9, 9, 4], [794, 667, 9, 7, 9, 3], [794, 719, 9, 9, 9, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 8, 6, 8, 4], [1, 56, 8, 6, 8, 4], [1, 107, 8, 6, 8, 4], [1, 158, 8, 6, 8, 4], [1, 208, 8, 8, 8, 3], [1, 260, 8, 6, 8, 4], [1, 311, 8, 6, 8, 4], [1, 362, 8, 6, 8, 4], [1, 413, 8, 7, 8, 4], [1, 464, 8, 7, 8, 4], [1, 515, 8, 6, 8, 4], [1, 566, 8, 6, 8, 4], [1, 617, 8, 8, 8, 4], [1, 668, 8, 6, 8, 4], [1, 719, 8, 6, 8, 4], [1, 770, 8, 6, 8, 4], [62, 5, 8, 6, 8, 4], [62, 56, 8, 6, 8, 4], [62, 107, 8, 6, 8, 4], [62, 158, 8, 6, 8, 4], [62, 209, 8, 6, 8, 4], [62, 260, 8, 6, 8, 4], [62, 311, 8, 6, 8, 4], [62, 362, 8, 6, 8, 4], [62, 413, 8, 6, 8, 4], [62, 464, 8, 6, 8, 4], [62, 515, 8, 6, 8, 4], [62, 566, 8, 8, 8, 4], [62, 617, 8, 6, 8, 4], [62, 668, 8, 6, 8, 4], [62, 719, 8, 6, 8, 4], [62, 770, 8, 6, 8, 4], [123, 5, 8, 7, 8, 4], [123, 56, 8, 6, 8, 4], [123, 107, 8, 6, 8, 4], [123, 158, 8, 6, 8, 4], [123, 209, 8, 6, 8, 4], [123, 260, 8, 6, 8, 4], [123, 311, 8, 6, 8, 4], [123, 362, 8, 6, 8, 4], [123, 413, 8, 6, 8, 4], [123, 464, 8, 6, 8, 4], [123, 515, 8, 6, 8, 4], [123, 566, 8, 6, 8, 4], [123, 617, 8, 6, 8, 4], [123, 668, 8, 6, 8, 4], [123, 719, 8, 6, 8, 4], [123, 770, 8, 6, 8, 4], [184, 5, 8, 6, 8, 4], [184, 56, 8, 7, 8, 4], [184, 107, 8, 6, 8, 4], [184, 158, 8, 6, 8, 4], [184, 209, 8, 6, 8, 4], [184, 260, 8, 6, 8, 4], [184, 311, 8, 6, 8, 4], [184, 362, 8, 6, 8, 4], [184, 413, 8, 6, 8, 4], [184, 464, 8, 6, 8, 4], [184, 515, 8, 6, 8, 4], [184, 566, 8, 8, 8, 4], [184, 617, 8, 6, 8, 4], [184, 668, 8, 8, 8, 4], [184, 719, 8, 6, 8, 4], [184, 770, 8, 8, 8, 4], [245, 5, 8, 6, 8, 4], [245, 56, 8, 6, 8, 4], [245, 107, 8, 6, 8, 4], [245, 158, 8, 6, 8, 4], [245, 209, 8, 6, 8, 4], [245, 260, 8, 6, 8, 4], [245, 311, 8, 6, 8, 4], [245, 362, 8, 8, 8, 4], [245, 413, 8, 6, 8, 4], [245, 464, 8, 6, 8, 4], [245, 515, 8, 8, 8, 4], [245, 566, 8, 6, 8, 4], [245, 617, 8, 6, 8, 4], [245, 668, 8, 6, 8, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 8, 8, 8, 4], [306, 107, 8, 6, 8, 4], [306, 158, 8, 6, 8, 4], [306, 209, 8, 6, 8, 4], [306, 260, 8, 6, 8, 4], [306, 311, 8, 6, 8, 4], [306, 362, 8, 6, 8, 4], [306, 413, 8, 6, 8, 4], [306, 464, 8, 8, 8, 4], [306, 515, 8, 6, 8, 4], [306, 566, 8, 7, 8, 4], [306, 617, 8, 7, 8, 4], [306, 668, 8, 7, 8, 4], [306, 719, 8, 6, 8, 4], [306, 770, 8, 6, 8, 4], [367, 4, 8, 7, 8, 3], [367, 55, 8, 7, 8, 3], [367, 107, 8, 8, 8, 4], [367, 157, 8, 7, 8, 3], [367, 208, 8, 7, 8, 3], [367, 259, 8, 7, 8, 3], [367, 310, 8, 7, 8, 3], [367, 362, 8, 6, 8, 4], [367, 413, 8, 6, 8, 4], [367, 463, 8, 7, 8, 3], [367, 515, 8, 6, 8, 4], [367, 565, 8, 7, 8, 3], [367, 616, 8, 7, 8, 3], [367, 668, 8, 8, 8, 4], [367, 719, 8, 6, 8, 4], [367, 770, 8, 6, 8, 4], [428, 4, 8, 7, 8, 3], [428, 56, 8, 6, 8, 4], [428, 106, 8, 7, 8, 3], [428, 157, 8, 7, 8, 3], [428, 208, 8, 7, 8, 3], [428, 260, 8, 6, 8, 4], [428, 310, 8, 7, 8, 3], [428, 361, 8, 7, 8, 3], [428, 412, 8, 7, 8, 3], [428, 463, 8, 7, 8, 3], [428, 515, 8, 6, 8, 4], [428, 565, 8, 7, 8, 3], [428, 616, 8, 7, 8, 3], [428, 667, 8, 7, 8, 3], [428, 718, 8, 7, 8, 3], [428, 770, 8, 6, 8, 4], [489, 5, 8, 7, 8, 4], [489, 56, 8, 6, 8, 4], [489, 107, 8, 6, 8, 4], [489, 158, 8, 6, 8, 4], [489, 209, 8, 7, 8, 4], [489, 260, 8, 6, 8, 4], [489, 311, 8, 7, 8, 4], [489, 362, 8, 6, 8, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 11, 6, 11, 4], [489, 566, 8, 6, 8, 4], [489, 617, 8, 6, 8, 4], [489, 668, 8, 6, 8, 4], [489, 719, 8, 6, 8, 4], [489, 770, 8, 6, 8, 4], [550, 5, 9, 6, 9, 4], [550, 56, 8, 6, 8, 4], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 209, 8, 6, 8, 4], [550, 260, 8, 7, 8, 4], [550, 311, 7, 6, 7, 4], [550, 362, 9, 7, 9, 4], [550, 413, 11, 7, 11, 4], [550, 464, 8, 6, 8, 4], [550, 515, 6, 8, 6, 4], [550, 566, 8, 6, 8, 4], [550, 617, 8, 6, 8, 4], [550, 668, 10, 6, 10, 4], [550, 719, 8, 6, 8, 4], [550, 770, 8, 6, 8, 4], [611, 5, 8, 8, 8, 4], [611, 56, 8, 8, 8, 4], [611, 107, 9, 6, 9, 4], [611, 158, 8, 6, 8, 4], [611, 209, 8, 8, 8, 4], [611, 260, 8, 6, 8, 4], [611, 311, 9, 6, 9, 4], [611, 362, 8, 6, 8, 4], [611, 413, 8, 6, 8, 4], [611, 464, 8, 6, 8, 4], [611, 515, 8, 6, 8, 4], [611, 565, 8, 7, 8, 3], [611, 616, 8, 7, 8, 3], [611, 667, 8, 7, 8, 3], [611, 719, 8, 6, 8, 4], [611, 770, 8, 6, 8, 4], [672, 5, 8, 6, 8, 4], [672, 56, 8, 6, 8, 4], [672, 107, 8, 6, 8, 4], [672, 158, 8, 6, 8, 4], [672, 209, 8, 6, 8, 4], [672, 260, 8, 6, 8, 4], [672, 311, 8, 6, 8, 4], [672, 362, 7, 6, 7, 4], [672, 413, 8, 8, 8, 4], [1, 5, 8, 6, 8, 4], [794, 768, 8, 8, 8, 2], [672, 566, 8, 6, 8, 4], [672, 617, 8, 6, 8, 4], [672, 668, 8, 6, 8, 4], [672, 719, 8, 6, 8, 4], [672, 770, 8, 6, 8, 4], [733, 5, 8, 7, 8, 4], [733, 56, 8, 6, 8, 4], [733, 107, 8, 8, 8, 4], [733, 158, 8, 8, 8, 4], [733, 207, 8, 8, 8, 2], [733, 258, 8, 8, 8, 2], [733, 309, 8, 8, 8, 2], [733, 360, 8, 8, 8, 2], [733, 411, 8, 8, 8, 2], [733, 462, 8, 8, 8, 2], [733, 513, 8, 8, 8, 2], [733, 564, 8, 8, 8, 2], [733, 615, 8, 8, 8, 2], [733, 666, 8, 8, 8, 2], [733, 717, 8, 8, 8, 2], [733, 768, 8, 8, 8, 2], [1, 5, 8, 6, 8, 4], [794, 54, 8, 8, 8, 2], [794, 105, 8, 8, 8, 2], [794, 156, 8, 8, 8, 2], [794, 207, 8, 8, 8, 2], [794, 260, 8, 6, 8, 4], [794, 311, 8, 6, 8, 4], [794, 362, 8, 6, 8, 4], [794, 413, 8, 6, 8, 4], [794, 464, 8, 6, 8, 4], [794, 515, 8, 6, 8, 4], [794, 566, 8, 6, 8, 4], [794, 617, 8, 8, 8, 4], [794, 668, 8, 6, 8, 4], [794, 719, 8, 8, 8, 4], [794, 768, 8, 8, 8, 2], [855, 3, 8, 8, 8, 2], [855, 54, 8, 8, 8, 2], [855, 105, 8, 8, 8, 2], [855, 156, 8, 8, 8, 2], [855, 207, 8, 8, 8, 2], [855, 258, 8, 8, 8, 2], [855, 309, 8, 8, 8, 2], [855, 360, 8, 8, 8, 2], [855, 411, 8, 8, 8, 2], [855, 462, 8, 8, 8, 2], [855, 513, 8, 8, 8, 2], [855, 564, 8, 8, 8, 2], [855, 615, 8, 8, 8, 2], [855, 666, 8, 8, 8, 2], [855, 717, 8, 8, 8, 2], [855, 768, 8, 8, 8, 2]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 8}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 12, 10, 9, 2], [1, 105, 13, 4, 10, 2], [1, 156, 17, 7, 14, 2], [1, 206, 15, 12, 12, 1], [1, 258, 18, 10, 15, 2], [1, 309, 14, 10, 13, 2], [1, 360, 11, 4, 8, 2], [1, 410, 14, 12, 11, 1], [1, 461, 12, 12, 11, 1], [1, 513, 14, 7, 12, 2], [1, 566, 13, 7, 13, 4], [1, 622, 9, 5, 9, 9], [1, 670, 12, 3, 12, 6], [1, 724, 8, 3, 8, 9], [1, 768, 14, 10, 11, 2], [62, 3, 15, 10, 12, 2], [62, 54, 13, 10, 12, 2], [62, 105, 15, 10, 12, 2], [62, 156, 15, 10, 12, 2], [62, 207, 15, 10, 12, 2], [62, 258, 15, 10, 12, 2], [62, 309, 14, 10, 12, 2], [62, 360, 15, 10, 12, 2], [62, 411, 15, 10, 12, 2], [62, 462, 15, 10, 12, 2], [62, 516, 10, 7, 8, 5], [62, 567, 11, 9, 9, 5], [62, 617, 12, 7, 10, 4], [62, 669, 14, 5, 12, 5], [62, 719, 11, 7, 10, 4], [62, 768, 15, 10, 12, 2], [123, 4, 16, 9, 14, 3], [123, 54, 12, 10, 11, 2], [123, 105, 15, 10, 12, 2], [123, 156, 14, 10, 11, 2], [123, 207, 14, 10, 12, 2], [123, 258, 14, 10, 11, 2], [123, 309, 14, 10, 11, 2], [123, 360, 14, 10, 11, 2], [123, 411, 15, 10, 12, 2], [123, 462, 11, 10, 9, 2], [123, 513, 14, 10, 11, 2], [123, 564, 15, 10, 12, 2], [123, 615, 11, 10, 11, 2], [123, 666, 17, 10, 14, 2], [123, 717, 15, 10, 12, 2], [123, 768, 14, 10, 11, 2], [184, 3, 15, 10, 12, 2], [184, 54, 14, 11, 11, 2], [184, 105, 15, 10, 12, 2], [184, 156, 14, 10, 11, 2], [184, 207, 14, 10, 11, 2], [184, 258, 15, 10, 12, 2], [184, 309, 14, 10, 11, 2], [184, 360, 18, 10, 15, 2], [184, 411, 14, 10, 11, 2], [184, 462, 14, 10, 11, 2], [184, 513, 14, 10, 11, 2], [184, 563, 13, 12, 10, 1], [184, 615, 10, 10, 10, 2], [184, 665, 13, 12, 10, 1], [184, 717, 13, 4, 10, 2], [184, 775, 13, 3, 12, 9], [245, 3, 12, 4, 9, 2], [245, 56, 12, 8, 10, 4], [245, 105, 13, 10, 11, 2], [245, 158, 12, 8, 10, 4], [245, 207, 13, 10, 10, 2], [245, 260, 12, 8, 10, 4], [245, 309, 13, 10, 9, 2], [245, 362, 12, 10, 10, 4], [245, 411, 13, 10, 11, 2], [245, 462, 11, 10, 9, 2], [245, 513, 12, 12, 10, 2], [245, 564, 13, 10, 11, 2], [245, 615, 11, 10, 9, 2], [245, 668, 16, 8, 14, 4], [245, 719, 13, 8, 11, 4], [245, 770, 12, 8, 10, 4], [306, 5, 13, 10, 11, 4], [306, 56, 12, 10, 10, 4], [306, 107, 13, 8, 11, 4], [306, 158, 12, 8, 10, 4], [306, 207, 11, 10, 9, 2], [306, 260, 13, 8, 11, 4], [306, 311, 13, 8, 11, 4], [306, 362, 15, 8, 13, 4], [306, 413, 13, 8, 11, 4], [306, 464, 13, 10, 11, 4], [306, 515, 12, 8, 10, 4], [306, 563, 13, 13, 10, 1], [306, 614, 12, 13, 9, 1], [306, 665, 12, 13, 10, 1], [306, 717, 15, 4, 12, 2], [306, 766, 1, 1, 3, 1], [367, 1, 14, 12, 11, 0], [367, 52, 15, 12, 11, 0], [367, 105, 14, 12, 11, 2], [367, 154, 14, 12, 11, 0], [367, 205, 16, 12, 12, 0], [367, 256, 14, 12, 11, 0], [367, 307, 15, 12, 12, 0], [367, 359, 13, 11, 10, 1], [367, 410, 12, 11, 10, 1], [367, 461, 13, 11, 10, 1], [367, 513, 13, 10, 10, 2], [367, 563, 15, 11, 11, 1], [367, 614, 13, 11, 10, 1], [367, 668, 12, 10, 10, 4], [367, 716, 13, 11, 10, 1], [367, 767, 12, 11, 10, 1], [428, 2, 13, 11, 10, 1], [428, 54, 13, 10, 10, 2], [428, 104, 13, 11, 9, 1], [428, 155, 12, 11, 9, 1], [428, 206, 13, 11, 10, 1], [428, 258, 12, 10, 9, 2], [428, 308, 15, 11, 11, 1], [428, 359, 13, 11, 10, 1], [428, 410, 12, 11, 10, 1], [428, 461, 13, 11, 10, 1], [428, 513, 13, 10, 10, 2], [428, 563, 15, 11, 11, 1], [428, 614, 14, 11, 11, 1], [428, 665, 13, 11, 11, 1], [428, 716, 14, 11, 11, 1], [428, 768, 14, 10, 11, 2], [489, 2, 13, 7, 10, 1], [489, 54, 13, 6, 10, 2], [489, 106, 13, 10, 11, 3], [489, 156, 14, 10, 12, 2], [489, 206, 14, 11, 11, 1], [489, 260, 13, 7, 11, 4], [489, 309, 14, 10, 11, 2], [489, 360, 15, 10, 12, 2], [489, 411, 17, 10, 15, 2], [489, 462, 17, 10, 15, 2], [489, 513, 17, 6, 14, 2], [489, 564, 11, 4, 8, 2], [489, 615, 12, 3, 9, 2], [489, 668, 14, 7, 12, 4], [489, 717, 17, 10, 14, 2], [489, 768, 16, 10, 13, 2], [550, 5, 18, 7, 16, 4], [550, 56, 13, 8, 12, 4], [550, 107, 13, 8, 12, 4], [550, 158, 12, 8, 12, 4], [550, 207, 15, 10, 12, 2], [550, 260, 13, 9, 12, 4], [550, 310, 12, 9, 10, 3], [550, 360, 15, 10, 12, 2], [550, 411, 15, 10, 12, 2], [550, 463, 16, 9, 13, 3], [550, 511, 14, 14, 10, 0], [550, 564, 13, 8, 10, 2], [550, 615, 13, 8, 10, 2], [550, 666, 15, 10, 13, 2], [550, 719, 15, 8, 13, 4], [550, 770, 14, 8, 12, 4], [611, 3, 12, 10, 12, 2], [611, 54, 12, 10, 9, 2], [611, 109, 13, 5, 12, 6], [611, 156, 17, 10, 14, 2], [611, 205, 14, 14, 10, 0], [611, 260, 15, 6, 12, 4], [611, 311, 12, 8, 12, 4], [611, 363, 14, 7, 13, 5], [611, 414, 14, 7, 12, 5], [611, 469, 14, 3, 14, 9], [611, 511, 1, 1, 12, 1], [611, 562, 14, 12, 11, 0], [611, 613, 16, 12, 12, 0], [611, 664, 16, 12, 12, 0], [611, 717, 17, 10, 14, 2], [611, 770, 15, 8, 13, 4], [672, 7, 12, 3, 11, 6], [672, 58, 15, 3, 14, 6], [672, 105, 15, 5, 12, 2], [672, 156, 15, 5, 12, 2], [672, 207, 12, 5, 9, 2], [672, 258, 12, 5, 9, 2], [672, 311, 13, 7, 13, 4], [672, 361, 15, 9, 14, 3], [672, 411, 14, 12, 11, 2], [1, 1, 1, 1, 8, 1], [794, 768, 16, 10, 13, 2], [672, 564, 16, 10, 13, 2], [672, 615, 16, 10, 13, 2], [672, 666, 16, 10, 13, 2], [672, 717, 16, 10, 13, 2], [672, 768, 16, 10, 13, 2], [733, 3, 16, 10, 13, 2], [733, 54, 16, 10, 13, 2], [733, 105, 16, 10, 13, 2], [733, 156, 16, 10, 13, 2], [733, 207, 16, 10, 13, 2], [733, 258, 16, 10, 13, 2], [733, 309, 16, 10, 13, 2], [733, 360, 16, 10, 13, 2], [733, 411, 16, 10, 13, 2], [733, 462, 16, 10, 13, 2], [733, 513, 16, 10, 13, 2], [733, 564, 16, 10, 13, 2], [733, 615, 16, 10, 13, 2], [733, 666, 16, 10, 13, 2], [733, 717, 16, 10, 13, 2], [733, 768, 16, 10, 13, 2], [1, 1, 1, 1, 8, 1], [794, 54, 16, 10, 13, 2], [794, 105, 16, 10, 13, 2], [794, 156, 16, 10, 13, 2], [794, 207, 16, 10, 13, 2], [794, 258, 16, 10, 13, 2], [794, 309, 16, 10, 13, 2], [794, 360, 16, 10, 13, 2], [794, 411, 16, 10, 13, 2], [794, 462, 16, 10, 13, 2], [794, 513, 16, 10, 13, 2], [794, 564, 16, 10, 13, 2], [794, 615, 16, 10, 13, 2], [794, 666, 16, 10, 13, 2], [794, 717, 16, 10, 13, 2], [794, 768, 16, 10, 13, 2], [855, 3, 16, 10, 13, 2], [855, 54, 16, 10, 13, 2], [855, 105, 16, 10, 13, 2], [855, 156, 16, 10, 13, 2], [855, 207, 16, 10, 13, 2], [855, 258, 16, 10, 13, 2], [855, 309, 16, 10, 13, 2], [855, 360, 16, 10, 13, 2], [855, 411, 16, 10, 13, 2], [855, 462, 16, 10, 13, 2], [855, 513, 16, 10, 13, 2], [855, 564, 16, 10, 13, 2], [855, 615, 16, 10, 13, 2], [855, 666, 16, 10, 13, 2], [855, 717, 16, 10, 13, 2], [855, 768, 16, 10, 13, 2]], \"capHeight\": 11, \"widestlogicalchar\": 16, \"widestglyph\": 18, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 8, 8, 2], [1, 105, 12, 2, 9, 2], [1, 156, 16, 5, 13, 2], [1, 206, 14, 10, 11, 1], [1, 258, 17, 8, 14, 2], [1, 309, 13, 8, 12, 2], [1, 360, 10, 2, 7, 2], [1, 410, 13, 10, 10, 1], [1, 461, 11, 10, 10, 1], [1, 513, 13, 5, 11, 2], [1, 566, 12, 5, 12, 4], [1, 622, 8, 3, 8, 9], [1, 670, 11, 1, 11, 6], [1, 724, 7, 1, 7, 9], [1, 768, 13, 8, 10, 2], [62, 3, 14, 8, 11, 2], [62, 54, 12, 8, 11, 2], [62, 105, 14, 8, 11, 2], [62, 156, 14, 8, 11, 2], [62, 207, 14, 8, 11, 2], [62, 258, 14, 8, 11, 2], [62, 309, 13, 8, 11, 2], [62, 360, 14, 8, 11, 2], [62, 411, 14, 8, 11, 2], [62, 462, 14, 8, 11, 2], [62, 516, 9, 5, 7, 5], [62, 567, 10, 7, 8, 5], [62, 617, 11, 5, 9, 4], [62, 669, 13, 3, 11, 5], [62, 719, 10, 5, 9, 4], [62, 768, 14, 8, 11, 2], [123, 4, 15, 7, 13, 3], [123, 54, 11, 8, 10, 2], [123, 105, 14, 8, 11, 2], [123, 156, 13, 8, 10, 2], [123, 207, 13, 8, 11, 2], [123, 258, 13, 8, 10, 2], [123, 309, 13, 8, 10, 2], [123, 360, 13, 8, 10, 2], [123, 411, 14, 8, 11, 2], [123, 462, 10, 8, 8, 2], [123, 513, 13, 8, 10, 2], [123, 564, 14, 8, 11, 2], [123, 615, 10, 8, 10, 2], [123, 666, 16, 8, 13, 2], [123, 717, 14, 8, 11, 2], [123, 768, 13, 8, 10, 2], [184, 3, 14, 8, 11, 2], [184, 54, 13, 9, 10, 2], [184, 105, 14, 8, 11, 2], [184, 156, 13, 8, 10, 2], [184, 207, 13, 8, 10, 2], [184, 258, 14, 8, 11, 2], [184, 309, 13, 8, 10, 2], [184, 360, 17, 8, 14, 2], [184, 411, 13, 8, 10, 2], [184, 462, 13, 8, 10, 2], [184, 513, 13, 8, 10, 2], [184, 563, 12, 10, 9, 1], [184, 615, 9, 8, 9, 2], [184, 665, 12, 10, 9, 1], [184, 717, 12, 2, 9, 2], [184, 775, 12, 1, 11, 9], [245, 3, 11, 2, 8, 2], [245, 56, 11, 6, 9, 4], [245, 105, 12, 8, 10, 2], [245, 158, 11, 6, 9, 4], [245, 207, 12, 8, 9, 2], [245, 260, 11, 6, 9, 4], [245, 309, 12, 8, 8, 2], [245, 362, 11, 8, 9, 4], [245, 411, 12, 8, 10, 2], [245, 462, 10, 8, 8, 2], [245, 513, 11, 10, 9, 2], [245, 564, 12, 8, 10, 2], [245, 615, 10, 8, 8, 2], [245, 668, 15, 6, 13, 4], [245, 719, 12, 6, 10, 4], [245, 770, 11, 6, 9, 4], [306, 5, 12, 8, 10, 4], [306, 56, 11, 8, 9, 4], [306, 107, 12, 6, 10, 4], [306, 158, 11, 6, 9, 4], [306, 207, 10, 8, 8, 2], [306, 260, 12, 6, 10, 4], [306, 311, 12, 6, 10, 4], [306, 362, 14, 6, 12, 4], [306, 413, 12, 6, 10, 4], [306, 464, 12, 8, 10, 4], [306, 515, 11, 6, 9, 4], [306, 563, 12, 11, 9, 1], [306, 614, 11, 11, 8, 1], [306, 665, 11, 11, 9, 1], [306, 717, 14, 2, 11, 2], [306, 766, 1, 1, 3, 1], [367, 1, 11, 10, 10, 0], [367, 52, 14, 10, 10, 0], [367, 105, 13, 10, 10, 2], [367, 154, 13, 10, 10, 0], [367, 205, 14, 10, 11, 0], [367, 256, 13, 10, 10, 0], [367, 307, 14, 10, 11, 0], [367, 359, 12, 9, 9, 1], [367, 410, 11, 9, 9, 1], [367, 461, 12, 9, 9, 1], [367, 513, 12, 8, 9, 2], [367, 563, 14, 9, 10, 1], [367, 614, 12, 9, 9, 1], [367, 668, 11, 8, 9, 4], [367, 716, 12, 9, 9, 1], [367, 767, 11, 9, 9, 1], [428, 2, 12, 9, 9, 1], [428, 54, 12, 8, 9, 2], [428, 104, 12, 9, 8, 1], [428, 155, 11, 9, 8, 1], [428, 206, 12, 9, 9, 1], [428, 258, 11, 8, 8, 2], [428, 308, 14, 9, 10, 1], [428, 359, 12, 9, 9, 1], [428, 410, 11, 9, 9, 1], [428, 461, 12, 9, 9, 1], [428, 513, 12, 8, 9, 2], [428, 563, 14, 9, 10, 1], [428, 614, 13, 9, 10, 1], [428, 665, 12, 9, 10, 1], [428, 716, 13, 9, 10, 1], [428, 768, 13, 8, 10, 2], [489, 2, 12, 5, 9, 1], [489, 54, 12, 4, 9, 2], [489, 106, 12, 8, 10, 3], [489, 156, 13, 8, 11, 2], [489, 206, 13, 9, 10, 1], [489, 260, 12, 5, 10, 4], [489, 309, 13, 8, 10, 2], [489, 360, 14, 8, 11, 2], [489, 411, 16, 8, 14, 2], [489, 462, 16, 8, 14, 2], [489, 513, 16, 4, 13, 2], [489, 564, 10, 2, 7, 2], [489, 615, 11, 1, 8, 2], [489, 668, 13, 5, 11, 4], [489, 717, 16, 8, 13, 2], [489, 768, 15, 8, 12, 2], [550, 5, 17, 5, 15, 4], [550, 56, 12, 6, 11, 4], [550, 107, 12, 6, 11, 4], [550, 158, 11, 6, 11, 4], [550, 207, 14, 8, 11, 2], [550, 260, 12, 7, 11, 4], [550, 310, 11, 7, 9, 3], [550, 360, 14, 8, 11, 2], [550, 411, 14, 8, 11, 2], [550, 463, 15, 7, 12, 3], [550, 511, 12, 12, 9, 0], [550, 564, 12, 6, 9, 2], [550, 615, 12, 6, 9, 2], [550, 666, 14, 8, 12, 2], [550, 719, 14, 6, 12, 4], [550, 770, 13, 6, 11, 4], [611, 3, 11, 8, 11, 2], [611, 54, 11, 8, 8, 2], [611, 109, 12, 3, 11, 6], [611, 156, 16, 8, 13, 2], [611, 205, 12, 12, 9, 0], [611, 260, 14, 4, 11, 4], [611, 311, 11, 6, 11, 4], [611, 363, 13, 5, 12, 5], [611, 414, 13, 5, 11, 5], [611, 469, 13, 1, 13, 9], [611, 511, 1, 1, 11, 1], [611, 562, 13, 10, 10, 0], [611, 613, 14, 10, 11, 0], [611, 664, 14, 10, 11, 0], [611, 717, 16, 8, 13, 2], [611, 770, 14, 6, 12, 4], [672, 7, 11, 1, 10, 6], [672, 58, 14, 1, 13, 6], [672, 105, 14, 3, 11, 2], [672, 156, 14, 3, 11, 2], [672, 207, 11, 3, 8, 2], [672, 258, 11, 3, 8, 2], [672, 311, 12, 5, 12, 4], [672, 361, 14, 7, 13, 3], [672, 411, 13, 10, 10, 2], [1, 1, 1, 1, 7, 1], [794, 768, 15, 8, 12, 2], [672, 564, 15, 8, 12, 2], [672, 615, 15, 8, 12, 2], [672, 666, 15, 8, 12, 2], [672, 717, 15, 8, 12, 2], [672, 768, 15, 8, 12, 2], [733, 3, 15, 8, 12, 2], [733, 54, 15, 8, 12, 2], [733, 105, 15, 8, 12, 2], [733, 156, 15, 8, 12, 2], [733, 207, 15, 8, 12, 2], [733, 258, 15, 8, 12, 2], [733, 309, 15, 8, 12, 2], [733, 360, 15, 8, 12, 2], [733, 411, 15, 8, 12, 2], [733, 462, 15, 8, 12, 2], [733, 513, 15, 8, 12, 2], [733, 564, 15, 8, 12, 2], [733, 615, 15, 8, 12, 2], [733, 666, 15, 8, 12, 2], [733, 717, 15, 8, 12, 2], [733, 768, 15, 8, 12, 2], [1, 1, 1, 1, 7, 1], [794, 54, 15, 8, 12, 2], [794, 105, 15, 8, 12, 2], [794, 156, 15, 8, 12, 2], [794, 207, 15, 8, 12, 2], [794, 258, 15, 8, 12, 2], [794, 309, 15, 8, 12, 2], [794, 360, 15, 8, 12, 2], [794, 411, 15, 8, 12, 2], [794, 462, 15, 8, 12, 2], [794, 513, 15, 8, 12, 2], [794, 564, 15, 8, 12, 2], [794, 615, 15, 8, 12, 2], [794, 666, 15, 8, 12, 2], [794, 717, 15, 8, 12, 2], [794, 768, 15, 8, 12, 2], [855, 3, 15, 8, 12, 2], [855, 54, 15, 8, 12, 2], [855, 105, 15, 8, 12, 2], [855, 156, 15, 8, 12, 2], [855, 207, 15, 8, 12, 2], [855, 258, 15, 8, 12, 2], [855, 309, 15, 8, 12, 2], [855, 360, 15, 8, 12, 2], [855, 411, 15, 8, 12, 2], [855, 462, 15, 8, 12, 2], [855, 513, 15, 8, 12, 2], [855, 564, 15, 8, 12, 2], [855, 615, 15, 8, 12, 2], [855, 666, 15, 8, 12, 2], [855, 717, 15, 8, 12, 2], [855, 768, 15, 8, 12, 2]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 54, 9, 10, 9, 2], [1, 105, 10, 9, 10, 2], [1, 156, 14, 9, 14, 2], [1, 206, 12, 12, 12, 1], [1, 258, 15, 10, 15, 2], [1, 309, 13, 10, 13, 2], [1, 360, 8, 9, 8, 2], [1, 410, 11, 12, 11, 1], [1, 461, 11, 12, 11, 1], [1, 513, 12, 9, 12, 2], [1, 566, 13, 7, 13, 4], [1, 618, 9, 9, 9, 5], [1, 669, 12, 6, 12, 5], [1, 720, 8, 7, 8, 5], [1, 768, 11, 10, 11, 2], [62, 3, 12, 10, 12, 2], [62, 54, 12, 10, 12, 2], [62, 105, 12, 10, 12, 2], [62, 156, 12, 10, 12, 2], [62, 207, 12, 10, 12, 2], [62, 258, 12, 10, 12, 2], [62, 309, 12, 10, 12, 2], [62, 360, 12, 10, 12, 2], [62, 411, 12, 10, 12, 2], [62, 462, 12, 10, 12, 2], [62, 516, 8, 7, 8, 5], [62, 567, 9, 9, 9, 5], [62, 617, 10, 7, 10, 4], [62, 669, 12, 6, 12, 5], [62, 719, 10, 7, 10, 4], [62, 768, 12, 10, 12, 2], [123, 4, 14, 9, 14, 3], [123, 54, 11, 10, 11, 2], [123, 105, 12, 10, 12, 2], [123, 156, 11, 10, 11, 2], [123, 207, 12, 10, 12, 2], [123, 258, 11, 10, 11, 2], [123, 309, 11, 10, 11, 2], [123, 360, 11, 10, 11, 2], [123, 411, 12, 10, 12, 2], [123, 462, 9, 10, 9, 2], [123, 513, 11, 10, 11, 2], [123, 564, 12, 10, 12, 2], [123, 615, 11, 10, 11, 2], [123, 666, 14, 10, 14, 2], [123, 717, 12, 10, 12, 2], [123, 768, 11, 10, 11, 2], [184, 3, 12, 10, 12, 2], [184, 54, 11, 11, 11, 2], [184, 105, 12, 10, 12, 2], [184, 156, 11, 10, 11, 2], [184, 207, 11, 10, 11, 2], [184, 258, 12, 10, 12, 2], [184, 309, 11, 10, 11, 2], [184, 360, 15, 10, 15, 2], [184, 411, 11, 10, 11, 2], [184, 462, 11, 10, 11, 2], [184, 513, 11, 10, 11, 2], [184, 563, 10, 12, 10, 1], [184, 615, 10, 10, 10, 2], [184, 665, 10, 12, 10, 1], [184, 717, 10, 9, 10, 2], [184, 771, 12, 7, 12, 5], [245, 3, 9, 9, 9, 2], [245, 56, 10, 8, 10, 4], [245, 105, 11, 10, 11, 2], [245, 158, 10, 8, 10, 4], [245, 207, 10, 10, 10, 2], [245, 260, 10, 8, 10, 4], [245, 309, 9, 10, 9, 2], [245, 362, 10, 10, 10, 4], [245, 411, 11, 10, 11, 2], [245, 462, 9, 10, 9, 2], [245, 513, 10, 12, 10, 2], [245, 564, 11, 10, 11, 2], [245, 615, 9, 10, 9, 2], [245, 668, 14, 8, 14, 4], [245, 719, 11, 8, 11, 4], [245, 770, 10, 8, 10, 4], [306, 5, 11, 10, 11, 4], [306, 56, 10, 10, 10, 4], [306, 107, 11, 8, 11, 4], [306, 158, 10, 8, 10, 4], [306, 207, 9, 10, 9, 2], [306, 260, 11, 8, 11, 4], [306, 311, 11, 8, 11, 4], [306, 362, 13, 8, 13, 4], [306, 413, 11, 8, 11, 4], [306, 464, 11, 10, 11, 4], [306, 515, 10, 8, 10, 4], [306, 563, 10, 13, 10, 1], [306, 614, 9, 13, 9, 1], [306, 665, 10, 13, 10, 1], [306, 717, 12, 9, 12, 2], [306, 771, 3, 6, 3, 5], [367, 1, 11, 12, 11, 0], [367, 52, 11, 12, 11, 0], [367, 105, 11, 12, 11, 2], [367, 154, 11, 12, 11, 0], [367, 205, 12, 12, 12, 0], [367, 256, 11, 12, 11, 0], [367, 307, 12, 12, 12, 0], [367, 359, 10, 11, 10, 1], [367, 410, 10, 11, 10, 1], [367, 461, 10, 11, 10, 1], [367, 513, 10, 10, 10, 2], [367, 563, 11, 11, 11, 1], [367, 614, 10, 11, 10, 1], [367, 668, 10, 10, 10, 4], [367, 716, 10, 11, 10, 1], [367, 767, 10, 11, 10, 1], [428, 2, 10, 11, 10, 1], [428, 54, 10, 10, 10, 2], [428, 104, 9, 11, 9, 1], [428, 155, 9, 11, 9, 1], [428, 206, 10, 11, 10, 1], [428, 258, 9, 10, 9, 2], [428, 308, 11, 11, 11, 1], [428, 359, 10, 11, 10, 1], [428, 410, 10, 11, 10, 1], [428, 461, 10, 11, 10, 1], [428, 513, 10, 10, 10, 2], [428, 563, 11, 11, 11, 1], [428, 614, 11, 11, 11, 1], [428, 665, 11, 11, 11, 1], [428, 716, 11, 11, 11, 1], [428, 768, 11, 10, 11, 2], [489, 2, 10, 10, 10, 1], [489, 54, 10, 9, 10, 2], [489, 106, 11, 10, 11, 3], [489, 156, 12, 10, 12, 2], [489, 206, 11, 11, 11, 1], [489, 260, 11, 7, 11, 4], [489, 309, 11, 10, 11, 2], [489, 360, 12, 10, 12, 2], [489, 411, 15, 10, 15, 2], [489, 462, 15, 10, 15, 2], [489, 513, 14, 9, 14, 2], [489, 564, 8, 9, 8, 2], [489, 615, 9, 9, 9, 2], [489, 668, 12, 7, 12, 4], [489, 717, 14, 10, 14, 2], [489, 768, 13, 10, 13, 2], [550, 5, 16, 7, 16, 4], [550, 56, 12, 8, 12, 4], [550, 107, 12, 8, 12, 4], [550, 158, 12, 8, 12, 4], [550, 207, 12, 10, 12, 2], [550, 260, 12, 9, 12, 4], [550, 310, 10, 9, 10, 3], [550, 360, 12, 10, 12, 2], [550, 411, 12, 10, 12, 2], [550, 463, 13, 9, 13, 3], [550, 511, 10, 14, 10, 0], [550, 564, 10, 9, 10, 2], [550, 615, 10, 9, 10, 2], [550, 666, 13, 10, 13, 2], [550, 719, 13, 8, 13, 4], [550, 770, 12, 8, 12, 4], [611, 3, 12, 10, 12, 2], [611, 54, 9, 10, 9, 2], [611, 108, 12, 6, 12, 5], [611, 156, 14, 10, 14, 2], [611, 205, 10, 14, 10, 0], [611, 260, 12, 7, 12, 4], [611, 311, 12, 8, 12, 4], [611, 363, 13, 7, 13, 5], [611, 414, 12, 7, 12, 5], [611, 465, 14, 7, 14, 5], [611, 516, 12, 6, 12, 5], [611, 562, 11, 12, 11, 0], [611, 613, 12, 12, 12, 0], [611, 664, 12, 12, 12, 0], [611, 717, 14, 10, 14, 2], [611, 770, 13, 8, 13, 4], [672, 6, 11, 6, 11, 5], [672, 57, 14, 6, 14, 5], [672, 105, 12, 9, 12, 2], [672, 156, 12, 9, 12, 2], [672, 207, 9, 9, 9, 2], [672, 258, 9, 9, 9, 2], [672, 311, 13, 7, 13, 4], [672, 361, 14, 9, 14, 3], [672, 411, 11, 12, 11, 2], [1, 6, 8, 6, 8, 5], [794, 768, 13, 10, 13, 2], [672, 564, 13, 10, 13, 2], [672, 615, 13, 10, 13, 2], [672, 666, 13, 10, 13, 2], [672, 717, 13, 10, 13, 2], [672, 768, 13, 10, 13, 2], [733, 3, 13, 10, 13, 2], [733, 54, 13, 10, 13, 2], [733, 105, 13, 10, 13, 2], [733, 156, 13, 10, 13, 2], [733, 207, 13, 10, 13, 2], [733, 258, 13, 10, 13, 2], [733, 309, 13, 10, 13, 2], [733, 360, 13, 10, 13, 2], [733, 411, 13, 10, 13, 2], [733, 462, 13, 10, 13, 2], [733, 513, 13, 10, 13, 2], [733, 564, 13, 10, 13, 2], [733, 615, 13, 10, 13, 2], [733, 666, 13, 10, 13, 2], [733, 717, 13, 10, 13, 2], [733, 768, 13, 10, 13, 2], [1, 6, 8, 6, 8, 5], [794, 54, 13, 10, 13, 2], [794, 105, 13, 10, 13, 2], [794, 156, 13, 10, 13, 2], [794, 207, 13, 10, 13, 2], [794, 258, 13, 10, 13, 2], [794, 309, 13, 10, 13, 2], [794, 360, 13, 10, 13, 2], [794, 411, 13, 10, 13, 2], [794, 462, 13, 10, 13, 2], [794, 513, 13, 10, 13, 2], [794, 564, 13, 10, 13, 2], [794, 615, 13, 10, 13, 2], [794, 666, 13, 10, 13, 2], [794, 717, 13, 10, 13, 2], [794, 768, 13, 10, 13, 2], [855, 3, 13, 10, 13, 2], [855, 54, 13, 10, 13, 2], [855, 105, 13, 10, 13, 2], [855, 156, 13, 10, 13, 2], [855, 207, 13, 10, 13, 2], [855, 258, 13, 10, 13, 2], [855, 309, 13, 10, 13, 2], [855, 360, 13, 10, 13, 2], [855, 411, 13, 10, 13, 2], [855, 462, 13, 10, 13, 2], [855, 513, 13, 10, 13, 2], [855, 564, 13, 10, 13, 2], [855, 615, 13, 10, 13, 2], [855, 666, 13, 10, 13, 2], [855, 717, 13, 10, 13, 2], [855, 768, 13, 10, 13, 2]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 8, 8, 8, 2], [1, 105, 9, 8, 9, 2], [1, 156, 13, 8, 13, 2], [1, 206, 11, 10, 11, 1], [1, 258, 14, 8, 14, 2], [1, 309, 12, 8, 12, 2], [1, 360, 7, 8, 7, 2], [1, 410, 10, 10, 10, 1], [1, 461, 10, 10, 10, 1], [1, 513, 11, 8, 11, 2], [1, 566, 12, 6, 12, 4], [1, 617, 8, 8, 8, 4], [1, 668, 11, 6, 11, 4], [1, 719, 7, 6, 7, 4], [1, 768, 10, 8, 10, 2], [62, 3, 11, 8, 11, 2], [62, 54, 11, 8, 11, 2], [62, 105, 11, 8, 11, 2], [62, 156, 11, 8, 11, 2], [62, 207, 11, 8, 11, 2], [62, 258, 11, 8, 11, 2], [62, 309, 11, 8, 11, 2], [62, 360, 11, 8, 11, 2], [62, 411, 11, 8, 11, 2], [62, 462, 11, 8, 11, 2], [62, 515, 7, 6, 7, 4], [62, 566, 8, 8, 8, 4], [62, 617, 9, 6, 9, 4], [62, 668, 11, 6, 11, 4], [62, 719, 9, 6, 9, 4], [62, 768, 11, 8, 11, 2], [123, 4, 13, 7, 13, 3], [123, 54, 10, 8, 10, 2], [123, 105, 11, 8, 11, 2], [123, 156, 10, 8, 10, 2], [123, 207, 11, 8, 11, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 10, 8, 10, 2], [123, 411, 11, 8, 11, 2], [123, 462, 8, 8, 8, 2], [123, 513, 10, 8, 10, 2], [123, 564, 11, 8, 11, 2], [123, 615, 10, 8, 10, 2], [123, 666, 13, 8, 13, 2], [123, 717, 11, 8, 11, 2], [123, 768, 10, 8, 10, 2], [184, 3, 11, 8, 11, 2], [184, 54, 10, 9, 10, 2], [184, 105, 11, 8, 11, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 11, 8, 11, 2], [184, 309, 10, 8, 10, 2], [184, 360, 14, 8, 14, 2], [184, 411, 10, 8, 10, 2], [184, 462, 10, 8, 10, 2], [184, 513, 10, 8, 10, 2], [184, 563, 9, 10, 9, 1], [184, 615, 9, 8, 9, 2], [184, 665, 9, 10, 9, 1], [184, 717, 9, 8, 9, 2], [184, 770, 11, 6, 11, 4], [245, 3, 8, 8, 8, 2], [245, 56, 9, 6, 9, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 9, 8, 9, 2], [245, 260, 9, 6, 9, 4], [245, 309, 8, 8, 8, 2], [245, 362, 9, 8, 9, 4], [245, 411, 10, 8, 10, 2], [245, 462, 8, 8, 8, 2], [245, 513, 9, 10, 9, 2], [245, 564, 10, 8, 10, 2], [245, 615, 8, 8, 8, 2], [245, 668, 13, 6, 13, 4], [245, 719, 10, 6, 10, 4], [245, 770, 9, 6, 9, 4], [306, 5, 10, 8, 10, 4], [306, 56, 9, 8, 9, 4], [306, 107, 10, 6, 10, 4], [306, 158, 9, 6, 9, 4], [306, 207, 8, 8, 8, 2], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 12, 6, 12, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 9, 6, 9, 4], [306, 563, 9, 11, 9, 1], [306, 614, 8, 11, 8, 1], [306, 665, 9, 11, 9, 1], [306, 717, 11, 8, 11, 2], [306, 770, 3, 6, 3, 4], [367, 1, 10, 10, 10, 0], [367, 52, 10, 10, 10, 0], [367, 105, 10, 10, 10, 2], [367, 154, 10, 10, 10, 0], [367, 205, 11, 10, 11, 0], [367, 256, 10, 10, 10, 0], [367, 307, 11, 10, 11, 0], [367, 359, 9, 9, 9, 1], [367, 410, 9, 9, 9, 1], [367, 461, 9, 9, 9, 1], [367, 513, 9, 8, 9, 2], [367, 563, 10, 9, 10, 1], [367, 614, 9, 9, 9, 1], [367, 668, 9, 8, 9, 4], [367, 716, 9, 9, 9, 1], [367, 767, 9, 9, 9, 1], [428, 2, 9, 9, 9, 1], [428, 54, 9, 8, 9, 2], [428, 104, 8, 9, 8, 1], [428, 155, 8, 9, 8, 1], [428, 206, 9, 9, 9, 1], [428, 258, 8, 8, 8, 2], [428, 308, 10, 9, 10, 1], [428, 359, 9, 9, 9, 1], [428, 410, 9, 9, 9, 1], [428, 461, 9, 9, 9, 1], [428, 513, 9, 8, 9, 2], [428, 563, 10, 9, 10, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 2, 9, 9, 9, 1], [489, 54, 9, 8, 9, 2], [489, 106, 10, 8, 10, 3], [489, 156, 11, 8, 11, 2], [489, 206, 10, 9, 10, 1], [489, 260, 10, 6, 10, 4], [489, 309, 10, 8, 10, 2], [489, 360, 11, 8, 11, 2], [489, 411, 14, 8, 14, 2], [489, 462, 14, 8, 14, 2], [489, 513, 13, 8, 13, 2], [489, 564, 7, 8, 7, 2], [489, 615, 8, 8, 8, 2], [489, 668, 11, 6, 11, 4], [489, 717, 13, 8, 13, 2], [489, 768, 12, 8, 12, 2], [550, 5, 15, 6, 15, 4], [550, 56, 11, 6, 11, 4], [550, 107, 11, 6, 11, 4], [550, 158, 11, 6, 11, 4], [550, 207, 11, 8, 11, 2], [550, 260, 11, 7, 11, 4], [550, 310, 9, 7, 9, 3], [550, 360, 11, 8, 11, 2], [550, 411, 11, 8, 11, 2], [550, 463, 12, 7, 12, 3], [550, 511, 9, 12, 9, 0], [550, 564, 9, 8, 9, 2], [550, 615, 9, 8, 9, 2], [550, 666, 12, 8, 12, 2], [550, 719, 12, 6, 12, 4], [550, 770, 11, 6, 11, 4], [611, 3, 11, 8, 11, 2], [611, 54, 8, 8, 8, 2], [611, 107, 11, 6, 11, 4], [611, 156, 13, 8, 13, 2], [611, 205, 9, 12, 9, 0], [611, 260, 11, 6, 11, 4], [611, 311, 11, 6, 11, 4], [611, 362, 12, 6, 12, 4], [611, 413, 11, 6, 11, 4], [611, 464, 13, 6, 13, 4], [611, 515, 11, 6, 11, 4], [611, 562, 10, 10, 10, 0], [611, 613, 11, 10, 11, 0], [611, 664, 11, 10, 11, 0], [611, 717, 13, 8, 13, 2], [611, 770, 12, 6, 12, 4], [672, 5, 10, 6, 10, 4], [672, 56, 13, 6, 13, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 8, 8, 8, 2], [672, 258, 8, 8, 8, 2], [672, 311, 12, 6, 12, 4], [672, 361, 13, 7, 13, 3], [672, 411, 10, 10, 10, 2], [1, 5, 7, 6, 7, 4], [794, 768, 12, 8, 12, 2], [672, 564, 12, 8, 12, 2], [672, 615, 12, 8, 12, 2], [672, 666, 12, 8, 12, 2], [672, 717, 12, 8, 12, 2], [672, 768, 12, 8, 12, 2], [733, 3, 12, 8, 12, 2], [733, 54, 12, 8, 12, 2], [733, 105, 12, 8, 12, 2], [733, 156, 12, 8, 12, 2], [733, 207, 12, 8, 12, 2], [733, 258, 12, 8, 12, 2], [733, 309, 12, 8, 12, 2], [733, 360, 12, 8, 12, 2], [733, 411, 12, 8, 12, 2], [733, 462, 12, 8, 12, 2], [733, 513, 12, 8, 12, 2], [733, 564, 12, 8, 12, 2], [733, 615, 12, 8, 12, 2], [733, 666, 12, 8, 12, 2], [733, 717, 12, 8, 12, 2], [733, 768, 12, 8, 12, 2], [1, 5, 7, 6, 7, 4], [794, 54, 12, 8, 12, 2], [794, 105, 12, 8, 12, 2], [794, 156, 12, 8, 12, 2], [794, 207, 12, 8, 12, 2], [794, 258, 12, 8, 12, 2], [794, 309, 12, 8, 12, 2], [794, 360, 12, 8, 12, 2], [794, 411, 12, 8, 12, 2], [794, 462, 12, 8, 12, 2], [794, 513, 12, 8, 12, 2], [794, 564, 12, 8, 12, 2], [794, 615, 12, 8, 12, 2], [794, 666, 12, 8, 12, 2], [794, 717, 12, 8, 12, 2], [794, 768, 12, 8, 12, 2], [855, 3, 12, 8, 12, 2], [855, 54, 12, 8, 12, 2], [855, 105, 12, 8, 12, 2], [855, 156, 12, 8, 12, 2], [855, 207, 12, 8, 12, 2], [855, 258, 12, 8, 12, 2], [855, 309, 12, 8, 12, 2], [855, 360, 12, 8, 12, 2], [855, 411, 12, 8, 12, 2], [855, 462, 12, 8, 12, 2], [855, 513, 12, 8, 12, 2], [855, 564, 12, 8, 12, 2], [855, 615, 12, 8, 12, 2], [855, 666, 12, 8, 12, 2], [855, 717, 12, 8, 12, 2], [855, 768, 12, 8, 12, 2]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 10, 8, 2], [1, 105, 12, 4, 9, 2], [1, 156, 16, 7, 13, 2], [1, 206, 14, 12, 11, 1], [1, 258, 17, 10, 14, 2], [1, 309, 13, 10, 12, 2], [1, 360, 10, 4, 7, 2], [1, 410, 13, 12, 10, 1], [1, 461, 11, 12, 10, 1], [1, 513, 13, 7, 11, 2], [1, 566, 12, 7, 12, 4], [1, 622, 8, 5, 8, 9], [1, 670, 11, 3, 11, 6], [1, 724, 7, 3, 7, 9], [1, 768, 13, 10, 10, 2], [62, 3, 14, 10, 11, 2], [62, 54, 12, 10, 11, 2], [62, 105, 14, 10, 11, 2], [62, 156, 14, 10, 11, 2], [62, 207, 14, 10, 11, 2], [62, 258, 14, 10, 11, 2], [62, 309, 13, 10, 11, 2], [62, 360, 14, 10, 11, 2], [62, 411, 14, 10, 11, 2], [62, 462, 14, 10, 11, 2], [62, 516, 9, 7, 7, 5], [62, 567, 10, 9, 8, 5], [62, 617, 11, 7, 9, 4], [62, 669, 13, 5, 11, 5], [62, 719, 10, 7, 9, 4], [62, 768, 14, 10, 11, 2], [123, 4, 15, 9, 13, 3], [123, 54, 11, 10, 10, 2], [123, 105, 14, 10, 11, 2], [123, 156, 13, 10, 10, 2], [123, 207, 13, 10, 11, 2], [123, 258, 13, 10, 10, 2], [123, 309, 13, 10, 10, 2], [123, 360, 13, 10, 10, 2], [123, 411, 14, 10, 11, 2], [123, 462, 10, 10, 8, 2], [123, 513, 13, 10, 10, 2], [123, 564, 14, 10, 11, 2], [123, 615, 10, 10, 10, 2], [123, 666, 16, 10, 13, 2], [123, 717, 14, 10, 11, 2], [123, 768, 13, 10, 10, 2], [184, 3, 14, 10, 11, 2], [184, 54, 13, 11, 10, 2], [184, 105, 14, 10, 11, 2], [184, 156, 13, 10, 10, 2], [184, 207, 13, 10, 10, 2], [184, 258, 14, 10, 11, 2], [184, 309, 13, 10, 10, 2], [184, 360, 17, 10, 14, 2], [184, 411, 13, 10, 10, 2], [184, 462, 13, 10, 10, 2], [184, 513, 13, 10, 10, 2], [184, 563, 12, 12, 9, 1], [184, 615, 9, 10, 9, 2], [184, 665, 12, 12, 9, 1], [184, 717, 12, 4, 9, 2], [184, 775, 12, 3, 11, 9], [245, 3, 11, 4, 8, 2], [245, 56, 11, 8, 9, 4], [245, 105, 12, 10, 10, 2], [245, 158, 11, 8, 9, 4], [245, 207, 12, 10, 9, 2], [245, 260, 11, 8, 9, 4], [245, 309, 12, 10, 8, 2], [245, 362, 11, 10, 9, 4], [245, 411, 12, 10, 10, 2], [245, 462, 10, 10, 8, 2], [245, 513, 11, 12, 9, 2], [245, 564, 12, 10, 10, 2], [245, 615, 10, 10, 8, 2], [245, 668, 15, 8, 13, 4], [245, 719, 12, 8, 10, 4], [245, 770, 11, 8, 9, 4], [306, 5, 12, 10, 10, 4], [306, 56, 11, 10, 9, 4], [306, 107, 12, 8, 10, 4], [306, 158, 11, 8, 9, 4], [306, 207, 10, 10, 8, 2], [306, 260, 12, 8, 10, 4], [306, 311, 12, 8, 10, 4], [306, 362, 14, 8, 12, 4], [306, 413, 12, 8, 10, 4], [306, 464, 12, 10, 10, 4], [306, 515, 11, 8, 9, 4], [306, 563, 12, 13, 9, 1], [306, 614, 11, 13, 8, 1], [306, 665, 11, 13, 9, 1], [306, 717, 14, 4, 11, 2], [306, 766, 1, 1, 3, 1], [367, 1, 13, 12, 10, 0], [367, 52, 14, 12, 10, 0], [367, 105, 13, 12, 10, 2], [367, 154, 13, 12, 10, 0], [367, 205, 15, 12, 11, 0], [367, 256, 13, 12, 10, 0], [367, 307, 14, 12, 11, 0], [367, 359, 12, 11, 9, 1], [367, 410, 11, 11, 9, 1], [367, 461, 12, 11, 9, 1], [367, 513, 12, 10, 9, 2], [367, 563, 14, 11, 10, 1], [367, 614, 12, 11, 9, 1], [367, 668, 11, 10, 9, 4], [367, 716, 12, 11, 9, 1], [367, 767, 11, 11, 9, 1], [428, 2, 12, 11, 9, 1], [428, 54, 12, 10, 9, 2], [428, 104, 12, 11, 8, 1], [428, 155, 11, 11, 8, 1], [428, 206, 12, 11, 9, 1], [428, 258, 11, 10, 8, 2], [428, 308, 14, 11, 10, 1], [428, 359, 12, 11, 9, 1], [428, 410, 11, 11, 9, 1], [428, 461, 12, 11, 9, 1], [428, 513, 12, 10, 9, 2], [428, 563, 14, 11, 10, 1], [428, 614, 13, 11, 10, 1], [428, 665, 12, 11, 10, 1], [428, 716, 13, 11, 10, 1], [428, 768, 13, 10, 10, 2], [489, 2, 12, 7, 9, 1], [489, 54, 12, 6, 9, 2], [489, 106, 12, 10, 10, 3], [489, 156, 13, 10, 11, 2], [489, 206, 13, 11, 10, 1], [489, 260, 12, 7, 10, 4], [489, 309, 13, 10, 10, 2], [489, 360, 14, 10, 11, 2], [489, 411, 16, 10, 14, 2], [489, 462, 16, 10, 14, 2], [489, 513, 16, 6, 13, 2], [489, 564, 10, 4, 7, 2], [489, 615, 11, 3, 8, 2], [489, 668, 13, 7, 11, 4], [489, 717, 16, 10, 13, 2], [489, 768, 15, 10, 12, 2], [550, 5, 17, 7, 15, 4], [550, 56, 12, 8, 11, 4], [550, 107, 12, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 207, 14, 10, 11, 2], [550, 260, 12, 9, 11, 4], [550, 310, 11, 9, 9, 3], [550, 360, 14, 10, 11, 2], [550, 411, 14, 10, 11, 2], [550, 463, 15, 9, 12, 3], [550, 511, 13, 14, 9, 0], [550, 564, 12, 8, 9, 2], [550, 615, 12, 8, 9, 2], [550, 666, 14, 10, 12, 2], [550, 719, 14, 8, 12, 4], [550, 770, 13, 8, 11, 4], [611, 3, 11, 10, 11, 2], [611, 54, 11, 10, 8, 2], [611, 109, 12, 5, 11, 6], [611, 156, 16, 10, 13, 2], [611, 205, 13, 14, 9, 0], [611, 260, 14, 6, 11, 4], [611, 311, 11, 8, 11, 4], [611, 363, 13, 7, 12, 5], [611, 414, 13, 7, 11, 5], [611, 469, 13, 3, 13, 9], [611, 511, 1, 1, 11, 1], [611, 562, 13, 12, 10, 0], [611, 613, 15, 12, 11, 0], [611, 664, 15, 12, 11, 0], [611, 717, 16, 10, 13, 2], [611, 770, 14, 8, 12, 4], [672, 7, 11, 3, 10, 6], [672, 58, 14, 3, 13, 6], [672, 105, 14, 5, 11, 2], [672, 156, 14, 5, 11, 2], [672, 207, 11, 5, 8, 2], [672, 258, 11, 5, 8, 2], [672, 311, 12, 7, 12, 4], [672, 361, 14, 9, 13, 3], [672, 411, 13, 12, 10, 2], [1, 1, 1, 1, 7, 1], [794, 768, 15, 10, 12, 2], [672, 564, 15, 10, 12, 2], [672, 615, 15, 10, 12, 2], [672, 666, 15, 10, 12, 2], [672, 717, 15, 10, 12, 2], [672, 768, 15, 10, 12, 2], [733, 3, 15, 10, 12, 2], [733, 54, 15, 10, 12, 2], [733, 105, 15, 10, 12, 2], [733, 156, 15, 10, 12, 2], [733, 207, 15, 10, 12, 2], [733, 258, 15, 10, 12, 2], [733, 309, 15, 10, 12, 2], [733, 360, 15, 10, 12, 2], [733, 411, 15, 10, 12, 2], [733, 462, 15, 10, 12, 2], [733, 513, 15, 10, 12, 2], [733, 564, 15, 10, 12, 2], [733, 615, 15, 10, 12, 2], [733, 666, 15, 10, 12, 2], [733, 717, 15, 10, 12, 2], [733, 768, 15, 10, 12, 2], [1, 1, 1, 1, 7, 1], [794, 54, 15, 10, 12, 2], [794, 105, 15, 10, 12, 2], [794, 156, 15, 10, 12, 2], [794, 207, 15, 10, 12, 2], [794, 258, 15, 10, 12, 2], [794, 309, 15, 10, 12, 2], [794, 360, 15, 10, 12, 2], [794, 411, 15, 10, 12, 2], [794, 462, 15, 10, 12, 2], [794, 513, 15, 10, 12, 2], [794, 564, 15, 10, 12, 2], [794, 615, 15, 10, 12, 2], [794, 666, 15, 10, 12, 2], [794, 717, 15, 10, 12, 2], [794, 768, 15, 10, 12, 2], [855, 3, 15, 10, 12, 2], [855, 54, 15, 10, 12, 2], [855, 105, 15, 10, 12, 2], [855, 156, 15, 10, 12, 2], [855, 207, 15, 10, 12, 2], [855, 258, 15, 10, 12, 2], [855, 309, 15, 10, 12, 2], [855, 360, 15, 10, 12, 2], [855, 411, 15, 10, 12, 2], [855, 462, 15, 10, 12, 2], [855, 513, 15, 10, 12, 2], [855, 564, 15, 10, 12, 2], [855, 615, 15, 10, 12, 2], [855, 666, 15, 10, 12, 2], [855, 717, 15, 10, 12, 2], [855, 768, 15, 10, 12, 2]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 17, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 10, 8, 7, 2], [1, 105, 11, 2, 8, 2], [1, 156, 15, 5, 12, 2], [1, 206, 13, 10, 10, 1], [1, 258, 16, 8, 13, 2], [1, 309, 12, 8, 11, 2], [1, 360, 9, 2, 6, 2], [1, 410, 12, 10, 9, 1], [1, 461, 10, 10, 9, 1], [1, 513, 12, 5, 10, 2], [1, 566, 11, 5, 11, 4], [1, 622, 7, 3, 7, 9], [1, 670, 10, 1, 10, 6], [1, 724, 6, 1, 6, 9], [1, 768, 12, 8, 9, 2], [62, 3, 13, 8, 10, 2], [62, 54, 11, 8, 10, 2], [62, 105, 13, 8, 10, 2], [62, 156, 13, 8, 10, 2], [62, 207, 13, 8, 10, 2], [62, 258, 13, 8, 10, 2], [62, 309, 12, 8, 10, 2], [62, 360, 13, 8, 10, 2], [62, 411, 13, 8, 10, 2], [62, 462, 13, 8, 10, 2], [62, 516, 8, 5, 6, 5], [62, 567, 9, 7, 7, 5], [62, 617, 10, 5, 8, 4], [62, 669, 12, 3, 10, 5], [62, 719, 9, 5, 8, 4], [62, 768, 13, 8, 10, 2], [123, 4, 14, 7, 12, 3], [123, 54, 10, 8, 9, 2], [123, 105, 13, 8, 10, 2], [123, 156, 12, 8, 9, 2], [123, 207, 12, 8, 10, 2], [123, 258, 12, 8, 9, 2], [123, 309, 12, 8, 9, 2], [123, 360, 12, 8, 9, 2], [123, 411, 13, 8, 10, 2], [123, 462, 9, 8, 7, 2], [123, 513, 12, 8, 9, 2], [123, 564, 13, 8, 10, 2], [123, 615, 9, 8, 9, 2], [123, 666, 15, 8, 12, 2], [123, 717, 13, 8, 10, 2], [123, 768, 12, 8, 9, 2], [184, 3, 13, 8, 10, 2], [184, 54, 12, 9, 9, 2], [184, 105, 13, 8, 10, 2], [184, 156, 12, 8, 9, 2], [184, 207, 12, 8, 9, 2], [184, 258, 13, 8, 10, 2], [184, 309, 12, 8, 9, 2], [184, 360, 16, 8, 13, 2], [184, 411, 12, 8, 9, 2], [184, 462, 12, 8, 9, 2], [184, 513, 12, 8, 9, 2], [184, 563, 11, 10, 8, 1], [184, 615, 8, 8, 8, 2], [184, 665, 11, 10, 8, 1], [184, 717, 11, 2, 8, 2], [184, 775, 11, 1, 10, 9], [245, 3, 10, 2, 7, 2], [245, 56, 10, 6, 8, 4], [245, 105, 11, 8, 9, 2], [245, 158, 10, 6, 8, 4], [245, 207, 11, 8, 8, 2], [245, 260, 10, 6, 8, 4], [245, 309, 11, 8, 7, 2], [245, 362, 10, 8, 8, 4], [245, 411, 11, 8, 9, 2], [245, 462, 9, 8, 7, 2], [245, 513, 10, 10, 8, 2], [245, 564, 11, 8, 9, 2], [245, 615, 9, 8, 7, 2], [245, 668, 14, 6, 12, 4], [245, 719, 11, 6, 9, 4], [245, 770, 10, 6, 8, 4], [306, 5, 11, 8, 9, 4], [306, 56, 10, 8, 8, 4], [306, 107, 11, 6, 9, 4], [306, 158, 10, 6, 8, 4], [306, 207, 9, 8, 7, 2], [306, 260, 11, 6, 9, 4], [306, 311, 11, 6, 9, 4], [306, 362, 13, 6, 11, 4], [306, 413, 11, 6, 9, 4], [306, 464, 11, 8, 9, 4], [306, 515, 10, 6, 8, 4], [306, 563, 11, 11, 8, 1], [306, 614, 10, 11, 7, 1], [306, 665, 10, 11, 8, 1], [306, 717, 13, 2, 10, 2], [306, 766, 1, 1, 3, 1], [367, 1, 10, 10, 9, 0], [367, 52, 13, 10, 9, 0], [367, 105, 12, 10, 9, 2], [367, 154, 12, 10, 9, 0], [367, 205, 13, 10, 10, 0], [367, 256, 12, 10, 9, 0], [367, 307, 13, 10, 10, 0], [367, 359, 11, 9, 8, 1], [367, 410, 10, 9, 8, 1], [367, 461, 11, 9, 8, 1], [367, 513, 11, 8, 8, 2], [367, 563, 13, 9, 9, 1], [367, 614, 11, 9, 8, 1], [367, 668, 10, 8, 8, 4], [367, 716, 11, 9, 8, 1], [367, 767, 10, 9, 8, 1], [428, 2, 11, 9, 8, 1], [428, 54, 11, 8, 8, 2], [428, 104, 11, 9, 7, 1], [428, 155, 10, 9, 7, 1], [428, 206, 11, 9, 8, 1], [428, 258, 10, 8, 7, 2], [428, 308, 13, 9, 9, 1], [428, 359, 11, 9, 8, 1], [428, 410, 10, 9, 8, 1], [428, 461, 11, 9, 8, 1], [428, 513, 11, 8, 8, 2], [428, 563, 13, 9, 9, 1], [428, 614, 12, 9, 9, 1], [428, 665, 11, 9, 9, 1], [428, 716, 12, 9, 9, 1], [428, 768, 12, 8, 9, 2], [489, 2, 11, 5, 8, 1], [489, 54, 11, 4, 8, 2], [489, 106, 11, 8, 9, 3], [489, 156, 12, 8, 10, 2], [489, 206, 12, 9, 9, 1], [489, 260, 11, 5, 9, 4], [489, 309, 12, 8, 9, 2], [489, 360, 13, 8, 10, 2], [489, 411, 15, 8, 13, 2], [489, 462, 15, 8, 13, 2], [489, 513, 15, 4, 12, 2], [489, 564, 9, 2, 6, 2], [489, 615, 10, 1, 7, 2], [489, 668, 12, 5, 10, 4], [489, 717, 15, 8, 12, 2], [489, 768, 14, 8, 11, 2], [550, 5, 16, 5, 14, 4], [550, 56, 11, 6, 10, 4], [550, 107, 11, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 207, 13, 8, 10, 2], [550, 260, 11, 7, 10, 4], [550, 310, 10, 7, 8, 3], [550, 360, 13, 8, 10, 2], [550, 411, 13, 8, 10, 2], [550, 463, 14, 7, 11, 3], [550, 511, 11, 12, 8, 0], [550, 564, 11, 6, 8, 2], [550, 615, 11, 6, 8, 2], [550, 666, 13, 8, 11, 2], [550, 719, 13, 6, 11, 4], [550, 770, 12, 6, 10, 4], [611, 3, 10, 8, 10, 2], [611, 54, 10, 8, 7, 2], [611, 109, 11, 3, 10, 6], [611, 156, 15, 8, 12, 2], [611, 205, 11, 12, 8, 0], [611, 260, 13, 4, 10, 4], [611, 311, 10, 6, 10, 4], [611, 363, 12, 5, 11, 5], [611, 414, 12, 5, 10, 5], [611, 469, 12, 1, 12, 9], [611, 511, 1, 1, 10, 1], [611, 562, 12, 10, 9, 0], [611, 613, 13, 10, 10, 0], [611, 664, 13, 10, 10, 0], [611, 717, 15, 8, 12, 2], [611, 770, 13, 6, 11, 4], [672, 7, 10, 1, 9, 6], [672, 58, 13, 1, 12, 6], [672, 105, 13, 3, 10, 2], [672, 156, 13, 3, 10, 2], [672, 207, 10, 3, 7, 2], [672, 258, 10, 3, 7, 2], [672, 311, 11, 5, 11, 4], [672, 361, 13, 7, 12, 3], [672, 411, 12, 10, 9, 2], [1, 1, 1, 1, 6, 1], [794, 768, 14, 8, 11, 2], [672, 564, 14, 8, 11, 2], [672, 615, 14, 8, 11, 2], [672, 666, 14, 8, 11, 2], [672, 717, 14, 8, 11, 2], [672, 768, 14, 8, 11, 2], [733, 3, 14, 8, 11, 2], [733, 54, 14, 8, 11, 2], [733, 105, 14, 8, 11, 2], [733, 156, 14, 8, 11, 2], [733, 207, 14, 8, 11, 2], [733, 258, 14, 8, 11, 2], [733, 309, 14, 8, 11, 2], [733, 360, 14, 8, 11, 2], [733, 411, 14, 8, 11, 2], [733, 462, 14, 8, 11, 2], [733, 513, 14, 8, 11, 2], [733, 564, 14, 8, 11, 2], [733, 615, 14, 8, 11, 2], [733, 666, 14, 8, 11, 2], [733, 717, 14, 8, 11, 2], [733, 768, 14, 8, 11, 2], [1, 1, 1, 1, 6, 1], [794, 54, 14, 8, 11, 2], [794, 105, 14, 8, 11, 2], [794, 156, 14, 8, 11, 2], [794, 207, 14, 8, 11, 2], [794, 258, 14, 8, 11, 2], [794, 309, 14, 8, 11, 2], [794, 360, 14, 8, 11, 2], [794, 411, 14, 8, 11, 2], [794, 462, 14, 8, 11, 2], [794, 513, 14, 8, 11, 2], [794, 564, 14, 8, 11, 2], [794, 615, 14, 8, 11, 2], [794, 666, 14, 8, 11, 2], [794, 717, 14, 8, 11, 2], [794, 768, 14, 8, 11, 2], [855, 3, 14, 8, 11, 2], [855, 54, 14, 8, 11, 2], [855, 105, 14, 8, 11, 2], [855, 156, 14, 8, 11, 2], [855, 207, 14, 8, 11, 2], [855, 258, 14, 8, 11, 2], [855, 309, 14, 8, 11, 2], [855, 360, 14, 8, 11, 2], [855, 411, 14, 8, 11, 2], [855, 462, 14, 8, 11, 2], [855, 513, 14, 8, 11, 2], [855, 564, 14, 8, 11, 2], [855, 615, 14, 8, 11, 2], [855, 666, 14, 8, 11, 2], [855, 717, 14, 8, 11, 2], [855, 768, 14, 8, 11, 2]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 16, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 54, 8, 10, 8, 2], [1, 105, 9, 9, 9, 2], [1, 156, 13, 9, 13, 2], [1, 206, 11, 12, 11, 1], [1, 258, 14, 10, 14, 2], [1, 309, 12, 10, 12, 2], [1, 360, 7, 9, 7, 2], [1, 410, 10, 12, 10, 1], [1, 461, 10, 12, 10, 1], [1, 513, 11, 9, 11, 2], [1, 566, 12, 7, 12, 4], [1, 618, 8, 9, 8, 5], [1, 669, 11, 6, 11, 5], [1, 720, 7, 7, 7, 5], [1, 768, 10, 10, 10, 2], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 10, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 516, 7, 7, 7, 5], [62, 567, 8, 9, 8, 5], [62, 617, 9, 7, 9, 4], [62, 669, 11, 6, 11, 5], [62, 719, 9, 7, 9, 4], [62, 768, 11, 10, 11, 2], [123, 4, 13, 9, 13, 3], [123, 54, 10, 10, 10, 2], [123, 105, 11, 10, 11, 2], [123, 156, 10, 10, 10, 2], [123, 207, 11, 10, 11, 2], [123, 258, 10, 10, 10, 2], [123, 309, 10, 10, 10, 2], [123, 360, 10, 10, 10, 2], [123, 411, 11, 10, 11, 2], [123, 462, 8, 10, 8, 2], [123, 513, 10, 10, 10, 2], [123, 564, 11, 10, 11, 2], [123, 615, 10, 10, 10, 2], [123, 666, 13, 10, 13, 2], [123, 717, 11, 10, 11, 2], [123, 768, 10, 10, 10, 2], [184, 3, 11, 10, 11, 2], [184, 54, 10, 11, 10, 2], [184, 105, 11, 10, 11, 2], [184, 156, 10, 10, 10, 2], [184, 207, 10, 10, 10, 2], [184, 258, 11, 10, 11, 2], [184, 309, 10, 10, 10, 2], [184, 360, 14, 10, 14, 2], [184, 411, 10, 10, 10, 2], [184, 462, 10, 10, 10, 2], [184, 513, 10, 10, 10, 2], [184, 563, 9, 12, 9, 1], [184, 615, 9, 10, 9, 2], [184, 665, 9, 12, 9, 1], [184, 717, 9, 9, 9, 2], [184, 771, 11, 7, 11, 5], [245, 3, 8, 9, 8, 2], [245, 56, 9, 8, 9, 4], [245, 105, 10, 10, 10, 2], [245, 158, 9, 8, 9, 4], [245, 207, 9, 10, 9, 2], [245, 260, 9, 8, 9, 4], [245, 309, 8, 10, 8, 2], [245, 362, 9, 10, 9, 4], [245, 411, 10, 10, 10, 2], [245, 462, 8, 10, 8, 2], [245, 513, 9, 12, 9, 2], [245, 564, 10, 10, 10, 2], [245, 615, 8, 10, 8, 2], [245, 668, 13, 8, 13, 4], [245, 719, 10, 8, 10, 4], [245, 770, 9, 8, 9, 4], [306, 5, 10, 10, 10, 4], [306, 56, 9, 10, 9, 4], [306, 107, 10, 8, 10, 4], [306, 158, 9, 8, 9, 4], [306, 207, 8, 10, 8, 2], [306, 260, 10, 8, 10, 4], [306, 311, 10, 8, 10, 4], [306, 362, 12, 8, 12, 4], [306, 413, 10, 8, 10, 4], [306, 464, 10, 10, 10, 4], [306, 515, 9, 8, 9, 4], [306, 563, 9, 13, 9, 1], [306, 614, 8, 13, 8, 1], [306, 665, 9, 13, 9, 1], [306, 717, 11, 9, 11, 2], [306, 771, 3, 6, 3, 5], [367, 1, 10, 12, 10, 0], [367, 52, 10, 12, 10, 0], [367, 105, 10, 12, 10, 2], [367, 154, 10, 12, 10, 0], [367, 205, 11, 12, 11, 0], [367, 256, 10, 12, 10, 0], [367, 307, 11, 12, 11, 0], [367, 359, 9, 11, 9, 1], [367, 410, 9, 11, 9, 1], [367, 461, 9, 11, 9, 1], [367, 513, 9, 10, 9, 2], [367, 563, 10, 11, 10, 1], [367, 614, 9, 11, 9, 1], [367, 668, 9, 10, 9, 4], [367, 716, 9, 11, 9, 1], [367, 767, 9, 11, 9, 1], [428, 2, 9, 11, 9, 1], [428, 54, 9, 10, 9, 2], [428, 104, 8, 11, 8, 1], [428, 155, 8, 11, 8, 1], [428, 206, 9, 11, 9, 1], [428, 258, 8, 10, 8, 2], [428, 308, 10, 11, 10, 1], [428, 359, 9, 11, 9, 1], [428, 410, 9, 11, 9, 1], [428, 461, 9, 11, 9, 1], [428, 513, 9, 10, 9, 2], [428, 563, 10, 11, 10, 1], [428, 614, 10, 11, 10, 1], [428, 665, 10, 11, 10, 1], [428, 716, 10, 11, 10, 1], [428, 768, 10, 10, 10, 2], [489, 2, 9, 10, 9, 1], [489, 54, 9, 9, 9, 2], [489, 106, 10, 10, 10, 3], [489, 156, 11, 10, 11, 2], [489, 206, 10, 11, 10, 1], [489, 260, 10, 7, 10, 4], [489, 309, 10, 10, 10, 2], [489, 360, 11, 10, 11, 2], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 513, 13, 9, 13, 2], [489, 564, 7, 9, 7, 2], [489, 615, 8, 9, 8, 2], [489, 668, 11, 7, 11, 4], [489, 717, 13, 10, 13, 2], [489, 768, 12, 10, 12, 2], [550, 5, 15, 7, 15, 4], [550, 56, 11, 8, 11, 4], [550, 107, 11, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 207, 11, 10, 11, 2], [550, 260, 11, 9, 11, 4], [550, 310, 9, 9, 9, 3], [550, 360, 11, 10, 11, 2], [550, 411, 11, 10, 11, 2], [550, 463, 12, 9, 12, 3], [550, 511, 9, 14, 9, 0], [550, 564, 9, 9, 9, 2], [550, 615, 9, 9, 9, 2], [550, 666, 12, 10, 12, 2], [550, 719, 12, 8, 12, 4], [550, 770, 11, 8, 11, 4], [611, 3, 11, 10, 11, 2], [611, 54, 8, 10, 8, 2], [611, 108, 11, 6, 11, 5], [611, 156, 13, 10, 13, 2], [611, 205, 9, 14, 9, 0], [611, 260, 11, 7, 11, 4], [611, 311, 11, 8, 11, 4], [611, 363, 12, 7, 12, 5], [611, 414, 11, 7, 11, 5], [611, 465, 13, 7, 13, 5], [611, 516, 11, 6, 11, 5], [611, 562, 10, 12, 10, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 717, 13, 10, 13, 2], [611, 770, 12, 8, 12, 4], [672, 6, 10, 6, 10, 5], [672, 57, 13, 6, 13, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 8, 9, 8, 2], [672, 258, 8, 9, 8, 2], [672, 311, 12, 7, 12, 4], [672, 361, 13, 9, 13, 3], [672, 411, 10, 12, 10, 2], [1, 6, 7, 6, 7, 5], [794, 768, 12, 10, 12, 2], [672, 564, 12, 10, 12, 2], [672, 615, 12, 10, 12, 2], [672, 666, 12, 10, 12, 2], [672, 717, 12, 10, 12, 2], [672, 768, 12, 10, 12, 2], [733, 3, 12, 10, 12, 2], [733, 54, 12, 10, 12, 2], [733, 105, 12, 10, 12, 2], [733, 156, 12, 10, 12, 2], [733, 207, 12, 10, 12, 2], [733, 258, 12, 10, 12, 2], [733, 309, 12, 10, 12, 2], [733, 360, 12, 10, 12, 2], [733, 411, 12, 10, 12, 2], [733, 462, 12, 10, 12, 2], [733, 513, 12, 10, 12, 2], [733, 564, 12, 10, 12, 2], [733, 615, 12, 10, 12, 2], [733, 666, 12, 10, 12, 2], [733, 717, 12, 10, 12, 2], [733, 768, 12, 10, 12, 2], [1, 6, 7, 6, 7, 5], [794, 54, 12, 10, 12, 2], [794, 105, 12, 10, 12, 2], [794, 156, 12, 10, 12, 2], [794, 207, 12, 10, 12, 2], [794, 258, 12, 10, 12, 2], [794, 309, 12, 10, 12, 2], [794, 360, 12, 10, 12, 2], [794, 411, 12, 10, 12, 2], [794, 462, 12, 10, 12, 2], [794, 513, 12, 10, 12, 2], [794, 564, 12, 10, 12, 2], [794, 615, 12, 10, 12, 2], [794, 666, 12, 10, 12, 2], [794, 717, 12, 10, 12, 2], [794, 768, 12, 10, 12, 2], [855, 3, 12, 10, 12, 2], [855, 54, 12, 10, 12, 2], [855, 105, 12, 10, 12, 2], [855, 156, 12, 10, 12, 2], [855, 207, 12, 10, 12, 2], [855, 258, 12, 10, 12, 2], [855, 309, 12, 10, 12, 2], [855, 360, 12, 10, 12, 2], [855, 411, 12, 10, 12, 2], [855, 462, 12, 10, 12, 2], [855, 513, 12, 10, 12, 2], [855, 564, 12, 10, 12, 2], [855, 615, 12, 10, 12, 2], [855, 666, 12, 10, 12, 2], [855, 717, 12, 10, 12, 2], [855, 768, 12, 10, 12, 2]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 7, 8, 7, 2], [1, 105, 8, 8, 8, 2], [1, 156, 12, 8, 12, 2], [1, 206, 10, 10, 10, 1], [1, 258, 13, 8, 13, 2], [1, 309, 11, 8, 11, 2], [1, 360, 6, 8, 6, 2], [1, 410, 9, 10, 9, 1], [1, 461, 9, 10, 9, 1], [1, 513, 10, 8, 10, 2], [1, 566, 11, 6, 11, 4], [1, 617, 7, 8, 7, 4], [1, 668, 10, 6, 10, 4], [1, 719, 6, 6, 6, 4], [1, 768, 9, 8, 9, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 6, 6, 6, 4], [62, 566, 7, 8, 7, 4], [62, 617, 8, 6, 8, 4], [62, 668, 10, 6, 10, 4], [62, 719, 8, 6, 8, 4], [62, 768, 10, 8, 10, 2], [123, 4, 12, 7, 12, 3], [123, 54, 9, 8, 9, 2], [123, 105, 10, 8, 10, 2], [123, 156, 9, 8, 9, 2], [123, 207, 10, 8, 10, 2], [123, 258, 9, 8, 9, 2], [123, 309, 9, 8, 9, 2], [123, 360, 9, 8, 9, 2], [123, 411, 10, 8, 10, 2], [123, 462, 7, 8, 7, 2], [123, 513, 9, 8, 9, 2], [123, 564, 10, 8, 10, 2], [123, 615, 9, 8, 9, 2], [123, 666, 12, 8, 12, 2], [123, 717, 10, 8, 10, 2], [123, 768, 9, 8, 9, 2], [184, 3, 10, 8, 10, 2], [184, 54, 9, 9, 9, 2], [184, 105, 10, 8, 10, 2], [184, 156, 9, 8, 9, 2], [184, 207, 9, 8, 9, 2], [184, 258, 10, 8, 10, 2], [184, 309, 9, 8, 9, 2], [184, 360, 13, 8, 13, 2], [184, 411, 9, 8, 9, 2], [184, 462, 9, 8, 9, 2], [184, 513, 9, 8, 9, 2], [184, 563, 8, 10, 8, 1], [184, 615, 8, 8, 8, 2], [184, 665, 8, 10, 8, 1], [184, 717, 8, 8, 8, 2], [184, 770, 10, 6, 10, 4], [245, 3, 7, 8, 7, 2], [245, 56, 8, 6, 8, 4], [245, 105, 9, 8, 9, 2], [245, 158, 8, 6, 8, 4], [245, 207, 8, 8, 8, 2], [245, 260, 8, 6, 8, 4], [245, 309, 7, 8, 7, 2], [245, 362, 8, 8, 8, 4], [245, 411, 9, 8, 9, 2], [245, 462, 7, 8, 7, 2], [245, 513, 8, 10, 8, 2], [245, 564, 9, 8, 9, 2], [245, 615, 7, 8, 7, 2], [245, 668, 12, 6, 12, 4], [245, 719, 9, 6, 9, 4], [245, 770, 8, 6, 8, 4], [306, 5, 9, 8, 9, 4], [306, 56, 8, 8, 8, 4], [306, 107, 9, 6, 9, 4], [306, 158, 8, 6, 8, 4], [306, 207, 7, 8, 7, 2], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 563, 8, 11, 8, 1], [306, 614, 7, 11, 7, 1], [306, 665, 8, 11, 8, 1], [306, 717, 10, 8, 10, 2], [306, 770, 3, 6, 3, 4], [367, 1, 9, 10, 9, 0], [367, 52, 9, 10, 9, 0], [367, 105, 9, 10, 9, 2], [367, 154, 9, 10, 9, 0], [367, 205, 10, 10, 10, 0], [367, 256, 9, 10, 9, 0], [367, 307, 10, 10, 10, 0], [367, 359, 8, 9, 8, 1], [367, 410, 8, 9, 8, 1], [367, 461, 8, 9, 8, 1], [367, 513, 8, 8, 8, 2], [367, 563, 9, 9, 9, 1], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 716, 8, 9, 8, 1], [367, 767, 8, 9, 8, 1], [428, 2, 8, 9, 8, 1], [428, 54, 8, 8, 8, 2], [428, 104, 7, 9, 7, 1], [428, 155, 7, 9, 7, 1], [428, 206, 8, 9, 8, 1], [428, 258, 7, 8, 7, 2], [428, 308, 9, 9, 9, 1], [428, 359, 8, 9, 8, 1], [428, 410, 8, 9, 8, 1], [428, 461, 8, 9, 8, 1], [428, 513, 8, 8, 8, 2], [428, 563, 9, 9, 9, 1], [428, 614, 9, 9, 9, 1], [428, 665, 9, 9, 9, 1], [428, 716, 9, 9, 9, 1], [428, 768, 9, 8, 9, 2], [489, 2, 8, 9, 8, 1], [489, 54, 8, 8, 8, 2], [489, 106, 9, 8, 9, 3], [489, 156, 10, 8, 10, 2], [489, 206, 9, 9, 9, 1], [489, 260, 9, 6, 9, 4], [489, 309, 9, 8, 9, 2], [489, 360, 10, 8, 10, 2], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 513, 12, 8, 12, 2], [489, 564, 6, 8, 6, 2], [489, 615, 7, 8, 7, 2], [489, 668, 10, 6, 10, 4], [489, 717, 12, 8, 12, 2], [489, 768, 11, 8, 11, 2], [550, 5, 14, 6, 14, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 207, 10, 8, 10, 2], [550, 260, 10, 7, 10, 4], [550, 310, 8, 7, 8, 3], [550, 360, 10, 8, 10, 2], [550, 411, 10, 8, 10, 2], [550, 463, 11, 7, 11, 3], [550, 511, 8, 12, 8, 0], [550, 564, 8, 8, 8, 2], [550, 615, 8, 8, 8, 2], [550, 666, 11, 8, 11, 2], [550, 719, 11, 6, 11, 4], [550, 770, 10, 6, 10, 4], [611, 3, 10, 8, 10, 2], [611, 54, 7, 8, 7, 2], [611, 107, 10, 6, 10, 4], [611, 156, 12, 8, 12, 2], [611, 205, 8, 12, 8, 0], [611, 260, 10, 6, 10, 4], [611, 311, 10, 6, 10, 4], [611, 362, 11, 6, 11, 4], [611, 413, 10, 6, 10, 4], [611, 464, 12, 6, 12, 4], [611, 515, 10, 6, 10, 4], [611, 562, 9, 10, 9, 0], [611, 613, 10, 10, 10, 0], [611, 664, 10, 10, 10, 0], [611, 717, 12, 8, 12, 2], [611, 770, 11, 6, 11, 4], [672, 5, 9, 6, 9, 4], [672, 56, 12, 6, 12, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 11, 6, 11, 4], [672, 361, 12, 7, 12, 3], [672, 411, 9, 10, 9, 2], [1, 5, 6, 6, 6, 4], [794, 768, 11, 8, 11, 2], [672, 564, 11, 8, 11, 2], [672, 615, 11, 8, 11, 2], [672, 666, 11, 8, 11, 2], [672, 717, 11, 8, 11, 2], [672, 768, 11, 8, 11, 2], [733, 3, 11, 8, 11, 2], [733, 54, 11, 8, 11, 2], [733, 105, 11, 8, 11, 2], [733, 156, 11, 8, 11, 2], [733, 207, 11, 8, 11, 2], [733, 258, 11, 8, 11, 2], [733, 309, 11, 8, 11, 2], [733, 360, 11, 8, 11, 2], [733, 411, 11, 8, 11, 2], [733, 462, 11, 8, 11, 2], [733, 513, 11, 8, 11, 2], [733, 564, 11, 8, 11, 2], [733, 615, 11, 8, 11, 2], [733, 666, 11, 8, 11, 2], [733, 717, 11, 8, 11, 2], [733, 768, 11, 8, 11, 2], [1, 5, 6, 6, 6, 4], [794, 54, 11, 8, 11, 2], [794, 105, 11, 8, 11, 2], [794, 156, 11, 8, 11, 2], [794, 207, 11, 8, 11, 2], [794, 258, 11, 8, 11, 2], [794, 309, 11, 8, 11, 2], [794, 360, 11, 8, 11, 2], [794, 411, 11, 8, 11, 2], [794, 462, 11, 8, 11, 2], [794, 513, 11, 8, 11, 2], [794, 564, 11, 8, 11, 2], [794, 615, 11, 8, 11, 2], [794, 666, 11, 8, 11, 2], [794, 717, 11, 8, 11, 2], [794, 768, 11, 8, 11, 2], [855, 3, 11, 8, 11, 2], [855, 54, 11, 8, 11, 2], [855, 105, 11, 8, 11, 2], [855, 156, 11, 8, 11, 2], [855, 207, 11, 8, 11, 2], [855, 258, 11, 8, 11, 2], [855, 309, 11, 8, 11, 2], [855, 360, 11, 8, 11, 2], [855, 411, 11, 8, 11, 2], [855, 462, 11, 8, 11, 2], [855, 513, 11, 8, 11, 2], [855, 564, 11, 8, 11, 2], [855, 615, 11, 8, 11, 2], [855, 666, 11, 8, 11, 2], [855, 717, 11, 8, 11, 2], [855, 768, 11, 8, 11, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 12, 11, 8, 3], [1, 106, 14, 4, 10, 3], [1, 157, 18, 7, 14, 3], [1, 207, 16, 13, 12, 2], [1, 259, 18, 11, 14, 3], [1, 310, 15, 11, 14, 3], [1, 361, 12, 4, 8, 3], [1, 411, 15, 13, 10, 2], [1, 462, 13, 13, 10, 2], [1, 514, 16, 7, 13, 3], [1, 567, 14, 7, 12, 5], [1, 624, 9, 5, 9, 11], [1, 671, 14, 3, 12, 7], [1, 726, 8, 3, 8, 11], [1, 768, 17, 12, 12, 2], [62, 4, 16, 11, 13, 3], [62, 55, 15, 11, 13, 3], [62, 106, 17, 11, 13, 3], [62, 157, 17, 11, 13, 3], [62, 208, 17, 11, 13, 3], [62, 259, 17, 11, 13, 3], [62, 310, 16, 11, 13, 3], [62, 361, 17, 11, 13, 3], [62, 412, 17, 11, 13, 3], [62, 463, 17, 11, 13, 3], [62, 517, 11, 8, 8, 6], [62, 568, 12, 10, 9, 6], [62, 618, 14, 9, 11, 5], [62, 671, 14, 6, 12, 7], [62, 720, 13, 9, 11, 5], [62, 769, 17, 11, 13, 3], [123, 5, 18, 10, 15, 4], [123, 55, 15, 11, 14, 3], [123, 106, 17, 11, 13, 3], [123, 157, 17, 11, 13, 3], [123, 208, 16, 11, 13, 3], [123, 259, 16, 11, 12, 3], [123, 310, 16, 11, 12, 3], [123, 361, 17, 11, 13, 3], [123, 412, 17, 11, 13, 3], [123, 463, 13, 11, 10, 3], [123, 514, 16, 11, 12, 3], [123, 565, 17, 11, 13, 3], [123, 616, 12, 11, 12, 3], [123, 667, 18, 11, 14, 3], [123, 718, 17, 11, 13, 3], [123, 769, 17, 11, 13, 3], [184, 4, 17, 11, 13, 3], [184, 55, 17, 12, 13, 3], [184, 106, 17, 11, 13, 3], [184, 157, 17, 11, 13, 3], [184, 208, 17, 11, 13, 3], [184, 259, 17, 11, 13, 3], [184, 310, 18, 11, 14, 3], [184, 361, 20, 11, 16, 3], [184, 412, 16, 11, 12, 3], [184, 463, 16, 11, 12, 3], [184, 514, 16, 11, 12, 3], [184, 564, 14, 13, 9, 2], [184, 615, 13, 12, 12, 2], [184, 666, 14, 13, 9, 2], [184, 718, 14, 4, 9, 3], [184, 777, 14, 3, 13, 11], [245, 4, 13, 4, 9, 3], [245, 57, 15, 9, 12, 5], [245, 106, 15, 11, 12, 3], [245, 159, 15, 9, 12, 5], [245, 208, 16, 11, 12, 3], [245, 261, 15, 9, 12, 5], [245, 310, 15, 11, 11, 3], [245, 363, 15, 12, 12, 5], [245, 412, 15, 11, 12, 3], [245, 463, 13, 11, 10, 3], [245, 514, 14, 14, 11, 3], [245, 565, 15, 11, 12, 3], [245, 616, 13, 11, 10, 3], [245, 669, 19, 9, 16, 5], [245, 720, 15, 9, 12, 5], [245, 771, 15, 9, 12, 5], [306, 6, 15, 11, 12, 5], [306, 57, 15, 11, 12, 5], [306, 108, 15, 9, 11, 5], [306, 159, 15, 9, 12, 5], [306, 208, 13, 11, 11, 3], [306, 261, 15, 9, 12, 5], [306, 312, 15, 9, 12, 5], [306, 363, 19, 9, 16, 5], [306, 414, 15, 9, 12, 5], [306, 465, 15, 12, 12, 5], [306, 516, 15, 9, 12, 5], [306, 564, 15, 13, 10, 2], [306, 615, 13, 13, 8, 2], [306, 666, 13, 13, 10, 2], [306, 718, 17, 4, 13, 3], [306, 766, 1, 1, 3, 1], [367, 2, 17, 13, 14, 1], [367, 52, 18, 14, 14, 0], [367, 106, 17, 14, 13, 3], [367, 154, 17, 14, 12, 0], [367, 205, 18, 14, 13, 0], [367, 257, 17, 13, 13, 1], [367, 308, 17, 13, 13, 1], [367, 360, 15, 12, 12, 2], [367, 411, 15, 12, 12, 2], [367, 462, 15, 12, 12, 2], [367, 514, 15, 11, 12, 3], [367, 564, 17, 12, 12, 2], [367, 613, 16, 14, 12, 0], [367, 669, 15, 11, 12, 5], [367, 717, 15, 12, 12, 2], [367, 768, 15, 12, 12, 2], [428, 3, 15, 12, 12, 2], [428, 55, 15, 11, 12, 3], [428, 105, 15, 12, 10, 2], [428, 156, 13, 12, 10, 2], [428, 207, 14, 12, 10, 2], [428, 259, 14, 11, 10, 3], [428, 309, 17, 12, 12, 2], [428, 360, 16, 12, 12, 2], [428, 411, 15, 12, 12, 2], [428, 462, 15, 12, 12, 2], [428, 514, 15, 11, 12, 3], [428, 564, 17, 12, 12, 2], [428, 615, 16, 12, 12, 2], [428, 666, 15, 12, 12, 2], [428, 717, 15, 12, 12, 2], [428, 769, 15, 11, 12, 3], [489, 3, 14, 7, 10, 2], [489, 55, 15, 6, 11, 3], [489, 107, 15, 11, 12, 4], [489, 157, 16, 11, 13, 3], [489, 208, 17, 12, 13, 3], [489, 261, 16, 8, 13, 5], [489, 310, 17, 11, 13, 3], [489, 361, 17, 11, 14, 3], [489, 413, 18, 10, 15, 4], [489, 464, 18, 10, 15, 4], [489, 514, 20, 6, 16, 3], [489, 565, 13, 4, 9, 3], [489, 616, 14, 3, 10, 3], [489, 670, 15, 8, 13, 6], [489, 718, 21, 11, 17, 3], [489, 769, 18, 11, 13, 3], [550, 7, 18, 7, 16, 6], [550, 57, 14, 9, 12, 5], [550, 108, 13, 9, 11, 5], [550, 159, 13, 9, 11, 5], [550, 208, 16, 11, 12, 3], [550, 261, 16, 11, 14, 5], [550, 310, 15, 11, 12, 3], [550, 361, 17, 11, 13, 3], [550, 412, 18, 11, 14, 3], [550, 464, 19, 10, 15, 4], [550, 514, 14, 14, 10, 3], [550, 565, 15, 9, 11, 3], [550, 616, 15, 9, 11, 3], [550, 667, 18, 11, 15, 3], [550, 720, 19, 9, 16, 5], [550, 771, 16, 9, 12, 5], [611, 4, 14, 11, 13, 3], [611, 55, 13, 11, 9, 3], [611, 110, 14, 5, 12, 7], [611, 156, 20, 12, 15, 2], [611, 208, 14, 14, 10, 3], [611, 262, 16, 7, 13, 6], [611, 311, 15, 10, 14, 4], [611, 365, 15, 7, 13, 7], [611, 416, 14, 7, 13, 7], [611, 471, 15, 3, 15, 11], [611, 511, 1, 1, 13, 1], [611, 562, 16, 14, 14, 0], [611, 613, 19, 14, 14, 0], [611, 664, 18, 14, 13, 0], [611, 718, 21, 11, 17, 3], [611, 771, 19, 9, 16, 5], [672, 9, 13, 3, 11, 8], [672, 60, 16, 3, 14, 8], [672, 105, 17, 5, 12, 2], [672, 156, 17, 5, 12, 2], [672, 207, 14, 5, 9, 2], [672, 258, 14, 5, 9, 2], [672, 312, 14, 7, 12, 5], [672, 362, 16, 10, 14, 4], [672, 412, 16, 14, 13, 3], [1, 1, 1, 1, 9, 1], [794, 769, 19, 11, 15, 3], [672, 565, 19, 11, 15, 3], [672, 616, 19, 11, 15, 3], [672, 667, 19, 11, 15, 3], [672, 718, 19, 11, 15, 3], [672, 769, 19, 11, 15, 3], [733, 4, 19, 11, 15, 3], [733, 55, 19, 11, 15, 3], [733, 106, 19, 11, 15, 3], [733, 157, 19, 11, 15, 3], [733, 208, 19, 11, 15, 3], [733, 259, 19, 11, 15, 3], [733, 310, 19, 11, 15, 3], [733, 361, 19, 11, 15, 3], [733, 412, 19, 11, 15, 3], [733, 463, 19, 11, 15, 3], [733, 514, 19, 11, 15, 3], [733, 565, 19, 11, 15, 3], [733, 616, 19, 11, 15, 3], [733, 667, 19, 11, 15, 3], [733, 718, 19, 11, 15, 3], [733, 769, 19, 11, 15, 3], [1, 1, 1, 1, 9, 1], [794, 55, 19, 11, 15, 3], [794, 106, 19, 11, 15, 3], [794, 157, 19, 11, 15, 3], [794, 208, 19, 11, 15, 3], [794, 259, 19, 11, 15, 3], [794, 310, 19, 11, 15, 3], [794, 361, 19, 11, 15, 3], [794, 412, 19, 11, 15, 3], [794, 463, 19, 11, 15, 3], [794, 514, 19, 11, 15, 3], [794, 565, 19, 11, 15, 3], [794, 616, 19, 11, 15, 3], [794, 667, 19, 11, 15, 3], [794, 718, 19, 11, 15, 3], [794, 769, 19, 11, 15, 3], [855, 4, 19, 11, 15, 3], [855, 55, 19, 11, 15, 3], [855, 106, 19, 11, 15, 3], [855, 157, 19, 11, 15, 3], [855, 208, 19, 11, 15, 3], [855, 259, 19, 11, 15, 3], [855, 310, 19, 11, 15, 3], [855, 361, 19, 11, 15, 3], [855, 412, 19, 11, 15, 3], [855, 463, 19, 11, 15, 3], [855, 514, 19, 11, 15, 3], [855, 565, 19, 11, 15, 3], [855, 616, 19, 11, 15, 3], [855, 667, 19, 11, 15, 3], [855, 718, 19, 11, 15, 3], [855, 769, 19, 11, 15, 3]], \"capHeight\": 13, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 11, 9, 7, 3], [1, 106, 13, 2, 9, 3], [1, 157, 17, 5, 13, 3], [1, 207, 15, 11, 11, 2], [1, 259, 17, 9, 13, 3], [1, 310, 14, 9, 13, 3], [1, 361, 11, 2, 7, 3], [1, 411, 14, 11, 9, 2], [1, 462, 12, 11, 9, 2], [1, 514, 15, 5, 12, 3], [1, 567, 13, 5, 11, 5], [1, 624, 8, 3, 8, 11], [1, 671, 13, 1, 11, 7], [1, 726, 7, 1, 7, 11], [1, 768, 16, 10, 11, 2], [62, 4, 15, 9, 12, 3], [62, 55, 14, 9, 12, 3], [62, 106, 16, 9, 12, 3], [62, 157, 16, 9, 12, 3], [62, 208, 16, 9, 12, 3], [62, 259, 16, 9, 12, 3], [62, 310, 15, 9, 12, 3], [62, 361, 16, 9, 12, 3], [62, 412, 16, 9, 12, 3], [62, 463, 16, 9, 12, 3], [62, 517, 10, 6, 7, 6], [62, 568, 11, 8, 8, 6], [62, 618, 13, 7, 10, 5], [62, 671, 13, 4, 11, 7], [62, 720, 12, 7, 10, 5], [62, 769, 16, 9, 12, 3], [123, 5, 17, 8, 14, 4], [123, 55, 14, 9, 13, 3], [123, 106, 16, 9, 12, 3], [123, 157, 16, 9, 12, 3], [123, 208, 15, 9, 12, 3], [123, 259, 15, 9, 11, 3], [123, 310, 15, 9, 11, 3], [123, 361, 16, 9, 12, 3], [123, 412, 16, 9, 12, 3], [123, 463, 12, 9, 9, 3], [123, 514, 15, 9, 11, 3], [123, 565, 16, 9, 12, 3], [123, 616, 11, 9, 11, 3], [123, 667, 17, 9, 13, 3], [123, 718, 16, 9, 12, 3], [123, 769, 16, 9, 12, 3], [184, 4, 16, 9, 12, 3], [184, 55, 16, 10, 12, 3], [184, 106, 16, 9, 12, 3], [184, 157, 16, 9, 12, 3], [184, 208, 16, 9, 12, 3], [184, 259, 16, 9, 12, 3], [184, 310, 17, 9, 13, 3], [184, 361, 19, 9, 15, 3], [184, 412, 15, 9, 11, 3], [184, 463, 15, 9, 11, 3], [184, 514, 15, 9, 11, 3], [184, 564, 13, 11, 8, 2], [184, 615, 12, 10, 11, 2], [184, 666, 13, 11, 8, 2], [184, 718, 13, 2, 8, 3], [184, 777, 13, 1, 12, 11], [245, 4, 12, 2, 8, 3], [245, 57, 14, 7, 11, 5], [245, 106, 14, 9, 11, 3], [245, 159, 14, 7, 11, 5], [245, 208, 15, 9, 11, 3], [245, 261, 14, 7, 11, 5], [245, 310, 14, 9, 10, 3], [245, 363, 14, 10, 11, 5], [245, 412, 14, 9, 11, 3], [245, 463, 12, 9, 9, 3], [245, 514, 13, 12, 10, 3], [245, 565, 14, 9, 11, 3], [245, 616, 12, 9, 9, 3], [245, 669, 18, 7, 15, 5], [245, 720, 14, 7, 11, 5], [245, 771, 14, 7, 11, 5], [306, 6, 14, 9, 11, 5], [306, 57, 14, 9, 11, 5], [306, 108, 14, 7, 10, 5], [306, 159, 14, 7, 11, 5], [306, 208, 12, 9, 10, 3], [306, 261, 14, 7, 11, 5], [306, 312, 14, 7, 11, 5], [306, 363, 18, 7, 15, 5], [306, 414, 14, 7, 11, 5], [306, 465, 14, 10, 11, 5], [306, 516, 14, 7, 11, 5], [306, 564, 14, 11, 9, 2], [306, 615, 12, 11, 7, 2], [306, 666, 12, 11, 9, 2], [306, 718, 16, 2, 12, 3], [306, 766, 1, 1, 3, 1], [367, 2, 16, 11, 13, 1], [367, 52, 17, 12, 13, 0], [367, 106, 16, 12, 12, 3], [367, 154, 15, 12, 11, 0], [367, 205, 16, 12, 12, 0], [367, 257, 16, 11, 12, 1], [367, 308, 16, 11, 12, 1], [367, 360, 14, 10, 11, 2], [367, 411, 14, 10, 11, 2], [367, 462, 14, 10, 11, 2], [367, 514, 14, 9, 11, 3], [367, 564, 16, 10, 11, 2], [367, 613, 15, 12, 11, 0], [367, 669, 14, 9, 11, 5], [367, 717, 14, 10, 11, 2], [367, 768, 14, 10, 11, 2], [428, 3, 14, 10, 11, 2], [428, 55, 14, 9, 11, 3], [428, 105, 14, 10, 9, 2], [428, 156, 12, 10, 9, 2], [428, 207, 13, 10, 9, 2], [428, 259, 13, 9, 9, 3], [428, 309, 16, 10, 11, 2], [428, 360, 15, 10, 11, 2], [428, 411, 14, 10, 11, 2], [428, 462, 14, 10, 11, 2], [428, 514, 14, 9, 11, 3], [428, 564, 16, 10, 11, 2], [428, 615, 15, 10, 11, 2], [428, 666, 14, 10, 11, 2], [428, 717, 14, 10, 11, 2], [428, 769, 14, 9, 11, 3], [489, 3, 13, 5, 9, 2], [489, 55, 14, 4, 10, 3], [489, 107, 14, 9, 11, 4], [489, 157, 15, 9, 12, 3], [489, 208, 16, 10, 12, 3], [489, 261, 15, 6, 12, 5], [489, 310, 16, 9, 12, 3], [489, 361, 16, 9, 13, 3], [489, 413, 17, 8, 14, 4], [489, 464, 17, 8, 14, 4], [489, 514, 19, 4, 15, 3], [489, 565, 12, 2, 8, 3], [489, 616, 13, 1, 9, 3], [489, 670, 14, 6, 12, 6], [489, 718, 20, 9, 16, 3], [489, 769, 17, 9, 12, 3], [550, 7, 17, 5, 15, 6], [550, 57, 13, 7, 11, 5], [550, 108, 12, 7, 10, 5], [550, 159, 12, 7, 10, 5], [550, 208, 15, 9, 11, 3], [550, 261, 15, 9, 13, 5], [550, 310, 14, 9, 11, 3], [550, 361, 16, 9, 12, 3], [550, 412, 17, 9, 13, 3], [550, 464, 18, 8, 14, 4], [550, 514, 13, 12, 9, 3], [550, 565, 14, 7, 10, 3], [550, 616, 14, 7, 10, 3], [550, 667, 17, 9, 14, 3], [550, 720, 18, 7, 15, 5], [550, 771, 15, 7, 11, 5], [611, 4, 13, 9, 12, 3], [611, 55, 12, 9, 8, 3], [611, 110, 13, 3, 11, 7], [611, 156, 19, 10, 14, 2], [611, 208, 13, 12, 9, 3], [611, 262, 15, 5, 12, 6], [611, 311, 14, 8, 13, 4], [611, 365, 14, 5, 12, 7], [611, 416, 13, 5, 12, 7], [611, 471, 14, 1, 14, 11], [611, 511, 1, 1, 12, 1], [611, 562, 15, 12, 13, 0], [611, 613, 17, 12, 13, 0], [611, 664, 16, 12, 12, 0], [611, 718, 20, 9, 16, 3], [611, 771, 18, 7, 15, 5], [672, 9, 12, 1, 10, 8], [672, 60, 15, 1, 13, 8], [672, 105, 16, 3, 11, 2], [672, 156, 16, 3, 11, 2], [672, 207, 13, 3, 8, 2], [672, 258, 13, 3, 8, 2], [672, 312, 13, 5, 11, 5], [672, 362, 15, 8, 13, 4], [672, 412, 15, 12, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 18, 9, 14, 3], [672, 565, 18, 9, 14, 3], [672, 616, 18, 9, 14, 3], [672, 667, 18, 9, 14, 3], [672, 718, 18, 9, 14, 3], [672, 769, 18, 9, 14, 3], [733, 4, 18, 9, 14, 3], [733, 55, 18, 9, 14, 3], [733, 106, 18, 9, 14, 3], [733, 157, 18, 9, 14, 3], [733, 208, 18, 9, 14, 3], [733, 259, 18, 9, 14, 3], [733, 310, 18, 9, 14, 3], [733, 361, 18, 9, 14, 3], [733, 412, 18, 9, 14, 3], [733, 463, 18, 9, 14, 3], [733, 514, 18, 9, 14, 3], [733, 565, 18, 9, 14, 3], [733, 616, 18, 9, 14, 3], [733, 667, 18, 9, 14, 3], [733, 718, 18, 9, 14, 3], [733, 769, 18, 9, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 18, 9, 14, 3], [794, 106, 18, 9, 14, 3], [794, 157, 18, 9, 14, 3], [794, 208, 18, 9, 14, 3], [794, 259, 18, 9, 14, 3], [794, 310, 18, 9, 14, 3], [794, 361, 18, 9, 14, 3], [794, 412, 18, 9, 14, 3], [794, 463, 18, 9, 14, 3], [794, 514, 18, 9, 14, 3], [794, 565, 18, 9, 14, 3], [794, 616, 18, 9, 14, 3], [794, 667, 18, 9, 14, 3], [794, 718, 18, 9, 14, 3], [794, 769, 18, 9, 14, 3], [855, 4, 18, 9, 14, 3], [855, 55, 18, 9, 14, 3], [855, 106, 18, 9, 14, 3], [855, 157, 18, 9, 14, 3], [855, 208, 18, 9, 14, 3], [855, 259, 18, 9, 14, 3], [855, 310, 18, 9, 14, 3], [855, 361, 18, 9, 14, 3], [855, 412, 18, 9, 14, 3], [855, 463, 18, 9, 14, 3], [855, 514, 18, 9, 14, 3], [855, 565, 18, 9, 14, 3], [855, 616, 18, 9, 14, 3], [855, 667, 18, 9, 14, 3], [855, 718, 18, 9, 14, 3], [855, 769, 18, 9, 14, 3]], \"capHeight\": 12, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 9, 6, 9, 7], [1, 55, 8, 11, 8, 3], [1, 106, 10, 10, 10, 3], [1, 157, 14, 10, 14, 3], [1, 207, 12, 13, 12, 2], [1, 259, 14, 11, 14, 3], [1, 310, 14, 11, 14, 3], [1, 361, 8, 10, 8, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 514, 13, 10, 13, 3], [1, 567, 12, 8, 12, 5], [1, 620, 9, 9, 9, 7], [1, 671, 12, 6, 12, 7], [1, 722, 8, 7, 8, 7], [1, 768, 12, 12, 12, 2], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 11, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 11, 13, 3], [62, 310, 13, 11, 13, 3], [62, 361, 13, 11, 13, 3], [62, 412, 13, 11, 13, 3], [62, 463, 13, 11, 13, 3], [62, 517, 8, 8, 8, 6], [62, 568, 9, 10, 9, 6], [62, 618, 11, 9, 11, 5], [62, 671, 12, 6, 12, 7], [62, 720, 11, 9, 11, 5], [62, 769, 13, 11, 13, 3], [123, 5, 15, 10, 15, 4], [123, 55, 14, 11, 14, 3], [123, 106, 13, 11, 13, 3], [123, 157, 13, 11, 13, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 13, 11, 13, 3], [123, 412, 13, 11, 13, 3], [123, 463, 10, 11, 10, 3], [123, 514, 12, 11, 12, 3], [123, 565, 13, 11, 13, 3], [123, 616, 12, 11, 12, 3], [123, 667, 14, 11, 14, 3], [123, 718, 13, 11, 13, 3], [123, 769, 13, 11, 13, 3], [184, 4, 13, 11, 13, 3], [184, 55, 13, 12, 13, 3], [184, 106, 13, 11, 13, 3], [184, 157, 13, 11, 13, 3], [184, 208, 13, 11, 13, 3], [184, 259, 13, 11, 13, 3], [184, 310, 14, 11, 14, 3], [184, 361, 16, 11, 16, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 12, 11, 12, 3], [184, 564, 9, 13, 9, 2], [184, 615, 12, 12, 12, 2], [184, 666, 9, 13, 9, 2], [184, 718, 9, 10, 9, 3], [184, 773, 13, 7, 13, 7], [245, 4, 9, 10, 9, 3], [245, 57, 12, 9, 12, 5], [245, 106, 12, 11, 12, 3], [245, 159, 12, 9, 12, 5], [245, 208, 12, 11, 12, 3], [245, 261, 12, 9, 12, 5], [245, 310, 11, 11, 11, 3], [245, 363, 12, 12, 12, 5], [245, 412, 12, 11, 12, 3], [245, 463, 10, 11, 10, 3], [245, 514, 11, 14, 11, 3], [245, 565, 12, 11, 12, 3], [245, 616, 10, 11, 10, 3], [245, 669, 16, 9, 16, 5], [245, 720, 12, 9, 12, 5], [245, 771, 12, 9, 12, 5], [306, 6, 12, 11, 12, 5], [306, 57, 12, 11, 12, 5], [306, 108, 11, 9, 11, 5], [306, 159, 12, 9, 12, 5], [306, 208, 11, 11, 11, 3], [306, 261, 12, 9, 12, 5], [306, 312, 12, 9, 12, 5], [306, 363, 16, 9, 16, 5], [306, 414, 12, 9, 12, 5], [306, 465, 12, 12, 12, 5], [306, 516, 12, 9, 12, 5], [306, 564, 10, 13, 10, 2], [306, 615, 8, 13, 8, 2], [306, 666, 10, 13, 10, 2], [306, 718, 13, 10, 13, 3], [306, 773, 3, 6, 3, 7], [367, 2, 14, 13, 14, 1], [367, 52, 14, 14, 14, 0], [367, 106, 13, 14, 13, 3], [367, 154, 12, 14, 12, 0], [367, 205, 13, 14, 13, 0], [367, 257, 13, 13, 13, 1], [367, 308, 13, 13, 13, 1], [367, 360, 12, 12, 12, 2], [367, 411, 12, 12, 12, 2], [367, 462, 12, 12, 12, 2], [367, 514, 12, 11, 12, 3], [367, 564, 12, 12, 12, 2], [367, 613, 12, 14, 12, 0], [367, 669, 12, 11, 12, 5], [367, 717, 12, 12, 12, 2], [367, 768, 12, 12, 12, 2], [428, 3, 12, 12, 12, 2], [428, 55, 12, 11, 12, 3], [428, 105, 10, 12, 10, 2], [428, 156, 10, 12, 10, 2], [428, 207, 10, 12, 10, 2], [428, 259, 10, 11, 10, 3], [428, 309, 12, 12, 12, 2], [428, 360, 12, 12, 12, 2], [428, 411, 12, 12, 12, 2], [428, 462, 12, 12, 12, 2], [428, 514, 12, 11, 12, 3], [428, 564, 12, 12, 12, 2], [428, 615, 12, 12, 12, 2], [428, 666, 12, 12, 12, 2], [428, 717, 12, 12, 12, 2], [428, 769, 12, 11, 12, 3], [489, 3, 10, 11, 10, 2], [489, 55, 11, 10, 11, 3], [489, 107, 12, 11, 12, 4], [489, 157, 13, 11, 13, 3], [489, 208, 13, 12, 13, 3], [489, 261, 13, 8, 13, 5], [489, 310, 13, 11, 13, 3], [489, 361, 14, 11, 14, 3], [489, 413, 15, 10, 15, 4], [489, 464, 15, 10, 15, 4], [489, 514, 16, 10, 16, 3], [489, 565, 9, 10, 9, 3], [489, 616, 10, 10, 10, 3], [489, 670, 13, 8, 13, 6], [489, 718, 17, 11, 17, 3], [489, 769, 13, 11, 13, 3], [550, 7, 16, 7, 16, 6], [550, 57, 12, 9, 12, 5], [550, 108, 11, 9, 11, 5], [550, 159, 11, 9, 11, 5], [550, 208, 12, 11, 12, 3], [550, 261, 14, 11, 14, 5], [550, 310, 12, 11, 12, 3], [550, 361, 13, 11, 13, 3], [550, 412, 14, 11, 14, 3], [550, 464, 15, 10, 15, 4], [550, 514, 10, 14, 10, 3], [550, 565, 11, 10, 11, 3], [550, 616, 11, 10, 11, 3], [550, 667, 15, 11, 15, 3], [550, 720, 16, 9, 16, 5], [550, 771, 12, 9, 12, 5], [611, 4, 13, 11, 13, 3], [611, 55, 9, 11, 9, 3], [611, 110, 12, 6, 12, 7], [611, 156, 15, 12, 15, 2], [611, 208, 10, 14, 10, 3], [611, 262, 13, 7, 13, 6], [611, 311, 14, 10, 14, 4], [611, 365, 13, 7, 13, 7], [611, 416, 13, 7, 13, 7], [611, 467, 15, 7, 15, 7], [611, 518, 13, 6, 13, 7], [611, 562, 14, 14, 14, 0], [611, 613, 14, 14, 14, 0], [611, 664, 13, 14, 13, 0], [611, 718, 17, 11, 17, 3], [611, 771, 16, 9, 16, 5], [672, 8, 11, 6, 11, 7], [672, 59, 14, 6, 14, 7], [672, 105, 12, 11, 12, 2], [672, 156, 12, 11, 12, 2], [672, 207, 9, 11, 9, 2], [672, 258, 9, 11, 9, 2], [672, 312, 12, 8, 12, 5], [672, 362, 14, 10, 14, 4], [672, 412, 13, 14, 13, 3], [1, 8, 9, 6, 9, 7], [794, 769, 15, 11, 15, 3], [672, 565, 15, 11, 15, 3], [672, 616, 15, 11, 15, 3], [672, 667, 15, 11, 15, 3], [672, 718, 15, 11, 15, 3], [672, 769, 15, 11, 15, 3], [733, 4, 15, 11, 15, 3], [733, 55, 15, 11, 15, 3], [733, 106, 15, 11, 15, 3], [733, 157, 15, 11, 15, 3], [733, 208, 15, 11, 15, 3], [733, 259, 15, 11, 15, 3], [733, 310, 15, 11, 15, 3], [733, 361, 15, 11, 15, 3], [733, 412, 15, 11, 15, 3], [733, 463, 15, 11, 15, 3], [733, 514, 15, 11, 15, 3], [733, 565, 15, 11, 15, 3], [733, 616, 15, 11, 15, 3], [733, 667, 15, 11, 15, 3], [733, 718, 15, 11, 15, 3], [733, 769, 15, 11, 15, 3], [1, 8, 9, 6, 9, 7], [794, 55, 15, 11, 15, 3], [794, 106, 15, 11, 15, 3], [794, 157, 15, 11, 15, 3], [794, 208, 15, 11, 15, 3], [794, 259, 15, 11, 15, 3], [794, 310, 15, 11, 15, 3], [794, 361, 15, 11, 15, 3], [794, 412, 15, 11, 15, 3], [794, 463, 15, 11, 15, 3], [794, 514, 15, 11, 15, 3], [794, 565, 15, 11, 15, 3], [794, 616, 15, 11, 15, 3], [794, 667, 15, 11, 15, 3], [794, 718, 15, 11, 15, 3], [794, 769, 15, 11, 15, 3], [855, 4, 15, 11, 15, 3], [855, 55, 15, 11, 15, 3], [855, 106, 15, 11, 15, 3], [855, 157, 15, 11, 15, 3], [855, 208, 15, 11, 15, 3], [855, 259, 15, 11, 15, 3], [855, 310, 15, 11, 15, 3], [855, 361, 15, 11, 15, 3], [855, 412, 15, 11, 15, 3], [855, 463, 15, 11, 15, 3], [855, 514, 15, 11, 15, 3], [855, 565, 15, 11, 15, 3], [855, 616, 15, 11, 15, 3], [855, 667, 15, 11, 15, 3], [855, 718, 15, 11, 15, 3], [855, 769, 15, 11, 15, 3]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 8, 6, 8, 6], [1, 55, 7, 9, 7, 3], [1, 106, 9, 9, 9, 3], [1, 157, 13, 9, 13, 3], [1, 207, 11, 11, 11, 2], [1, 259, 13, 9, 13, 3], [1, 310, 13, 9, 13, 3], [1, 361, 7, 9, 7, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 514, 12, 9, 12, 3], [1, 567, 11, 7, 11, 5], [1, 619, 8, 8, 8, 6], [1, 670, 11, 6, 11, 6], [1, 721, 7, 6, 7, 6], [1, 768, 11, 10, 11, 2], [62, 4, 12, 9, 12, 3], [62, 55, 12, 9, 12, 3], [62, 106, 12, 9, 12, 3], [62, 157, 12, 9, 12, 3], [62, 208, 12, 9, 12, 3], [62, 259, 12, 9, 12, 3], [62, 310, 12, 9, 12, 3], [62, 361, 12, 9, 12, 3], [62, 412, 12, 9, 12, 3], [62, 463, 12, 9, 12, 3], [62, 517, 7, 6, 7, 6], [62, 568, 8, 8, 8, 6], [62, 618, 10, 7, 10, 5], [62, 670, 11, 6, 11, 6], [62, 720, 10, 7, 10, 5], [62, 769, 12, 9, 12, 3], [123, 5, 14, 8, 14, 4], [123, 55, 13, 9, 13, 3], [123, 106, 12, 9, 12, 3], [123, 157, 12, 9, 12, 3], [123, 208, 12, 9, 12, 3], [123, 259, 11, 9, 11, 3], [123, 310, 11, 9, 11, 3], [123, 361, 12, 9, 12, 3], [123, 412, 12, 9, 12, 3], [123, 463, 9, 9, 9, 3], [123, 514, 11, 9, 11, 3], [123, 565, 12, 9, 12, 3], [123, 616, 11, 9, 11, 3], [123, 667, 13, 9, 13, 3], [123, 718, 12, 9, 12, 3], [123, 769, 12, 9, 12, 3], [184, 4, 12, 9, 12, 3], [184, 55, 12, 10, 12, 3], [184, 106, 12, 9, 12, 3], [184, 157, 12, 9, 12, 3], [184, 208, 12, 9, 12, 3], [184, 259, 12, 9, 12, 3], [184, 310, 13, 9, 13, 3], [184, 361, 15, 9, 15, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 11, 9, 11, 3], [184, 564, 8, 11, 8, 2], [184, 615, 11, 10, 11, 2], [184, 666, 8, 11, 8, 2], [184, 718, 8, 9, 8, 3], [184, 772, 12, 6, 12, 6], [245, 4, 8, 9, 8, 3], [245, 57, 11, 7, 11, 5], [245, 106, 11, 9, 11, 3], [245, 159, 11, 7, 11, 5], [245, 208, 11, 9, 11, 3], [245, 261, 11, 7, 11, 5], [245, 310, 10, 9, 10, 3], [245, 363, 11, 10, 11, 5], [245, 412, 11, 9, 11, 3], [245, 463, 9, 9, 9, 3], [245, 514, 10, 12, 10, 3], [245, 565, 11, 9, 11, 3], [245, 616, 9, 9, 9, 3], [245, 669, 15, 7, 15, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 9, 11, 5], [306, 57, 11, 9, 11, 5], [306, 108, 10, 7, 10, 5], [306, 159, 11, 7, 11, 5], [306, 208, 10, 9, 10, 3], [306, 261, 11, 7, 11, 5], [306, 312, 11, 7, 11, 5], [306, 363, 15, 7, 15, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 10, 11, 5], [306, 516, 11, 7, 11, 5], [306, 564, 9, 11, 9, 2], [306, 615, 7, 11, 7, 2], [306, 666, 9, 11, 9, 2], [306, 718, 12, 9, 12, 3], [306, 772, 3, 6, 3, 6], [367, 2, 13, 11, 13, 1], [367, 52, 13, 12, 13, 0], [367, 106, 12, 12, 12, 3], [367, 154, 11, 12, 11, 0], [367, 205, 12, 12, 12, 0], [367, 257, 12, 11, 12, 1], [367, 308, 12, 11, 12, 1], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 462, 11, 10, 11, 2], [367, 514, 11, 9, 11, 3], [367, 564, 11, 10, 11, 2], [367, 613, 11, 12, 11, 0], [367, 669, 11, 9, 11, 5], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 3, 11, 10, 11, 2], [428, 55, 11, 9, 11, 3], [428, 105, 9, 10, 9, 2], [428, 156, 9, 10, 9, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 11, 10, 11, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 3, 9, 10, 9, 2], [489, 55, 10, 9, 10, 3], [489, 107, 11, 9, 11, 4], [489, 157, 12, 9, 12, 3], [489, 208, 12, 10, 12, 3], [489, 261, 12, 7, 12, 5], [489, 310, 12, 9, 12, 3], [489, 361, 13, 9, 13, 3], [489, 413, 14, 8, 14, 4], [489, 464, 14, 8, 14, 4], [489, 514, 15, 9, 15, 3], [489, 565, 8, 9, 8, 3], [489, 616, 9, 9, 9, 3], [489, 670, 12, 6, 12, 6], [489, 718, 16, 9, 16, 3], [489, 769, 12, 9, 12, 3], [550, 7, 15, 6, 15, 6], [550, 57, 11, 7, 11, 5], [550, 108, 10, 7, 10, 5], [550, 159, 10, 7, 10, 5], [550, 208, 11, 9, 11, 3], [550, 261, 13, 9, 13, 5], [550, 310, 11, 9, 11, 3], [550, 361, 12, 9, 12, 3], [550, 412, 13, 9, 13, 3], [550, 464, 14, 8, 14, 4], [550, 514, 9, 12, 9, 3], [550, 565, 10, 9, 10, 3], [550, 616, 10, 9, 10, 3], [550, 667, 14, 9, 14, 3], [550, 720, 15, 7, 15, 5], [550, 771, 11, 7, 11, 5], [611, 4, 12, 9, 12, 3], [611, 55, 8, 9, 8, 3], [611, 109, 11, 6, 11, 6], [611, 156, 14, 10, 14, 2], [611, 208, 9, 12, 9, 3], [611, 262, 12, 6, 12, 6], [611, 311, 13, 8, 13, 4], [611, 364, 12, 6, 12, 6], [611, 415, 12, 6, 12, 6], [611, 466, 14, 6, 14, 6], [611, 517, 12, 6, 12, 6], [611, 562, 13, 12, 13, 0], [611, 613, 13, 12, 13, 0], [611, 664, 12, 12, 12, 0], [611, 718, 16, 9, 16, 3], [611, 771, 15, 7, 15, 5], [672, 7, 10, 6, 10, 6], [672, 58, 13, 6, 13, 6], [672, 105, 11, 10, 11, 2], [672, 156, 11, 10, 11, 2], [672, 207, 8, 10, 8, 2], [672, 258, 8, 10, 8, 2], [672, 312, 11, 7, 11, 5], [672, 362, 13, 8, 13, 4], [672, 412, 12, 12, 12, 3], [1, 7, 8, 6, 8, 6], [794, 769, 14, 9, 14, 3], [672, 565, 14, 9, 14, 3], [672, 616, 14, 9, 14, 3], [672, 667, 14, 9, 14, 3], [672, 718, 14, 9, 14, 3], [672, 769, 14, 9, 14, 3], [733, 4, 14, 9, 14, 3], [733, 55, 14, 9, 14, 3], [733, 106, 14, 9, 14, 3], [733, 157, 14, 9, 14, 3], [733, 208, 14, 9, 14, 3], [733, 259, 14, 9, 14, 3], [733, 310, 14, 9, 14, 3], [733, 361, 14, 9, 14, 3], [733, 412, 14, 9, 14, 3], [733, 463, 14, 9, 14, 3], [733, 514, 14, 9, 14, 3], [733, 565, 14, 9, 14, 3], [733, 616, 14, 9, 14, 3], [733, 667, 14, 9, 14, 3], [733, 718, 14, 9, 14, 3], [733, 769, 14, 9, 14, 3], [1, 7, 8, 6, 8, 6], [794, 55, 14, 9, 14, 3], [794, 106, 14, 9, 14, 3], [794, 157, 14, 9, 14, 3], [794, 208, 14, 9, 14, 3], [794, 259, 14, 9, 14, 3], [794, 310, 14, 9, 14, 3], [794, 361, 14, 9, 14, 3], [794, 412, 14, 9, 14, 3], [794, 463, 14, 9, 14, 3], [794, 514, 14, 9, 14, 3], [794, 565, 14, 9, 14, 3], [794, 616, 14, 9, 14, 3], [794, 667, 14, 9, 14, 3], [794, 718, 14, 9, 14, 3], [794, 769, 14, 9, 14, 3], [855, 4, 14, 9, 14, 3], [855, 55, 14, 9, 14, 3], [855, 106, 14, 9, 14, 3], [855, 157, 14, 9, 14, 3], [855, 208, 14, 9, 14, 3], [855, 259, 14, 9, 14, 3], [855, 310, 14, 9, 14, 3], [855, 361, 14, 9, 14, 3], [855, 412, 14, 9, 14, 3], [855, 463, 14, 9, 14, 3], [855, 514, 14, 9, 14, 3], [855, 565, 14, 9, 14, 3], [855, 616, 14, 9, 14, 3], [855, 667, 14, 9, 14, 3], [855, 718, 14, 9, 14, 3], [855, 769, 14, 9, 14, 3]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 11, 11, 7, 3], [1, 106, 13, 4, 9, 3], [1, 157, 17, 7, 13, 3], [1, 207, 15, 13, 11, 2], [1, 259, 17, 11, 13, 3], [1, 310, 14, 11, 13, 3], [1, 361, 11, 4, 7, 3], [1, 411, 14, 13, 9, 2], [1, 462, 12, 13, 9, 2], [1, 514, 15, 7, 12, 3], [1, 567, 13, 7, 11, 5], [1, 624, 8, 5, 8, 11], [1, 671, 13, 3, 11, 7], [1, 726, 7, 3, 7, 11], [1, 768, 16, 12, 11, 2], [62, 4, 15, 11, 12, 3], [62, 55, 14, 11, 12, 3], [62, 106, 16, 11, 12, 3], [62, 157, 16, 11, 12, 3], [62, 208, 16, 11, 12, 3], [62, 259, 16, 11, 12, 3], [62, 310, 15, 11, 12, 3], [62, 361, 16, 11, 12, 3], [62, 412, 16, 11, 12, 3], [62, 463, 16, 11, 12, 3], [62, 517, 10, 8, 7, 6], [62, 568, 11, 10, 8, 6], [62, 618, 13, 9, 10, 5], [62, 671, 13, 6, 11, 7], [62, 720, 12, 9, 10, 5], [62, 769, 16, 11, 12, 3], [123, 5, 17, 10, 14, 4], [123, 55, 14, 11, 13, 3], [123, 106, 16, 11, 12, 3], [123, 157, 16, 11, 12, 3], [123, 208, 15, 11, 12, 3], [123, 259, 15, 11, 11, 3], [123, 310, 15, 11, 11, 3], [123, 361, 16, 11, 12, 3], [123, 412, 16, 11, 12, 3], [123, 463, 12, 11, 9, 3], [123, 514, 15, 11, 11, 3], [123, 565, 16, 11, 12, 3], [123, 616, 11, 11, 11, 3], [123, 667, 17, 11, 13, 3], [123, 718, 16, 11, 12, 3], [123, 769, 16, 11, 12, 3], [184, 4, 16, 11, 12, 3], [184, 55, 16, 12, 12, 3], [184, 106, 16, 11, 12, 3], [184, 157, 16, 11, 12, 3], [184, 208, 16, 11, 12, 3], [184, 259, 16, 11, 12, 3], [184, 310, 17, 11, 13, 3], [184, 361, 19, 11, 15, 3], [184, 412, 15, 11, 11, 3], [184, 463, 15, 11, 11, 3], [184, 514, 15, 11, 11, 3], [184, 564, 13, 13, 8, 2], [184, 615, 12, 12, 11, 2], [184, 666, 13, 13, 8, 2], [184, 718, 13, 4, 8, 3], [184, 777, 13, 3, 12, 11], [245, 4, 12, 4, 8, 3], [245, 57, 14, 9, 11, 5], [245, 106, 14, 11, 11, 3], [245, 159, 14, 9, 11, 5], [245, 208, 15, 11, 11, 3], [245, 261, 14, 9, 11, 5], [245, 310, 14, 11, 10, 3], [245, 363, 14, 12, 11, 5], [245, 412, 14, 11, 11, 3], [245, 463, 12, 11, 9, 3], [245, 514, 13, 14, 10, 3], [245, 565, 14, 11, 11, 3], [245, 616, 12, 11, 9, 3], [245, 669, 18, 9, 15, 5], [245, 720, 14, 9, 11, 5], [245, 771, 14, 9, 11, 5], [306, 6, 14, 11, 11, 5], [306, 57, 14, 11, 11, 5], [306, 108, 14, 9, 10, 5], [306, 159, 14, 9, 11, 5], [306, 208, 12, 11, 10, 3], [306, 261, 14, 9, 11, 5], [306, 312, 14, 9, 11, 5], [306, 363, 18, 9, 15, 5], [306, 414, 14, 9, 11, 5], [306, 465, 14, 12, 11, 5], [306, 516, 14, 9, 11, 5], [306, 564, 14, 13, 9, 2], [306, 615, 12, 13, 7, 2], [306, 666, 12, 13, 9, 2], [306, 718, 16, 4, 12, 3], [306, 766, 1, 1, 3, 1], [367, 2, 16, 13, 13, 1], [367, 52, 17, 14, 13, 0], [367, 106, 16, 14, 12, 3], [367, 154, 16, 14, 11, 0], [367, 205, 17, 14, 12, 0], [367, 257, 16, 13, 12, 1], [367, 308, 16, 13, 12, 1], [367, 360, 14, 12, 11, 2], [367, 411, 14, 12, 11, 2], [367, 462, 14, 12, 11, 2], [367, 514, 14, 11, 11, 3], [367, 564, 16, 12, 11, 2], [367, 613, 15, 14, 11, 0], [367, 669, 14, 11, 11, 5], [367, 717, 14, 12, 11, 2], [367, 768, 14, 12, 11, 2], [428, 3, 14, 12, 11, 2], [428, 55, 14, 11, 11, 3], [428, 105, 14, 12, 9, 2], [428, 156, 12, 12, 9, 2], [428, 207, 13, 12, 9, 2], [428, 259, 13, 11, 9, 3], [428, 309, 16, 12, 11, 2], [428, 360, 15, 12, 11, 2], [428, 411, 14, 12, 11, 2], [428, 462, 14, 12, 11, 2], [428, 514, 14, 11, 11, 3], [428, 564, 16, 12, 11, 2], [428, 615, 15, 12, 11, 2], [428, 666, 14, 12, 11, 2], [428, 717, 14, 12, 11, 2], [428, 769, 14, 11, 11, 3], [489, 3, 13, 7, 9, 2], [489, 55, 14, 6, 10, 3], [489, 107, 14, 11, 11, 4], [489, 157, 15, 11, 12, 3], [489, 208, 16, 12, 12, 3], [489, 261, 15, 8, 12, 5], [489, 310, 16, 11, 12, 3], [489, 361, 16, 11, 13, 3], [489, 413, 17, 10, 14, 4], [489, 464, 17, 10, 14, 4], [489, 514, 19, 6, 15, 3], [489, 565, 12, 4, 8, 3], [489, 616, 13, 3, 9, 3], [489, 670, 14, 8, 12, 6], [489, 718, 20, 11, 16, 3], [489, 769, 17, 11, 12, 3], [550, 7, 17, 7, 15, 6], [550, 57, 13, 9, 11, 5], [550, 108, 12, 9, 10, 5], [550, 159, 12, 9, 10, 5], [550, 208, 15, 11, 11, 3], [550, 261, 15, 11, 13, 5], [550, 310, 14, 11, 11, 3], [550, 361, 16, 11, 12, 3], [550, 412, 17, 11, 13, 3], [550, 464, 18, 10, 14, 4], [550, 514, 13, 14, 9, 3], [550, 565, 14, 9, 10, 3], [550, 616, 14, 9, 10, 3], [550, 667, 17, 11, 14, 3], [550, 720, 18, 9, 15, 5], [550, 771, 15, 9, 11, 5], [611, 4, 13, 11, 12, 3], [611, 55, 12, 11, 8, 3], [611, 110, 13, 5, 11, 7], [611, 156, 19, 12, 14, 2], [611, 208, 13, 14, 9, 3], [611, 262, 15, 7, 12, 6], [611, 311, 14, 10, 13, 4], [611, 365, 14, 7, 12, 7], [611, 416, 13, 7, 12, 7], [611, 471, 14, 3, 14, 11], [611, 511, 1, 1, 12, 1], [611, 562, 15, 14, 13, 0], [611, 613, 18, 14, 13, 0], [611, 664, 17, 14, 12, 0], [611, 718, 20, 11, 16, 3], [611, 771, 18, 9, 15, 5], [672, 9, 12, 3, 10, 8], [672, 60, 15, 3, 13, 8], [672, 105, 16, 5, 11, 2], [672, 156, 16, 5, 11, 2], [672, 207, 13, 5, 8, 2], [672, 258, 13, 5, 8, 2], [672, 312, 13, 7, 11, 5], [672, 362, 15, 10, 13, 4], [672, 412, 15, 14, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 18, 11, 14, 3], [672, 565, 18, 11, 14, 3], [672, 616, 18, 11, 14, 3], [672, 667, 18, 11, 14, 3], [672, 718, 18, 11, 14, 3], [672, 769, 18, 11, 14, 3], [733, 4, 18, 11, 14, 3], [733, 55, 18, 11, 14, 3], [733, 106, 18, 11, 14, 3], [733, 157, 18, 11, 14, 3], [733, 208, 18, 11, 14, 3], [733, 259, 18, 11, 14, 3], [733, 310, 18, 11, 14, 3], [733, 361, 18, 11, 14, 3], [733, 412, 18, 11, 14, 3], [733, 463, 18, 11, 14, 3], [733, 514, 18, 11, 14, 3], [733, 565, 18, 11, 14, 3], [733, 616, 18, 11, 14, 3], [733, 667, 18, 11, 14, 3], [733, 718, 18, 11, 14, 3], [733, 769, 18, 11, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 18, 11, 14, 3], [794, 106, 18, 11, 14, 3], [794, 157, 18, 11, 14, 3], [794, 208, 18, 11, 14, 3], [794, 259, 18, 11, 14, 3], [794, 310, 18, 11, 14, 3], [794, 361, 18, 11, 14, 3], [794, 412, 18, 11, 14, 3], [794, 463, 18, 11, 14, 3], [794, 514, 18, 11, 14, 3], [794, 565, 18, 11, 14, 3], [794, 616, 18, 11, 14, 3], [794, 667, 18, 11, 14, 3], [794, 718, 18, 11, 14, 3], [794, 769, 18, 11, 14, 3], [855, 4, 18, 11, 14, 3], [855, 55, 18, 11, 14, 3], [855, 106, 18, 11, 14, 3], [855, 157, 18, 11, 14, 3], [855, 208, 18, 11, 14, 3], [855, 259, 18, 11, 14, 3], [855, 310, 18, 11, 14, 3], [855, 361, 18, 11, 14, 3], [855, 412, 18, 11, 14, 3], [855, 463, 18, 11, 14, 3], [855, 514, 18, 11, 14, 3], [855, 565, 18, 11, 14, 3], [855, 616, 18, 11, 14, 3], [855, 667, 18, 11, 14, 3], [855, 718, 18, 11, 14, 3], [855, 769, 18, 11, 14, 3]], \"capHeight\": 13, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 10, 9, 6, 3], [1, 106, 12, 2, 8, 3], [1, 157, 16, 5, 12, 3], [1, 207, 14, 11, 10, 2], [1, 259, 16, 9, 12, 3], [1, 310, 13, 9, 12, 3], [1, 361, 10, 2, 6, 3], [1, 411, 13, 11, 8, 2], [1, 462, 11, 11, 8, 2], [1, 514, 14, 5, 11, 3], [1, 567, 12, 5, 10, 5], [1, 624, 7, 3, 7, 11], [1, 671, 12, 1, 10, 7], [1, 726, 6, 1, 6, 11], [1, 768, 15, 10, 10, 2], [62, 4, 14, 9, 11, 3], [62, 55, 13, 9, 11, 3], [62, 106, 15, 9, 11, 3], [62, 157, 15, 9, 11, 3], [62, 208, 15, 9, 11, 3], [62, 259, 15, 9, 11, 3], [62, 310, 14, 9, 11, 3], [62, 361, 15, 9, 11, 3], [62, 412, 15, 9, 11, 3], [62, 463, 15, 9, 11, 3], [62, 517, 9, 6, 6, 6], [62, 568, 10, 8, 7, 6], [62, 618, 12, 7, 9, 5], [62, 671, 12, 4, 10, 7], [62, 720, 11, 7, 9, 5], [62, 769, 15, 9, 11, 3], [123, 5, 16, 8, 13, 4], [123, 55, 13, 9, 12, 3], [123, 106, 15, 9, 11, 3], [123, 157, 15, 9, 11, 3], [123, 208, 14, 9, 11, 3], [123, 259, 14, 9, 10, 3], [123, 310, 14, 9, 10, 3], [123, 361, 15, 9, 11, 3], [123, 412, 15, 9, 11, 3], [123, 463, 11, 9, 8, 3], [123, 514, 14, 9, 10, 3], [123, 565, 15, 9, 11, 3], [123, 616, 10, 9, 10, 3], [123, 667, 16, 9, 12, 3], [123, 718, 15, 9, 11, 3], [123, 769, 15, 9, 11, 3], [184, 4, 15, 9, 11, 3], [184, 55, 15, 10, 11, 3], [184, 106, 15, 9, 11, 3], [184, 157, 15, 9, 11, 3], [184, 208, 15, 9, 11, 3], [184, 259, 15, 9, 11, 3], [184, 310, 16, 9, 12, 3], [184, 361, 18, 9, 14, 3], [184, 412, 14, 9, 10, 3], [184, 463, 14, 9, 10, 3], [184, 514, 14, 9, 10, 3], [184, 564, 12, 11, 7, 2], [184, 615, 11, 10, 10, 2], [184, 666, 12, 11, 7, 2], [184, 718, 12, 2, 7, 3], [184, 777, 12, 1, 11, 11], [245, 4, 11, 2, 7, 3], [245, 57, 13, 7, 10, 5], [245, 106, 13, 9, 10, 3], [245, 159, 13, 7, 10, 5], [245, 208, 14, 9, 10, 3], [245, 261, 13, 7, 10, 5], [245, 310, 13, 9, 9, 3], [245, 363, 13, 10, 10, 5], [245, 412, 13, 9, 10, 3], [245, 463, 11, 9, 8, 3], [245, 514, 12, 12, 9, 3], [245, 565, 13, 9, 10, 3], [245, 616, 11, 9, 8, 3], [245, 669, 17, 7, 14, 5], [245, 720, 13, 7, 10, 5], [245, 771, 13, 7, 10, 5], [306, 6, 13, 9, 10, 5], [306, 57, 13, 9, 10, 5], [306, 108, 13, 7, 9, 5], [306, 159, 13, 7, 10, 5], [306, 208, 11, 9, 9, 3], [306, 261, 13, 7, 10, 5], [306, 312, 13, 7, 10, 5], [306, 363, 17, 7, 14, 5], [306, 414, 13, 7, 10, 5], [306, 465, 13, 10, 10, 5], [306, 516, 13, 7, 10, 5], [306, 564, 13, 11, 8, 2], [306, 615, 11, 11, 6, 2], [306, 666, 11, 11, 8, 2], [306, 718, 15, 2, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 15, 11, 12, 1], [367, 52, 16, 12, 12, 0], [367, 106, 15, 12, 11, 3], [367, 154, 14, 12, 10, 0], [367, 205, 15, 12, 11, 0], [367, 257, 15, 11, 11, 1], [367, 308, 15, 11, 11, 1], [367, 360, 13, 10, 10, 2], [367, 411, 13, 10, 10, 2], [367, 462, 13, 10, 10, 2], [367, 514, 13, 9, 10, 3], [367, 564, 15, 10, 10, 2], [367, 613, 14, 12, 10, 0], [367, 669, 13, 9, 10, 5], [367, 717, 13, 10, 10, 2], [367, 768, 13, 10, 10, 2], [428, 3, 13, 10, 10, 2], [428, 55, 13, 9, 10, 3], [428, 105, 13, 10, 8, 2], [428, 156, 11, 10, 8, 2], [428, 207, 12, 10, 8, 2], [428, 259, 12, 9, 8, 3], [428, 309, 15, 10, 10, 2], [428, 360, 14, 10, 10, 2], [428, 411, 13, 10, 10, 2], [428, 462, 13, 10, 10, 2], [428, 514, 13, 9, 10, 3], [428, 564, 15, 10, 10, 2], [428, 615, 14, 10, 10, 2], [428, 666, 13, 10, 10, 2], [428, 717, 13, 10, 10, 2], [428, 769, 13, 9, 10, 3], [489, 3, 12, 5, 8, 2], [489, 55, 13, 4, 9, 3], [489, 107, 13, 9, 10, 4], [489, 157, 14, 9, 11, 3], [489, 208, 15, 10, 11, 3], [489, 261, 14, 6, 11, 5], [489, 310, 15, 9, 11, 3], [489, 361, 15, 9, 12, 3], [489, 413, 16, 8, 13, 4], [489, 464, 16, 8, 13, 4], [489, 514, 18, 4, 14, 3], [489, 565, 11, 2, 7, 3], [489, 616, 12, 1, 8, 3], [489, 670, 13, 6, 11, 6], [489, 718, 19, 9, 15, 3], [489, 769, 16, 9, 11, 3], [550, 7, 16, 5, 14, 6], [550, 57, 12, 7, 10, 5], [550, 108, 11, 7, 9, 5], [550, 159, 11, 7, 9, 5], [550, 208, 14, 9, 10, 3], [550, 261, 14, 9, 12, 5], [550, 310, 13, 9, 10, 3], [550, 361, 15, 9, 11, 3], [550, 412, 16, 9, 12, 3], [550, 464, 17, 8, 13, 4], [550, 514, 12, 12, 8, 3], [550, 565, 13, 7, 9, 3], [550, 616, 13, 7, 9, 3], [550, 667, 16, 9, 13, 3], [550, 720, 17, 7, 14, 5], [550, 771, 14, 7, 10, 5], [611, 4, 12, 9, 11, 3], [611, 55, 11, 9, 7, 3], [611, 110, 12, 3, 10, 7], [611, 156, 18, 10, 13, 2], [611, 208, 12, 12, 8, 3], [611, 262, 14, 5, 11, 6], [611, 311, 13, 8, 12, 4], [611, 365, 13, 5, 11, 7], [611, 416, 12, 5, 11, 7], [611, 471, 13, 1, 13, 11], [611, 511, 1, 1, 11, 1], [611, 562, 14, 12, 12, 0], [611, 613, 16, 12, 12, 0], [611, 664, 15, 12, 11, 0], [611, 718, 19, 9, 15, 3], [611, 771, 17, 7, 14, 5], [672, 9, 11, 1, 9, 8], [672, 60, 14, 1, 12, 8], [672, 105, 15, 3, 10, 2], [672, 156, 15, 3, 10, 2], [672, 207, 12, 3, 7, 2], [672, 258, 12, 3, 7, 2], [672, 312, 12, 5, 10, 5], [672, 362, 14, 8, 12, 4], [672, 412, 14, 12, 11, 3], [1, 1, 1, 1, 7, 1], [794, 769, 17, 9, 13, 3], [672, 565, 17, 9, 13, 3], [672, 616, 17, 9, 13, 3], [672, 667, 17, 9, 13, 3], [672, 718, 17, 9, 13, 3], [672, 769, 17, 9, 13, 3], [733, 4, 17, 9, 13, 3], [733, 55, 17, 9, 13, 3], [733, 106, 17, 9, 13, 3], [733, 157, 17, 9, 13, 3], [733, 208, 17, 9, 13, 3], [733, 259, 17, 9, 13, 3], [733, 310, 17, 9, 13, 3], [733, 361, 17, 9, 13, 3], [733, 412, 17, 9, 13, 3], [733, 463, 17, 9, 13, 3], [733, 514, 17, 9, 13, 3], [733, 565, 17, 9, 13, 3], [733, 616, 17, 9, 13, 3], [733, 667, 17, 9, 13, 3], [733, 718, 17, 9, 13, 3], [733, 769, 17, 9, 13, 3], [1, 1, 1, 1, 7, 1], [794, 55, 17, 9, 13, 3], [794, 106, 17, 9, 13, 3], [794, 157, 17, 9, 13, 3], [794, 208, 17, 9, 13, 3], [794, 259, 17, 9, 13, 3], [794, 310, 17, 9, 13, 3], [794, 361, 17, 9, 13, 3], [794, 412, 17, 9, 13, 3], [794, 463, 17, 9, 13, 3], [794, 514, 17, 9, 13, 3], [794, 565, 17, 9, 13, 3], [794, 616, 17, 9, 13, 3], [794, 667, 17, 9, 13, 3], [794, 718, 17, 9, 13, 3], [794, 769, 17, 9, 13, 3], [855, 4, 17, 9, 13, 3], [855, 55, 17, 9, 13, 3], [855, 106, 17, 9, 13, 3], [855, 157, 17, 9, 13, 3], [855, 208, 17, 9, 13, 3], [855, 259, 17, 9, 13, 3], [855, 310, 17, 9, 13, 3], [855, 361, 17, 9, 13, 3], [855, 412, 17, 9, 13, 3], [855, 463, 17, 9, 13, 3], [855, 514, 17, 9, 13, 3], [855, 565, 17, 9, 13, 3], [855, 616, 17, 9, 13, 3], [855, 667, 17, 9, 13, 3], [855, 718, 17, 9, 13, 3], [855, 769, 17, 9, 13, 3]], \"capHeight\": 12, \"widestlogicalchar\": 15, \"widestglyph\": 19, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 55, 7, 11, 7, 3], [1, 106, 9, 10, 9, 3], [1, 157, 13, 10, 13, 3], [1, 207, 11, 13, 11, 2], [1, 259, 13, 11, 13, 3], [1, 310, 13, 11, 13, 3], [1, 361, 7, 10, 7, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 514, 12, 10, 12, 3], [1, 567, 11, 8, 11, 5], [1, 620, 8, 9, 8, 7], [1, 671, 11, 6, 11, 7], [1, 722, 7, 7, 7, 7], [1, 768, 11, 12, 11, 2], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 517, 7, 8, 7, 6], [62, 568, 8, 10, 8, 6], [62, 618, 10, 9, 10, 5], [62, 671, 11, 6, 11, 7], [62, 720, 10, 9, 10, 5], [62, 769, 12, 11, 12, 3], [123, 5, 14, 10, 14, 4], [123, 55, 13, 11, 13, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 12, 11, 12, 3], [123, 412, 12, 11, 12, 3], [123, 463, 9, 11, 9, 3], [123, 514, 11, 11, 11, 3], [123, 565, 12, 11, 12, 3], [123, 616, 11, 11, 11, 3], [123, 667, 13, 11, 13, 3], [123, 718, 12, 11, 12, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 12, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 12, 11, 12, 3], [184, 208, 12, 11, 12, 3], [184, 259, 12, 11, 12, 3], [184, 310, 13, 11, 13, 3], [184, 361, 15, 11, 15, 3], [184, 412, 11, 11, 11, 3], [184, 463, 11, 11, 11, 3], [184, 514, 11, 11, 11, 3], [184, 564, 8, 13, 8, 2], [184, 615, 11, 12, 11, 2], [184, 666, 8, 13, 8, 2], [184, 718, 8, 10, 8, 3], [184, 773, 12, 7, 12, 7], [245, 4, 8, 10, 8, 3], [245, 57, 11, 9, 11, 5], [245, 106, 11, 11, 11, 3], [245, 159, 11, 9, 11, 5], [245, 208, 11, 11, 11, 3], [245, 261, 11, 9, 11, 5], [245, 310, 10, 11, 10, 3], [245, 363, 11, 12, 11, 5], [245, 412, 11, 11, 11, 3], [245, 463, 9, 11, 9, 3], [245, 514, 10, 14, 10, 3], [245, 565, 11, 11, 11, 3], [245, 616, 9, 11, 9, 3], [245, 669, 15, 9, 15, 5], [245, 720, 11, 9, 11, 5], [245, 771, 11, 9, 11, 5], [306, 6, 11, 11, 11, 5], [306, 57, 11, 11, 11, 5], [306, 108, 10, 9, 10, 5], [306, 159, 11, 9, 11, 5], [306, 208, 10, 11, 10, 3], [306, 261, 11, 9, 11, 5], [306, 312, 11, 9, 11, 5], [306, 363, 15, 9, 15, 5], [306, 414, 11, 9, 11, 5], [306, 465, 11, 12, 11, 5], [306, 516, 11, 9, 11, 5], [306, 564, 9, 13, 9, 2], [306, 615, 7, 13, 7, 2], [306, 666, 9, 13, 9, 2], [306, 718, 12, 10, 12, 3], [306, 773, 3, 6, 3, 7], [367, 2, 13, 13, 13, 1], [367, 52, 13, 14, 13, 0], [367, 106, 12, 14, 12, 3], [367, 154, 11, 14, 11, 0], [367, 205, 12, 14, 12, 0], [367, 257, 12, 13, 12, 1], [367, 308, 12, 13, 12, 1], [367, 360, 11, 12, 11, 2], [367, 411, 11, 12, 11, 2], [367, 462, 11, 12, 11, 2], [367, 514, 11, 11, 11, 3], [367, 564, 11, 12, 11, 2], [367, 613, 11, 14, 11, 0], [367, 669, 11, 11, 11, 5], [367, 717, 11, 12, 11, 2], [367, 768, 11, 12, 11, 2], [428, 3, 11, 12, 11, 2], [428, 55, 11, 11, 11, 3], [428, 105, 9, 12, 9, 2], [428, 156, 9, 12, 9, 2], [428, 207, 9, 12, 9, 2], [428, 259, 9, 11, 9, 3], [428, 309, 11, 12, 11, 2], [428, 360, 11, 12, 11, 2], [428, 411, 11, 12, 11, 2], [428, 462, 11, 12, 11, 2], [428, 514, 11, 11, 11, 3], [428, 564, 11, 12, 11, 2], [428, 615, 11, 12, 11, 2], [428, 666, 11, 12, 11, 2], [428, 717, 11, 12, 11, 2], [428, 769, 11, 11, 11, 3], [489, 3, 9, 11, 9, 2], [489, 55, 10, 10, 10, 3], [489, 107, 11, 11, 11, 4], [489, 157, 12, 11, 12, 3], [489, 208, 12, 12, 12, 3], [489, 261, 12, 8, 12, 5], [489, 310, 12, 11, 12, 3], [489, 361, 13, 11, 13, 3], [489, 413, 14, 10, 14, 4], [489, 464, 14, 10, 14, 4], [489, 514, 15, 10, 15, 3], [489, 565, 8, 10, 8, 3], [489, 616, 9, 10, 9, 3], [489, 670, 12, 8, 12, 6], [489, 718, 16, 11, 16, 3], [489, 769, 12, 11, 12, 3], [550, 7, 15, 7, 15, 6], [550, 57, 11, 9, 11, 5], [550, 108, 10, 9, 10, 5], [550, 159, 10, 9, 10, 5], [550, 208, 11, 11, 11, 3], [550, 261, 13, 11, 13, 5], [550, 310, 11, 11, 11, 3], [550, 361, 12, 11, 12, 3], [550, 412, 13, 11, 13, 3], [550, 464, 14, 10, 14, 4], [550, 514, 9, 14, 9, 3], [550, 565, 10, 10, 10, 3], [550, 616, 10, 10, 10, 3], [550, 667, 14, 11, 14, 3], [550, 720, 15, 9, 15, 5], [550, 771, 11, 9, 11, 5], [611, 4, 12, 11, 12, 3], [611, 55, 8, 11, 8, 3], [611, 110, 11, 6, 11, 7], [611, 156, 14, 12, 14, 2], [611, 208, 9, 14, 9, 3], [611, 262, 12, 7, 12, 6], [611, 311, 13, 10, 13, 4], [611, 365, 12, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 467, 14, 7, 14, 7], [611, 518, 12, 6, 12, 7], [611, 562, 13, 14, 13, 0], [611, 613, 13, 14, 13, 0], [611, 664, 12, 14, 12, 0], [611, 718, 16, 11, 16, 3], [611, 771, 15, 9, 15, 5], [672, 8, 10, 6, 10, 7], [672, 59, 13, 6, 13, 7], [672, 105, 11, 11, 11, 2], [672, 156, 11, 11, 11, 2], [672, 207, 8, 11, 8, 2], [672, 258, 8, 11, 8, 2], [672, 312, 11, 8, 11, 5], [672, 362, 13, 10, 13, 4], [672, 412, 12, 14, 12, 3], [1, 8, 8, 6, 8, 7], [794, 769, 14, 11, 14, 3], [672, 565, 14, 11, 14, 3], [672, 616, 14, 11, 14, 3], [672, 667, 14, 11, 14, 3], [672, 718, 14, 11, 14, 3], [672, 769, 14, 11, 14, 3], [733, 4, 14, 11, 14, 3], [733, 55, 14, 11, 14, 3], [733, 106, 14, 11, 14, 3], [733, 157, 14, 11, 14, 3], [733, 208, 14, 11, 14, 3], [733, 259, 14, 11, 14, 3], [733, 310, 14, 11, 14, 3], [733, 361, 14, 11, 14, 3], [733, 412, 14, 11, 14, 3], [733, 463, 14, 11, 14, 3], [733, 514, 14, 11, 14, 3], [733, 565, 14, 11, 14, 3], [733, 616, 14, 11, 14, 3], [733, 667, 14, 11, 14, 3], [733, 718, 14, 11, 14, 3], [733, 769, 14, 11, 14, 3], [1, 8, 8, 6, 8, 7], [794, 55, 14, 11, 14, 3], [794, 106, 14, 11, 14, 3], [794, 157, 14, 11, 14, 3], [794, 208, 14, 11, 14, 3], [794, 259, 14, 11, 14, 3], [794, 310, 14, 11, 14, 3], [794, 361, 14, 11, 14, 3], [794, 412, 14, 11, 14, 3], [794, 463, 14, 11, 14, 3], [794, 514, 14, 11, 14, 3], [794, 565, 14, 11, 14, 3], [794, 616, 14, 11, 14, 3], [794, 667, 14, 11, 14, 3], [794, 718, 14, 11, 14, 3], [794, 769, 14, 11, 14, 3], [855, 4, 14, 11, 14, 3], [855, 55, 14, 11, 14, 3], [855, 106, 14, 11, 14, 3], [855, 157, 14, 11, 14, 3], [855, 208, 14, 11, 14, 3], [855, 259, 14, 11, 14, 3], [855, 310, 14, 11, 14, 3], [855, 361, 14, 11, 14, 3], [855, 412, 14, 11, 14, 3], [855, 463, 14, 11, 14, 3], [855, 514, 14, 11, 14, 3], [855, 565, 14, 11, 14, 3], [855, 616, 14, 11, 14, 3], [855, 667, 14, 11, 14, 3], [855, 718, 14, 11, 14, 3], [855, 769, 14, 11, 14, 3]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 55, 6, 9, 6, 3], [1, 106, 8, 9, 8, 3], [1, 157, 12, 9, 12, 3], [1, 207, 10, 11, 10, 2], [1, 259, 12, 9, 12, 3], [1, 310, 12, 9, 12, 3], [1, 361, 6, 9, 6, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 514, 11, 9, 11, 3], [1, 567, 10, 7, 10, 5], [1, 619, 7, 8, 7, 6], [1, 670, 10, 6, 10, 6], [1, 721, 6, 6, 6, 6], [1, 768, 10, 10, 10, 2], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 11, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 517, 6, 6, 6, 6], [62, 568, 7, 8, 7, 6], [62, 618, 9, 7, 9, 5], [62, 670, 10, 6, 10, 6], [62, 720, 9, 7, 9, 5], [62, 769, 11, 9, 11, 3], [123, 5, 13, 8, 13, 4], [123, 55, 12, 9, 12, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 8, 9, 8, 3], [123, 514, 10, 9, 10, 3], [123, 565, 11, 9, 11, 3], [123, 616, 10, 9, 10, 3], [123, 667, 12, 9, 12, 3], [123, 718, 11, 9, 11, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 10, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 11, 9, 11, 3], [184, 208, 11, 9, 11, 3], [184, 259, 11, 9, 11, 3], [184, 310, 12, 9, 12, 3], [184, 361, 14, 9, 14, 3], [184, 412, 10, 9, 10, 3], [184, 463, 10, 9, 10, 3], [184, 514, 10, 9, 10, 3], [184, 564, 7, 11, 7, 2], [184, 615, 10, 10, 10, 2], [184, 666, 7, 11, 7, 2], [184, 718, 7, 9, 7, 3], [184, 772, 11, 6, 11, 6], [245, 4, 7, 9, 7, 3], [245, 57, 10, 7, 10, 5], [245, 106, 10, 9, 10, 3], [245, 159, 10, 7, 10, 5], [245, 208, 10, 9, 10, 3], [245, 261, 10, 7, 10, 5], [245, 310, 9, 9, 9, 3], [245, 363, 10, 10, 10, 5], [245, 412, 10, 9, 10, 3], [245, 463, 8, 9, 8, 3], [245, 514, 9, 12, 9, 3], [245, 565, 10, 9, 10, 3], [245, 616, 8, 9, 8, 3], [245, 669, 14, 7, 14, 5], [245, 720, 10, 7, 10, 5], [245, 771, 10, 7, 10, 5], [306, 6, 10, 9, 10, 5], [306, 57, 10, 9, 10, 5], [306, 108, 9, 7, 9, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 10, 7, 10, 5], [306, 312, 10, 7, 10, 5], [306, 363, 14, 7, 14, 5], [306, 414, 10, 7, 10, 5], [306, 465, 10, 10, 10, 5], [306, 516, 10, 7, 10, 5], [306, 564, 8, 11, 8, 2], [306, 615, 6, 11, 6, 2], [306, 666, 8, 11, 8, 2], [306, 718, 11, 9, 11, 3], [306, 772, 3, 6, 3, 6], [367, 2, 12, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 106, 11, 12, 11, 3], [367, 154, 10, 12, 10, 0], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 613, 10, 12, 10, 0], [367, 669, 10, 9, 10, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 207, 8, 10, 8, 2], [428, 259, 8, 9, 8, 3], [428, 309, 10, 10, 10, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 8, 10, 8, 2], [489, 55, 9, 9, 9, 3], [489, 107, 10, 9, 10, 4], [489, 157, 11, 9, 11, 3], [489, 208, 11, 10, 11, 3], [489, 261, 11, 7, 11, 5], [489, 310, 11, 9, 11, 3], [489, 361, 12, 9, 12, 3], [489, 413, 13, 8, 13, 4], [489, 464, 13, 8, 13, 4], [489, 514, 14, 9, 14, 3], [489, 565, 7, 9, 7, 3], [489, 616, 8, 9, 8, 3], [489, 670, 11, 6, 11, 6], [489, 718, 15, 9, 15, 3], [489, 769, 11, 9, 11, 3], [550, 7, 14, 6, 14, 6], [550, 57, 10, 7, 10, 5], [550, 108, 9, 7, 9, 5], [550, 159, 9, 7, 9, 5], [550, 208, 10, 9, 10, 3], [550, 261, 12, 9, 12, 5], [550, 310, 10, 9, 10, 3], [550, 361, 11, 9, 11, 3], [550, 412, 12, 9, 12, 3], [550, 464, 13, 8, 13, 4], [550, 514, 8, 12, 8, 3], [550, 565, 9, 9, 9, 3], [550, 616, 9, 9, 9, 3], [550, 667, 13, 9, 13, 3], [550, 720, 14, 7, 14, 5], [550, 771, 10, 7, 10, 5], [611, 4, 11, 9, 11, 3], [611, 55, 7, 9, 7, 3], [611, 109, 10, 6, 10, 6], [611, 156, 13, 10, 13, 2], [611, 208, 8, 12, 8, 3], [611, 262, 11, 6, 11, 6], [611, 311, 12, 8, 12, 4], [611, 364, 11, 6, 11, 6], [611, 415, 11, 6, 11, 6], [611, 466, 13, 6, 13, 6], [611, 517, 11, 6, 11, 6], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 11, 12, 11, 0], [611, 718, 15, 9, 15, 3], [611, 771, 14, 7, 14, 5], [672, 7, 9, 6, 9, 6], [672, 58, 12, 6, 12, 6], [672, 105, 10, 10, 10, 2], [672, 156, 10, 10, 10, 2], [672, 207, 7, 10, 7, 2], [672, 258, 7, 10, 7, 2], [672, 312, 10, 7, 10, 5], [672, 362, 12, 8, 12, 4], [672, 412, 11, 12, 11, 3], [1, 7, 7, 6, 7, 6], [794, 769, 13, 9, 13, 3], [672, 565, 13, 9, 13, 3], [672, 616, 13, 9, 13, 3], [672, 667, 13, 9, 13, 3], [672, 718, 13, 9, 13, 3], [672, 769, 13, 9, 13, 3], [733, 4, 13, 9, 13, 3], [733, 55, 13, 9, 13, 3], [733, 106, 13, 9, 13, 3], [733, 157, 13, 9, 13, 3], [733, 208, 13, 9, 13, 3], [733, 259, 13, 9, 13, 3], [733, 310, 13, 9, 13, 3], [733, 361, 13, 9, 13, 3], [733, 412, 13, 9, 13, 3], [733, 463, 13, 9, 13, 3], [733, 514, 13, 9, 13, 3], [733, 565, 13, 9, 13, 3], [733, 616, 13, 9, 13, 3], [733, 667, 13, 9, 13, 3], [733, 718, 13, 9, 13, 3], [733, 769, 13, 9, 13, 3], [1, 7, 7, 6, 7, 6], [794, 55, 13, 9, 13, 3], [794, 106, 13, 9, 13, 3], [794, 157, 13, 9, 13, 3], [794, 208, 13, 9, 13, 3], [794, 259, 13, 9, 13, 3], [794, 310, 13, 9, 13, 3], [794, 361, 13, 9, 13, 3], [794, 412, 13, 9, 13, 3], [794, 463, 13, 9, 13, 3], [794, 514, 13, 9, 13, 3], [794, 565, 13, 9, 13, 3], [794, 616, 13, 9, 13, 3], [794, 667, 13, 9, 13, 3], [794, 718, 13, 9, 13, 3], [794, 769, 13, 9, 13, 3], [855, 4, 13, 9, 13, 3], [855, 55, 13, 9, 13, 3], [855, 106, 13, 9, 13, 3], [855, 157, 13, 9, 13, 3], [855, 208, 13, 9, 13, 3], [855, 259, 13, 9, 13, 3], [855, 310, 13, 9, 13, 3], [855, 361, 13, 9, 13, 3], [855, 412, 13, 9, 13, 3], [855, 463, 13, 9, 13, 3], [855, 514, 13, 9, 13, 3], [855, 565, 13, 9, 13, 3], [855, 616, 13, 9, 13, 3], [855, 667, 13, 9, 13, 3], [855, 718, 13, 9, 13, 3], [855, 769, 13, 9, 13, 3]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 56, 14, 12, 9, 4], [1, 107, 16, 5, 11, 4], [1, 157, 19, 10, 14, 3], [1, 208, 17, 14, 12, 3], [1, 259, 22, 13, 16, 3], [1, 310, 18, 13, 16, 3], [1, 361, 14, 5, 8, 3], [1, 411, 16, 15, 11, 2], [1, 462, 16, 15, 11, 2], [1, 514, 19, 9, 14, 3], [1, 567, 17, 9, 14, 5], [1, 626, 10, 6, 9, 13], [1, 672, 16, 3, 13, 8], [1, 728, 9, 3, 8, 13], [1, 770, 17, 12, 12, 4], [62, 4, 19, 13, 14, 3], [62, 55, 17, 13, 14, 3], [62, 106, 19, 13, 14, 3], [62, 157, 20, 13, 14, 3], [62, 208, 19, 13, 14, 3], [62, 259, 20, 13, 14, 3], [62, 310, 18, 13, 14, 3], [62, 361, 20, 13, 14, 3], [62, 412, 18, 13, 14, 3], [62, 463, 19, 13, 14, 3], [62, 518, 12, 9, 8, 7], [62, 569, 13, 12, 9, 7], [62, 618, 16, 9, 12, 5], [62, 671, 19, 6, 16, 7], [62, 720, 14, 9, 12, 5], [62, 769, 18, 13, 13, 3], [123, 6, 21, 11, 17, 5], [123, 55, 18, 13, 16, 3], [123, 106, 18, 13, 14, 3], [123, 157, 19, 13, 14, 3], [123, 208, 19, 13, 14, 3], [123, 259, 19, 13, 13, 3], [123, 310, 19, 13, 13, 3], [123, 361, 19, 13, 15, 3], [123, 412, 20, 13, 14, 3], [123, 463, 15, 13, 10, 3], [123, 514, 19, 13, 13, 3], [123, 565, 20, 13, 14, 3], [123, 616, 14, 13, 13, 3], [123, 667, 22, 13, 16, 3], [123, 718, 21, 13, 15, 3], [123, 769, 20, 13, 15, 3], [184, 4, 19, 13, 14, 3], [184, 55, 20, 13, 15, 3], [184, 106, 19, 13, 15, 3], [184, 157, 19, 13, 14, 3], [184, 208, 20, 13, 14, 3], [184, 259, 21, 13, 15, 3], [184, 310, 22, 13, 16, 3], [184, 361, 24, 13, 18, 3], [184, 412, 20, 13, 14, 3], [184, 463, 20, 13, 14, 3], [184, 514, 20, 13, 14, 3], [184, 564, 16, 15, 10, 2], [184, 617, 13, 12, 12, 4], [184, 666, 16, 15, 10, 2], [184, 717, 17, 5, 12, 2], [184, 779, 16, 3, 14, 13], [245, 3, 15, 5, 10, 2], [245, 58, 17, 10, 13, 6], [245, 106, 17, 13, 14, 3], [245, 160, 17, 10, 13, 6], [245, 208, 20, 13, 14, 3], [245, 262, 17, 10, 14, 6], [245, 310, 17, 13, 11, 3], [245, 364, 18, 13, 14, 6], [245, 412, 17, 13, 13, 3], [245, 463, 15, 13, 10, 3], [245, 514, 15, 16, 10, 3], [245, 565, 17, 13, 14, 3], [245, 616, 15, 13, 10, 3], [245, 670, 22, 10, 18, 6], [245, 721, 17, 10, 13, 6], [245, 772, 17, 10, 14, 6], [306, 7, 17, 13, 14, 6], [306, 58, 18, 13, 14, 6], [306, 109, 17, 10, 12, 6], [306, 160, 17, 10, 13, 6], [306, 208, 15, 13, 12, 3], [306, 262, 17, 10, 13, 6], [306, 313, 18, 10, 14, 6], [306, 364, 20, 10, 16, 6], [306, 415, 18, 10, 14, 6], [306, 466, 18, 14, 14, 6], [306, 517, 17, 10, 13, 6], [306, 565, 16, 14, 10, 3], [306, 616, 14, 14, 8, 3], [306, 667, 14, 14, 10, 3], [306, 719, 19, 4, 14, 4], [306, 766, 1, 1, 3, 1], [367, 2, 21, 15, 16, 1], [367, 52, 21, 16, 16, 0], [367, 106, 19, 17, 14, 3], [367, 154, 19, 16, 13, 0], [367, 205, 21, 16, 15, 0], [367, 257, 20, 15, 15, 1], [367, 308, 21, 15, 15, 1], [367, 361, 17, 13, 13, 3], [367, 412, 17, 13, 13, 3], [367, 462, 18, 14, 13, 2], [367, 514, 18, 13, 13, 3], [367, 565, 19, 13, 13, 3], [367, 614, 18, 15, 13, 1], [367, 670, 17, 13, 13, 6], [367, 718, 18, 13, 14, 3], [367, 769, 17, 13, 14, 3], [428, 3, 18, 14, 14, 2], [428, 55, 19, 13, 14, 3], [428, 106, 15, 13, 10, 3], [428, 157, 14, 13, 10, 3], [428, 207, 16, 14, 10, 2], [428, 259, 17, 13, 11, 3], [428, 310, 19, 13, 13, 3], [428, 361, 18, 13, 14, 3], [428, 412, 17, 13, 14, 3], [428, 462, 18, 14, 14, 2], [428, 514, 19, 13, 14, 3], [428, 565, 20, 13, 14, 3], [428, 616, 17, 13, 13, 3], [428, 667, 17, 13, 13, 3], [428, 717, 17, 14, 13, 2], [428, 769, 18, 13, 13, 3], [489, 3, 16, 7, 10, 2], [489, 55, 16, 6, 11, 3], [489, 107, 17, 12, 13, 4], [489, 157, 18, 13, 14, 3], [489, 208, 19, 13, 14, 3], [489, 261, 18, 9, 14, 5], [489, 310, 20, 13, 14, 3], [489, 361, 19, 13, 15, 3], [489, 414, 20, 11, 16, 5], [489, 465, 20, 11, 16, 5], [489, 514, 23, 6, 17, 3], [489, 565, 15, 4, 9, 3], [489, 616, 17, 3, 11, 3], [489, 669, 18, 10, 14, 5], [489, 718, 24, 13, 18, 3], [489, 769, 21, 13, 15, 3], [550, 7, 24, 7, 20, 6], [550, 57, 17, 10, 14, 5], [550, 108, 16, 10, 12, 5], [550, 159, 14, 10, 12, 5], [550, 208, 20, 13, 14, 3], [550, 262, 18, 13, 15, 6], [550, 311, 17, 12, 13, 4], [550, 361, 21, 13, 15, 3], [550, 412, 21, 13, 15, 3], [550, 465, 21, 11, 16, 5], [550, 513, 16, 18, 10, 2], [550, 565, 17, 10, 12, 3], [550, 616, 17, 10, 12, 3], [550, 667, 20, 13, 15, 3], [550, 721, 22, 10, 19, 6], [550, 772, 18, 10, 13, 6], [611, 4, 17, 13, 14, 3], [611, 55, 14, 13, 9, 3], [611, 111, 16, 5, 13, 8], [611, 157, 23, 13, 17, 3], [611, 207, 16, 18, 10, 2], [611, 262, 18, 8, 14, 6], [611, 311, 17, 12, 16, 4], [611, 365, 18, 9, 14, 7], [611, 416, 16, 9, 14, 7], [611, 473, 16, 3, 15, 13], [611, 511, 1, 1, 14, 1], [611, 562, 20, 16, 16, 0], [611, 613, 22, 16, 16, 0], [611, 664, 21, 16, 15, 0], [611, 718, 25, 13, 19, 3], [611, 772, 22, 10, 19, 6], [672, 10, 15, 3, 12, 9], [672, 61, 18, 3, 15, 9], [672, 106, 18, 6, 13, 3], [672, 157, 19, 6, 13, 3], [672, 208, 15, 6, 9, 3], [672, 259, 15, 6, 9, 3], [672, 313, 17, 7, 14, 6], [672, 363, 19, 11, 16, 5], [672, 412, 19, 17, 14, 3], [1, 1, 1, 1, 9, 1], [794, 769, 22, 13, 16, 3], [672, 565, 22, 13, 16, 3], [672, 616, 22, 13, 16, 3], [672, 667, 22, 13, 16, 3], [672, 718, 22, 13, 16, 3], [672, 769, 22, 13, 16, 3], [733, 4, 22, 13, 16, 3], [733, 55, 22, 13, 16, 3], [733, 106, 22, 13, 16, 3], [733, 157, 22, 13, 16, 3], [733, 208, 22, 13, 16, 3], [733, 259, 22, 13, 16, 3], [733, 310, 22, 13, 16, 3], [733, 361, 22, 13, 16, 3], [733, 412, 22, 13, 16, 3], [733, 463, 22, 13, 16, 3], [733, 514, 22, 13, 16, 3], [733, 565, 22, 13, 16, 3], [733, 616, 22, 13, 16, 3], [733, 667, 22, 13, 16, 3], [733, 718, 22, 13, 16, 3], [733, 769, 22, 13, 16, 3], [1, 1, 1, 1, 9, 1], [794, 55, 22, 13, 16, 3], [794, 106, 22, 13, 16, 3], [794, 157, 22, 13, 16, 3], [794, 208, 22, 13, 16, 3], [794, 259, 22, 13, 16, 3], [794, 310, 22, 13, 16, 3], [794, 361, 22, 13, 16, 3], [794, 412, 22, 13, 16, 3], [794, 463, 22, 13, 16, 3], [794, 514, 22, 13, 16, 3], [794, 565, 22, 13, 16, 3], [794, 616, 22, 13, 16, 3], [794, 667, 22, 13, 16, 3], [794, 718, 22, 13, 16, 3], [794, 769, 22, 13, 16, 3], [855, 4, 22, 13, 16, 3], [855, 55, 22, 13, 16, 3], [855, 106, 22, 13, 16, 3], [855, 157, 22, 13, 16, 3], [855, 208, 22, 13, 16, 3], [855, 259, 22, 13, 16, 3], [855, 310, 22, 13, 16, 3], [855, 361, 22, 13, 16, 3], [855, 412, 22, 13, 16, 3], [855, 463, 22, 13, 16, 3], [855, 514, 22, 13, 16, 3], [855, 565, 22, 13, 16, 3], [855, 616, 22, 13, 16, 3], [855, 667, 22, 13, 16, 3], [855, 718, 22, 13, 16, 3], [855, 769, 22, 13, 16, 3]], \"capHeight\": 15, \"widestlogicalchar\": 20, \"widestglyph\": 25, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 56, 13, 10, 8, 4], [1, 107, 15, 3, 10, 4], [1, 157, 18, 8, 13, 3], [1, 208, 16, 12, 11, 3], [1, 259, 21, 11, 15, 3], [1, 310, 17, 11, 15, 3], [1, 361, 13, 3, 7, 3], [1, 411, 15, 13, 10, 2], [1, 462, 15, 13, 10, 2], [1, 514, 18, 7, 13, 3], [1, 567, 16, 7, 13, 5], [1, 626, 9, 4, 8, 13], [1, 672, 15, 1, 12, 8], [1, 728, 8, 1, 7, 13], [1, 770, 16, 10, 11, 4], [62, 4, 18, 11, 13, 3], [62, 55, 16, 11, 13, 3], [62, 106, 18, 11, 13, 3], [62, 157, 19, 11, 13, 3], [62, 208, 18, 11, 13, 3], [62, 259, 19, 11, 13, 3], [62, 310, 17, 11, 13, 3], [62, 361, 19, 11, 13, 3], [62, 412, 17, 11, 13, 3], [62, 463, 18, 11, 13, 3], [62, 518, 11, 7, 7, 7], [62, 569, 12, 10, 8, 7], [62, 618, 15, 7, 11, 5], [62, 671, 18, 4, 15, 7], [62, 720, 13, 7, 11, 5], [62, 769, 17, 11, 12, 3], [123, 6, 20, 9, 16, 5], [123, 55, 17, 11, 15, 3], [123, 106, 17, 11, 13, 3], [123, 157, 18, 11, 13, 3], [123, 208, 18, 11, 13, 3], [123, 259, 18, 11, 12, 3], [123, 310, 18, 11, 12, 3], [123, 361, 18, 11, 14, 3], [123, 412, 19, 11, 13, 3], [123, 463, 14, 11, 9, 3], [123, 514, 18, 11, 12, 3], [123, 565, 19, 11, 13, 3], [123, 616, 13, 11, 12, 3], [123, 667, 21, 11, 15, 3], [123, 718, 20, 11, 14, 3], [123, 769, 19, 11, 14, 3], [184, 4, 18, 11, 13, 3], [184, 55, 19, 11, 14, 3], [184, 106, 18, 11, 14, 3], [184, 157, 18, 11, 13, 3], [184, 208, 19, 11, 13, 3], [184, 259, 20, 11, 14, 3], [184, 310, 21, 11, 15, 3], [184, 361, 23, 11, 17, 3], [184, 412, 19, 11, 13, 3], [184, 463, 19, 11, 13, 3], [184, 514, 19, 11, 13, 3], [184, 564, 15, 13, 9, 2], [184, 617, 12, 10, 11, 4], [184, 666, 15, 13, 9, 2], [184, 717, 16, 3, 11, 2], [184, 779, 15, 1, 13, 13], [245, 3, 14, 3, 9, 2], [245, 58, 16, 8, 12, 6], [245, 106, 16, 11, 13, 3], [245, 160, 16, 8, 12, 6], [245, 208, 19, 11, 13, 3], [245, 262, 16, 8, 13, 6], [245, 310, 16, 11, 10, 3], [245, 364, 17, 11, 13, 6], [245, 412, 16, 11, 12, 3], [245, 463, 14, 11, 9, 3], [245, 514, 14, 14, 9, 3], [245, 565, 16, 11, 13, 3], [245, 616, 14, 11, 9, 3], [245, 670, 21, 8, 17, 6], [245, 721, 16, 8, 12, 6], [245, 772, 16, 8, 13, 6], [306, 7, 16, 11, 13, 6], [306, 58, 17, 11, 13, 6], [306, 109, 16, 8, 11, 6], [306, 160, 16, 8, 12, 6], [306, 208, 14, 11, 11, 3], [306, 262, 16, 8, 12, 6], [306, 313, 17, 8, 13, 6], [306, 364, 19, 8, 15, 6], [306, 415, 17, 8, 13, 6], [306, 466, 17, 12, 13, 6], [306, 517, 16, 8, 12, 6], [306, 565, 15, 12, 9, 3], [306, 616, 13, 12, 7, 3], [306, 667, 13, 12, 9, 3], [306, 719, 18, 2, 13, 4], [306, 766, 1, 1, 3, 1], [367, 2, 20, 13, 15, 1], [367, 52, 20, 14, 15, 0], [367, 106, 18, 15, 13, 3], [367, 154, 18, 14, 12, 0], [367, 205, 20, 14, 14, 0], [367, 257, 19, 13, 14, 1], [367, 308, 20, 13, 14, 1], [367, 361, 16, 11, 12, 3], [367, 412, 16, 11, 12, 3], [367, 462, 17, 12, 12, 2], [367, 514, 17, 11, 12, 3], [367, 565, 18, 11, 12, 3], [367, 614, 17, 13, 12, 1], [367, 670, 16, 11, 12, 6], [367, 718, 17, 11, 13, 3], [367, 769, 16, 11, 13, 3], [428, 3, 17, 12, 13, 2], [428, 55, 18, 11, 13, 3], [428, 106, 14, 11, 9, 3], [428, 157, 13, 11, 9, 3], [428, 207, 15, 12, 9, 2], [428, 259, 16, 11, 10, 3], [428, 310, 18, 11, 12, 3], [428, 361, 17, 11, 13, 3], [428, 412, 16, 11, 13, 3], [428, 462, 17, 12, 13, 2], [428, 514, 18, 11, 13, 3], [428, 565, 19, 11, 13, 3], [428, 616, 16, 11, 12, 3], [428, 667, 16, 11, 12, 3], [428, 717, 16, 12, 12, 2], [428, 769, 17, 11, 12, 3], [489, 3, 15, 5, 9, 2], [489, 55, 15, 4, 10, 3], [489, 107, 16, 10, 12, 4], [489, 157, 17, 11, 13, 3], [489, 208, 18, 11, 13, 3], [489, 261, 17, 7, 13, 5], [489, 310, 19, 11, 13, 3], [489, 361, 18, 11, 14, 3], [489, 414, 19, 9, 15, 5], [489, 465, 19, 9, 15, 5], [489, 514, 22, 4, 16, 3], [489, 565, 14, 2, 8, 3], [489, 616, 16, 1, 10, 3], [489, 669, 17, 8, 13, 5], [489, 718, 23, 11, 17, 3], [489, 769, 20, 11, 14, 3], [550, 7, 23, 5, 19, 6], [550, 57, 16, 8, 13, 5], [550, 108, 15, 8, 11, 5], [550, 159, 13, 8, 11, 5], [550, 208, 19, 11, 13, 3], [550, 262, 17, 11, 14, 6], [550, 311, 16, 10, 12, 4], [550, 361, 20, 11, 14, 3], [550, 412, 20, 11, 14, 3], [550, 465, 20, 9, 15, 5], [550, 513, 15, 16, 9, 2], [550, 565, 16, 8, 11, 3], [550, 616, 16, 8, 11, 3], [550, 667, 19, 11, 14, 3], [550, 721, 21, 8, 18, 6], [550, 772, 17, 8, 12, 6], [611, 4, 16, 11, 13, 3], [611, 55, 13, 11, 8, 3], [611, 111, 15, 3, 12, 8], [611, 157, 22, 11, 16, 3], [611, 207, 15, 16, 9, 2], [611, 262, 17, 6, 13, 6], [611, 311, 16, 10, 15, 4], [611, 365, 17, 7, 13, 7], [611, 416, 15, 7, 13, 7], [611, 473, 15, 1, 14, 13], [611, 511, 1, 1, 13, 1], [611, 562, 19, 14, 15, 0], [611, 613, 20, 14, 15, 0], [611, 664, 19, 14, 14, 0], [611, 718, 24, 11, 18, 3], [611, 772, 21, 8, 18, 6], [672, 10, 14, 1, 11, 9], [672, 61, 17, 1, 14, 9], [672, 106, 17, 4, 12, 3], [672, 157, 18, 4, 12, 3], [672, 208, 14, 4, 8, 3], [672, 259, 14, 4, 8, 3], [672, 313, 16, 5, 13, 6], [672, 363, 18, 9, 15, 5], [672, 412, 18, 15, 13, 3], [1, 1, 1, 1, 8, 1], [794, 769, 21, 11, 15, 3], [672, 565, 21, 11, 15, 3], [672, 616, 21, 11, 15, 3], [672, 667, 21, 11, 15, 3], [672, 718, 21, 11, 15, 3], [672, 769, 21, 11, 15, 3], [733, 4, 21, 11, 15, 3], [733, 55, 21, 11, 15, 3], [733, 106, 21, 11, 15, 3], [733, 157, 21, 11, 15, 3], [733, 208, 21, 11, 15, 3], [733, 259, 21, 11, 15, 3], [733, 310, 21, 11, 15, 3], [733, 361, 21, 11, 15, 3], [733, 412, 21, 11, 15, 3], [733, 463, 21, 11, 15, 3], [733, 514, 21, 11, 15, 3], [733, 565, 21, 11, 15, 3], [733, 616, 21, 11, 15, 3], [733, 667, 21, 11, 15, 3], [733, 718, 21, 11, 15, 3], [733, 769, 21, 11, 15, 3], [1, 1, 1, 1, 8, 1], [794, 55, 21, 11, 15, 3], [794, 106, 21, 11, 15, 3], [794, 157, 21, 11, 15, 3], [794, 208, 21, 11, 15, 3], [794, 259, 21, 11, 15, 3], [794, 310, 21, 11, 15, 3], [794, 361, 21, 11, 15, 3], [794, 412, 21, 11, 15, 3], [794, 463, 21, 11, 15, 3], [794, 514, 21, 11, 15, 3], [794, 565, 21, 11, 15, 3], [794, 616, 21, 11, 15, 3], [794, 667, 21, 11, 15, 3], [794, 718, 21, 11, 15, 3], [794, 769, 21, 11, 15, 3], [855, 4, 21, 11, 15, 3], [855, 55, 21, 11, 15, 3], [855, 106, 21, 11, 15, 3], [855, 157, 21, 11, 15, 3], [855, 208, 21, 11, 15, 3], [855, 259, 21, 11, 15, 3], [855, 310, 21, 11, 15, 3], [855, 361, 21, 11, 15, 3], [855, 412, 21, 11, 15, 3], [855, 463, 21, 11, 15, 3], [855, 514, 21, 11, 15, 3], [855, 565, 21, 11, 15, 3], [855, 616, 21, 11, 15, 3], [855, 667, 21, 11, 15, 3], [855, 718, 21, 11, 15, 3], [855, 769, 21, 11, 15, 3]], \"capHeight\": 14, \"widestlogicalchar\": 19, \"widestglyph\": 24, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 9, 6, 9, 9], [1, 56, 9, 12, 9, 4], [1, 107, 11, 11, 11, 4], [1, 157, 14, 12, 14, 3], [1, 208, 12, 14, 12, 3], [1, 259, 16, 13, 16, 3], [1, 310, 16, 13, 16, 3], [1, 361, 8, 12, 8, 3], [1, 411, 11, 15, 11, 2], [1, 462, 11, 15, 11, 2], [1, 514, 14, 12, 14, 3], [1, 567, 14, 10, 14, 5], [1, 622, 9, 10, 9, 9], [1, 672, 13, 7, 13, 8], [1, 724, 8, 7, 8, 9], [1, 770, 12, 12, 12, 4], [62, 4, 14, 13, 14, 3], [62, 55, 14, 13, 14, 3], [62, 106, 14, 13, 14, 3], [62, 157, 14, 13, 14, 3], [62, 208, 14, 13, 14, 3], [62, 259, 14, 13, 14, 3], [62, 310, 14, 13, 14, 3], [62, 361, 14, 13, 14, 3], [62, 412, 14, 13, 14, 3], [62, 463, 14, 13, 14, 3], [62, 518, 8, 9, 8, 7], [62, 569, 9, 12, 9, 7], [62, 618, 12, 10, 12, 5], [62, 671, 16, 8, 16, 7], [62, 720, 12, 10, 12, 5], [62, 769, 13, 13, 13, 3], [123, 6, 17, 11, 17, 5], [123, 55, 16, 13, 16, 3], [123, 106, 14, 13, 14, 3], [123, 157, 14, 13, 14, 3], [123, 208, 14, 13, 14, 3], [123, 259, 13, 13, 13, 3], [123, 310, 13, 13, 13, 3], [123, 361, 15, 13, 15, 3], [123, 412, 14, 13, 14, 3], [123, 463, 10, 13, 10, 3], [123, 514, 13, 13, 13, 3], [123, 565, 14, 13, 14, 3], [123, 616, 13, 13, 13, 3], [123, 667, 16, 13, 16, 3], [123, 718, 15, 13, 15, 3], [123, 769, 15, 13, 15, 3], [184, 4, 14, 13, 14, 3], [184, 55, 15, 13, 15, 3], [184, 106, 15, 13, 15, 3], [184, 157, 14, 13, 14, 3], [184, 208, 14, 13, 14, 3], [184, 259, 15, 13, 15, 3], [184, 310, 16, 13, 16, 3], [184, 361, 18, 13, 18, 3], [184, 412, 14, 13, 14, 3], [184, 463, 14, 13, 14, 3], [184, 514, 14, 13, 14, 3], [184, 564, 10, 15, 10, 2], [184, 617, 12, 12, 12, 4], [184, 666, 10, 15, 10, 2], [184, 717, 12, 13, 12, 2], [184, 775, 14, 7, 14, 9], [245, 3, 10, 13, 10, 2], [245, 58, 13, 10, 13, 6], [245, 106, 14, 13, 14, 3], [245, 160, 13, 10, 13, 6], [245, 208, 14, 13, 14, 3], [245, 262, 14, 10, 14, 6], [245, 310, 11, 13, 11, 3], [245, 364, 14, 13, 14, 6], [245, 412, 13, 13, 13, 3], [245, 463, 10, 13, 10, 3], [245, 514, 10, 16, 10, 3], [245, 565, 14, 13, 14, 3], [245, 616, 10, 13, 10, 3], [245, 670, 18, 10, 18, 6], [245, 721, 13, 10, 13, 6], [245, 772, 14, 10, 14, 6], [306, 7, 14, 13, 14, 6], [306, 58, 14, 13, 14, 6], [306, 109, 12, 10, 12, 6], [306, 160, 13, 10, 13, 6], [306, 208, 12, 13, 12, 3], [306, 262, 13, 10, 13, 6], [306, 313, 14, 10, 14, 6], [306, 364, 16, 10, 16, 6], [306, 415, 14, 10, 14, 6], [306, 466, 14, 14, 14, 6], [306, 517, 13, 10, 13, 6], [306, 565, 10, 14, 10, 3], [306, 616, 8, 14, 8, 3], [306, 667, 10, 14, 10, 3], [306, 719, 14, 11, 14, 4], [306, 775, 3, 6, 3, 9], [367, 2, 16, 15, 16, 1], [367, 52, 16, 16, 16, 0], [367, 106, 14, 17, 14, 3], [367, 154, 13, 16, 13, 0], [367, 205, 15, 16, 15, 0], [367, 257, 15, 15, 15, 1], [367, 308, 15, 15, 15, 1], [367, 361, 13, 13, 13, 3], [367, 412, 13, 13, 13, 3], [367, 462, 13, 14, 13, 2], [367, 514, 13, 13, 13, 3], [367, 565, 13, 13, 13, 3], [367, 614, 13, 15, 13, 1], [367, 670, 13, 13, 13, 6], [367, 718, 14, 13, 14, 3], [367, 769, 14, 13, 14, 3], [428, 3, 14, 14, 14, 2], [428, 55, 14, 13, 14, 3], [428, 106, 10, 13, 10, 3], [428, 157, 10, 13, 10, 3], [428, 207, 10, 14, 10, 2], [428, 259, 11, 13, 11, 3], [428, 310, 13, 13, 13, 3], [428, 361, 14, 13, 14, 3], [428, 412, 14, 13, 14, 3], [428, 462, 14, 14, 14, 2], [428, 514, 14, 13, 14, 3], [428, 565, 14, 13, 14, 3], [428, 616, 13, 13, 13, 3], [428, 667, 13, 13, 13, 3], [428, 717, 13, 14, 13, 2], [428, 769, 13, 13, 13, 3], [489, 3, 10, 13, 10, 2], [489, 55, 11, 12, 11, 3], [489, 107, 13, 12, 13, 4], [489, 157, 14, 13, 14, 3], [489, 208, 14, 13, 14, 3], [489, 261, 14, 10, 14, 5], [489, 310, 14, 13, 14, 3], [489, 361, 15, 13, 15, 3], [489, 414, 16, 11, 16, 5], [489, 465, 16, 11, 16, 5], [489, 514, 17, 12, 17, 3], [489, 565, 9, 12, 9, 3], [489, 616, 11, 12, 11, 3], [489, 669, 14, 10, 14, 5], [489, 718, 18, 13, 18, 3], [489, 769, 15, 13, 15, 3], [550, 7, 20, 9, 20, 6], [550, 57, 14, 10, 14, 5], [550, 108, 12, 10, 12, 5], [550, 159, 12, 10, 12, 5], [550, 208, 14, 13, 14, 3], [550, 262, 15, 13, 15, 6], [550, 311, 13, 12, 13, 4], [550, 361, 15, 13, 15, 3], [550, 412, 15, 13, 15, 3], [550, 465, 16, 11, 16, 5], [550, 513, 10, 18, 10, 2], [550, 565, 12, 12, 12, 3], [550, 616, 12, 12, 12, 3], [550, 667, 15, 13, 15, 3], [550, 721, 19, 10, 19, 6], [550, 772, 13, 10, 13, 6], [611, 4, 14, 13, 14, 3], [611, 55, 9, 13, 9, 3], [611, 111, 13, 7, 13, 8], [611, 157, 17, 13, 17, 3], [611, 207, 10, 18, 10, 2], [611, 262, 14, 9, 14, 6], [611, 311, 16, 12, 16, 4], [611, 365, 14, 9, 14, 7], [611, 416, 14, 9, 14, 7], [611, 469, 15, 7, 15, 9], [611, 520, 14, 6, 14, 9], [611, 562, 16, 16, 16, 0], [611, 613, 16, 16, 16, 0], [611, 664, 15, 16, 15, 0], [611, 718, 19, 13, 19, 3], [611, 772, 19, 10, 19, 6], [672, 10, 12, 6, 12, 9], [672, 61, 15, 6, 15, 9], [672, 106, 13, 12, 13, 3], [672, 157, 13, 12, 13, 3], [672, 208, 9, 12, 9, 3], [672, 259, 9, 12, 9, 3], [672, 313, 14, 9, 14, 6], [672, 363, 16, 11, 16, 5], [672, 412, 14, 17, 14, 3], [1, 10, 9, 6, 9, 9], [794, 769, 16, 13, 16, 3], [672, 565, 16, 13, 16, 3], [672, 616, 16, 13, 16, 3], [672, 667, 16, 13, 16, 3], [672, 718, 16, 13, 16, 3], [672, 769, 16, 13, 16, 3], [733, 4, 16, 13, 16, 3], [733, 55, 16, 13, 16, 3], [733, 106, 16, 13, 16, 3], [733, 157, 16, 13, 16, 3], [733, 208, 16, 13, 16, 3], [733, 259, 16, 13, 16, 3], [733, 310, 16, 13, 16, 3], [733, 361, 16, 13, 16, 3], [733, 412, 16, 13, 16, 3], [733, 463, 16, 13, 16, 3], [733, 514, 16, 13, 16, 3], [733, 565, 16, 13, 16, 3], [733, 616, 16, 13, 16, 3], [733, 667, 16, 13, 16, 3], [733, 718, 16, 13, 16, 3], [733, 769, 16, 13, 16, 3], [1, 10, 9, 6, 9, 9], [794, 55, 16, 13, 16, 3], [794, 106, 16, 13, 16, 3], [794, 157, 16, 13, 16, 3], [794, 208, 16, 13, 16, 3], [794, 259, 16, 13, 16, 3], [794, 310, 16, 13, 16, 3], [794, 361, 16, 13, 16, 3], [794, 412, 16, 13, 16, 3], [794, 463, 16, 13, 16, 3], [794, 514, 16, 13, 16, 3], [794, 565, 16, 13, 16, 3], [794, 616, 16, 13, 16, 3], [794, 667, 16, 13, 16, 3], [794, 718, 16, 13, 16, 3], [794, 769, 16, 13, 16, 3], [855, 4, 16, 13, 16, 3], [855, 55, 16, 13, 16, 3], [855, 106, 16, 13, 16, 3], [855, 157, 16, 13, 16, 3], [855, 208, 16, 13, 16, 3], [855, 259, 16, 13, 16, 3], [855, 310, 16, 13, 16, 3], [855, 361, 16, 13, 16, 3], [855, 412, 16, 13, 16, 3], [855, 463, 16, 13, 16, 3], [855, 514, 16, 13, 16, 3], [855, 565, 16, 13, 16, 3], [855, 616, 16, 13, 16, 3], [855, 667, 16, 13, 16, 3], [855, 718, 16, 13, 16, 3], [855, 769, 16, 13, 16, 3]], \"widestlogicalchar\": 20, \"widestglyph\": 20, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 8, 6, 8, 8], [1, 56, 8, 10, 8, 4], [1, 107, 10, 10, 10, 4], [1, 157, 13, 11, 13, 3], [1, 208, 11, 12, 11, 3], [1, 259, 15, 11, 15, 3], [1, 310, 15, 11, 15, 3], [1, 361, 7, 11, 7, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 514, 13, 11, 13, 3], [1, 567, 13, 9, 13, 5], [1, 621, 8, 9, 8, 8], [1, 672, 12, 6, 12, 8], [1, 723, 7, 6, 7, 8], [1, 770, 11, 10, 11, 4], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 11, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 11, 13, 3], [62, 310, 13, 11, 13, 3], [62, 361, 13, 11, 13, 3], [62, 412, 13, 11, 13, 3], [62, 463, 13, 11, 13, 3], [62, 518, 7, 7, 7, 7], [62, 569, 8, 10, 8, 7], [62, 618, 11, 9, 11, 5], [62, 671, 15, 7, 15, 7], [62, 720, 11, 9, 11, 5], [62, 769, 12, 11, 12, 3], [123, 6, 16, 9, 16, 5], [123, 55, 15, 11, 15, 3], [123, 106, 13, 11, 13, 3], [123, 157, 13, 11, 13, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 14, 11, 14, 3], [123, 412, 13, 11, 13, 3], [123, 463, 9, 11, 9, 3], [123, 514, 12, 11, 12, 3], [123, 565, 13, 11, 13, 3], [123, 616, 12, 11, 12, 3], [123, 667, 15, 11, 15, 3], [123, 718, 14, 11, 14, 3], [123, 769, 14, 11, 14, 3], [184, 4, 13, 11, 13, 3], [184, 55, 14, 11, 14, 3], [184, 106, 14, 11, 14, 3], [184, 157, 13, 11, 13, 3], [184, 208, 13, 11, 13, 3], [184, 259, 14, 11, 14, 3], [184, 310, 15, 11, 15, 3], [184, 361, 17, 11, 17, 3], [184, 412, 13, 11, 13, 3], [184, 463, 13, 11, 13, 3], [184, 514, 13, 11, 13, 3], [184, 564, 9, 13, 9, 2], [184, 617, 11, 10, 11, 4], [184, 666, 9, 13, 9, 2], [184, 717, 11, 12, 11, 2], [184, 774, 13, 6, 13, 8], [245, 3, 9, 12, 9, 2], [245, 58, 12, 8, 12, 6], [245, 106, 13, 11, 13, 3], [245, 160, 12, 8, 12, 6], [245, 208, 13, 11, 13, 3], [245, 262, 13, 8, 13, 6], [245, 310, 10, 11, 10, 3], [245, 364, 13, 11, 13, 6], [245, 412, 12, 11, 12, 3], [245, 463, 9, 11, 9, 3], [245, 514, 9, 14, 9, 3], [245, 565, 13, 11, 13, 3], [245, 616, 9, 11, 9, 3], [245, 670, 17, 8, 17, 6], [245, 721, 12, 8, 12, 6], [245, 772, 13, 8, 13, 6], [306, 7, 13, 11, 13, 6], [306, 58, 13, 11, 13, 6], [306, 109, 11, 8, 11, 6], [306, 160, 12, 8, 12, 6], [306, 208, 11, 11, 11, 3], [306, 262, 12, 8, 12, 6], [306, 313, 13, 8, 13, 6], [306, 364, 15, 8, 15, 6], [306, 415, 13, 8, 13, 6], [306, 466, 13, 12, 13, 6], [306, 517, 12, 8, 12, 6], [306, 565, 9, 12, 9, 3], [306, 616, 7, 12, 7, 3], [306, 667, 9, 12, 9, 3], [306, 719, 13, 10, 13, 4], [306, 774, 3, 6, 3, 8], [367, 2, 15, 13, 15, 1], [367, 52, 15, 14, 15, 0], [367, 106, 13, 15, 13, 3], [367, 154, 12, 14, 12, 0], [367, 205, 14, 14, 14, 0], [367, 257, 14, 13, 14, 1], [367, 308, 14, 13, 14, 1], [367, 361, 12, 11, 12, 3], [367, 412, 12, 11, 12, 3], [367, 462, 12, 12, 12, 2], [367, 514, 12, 11, 12, 3], [367, 565, 12, 11, 12, 3], [367, 614, 12, 13, 12, 1], [367, 670, 12, 11, 12, 6], [367, 718, 13, 11, 13, 3], [367, 769, 13, 11, 13, 3], [428, 3, 13, 12, 13, 2], [428, 55, 13, 11, 13, 3], [428, 106, 9, 11, 9, 3], [428, 157, 9, 11, 9, 3], [428, 207, 9, 12, 9, 2], [428, 259, 10, 11, 10, 3], [428, 310, 12, 11, 12, 3], [428, 361, 13, 11, 13, 3], [428, 412, 13, 11, 13, 3], [428, 462, 13, 12, 13, 2], [428, 514, 13, 11, 13, 3], [428, 565, 13, 11, 13, 3], [428, 616, 12, 11, 12, 3], [428, 667, 12, 11, 12, 3], [428, 717, 12, 12, 12, 2], [428, 769, 12, 11, 12, 3], [489, 3, 9, 12, 9, 2], [489, 55, 10, 11, 10, 3], [489, 107, 12, 10, 12, 4], [489, 157, 13, 11, 13, 3], [489, 208, 13, 11, 13, 3], [489, 261, 13, 9, 13, 5], [489, 310, 13, 11, 13, 3], [489, 361, 14, 11, 14, 3], [489, 414, 15, 9, 15, 5], [489, 465, 15, 9, 15, 5], [489, 514, 16, 11, 16, 3], [489, 565, 8, 11, 8, 3], [489, 616, 10, 11, 10, 3], [489, 669, 13, 9, 13, 5], [489, 718, 17, 11, 17, 3], [489, 769, 14, 11, 14, 3], [550, 7, 19, 8, 19, 6], [550, 57, 13, 9, 13, 5], [550, 108, 11, 9, 11, 5], [550, 159, 11, 9, 11, 5], [550, 208, 13, 11, 13, 3], [550, 262, 14, 11, 14, 6], [550, 311, 12, 10, 12, 4], [550, 361, 14, 11, 14, 3], [550, 412, 14, 11, 14, 3], [550, 465, 15, 9, 15, 5], [550, 513, 9, 16, 9, 2], [550, 565, 11, 11, 11, 3], [550, 616, 11, 11, 11, 3], [550, 667, 14, 11, 14, 3], [550, 721, 18, 8, 18, 6], [550, 772, 12, 8, 12, 6], [611, 4, 13, 11, 13, 3], [611, 55, 8, 11, 8, 3], [611, 111, 12, 6, 12, 8], [611, 157, 16, 11, 16, 3], [611, 207, 9, 16, 9, 2], [611, 262, 13, 8, 13, 6], [611, 311, 15, 10, 15, 4], [611, 365, 13, 7, 13, 7], [611, 416, 13, 7, 13, 7], [611, 468, 14, 6, 14, 8], [611, 519, 13, 6, 13, 8], [611, 562, 15, 14, 15, 0], [611, 613, 15, 14, 15, 0], [611, 664, 14, 14, 14, 0], [611, 718, 18, 11, 18, 3], [611, 772, 18, 8, 18, 6], [672, 9, 11, 6, 11, 8], [672, 60, 14, 6, 14, 8], [672, 106, 12, 11, 12, 3], [672, 157, 12, 11, 12, 3], [672, 208, 8, 11, 8, 3], [672, 259, 8, 11, 8, 3], [672, 313, 13, 8, 13, 6], [672, 363, 15, 9, 15, 5], [672, 412, 13, 15, 13, 3], [1, 9, 8, 6, 8, 8], [794, 769, 15, 11, 15, 3], [672, 565, 15, 11, 15, 3], [672, 616, 15, 11, 15, 3], [672, 667, 15, 11, 15, 3], [672, 718, 15, 11, 15, 3], [672, 769, 15, 11, 15, 3], [733, 4, 15, 11, 15, 3], [733, 55, 15, 11, 15, 3], [733, 106, 15, 11, 15, 3], [733, 157, 15, 11, 15, 3], [733, 208, 15, 11, 15, 3], [733, 259, 15, 11, 15, 3], [733, 310, 15, 11, 15, 3], [733, 361, 15, 11, 15, 3], [733, 412, 15, 11, 15, 3], [733, 463, 15, 11, 15, 3], [733, 514, 15, 11, 15, 3], [733, 565, 15, 11, 15, 3], [733, 616, 15, 11, 15, 3], [733, 667, 15, 11, 15, 3], [733, 718, 15, 11, 15, 3], [733, 769, 15, 11, 15, 3], [1, 9, 8, 6, 8, 8], [794, 55, 15, 11, 15, 3], [794, 106, 15, 11, 15, 3], [794, 157, 15, 11, 15, 3], [794, 208, 15, 11, 15, 3], [794, 259, 15, 11, 15, 3], [794, 310, 15, 11, 15, 3], [794, 361, 15, 11, 15, 3], [794, 412, 15, 11, 15, 3], [794, 463, 15, 11, 15, 3], [794, 514, 15, 11, 15, 3], [794, 565, 15, 11, 15, 3], [794, 616, 15, 11, 15, 3], [794, 667, 15, 11, 15, 3], [794, 718, 15, 11, 15, 3], [794, 769, 15, 11, 15, 3], [855, 4, 15, 11, 15, 3], [855, 55, 15, 11, 15, 3], [855, 106, 15, 11, 15, 3], [855, 157, 15, 11, 15, 3], [855, 208, 15, 11, 15, 3], [855, 259, 15, 11, 15, 3], [855, 310, 15, 11, 15, 3], [855, 361, 15, 11, 15, 3], [855, 412, 15, 11, 15, 3], [855, 463, 15, 11, 15, 3], [855, 514, 15, 11, 15, 3], [855, 565, 15, 11, 15, 3], [855, 616, 15, 11, 15, 3], [855, 667, 15, 11, 15, 3], [855, 718, 15, 11, 15, 3], [855, 769, 15, 11, 15, 3]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 56, 13, 12, 8, 4], [1, 107, 15, 5, 10, 4], [1, 157, 18, 10, 13, 3], [1, 208, 16, 14, 11, 3], [1, 259, 21, 13, 15, 3], [1, 310, 17, 13, 15, 3], [1, 361, 13, 5, 7, 3], [1, 411, 15, 15, 10, 2], [1, 462, 15, 15, 10, 2], [1, 514, 18, 9, 13, 3], [1, 567, 16, 9, 13, 5], [1, 626, 9, 6, 8, 13], [1, 672, 15, 3, 12, 8], [1, 728, 8, 3, 7, 13], [1, 770, 16, 12, 11, 4], [62, 4, 18, 13, 13, 3], [62, 55, 16, 13, 13, 3], [62, 106, 18, 13, 13, 3], [62, 157, 19, 13, 13, 3], [62, 208, 18, 13, 13, 3], [62, 259, 19, 13, 13, 3], [62, 310, 17, 13, 13, 3], [62, 361, 19, 13, 13, 3], [62, 412, 17, 13, 13, 3], [62, 463, 18, 13, 13, 3], [62, 518, 11, 9, 7, 7], [62, 569, 12, 12, 8, 7], [62, 618, 15, 9, 11, 5], [62, 671, 18, 6, 15, 7], [62, 720, 13, 9, 11, 5], [62, 769, 17, 13, 12, 3], [123, 6, 20, 11, 16, 5], [123, 55, 17, 13, 15, 3], [123, 106, 17, 13, 13, 3], [123, 157, 18, 13, 13, 3], [123, 208, 18, 13, 13, 3], [123, 259, 18, 13, 12, 3], [123, 310, 18, 13, 12, 3], [123, 361, 18, 13, 14, 3], [123, 412, 19, 13, 13, 3], [123, 463, 14, 13, 9, 3], [123, 514, 18, 13, 12, 3], [123, 565, 19, 13, 13, 3], [123, 616, 13, 13, 12, 3], [123, 667, 21, 13, 15, 3], [123, 718, 20, 13, 14, 3], [123, 769, 19, 13, 14, 3], [184, 4, 18, 13, 13, 3], [184, 55, 19, 13, 14, 3], [184, 106, 18, 13, 14, 3], [184, 157, 18, 13, 13, 3], [184, 208, 19, 13, 13, 3], [184, 259, 20, 13, 14, 3], [184, 310, 21, 13, 15, 3], [184, 361, 23, 13, 17, 3], [184, 412, 19, 13, 13, 3], [184, 463, 19, 13, 13, 3], [184, 514, 19, 13, 13, 3], [184, 564, 15, 15, 9, 2], [184, 617, 12, 12, 11, 4], [184, 666, 15, 15, 9, 2], [184, 717, 16, 5, 11, 2], [184, 779, 15, 3, 13, 13], [245, 3, 14, 5, 9, 2], [245, 58, 16, 10, 12, 6], [245, 106, 16, 13, 13, 3], [245, 160, 16, 10, 12, 6], [245, 208, 19, 13, 13, 3], [245, 262, 16, 10, 13, 6], [245, 310, 16, 13, 10, 3], [245, 364, 17, 13, 13, 6], [245, 412, 16, 13, 12, 3], [245, 463, 14, 13, 9, 3], [245, 514, 14, 16, 9, 3], [245, 565, 16, 13, 13, 3], [245, 616, 14, 13, 9, 3], [245, 670, 21, 10, 17, 6], [245, 721, 16, 10, 12, 6], [245, 772, 16, 10, 13, 6], [306, 7, 16, 13, 13, 6], [306, 58, 17, 13, 13, 6], [306, 109, 16, 10, 11, 6], [306, 160, 16, 10, 12, 6], [306, 208, 14, 13, 11, 3], [306, 262, 16, 10, 12, 6], [306, 313, 17, 10, 13, 6], [306, 364, 19, 10, 15, 6], [306, 415, 17, 10, 13, 6], [306, 466, 17, 14, 13, 6], [306, 517, 16, 10, 12, 6], [306, 565, 15, 14, 9, 3], [306, 616, 13, 14, 7, 3], [306, 667, 13, 14, 9, 3], [306, 719, 18, 4, 13, 4], [306, 766, 1, 1, 3, 1], [367, 2, 20, 15, 15, 1], [367, 52, 20, 16, 15, 0], [367, 106, 18, 17, 13, 3], [367, 154, 18, 16, 12, 0], [367, 205, 20, 16, 14, 0], [367, 257, 19, 15, 14, 1], [367, 308, 20, 15, 14, 1], [367, 361, 16, 13, 12, 3], [367, 412, 16, 13, 12, 3], [367, 462, 17, 14, 12, 2], [367, 514, 17, 13, 12, 3], [367, 565, 18, 13, 12, 3], [367, 614, 17, 15, 12, 1], [367, 670, 16, 13, 12, 6], [367, 718, 17, 13, 13, 3], [367, 769, 16, 13, 13, 3], [428, 3, 17, 14, 13, 2], [428, 55, 18, 13, 13, 3], [428, 106, 14, 13, 9, 3], [428, 157, 13, 13, 9, 3], [428, 207, 15, 14, 9, 2], [428, 259, 16, 13, 10, 3], [428, 310, 18, 13, 12, 3], [428, 361, 17, 13, 13, 3], [428, 412, 16, 13, 13, 3], [428, 462, 17, 14, 13, 2], [428, 514, 18, 13, 13, 3], [428, 565, 19, 13, 13, 3], [428, 616, 16, 13, 12, 3], [428, 667, 16, 13, 12, 3], [428, 717, 16, 14, 12, 2], [428, 769, 17, 13, 12, 3], [489, 3, 15, 7, 9, 2], [489, 55, 15, 6, 10, 3], [489, 107, 16, 12, 12, 4], [489, 157, 17, 13, 13, 3], [489, 208, 18, 13, 13, 3], [489, 261, 17, 9, 13, 5], [489, 310, 19, 13, 13, 3], [489, 361, 18, 13, 14, 3], [489, 414, 19, 11, 15, 5], [489, 465, 19, 11, 15, 5], [489, 514, 22, 6, 16, 3], [489, 565, 14, 4, 8, 3], [489, 616, 16, 3, 10, 3], [489, 669, 17, 10, 13, 5], [489, 718, 23, 13, 17, 3], [489, 769, 20, 13, 14, 3], [550, 7, 23, 7, 19, 6], [550, 57, 16, 10, 13, 5], [550, 108, 15, 10, 11, 5], [550, 159, 13, 10, 11, 5], [550, 208, 19, 13, 13, 3], [550, 262, 17, 13, 14, 6], [550, 311, 16, 12, 12, 4], [550, 361, 20, 13, 14, 3], [550, 412, 20, 13, 14, 3], [550, 465, 20, 11, 15, 5], [550, 513, 15, 18, 9, 2], [550, 565, 16, 10, 11, 3], [550, 616, 16, 10, 11, 3], [550, 667, 19, 13, 14, 3], [550, 721, 21, 10, 18, 6], [550, 772, 17, 10, 12, 6], [611, 4, 16, 13, 13, 3], [611, 55, 13, 13, 8, 3], [611, 111, 15, 5, 12, 8], [611, 157, 22, 13, 16, 3], [611, 207, 15, 18, 9, 2], [611, 262, 17, 8, 13, 6], [611, 311, 16, 12, 15, 4], [611, 365, 17, 9, 13, 7], [611, 416, 15, 9, 13, 7], [611, 473, 15, 3, 14, 13], [611, 511, 1, 1, 13, 1], [611, 562, 19, 16, 15, 0], [611, 613, 21, 16, 15, 0], [611, 664, 20, 16, 14, 0], [611, 718, 24, 13, 18, 3], [611, 772, 21, 10, 18, 6], [672, 10, 14, 3, 11, 9], [672, 61, 17, 3, 14, 9], [672, 106, 17, 6, 12, 3], [672, 157, 18, 6, 12, 3], [672, 208, 14, 6, 8, 3], [672, 259, 14, 6, 8, 3], [672, 313, 16, 7, 13, 6], [672, 363, 18, 11, 15, 5], [672, 412, 18, 17, 13, 3], [1, 1, 1, 1, 8, 1], [794, 769, 21, 13, 15, 3], [672, 565, 21, 13, 15, 3], [672, 616, 21, 13, 15, 3], [672, 667, 21, 13, 15, 3], [672, 718, 21, 13, 15, 3], [672, 769, 21, 13, 15, 3], [733, 4, 21, 13, 15, 3], [733, 55, 21, 13, 15, 3], [733, 106, 21, 13, 15, 3], [733, 157, 21, 13, 15, 3], [733, 208, 21, 13, 15, 3], [733, 259, 21, 13, 15, 3], [733, 310, 21, 13, 15, 3], [733, 361, 21, 13, 15, 3], [733, 412, 21, 13, 15, 3], [733, 463, 21, 13, 15, 3], [733, 514, 21, 13, 15, 3], [733, 565, 21, 13, 15, 3], [733, 616, 21, 13, 15, 3], [733, 667, 21, 13, 15, 3], [733, 718, 21, 13, 15, 3], [733, 769, 21, 13, 15, 3], [1, 1, 1, 1, 8, 1], [794, 55, 21, 13, 15, 3], [794, 106, 21, 13, 15, 3], [794, 157, 21, 13, 15, 3], [794, 208, 21, 13, 15, 3], [794, 259, 21, 13, 15, 3], [794, 310, 21, 13, 15, 3], [794, 361, 21, 13, 15, 3], [794, 412, 21, 13, 15, 3], [794, 463, 21, 13, 15, 3], [794, 514, 21, 13, 15, 3], [794, 565, 21, 13, 15, 3], [794, 616, 21, 13, 15, 3], [794, 667, 21, 13, 15, 3], [794, 718, 21, 13, 15, 3], [794, 769, 21, 13, 15, 3], [855, 4, 21, 13, 15, 3], [855, 55, 21, 13, 15, 3], [855, 106, 21, 13, 15, 3], [855, 157, 21, 13, 15, 3], [855, 208, 21, 13, 15, 3], [855, 259, 21, 13, 15, 3], [855, 310, 21, 13, 15, 3], [855, 361, 21, 13, 15, 3], [855, 412, 21, 13, 15, 3], [855, 463, 21, 13, 15, 3], [855, 514, 21, 13, 15, 3], [855, 565, 21, 13, 15, 3], [855, 616, 21, 13, 15, 3], [855, 667, 21, 13, 15, 3], [855, 718, 21, 13, 15, 3], [855, 769, 21, 13, 15, 3]], \"capHeight\": 15, \"widestlogicalchar\": 19, \"widestglyph\": 24, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 56, 12, 10, 7, 4], [1, 107, 14, 3, 9, 4], [1, 157, 17, 8, 12, 3], [1, 208, 15, 12, 10, 3], [1, 259, 20, 11, 14, 3], [1, 310, 16, 11, 14, 3], [1, 361, 12, 3, 6, 3], [1, 411, 14, 13, 9, 2], [1, 462, 14, 13, 9, 2], [1, 514, 17, 7, 12, 3], [1, 567, 15, 7, 12, 5], [1, 626, 8, 4, 7, 13], [1, 672, 14, 1, 11, 8], [1, 728, 7, 1, 6, 13], [1, 770, 15, 10, 10, 4], [62, 4, 17, 11, 12, 3], [62, 55, 15, 11, 12, 3], [62, 106, 17, 11, 12, 3], [62, 157, 18, 11, 12, 3], [62, 208, 17, 11, 12, 3], [62, 259, 18, 11, 12, 3], [62, 310, 16, 11, 12, 3], [62, 361, 18, 11, 12, 3], [62, 412, 16, 11, 12, 3], [62, 463, 17, 11, 12, 3], [62, 518, 10, 7, 6, 7], [62, 569, 11, 10, 7, 7], [62, 618, 14, 7, 10, 5], [62, 671, 17, 4, 14, 7], [62, 720, 12, 7, 10, 5], [62, 769, 16, 11, 11, 3], [123, 6, 19, 9, 15, 5], [123, 55, 16, 11, 14, 3], [123, 106, 16, 11, 12, 3], [123, 157, 17, 11, 12, 3], [123, 208, 17, 11, 12, 3], [123, 259, 17, 11, 11, 3], [123, 310, 17, 11, 11, 3], [123, 361, 17, 11, 13, 3], [123, 412, 18, 11, 12, 3], [123, 463, 13, 11, 8, 3], [123, 514, 17, 11, 11, 3], [123, 565, 18, 11, 12, 3], [123, 616, 12, 11, 11, 3], [123, 667, 20, 11, 14, 3], [123, 718, 19, 11, 13, 3], [123, 769, 18, 11, 13, 3], [184, 4, 17, 11, 12, 3], [184, 55, 18, 11, 13, 3], [184, 106, 17, 11, 13, 3], [184, 157, 17, 11, 12, 3], [184, 208, 18, 11, 12, 3], [184, 259, 19, 11, 13, 3], [184, 310, 20, 11, 14, 3], [184, 361, 22, 11, 16, 3], [184, 412, 18, 11, 12, 3], [184, 463, 18, 11, 12, 3], [184, 514, 18, 11, 12, 3], [184, 564, 14, 13, 8, 2], [184, 617, 11, 10, 10, 4], [184, 666, 14, 13, 8, 2], [184, 717, 15, 3, 10, 2], [184, 779, 14, 1, 12, 13], [245, 3, 13, 3, 8, 2], [245, 58, 15, 8, 11, 6], [245, 106, 15, 11, 12, 3], [245, 160, 15, 8, 11, 6], [245, 208, 18, 11, 12, 3], [245, 262, 15, 8, 12, 6], [245, 310, 15, 11, 9, 3], [245, 364, 16, 11, 12, 6], [245, 412, 15, 11, 11, 3], [245, 463, 13, 11, 8, 3], [245, 514, 13, 14, 8, 3], [245, 565, 15, 11, 12, 3], [245, 616, 13, 11, 8, 3], [245, 670, 20, 8, 16, 6], [245, 721, 15, 8, 11, 6], [245, 772, 15, 8, 12, 6], [306, 7, 15, 11, 12, 6], [306, 58, 16, 11, 12, 6], [306, 109, 15, 8, 10, 6], [306, 160, 15, 8, 11, 6], [306, 208, 13, 11, 10, 3], [306, 262, 15, 8, 11, 6], [306, 313, 16, 8, 12, 6], [306, 364, 18, 8, 14, 6], [306, 415, 16, 8, 12, 6], [306, 466, 16, 12, 12, 6], [306, 517, 15, 8, 11, 6], [306, 565, 14, 12, 8, 3], [306, 616, 12, 12, 6, 3], [306, 667, 12, 12, 8, 3], [306, 719, 17, 2, 12, 4], [306, 766, 1, 1, 3, 1], [367, 2, 19, 13, 14, 1], [367, 52, 19, 14, 14, 0], [367, 106, 17, 15, 12, 3], [367, 154, 17, 14, 11, 0], [367, 205, 19, 14, 13, 0], [367, 257, 18, 13, 13, 1], [367, 308, 19, 13, 13, 1], [367, 361, 15, 11, 11, 3], [367, 412, 15, 11, 11, 3], [367, 462, 16, 12, 11, 2], [367, 514, 16, 11, 11, 3], [367, 565, 17, 11, 11, 3], [367, 614, 16, 13, 11, 1], [367, 670, 15, 11, 11, 6], [367, 718, 16, 11, 12, 3], [367, 769, 15, 11, 12, 3], [428, 3, 16, 12, 12, 2], [428, 55, 17, 11, 12, 3], [428, 106, 13, 11, 8, 3], [428, 157, 12, 11, 8, 3], [428, 207, 14, 12, 8, 2], [428, 259, 15, 11, 9, 3], [428, 310, 17, 11, 11, 3], [428, 361, 16, 11, 12, 3], [428, 412, 15, 11, 12, 3], [428, 462, 16, 12, 12, 2], [428, 514, 17, 11, 12, 3], [428, 565, 18, 11, 12, 3], [428, 616, 15, 11, 11, 3], [428, 667, 15, 11, 11, 3], [428, 717, 15, 12, 11, 2], [428, 769, 16, 11, 11, 3], [489, 3, 14, 5, 8, 2], [489, 55, 14, 4, 9, 3], [489, 107, 15, 10, 11, 4], [489, 157, 16, 11, 12, 3], [489, 208, 17, 11, 12, 3], [489, 261, 16, 7, 12, 5], [489, 310, 18, 11, 12, 3], [489, 361, 17, 11, 13, 3], [489, 414, 18, 9, 14, 5], [489, 465, 18, 9, 14, 5], [489, 514, 21, 4, 15, 3], [489, 565, 13, 2, 7, 3], [489, 616, 15, 1, 9, 3], [489, 669, 16, 8, 12, 5], [489, 718, 22, 11, 16, 3], [489, 769, 19, 11, 13, 3], [550, 7, 22, 5, 18, 6], [550, 57, 15, 8, 12, 5], [550, 108, 14, 8, 10, 5], [550, 159, 12, 8, 10, 5], [550, 208, 18, 11, 12, 3], [550, 262, 16, 11, 13, 6], [550, 311, 15, 10, 11, 4], [550, 361, 19, 11, 13, 3], [550, 412, 19, 11, 13, 3], [550, 465, 19, 9, 14, 5], [550, 513, 14, 16, 8, 2], [550, 565, 15, 8, 10, 3], [550, 616, 15, 8, 10, 3], [550, 667, 18, 11, 13, 3], [550, 721, 20, 8, 17, 6], [550, 772, 16, 8, 11, 6], [611, 4, 15, 11, 12, 3], [611, 55, 12, 11, 7, 3], [611, 111, 14, 3, 11, 8], [611, 157, 21, 11, 15, 3], [611, 207, 14, 16, 8, 2], [611, 262, 16, 6, 12, 6], [611, 311, 15, 10, 14, 4], [611, 365, 16, 7, 12, 7], [611, 416, 14, 7, 12, 7], [611, 473, 14, 1, 13, 13], [611, 511, 1, 1, 12, 1], [611, 562, 18, 14, 14, 0], [611, 613, 19, 14, 14, 0], [611, 664, 18, 14, 13, 0], [611, 718, 23, 11, 17, 3], [611, 772, 20, 8, 17, 6], [672, 10, 13, 1, 10, 9], [672, 61, 16, 1, 13, 9], [672, 106, 16, 4, 11, 3], [672, 157, 17, 4, 11, 3], [672, 208, 13, 4, 7, 3], [672, 259, 13, 4, 7, 3], [672, 313, 15, 5, 12, 6], [672, 363, 17, 9, 14, 5], [672, 412, 17, 15, 12, 3], [1, 1, 1, 1, 7, 1], [794, 769, 20, 11, 14, 3], [672, 565, 20, 11, 14, 3], [672, 616, 20, 11, 14, 3], [672, 667, 20, 11, 14, 3], [672, 718, 20, 11, 14, 3], [672, 769, 20, 11, 14, 3], [733, 4, 20, 11, 14, 3], [733, 55, 20, 11, 14, 3], [733, 106, 20, 11, 14, 3], [733, 157, 20, 11, 14, 3], [733, 208, 20, 11, 14, 3], [733, 259, 20, 11, 14, 3], [733, 310, 20, 11, 14, 3], [733, 361, 20, 11, 14, 3], [733, 412, 20, 11, 14, 3], [733, 463, 20, 11, 14, 3], [733, 514, 20, 11, 14, 3], [733, 565, 20, 11, 14, 3], [733, 616, 20, 11, 14, 3], [733, 667, 20, 11, 14, 3], [733, 718, 20, 11, 14, 3], [733, 769, 20, 11, 14, 3], [1, 1, 1, 1, 7, 1], [794, 55, 20, 11, 14, 3], [794, 106, 20, 11, 14, 3], [794, 157, 20, 11, 14, 3], [794, 208, 20, 11, 14, 3], [794, 259, 20, 11, 14, 3], [794, 310, 20, 11, 14, 3], [794, 361, 20, 11, 14, 3], [794, 412, 20, 11, 14, 3], [794, 463, 20, 11, 14, 3], [794, 514, 20, 11, 14, 3], [794, 565, 20, 11, 14, 3], [794, 616, 20, 11, 14, 3], [794, 667, 20, 11, 14, 3], [794, 718, 20, 11, 14, 3], [794, 769, 20, 11, 14, 3], [855, 4, 20, 11, 14, 3], [855, 55, 20, 11, 14, 3], [855, 106, 20, 11, 14, 3], [855, 157, 20, 11, 14, 3], [855, 208, 20, 11, 14, 3], [855, 259, 20, 11, 14, 3], [855, 310, 20, 11, 14, 3], [855, 361, 20, 11, 14, 3], [855, 412, 20, 11, 14, 3], [855, 463, 20, 11, 14, 3], [855, 514, 20, 11, 14, 3], [855, 565, 20, 11, 14, 3], [855, 616, 20, 11, 14, 3], [855, 667, 20, 11, 14, 3], [855, 718, 20, 11, 14, 3], [855, 769, 20, 11, 14, 3]], \"capHeight\": 14, \"widestlogicalchar\": 18, \"widestglyph\": 23, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 8, 6, 8, 9], [1, 56, 8, 12, 8, 4], [1, 107, 10, 11, 10, 4], [1, 157, 13, 12, 13, 3], [1, 208, 11, 14, 11, 3], [1, 259, 15, 13, 15, 3], [1, 310, 15, 13, 15, 3], [1, 361, 7, 12, 7, 3], [1, 411, 10, 15, 10, 2], [1, 462, 10, 15, 10, 2], [1, 514, 13, 12, 13, 3], [1, 567, 13, 10, 13, 5], [1, 622, 8, 10, 8, 9], [1, 672, 12, 7, 12, 8], [1, 724, 7, 7, 7, 9], [1, 770, 11, 12, 11, 4], [62, 4, 13, 13, 13, 3], [62, 55, 13, 13, 13, 3], [62, 106, 13, 13, 13, 3], [62, 157, 13, 13, 13, 3], [62, 208, 13, 13, 13, 3], [62, 259, 13, 13, 13, 3], [62, 310, 13, 13, 13, 3], [62, 361, 13, 13, 13, 3], [62, 412, 13, 13, 13, 3], [62, 463, 13, 13, 13, 3], [62, 518, 7, 9, 7, 7], [62, 569, 8, 12, 8, 7], [62, 618, 11, 10, 11, 5], [62, 671, 15, 8, 15, 7], [62, 720, 11, 10, 11, 5], [62, 769, 12, 13, 12, 3], [123, 6, 16, 11, 16, 5], [123, 55, 15, 13, 15, 3], [123, 106, 13, 13, 13, 3], [123, 157, 13, 13, 13, 3], [123, 208, 13, 13, 13, 3], [123, 259, 12, 13, 12, 3], [123, 310, 12, 13, 12, 3], [123, 361, 14, 13, 14, 3], [123, 412, 13, 13, 13, 3], [123, 463, 9, 13, 9, 3], [123, 514, 12, 13, 12, 3], [123, 565, 13, 13, 13, 3], [123, 616, 12, 13, 12, 3], [123, 667, 15, 13, 15, 3], [123, 718, 14, 13, 14, 3], [123, 769, 14, 13, 14, 3], [184, 4, 13, 13, 13, 3], [184, 55, 14, 13, 14, 3], [184, 106, 14, 13, 14, 3], [184, 157, 13, 13, 13, 3], [184, 208, 13, 13, 13, 3], [184, 259, 14, 13, 14, 3], [184, 310, 15, 13, 15, 3], [184, 361, 17, 13, 17, 3], [184, 412, 13, 13, 13, 3], [184, 463, 13, 13, 13, 3], [184, 514, 13, 13, 13, 3], [184, 564, 9, 15, 9, 2], [184, 617, 11, 12, 11, 4], [184, 666, 9, 15, 9, 2], [184, 717, 11, 13, 11, 2], [184, 775, 13, 7, 13, 9], [245, 3, 9, 13, 9, 2], [245, 58, 12, 10, 12, 6], [245, 106, 13, 13, 13, 3], [245, 160, 12, 10, 12, 6], [245, 208, 13, 13, 13, 3], [245, 262, 13, 10, 13, 6], [245, 310, 10, 13, 10, 3], [245, 364, 13, 13, 13, 6], [245, 412, 12, 13, 12, 3], [245, 463, 9, 13, 9, 3], [245, 514, 9, 16, 9, 3], [245, 565, 13, 13, 13, 3], [245, 616, 9, 13, 9, 3], [245, 670, 17, 10, 17, 6], [245, 721, 12, 10, 12, 6], [245, 772, 13, 10, 13, 6], [306, 7, 13, 13, 13, 6], [306, 58, 13, 13, 13, 6], [306, 109, 11, 10, 11, 6], [306, 160, 12, 10, 12, 6], [306, 208, 11, 13, 11, 3], [306, 262, 12, 10, 12, 6], [306, 313, 13, 10, 13, 6], [306, 364, 15, 10, 15, 6], [306, 415, 13, 10, 13, 6], [306, 466, 13, 14, 13, 6], [306, 517, 12, 10, 12, 6], [306, 565, 9, 14, 9, 3], [306, 616, 7, 14, 7, 3], [306, 667, 9, 14, 9, 3], [306, 719, 13, 11, 13, 4], [306, 775, 3, 6, 3, 9], [367, 2, 15, 15, 15, 1], [367, 52, 15, 16, 15, 0], [367, 106, 13, 17, 13, 3], [367, 154, 12, 16, 12, 0], [367, 205, 14, 16, 14, 0], [367, 257, 14, 15, 14, 1], [367, 308, 14, 15, 14, 1], [367, 361, 12, 13, 12, 3], [367, 412, 12, 13, 12, 3], [367, 462, 12, 14, 12, 2], [367, 514, 12, 13, 12, 3], [367, 565, 12, 13, 12, 3], [367, 614, 12, 15, 12, 1], [367, 670, 12, 13, 12, 6], [367, 718, 13, 13, 13, 3], [367, 769, 13, 13, 13, 3], [428, 3, 13, 14, 13, 2], [428, 55, 13, 13, 13, 3], [428, 106, 9, 13, 9, 3], [428, 157, 9, 13, 9, 3], [428, 207, 9, 14, 9, 2], [428, 259, 10, 13, 10, 3], [428, 310, 12, 13, 12, 3], [428, 361, 13, 13, 13, 3], [428, 412, 13, 13, 13, 3], [428, 462, 13, 14, 13, 2], [428, 514, 13, 13, 13, 3], [428, 565, 13, 13, 13, 3], [428, 616, 12, 13, 12, 3], [428, 667, 12, 13, 12, 3], [428, 717, 12, 14, 12, 2], [428, 769, 12, 13, 12, 3], [489, 3, 9, 13, 9, 2], [489, 55, 10, 12, 10, 3], [489, 107, 12, 12, 12, 4], [489, 157, 13, 13, 13, 3], [489, 208, 13, 13, 13, 3], [489, 261, 13, 10, 13, 5], [489, 310, 13, 13, 13, 3], [489, 361, 14, 13, 14, 3], [489, 414, 15, 11, 15, 5], [489, 465, 15, 11, 15, 5], [489, 514, 16, 12, 16, 3], [489, 565, 8, 12, 8, 3], [489, 616, 10, 12, 10, 3], [489, 669, 13, 10, 13, 5], [489, 718, 17, 13, 17, 3], [489, 769, 14, 13, 14, 3], [550, 7, 19, 9, 19, 6], [550, 57, 13, 10, 13, 5], [550, 108, 11, 10, 11, 5], [550, 159, 11, 10, 11, 5], [550, 208, 13, 13, 13, 3], [550, 262, 14, 13, 14, 6], [550, 311, 12, 12, 12, 4], [550, 361, 14, 13, 14, 3], [550, 412, 14, 13, 14, 3], [550, 465, 15, 11, 15, 5], [550, 513, 9, 18, 9, 2], [550, 565, 11, 12, 11, 3], [550, 616, 11, 12, 11, 3], [550, 667, 14, 13, 14, 3], [550, 721, 18, 10, 18, 6], [550, 772, 12, 10, 12, 6], [611, 4, 13, 13, 13, 3], [611, 55, 8, 13, 8, 3], [611, 111, 12, 7, 12, 8], [611, 157, 16, 13, 16, 3], [611, 207, 9, 18, 9, 2], [611, 262, 13, 9, 13, 6], [611, 311, 15, 12, 15, 4], [611, 365, 13, 9, 13, 7], [611, 416, 13, 9, 13, 7], [611, 469, 14, 7, 14, 9], [611, 520, 13, 6, 13, 9], [611, 562, 15, 16, 15, 0], [611, 613, 15, 16, 15, 0], [611, 664, 14, 16, 14, 0], [611, 718, 18, 13, 18, 3], [611, 772, 18, 10, 18, 6], [672, 10, 11, 6, 11, 9], [672, 61, 14, 6, 14, 9], [672, 106, 12, 12, 12, 3], [672, 157, 12, 12, 12, 3], [672, 208, 8, 12, 8, 3], [672, 259, 8, 12, 8, 3], [672, 313, 13, 9, 13, 6], [672, 363, 15, 11, 15, 5], [672, 412, 13, 17, 13, 3], [1, 10, 8, 6, 8, 9], [794, 769, 15, 13, 15, 3], [672, 565, 15, 13, 15, 3], [672, 616, 15, 13, 15, 3], [672, 667, 15, 13, 15, 3], [672, 718, 15, 13, 15, 3], [672, 769, 15, 13, 15, 3], [733, 4, 15, 13, 15, 3], [733, 55, 15, 13, 15, 3], [733, 106, 15, 13, 15, 3], [733, 157, 15, 13, 15, 3], [733, 208, 15, 13, 15, 3], [733, 259, 15, 13, 15, 3], [733, 310, 15, 13, 15, 3], [733, 361, 15, 13, 15, 3], [733, 412, 15, 13, 15, 3], [733, 463, 15, 13, 15, 3], [733, 514, 15, 13, 15, 3], [733, 565, 15, 13, 15, 3], [733, 616, 15, 13, 15, 3], [733, 667, 15, 13, 15, 3], [733, 718, 15, 13, 15, 3], [733, 769, 15, 13, 15, 3], [1, 10, 8, 6, 8, 9], [794, 55, 15, 13, 15, 3], [794, 106, 15, 13, 15, 3], [794, 157, 15, 13, 15, 3], [794, 208, 15, 13, 15, 3], [794, 259, 15, 13, 15, 3], [794, 310, 15, 13, 15, 3], [794, 361, 15, 13, 15, 3], [794, 412, 15, 13, 15, 3], [794, 463, 15, 13, 15, 3], [794, 514, 15, 13, 15, 3], [794, 565, 15, 13, 15, 3], [794, 616, 15, 13, 15, 3], [794, 667, 15, 13, 15, 3], [794, 718, 15, 13, 15, 3], [794, 769, 15, 13, 15, 3], [855, 4, 15, 13, 15, 3], [855, 55, 15, 13, 15, 3], [855, 106, 15, 13, 15, 3], [855, 157, 15, 13, 15, 3], [855, 208, 15, 13, 15, 3], [855, 259, 15, 13, 15, 3], [855, 310, 15, 13, 15, 3], [855, 361, 15, 13, 15, 3], [855, 412, 15, 13, 15, 3], [855, 463, 15, 13, 15, 3], [855, 514, 15, 13, 15, 3], [855, 565, 15, 13, 15, 3], [855, 616, 15, 13, 15, 3], [855, 667, 15, 13, 15, 3], [855, 718, 15, 13, 15, 3], [855, 769, 15, 13, 15, 3]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 7, 6, 7, 8], [1, 56, 7, 10, 7, 4], [1, 107, 9, 10, 9, 4], [1, 157, 12, 11, 12, 3], [1, 208, 10, 12, 10, 3], [1, 259, 14, 11, 14, 3], [1, 310, 14, 11, 14, 3], [1, 361, 6, 11, 6, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 514, 12, 11, 12, 3], [1, 567, 12, 9, 12, 5], [1, 621, 7, 9, 7, 8], [1, 672, 11, 6, 11, 8], [1, 723, 6, 6, 6, 8], [1, 770, 10, 10, 10, 4], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 518, 6, 7, 6, 7], [62, 569, 7, 10, 7, 7], [62, 618, 10, 9, 10, 5], [62, 671, 14, 7, 14, 7], [62, 720, 10, 9, 10, 5], [62, 769, 11, 11, 11, 3], [123, 6, 15, 9, 15, 5], [123, 55, 14, 11, 14, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 13, 11, 13, 3], [123, 412, 12, 11, 12, 3], [123, 463, 8, 11, 8, 3], [123, 514, 11, 11, 11, 3], [123, 565, 12, 11, 12, 3], [123, 616, 11, 11, 11, 3], [123, 667, 14, 11, 14, 3], [123, 718, 13, 11, 13, 3], [123, 769, 13, 11, 13, 3], [184, 4, 12, 11, 12, 3], [184, 55, 13, 11, 13, 3], [184, 106, 13, 11, 13, 3], [184, 157, 12, 11, 12, 3], [184, 208, 12, 11, 12, 3], [184, 259, 13, 11, 13, 3], [184, 310, 14, 11, 14, 3], [184, 361, 16, 11, 16, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 12, 11, 12, 3], [184, 564, 8, 13, 8, 2], [184, 617, 10, 10, 10, 4], [184, 666, 8, 13, 8, 2], [184, 717, 10, 12, 10, 2], [184, 774, 12, 6, 12, 8], [245, 3, 8, 12, 8, 2], [245, 58, 11, 8, 11, 6], [245, 106, 12, 11, 12, 3], [245, 160, 11, 8, 11, 6], [245, 208, 12, 11, 12, 3], [245, 262, 12, 8, 12, 6], [245, 310, 9, 11, 9, 3], [245, 364, 12, 11, 12, 6], [245, 412, 11, 11, 11, 3], [245, 463, 8, 11, 8, 3], [245, 514, 8, 14, 8, 3], [245, 565, 12, 11, 12, 3], [245, 616, 8, 11, 8, 3], [245, 670, 16, 8, 16, 6], [245, 721, 11, 8, 11, 6], [245, 772, 12, 8, 12, 6], [306, 7, 12, 11, 12, 6], [306, 58, 12, 11, 12, 6], [306, 109, 10, 8, 10, 6], [306, 160, 11, 8, 11, 6], [306, 208, 10, 11, 10, 3], [306, 262, 11, 8, 11, 6], [306, 313, 12, 8, 12, 6], [306, 364, 14, 8, 14, 6], [306, 415, 12, 8, 12, 6], [306, 466, 12, 12, 12, 6], [306, 517, 11, 8, 11, 6], [306, 565, 8, 12, 8, 3], [306, 616, 6, 12, 6, 3], [306, 667, 8, 12, 8, 3], [306, 719, 12, 10, 12, 4], [306, 774, 3, 6, 3, 8], [367, 2, 14, 13, 14, 1], [367, 52, 14, 14, 14, 0], [367, 106, 12, 15, 12, 3], [367, 154, 11, 14, 11, 0], [367, 205, 13, 14, 13, 0], [367, 257, 13, 13, 13, 1], [367, 308, 13, 13, 13, 1], [367, 361, 11, 11, 11, 3], [367, 412, 11, 11, 11, 3], [367, 462, 11, 12, 11, 2], [367, 514, 11, 11, 11, 3], [367, 565, 11, 11, 11, 3], [367, 614, 11, 13, 11, 1], [367, 670, 11, 11, 11, 6], [367, 718, 12, 11, 12, 3], [367, 769, 12, 11, 12, 3], [428, 3, 12, 12, 12, 2], [428, 55, 12, 11, 12, 3], [428, 106, 8, 11, 8, 3], [428, 157, 8, 11, 8, 3], [428, 207, 8, 12, 8, 2], [428, 259, 9, 11, 9, 3], [428, 310, 11, 11, 11, 3], [428, 361, 12, 11, 12, 3], [428, 412, 12, 11, 12, 3], [428, 462, 12, 12, 12, 2], [428, 514, 12, 11, 12, 3], [428, 565, 12, 11, 12, 3], [428, 616, 11, 11, 11, 3], [428, 667, 11, 11, 11, 3], [428, 717, 11, 12, 11, 2], [428, 769, 11, 11, 11, 3], [489, 3, 8, 12, 8, 2], [489, 55, 9, 11, 9, 3], [489, 107, 11, 10, 11, 4], [489, 157, 12, 11, 12, 3], [489, 208, 12, 11, 12, 3], [489, 261, 12, 9, 12, 5], [489, 310, 12, 11, 12, 3], [489, 361, 13, 11, 13, 3], [489, 414, 14, 9, 14, 5], [489, 465, 14, 9, 14, 5], [489, 514, 15, 11, 15, 3], [489, 565, 7, 11, 7, 3], [489, 616, 9, 11, 9, 3], [489, 669, 12, 9, 12, 5], [489, 718, 16, 11, 16, 3], [489, 769, 13, 11, 13, 3], [550, 7, 18, 8, 18, 6], [550, 57, 12, 9, 12, 5], [550, 108, 10, 9, 10, 5], [550, 159, 10, 9, 10, 5], [550, 208, 12, 11, 12, 3], [550, 262, 13, 11, 13, 6], [550, 311, 11, 10, 11, 4], [550, 361, 13, 11, 13, 3], [550, 412, 13, 11, 13, 3], [550, 465, 14, 9, 14, 5], [550, 513, 8, 16, 8, 2], [550, 565, 10, 11, 10, 3], [550, 616, 10, 11, 10, 3], [550, 667, 13, 11, 13, 3], [550, 721, 17, 8, 17, 6], [550, 772, 11, 8, 11, 6], [611, 4, 12, 11, 12, 3], [611, 55, 7, 11, 7, 3], [611, 111, 11, 6, 11, 8], [611, 157, 15, 11, 15, 3], [611, 207, 8, 16, 8, 2], [611, 262, 12, 8, 12, 6], [611, 311, 14, 10, 14, 4], [611, 365, 12, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 468, 13, 6, 13, 8], [611, 519, 12, 6, 12, 8], [611, 562, 14, 14, 14, 0], [611, 613, 14, 14, 14, 0], [611, 664, 13, 14, 13, 0], [611, 718, 17, 11, 17, 3], [611, 772, 17, 8, 17, 6], [672, 9, 10, 6, 10, 8], [672, 60, 13, 6, 13, 8], [672, 106, 11, 11, 11, 3], [672, 157, 11, 11, 11, 3], [672, 208, 7, 11, 7, 3], [672, 259, 7, 11, 7, 3], [672, 313, 12, 8, 12, 6], [672, 363, 14, 9, 14, 5], [672, 412, 12, 15, 12, 3], [1, 9, 7, 6, 7, 8], [794, 769, 14, 11, 14, 3], [672, 565, 14, 11, 14, 3], [672, 616, 14, 11, 14, 3], [672, 667, 14, 11, 14, 3], [672, 718, 14, 11, 14, 3], [672, 769, 14, 11, 14, 3], [733, 4, 14, 11, 14, 3], [733, 55, 14, 11, 14, 3], [733, 106, 14, 11, 14, 3], [733, 157, 14, 11, 14, 3], [733, 208, 14, 11, 14, 3], [733, 259, 14, 11, 14, 3], [733, 310, 14, 11, 14, 3], [733, 361, 14, 11, 14, 3], [733, 412, 14, 11, 14, 3], [733, 463, 14, 11, 14, 3], [733, 514, 14, 11, 14, 3], [733, 565, 14, 11, 14, 3], [733, 616, 14, 11, 14, 3], [733, 667, 14, 11, 14, 3], [733, 718, 14, 11, 14, 3], [733, 769, 14, 11, 14, 3], [1, 9, 7, 6, 7, 8], [794, 55, 14, 11, 14, 3], [794, 106, 14, 11, 14, 3], [794, 157, 14, 11, 14, 3], [794, 208, 14, 11, 14, 3], [794, 259, 14, 11, 14, 3], [794, 310, 14, 11, 14, 3], [794, 361, 14, 11, 14, 3], [794, 412, 14, 11, 14, 3], [794, 463, 14, 11, 14, 3], [794, 514, 14, 11, 14, 3], [794, 565, 14, 11, 14, 3], [794, 616, 14, 11, 14, 3], [794, 667, 14, 11, 14, 3], [794, 718, 14, 11, 14, 3], [794, 769, 14, 11, 14, 3], [855, 4, 14, 11, 14, 3], [855, 55, 14, 11, 14, 3], [855, 106, 14, 11, 14, 3], [855, 157, 14, 11, 14, 3], [855, 208, 14, 11, 14, 3], [855, 259, 14, 11, 14, 3], [855, 310, 14, 11, 14, 3], [855, 361, 14, 11, 14, 3], [855, 412, 14, 11, 14, 3], [855, 463, 14, 11, 14, 3], [855, 514, 14, 11, 14, 3], [855, 565, 14, 11, 14, 3], [855, 616, 14, 11, 14, 3], [855, 667, 14, 11, 14, 3], [855, 718, 14, 11, 14, 3], [855, 769, 14, 11, 14, 3]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 56, 17, 16, 11, 4], [1, 107, 19, 5, 13, 4], [1, 158, 24, 10, 19, 4], [1, 207, 21, 20, 17, 2], [1, 260, 25, 16, 19, 4], [1, 311, 22, 16, 21, 4], [1, 362, 15, 5, 8, 4], [1, 412, 19, 18, 12, 3], [1, 463, 18, 18, 12, 3], [1, 516, 22, 9, 19, 5], [1, 569, 20, 11, 17, 7], [1, 629, 11, 6, 11, 16], [1, 675, 19, 3, 15, 11], [1, 731, 11, 4, 11, 16], [1, 770, 21, 16, 15, 4], [62, 5, 21, 16, 17, 4], [62, 56, 20, 16, 17, 4], [62, 107, 22, 16, 17, 4], [62, 158, 23, 16, 17, 4], [62, 209, 23, 16, 17, 4], [62, 260, 23, 16, 17, 4], [62, 311, 21, 16, 17, 4], [62, 362, 23, 16, 17, 4], [62, 413, 22, 16, 17, 4], [62, 464, 22, 16, 17, 4], [62, 519, 15, 12, 11, 8], [62, 570, 15, 14, 11, 8], [62, 620, 19, 11, 15, 7], [62, 673, 20, 6, 15, 9], [62, 722, 18, 11, 15, 7], [62, 770, 22, 16, 17, 4], [123, 7, 24, 14, 21, 6], [123, 56, 20, 16, 19, 4], [123, 107, 21, 16, 17, 4], [123, 158, 22, 16, 17, 4], [123, 209, 21, 16, 17, 4], [123, 260, 21, 16, 15, 4], [123, 311, 21, 16, 15, 4], [123, 362, 22, 16, 17, 4], [123, 413, 23, 16, 17, 4], [123, 464, 16, 16, 11, 4], [123, 515, 21, 16, 15, 4], [123, 566, 22, 16, 17, 4], [123, 617, 15, 16, 15, 4], [123, 668, 25, 16, 19, 4], [123, 719, 23, 16, 17, 4], [123, 770, 22, 16, 17, 4], [184, 5, 22, 16, 17, 4], [184, 56, 22, 16, 17, 4], [184, 107, 22, 16, 17, 4], [184, 158, 22, 16, 17, 4], [184, 209, 24, 16, 17, 4], [184, 260, 23, 16, 17, 4], [184, 311, 25, 16, 19, 4], [184, 362, 28, 16, 21, 4], [184, 413, 23, 16, 17, 4], [184, 464, 23, 16, 17, 4], [184, 515, 22, 16, 15, 4], [184, 565, 19, 18, 13, 3], [184, 617, 15, 16, 15, 4], [184, 667, 20, 18, 13, 3], [184, 719, 18, 5, 13, 4], [184, 783, 19, 3, 17, 17], [245, 5, 16, 5, 11, 4], [245, 60, 19, 12, 15, 8], [245, 107, 18, 16, 15, 4], [245, 162, 19, 12, 15, 8], [245, 209, 21, 16, 15, 4], [245, 264, 18, 12, 15, 8], [245, 311, 21, 16, 13, 4], [245, 366, 19, 16, 15, 8], [245, 413, 18, 16, 15, 4], [245, 464, 16, 16, 11, 4], [245, 515, 18, 20, 13, 4], [245, 566, 18, 16, 15, 4], [245, 617, 16, 16, 11, 4], [245, 672, 24, 12, 21, 8], [245, 723, 18, 12, 15, 8], [245, 774, 18, 12, 15, 8], [306, 9, 18, 15, 15, 8], [306, 60, 19, 15, 15, 8], [306, 111, 19, 12, 15, 8], [306, 162, 19, 12, 15, 8], [306, 209, 16, 16, 13, 4], [306, 264, 19, 12, 15, 8], [306, 315, 20, 12, 15, 8], [306, 366, 25, 12, 21, 8], [306, 417, 19, 12, 15, 8], [306, 468, 21, 16, 17, 8], [306, 519, 19, 12, 15, 8], [306, 565, 20, 18, 13, 3], [306, 616, 17, 18, 9, 3], [306, 667, 19, 18, 13, 3], [306, 719, 23, 4, 17, 4], [306, 766, 1, 1, 3, 1], [367, 2, 24, 19, 19, 1], [367, 52, 24, 20, 19, 0], [367, 107, 22, 20, 17, 4], [367, 154, 22, 20, 15, 0], [367, 205, 25, 20, 17, 0], [367, 257, 23, 19, 17, 1], [367, 308, 23, 19, 17, 1], [367, 361, 21, 17, 15, 3], [367, 412, 19, 17, 15, 3], [367, 463, 20, 17, 15, 3], [367, 516, 20, 15, 15, 5], [367, 566, 20, 16, 15, 4], [367, 616, 20, 17, 15, 3], [367, 672, 19, 15, 15, 8], [367, 718, 20, 17, 15, 3], [367, 769, 19, 17, 15, 3], [428, 4, 20, 17, 15, 3], [428, 57, 20, 15, 15, 5], [428, 106, 18, 17, 11, 3], [428, 157, 18, 17, 11, 3], [428, 208, 18, 17, 11, 3], [428, 261, 18, 15, 12, 5], [428, 311, 21, 16, 15, 4], [428, 361, 20, 17, 15, 3], [428, 412, 19, 17, 15, 3], [428, 463, 20, 17, 15, 3], [428, 516, 20, 15, 15, 5], [428, 566, 21, 16, 15, 4], [428, 616, 20, 17, 15, 3], [428, 667, 19, 17, 15, 3], [428, 718, 20, 17, 15, 3], [428, 771, 20, 15, 15, 5], [489, 4, 18, 9, 13, 3], [489, 56, 18, 6, 13, 4], [489, 107, 20, 16, 15, 4], [489, 158, 21, 16, 17, 4], [489, 209, 22, 16, 17, 4], [489, 263, 20, 11, 17, 7], [489, 311, 23, 16, 17, 4], [489, 362, 22, 16, 17, 4], [489, 415, 24, 14, 21, 6], [489, 466, 24, 14, 21, 6], [489, 515, 27, 7, 23, 4], [489, 566, 18, 5, 13, 4], [489, 617, 19, 3, 13, 4], [489, 671, 20, 10, 15, 7], [489, 719, 29, 16, 23, 4], [489, 770, 24, 16, 17, 4], [550, 10, 24, 7, 21, 9], [550, 59, 20, 13, 17, 7], [550, 110, 19, 13, 15, 7], [550, 161, 18, 13, 15, 7], [550, 209, 23, 16, 17, 4], [550, 264, 20, 15, 17, 8], [550, 312, 19, 15, 15, 5], [550, 362, 23, 16, 17, 4], [550, 413, 25, 16, 19, 4], [550, 466, 25, 14, 19, 6], [550, 511, 23, 24, 15, 0], [550, 566, 21, 11, 15, 4], [550, 617, 20, 11, 15, 4], [550, 668, 24, 16, 21, 4], [550, 723, 26, 12, 23, 8], [550, 774, 19, 12, 15, 8], [611, 5, 19, 16, 17, 4], [611, 56, 16, 16, 11, 4], [611, 113, 19, 7, 15, 10], [611, 156, 28, 18, 21, 2], [611, 205, 23, 24, 15, 0], [611, 265, 20, 7, 15, 9], [611, 313, 19, 14, 19, 6], [611, 365, 24, 13, 19, 7], [611, 416, 21, 13, 19, 7], [611, 476, 21, 4, 21, 16], [611, 511, 1, 1, 17, 1], [611, 562, 22, 20, 19, 0], [611, 613, 26, 20, 19, 0], [611, 664, 25, 20, 17, 0], [611, 719, 29, 16, 23, 4], [611, 774, 24, 12, 21, 8], [672, 12, 18, 3, 15, 11], [672, 63, 23, 3, 19, 11], [672, 107, 24, 6, 19, 4], [672, 158, 22, 6, 19, 4], [672, 209, 19, 6, 13, 4], [672, 260, 17, 6, 13, 4], [672, 313, 18, 11, 15, 6], [672, 363, 22, 14, 21, 5], [672, 413, 21, 20, 17, 4], [1, 1, 1, 1, 11, 1], [794, 770, 25, 16, 19, 4], [672, 566, 25, 16, 19, 4], [672, 617, 25, 16, 19, 4], [672, 668, 25, 16, 19, 4], [672, 719, 25, 16, 19, 4], [672, 770, 25, 16, 19, 4], [733, 5, 25, 16, 19, 4], [733, 56, 25, 16, 19, 4], [733, 107, 25, 16, 19, 4], [733, 158, 25, 16, 19, 4], [733, 209, 25, 16, 19, 4], [733, 260, 25, 16, 19, 4], [733, 311, 25, 16, 19, 4], [733, 362, 25, 16, 19, 4], [733, 413, 25, 16, 19, 4], [733, 464, 25, 16, 19, 4], [733, 515, 25, 16, 19, 4], [733, 566, 25, 16, 19, 4], [733, 617, 25, 16, 19, 4], [733, 668, 25, 16, 19, 4], [733, 719, 25, 16, 19, 4], [733, 770, 25, 16, 19, 4], [1, 1, 1, 1, 11, 1], [794, 56, 25, 16, 19, 4], [794, 107, 25, 16, 19, 4], [794, 158, 25, 16, 19, 4], [794, 209, 25, 16, 19, 4], [794, 260, 25, 16, 19, 4], [794, 311, 25, 16, 19, 4], [794, 362, 25, 16, 19, 4], [794, 413, 25, 16, 19, 4], [794, 464, 25, 16, 19, 4], [794, 515, 25, 16, 19, 4], [794, 566, 25, 16, 19, 4], [794, 617, 25, 16, 19, 4], [794, 668, 25, 16, 19, 4], [794, 719, 25, 16, 19, 4], [794, 770, 25, 16, 19, 4], [855, 5, 25, 16, 19, 4], [855, 56, 25, 16, 19, 4], [855, 107, 25, 16, 19, 4], [855, 158, 25, 16, 19, 4], [855, 209, 25, 16, 19, 4], [855, 260, 25, 16, 19, 4], [855, 311, 25, 16, 19, 4], [855, 362, 25, 16, 19, 4], [855, 413, 25, 16, 19, 4], [855, 464, 25, 16, 19, 4], [855, 515, 25, 16, 19, 4], [855, 566, 25, 16, 19, 4], [855, 617, 25, 16, 19, 4], [855, 668, 25, 16, 19, 4], [855, 719, 25, 16, 19, 4], [855, 770, 25, 16, 19, 4]], \"capHeight\": 19, \"widestlogicalchar\": 23, \"widestglyph\": 29, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 56, 16, 14, 10, 4], [1, 107, 18, 3, 12, 4], [1, 158, 23, 8, 18, 4], [1, 207, 20, 18, 16, 2], [1, 260, 24, 14, 18, 4], [1, 311, 21, 14, 20, 4], [1, 362, 14, 3, 7, 4], [1, 412, 18, 16, 11, 3], [1, 463, 17, 16, 11, 3], [1, 516, 21, 7, 18, 5], [1, 569, 19, 9, 16, 7], [1, 629, 10, 4, 10, 16], [1, 675, 18, 1, 14, 11], [1, 731, 10, 2, 10, 16], [1, 770, 20, 14, 14, 4], [62, 5, 20, 14, 16, 4], [62, 56, 19, 14, 16, 4], [62, 107, 21, 14, 16, 4], [62, 158, 22, 14, 16, 4], [62, 209, 22, 14, 16, 4], [62, 260, 22, 14, 16, 4], [62, 311, 20, 14, 16, 4], [62, 362, 22, 14, 16, 4], [62, 413, 21, 14, 16, 4], [62, 464, 21, 14, 16, 4], [62, 519, 14, 10, 10, 8], [62, 570, 14, 12, 10, 8], [62, 620, 18, 9, 14, 7], [62, 673, 19, 4, 14, 9], [62, 722, 17, 9, 14, 7], [62, 770, 21, 14, 16, 4], [123, 7, 23, 12, 20, 6], [123, 56, 19, 14, 18, 4], [123, 107, 20, 14, 16, 4], [123, 158, 21, 14, 16, 4], [123, 209, 20, 14, 16, 4], [123, 260, 20, 14, 14, 4], [123, 311, 20, 14, 14, 4], [123, 362, 21, 14, 16, 4], [123, 413, 22, 14, 16, 4], [123, 464, 15, 14, 10, 4], [123, 515, 20, 14, 14, 4], [123, 566, 21, 14, 16, 4], [123, 617, 14, 14, 14, 4], [123, 668, 24, 14, 18, 4], [123, 719, 22, 14, 16, 4], [123, 770, 21, 14, 16, 4], [184, 5, 21, 14, 16, 4], [184, 56, 21, 14, 16, 4], [184, 107, 21, 14, 16, 4], [184, 158, 21, 14, 16, 4], [184, 209, 23, 14, 16, 4], [184, 260, 22, 14, 16, 4], [184, 311, 24, 14, 18, 4], [184, 362, 27, 14, 20, 4], [184, 413, 22, 14, 16, 4], [184, 464, 22, 14, 16, 4], [184, 515, 21, 14, 14, 4], [184, 565, 18, 16, 12, 3], [184, 617, 14, 14, 14, 4], [184, 667, 19, 16, 12, 3], [184, 719, 17, 3, 12, 4], [184, 783, 18, 1, 16, 17], [245, 5, 15, 3, 10, 4], [245, 60, 18, 10, 14, 8], [245, 107, 17, 14, 14, 4], [245, 162, 18, 10, 14, 8], [245, 209, 20, 14, 14, 4], [245, 264, 17, 10, 14, 8], [245, 311, 20, 14, 12, 4], [245, 366, 18, 14, 14, 8], [245, 413, 17, 14, 14, 4], [245, 464, 15, 14, 10, 4], [245, 515, 17, 18, 12, 4], [245, 566, 17, 14, 14, 4], [245, 617, 15, 14, 10, 4], [245, 672, 23, 10, 20, 8], [245, 723, 17, 10, 14, 8], [245, 774, 17, 10, 14, 8], [306, 9, 17, 13, 14, 8], [306, 60, 18, 13, 14, 8], [306, 111, 18, 10, 14, 8], [306, 162, 18, 10, 14, 8], [306, 209, 15, 14, 12, 4], [306, 264, 18, 10, 14, 8], [306, 315, 19, 10, 14, 8], [306, 366, 24, 10, 20, 8], [306, 417, 18, 10, 14, 8], [306, 468, 20, 14, 16, 8], [306, 519, 18, 10, 14, 8], [306, 565, 19, 16, 12, 3], [306, 616, 16, 16, 8, 3], [306, 667, 18, 16, 12, 3], [306, 719, 22, 2, 16, 4], [306, 766, 1, 1, 3, 1], [367, 2, 23, 17, 18, 1], [367, 52, 23, 18, 18, 0], [367, 107, 21, 18, 16, 4], [367, 154, 20, 18, 14, 0], [367, 205, 23, 18, 16, 0], [367, 257, 22, 17, 16, 1], [367, 308, 22, 17, 16, 1], [367, 361, 20, 15, 14, 3], [367, 412, 18, 15, 14, 3], [367, 463, 19, 15, 14, 3], [367, 516, 19, 13, 14, 5], [367, 566, 19, 14, 14, 4], [367, 616, 19, 15, 14, 3], [367, 672, 18, 13, 14, 8], [367, 718, 19, 15, 14, 3], [367, 769, 18, 15, 14, 3], [428, 4, 19, 15, 14, 3], [428, 57, 19, 13, 14, 5], [428, 106, 17, 15, 10, 3], [428, 157, 17, 15, 10, 3], [428, 208, 17, 15, 10, 3], [428, 261, 17, 13, 11, 5], [428, 311, 20, 14, 14, 4], [428, 361, 19, 15, 14, 3], [428, 412, 18, 15, 14, 3], [428, 463, 19, 15, 14, 3], [428, 516, 19, 13, 14, 5], [428, 566, 20, 14, 14, 4], [428, 616, 19, 15, 14, 3], [428, 667, 18, 15, 14, 3], [428, 718, 19, 15, 14, 3], [428, 771, 19, 13, 14, 5], [489, 4, 17, 7, 12, 3], [489, 56, 17, 4, 12, 4], [489, 107, 19, 14, 14, 4], [489, 158, 20, 14, 16, 4], [489, 209, 21, 14, 16, 4], [489, 263, 19, 9, 16, 7], [489, 311, 22, 14, 16, 4], [489, 362, 21, 14, 16, 4], [489, 415, 23, 12, 20, 6], [489, 466, 23, 12, 20, 6], [489, 515, 26, 5, 22, 4], [489, 566, 17, 3, 12, 4], [489, 617, 18, 1, 12, 4], [489, 671, 19, 8, 14, 7], [489, 719, 28, 14, 22, 4], [489, 770, 23, 14, 16, 4], [550, 10, 23, 5, 20, 9], [550, 59, 19, 11, 16, 7], [550, 110, 18, 11, 14, 7], [550, 161, 17, 11, 14, 7], [550, 209, 22, 14, 16, 4], [550, 264, 19, 13, 16, 8], [550, 312, 18, 13, 14, 5], [550, 362, 22, 14, 16, 4], [550, 413, 24, 14, 18, 4], [550, 466, 24, 12, 18, 6], [550, 511, 21, 22, 14, 0], [550, 566, 20, 9, 14, 4], [550, 617, 19, 9, 14, 4], [550, 668, 23, 14, 20, 4], [550, 723, 25, 10, 22, 8], [550, 774, 18, 10, 14, 8], [611, 5, 18, 14, 16, 4], [611, 56, 15, 14, 10, 4], [611, 113, 18, 5, 14, 10], [611, 156, 27, 16, 20, 2], [611, 205, 21, 22, 14, 0], [611, 265, 19, 5, 14, 9], [611, 313, 18, 12, 18, 6], [611, 365, 23, 11, 18, 7], [611, 416, 20, 11, 18, 7], [611, 476, 20, 2, 20, 16], [611, 511, 1, 1, 16, 1], [611, 562, 21, 18, 18, 0], [611, 613, 24, 18, 18, 0], [611, 664, 23, 18, 16, 0], [611, 719, 28, 14, 22, 4], [611, 774, 23, 10, 20, 8], [672, 12, 17, 1, 14, 11], [672, 63, 22, 1, 18, 11], [672, 107, 23, 4, 18, 4], [672, 158, 21, 4, 18, 4], [672, 209, 18, 4, 12, 4], [672, 260, 16, 4, 12, 4], [672, 313, 17, 9, 14, 6], [672, 363, 21, 12, 20, 5], [672, 413, 20, 18, 16, 4], [1, 1, 1, 1, 10, 1], [794, 770, 24, 14, 18, 4], [672, 566, 24, 14, 18, 4], [672, 617, 24, 14, 18, 4], [672, 668, 24, 14, 18, 4], [672, 719, 24, 14, 18, 4], [672, 770, 24, 14, 18, 4], [733, 5, 24, 14, 18, 4], [733, 56, 24, 14, 18, 4], [733, 107, 24, 14, 18, 4], [733, 158, 24, 14, 18, 4], [733, 209, 24, 14, 18, 4], [733, 260, 24, 14, 18, 4], [733, 311, 24, 14, 18, 4], [733, 362, 24, 14, 18, 4], [733, 413, 24, 14, 18, 4], [733, 464, 24, 14, 18, 4], [733, 515, 24, 14, 18, 4], [733, 566, 24, 14, 18, 4], [733, 617, 24, 14, 18, 4], [733, 668, 24, 14, 18, 4], [733, 719, 24, 14, 18, 4], [733, 770, 24, 14, 18, 4], [1, 1, 1, 1, 10, 1], [794, 56, 24, 14, 18, 4], [794, 107, 24, 14, 18, 4], [794, 158, 24, 14, 18, 4], [794, 209, 24, 14, 18, 4], [794, 260, 24, 14, 18, 4], [794, 311, 24, 14, 18, 4], [794, 362, 24, 14, 18, 4], [794, 413, 24, 14, 18, 4], [794, 464, 24, 14, 18, 4], [794, 515, 24, 14, 18, 4], [794, 566, 24, 14, 18, 4], [794, 617, 24, 14, 18, 4], [794, 668, 24, 14, 18, 4], [794, 719, 24, 14, 18, 4], [794, 770, 24, 14, 18, 4], [855, 5, 24, 14, 18, 4], [855, 56, 24, 14, 18, 4], [855, 107, 24, 14, 18, 4], [855, 158, 24, 14, 18, 4], [855, 209, 24, 14, 18, 4], [855, 260, 24, 14, 18, 4], [855, 311, 24, 14, 18, 4], [855, 362, 24, 14, 18, 4], [855, 413, 24, 14, 18, 4], [855, 464, 24, 14, 18, 4], [855, 515, 24, 14, 18, 4], [855, 566, 24, 14, 18, 4], [855, 617, 24, 14, 18, 4], [855, 668, 24, 14, 18, 4], [855, 719, 24, 14, 18, 4], [855, 770, 24, 14, 18, 4]], \"capHeight\": 18, \"widestlogicalchar\": 22, \"widestglyph\": 28, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 11, 6, 11, 13], [1, 56, 11, 16, 11, 4], [1, 107, 13, 15, 13, 4], [1, 158, 19, 15, 19, 4], [1, 207, 17, 20, 17, 2], [1, 260, 19, 16, 19, 4], [1, 311, 21, 16, 21, 4], [1, 362, 8, 15, 8, 4], [1, 412, 12, 18, 12, 3], [1, 463, 12, 18, 12, 3], [1, 516, 19, 14, 19, 5], [1, 569, 17, 12, 17, 7], [1, 626, 11, 9, 11, 13], [1, 675, 15, 8, 15, 11], [1, 728, 11, 7, 11, 13], [1, 770, 15, 16, 15, 4], [62, 5, 17, 16, 17, 4], [62, 56, 17, 16, 17, 4], [62, 107, 17, 16, 17, 4], [62, 158, 17, 16, 17, 4], [62, 209, 17, 16, 17, 4], [62, 260, 17, 16, 17, 4], [62, 311, 17, 16, 17, 4], [62, 362, 17, 16, 17, 4], [62, 413, 17, 16, 17, 4], [62, 464, 17, 16, 17, 4], [62, 519, 11, 12, 11, 8], [62, 570, 11, 14, 11, 8], [62, 620, 15, 12, 15, 7], [62, 673, 15, 10, 15, 9], [62, 722, 15, 12, 15, 7], [62, 770, 17, 16, 17, 4], [123, 7, 21, 14, 21, 6], [123, 56, 19, 16, 19, 4], [123, 107, 17, 16, 17, 4], [123, 158, 17, 16, 17, 4], [123, 209, 17, 16, 17, 4], [123, 260, 15, 16, 15, 4], [123, 311, 15, 16, 15, 4], [123, 362, 17, 16, 17, 4], [123, 413, 17, 16, 17, 4], [123, 464, 11, 16, 11, 4], [123, 515, 15, 16, 15, 4], [123, 566, 17, 16, 17, 4], [123, 617, 15, 16, 15, 4], [123, 668, 19, 16, 19, 4], [123, 719, 17, 16, 17, 4], [123, 770, 17, 16, 17, 4], [184, 5, 17, 16, 17, 4], [184, 56, 17, 16, 17, 4], [184, 107, 17, 16, 17, 4], [184, 158, 17, 16, 17, 4], [184, 209, 17, 16, 17, 4], [184, 260, 17, 16, 17, 4], [184, 311, 19, 16, 19, 4], [184, 362, 21, 16, 21, 4], [184, 413, 17, 16, 17, 4], [184, 464, 17, 16, 17, 4], [184, 515, 15, 16, 15, 4], [184, 565, 13, 18, 13, 3], [184, 617, 15, 16, 15, 4], [184, 667, 13, 18, 13, 3], [184, 719, 13, 15, 13, 4], [184, 779, 17, 7, 17, 13], [245, 5, 11, 15, 11, 4], [245, 60, 15, 12, 15, 8], [245, 107, 15, 16, 15, 4], [245, 162, 15, 12, 15, 8], [245, 209, 15, 16, 15, 4], [245, 264, 15, 12, 15, 8], [245, 311, 13, 16, 13, 4], [245, 366, 15, 16, 15, 8], [245, 413, 15, 16, 15, 4], [245, 464, 11, 16, 11, 4], [245, 515, 13, 20, 13, 4], [245, 566, 15, 16, 15, 4], [245, 617, 11, 16, 11, 4], [245, 672, 21, 12, 21, 8], [245, 723, 15, 12, 15, 8], [245, 774, 15, 12, 15, 8], [306, 9, 15, 15, 15, 8], [306, 60, 15, 15, 15, 8], [306, 111, 15, 12, 15, 8], [306, 162, 15, 12, 15, 8], [306, 209, 13, 16, 13, 4], [306, 264, 15, 12, 15, 8], [306, 315, 15, 12, 15, 8], [306, 366, 21, 12, 21, 8], [306, 417, 15, 12, 15, 8], [306, 468, 17, 16, 17, 8], [306, 519, 15, 12, 15, 8], [306, 565, 13, 18, 13, 3], [306, 616, 9, 18, 9, 3], [306, 667, 13, 18, 13, 3], [306, 719, 17, 15, 17, 4], [306, 779, 3, 6, 3, 13], [367, 2, 19, 19, 19, 1], [367, 52, 19, 20, 19, 0], [367, 107, 17, 20, 17, 4], [367, 154, 15, 20, 15, 0], [367, 205, 17, 20, 17, 0], [367, 257, 17, 19, 17, 1], [367, 308, 17, 19, 17, 1], [367, 361, 15, 17, 15, 3], [367, 412, 15, 17, 15, 3], [367, 463, 15, 17, 15, 3], [367, 516, 15, 15, 15, 5], [367, 566, 15, 16, 15, 4], [367, 616, 15, 17, 15, 3], [367, 672, 15, 15, 15, 8], [367, 718, 15, 17, 15, 3], [367, 769, 15, 17, 15, 3], [428, 4, 15, 17, 15, 3], [428, 57, 15, 15, 15, 5], [428, 106, 11, 17, 11, 3], [428, 157, 11, 17, 11, 3], [428, 208, 11, 17, 11, 3], [428, 261, 12, 15, 12, 5], [428, 311, 15, 16, 15, 4], [428, 361, 15, 17, 15, 3], [428, 412, 15, 17, 15, 3], [428, 463, 15, 17, 15, 3], [428, 516, 15, 15, 15, 5], [428, 566, 15, 16, 15, 4], [428, 616, 15, 17, 15, 3], [428, 667, 15, 17, 15, 3], [428, 718, 15, 17, 15, 3], [428, 771, 15, 15, 15, 5], [489, 4, 13, 16, 13, 3], [489, 56, 13, 15, 13, 4], [489, 107, 15, 16, 15, 4], [489, 158, 17, 16, 17, 4], [489, 209, 17, 16, 17, 4], [489, 263, 17, 12, 17, 7], [489, 311, 17, 16, 17, 4], [489, 362, 17, 16, 17, 4], [489, 415, 21, 14, 21, 6], [489, 466, 21, 14, 21, 6], [489, 515, 23, 15, 23, 4], [489, 566, 13, 15, 13, 4], [489, 617, 13, 15, 13, 4], [489, 671, 15, 12, 15, 7], [489, 719, 23, 16, 23, 4], [489, 770, 17, 16, 17, 4], [550, 10, 21, 10, 21, 9], [550, 59, 17, 13, 17, 7], [550, 110, 15, 13, 15, 7], [550, 161, 15, 13, 15, 7], [550, 209, 17, 16, 17, 4], [550, 264, 17, 15, 17, 8], [550, 312, 15, 15, 15, 5], [550, 362, 17, 16, 17, 4], [550, 413, 19, 16, 19, 4], [550, 466, 19, 14, 19, 6], [550, 511, 15, 24, 15, 0], [550, 566, 15, 15, 15, 4], [550, 617, 15, 15, 15, 4], [550, 668, 21, 16, 21, 4], [550, 723, 23, 12, 23, 8], [550, 774, 15, 12, 15, 8], [611, 5, 17, 16, 17, 4], [611, 56, 11, 16, 11, 4], [611, 113, 15, 9, 15, 10], [611, 156, 21, 18, 21, 2], [611, 205, 15, 24, 15, 0], [611, 265, 15, 10, 15, 9], [611, 313, 19, 14, 19, 6], [611, 365, 19, 13, 19, 7], [611, 416, 19, 13, 19, 7], [611, 473, 21, 7, 21, 13], [611, 524, 17, 6, 17, 13], [611, 562, 19, 20, 19, 0], [611, 613, 19, 20, 19, 0], [611, 664, 17, 20, 17, 0], [611, 719, 23, 16, 23, 4], [611, 774, 21, 12, 21, 8], [672, 12, 15, 8, 15, 11], [672, 63, 19, 8, 19, 11], [672, 107, 19, 15, 19, 4], [672, 158, 19, 15, 19, 4], [672, 209, 13, 15, 13, 4], [672, 260, 13, 15, 13, 4], [672, 313, 15, 13, 15, 6], [672, 363, 21, 14, 21, 5], [672, 413, 17, 20, 17, 4], [1, 14, 11, 6, 11, 13], [794, 770, 19, 16, 19, 4], [672, 566, 19, 16, 19, 4], [672, 617, 19, 16, 19, 4], [672, 668, 19, 16, 19, 4], [672, 719, 19, 16, 19, 4], [672, 770, 19, 16, 19, 4], [733, 5, 19, 16, 19, 4], [733, 56, 19, 16, 19, 4], [733, 107, 19, 16, 19, 4], [733, 158, 19, 16, 19, 4], [733, 209, 19, 16, 19, 4], [733, 260, 19, 16, 19, 4], [733, 311, 19, 16, 19, 4], [733, 362, 19, 16, 19, 4], [733, 413, 19, 16, 19, 4], [733, 464, 19, 16, 19, 4], [733, 515, 19, 16, 19, 4], [733, 566, 19, 16, 19, 4], [733, 617, 19, 16, 19, 4], [733, 668, 19, 16, 19, 4], [733, 719, 19, 16, 19, 4], [733, 770, 19, 16, 19, 4], [1, 14, 11, 6, 11, 13], [794, 56, 19, 16, 19, 4], [794, 107, 19, 16, 19, 4], [794, 158, 19, 16, 19, 4], [794, 209, 19, 16, 19, 4], [794, 260, 19, 16, 19, 4], [794, 311, 19, 16, 19, 4], [794, 362, 19, 16, 19, 4], [794, 413, 19, 16, 19, 4], [794, 464, 19, 16, 19, 4], [794, 515, 19, 16, 19, 4], [794, 566, 19, 16, 19, 4], [794, 617, 19, 16, 19, 4], [794, 668, 19, 16, 19, 4], [794, 719, 19, 16, 19, 4], [794, 770, 19, 16, 19, 4], [855, 5, 19, 16, 19, 4], [855, 56, 19, 16, 19, 4], [855, 107, 19, 16, 19, 4], [855, 158, 19, 16, 19, 4], [855, 209, 19, 16, 19, 4], [855, 260, 19, 16, 19, 4], [855, 311, 19, 16, 19, 4], [855, 362, 19, 16, 19, 4], [855, 413, 19, 16, 19, 4], [855, 464, 19, 16, 19, 4], [855, 515, 19, 16, 19, 4], [855, 566, 19, 16, 19, 4], [855, 617, 19, 16, 19, 4], [855, 668, 19, 16, 19, 4], [855, 719, 19, 16, 19, 4], [855, 770, 19, 16, 19, 4]], \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 10, 6, 10, 12], [1, 56, 10, 14, 10, 4], [1, 107, 12, 14, 12, 4], [1, 158, 18, 14, 18, 4], [1, 207, 16, 18, 16, 2], [1, 260, 18, 14, 18, 4], [1, 311, 20, 14, 20, 4], [1, 362, 7, 14, 7, 4], [1, 412, 11, 16, 11, 3], [1, 463, 11, 16, 11, 3], [1, 516, 18, 13, 18, 5], [1, 569, 16, 11, 16, 7], [1, 625, 10, 8, 10, 12], [1, 675, 14, 7, 14, 11], [1, 727, 10, 6, 10, 12], [1, 770, 14, 14, 14, 4], [62, 5, 16, 14, 16, 4], [62, 56, 16, 14, 16, 4], [62, 107, 16, 14, 16, 4], [62, 158, 16, 14, 16, 4], [62, 209, 16, 14, 16, 4], [62, 260, 16, 14, 16, 4], [62, 311, 16, 14, 16, 4], [62, 362, 16, 14, 16, 4], [62, 413, 16, 14, 16, 4], [62, 464, 16, 14, 16, 4], [62, 519, 10, 10, 10, 8], [62, 570, 10, 12, 10, 8], [62, 620, 14, 11, 14, 7], [62, 673, 14, 9, 14, 9], [62, 722, 14, 11, 14, 7], [62, 770, 16, 14, 16, 4], [123, 7, 20, 12, 20, 6], [123, 56, 18, 14, 18, 4], [123, 107, 16, 14, 16, 4], [123, 158, 16, 14, 16, 4], [123, 209, 16, 14, 16, 4], [123, 260, 14, 14, 14, 4], [123, 311, 14, 14, 14, 4], [123, 362, 16, 14, 16, 4], [123, 413, 16, 14, 16, 4], [123, 464, 10, 14, 10, 4], [123, 515, 14, 14, 14, 4], [123, 566, 16, 14, 16, 4], [123, 617, 14, 14, 14, 4], [123, 668, 18, 14, 18, 4], [123, 719, 16, 14, 16, 4], [123, 770, 16, 14, 16, 4], [184, 5, 16, 14, 16, 4], [184, 56, 16, 14, 16, 4], [184, 107, 16, 14, 16, 4], [184, 158, 16, 14, 16, 4], [184, 209, 16, 14, 16, 4], [184, 260, 16, 14, 16, 4], [184, 311, 18, 14, 18, 4], [184, 362, 20, 14, 20, 4], [184, 413, 16, 14, 16, 4], [184, 464, 16, 14, 16, 4], [184, 515, 14, 14, 14, 4], [184, 565, 12, 16, 12, 3], [184, 617, 14, 14, 14, 4], [184, 667, 12, 16, 12, 3], [184, 719, 12, 14, 12, 4], [184, 778, 16, 6, 16, 12], [245, 5, 10, 14, 10, 4], [245, 60, 14, 10, 14, 8], [245, 107, 14, 14, 14, 4], [245, 162, 14, 10, 14, 8], [245, 209, 14, 14, 14, 4], [245, 264, 14, 10, 14, 8], [245, 311, 12, 14, 12, 4], [245, 366, 14, 14, 14, 8], [245, 413, 14, 14, 14, 4], [245, 464, 10, 14, 10, 4], [245, 515, 12, 18, 12, 4], [245, 566, 14, 14, 14, 4], [245, 617, 10, 14, 10, 4], [245, 672, 20, 10, 20, 8], [245, 723, 14, 10, 14, 8], [245, 774, 14, 10, 14, 8], [306, 9, 14, 13, 14, 8], [306, 60, 14, 13, 14, 8], [306, 111, 14, 10, 14, 8], [306, 162, 14, 10, 14, 8], [306, 209, 12, 14, 12, 4], [306, 264, 14, 10, 14, 8], [306, 315, 14, 10, 14, 8], [306, 366, 20, 10, 20, 8], [306, 417, 14, 10, 14, 8], [306, 468, 16, 14, 16, 8], [306, 519, 14, 10, 14, 8], [306, 565, 12, 16, 12, 3], [306, 616, 8, 16, 8, 3], [306, 667, 12, 16, 12, 3], [306, 719, 16, 14, 16, 4], [306, 778, 3, 6, 3, 12], [367, 2, 18, 17, 18, 1], [367, 52, 18, 18, 18, 0], [367, 107, 16, 18, 16, 4], [367, 154, 14, 18, 14, 0], [367, 205, 16, 18, 16, 0], [367, 257, 16, 17, 16, 1], [367, 308, 16, 17, 16, 1], [367, 361, 14, 15, 14, 3], [367, 412, 14, 15, 14, 3], [367, 463, 14, 15, 14, 3], [367, 516, 14, 13, 14, 5], [367, 566, 14, 14, 14, 4], [367, 616, 14, 15, 14, 3], [367, 672, 14, 13, 14, 8], [367, 718, 14, 15, 14, 3], [367, 769, 14, 15, 14, 3], [428, 4, 14, 15, 14, 3], [428, 57, 14, 13, 14, 5], [428, 106, 10, 15, 10, 3], [428, 157, 10, 15, 10, 3], [428, 208, 10, 15, 10, 3], [428, 261, 11, 13, 11, 5], [428, 311, 14, 14, 14, 4], [428, 361, 14, 15, 14, 3], [428, 412, 14, 15, 14, 3], [428, 463, 14, 15, 14, 3], [428, 516, 14, 13, 14, 5], [428, 566, 14, 14, 14, 4], [428, 616, 14, 15, 14, 3], [428, 667, 14, 15, 14, 3], [428, 718, 14, 15, 14, 3], [428, 771, 14, 13, 14, 5], [489, 4, 12, 15, 12, 3], [489, 56, 12, 14, 12, 4], [489, 107, 14, 14, 14, 4], [489, 158, 16, 14, 16, 4], [489, 209, 16, 14, 16, 4], [489, 263, 16, 11, 16, 7], [489, 311, 16, 14, 16, 4], [489, 362, 16, 14, 16, 4], [489, 415, 20, 12, 20, 6], [489, 466, 20, 12, 20, 6], [489, 515, 22, 14, 22, 4], [489, 566, 12, 14, 12, 4], [489, 617, 12, 14, 12, 4], [489, 671, 14, 11, 14, 7], [489, 719, 22, 14, 22, 4], [489, 770, 16, 14, 16, 4], [550, 10, 20, 9, 20, 9], [550, 59, 16, 11, 16, 7], [550, 110, 14, 11, 14, 7], [550, 161, 14, 11, 14, 7], [550, 209, 16, 14, 16, 4], [550, 264, 16, 13, 16, 8], [550, 312, 14, 13, 14, 5], [550, 362, 16, 14, 16, 4], [550, 413, 18, 14, 18, 4], [550, 466, 18, 12, 18, 6], [550, 511, 14, 22, 14, 0], [550, 566, 14, 14, 14, 4], [550, 617, 14, 14, 14, 4], [550, 668, 20, 14, 20, 4], [550, 723, 22, 10, 22, 8], [550, 774, 14, 10, 14, 8], [611, 5, 16, 14, 16, 4], [611, 56, 10, 14, 10, 4], [611, 113, 14, 8, 14, 10], [611, 156, 20, 16, 20, 2], [611, 205, 14, 22, 14, 0], [611, 265, 14, 9, 14, 9], [611, 313, 18, 12, 18, 6], [611, 365, 18, 11, 18, 7], [611, 416, 18, 11, 18, 7], [611, 472, 20, 6, 20, 12], [611, 523, 16, 6, 16, 12], [611, 562, 18, 18, 18, 0], [611, 613, 18, 18, 18, 0], [611, 664, 16, 18, 16, 0], [611, 719, 22, 14, 22, 4], [611, 774, 20, 10, 20, 8], [672, 12, 14, 7, 14, 11], [672, 63, 18, 7, 18, 11], [672, 107, 18, 14, 18, 4], [672, 158, 18, 14, 18, 4], [672, 209, 12, 14, 12, 4], [672, 260, 12, 14, 12, 4], [672, 313, 14, 12, 14, 6], [672, 363, 20, 13, 20, 5], [672, 413, 16, 18, 16, 4], [1, 13, 10, 6, 10, 12], [794, 770, 18, 14, 18, 4], [672, 566, 18, 14, 18, 4], [672, 617, 18, 14, 18, 4], [672, 668, 18, 14, 18, 4], [672, 719, 18, 14, 18, 4], [672, 770, 18, 14, 18, 4], [733, 5, 18, 14, 18, 4], [733, 56, 18, 14, 18, 4], [733, 107, 18, 14, 18, 4], [733, 158, 18, 14, 18, 4], [733, 209, 18, 14, 18, 4], [733, 260, 18, 14, 18, 4], [733, 311, 18, 14, 18, 4], [733, 362, 18, 14, 18, 4], [733, 413, 18, 14, 18, 4], [733, 464, 18, 14, 18, 4], [733, 515, 18, 14, 18, 4], [733, 566, 18, 14, 18, 4], [733, 617, 18, 14, 18, 4], [733, 668, 18, 14, 18, 4], [733, 719, 18, 14, 18, 4], [733, 770, 18, 14, 18, 4], [1, 13, 10, 6, 10, 12], [794, 56, 18, 14, 18, 4], [794, 107, 18, 14, 18, 4], [794, 158, 18, 14, 18, 4], [794, 209, 18, 14, 18, 4], [794, 260, 18, 14, 18, 4], [794, 311, 18, 14, 18, 4], [794, 362, 18, 14, 18, 4], [794, 413, 18, 14, 18, 4], [794, 464, 18, 14, 18, 4], [794, 515, 18, 14, 18, 4], [794, 566, 18, 14, 18, 4], [794, 617, 18, 14, 18, 4], [794, 668, 18, 14, 18, 4], [794, 719, 18, 14, 18, 4], [794, 770, 18, 14, 18, 4], [855, 5, 18, 14, 18, 4], [855, 56, 18, 14, 18, 4], [855, 107, 18, 14, 18, 4], [855, 158, 18, 14, 18, 4], [855, 209, 18, 14, 18, 4], [855, 260, 18, 14, 18, 4], [855, 311, 18, 14, 18, 4], [855, 362, 18, 14, 18, 4], [855, 413, 18, 14, 18, 4], [855, 464, 18, 14, 18, 4], [855, 515, 18, 14, 18, 4], [855, 566, 18, 14, 18, 4], [855, 617, 18, 14, 18, 4], [855, 668, 18, 14, 18, 4], [855, 719, 18, 14, 18, 4], [855, 770, 18, 14, 18, 4]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 56, 16, 16, 10, 4], [1, 107, 18, 5, 12, 4], [1, 158, 23, 10, 18, 4], [1, 207, 20, 20, 16, 2], [1, 260, 24, 16, 18, 4], [1, 311, 21, 16, 20, 4], [1, 362, 14, 5, 7, 4], [1, 412, 18, 18, 11, 3], [1, 463, 17, 18, 11, 3], [1, 516, 21, 9, 18, 5], [1, 569, 19, 11, 16, 7], [1, 629, 10, 6, 10, 16], [1, 675, 18, 3, 14, 11], [1, 731, 10, 4, 10, 16], [1, 770, 20, 16, 14, 4], [62, 5, 20, 16, 16, 4], [62, 56, 19, 16, 16, 4], [62, 107, 21, 16, 16, 4], [62, 158, 22, 16, 16, 4], [62, 209, 22, 16, 16, 4], [62, 260, 22, 16, 16, 4], [62, 311, 20, 16, 16, 4], [62, 362, 22, 16, 16, 4], [62, 413, 21, 16, 16, 4], [62, 464, 21, 16, 16, 4], [62, 519, 14, 12, 10, 8], [62, 570, 14, 14, 10, 8], [62, 620, 18, 11, 14, 7], [62, 673, 19, 6, 14, 9], [62, 722, 17, 11, 14, 7], [62, 770, 21, 16, 16, 4], [123, 7, 23, 14, 20, 6], [123, 56, 19, 16, 18, 4], [123, 107, 20, 16, 16, 4], [123, 158, 21, 16, 16, 4], [123, 209, 20, 16, 16, 4], [123, 260, 20, 16, 14, 4], [123, 311, 20, 16, 14, 4], [123, 362, 21, 16, 16, 4], [123, 413, 22, 16, 16, 4], [123, 464, 15, 16, 10, 4], [123, 515, 20, 16, 14, 4], [123, 566, 21, 16, 16, 4], [123, 617, 14, 16, 14, 4], [123, 668, 24, 16, 18, 4], [123, 719, 22, 16, 16, 4], [123, 770, 21, 16, 16, 4], [184, 5, 21, 16, 16, 4], [184, 56, 21, 16, 16, 4], [184, 107, 21, 16, 16, 4], [184, 158, 21, 16, 16, 4], [184, 209, 23, 16, 16, 4], [184, 260, 22, 16, 16, 4], [184, 311, 24, 16, 18, 4], [184, 362, 27, 16, 20, 4], [184, 413, 22, 16, 16, 4], [184, 464, 22, 16, 16, 4], [184, 515, 21, 16, 14, 4], [184, 565, 18, 18, 12, 3], [184, 617, 14, 16, 14, 4], [184, 667, 19, 18, 12, 3], [184, 719, 17, 5, 12, 4], [184, 783, 18, 3, 16, 17], [245, 5, 15, 5, 10, 4], [245, 60, 18, 12, 14, 8], [245, 107, 17, 16, 14, 4], [245, 162, 18, 12, 14, 8], [245, 209, 20, 16, 14, 4], [245, 264, 17, 12, 14, 8], [245, 311, 20, 16, 12, 4], [245, 366, 18, 16, 14, 8], [245, 413, 17, 16, 14, 4], [245, 464, 15, 16, 10, 4], [245, 515, 17, 20, 12, 4], [245, 566, 17, 16, 14, 4], [245, 617, 15, 16, 10, 4], [245, 672, 23, 12, 20, 8], [245, 723, 17, 12, 14, 8], [245, 774, 17, 12, 14, 8], [306, 9, 17, 15, 14, 8], [306, 60, 18, 15, 14, 8], [306, 111, 18, 12, 14, 8], [306, 162, 18, 12, 14, 8], [306, 209, 15, 16, 12, 4], [306, 264, 18, 12, 14, 8], [306, 315, 19, 12, 14, 8], [306, 366, 24, 12, 20, 8], [306, 417, 18, 12, 14, 8], [306, 468, 20, 16, 16, 8], [306, 519, 18, 12, 14, 8], [306, 565, 19, 18, 12, 3], [306, 616, 16, 18, 8, 3], [306, 667, 18, 18, 12, 3], [306, 719, 22, 4, 16, 4], [306, 766, 1, 1, 3, 1], [367, 2, 23, 19, 18, 1], [367, 52, 23, 20, 18, 0], [367, 107, 21, 20, 16, 4], [367, 154, 21, 20, 14, 0], [367, 205, 24, 20, 16, 0], [367, 257, 22, 19, 16, 1], [367, 308, 22, 19, 16, 1], [367, 361, 20, 17, 14, 3], [367, 412, 18, 17, 14, 3], [367, 463, 19, 17, 14, 3], [367, 516, 19, 15, 14, 5], [367, 566, 19, 16, 14, 4], [367, 616, 19, 17, 14, 3], [367, 672, 18, 15, 14, 8], [367, 718, 19, 17, 14, 3], [367, 769, 18, 17, 14, 3], [428, 4, 19, 17, 14, 3], [428, 57, 19, 15, 14, 5], [428, 106, 17, 17, 10, 3], [428, 157, 17, 17, 10, 3], [428, 208, 17, 17, 10, 3], [428, 261, 17, 15, 11, 5], [428, 311, 20, 16, 14, 4], [428, 361, 19, 17, 14, 3], [428, 412, 18, 17, 14, 3], [428, 463, 19, 17, 14, 3], [428, 516, 19, 15, 14, 5], [428, 566, 20, 16, 14, 4], [428, 616, 19, 17, 14, 3], [428, 667, 18, 17, 14, 3], [428, 718, 19, 17, 14, 3], [428, 771, 19, 15, 14, 5], [489, 4, 17, 9, 12, 3], [489, 56, 17, 6, 12, 4], [489, 107, 19, 16, 14, 4], [489, 158, 20, 16, 16, 4], [489, 209, 21, 16, 16, 4], [489, 263, 19, 11, 16, 7], [489, 311, 22, 16, 16, 4], [489, 362, 21, 16, 16, 4], [489, 415, 23, 14, 20, 6], [489, 466, 23, 14, 20, 6], [489, 515, 26, 7, 22, 4], [489, 566, 17, 5, 12, 4], [489, 617, 18, 3, 12, 4], [489, 671, 19, 10, 14, 7], [489, 719, 28, 16, 22, 4], [489, 770, 23, 16, 16, 4], [550, 10, 23, 7, 20, 9], [550, 59, 19, 13, 16, 7], [550, 110, 18, 13, 14, 7], [550, 161, 17, 13, 14, 7], [550, 209, 22, 16, 16, 4], [550, 264, 19, 15, 16, 8], [550, 312, 18, 15, 14, 5], [550, 362, 22, 16, 16, 4], [550, 413, 24, 16, 18, 4], [550, 466, 24, 14, 18, 6], [550, 511, 22, 24, 14, 0], [550, 566, 20, 11, 14, 4], [550, 617, 19, 11, 14, 4], [550, 668, 23, 16, 20, 4], [550, 723, 25, 12, 22, 8], [550, 774, 18, 12, 14, 8], [611, 5, 18, 16, 16, 4], [611, 56, 15, 16, 10, 4], [611, 113, 18, 7, 14, 10], [611, 156, 27, 18, 20, 2], [611, 205, 22, 24, 14, 0], [611, 265, 19, 7, 14, 9], [611, 313, 18, 14, 18, 6], [611, 365, 23, 13, 18, 7], [611, 416, 20, 13, 18, 7], [611, 476, 20, 4, 20, 16], [611, 511, 1, 1, 16, 1], [611, 562, 21, 20, 18, 0], [611, 613, 25, 20, 18, 0], [611, 664, 24, 20, 16, 0], [611, 719, 28, 16, 22, 4], [611, 774, 23, 12, 20, 8], [672, 12, 17, 3, 14, 11], [672, 63, 22, 3, 18, 11], [672, 107, 23, 6, 18, 4], [672, 158, 21, 6, 18, 4], [672, 209, 18, 6, 12, 4], [672, 260, 16, 6, 12, 4], [672, 313, 17, 11, 14, 6], [672, 363, 21, 14, 20, 5], [672, 413, 20, 20, 16, 4], [1, 1, 1, 1, 10, 1], [794, 770, 24, 16, 18, 4], [672, 566, 24, 16, 18, 4], [672, 617, 24, 16, 18, 4], [672, 668, 24, 16, 18, 4], [672, 719, 24, 16, 18, 4], [672, 770, 24, 16, 18, 4], [733, 5, 24, 16, 18, 4], [733, 56, 24, 16, 18, 4], [733, 107, 24, 16, 18, 4], [733, 158, 24, 16, 18, 4], [733, 209, 24, 16, 18, 4], [733, 260, 24, 16, 18, 4], [733, 311, 24, 16, 18, 4], [733, 362, 24, 16, 18, 4], [733, 413, 24, 16, 18, 4], [733, 464, 24, 16, 18, 4], [733, 515, 24, 16, 18, 4], [733, 566, 24, 16, 18, 4], [733, 617, 24, 16, 18, 4], [733, 668, 24, 16, 18, 4], [733, 719, 24, 16, 18, 4], [733, 770, 24, 16, 18, 4], [1, 1, 1, 1, 10, 1], [794, 56, 24, 16, 18, 4], [794, 107, 24, 16, 18, 4], [794, 158, 24, 16, 18, 4], [794, 209, 24, 16, 18, 4], [794, 260, 24, 16, 18, 4], [794, 311, 24, 16, 18, 4], [794, 362, 24, 16, 18, 4], [794, 413, 24, 16, 18, 4], [794, 464, 24, 16, 18, 4], [794, 515, 24, 16, 18, 4], [794, 566, 24, 16, 18, 4], [794, 617, 24, 16, 18, 4], [794, 668, 24, 16, 18, 4], [794, 719, 24, 16, 18, 4], [794, 770, 24, 16, 18, 4], [855, 5, 24, 16, 18, 4], [855, 56, 24, 16, 18, 4], [855, 107, 24, 16, 18, 4], [855, 158, 24, 16, 18, 4], [855, 209, 24, 16, 18, 4], [855, 260, 24, 16, 18, 4], [855, 311, 24, 16, 18, 4], [855, 362, 24, 16, 18, 4], [855, 413, 24, 16, 18, 4], [855, 464, 24, 16, 18, 4], [855, 515, 24, 16, 18, 4], [855, 566, 24, 16, 18, 4], [855, 617, 24, 16, 18, 4], [855, 668, 24, 16, 18, 4], [855, 719, 24, 16, 18, 4], [855, 770, 24, 16, 18, 4]], \"capHeight\": 19, \"widestlogicalchar\": 22, \"widestglyph\": 28, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 56, 15, 14, 9, 4], [1, 107, 17, 3, 11, 4], [1, 158, 22, 8, 17, 4], [1, 207, 19, 18, 15, 2], [1, 260, 23, 14, 17, 4], [1, 311, 20, 14, 19, 4], [1, 362, 13, 3, 6, 4], [1, 412, 17, 16, 10, 3], [1, 463, 16, 16, 10, 3], [1, 516, 20, 7, 17, 5], [1, 569, 18, 9, 15, 7], [1, 629, 9, 4, 9, 16], [1, 675, 17, 1, 13, 11], [1, 731, 9, 2, 9, 16], [1, 770, 19, 14, 13, 4], [62, 5, 19, 14, 15, 4], [62, 56, 18, 14, 15, 4], [62, 107, 20, 14, 15, 4], [62, 158, 21, 14, 15, 4], [62, 209, 21, 14, 15, 4], [62, 260, 21, 14, 15, 4], [62, 311, 19, 14, 15, 4], [62, 362, 21, 14, 15, 4], [62, 413, 20, 14, 15, 4], [62, 464, 20, 14, 15, 4], [62, 519, 13, 10, 9, 8], [62, 570, 13, 12, 9, 8], [62, 620, 17, 9, 13, 7], [62, 673, 18, 4, 13, 9], [62, 722, 16, 9, 13, 7], [62, 770, 20, 14, 15, 4], [123, 7, 22, 12, 19, 6], [123, 56, 18, 14, 17, 4], [123, 107, 19, 14, 15, 4], [123, 158, 20, 14, 15, 4], [123, 209, 19, 14, 15, 4], [123, 260, 19, 14, 13, 4], [123, 311, 19, 14, 13, 4], [123, 362, 20, 14, 15, 4], [123, 413, 21, 14, 15, 4], [123, 464, 14, 14, 9, 4], [123, 515, 19, 14, 13, 4], [123, 566, 20, 14, 15, 4], [123, 617, 13, 14, 13, 4], [123, 668, 23, 14, 17, 4], [123, 719, 21, 14, 15, 4], [123, 770, 20, 14, 15, 4], [184, 5, 20, 14, 15, 4], [184, 56, 20, 14, 15, 4], [184, 107, 20, 14, 15, 4], [184, 158, 20, 14, 15, 4], [184, 209, 22, 14, 15, 4], [184, 260, 21, 14, 15, 4], [184, 311, 23, 14, 17, 4], [184, 362, 26, 14, 19, 4], [184, 413, 21, 14, 15, 4], [184, 464, 21, 14, 15, 4], [184, 515, 20, 14, 13, 4], [184, 565, 17, 16, 11, 3], [184, 617, 13, 14, 13, 4], [184, 667, 18, 16, 11, 3], [184, 719, 16, 3, 11, 4], [184, 783, 17, 1, 15, 17], [245, 5, 14, 3, 9, 4], [245, 60, 17, 10, 13, 8], [245, 107, 16, 14, 13, 4], [245, 162, 17, 10, 13, 8], [245, 209, 19, 14, 13, 4], [245, 264, 16, 10, 13, 8], [245, 311, 19, 14, 11, 4], [245, 366, 17, 14, 13, 8], [245, 413, 16, 14, 13, 4], [245, 464, 14, 14, 9, 4], [245, 515, 16, 18, 11, 4], [245, 566, 16, 14, 13, 4], [245, 617, 14, 14, 9, 4], [245, 672, 22, 10, 19, 8], [245, 723, 16, 10, 13, 8], [245, 774, 16, 10, 13, 8], [306, 9, 16, 13, 13, 8], [306, 60, 17, 13, 13, 8], [306, 111, 17, 10, 13, 8], [306, 162, 17, 10, 13, 8], [306, 209, 14, 14, 11, 4], [306, 264, 17, 10, 13, 8], [306, 315, 18, 10, 13, 8], [306, 366, 23, 10, 19, 8], [306, 417, 17, 10, 13, 8], [306, 468, 19, 14, 15, 8], [306, 519, 17, 10, 13, 8], [306, 565, 18, 16, 11, 3], [306, 616, 15, 16, 7, 3], [306, 667, 17, 16, 11, 3], [306, 719, 21, 2, 15, 4], [306, 766, 1, 1, 3, 1], [367, 2, 22, 17, 17, 1], [367, 52, 22, 18, 17, 0], [367, 107, 20, 18, 15, 4], [367, 154, 19, 18, 13, 0], [367, 205, 22, 18, 15, 0], [367, 257, 21, 17, 15, 1], [367, 308, 21, 17, 15, 1], [367, 361, 19, 15, 13, 3], [367, 412, 17, 15, 13, 3], [367, 463, 18, 15, 13, 3], [367, 516, 18, 13, 13, 5], [367, 566, 18, 14, 13, 4], [367, 616, 18, 15, 13, 3], [367, 672, 17, 13, 13, 8], [367, 718, 18, 15, 13, 3], [367, 769, 17, 15, 13, 3], [428, 4, 18, 15, 13, 3], [428, 57, 18, 13, 13, 5], [428, 106, 16, 15, 9, 3], [428, 157, 16, 15, 9, 3], [428, 208, 16, 15, 9, 3], [428, 261, 16, 13, 10, 5], [428, 311, 19, 14, 13, 4], [428, 361, 18, 15, 13, 3], [428, 412, 17, 15, 13, 3], [428, 463, 18, 15, 13, 3], [428, 516, 18, 13, 13, 5], [428, 566, 19, 14, 13, 4], [428, 616, 18, 15, 13, 3], [428, 667, 17, 15, 13, 3], [428, 718, 18, 15, 13, 3], [428, 771, 18, 13, 13, 5], [489, 4, 16, 7, 11, 3], [489, 56, 16, 4, 11, 4], [489, 107, 18, 14, 13, 4], [489, 158, 19, 14, 15, 4], [489, 209, 20, 14, 15, 4], [489, 263, 18, 9, 15, 7], [489, 311, 21, 14, 15, 4], [489, 362, 20, 14, 15, 4], [489, 415, 22, 12, 19, 6], [489, 466, 22, 12, 19, 6], [489, 515, 25, 5, 21, 4], [489, 566, 16, 3, 11, 4], [489, 617, 17, 1, 11, 4], [489, 671, 18, 8, 13, 7], [489, 719, 27, 14, 21, 4], [489, 770, 22, 14, 15, 4], [550, 10, 22, 5, 19, 9], [550, 59, 18, 11, 15, 7], [550, 110, 17, 11, 13, 7], [550, 161, 16, 11, 13, 7], [550, 209, 21, 14, 15, 4], [550, 264, 18, 13, 15, 8], [550, 312, 17, 13, 13, 5], [550, 362, 21, 14, 15, 4], [550, 413, 23, 14, 17, 4], [550, 466, 23, 12, 17, 6], [550, 511, 20, 22, 13, 0], [550, 566, 19, 9, 13, 4], [550, 617, 18, 9, 13, 4], [550, 668, 22, 14, 19, 4], [550, 723, 24, 10, 21, 8], [550, 774, 17, 10, 13, 8], [611, 5, 17, 14, 15, 4], [611, 56, 14, 14, 9, 4], [611, 113, 17, 5, 13, 10], [611, 156, 26, 16, 19, 2], [611, 205, 20, 22, 13, 0], [611, 265, 18, 5, 13, 9], [611, 313, 17, 12, 17, 6], [611, 365, 22, 11, 17, 7], [611, 416, 19, 11, 17, 7], [611, 476, 19, 2, 19, 16], [611, 511, 1, 1, 15, 1], [611, 562, 20, 18, 17, 0], [611, 613, 23, 18, 17, 0], [611, 664, 22, 18, 15, 0], [611, 719, 27, 14, 21, 4], [611, 774, 22, 10, 19, 8], [672, 12, 16, 1, 13, 11], [672, 63, 21, 1, 17, 11], [672, 107, 22, 4, 17, 4], [672, 158, 20, 4, 17, 4], [672, 209, 17, 4, 11, 4], [672, 260, 15, 4, 11, 4], [672, 313, 16, 9, 13, 6], [672, 363, 20, 12, 19, 5], [672, 413, 19, 18, 15, 4], [1, 1, 1, 1, 9, 1], [794, 770, 23, 14, 17, 4], [672, 566, 23, 14, 17, 4], [672, 617, 23, 14, 17, 4], [672, 668, 23, 14, 17, 4], [672, 719, 23, 14, 17, 4], [672, 770, 23, 14, 17, 4], [733, 5, 23, 14, 17, 4], [733, 56, 23, 14, 17, 4], [733, 107, 23, 14, 17, 4], [733, 158, 23, 14, 17, 4], [733, 209, 23, 14, 17, 4], [733, 260, 23, 14, 17, 4], [733, 311, 23, 14, 17, 4], [733, 362, 23, 14, 17, 4], [733, 413, 23, 14, 17, 4], [733, 464, 23, 14, 17, 4], [733, 515, 23, 14, 17, 4], [733, 566, 23, 14, 17, 4], [733, 617, 23, 14, 17, 4], [733, 668, 23, 14, 17, 4], [733, 719, 23, 14, 17, 4], [733, 770, 23, 14, 17, 4], [1, 1, 1, 1, 9, 1], [794, 56, 23, 14, 17, 4], [794, 107, 23, 14, 17, 4], [794, 158, 23, 14, 17, 4], [794, 209, 23, 14, 17, 4], [794, 260, 23, 14, 17, 4], [794, 311, 23, 14, 17, 4], [794, 362, 23, 14, 17, 4], [794, 413, 23, 14, 17, 4], [794, 464, 23, 14, 17, 4], [794, 515, 23, 14, 17, 4], [794, 566, 23, 14, 17, 4], [794, 617, 23, 14, 17, 4], [794, 668, 23, 14, 17, 4], [794, 719, 23, 14, 17, 4], [794, 770, 23, 14, 17, 4], [855, 5, 23, 14, 17, 4], [855, 56, 23, 14, 17, 4], [855, 107, 23, 14, 17, 4], [855, 158, 23, 14, 17, 4], [855, 209, 23, 14, 17, 4], [855, 260, 23, 14, 17, 4], [855, 311, 23, 14, 17, 4], [855, 362, 23, 14, 17, 4], [855, 413, 23, 14, 17, 4], [855, 464, 23, 14, 17, 4], [855, 515, 23, 14, 17, 4], [855, 566, 23, 14, 17, 4], [855, 617, 23, 14, 17, 4], [855, 668, 23, 14, 17, 4], [855, 719, 23, 14, 17, 4], [855, 770, 23, 14, 17, 4]], \"capHeight\": 18, \"widestlogicalchar\": 21, \"widestglyph\": 27, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 10, 6, 10, 13], [1, 56, 10, 16, 10, 4], [1, 107, 12, 15, 12, 4], [1, 158, 18, 15, 18, 4], [1, 207, 16, 20, 16, 2], [1, 260, 18, 16, 18, 4], [1, 311, 20, 16, 20, 4], [1, 362, 7, 15, 7, 4], [1, 412, 11, 18, 11, 3], [1, 463, 11, 18, 11, 3], [1, 516, 18, 14, 18, 5], [1, 569, 16, 12, 16, 7], [1, 626, 10, 9, 10, 13], [1, 675, 14, 8, 14, 11], [1, 728, 10, 7, 10, 13], [1, 770, 14, 16, 14, 4], [62, 5, 16, 16, 16, 4], [62, 56, 16, 16, 16, 4], [62, 107, 16, 16, 16, 4], [62, 158, 16, 16, 16, 4], [62, 209, 16, 16, 16, 4], [62, 260, 16, 16, 16, 4], [62, 311, 16, 16, 16, 4], [62, 362, 16, 16, 16, 4], [62, 413, 16, 16, 16, 4], [62, 464, 16, 16, 16, 4], [62, 519, 10, 12, 10, 8], [62, 570, 10, 14, 10, 8], [62, 620, 14, 12, 14, 7], [62, 673, 14, 10, 14, 9], [62, 722, 14, 12, 14, 7], [62, 770, 16, 16, 16, 4], [123, 7, 20, 14, 20, 6], [123, 56, 18, 16, 18, 4], [123, 107, 16, 16, 16, 4], [123, 158, 16, 16, 16, 4], [123, 209, 16, 16, 16, 4], [123, 260, 14, 16, 14, 4], [123, 311, 14, 16, 14, 4], [123, 362, 16, 16, 16, 4], [123, 413, 16, 16, 16, 4], [123, 464, 10, 16, 10, 4], [123, 515, 14, 16, 14, 4], [123, 566, 16, 16, 16, 4], [123, 617, 14, 16, 14, 4], [123, 668, 18, 16, 18, 4], [123, 719, 16, 16, 16, 4], [123, 770, 16, 16, 16, 4], [184, 5, 16, 16, 16, 4], [184, 56, 16, 16, 16, 4], [184, 107, 16, 16, 16, 4], [184, 158, 16, 16, 16, 4], [184, 209, 16, 16, 16, 4], [184, 260, 16, 16, 16, 4], [184, 311, 18, 16, 18, 4], [184, 362, 20, 16, 20, 4], [184, 413, 16, 16, 16, 4], [184, 464, 16, 16, 16, 4], [184, 515, 14, 16, 14, 4], [184, 565, 12, 18, 12, 3], [184, 617, 14, 16, 14, 4], [184, 667, 12, 18, 12, 3], [184, 719, 12, 15, 12, 4], [184, 779, 16, 7, 16, 13], [245, 5, 10, 15, 10, 4], [245, 60, 14, 12, 14, 8], [245, 107, 14, 16, 14, 4], [245, 162, 14, 12, 14, 8], [245, 209, 14, 16, 14, 4], [245, 264, 14, 12, 14, 8], [245, 311, 12, 16, 12, 4], [245, 366, 14, 16, 14, 8], [245, 413, 14, 16, 14, 4], [245, 464, 10, 16, 10, 4], [245, 515, 12, 20, 12, 4], [245, 566, 14, 16, 14, 4], [245, 617, 10, 16, 10, 4], [245, 672, 20, 12, 20, 8], [245, 723, 14, 12, 14, 8], [245, 774, 14, 12, 14, 8], [306, 9, 14, 15, 14, 8], [306, 60, 14, 15, 14, 8], [306, 111, 14, 12, 14, 8], [306, 162, 14, 12, 14, 8], [306, 209, 12, 16, 12, 4], [306, 264, 14, 12, 14, 8], [306, 315, 14, 12, 14, 8], [306, 366, 20, 12, 20, 8], [306, 417, 14, 12, 14, 8], [306, 468, 16, 16, 16, 8], [306, 519, 14, 12, 14, 8], [306, 565, 12, 18, 12, 3], [306, 616, 8, 18, 8, 3], [306, 667, 12, 18, 12, 3], [306, 719, 16, 15, 16, 4], [306, 779, 3, 6, 3, 13], [367, 2, 18, 19, 18, 1], [367, 52, 18, 20, 18, 0], [367, 107, 16, 20, 16, 4], [367, 154, 14, 20, 14, 0], [367, 205, 16, 20, 16, 0], [367, 257, 16, 19, 16, 1], [367, 308, 16, 19, 16, 1], [367, 361, 14, 17, 14, 3], [367, 412, 14, 17, 14, 3], [367, 463, 14, 17, 14, 3], [367, 516, 14, 15, 14, 5], [367, 566, 14, 16, 14, 4], [367, 616, 14, 17, 14, 3], [367, 672, 14, 15, 14, 8], [367, 718, 14, 17, 14, 3], [367, 769, 14, 17, 14, 3], [428, 4, 14, 17, 14, 3], [428, 57, 14, 15, 14, 5], [428, 106, 10, 17, 10, 3], [428, 157, 10, 17, 10, 3], [428, 208, 10, 17, 10, 3], [428, 261, 11, 15, 11, 5], [428, 311, 14, 16, 14, 4], [428, 361, 14, 17, 14, 3], [428, 412, 14, 17, 14, 3], [428, 463, 14, 17, 14, 3], [428, 516, 14, 15, 14, 5], [428, 566, 14, 16, 14, 4], [428, 616, 14, 17, 14, 3], [428, 667, 14, 17, 14, 3], [428, 718, 14, 17, 14, 3], [428, 771, 14, 15, 14, 5], [489, 4, 12, 16, 12, 3], [489, 56, 12, 15, 12, 4], [489, 107, 14, 16, 14, 4], [489, 158, 16, 16, 16, 4], [489, 209, 16, 16, 16, 4], [489, 263, 16, 12, 16, 7], [489, 311, 16, 16, 16, 4], [489, 362, 16, 16, 16, 4], [489, 415, 20, 14, 20, 6], [489, 466, 20, 14, 20, 6], [489, 515, 22, 15, 22, 4], [489, 566, 12, 15, 12, 4], [489, 617, 12, 15, 12, 4], [489, 671, 14, 12, 14, 7], [489, 719, 22, 16, 22, 4], [489, 770, 16, 16, 16, 4], [550, 10, 20, 10, 20, 9], [550, 59, 16, 13, 16, 7], [550, 110, 14, 13, 14, 7], [550, 161, 14, 13, 14, 7], [550, 209, 16, 16, 16, 4], [550, 264, 16, 15, 16, 8], [550, 312, 14, 15, 14, 5], [550, 362, 16, 16, 16, 4], [550, 413, 18, 16, 18, 4], [550, 466, 18, 14, 18, 6], [550, 511, 14, 24, 14, 0], [550, 566, 14, 15, 14, 4], [550, 617, 14, 15, 14, 4], [550, 668, 20, 16, 20, 4], [550, 723, 22, 12, 22, 8], [550, 774, 14, 12, 14, 8], [611, 5, 16, 16, 16, 4], [611, 56, 10, 16, 10, 4], [611, 113, 14, 9, 14, 10], [611, 156, 20, 18, 20, 2], [611, 205, 14, 24, 14, 0], [611, 265, 14, 10, 14, 9], [611, 313, 18, 14, 18, 6], [611, 365, 18, 13, 18, 7], [611, 416, 18, 13, 18, 7], [611, 473, 20, 7, 20, 13], [611, 524, 16, 6, 16, 13], [611, 562, 18, 20, 18, 0], [611, 613, 18, 20, 18, 0], [611, 664, 16, 20, 16, 0], [611, 719, 22, 16, 22, 4], [611, 774, 20, 12, 20, 8], [672, 12, 14, 8, 14, 11], [672, 63, 18, 8, 18, 11], [672, 107, 18, 15, 18, 4], [672, 158, 18, 15, 18, 4], [672, 209, 12, 15, 12, 4], [672, 260, 12, 15, 12, 4], [672, 313, 14, 13, 14, 6], [672, 363, 20, 14, 20, 5], [672, 413, 16, 20, 16, 4], [1, 14, 10, 6, 10, 13], [794, 770, 18, 16, 18, 4], [672, 566, 18, 16, 18, 4], [672, 617, 18, 16, 18, 4], [672, 668, 18, 16, 18, 4], [672, 719, 18, 16, 18, 4], [672, 770, 18, 16, 18, 4], [733, 5, 18, 16, 18, 4], [733, 56, 18, 16, 18, 4], [733, 107, 18, 16, 18, 4], [733, 158, 18, 16, 18, 4], [733, 209, 18, 16, 18, 4], [733, 260, 18, 16, 18, 4], [733, 311, 18, 16, 18, 4], [733, 362, 18, 16, 18, 4], [733, 413, 18, 16, 18, 4], [733, 464, 18, 16, 18, 4], [733, 515, 18, 16, 18, 4], [733, 566, 18, 16, 18, 4], [733, 617, 18, 16, 18, 4], [733, 668, 18, 16, 18, 4], [733, 719, 18, 16, 18, 4], [733, 770, 18, 16, 18, 4], [1, 14, 10, 6, 10, 13], [794, 56, 18, 16, 18, 4], [794, 107, 18, 16, 18, 4], [794, 158, 18, 16, 18, 4], [794, 209, 18, 16, 18, 4], [794, 260, 18, 16, 18, 4], [794, 311, 18, 16, 18, 4], [794, 362, 18, 16, 18, 4], [794, 413, 18, 16, 18, 4], [794, 464, 18, 16, 18, 4], [794, 515, 18, 16, 18, 4], [794, 566, 18, 16, 18, 4], [794, 617, 18, 16, 18, 4], [794, 668, 18, 16, 18, 4], [794, 719, 18, 16, 18, 4], [794, 770, 18, 16, 18, 4], [855, 5, 18, 16, 18, 4], [855, 56, 18, 16, 18, 4], [855, 107, 18, 16, 18, 4], [855, 158, 18, 16, 18, 4], [855, 209, 18, 16, 18, 4], [855, 260, 18, 16, 18, 4], [855, 311, 18, 16, 18, 4], [855, 362, 18, 16, 18, 4], [855, 413, 18, 16, 18, 4], [855, 464, 18, 16, 18, 4], [855, 515, 18, 16, 18, 4], [855, 566, 18, 16, 18, 4], [855, 617, 18, 16, 18, 4], [855, 668, 18, 16, 18, 4], [855, 719, 18, 16, 18, 4], [855, 770, 18, 16, 18, 4]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 9, 6, 9, 12], [1, 56, 9, 14, 9, 4], [1, 107, 11, 14, 11, 4], [1, 158, 17, 14, 17, 4], [1, 207, 15, 18, 15, 2], [1, 260, 17, 14, 17, 4], [1, 311, 19, 14, 19, 4], [1, 362, 6, 14, 6, 4], [1, 412, 10, 16, 10, 3], [1, 463, 10, 16, 10, 3], [1, 516, 17, 13, 17, 5], [1, 569, 15, 11, 15, 7], [1, 625, 9, 8, 9, 12], [1, 675, 13, 7, 13, 11], [1, 727, 9, 6, 9, 12], [1, 770, 13, 14, 13, 4], [62, 5, 15, 14, 15, 4], [62, 56, 15, 14, 15, 4], [62, 107, 15, 14, 15, 4], [62, 158, 15, 14, 15, 4], [62, 209, 15, 14, 15, 4], [62, 260, 15, 14, 15, 4], [62, 311, 15, 14, 15, 4], [62, 362, 15, 14, 15, 4], [62, 413, 15, 14, 15, 4], [62, 464, 15, 14, 15, 4], [62, 519, 9, 10, 9, 8], [62, 570, 9, 12, 9, 8], [62, 620, 13, 11, 13, 7], [62, 673, 13, 9, 13, 9], [62, 722, 13, 11, 13, 7], [62, 770, 15, 14, 15, 4], [123, 7, 19, 12, 19, 6], [123, 56, 17, 14, 17, 4], [123, 107, 15, 14, 15, 4], [123, 158, 15, 14, 15, 4], [123, 209, 15, 14, 15, 4], [123, 260, 13, 14, 13, 4], [123, 311, 13, 14, 13, 4], [123, 362, 15, 14, 15, 4], [123, 413, 15, 14, 15, 4], [123, 464, 9, 14, 9, 4], [123, 515, 13, 14, 13, 4], [123, 566, 15, 14, 15, 4], [123, 617, 13, 14, 13, 4], [123, 668, 17, 14, 17, 4], [123, 719, 15, 14, 15, 4], [123, 770, 15, 14, 15, 4], [184, 5, 15, 14, 15, 4], [184, 56, 15, 14, 15, 4], [184, 107, 15, 14, 15, 4], [184, 158, 15, 14, 15, 4], [184, 209, 15, 14, 15, 4], [184, 260, 15, 14, 15, 4], [184, 311, 17, 14, 17, 4], [184, 362, 19, 14, 19, 4], [184, 413, 15, 14, 15, 4], [184, 464, 15, 14, 15, 4], [184, 515, 13, 14, 13, 4], [184, 565, 11, 16, 11, 3], [184, 617, 13, 14, 13, 4], [184, 667, 11, 16, 11, 3], [184, 719, 11, 14, 11, 4], [184, 778, 15, 6, 15, 12], [245, 5, 9, 14, 9, 4], [245, 60, 13, 10, 13, 8], [245, 107, 13, 14, 13, 4], [245, 162, 13, 10, 13, 8], [245, 209, 13, 14, 13, 4], [245, 264, 13, 10, 13, 8], [245, 311, 11, 14, 11, 4], [245, 366, 13, 14, 13, 8], [245, 413, 13, 14, 13, 4], [245, 464, 9, 14, 9, 4], [245, 515, 11, 18, 11, 4], [245, 566, 13, 14, 13, 4], [245, 617, 9, 14, 9, 4], [245, 672, 19, 10, 19, 8], [245, 723, 13, 10, 13, 8], [245, 774, 13, 10, 13, 8], [306, 9, 13, 13, 13, 8], [306, 60, 13, 13, 13, 8], [306, 111, 13, 10, 13, 8], [306, 162, 13, 10, 13, 8], [306, 209, 11, 14, 11, 4], [306, 264, 13, 10, 13, 8], [306, 315, 13, 10, 13, 8], [306, 366, 19, 10, 19, 8], [306, 417, 13, 10, 13, 8], [306, 468, 15, 14, 15, 8], [306, 519, 13, 10, 13, 8], [306, 565, 11, 16, 11, 3], [306, 616, 7, 16, 7, 3], [306, 667, 11, 16, 11, 3], [306, 719, 15, 14, 15, 4], [306, 778, 3, 6, 3, 12], [367, 2, 17, 17, 17, 1], [367, 52, 17, 18, 17, 0], [367, 107, 15, 18, 15, 4], [367, 154, 13, 18, 13, 0], [367, 205, 15, 18, 15, 0], [367, 257, 15, 17, 15, 1], [367, 308, 15, 17, 15, 1], [367, 361, 13, 15, 13, 3], [367, 412, 13, 15, 13, 3], [367, 463, 13, 15, 13, 3], [367, 516, 13, 13, 13, 5], [367, 566, 13, 14, 13, 4], [367, 616, 13, 15, 13, 3], [367, 672, 13, 13, 13, 8], [367, 718, 13, 15, 13, 3], [367, 769, 13, 15, 13, 3], [428, 4, 13, 15, 13, 3], [428, 57, 13, 13, 13, 5], [428, 106, 9, 15, 9, 3], [428, 157, 9, 15, 9, 3], [428, 208, 9, 15, 9, 3], [428, 261, 10, 13, 10, 5], [428, 311, 13, 14, 13, 4], [428, 361, 13, 15, 13, 3], [428, 412, 13, 15, 13, 3], [428, 463, 13, 15, 13, 3], [428, 516, 13, 13, 13, 5], [428, 566, 13, 14, 13, 4], [428, 616, 13, 15, 13, 3], [428, 667, 13, 15, 13, 3], [428, 718, 13, 15, 13, 3], [428, 771, 13, 13, 13, 5], [489, 4, 11, 15, 11, 3], [489, 56, 11, 14, 11, 4], [489, 107, 13, 14, 13, 4], [489, 158, 15, 14, 15, 4], [489, 209, 15, 14, 15, 4], [489, 263, 15, 11, 15, 7], [489, 311, 15, 14, 15, 4], [489, 362, 15, 14, 15, 4], [489, 415, 19, 12, 19, 6], [489, 466, 19, 12, 19, 6], [489, 515, 21, 14, 21, 4], [489, 566, 11, 14, 11, 4], [489, 617, 11, 14, 11, 4], [489, 671, 13, 11, 13, 7], [489, 719, 21, 14, 21, 4], [489, 770, 15, 14, 15, 4], [550, 10, 19, 9, 19, 9], [550, 59, 15, 11, 15, 7], [550, 110, 13, 11, 13, 7], [550, 161, 13, 11, 13, 7], [550, 209, 15, 14, 15, 4], [550, 264, 15, 13, 15, 8], [550, 312, 13, 13, 13, 5], [550, 362, 15, 14, 15, 4], [550, 413, 17, 14, 17, 4], [550, 466, 17, 12, 17, 6], [550, 511, 13, 22, 13, 0], [550, 566, 13, 14, 13, 4], [550, 617, 13, 14, 13, 4], [550, 668, 19, 14, 19, 4], [550, 723, 21, 10, 21, 8], [550, 774, 13, 10, 13, 8], [611, 5, 15, 14, 15, 4], [611, 56, 9, 14, 9, 4], [611, 113, 13, 8, 13, 10], [611, 156, 19, 16, 19, 2], [611, 205, 13, 22, 13, 0], [611, 265, 13, 9, 13, 9], [611, 313, 17, 12, 17, 6], [611, 365, 17, 11, 17, 7], [611, 416, 17, 11, 17, 7], [611, 472, 19, 6, 19, 12], [611, 523, 15, 6, 15, 12], [611, 562, 17, 18, 17, 0], [611, 613, 17, 18, 17, 0], [611, 664, 15, 18, 15, 0], [611, 719, 21, 14, 21, 4], [611, 774, 19, 10, 19, 8], [672, 12, 13, 7, 13, 11], [672, 63, 17, 7, 17, 11], [672, 107, 17, 14, 17, 4], [672, 158, 17, 14, 17, 4], [672, 209, 11, 14, 11, 4], [672, 260, 11, 14, 11, 4], [672, 313, 13, 12, 13, 6], [672, 363, 19, 13, 19, 5], [672, 413, 15, 18, 15, 4], [1, 13, 9, 6, 9, 12], [794, 770, 17, 14, 17, 4], [672, 566, 17, 14, 17, 4], [672, 617, 17, 14, 17, 4], [672, 668, 17, 14, 17, 4], [672, 719, 17, 14, 17, 4], [672, 770, 17, 14, 17, 4], [733, 5, 17, 14, 17, 4], [733, 56, 17, 14, 17, 4], [733, 107, 17, 14, 17, 4], [733, 158, 17, 14, 17, 4], [733, 209, 17, 14, 17, 4], [733, 260, 17, 14, 17, 4], [733, 311, 17, 14, 17, 4], [733, 362, 17, 14, 17, 4], [733, 413, 17, 14, 17, 4], [733, 464, 17, 14, 17, 4], [733, 515, 17, 14, 17, 4], [733, 566, 17, 14, 17, 4], [733, 617, 17, 14, 17, 4], [733, 668, 17, 14, 17, 4], [733, 719, 17, 14, 17, 4], [733, 770, 17, 14, 17, 4], [1, 13, 9, 6, 9, 12], [794, 56, 17, 14, 17, 4], [794, 107, 17, 14, 17, 4], [794, 158, 17, 14, 17, 4], [794, 209, 17, 14, 17, 4], [794, 260, 17, 14, 17, 4], [794, 311, 17, 14, 17, 4], [794, 362, 17, 14, 17, 4], [794, 413, 17, 14, 17, 4], [794, 464, 17, 14, 17, 4], [794, 515, 17, 14, 17, 4], [794, 566, 17, 14, 17, 4], [794, 617, 17, 14, 17, 4], [794, 668, 17, 14, 17, 4], [794, 719, 17, 14, 17, 4], [794, 770, 17, 14, 17, 4], [855, 5, 17, 14, 17, 4], [855, 56, 17, 14, 17, 4], [855, 107, 17, 14, 17, 4], [855, 158, 17, 14, 17, 4], [855, 209, 17, 14, 17, 4], [855, 260, 17, 14, 17, 4], [855, 311, 17, 14, 17, 4], [855, 362, 17, 14, 17, 4], [855, 413, 17, 14, 17, 4], [855, 464, 17, 14, 17, 4], [855, 515, 17, 14, 17, 4], [855, 566, 17, 14, 17, 4], [855, 617, 17, 14, 17, 4], [855, 668, 17, 14, 17, 4], [855, 719, 17, 14, 17, 4], [855, 770, 17, 14, 17, 4]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 13, 1], [1, 56, 20, 20, 11, 4], [1, 107, 24, 8, 15, 4], [1, 157, 32, 18, 23, 3], [1, 207, 28, 24, 19, 2], [1, 260, 32, 20, 23, 4], [1, 311, 26, 20, 23, 4], [1, 362, 20, 8, 11, 4], [1, 412, 24, 22, 15, 3], [1, 463, 21, 22, 15, 3], [1, 513, 30, 15, 21, 2], [1, 570, 24, 12, 19, 8], [1, 633, 13, 8, 13, 20], [1, 676, 24, 4, 19, 12], [1, 734, 13, 5, 11, 19], [1, 770, 28, 20, 19, 4], [62, 5, 28, 20, 21, 4], [62, 56, 25, 20, 21, 4], [62, 107, 29, 20, 21, 4], [62, 158, 28, 20, 21, 4], [62, 209, 29, 20, 21, 4], [62, 260, 29, 20, 21, 4], [62, 311, 28, 20, 21, 4], [62, 362, 30, 20, 21, 4], [62, 413, 28, 20, 21, 4], [62, 464, 28, 20, 21, 4], [62, 520, 18, 15, 11, 9], [62, 571, 19, 19, 13, 9], [62, 620, 25, 15, 17, 7], [62, 674, 25, 8, 19, 10], [62, 722, 22, 15, 17, 7], [62, 770, 28, 20, 21, 4], [123, 6, 31, 20, 25, 5], [123, 56, 26, 20, 23, 4], [123, 107, 29, 20, 21, 4], [123, 158, 29, 20, 21, 4], [123, 209, 29, 20, 21, 4], [123, 260, 28, 20, 19, 4], [123, 311, 28, 20, 19, 4], [123, 362, 30, 20, 21, 4], [123, 413, 30, 20, 21, 4], [123, 464, 22, 20, 15, 4], [123, 515, 28, 20, 19, 4], [123, 566, 29, 20, 21, 4], [123, 617, 20, 20, 19, 4], [123, 668, 32, 20, 23, 4], [123, 719, 30, 20, 21, 4], [123, 770, 29, 20, 21, 4], [184, 5, 28, 20, 21, 4], [184, 56, 29, 23, 21, 4], [184, 107, 28, 20, 21, 4], [184, 158, 28, 20, 21, 4], [184, 209, 31, 20, 21, 4], [184, 260, 30, 20, 21, 4], [184, 311, 32, 20, 23, 4], [184, 362, 37, 20, 27, 4], [184, 413, 29, 20, 19, 4], [184, 464, 29, 20, 19, 4], [184, 515, 29, 20, 19, 4], [184, 564, 23, 24, 13, 2], [184, 615, 20, 22, 19, 2], [184, 666, 23, 24, 13, 2], [184, 718, 21, 11, 13, 3], [184, 786, 24, 4, 21, 20], [245, 3, 22, 7, 13, 2], [245, 61, 25, 15, 19, 9], [245, 107, 24, 20, 19, 4], [245, 163, 25, 15, 19, 9], [245, 209, 28, 20, 19, 4], [245, 265, 24, 15, 19, 9], [245, 312, 25, 19, 17, 5], [245, 367, 26, 21, 19, 9], [245, 414, 25, 19, 19, 5], [245, 465, 22, 19, 15, 5], [245, 516, 24, 25, 17, 5], [245, 567, 25, 19, 19, 5], [245, 618, 22, 19, 15, 5], [245, 673, 33, 15, 27, 9], [245, 724, 25, 15, 19, 9], [245, 775, 24, 15, 19, 9], [306, 10, 24, 19, 19, 9], [306, 61, 26, 19, 19, 9], [306, 112, 24, 15, 17, 9], [306, 163, 25, 15, 19, 9], [306, 211, 23, 18, 17, 6], [306, 265, 26, 15, 19, 9], [306, 316, 27, 15, 19, 9], [306, 367, 34, 15, 27, 9], [306, 418, 27, 15, 19, 9], [306, 469, 27, 21, 19, 9], [306, 520, 27, 15, 19, 9], [306, 563, 25, 25, 15, 1], [306, 616, 21, 22, 11, 3], [306, 665, 23, 25, 15, 1], [306, 718, 31, 6, 21, 3], [306, 766, 1, 1, 3, 1], [367, 1, 29, 24, 23, 0], [367, 52, 29, 24, 23, 0], [367, 107, 29, 25, 21, 4], [367, 154, 28, 24, 19, 0], [367, 205, 30, 24, 21, 0], [367, 256, 29, 24, 21, 0], [367, 307, 30, 24, 21, 0], [367, 361, 27, 21, 19, 3], [367, 412, 25, 21, 19, 3], [367, 463, 26, 21, 19, 3], [367, 516, 26, 19, 19, 5], [367, 566, 27, 20, 19, 4], [367, 614, 27, 23, 19, 1], [367, 673, 25, 20, 19, 9], [367, 718, 27, 21, 19, 3], [367, 769, 24, 21, 19, 3], [428, 4, 26, 21, 19, 3], [428, 57, 26, 19, 19, 5], [428, 106, 25, 21, 15, 3], [428, 157, 21, 21, 15, 3], [428, 208, 24, 21, 15, 3], [428, 261, 24, 19, 15, 5], [428, 311, 27, 20, 19, 4], [428, 361, 27, 21, 19, 3], [428, 412, 24, 21, 19, 3], [428, 463, 26, 21, 19, 3], [428, 516, 26, 19, 19, 5], [428, 566, 27, 20, 19, 4], [428, 616, 27, 21, 19, 3], [428, 667, 26, 21, 19, 3], [428, 718, 26, 21, 19, 3], [428, 771, 26, 19, 19, 5], [489, 5, 25, 19, 15, 4], [489, 55, 25, 9, 17, 3], [489, 107, 27, 20, 19, 4], [489, 158, 29, 20, 21, 4], [489, 209, 29, 24, 21, 4], [489, 266, 25, 12, 21, 10], [489, 311, 31, 24, 21, 4], [489, 362, 29, 20, 23, 4], [489, 415, 31, 19, 25, 6], [489, 466, 31, 19, 25, 6], [489, 515, 35, 11, 27, 4], [489, 564, 23, 7, 13, 2], [489, 617, 24, 4, 15, 4], [489, 672, 27, 12, 21, 8], [489, 719, 39, 20, 29, 4], [489, 770, 31, 20, 21, 4], [550, 11, 32, 11, 27, 10], [550, 60, 24, 16, 19, 8], [550, 109, 25, 18, 17, 6], [550, 160, 23, 18, 17, 6], [550, 209, 29, 20, 19, 4], [550, 264, 30, 20, 23, 8], [550, 312, 25, 19, 19, 5], [550, 362, 30, 26, 21, 4], [550, 413, 32, 26, 23, 4], [550, 468, 31, 16, 25, 8], [550, 513, 25, 27, 15, 2], [550, 566, 26, 12, 17, 4], [550, 617, 25, 12, 17, 4], [550, 668, 32, 20, 25, 4], [550, 724, 32, 15, 27, 9], [550, 775, 26, 15, 19, 9], [611, 5, 25, 20, 21, 4], [611, 56, 21, 20, 13, 4], [611, 115, 24, 8, 19, 12], [611, 155, 35, 27, 25, 1], [611, 209, 25, 24, 15, 4], [611, 264, 28, 11, 21, 8], [611, 309, 26, 22, 23, 2], [611, 367, 28, 15, 21, 9], [611, 418, 25, 15, 21, 9], [611, 480, 26, 4, 25, 20], [611, 511, 1, 1, 21, 1], [611, 562, 27, 24, 23, 0], [611, 613, 30, 24, 23, 0], [611, 664, 29, 24, 21, 0], [611, 719, 38, 20, 29, 4], [611, 775, 32, 15, 27, 9], [672, 15, 21, 4, 17, 14], [672, 66, 27, 4, 23, 14], [672, 106, 27, 8, 19, 3], [672, 158, 26, 8, 19, 4], [672, 208, 22, 8, 13, 3], [672, 260, 21, 8, 13, 4], [672, 314, 25, 14, 19, 7], [672, 362, 29, 19, 23, 4], [672, 414, 27, 25, 19, 5], [1, 1, 1, 1, 13, 1], [794, 771, 34, 19, 25, 5], [672, 567, 34, 19, 25, 5], [672, 618, 34, 19, 25, 5], [672, 669, 34, 19, 25, 5], [672, 720, 34, 19, 25, 5], [672, 771, 34, 19, 25, 5], [733, 6, 34, 19, 25, 5], [733, 57, 34, 19, 25, 5], [733, 108, 34, 19, 25, 5], [733, 159, 34, 19, 25, 5], [733, 210, 34, 19, 25, 5], [733, 261, 34, 19, 25, 5], [733, 312, 34, 19, 25, 5], [733, 363, 34, 19, 25, 5], [733, 414, 34, 19, 25, 5], [733, 465, 34, 19, 25, 5], [733, 516, 34, 19, 25, 5], [733, 567, 34, 19, 25, 5], [733, 618, 34, 19, 25, 5], [733, 669, 34, 19, 25, 5], [733, 720, 34, 19, 25, 5], [733, 771, 34, 19, 25, 5], [1, 1, 1, 1, 13, 1], [794, 57, 34, 19, 25, 5], [794, 108, 34, 19, 25, 5], [794, 159, 34, 19, 25, 5], [794, 210, 34, 19, 25, 5], [794, 261, 34, 19, 25, 5], [794, 312, 34, 19, 25, 5], [794, 363, 34, 19, 25, 5], [794, 414, 34, 19, 25, 5], [794, 465, 34, 19, 25, 5], [794, 516, 34, 19, 25, 5], [794, 567, 34, 19, 25, 5], [794, 618, 34, 19, 25, 5], [794, 669, 34, 19, 25, 5], [794, 720, 34, 19, 25, 5], [794, 771, 34, 19, 25, 5], [855, 6, 34, 19, 25, 5], [855, 57, 34, 19, 25, 5], [855, 108, 34, 19, 25, 5], [855, 159, 34, 19, 25, 5], [855, 210, 34, 19, 25, 5], [855, 261, 34, 19, 25, 5], [855, 312, 34, 19, 25, 5], [855, 363, 34, 19, 25, 5], [855, 414, 34, 19, 25, 5], [855, 465, 34, 19, 25, 5], [855, 516, 34, 19, 25, 5], [855, 567, 34, 19, 25, 5], [855, 618, 34, 19, 25, 5], [855, 669, 34, 19, 25, 5], [855, 720, 34, 19, 25, 5], [855, 771, 34, 19, 25, 5]], \"capHeight\": 23, \"widestlogicalchar\": 29, \"widestglyph\": 39, \"tallestglyph\": 27}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 56, 19, 18, 10, 4], [1, 107, 23, 6, 14, 4], [1, 157, 31, 16, 22, 3], [1, 207, 27, 22, 18, 2], [1, 260, 31, 18, 22, 4], [1, 311, 25, 18, 22, 4], [1, 362, 19, 6, 10, 4], [1, 412, 23, 20, 14, 3], [1, 463, 20, 20, 14, 3], [1, 513, 29, 13, 20, 2], [1, 570, 23, 10, 18, 8], [1, 633, 12, 6, 12, 20], [1, 676, 23, 2, 18, 12], [1, 734, 12, 3, 10, 19], [1, 770, 27, 18, 18, 4], [62, 5, 27, 18, 20, 4], [62, 56, 24, 18, 20, 4], [62, 107, 28, 18, 20, 4], [62, 158, 27, 18, 20, 4], [62, 209, 28, 18, 20, 4], [62, 260, 28, 18, 20, 4], [62, 311, 27, 18, 20, 4], [62, 362, 29, 18, 20, 4], [62, 413, 27, 18, 20, 4], [62, 464, 27, 18, 20, 4], [62, 520, 17, 13, 10, 9], [62, 571, 18, 17, 12, 9], [62, 620, 24, 13, 16, 7], [62, 674, 24, 6, 18, 10], [62, 722, 21, 13, 16, 7], [62, 770, 27, 18, 20, 4], [123, 6, 30, 18, 24, 5], [123, 56, 25, 18, 22, 4], [123, 107, 28, 18, 20, 4], [123, 158, 28, 18, 20, 4], [123, 209, 28, 18, 20, 4], [123, 260, 27, 18, 18, 4], [123, 311, 27, 18, 18, 4], [123, 362, 29, 18, 20, 4], [123, 413, 29, 18, 20, 4], [123, 464, 21, 18, 14, 4], [123, 515, 27, 18, 18, 4], [123, 566, 28, 18, 20, 4], [123, 617, 19, 18, 18, 4], [123, 668, 31, 18, 22, 4], [123, 719, 29, 18, 20, 4], [123, 770, 28, 18, 20, 4], [184, 5, 27, 18, 20, 4], [184, 56, 28, 21, 20, 4], [184, 107, 27, 18, 20, 4], [184, 158, 27, 18, 20, 4], [184, 209, 30, 18, 20, 4], [184, 260, 29, 18, 20, 4], [184, 311, 31, 18, 22, 4], [184, 362, 36, 18, 26, 4], [184, 413, 28, 18, 18, 4], [184, 464, 28, 18, 18, 4], [184, 515, 28, 18, 18, 4], [184, 564, 22, 22, 12, 2], [184, 615, 19, 20, 18, 2], [184, 666, 22, 22, 12, 2], [184, 718, 20, 9, 12, 3], [184, 786, 23, 2, 20, 20], [245, 3, 21, 5, 12, 2], [245, 61, 24, 13, 18, 9], [245, 107, 23, 18, 18, 4], [245, 163, 24, 13, 18, 9], [245, 209, 27, 18, 18, 4], [245, 265, 23, 13, 18, 9], [245, 312, 24, 17, 16, 5], [245, 367, 25, 19, 18, 9], [245, 414, 24, 17, 18, 5], [245, 465, 21, 17, 14, 5], [245, 516, 23, 23, 16, 5], [245, 567, 24, 17, 18, 5], [245, 618, 21, 17, 14, 5], [245, 673, 32, 13, 26, 9], [245, 724, 24, 13, 18, 9], [245, 775, 23, 13, 18, 9], [306, 10, 23, 17, 18, 9], [306, 61, 25, 17, 18, 9], [306, 112, 23, 13, 16, 9], [306, 163, 24, 13, 18, 9], [306, 211, 22, 16, 16, 6], [306, 265, 25, 13, 18, 9], [306, 316, 26, 13, 18, 9], [306, 367, 33, 13, 26, 9], [306, 418, 26, 13, 18, 9], [306, 469, 26, 19, 18, 9], [306, 520, 26, 13, 18, 9], [306, 563, 24, 23, 14, 1], [306, 616, 20, 20, 10, 3], [306, 665, 22, 23, 14, 1], [306, 718, 30, 4, 20, 3], [306, 766, 1, 1, 3, 1], [367, 1, 28, 22, 22, 0], [367, 52, 28, 22, 22, 0], [367, 107, 28, 23, 20, 4], [367, 154, 27, 22, 18, 0], [367, 205, 29, 22, 20, 0], [367, 256, 28, 22, 20, 0], [367, 307, 29, 22, 20, 0], [367, 361, 26, 19, 18, 3], [367, 412, 24, 19, 18, 3], [367, 463, 25, 19, 18, 3], [367, 516, 25, 17, 18, 5], [367, 566, 26, 18, 18, 4], [367, 614, 26, 21, 18, 1], [367, 673, 24, 18, 18, 9], [367, 718, 26, 19, 18, 3], [367, 769, 23, 19, 18, 3], [428, 4, 25, 19, 18, 3], [428, 57, 25, 17, 18, 5], [428, 106, 24, 19, 14, 3], [428, 157, 20, 19, 14, 3], [428, 208, 23, 19, 14, 3], [428, 261, 23, 17, 14, 5], [428, 311, 26, 18, 18, 4], [428, 361, 26, 19, 18, 3], [428, 412, 23, 19, 18, 3], [428, 463, 25, 19, 18, 3], [428, 516, 25, 17, 18, 5], [428, 566, 26, 18, 18, 4], [428, 616, 26, 19, 18, 3], [428, 667, 25, 19, 18, 3], [428, 718, 25, 19, 18, 3], [428, 771, 25, 17, 18, 5], [489, 5, 24, 17, 14, 4], [489, 55, 24, 7, 16, 3], [489, 107, 26, 18, 18, 4], [489, 158, 28, 18, 20, 4], [489, 209, 28, 22, 20, 4], [489, 266, 24, 10, 20, 10], [489, 311, 30, 22, 20, 4], [489, 362, 28, 18, 22, 4], [489, 415, 30, 17, 24, 6], [489, 466, 30, 17, 24, 6], [489, 515, 34, 9, 26, 4], [489, 564, 22, 5, 12, 2], [489, 617, 23, 2, 14, 4], [489, 672, 26, 10, 20, 8], [489, 719, 38, 18, 28, 4], [489, 770, 30, 18, 20, 4], [550, 11, 31, 9, 26, 10], [550, 60, 23, 14, 18, 8], [550, 109, 24, 16, 16, 6], [550, 160, 22, 16, 16, 6], [550, 209, 28, 18, 18, 4], [550, 264, 29, 18, 22, 8], [550, 312, 24, 17, 18, 5], [550, 362, 29, 24, 20, 4], [550, 413, 31, 24, 22, 4], [550, 468, 30, 14, 24, 8], [550, 513, 24, 25, 14, 2], [550, 566, 25, 10, 16, 4], [550, 617, 24, 10, 16, 4], [550, 668, 31, 18, 24, 4], [550, 724, 31, 13, 26, 9], [550, 775, 25, 13, 18, 9], [611, 5, 24, 18, 20, 4], [611, 56, 20, 18, 12, 4], [611, 115, 23, 6, 18, 12], [611, 155, 34, 25, 24, 1], [611, 209, 24, 22, 14, 4], [611, 264, 27, 9, 20, 8], [611, 309, 25, 20, 22, 2], [611, 367, 27, 13, 20, 9], [611, 418, 24, 13, 20, 9], [611, 480, 25, 2, 24, 20], [611, 511, 1, 1, 20, 1], [611, 562, 26, 22, 22, 0], [611, 613, 29, 22, 22, 0], [611, 664, 28, 22, 20, 0], [611, 719, 37, 18, 28, 4], [611, 775, 31, 13, 26, 9], [672, 15, 20, 2, 16, 14], [672, 66, 26, 2, 22, 14], [672, 106, 26, 6, 18, 3], [672, 158, 25, 6, 18, 4], [672, 208, 21, 6, 12, 3], [672, 260, 20, 6, 12, 4], [672, 314, 24, 12, 18, 7], [672, 362, 28, 17, 22, 4], [672, 414, 26, 23, 18, 5], [1, 1, 1, 1, 12, 1], [794, 771, 33, 17, 24, 5], [672, 567, 33, 17, 24, 5], [672, 618, 33, 17, 24, 5], [672, 669, 33, 17, 24, 5], [672, 720, 33, 17, 24, 5], [672, 771, 33, 17, 24, 5], [733, 6, 33, 17, 24, 5], [733, 57, 33, 17, 24, 5], [733, 108, 33, 17, 24, 5], [733, 159, 33, 17, 24, 5], [733, 210, 33, 17, 24, 5], [733, 261, 33, 17, 24, 5], [733, 312, 33, 17, 24, 5], [733, 363, 33, 17, 24, 5], [733, 414, 33, 17, 24, 5], [733, 465, 33, 17, 24, 5], [733, 516, 33, 17, 24, 5], [733, 567, 33, 17, 24, 5], [733, 618, 33, 17, 24, 5], [733, 669, 33, 17, 24, 5], [733, 720, 33, 17, 24, 5], [733, 771, 33, 17, 24, 5], [1, 1, 1, 1, 12, 1], [794, 57, 33, 17, 24, 5], [794, 108, 33, 17, 24, 5], [794, 159, 33, 17, 24, 5], [794, 210, 33, 17, 24, 5], [794, 261, 33, 17, 24, 5], [794, 312, 33, 17, 24, 5], [794, 363, 33, 17, 24, 5], [794, 414, 33, 17, 24, 5], [794, 465, 33, 17, 24, 5], [794, 516, 33, 17, 24, 5], [794, 567, 33, 17, 24, 5], [794, 618, 33, 17, 24, 5], [794, 669, 33, 17, 24, 5], [794, 720, 33, 17, 24, 5], [794, 771, 33, 17, 24, 5], [855, 6, 33, 17, 24, 5], [855, 57, 33, 17, 24, 5], [855, 108, 33, 17, 24, 5], [855, 159, 33, 17, 24, 5], [855, 210, 33, 17, 24, 5], [855, 261, 33, 17, 24, 5], [855, 312, 33, 17, 24, 5], [855, 363, 33, 17, 24, 5], [855, 414, 33, 17, 24, 5], [855, 465, 33, 17, 24, 5], [855, 516, 33, 17, 24, 5], [855, 567, 33, 17, 24, 5], [855, 618, 33, 17, 24, 5], [855, 669, 33, 17, 24, 5], [855, 720, 33, 17, 24, 5], [855, 771, 33, 17, 24, 5]], \"capHeight\": 22, \"widestlogicalchar\": 28, \"widestglyph\": 38, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 1, \"capHeight\": 23, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 18, 13, 6, 13, 17], [1, 56, 11, 20, 11, 4], [1, 107, 15, 19, 15, 4], [1, 157, 23, 20, 23, 3], [1, 207, 19, 24, 19, 2], [1, 260, 23, 20, 23, 4], [1, 311, 23, 20, 23, 4], [1, 362, 11, 19, 11, 4], [1, 412, 15, 22, 15, 3], [1, 463, 15, 22, 15, 3], [1, 513, 21, 21, 21, 2], [1, 570, 19, 15, 19, 8], [1, 630, 13, 11, 13, 17], [1, 676, 19, 11, 19, 12], [1, 732, 11, 7, 11, 17], [1, 770, 19, 20, 19, 4], [62, 5, 21, 20, 21, 4], [62, 56, 21, 20, 21, 4], [62, 107, 21, 20, 21, 4], [62, 158, 21, 20, 21, 4], [62, 209, 21, 20, 21, 4], [62, 260, 21, 20, 21, 4], [62, 311, 21, 20, 21, 4], [62, 362, 21, 20, 21, 4], [62, 413, 21, 20, 21, 4], [62, 464, 21, 20, 21, 4], [62, 520, 11, 15, 11, 9], [62, 571, 13, 19, 13, 9], [62, 620, 17, 16, 17, 7], [62, 674, 19, 13, 19, 10], [62, 722, 17, 16, 17, 7], [62, 770, 21, 20, 21, 4], [123, 6, 25, 20, 25, 5], [123, 56, 23, 20, 23, 4], [123, 107, 21, 20, 21, 4], [123, 158, 21, 20, 21, 4], [123, 209, 21, 20, 21, 4], [123, 260, 19, 20, 19, 4], [123, 311, 19, 20, 19, 4], [123, 362, 21, 20, 21, 4], [123, 413, 21, 20, 21, 4], [123, 464, 15, 20, 15, 4], [123, 515, 19, 20, 19, 4], [123, 566, 21, 20, 21, 4], [123, 617, 19, 20, 19, 4], [123, 668, 23, 20, 23, 4], [123, 719, 21, 20, 21, 4], [123, 770, 21, 20, 21, 4], [184, 5, 21, 20, 21, 4], [184, 56, 21, 23, 21, 4], [184, 107, 21, 20, 21, 4], [184, 158, 21, 20, 21, 4], [184, 209, 21, 20, 21, 4], [184, 260, 21, 20, 21, 4], [184, 311, 23, 20, 23, 4], [184, 362, 27, 20, 27, 4], [184, 413, 19, 20, 19, 4], [184, 464, 19, 20, 19, 4], [184, 515, 19, 20, 19, 4], [184, 564, 13, 24, 13, 2], [184, 615, 19, 22, 19, 2], [184, 666, 13, 24, 13, 2], [184, 718, 13, 20, 13, 3], [184, 783, 21, 7, 21, 17], [245, 3, 13, 21, 13, 2], [245, 61, 19, 15, 19, 9], [245, 107, 19, 20, 19, 4], [245, 163, 19, 15, 19, 9], [245, 209, 19, 20, 19, 4], [245, 265, 19, 15, 19, 9], [245, 312, 17, 19, 17, 5], [245, 367, 19, 21, 19, 9], [245, 414, 19, 19, 19, 5], [245, 465, 15, 19, 15, 5], [245, 516, 17, 25, 17, 5], [245, 567, 19, 19, 19, 5], [245, 618, 15, 19, 15, 5], [245, 673, 27, 15, 27, 9], [245, 724, 19, 15, 19, 9], [245, 775, 19, 15, 19, 9], [306, 10, 19, 19, 19, 9], [306, 61, 19, 19, 19, 9], [306, 112, 17, 15, 17, 9], [306, 163, 19, 15, 19, 9], [306, 211, 17, 18, 17, 6], [306, 265, 19, 15, 19, 9], [306, 316, 19, 15, 19, 9], [306, 367, 27, 15, 27, 9], [306, 418, 19, 15, 19, 9], [306, 469, 19, 21, 19, 9], [306, 520, 19, 15, 19, 9], [306, 563, 15, 25, 15, 1], [306, 616, 11, 22, 11, 3], [306, 665, 15, 25, 15, 1], [306, 718, 21, 20, 21, 3], [306, 783, 3, 6, 3, 17], [367, 1, 23, 24, 23, 0], [367, 52, 23, 24, 23, 0], [367, 107, 21, 25, 21, 4], [367, 154, 19, 24, 19, 0], [367, 205, 21, 24, 21, 0], [367, 256, 21, 24, 21, 0], [367, 307, 21, 24, 21, 0], [367, 361, 19, 21, 19, 3], [367, 412, 19, 21, 19, 3], [367, 463, 19, 21, 19, 3], [367, 516, 19, 19, 19, 5], [367, 566, 19, 20, 19, 4], [367, 614, 19, 23, 19, 1], [367, 673, 19, 20, 19, 9], [367, 718, 19, 21, 19, 3], [367, 769, 19, 21, 19, 3], [428, 4, 19, 21, 19, 3], [428, 57, 19, 19, 19, 5], [428, 106, 15, 21, 15, 3], [428, 157, 15, 21, 15, 3], [428, 208, 15, 21, 15, 3], [428, 261, 15, 19, 15, 5], [428, 311, 19, 20, 19, 4], [428, 361, 19, 21, 19, 3], [428, 412, 19, 21, 19, 3], [428, 463, 19, 21, 19, 3], [428, 516, 19, 19, 19, 5], [428, 566, 19, 20, 19, 4], [428, 616, 19, 21, 19, 3], [428, 667, 19, 21, 19, 3], [428, 718, 19, 21, 19, 3], [428, 771, 19, 19, 19, 5], [489, 5, 15, 19, 15, 4], [489, 55, 17, 20, 17, 3], [489, 107, 19, 20, 19, 4], [489, 158, 21, 20, 21, 4], [489, 209, 21, 24, 21, 4], [489, 266, 21, 13, 21, 10], [489, 311, 21, 24, 21, 4], [489, 362, 23, 20, 23, 4], [489, 415, 25, 19, 25, 6], [489, 466, 25, 19, 25, 6], [489, 515, 27, 19, 27, 4], [489, 564, 13, 21, 13, 2], [489, 617, 15, 19, 15, 4], [489, 672, 21, 15, 21, 8], [489, 719, 29, 20, 29, 4], [489, 770, 21, 20, 21, 4], [550, 11, 27, 13, 27, 10], [550, 60, 19, 16, 19, 8], [550, 109, 17, 18, 17, 6], [550, 160, 17, 18, 17, 6], [550, 209, 19, 20, 19, 4], [550, 264, 23, 20, 23, 8], [550, 312, 19, 19, 19, 5], [550, 362, 21, 26, 21, 4], [550, 413, 23, 26, 23, 4], [550, 468, 25, 16, 25, 8], [550, 513, 15, 27, 15, 2], [550, 566, 17, 19, 17, 4], [550, 617, 17, 19, 17, 4], [550, 668, 25, 20, 25, 4], [550, 724, 27, 15, 27, 9], [550, 775, 19, 15, 19, 9], [611, 5, 21, 20, 21, 4], [611, 56, 13, 20, 13, 4], [611, 115, 19, 11, 19, 12], [611, 155, 25, 27, 25, 1], [611, 209, 15, 24, 15, 4], [611, 264, 21, 15, 21, 8], [611, 309, 23, 22, 23, 2], [611, 367, 21, 15, 21, 9], [611, 418, 21, 15, 21, 9], [611, 477, 25, 7, 25, 17], [611, 528, 21, 6, 21, 17], [611, 562, 23, 24, 23, 0], [611, 613, 23, 24, 23, 0], [611, 664, 21, 24, 21, 0], [611, 719, 29, 20, 29, 4], [611, 775, 27, 15, 27, 9], [672, 15, 17, 9, 17, 14], [672, 66, 23, 9, 23, 14], [672, 106, 19, 20, 19, 3], [672, 158, 19, 19, 19, 4], [672, 208, 13, 20, 13, 3], [672, 260, 13, 19, 13, 4], [672, 314, 19, 16, 19, 7], [672, 362, 23, 19, 23, 4], [672, 414, 19, 25, 19, 5], [1, 18, 13, 6, 13, 17], [794, 771, 25, 19, 25, 5], [672, 567, 25, 19, 25, 5], [672, 618, 25, 19, 25, 5], [672, 669, 25, 19, 25, 5], [672, 720, 25, 19, 25, 5], [672, 771, 25, 19, 25, 5], [733, 6, 25, 19, 25, 5], [733, 57, 25, 19, 25, 5], [733, 108, 25, 19, 25, 5], [733, 159, 25, 19, 25, 5], [733, 210, 25, 19, 25, 5], [733, 261, 25, 19, 25, 5], [733, 312, 25, 19, 25, 5], [733, 363, 25, 19, 25, 5], [733, 414, 25, 19, 25, 5], [733, 465, 25, 19, 25, 5], [733, 516, 25, 19, 25, 5], [733, 567, 25, 19, 25, 5], [733, 618, 25, 19, 25, 5], [733, 669, 25, 19, 25, 5], [733, 720, 25, 19, 25, 5], [733, 771, 25, 19, 25, 5], [1, 18, 13, 6, 13, 17], [794, 57, 25, 19, 25, 5], [794, 108, 25, 19, 25, 5], [794, 159, 25, 19, 25, 5], [794, 210, 25, 19, 25, 5], [794, 261, 25, 19, 25, 5], [794, 312, 25, 19, 25, 5], [794, 363, 25, 19, 25, 5], [794, 414, 25, 19, 25, 5], [794, 465, 25, 19, 25, 5], [794, 516, 25, 19, 25, 5], [794, 567, 25, 19, 25, 5], [794, 618, 25, 19, 25, 5], [794, 669, 25, 19, 25, 5], [794, 720, 25, 19, 25, 5], [794, 771, 25, 19, 25, 5], [855, 6, 25, 19, 25, 5], [855, 57, 25, 19, 25, 5], [855, 108, 25, 19, 25, 5], [855, 159, 25, 19, 25, 5], [855, 210, 25, 19, 25, 5], [855, 261, 25, 19, 25, 5], [855, 312, 25, 19, 25, 5], [855, 363, 25, 19, 25, 5], [855, 414, 25, 19, 25, 5], [855, 465, 25, 19, 25, 5], [855, 516, 25, 19, 25, 5], [855, 567, 25, 19, 25, 5], [855, 618, 25, 19, 25, 5], [855, 669, 25, 19, 25, 5], [855, 720, 25, 19, 25, 5], [855, 771, 25, 19, 25, 5]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 27}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 2, \"capHeight\": 22, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 17, 12, 6, 12, 16], [1, 56, 10, 18, 10, 4], [1, 107, 14, 18, 14, 4], [1, 157, 22, 19, 22, 3], [1, 207, 18, 22, 18, 2], [1, 260, 22, 18, 22, 4], [1, 311, 22, 18, 22, 4], [1, 362, 10, 18, 10, 4], [1, 412, 14, 20, 14, 3], [1, 463, 14, 20, 14, 3], [1, 513, 20, 20, 20, 2], [1, 570, 18, 14, 18, 8], [1, 629, 12, 10, 12, 16], [1, 676, 18, 10, 18, 12], [1, 731, 10, 6, 10, 16], [1, 770, 18, 18, 18, 4], [62, 5, 20, 18, 20, 4], [62, 56, 20, 18, 20, 4], [62, 107, 20, 18, 20, 4], [62, 158, 20, 18, 20, 4], [62, 209, 20, 18, 20, 4], [62, 260, 20, 18, 20, 4], [62, 311, 20, 18, 20, 4], [62, 362, 20, 18, 20, 4], [62, 413, 20, 18, 20, 4], [62, 464, 20, 18, 20, 4], [62, 520, 10, 13, 10, 9], [62, 571, 12, 17, 12, 9], [62, 620, 16, 15, 16, 7], [62, 674, 18, 12, 18, 10], [62, 722, 16, 15, 16, 7], [62, 770, 20, 18, 20, 4], [123, 6, 24, 18, 24, 5], [123, 56, 22, 18, 22, 4], [123, 107, 20, 18, 20, 4], [123, 158, 20, 18, 20, 4], [123, 209, 20, 18, 20, 4], [123, 260, 18, 18, 18, 4], [123, 311, 18, 18, 18, 4], [123, 362, 20, 18, 20, 4], [123, 413, 20, 18, 20, 4], [123, 464, 14, 18, 14, 4], [123, 515, 18, 18, 18, 4], [123, 566, 20, 18, 20, 4], [123, 617, 18, 18, 18, 4], [123, 668, 22, 18, 22, 4], [123, 719, 20, 18, 20, 4], [123, 770, 20, 18, 20, 4], [184, 5, 20, 18, 20, 4], [184, 56, 20, 21, 20, 4], [184, 107, 20, 18, 20, 4], [184, 158, 20, 18, 20, 4], [184, 209, 20, 18, 20, 4], [184, 260, 20, 18, 20, 4], [184, 311, 22, 18, 22, 4], [184, 362, 26, 18, 26, 4], [184, 413, 18, 18, 18, 4], [184, 464, 18, 18, 18, 4], [184, 515, 18, 18, 18, 4], [184, 564, 12, 22, 12, 2], [184, 615, 18, 20, 18, 2], [184, 666, 12, 22, 12, 2], [184, 718, 12, 19, 12, 3], [184, 782, 20, 6, 20, 16], [245, 3, 12, 20, 12, 2], [245, 61, 18, 13, 18, 9], [245, 107, 18, 18, 18, 4], [245, 163, 18, 13, 18, 9], [245, 209, 18, 18, 18, 4], [245, 265, 18, 13, 18, 9], [245, 312, 16, 17, 16, 5], [245, 367, 18, 19, 18, 9], [245, 414, 18, 17, 18, 5], [245, 465, 14, 17, 14, 5], [245, 516, 16, 23, 16, 5], [245, 567, 18, 17, 18, 5], [245, 618, 14, 17, 14, 5], [245, 673, 26, 13, 26, 9], [245, 724, 18, 13, 18, 9], [245, 775, 18, 13, 18, 9], [306, 10, 18, 17, 18, 9], [306, 61, 18, 17, 18, 9], [306, 112, 16, 13, 16, 9], [306, 163, 18, 13, 18, 9], [306, 211, 16, 16, 16, 6], [306, 265, 18, 13, 18, 9], [306, 316, 18, 13, 18, 9], [306, 367, 26, 13, 26, 9], [306, 418, 18, 13, 18, 9], [306, 469, 18, 19, 18, 9], [306, 520, 18, 13, 18, 9], [306, 563, 14, 23, 14, 1], [306, 616, 10, 20, 10, 3], [306, 665, 14, 23, 14, 1], [306, 718, 20, 19, 20, 3], [306, 782, 3, 6, 3, 16], [367, 1, 22, 22, 22, 0], [367, 52, 22, 22, 22, 0], [367, 107, 20, 23, 20, 4], [367, 154, 18, 22, 18, 0], [367, 205, 20, 22, 20, 0], [367, 256, 20, 22, 20, 0], [367, 307, 20, 22, 20, 0], [367, 361, 18, 19, 18, 3], [367, 412, 18, 19, 18, 3], [367, 463, 18, 19, 18, 3], [367, 516, 18, 17, 18, 5], [367, 566, 18, 18, 18, 4], [367, 614, 18, 21, 18, 1], [367, 673, 18, 18, 18, 9], [367, 718, 18, 19, 18, 3], [367, 769, 18, 19, 18, 3], [428, 4, 18, 19, 18, 3], [428, 57, 18, 17, 18, 5], [428, 106, 14, 19, 14, 3], [428, 157, 14, 19, 14, 3], [428, 208, 14, 19, 14, 3], [428, 261, 14, 17, 14, 5], [428, 311, 18, 18, 18, 4], [428, 361, 18, 19, 18, 3], [428, 412, 18, 19, 18, 3], [428, 463, 18, 19, 18, 3], [428, 516, 18, 17, 18, 5], [428, 566, 18, 18, 18, 4], [428, 616, 18, 19, 18, 3], [428, 667, 18, 19, 18, 3], [428, 718, 18, 19, 18, 3], [428, 771, 18, 17, 18, 5], [489, 5, 14, 18, 14, 4], [489, 55, 16, 19, 16, 3], [489, 107, 18, 18, 18, 4], [489, 158, 20, 18, 20, 4], [489, 209, 20, 22, 20, 4], [489, 266, 20, 12, 20, 10], [489, 311, 20, 22, 20, 4], [489, 362, 22, 18, 22, 4], [489, 415, 24, 17, 24, 6], [489, 466, 24, 17, 24, 6], [489, 515, 26, 18, 26, 4], [489, 564, 12, 20, 12, 2], [489, 617, 14, 18, 14, 4], [489, 672, 20, 14, 20, 8], [489, 719, 28, 18, 28, 4], [489, 770, 20, 18, 20, 4], [550, 11, 26, 12, 26, 10], [550, 60, 18, 14, 18, 8], [550, 109, 16, 16, 16, 6], [550, 160, 16, 16, 16, 6], [550, 209, 18, 18, 18, 4], [550, 264, 22, 18, 22, 8], [550, 312, 18, 17, 18, 5], [550, 362, 20, 24, 20, 4], [550, 413, 22, 24, 22, 4], [550, 468, 24, 14, 24, 8], [550, 513, 14, 25, 14, 2], [550, 566, 16, 18, 16, 4], [550, 617, 16, 18, 16, 4], [550, 668, 24, 18, 24, 4], [550, 724, 26, 13, 26, 9], [550, 775, 18, 13, 18, 9], [611, 5, 20, 18, 20, 4], [611, 56, 12, 18, 12, 4], [611, 115, 18, 10, 18, 12], [611, 155, 24, 25, 24, 1], [611, 209, 14, 22, 14, 4], [611, 264, 20, 14, 20, 8], [611, 309, 22, 20, 22, 2], [611, 367, 20, 13, 20, 9], [611, 418, 20, 13, 20, 9], [611, 476, 24, 6, 24, 16], [611, 527, 20, 6, 20, 16], [611, 562, 22, 22, 22, 0], [611, 613, 22, 22, 22, 0], [611, 664, 20, 22, 20, 0], [611, 719, 28, 18, 28, 4], [611, 775, 26, 13, 26, 9], [672, 15, 16, 8, 16, 14], [672, 66, 22, 8, 22, 14], [672, 106, 18, 19, 18, 3], [672, 158, 18, 18, 18, 4], [672, 208, 12, 19, 12, 3], [672, 260, 12, 18, 12, 4], [672, 314, 18, 15, 18, 7], [672, 362, 22, 18, 22, 4], [672, 414, 18, 23, 18, 5], [1, 17, 12, 6, 12, 16], [794, 771, 24, 17, 24, 5], [672, 567, 24, 17, 24, 5], [672, 618, 24, 17, 24, 5], [672, 669, 24, 17, 24, 5], [672, 720, 24, 17, 24, 5], [672, 771, 24, 17, 24, 5], [733, 6, 24, 17, 24, 5], [733, 57, 24, 17, 24, 5], [733, 108, 24, 17, 24, 5], [733, 159, 24, 17, 24, 5], [733, 210, 24, 17, 24, 5], [733, 261, 24, 17, 24, 5], [733, 312, 24, 17, 24, 5], [733, 363, 24, 17, 24, 5], [733, 414, 24, 17, 24, 5], [733, 465, 24, 17, 24, 5], [733, 516, 24, 17, 24, 5], [733, 567, 24, 17, 24, 5], [733, 618, 24, 17, 24, 5], [733, 669, 24, 17, 24, 5], [733, 720, 24, 17, 24, 5], [733, 771, 24, 17, 24, 5], [1, 17, 12, 6, 12, 16], [794, 57, 24, 17, 24, 5], [794, 108, 24, 17, 24, 5], [794, 159, 24, 17, 24, 5], [794, 210, 24, 17, 24, 5], [794, 261, 24, 17, 24, 5], [794, 312, 24, 17, 24, 5], [794, 363, 24, 17, 24, 5], [794, 414, 24, 17, 24, 5], [794, 465, 24, 17, 24, 5], [794, 516, 24, 17, 24, 5], [794, 567, 24, 17, 24, 5], [794, 618, 24, 17, 24, 5], [794, 669, 24, 17, 24, 5], [794, 720, 24, 17, 24, 5], [794, 771, 24, 17, 24, 5], [855, 6, 24, 17, 24, 5], [855, 57, 24, 17, 24, 5], [855, 108, 24, 17, 24, 5], [855, 159, 24, 17, 24, 5], [855, 210, 24, 17, 24, 5], [855, 261, 24, 17, 24, 5], [855, 312, 24, 17, 24, 5], [855, 363, 24, 17, 24, 5], [855, 414, 24, 17, 24, 5], [855, 465, 24, 17, 24, 5], [855, 516, 24, 17, 24, 5], [855, 567, 24, 17, 24, 5], [855, 618, 24, 17, 24, 5], [855, 669, 24, 17, 24, 5], [855, 720, 24, 17, 24, 5], [855, 771, 24, 17, 24, 5]], \"widestlogicalchar\": 28, \"widestglyph\": 28, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 56, 19, 20, 10, 4], [1, 107, 23, 8, 14, 4], [1, 157, 31, 18, 22, 3], [1, 207, 27, 24, 18, 2], [1, 260, 31, 20, 22, 4], [1, 311, 25, 20, 22, 4], [1, 362, 19, 8, 10, 4], [1, 412, 23, 22, 14, 3], [1, 463, 20, 22, 14, 3], [1, 513, 29, 15, 20, 2], [1, 570, 23, 12, 18, 8], [1, 633, 12, 8, 12, 20], [1, 676, 23, 4, 18, 12], [1, 734, 12, 5, 10, 19], [1, 770, 27, 20, 18, 4], [62, 5, 27, 20, 20, 4], [62, 56, 24, 20, 20, 4], [62, 107, 28, 20, 20, 4], [62, 158, 27, 20, 20, 4], [62, 209, 28, 20, 20, 4], [62, 260, 28, 20, 20, 4], [62, 311, 27, 20, 20, 4], [62, 362, 29, 20, 20, 4], [62, 413, 27, 20, 20, 4], [62, 464, 27, 20, 20, 4], [62, 520, 17, 15, 10, 9], [62, 571, 18, 19, 12, 9], [62, 620, 24, 15, 16, 7], [62, 674, 24, 8, 18, 10], [62, 722, 21, 15, 16, 7], [62, 770, 27, 20, 20, 4], [123, 6, 30, 20, 24, 5], [123, 56, 25, 20, 22, 4], [123, 107, 28, 20, 20, 4], [123, 158, 28, 20, 20, 4], [123, 209, 28, 20, 20, 4], [123, 260, 27, 20, 18, 4], [123, 311, 27, 20, 18, 4], [123, 362, 29, 20, 20, 4], [123, 413, 29, 20, 20, 4], [123, 464, 21, 20, 14, 4], [123, 515, 27, 20, 18, 4], [123, 566, 28, 20, 20, 4], [123, 617, 19, 20, 18, 4], [123, 668, 31, 20, 22, 4], [123, 719, 29, 20, 20, 4], [123, 770, 28, 20, 20, 4], [184, 5, 27, 20, 20, 4], [184, 56, 28, 23, 20, 4], [184, 107, 27, 20, 20, 4], [184, 158, 27, 20, 20, 4], [184, 209, 30, 20, 20, 4], [184, 260, 29, 20, 20, 4], [184, 311, 31, 20, 22, 4], [184, 362, 36, 20, 26, 4], [184, 413, 28, 20, 18, 4], [184, 464, 28, 20, 18, 4], [184, 515, 28, 20, 18, 4], [184, 564, 22, 24, 12, 2], [184, 615, 19, 22, 18, 2], [184, 666, 22, 24, 12, 2], [184, 718, 20, 11, 12, 3], [184, 786, 23, 4, 20, 20], [245, 3, 21, 7, 12, 2], [245, 61, 24, 15, 18, 9], [245, 107, 23, 20, 18, 4], [245, 163, 24, 15, 18, 9], [245, 209, 27, 20, 18, 4], [245, 265, 23, 15, 18, 9], [245, 312, 24, 19, 16, 5], [245, 367, 25, 21, 18, 9], [245, 414, 24, 19, 18, 5], [245, 465, 21, 19, 14, 5], [245, 516, 23, 25, 16, 5], [245, 567, 24, 19, 18, 5], [245, 618, 21, 19, 14, 5], [245, 673, 32, 15, 26, 9], [245, 724, 24, 15, 18, 9], [245, 775, 23, 15, 18, 9], [306, 10, 23, 19, 18, 9], [306, 61, 25, 19, 18, 9], [306, 112, 23, 15, 16, 9], [306, 163, 24, 15, 18, 9], [306, 211, 22, 18, 16, 6], [306, 265, 25, 15, 18, 9], [306, 316, 26, 15, 18, 9], [306, 367, 33, 15, 26, 9], [306, 418, 26, 15, 18, 9], [306, 469, 26, 21, 18, 9], [306, 520, 26, 15, 18, 9], [306, 563, 24, 25, 14, 1], [306, 616, 20, 22, 10, 3], [306, 665, 22, 25, 14, 1], [306, 718, 30, 6, 20, 3], [306, 766, 1, 1, 3, 1], [367, 1, 28, 24, 22, 0], [367, 52, 28, 24, 22, 0], [367, 107, 28, 25, 20, 4], [367, 154, 27, 24, 18, 0], [367, 205, 29, 24, 20, 0], [367, 256, 28, 24, 20, 0], [367, 307, 29, 24, 20, 0], [367, 361, 26, 21, 18, 3], [367, 412, 24, 21, 18, 3], [367, 463, 25, 21, 18, 3], [367, 516, 25, 19, 18, 5], [367, 566, 26, 20, 18, 4], [367, 614, 26, 23, 18, 1], [367, 673, 24, 20, 18, 9], [367, 718, 26, 21, 18, 3], [367, 769, 23, 21, 18, 3], [428, 4, 25, 21, 18, 3], [428, 57, 25, 19, 18, 5], [428, 106, 24, 21, 14, 3], [428, 157, 20, 21, 14, 3], [428, 208, 23, 21, 14, 3], [428, 261, 23, 19, 14, 5], [428, 311, 26, 20, 18, 4], [428, 361, 26, 21, 18, 3], [428, 412, 23, 21, 18, 3], [428, 463, 25, 21, 18, 3], [428, 516, 25, 19, 18, 5], [428, 566, 26, 20, 18, 4], [428, 616, 26, 21, 18, 3], [428, 667, 25, 21, 18, 3], [428, 718, 25, 21, 18, 3], [428, 771, 25, 19, 18, 5], [489, 5, 24, 19, 14, 4], [489, 55, 24, 9, 16, 3], [489, 107, 26, 20, 18, 4], [489, 158, 28, 20, 20, 4], [489, 209, 28, 24, 20, 4], [489, 266, 24, 12, 20, 10], [489, 311, 30, 24, 20, 4], [489, 362, 28, 20, 22, 4], [489, 415, 30, 19, 24, 6], [489, 466, 30, 19, 24, 6], [489, 515, 34, 11, 26, 4], [489, 564, 22, 7, 12, 2], [489, 617, 23, 4, 14, 4], [489, 672, 26, 12, 20, 8], [489, 719, 38, 20, 28, 4], [489, 770, 30, 20, 20, 4], [550, 11, 31, 11, 26, 10], [550, 60, 23, 16, 18, 8], [550, 109, 24, 18, 16, 6], [550, 160, 22, 18, 16, 6], [550, 209, 28, 20, 18, 4], [550, 264, 29, 20, 22, 8], [550, 312, 24, 19, 18, 5], [550, 362, 29, 26, 20, 4], [550, 413, 31, 26, 22, 4], [550, 468, 30, 16, 24, 8], [550, 513, 24, 27, 14, 2], [550, 566, 25, 12, 16, 4], [550, 617, 24, 12, 16, 4], [550, 668, 31, 20, 24, 4], [550, 724, 31, 15, 26, 9], [550, 775, 25, 15, 18, 9], [611, 5, 24, 20, 20, 4], [611, 56, 20, 20, 12, 4], [611, 115, 23, 8, 18, 12], [611, 155, 34, 27, 24, 1], [611, 209, 24, 24, 14, 4], [611, 264, 27, 11, 20, 8], [611, 309, 25, 22, 22, 2], [611, 367, 27, 15, 20, 9], [611, 418, 24, 15, 20, 9], [611, 480, 25, 4, 24, 20], [611, 511, 1, 1, 20, 1], [611, 562, 26, 24, 22, 0], [611, 613, 29, 24, 22, 0], [611, 664, 28, 24, 20, 0], [611, 719, 37, 20, 28, 4], [611, 775, 31, 15, 26, 9], [672, 15, 20, 4, 16, 14], [672, 66, 26, 4, 22, 14], [672, 106, 26, 8, 18, 3], [672, 158, 25, 8, 18, 4], [672, 208, 21, 8, 12, 3], [672, 260, 20, 8, 12, 4], [672, 314, 24, 14, 18, 7], [672, 362, 28, 19, 22, 4], [672, 414, 26, 25, 18, 5], [1, 1, 1, 1, 12, 1], [794, 771, 33, 19, 24, 5], [672, 567, 33, 19, 24, 5], [672, 618, 33, 19, 24, 5], [672, 669, 33, 19, 24, 5], [672, 720, 33, 19, 24, 5], [672, 771, 33, 19, 24, 5], [733, 6, 33, 19, 24, 5], [733, 57, 33, 19, 24, 5], [733, 108, 33, 19, 24, 5], [733, 159, 33, 19, 24, 5], [733, 210, 33, 19, 24, 5], [733, 261, 33, 19, 24, 5], [733, 312, 33, 19, 24, 5], [733, 363, 33, 19, 24, 5], [733, 414, 33, 19, 24, 5], [733, 465, 33, 19, 24, 5], [733, 516, 33, 19, 24, 5], [733, 567, 33, 19, 24, 5], [733, 618, 33, 19, 24, 5], [733, 669, 33, 19, 24, 5], [733, 720, 33, 19, 24, 5], [733, 771, 33, 19, 24, 5], [1, 1, 1, 1, 12, 1], [794, 57, 33, 19, 24, 5], [794, 108, 33, 19, 24, 5], [794, 159, 33, 19, 24, 5], [794, 210, 33, 19, 24, 5], [794, 261, 33, 19, 24, 5], [794, 312, 33, 19, 24, 5], [794, 363, 33, 19, 24, 5], [794, 414, 33, 19, 24, 5], [794, 465, 33, 19, 24, 5], [794, 516, 33, 19, 24, 5], [794, 567, 33, 19, 24, 5], [794, 618, 33, 19, 24, 5], [794, 669, 33, 19, 24, 5], [794, 720, 33, 19, 24, 5], [794, 771, 33, 19, 24, 5], [855, 6, 33, 19, 24, 5], [855, 57, 33, 19, 24, 5], [855, 108, 33, 19, 24, 5], [855, 159, 33, 19, 24, 5], [855, 210, 33, 19, 24, 5], [855, 261, 33, 19, 24, 5], [855, 312, 33, 19, 24, 5], [855, 363, 33, 19, 24, 5], [855, 414, 33, 19, 24, 5], [855, 465, 33, 19, 24, 5], [855, 516, 33, 19, 24, 5], [855, 567, 33, 19, 24, 5], [855, 618, 33, 19, 24, 5], [855, 669, 33, 19, 24, 5], [855, 720, 33, 19, 24, 5], [855, 771, 33, 19, 24, 5]], \"capHeight\": 23, \"widestlogicalchar\": 28, \"widestglyph\": 38, \"tallestglyph\": 27}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 56, 18, 18, 9, 4], [1, 107, 22, 6, 13, 4], [1, 157, 30, 16, 21, 3], [1, 207, 26, 22, 17, 2], [1, 260, 30, 18, 21, 4], [1, 311, 24, 18, 21, 4], [1, 362, 18, 6, 9, 4], [1, 412, 22, 20, 13, 3], [1, 463, 19, 20, 13, 3], [1, 513, 28, 13, 19, 2], [1, 570, 22, 10, 17, 8], [1, 633, 11, 6, 11, 20], [1, 676, 22, 2, 17, 12], [1, 734, 11, 3, 9, 19], [1, 770, 26, 18, 17, 4], [62, 5, 26, 18, 19, 4], [62, 56, 23, 18, 19, 4], [62, 107, 27, 18, 19, 4], [62, 158, 26, 18, 19, 4], [62, 209, 27, 18, 19, 4], [62, 260, 27, 18, 19, 4], [62, 311, 26, 18, 19, 4], [62, 362, 28, 18, 19, 4], [62, 413, 26, 18, 19, 4], [62, 464, 26, 18, 19, 4], [62, 520, 16, 13, 9, 9], [62, 571, 17, 17, 11, 9], [62, 620, 23, 13, 15, 7], [62, 674, 23, 6, 17, 10], [62, 722, 20, 13, 15, 7], [62, 770, 26, 18, 19, 4], [123, 6, 29, 18, 23, 5], [123, 56, 24, 18, 21, 4], [123, 107, 27, 18, 19, 4], [123, 158, 27, 18, 19, 4], [123, 209, 27, 18, 19, 4], [123, 260, 26, 18, 17, 4], [123, 311, 26, 18, 17, 4], [123, 362, 28, 18, 19, 4], [123, 413, 28, 18, 19, 4], [123, 464, 20, 18, 13, 4], [123, 515, 26, 18, 17, 4], [123, 566, 27, 18, 19, 4], [123, 617, 18, 18, 17, 4], [123, 668, 30, 18, 21, 4], [123, 719, 28, 18, 19, 4], [123, 770, 27, 18, 19, 4], [184, 5, 26, 18, 19, 4], [184, 56, 27, 21, 19, 4], [184, 107, 26, 18, 19, 4], [184, 158, 26, 18, 19, 4], [184, 209, 29, 18, 19, 4], [184, 260, 28, 18, 19, 4], [184, 311, 30, 18, 21, 4], [184, 362, 35, 18, 25, 4], [184, 413, 27, 18, 17, 4], [184, 464, 27, 18, 17, 4], [184, 515, 27, 18, 17, 4], [184, 564, 21, 22, 11, 2], [184, 615, 18, 20, 17, 2], [184, 666, 21, 22, 11, 2], [184, 718, 19, 9, 11, 3], [184, 786, 22, 2, 19, 20], [245, 3, 20, 5, 11, 2], [245, 61, 23, 13, 17, 9], [245, 107, 22, 18, 17, 4], [245, 163, 23, 13, 17, 9], [245, 209, 26, 18, 17, 4], [245, 265, 22, 13, 17, 9], [245, 312, 23, 17, 15, 5], [245, 367, 24, 19, 17, 9], [245, 414, 23, 17, 17, 5], [245, 465, 20, 17, 13, 5], [245, 516, 22, 23, 15, 5], [245, 567, 23, 17, 17, 5], [245, 618, 20, 17, 13, 5], [245, 673, 31, 13, 25, 9], [245, 724, 23, 13, 17, 9], [245, 775, 22, 13, 17, 9], [306, 10, 22, 17, 17, 9], [306, 61, 24, 17, 17, 9], [306, 112, 22, 13, 15, 9], [306, 163, 23, 13, 17, 9], [306, 211, 21, 16, 15, 6], [306, 265, 24, 13, 17, 9], [306, 316, 25, 13, 17, 9], [306, 367, 32, 13, 25, 9], [306, 418, 25, 13, 17, 9], [306, 469, 25, 19, 17, 9], [306, 520, 25, 13, 17, 9], [306, 563, 23, 23, 13, 1], [306, 616, 19, 20, 9, 3], [306, 665, 21, 23, 13, 1], [306, 718, 29, 4, 19, 3], [306, 766, 1, 1, 3, 1], [367, 1, 27, 22, 21, 0], [367, 52, 27, 22, 21, 0], [367, 107, 27, 23, 19, 4], [367, 154, 26, 22, 17, 0], [367, 205, 28, 22, 19, 0], [367, 256, 27, 22, 19, 0], [367, 307, 28, 22, 19, 0], [367, 361, 25, 19, 17, 3], [367, 412, 23, 19, 17, 3], [367, 463, 24, 19, 17, 3], [367, 516, 24, 17, 17, 5], [367, 566, 25, 18, 17, 4], [367, 614, 25, 21, 17, 1], [367, 673, 23, 18, 17, 9], [367, 718, 25, 19, 17, 3], [367, 769, 22, 19, 17, 3], [428, 4, 24, 19, 17, 3], [428, 57, 24, 17, 17, 5], [428, 106, 23, 19, 13, 3], [428, 157, 19, 19, 13, 3], [428, 208, 22, 19, 13, 3], [428, 261, 22, 17, 13, 5], [428, 311, 25, 18, 17, 4], [428, 361, 25, 19, 17, 3], [428, 412, 22, 19, 17, 3], [428, 463, 24, 19, 17, 3], [428, 516, 24, 17, 17, 5], [428, 566, 25, 18, 17, 4], [428, 616, 25, 19, 17, 3], [428, 667, 24, 19, 17, 3], [428, 718, 24, 19, 17, 3], [428, 771, 24, 17, 17, 5], [489, 5, 23, 17, 13, 4], [489, 55, 23, 7, 15, 3], [489, 107, 25, 18, 17, 4], [489, 158, 27, 18, 19, 4], [489, 209, 27, 22, 19, 4], [489, 266, 23, 10, 19, 10], [489, 311, 29, 22, 19, 4], [489, 362, 27, 18, 21, 4], [489, 415, 29, 17, 23, 6], [489, 466, 29, 17, 23, 6], [489, 515, 33, 9, 25, 4], [489, 564, 21, 5, 11, 2], [489, 617, 22, 2, 13, 4], [489, 672, 25, 10, 19, 8], [489, 719, 37, 18, 27, 4], [489, 770, 29, 18, 19, 4], [550, 11, 30, 9, 25, 10], [550, 60, 22, 14, 17, 8], [550, 109, 23, 16, 15, 6], [550, 160, 21, 16, 15, 6], [550, 209, 27, 18, 17, 4], [550, 264, 28, 18, 21, 8], [550, 312, 23, 17, 17, 5], [550, 362, 28, 24, 19, 4], [550, 413, 30, 24, 21, 4], [550, 468, 29, 14, 23, 8], [550, 513, 23, 25, 13, 2], [550, 566, 24, 10, 15, 4], [550, 617, 23, 10, 15, 4], [550, 668, 30, 18, 23, 4], [550, 724, 30, 13, 25, 9], [550, 775, 24, 13, 17, 9], [611, 5, 23, 18, 19, 4], [611, 56, 19, 18, 11, 4], [611, 115, 22, 6, 17, 12], [611, 156, 33, 24, 23, 2], [611, 209, 23, 22, 13, 4], [611, 264, 26, 9, 19, 8], [611, 309, 24, 20, 21, 2], [611, 367, 26, 13, 19, 9], [611, 418, 23, 13, 19, 9], [611, 480, 24, 2, 23, 20], [611, 511, 1, 1, 19, 1], [611, 562, 25, 22, 21, 0], [611, 613, 28, 22, 21, 0], [611, 664, 27, 22, 19, 0], [611, 719, 36, 18, 27, 4], [611, 775, 30, 13, 25, 9], [672, 15, 19, 2, 15, 14], [672, 66, 25, 2, 21, 14], [672, 106, 25, 6, 17, 3], [672, 158, 24, 6, 17, 4], [672, 208, 20, 6, 11, 3], [672, 260, 19, 6, 11, 4], [672, 314, 23, 12, 17, 7], [672, 362, 27, 17, 21, 4], [672, 414, 25, 23, 17, 5], [1, 1, 1, 1, 11, 1], [794, 771, 32, 17, 23, 5], [672, 567, 32, 17, 23, 5], [672, 618, 32, 17, 23, 5], [672, 669, 32, 17, 23, 5], [672, 720, 32, 17, 23, 5], [672, 771, 32, 17, 23, 5], [733, 6, 32, 17, 23, 5], [733, 57, 32, 17, 23, 5], [733, 108, 32, 17, 23, 5], [733, 159, 32, 17, 23, 5], [733, 210, 32, 17, 23, 5], [733, 261, 32, 17, 23, 5], [733, 312, 32, 17, 23, 5], [733, 363, 32, 17, 23, 5], [733, 414, 32, 17, 23, 5], [733, 465, 32, 17, 23, 5], [733, 516, 32, 17, 23, 5], [733, 567, 32, 17, 23, 5], [733, 618, 32, 17, 23, 5], [733, 669, 32, 17, 23, 5], [733, 720, 32, 17, 23, 5], [733, 771, 32, 17, 23, 5], [1, 1, 1, 1, 11, 1], [794, 57, 32, 17, 23, 5], [794, 108, 32, 17, 23, 5], [794, 159, 32, 17, 23, 5], [794, 210, 32, 17, 23, 5], [794, 261, 32, 17, 23, 5], [794, 312, 32, 17, 23, 5], [794, 363, 32, 17, 23, 5], [794, 414, 32, 17, 23, 5], [794, 465, 32, 17, 23, 5], [794, 516, 32, 17, 23, 5], [794, 567, 32, 17, 23, 5], [794, 618, 32, 17, 23, 5], [794, 669, 32, 17, 23, 5], [794, 720, 32, 17, 23, 5], [794, 771, 32, 17, 23, 5], [855, 6, 32, 17, 23, 5], [855, 57, 32, 17, 23, 5], [855, 108, 32, 17, 23, 5], [855, 159, 32, 17, 23, 5], [855, 210, 32, 17, 23, 5], [855, 261, 32, 17, 23, 5], [855, 312, 32, 17, 23, 5], [855, 363, 32, 17, 23, 5], [855, 414, 32, 17, 23, 5], [855, 465, 32, 17, 23, 5], [855, 516, 32, 17, 23, 5], [855, 567, 32, 17, 23, 5], [855, 618, 32, 17, 23, 5], [855, 669, 32, 17, 23, 5], [855, 720, 32, 17, 23, 5], [855, 771, 32, 17, 23, 5]], \"capHeight\": 22, \"widestlogicalchar\": 27, \"widestglyph\": 37, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 1, \"capHeight\": 23, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 18, 12, 6, 12, 17], [1, 56, 10, 20, 10, 4], [1, 107, 14, 19, 14, 4], [1, 157, 22, 20, 22, 3], [1, 207, 18, 24, 18, 2], [1, 260, 22, 20, 22, 4], [1, 311, 22, 20, 22, 4], [1, 362, 10, 19, 10, 4], [1, 412, 14, 22, 14, 3], [1, 463, 14, 22, 14, 3], [1, 513, 20, 21, 20, 2], [1, 570, 18, 15, 18, 8], [1, 630, 12, 11, 12, 17], [1, 676, 18, 11, 18, 12], [1, 732, 10, 7, 10, 17], [1, 770, 18, 20, 18, 4], [62, 5, 20, 20, 20, 4], [62, 56, 20, 20, 20, 4], [62, 107, 20, 20, 20, 4], [62, 158, 20, 20, 20, 4], [62, 209, 20, 20, 20, 4], [62, 260, 20, 20, 20, 4], [62, 311, 20, 20, 20, 4], [62, 362, 20, 20, 20, 4], [62, 413, 20, 20, 20, 4], [62, 464, 20, 20, 20, 4], [62, 520, 10, 15, 10, 9], [62, 571, 12, 19, 12, 9], [62, 620, 16, 16, 16, 7], [62, 674, 18, 13, 18, 10], [62, 722, 16, 16, 16, 7], [62, 770, 20, 20, 20, 4], [123, 6, 24, 20, 24, 5], [123, 56, 22, 20, 22, 4], [123, 107, 20, 20, 20, 4], [123, 158, 20, 20, 20, 4], [123, 209, 20, 20, 20, 4], [123, 260, 18, 20, 18, 4], [123, 311, 18, 20, 18, 4], [123, 362, 20, 20, 20, 4], [123, 413, 20, 20, 20, 4], [123, 464, 14, 20, 14, 4], [123, 515, 18, 20, 18, 4], [123, 566, 20, 20, 20, 4], [123, 617, 18, 20, 18, 4], [123, 668, 22, 20, 22, 4], [123, 719, 20, 20, 20, 4], [123, 770, 20, 20, 20, 4], [184, 5, 20, 20, 20, 4], [184, 56, 20, 23, 20, 4], [184, 107, 20, 20, 20, 4], [184, 158, 20, 20, 20, 4], [184, 209, 20, 20, 20, 4], [184, 260, 20, 20, 20, 4], [184, 311, 22, 20, 22, 4], [184, 362, 26, 20, 26, 4], [184, 413, 18, 20, 18, 4], [184, 464, 18, 20, 18, 4], [184, 515, 18, 20, 18, 4], [184, 564, 12, 24, 12, 2], [184, 615, 18, 22, 18, 2], [184, 666, 12, 24, 12, 2], [184, 718, 12, 20, 12, 3], [184, 783, 20, 7, 20, 17], [245, 3, 12, 21, 12, 2], [245, 61, 18, 15, 18, 9], [245, 107, 18, 20, 18, 4], [245, 163, 18, 15, 18, 9], [245, 209, 18, 20, 18, 4], [245, 265, 18, 15, 18, 9], [245, 312, 16, 19, 16, 5], [245, 367, 18, 21, 18, 9], [245, 414, 18, 19, 18, 5], [245, 465, 14, 19, 14, 5], [245, 516, 16, 25, 16, 5], [245, 567, 18, 19, 18, 5], [245, 618, 14, 19, 14, 5], [245, 673, 26, 15, 26, 9], [245, 724, 18, 15, 18, 9], [245, 775, 18, 15, 18, 9], [306, 10, 18, 19, 18, 9], [306, 61, 18, 19, 18, 9], [306, 112, 16, 15, 16, 9], [306, 163, 18, 15, 18, 9], [306, 211, 16, 18, 16, 6], [306, 265, 18, 15, 18, 9], [306, 316, 18, 15, 18, 9], [306, 367, 26, 15, 26, 9], [306, 418, 18, 15, 18, 9], [306, 469, 18, 21, 18, 9], [306, 520, 18, 15, 18, 9], [306, 563, 14, 25, 14, 1], [306, 616, 10, 22, 10, 3], [306, 665, 14, 25, 14, 1], [306, 718, 20, 20, 20, 3], [306, 783, 3, 6, 3, 17], [367, 1, 22, 24, 22, 0], [367, 52, 22, 24, 22, 0], [367, 107, 20, 25, 20, 4], [367, 154, 18, 24, 18, 0], [367, 205, 20, 24, 20, 0], [367, 256, 20, 24, 20, 0], [367, 307, 20, 24, 20, 0], [367, 361, 18, 21, 18, 3], [367, 412, 18, 21, 18, 3], [367, 463, 18, 21, 18, 3], [367, 516, 18, 19, 18, 5], [367, 566, 18, 20, 18, 4], [367, 614, 18, 23, 18, 1], [367, 673, 18, 20, 18, 9], [367, 718, 18, 21, 18, 3], [367, 769, 18, 21, 18, 3], [428, 4, 18, 21, 18, 3], [428, 57, 18, 19, 18, 5], [428, 106, 14, 21, 14, 3], [428, 157, 14, 21, 14, 3], [428, 208, 14, 21, 14, 3], [428, 261, 14, 19, 14, 5], [428, 311, 18, 20, 18, 4], [428, 361, 18, 21, 18, 3], [428, 412, 18, 21, 18, 3], [428, 463, 18, 21, 18, 3], [428, 516, 18, 19, 18, 5], [428, 566, 18, 20, 18, 4], [428, 616, 18, 21, 18, 3], [428, 667, 18, 21, 18, 3], [428, 718, 18, 21, 18, 3], [428, 771, 18, 19, 18, 5], [489, 5, 14, 19, 14, 4], [489, 55, 16, 20, 16, 3], [489, 107, 18, 20, 18, 4], [489, 158, 20, 20, 20, 4], [489, 209, 20, 24, 20, 4], [489, 266, 20, 13, 20, 10], [489, 311, 20, 24, 20, 4], [489, 362, 22, 20, 22, 4], [489, 415, 24, 19, 24, 6], [489, 466, 24, 19, 24, 6], [489, 515, 26, 19, 26, 4], [489, 564, 12, 21, 12, 2], [489, 617, 14, 19, 14, 4], [489, 672, 20, 15, 20, 8], [489, 719, 28, 20, 28, 4], [489, 770, 20, 20, 20, 4], [550, 11, 26, 13, 26, 10], [550, 60, 18, 16, 18, 8], [550, 109, 16, 18, 16, 6], [550, 160, 16, 18, 16, 6], [550, 209, 18, 20, 18, 4], [550, 264, 22, 20, 22, 8], [550, 312, 18, 19, 18, 5], [550, 362, 20, 26, 20, 4], [550, 413, 22, 26, 22, 4], [550, 468, 24, 16, 24, 8], [550, 513, 14, 27, 14, 2], [550, 566, 16, 19, 16, 4], [550, 617, 16, 19, 16, 4], [550, 668, 24, 20, 24, 4], [550, 724, 26, 15, 26, 9], [550, 775, 18, 15, 18, 9], [611, 5, 20, 20, 20, 4], [611, 56, 12, 20, 12, 4], [611, 115, 18, 11, 18, 12], [611, 155, 24, 27, 24, 1], [611, 209, 14, 24, 14, 4], [611, 264, 20, 15, 20, 8], [611, 309, 22, 22, 22, 2], [611, 367, 20, 15, 20, 9], [611, 418, 20, 15, 20, 9], [611, 477, 24, 7, 24, 17], [611, 528, 20, 6, 20, 17], [611, 562, 22, 24, 22, 0], [611, 613, 22, 24, 22, 0], [611, 664, 20, 24, 20, 0], [611, 719, 28, 20, 28, 4], [611, 775, 26, 15, 26, 9], [672, 15, 16, 9, 16, 14], [672, 66, 22, 9, 22, 14], [672, 106, 18, 20, 18, 3], [672, 158, 18, 19, 18, 4], [672, 208, 12, 20, 12, 3], [672, 260, 12, 19, 12, 4], [672, 314, 18, 16, 18, 7], [672, 362, 22, 19, 22, 4], [672, 414, 18, 25, 18, 5], [1, 18, 12, 6, 12, 17], [794, 771, 24, 19, 24, 5], [672, 567, 24, 19, 24, 5], [672, 618, 24, 19, 24, 5], [672, 669, 24, 19, 24, 5], [672, 720, 24, 19, 24, 5], [672, 771, 24, 19, 24, 5], [733, 6, 24, 19, 24, 5], [733, 57, 24, 19, 24, 5], [733, 108, 24, 19, 24, 5], [733, 159, 24, 19, 24, 5], [733, 210, 24, 19, 24, 5], [733, 261, 24, 19, 24, 5], [733, 312, 24, 19, 24, 5], [733, 363, 24, 19, 24, 5], [733, 414, 24, 19, 24, 5], [733, 465, 24, 19, 24, 5], [733, 516, 24, 19, 24, 5], [733, 567, 24, 19, 24, 5], [733, 618, 24, 19, 24, 5], [733, 669, 24, 19, 24, 5], [733, 720, 24, 19, 24, 5], [733, 771, 24, 19, 24, 5], [1, 18, 12, 6, 12, 17], [794, 57, 24, 19, 24, 5], [794, 108, 24, 19, 24, 5], [794, 159, 24, 19, 24, 5], [794, 210, 24, 19, 24, 5], [794, 261, 24, 19, 24, 5], [794, 312, 24, 19, 24, 5], [794, 363, 24, 19, 24, 5], [794, 414, 24, 19, 24, 5], [794, 465, 24, 19, 24, 5], [794, 516, 24, 19, 24, 5], [794, 567, 24, 19, 24, 5], [794, 618, 24, 19, 24, 5], [794, 669, 24, 19, 24, 5], [794, 720, 24, 19, 24, 5], [794, 771, 24, 19, 24, 5], [855, 6, 24, 19, 24, 5], [855, 57, 24, 19, 24, 5], [855, 108, 24, 19, 24, 5], [855, 159, 24, 19, 24, 5], [855, 210, 24, 19, 24, 5], [855, 261, 24, 19, 24, 5], [855, 312, 24, 19, 24, 5], [855, 363, 24, 19, 24, 5], [855, 414, 24, 19, 24, 5], [855, 465, 24, 19, 24, 5], [855, 516, 24, 19, 24, 5], [855, 567, 24, 19, 24, 5], [855, 618, 24, 19, 24, 5], [855, 669, 24, 19, 24, 5], [855, 720, 24, 19, 24, 5], [855, 771, 24, 19, 24, 5]], \"widestlogicalchar\": 28, \"widestglyph\": 28, \"tallestglyph\": 27}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 2, \"capHeight\": 22, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 17, 11, 6, 11, 16], [1, 56, 9, 18, 9, 4], [1, 107, 13, 18, 13, 4], [1, 157, 21, 19, 21, 3], [1, 207, 17, 22, 17, 2], [1, 260, 21, 18, 21, 4], [1, 311, 21, 18, 21, 4], [1, 362, 9, 18, 9, 4], [1, 412, 13, 20, 13, 3], [1, 463, 13, 20, 13, 3], [1, 513, 19, 20, 19, 2], [1, 570, 17, 14, 17, 8], [1, 629, 11, 10, 11, 16], [1, 676, 17, 10, 17, 12], [1, 731, 9, 6, 9, 16], [1, 770, 17, 18, 17, 4], [62, 5, 19, 18, 19, 4], [62, 56, 19, 18, 19, 4], [62, 107, 19, 18, 19, 4], [62, 158, 19, 18, 19, 4], [62, 209, 19, 18, 19, 4], [62, 260, 19, 18, 19, 4], [62, 311, 19, 18, 19, 4], [62, 362, 19, 18, 19, 4], [62, 413, 19, 18, 19, 4], [62, 464, 19, 18, 19, 4], [62, 520, 9, 13, 9, 9], [62, 571, 11, 17, 11, 9], [62, 620, 15, 15, 15, 7], [62, 674, 17, 12, 17, 10], [62, 722, 15, 15, 15, 7], [62, 770, 19, 18, 19, 4], [123, 6, 23, 18, 23, 5], [123, 56, 21, 18, 21, 4], [123, 107, 19, 18, 19, 4], [123, 158, 19, 18, 19, 4], [123, 209, 19, 18, 19, 4], [123, 260, 17, 18, 17, 4], [123, 311, 17, 18, 17, 4], [123, 362, 19, 18, 19, 4], [123, 413, 19, 18, 19, 4], [123, 464, 13, 18, 13, 4], [123, 515, 17, 18, 17, 4], [123, 566, 19, 18, 19, 4], [123, 617, 17, 18, 17, 4], [123, 668, 21, 18, 21, 4], [123, 719, 19, 18, 19, 4], [123, 770, 19, 18, 19, 4], [184, 5, 19, 18, 19, 4], [184, 56, 19, 21, 19, 4], [184, 107, 19, 18, 19, 4], [184, 158, 19, 18, 19, 4], [184, 209, 19, 18, 19, 4], [184, 260, 19, 18, 19, 4], [184, 311, 21, 18, 21, 4], [184, 362, 25, 18, 25, 4], [184, 413, 17, 18, 17, 4], [184, 464, 17, 18, 17, 4], [184, 515, 17, 18, 17, 4], [184, 564, 11, 22, 11, 2], [184, 615, 17, 20, 17, 2], [184, 666, 11, 22, 11, 2], [184, 718, 11, 19, 11, 3], [184, 782, 19, 6, 19, 16], [245, 3, 11, 20, 11, 2], [245, 61, 17, 13, 17, 9], [245, 107, 17, 18, 17, 4], [245, 163, 17, 13, 17, 9], [245, 209, 17, 18, 17, 4], [245, 265, 17, 13, 17, 9], [245, 312, 15, 17, 15, 5], [245, 367, 17, 19, 17, 9], [245, 414, 17, 17, 17, 5], [245, 465, 13, 17, 13, 5], [245, 516, 15, 23, 15, 5], [245, 567, 17, 17, 17, 5], [245, 618, 13, 17, 13, 5], [245, 673, 25, 13, 25, 9], [245, 724, 17, 13, 17, 9], [245, 775, 17, 13, 17, 9], [306, 10, 17, 17, 17, 9], [306, 61, 17, 17, 17, 9], [306, 112, 15, 13, 15, 9], [306, 163, 17, 13, 17, 9], [306, 211, 15, 16, 15, 6], [306, 265, 17, 13, 17, 9], [306, 316, 17, 13, 17, 9], [306, 367, 25, 13, 25, 9], [306, 418, 17, 13, 17, 9], [306, 469, 17, 19, 17, 9], [306, 520, 17, 13, 17, 9], [306, 563, 13, 23, 13, 1], [306, 616, 9, 20, 9, 3], [306, 665, 13, 23, 13, 1], [306, 718, 19, 19, 19, 3], [306, 782, 3, 6, 3, 16], [367, 1, 21, 22, 21, 0], [367, 52, 21, 22, 21, 0], [367, 107, 19, 23, 19, 4], [367, 154, 17, 22, 17, 0], [367, 205, 19, 22, 19, 0], [367, 256, 19, 22, 19, 0], [367, 307, 19, 22, 19, 0], [367, 361, 17, 19, 17, 3], [367, 412, 17, 19, 17, 3], [367, 463, 17, 19, 17, 3], [367, 516, 17, 17, 17, 5], [367, 566, 17, 18, 17, 4], [367, 614, 17, 21, 17, 1], [367, 673, 17, 18, 17, 9], [367, 718, 17, 19, 17, 3], [367, 769, 17, 19, 17, 3], [428, 4, 17, 19, 17, 3], [428, 57, 17, 17, 17, 5], [428, 106, 13, 19, 13, 3], [428, 157, 13, 19, 13, 3], [428, 208, 13, 19, 13, 3], [428, 261, 13, 17, 13, 5], [428, 311, 17, 18, 17, 4], [428, 361, 17, 19, 17, 3], [428, 412, 17, 19, 17, 3], [428, 463, 17, 19, 17, 3], [428, 516, 17, 17, 17, 5], [428, 566, 17, 18, 17, 4], [428, 616, 17, 19, 17, 3], [428, 667, 17, 19, 17, 3], [428, 718, 17, 19, 17, 3], [428, 771, 17, 17, 17, 5], [489, 5, 13, 18, 13, 4], [489, 55, 15, 19, 15, 3], [489, 107, 17, 18, 17, 4], [489, 158, 19, 18, 19, 4], [489, 209, 19, 22, 19, 4], [489, 266, 19, 12, 19, 10], [489, 311, 19, 22, 19, 4], [489, 362, 21, 18, 21, 4], [489, 415, 23, 17, 23, 6], [489, 466, 23, 17, 23, 6], [489, 515, 25, 18, 25, 4], [489, 564, 11, 20, 11, 2], [489, 617, 13, 18, 13, 4], [489, 672, 19, 14, 19, 8], [489, 719, 27, 18, 27, 4], [489, 770, 19, 18, 19, 4], [550, 11, 25, 12, 25, 10], [550, 60, 17, 14, 17, 8], [550, 109, 15, 16, 15, 6], [550, 160, 15, 16, 15, 6], [550, 209, 17, 18, 17, 4], [550, 264, 21, 18, 21, 8], [550, 312, 17, 17, 17, 5], [550, 362, 19, 24, 19, 4], [550, 413, 21, 24, 21, 4], [550, 468, 23, 14, 23, 8], [550, 513, 13, 25, 13, 2], [550, 566, 15, 18, 15, 4], [550, 617, 15, 18, 15, 4], [550, 668, 23, 18, 23, 4], [550, 724, 25, 13, 25, 9], [550, 775, 17, 13, 17, 9], [611, 5, 19, 18, 19, 4], [611, 56, 11, 18, 11, 4], [611, 115, 17, 10, 17, 12], [611, 155, 23, 25, 23, 1], [611, 209, 13, 22, 13, 4], [611, 264, 19, 14, 19, 8], [611, 309, 21, 20, 21, 2], [611, 367, 19, 13, 19, 9], [611, 418, 19, 13, 19, 9], [611, 476, 23, 6, 23, 16], [611, 527, 19, 6, 19, 16], [611, 562, 21, 22, 21, 0], [611, 613, 21, 22, 21, 0], [611, 664, 19, 22, 19, 0], [611, 719, 27, 18, 27, 4], [611, 775, 25, 13, 25, 9], [672, 15, 15, 8, 15, 14], [672, 66, 21, 8, 21, 14], [672, 106, 17, 19, 17, 3], [672, 158, 17, 18, 17, 4], [672, 208, 11, 19, 11, 3], [672, 260, 11, 18, 11, 4], [672, 314, 17, 15, 17, 7], [672, 362, 21, 18, 21, 4], [672, 414, 17, 23, 17, 5], [1, 17, 11, 6, 11, 16], [794, 771, 23, 17, 23, 5], [672, 567, 23, 17, 23, 5], [672, 618, 23, 17, 23, 5], [672, 669, 23, 17, 23, 5], [672, 720, 23, 17, 23, 5], [672, 771, 23, 17, 23, 5], [733, 6, 23, 17, 23, 5], [733, 57, 23, 17, 23, 5], [733, 108, 23, 17, 23, 5], [733, 159, 23, 17, 23, 5], [733, 210, 23, 17, 23, 5], [733, 261, 23, 17, 23, 5], [733, 312, 23, 17, 23, 5], [733, 363, 23, 17, 23, 5], [733, 414, 23, 17, 23, 5], [733, 465, 23, 17, 23, 5], [733, 516, 23, 17, 23, 5], [733, 567, 23, 17, 23, 5], [733, 618, 23, 17, 23, 5], [733, 669, 23, 17, 23, 5], [733, 720, 23, 17, 23, 5], [733, 771, 23, 17, 23, 5], [1, 17, 11, 6, 11, 16], [794, 57, 23, 17, 23, 5], [794, 108, 23, 17, 23, 5], [794, 159, 23, 17, 23, 5], [794, 210, 23, 17, 23, 5], [794, 261, 23, 17, 23, 5], [794, 312, 23, 17, 23, 5], [794, 363, 23, 17, 23, 5], [794, 414, 23, 17, 23, 5], [794, 465, 23, 17, 23, 5], [794, 516, 23, 17, 23, 5], [794, 567, 23, 17, 23, 5], [794, 618, 23, 17, 23, 5], [794, 669, 23, 17, 23, 5], [794, 720, 23, 17, 23, 5], [794, 771, 23, 17, 23, 5], [855, 6, 23, 17, 23, 5], [855, 57, 23, 17, 23, 5], [855, 108, 23, 17, 23, 5], [855, 159, 23, 17, 23, 5], [855, 210, 23, 17, 23, 5], [855, 261, 23, 17, 23, 5], [855, 312, 23, 17, 23, 5], [855, 363, 23, 17, 23, 5], [855, 414, 23, 17, 23, 5], [855, 465, 23, 17, 23, 5], [855, 516, 23, 17, 23, 5], [855, 567, 23, 17, 23, 5], [855, 618, 23, 17, 23, 5], [855, 669, 23, 17, 23, 5], [855, 720, 23, 17, 23, 5], [855, 771, 23, 17, 23, 5]], \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 8, 9, 8, 3], [1, 106, 9, 4, 10, 3], [1, 156, 11, 7, 12, 2], [1, 207, 11, 11, 11, 2], [1, 259, 14, 9, 14, 3], [1, 309, 12, 10, 13, 2], [1, 361, 7, 4, 8, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 514, 11, 7, 12, 3], [1, 566, 10, 7, 11, 4], [1, 622, 8, 5, 9, 9], [1, 670, 9, 3, 10, 6], [1, 724, 7, 3, 8, 9], [1, 768, 10, 10, 11, 2], [62, 4, 11, 9, 11, 3], [62, 55, 9, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 10, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 10, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 516, 9, 7, 9, 5], [62, 567, 9, 9, 9, 5], [62, 617, 9, 7, 10, 4], [62, 669, 11, 5, 11, 5], [62, 719, 9, 7, 10, 4], [62, 769, 11, 9, 11, 3], [123, 4, 13, 10, 13, 3], [123, 55, 11, 9, 12, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 10, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 8, 9, 8, 3], [123, 514, 11, 9, 11, 3], [123, 565, 11, 9, 11, 3], [123, 616, 9, 9, 10, 3], [123, 667, 13, 9, 13, 3], [123, 718, 11, 9, 11, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 10, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 11, 9, 11, 3], [184, 208, 11, 9, 11, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 13, 9, 13, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 10, 9, 10, 3], [184, 564, 9, 11, 9, 2], [184, 615, 10, 10, 11, 2], [184, 666, 9, 11, 9, 2], [184, 718, 8, 4, 9, 3], [184, 775, 11, 3, 11, 9], [245, 4, 7, 4, 8, 3], [245, 57, 10, 7, 10, 5], [245, 106, 10, 9, 10, 3], [245, 159, 10, 7, 10, 5], [245, 208, 10, 9, 10, 3], [245, 261, 10, 7, 10, 5], [245, 310, 9, 9, 9, 3], [245, 363, 10, 9, 10, 5], [245, 412, 10, 9, 10, 3], [245, 463, 8, 9, 8, 3], [245, 514, 8, 11, 9, 3], [245, 565, 10, 9, 10, 3], [245, 616, 8, 9, 8, 3], [245, 669, 13, 7, 13, 5], [245, 720, 10, 7, 10, 5], [245, 771, 10, 7, 10, 5], [306, 6, 10, 9, 10, 5], [306, 57, 10, 9, 10, 5], [306, 108, 10, 7, 10, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 10, 7, 10, 5], [306, 312, 11, 7, 11, 5], [306, 363, 13, 7, 13, 5], [306, 414, 11, 7, 11, 5], [306, 465, 10, 9, 11, 5], [306, 516, 10, 7, 10, 5], [306, 564, 9, 11, 9, 2], [306, 615, 6, 11, 7, 2], [306, 666, 8, 11, 9, 2], [306, 718, 10, 4, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 11, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 106, 11, 11, 11, 3], [367, 154, 10, 12, 10, 0], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 614, 10, 11, 10, 1], [367, 669, 10, 9, 10, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 10, 10, 10, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 8, 7, 9, 2], [489, 54, 9, 6, 10, 2], [489, 106, 11, 9, 11, 3], [489, 157, 10, 9, 11, 3], [489, 207, 11, 11, 11, 2], [489, 260, 10, 7, 11, 4], [489, 310, 11, 9, 11, 3], [489, 361, 11, 9, 11, 3], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 514, 14, 6, 14, 3], [489, 565, 8, 4, 9, 3], [489, 616, 8, 3, 9, 3], [489, 668, 10, 7, 11, 4], [489, 718, 14, 9, 14, 3], [489, 769, 12, 9, 12, 3], [550, 5, 15, 7, 15, 4], [550, 56, 10, 8, 11, 4], [550, 107, 9, 8, 10, 4], [550, 158, 9, 8, 10, 4], [550, 208, 11, 9, 11, 3], [550, 260, 10, 10, 11, 4], [550, 310, 10, 9, 10, 3], [550, 361, 11, 9, 11, 3], [550, 412, 12, 9, 12, 3], [550, 463, 13, 9, 13, 3], [550, 512, 10, 13, 10, 1], [550, 565, 9, 8, 10, 3], [550, 616, 9, 8, 10, 3], [550, 666, 13, 10, 13, 2], [550, 720, 14, 7, 14, 5], [550, 770, 11, 8, 11, 4], [611, 4, 10, 9, 11, 3], [611, 55, 8, 9, 8, 3], [611, 109, 9, 5, 10, 6], [611, 156, 12, 10, 13, 2], [611, 206, 10, 13, 10, 1], [611, 260, 10, 7, 11, 4], [611, 311, 11, 8, 12, 4], [611, 363, 11, 7, 13, 5], [611, 414, 12, 7, 13, 5], [611, 469, 12, 3, 13, 9], [611, 511, 1, 1, 11, 1], [611, 563, 11, 11, 12, 1], [611, 613, 11, 12, 12, 0], [611, 664, 11, 12, 11, 0], [611, 718, 14, 9, 14, 3], [611, 771, 13, 7, 13, 5], [672, 8, 9, 3, 10, 7], [672, 59, 11, 3, 12, 7], [672, 105, 10, 5, 12, 2], [672, 156, 11, 5, 12, 2], [672, 207, 8, 5, 9, 2], [672, 258, 8, 5, 9, 2], [672, 311, 10, 7, 11, 4], [672, 361, 12, 9, 13, 3], [672, 412, 11, 11, 11, 3], [1, 1, 1, 1, 8, 1], [794, 769, 12, 9, 12, 3], [672, 565, 12, 9, 12, 3], [672, 616, 12, 9, 12, 3], [672, 667, 12, 9, 12, 3], [672, 718, 12, 9, 12, 3], [672, 769, 12, 9, 12, 3], [733, 4, 12, 9, 12, 3], [733, 55, 12, 9, 12, 3], [733, 106, 12, 9, 12, 3], [733, 157, 12, 9, 12, 3], [733, 208, 12, 9, 12, 3], [733, 259, 12, 9, 12, 3], [733, 310, 12, 9, 12, 3], [733, 361, 12, 9, 12, 3], [733, 412, 12, 9, 12, 3], [733, 463, 12, 9, 12, 3], [733, 514, 12, 9, 12, 3], [733, 565, 12, 9, 12, 3], [733, 616, 12, 9, 12, 3], [733, 667, 12, 9, 12, 3], [733, 718, 12, 9, 12, 3], [733, 769, 12, 9, 12, 3], [1, 1, 1, 1, 8, 1], [794, 55, 12, 9, 12, 3], [794, 106, 12, 9, 12, 3], [794, 157, 12, 9, 12, 3], [794, 208, 12, 9, 12, 3], [794, 259, 12, 9, 12, 3], [794, 310, 12, 9, 12, 3], [794, 361, 12, 9, 12, 3], [794, 412, 12, 9, 12, 3], [794, 463, 12, 9, 12, 3], [794, 514, 12, 9, 12, 3], [794, 565, 12, 9, 12, 3], [794, 616, 12, 9, 12, 3], [794, 667, 12, 9, 12, 3], [794, 718, 12, 9, 12, 3], [794, 769, 12, 9, 12, 3], [855, 4, 12, 9, 12, 3], [855, 55, 12, 9, 12, 3], [855, 106, 12, 9, 12, 3], [855, 157, 12, 9, 12, 3], [855, 208, 12, 9, 12, 3], [855, 259, 12, 9, 12, 3], [855, 310, 12, 9, 12, 3], [855, 361, 12, 9, 12, 3], [855, 412, 12, 9, 12, 3], [855, 463, 12, 9, 12, 3], [855, 514, 12, 9, 12, 3], [855, 565, 12, 9, 12, 3], [855, 616, 12, 9, 12, 3], [855, 667, 12, 9, 12, 3], [855, 718, 12, 9, 12, 3], [855, 769, 12, 9, 12, 3]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 7, 7, 7, 3], [1, 106, 8, 2, 9, 3], [1, 156, 10, 5, 11, 2], [1, 207, 10, 9, 10, 2], [1, 259, 13, 7, 13, 3], [1, 309, 11, 8, 12, 2], [1, 361, 6, 2, 7, 3], [1, 411, 8, 9, 8, 2], [1, 462, 8, 9, 8, 2], [1, 514, 10, 5, 11, 3], [1, 566, 9, 5, 10, 4], [1, 622, 7, 3, 8, 9], [1, 670, 8, 1, 9, 6], [1, 724, 6, 1, 7, 9], [1, 768, 9, 8, 10, 2], [62, 4, 10, 7, 10, 3], [62, 55, 8, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 7, 10, 3], [62, 208, 9, 7, 10, 3], [62, 259, 10, 7, 10, 3], [62, 310, 9, 7, 10, 3], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 7, 10, 3], [62, 516, 8, 5, 8, 5], [62, 567, 8, 7, 8, 5], [62, 617, 8, 5, 9, 4], [62, 669, 10, 3, 10, 5], [62, 719, 8, 5, 9, 4], [62, 769, 10, 7, 10, 3], [123, 4, 12, 8, 12, 3], [123, 55, 10, 7, 11, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 9, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 7, 7, 7, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 8, 7, 9, 3], [123, 667, 12, 7, 12, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 10, 7, 10, 3], [184, 55, 10, 8, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 10, 7, 10, 3], [184, 208, 10, 7, 10, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 9, 7, 9, 3], [184, 564, 8, 9, 8, 2], [184, 615, 9, 8, 10, 2], [184, 666, 8, 9, 8, 2], [184, 718, 7, 2, 8, 3], [184, 775, 10, 1, 10, 9], [245, 4, 6, 2, 7, 3], [245, 57, 9, 5, 9, 5], [245, 106, 9, 7, 9, 3], [245, 159, 9, 5, 9, 5], [245, 208, 9, 7, 9, 3], [245, 261, 9, 5, 9, 5], [245, 310, 8, 7, 8, 3], [245, 363, 9, 7, 9, 5], [245, 412, 9, 7, 9, 3], [245, 463, 7, 7, 7, 3], [245, 514, 7, 9, 8, 3], [245, 565, 9, 7, 9, 3], [245, 616, 7, 7, 7, 3], [245, 669, 12, 5, 12, 5], [245, 720, 9, 5, 9, 5], [245, 771, 9, 5, 9, 5], [306, 6, 9, 7, 9, 5], [306, 57, 9, 7, 9, 5], [306, 108, 9, 5, 9, 5], [306, 159, 9, 5, 9, 5], [306, 208, 8, 7, 8, 3], [306, 261, 9, 5, 9, 5], [306, 312, 10, 5, 10, 5], [306, 363, 12, 5, 12, 5], [306, 414, 10, 5, 10, 5], [306, 465, 9, 7, 10, 5], [306, 516, 9, 5, 9, 5], [306, 564, 8, 9, 8, 2], [306, 615, 5, 9, 6, 2], [306, 666, 7, 9, 8, 2], [306, 718, 9, 2, 10, 3], [306, 766, 1, 1, 3, 1], [367, 2, 10, 9, 11, 1], [367, 52, 11, 10, 11, 0], [367, 106, 10, 9, 10, 3], [367, 154, 9, 10, 9, 0], [367, 205, 10, 10, 10, 0], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 614, 9, 9, 9, 1], [367, 669, 9, 7, 9, 5], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 7, 8, 7, 2], [428, 156, 7, 8, 7, 2], [428, 207, 8, 8, 8, 2], [428, 259, 8, 7, 8, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 3, 7, 5, 8, 2], [489, 54, 8, 4, 9, 2], [489, 106, 10, 7, 10, 3], [489, 157, 9, 7, 10, 3], [489, 207, 10, 9, 10, 2], [489, 260, 9, 5, 10, 4], [489, 310, 10, 7, 10, 3], [489, 361, 10, 7, 10, 3], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 514, 13, 4, 13, 3], [489, 565, 7, 2, 8, 3], [489, 616, 7, 1, 8, 3], [489, 668, 9, 5, 10, 4], [489, 718, 13, 7, 13, 3], [489, 769, 11, 7, 11, 3], [550, 5, 14, 5, 14, 4], [550, 56, 9, 6, 10, 4], [550, 107, 8, 6, 9, 4], [550, 158, 8, 6, 9, 4], [550, 208, 10, 7, 10, 3], [550, 260, 9, 8, 10, 4], [550, 310, 9, 7, 9, 3], [550, 361, 10, 7, 10, 3], [550, 412, 11, 7, 11, 3], [550, 463, 12, 7, 12, 3], [550, 512, 9, 11, 9, 1], [550, 565, 8, 6, 9, 3], [550, 616, 8, 6, 9, 3], [550, 666, 12, 8, 12, 2], [550, 720, 13, 5, 13, 5], [550, 770, 10, 6, 10, 4], [611, 4, 9, 7, 10, 3], [611, 55, 7, 7, 7, 3], [611, 109, 8, 3, 9, 6], [611, 156, 11, 8, 12, 2], [611, 206, 9, 11, 9, 1], [611, 260, 9, 5, 10, 4], [611, 311, 10, 6, 11, 4], [611, 363, 10, 5, 12, 5], [611, 414, 11, 5, 12, 5], [611, 469, 11, 1, 12, 9], [611, 511, 1, 1, 10, 1], [611, 563, 10, 9, 11, 1], [611, 613, 10, 10, 11, 0], [611, 664, 10, 10, 10, 0], [611, 718, 13, 7, 13, 3], [611, 771, 12, 5, 12, 5], [672, 8, 8, 1, 9, 7], [672, 59, 10, 1, 11, 7], [672, 105, 9, 3, 11, 2], [672, 156, 10, 3, 11, 2], [672, 207, 7, 3, 8, 2], [672, 258, 7, 3, 8, 2], [672, 311, 9, 5, 10, 4], [672, 361, 11, 7, 12, 3], [672, 412, 10, 9, 10, 3], [1, 1, 1, 1, 7, 1], [794, 769, 11, 7, 11, 3], [672, 565, 11, 7, 11, 3], [672, 616, 11, 7, 11, 3], [672, 667, 11, 7, 11, 3], [672, 718, 11, 7, 11, 3], [672, 769, 11, 7, 11, 3], [733, 4, 11, 7, 11, 3], [733, 55, 11, 7, 11, 3], [733, 106, 11, 7, 11, 3], [733, 157, 11, 7, 11, 3], [733, 208, 11, 7, 11, 3], [733, 259, 11, 7, 11, 3], [733, 310, 11, 7, 11, 3], [733, 361, 11, 7, 11, 3], [733, 412, 11, 7, 11, 3], [733, 463, 11, 7, 11, 3], [733, 514, 11, 7, 11, 3], [733, 565, 11, 7, 11, 3], [733, 616, 11, 7, 11, 3], [733, 667, 11, 7, 11, 3], [733, 718, 11, 7, 11, 3], [733, 769, 11, 7, 11, 3], [1, 1, 1, 1, 7, 1], [794, 55, 11, 7, 11, 3], [794, 106, 11, 7, 11, 3], [794, 157, 11, 7, 11, 3], [794, 208, 11, 7, 11, 3], [794, 259, 11, 7, 11, 3], [794, 310, 11, 7, 11, 3], [794, 361, 11, 7, 11, 3], [794, 412, 11, 7, 11, 3], [794, 463, 11, 7, 11, 3], [794, 514, 11, 7, 11, 3], [794, 565, 11, 7, 11, 3], [794, 616, 11, 7, 11, 3], [794, 667, 11, 7, 11, 3], [794, 718, 11, 7, 11, 3], [794, 769, 11, 7, 11, 3], [855, 4, 11, 7, 11, 3], [855, 55, 11, 7, 11, 3], [855, 106, 11, 7, 11, 3], [855, 157, 11, 7, 11, 3], [855, 208, 11, 7, 11, 3], [855, 259, 11, 7, 11, 3], [855, 310, 11, 7, 11, 3], [855, 361, 11, 7, 11, 3], [855, 412, 11, 7, 11, 3], [855, 463, 11, 7, 11, 3], [855, 514, 11, 7, 11, 3], [855, 565, 11, 7, 11, 3], [855, 616, 11, 7, 11, 3], [855, 667, 11, 7, 11, 3], [855, 718, 11, 7, 11, 3], [855, 769, 11, 7, 11, 3]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 55, 8, 9, 8, 3], [1, 106, 10, 8, 10, 3], [1, 156, 12, 9, 12, 2], [1, 207, 11, 11, 11, 2], [1, 259, 14, 9, 14, 3], [1, 309, 13, 10, 13, 2], [1, 361, 8, 8, 8, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 514, 12, 8, 12, 3], [1, 566, 11, 7, 11, 4], [1, 618, 9, 9, 9, 5], [1, 669, 10, 6, 10, 5], [1, 720, 8, 7, 8, 5], [1, 768, 11, 10, 11, 2], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 11, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 516, 9, 7, 9, 5], [62, 567, 9, 9, 9, 5], [62, 617, 10, 7, 10, 4], [62, 669, 11, 6, 11, 5], [62, 719, 10, 7, 10, 4], [62, 769, 11, 9, 11, 3], [123, 4, 13, 10, 13, 3], [123, 55, 12, 9, 12, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 8, 9, 8, 3], [123, 514, 11, 9, 11, 3], [123, 565, 11, 9, 11, 3], [123, 616, 10, 9, 10, 3], [123, 667, 13, 9, 13, 3], [123, 718, 11, 9, 11, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 10, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 11, 9, 11, 3], [184, 208, 11, 9, 11, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 13, 9, 13, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 10, 9, 10, 3], [184, 564, 9, 11, 9, 2], [184, 615, 11, 10, 11, 2], [184, 666, 9, 11, 9, 2], [184, 718, 9, 8, 9, 3], [184, 771, 11, 7, 11, 5], [245, 4, 8, 8, 8, 3], [245, 57, 10, 7, 10, 5], [245, 106, 10, 9, 10, 3], [245, 159, 10, 7, 10, 5], [245, 208, 10, 9, 10, 3], [245, 261, 10, 7, 10, 5], [245, 310, 9, 9, 9, 3], [245, 363, 10, 9, 10, 5], [245, 412, 10, 9, 10, 3], [245, 463, 8, 9, 8, 3], [245, 514, 9, 11, 9, 3], [245, 565, 10, 9, 10, 3], [245, 616, 8, 9, 8, 3], [245, 669, 13, 7, 13, 5], [245, 720, 10, 7, 10, 5], [245, 771, 10, 7, 10, 5], [306, 6, 10, 9, 10, 5], [306, 57, 10, 9, 10, 5], [306, 108, 10, 7, 10, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 10, 7, 10, 5], [306, 312, 11, 7, 11, 5], [306, 363, 13, 7, 13, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 9, 11, 5], [306, 516, 10, 7, 10, 5], [306, 564, 9, 11, 9, 2], [306, 615, 7, 11, 7, 2], [306, 666, 9, 11, 9, 2], [306, 718, 11, 8, 11, 3], [306, 771, 3, 6, 3, 5], [367, 2, 12, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 106, 11, 11, 11, 3], [367, 154, 10, 12, 10, 0], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 614, 10, 11, 10, 1], [367, 669, 10, 9, 10, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 10, 10, 10, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 9, 9, 9, 2], [489, 54, 10, 9, 10, 2], [489, 106, 11, 9, 11, 3], [489, 157, 11, 9, 11, 3], [489, 207, 11, 11, 11, 2], [489, 260, 11, 7, 11, 4], [489, 310, 11, 9, 11, 3], [489, 361, 11, 9, 11, 3], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 514, 14, 8, 14, 3], [489, 565, 9, 8, 9, 3], [489, 616, 9, 8, 9, 3], [489, 668, 11, 7, 11, 4], [489, 718, 14, 9, 14, 3], [489, 769, 12, 9, 12, 3], [550, 5, 15, 7, 15, 4], [550, 56, 11, 8, 11, 4], [550, 107, 10, 8, 10, 4], [550, 158, 10, 8, 10, 4], [550, 208, 11, 9, 11, 3], [550, 260, 11, 10, 11, 4], [550, 310, 10, 9, 10, 3], [550, 361, 11, 9, 11, 3], [550, 412, 12, 9, 12, 3], [550, 463, 13, 9, 13, 3], [550, 512, 10, 13, 10, 1], [550, 565, 10, 8, 10, 3], [550, 616, 10, 8, 10, 3], [550, 666, 13, 10, 13, 2], [550, 720, 14, 7, 14, 5], [550, 770, 11, 8, 11, 4], [611, 4, 11, 9, 11, 3], [611, 55, 8, 9, 8, 3], [611, 108, 10, 6, 10, 5], [611, 156, 13, 10, 13, 2], [611, 206, 10, 13, 10, 1], [611, 260, 11, 7, 11, 4], [611, 311, 12, 8, 12, 4], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 465, 13, 7, 13, 5], [611, 516, 11, 6, 11, 5], [611, 563, 12, 11, 12, 1], [611, 613, 12, 12, 12, 0], [611, 664, 11, 12, 11, 0], [611, 718, 14, 9, 14, 3], [611, 771, 13, 7, 13, 5], [672, 6, 10, 6, 10, 5], [672, 57, 12, 6, 12, 5], [672, 105, 12, 9, 12, 2], [672, 156, 12, 9, 12, 2], [672, 207, 9, 9, 9, 2], [672, 258, 9, 9, 9, 2], [672, 311, 11, 7, 11, 4], [672, 361, 13, 9, 13, 3], [672, 412, 11, 11, 11, 3], [1, 6, 8, 6, 8, 5], [794, 769, 12, 9, 12, 3], [672, 565, 12, 9, 12, 3], [672, 616, 12, 9, 12, 3], [672, 667, 12, 9, 12, 3], [672, 718, 12, 9, 12, 3], [672, 769, 12, 9, 12, 3], [733, 4, 12, 9, 12, 3], [733, 55, 12, 9, 12, 3], [733, 106, 12, 9, 12, 3], [733, 157, 12, 9, 12, 3], [733, 208, 12, 9, 12, 3], [733, 259, 12, 9, 12, 3], [733, 310, 12, 9, 12, 3], [733, 361, 12, 9, 12, 3], [733, 412, 12, 9, 12, 3], [733, 463, 12, 9, 12, 3], [733, 514, 12, 9, 12, 3], [733, 565, 12, 9, 12, 3], [733, 616, 12, 9, 12, 3], [733, 667, 12, 9, 12, 3], [733, 718, 12, 9, 12, 3], [733, 769, 12, 9, 12, 3], [1, 6, 8, 6, 8, 5], [794, 55, 12, 9, 12, 3], [794, 106, 12, 9, 12, 3], [794, 157, 12, 9, 12, 3], [794, 208, 12, 9, 12, 3], [794, 259, 12, 9, 12, 3], [794, 310, 12, 9, 12, 3], [794, 361, 12, 9, 12, 3], [794, 412, 12, 9, 12, 3], [794, 463, 12, 9, 12, 3], [794, 514, 12, 9, 12, 3], [794, 565, 12, 9, 12, 3], [794, 616, 12, 9, 12, 3], [794, 667, 12, 9, 12, 3], [794, 718, 12, 9, 12, 3], [794, 769, 12, 9, 12, 3], [855, 4, 12, 9, 12, 3], [855, 55, 12, 9, 12, 3], [855, 106, 12, 9, 12, 3], [855, 157, 12, 9, 12, 3], [855, 208, 12, 9, 12, 3], [855, 259, 12, 9, 12, 3], [855, 310, 12, 9, 12, 3], [855, 361, 12, 9, 12, 3], [855, 412, 12, 9, 12, 3], [855, 463, 12, 9, 12, 3], [855, 514, 12, 9, 12, 3], [855, 565, 12, 9, 12, 3], [855, 616, 12, 9, 12, 3], [855, 667, 12, 9, 12, 3], [855, 718, 12, 9, 12, 3], [855, 769, 12, 9, 12, 3]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 55, 7, 7, 7, 3], [1, 106, 9, 7, 9, 3], [1, 156, 11, 8, 11, 2], [1, 207, 10, 9, 10, 2], [1, 259, 13, 7, 13, 3], [1, 309, 12, 8, 12, 2], [1, 361, 7, 7, 7, 3], [1, 411, 8, 9, 8, 2], [1, 462, 8, 9, 8, 2], [1, 514, 11, 7, 11, 3], [1, 566, 10, 6, 10, 4], [1, 617, 8, 8, 8, 4], [1, 668, 9, 6, 9, 4], [1, 719, 7, 6, 7, 4], [1, 768, 10, 8, 10, 2], [62, 4, 10, 7, 10, 3], [62, 55, 10, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 7, 10, 3], [62, 208, 10, 7, 10, 3], [62, 259, 10, 7, 10, 3], [62, 310, 10, 7, 10, 3], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 7, 10, 3], [62, 515, 8, 6, 8, 4], [62, 566, 8, 8, 8, 4], [62, 617, 9, 6, 9, 4], [62, 668, 10, 6, 10, 4], [62, 719, 9, 6, 9, 4], [62, 769, 10, 7, 10, 3], [123, 4, 12, 8, 12, 3], [123, 55, 11, 7, 11, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 7, 7, 7, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 9, 7, 9, 3], [123, 667, 12, 7, 12, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 10, 7, 10, 3], [184, 55, 10, 8, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 10, 7, 10, 3], [184, 208, 10, 7, 10, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 9, 7, 9, 3], [184, 564, 8, 9, 8, 2], [184, 615, 10, 8, 10, 2], [184, 666, 8, 9, 8, 2], [184, 718, 8, 7, 8, 3], [184, 770, 10, 6, 10, 4], [245, 4, 7, 7, 7, 3], [245, 56, 9, 6, 9, 4], [245, 106, 9, 7, 9, 3], [245, 158, 9, 6, 9, 4], [245, 208, 9, 7, 9, 3], [245, 260, 9, 6, 9, 4], [245, 310, 8, 7, 8, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 7, 7, 7, 3], [245, 514, 8, 9, 8, 3], [245, 565, 9, 7, 9, 3], [245, 616, 7, 7, 7, 3], [245, 668, 12, 6, 12, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 208, 8, 7, 8, 3], [306, 260, 9, 6, 9, 4], [306, 311, 10, 6, 10, 4], [306, 362, 12, 6, 12, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 9, 6, 9, 4], [306, 564, 8, 9, 8, 2], [306, 615, 6, 9, 6, 2], [306, 666, 8, 9, 8, 2], [306, 718, 10, 7, 10, 3], [306, 770, 3, 6, 3, 4], [367, 2, 11, 9, 11, 1], [367, 52, 11, 10, 11, 0], [367, 106, 10, 9, 10, 3], [367, 154, 9, 10, 9, 0], [367, 205, 10, 10, 10, 0], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 614, 9, 9, 9, 1], [367, 668, 9, 8, 9, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 7, 8, 7, 2], [428, 156, 7, 8, 7, 2], [428, 207, 8, 8, 8, 2], [428, 259, 8, 7, 8, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 3, 8, 8, 8, 2], [489, 54, 9, 8, 9, 2], [489, 106, 10, 7, 10, 3], [489, 157, 10, 7, 10, 3], [489, 207, 10, 9, 10, 2], [489, 260, 10, 6, 10, 4], [489, 310, 10, 7, 10, 3], [489, 361, 10, 7, 10, 3], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 514, 13, 7, 13, 3], [489, 565, 8, 7, 8, 3], [489, 616, 8, 7, 8, 3], [489, 668, 10, 6, 10, 4], [489, 718, 13, 7, 13, 3], [489, 769, 11, 7, 11, 3], [550, 5, 14, 6, 14, 4], [550, 56, 10, 6, 10, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 208, 10, 7, 10, 3], [550, 260, 10, 8, 10, 4], [550, 310, 9, 7, 9, 3], [550, 361, 10, 7, 10, 3], [550, 412, 11, 7, 11, 3], [550, 463, 12, 7, 12, 3], [550, 512, 9, 11, 9, 1], [550, 565, 9, 7, 9, 3], [550, 616, 9, 7, 9, 3], [550, 666, 12, 8, 12, 2], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 4, 10, 7, 10, 3], [611, 55, 7, 7, 7, 3], [611, 107, 9, 6, 9, 4], [611, 156, 12, 8, 12, 2], [611, 206, 9, 11, 9, 1], [611, 260, 10, 6, 10, 4], [611, 311, 11, 6, 11, 4], [611, 362, 12, 6, 12, 4], [611, 413, 12, 6, 12, 4], [611, 464, 12, 6, 12, 4], [611, 515, 10, 6, 10, 4], [611, 563, 11, 9, 11, 1], [611, 613, 11, 10, 11, 0], [611, 664, 10, 10, 10, 0], [611, 718, 13, 7, 13, 3], [611, 770, 12, 6, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 11, 6, 11, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 8, 8, 8, 2], [672, 258, 8, 8, 8, 2], [672, 311, 10, 6, 10, 4], [672, 361, 12, 7, 12, 3], [672, 412, 10, 9, 10, 3], [1, 5, 7, 6, 7, 4], [794, 769, 11, 7, 11, 3], [672, 565, 11, 7, 11, 3], [672, 616, 11, 7, 11, 3], [672, 667, 11, 7, 11, 3], [672, 718, 11, 7, 11, 3], [672, 769, 11, 7, 11, 3], [733, 4, 11, 7, 11, 3], [733, 55, 11, 7, 11, 3], [733, 106, 11, 7, 11, 3], [733, 157, 11, 7, 11, 3], [733, 208, 11, 7, 11, 3], [733, 259, 11, 7, 11, 3], [733, 310, 11, 7, 11, 3], [733, 361, 11, 7, 11, 3], [733, 412, 11, 7, 11, 3], [733, 463, 11, 7, 11, 3], [733, 514, 11, 7, 11, 3], [733, 565, 11, 7, 11, 3], [733, 616, 11, 7, 11, 3], [733, 667, 11, 7, 11, 3], [733, 718, 11, 7, 11, 3], [733, 769, 11, 7, 11, 3], [1, 5, 7, 6, 7, 4], [794, 55, 11, 7, 11, 3], [794, 106, 11, 7, 11, 3], [794, 157, 11, 7, 11, 3], [794, 208, 11, 7, 11, 3], [794, 259, 11, 7, 11, 3], [794, 310, 11, 7, 11, 3], [794, 361, 11, 7, 11, 3], [794, 412, 11, 7, 11, 3], [794, 463, 11, 7, 11, 3], [794, 514, 11, 7, 11, 3], [794, 565, 11, 7, 11, 3], [794, 616, 11, 7, 11, 3], [794, 667, 11, 7, 11, 3], [794, 718, 11, 7, 11, 3], [794, 769, 11, 7, 11, 3], [855, 4, 11, 7, 11, 3], [855, 55, 11, 7, 11, 3], [855, 106, 11, 7, 11, 3], [855, 157, 11, 7, 11, 3], [855, 208, 11, 7, 11, 3], [855, 259, 11, 7, 11, 3], [855, 310, 11, 7, 11, 3], [855, 361, 11, 7, 11, 3], [855, 412, 11, 7, 11, 3], [855, 463, 11, 7, 11, 3], [855, 514, 11, 7, 11, 3], [855, 565, 11, 7, 11, 3], [855, 616, 11, 7, 11, 3], [855, 667, 11, 7, 11, 3], [855, 718, 11, 7, 11, 3], [855, 769, 11, 7, 11, 3]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 7, 9, 7, 3], [1, 106, 8, 4, 9, 3], [1, 156, 10, 7, 11, 2], [1, 207, 10, 11, 10, 2], [1, 259, 13, 9, 13, 3], [1, 309, 11, 10, 12, 2], [1, 361, 6, 4, 7, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 514, 10, 7, 11, 3], [1, 566, 9, 7, 10, 4], [1, 622, 7, 5, 8, 9], [1, 670, 8, 3, 9, 6], [1, 724, 6, 3, 7, 9], [1, 768, 9, 10, 10, 2], [62, 4, 10, 9, 10, 3], [62, 55, 8, 9, 10, 3], [62, 106, 10, 9, 10, 3], [62, 157, 10, 9, 10, 3], [62, 208, 9, 9, 10, 3], [62, 259, 10, 9, 10, 3], [62, 310, 9, 9, 10, 3], [62, 361, 10, 9, 10, 3], [62, 412, 10, 9, 10, 3], [62, 463, 10, 9, 10, 3], [62, 516, 8, 7, 8, 5], [62, 567, 8, 9, 8, 5], [62, 617, 8, 7, 9, 4], [62, 669, 10, 5, 10, 5], [62, 719, 8, 7, 9, 4], [62, 769, 10, 9, 10, 3], [123, 4, 12, 10, 12, 3], [123, 55, 10, 9, 11, 3], [123, 106, 10, 9, 10, 3], [123, 157, 10, 9, 10, 3], [123, 208, 9, 9, 10, 3], [123, 259, 9, 9, 9, 3], [123, 310, 9, 9, 9, 3], [123, 361, 10, 9, 10, 3], [123, 412, 10, 9, 10, 3], [123, 463, 7, 9, 7, 3], [123, 514, 10, 9, 10, 3], [123, 565, 10, 9, 10, 3], [123, 616, 8, 9, 9, 3], [123, 667, 12, 9, 12, 3], [123, 718, 10, 9, 10, 3], [123, 769, 10, 9, 10, 3], [184, 4, 10, 9, 10, 3], [184, 55, 10, 10, 10, 3], [184, 106, 10, 9, 10, 3], [184, 157, 10, 9, 10, 3], [184, 208, 10, 9, 10, 3], [184, 259, 10, 9, 10, 3], [184, 310, 10, 9, 10, 3], [184, 361, 12, 9, 12, 3], [184, 412, 10, 9, 10, 3], [184, 463, 10, 9, 10, 3], [184, 514, 9, 9, 9, 3], [184, 564, 8, 11, 8, 2], [184, 615, 9, 10, 10, 2], [184, 666, 8, 11, 8, 2], [184, 718, 7, 4, 8, 3], [184, 775, 10, 3, 10, 9], [245, 4, 6, 4, 7, 3], [245, 57, 9, 7, 9, 5], [245, 106, 9, 9, 9, 3], [245, 159, 9, 7, 9, 5], [245, 208, 9, 9, 9, 3], [245, 261, 9, 7, 9, 5], [245, 310, 8, 9, 8, 3], [245, 363, 9, 9, 9, 5], [245, 412, 9, 9, 9, 3], [245, 463, 7, 9, 7, 3], [245, 514, 7, 11, 8, 3], [245, 565, 9, 9, 9, 3], [245, 616, 7, 9, 7, 3], [245, 669, 12, 7, 12, 5], [245, 720, 9, 7, 9, 5], [245, 771, 9, 7, 9, 5], [306, 6, 9, 9, 9, 5], [306, 57, 9, 9, 9, 5], [306, 108, 9, 7, 9, 5], [306, 159, 9, 7, 9, 5], [306, 208, 8, 9, 8, 3], [306, 261, 9, 7, 9, 5], [306, 312, 10, 7, 10, 5], [306, 363, 12, 7, 12, 5], [306, 414, 10, 7, 10, 5], [306, 465, 9, 9, 10, 5], [306, 516, 9, 7, 9, 5], [306, 564, 8, 11, 8, 2], [306, 615, 5, 11, 6, 2], [306, 666, 7, 11, 8, 2], [306, 718, 9, 4, 10, 3], [306, 766, 1, 1, 3, 1], [367, 2, 10, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 106, 10, 11, 10, 3], [367, 154, 9, 12, 9, 0], [367, 205, 10, 12, 10, 0], [367, 257, 10, 11, 10, 1], [367, 308, 10, 11, 10, 1], [367, 360, 9, 10, 9, 2], [367, 411, 9, 10, 9, 2], [367, 462, 9, 10, 9, 2], [367, 514, 9, 9, 9, 3], [367, 564, 9, 10, 9, 2], [367, 614, 9, 11, 9, 1], [367, 669, 9, 9, 9, 5], [367, 717, 9, 10, 9, 2], [367, 768, 9, 10, 9, 2], [428, 3, 9, 10, 9, 2], [428, 55, 9, 9, 9, 3], [428, 105, 7, 10, 7, 2], [428, 156, 7, 10, 7, 2], [428, 207, 8, 10, 8, 2], [428, 259, 8, 9, 8, 3], [428, 309, 9, 10, 9, 2], [428, 360, 9, 10, 9, 2], [428, 411, 9, 10, 9, 2], [428, 462, 9, 10, 9, 2], [428, 514, 9, 9, 9, 3], [428, 564, 9, 10, 9, 2], [428, 615, 9, 10, 9, 2], [428, 666, 9, 10, 9, 2], [428, 717, 9, 10, 9, 2], [428, 769, 9, 9, 9, 3], [489, 3, 7, 7, 8, 2], [489, 54, 8, 6, 9, 2], [489, 106, 10, 9, 10, 3], [489, 157, 9, 9, 10, 3], [489, 207, 10, 11, 10, 2], [489, 260, 9, 7, 10, 4], [489, 310, 10, 9, 10, 3], [489, 361, 10, 9, 10, 3], [489, 411, 13, 10, 13, 2], [489, 462, 13, 10, 13, 2], [489, 514, 13, 6, 13, 3], [489, 565, 7, 4, 8, 3], [489, 616, 7, 3, 8, 3], [489, 668, 9, 7, 10, 4], [489, 718, 13, 9, 13, 3], [489, 769, 11, 9, 11, 3], [550, 5, 14, 7, 14, 4], [550, 56, 9, 8, 10, 4], [550, 107, 8, 8, 9, 4], [550, 158, 8, 8, 9, 4], [550, 208, 10, 9, 10, 3], [550, 260, 9, 10, 10, 4], [550, 310, 9, 9, 9, 3], [550, 361, 10, 9, 10, 3], [550, 412, 11, 9, 11, 3], [550, 463, 12, 9, 12, 3], [550, 512, 9, 13, 9, 1], [550, 565, 8, 8, 9, 3], [550, 616, 8, 8, 9, 3], [550, 666, 12, 10, 12, 2], [550, 720, 13, 7, 13, 5], [550, 770, 10, 8, 10, 4], [611, 4, 9, 9, 10, 3], [611, 55, 7, 9, 7, 3], [611, 109, 8, 5, 9, 6], [611, 156, 11, 10, 12, 2], [611, 206, 9, 13, 9, 1], [611, 260, 9, 7, 10, 4], [611, 311, 10, 8, 11, 4], [611, 363, 10, 7, 12, 5], [611, 414, 11, 7, 12, 5], [611, 469, 11, 3, 12, 9], [611, 511, 1, 1, 10, 1], [611, 563, 10, 11, 11, 1], [611, 613, 10, 12, 11, 0], [611, 664, 10, 12, 10, 0], [611, 718, 13, 9, 13, 3], [611, 771, 12, 7, 12, 5], [672, 8, 8, 3, 9, 7], [672, 59, 10, 3, 11, 7], [672, 105, 9, 5, 11, 2], [672, 156, 10, 5, 11, 2], [672, 207, 7, 5, 8, 2], [672, 258, 7, 5, 8, 2], [672, 311, 9, 7, 10, 4], [672, 361, 11, 9, 12, 3], [672, 412, 10, 11, 10, 3], [1, 1, 1, 1, 7, 1], [794, 769, 11, 9, 11, 3], [672, 565, 11, 9, 11, 3], [672, 616, 11, 9, 11, 3], [672, 667, 11, 9, 11, 3], [672, 718, 11, 9, 11, 3], [672, 769, 11, 9, 11, 3], [733, 4, 11, 9, 11, 3], [733, 55, 11, 9, 11, 3], [733, 106, 11, 9, 11, 3], [733, 157, 11, 9, 11, 3], [733, 208, 11, 9, 11, 3], [733, 259, 11, 9, 11, 3], [733, 310, 11, 9, 11, 3], [733, 361, 11, 9, 11, 3], [733, 412, 11, 9, 11, 3], [733, 463, 11, 9, 11, 3], [733, 514, 11, 9, 11, 3], [733, 565, 11, 9, 11, 3], [733, 616, 11, 9, 11, 3], [733, 667, 11, 9, 11, 3], [733, 718, 11, 9, 11, 3], [733, 769, 11, 9, 11, 3], [1, 1, 1, 1, 7, 1], [794, 55, 11, 9, 11, 3], [794, 106, 11, 9, 11, 3], [794, 157, 11, 9, 11, 3], [794, 208, 11, 9, 11, 3], [794, 259, 11, 9, 11, 3], [794, 310, 11, 9, 11, 3], [794, 361, 11, 9, 11, 3], [794, 412, 11, 9, 11, 3], [794, 463, 11, 9, 11, 3], [794, 514, 11, 9, 11, 3], [794, 565, 11, 9, 11, 3], [794, 616, 11, 9, 11, 3], [794, 667, 11, 9, 11, 3], [794, 718, 11, 9, 11, 3], [794, 769, 11, 9, 11, 3], [855, 4, 11, 9, 11, 3], [855, 55, 11, 9, 11, 3], [855, 106, 11, 9, 11, 3], [855, 157, 11, 9, 11, 3], [855, 208, 11, 9, 11, 3], [855, 259, 11, 9, 11, 3], [855, 310, 11, 9, 11, 3], [855, 361, 11, 9, 11, 3], [855, 412, 11, 9, 11, 3], [855, 463, 11, 9, 11, 3], [855, 514, 11, 9, 11, 3], [855, 565, 11, 9, 11, 3], [855, 616, 11, 9, 11, 3], [855, 667, 11, 9, 11, 3], [855, 718, 11, 9, 11, 3], [855, 769, 11, 9, 11, 3]], \"capHeight\": 11, \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 55, 6, 7, 6, 3], [1, 106, 7, 2, 8, 3], [1, 156, 9, 5, 10, 2], [1, 207, 9, 9, 9, 2], [1, 259, 12, 7, 12, 3], [1, 309, 10, 8, 11, 2], [1, 361, 5, 2, 6, 3], [1, 411, 7, 9, 7, 2], [1, 462, 7, 9, 7, 2], [1, 514, 9, 5, 10, 3], [1, 566, 8, 5, 9, 4], [1, 622, 6, 3, 7, 9], [1, 670, 7, 1, 8, 6], [1, 724, 5, 1, 6, 9], [1, 768, 8, 8, 9, 2], [62, 4, 9, 7, 9, 3], [62, 55, 7, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 8, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 8, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 516, 7, 5, 7, 5], [62, 567, 7, 7, 7, 5], [62, 617, 7, 5, 8, 4], [62, 669, 9, 3, 9, 5], [62, 719, 7, 5, 8, 4], [62, 769, 9, 7, 9, 3], [123, 4, 11, 8, 11, 3], [123, 55, 9, 7, 10, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 8, 7, 9, 3], [123, 259, 8, 7, 8, 3], [123, 310, 8, 7, 8, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 6, 7, 6, 3], [123, 514, 9, 7, 9, 3], [123, 565, 9, 7, 9, 3], [123, 616, 7, 7, 8, 3], [123, 667, 11, 7, 11, 3], [123, 718, 9, 7, 9, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 11, 7, 11, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 8, 7, 8, 3], [184, 564, 7, 9, 7, 2], [184, 615, 8, 8, 9, 2], [184, 666, 7, 9, 7, 2], [184, 718, 6, 2, 7, 3], [184, 775, 9, 1, 9, 9], [245, 4, 5, 2, 6, 3], [245, 57, 8, 5, 8, 5], [245, 106, 8, 7, 8, 3], [245, 159, 8, 5, 8, 5], [245, 208, 8, 7, 8, 3], [245, 261, 8, 5, 8, 5], [245, 310, 8, 7, 7, 3], [245, 363, 8, 7, 8, 5], [245, 412, 8, 7, 8, 3], [245, 463, 6, 7, 6, 3], [245, 514, 6, 9, 7, 3], [245, 565, 8, 7, 8, 3], [245, 616, 6, 7, 6, 3], [245, 669, 11, 5, 11, 5], [245, 720, 8, 5, 8, 5], [245, 771, 8, 5, 8, 5], [306, 6, 8, 7, 8, 5], [306, 57, 8, 7, 8, 5], [306, 108, 8, 5, 8, 5], [306, 159, 8, 5, 8, 5], [306, 208, 8, 7, 7, 3], [306, 261, 8, 5, 8, 5], [306, 312, 9, 5, 9, 5], [306, 363, 11, 5, 11, 5], [306, 414, 9, 5, 9, 5], [306, 465, 8, 7, 9, 5], [306, 516, 8, 5, 8, 5], [306, 564, 7, 9, 7, 2], [306, 615, 4, 9, 5, 2], [306, 666, 6, 9, 7, 2], [306, 718, 8, 2, 9, 3], [306, 766, 1, 1, 3, 1], [367, 2, 9, 9, 10, 1], [367, 52, 10, 10, 10, 0], [367, 106, 9, 9, 9, 3], [367, 154, 8, 10, 8, 0], [367, 205, 9, 10, 9, 0], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 8, 8, 8, 2], [367, 411, 8, 8, 8, 2], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 614, 8, 9, 8, 1], [367, 669, 8, 7, 8, 5], [367, 717, 8, 8, 8, 2], [367, 768, 8, 8, 8, 2], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 8, 8, 8, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 8, 8, 8, 2], [428, 666, 8, 8, 8, 2], [428, 717, 8, 8, 8, 2], [428, 769, 8, 7, 8, 3], [489, 3, 6, 5, 7, 2], [489, 54, 7, 4, 8, 2], [489, 106, 9, 7, 9, 3], [489, 157, 8, 7, 9, 3], [489, 207, 9, 9, 9, 2], [489, 260, 8, 5, 9, 4], [489, 310, 9, 7, 9, 3], [489, 361, 9, 7, 9, 3], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 514, 12, 4, 12, 3], [489, 565, 6, 2, 7, 3], [489, 616, 6, 1, 7, 3], [489, 668, 8, 5, 9, 4], [489, 718, 12, 7, 12, 3], [489, 769, 11, 7, 10, 3], [550, 5, 13, 5, 13, 4], [550, 56, 8, 6, 9, 4], [550, 107, 7, 6, 8, 4], [550, 158, 7, 6, 8, 4], [550, 208, 9, 7, 9, 3], [550, 260, 8, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 9, 7, 9, 3], [550, 412, 10, 7, 10, 3], [550, 463, 11, 7, 11, 3], [550, 512, 8, 11, 8, 1], [550, 565, 7, 6, 8, 3], [550, 616, 7, 6, 8, 3], [550, 666, 11, 8, 11, 2], [550, 720, 12, 5, 12, 5], [550, 770, 10, 6, 9, 4], [611, 4, 8, 7, 9, 3], [611, 55, 6, 7, 6, 3], [611, 109, 7, 3, 8, 6], [611, 156, 10, 8, 11, 2], [611, 206, 8, 11, 8, 1], [611, 260, 8, 5, 9, 4], [611, 311, 9, 6, 10, 4], [611, 363, 9, 5, 11, 5], [611, 414, 10, 5, 11, 5], [611, 469, 10, 1, 11, 9], [611, 511, 1, 1, 9, 1], [611, 563, 9, 9, 10, 1], [611, 613, 9, 10, 10, 0], [611, 664, 9, 10, 9, 0], [611, 718, 12, 7, 12, 3], [611, 771, 11, 5, 11, 5], [672, 8, 7, 1, 8, 7], [672, 59, 9, 1, 10, 7], [672, 105, 8, 3, 10, 2], [672, 156, 9, 3, 10, 2], [672, 207, 6, 3, 7, 2], [672, 258, 6, 3, 7, 2], [672, 311, 8, 5, 9, 4], [672, 361, 10, 7, 11, 3], [672, 412, 9, 9, 9, 3], [1, 1, 1, 1, 6, 1], [794, 769, 10, 7, 10, 3], [672, 565, 10, 7, 10, 3], [672, 616, 10, 7, 10, 3], [672, 667, 10, 7, 10, 3], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 10, 7, 10, 3], [733, 55, 10, 7, 10, 3], [733, 106, 10, 7, 10, 3], [733, 157, 10, 7, 10, 3], [733, 208, 10, 7, 10, 3], [733, 259, 10, 7, 10, 3], [733, 310, 10, 7, 10, 3], [733, 361, 10, 7, 10, 3], [733, 412, 10, 7, 10, 3], [733, 463, 10, 7, 10, 3], [733, 514, 10, 7, 10, 3], [733, 565, 10, 7, 10, 3], [733, 616, 10, 7, 10, 3], [733, 667, 10, 7, 10, 3], [733, 718, 10, 7, 10, 3], [733, 769, 10, 7, 10, 3], [1, 1, 1, 1, 6, 1], [794, 55, 10, 7, 10, 3], [794, 106, 10, 7, 10, 3], [794, 157, 10, 7, 10, 3], [794, 208, 10, 7, 10, 3], [794, 259, 10, 7, 10, 3], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 616, 10, 7, 10, 3], [794, 667, 10, 7, 10, 3], [794, 718, 10, 7, 10, 3], [794, 769, 10, 7, 10, 3], [855, 4, 10, 7, 10, 3], [855, 55, 10, 7, 10, 3], [855, 106, 10, 7, 10, 3], [855, 157, 10, 7, 10, 3], [855, 208, 10, 7, 10, 3], [855, 259, 10, 7, 10, 3], [855, 310, 10, 7, 10, 3], [855, 361, 10, 7, 10, 3], [855, 412, 10, 7, 10, 3], [855, 463, 10, 7, 10, 3], [855, 514, 10, 7, 10, 3], [855, 565, 10, 7, 10, 3], [855, 616, 10, 7, 10, 3], [855, 667, 10, 7, 10, 3], [855, 718, 10, 7, 10, 3], [855, 769, 10, 7, 10, 3]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 55, 7, 9, 7, 3], [1, 106, 9, 8, 9, 3], [1, 156, 11, 9, 11, 2], [1, 207, 10, 11, 10, 2], [1, 259, 13, 9, 13, 3], [1, 309, 12, 10, 12, 2], [1, 361, 7, 8, 7, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 514, 11, 8, 11, 3], [1, 566, 10, 7, 10, 4], [1, 618, 8, 9, 8, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 7, 7, 5], [1, 768, 10, 10, 10, 2], [62, 4, 10, 9, 10, 3], [62, 55, 10, 9, 10, 3], [62, 106, 10, 9, 10, 3], [62, 157, 10, 9, 10, 3], [62, 208, 10, 9, 10, 3], [62, 259, 10, 9, 10, 3], [62, 310, 10, 9, 10, 3], [62, 361, 10, 9, 10, 3], [62, 412, 10, 9, 10, 3], [62, 463, 10, 9, 10, 3], [62, 516, 8, 7, 8, 5], [62, 567, 8, 9, 8, 5], [62, 617, 9, 7, 9, 4], [62, 669, 10, 6, 10, 5], [62, 719, 9, 7, 9, 4], [62, 769, 10, 9, 10, 3], [123, 4, 12, 10, 12, 3], [123, 55, 11, 9, 11, 3], [123, 106, 10, 9, 10, 3], [123, 157, 10, 9, 10, 3], [123, 208, 10, 9, 10, 3], [123, 259, 9, 9, 9, 3], [123, 310, 9, 9, 9, 3], [123, 361, 10, 9, 10, 3], [123, 412, 10, 9, 10, 3], [123, 463, 7, 9, 7, 3], [123, 514, 10, 9, 10, 3], [123, 565, 10, 9, 10, 3], [123, 616, 9, 9, 9, 3], [123, 667, 12, 9, 12, 3], [123, 718, 10, 9, 10, 3], [123, 769, 10, 9, 10, 3], [184, 4, 10, 9, 10, 3], [184, 55, 10, 10, 10, 3], [184, 106, 10, 9, 10, 3], [184, 157, 10, 9, 10, 3], [184, 208, 10, 9, 10, 3], [184, 259, 10, 9, 10, 3], [184, 310, 10, 9, 10, 3], [184, 361, 12, 9, 12, 3], [184, 412, 10, 9, 10, 3], [184, 463, 10, 9, 10, 3], [184, 514, 9, 9, 9, 3], [184, 564, 8, 11, 8, 2], [184, 615, 10, 10, 10, 2], [184, 666, 8, 11, 8, 2], [184, 718, 8, 8, 8, 3], [184, 771, 10, 7, 10, 5], [245, 4, 7, 8, 7, 3], [245, 57, 9, 7, 9, 5], [245, 106, 9, 9, 9, 3], [245, 159, 9, 7, 9, 5], [245, 208, 9, 9, 9, 3], [245, 261, 9, 7, 9, 5], [245, 310, 8, 9, 8, 3], [245, 363, 9, 9, 9, 5], [245, 412, 9, 9, 9, 3], [245, 463, 7, 9, 7, 3], [245, 514, 8, 11, 8, 3], [245, 565, 9, 9, 9, 3], [245, 616, 7, 9, 7, 3], [245, 669, 12, 7, 12, 5], [245, 720, 9, 7, 9, 5], [245, 771, 9, 7, 9, 5], [306, 6, 9, 9, 9, 5], [306, 57, 9, 9, 9, 5], [306, 108, 9, 7, 9, 5], [306, 159, 9, 7, 9, 5], [306, 208, 8, 9, 8, 3], [306, 261, 9, 7, 9, 5], [306, 312, 10, 7, 10, 5], [306, 363, 12, 7, 12, 5], [306, 414, 10, 7, 10, 5], [306, 465, 10, 9, 10, 5], [306, 516, 9, 7, 9, 5], [306, 564, 8, 11, 8, 2], [306, 615, 6, 11, 6, 2], [306, 666, 8, 11, 8, 2], [306, 718, 10, 8, 10, 3], [306, 771, 3, 6, 3, 5], [367, 2, 11, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 106, 10, 11, 10, 3], [367, 154, 9, 12, 9, 0], [367, 205, 10, 12, 10, 0], [367, 257, 10, 11, 10, 1], [367, 308, 10, 11, 10, 1], [367, 360, 9, 10, 9, 2], [367, 411, 9, 10, 9, 2], [367, 462, 9, 10, 9, 2], [367, 514, 9, 9, 9, 3], [367, 564, 9, 10, 9, 2], [367, 614, 9, 11, 9, 1], [367, 669, 9, 9, 9, 5], [367, 717, 9, 10, 9, 2], [367, 768, 9, 10, 9, 2], [428, 3, 9, 10, 9, 2], [428, 55, 9, 9, 9, 3], [428, 105, 7, 10, 7, 2], [428, 156, 7, 10, 7, 2], [428, 207, 8, 10, 8, 2], [428, 259, 8, 9, 8, 3], [428, 309, 9, 10, 9, 2], [428, 360, 9, 10, 9, 2], [428, 411, 9, 10, 9, 2], [428, 462, 9, 10, 9, 2], [428, 514, 9, 9, 9, 3], [428, 564, 9, 10, 9, 2], [428, 615, 9, 10, 9, 2], [428, 666, 9, 10, 9, 2], [428, 717, 9, 10, 9, 2], [428, 769, 9, 9, 9, 3], [489, 3, 8, 9, 8, 2], [489, 54, 9, 9, 9, 2], [489, 106, 10, 9, 10, 3], [489, 157, 10, 9, 10, 3], [489, 207, 10, 11, 10, 2], [489, 260, 10, 7, 10, 4], [489, 310, 10, 9, 10, 3], [489, 361, 10, 9, 10, 3], [489, 411, 13, 10, 13, 2], [489, 462, 13, 10, 13, 2], [489, 514, 13, 8, 13, 3], [489, 565, 8, 8, 8, 3], [489, 616, 8, 8, 8, 3], [489, 668, 10, 7, 10, 4], [489, 718, 13, 9, 13, 3], [489, 769, 11, 9, 11, 3], [550, 5, 14, 7, 14, 4], [550, 56, 10, 8, 10, 4], [550, 107, 9, 8, 9, 4], [550, 158, 9, 8, 9, 4], [550, 208, 10, 9, 10, 3], [550, 260, 10, 10, 10, 4], [550, 310, 9, 9, 9, 3], [550, 361, 10, 9, 10, 3], [550, 412, 11, 9, 11, 3], [550, 463, 12, 9, 12, 3], [550, 512, 9, 13, 9, 1], [550, 565, 9, 8, 9, 3], [550, 616, 9, 8, 9, 3], [550, 666, 12, 10, 12, 2], [550, 720, 13, 7, 13, 5], [550, 770, 10, 8, 10, 4], [611, 4, 10, 9, 10, 3], [611, 55, 7, 9, 7, 3], [611, 108, 9, 6, 9, 5], [611, 156, 12, 10, 12, 2], [611, 206, 9, 13, 9, 1], [611, 260, 10, 7, 10, 4], [611, 311, 11, 8, 11, 4], [611, 363, 12, 7, 12, 5], [611, 414, 12, 7, 12, 5], [611, 465, 12, 7, 12, 5], [611, 516, 10, 6, 10, 5], [611, 563, 11, 11, 11, 1], [611, 613, 11, 12, 11, 0], [611, 664, 10, 12, 10, 0], [611, 718, 13, 9, 13, 3], [611, 771, 12, 7, 12, 5], [672, 6, 9, 6, 9, 5], [672, 57, 11, 6, 11, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 8, 9, 8, 2], [672, 258, 8, 9, 8, 2], [672, 311, 10, 7, 10, 4], [672, 361, 12, 9, 12, 3], [672, 412, 10, 11, 10, 3], [1, 6, 7, 6, 7, 5], [794, 769, 11, 9, 11, 3], [672, 565, 11, 9, 11, 3], [672, 616, 11, 9, 11, 3], [672, 667, 11, 9, 11, 3], [672, 718, 11, 9, 11, 3], [672, 769, 11, 9, 11, 3], [733, 4, 11, 9, 11, 3], [733, 55, 11, 9, 11, 3], [733, 106, 11, 9, 11, 3], [733, 157, 11, 9, 11, 3], [733, 208, 11, 9, 11, 3], [733, 259, 11, 9, 11, 3], [733, 310, 11, 9, 11, 3], [733, 361, 11, 9, 11, 3], [733, 412, 11, 9, 11, 3], [733, 463, 11, 9, 11, 3], [733, 514, 11, 9, 11, 3], [733, 565, 11, 9, 11, 3], [733, 616, 11, 9, 11, 3], [733, 667, 11, 9, 11, 3], [733, 718, 11, 9, 11, 3], [733, 769, 11, 9, 11, 3], [1, 6, 7, 6, 7, 5], [794, 55, 11, 9, 11, 3], [794, 106, 11, 9, 11, 3], [794, 157, 11, 9, 11, 3], [794, 208, 11, 9, 11, 3], [794, 259, 11, 9, 11, 3], [794, 310, 11, 9, 11, 3], [794, 361, 11, 9, 11, 3], [794, 412, 11, 9, 11, 3], [794, 463, 11, 9, 11, 3], [794, 514, 11, 9, 11, 3], [794, 565, 11, 9, 11, 3], [794, 616, 11, 9, 11, 3], [794, 667, 11, 9, 11, 3], [794, 718, 11, 9, 11, 3], [794, 769, 11, 9, 11, 3], [855, 4, 11, 9, 11, 3], [855, 55, 11, 9, 11, 3], [855, 106, 11, 9, 11, 3], [855, 157, 11, 9, 11, 3], [855, 208, 11, 9, 11, 3], [855, 259, 11, 9, 11, 3], [855, 310, 11, 9, 11, 3], [855, 361, 11, 9, 11, 3], [855, 412, 11, 9, 11, 3], [855, 463, 11, 9, 11, 3], [855, 514, 11, 9, 11, 3], [855, 565, 11, 9, 11, 3], [855, 616, 11, 9, 11, 3], [855, 667, 11, 9, 11, 3], [855, 718, 11, 9, 11, 3], [855, 769, 11, 9, 11, 3]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_biuos+dce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 8, 7, 8, 3], [1, 156, 10, 8, 10, 2], [1, 207, 9, 9, 9, 2], [1, 259, 12, 7, 12, 3], [1, 309, 11, 8, 11, 2], [1, 361, 6, 7, 6, 3], [1, 411, 7, 9, 7, 2], [1, 462, 7, 9, 7, 2], [1, 514, 10, 7, 10, 3], [1, 566, 9, 6, 9, 4], [1, 617, 7, 8, 7, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 768, 9, 8, 9, 2], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 8, 6, 8, 4], [62, 668, 9, 6, 9, 4], [62, 719, 8, 6, 8, 4], [62, 769, 9, 7, 9, 3], [123, 4, 11, 8, 11, 3], [123, 55, 10, 7, 10, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 8, 7, 8, 3], [123, 310, 8, 7, 8, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 6, 7, 6, 3], [123, 514, 9, 7, 9, 3], [123, 565, 9, 7, 9, 3], [123, 616, 8, 7, 8, 3], [123, 667, 11, 7, 11, 3], [123, 718, 9, 7, 9, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 11, 7, 11, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 8, 7, 8, 3], [184, 564, 7, 9, 7, 2], [184, 615, 9, 8, 9, 2], [184, 666, 7, 9, 7, 2], [184, 718, 7, 7, 7, 3], [184, 770, 9, 6, 9, 4], [245, 4, 6, 7, 6, 3], [245, 56, 8, 6, 8, 4], [245, 106, 8, 7, 8, 3], [245, 158, 8, 6, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 8, 6, 8, 4], [245, 310, 7, 7, 7, 3], [245, 362, 8, 8, 8, 4], [245, 412, 8, 7, 8, 3], [245, 463, 6, 7, 6, 3], [245, 514, 7, 9, 7, 3], [245, 565, 8, 7, 8, 3], [245, 616, 6, 7, 6, 3], [245, 668, 11, 6, 11, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 8, 8, 8, 4], [306, 107, 8, 6, 8, 4], [306, 158, 8, 6, 8, 4], [306, 208, 7, 7, 7, 3], [306, 260, 8, 6, 8, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 564, 7, 9, 7, 2], [306, 615, 5, 9, 5, 2], [306, 666, 7, 9, 7, 2], [306, 718, 9, 7, 9, 3], [306, 770, 3, 6, 3, 4], [367, 2, 10, 9, 10, 1], [367, 52, 10, 10, 10, 0], [367, 106, 9, 9, 9, 3], [367, 154, 8, 10, 8, 0], [367, 205, 9, 10, 9, 0], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 8, 8, 8, 2], [367, 411, 8, 8, 8, 2], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 717, 8, 8, 8, 2], [367, 768, 8, 8, 8, 2], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 8, 8, 8, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 8, 8, 8, 2], [428, 666, 8, 8, 8, 2], [428, 717, 8, 8, 8, 2], [428, 769, 8, 7, 8, 3], [489, 3, 7, 8, 7, 2], [489, 54, 8, 8, 8, 2], [489, 106, 9, 7, 9, 3], [489, 157, 9, 7, 9, 3], [489, 207, 9, 9, 9, 2], [489, 260, 9, 6, 9, 4], [489, 310, 9, 7, 9, 3], [489, 361, 9, 7, 9, 3], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 514, 12, 7, 12, 3], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 6, 9, 4], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 5, 13, 6, 13, 4], [550, 56, 9, 6, 9, 4], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 208, 9, 7, 9, 3], [550, 260, 9, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 9, 7, 9, 3], [550, 412, 10, 7, 10, 3], [550, 463, 11, 7, 11, 3], [550, 512, 8, 11, 8, 1], [550, 565, 8, 7, 8, 3], [550, 616, 8, 7, 8, 3], [550, 666, 11, 8, 11, 2], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 4, 9, 7, 9, 3], [611, 55, 6, 7, 6, 3], [611, 107, 8, 6, 8, 4], [611, 156, 11, 8, 11, 2], [611, 206, 8, 11, 8, 1], [611, 260, 9, 6, 9, 4], [611, 311, 10, 6, 10, 4], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 11, 6, 11, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 9, 10, 1], [611, 613, 10, 10, 10, 0], [611, 664, 9, 10, 9, 0], [611, 718, 12, 7, 12, 3], [611, 770, 11, 6, 11, 4], [672, 5, 8, 6, 8, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 9, 6, 9, 4], [672, 361, 11, 7, 11, 3], [672, 412, 9, 9, 9, 3], [1, 5, 6, 6, 6, 4], [794, 769, 10, 7, 10, 3], [672, 565, 10, 7, 10, 3], [672, 616, 10, 7, 10, 3], [672, 667, 10, 7, 10, 3], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 10, 7, 10, 3], [733, 55, 10, 7, 10, 3], [733, 106, 10, 7, 10, 3], [733, 157, 10, 7, 10, 3], [733, 208, 10, 7, 10, 3], [733, 259, 10, 7, 10, 3], [733, 310, 10, 7, 10, 3], [733, 361, 10, 7, 10, 3], [733, 412, 10, 7, 10, 3], [733, 463, 10, 7, 10, 3], [733, 514, 10, 7, 10, 3], [733, 565, 10, 7, 10, 3], [733, 616, 10, 7, 10, 3], [733, 667, 10, 7, 10, 3], [733, 718, 10, 7, 10, 3], [733, 769, 10, 7, 10, 3], [1, 5, 6, 6, 6, 4], [794, 55, 10, 7, 10, 3], [794, 106, 10, 7, 10, 3], [794, 157, 10, 7, 10, 3], [794, 208, 10, 7, 10, 3], [794, 259, 10, 7, 10, 3], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 616, 10, 7, 10, 3], [794, 667, 10, 7, 10, 3], [794, 718, 10, 7, 10, 3], [794, 769, 10, 7, 10, 3], [855, 4, 10, 7, 10, 3], [855, 55, 10, 7, 10, 3], [855, 106, 10, 7, 10, 3], [855, 157, 10, 7, 10, 3], [855, 208, 10, 7, 10, 3], [855, 259, 10, 7, 10, 3], [855, 310, 10, 7, 10, 3], [855, 361, 10, 7, 10, 3], [855, 412, 10, 7, 10, 3], [855, 463, 10, 7, 10, 3], [855, 514, 10, 7, 10, 3], [855, 565, 10, 7, 10, 3], [855, 616, 10, 7, 10, 3], [855, 667, 10, 7, 10, 3], [855, 718, 10, 7, 10, 3], [855, 769, 10, 7, 10, 3]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/02_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 8, 7, 8, 3], [1, 156, 10, 8, 10, 2], [1, 207, 9, 9, 9, 2], [1, 259, 12, 7, 12, 3], [1, 309, 11, 8, 11, 2], [1, 361, 6, 7, 6, 3], [1, 411, 7, 9, 7, 2], [1, 462, 7, 9, 7, 2], [1, 514, 10, 7, 10, 3], [1, 566, 9, 6, 9, 4], [1, 617, 7, 8, 7, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 768, 9, 8, 9, 2], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 8, 6, 8, 4], [62, 668, 9, 6, 9, 4], [62, 719, 8, 6, 8, 4], [62, 769, 9, 7, 9, 3], [123, 4, 11, 8, 11, 3], [123, 55, 10, 7, 10, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 8, 7, 8, 3], [123, 310, 8, 7, 8, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 6, 7, 6, 3], [123, 514, 9, 7, 9, 3], [123, 565, 9, 7, 9, 3], [123, 616, 8, 7, 8, 3], [123, 667, 11, 7, 11, 3], [123, 718, 9, 7, 9, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 11, 7, 11, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 8, 7, 8, 3], [184, 564, 7, 9, 7, 2], [184, 615, 9, 8, 9, 2], [184, 666, 7, 9, 7, 2], [184, 718, 7, 7, 7, 3], [184, 770, 9, 6, 9, 4], [245, 4, 6, 7, 6, 3], [245, 56, 8, 6, 8, 4], [245, 106, 8, 7, 8, 3], [245, 158, 8, 6, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 8, 6, 8, 4], [245, 310, 7, 7, 7, 3], [245, 362, 8, 8, 8, 4], [245, 412, 8, 7, 8, 3], [245, 463, 6, 7, 6, 3], [245, 514, 7, 9, 7, 3], [245, 565, 8, 7, 8, 3], [245, 616, 6, 7, 6, 3], [245, 668, 11, 6, 11, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 8, 8, 8, 4], [306, 107, 8, 6, 8, 4], [306, 158, 8, 6, 8, 4], [306, 208, 7, 7, 7, 3], [306, 260, 8, 6, 8, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 564, 7, 9, 7, 2], [306, 615, 5, 9, 5, 2], [306, 666, 7, 9, 7, 2], [306, 718, 9, 7, 9, 3], [306, 770, 3, 6, 3, 4], [367, 2, 10, 9, 10, 1], [367, 52, 10, 10, 10, 0], [367, 106, 9, 9, 9, 3], [367, 154, 8, 10, 8, 0], [367, 205, 9, 10, 9, 0], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 8, 8, 8, 2], [367, 411, 8, 8, 8, 2], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 717, 8, 8, 8, 2], [367, 768, 8, 8, 8, 2], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 8, 8, 8, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 8, 8, 8, 2], [428, 666, 8, 8, 8, 2], [428, 717, 8, 8, 8, 2], [428, 769, 8, 7, 8, 3], [489, 3, 7, 8, 7, 2], [489, 54, 8, 8, 8, 2], [489, 106, 9, 7, 9, 3], [489, 157, 9, 7, 9, 3], [489, 207, 9, 9, 9, 2], [489, 260, 9, 6, 9, 4], [489, 310, 9, 7, 9, 3], [489, 361, 9, 7, 9, 3], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 514, 12, 7, 12, 3], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 6, 9, 4], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 5, 13, 6, 13, 4], [550, 56, 9, 6, 9, 4], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 208, 9, 7, 9, 3], [550, 260, 9, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 9, 7, 9, 3], [550, 412, 10, 7, 10, 3], [550, 463, 11, 7, 11, 3], [550, 512, 8, 11, 8, 1], [550, 565, 8, 7, 8, 3], [550, 616, 8, 7, 8, 3], [550, 666, 11, 8, 11, 2], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 4, 9, 7, 9, 3], [611, 55, 6, 7, 6, 3], [611, 107, 8, 6, 8, 4], [611, 156, 11, 8, 11, 2], [611, 206, 8, 11, 8, 1], [611, 260, 9, 6, 9, 4], [611, 311, 10, 6, 10, 4], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 11, 6, 11, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 9, 10, 1], [611, 613, 10, 10, 10, 0], [611, 664, 9, 10, 9, 0], [611, 718, 12, 7, 12, 3], [611, 770, 11, 6, 11, 4], [672, 5, 8, 6, 8, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 9, 6, 9, 4], [672, 361, 11, 7, 11, 3], [672, 412, 9, 9, 9, 3], [1, 5, 6, 6, 6, 4], [794, 769, 10, 7, 10, 3], [672, 565, 10, 7, 10, 3], [672, 616, 10, 7, 10, 3], [672, 667, 10, 7, 10, 3], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 10, 7, 10, 3], [733, 55, 10, 7, 10, 3], [733, 106, 10, 7, 10, 3], [733, 157, 10, 7, 10, 3], [733, 208, 10, 7, 10, 3], [733, 259, 10, 7, 10, 3], [733, 310, 10, 7, 10, 3], [733, 361, 10, 7, 10, 3], [733, 412, 10, 7, 10, 3], [733, 463, 10, 7, 10, 3], [733, 514, 10, 7, 10, 3], [733, 565, 10, 7, 10, 3], [733, 616, 10, 7, 10, 3], [733, 667, 10, 7, 10, 3], [733, 718, 10, 7, 10, 3], [733, 769, 10, 7, 10, 3], [1, 5, 6, 6, 6, 4], [794, 55, 10, 7, 10, 3], [794, 106, 10, 7, 10, 3], [794, 157, 10, 7, 10, 3], [794, 208, 10, 7, 10, 3], [794, 259, 10, 7, 10, 3], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 616, 10, 7, 10, 3], [794, 667, 10, 7, 10, 3], [794, 718, 10, 7, 10, 3], [794, 769, 10, 7, 10, 3], [855, 4, 10, 7, 10, 3], [855, 55, 10, 7, 10, 3], [855, 106, 10, 7, 10, 3], [855, 157, 10, 7, 10, 3], [855, 208, 10, 7, 10, 3], [855, 259, 10, 7, 10, 3], [855, 310, 10, 7, 10, 3], [855, 361, 10, 7, 10, 3], [855, 412, 10, 7, 10, 3], [855, 463, 10, 7, 10, 3], [855, 514, 10, 7, 10, 3], [855, 565, 10, 7, 10, 3], [855, 616, 10, 7, 10, 3], [855, 667, 10, 7, 10, 3], [855, 718, 10, 7, 10, 3], [855, 769, 10, 7, 10, 3]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 11, 10, 8, 2], [1, 105, 13, 4, 10, 2], [1, 156, 16, 7, 13, 2], [1, 206, 14, 12, 11, 1], [1, 258, 16, 10, 15, 2], [1, 309, 15, 10, 13, 2], [1, 360, 11, 4, 8, 2], [1, 410, 14, 12, 10, 1], [1, 461, 12, 12, 10, 1], [1, 513, 14, 7, 12, 2], [1, 566, 12, 7, 11, 4], [1, 622, 8, 4, 8, 9], [1, 670, 11, 3, 10, 6], [1, 724, 8, 3, 8, 9], [1, 768, 14, 10, 11, 2], [62, 3, 14, 10, 11, 2], [62, 54, 12, 10, 11, 2], [62, 105, 14, 10, 11, 2], [62, 156, 14, 11, 11, 2], [62, 207, 13, 10, 11, 2], [62, 258, 13, 11, 11, 2], [62, 309, 13, 10, 11, 2], [62, 360, 14, 10, 11, 2], [62, 411, 14, 10, 11, 2], [62, 462, 14, 10, 11, 2], [62, 516, 10, 7, 8, 5], [62, 567, 10, 8, 8, 5], [62, 617, 11, 7, 9, 4], [62, 669, 12, 5, 10, 5], [62, 719, 10, 7, 9, 4], [62, 768, 14, 10, 11, 2], [123, 4, 16, 10, 13, 3], [123, 54, 13, 10, 13, 2], [123, 105, 15, 10, 12, 2], [123, 156, 14, 10, 11, 2], [123, 207, 14, 10, 12, 2], [123, 258, 14, 10, 11, 2], [123, 309, 14, 10, 11, 2], [123, 360, 14, 10, 12, 2], [123, 411, 16, 10, 13, 2], [123, 462, 13, 10, 10, 2], [123, 513, 14, 12, 10, 2], [123, 564, 16, 10, 13, 2], [123, 615, 12, 10, 12, 2], [123, 666, 18, 10, 15, 2], [123, 717, 16, 10, 13, 2], [123, 768, 14, 10, 11, 2], [184, 3, 15, 10, 12, 2], [184, 54, 14, 12, 11, 2], [184, 105, 15, 10, 13, 2], [184, 156, 14, 10, 11, 2], [184, 207, 14, 10, 11, 2], [184, 258, 16, 10, 13, 2], [184, 309, 16, 10, 13, 2], [184, 360, 18, 10, 15, 2], [184, 411, 14, 10, 11, 2], [184, 462, 16, 10, 13, 2], [184, 513, 14, 10, 11, 2], [184, 563, 13, 12, 9, 1], [184, 615, 11, 10, 11, 2], [184, 665, 13, 12, 9, 1], [184, 717, 13, 4, 10, 2], [184, 775, 12, 3, 11, 9], [245, 3, 11, 4, 8, 2], [245, 56, 13, 8, 11, 4], [245, 105, 13, 10, 12, 2], [245, 158, 13, 8, 11, 4], [245, 207, 14, 10, 11, 2], [245, 260, 13, 8, 11, 4], [245, 309, 14, 10, 10, 2], [245, 362, 14, 10, 12, 4], [245, 411, 14, 10, 13, 2], [245, 462, 11, 10, 9, 2], [245, 513, 11, 12, 9, 2], [245, 564, 14, 10, 12, 2], [245, 615, 11, 10, 9, 2], [245, 668, 16, 8, 15, 4], [245, 719, 14, 8, 13, 4], [245, 770, 13, 8, 11, 4], [306, 5, 13, 10, 12, 4], [306, 56, 14, 10, 12, 4], [306, 107, 13, 8, 11, 4], [306, 158, 12, 8, 10, 4], [306, 208, 11, 9, 9, 3], [306, 260, 14, 8, 12, 4], [306, 311, 15, 8, 12, 4], [306, 362, 17, 8, 14, 4], [306, 413, 13, 8, 11, 4], [306, 464, 15, 10, 12, 4], [306, 515, 12, 8, 10, 4], [306, 563, 13, 13, 10, 1], [306, 614, 12, 13, 8, 1], [306, 665, 13, 13, 10, 1], [306, 717, 13, 4, 10, 2], [306, 766, 1, 1, 3, 1], [367, 2, 15, 11, 13, 1], [367, 52, 16, 12, 13, 0], [367, 105, 14, 12, 11, 2], [367, 154, 14, 12, 11, 0], [367, 205, 16, 12, 13, 0], [367, 256, 14, 12, 11, 0], [367, 307, 16, 12, 13, 0], [367, 359, 14, 11, 11, 1], [367, 410, 13, 11, 11, 1], [367, 461, 13, 11, 11, 1], [367, 513, 13, 10, 11, 2], [367, 563, 15, 11, 11, 1], [367, 613, 15, 12, 11, 0], [367, 668, 13, 10, 11, 4], [367, 716, 14, 11, 11, 1], [367, 767, 13, 11, 11, 1], [428, 2, 13, 11, 11, 1], [428, 54, 13, 10, 11, 2], [428, 104, 12, 11, 9, 1], [428, 155, 11, 11, 9, 1], [428, 206, 12, 11, 9, 1], [428, 258, 12, 10, 9, 2], [428, 308, 15, 11, 13, 1], [428, 359, 14, 11, 11, 1], [428, 410, 13, 11, 11, 1], [428, 461, 13, 11, 11, 1], [428, 513, 13, 10, 11, 2], [428, 563, 15, 11, 11, 1], [428, 614, 14, 11, 12, 1], [428, 665, 14, 11, 12, 1], [428, 716, 14, 11, 12, 1], [428, 768, 14, 10, 12, 2], [489, 2, 13, 7, 10, 1], [489, 53, 14, 6, 11, 1], [489, 106, 13, 10, 11, 3], [489, 156, 14, 10, 12, 2], [489, 206, 14, 11, 11, 1], [489, 260, 13, 7, 11, 4], [489, 309, 16, 10, 13, 2], [489, 360, 15, 10, 12, 2], [489, 412, 14, 9, 12, 3], [489, 463, 14, 9, 12, 3], [489, 513, 17, 5, 14, 2], [489, 564, 11, 4, 8, 2], [489, 615, 13, 3, 10, 2], [489, 666, 17, 10, 14, 2], [489, 717, 18, 10, 15, 2], [489, 768, 16, 10, 12, 2], [550, 3, 17, 10, 14, 2], [550, 54, 17, 10, 14, 2], [550, 105, 17, 10, 14, 2], [550, 156, 17, 10, 14, 2], [550, 207, 15, 10, 12, 2], [550, 258, 17, 10, 14, 2], [550, 309, 17, 10, 14, 2], [550, 360, 17, 10, 14, 2], [550, 411, 17, 10, 14, 2], [550, 462, 17, 10, 14, 2], [550, 513, 17, 10, 14, 2], [550, 564, 13, 8, 11, 2], [550, 615, 13, 8, 10, 2], [550, 666, 17, 10, 14, 2], [550, 719, 16, 8, 14, 4], [550, 770, 15, 8, 12, 4], [611, 3, 12, 10, 11, 2], [611, 54, 11, 10, 8, 2], [611, 105, 17, 10, 14, 2], [611, 156, 17, 10, 14, 2], [611, 207, 17, 10, 14, 2], [611, 258, 17, 10, 14, 2], [611, 309, 17, 10, 14, 2], [611, 363, 13, 7, 11, 5], [611, 414, 13, 7, 11, 5], [611, 469, 12, 3, 12, 9], [611, 511, 1, 1, 11, 1], [611, 562, 15, 12, 13, 0], [611, 613, 17, 12, 13, 0], [611, 664, 15, 12, 11, 0], [611, 717, 18, 10, 15, 2], [611, 770, 16, 8, 14, 4], [672, 7, 10, 3, 9, 6], [672, 58, 13, 3, 12, 6], [672, 105, 14, 4, 11, 2], [672, 156, 15, 4, 11, 2], [672, 207, 12, 4, 9, 2], [672, 258, 12, 4, 9, 2], [672, 309, 17, 10, 14, 2], [672, 362, 13, 7, 12, 4], [672, 411, 15, 12, 12, 2], [1, 1, 1, 1, 8, 1], [794, 768, 17, 10, 14, 2], [672, 564, 17, 10, 14, 2], [672, 615, 17, 10, 14, 2], [672, 666, 17, 10, 14, 2], [672, 717, 17, 10, 14, 2], [672, 768, 17, 10, 14, 2], [733, 3, 17, 10, 14, 2], [733, 54, 17, 10, 14, 2], [733, 105, 17, 10, 14, 2], [733, 156, 17, 10, 14, 2], [733, 207, 17, 10, 14, 2], [733, 258, 17, 10, 14, 2], [733, 309, 17, 10, 14, 2], [733, 360, 17, 10, 14, 2], [733, 411, 17, 10, 14, 2], [733, 462, 17, 10, 14, 2], [733, 513, 17, 10, 14, 2], [733, 564, 17, 10, 14, 2], [733, 615, 17, 10, 14, 2], [733, 666, 17, 10, 14, 2], [733, 717, 17, 10, 14, 2], [733, 768, 17, 10, 14, 2], [1, 1, 1, 1, 8, 1], [794, 54, 17, 10, 14, 2], [794, 105, 17, 10, 14, 2], [794, 156, 17, 10, 14, 2], [794, 207, 17, 10, 14, 2], [794, 258, 17, 10, 14, 2], [794, 309, 17, 10, 14, 2], [794, 360, 17, 10, 14, 2], [794, 411, 17, 10, 14, 2], [794, 462, 17, 10, 14, 2], [794, 513, 17, 10, 14, 2], [794, 564, 17, 10, 14, 2], [794, 615, 17, 10, 14, 2], [794, 666, 17, 10, 14, 2], [794, 717, 17, 10, 14, 2], [794, 768, 17, 10, 14, 2], [855, 3, 17, 10, 14, 2], [855, 54, 17, 10, 14, 2], [855, 105, 17, 10, 14, 2], [855, 156, 17, 10, 14, 2], [855, 207, 17, 10, 14, 2], [855, 258, 17, 10, 14, 2], [855, 309, 17, 10, 14, 2], [855, 360, 17, 10, 14, 2], [855, 411, 17, 10, 14, 2], [855, 462, 17, 10, 14, 2], [855, 513, 17, 10, 14, 2], [855, 564, 17, 10, 14, 2], [855, 615, 17, 10, 14, 2], [855, 666, 17, 10, 14, 2], [855, 717, 17, 10, 14, 2], [855, 768, 17, 10, 14, 2]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 10, 8, 7, 2], [1, 105, 12, 2, 9, 2], [1, 156, 15, 5, 12, 2], [1, 206, 13, 10, 10, 1], [1, 258, 15, 8, 14, 2], [1, 309, 14, 8, 12, 2], [1, 360, 10, 2, 7, 2], [1, 410, 13, 10, 9, 1], [1, 461, 11, 10, 9, 1], [1, 513, 13, 5, 11, 2], [1, 566, 11, 5, 10, 4], [1, 622, 7, 2, 7, 9], [1, 670, 10, 1, 9, 6], [1, 724, 7, 1, 7, 9], [1, 768, 13, 8, 10, 2], [62, 3, 13, 8, 10, 2], [62, 54, 11, 8, 10, 2], [62, 105, 13, 8, 10, 2], [62, 156, 13, 9, 10, 2], [62, 207, 12, 8, 10, 2], [62, 258, 12, 9, 10, 2], [62, 309, 12, 8, 10, 2], [62, 360, 13, 8, 10, 2], [62, 411, 13, 8, 10, 2], [62, 462, 13, 8, 10, 2], [62, 516, 9, 5, 7, 5], [62, 567, 9, 6, 7, 5], [62, 617, 10, 5, 8, 4], [62, 669, 11, 3, 9, 5], [62, 719, 9, 5, 8, 4], [62, 768, 13, 8, 10, 2], [123, 4, 15, 8, 12, 3], [123, 54, 12, 8, 12, 2], [123, 105, 14, 8, 11, 2], [123, 156, 13, 8, 10, 2], [123, 207, 13, 8, 11, 2], [123, 258, 13, 8, 10, 2], [123, 309, 13, 8, 10, 2], [123, 360, 13, 8, 11, 2], [123, 411, 15, 8, 12, 2], [123, 462, 12, 8, 9, 2], [123, 513, 13, 10, 9, 2], [123, 564, 15, 8, 12, 2], [123, 615, 11, 8, 11, 2], [123, 666, 17, 8, 14, 2], [123, 717, 15, 8, 12, 2], [123, 768, 13, 8, 10, 2], [184, 3, 14, 8, 11, 2], [184, 54, 13, 10, 10, 2], [184, 105, 14, 8, 12, 2], [184, 156, 13, 8, 10, 2], [184, 207, 13, 8, 10, 2], [184, 258, 15, 8, 12, 2], [184, 309, 15, 8, 12, 2], [184, 360, 17, 8, 14, 2], [184, 411, 13, 8, 10, 2], [184, 462, 15, 8, 12, 2], [184, 513, 13, 8, 10, 2], [184, 563, 12, 10, 8, 1], [184, 615, 10, 8, 10, 2], [184, 665, 12, 10, 8, 1], [184, 717, 12, 2, 9, 2], [184, 775, 11, 1, 10, 9], [245, 3, 10, 2, 7, 2], [245, 56, 12, 6, 10, 4], [245, 105, 12, 8, 11, 2], [245, 158, 12, 6, 10, 4], [245, 207, 13, 8, 10, 2], [245, 260, 12, 6, 10, 4], [245, 309, 13, 8, 9, 2], [245, 362, 13, 8, 11, 4], [245, 411, 13, 8, 12, 2], [245, 462, 10, 8, 8, 2], [245, 513, 10, 10, 8, 2], [245, 564, 13, 8, 11, 2], [245, 615, 10, 8, 8, 2], [245, 668, 15, 6, 14, 4], [245, 719, 13, 6, 12, 4], [245, 770, 12, 6, 10, 4], [306, 5, 12, 8, 11, 4], [306, 56, 13, 8, 11, 4], [306, 107, 12, 6, 10, 4], [306, 158, 11, 6, 9, 4], [306, 208, 10, 7, 8, 3], [306, 260, 13, 6, 11, 4], [306, 311, 14, 6, 11, 4], [306, 362, 16, 6, 13, 4], [306, 413, 12, 6, 10, 4], [306, 464, 14, 8, 11, 4], [306, 515, 11, 6, 9, 4], [306, 563, 12, 11, 9, 1], [306, 614, 11, 11, 7, 1], [306, 665, 12, 11, 9, 1], [306, 717, 12, 2, 9, 2], [306, 766, 1, 1, 3, 1], [367, 2, 14, 9, 12, 1], [367, 52, 15, 10, 12, 0], [367, 105, 13, 10, 10, 2], [367, 154, 13, 10, 10, 0], [367, 205, 15, 10, 12, 0], [367, 256, 13, 10, 10, 0], [367, 307, 15, 10, 12, 0], [367, 359, 13, 9, 10, 1], [367, 410, 12, 9, 10, 1], [367, 461, 12, 9, 10, 1], [367, 513, 12, 8, 10, 2], [367, 563, 14, 9, 10, 1], [367, 613, 14, 10, 10, 0], [367, 668, 12, 8, 10, 4], [367, 716, 13, 9, 10, 1], [367, 767, 12, 9, 10, 1], [428, 2, 12, 9, 10, 1], [428, 54, 12, 8, 10, 2], [428, 104, 11, 9, 8, 1], [428, 155, 10, 9, 8, 1], [428, 206, 11, 9, 8, 1], [428, 258, 11, 8, 8, 2], [428, 308, 14, 9, 12, 1], [428, 359, 13, 9, 10, 1], [428, 410, 12, 9, 10, 1], [428, 461, 12, 9, 10, 1], [428, 513, 12, 8, 10, 2], [428, 563, 14, 9, 10, 1], [428, 614, 13, 9, 11, 1], [428, 665, 13, 9, 11, 1], [428, 716, 13, 9, 11, 1], [428, 768, 13, 8, 11, 2], [489, 2, 12, 5, 9, 1], [489, 53, 13, 4, 10, 1], [489, 106, 12, 8, 10, 3], [489, 156, 13, 8, 11, 2], [489, 206, 13, 9, 10, 1], [489, 260, 12, 5, 10, 4], [489, 309, 15, 8, 12, 2], [489, 360, 14, 8, 11, 2], [489, 412, 13, 7, 11, 3], [489, 463, 13, 7, 11, 3], [489, 513, 16, 3, 13, 2], [489, 564, 10, 2, 7, 2], [489, 615, 12, 1, 9, 2], [489, 666, 16, 8, 13, 2], [489, 717, 17, 8, 14, 2], [489, 768, 15, 8, 11, 2], [550, 3, 16, 8, 13, 2], [550, 54, 16, 8, 13, 2], [550, 105, 16, 8, 13, 2], [550, 156, 16, 8, 13, 2], [550, 207, 14, 8, 11, 2], [550, 258, 16, 8, 13, 2], [550, 309, 16, 8, 13, 2], [550, 360, 16, 8, 13, 2], [550, 411, 16, 8, 13, 2], [550, 462, 16, 8, 13, 2], [550, 513, 16, 8, 13, 2], [550, 564, 12, 6, 10, 2], [550, 615, 12, 6, 9, 2], [550, 666, 16, 8, 13, 2], [550, 719, 15, 6, 13, 4], [550, 770, 14, 6, 11, 4], [611, 3, 11, 8, 10, 2], [611, 54, 10, 8, 7, 2], [611, 105, 16, 8, 13, 2], [611, 156, 16, 8, 13, 2], [611, 207, 16, 8, 13, 2], [611, 258, 16, 8, 13, 2], [611, 309, 16, 8, 13, 2], [611, 363, 12, 5, 10, 5], [611, 414, 12, 5, 10, 5], [611, 469, 11, 1, 11, 9], [611, 511, 1, 1, 10, 1], [611, 562, 14, 10, 12, 0], [611, 613, 15, 10, 12, 0], [611, 664, 13, 10, 10, 0], [611, 717, 17, 8, 14, 2], [611, 770, 15, 6, 13, 4], [672, 7, 9, 1, 8, 6], [672, 58, 12, 1, 11, 6], [672, 105, 13, 2, 10, 2], [672, 156, 14, 2, 10, 2], [672, 207, 11, 2, 8, 2], [672, 258, 11, 2, 8, 2], [672, 309, 16, 8, 13, 2], [672, 362, 12, 5, 11, 4], [672, 411, 14, 10, 11, 2], [1, 1, 1, 1, 7, 1], [794, 768, 16, 8, 13, 2], [672, 564, 16, 8, 13, 2], [672, 615, 16, 8, 13, 2], [672, 666, 16, 8, 13, 2], [672, 717, 16, 8, 13, 2], [672, 768, 16, 8, 13, 2], [733, 3, 16, 8, 13, 2], [733, 54, 16, 8, 13, 2], [733, 105, 16, 8, 13, 2], [733, 156, 16, 8, 13, 2], [733, 207, 16, 8, 13, 2], [733, 258, 16, 8, 13, 2], [733, 309, 16, 8, 13, 2], [733, 360, 16, 8, 13, 2], [733, 411, 16, 8, 13, 2], [733, 462, 16, 8, 13, 2], [733, 513, 16, 8, 13, 2], [733, 564, 16, 8, 13, 2], [733, 615, 16, 8, 13, 2], [733, 666, 16, 8, 13, 2], [733, 717, 16, 8, 13, 2], [733, 768, 16, 8, 13, 2], [1, 1, 1, 1, 7, 1], [794, 54, 16, 8, 13, 2], [794, 105, 16, 8, 13, 2], [794, 156, 16, 8, 13, 2], [794, 207, 16, 8, 13, 2], [794, 258, 16, 8, 13, 2], [794, 309, 16, 8, 13, 2], [794, 360, 16, 8, 13, 2], [794, 411, 16, 8, 13, 2], [794, 462, 16, 8, 13, 2], [794, 513, 16, 8, 13, 2], [794, 564, 16, 8, 13, 2], [794, 615, 16, 8, 13, 2], [794, 666, 16, 8, 13, 2], [794, 717, 16, 8, 13, 2], [794, 768, 16, 8, 13, 2], [855, 3, 16, 8, 13, 2], [855, 54, 16, 8, 13, 2], [855, 105, 16, 8, 13, 2], [855, 156, 16, 8, 13, 2], [855, 207, 16, 8, 13, 2], [855, 258, 16, 8, 13, 2], [855, 309, 16, 8, 13, 2], [855, 360, 16, 8, 13, 2], [855, 411, 16, 8, 13, 2], [855, 462, 16, 8, 13, 2], [855, 513, 16, 8, 13, 2], [855, 564, 16, 8, 13, 2], [855, 615, 16, 8, 13, 2], [855, 666, 16, 8, 13, 2], [855, 717, 16, 8, 13, 2], [855, 768, 16, 8, 13, 2]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 54, 8, 10, 8, 2], [1, 105, 10, 9, 10, 2], [1, 156, 13, 9, 13, 2], [1, 206, 11, 12, 11, 1], [1, 258, 15, 10, 15, 2], [1, 309, 13, 10, 13, 2], [1, 360, 8, 9, 8, 2], [1, 410, 10, 12, 10, 1], [1, 461, 10, 12, 10, 1], [1, 513, 12, 9, 12, 2], [1, 566, 11, 7, 11, 4], [1, 618, 8, 8, 8, 5], [1, 669, 10, 6, 10, 5], [1, 720, 8, 7, 8, 5], [1, 768, 11, 10, 11, 2], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 11, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 11, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 516, 8, 7, 8, 5], [62, 567, 8, 8, 8, 5], [62, 617, 9, 7, 9, 4], [62, 669, 10, 6, 10, 5], [62, 719, 9, 7, 9, 4], [62, 768, 11, 10, 11, 2], [123, 4, 13, 10, 13, 3], [123, 54, 13, 10, 13, 2], [123, 105, 12, 10, 12, 2], [123, 156, 11, 10, 11, 2], [123, 207, 12, 10, 12, 2], [123, 258, 11, 10, 11, 2], [123, 309, 11, 10, 11, 2], [123, 360, 12, 10, 12, 2], [123, 411, 13, 10, 13, 2], [123, 462, 10, 10, 10, 2], [123, 513, 10, 12, 10, 2], [123, 564, 13, 10, 13, 2], [123, 615, 12, 10, 12, 2], [123, 666, 15, 10, 15, 2], [123, 717, 13, 10, 13, 2], [123, 768, 11, 10, 11, 2], [184, 3, 12, 10, 12, 2], [184, 54, 11, 12, 11, 2], [184, 105, 13, 10, 13, 2], [184, 156, 11, 10, 11, 2], [184, 207, 11, 10, 11, 2], [184, 258, 13, 10, 13, 2], [184, 309, 13, 10, 13, 2], [184, 360, 15, 10, 15, 2], [184, 411, 11, 10, 11, 2], [184, 462, 13, 10, 13, 2], [184, 513, 11, 10, 11, 2], [184, 563, 9, 12, 9, 1], [184, 615, 11, 10, 11, 2], [184, 665, 9, 12, 9, 1], [184, 717, 10, 9, 10, 2], [184, 771, 11, 7, 11, 5], [245, 3, 8, 9, 8, 2], [245, 56, 11, 8, 11, 4], [245, 105, 12, 10, 12, 2], [245, 158, 11, 8, 11, 4], [245, 207, 11, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 10, 10, 10, 2], [245, 362, 12, 10, 12, 4], [245, 411, 13, 10, 13, 2], [245, 462, 9, 10, 9, 2], [245, 513, 9, 12, 9, 2], [245, 564, 12, 10, 12, 2], [245, 615, 9, 10, 9, 2], [245, 668, 15, 8, 15, 4], [245, 719, 13, 8, 13, 4], [245, 770, 11, 8, 11, 4], [306, 5, 12, 10, 12, 4], [306, 56, 12, 10, 12, 4], [306, 107, 11, 8, 11, 4], [306, 158, 10, 8, 10, 4], [306, 208, 9, 9, 9, 3], [306, 260, 12, 8, 12, 4], [306, 311, 12, 8, 12, 4], [306, 362, 14, 8, 14, 4], [306, 413, 11, 8, 11, 4], [306, 464, 12, 10, 12, 4], [306, 515, 10, 8, 10, 4], [306, 563, 10, 13, 10, 1], [306, 614, 8, 13, 8, 1], [306, 665, 10, 13, 10, 1], [306, 717, 10, 9, 10, 2], [306, 771, 3, 6, 3, 5], [367, 2, 13, 11, 13, 1], [367, 52, 13, 12, 13, 0], [367, 105, 11, 12, 11, 2], [367, 154, 11, 12, 11, 0], [367, 205, 13, 12, 13, 0], [367, 256, 11, 12, 11, 0], [367, 307, 13, 12, 13, 0], [367, 359, 11, 11, 11, 1], [367, 410, 11, 11, 11, 1], [367, 461, 11, 11, 11, 1], [367, 513, 11, 10, 11, 2], [367, 563, 11, 11, 11, 1], [367, 613, 11, 12, 11, 0], [367, 668, 11, 10, 11, 4], [367, 716, 11, 11, 11, 1], [367, 767, 11, 11, 11, 1], [428, 2, 11, 11, 11, 1], [428, 54, 11, 10, 11, 2], [428, 104, 9, 11, 9, 1], [428, 155, 9, 11, 9, 1], [428, 206, 9, 11, 9, 1], [428, 258, 9, 10, 9, 2], [428, 308, 13, 11, 13, 1], [428, 359, 11, 11, 11, 1], [428, 410, 11, 11, 11, 1], [428, 461, 11, 11, 11, 1], [428, 513, 11, 10, 11, 2], [428, 563, 11, 11, 11, 1], [428, 614, 12, 11, 12, 1], [428, 665, 12, 11, 12, 1], [428, 716, 12, 11, 12, 1], [428, 768, 12, 10, 12, 2], [489, 2, 10, 10, 10, 1], [489, 53, 11, 10, 11, 1], [489, 106, 11, 10, 11, 3], [489, 156, 12, 10, 12, 2], [489, 206, 11, 11, 11, 1], [489, 260, 11, 7, 11, 4], [489, 309, 13, 10, 13, 2], [489, 360, 12, 10, 12, 2], [489, 412, 12, 9, 12, 3], [489, 463, 12, 9, 12, 3], [489, 513, 14, 9, 14, 2], [489, 564, 8, 9, 8, 2], [489, 615, 10, 9, 10, 2], [489, 666, 14, 10, 14, 2], [489, 717, 15, 10, 15, 2], [489, 768, 12, 10, 12, 2], [550, 3, 14, 10, 14, 2], [550, 54, 14, 10, 14, 2], [550, 105, 14, 10, 14, 2], [550, 156, 14, 10, 14, 2], [550, 207, 12, 10, 12, 2], [550, 258, 14, 10, 14, 2], [550, 309, 14, 10, 14, 2], [550, 360, 14, 10, 14, 2], [550, 411, 14, 10, 14, 2], [550, 462, 14, 10, 14, 2], [550, 513, 14, 10, 14, 2], [550, 564, 11, 9, 11, 2], [550, 615, 10, 9, 10, 2], [550, 666, 14, 10, 14, 2], [550, 719, 14, 8, 14, 4], [550, 770, 12, 8, 12, 4], [611, 3, 11, 10, 11, 2], [611, 54, 8, 10, 8, 2], [611, 105, 14, 10, 14, 2], [611, 156, 14, 10, 14, 2], [611, 207, 14, 10, 14, 2], [611, 258, 14, 10, 14, 2], [611, 309, 14, 10, 14, 2], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 12, 7, 12, 5], [611, 516, 11, 6, 11, 5], [611, 562, 13, 12, 13, 0], [611, 613, 13, 12, 13, 0], [611, 664, 11, 12, 11, 0], [611, 717, 15, 10, 15, 2], [611, 770, 14, 8, 14, 4], [672, 6, 9, 6, 9, 5], [672, 57, 12, 6, 12, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 9, 9, 9, 2], [672, 258, 9, 9, 9, 2], [672, 309, 14, 10, 14, 2], [672, 362, 12, 7, 12, 4], [672, 411, 12, 12, 12, 2], [1, 6, 8, 6, 8, 5], [794, 768, 14, 10, 14, 2], [672, 564, 14, 10, 14, 2], [672, 615, 14, 10, 14, 2], [672, 666, 14, 10, 14, 2], [672, 717, 14, 10, 14, 2], [672, 768, 14, 10, 14, 2], [733, 3, 14, 10, 14, 2], [733, 54, 14, 10, 14, 2], [733, 105, 14, 10, 14, 2], [733, 156, 14, 10, 14, 2], [733, 207, 14, 10, 14, 2], [733, 258, 14, 10, 14, 2], [733, 309, 14, 10, 14, 2], [733, 360, 14, 10, 14, 2], [733, 411, 14, 10, 14, 2], [733, 462, 14, 10, 14, 2], [733, 513, 14, 10, 14, 2], [733, 564, 14, 10, 14, 2], [733, 615, 14, 10, 14, 2], [733, 666, 14, 10, 14, 2], [733, 717, 14, 10, 14, 2], [733, 768, 14, 10, 14, 2], [1, 6, 8, 6, 8, 5], [794, 54, 14, 10, 14, 2], [794, 105, 14, 10, 14, 2], [794, 156, 14, 10, 14, 2], [794, 207, 14, 10, 14, 2], [794, 258, 14, 10, 14, 2], [794, 309, 14, 10, 14, 2], [794, 360, 14, 10, 14, 2], [794, 411, 14, 10, 14, 2], [794, 462, 14, 10, 14, 2], [794, 513, 14, 10, 14, 2], [794, 564, 14, 10, 14, 2], [794, 615, 14, 10, 14, 2], [794, 666, 14, 10, 14, 2], [794, 717, 14, 10, 14, 2], [794, 768, 14, 10, 14, 2], [855, 3, 14, 10, 14, 2], [855, 54, 14, 10, 14, 2], [855, 105, 14, 10, 14, 2], [855, 156, 14, 10, 14, 2], [855, 207, 14, 10, 14, 2], [855, 258, 14, 10, 14, 2], [855, 309, 14, 10, 14, 2], [855, 360, 14, 10, 14, 2], [855, 411, 14, 10, 14, 2], [855, 462, 14, 10, 14, 2], [855, 513, 14, 10, 14, 2], [855, 564, 14, 10, 14, 2], [855, 615, 14, 10, 14, 2], [855, 666, 14, 10, 14, 2], [855, 717, 14, 10, 14, 2], [855, 768, 14, 10, 14, 2]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 7, 8, 7, 2], [1, 105, 9, 8, 9, 2], [1, 156, 12, 8, 12, 2], [1, 206, 10, 10, 10, 1], [1, 258, 14, 8, 14, 2], [1, 309, 12, 8, 12, 2], [1, 360, 7, 8, 7, 2], [1, 410, 9, 10, 9, 1], [1, 461, 9, 10, 9, 1], [1, 513, 11, 8, 11, 2], [1, 566, 10, 6, 10, 4], [1, 617, 7, 7, 7, 4], [1, 668, 9, 6, 9, 4], [1, 719, 7, 6, 7, 4], [1, 768, 10, 8, 10, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 9, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 9, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 7, 6, 7, 4], [62, 566, 7, 7, 7, 4], [62, 617, 8, 6, 8, 4], [62, 668, 9, 6, 9, 4], [62, 719, 8, 6, 8, 4], [62, 768, 10, 8, 10, 2], [123, 4, 12, 8, 12, 3], [123, 54, 12, 8, 12, 2], [123, 105, 11, 8, 11, 2], [123, 156, 10, 8, 10, 2], [123, 207, 11, 8, 11, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 11, 8, 11, 2], [123, 411, 12, 8, 12, 2], [123, 462, 9, 8, 9, 2], [123, 513, 9, 10, 9, 2], [123, 564, 12, 8, 12, 2], [123, 615, 11, 8, 11, 2], [123, 666, 14, 8, 14, 2], [123, 717, 12, 8, 12, 2], [123, 768, 10, 8, 10, 2], [184, 3, 11, 8, 11, 2], [184, 54, 10, 10, 10, 2], [184, 105, 12, 8, 12, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 12, 8, 12, 2], [184, 309, 12, 8, 12, 2], [184, 360, 14, 8, 14, 2], [184, 411, 10, 8, 10, 2], [184, 462, 12, 8, 12, 2], [184, 513, 10, 8, 10, 2], [184, 563, 8, 10, 8, 1], [184, 615, 10, 8, 10, 2], [184, 665, 8, 10, 8, 1], [184, 717, 9, 8, 9, 2], [184, 770, 10, 6, 10, 4], [245, 3, 7, 8, 7, 2], [245, 56, 10, 6, 10, 4], [245, 105, 11, 8, 11, 2], [245, 158, 10, 6, 10, 4], [245, 207, 10, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 9, 8, 9, 2], [245, 362, 11, 8, 11, 4], [245, 411, 12, 8, 12, 2], [245, 462, 8, 8, 8, 2], [245, 513, 8, 10, 8, 2], [245, 564, 11, 8, 11, 2], [245, 615, 8, 8, 8, 2], [245, 668, 14, 6, 14, 4], [245, 719, 12, 6, 12, 4], [245, 770, 10, 6, 10, 4], [306, 5, 11, 8, 11, 4], [306, 56, 11, 8, 11, 4], [306, 107, 10, 6, 10, 4], [306, 158, 9, 6, 9, 4], [306, 208, 8, 7, 8, 3], [306, 260, 11, 6, 11, 4], [306, 311, 11, 6, 11, 4], [306, 362, 13, 6, 13, 4], [306, 413, 10, 6, 10, 4], [306, 464, 11, 8, 11, 4], [306, 515, 9, 6, 9, 4], [306, 563, 9, 11, 9, 1], [306, 614, 7, 11, 7, 1], [306, 665, 9, 11, 9, 1], [306, 717, 9, 8, 9, 2], [306, 770, 3, 6, 3, 4], [367, 2, 12, 9, 12, 1], [367, 52, 12, 10, 12, 0], [367, 105, 10, 10, 10, 2], [367, 154, 10, 10, 10, 0], [367, 205, 12, 10, 12, 0], [367, 256, 10, 10, 10, 0], [367, 307, 12, 10, 12, 0], [367, 359, 10, 9, 10, 1], [367, 410, 10, 9, 10, 1], [367, 461, 10, 9, 10, 1], [367, 513, 10, 8, 10, 2], [367, 563, 10, 9, 10, 1], [367, 613, 10, 10, 10, 0], [367, 668, 10, 8, 10, 4], [367, 716, 10, 9, 10, 1], [367, 767, 10, 9, 10, 1], [428, 2, 10, 9, 10, 1], [428, 54, 10, 8, 10, 2], [428, 104, 8, 9, 8, 1], [428, 155, 8, 9, 8, 1], [428, 206, 8, 9, 8, 1], [428, 258, 8, 8, 8, 2], [428, 308, 12, 9, 12, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 10, 8, 10, 2], [428, 563, 10, 9, 10, 1], [428, 614, 11, 9, 11, 1], [428, 665, 11, 9, 11, 1], [428, 716, 11, 9, 11, 1], [428, 768, 11, 8, 11, 2], [489, 2, 9, 9, 9, 1], [489, 53, 10, 9, 10, 1], [489, 106, 10, 8, 10, 3], [489, 156, 11, 8, 11, 2], [489, 206, 10, 9, 10, 1], [489, 260, 10, 6, 10, 4], [489, 309, 12, 8, 12, 2], [489, 360, 11, 8, 11, 2], [489, 412, 11, 7, 11, 3], [489, 463, 11, 7, 11, 3], [489, 513, 13, 8, 13, 2], [489, 564, 7, 8, 7, 2], [489, 615, 9, 8, 9, 2], [489, 666, 13, 8, 13, 2], [489, 717, 14, 8, 14, 2], [489, 768, 11, 8, 11, 2], [550, 3, 13, 8, 13, 2], [550, 54, 13, 8, 13, 2], [550, 105, 13, 8, 13, 2], [550, 156, 13, 8, 13, 2], [550, 207, 11, 8, 11, 2], [550, 258, 13, 8, 13, 2], [550, 309, 13, 8, 13, 2], [550, 360, 13, 8, 13, 2], [550, 411, 13, 8, 13, 2], [550, 462, 13, 8, 13, 2], [550, 513, 13, 8, 13, 2], [550, 564, 10, 8, 10, 2], [550, 615, 9, 8, 9, 2], [550, 666, 13, 8, 13, 2], [550, 719, 13, 6, 13, 4], [550, 770, 11, 6, 11, 4], [611, 3, 10, 8, 10, 2], [611, 54, 7, 8, 7, 2], [611, 105, 13, 8, 13, 2], [611, 156, 13, 8, 13, 2], [611, 207, 13, 8, 13, 2], [611, 258, 13, 8, 13, 2], [611, 309, 13, 8, 13, 2], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 11, 6, 11, 4], [611, 515, 10, 6, 10, 4], [611, 562, 12, 10, 12, 0], [611, 613, 12, 10, 12, 0], [611, 664, 10, 10, 10, 0], [611, 717, 14, 8, 14, 2], [611, 770, 13, 6, 13, 4], [672, 5, 8, 6, 8, 4], [672, 56, 11, 6, 11, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 8, 8, 8, 2], [672, 258, 8, 8, 8, 2], [672, 309, 13, 8, 13, 2], [672, 362, 11, 6, 11, 4], [672, 411, 11, 10, 11, 2], [1, 5, 7, 6, 7, 4], [794, 768, 13, 8, 13, 2], [672, 564, 13, 8, 13, 2], [672, 615, 13, 8, 13, 2], [672, 666, 13, 8, 13, 2], [672, 717, 13, 8, 13, 2], [672, 768, 13, 8, 13, 2], [733, 3, 13, 8, 13, 2], [733, 54, 13, 8, 13, 2], [733, 105, 13, 8, 13, 2], [733, 156, 13, 8, 13, 2], [733, 207, 13, 8, 13, 2], [733, 258, 13, 8, 13, 2], [733, 309, 13, 8, 13, 2], [733, 360, 13, 8, 13, 2], [733, 411, 13, 8, 13, 2], [733, 462, 13, 8, 13, 2], [733, 513, 13, 8, 13, 2], [733, 564, 13, 8, 13, 2], [733, 615, 13, 8, 13, 2], [733, 666, 13, 8, 13, 2], [733, 717, 13, 8, 13, 2], [733, 768, 13, 8, 13, 2], [1, 5, 7, 6, 7, 4], [794, 54, 13, 8, 13, 2], [794, 105, 13, 8, 13, 2], [794, 156, 13, 8, 13, 2], [794, 207, 13, 8, 13, 2], [794, 258, 13, 8, 13, 2], [794, 309, 13, 8, 13, 2], [794, 360, 13, 8, 13, 2], [794, 411, 13, 8, 13, 2], [794, 462, 13, 8, 13, 2], [794, 513, 13, 8, 13, 2], [794, 564, 13, 8, 13, 2], [794, 615, 13, 8, 13, 2], [794, 666, 13, 8, 13, 2], [794, 717, 13, 8, 13, 2], [794, 768, 13, 8, 13, 2], [855, 3, 13, 8, 13, 2], [855, 54, 13, 8, 13, 2], [855, 105, 13, 8, 13, 2], [855, 156, 13, 8, 13, 2], [855, 207, 13, 8, 13, 2], [855, 258, 13, 8, 13, 2], [855, 309, 13, 8, 13, 2], [855, 360, 13, 8, 13, 2], [855, 411, 13, 8, 13, 2], [855, 462, 13, 8, 13, 2], [855, 513, 13, 8, 13, 2], [855, 564, 13, 8, 13, 2], [855, 615, 13, 8, 13, 2], [855, 666, 13, 8, 13, 2], [855, 717, 13, 8, 13, 2], [855, 768, 13, 8, 13, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 10, 10, 7, 2], [1, 105, 12, 4, 9, 2], [1, 156, 15, 7, 12, 2], [1, 206, 13, 12, 10, 1], [1, 258, 15, 10, 14, 2], [1, 309, 14, 10, 12, 2], [1, 360, 10, 4, 7, 2], [1, 410, 13, 12, 9, 1], [1, 461, 11, 12, 9, 1], [1, 513, 13, 7, 11, 2], [1, 566, 11, 7, 10, 4], [1, 622, 7, 4, 7, 9], [1, 670, 10, 3, 9, 6], [1, 724, 7, 3, 7, 9], [1, 768, 13, 10, 10, 2], [62, 3, 13, 10, 10, 2], [62, 54, 11, 10, 10, 2], [62, 105, 13, 10, 10, 2], [62, 156, 13, 11, 10, 2], [62, 207, 12, 10, 10, 2], [62, 258, 12, 11, 10, 2], [62, 309, 12, 10, 10, 2], [62, 360, 13, 10, 10, 2], [62, 411, 13, 10, 10, 2], [62, 462, 13, 10, 10, 2], [62, 516, 9, 7, 7, 5], [62, 567, 9, 8, 7, 5], [62, 617, 10, 7, 8, 4], [62, 669, 11, 5, 9, 5], [62, 719, 9, 7, 8, 4], [62, 768, 13, 10, 10, 2], [123, 4, 15, 10, 12, 3], [123, 54, 12, 10, 12, 2], [123, 105, 14, 10, 11, 2], [123, 156, 13, 10, 10, 2], [123, 207, 13, 10, 11, 2], [123, 258, 13, 10, 10, 2], [123, 309, 13, 10, 10, 2], [123, 360, 13, 10, 11, 2], [123, 411, 15, 10, 12, 2], [123, 462, 12, 10, 9, 2], [123, 513, 13, 12, 9, 2], [123, 564, 15, 10, 12, 2], [123, 615, 11, 10, 11, 2], [123, 666, 17, 10, 14, 2], [123, 717, 15, 10, 12, 2], [123, 768, 13, 10, 10, 2], [184, 3, 14, 10, 11, 2], [184, 54, 13, 12, 10, 2], [184, 105, 14, 10, 12, 2], [184, 156, 13, 10, 10, 2], [184, 207, 13, 10, 10, 2], [184, 258, 15, 10, 12, 2], [184, 309, 15, 10, 12, 2], [184, 360, 17, 10, 14, 2], [184, 411, 13, 10, 10, 2], [184, 462, 15, 10, 12, 2], [184, 513, 13, 10, 10, 2], [184, 563, 12, 12, 8, 1], [184, 615, 10, 10, 10, 2], [184, 665, 12, 12, 8, 1], [184, 717, 12, 4, 9, 2], [184, 775, 11, 3, 10, 9], [245, 3, 10, 4, 7, 2], [245, 56, 12, 8, 10, 4], [245, 105, 12, 10, 11, 2], [245, 158, 12, 8, 10, 4], [245, 207, 13, 10, 10, 2], [245, 260, 12, 8, 10, 4], [245, 309, 13, 10, 9, 2], [245, 362, 13, 10, 11, 4], [245, 411, 13, 10, 12, 2], [245, 462, 10, 10, 8, 2], [245, 513, 10, 12, 8, 2], [245, 564, 13, 10, 11, 2], [245, 615, 10, 10, 8, 2], [245, 668, 15, 8, 14, 4], [245, 719, 13, 8, 12, 4], [245, 770, 12, 8, 10, 4], [306, 5, 12, 10, 11, 4], [306, 56, 13, 10, 11, 4], [306, 107, 12, 8, 10, 4], [306, 158, 11, 8, 9, 4], [306, 208, 10, 9, 8, 3], [306, 260, 13, 8, 11, 4], [306, 311, 14, 8, 11, 4], [306, 362, 16, 8, 13, 4], [306, 413, 12, 8, 10, 4], [306, 464, 14, 10, 11, 4], [306, 515, 11, 8, 9, 4], [306, 563, 12, 13, 9, 1], [306, 614, 11, 13, 7, 1], [306, 665, 12, 13, 9, 1], [306, 717, 12, 4, 9, 2], [306, 766, 1, 1, 3, 1], [367, 2, 14, 11, 12, 1], [367, 52, 15, 12, 12, 0], [367, 105, 13, 12, 10, 2], [367, 154, 13, 12, 10, 0], [367, 205, 15, 12, 12, 0], [367, 256, 13, 12, 10, 0], [367, 307, 15, 12, 12, 0], [367, 359, 13, 11, 10, 1], [367, 410, 12, 11, 10, 1], [367, 461, 12, 11, 10, 1], [367, 513, 12, 10, 10, 2], [367, 563, 14, 11, 10, 1], [367, 613, 14, 12, 10, 0], [367, 668, 12, 10, 10, 4], [367, 716, 13, 11, 10, 1], [367, 767, 12, 11, 10, 1], [428, 2, 12, 11, 10, 1], [428, 54, 12, 10, 10, 2], [428, 104, 11, 11, 8, 1], [428, 155, 10, 11, 8, 1], [428, 206, 11, 11, 8, 1], [428, 258, 11, 10, 8, 2], [428, 308, 14, 11, 12, 1], [428, 359, 13, 11, 10, 1], [428, 410, 12, 11, 10, 1], [428, 461, 12, 11, 10, 1], [428, 513, 12, 10, 10, 2], [428, 563, 14, 11, 10, 1], [428, 614, 13, 11, 11, 1], [428, 665, 13, 11, 11, 1], [428, 716, 13, 11, 11, 1], [428, 768, 13, 10, 11, 2], [489, 2, 12, 7, 9, 1], [489, 53, 13, 6, 10, 1], [489, 106, 12, 10, 10, 3], [489, 156, 13, 10, 11, 2], [489, 206, 13, 11, 10, 1], [489, 260, 12, 7, 10, 4], [489, 309, 15, 10, 12, 2], [489, 360, 14, 10, 11, 2], [489, 412, 13, 9, 11, 3], [489, 463, 13, 9, 11, 3], [489, 513, 16, 5, 13, 2], [489, 564, 10, 4, 7, 2], [489, 615, 12, 3, 9, 2], [489, 666, 16, 10, 13, 2], [489, 717, 17, 10, 14, 2], [489, 768, 15, 10, 11, 2], [550, 3, 16, 10, 13, 2], [550, 54, 16, 10, 13, 2], [550, 105, 16, 10, 13, 2], [550, 156, 16, 10, 13, 2], [550, 207, 14, 10, 11, 2], [550, 258, 16, 10, 13, 2], [550, 309, 16, 10, 13, 2], [550, 360, 16, 10, 13, 2], [550, 411, 16, 10, 13, 2], [550, 462, 16, 10, 13, 2], [550, 513, 16, 10, 13, 2], [550, 564, 12, 8, 10, 2], [550, 615, 12, 8, 9, 2], [550, 666, 16, 10, 13, 2], [550, 719, 15, 8, 13, 4], [550, 770, 14, 8, 11, 4], [611, 3, 11, 10, 10, 2], [611, 54, 10, 10, 7, 2], [611, 105, 16, 10, 13, 2], [611, 156, 16, 10, 13, 2], [611, 207, 16, 10, 13, 2], [611, 258, 16, 10, 13, 2], [611, 309, 16, 10, 13, 2], [611, 363, 12, 7, 10, 5], [611, 414, 12, 7, 10, 5], [611, 469, 11, 3, 11, 9], [611, 511, 1, 1, 10, 1], [611, 562, 14, 12, 12, 0], [611, 613, 16, 12, 12, 0], [611, 664, 14, 12, 10, 0], [611, 717, 17, 10, 14, 2], [611, 770, 15, 8, 13, 4], [672, 7, 9, 3, 8, 6], [672, 58, 12, 3, 11, 6], [672, 105, 13, 4, 10, 2], [672, 156, 14, 4, 10, 2], [672, 207, 11, 4, 8, 2], [672, 258, 11, 4, 8, 2], [672, 309, 16, 10, 13, 2], [672, 362, 12, 7, 11, 4], [672, 411, 14, 12, 11, 2], [1, 1, 1, 1, 7, 1], [794, 768, 16, 10, 13, 2], [672, 564, 16, 10, 13, 2], [672, 615, 16, 10, 13, 2], [672, 666, 16, 10, 13, 2], [672, 717, 16, 10, 13, 2], [672, 768, 16, 10, 13, 2], [733, 3, 16, 10, 13, 2], [733, 54, 16, 10, 13, 2], [733, 105, 16, 10, 13, 2], [733, 156, 16, 10, 13, 2], [733, 207, 16, 10, 13, 2], [733, 258, 16, 10, 13, 2], [733, 309, 16, 10, 13, 2], [733, 360, 16, 10, 13, 2], [733, 411, 16, 10, 13, 2], [733, 462, 16, 10, 13, 2], [733, 513, 16, 10, 13, 2], [733, 564, 16, 10, 13, 2], [733, 615, 16, 10, 13, 2], [733, 666, 16, 10, 13, 2], [733, 717, 16, 10, 13, 2], [733, 768, 16, 10, 13, 2], [1, 1, 1, 1, 7, 1], [794, 54, 16, 10, 13, 2], [794, 105, 16, 10, 13, 2], [794, 156, 16, 10, 13, 2], [794, 207, 16, 10, 13, 2], [794, 258, 16, 10, 13, 2], [794, 309, 16, 10, 13, 2], [794, 360, 16, 10, 13, 2], [794, 411, 16, 10, 13, 2], [794, 462, 16, 10, 13, 2], [794, 513, 16, 10, 13, 2], [794, 564, 16, 10, 13, 2], [794, 615, 16, 10, 13, 2], [794, 666, 16, 10, 13, 2], [794, 717, 16, 10, 13, 2], [794, 768, 16, 10, 13, 2], [855, 3, 16, 10, 13, 2], [855, 54, 16, 10, 13, 2], [855, 105, 16, 10, 13, 2], [855, 156, 16, 10, 13, 2], [855, 207, 16, 10, 13, 2], [855, 258, 16, 10, 13, 2], [855, 309, 16, 10, 13, 2], [855, 360, 16, 10, 13, 2], [855, 411, 16, 10, 13, 2], [855, 462, 16, 10, 13, 2], [855, 513, 16, 10, 13, 2], [855, 564, 16, 10, 13, 2], [855, 615, 16, 10, 13, 2], [855, 666, 16, 10, 13, 2], [855, 717, 16, 10, 13, 2], [855, 768, 16, 10, 13, 2]], \"capHeight\": 11, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 9, 8, 6, 2], [1, 105, 11, 2, 8, 2], [1, 156, 14, 5, 11, 2], [1, 206, 12, 10, 9, 1], [1, 258, 14, 8, 13, 2], [1, 309, 13, 8, 11, 2], [1, 360, 9, 2, 6, 2], [1, 410, 12, 10, 8, 1], [1, 461, 10, 10, 8, 1], [1, 513, 12, 5, 10, 2], [1, 566, 10, 5, 9, 4], [1, 622, 6, 2, 6, 9], [1, 670, 9, 1, 8, 6], [1, 724, 6, 1, 6, 9], [1, 768, 12, 8, 9, 2], [62, 3, 12, 8, 9, 2], [62, 54, 10, 8, 9, 2], [62, 105, 12, 8, 9, 2], [62, 156, 12, 9, 9, 2], [62, 207, 11, 8, 9, 2], [62, 258, 11, 9, 9, 2], [62, 309, 11, 8, 9, 2], [62, 360, 12, 8, 9, 2], [62, 411, 12, 8, 9, 2], [62, 462, 12, 8, 9, 2], [62, 516, 8, 5, 6, 5], [62, 567, 8, 6, 6, 5], [62, 617, 9, 5, 7, 4], [62, 669, 10, 3, 8, 5], [62, 719, 8, 5, 7, 4], [62, 768, 12, 8, 9, 2], [123, 4, 14, 8, 11, 3], [123, 54, 11, 8, 11, 2], [123, 105, 13, 8, 10, 2], [123, 156, 12, 8, 9, 2], [123, 207, 12, 8, 10, 2], [123, 258, 12, 8, 9, 2], [123, 309, 12, 8, 9, 2], [123, 360, 12, 8, 10, 2], [123, 411, 14, 8, 11, 2], [123, 462, 11, 8, 8, 2], [123, 513, 12, 10, 8, 2], [123, 564, 14, 8, 11, 2], [123, 615, 10, 8, 10, 2], [123, 666, 16, 8, 13, 2], [123, 717, 14, 8, 11, 2], [123, 768, 12, 8, 9, 2], [184, 3, 13, 8, 10, 2], [184, 54, 12, 10, 9, 2], [184, 105, 13, 8, 11, 2], [184, 156, 12, 8, 9, 2], [184, 207, 12, 8, 9, 2], [184, 258, 14, 8, 11, 2], [184, 309, 14, 8, 11, 2], [184, 360, 16, 8, 13, 2], [184, 411, 12, 8, 9, 2], [184, 462, 14, 8, 11, 2], [184, 513, 12, 8, 9, 2], [184, 563, 11, 10, 7, 1], [184, 615, 9, 8, 9, 2], [184, 665, 11, 10, 7, 1], [184, 717, 11, 2, 8, 2], [184, 775, 10, 1, 9, 9], [245, 3, 9, 2, 6, 2], [245, 56, 11, 6, 9, 4], [245, 105, 11, 8, 10, 2], [245, 158, 11, 6, 9, 4], [245, 207, 12, 8, 9, 2], [245, 260, 11, 6, 9, 4], [245, 309, 12, 8, 8, 2], [245, 362, 12, 8, 10, 4], [245, 411, 12, 8, 11, 2], [245, 462, 9, 8, 7, 2], [245, 513, 9, 10, 7, 2], [245, 564, 12, 8, 10, 2], [245, 615, 9, 8, 7, 2], [245, 668, 14, 6, 13, 4], [245, 719, 12, 6, 11, 4], [245, 770, 11, 6, 9, 4], [306, 5, 11, 8, 10, 4], [306, 56, 12, 8, 10, 4], [306, 107, 11, 6, 9, 4], [306, 158, 10, 6, 8, 4], [306, 208, 9, 7, 7, 3], [306, 260, 12, 6, 10, 4], [306, 311, 13, 6, 10, 4], [306, 362, 15, 6, 12, 4], [306, 413, 11, 6, 9, 4], [306, 464, 13, 8, 10, 4], [306, 515, 10, 6, 8, 4], [306, 563, 11, 11, 8, 1], [306, 614, 10, 11, 6, 1], [306, 665, 11, 11, 8, 1], [306, 717, 11, 2, 8, 2], [306, 766, 1, 1, 3, 1], [367, 2, 13, 9, 11, 1], [367, 52, 14, 10, 11, 0], [367, 105, 12, 10, 9, 2], [367, 154, 12, 10, 9, 0], [367, 205, 14, 10, 11, 0], [367, 256, 12, 10, 9, 0], [367, 307, 14, 10, 11, 0], [367, 359, 12, 9, 9, 1], [367, 410, 11, 9, 9, 1], [367, 461, 11, 9, 9, 1], [367, 513, 11, 8, 9, 2], [367, 563, 13, 9, 9, 1], [367, 613, 13, 10, 9, 0], [367, 668, 11, 8, 9, 4], [367, 716, 12, 9, 9, 1], [367, 767, 11, 9, 9, 1], [428, 2, 11, 9, 9, 1], [428, 54, 11, 8, 9, 2], [428, 104, 10, 9, 7, 1], [428, 155, 9, 9, 7, 1], [428, 206, 10, 9, 7, 1], [428, 258, 10, 8, 7, 2], [428, 308, 13, 9, 11, 1], [428, 359, 12, 9, 9, 1], [428, 410, 11, 9, 9, 1], [428, 461, 11, 9, 9, 1], [428, 513, 11, 8, 9, 2], [428, 563, 13, 9, 9, 1], [428, 614, 12, 9, 10, 1], [428, 665, 12, 9, 10, 1], [428, 716, 12, 9, 10, 1], [428, 768, 12, 8, 10, 2], [489, 2, 11, 5, 8, 1], [489, 53, 12, 4, 9, 1], [489, 106, 11, 8, 9, 3], [489, 156, 12, 8, 10, 2], [489, 206, 12, 9, 9, 1], [489, 260, 11, 5, 9, 4], [489, 309, 14, 8, 11, 2], [489, 360, 13, 8, 10, 2], [489, 412, 12, 7, 10, 3], [489, 463, 12, 7, 10, 3], [489, 513, 15, 3, 12, 2], [489, 564, 9, 2, 6, 2], [489, 615, 11, 1, 8, 2], [489, 666, 15, 8, 12, 2], [489, 717, 16, 8, 13, 2], [489, 768, 14, 8, 10, 2], [550, 3, 15, 8, 12, 2], [550, 54, 15, 8, 12, 2], [550, 105, 15, 8, 12, 2], [550, 156, 15, 8, 12, 2], [550, 207, 13, 8, 10, 2], [550, 258, 15, 8, 12, 2], [550, 309, 15, 8, 12, 2], [550, 360, 15, 8, 12, 2], [550, 411, 15, 8, 12, 2], [550, 462, 15, 8, 12, 2], [550, 513, 15, 8, 12, 2], [550, 564, 11, 6, 9, 2], [550, 615, 11, 6, 8, 2], [550, 666, 15, 8, 12, 2], [550, 719, 14, 6, 12, 4], [550, 770, 13, 6, 10, 4], [611, 3, 10, 8, 9, 2], [611, 54, 9, 8, 6, 2], [611, 105, 15, 8, 12, 2], [611, 156, 15, 8, 12, 2], [611, 207, 15, 8, 12, 2], [611, 258, 15, 8, 12, 2], [611, 309, 15, 8, 12, 2], [611, 363, 11, 5, 9, 5], [611, 414, 11, 5, 9, 5], [611, 469, 10, 1, 10, 9], [611, 511, 1, 1, 9, 1], [611, 562, 13, 10, 11, 0], [611, 613, 14, 10, 11, 0], [611, 664, 12, 10, 9, 0], [611, 717, 16, 8, 13, 2], [611, 770, 14, 6, 12, 4], [672, 7, 8, 1, 7, 6], [672, 58, 11, 1, 10, 6], [672, 105, 12, 2, 9, 2], [672, 156, 13, 2, 9, 2], [672, 207, 10, 2, 7, 2], [672, 258, 10, 2, 7, 2], [672, 309, 15, 8, 12, 2], [672, 362, 11, 5, 10, 4], [672, 411, 13, 10, 10, 2], [1, 1, 1, 1, 6, 1], [794, 768, 15, 8, 12, 2], [672, 564, 15, 8, 12, 2], [672, 615, 15, 8, 12, 2], [672, 666, 15, 8, 12, 2], [672, 717, 15, 8, 12, 2], [672, 768, 15, 8, 12, 2], [733, 3, 15, 8, 12, 2], [733, 54, 15, 8, 12, 2], [733, 105, 15, 8, 12, 2], [733, 156, 15, 8, 12, 2], [733, 207, 15, 8, 12, 2], [733, 258, 15, 8, 12, 2], [733, 309, 15, 8, 12, 2], [733, 360, 15, 8, 12, 2], [733, 411, 15, 8, 12, 2], [733, 462, 15, 8, 12, 2], [733, 513, 15, 8, 12, 2], [733, 564, 15, 8, 12, 2], [733, 615, 15, 8, 12, 2], [733, 666, 15, 8, 12, 2], [733, 717, 15, 8, 12, 2], [733, 768, 15, 8, 12, 2], [1, 1, 1, 1, 6, 1], [794, 54, 15, 8, 12, 2], [794, 105, 15, 8, 12, 2], [794, 156, 15, 8, 12, 2], [794, 207, 15, 8, 12, 2], [794, 258, 15, 8, 12, 2], [794, 309, 15, 8, 12, 2], [794, 360, 15, 8, 12, 2], [794, 411, 15, 8, 12, 2], [794, 462, 15, 8, 12, 2], [794, 513, 15, 8, 12, 2], [794, 564, 15, 8, 12, 2], [794, 615, 15, 8, 12, 2], [794, 666, 15, 8, 12, 2], [794, 717, 15, 8, 12, 2], [794, 768, 15, 8, 12, 2], [855, 3, 15, 8, 12, 2], [855, 54, 15, 8, 12, 2], [855, 105, 15, 8, 12, 2], [855, 156, 15, 8, 12, 2], [855, 207, 15, 8, 12, 2], [855, 258, 15, 8, 12, 2], [855, 309, 15, 8, 12, 2], [855, 360, 15, 8, 12, 2], [855, 411, 15, 8, 12, 2], [855, 462, 15, 8, 12, 2], [855, 513, 15, 8, 12, 2], [855, 564, 15, 8, 12, 2], [855, 615, 15, 8, 12, 2], [855, 666, 15, 8, 12, 2], [855, 717, 15, 8, 12, 2], [855, 768, 15, 8, 12, 2]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 54, 7, 10, 7, 2], [1, 105, 9, 9, 9, 2], [1, 156, 12, 9, 12, 2], [1, 206, 10, 12, 10, 1], [1, 258, 14, 10, 14, 2], [1, 309, 12, 10, 12, 2], [1, 360, 7, 9, 7, 2], [1, 410, 9, 12, 9, 1], [1, 461, 9, 12, 9, 1], [1, 513, 11, 9, 11, 2], [1, 566, 10, 7, 10, 4], [1, 618, 7, 8, 7, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 7, 7, 5], [1, 768, 10, 10, 10, 2], [62, 3, 10, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 10, 10, 10, 2], [62, 156, 10, 11, 10, 2], [62, 207, 10, 10, 10, 2], [62, 258, 10, 11, 10, 2], [62, 309, 10, 10, 10, 2], [62, 360, 10, 10, 10, 2], [62, 411, 10, 10, 10, 2], [62, 462, 10, 10, 10, 2], [62, 516, 7, 7, 7, 5], [62, 567, 7, 8, 7, 5], [62, 617, 8, 7, 8, 4], [62, 669, 9, 6, 9, 5], [62, 719, 8, 7, 8, 4], [62, 768, 10, 10, 10, 2], [123, 4, 12, 10, 12, 3], [123, 54, 12, 10, 12, 2], [123, 105, 11, 10, 11, 2], [123, 156, 10, 10, 10, 2], [123, 207, 11, 10, 11, 2], [123, 258, 10, 10, 10, 2], [123, 309, 10, 10, 10, 2], [123, 360, 11, 10, 11, 2], [123, 411, 12, 10, 12, 2], [123, 462, 9, 10, 9, 2], [123, 513, 9, 12, 9, 2], [123, 564, 12, 10, 12, 2], [123, 615, 11, 10, 11, 2], [123, 666, 14, 10, 14, 2], [123, 717, 12, 10, 12, 2], [123, 768, 10, 10, 10, 2], [184, 3, 11, 10, 11, 2], [184, 54, 10, 12, 10, 2], [184, 105, 12, 10, 12, 2], [184, 156, 10, 10, 10, 2], [184, 207, 10, 10, 10, 2], [184, 258, 12, 10, 12, 2], [184, 309, 12, 10, 12, 2], [184, 360, 14, 10, 14, 2], [184, 411, 10, 10, 10, 2], [184, 462, 12, 10, 12, 2], [184, 513, 10, 10, 10, 2], [184, 563, 8, 12, 8, 1], [184, 615, 10, 10, 10, 2], [184, 665, 8, 12, 8, 1], [184, 717, 9, 9, 9, 2], [184, 771, 10, 7, 10, 5], [245, 3, 7, 9, 7, 2], [245, 56, 10, 8, 10, 4], [245, 105, 11, 10, 11, 2], [245, 158, 10, 8, 10, 4], [245, 207, 10, 10, 10, 2], [245, 260, 10, 8, 10, 4], [245, 309, 9, 10, 9, 2], [245, 362, 11, 10, 11, 4], [245, 411, 12, 10, 12, 2], [245, 462, 8, 10, 8, 2], [245, 513, 8, 12, 8, 2], [245, 564, 11, 10, 11, 2], [245, 615, 8, 10, 8, 2], [245, 668, 14, 8, 14, 4], [245, 719, 12, 8, 12, 4], [245, 770, 10, 8, 10, 4], [306, 5, 11, 10, 11, 4], [306, 56, 11, 10, 11, 4], [306, 107, 10, 8, 10, 4], [306, 158, 9, 8, 9, 4], [306, 208, 8, 9, 8, 3], [306, 260, 11, 8, 11, 4], [306, 311, 11, 8, 11, 4], [306, 362, 13, 8, 13, 4], [306, 413, 10, 8, 10, 4], [306, 464, 11, 10, 11, 4], [306, 515, 9, 8, 9, 4], [306, 563, 9, 13, 9, 1], [306, 614, 7, 13, 7, 1], [306, 665, 9, 13, 9, 1], [306, 717, 9, 9, 9, 2], [306, 771, 3, 6, 3, 5], [367, 2, 12, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 105, 10, 12, 10, 2], [367, 154, 10, 12, 10, 0], [367, 205, 12, 12, 12, 0], [367, 256, 10, 12, 10, 0], [367, 307, 12, 12, 12, 0], [367, 359, 10, 11, 10, 1], [367, 410, 10, 11, 10, 1], [367, 461, 10, 11, 10, 1], [367, 513, 10, 10, 10, 2], [367, 563, 10, 11, 10, 1], [367, 613, 10, 12, 10, 0], [367, 668, 10, 10, 10, 4], [367, 716, 10, 11, 10, 1], [367, 767, 10, 11, 10, 1], [428, 2, 10, 11, 10, 1], [428, 54, 10, 10, 10, 2], [428, 104, 8, 11, 8, 1], [428, 155, 8, 11, 8, 1], [428, 206, 8, 11, 8, 1], [428, 258, 8, 10, 8, 2], [428, 308, 12, 11, 12, 1], [428, 359, 10, 11, 10, 1], [428, 410, 10, 11, 10, 1], [428, 461, 10, 11, 10, 1], [428, 513, 10, 10, 10, 2], [428, 563, 10, 11, 10, 1], [428, 614, 11, 11, 11, 1], [428, 665, 11, 11, 11, 1], [428, 716, 11, 11, 11, 1], [428, 768, 11, 10, 11, 2], [489, 2, 9, 10, 9, 1], [489, 53, 10, 10, 10, 1], [489, 106, 10, 10, 10, 3], [489, 156, 11, 10, 11, 2], [489, 206, 10, 11, 10, 1], [489, 260, 10, 7, 10, 4], [489, 309, 12, 10, 12, 2], [489, 360, 11, 10, 11, 2], [489, 412, 11, 9, 11, 3], [489, 463, 11, 9, 11, 3], [489, 513, 13, 9, 13, 2], [489, 564, 7, 9, 7, 2], [489, 615, 9, 9, 9, 2], [489, 666, 13, 10, 13, 2], [489, 717, 14, 10, 14, 2], [489, 768, 11, 10, 11, 2], [550, 3, 13, 10, 13, 2], [550, 54, 13, 10, 13, 2], [550, 105, 13, 10, 13, 2], [550, 156, 13, 10, 13, 2], [550, 207, 11, 10, 11, 2], [550, 258, 13, 10, 13, 2], [550, 309, 13, 10, 13, 2], [550, 360, 13, 10, 13, 2], [550, 411, 13, 10, 13, 2], [550, 462, 13, 10, 13, 2], [550, 513, 13, 10, 13, 2], [550, 564, 10, 9, 10, 2], [550, 615, 9, 9, 9, 2], [550, 666, 13, 10, 13, 2], [550, 719, 13, 8, 13, 4], [550, 770, 11, 8, 11, 4], [611, 3, 10, 10, 10, 2], [611, 54, 7, 10, 7, 2], [611, 105, 13, 10, 13, 2], [611, 156, 13, 10, 13, 2], [611, 207, 13, 10, 13, 2], [611, 258, 13, 10, 13, 2], [611, 309, 13, 10, 13, 2], [611, 363, 10, 7, 10, 5], [611, 414, 10, 7, 10, 5], [611, 465, 11, 7, 11, 5], [611, 516, 10, 6, 10, 5], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 10, 12, 10, 0], [611, 717, 14, 10, 14, 2], [611, 770, 13, 8, 13, 4], [672, 6, 8, 6, 8, 5], [672, 57, 11, 6, 11, 5], [672, 105, 10, 9, 10, 2], [672, 156, 10, 9, 10, 2], [672, 207, 8, 9, 8, 2], [672, 258, 8, 9, 8, 2], [672, 309, 13, 10, 13, 2], [672, 362, 11, 7, 11, 4], [672, 411, 11, 12, 11, 2], [1, 6, 7, 6, 7, 5], [794, 768, 13, 10, 13, 2], [672, 564, 13, 10, 13, 2], [672, 615, 13, 10, 13, 2], [672, 666, 13, 10, 13, 2], [672, 717, 13, 10, 13, 2], [672, 768, 13, 10, 13, 2], [733, 3, 13, 10, 13, 2], [733, 54, 13, 10, 13, 2], [733, 105, 13, 10, 13, 2], [733, 156, 13, 10, 13, 2], [733, 207, 13, 10, 13, 2], [733, 258, 13, 10, 13, 2], [733, 309, 13, 10, 13, 2], [733, 360, 13, 10, 13, 2], [733, 411, 13, 10, 13, 2], [733, 462, 13, 10, 13, 2], [733, 513, 13, 10, 13, 2], [733, 564, 13, 10, 13, 2], [733, 615, 13, 10, 13, 2], [733, 666, 13, 10, 13, 2], [733, 717, 13, 10, 13, 2], [733, 768, 13, 10, 13, 2], [1, 6, 7, 6, 7, 5], [794, 54, 13, 10, 13, 2], [794, 105, 13, 10, 13, 2], [794, 156, 13, 10, 13, 2], [794, 207, 13, 10, 13, 2], [794, 258, 13, 10, 13, 2], [794, 309, 13, 10, 13, 2], [794, 360, 13, 10, 13, 2], [794, 411, 13, 10, 13, 2], [794, 462, 13, 10, 13, 2], [794, 513, 13, 10, 13, 2], [794, 564, 13, 10, 13, 2], [794, 615, 13, 10, 13, 2], [794, 666, 13, 10, 13, 2], [794, 717, 13, 10, 13, 2], [794, 768, 13, 10, 13, 2], [855, 3, 13, 10, 13, 2], [855, 54, 13, 10, 13, 2], [855, 105, 13, 10, 13, 2], [855, 156, 13, 10, 13, 2], [855, 207, 13, 10, 13, 2], [855, 258, 13, 10, 13, 2], [855, 309, 13, 10, 13, 2], [855, 360, 13, 10, 13, 2], [855, 411, 13, 10, 13, 2], [855, 462, 13, 10, 13, 2], [855, 513, 13, 10, 13, 2], [855, 564, 13, 10, 13, 2], [855, 615, 13, 10, 13, 2], [855, 666, 13, 10, 13, 2], [855, 717, 13, 10, 13, 2], [855, 768, 13, 10, 13, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 6, 8, 6, 2], [1, 105, 8, 8, 8, 2], [1, 156, 11, 8, 11, 2], [1, 206, 9, 10, 9, 1], [1, 258, 13, 8, 13, 2], [1, 309, 11, 8, 11, 2], [1, 360, 6, 8, 6, 2], [1, 410, 8, 10, 8, 1], [1, 461, 8, 10, 8, 1], [1, 513, 10, 8, 10, 2], [1, 566, 9, 6, 9, 4], [1, 617, 6, 7, 6, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 768, 9, 8, 9, 2], [62, 3, 9, 8, 9, 2], [62, 54, 9, 8, 9, 2], [62, 105, 9, 8, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 8, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 8, 9, 2], [62, 360, 9, 8, 9, 2], [62, 411, 9, 8, 9, 2], [62, 462, 9, 8, 9, 2], [62, 515, 6, 6, 6, 4], [62, 566, 6, 7, 6, 4], [62, 617, 7, 6, 7, 4], [62, 668, 8, 6, 8, 4], [62, 719, 7, 6, 7, 4], [62, 768, 9, 8, 9, 2], [123, 4, 11, 8, 11, 3], [123, 54, 11, 8, 11, 2], [123, 105, 10, 8, 10, 2], [123, 156, 9, 8, 9, 2], [123, 207, 10, 8, 10, 2], [123, 258, 9, 8, 9, 2], [123, 309, 9, 8, 9, 2], [123, 360, 10, 8, 10, 2], [123, 411, 11, 8, 11, 2], [123, 462, 8, 8, 8, 2], [123, 513, 8, 10, 8, 2], [123, 564, 11, 8, 11, 2], [123, 615, 10, 8, 10, 2], [123, 666, 13, 8, 13, 2], [123, 717, 11, 8, 11, 2], [123, 768, 9, 8, 9, 2], [184, 3, 10, 8, 10, 2], [184, 54, 9, 10, 9, 2], [184, 105, 11, 8, 11, 2], [184, 156, 9, 8, 9, 2], [184, 207, 9, 8, 9, 2], [184, 258, 11, 8, 11, 2], [184, 309, 11, 8, 11, 2], [184, 360, 13, 8, 13, 2], [184, 411, 9, 8, 9, 2], [184, 462, 11, 8, 11, 2], [184, 513, 9, 8, 9, 2], [184, 563, 7, 10, 7, 1], [184, 615, 9, 8, 9, 2], [184, 665, 7, 10, 7, 1], [184, 717, 8, 8, 8, 2], [184, 770, 9, 6, 9, 4], [245, 3, 6, 8, 6, 2], [245, 56, 9, 6, 9, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 9, 8, 9, 2], [245, 260, 9, 6, 9, 4], [245, 309, 8, 8, 8, 2], [245, 362, 10, 8, 10, 4], [245, 411, 11, 8, 11, 2], [245, 462, 7, 8, 7, 2], [245, 513, 7, 10, 7, 2], [245, 564, 10, 8, 10, 2], [245, 615, 7, 8, 7, 2], [245, 668, 13, 6, 13, 4], [245, 719, 11, 6, 11, 4], [245, 770, 9, 6, 9, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 9, 6, 9, 4], [306, 158, 8, 6, 8, 4], [306, 208, 7, 7, 7, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 12, 6, 12, 4], [306, 413, 9, 6, 9, 4], [306, 464, 10, 8, 10, 4], [306, 515, 8, 6, 8, 4], [306, 563, 8, 11, 8, 1], [306, 614, 6, 11, 6, 1], [306, 665, 8, 11, 8, 1], [306, 717, 8, 8, 8, 2], [306, 770, 3, 6, 3, 4], [367, 2, 11, 9, 11, 1], [367, 52, 11, 10, 11, 0], [367, 105, 9, 10, 9, 2], [367, 154, 9, 10, 9, 0], [367, 205, 11, 10, 11, 0], [367, 256, 9, 10, 9, 0], [367, 307, 11, 10, 11, 0], [367, 359, 9, 9, 9, 1], [367, 410, 9, 9, 9, 1], [367, 461, 9, 9, 9, 1], [367, 513, 9, 8, 9, 2], [367, 563, 9, 9, 9, 1], [367, 613, 9, 10, 9, 0], [367, 668, 9, 8, 9, 4], [367, 716, 9, 9, 9, 1], [367, 767, 9, 9, 9, 1], [428, 2, 9, 9, 9, 1], [428, 54, 9, 8, 9, 2], [428, 104, 7, 9, 7, 1], [428, 155, 7, 9, 7, 1], [428, 206, 7, 9, 7, 1], [428, 258, 7, 8, 7, 2], [428, 308, 11, 9, 11, 1], [428, 359, 9, 9, 9, 1], [428, 410, 9, 9, 9, 1], [428, 461, 9, 9, 9, 1], [428, 513, 9, 8, 9, 2], [428, 563, 9, 9, 9, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 2, 8, 9, 8, 1], [489, 53, 9, 9, 9, 1], [489, 106, 9, 8, 9, 3], [489, 156, 10, 8, 10, 2], [489, 206, 9, 9, 9, 1], [489, 260, 9, 6, 9, 4], [489, 309, 11, 8, 11, 2], [489, 360, 10, 8, 10, 2], [489, 412, 10, 7, 10, 3], [489, 463, 10, 7, 10, 3], [489, 513, 12, 8, 12, 2], [489, 564, 6, 8, 6, 2], [489, 615, 8, 8, 8, 2], [489, 666, 12, 8, 12, 2], [489, 717, 13, 8, 13, 2], [489, 768, 10, 8, 10, 2], [550, 3, 12, 8, 12, 2], [550, 54, 12, 8, 12, 2], [550, 105, 12, 8, 12, 2], [550, 156, 12, 8, 12, 2], [550, 207, 10, 8, 10, 2], [550, 258, 12, 8, 12, 2], [550, 309, 12, 8, 12, 2], [550, 360, 12, 8, 12, 2], [550, 411, 12, 8, 12, 2], [550, 462, 12, 8, 12, 2], [550, 513, 12, 8, 12, 2], [550, 564, 9, 8, 9, 2], [550, 615, 8, 8, 8, 2], [550, 666, 12, 8, 12, 2], [550, 719, 12, 6, 12, 4], [550, 770, 10, 6, 10, 4], [611, 3, 9, 8, 9, 2], [611, 54, 6, 8, 6, 2], [611, 105, 12, 8, 12, 2], [611, 156, 12, 8, 12, 2], [611, 207, 12, 8, 12, 2], [611, 258, 12, 8, 12, 2], [611, 309, 12, 8, 12, 2], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 10, 6, 10, 4], [611, 515, 9, 6, 9, 4], [611, 562, 11, 10, 11, 0], [611, 613, 11, 10, 11, 0], [611, 664, 9, 10, 9, 0], [611, 717, 13, 8, 13, 2], [611, 770, 12, 6, 12, 4], [672, 5, 7, 6, 7, 4], [672, 56, 10, 6, 10, 4], [672, 105, 9, 8, 9, 2], [672, 156, 9, 8, 9, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 309, 12, 8, 12, 2], [672, 362, 10, 6, 10, 4], [672, 411, 10, 10, 10, 2], [1, 5, 6, 6, 6, 4], [794, 768, 12, 8, 12, 2], [672, 564, 12, 8, 12, 2], [672, 615, 12, 8, 12, 2], [672, 666, 12, 8, 12, 2], [672, 717, 12, 8, 12, 2], [672, 768, 12, 8, 12, 2], [733, 3, 12, 8, 12, 2], [733, 54, 12, 8, 12, 2], [733, 105, 12, 8, 12, 2], [733, 156, 12, 8, 12, 2], [733, 207, 12, 8, 12, 2], [733, 258, 12, 8, 12, 2], [733, 309, 12, 8, 12, 2], [733, 360, 12, 8, 12, 2], [733, 411, 12, 8, 12, 2], [733, 462, 12, 8, 12, 2], [733, 513, 12, 8, 12, 2], [733, 564, 12, 8, 12, 2], [733, 615, 12, 8, 12, 2], [733, 666, 12, 8, 12, 2], [733, 717, 12, 8, 12, 2], [733, 768, 12, 8, 12, 2], [1, 5, 6, 6, 6, 4], [794, 54, 12, 8, 12, 2], [794, 105, 12, 8, 12, 2], [794, 156, 12, 8, 12, 2], [794, 207, 12, 8, 12, 2], [794, 258, 12, 8, 12, 2], [794, 309, 12, 8, 12, 2], [794, 360, 12, 8, 12, 2], [794, 411, 12, 8, 12, 2], [794, 462, 12, 8, 12, 2], [794, 513, 12, 8, 12, 2], [794, 564, 12, 8, 12, 2], [794, 615, 12, 8, 12, 2], [794, 666, 12, 8, 12, 2], [794, 717, 12, 8, 12, 2], [794, 768, 12, 8, 12, 2], [855, 3, 12, 8, 12, 2], [855, 54, 12, 8, 12, 2], [855, 105, 12, 8, 12, 2], [855, 156, 12, 8, 12, 2], [855, 207, 12, 8, 12, 2], [855, 258, 12, 8, 12, 2], [855, 309, 12, 8, 12, 2], [855, 360, 12, 8, 12, 2], [855, 411, 12, 8, 12, 2], [855, 462, 12, 8, 12, 2], [855, 513, 12, 8, 12, 2], [855, 564, 12, 8, 12, 2], [855, 615, 12, 8, 12, 2], [855, 666, 12, 8, 12, 2], [855, 717, 12, 8, 12, 2], [855, 768, 12, 8, 12, 2]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 13, 11, 9, 3], [1, 106, 14, 4, 10, 3], [1, 157, 17, 7, 13, 3], [1, 207, 16, 13, 12, 2], [1, 259, 18, 11, 14, 3], [1, 310, 17, 11, 15, 3], [1, 361, 12, 4, 8, 3], [1, 411, 15, 13, 10, 2], [1, 462, 13, 13, 10, 2], [1, 513, 15, 8, 11, 2], [1, 568, 13, 7, 11, 6], [1, 624, 8, 5, 8, 11], [1, 672, 13, 3, 11, 8], [1, 726, 8, 3, 8, 11], [1, 769, 16, 12, 12, 3], [62, 4, 16, 11, 13, 3], [62, 55, 15, 11, 13, 3], [62, 106, 16, 11, 13, 3], [62, 157, 16, 13, 13, 3], [62, 208, 16, 11, 13, 3], [62, 259, 16, 13, 13, 3], [62, 309, 16, 12, 13, 2], [62, 361, 17, 11, 13, 3], [62, 412, 16, 12, 13, 3], [62, 463, 16, 12, 13, 3], [62, 517, 11, 8, 8, 6], [62, 568, 11, 10, 8, 6], [62, 619, 13, 7, 10, 6], [62, 671, 14, 5, 12, 7], [62, 721, 12, 7, 10, 6], [62, 769, 16, 11, 12, 3], [123, 6, 17, 10, 15, 5], [123, 55, 15, 11, 15, 3], [123, 106, 16, 11, 13, 3], [123, 157, 16, 11, 12, 3], [123, 208, 16, 11, 13, 3], [123, 259, 16, 11, 12, 3], [123, 310, 16, 11, 12, 3], [123, 361, 16, 11, 13, 3], [123, 412, 18, 11, 14, 3], [123, 463, 14, 11, 11, 3], [123, 514, 14, 14, 10, 3], [123, 565, 17, 11, 13, 3], [123, 616, 14, 11, 13, 3], [123, 667, 21, 11, 17, 3], [123, 718, 18, 11, 14, 3], [123, 769, 16, 11, 13, 3], [184, 4, 16, 11, 13, 3], [184, 55, 16, 13, 13, 3], [184, 106, 16, 11, 13, 3], [184, 157, 16, 11, 12, 3], [184, 208, 17, 11, 13, 3], [184, 259, 18, 11, 14, 3], [184, 310, 19, 11, 15, 3], [184, 361, 22, 11, 18, 3], [184, 412, 17, 11, 13, 3], [184, 463, 17, 11, 13, 3], [184, 514, 15, 11, 11, 3], [184, 564, 14, 13, 9, 2], [184, 616, 12, 12, 12, 3], [184, 666, 14, 13, 9, 2], [184, 718, 13, 4, 9, 3], [184, 777, 13, 3, 12, 11], [245, 4, 12, 5, 9, 3], [245, 57, 14, 9, 12, 5], [245, 106, 15, 11, 13, 3], [245, 159, 14, 9, 11, 5], [245, 208, 16, 11, 13, 3], [245, 261, 14, 9, 12, 5], [245, 310, 14, 11, 10, 3], [245, 363, 15, 12, 12, 5], [245, 412, 15, 11, 13, 3], [245, 463, 12, 11, 9, 3], [245, 514, 12, 14, 9, 3], [245, 565, 15, 11, 13, 3], [245, 616, 12, 11, 9, 3], [245, 669, 19, 9, 17, 5], [245, 720, 15, 9, 13, 5], [245, 771, 14, 9, 12, 5], [306, 6, 15, 12, 13, 5], [306, 57, 15, 12, 13, 5], [306, 108, 14, 9, 11, 5], [306, 159, 14, 9, 11, 5], [306, 208, 13, 11, 10, 3], [306, 261, 15, 9, 13, 5], [306, 312, 16, 9, 13, 5], [306, 363, 20, 9, 16, 5], [306, 414, 16, 9, 12, 5], [306, 465, 16, 12, 13, 5], [306, 516, 14, 9, 11, 5], [306, 563, 15, 15, 10, 1], [306, 614, 13, 15, 8, 1], [306, 665, 14, 15, 10, 1], [306, 718, 15, 4, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 17, 13, 15, 1], [367, 52, 17, 14, 15, 0], [367, 106, 16, 14, 12, 3], [367, 155, 16, 13, 12, 1], [367, 205, 19, 14, 14, 0], [367, 257, 16, 13, 13, 1], [367, 308, 18, 13, 14, 1], [367, 360, 15, 12, 12, 2], [367, 411, 14, 12, 12, 2], [367, 461, 15, 13, 12, 1], [367, 514, 14, 11, 12, 3], [367, 564, 17, 12, 12, 2], [367, 614, 16, 13, 12, 1], [367, 669, 14, 11, 11, 5], [367, 717, 16, 12, 12, 2], [367, 768, 14, 12, 12, 2], [428, 2, 16, 13, 12, 1], [428, 55, 15, 11, 12, 3], [428, 105, 14, 12, 9, 2], [428, 156, 12, 12, 9, 2], [428, 206, 14, 13, 9, 1], [428, 259, 13, 11, 9, 3], [428, 309, 17, 12, 13, 2], [428, 360, 16, 12, 12, 2], [428, 411, 14, 12, 12, 2], [428, 461, 16, 13, 12, 1], [428, 514, 15, 11, 12, 3], [428, 564, 17, 12, 12, 2], [428, 615, 15, 12, 13, 2], [428, 666, 15, 12, 13, 2], [428, 716, 16, 13, 13, 1], [428, 769, 15, 11, 13, 3], [489, 3, 13, 7, 9, 2], [489, 55, 14, 6, 10, 3], [489, 107, 15, 11, 12, 4], [489, 157, 16, 11, 13, 3], [489, 208, 16, 11, 12, 3], [489, 261, 15, 7, 13, 5], [489, 310, 18, 11, 14, 3], [489, 361, 16, 11, 12, 3], [489, 413, 17, 10, 14, 4], [489, 464, 17, 10, 14, 4], [489, 514, 18, 6, 14, 3], [489, 565, 13, 5, 9, 3], [489, 616, 13, 3, 9, 3], [489, 667, 20, 11, 17, 3], [489, 718, 21, 11, 17, 3], [489, 769, 17, 11, 13, 3], [550, 4, 20, 11, 17, 3], [550, 55, 20, 11, 17, 3], [550, 106, 20, 11, 17, 3], [550, 157, 20, 11, 17, 3], [550, 208, 17, 11, 13, 3], [550, 259, 20, 11, 17, 3], [550, 310, 20, 11, 17, 3], [550, 361, 20, 11, 17, 3], [550, 412, 20, 11, 17, 3], [550, 463, 20, 11, 17, 3], [550, 514, 20, 11, 17, 3], [550, 565, 15, 10, 12, 3], [550, 616, 15, 10, 11, 3], [550, 667, 20, 11, 17, 3], [550, 720, 17, 9, 15, 5], [550, 771, 15, 9, 12, 5], [611, 4, 14, 11, 12, 3], [611, 55, 12, 11, 9, 3], [611, 106, 20, 11, 17, 3], [611, 157, 20, 11, 17, 3], [611, 208, 20, 11, 17, 3], [611, 259, 20, 11, 17, 3], [611, 310, 20, 11, 17, 3], [611, 365, 14, 7, 12, 7], [611, 416, 13, 7, 12, 7], [611, 471, 14, 3, 14, 11], [611, 511, 1, 1, 13, 1], [611, 562, 16, 14, 15, 0], [611, 614, 19, 13, 15, 1], [611, 664, 18, 14, 13, 0], [611, 718, 21, 11, 17, 3], [611, 771, 18, 9, 16, 5], [672, 9, 13, 3, 10, 8], [672, 60, 17, 3, 14, 8], [672, 106, 14, 5, 10, 3], [672, 157, 14, 5, 10, 3], [672, 208, 12, 5, 8, 3], [672, 259, 12, 5, 8, 3], [672, 310, 20, 11, 17, 3], [672, 362, 16, 10, 14, 4], [672, 412, 16, 14, 13, 3], [1, 1, 1, 1, 9, 1], [794, 769, 20, 11, 17, 3], [672, 565, 20, 11, 17, 3], [672, 616, 20, 11, 17, 3], [672, 667, 20, 11, 17, 3], [672, 718, 20, 11, 17, 3], [672, 769, 20, 11, 17, 3], [733, 4, 20, 11, 17, 3], [733, 55, 20, 11, 17, 3], [733, 106, 20, 11, 17, 3], [733, 157, 20, 11, 17, 3], [733, 208, 20, 11, 17, 3], [733, 259, 20, 11, 17, 3], [733, 310, 20, 11, 17, 3], [733, 361, 20, 11, 17, 3], [733, 412, 20, 11, 17, 3], [733, 463, 20, 11, 17, 3], [733, 514, 20, 11, 17, 3], [733, 565, 20, 11, 17, 3], [733, 616, 20, 11, 17, 3], [733, 667, 20, 11, 17, 3], [733, 718, 20, 11, 17, 3], [733, 769, 20, 11, 17, 3], [1, 1, 1, 1, 9, 1], [794, 55, 20, 11, 17, 3], [794, 106, 20, 11, 17, 3], [794, 157, 20, 11, 17, 3], [794, 208, 20, 11, 17, 3], [794, 259, 20, 11, 17, 3], [794, 310, 20, 11, 17, 3], [794, 361, 20, 11, 17, 3], [794, 412, 20, 11, 17, 3], [794, 463, 20, 11, 17, 3], [794, 514, 20, 11, 17, 3], [794, 565, 20, 11, 17, 3], [794, 616, 20, 11, 17, 3], [794, 667, 20, 11, 17, 3], [794, 718, 20, 11, 17, 3], [794, 769, 20, 11, 17, 3], [855, 4, 20, 11, 17, 3], [855, 55, 20, 11, 17, 3], [855, 106, 20, 11, 17, 3], [855, 157, 20, 11, 17, 3], [855, 208, 20, 11, 17, 3], [855, 259, 20, 11, 17, 3], [855, 310, 20, 11, 17, 3], [855, 361, 20, 11, 17, 3], [855, 412, 20, 11, 17, 3], [855, 463, 20, 11, 17, 3], [855, 514, 20, 11, 17, 3], [855, 565, 20, 11, 17, 3], [855, 616, 20, 11, 17, 3], [855, 667, 20, 11, 17, 3], [855, 718, 20, 11, 17, 3], [855, 769, 20, 11, 17, 3]], \"capHeight\": 13, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 12, 9, 8, 3], [1, 106, 13, 2, 9, 3], [1, 157, 16, 5, 12, 3], [1, 207, 15, 11, 11, 2], [1, 259, 17, 9, 13, 3], [1, 310, 16, 9, 14, 3], [1, 361, 11, 2, 7, 3], [1, 411, 14, 11, 9, 2], [1, 462, 12, 11, 9, 2], [1, 513, 14, 6, 10, 2], [1, 568, 12, 5, 10, 6], [1, 624, 7, 3, 7, 11], [1, 672, 12, 1, 10, 8], [1, 726, 7, 1, 7, 11], [1, 769, 15, 10, 11, 3], [62, 4, 15, 9, 12, 3], [62, 55, 14, 9, 12, 3], [62, 106, 15, 9, 12, 3], [62, 157, 15, 11, 12, 3], [62, 208, 15, 9, 12, 3], [62, 259, 15, 11, 12, 3], [62, 309, 15, 10, 12, 2], [62, 361, 16, 9, 12, 3], [62, 412, 15, 10, 12, 3], [62, 463, 15, 10, 12, 3], [62, 517, 10, 6, 7, 6], [62, 568, 10, 8, 7, 6], [62, 619, 12, 5, 9, 6], [62, 671, 13, 3, 11, 7], [62, 721, 11, 5, 9, 6], [62, 769, 15, 9, 11, 3], [123, 6, 16, 8, 14, 5], [123, 55, 14, 9, 14, 3], [123, 106, 15, 9, 12, 3], [123, 157, 15, 9, 11, 3], [123, 208, 15, 9, 12, 3], [123, 259, 15, 9, 11, 3], [123, 310, 15, 9, 11, 3], [123, 361, 15, 9, 12, 3], [123, 412, 17, 9, 13, 3], [123, 463, 13, 9, 10, 3], [123, 514, 13, 12, 9, 3], [123, 565, 16, 9, 12, 3], [123, 616, 13, 9, 12, 3], [123, 667, 20, 9, 16, 3], [123, 718, 17, 9, 13, 3], [123, 769, 15, 9, 12, 3], [184, 4, 15, 9, 12, 3], [184, 55, 15, 11, 12, 3], [184, 106, 15, 9, 12, 3], [184, 157, 15, 9, 11, 3], [184, 208, 16, 9, 12, 3], [184, 259, 17, 9, 13, 3], [184, 310, 18, 9, 14, 3], [184, 361, 21, 9, 17, 3], [184, 412, 16, 9, 12, 3], [184, 463, 16, 9, 12, 3], [184, 514, 14, 9, 10, 3], [184, 564, 13, 11, 8, 2], [184, 616, 11, 10, 11, 3], [184, 666, 13, 11, 8, 2], [184, 718, 12, 2, 8, 3], [184, 777, 12, 1, 11, 11], [245, 4, 11, 3, 8, 3], [245, 57, 13, 7, 11, 5], [245, 106, 14, 9, 12, 3], [245, 159, 13, 7, 10, 5], [245, 208, 15, 9, 12, 3], [245, 261, 13, 7, 11, 5], [245, 310, 13, 9, 9, 3], [245, 363, 14, 10, 11, 5], [245, 412, 14, 9, 12, 3], [245, 463, 11, 9, 8, 3], [245, 514, 11, 12, 8, 3], [245, 565, 14, 9, 12, 3], [245, 616, 11, 9, 8, 3], [245, 669, 18, 7, 16, 5], [245, 720, 14, 7, 12, 5], [245, 771, 13, 7, 11, 5], [306, 6, 14, 10, 12, 5], [306, 57, 14, 10, 12, 5], [306, 108, 13, 7, 10, 5], [306, 159, 13, 7, 10, 5], [306, 208, 12, 9, 9, 3], [306, 261, 14, 7, 12, 5], [306, 312, 15, 7, 12, 5], [306, 363, 19, 7, 15, 5], [306, 414, 15, 7, 11, 5], [306, 465, 15, 10, 12, 5], [306, 516, 13, 7, 10, 5], [306, 563, 14, 13, 9, 1], [306, 614, 12, 13, 7, 1], [306, 665, 13, 13, 9, 1], [306, 718, 14, 2, 10, 3], [306, 766, 1, 1, 3, 1], [367, 2, 16, 11, 14, 1], [367, 52, 16, 12, 14, 0], [367, 106, 15, 12, 11, 3], [367, 155, 15, 11, 11, 1], [367, 205, 17, 12, 13, 0], [367, 257, 15, 11, 12, 1], [367, 308, 17, 11, 13, 1], [367, 360, 14, 10, 11, 2], [367, 411, 13, 10, 11, 2], [367, 461, 14, 11, 11, 1], [367, 514, 13, 9, 11, 3], [367, 564, 16, 10, 11, 2], [367, 614, 15, 11, 11, 1], [367, 669, 13, 9, 10, 5], [367, 717, 15, 10, 11, 2], [367, 768, 13, 10, 11, 2], [428, 2, 15, 11, 11, 1], [428, 55, 14, 9, 11, 3], [428, 105, 13, 10, 8, 2], [428, 156, 11, 10, 8, 2], [428, 206, 13, 11, 8, 1], [428, 259, 12, 9, 8, 3], [428, 309, 16, 10, 12, 2], [428, 360, 15, 10, 11, 2], [428, 411, 13, 10, 11, 2], [428, 461, 15, 11, 11, 1], [428, 514, 14, 9, 11, 3], [428, 564, 16, 10, 11, 2], [428, 615, 14, 10, 12, 2], [428, 666, 14, 10, 12, 2], [428, 716, 15, 11, 12, 1], [428, 769, 14, 9, 12, 3], [489, 3, 12, 5, 8, 2], [489, 55, 13, 4, 9, 3], [489, 107, 14, 9, 11, 4], [489, 157, 15, 9, 12, 3], [489, 208, 15, 9, 11, 3], [489, 261, 14, 5, 12, 5], [489, 310, 17, 9, 13, 3], [489, 361, 15, 9, 11, 3], [489, 413, 16, 8, 13, 4], [489, 464, 16, 8, 13, 4], [489, 514, 17, 4, 13, 3], [489, 565, 12, 3, 8, 3], [489, 616, 12, 1, 8, 3], [489, 667, 19, 9, 16, 3], [489, 718, 20, 9, 16, 3], [489, 769, 16, 9, 12, 3], [550, 4, 19, 9, 16, 3], [550, 55, 19, 9, 16, 3], [550, 106, 19, 9, 16, 3], [550, 157, 19, 9, 16, 3], [550, 208, 16, 9, 12, 3], [550, 259, 19, 9, 16, 3], [550, 310, 19, 9, 16, 3], [550, 361, 19, 9, 16, 3], [550, 412, 19, 9, 16, 3], [550, 463, 19, 9, 16, 3], [550, 514, 19, 9, 16, 3], [550, 565, 14, 8, 11, 3], [550, 616, 14, 8, 10, 3], [550, 667, 19, 9, 16, 3], [550, 720, 16, 7, 14, 5], [550, 771, 14, 7, 11, 5], [611, 4, 13, 9, 11, 3], [611, 55, 11, 9, 8, 3], [611, 106, 19, 9, 16, 3], [611, 157, 19, 9, 16, 3], [611, 208, 19, 9, 16, 3], [611, 259, 19, 9, 16, 3], [611, 310, 19, 9, 16, 3], [611, 365, 13, 5, 11, 7], [611, 416, 12, 5, 11, 7], [611, 471, 13, 1, 13, 11], [611, 511, 1, 1, 12, 1], [611, 562, 15, 12, 14, 0], [611, 614, 18, 11, 14, 1], [611, 664, 15, 12, 12, 0], [611, 718, 20, 9, 16, 3], [611, 771, 17, 7, 15, 5], [672, 9, 12, 1, 9, 8], [672, 60, 16, 1, 13, 8], [672, 106, 13, 3, 9, 3], [672, 157, 13, 3, 9, 3], [672, 208, 11, 3, 7, 3], [672, 259, 11, 3, 7, 3], [672, 310, 19, 9, 16, 3], [672, 362, 15, 8, 13, 4], [672, 412, 15, 12, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 19, 9, 16, 3], [672, 565, 19, 9, 16, 3], [672, 616, 19, 9, 16, 3], [672, 667, 19, 9, 16, 3], [672, 718, 19, 9, 16, 3], [672, 769, 19, 9, 16, 3], [733, 4, 19, 9, 16, 3], [733, 55, 19, 9, 16, 3], [733, 106, 19, 9, 16, 3], [733, 157, 19, 9, 16, 3], [733, 208, 19, 9, 16, 3], [733, 259, 19, 9, 16, 3], [733, 310, 19, 9, 16, 3], [733, 361, 19, 9, 16, 3], [733, 412, 19, 9, 16, 3], [733, 463, 19, 9, 16, 3], [733, 514, 19, 9, 16, 3], [733, 565, 19, 9, 16, 3], [733, 616, 19, 9, 16, 3], [733, 667, 19, 9, 16, 3], [733, 718, 19, 9, 16, 3], [733, 769, 19, 9, 16, 3], [1, 1, 1, 1, 8, 1], [794, 55, 19, 9, 16, 3], [794, 106, 19, 9, 16, 3], [794, 157, 19, 9, 16, 3], [794, 208, 19, 9, 16, 3], [794, 259, 19, 9, 16, 3], [794, 310, 19, 9, 16, 3], [794, 361, 19, 9, 16, 3], [794, 412, 19, 9, 16, 3], [794, 463, 19, 9, 16, 3], [794, 514, 19, 9, 16, 3], [794, 565, 19, 9, 16, 3], [794, 616, 19, 9, 16, 3], [794, 667, 19, 9, 16, 3], [794, 718, 19, 9, 16, 3], [794, 769, 19, 9, 16, 3], [855, 4, 19, 9, 16, 3], [855, 55, 19, 9, 16, 3], [855, 106, 19, 9, 16, 3], [855, 157, 19, 9, 16, 3], [855, 208, 19, 9, 16, 3], [855, 259, 19, 9, 16, 3], [855, 310, 19, 9, 16, 3], [855, 361, 19, 9, 16, 3], [855, 412, 19, 9, 16, 3], [855, 463, 19, 9, 16, 3], [855, 514, 19, 9, 16, 3], [855, 565, 19, 9, 16, 3], [855, 616, 19, 9, 16, 3], [855, 667, 19, 9, 16, 3], [855, 718, 19, 9, 16, 3], [855, 769, 19, 9, 16, 3]], \"capHeight\": 12, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 9, 6, 9, 7], [1, 55, 9, 11, 9, 3], [1, 106, 10, 10, 10, 3], [1, 157, 13, 10, 13, 3], [1, 207, 12, 13, 12, 2], [1, 259, 14, 11, 14, 3], [1, 310, 15, 11, 15, 3], [1, 361, 8, 10, 8, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 513, 11, 11, 11, 2], [1, 568, 11, 7, 11, 6], [1, 620, 8, 9, 8, 7], [1, 671, 11, 6, 11, 7], [1, 722, 8, 7, 8, 7], [1, 769, 12, 12, 12, 3], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 13, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 13, 13, 3], [62, 309, 13, 12, 13, 2], [62, 361, 13, 11, 13, 3], [62, 412, 13, 12, 13, 3], [62, 463, 13, 12, 13, 3], [62, 517, 8, 8, 8, 6], [62, 568, 8, 10, 8, 6], [62, 619, 10, 7, 10, 6], [62, 671, 12, 6, 12, 7], [62, 721, 10, 7, 10, 6], [62, 769, 12, 11, 12, 3], [123, 6, 15, 10, 15, 5], [123, 55, 15, 11, 15, 3], [123, 106, 13, 11, 13, 3], [123, 157, 12, 11, 12, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 13, 11, 13, 3], [123, 412, 14, 11, 14, 3], [123, 463, 11, 11, 11, 3], [123, 514, 10, 14, 10, 3], [123, 565, 13, 11, 13, 3], [123, 616, 13, 11, 13, 3], [123, 667, 17, 11, 17, 3], [123, 718, 14, 11, 14, 3], [123, 769, 13, 11, 13, 3], [184, 4, 13, 11, 13, 3], [184, 55, 13, 13, 13, 3], [184, 106, 13, 11, 13, 3], [184, 157, 12, 11, 12, 3], [184, 208, 13, 11, 13, 3], [184, 259, 14, 11, 14, 3], [184, 310, 15, 11, 15, 3], [184, 361, 18, 11, 18, 3], [184, 412, 13, 11, 13, 3], [184, 463, 13, 11, 13, 3], [184, 514, 11, 11, 11, 3], [184, 564, 9, 13, 9, 2], [184, 616, 12, 12, 12, 3], [184, 666, 9, 13, 9, 2], [184, 718, 9, 10, 9, 3], [184, 773, 12, 7, 12, 7], [245, 4, 9, 10, 9, 3], [245, 57, 12, 9, 12, 5], [245, 106, 13, 11, 13, 3], [245, 159, 11, 9, 11, 5], [245, 208, 13, 11, 13, 3], [245, 261, 12, 9, 12, 5], [245, 310, 10, 11, 10, 3], [245, 363, 12, 12, 12, 5], [245, 412, 13, 11, 13, 3], [245, 463, 9, 11, 9, 3], [245, 514, 9, 14, 9, 3], [245, 565, 13, 11, 13, 3], [245, 616, 9, 11, 9, 3], [245, 669, 17, 9, 17, 5], [245, 720, 13, 9, 13, 5], [245, 771, 12, 9, 12, 5], [306, 6, 13, 12, 13, 5], [306, 57, 13, 12, 13, 5], [306, 108, 11, 9, 11, 5], [306, 159, 11, 9, 11, 5], [306, 208, 10, 11, 10, 3], [306, 261, 13, 9, 13, 5], [306, 312, 13, 9, 13, 5], [306, 363, 16, 9, 16, 5], [306, 414, 12, 9, 12, 5], [306, 465, 13, 12, 13, 5], [306, 516, 11, 9, 11, 5], [306, 563, 10, 15, 10, 1], [306, 614, 8, 15, 8, 1], [306, 665, 10, 15, 10, 1], [306, 718, 11, 10, 11, 3], [306, 773, 3, 6, 3, 7], [367, 2, 15, 13, 15, 1], [367, 52, 15, 14, 15, 0], [367, 106, 12, 14, 12, 3], [367, 155, 12, 13, 12, 1], [367, 205, 14, 14, 14, 0], [367, 257, 13, 13, 13, 1], [367, 308, 14, 13, 14, 1], [367, 360, 12, 12, 12, 2], [367, 411, 12, 12, 12, 2], [367, 461, 12, 13, 12, 1], [367, 514, 12, 11, 12, 3], [367, 564, 12, 12, 12, 2], [367, 614, 12, 13, 12, 1], [367, 669, 11, 11, 11, 5], [367, 717, 12, 12, 12, 2], [367, 768, 12, 12, 12, 2], [428, 2, 12, 13, 12, 1], [428, 55, 12, 11, 12, 3], [428, 105, 9, 12, 9, 2], [428, 156, 9, 12, 9, 2], [428, 206, 9, 13, 9, 1], [428, 259, 9, 11, 9, 3], [428, 309, 13, 12, 13, 2], [428, 360, 12, 12, 12, 2], [428, 411, 12, 12, 12, 2], [428, 461, 12, 13, 12, 1], [428, 514, 12, 11, 12, 3], [428, 564, 12, 12, 12, 2], [428, 615, 13, 12, 13, 2], [428, 666, 13, 12, 13, 2], [428, 716, 13, 13, 13, 1], [428, 769, 13, 11, 13, 3], [489, 3, 9, 11, 9, 2], [489, 55, 10, 10, 10, 3], [489, 107, 12, 11, 12, 4], [489, 157, 13, 11, 13, 3], [489, 208, 12, 11, 12, 3], [489, 261, 13, 8, 13, 5], [489, 310, 14, 11, 14, 3], [489, 361, 12, 11, 12, 3], [489, 413, 14, 10, 14, 4], [489, 464, 14, 10, 14, 4], [489, 514, 14, 10, 14, 3], [489, 565, 9, 10, 9, 3], [489, 616, 9, 10, 9, 3], [489, 667, 17, 11, 17, 3], [489, 718, 17, 11, 17, 3], [489, 769, 13, 11, 13, 3], [550, 4, 17, 11, 17, 3], [550, 55, 17, 11, 17, 3], [550, 106, 17, 11, 17, 3], [550, 157, 17, 11, 17, 3], [550, 208, 13, 11, 13, 3], [550, 259, 17, 11, 17, 3], [550, 310, 17, 11, 17, 3], [550, 361, 17, 11, 17, 3], [550, 412, 17, 11, 17, 3], [550, 463, 17, 11, 17, 3], [550, 514, 17, 11, 17, 3], [550, 565, 12, 10, 12, 3], [550, 616, 11, 10, 11, 3], [550, 667, 17, 11, 17, 3], [550, 720, 15, 9, 15, 5], [550, 771, 12, 9, 12, 5], [611, 4, 12, 11, 12, 3], [611, 55, 9, 11, 9, 3], [611, 106, 17, 11, 17, 3], [611, 157, 17, 11, 17, 3], [611, 208, 17, 11, 17, 3], [611, 259, 17, 11, 17, 3], [611, 310, 17, 11, 17, 3], [611, 365, 12, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 467, 14, 7, 14, 7], [611, 518, 13, 6, 13, 7], [611, 562, 15, 14, 15, 0], [611, 614, 15, 13, 15, 1], [611, 664, 13, 14, 13, 0], [611, 718, 17, 11, 17, 3], [611, 771, 16, 9, 16, 5], [672, 8, 10, 6, 10, 7], [672, 59, 14, 6, 14, 7], [672, 106, 10, 10, 10, 3], [672, 157, 10, 10, 10, 3], [672, 208, 8, 10, 8, 3], [672, 259, 8, 10, 8, 3], [672, 310, 17, 11, 17, 3], [672, 362, 14, 10, 14, 4], [672, 412, 13, 14, 13, 3], [1, 8, 9, 6, 9, 7], [794, 769, 17, 11, 17, 3], [672, 565, 17, 11, 17, 3], [672, 616, 17, 11, 17, 3], [672, 667, 17, 11, 17, 3], [672, 718, 17, 11, 17, 3], [672, 769, 17, 11, 17, 3], [733, 4, 17, 11, 17, 3], [733, 55, 17, 11, 17, 3], [733, 106, 17, 11, 17, 3], [733, 157, 17, 11, 17, 3], [733, 208, 17, 11, 17, 3], [733, 259, 17, 11, 17, 3], [733, 310, 17, 11, 17, 3], [733, 361, 17, 11, 17, 3], [733, 412, 17, 11, 17, 3], [733, 463, 17, 11, 17, 3], [733, 514, 17, 11, 17, 3], [733, 565, 17, 11, 17, 3], [733, 616, 17, 11, 17, 3], [733, 667, 17, 11, 17, 3], [733, 718, 17, 11, 17, 3], [733, 769, 17, 11, 17, 3], [1, 8, 9, 6, 9, 7], [794, 55, 17, 11, 17, 3], [794, 106, 17, 11, 17, 3], [794, 157, 17, 11, 17, 3], [794, 208, 17, 11, 17, 3], [794, 259, 17, 11, 17, 3], [794, 310, 17, 11, 17, 3], [794, 361, 17, 11, 17, 3], [794, 412, 17, 11, 17, 3], [794, 463, 17, 11, 17, 3], [794, 514, 17, 11, 17, 3], [794, 565, 17, 11, 17, 3], [794, 616, 17, 11, 17, 3], [794, 667, 17, 11, 17, 3], [794, 718, 17, 11, 17, 3], [794, 769, 17, 11, 17, 3], [855, 4, 17, 11, 17, 3], [855, 55, 17, 11, 17, 3], [855, 106, 17, 11, 17, 3], [855, 157, 17, 11, 17, 3], [855, 208, 17, 11, 17, 3], [855, 259, 17, 11, 17, 3], [855, 310, 17, 11, 17, 3], [855, 361, 17, 11, 17, 3], [855, 412, 17, 11, 17, 3], [855, 463, 17, 11, 17, 3], [855, 514, 17, 11, 17, 3], [855, 565, 17, 11, 17, 3], [855, 616, 17, 11, 17, 3], [855, 667, 17, 11, 17, 3], [855, 718, 17, 11, 17, 3], [855, 769, 17, 11, 17, 3]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 8, 6, 8, 6], [1, 55, 8, 9, 8, 3], [1, 106, 9, 9, 9, 3], [1, 157, 12, 9, 12, 3], [1, 207, 11, 11, 11, 2], [1, 259, 13, 9, 13, 3], [1, 310, 14, 9, 14, 3], [1, 361, 7, 9, 7, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 513, 10, 10, 10, 2], [1, 568, 10, 6, 10, 6], [1, 619, 7, 8, 7, 6], [1, 670, 10, 6, 10, 6], [1, 721, 7, 6, 7, 6], [1, 769, 11, 10, 11, 3], [62, 4, 12, 9, 12, 3], [62, 55, 12, 9, 12, 3], [62, 106, 12, 9, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 9, 12, 3], [62, 259, 12, 11, 12, 3], [62, 309, 12, 10, 12, 2], [62, 361, 12, 9, 12, 3], [62, 412, 12, 10, 12, 3], [62, 463, 12, 10, 12, 3], [62, 517, 7, 6, 7, 6], [62, 568, 7, 8, 7, 6], [62, 619, 9, 6, 9, 6], [62, 670, 11, 6, 11, 6], [62, 721, 9, 6, 9, 6], [62, 769, 11, 9, 11, 3], [123, 6, 14, 8, 14, 5], [123, 55, 14, 9, 14, 3], [123, 106, 12, 9, 12, 3], [123, 157, 11, 9, 11, 3], [123, 208, 12, 9, 12, 3], [123, 259, 11, 9, 11, 3], [123, 310, 11, 9, 11, 3], [123, 361, 12, 9, 12, 3], [123, 412, 13, 9, 13, 3], [123, 463, 10, 9, 10, 3], [123, 514, 9, 12, 9, 3], [123, 565, 12, 9, 12, 3], [123, 616, 12, 9, 12, 3], [123, 667, 16, 9, 16, 3], [123, 718, 13, 9, 13, 3], [123, 769, 12, 9, 12, 3], [184, 4, 12, 9, 12, 3], [184, 55, 12, 11, 12, 3], [184, 106, 12, 9, 12, 3], [184, 157, 11, 9, 11, 3], [184, 208, 12, 9, 12, 3], [184, 259, 13, 9, 13, 3], [184, 310, 14, 9, 14, 3], [184, 361, 17, 9, 17, 3], [184, 412, 12, 9, 12, 3], [184, 463, 12, 9, 12, 3], [184, 514, 10, 9, 10, 3], [184, 564, 8, 11, 8, 2], [184, 616, 11, 10, 11, 3], [184, 666, 8, 11, 8, 2], [184, 718, 8, 9, 8, 3], [184, 772, 11, 6, 11, 6], [245, 4, 8, 9, 8, 3], [245, 57, 11, 7, 11, 5], [245, 106, 12, 9, 12, 3], [245, 159, 10, 7, 10, 5], [245, 208, 12, 9, 12, 3], [245, 261, 11, 7, 11, 5], [245, 310, 9, 9, 9, 3], [245, 363, 11, 10, 11, 5], [245, 412, 12, 9, 12, 3], [245, 463, 8, 9, 8, 3], [245, 514, 8, 12, 8, 3], [245, 565, 12, 9, 12, 3], [245, 616, 8, 9, 8, 3], [245, 669, 16, 7, 16, 5], [245, 720, 12, 7, 12, 5], [245, 771, 11, 7, 11, 5], [306, 6, 12, 10, 12, 5], [306, 57, 12, 10, 12, 5], [306, 108, 10, 7, 10, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 12, 7, 12, 5], [306, 312, 12, 7, 12, 5], [306, 363, 15, 7, 15, 5], [306, 414, 11, 7, 11, 5], [306, 465, 12, 10, 12, 5], [306, 516, 10, 7, 10, 5], [306, 563, 9, 13, 9, 1], [306, 614, 7, 13, 7, 1], [306, 665, 9, 13, 9, 1], [306, 718, 10, 9, 10, 3], [306, 772, 3, 6, 3, 6], [367, 2, 14, 11, 14, 1], [367, 52, 14, 12, 14, 0], [367, 106, 11, 12, 11, 3], [367, 155, 11, 11, 11, 1], [367, 205, 13, 12, 13, 0], [367, 257, 12, 11, 12, 1], [367, 308, 13, 11, 13, 1], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 461, 11, 11, 11, 1], [367, 514, 11, 9, 11, 3], [367, 564, 11, 10, 11, 2], [367, 614, 11, 11, 11, 1], [367, 669, 10, 9, 10, 5], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 2, 11, 11, 11, 1], [428, 55, 11, 9, 11, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 206, 8, 11, 8, 1], [428, 259, 8, 9, 8, 3], [428, 309, 12, 10, 12, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 461, 11, 11, 11, 1], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 12, 10, 12, 2], [428, 666, 12, 10, 12, 2], [428, 716, 12, 11, 12, 1], [428, 769, 12, 9, 12, 3], [489, 3, 8, 10, 8, 2], [489, 55, 9, 9, 9, 3], [489, 107, 11, 9, 11, 4], [489, 157, 12, 9, 12, 3], [489, 208, 11, 9, 11, 3], [489, 261, 12, 7, 12, 5], [489, 310, 13, 9, 13, 3], [489, 361, 11, 9, 11, 3], [489, 413, 13, 8, 13, 4], [489, 464, 13, 8, 13, 4], [489, 514, 13, 9, 13, 3], [489, 565, 8, 9, 8, 3], [489, 616, 8, 9, 8, 3], [489, 667, 16, 9, 16, 3], [489, 718, 16, 9, 16, 3], [489, 769, 12, 9, 12, 3], [550, 4, 16, 9, 16, 3], [550, 55, 16, 9, 16, 3], [550, 106, 16, 9, 16, 3], [550, 157, 16, 9, 16, 3], [550, 208, 12, 9, 12, 3], [550, 259, 16, 9, 16, 3], [550, 310, 16, 9, 16, 3], [550, 361, 16, 9, 16, 3], [550, 412, 16, 9, 16, 3], [550, 463, 16, 9, 16, 3], [550, 514, 16, 9, 16, 3], [550, 565, 11, 9, 11, 3], [550, 616, 10, 9, 10, 3], [550, 667, 16, 9, 16, 3], [550, 720, 14, 7, 14, 5], [550, 771, 11, 7, 11, 5], [611, 4, 11, 9, 11, 3], [611, 55, 8, 9, 8, 3], [611, 106, 16, 9, 16, 3], [611, 157, 16, 9, 16, 3], [611, 208, 16, 9, 16, 3], [611, 259, 16, 9, 16, 3], [611, 310, 16, 9, 16, 3], [611, 364, 11, 6, 11, 6], [611, 415, 11, 6, 11, 6], [611, 466, 13, 6, 13, 6], [611, 517, 12, 6, 12, 6], [611, 562, 14, 12, 14, 0], [611, 614, 14, 11, 14, 1], [611, 664, 12, 12, 12, 0], [611, 718, 16, 9, 16, 3], [611, 771, 15, 7, 15, 5], [672, 7, 9, 6, 9, 6], [672, 58, 13, 6, 13, 6], [672, 106, 9, 9, 9, 3], [672, 157, 9, 9, 9, 3], [672, 208, 7, 9, 7, 3], [672, 259, 7, 9, 7, 3], [672, 310, 16, 9, 16, 3], [672, 362, 13, 8, 13, 4], [672, 412, 12, 12, 12, 3], [1, 7, 8, 6, 8, 6], [794, 769, 16, 9, 16, 3], [672, 565, 16, 9, 16, 3], [672, 616, 16, 9, 16, 3], [672, 667, 16, 9, 16, 3], [672, 718, 16, 9, 16, 3], [672, 769, 16, 9, 16, 3], [733, 4, 16, 9, 16, 3], [733, 55, 16, 9, 16, 3], [733, 106, 16, 9, 16, 3], [733, 157, 16, 9, 16, 3], [733, 208, 16, 9, 16, 3], [733, 259, 16, 9, 16, 3], [733, 310, 16, 9, 16, 3], [733, 361, 16, 9, 16, 3], [733, 412, 16, 9, 16, 3], [733, 463, 16, 9, 16, 3], [733, 514, 16, 9, 16, 3], [733, 565, 16, 9, 16, 3], [733, 616, 16, 9, 16, 3], [733, 667, 16, 9, 16, 3], [733, 718, 16, 9, 16, 3], [733, 769, 16, 9, 16, 3], [1, 7, 8, 6, 8, 6], [794, 55, 16, 9, 16, 3], [794, 106, 16, 9, 16, 3], [794, 157, 16, 9, 16, 3], [794, 208, 16, 9, 16, 3], [794, 259, 16, 9, 16, 3], [794, 310, 16, 9, 16, 3], [794, 361, 16, 9, 16, 3], [794, 412, 16, 9, 16, 3], [794, 463, 16, 9, 16, 3], [794, 514, 16, 9, 16, 3], [794, 565, 16, 9, 16, 3], [794, 616, 16, 9, 16, 3], [794, 667, 16, 9, 16, 3], [794, 718, 16, 9, 16, 3], [794, 769, 16, 9, 16, 3], [855, 4, 16, 9, 16, 3], [855, 55, 16, 9, 16, 3], [855, 106, 16, 9, 16, 3], [855, 157, 16, 9, 16, 3], [855, 208, 16, 9, 16, 3], [855, 259, 16, 9, 16, 3], [855, 310, 16, 9, 16, 3], [855, 361, 16, 9, 16, 3], [855, 412, 16, 9, 16, 3], [855, 463, 16, 9, 16, 3], [855, 514, 16, 9, 16, 3], [855, 565, 16, 9, 16, 3], [855, 616, 16, 9, 16, 3], [855, 667, 16, 9, 16, 3], [855, 718, 16, 9, 16, 3], [855, 769, 16, 9, 16, 3]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 12, 11, 8, 3], [1, 106, 13, 4, 9, 3], [1, 157, 16, 7, 12, 3], [1, 207, 15, 13, 11, 2], [1, 259, 17, 11, 13, 3], [1, 310, 16, 11, 14, 3], [1, 361, 11, 4, 7, 3], [1, 411, 14, 13, 9, 2], [1, 462, 12, 13, 9, 2], [1, 513, 14, 8, 10, 2], [1, 568, 12, 7, 10, 6], [1, 624, 7, 5, 7, 11], [1, 672, 12, 3, 10, 8], [1, 726, 7, 3, 7, 11], [1, 769, 15, 12, 11, 3], [62, 4, 15, 11, 12, 3], [62, 55, 14, 11, 12, 3], [62, 106, 15, 11, 12, 3], [62, 157, 15, 13, 12, 3], [62, 208, 15, 11, 12, 3], [62, 259, 15, 13, 12, 3], [62, 309, 15, 12, 12, 2], [62, 361, 16, 11, 12, 3], [62, 412, 15, 12, 12, 3], [62, 463, 15, 12, 12, 3], [62, 517, 10, 8, 7, 6], [62, 568, 10, 10, 7, 6], [62, 619, 12, 7, 9, 6], [62, 671, 13, 5, 11, 7], [62, 721, 11, 7, 9, 6], [62, 769, 15, 11, 11, 3], [123, 6, 16, 10, 14, 5], [123, 55, 14, 11, 14, 3], [123, 106, 15, 11, 12, 3], [123, 157, 15, 11, 11, 3], [123, 208, 15, 11, 12, 3], [123, 259, 15, 11, 11, 3], [123, 310, 15, 11, 11, 3], [123, 361, 15, 11, 12, 3], [123, 412, 17, 11, 13, 3], [123, 463, 13, 11, 10, 3], [123, 514, 13, 14, 9, 3], [123, 565, 16, 11, 12, 3], [123, 616, 13, 11, 12, 3], [123, 667, 20, 11, 16, 3], [123, 718, 17, 11, 13, 3], [123, 769, 15, 11, 12, 3], [184, 4, 15, 11, 12, 3], [184, 55, 15, 13, 12, 3], [184, 106, 15, 11, 12, 3], [184, 157, 15, 11, 11, 3], [184, 208, 16, 11, 12, 3], [184, 259, 17, 11, 13, 3], [184, 310, 18, 11, 14, 3], [184, 361, 21, 11, 17, 3], [184, 412, 16, 11, 12, 3], [184, 463, 16, 11, 12, 3], [184, 514, 14, 11, 10, 3], [184, 564, 13, 13, 8, 2], [184, 616, 11, 12, 11, 3], [184, 666, 13, 13, 8, 2], [184, 718, 12, 4, 8, 3], [184, 777, 12, 3, 11, 11], [245, 4, 11, 5, 8, 3], [245, 57, 13, 9, 11, 5], [245, 106, 14, 11, 12, 3], [245, 159, 13, 9, 10, 5], [245, 208, 15, 11, 12, 3], [245, 261, 13, 9, 11, 5], [245, 310, 13, 11, 9, 3], [245, 363, 14, 12, 11, 5], [245, 412, 14, 11, 12, 3], [245, 463, 11, 11, 8, 3], [245, 514, 11, 14, 8, 3], [245, 565, 14, 11, 12, 3], [245, 616, 11, 11, 8, 3], [245, 669, 18, 9, 16, 5], [245, 720, 14, 9, 12, 5], [245, 771, 13, 9, 11, 5], [306, 6, 14, 12, 12, 5], [306, 57, 14, 12, 12, 5], [306, 108, 13, 9, 10, 5], [306, 159, 13, 9, 10, 5], [306, 208, 12, 11, 9, 3], [306, 261, 14, 9, 12, 5], [306, 312, 15, 9, 12, 5], [306, 363, 19, 9, 15, 5], [306, 414, 15, 9, 11, 5], [306, 465, 15, 12, 12, 5], [306, 516, 13, 9, 10, 5], [306, 563, 14, 15, 9, 1], [306, 614, 12, 15, 7, 1], [306, 665, 13, 15, 9, 1], [306, 718, 14, 4, 10, 3], [306, 766, 1, 1, 3, 1], [367, 2, 16, 13, 14, 1], [367, 52, 16, 14, 14, 0], [367, 106, 15, 14, 11, 3], [367, 155, 15, 13, 11, 1], [367, 205, 18, 14, 13, 0], [367, 257, 15, 13, 12, 1], [367, 308, 17, 13, 13, 1], [367, 360, 14, 12, 11, 2], [367, 411, 13, 12, 11, 2], [367, 461, 14, 13, 11, 1], [367, 514, 13, 11, 11, 3], [367, 564, 16, 12, 11, 2], [367, 614, 15, 13, 11, 1], [367, 669, 13, 11, 10, 5], [367, 717, 15, 12, 11, 2], [367, 768, 13, 12, 11, 2], [428, 2, 15, 13, 11, 1], [428, 55, 14, 11, 11, 3], [428, 105, 13, 12, 8, 2], [428, 156, 11, 12, 8, 2], [428, 206, 13, 13, 8, 1], [428, 259, 12, 11, 8, 3], [428, 309, 16, 12, 12, 2], [428, 360, 15, 12, 11, 2], [428, 411, 13, 12, 11, 2], [428, 461, 15, 13, 11, 1], [428, 514, 14, 11, 11, 3], [428, 564, 16, 12, 11, 2], [428, 615, 14, 12, 12, 2], [428, 666, 14, 12, 12, 2], [428, 716, 15, 13, 12, 1], [428, 769, 14, 11, 12, 3], [489, 3, 12, 7, 8, 2], [489, 55, 13, 6, 9, 3], [489, 107, 14, 11, 11, 4], [489, 157, 15, 11, 12, 3], [489, 208, 15, 11, 11, 3], [489, 261, 14, 7, 12, 5], [489, 310, 17, 11, 13, 3], [489, 361, 15, 11, 11, 3], [489, 413, 16, 10, 13, 4], [489, 464, 16, 10, 13, 4], [489, 514, 17, 6, 13, 3], [489, 565, 12, 5, 8, 3], [489, 616, 12, 3, 8, 3], [489, 667, 19, 11, 16, 3], [489, 718, 20, 11, 16, 3], [489, 769, 16, 11, 12, 3], [550, 4, 19, 11, 16, 3], [550, 55, 19, 11, 16, 3], [550, 106, 19, 11, 16, 3], [550, 157, 19, 11, 16, 3], [550, 208, 16, 11, 12, 3], [550, 259, 19, 11, 16, 3], [550, 310, 19, 11, 16, 3], [550, 361, 19, 11, 16, 3], [550, 412, 19, 11, 16, 3], [550, 463, 19, 11, 16, 3], [550, 514, 19, 11, 16, 3], [550, 565, 14, 10, 11, 3], [550, 616, 14, 10, 10, 3], [550, 667, 19, 11, 16, 3], [550, 720, 16, 9, 14, 5], [550, 771, 14, 9, 11, 5], [611, 4, 13, 11, 11, 3], [611, 55, 11, 11, 8, 3], [611, 106, 19, 11, 16, 3], [611, 157, 19, 11, 16, 3], [611, 208, 19, 11, 16, 3], [611, 259, 19, 11, 16, 3], [611, 310, 19, 11, 16, 3], [611, 365, 13, 7, 11, 7], [611, 416, 12, 7, 11, 7], [611, 471, 13, 3, 13, 11], [611, 511, 1, 1, 12, 1], [611, 562, 15, 14, 14, 0], [611, 614, 18, 13, 14, 1], [611, 664, 17, 14, 12, 0], [611, 718, 20, 11, 16, 3], [611, 771, 17, 9, 15, 5], [672, 9, 12, 3, 9, 8], [672, 60, 16, 3, 13, 8], [672, 106, 13, 5, 9, 3], [672, 157, 13, 5, 9, 3], [672, 208, 11, 5, 7, 3], [672, 259, 11, 5, 7, 3], [672, 310, 19, 11, 16, 3], [672, 362, 15, 10, 13, 4], [672, 412, 15, 14, 12, 3], [1, 1, 1, 1, 8, 1], [794, 769, 19, 11, 16, 3], [672, 565, 19, 11, 16, 3], [672, 616, 19, 11, 16, 3], [672, 667, 19, 11, 16, 3], [672, 718, 19, 11, 16, 3], [672, 769, 19, 11, 16, 3], [733, 4, 19, 11, 16, 3], [733, 55, 19, 11, 16, 3], [733, 106, 19, 11, 16, 3], [733, 157, 19, 11, 16, 3], [733, 208, 19, 11, 16, 3], [733, 259, 19, 11, 16, 3], [733, 310, 19, 11, 16, 3], [733, 361, 19, 11, 16, 3], [733, 412, 19, 11, 16, 3], [733, 463, 19, 11, 16, 3], [733, 514, 19, 11, 16, 3], [733, 565, 19, 11, 16, 3], [733, 616, 19, 11, 16, 3], [733, 667, 19, 11, 16, 3], [733, 718, 19, 11, 16, 3], [733, 769, 19, 11, 16, 3], [1, 1, 1, 1, 8, 1], [794, 55, 19, 11, 16, 3], [794, 106, 19, 11, 16, 3], [794, 157, 19, 11, 16, 3], [794, 208, 19, 11, 16, 3], [794, 259, 19, 11, 16, 3], [794, 310, 19, 11, 16, 3], [794, 361, 19, 11, 16, 3], [794, 412, 19, 11, 16, 3], [794, 463, 19, 11, 16, 3], [794, 514, 19, 11, 16, 3], [794, 565, 19, 11, 16, 3], [794, 616, 19, 11, 16, 3], [794, 667, 19, 11, 16, 3], [794, 718, 19, 11, 16, 3], [794, 769, 19, 11, 16, 3], [855, 4, 19, 11, 16, 3], [855, 55, 19, 11, 16, 3], [855, 106, 19, 11, 16, 3], [855, 157, 19, 11, 16, 3], [855, 208, 19, 11, 16, 3], [855, 259, 19, 11, 16, 3], [855, 310, 19, 11, 16, 3], [855, 361, 19, 11, 16, 3], [855, 412, 19, 11, 16, 3], [855, 463, 19, 11, 16, 3], [855, 514, 19, 11, 16, 3], [855, 565, 19, 11, 16, 3], [855, 616, 19, 11, 16, 3], [855, 667, 19, 11, 16, 3], [855, 718, 19, 11, 16, 3], [855, 769, 19, 11, 16, 3]], \"capHeight\": 13, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 11, 9, 7, 3], [1, 106, 12, 2, 8, 3], [1, 157, 15, 5, 11, 3], [1, 207, 14, 11, 10, 2], [1, 259, 16, 9, 12, 3], [1, 310, 15, 9, 13, 3], [1, 361, 10, 2, 6, 3], [1, 411, 13, 11, 8, 2], [1, 462, 11, 11, 8, 2], [1, 513, 13, 6, 9, 2], [1, 568, 11, 5, 9, 6], [1, 624, 6, 3, 6, 11], [1, 672, 11, 1, 9, 8], [1, 726, 6, 1, 6, 11], [1, 769, 14, 10, 10, 3], [62, 4, 14, 9, 11, 3], [62, 55, 13, 9, 11, 3], [62, 106, 14, 9, 11, 3], [62, 157, 14, 11, 11, 3], [62, 208, 14, 9, 11, 3], [62, 259, 14, 11, 11, 3], [62, 309, 14, 10, 11, 2], [62, 361, 15, 9, 11, 3], [62, 412, 14, 10, 11, 3], [62, 463, 14, 10, 11, 3], [62, 517, 9, 6, 6, 6], [62, 568, 9, 8, 6, 6], [62, 619, 11, 5, 8, 6], [62, 671, 12, 3, 10, 7], [62, 721, 10, 5, 8, 6], [62, 769, 14, 9, 10, 3], [123, 6, 15, 8, 13, 5], [123, 55, 13, 9, 13, 3], [123, 106, 14, 9, 11, 3], [123, 157, 14, 9, 10, 3], [123, 208, 14, 9, 11, 3], [123, 259, 14, 9, 10, 3], [123, 310, 14, 9, 10, 3], [123, 361, 14, 9, 11, 3], [123, 412, 16, 9, 12, 3], [123, 463, 12, 9, 9, 3], [123, 514, 12, 12, 8, 3], [123, 565, 15, 9, 11, 3], [123, 616, 12, 9, 11, 3], [123, 667, 19, 9, 15, 3], [123, 718, 16, 9, 12, 3], [123, 769, 14, 9, 11, 3], [184, 4, 14, 9, 11, 3], [184, 55, 14, 11, 11, 3], [184, 106, 14, 9, 11, 3], [184, 157, 14, 9, 10, 3], [184, 208, 15, 9, 11, 3], [184, 259, 16, 9, 12, 3], [184, 310, 17, 9, 13, 3], [184, 361, 20, 9, 16, 3], [184, 412, 15, 9, 11, 3], [184, 463, 15, 9, 11, 3], [184, 514, 13, 9, 9, 3], [184, 564, 12, 11, 7, 2], [184, 616, 10, 10, 10, 3], [184, 666, 12, 11, 7, 2], [184, 718, 11, 2, 7, 3], [184, 777, 11, 1, 10, 11], [245, 4, 10, 3, 7, 3], [245, 57, 12, 7, 10, 5], [245, 106, 13, 9, 11, 3], [245, 159, 12, 7, 9, 5], [245, 208, 14, 9, 11, 3], [245, 261, 12, 7, 10, 5], [245, 310, 12, 9, 8, 3], [245, 363, 13, 10, 10, 5], [245, 412, 13, 9, 11, 3], [245, 463, 10, 9, 7, 3], [245, 514, 10, 12, 7, 3], [245, 565, 13, 9, 11, 3], [245, 616, 10, 9, 7, 3], [245, 669, 17, 7, 15, 5], [245, 720, 13, 7, 11, 5], [245, 771, 12, 7, 10, 5], [306, 6, 13, 10, 11, 5], [306, 57, 13, 10, 11, 5], [306, 108, 12, 7, 9, 5], [306, 159, 12, 7, 9, 5], [306, 208, 11, 9, 8, 3], [306, 261, 13, 7, 11, 5], [306, 312, 14, 7, 11, 5], [306, 363, 18, 7, 14, 5], [306, 414, 14, 7, 10, 5], [306, 465, 14, 10, 11, 5], [306, 516, 12, 7, 9, 5], [306, 563, 13, 13, 8, 1], [306, 614, 11, 13, 6, 1], [306, 665, 12, 13, 8, 1], [306, 718, 13, 2, 9, 3], [306, 766, 1, 1, 3, 1], [367, 2, 15, 11, 13, 1], [367, 52, 15, 12, 13, 0], [367, 106, 14, 12, 10, 3], [367, 155, 14, 11, 10, 1], [367, 205, 16, 12, 12, 0], [367, 257, 14, 11, 11, 1], [367, 308, 16, 11, 12, 1], [367, 360, 13, 10, 10, 2], [367, 411, 12, 10, 10, 2], [367, 461, 13, 11, 10, 1], [367, 514, 12, 9, 10, 3], [367, 564, 15, 10, 10, 2], [367, 614, 14, 11, 10, 1], [367, 669, 12, 9, 9, 5], [367, 717, 14, 10, 10, 2], [367, 768, 12, 10, 10, 2], [428, 2, 14, 11, 10, 1], [428, 55, 13, 9, 10, 3], [428, 105, 12, 10, 7, 2], [428, 156, 10, 10, 7, 2], [428, 206, 12, 11, 7, 1], [428, 259, 11, 9, 7, 3], [428, 309, 15, 10, 11, 2], [428, 360, 14, 10, 10, 2], [428, 411, 12, 10, 10, 2], [428, 461, 14, 11, 10, 1], [428, 514, 13, 9, 10, 3], [428, 564, 15, 10, 10, 2], [428, 615, 13, 10, 11, 2], [428, 666, 13, 10, 11, 2], [428, 716, 14, 11, 11, 1], [428, 769, 13, 9, 11, 3], [489, 3, 11, 5, 7, 2], [489, 55, 12, 4, 8, 3], [489, 107, 13, 9, 10, 4], [489, 157, 14, 9, 11, 3], [489, 208, 14, 9, 10, 3], [489, 261, 13, 5, 11, 5], [489, 310, 16, 9, 12, 3], [489, 361, 14, 9, 10, 3], [489, 413, 15, 8, 12, 4], [489, 464, 15, 8, 12, 4], [489, 514, 16, 4, 12, 3], [489, 565, 11, 3, 7, 3], [489, 616, 11, 1, 7, 3], [489, 667, 18, 9, 15, 3], [489, 718, 19, 9, 15, 3], [489, 769, 15, 9, 11, 3], [550, 4, 18, 9, 15, 3], [550, 55, 18, 9, 15, 3], [550, 106, 18, 9, 15, 3], [550, 157, 18, 9, 15, 3], [550, 208, 15, 9, 11, 3], [550, 259, 18, 9, 15, 3], [550, 310, 18, 9, 15, 3], [550, 361, 18, 9, 15, 3], [550, 412, 18, 9, 15, 3], [550, 463, 18, 9, 15, 3], [550, 514, 18, 9, 15, 3], [550, 565, 13, 8, 10, 3], [550, 616, 13, 8, 9, 3], [550, 667, 18, 9, 15, 3], [550, 720, 15, 7, 13, 5], [550, 771, 13, 7, 10, 5], [611, 4, 12, 9, 10, 3], [611, 55, 10, 9, 7, 3], [611, 106, 18, 9, 15, 3], [611, 157, 18, 9, 15, 3], [611, 208, 18, 9, 15, 3], [611, 259, 18, 9, 15, 3], [611, 310, 18, 9, 15, 3], [611, 365, 12, 5, 10, 7], [611, 416, 11, 5, 10, 7], [611, 471, 12, 1, 12, 11], [611, 511, 1, 1, 11, 1], [611, 562, 14, 12, 13, 0], [611, 614, 17, 11, 13, 1], [611, 664, 14, 12, 11, 0], [611, 718, 19, 9, 15, 3], [611, 771, 16, 7, 14, 5], [672, 9, 11, 1, 8, 8], [672, 60, 15, 1, 12, 8], [672, 106, 12, 3, 8, 3], [672, 157, 12, 3, 8, 3], [672, 208, 10, 3, 6, 3], [672, 259, 10, 3, 6, 3], [672, 310, 18, 9, 15, 3], [672, 362, 14, 8, 12, 4], [672, 412, 14, 12, 11, 3], [1, 1, 1, 1, 7, 1], [794, 769, 18, 9, 15, 3], [672, 565, 18, 9, 15, 3], [672, 616, 18, 9, 15, 3], [672, 667, 18, 9, 15, 3], [672, 718, 18, 9, 15, 3], [672, 769, 18, 9, 15, 3], [733, 4, 18, 9, 15, 3], [733, 55, 18, 9, 15, 3], [733, 106, 18, 9, 15, 3], [733, 157, 18, 9, 15, 3], [733, 208, 18, 9, 15, 3], [733, 259, 18, 9, 15, 3], [733, 310, 18, 9, 15, 3], [733, 361, 18, 9, 15, 3], [733, 412, 18, 9, 15, 3], [733, 463, 18, 9, 15, 3], [733, 514, 18, 9, 15, 3], [733, 565, 18, 9, 15, 3], [733, 616, 18, 9, 15, 3], [733, 667, 18, 9, 15, 3], [733, 718, 18, 9, 15, 3], [733, 769, 18, 9, 15, 3], [1, 1, 1, 1, 7, 1], [794, 55, 18, 9, 15, 3], [794, 106, 18, 9, 15, 3], [794, 157, 18, 9, 15, 3], [794, 208, 18, 9, 15, 3], [794, 259, 18, 9, 15, 3], [794, 310, 18, 9, 15, 3], [794, 361, 18, 9, 15, 3], [794, 412, 18, 9, 15, 3], [794, 463, 18, 9, 15, 3], [794, 514, 18, 9, 15, 3], [794, 565, 18, 9, 15, 3], [794, 616, 18, 9, 15, 3], [794, 667, 18, 9, 15, 3], [794, 718, 18, 9, 15, 3], [794, 769, 18, 9, 15, 3], [855, 4, 18, 9, 15, 3], [855, 55, 18, 9, 15, 3], [855, 106, 18, 9, 15, 3], [855, 157, 18, 9, 15, 3], [855, 208, 18, 9, 15, 3], [855, 259, 18, 9, 15, 3], [855, 310, 18, 9, 15, 3], [855, 361, 18, 9, 15, 3], [855, 412, 18, 9, 15, 3], [855, 463, 18, 9, 15, 3], [855, 514, 18, 9, 15, 3], [855, 565, 18, 9, 15, 3], [855, 616, 18, 9, 15, 3], [855, 667, 18, 9, 15, 3], [855, 718, 18, 9, 15, 3], [855, 769, 18, 9, 15, 3]], \"capHeight\": 12, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 55, 8, 11, 8, 3], [1, 106, 9, 10, 9, 3], [1, 157, 12, 10, 12, 3], [1, 207, 11, 13, 11, 2], [1, 259, 13, 11, 13, 3], [1, 310, 14, 11, 14, 3], [1, 361, 7, 10, 7, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 513, 10, 11, 10, 2], [1, 568, 10, 7, 10, 6], [1, 620, 7, 9, 7, 7], [1, 671, 10, 6, 10, 7], [1, 722, 7, 7, 7, 7], [1, 769, 11, 12, 11, 3], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 13, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 13, 12, 3], [62, 309, 12, 12, 12, 2], [62, 361, 12, 11, 12, 3], [62, 412, 12, 12, 12, 3], [62, 463, 12, 12, 12, 3], [62, 517, 7, 8, 7, 6], [62, 568, 7, 10, 7, 6], [62, 619, 9, 7, 9, 6], [62, 671, 11, 6, 11, 7], [62, 721, 9, 7, 9, 6], [62, 769, 11, 11, 11, 3], [123, 6, 14, 10, 14, 5], [123, 55, 14, 11, 14, 3], [123, 106, 12, 11, 12, 3], [123, 157, 11, 11, 11, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 12, 11, 12, 3], [123, 412, 13, 11, 13, 3], [123, 463, 10, 11, 10, 3], [123, 514, 9, 14, 9, 3], [123, 565, 12, 11, 12, 3], [123, 616, 12, 11, 12, 3], [123, 667, 16, 11, 16, 3], [123, 718, 13, 11, 13, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 13, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 11, 11, 11, 3], [184, 208, 12, 11, 12, 3], [184, 259, 13, 11, 13, 3], [184, 310, 14, 11, 14, 3], [184, 361, 17, 11, 17, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 10, 11, 10, 3], [184, 564, 8, 13, 8, 2], [184, 616, 11, 12, 11, 3], [184, 666, 8, 13, 8, 2], [184, 718, 8, 10, 8, 3], [184, 773, 11, 7, 11, 7], [245, 4, 8, 10, 8, 3], [245, 57, 11, 9, 11, 5], [245, 106, 12, 11, 12, 3], [245, 159, 10, 9, 10, 5], [245, 208, 12, 11, 12, 3], [245, 261, 11, 9, 11, 5], [245, 310, 9, 11, 9, 3], [245, 363, 11, 12, 11, 5], [245, 412, 12, 11, 12, 3], [245, 463, 8, 11, 8, 3], [245, 514, 8, 14, 8, 3], [245, 565, 12, 11, 12, 3], [245, 616, 8, 11, 8, 3], [245, 669, 16, 9, 16, 5], [245, 720, 12, 9, 12, 5], [245, 771, 11, 9, 11, 5], [306, 6, 12, 12, 12, 5], [306, 57, 12, 12, 12, 5], [306, 108, 10, 9, 10, 5], [306, 159, 10, 9, 10, 5], [306, 208, 9, 11, 9, 3], [306, 261, 12, 9, 12, 5], [306, 312, 12, 9, 12, 5], [306, 363, 15, 9, 15, 5], [306, 414, 11, 9, 11, 5], [306, 465, 12, 12, 12, 5], [306, 516, 10, 9, 10, 5], [306, 563, 9, 15, 9, 1], [306, 614, 7, 15, 7, 1], [306, 665, 9, 15, 9, 1], [306, 718, 10, 10, 10, 3], [306, 773, 3, 6, 3, 7], [367, 2, 14, 13, 14, 1], [367, 52, 14, 14, 14, 0], [367, 106, 11, 14, 11, 3], [367, 155, 11, 13, 11, 1], [367, 205, 13, 14, 13, 0], [367, 257, 12, 13, 12, 1], [367, 308, 13, 13, 13, 1], [367, 360, 11, 12, 11, 2], [367, 411, 11, 12, 11, 2], [367, 461, 11, 13, 11, 1], [367, 514, 11, 11, 11, 3], [367, 564, 11, 12, 11, 2], [367, 614, 11, 13, 11, 1], [367, 669, 10, 11, 10, 5], [367, 717, 11, 12, 11, 2], [367, 768, 11, 12, 11, 2], [428, 2, 11, 13, 11, 1], [428, 55, 11, 11, 11, 3], [428, 105, 8, 12, 8, 2], [428, 156, 8, 12, 8, 2], [428, 206, 8, 13, 8, 1], [428, 259, 8, 11, 8, 3], [428, 309, 12, 12, 12, 2], [428, 360, 11, 12, 11, 2], [428, 411, 11, 12, 11, 2], [428, 461, 11, 13, 11, 1], [428, 514, 11, 11, 11, 3], [428, 564, 11, 12, 11, 2], [428, 615, 12, 12, 12, 2], [428, 666, 12, 12, 12, 2], [428, 716, 12, 13, 12, 1], [428, 769, 12, 11, 12, 3], [489, 3, 8, 11, 8, 2], [489, 55, 9, 10, 9, 3], [489, 107, 11, 11, 11, 4], [489, 157, 12, 11, 12, 3], [489, 208, 11, 11, 11, 3], [489, 261, 12, 8, 12, 5], [489, 310, 13, 11, 13, 3], [489, 361, 11, 11, 11, 3], [489, 413, 13, 10, 13, 4], [489, 464, 13, 10, 13, 4], [489, 514, 13, 10, 13, 3], [489, 565, 8, 10, 8, 3], [489, 616, 8, 10, 8, 3], [489, 667, 16, 11, 16, 3], [489, 718, 16, 11, 16, 3], [489, 769, 12, 11, 12, 3], [550, 4, 16, 11, 16, 3], [550, 55, 16, 11, 16, 3], [550, 106, 16, 11, 16, 3], [550, 157, 16, 11, 16, 3], [550, 208, 12, 11, 12, 3], [550, 259, 16, 11, 16, 3], [550, 310, 16, 11, 16, 3], [550, 361, 16, 11, 16, 3], [550, 412, 16, 11, 16, 3], [550, 463, 16, 11, 16, 3], [550, 514, 16, 11, 16, 3], [550, 565, 11, 10, 11, 3], [550, 616, 10, 10, 10, 3], [550, 667, 16, 11, 16, 3], [550, 720, 14, 9, 14, 5], [550, 771, 11, 9, 11, 5], [611, 4, 11, 11, 11, 3], [611, 55, 8, 11, 8, 3], [611, 106, 16, 11, 16, 3], [611, 157, 16, 11, 16, 3], [611, 208, 16, 11, 16, 3], [611, 259, 16, 11, 16, 3], [611, 310, 16, 11, 16, 3], [611, 365, 11, 7, 11, 7], [611, 416, 11, 7, 11, 7], [611, 467, 13, 7, 13, 7], [611, 518, 12, 6, 12, 7], [611, 562, 14, 14, 14, 0], [611, 614, 14, 13, 14, 1], [611, 664, 12, 14, 12, 0], [611, 718, 16, 11, 16, 3], [611, 771, 15, 9, 15, 5], [672, 8, 9, 6, 9, 7], [672, 59, 13, 6, 13, 7], [672, 106, 9, 10, 9, 3], [672, 157, 9, 10, 9, 3], [672, 208, 7, 10, 7, 3], [672, 259, 7, 10, 7, 3], [672, 310, 16, 11, 16, 3], [672, 362, 13, 10, 13, 4], [672, 412, 12, 14, 12, 3], [1, 8, 8, 6, 8, 7], [794, 769, 16, 11, 16, 3], [672, 565, 16, 11, 16, 3], [672, 616, 16, 11, 16, 3], [672, 667, 16, 11, 16, 3], [672, 718, 16, 11, 16, 3], [672, 769, 16, 11, 16, 3], [733, 4, 16, 11, 16, 3], [733, 55, 16, 11, 16, 3], [733, 106, 16, 11, 16, 3], [733, 157, 16, 11, 16, 3], [733, 208, 16, 11, 16, 3], [733, 259, 16, 11, 16, 3], [733, 310, 16, 11, 16, 3], [733, 361, 16, 11, 16, 3], [733, 412, 16, 11, 16, 3], [733, 463, 16, 11, 16, 3], [733, 514, 16, 11, 16, 3], [733, 565, 16, 11, 16, 3], [733, 616, 16, 11, 16, 3], [733, 667, 16, 11, 16, 3], [733, 718, 16, 11, 16, 3], [733, 769, 16, 11, 16, 3], [1, 8, 8, 6, 8, 7], [794, 55, 16, 11, 16, 3], [794, 106, 16, 11, 16, 3], [794, 157, 16, 11, 16, 3], [794, 208, 16, 11, 16, 3], [794, 259, 16, 11, 16, 3], [794, 310, 16, 11, 16, 3], [794, 361, 16, 11, 16, 3], [794, 412, 16, 11, 16, 3], [794, 463, 16, 11, 16, 3], [794, 514, 16, 11, 16, 3], [794, 565, 16, 11, 16, 3], [794, 616, 16, 11, 16, 3], [794, 667, 16, 11, 16, 3], [794, 718, 16, 11, 16, 3], [794, 769, 16, 11, 16, 3], [855, 4, 16, 11, 16, 3], [855, 55, 16, 11, 16, 3], [855, 106, 16, 11, 16, 3], [855, 157, 16, 11, 16, 3], [855, 208, 16, 11, 16, 3], [855, 259, 16, 11, 16, 3], [855, 310, 16, 11, 16, 3], [855, 361, 16, 11, 16, 3], [855, 412, 16, 11, 16, 3], [855, 463, 16, 11, 16, 3], [855, 514, 16, 11, 16, 3], [855, 565, 16, 11, 16, 3], [855, 616, 16, 11, 16, 3], [855, 667, 16, 11, 16, 3], [855, 718, 16, 11, 16, 3], [855, 769, 16, 11, 16, 3]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 55, 7, 9, 7, 3], [1, 106, 8, 9, 8, 3], [1, 157, 11, 9, 11, 3], [1, 207, 10, 11, 10, 2], [1, 259, 12, 9, 12, 3], [1, 310, 13, 9, 13, 3], [1, 361, 6, 9, 6, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 513, 9, 10, 9, 2], [1, 568, 9, 6, 9, 6], [1, 619, 6, 8, 6, 6], [1, 670, 9, 6, 9, 6], [1, 721, 6, 6, 6, 6], [1, 769, 10, 10, 10, 3], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 11, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 11, 11, 3], [62, 309, 11, 10, 11, 2], [62, 361, 11, 9, 11, 3], [62, 412, 11, 10, 11, 3], [62, 463, 11, 10, 11, 3], [62, 517, 6, 6, 6, 6], [62, 568, 6, 8, 6, 6], [62, 619, 8, 6, 8, 6], [62, 670, 10, 6, 10, 6], [62, 721, 8, 6, 8, 6], [62, 769, 10, 9, 10, 3], [123, 6, 13, 8, 13, 5], [123, 55, 13, 9, 13, 3], [123, 106, 11, 9, 11, 3], [123, 157, 10, 9, 10, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 11, 9, 11, 3], [123, 412, 12, 9, 12, 3], [123, 463, 9, 9, 9, 3], [123, 514, 8, 12, 8, 3], [123, 565, 11, 9, 11, 3], [123, 616, 11, 9, 11, 3], [123, 667, 15, 9, 15, 3], [123, 718, 12, 9, 12, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 11, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 10, 9, 10, 3], [184, 208, 11, 9, 11, 3], [184, 259, 12, 9, 12, 3], [184, 310, 13, 9, 13, 3], [184, 361, 16, 9, 16, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 9, 9, 9, 3], [184, 564, 7, 11, 7, 2], [184, 616, 10, 10, 10, 3], [184, 666, 7, 11, 7, 2], [184, 718, 7, 9, 7, 3], [184, 772, 10, 6, 10, 6], [245, 4, 7, 9, 7, 3], [245, 57, 10, 7, 10, 5], [245, 106, 11, 9, 11, 3], [245, 159, 9, 7, 9, 5], [245, 208, 11, 9, 11, 3], [245, 261, 10, 7, 10, 5], [245, 310, 8, 9, 8, 3], [245, 363, 10, 10, 10, 5], [245, 412, 11, 9, 11, 3], [245, 463, 7, 9, 7, 3], [245, 514, 7, 12, 7, 3], [245, 565, 11, 9, 11, 3], [245, 616, 7, 9, 7, 3], [245, 669, 15, 7, 15, 5], [245, 720, 11, 7, 11, 5], [245, 771, 10, 7, 10, 5], [306, 6, 11, 10, 11, 5], [306, 57, 11, 10, 11, 5], [306, 108, 9, 7, 9, 5], [306, 159, 9, 7, 9, 5], [306, 208, 8, 9, 8, 3], [306, 261, 11, 7, 11, 5], [306, 312, 11, 7, 11, 5], [306, 363, 14, 7, 14, 5], [306, 414, 10, 7, 10, 5], [306, 465, 11, 10, 11, 5], [306, 516, 9, 7, 9, 5], [306, 563, 8, 13, 8, 1], [306, 614, 6, 13, 6, 1], [306, 665, 8, 13, 8, 1], [306, 718, 9, 9, 9, 3], [306, 772, 3, 6, 3, 6], [367, 2, 13, 11, 13, 1], [367, 52, 13, 12, 13, 0], [367, 106, 10, 12, 10, 3], [367, 155, 10, 11, 10, 1], [367, 205, 12, 12, 12, 0], [367, 257, 11, 11, 11, 1], [367, 308, 12, 11, 12, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 461, 10, 11, 10, 1], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 614, 10, 11, 10, 1], [367, 669, 9, 9, 9, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 2, 10, 11, 10, 1], [428, 55, 10, 9, 10, 3], [428, 105, 7, 10, 7, 2], [428, 156, 7, 10, 7, 2], [428, 206, 7, 11, 7, 1], [428, 259, 7, 9, 7, 3], [428, 309, 11, 10, 11, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 461, 10, 11, 10, 1], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 716, 11, 11, 11, 1], [428, 769, 11, 9, 11, 3], [489, 3, 7, 10, 7, 2], [489, 55, 8, 9, 8, 3], [489, 107, 10, 9, 10, 4], [489, 157, 11, 9, 11, 3], [489, 208, 10, 9, 10, 3], [489, 261, 11, 7, 11, 5], [489, 310, 12, 9, 12, 3], [489, 361, 10, 9, 10, 3], [489, 413, 12, 8, 12, 4], [489, 464, 12, 8, 12, 4], [489, 514, 12, 9, 12, 3], [489, 565, 7, 9, 7, 3], [489, 616, 7, 9, 7, 3], [489, 667, 15, 9, 15, 3], [489, 718, 15, 9, 15, 3], [489, 769, 11, 9, 11, 3], [550, 4, 15, 9, 15, 3], [550, 55, 15, 9, 15, 3], [550, 106, 15, 9, 15, 3], [550, 157, 15, 9, 15, 3], [550, 208, 11, 9, 11, 3], [550, 259, 15, 9, 15, 3], [550, 310, 15, 9, 15, 3], [550, 361, 15, 9, 15, 3], [550, 412, 15, 9, 15, 3], [550, 463, 15, 9, 15, 3], [550, 514, 15, 9, 15, 3], [550, 565, 10, 9, 10, 3], [550, 616, 9, 9, 9, 3], [550, 667, 15, 9, 15, 3], [550, 720, 13, 7, 13, 5], [550, 771, 10, 7, 10, 5], [611, 4, 10, 9, 10, 3], [611, 55, 7, 9, 7, 3], [611, 106, 15, 9, 15, 3], [611, 157, 15, 9, 15, 3], [611, 208, 15, 9, 15, 3], [611, 259, 15, 9, 15, 3], [611, 310, 15, 9, 15, 3], [611, 364, 10, 6, 10, 6], [611, 415, 10, 6, 10, 6], [611, 466, 12, 6, 12, 6], [611, 517, 11, 6, 11, 6], [611, 562, 13, 12, 13, 0], [611, 614, 13, 11, 13, 1], [611, 664, 11, 12, 11, 0], [611, 718, 15, 9, 15, 3], [611, 771, 14, 7, 14, 5], [672, 7, 8, 6, 8, 6], [672, 58, 12, 6, 12, 6], [672, 106, 8, 9, 8, 3], [672, 157, 8, 9, 8, 3], [672, 208, 6, 9, 6, 3], [672, 259, 6, 9, 6, 3], [672, 310, 15, 9, 15, 3], [672, 362, 12, 8, 12, 4], [672, 412, 11, 12, 11, 3], [1, 7, 7, 6, 7, 6], [794, 769, 15, 9, 15, 3], [672, 565, 15, 9, 15, 3], [672, 616, 15, 9, 15, 3], [672, 667, 15, 9, 15, 3], [672, 718, 15, 9, 15, 3], [672, 769, 15, 9, 15, 3], [733, 4, 15, 9, 15, 3], [733, 55, 15, 9, 15, 3], [733, 106, 15, 9, 15, 3], [733, 157, 15, 9, 15, 3], [733, 208, 15, 9, 15, 3], [733, 259, 15, 9, 15, 3], [733, 310, 15, 9, 15, 3], [733, 361, 15, 9, 15, 3], [733, 412, 15, 9, 15, 3], [733, 463, 15, 9, 15, 3], [733, 514, 15, 9, 15, 3], [733, 565, 15, 9, 15, 3], [733, 616, 15, 9, 15, 3], [733, 667, 15, 9, 15, 3], [733, 718, 15, 9, 15, 3], [733, 769, 15, 9, 15, 3], [1, 7, 7, 6, 7, 6], [794, 55, 15, 9, 15, 3], [794, 106, 15, 9, 15, 3], [794, 157, 15, 9, 15, 3], [794, 208, 15, 9, 15, 3], [794, 259, 15, 9, 15, 3], [794, 310, 15, 9, 15, 3], [794, 361, 15, 9, 15, 3], [794, 412, 15, 9, 15, 3], [794, 463, 15, 9, 15, 3], [794, 514, 15, 9, 15, 3], [794, 565, 15, 9, 15, 3], [794, 616, 15, 9, 15, 3], [794, 667, 15, 9, 15, 3], [794, 718, 15, 9, 15, 3], [794, 769, 15, 9, 15, 3], [855, 4, 15, 9, 15, 3], [855, 55, 15, 9, 15, 3], [855, 106, 15, 9, 15, 3], [855, 157, 15, 9, 15, 3], [855, 208, 15, 9, 15, 3], [855, 259, 15, 9, 15, 3], [855, 310, 15, 9, 15, 3], [855, 361, 15, 9, 15, 3], [855, 412, 15, 9, 15, 3], [855, 463, 15, 9, 15, 3], [855, 514, 15, 9, 15, 3], [855, 565, 15, 9, 15, 3], [855, 616, 15, 9, 15, 3], [855, 667, 15, 9, 15, 3], [855, 718, 15, 9, 15, 3], [855, 769, 15, 9, 15, 3]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 14, 13, 10, 3], [1, 106, 15, 5, 10, 3], [1, 157, 19, 7, 14, 3], [1, 208, 16, 14, 12, 3], [1, 259, 21, 13, 16, 3], [1, 310, 18, 13, 16, 3], [1, 361, 13, 5, 9, 3], [1, 411, 16, 15, 11, 2], [1, 462, 15, 15, 11, 2], [1, 514, 17, 7, 12, 3], [1, 567, 16, 9, 13, 5], [1, 626, 9, 5, 9, 13], [1, 672, 16, 3, 13, 8], [1, 728, 8, 3, 8, 13], [1, 770, 18, 12, 13, 4], [62, 4, 19, 13, 15, 3], [62, 55, 16, 13, 15, 3], [62, 106, 19, 13, 15, 3], [62, 157, 19, 14, 15, 3], [62, 208, 18, 13, 15, 3], [62, 259, 19, 15, 15, 3], [62, 309, 18, 14, 15, 2], [62, 361, 20, 13, 15, 3], [62, 412, 19, 14, 15, 3], [62, 463, 19, 14, 15, 3], [62, 518, 12, 9, 9, 7], [62, 569, 12, 11, 9, 7], [62, 619, 15, 9, 11, 6], [62, 671, 16, 6, 13, 7], [62, 721, 13, 9, 11, 6], [62, 769, 18, 13, 14, 3], [123, 7, 19, 10, 16, 6], [123, 55, 17, 13, 17, 3], [123, 106, 18, 13, 15, 3], [123, 157, 19, 13, 14, 3], [123, 208, 18, 13, 14, 3], [123, 259, 18, 13, 13, 3], [123, 310, 18, 13, 13, 3], [123, 361, 19, 13, 15, 3], [123, 412, 20, 13, 15, 3], [123, 463, 15, 13, 11, 3], [123, 514, 15, 16, 10, 3], [123, 565, 20, 13, 15, 3], [123, 616, 14, 13, 13, 3], [123, 667, 22, 13, 17, 3], [123, 718, 20, 13, 15, 3], [123, 769, 18, 13, 14, 3], [184, 4, 18, 13, 14, 3], [184, 55, 18, 15, 14, 3], [184, 106, 18, 13, 15, 3], [184, 157, 19, 13, 14, 3], [184, 208, 18, 13, 13, 3], [184, 259, 21, 13, 16, 3], [184, 310, 22, 13, 17, 3], [184, 361, 24, 13, 19, 3], [184, 412, 20, 13, 15, 3], [184, 463, 20, 13, 15, 3], [184, 514, 18, 13, 13, 3], [184, 564, 15, 15, 9, 2], [184, 617, 13, 12, 12, 4], [184, 666, 15, 15, 9, 2], [184, 719, 16, 5, 12, 4], [184, 779, 13, 3, 12, 13], [245, 6, 13, 5, 10, 5], [245, 58, 15, 10, 13, 6], [245, 106, 17, 13, 14, 3], [245, 160, 15, 10, 12, 6], [245, 208, 18, 13, 14, 3], [245, 262, 16, 10, 13, 6], [245, 310, 15, 13, 10, 3], [245, 363, 17, 14, 13, 5], [245, 412, 17, 13, 15, 3], [245, 464, 13, 12, 9, 4], [245, 515, 14, 15, 10, 4], [245, 565, 16, 13, 13, 3], [245, 617, 13, 12, 9, 4], [245, 670, 21, 10, 19, 6], [245, 721, 17, 10, 15, 6], [245, 772, 16, 10, 13, 6], [306, 7, 17, 13, 14, 6], [306, 58, 17, 13, 14, 6], [306, 109, 16, 10, 13, 6], [306, 160, 15, 10, 12, 6], [306, 209, 13, 12, 11, 4], [306, 262, 18, 10, 15, 6], [306, 313, 19, 10, 15, 6], [306, 364, 21, 10, 17, 6], [306, 415, 17, 10, 13, 6], [306, 466, 19, 13, 15, 6], [306, 517, 16, 10, 12, 6], [306, 565, 15, 15, 10, 3], [306, 616, 13, 15, 8, 3], [306, 667, 14, 15, 10, 3], [306, 719, 18, 4, 13, 4], [306, 766, 1, 1, 3, 1], [367, 2, 20, 15, 17, 1], [367, 53, 20, 15, 17, 1], [367, 106, 19, 16, 14, 3], [367, 154, 18, 16, 13, 0], [367, 205, 21, 16, 15, 0], [367, 257, 18, 15, 14, 1], [367, 308, 21, 15, 16, 1], [367, 361, 16, 13, 13, 3], [367, 412, 15, 13, 13, 3], [367, 462, 17, 14, 13, 2], [367, 515, 16, 12, 13, 4], [367, 565, 17, 13, 13, 3], [367, 614, 17, 15, 13, 1], [367, 670, 15, 13, 12, 6], [367, 718, 17, 13, 13, 3], [367, 769, 16, 13, 13, 3], [428, 3, 17, 14, 13, 2], [428, 56, 17, 12, 13, 4], [428, 106, 15, 13, 11, 3], [428, 157, 14, 13, 11, 3], [428, 207, 16, 14, 11, 2], [428, 260, 15, 12, 11, 4], [428, 310, 18, 13, 15, 3], [428, 361, 16, 13, 13, 3], [428, 412, 16, 13, 13, 3], [428, 462, 17, 14, 13, 2], [428, 515, 17, 12, 13, 4], [428, 565, 18, 13, 13, 3], [428, 616, 18, 13, 15, 3], [428, 667, 18, 13, 15, 3], [428, 717, 18, 14, 15, 2], [428, 769, 18, 13, 15, 3], [489, 4, 14, 7, 9, 3], [489, 55, 15, 6, 10, 3], [489, 108, 15, 12, 12, 5], [489, 158, 17, 12, 14, 4], [489, 209, 15, 12, 11, 4], [489, 263, 16, 8, 13, 7], [489, 311, 19, 12, 14, 4], [489, 362, 17, 12, 13, 4], [489, 415, 18, 10, 15, 6], [489, 466, 18, 10, 15, 6], [489, 514, 20, 6, 15, 3], [489, 565, 15, 5, 10, 3], [489, 616, 15, 3, 10, 3], [489, 667, 20, 13, 15, 3], [489, 718, 24, 13, 19, 3], [489, 769, 20, 13, 15, 3], [550, 4, 20, 13, 15, 3], [550, 55, 20, 13, 15, 3], [550, 106, 20, 13, 15, 3], [550, 157, 20, 13, 15, 3], [550, 208, 20, 13, 15, 3], [550, 259, 20, 13, 15, 3], [550, 310, 20, 13, 15, 3], [550, 361, 20, 13, 15, 3], [550, 412, 20, 13, 15, 3], [550, 463, 20, 13, 15, 3], [550, 514, 20, 13, 15, 3], [550, 566, 15, 10, 12, 4], [550, 617, 15, 10, 11, 4], [550, 667, 20, 13, 15, 3], [550, 721, 22, 10, 19, 6], [550, 772, 16, 10, 12, 6], [611, 4, 16, 13, 14, 3], [611, 55, 14, 13, 10, 3], [611, 106, 20, 13, 15, 3], [611, 157, 20, 13, 15, 3], [611, 208, 20, 13, 15, 3], [611, 259, 20, 13, 15, 3], [611, 310, 20, 13, 15, 3], [611, 365, 17, 9, 14, 7], [611, 416, 16, 9, 14, 7], [611, 473, 15, 3, 15, 13], [611, 511, 1, 1, 15, 1], [611, 562, 18, 16, 17, 0], [611, 613, 22, 16, 17, 0], [611, 664, 21, 16, 17, 0], [611, 718, 26, 13, 21, 3], [611, 772, 23, 10, 20, 6], [672, 10, 14, 3, 12, 9], [672, 61, 16, 3, 14, 9], [672, 107, 17, 5, 12, 4], [672, 158, 17, 5, 12, 4], [672, 209, 14, 5, 9, 4], [672, 260, 14, 5, 9, 4], [672, 310, 20, 13, 15, 3], [672, 364, 16, 10, 14, 6], [672, 412, 19, 16, 15, 3], [1, 1, 1, 1, 9, 1], [794, 769, 20, 13, 15, 3], [672, 565, 20, 13, 15, 3], [672, 616, 20, 13, 15, 3], [672, 667, 20, 13, 15, 3], [672, 718, 20, 13, 15, 3], [672, 769, 20, 13, 15, 3], [733, 4, 20, 13, 15, 3], [733, 55, 20, 13, 15, 3], [733, 106, 20, 13, 15, 3], [733, 157, 20, 13, 15, 3], [733, 208, 20, 13, 15, 3], [733, 259, 20, 13, 15, 3], [733, 310, 20, 13, 15, 3], [733, 361, 20, 13, 15, 3], [733, 412, 20, 13, 15, 3], [733, 463, 20, 13, 15, 3], [733, 514, 20, 13, 15, 3], [733, 565, 20, 13, 15, 3], [733, 616, 20, 13, 15, 3], [733, 667, 20, 13, 15, 3], [733, 718, 20, 13, 15, 3], [733, 769, 20, 13, 15, 3], [1, 1, 1, 1, 9, 1], [794, 55, 20, 13, 15, 3], [794, 106, 20, 13, 15, 3], [794, 157, 20, 13, 15, 3], [794, 208, 20, 13, 15, 3], [794, 259, 20, 13, 15, 3], [794, 310, 20, 13, 15, 3], [794, 361, 20, 13, 15, 3], [794, 412, 20, 13, 15, 3], [794, 463, 20, 13, 15, 3], [794, 514, 20, 13, 15, 3], [794, 565, 20, 13, 15, 3], [794, 616, 20, 13, 15, 3], [794, 667, 20, 13, 15, 3], [794, 718, 20, 13, 15, 3], [794, 769, 20, 13, 15, 3], [855, 4, 20, 13, 15, 3], [855, 55, 20, 13, 15, 3], [855, 106, 20, 13, 15, 3], [855, 157, 20, 13, 15, 3], [855, 208, 20, 13, 15, 3], [855, 259, 20, 13, 15, 3], [855, 310, 20, 13, 15, 3], [855, 361, 20, 13, 15, 3], [855, 412, 20, 13, 15, 3], [855, 463, 20, 13, 15, 3], [855, 514, 20, 13, 15, 3], [855, 565, 20, 13, 15, 3], [855, 616, 20, 13, 15, 3], [855, 667, 20, 13, 15, 3], [855, 718, 20, 13, 15, 3], [855, 769, 20, 13, 15, 3]], \"capHeight\": 15, \"widestlogicalchar\": 21, \"widestglyph\": 26, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 13, 11, 9, 3], [1, 106, 14, 3, 9, 3], [1, 157, 18, 5, 13, 3], [1, 208, 15, 12, 11, 3], [1, 259, 20, 11, 15, 3], [1, 310, 17, 11, 15, 3], [1, 361, 12, 3, 8, 3], [1, 411, 15, 13, 10, 2], [1, 462, 14, 13, 10, 2], [1, 514, 16, 5, 11, 3], [1, 567, 15, 7, 12, 5], [1, 626, 8, 3, 8, 13], [1, 672, 15, 1, 12, 8], [1, 728, 7, 1, 7, 13], [1, 770, 17, 10, 12, 4], [62, 4, 18, 11, 14, 3], [62, 55, 15, 11, 14, 3], [62, 106, 18, 11, 14, 3], [62, 157, 18, 12, 14, 3], [62, 208, 17, 11, 14, 3], [62, 259, 18, 13, 14, 3], [62, 309, 17, 12, 14, 2], [62, 361, 19, 11, 14, 3], [62, 412, 18, 12, 14, 3], [62, 463, 18, 12, 14, 3], [62, 518, 11, 7, 8, 7], [62, 569, 11, 9, 8, 7], [62, 619, 14, 7, 10, 6], [62, 671, 15, 4, 12, 7], [62, 721, 12, 7, 10, 6], [62, 769, 17, 11, 13, 3], [123, 7, 18, 8, 15, 6], [123, 55, 16, 11, 16, 3], [123, 106, 17, 11, 14, 3], [123, 157, 18, 11, 13, 3], [123, 208, 17, 11, 13, 3], [123, 259, 17, 11, 12, 3], [123, 310, 17, 11, 12, 3], [123, 361, 18, 11, 14, 3], [123, 412, 19, 11, 14, 3], [123, 463, 14, 11, 10, 3], [123, 514, 14, 14, 9, 3], [123, 565, 19, 11, 14, 3], [123, 616, 13, 11, 12, 3], [123, 667, 21, 11, 16, 3], [123, 718, 19, 11, 14, 3], [123, 769, 17, 11, 13, 3], [184, 4, 17, 11, 13, 3], [184, 55, 17, 13, 13, 3], [184, 106, 17, 11, 14, 3], [184, 157, 18, 11, 13, 3], [184, 208, 17, 11, 12, 3], [184, 259, 20, 11, 15, 3], [184, 310, 21, 11, 16, 3], [184, 361, 23, 11, 18, 3], [184, 412, 19, 11, 14, 3], [184, 463, 19, 11, 14, 3], [184, 514, 17, 11, 12, 3], [184, 564, 14, 13, 8, 2], [184, 617, 12, 10, 11, 4], [184, 666, 14, 13, 8, 2], [184, 719, 15, 3, 11, 4], [184, 779, 12, 1, 11, 13], [245, 6, 12, 3, 9, 5], [245, 58, 14, 8, 12, 6], [245, 106, 16, 11, 13, 3], [245, 160, 14, 8, 11, 6], [245, 208, 17, 11, 13, 3], [245, 262, 15, 8, 12, 6], [245, 310, 14, 11, 9, 3], [245, 363, 16, 12, 12, 5], [245, 412, 16, 11, 14, 3], [245, 464, 12, 10, 8, 4], [245, 515, 13, 13, 9, 4], [245, 565, 15, 11, 12, 3], [245, 617, 12, 10, 8, 4], [245, 670, 20, 8, 18, 6], [245, 721, 16, 8, 14, 6], [245, 772, 15, 8, 12, 6], [306, 7, 16, 11, 13, 6], [306, 58, 16, 11, 13, 6], [306, 109, 15, 8, 12, 6], [306, 160, 14, 8, 11, 6], [306, 209, 12, 10, 10, 4], [306, 262, 17, 8, 14, 6], [306, 313, 18, 8, 14, 6], [306, 364, 20, 8, 16, 6], [306, 415, 16, 8, 12, 6], [306, 466, 18, 11, 14, 6], [306, 517, 15, 8, 11, 6], [306, 565, 14, 13, 9, 3], [306, 616, 12, 13, 7, 3], [306, 667, 13, 13, 9, 3], [306, 719, 17, 2, 12, 4], [306, 766, 1, 1, 3, 1], [367, 2, 19, 13, 16, 1], [367, 53, 19, 13, 16, 1], [367, 106, 18, 14, 13, 3], [367, 154, 17, 14, 12, 0], [367, 205, 19, 14, 14, 0], [367, 257, 17, 13, 13, 1], [367, 308, 20, 13, 15, 1], [367, 361, 15, 11, 12, 3], [367, 412, 14, 11, 12, 3], [367, 462, 16, 12, 12, 2], [367, 515, 15, 10, 12, 4], [367, 565, 16, 11, 12, 3], [367, 614, 16, 13, 12, 1], [367, 670, 14, 11, 11, 6], [367, 718, 16, 11, 12, 3], [367, 769, 15, 11, 12, 3], [428, 3, 16, 12, 12, 2], [428, 56, 16, 10, 12, 4], [428, 106, 14, 11, 10, 3], [428, 157, 13, 11, 10, 3], [428, 207, 15, 12, 10, 2], [428, 260, 14, 10, 10, 4], [428, 310, 17, 11, 14, 3], [428, 361, 15, 11, 12, 3], [428, 412, 15, 11, 12, 3], [428, 462, 16, 12, 12, 2], [428, 515, 16, 10, 12, 4], [428, 565, 17, 11, 12, 3], [428, 616, 17, 11, 14, 3], [428, 667, 17, 11, 14, 3], [428, 717, 17, 12, 14, 2], [428, 769, 17, 11, 14, 3], [489, 4, 13, 5, 8, 3], [489, 55, 14, 4, 9, 3], [489, 108, 14, 10, 11, 5], [489, 158, 16, 10, 13, 4], [489, 209, 14, 10, 10, 4], [489, 263, 15, 6, 12, 7], [489, 311, 18, 10, 13, 4], [489, 362, 16, 10, 12, 4], [489, 415, 17, 8, 14, 6], [489, 466, 17, 8, 14, 6], [489, 514, 19, 4, 14, 3], [489, 565, 14, 3, 9, 3], [489, 616, 14, 1, 9, 3], [489, 667, 19, 11, 14, 3], [489, 718, 23, 11, 18, 3], [489, 769, 19, 11, 14, 3], [550, 4, 19, 11, 14, 3], [550, 55, 19, 11, 14, 3], [550, 106, 19, 11, 14, 3], [550, 157, 19, 11, 14, 3], [550, 208, 19, 11, 14, 3], [550, 259, 19, 11, 14, 3], [550, 310, 19, 11, 14, 3], [550, 361, 19, 11, 14, 3], [550, 412, 19, 11, 14, 3], [550, 463, 19, 11, 14, 3], [550, 514, 19, 11, 14, 3], [550, 566, 14, 8, 11, 4], [550, 617, 14, 8, 10, 4], [550, 667, 19, 11, 14, 3], [550, 721, 21, 8, 18, 6], [550, 772, 15, 8, 11, 6], [611, 4, 15, 11, 13, 3], [611, 55, 13, 11, 9, 3], [611, 106, 19, 11, 14, 3], [611, 157, 19, 11, 14, 3], [611, 208, 19, 11, 14, 3], [611, 259, 19, 11, 14, 3], [611, 310, 19, 11, 14, 3], [611, 365, 16, 7, 13, 7], [611, 416, 15, 7, 13, 7], [611, 473, 14, 1, 14, 13], [611, 511, 1, 1, 14, 1], [611, 562, 17, 14, 16, 0], [611, 613, 19, 14, 16, 0], [611, 664, 19, 14, 16, 0], [611, 718, 25, 11, 20, 3], [611, 772, 22, 8, 19, 6], [672, 10, 13, 1, 11, 9], [672, 61, 15, 1, 13, 9], [672, 107, 16, 3, 11, 4], [672, 158, 16, 3, 11, 4], [672, 209, 13, 3, 8, 4], [672, 260, 13, 3, 8, 4], [672, 310, 19, 11, 14, 3], [672, 364, 15, 8, 13, 6], [672, 412, 18, 14, 14, 3], [1, 1, 1, 1, 8, 1], [794, 769, 19, 11, 14, 3], [672, 565, 19, 11, 14, 3], [672, 616, 19, 11, 14, 3], [672, 667, 19, 11, 14, 3], [672, 718, 19, 11, 14, 3], [672, 769, 19, 11, 14, 3], [733, 4, 19, 11, 14, 3], [733, 55, 19, 11, 14, 3], [733, 106, 19, 11, 14, 3], [733, 157, 19, 11, 14, 3], [733, 208, 19, 11, 14, 3], [733, 259, 19, 11, 14, 3], [733, 310, 19, 11, 14, 3], [733, 361, 19, 11, 14, 3], [733, 412, 19, 11, 14, 3], [733, 463, 19, 11, 14, 3], [733, 514, 19, 11, 14, 3], [733, 565, 19, 11, 14, 3], [733, 616, 19, 11, 14, 3], [733, 667, 19, 11, 14, 3], [733, 718, 19, 11, 14, 3], [733, 769, 19, 11, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 19, 11, 14, 3], [794, 106, 19, 11, 14, 3], [794, 157, 19, 11, 14, 3], [794, 208, 19, 11, 14, 3], [794, 259, 19, 11, 14, 3], [794, 310, 19, 11, 14, 3], [794, 361, 19, 11, 14, 3], [794, 412, 19, 11, 14, 3], [794, 463, 19, 11, 14, 3], [794, 514, 19, 11, 14, 3], [794, 565, 19, 11, 14, 3], [794, 616, 19, 11, 14, 3], [794, 667, 19, 11, 14, 3], [794, 718, 19, 11, 14, 3], [794, 769, 19, 11, 14, 3], [855, 4, 19, 11, 14, 3], [855, 55, 19, 11, 14, 3], [855, 106, 19, 11, 14, 3], [855, 157, 19, 11, 14, 3], [855, 208, 19, 11, 14, 3], [855, 259, 19, 11, 14, 3], [855, 310, 19, 11, 14, 3], [855, 361, 19, 11, 14, 3], [855, 412, 19, 11, 14, 3], [855, 463, 19, 11, 14, 3], [855, 514, 19, 11, 14, 3], [855, 565, 19, 11, 14, 3], [855, 616, 19, 11, 14, 3], [855, 667, 19, 11, 14, 3], [855, 718, 19, 11, 14, 3], [855, 769, 19, 11, 14, 3]], \"capHeight\": 14, \"widestlogicalchar\": 20, \"widestglyph\": 25, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 9, 6, 9, 9], [1, 55, 10, 13, 10, 3], [1, 106, 10, 12, 10, 3], [1, 157, 14, 12, 14, 3], [1, 208, 12, 14, 12, 3], [1, 259, 16, 13, 16, 3], [1, 310, 16, 13, 16, 3], [1, 361, 9, 12, 9, 3], [1, 411, 11, 15, 11, 2], [1, 462, 11, 15, 11, 2], [1, 514, 12, 12, 12, 3], [1, 567, 13, 10, 13, 5], [1, 622, 9, 9, 9, 9], [1, 672, 13, 7, 13, 8], [1, 724, 8, 7, 8, 9], [1, 770, 13, 12, 13, 4], [62, 4, 15, 13, 15, 3], [62, 55, 15, 13, 15, 3], [62, 106, 15, 13, 15, 3], [62, 157, 15, 14, 15, 3], [62, 208, 15, 13, 15, 3], [62, 259, 15, 15, 15, 3], [62, 309, 15, 14, 15, 2], [62, 361, 15, 13, 15, 3], [62, 412, 15, 14, 15, 3], [62, 463, 15, 14, 15, 3], [62, 518, 9, 9, 9, 7], [62, 569, 9, 11, 9, 7], [62, 619, 11, 9, 11, 6], [62, 671, 13, 8, 13, 7], [62, 721, 11, 9, 11, 6], [62, 769, 14, 13, 14, 3], [123, 7, 16, 10, 16, 6], [123, 55, 17, 13, 17, 3], [123, 106, 15, 13, 15, 3], [123, 157, 14, 13, 14, 3], [123, 208, 14, 13, 14, 3], [123, 259, 13, 13, 13, 3], [123, 310, 13, 13, 13, 3], [123, 361, 15, 13, 15, 3], [123, 412, 15, 13, 15, 3], [123, 463, 11, 13, 11, 3], [123, 514, 10, 16, 10, 3], [123, 565, 15, 13, 15, 3], [123, 616, 13, 13, 13, 3], [123, 667, 17, 13, 17, 3], [123, 718, 15, 13, 15, 3], [123, 769, 14, 13, 14, 3], [184, 4, 14, 13, 14, 3], [184, 55, 14, 15, 14, 3], [184, 106, 15, 13, 15, 3], [184, 157, 14, 13, 14, 3], [184, 208, 13, 13, 13, 3], [184, 259, 16, 13, 16, 3], [184, 310, 17, 13, 17, 3], [184, 361, 19, 13, 19, 3], [184, 412, 15, 13, 15, 3], [184, 463, 15, 13, 15, 3], [184, 514, 13, 13, 13, 3], [184, 564, 9, 15, 9, 2], [184, 617, 12, 12, 12, 4], [184, 666, 9, 15, 9, 2], [184, 719, 12, 11, 12, 4], [184, 775, 12, 7, 12, 9], [245, 6, 10, 10, 10, 5], [245, 58, 13, 10, 13, 6], [245, 106, 14, 13, 14, 3], [245, 160, 12, 10, 12, 6], [245, 208, 14, 13, 14, 3], [245, 262, 13, 10, 13, 6], [245, 310, 10, 13, 10, 3], [245, 363, 13, 14, 13, 5], [245, 412, 15, 13, 15, 3], [245, 464, 9, 12, 9, 4], [245, 515, 10, 15, 10, 4], [245, 565, 13, 13, 13, 3], [245, 617, 9, 12, 9, 4], [245, 670, 19, 10, 19, 6], [245, 721, 15, 10, 15, 6], [245, 772, 13, 10, 13, 6], [306, 7, 14, 13, 14, 6], [306, 58, 14, 13, 14, 6], [306, 109, 13, 10, 13, 6], [306, 160, 12, 10, 12, 6], [306, 209, 11, 12, 11, 4], [306, 262, 15, 10, 15, 6], [306, 313, 15, 10, 15, 6], [306, 364, 17, 10, 17, 6], [306, 415, 13, 10, 13, 6], [306, 466, 15, 13, 15, 6], [306, 517, 12, 10, 12, 6], [306, 565, 10, 15, 10, 3], [306, 616, 8, 15, 8, 3], [306, 667, 10, 15, 10, 3], [306, 719, 13, 11, 13, 4], [306, 775, 3, 6, 3, 9], [367, 2, 17, 15, 17, 1], [367, 53, 17, 15, 17, 1], [367, 106, 14, 16, 14, 3], [367, 154, 13, 16, 13, 0], [367, 205, 15, 16, 15, 0], [367, 257, 14, 15, 14, 1], [367, 308, 16, 15, 16, 1], [367, 361, 13, 13, 13, 3], [367, 412, 13, 13, 13, 3], [367, 462, 13, 14, 13, 2], [367, 515, 13, 12, 13, 4], [367, 565, 13, 13, 13, 3], [367, 614, 13, 15, 13, 1], [367, 670, 12, 13, 12, 6], [367, 718, 13, 13, 13, 3], [367, 769, 13, 13, 13, 3], [428, 3, 13, 14, 13, 2], [428, 56, 13, 12, 13, 4], [428, 106, 11, 13, 11, 3], [428, 157, 11, 13, 11, 3], [428, 207, 11, 14, 11, 2], [428, 260, 11, 12, 11, 4], [428, 310, 15, 13, 15, 3], [428, 361, 13, 13, 13, 3], [428, 412, 13, 13, 13, 3], [428, 462, 13, 14, 13, 2], [428, 515, 13, 12, 13, 4], [428, 565, 13, 13, 13, 3], [428, 616, 15, 13, 15, 3], [428, 667, 15, 13, 15, 3], [428, 717, 15, 14, 15, 2], [428, 769, 15, 13, 15, 3], [489, 4, 9, 12, 9, 3], [489, 55, 10, 12, 10, 3], [489, 108, 12, 12, 12, 5], [489, 158, 14, 12, 14, 4], [489, 209, 11, 12, 11, 4], [489, 263, 13, 8, 13, 7], [489, 311, 14, 12, 14, 4], [489, 362, 13, 12, 13, 4], [489, 415, 15, 10, 15, 6], [489, 466, 15, 10, 15, 6], [489, 514, 15, 12, 15, 3], [489, 565, 10, 12, 10, 3], [489, 616, 10, 12, 10, 3], [489, 667, 15, 13, 15, 3], [489, 718, 19, 13, 19, 3], [489, 769, 15, 13, 15, 3], [550, 4, 15, 13, 15, 3], [550, 55, 15, 13, 15, 3], [550, 106, 15, 13, 15, 3], [550, 157, 15, 13, 15, 3], [550, 208, 15, 13, 15, 3], [550, 259, 15, 13, 15, 3], [550, 310, 15, 13, 15, 3], [550, 361, 15, 13, 15, 3], [550, 412, 15, 13, 15, 3], [550, 463, 15, 13, 15, 3], [550, 514, 15, 13, 15, 3], [550, 566, 12, 11, 12, 4], [550, 617, 11, 11, 11, 4], [550, 667, 15, 13, 15, 3], [550, 721, 19, 10, 19, 6], [550, 772, 12, 10, 12, 6], [611, 4, 14, 13, 14, 3], [611, 55, 10, 13, 10, 3], [611, 106, 15, 13, 15, 3], [611, 157, 15, 13, 15, 3], [611, 208, 15, 13, 15, 3], [611, 259, 15, 13, 15, 3], [611, 310, 15, 13, 15, 3], [611, 365, 14, 9, 14, 7], [611, 416, 14, 9, 14, 7], [611, 469, 15, 7, 15, 9], [611, 520, 15, 6, 15, 9], [611, 562, 17, 16, 17, 0], [611, 613, 17, 16, 17, 0], [611, 664, 17, 16, 17, 0], [611, 718, 21, 13, 21, 3], [611, 772, 20, 10, 20, 6], [672, 10, 12, 6, 12, 9], [672, 61, 14, 6, 14, 9], [672, 107, 12, 11, 12, 4], [672, 158, 12, 11, 12, 4], [672, 209, 9, 11, 9, 4], [672, 260, 9, 11, 9, 4], [672, 310, 15, 13, 15, 3], [672, 364, 14, 10, 14, 6], [672, 412, 15, 16, 15, 3], [1, 10, 9, 6, 9, 9], [794, 769, 15, 13, 15, 3], [672, 565, 15, 13, 15, 3], [672, 616, 15, 13, 15, 3], [672, 667, 15, 13, 15, 3], [672, 718, 15, 13, 15, 3], [672, 769, 15, 13, 15, 3], [733, 4, 15, 13, 15, 3], [733, 55, 15, 13, 15, 3], [733, 106, 15, 13, 15, 3], [733, 157, 15, 13, 15, 3], [733, 208, 15, 13, 15, 3], [733, 259, 15, 13, 15, 3], [733, 310, 15, 13, 15, 3], [733, 361, 15, 13, 15, 3], [733, 412, 15, 13, 15, 3], [733, 463, 15, 13, 15, 3], [733, 514, 15, 13, 15, 3], [733, 565, 15, 13, 15, 3], [733, 616, 15, 13, 15, 3], [733, 667, 15, 13, 15, 3], [733, 718, 15, 13, 15, 3], [733, 769, 15, 13, 15, 3], [1, 10, 9, 6, 9, 9], [794, 55, 15, 13, 15, 3], [794, 106, 15, 13, 15, 3], [794, 157, 15, 13, 15, 3], [794, 208, 15, 13, 15, 3], [794, 259, 15, 13, 15, 3], [794, 310, 15, 13, 15, 3], [794, 361, 15, 13, 15, 3], [794, 412, 15, 13, 15, 3], [794, 463, 15, 13, 15, 3], [794, 514, 15, 13, 15, 3], [794, 565, 15, 13, 15, 3], [794, 616, 15, 13, 15, 3], [794, 667, 15, 13, 15, 3], [794, 718, 15, 13, 15, 3], [794, 769, 15, 13, 15, 3], [855, 4, 15, 13, 15, 3], [855, 55, 15, 13, 15, 3], [855, 106, 15, 13, 15, 3], [855, 157, 15, 13, 15, 3], [855, 208, 15, 13, 15, 3], [855, 259, 15, 13, 15, 3], [855, 310, 15, 13, 15, 3], [855, 361, 15, 13, 15, 3], [855, 412, 15, 13, 15, 3], [855, 463, 15, 13, 15, 3], [855, 514, 15, 13, 15, 3], [855, 565, 15, 13, 15, 3], [855, 616, 15, 13, 15, 3], [855, 667, 15, 13, 15, 3], [855, 718, 15, 13, 15, 3], [855, 769, 15, 13, 15, 3]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 8, 6, 8, 8], [1, 55, 9, 11, 9, 3], [1, 106, 9, 11, 9, 3], [1, 157, 13, 11, 13, 3], [1, 208, 11, 12, 11, 3], [1, 259, 15, 11, 15, 3], [1, 310, 15, 11, 15, 3], [1, 361, 8, 11, 8, 3], [1, 411, 10, 13, 10, 2], [1, 462, 10, 13, 10, 2], [1, 514, 11, 11, 11, 3], [1, 567, 12, 9, 12, 5], [1, 621, 8, 8, 8, 8], [1, 672, 12, 6, 12, 8], [1, 723, 7, 6, 7, 8], [1, 770, 12, 10, 12, 4], [62, 4, 14, 11, 14, 3], [62, 55, 14, 11, 14, 3], [62, 106, 14, 11, 14, 3], [62, 157, 14, 12, 14, 3], [62, 208, 14, 11, 14, 3], [62, 259, 14, 13, 14, 3], [62, 309, 14, 12, 14, 2], [62, 361, 14, 11, 14, 3], [62, 412, 14, 12, 14, 3], [62, 463, 14, 12, 14, 3], [62, 518, 8, 7, 8, 7], [62, 569, 8, 9, 8, 7], [62, 619, 10, 8, 10, 6], [62, 671, 12, 7, 12, 7], [62, 721, 10, 8, 10, 6], [62, 769, 13, 11, 13, 3], [123, 7, 15, 8, 15, 6], [123, 55, 16, 11, 16, 3], [123, 106, 14, 11, 14, 3], [123, 157, 13, 11, 13, 3], [123, 208, 13, 11, 13, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 14, 11, 14, 3], [123, 412, 14, 11, 14, 3], [123, 463, 10, 11, 10, 3], [123, 514, 9, 14, 9, 3], [123, 565, 14, 11, 14, 3], [123, 616, 12, 11, 12, 3], [123, 667, 16, 11, 16, 3], [123, 718, 14, 11, 14, 3], [123, 769, 13, 11, 13, 3], [184, 4, 13, 11, 13, 3], [184, 55, 13, 13, 13, 3], [184, 106, 14, 11, 14, 3], [184, 157, 13, 11, 13, 3], [184, 208, 12, 11, 12, 3], [184, 259, 15, 11, 15, 3], [184, 310, 16, 11, 16, 3], [184, 361, 18, 11, 18, 3], [184, 412, 14, 11, 14, 3], [184, 463, 14, 11, 14, 3], [184, 514, 12, 11, 12, 3], [184, 564, 8, 13, 8, 2], [184, 617, 11, 10, 11, 4], [184, 666, 8, 13, 8, 2], [184, 719, 11, 10, 11, 4], [184, 774, 11, 6, 11, 8], [245, 6, 9, 9, 9, 5], [245, 58, 12, 8, 12, 6], [245, 106, 13, 11, 13, 3], [245, 160, 11, 8, 11, 6], [245, 208, 13, 11, 13, 3], [245, 262, 12, 8, 12, 6], [245, 310, 9, 11, 9, 3], [245, 363, 12, 12, 12, 5], [245, 412, 14, 11, 14, 3], [245, 464, 8, 10, 8, 4], [245, 515, 9, 13, 9, 4], [245, 565, 12, 11, 12, 3], [245, 617, 8, 10, 8, 4], [245, 670, 18, 8, 18, 6], [245, 721, 14, 8, 14, 6], [245, 772, 12, 8, 12, 6], [306, 7, 13, 11, 13, 6], [306, 58, 13, 11, 13, 6], [306, 109, 12, 8, 12, 6], [306, 160, 11, 8, 11, 6], [306, 209, 10, 10, 10, 4], [306, 262, 14, 8, 14, 6], [306, 313, 14, 8, 14, 6], [306, 364, 16, 8, 16, 6], [306, 415, 12, 8, 12, 6], [306, 466, 14, 11, 14, 6], [306, 517, 11, 8, 11, 6], [306, 565, 9, 13, 9, 3], [306, 616, 7, 13, 7, 3], [306, 667, 9, 13, 9, 3], [306, 719, 12, 10, 12, 4], [306, 774, 3, 6, 3, 8], [367, 2, 16, 13, 16, 1], [367, 53, 16, 13, 16, 1], [367, 106, 13, 14, 13, 3], [367, 154, 12, 14, 12, 0], [367, 205, 14, 14, 14, 0], [367, 257, 13, 13, 13, 1], [367, 308, 15, 13, 15, 1], [367, 361, 12, 11, 12, 3], [367, 412, 12, 11, 12, 3], [367, 462, 12, 12, 12, 2], [367, 515, 12, 10, 12, 4], [367, 565, 12, 11, 12, 3], [367, 614, 12, 13, 12, 1], [367, 670, 11, 11, 11, 6], [367, 718, 12, 11, 12, 3], [367, 769, 12, 11, 12, 3], [428, 3, 12, 12, 12, 2], [428, 56, 12, 10, 12, 4], [428, 106, 10, 11, 10, 3], [428, 157, 10, 11, 10, 3], [428, 207, 10, 12, 10, 2], [428, 260, 10, 10, 10, 4], [428, 310, 14, 11, 14, 3], [428, 361, 12, 11, 12, 3], [428, 412, 12, 11, 12, 3], [428, 462, 12, 12, 12, 2], [428, 515, 12, 10, 12, 4], [428, 565, 12, 11, 12, 3], [428, 616, 14, 11, 14, 3], [428, 667, 14, 11, 14, 3], [428, 717, 14, 12, 14, 2], [428, 769, 14, 11, 14, 3], [489, 4, 8, 11, 8, 3], [489, 55, 9, 11, 9, 3], [489, 108, 11, 10, 11, 5], [489, 158, 13, 10, 13, 4], [489, 209, 10, 10, 10, 4], [489, 263, 12, 7, 12, 7], [489, 311, 13, 10, 13, 4], [489, 362, 12, 10, 12, 4], [489, 415, 14, 8, 14, 6], [489, 466, 14, 8, 14, 6], [489, 514, 14, 11, 14, 3], [489, 565, 9, 11, 9, 3], [489, 616, 9, 11, 9, 3], [489, 667, 14, 11, 14, 3], [489, 718, 18, 11, 18, 3], [489, 769, 14, 11, 14, 3], [550, 4, 14, 11, 14, 3], [550, 55, 14, 11, 14, 3], [550, 106, 14, 11, 14, 3], [550, 157, 14, 11, 14, 3], [550, 208, 14, 11, 14, 3], [550, 259, 14, 11, 14, 3], [550, 310, 14, 11, 14, 3], [550, 361, 14, 11, 14, 3], [550, 412, 14, 11, 14, 3], [550, 463, 14, 11, 14, 3], [550, 514, 14, 11, 14, 3], [550, 566, 11, 10, 11, 4], [550, 617, 10, 10, 10, 4], [550, 667, 14, 11, 14, 3], [550, 721, 18, 8, 18, 6], [550, 772, 11, 8, 11, 6], [611, 4, 13, 11, 13, 3], [611, 55, 9, 11, 9, 3], [611, 106, 14, 11, 14, 3], [611, 157, 14, 11, 14, 3], [611, 208, 14, 11, 14, 3], [611, 259, 14, 11, 14, 3], [611, 310, 14, 11, 14, 3], [611, 365, 13, 7, 13, 7], [611, 416, 13, 7, 13, 7], [611, 468, 14, 6, 14, 8], [611, 519, 14, 6, 14, 8], [611, 562, 16, 14, 16, 0], [611, 613, 16, 14, 16, 0], [611, 664, 16, 14, 16, 0], [611, 718, 20, 11, 20, 3], [611, 772, 19, 8, 19, 6], [672, 9, 11, 6, 11, 8], [672, 60, 13, 6, 13, 8], [672, 107, 11, 10, 11, 4], [672, 158, 11, 10, 11, 4], [672, 209, 8, 10, 8, 4], [672, 260, 8, 10, 8, 4], [672, 310, 14, 11, 14, 3], [672, 364, 13, 8, 13, 6], [672, 412, 14, 14, 14, 3], [1, 9, 8, 6, 8, 8], [794, 769, 14, 11, 14, 3], [672, 565, 14, 11, 14, 3], [672, 616, 14, 11, 14, 3], [672, 667, 14, 11, 14, 3], [672, 718, 14, 11, 14, 3], [672, 769, 14, 11, 14, 3], [733, 4, 14, 11, 14, 3], [733, 55, 14, 11, 14, 3], [733, 106, 14, 11, 14, 3], [733, 157, 14, 11, 14, 3], [733, 208, 14, 11, 14, 3], [733, 259, 14, 11, 14, 3], [733, 310, 14, 11, 14, 3], [733, 361, 14, 11, 14, 3], [733, 412, 14, 11, 14, 3], [733, 463, 14, 11, 14, 3], [733, 514, 14, 11, 14, 3], [733, 565, 14, 11, 14, 3], [733, 616, 14, 11, 14, 3], [733, 667, 14, 11, 14, 3], [733, 718, 14, 11, 14, 3], [733, 769, 14, 11, 14, 3], [1, 9, 8, 6, 8, 8], [794, 55, 14, 11, 14, 3], [794, 106, 14, 11, 14, 3], [794, 157, 14, 11, 14, 3], [794, 208, 14, 11, 14, 3], [794, 259, 14, 11, 14, 3], [794, 310, 14, 11, 14, 3], [794, 361, 14, 11, 14, 3], [794, 412, 14, 11, 14, 3], [794, 463, 14, 11, 14, 3], [794, 514, 14, 11, 14, 3], [794, 565, 14, 11, 14, 3], [794, 616, 14, 11, 14, 3], [794, 667, 14, 11, 14, 3], [794, 718, 14, 11, 14, 3], [794, 769, 14, 11, 14, 3], [855, 4, 14, 11, 14, 3], [855, 55, 14, 11, 14, 3], [855, 106, 14, 11, 14, 3], [855, 157, 14, 11, 14, 3], [855, 208, 14, 11, 14, 3], [855, 259, 14, 11, 14, 3], [855, 310, 14, 11, 14, 3], [855, 361, 14, 11, 14, 3], [855, 412, 14, 11, 14, 3], [855, 463, 14, 11, 14, 3], [855, 514, 14, 11, 14, 3], [855, 565, 14, 11, 14, 3], [855, 616, 14, 11, 14, 3], [855, 667, 14, 11, 14, 3], [855, 718, 14, 11, 14, 3], [855, 769, 14, 11, 14, 3]], \"widestlogicalchar\": 20, \"widestglyph\": 20, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 13, 13, 9, 3], [1, 106, 14, 5, 9, 3], [1, 157, 18, 7, 13, 3], [1, 208, 15, 14, 11, 3], [1, 259, 20, 13, 15, 3], [1, 310, 17, 13, 15, 3], [1, 361, 12, 5, 8, 3], [1, 411, 15, 15, 10, 2], [1, 462, 14, 15, 10, 2], [1, 514, 16, 7, 11, 3], [1, 567, 15, 9, 12, 5], [1, 626, 8, 5, 8, 13], [1, 672, 15, 3, 12, 8], [1, 728, 7, 3, 7, 13], [1, 770, 17, 12, 12, 4], [62, 4, 18, 13, 14, 3], [62, 55, 15, 13, 14, 3], [62, 106, 18, 13, 14, 3], [62, 157, 18, 14, 14, 3], [62, 208, 17, 13, 14, 3], [62, 259, 18, 15, 14, 3], [62, 309, 17, 14, 14, 2], [62, 361, 19, 13, 14, 3], [62, 412, 18, 14, 14, 3], [62, 463, 18, 14, 14, 3], [62, 518, 11, 9, 8, 7], [62, 569, 11, 11, 8, 7], [62, 619, 14, 9, 10, 6], [62, 671, 15, 6, 12, 7], [62, 721, 12, 9, 10, 6], [62, 769, 17, 13, 13, 3], [123, 7, 18, 10, 15, 6], [123, 55, 16, 13, 16, 3], [123, 106, 17, 13, 14, 3], [123, 157, 18, 13, 13, 3], [123, 208, 17, 13, 13, 3], [123, 259, 17, 13, 12, 3], [123, 310, 17, 13, 12, 3], [123, 361, 18, 13, 14, 3], [123, 412, 19, 13, 14, 3], [123, 463, 14, 13, 10, 3], [123, 514, 14, 16, 9, 3], [123, 565, 19, 13, 14, 3], [123, 616, 13, 13, 12, 3], [123, 667, 21, 13, 16, 3], [123, 718, 19, 13, 14, 3], [123, 769, 17, 13, 13, 3], [184, 4, 17, 13, 13, 3], [184, 55, 17, 15, 13, 3], [184, 106, 17, 13, 14, 3], [184, 157, 18, 13, 13, 3], [184, 208, 17, 13, 12, 3], [184, 259, 20, 13, 15, 3], [184, 310, 21, 13, 16, 3], [184, 361, 23, 13, 18, 3], [184, 412, 19, 13, 14, 3], [184, 463, 19, 13, 14, 3], [184, 514, 17, 13, 12, 3], [184, 564, 14, 15, 8, 2], [184, 617, 12, 12, 11, 4], [184, 666, 14, 15, 8, 2], [184, 719, 15, 5, 11, 4], [184, 779, 12, 3, 11, 13], [245, 6, 12, 5, 9, 5], [245, 58, 14, 10, 12, 6], [245, 106, 16, 13, 13, 3], [245, 160, 14, 10, 11, 6], [245, 208, 17, 13, 13, 3], [245, 262, 15, 10, 12, 6], [245, 310, 14, 13, 9, 3], [245, 363, 16, 14, 12, 5], [245, 412, 16, 13, 14, 3], [245, 464, 12, 12, 8, 4], [245, 515, 13, 15, 9, 4], [245, 565, 15, 13, 12, 3], [245, 617, 12, 12, 8, 4], [245, 670, 20, 10, 18, 6], [245, 721, 16, 10, 14, 6], [245, 772, 15, 10, 12, 6], [306, 7, 16, 13, 13, 6], [306, 58, 16, 13, 13, 6], [306, 109, 15, 10, 12, 6], [306, 160, 14, 10, 11, 6], [306, 209, 12, 12, 10, 4], [306, 262, 17, 10, 14, 6], [306, 313, 18, 10, 14, 6], [306, 364, 20, 10, 16, 6], [306, 415, 16, 10, 12, 6], [306, 466, 18, 13, 14, 6], [306, 517, 15, 10, 11, 6], [306, 565, 14, 15, 9, 3], [306, 616, 12, 15, 7, 3], [306, 667, 13, 15, 9, 3], [306, 719, 17, 4, 12, 4], [306, 766, 1, 1, 3, 1], [367, 2, 19, 15, 16, 1], [367, 53, 19, 15, 16, 1], [367, 106, 18, 16, 13, 3], [367, 154, 17, 16, 12, 0], [367, 205, 20, 16, 14, 0], [367, 257, 17, 15, 13, 1], [367, 308, 20, 15, 15, 1], [367, 361, 15, 13, 12, 3], [367, 412, 14, 13, 12, 3], [367, 462, 16, 14, 12, 2], [367, 515, 15, 12, 12, 4], [367, 565, 16, 13, 12, 3], [367, 614, 16, 15, 12, 1], [367, 670, 14, 13, 11, 6], [367, 718, 16, 13, 12, 3], [367, 769, 15, 13, 12, 3], [428, 3, 16, 14, 12, 2], [428, 56, 16, 12, 12, 4], [428, 106, 14, 13, 10, 3], [428, 157, 13, 13, 10, 3], [428, 207, 15, 14, 10, 2], [428, 260, 14, 12, 10, 4], [428, 310, 17, 13, 14, 3], [428, 361, 15, 13, 12, 3], [428, 412, 15, 13, 12, 3], [428, 462, 16, 14, 12, 2], [428, 515, 16, 12, 12, 4], [428, 565, 17, 13, 12, 3], [428, 616, 17, 13, 14, 3], [428, 667, 17, 13, 14, 3], [428, 717, 17, 14, 14, 2], [428, 769, 17, 13, 14, 3], [489, 4, 13, 7, 8, 3], [489, 55, 14, 6, 9, 3], [489, 108, 14, 12, 11, 5], [489, 158, 16, 12, 13, 4], [489, 209, 14, 12, 10, 4], [489, 263, 15, 8, 12, 7], [489, 311, 18, 12, 13, 4], [489, 362, 16, 12, 12, 4], [489, 415, 17, 10, 14, 6], [489, 466, 17, 10, 14, 6], [489, 514, 19, 6, 14, 3], [489, 565, 14, 5, 9, 3], [489, 616, 14, 3, 9, 3], [489, 667, 19, 13, 14, 3], [489, 718, 23, 13, 18, 3], [489, 769, 19, 13, 14, 3], [550, 4, 19, 13, 14, 3], [550, 55, 19, 13, 14, 3], [550, 106, 19, 13, 14, 3], [550, 157, 19, 13, 14, 3], [550, 208, 19, 13, 14, 3], [550, 259, 19, 13, 14, 3], [550, 310, 19, 13, 14, 3], [550, 361, 19, 13, 14, 3], [550, 412, 19, 13, 14, 3], [550, 463, 19, 13, 14, 3], [550, 514, 19, 13, 14, 3], [550, 566, 14, 10, 11, 4], [550, 617, 14, 10, 10, 4], [550, 667, 19, 13, 14, 3], [550, 721, 21, 10, 18, 6], [550, 772, 15, 10, 11, 6], [611, 4, 15, 13, 13, 3], [611, 55, 13, 13, 9, 3], [611, 106, 19, 13, 14, 3], [611, 157, 19, 13, 14, 3], [611, 208, 19, 13, 14, 3], [611, 259, 19, 13, 14, 3], [611, 310, 19, 13, 14, 3], [611, 365, 16, 9, 13, 7], [611, 416, 15, 9, 13, 7], [611, 473, 14, 3, 14, 13], [611, 511, 1, 1, 14, 1], [611, 562, 17, 16, 16, 0], [611, 613, 21, 16, 16, 0], [611, 664, 20, 16, 16, 0], [611, 718, 25, 13, 20, 3], [611, 772, 22, 10, 19, 6], [672, 10, 13, 3, 11, 9], [672, 61, 15, 3, 13, 9], [672, 107, 16, 5, 11, 4], [672, 158, 16, 5, 11, 4], [672, 209, 13, 5, 8, 4], [672, 260, 13, 5, 8, 4], [672, 310, 19, 13, 14, 3], [672, 364, 15, 10, 13, 6], [672, 412, 18, 16, 14, 3], [1, 1, 1, 1, 8, 1], [794, 769, 19, 13, 14, 3], [672, 565, 19, 13, 14, 3], [672, 616, 19, 13, 14, 3], [672, 667, 19, 13, 14, 3], [672, 718, 19, 13, 14, 3], [672, 769, 19, 13, 14, 3], [733, 4, 19, 13, 14, 3], [733, 55, 19, 13, 14, 3], [733, 106, 19, 13, 14, 3], [733, 157, 19, 13, 14, 3], [733, 208, 19, 13, 14, 3], [733, 259, 19, 13, 14, 3], [733, 310, 19, 13, 14, 3], [733, 361, 19, 13, 14, 3], [733, 412, 19, 13, 14, 3], [733, 463, 19, 13, 14, 3], [733, 514, 19, 13, 14, 3], [733, 565, 19, 13, 14, 3], [733, 616, 19, 13, 14, 3], [733, 667, 19, 13, 14, 3], [733, 718, 19, 13, 14, 3], [733, 769, 19, 13, 14, 3], [1, 1, 1, 1, 8, 1], [794, 55, 19, 13, 14, 3], [794, 106, 19, 13, 14, 3], [794, 157, 19, 13, 14, 3], [794, 208, 19, 13, 14, 3], [794, 259, 19, 13, 14, 3], [794, 310, 19, 13, 14, 3], [794, 361, 19, 13, 14, 3], [794, 412, 19, 13, 14, 3], [794, 463, 19, 13, 14, 3], [794, 514, 19, 13, 14, 3], [794, 565, 19, 13, 14, 3], [794, 616, 19, 13, 14, 3], [794, 667, 19, 13, 14, 3], [794, 718, 19, 13, 14, 3], [794, 769, 19, 13, 14, 3], [855, 4, 19, 13, 14, 3], [855, 55, 19, 13, 14, 3], [855, 106, 19, 13, 14, 3], [855, 157, 19, 13, 14, 3], [855, 208, 19, 13, 14, 3], [855, 259, 19, 13, 14, 3], [855, 310, 19, 13, 14, 3], [855, 361, 19, 13, 14, 3], [855, 412, 19, 13, 14, 3], [855, 463, 19, 13, 14, 3], [855, 514, 19, 13, 14, 3], [855, 565, 19, 13, 14, 3], [855, 616, 19, 13, 14, 3], [855, 667, 19, 13, 14, 3], [855, 718, 19, 13, 14, 3], [855, 769, 19, 13, 14, 3]], \"capHeight\": 15, \"widestlogicalchar\": 20, \"widestglyph\": 25, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 12, 11, 8, 3], [1, 106, 13, 3, 8, 3], [1, 157, 17, 5, 12, 3], [1, 208, 14, 12, 10, 3], [1, 259, 19, 11, 14, 3], [1, 310, 16, 11, 14, 3], [1, 361, 11, 3, 7, 3], [1, 411, 14, 13, 9, 2], [1, 462, 13, 13, 9, 2], [1, 514, 15, 5, 10, 3], [1, 567, 14, 7, 11, 5], [1, 626, 7, 3, 7, 13], [1, 672, 14, 1, 11, 8], [1, 728, 6, 1, 6, 13], [1, 770, 16, 10, 11, 4], [62, 4, 17, 11, 13, 3], [62, 55, 14, 11, 13, 3], [62, 106, 17, 11, 13, 3], [62, 157, 17, 12, 13, 3], [62, 208, 16, 11, 13, 3], [62, 259, 17, 13, 13, 3], [62, 309, 16, 12, 13, 2], [62, 361, 18, 11, 13, 3], [62, 412, 17, 12, 13, 3], [62, 463, 17, 12, 13, 3], [62, 518, 10, 7, 7, 7], [62, 569, 10, 9, 7, 7], [62, 619, 13, 7, 9, 6], [62, 671, 14, 4, 11, 7], [62, 721, 11, 7, 9, 6], [62, 769, 16, 11, 12, 3], [123, 7, 17, 8, 14, 6], [123, 55, 15, 11, 15, 3], [123, 106, 16, 11, 13, 3], [123, 157, 17, 11, 12, 3], [123, 208, 16, 11, 12, 3], [123, 259, 16, 11, 11, 3], [123, 310, 16, 11, 11, 3], [123, 361, 17, 11, 13, 3], [123, 412, 18, 11, 13, 3], [123, 463, 13, 11, 9, 3], [123, 514, 13, 14, 8, 3], [123, 565, 18, 11, 13, 3], [123, 616, 12, 11, 11, 3], [123, 667, 20, 11, 15, 3], [123, 718, 18, 11, 13, 3], [123, 769, 16, 11, 12, 3], [184, 4, 16, 11, 12, 3], [184, 55, 16, 13, 12, 3], [184, 106, 16, 11, 13, 3], [184, 157, 17, 11, 12, 3], [184, 208, 16, 11, 11, 3], [184, 259, 19, 11, 14, 3], [184, 310, 20, 11, 15, 3], [184, 361, 22, 11, 17, 3], [184, 412, 18, 11, 13, 3], [184, 463, 18, 11, 13, 3], [184, 514, 16, 11, 11, 3], [184, 564, 13, 13, 7, 2], [184, 617, 11, 10, 10, 4], [184, 666, 13, 13, 7, 2], [184, 719, 14, 3, 10, 4], [184, 779, 11, 1, 10, 13], [245, 6, 11, 3, 8, 5], [245, 58, 13, 8, 11, 6], [245, 106, 15, 11, 12, 3], [245, 160, 13, 8, 10, 6], [245, 208, 16, 11, 12, 3], [245, 262, 14, 8, 11, 6], [245, 310, 13, 11, 8, 3], [245, 363, 15, 12, 11, 5], [245, 412, 15, 11, 13, 3], [245, 464, 11, 10, 7, 4], [245, 515, 12, 13, 8, 4], [245, 565, 14, 11, 11, 3], [245, 617, 11, 10, 7, 4], [245, 670, 19, 8, 17, 6], [245, 721, 15, 8, 13, 6], [245, 772, 14, 8, 11, 6], [306, 7, 15, 11, 12, 6], [306, 58, 15, 11, 12, 6], [306, 109, 14, 8, 11, 6], [306, 160, 13, 8, 10, 6], [306, 209, 11, 10, 9, 4], [306, 262, 16, 8, 13, 6], [306, 313, 17, 8, 13, 6], [306, 364, 19, 8, 15, 6], [306, 415, 15, 8, 11, 6], [306, 466, 17, 11, 13, 6], [306, 517, 14, 8, 10, 6], [306, 565, 13, 13, 8, 3], [306, 616, 11, 13, 6, 3], [306, 667, 12, 13, 8, 3], [306, 719, 16, 2, 11, 4], [306, 766, 1, 1, 3, 1], [367, 2, 18, 13, 15, 1], [367, 53, 18, 13, 15, 1], [367, 106, 17, 14, 12, 3], [367, 154, 16, 14, 11, 0], [367, 205, 18, 14, 13, 0], [367, 257, 16, 13, 12, 1], [367, 308, 19, 13, 14, 1], [367, 361, 14, 11, 11, 3], [367, 412, 13, 11, 11, 3], [367, 462, 15, 12, 11, 2], [367, 515, 14, 10, 11, 4], [367, 565, 15, 11, 11, 3], [367, 614, 15, 13, 11, 1], [367, 670, 13, 11, 10, 6], [367, 718, 15, 11, 11, 3], [367, 769, 14, 11, 11, 3], [428, 3, 15, 12, 11, 2], [428, 56, 15, 10, 11, 4], [428, 106, 13, 11, 9, 3], [428, 157, 12, 11, 9, 3], [428, 207, 14, 12, 9, 2], [428, 260, 13, 10, 9, 4], [428, 310, 16, 11, 13, 3], [428, 361, 14, 11, 11, 3], [428, 412, 14, 11, 11, 3], [428, 462, 15, 12, 11, 2], [428, 515, 15, 10, 11, 4], [428, 565, 16, 11, 11, 3], [428, 616, 16, 11, 13, 3], [428, 667, 16, 11, 13, 3], [428, 717, 16, 12, 13, 2], [428, 769, 16, 11, 13, 3], [489, 4, 12, 5, 7, 3], [489, 55, 13, 4, 8, 3], [489, 108, 13, 10, 10, 5], [489, 158, 15, 10, 12, 4], [489, 209, 13, 10, 9, 4], [489, 263, 14, 6, 11, 7], [489, 311, 17, 10, 12, 4], [489, 362, 15, 10, 11, 4], [489, 415, 16, 8, 13, 6], [489, 466, 16, 8, 13, 6], [489, 514, 18, 4, 13, 3], [489, 565, 13, 3, 8, 3], [489, 616, 13, 1, 8, 3], [489, 667, 18, 11, 13, 3], [489, 718, 22, 11, 17, 3], [489, 769, 18, 11, 13, 3], [550, 4, 18, 11, 13, 3], [550, 55, 18, 11, 13, 3], [550, 106, 18, 11, 13, 3], [550, 157, 18, 11, 13, 3], [550, 208, 18, 11, 13, 3], [550, 259, 18, 11, 13, 3], [550, 310, 18, 11, 13, 3], [550, 361, 18, 11, 13, 3], [550, 412, 18, 11, 13, 3], [550, 463, 18, 11, 13, 3], [550, 514, 18, 11, 13, 3], [550, 566, 13, 8, 10, 4], [550, 617, 13, 8, 9, 4], [550, 667, 18, 11, 13, 3], [550, 721, 20, 8, 17, 6], [550, 772, 14, 8, 10, 6], [611, 4, 14, 11, 12, 3], [611, 55, 12, 11, 8, 3], [611, 106, 18, 11, 13, 3], [611, 157, 18, 11, 13, 3], [611, 208, 18, 11, 13, 3], [611, 259, 18, 11, 13, 3], [611, 310, 18, 11, 13, 3], [611, 365, 15, 7, 12, 7], [611, 416, 14, 7, 12, 7], [611, 473, 13, 1, 13, 13], [611, 511, 1, 1, 13, 1], [611, 562, 16, 14, 15, 0], [611, 613, 18, 14, 15, 0], [611, 664, 18, 14, 15, 0], [611, 718, 24, 11, 19, 3], [611, 772, 21, 8, 18, 6], [672, 10, 12, 1, 10, 9], [672, 61, 14, 1, 12, 9], [672, 107, 15, 3, 10, 4], [672, 158, 15, 3, 10, 4], [672, 209, 12, 3, 7, 4], [672, 260, 12, 3, 7, 4], [672, 310, 18, 11, 13, 3], [672, 364, 14, 8, 12, 6], [672, 412, 17, 14, 13, 3], [1, 1, 1, 1, 7, 1], [794, 769, 18, 11, 13, 3], [672, 565, 18, 11, 13, 3], [672, 616, 18, 11, 13, 3], [672, 667, 18, 11, 13, 3], [672, 718, 18, 11, 13, 3], [672, 769, 18, 11, 13, 3], [733, 4, 18, 11, 13, 3], [733, 55, 18, 11, 13, 3], [733, 106, 18, 11, 13, 3], [733, 157, 18, 11, 13, 3], [733, 208, 18, 11, 13, 3], [733, 259, 18, 11, 13, 3], [733, 310, 18, 11, 13, 3], [733, 361, 18, 11, 13, 3], [733, 412, 18, 11, 13, 3], [733, 463, 18, 11, 13, 3], [733, 514, 18, 11, 13, 3], [733, 565, 18, 11, 13, 3], [733, 616, 18, 11, 13, 3], [733, 667, 18, 11, 13, 3], [733, 718, 18, 11, 13, 3], [733, 769, 18, 11, 13, 3], [1, 1, 1, 1, 7, 1], [794, 55, 18, 11, 13, 3], [794, 106, 18, 11, 13, 3], [794, 157, 18, 11, 13, 3], [794, 208, 18, 11, 13, 3], [794, 259, 18, 11, 13, 3], [794, 310, 18, 11, 13, 3], [794, 361, 18, 11, 13, 3], [794, 412, 18, 11, 13, 3], [794, 463, 18, 11, 13, 3], [794, 514, 18, 11, 13, 3], [794, 565, 18, 11, 13, 3], [794, 616, 18, 11, 13, 3], [794, 667, 18, 11, 13, 3], [794, 718, 18, 11, 13, 3], [794, 769, 18, 11, 13, 3], [855, 4, 18, 11, 13, 3], [855, 55, 18, 11, 13, 3], [855, 106, 18, 11, 13, 3], [855, 157, 18, 11, 13, 3], [855, 208, 18, 11, 13, 3], [855, 259, 18, 11, 13, 3], [855, 310, 18, 11, 13, 3], [855, 361, 18, 11, 13, 3], [855, 412, 18, 11, 13, 3], [855, 463, 18, 11, 13, 3], [855, 514, 18, 11, 13, 3], [855, 565, 18, 11, 13, 3], [855, 616, 18, 11, 13, 3], [855, 667, 18, 11, 13, 3], [855, 718, 18, 11, 13, 3], [855, 769, 18, 11, 13, 3]], \"capHeight\": 14, \"widestlogicalchar\": 19, \"widestglyph\": 24, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 8, 6, 8, 9], [1, 55, 9, 13, 9, 3], [1, 106, 9, 12, 9, 3], [1, 157, 13, 12, 13, 3], [1, 208, 11, 14, 11, 3], [1, 259, 15, 13, 15, 3], [1, 310, 15, 13, 15, 3], [1, 361, 8, 12, 8, 3], [1, 411, 10, 15, 10, 2], [1, 462, 10, 15, 10, 2], [1, 514, 11, 12, 11, 3], [1, 567, 12, 10, 12, 5], [1, 622, 8, 9, 8, 9], [1, 672, 12, 7, 12, 8], [1, 724, 7, 7, 7, 9], [1, 770, 12, 12, 12, 4], [62, 4, 14, 13, 14, 3], [62, 55, 14, 13, 14, 3], [62, 106, 14, 13, 14, 3], [62, 157, 14, 14, 14, 3], [62, 208, 14, 13, 14, 3], [62, 259, 14, 15, 14, 3], [62, 309, 14, 14, 14, 2], [62, 361, 14, 13, 14, 3], [62, 412, 14, 14, 14, 3], [62, 463, 14, 14, 14, 3], [62, 518, 8, 9, 8, 7], [62, 569, 8, 11, 8, 7], [62, 619, 10, 9, 10, 6], [62, 671, 12, 8, 12, 7], [62, 721, 10, 9, 10, 6], [62, 769, 13, 13, 13, 3], [123, 7, 15, 10, 15, 6], [123, 55, 16, 13, 16, 3], [123, 106, 14, 13, 14, 3], [123, 157, 13, 13, 13, 3], [123, 208, 13, 13, 13, 3], [123, 259, 12, 13, 12, 3], [123, 310, 12, 13, 12, 3], [123, 361, 14, 13, 14, 3], [123, 412, 14, 13, 14, 3], [123, 463, 10, 13, 10, 3], [123, 514, 9, 16, 9, 3], [123, 565, 14, 13, 14, 3], [123, 616, 12, 13, 12, 3], [123, 667, 16, 13, 16, 3], [123, 718, 14, 13, 14, 3], [123, 769, 13, 13, 13, 3], [184, 4, 13, 13, 13, 3], [184, 55, 13, 15, 13, 3], [184, 106, 14, 13, 14, 3], [184, 157, 13, 13, 13, 3], [184, 208, 12, 13, 12, 3], [184, 259, 15, 13, 15, 3], [184, 310, 16, 13, 16, 3], [184, 361, 18, 13, 18, 3], [184, 412, 14, 13, 14, 3], [184, 463, 14, 13, 14, 3], [184, 514, 12, 13, 12, 3], [184, 564, 8, 15, 8, 2], [184, 617, 11, 12, 11, 4], [184, 666, 8, 15, 8, 2], [184, 719, 11, 11, 11, 4], [184, 775, 11, 7, 11, 9], [245, 6, 9, 10, 9, 5], [245, 58, 12, 10, 12, 6], [245, 106, 13, 13, 13, 3], [245, 160, 11, 10, 11, 6], [245, 208, 13, 13, 13, 3], [245, 262, 12, 10, 12, 6], [245, 310, 9, 13, 9, 3], [245, 363, 12, 14, 12, 5], [245, 412, 14, 13, 14, 3], [245, 464, 8, 12, 8, 4], [245, 515, 9, 15, 9, 4], [245, 565, 12, 13, 12, 3], [245, 617, 8, 12, 8, 4], [245, 670, 18, 10, 18, 6], [245, 721, 14, 10, 14, 6], [245, 772, 12, 10, 12, 6], [306, 7, 13, 13, 13, 6], [306, 58, 13, 13, 13, 6], [306, 109, 12, 10, 12, 6], [306, 160, 11, 10, 11, 6], [306, 209, 10, 12, 10, 4], [306, 262, 14, 10, 14, 6], [306, 313, 14, 10, 14, 6], [306, 364, 16, 10, 16, 6], [306, 415, 12, 10, 12, 6], [306, 466, 14, 13, 14, 6], [306, 517, 11, 10, 11, 6], [306, 565, 9, 15, 9, 3], [306, 616, 7, 15, 7, 3], [306, 667, 9, 15, 9, 3], [306, 719, 12, 11, 12, 4], [306, 775, 3, 6, 3, 9], [367, 2, 16, 15, 16, 1], [367, 53, 16, 15, 16, 1], [367, 106, 13, 16, 13, 3], [367, 154, 12, 16, 12, 0], [367, 205, 14, 16, 14, 0], [367, 257, 13, 15, 13, 1], [367, 308, 15, 15, 15, 1], [367, 361, 12, 13, 12, 3], [367, 412, 12, 13, 12, 3], [367, 462, 12, 14, 12, 2], [367, 515, 12, 12, 12, 4], [367, 565, 12, 13, 12, 3], [367, 614, 12, 15, 12, 1], [367, 670, 11, 13, 11, 6], [367, 718, 12, 13, 12, 3], [367, 769, 12, 13, 12, 3], [428, 3, 12, 14, 12, 2], [428, 56, 12, 12, 12, 4], [428, 106, 10, 13, 10, 3], [428, 157, 10, 13, 10, 3], [428, 207, 10, 14, 10, 2], [428, 260, 10, 12, 10, 4], [428, 310, 14, 13, 14, 3], [428, 361, 12, 13, 12, 3], [428, 412, 12, 13, 12, 3], [428, 462, 12, 14, 12, 2], [428, 515, 12, 12, 12, 4], [428, 565, 12, 13, 12, 3], [428, 616, 14, 13, 14, 3], [428, 667, 14, 13, 14, 3], [428, 717, 14, 14, 14, 2], [428, 769, 14, 13, 14, 3], [489, 4, 8, 12, 8, 3], [489, 55, 9, 12, 9, 3], [489, 108, 11, 12, 11, 5], [489, 158, 13, 12, 13, 4], [489, 209, 10, 12, 10, 4], [489, 263, 12, 8, 12, 7], [489, 311, 13, 12, 13, 4], [489, 362, 12, 12, 12, 4], [489, 415, 14, 10, 14, 6], [489, 466, 14, 10, 14, 6], [489, 514, 14, 12, 14, 3], [489, 565, 9, 12, 9, 3], [489, 616, 9, 12, 9, 3], [489, 667, 14, 13, 14, 3], [489, 718, 18, 13, 18, 3], [489, 769, 14, 13, 14, 3], [550, 4, 14, 13, 14, 3], [550, 55, 14, 13, 14, 3], [550, 106, 14, 13, 14, 3], [550, 157, 14, 13, 14, 3], [550, 208, 14, 13, 14, 3], [550, 259, 14, 13, 14, 3], [550, 310, 14, 13, 14, 3], [550, 361, 14, 13, 14, 3], [550, 412, 14, 13, 14, 3], [550, 463, 14, 13, 14, 3], [550, 514, 14, 13, 14, 3], [550, 566, 11, 11, 11, 4], [550, 617, 10, 11, 10, 4], [550, 667, 14, 13, 14, 3], [550, 721, 18, 10, 18, 6], [550, 772, 11, 10, 11, 6], [611, 4, 13, 13, 13, 3], [611, 55, 9, 13, 9, 3], [611, 106, 14, 13, 14, 3], [611, 157, 14, 13, 14, 3], [611, 208, 14, 13, 14, 3], [611, 259, 14, 13, 14, 3], [611, 310, 14, 13, 14, 3], [611, 365, 13, 9, 13, 7], [611, 416, 13, 9, 13, 7], [611, 469, 14, 7, 14, 9], [611, 520, 14, 6, 14, 9], [611, 562, 16, 16, 16, 0], [611, 613, 16, 16, 16, 0], [611, 664, 16, 16, 16, 0], [611, 718, 20, 13, 20, 3], [611, 772, 19, 10, 19, 6], [672, 10, 11, 6, 11, 9], [672, 61, 13, 6, 13, 9], [672, 107, 11, 11, 11, 4], [672, 158, 11, 11, 11, 4], [672, 209, 8, 11, 8, 4], [672, 260, 8, 11, 8, 4], [672, 310, 14, 13, 14, 3], [672, 364, 13, 10, 13, 6], [672, 412, 14, 16, 14, 3], [1, 10, 8, 6, 8, 9], [794, 769, 14, 13, 14, 3], [672, 565, 14, 13, 14, 3], [672, 616, 14, 13, 14, 3], [672, 667, 14, 13, 14, 3], [672, 718, 14, 13, 14, 3], [672, 769, 14, 13, 14, 3], [733, 4, 14, 13, 14, 3], [733, 55, 14, 13, 14, 3], [733, 106, 14, 13, 14, 3], [733, 157, 14, 13, 14, 3], [733, 208, 14, 13, 14, 3], [733, 259, 14, 13, 14, 3], [733, 310, 14, 13, 14, 3], [733, 361, 14, 13, 14, 3], [733, 412, 14, 13, 14, 3], [733, 463, 14, 13, 14, 3], [733, 514, 14, 13, 14, 3], [733, 565, 14, 13, 14, 3], [733, 616, 14, 13, 14, 3], [733, 667, 14, 13, 14, 3], [733, 718, 14, 13, 14, 3], [733, 769, 14, 13, 14, 3], [1, 10, 8, 6, 8, 9], [794, 55, 14, 13, 14, 3], [794, 106, 14, 13, 14, 3], [794, 157, 14, 13, 14, 3], [794, 208, 14, 13, 14, 3], [794, 259, 14, 13, 14, 3], [794, 310, 14, 13, 14, 3], [794, 361, 14, 13, 14, 3], [794, 412, 14, 13, 14, 3], [794, 463, 14, 13, 14, 3], [794, 514, 14, 13, 14, 3], [794, 565, 14, 13, 14, 3], [794, 616, 14, 13, 14, 3], [794, 667, 14, 13, 14, 3], [794, 718, 14, 13, 14, 3], [794, 769, 14, 13, 14, 3], [855, 4, 14, 13, 14, 3], [855, 55, 14, 13, 14, 3], [855, 106, 14, 13, 14, 3], [855, 157, 14, 13, 14, 3], [855, 208, 14, 13, 14, 3], [855, 259, 14, 13, 14, 3], [855, 310, 14, 13, 14, 3], [855, 361, 14, 13, 14, 3], [855, 412, 14, 13, 14, 3], [855, 463, 14, 13, 14, 3], [855, 514, 14, 13, 14, 3], [855, 565, 14, 13, 14, 3], [855, 616, 14, 13, 14, 3], [855, 667, 14, 13, 14, 3], [855, 718, 14, 13, 14, 3], [855, 769, 14, 13, 14, 3]], \"widestlogicalchar\": 20, \"widestglyph\": 20, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 7, 6, 7, 8], [1, 55, 8, 11, 8, 3], [1, 106, 8, 11, 8, 3], [1, 157, 12, 11, 12, 3], [1, 208, 10, 12, 10, 3], [1, 259, 14, 11, 14, 3], [1, 310, 14, 11, 14, 3], [1, 361, 7, 11, 7, 3], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 514, 10, 11, 10, 3], [1, 567, 11, 9, 11, 5], [1, 621, 7, 8, 7, 8], [1, 672, 11, 6, 11, 8], [1, 723, 6, 6, 6, 8], [1, 770, 11, 10, 11, 4], [62, 4, 13, 11, 13, 3], [62, 55, 13, 11, 13, 3], [62, 106, 13, 11, 13, 3], [62, 157, 13, 12, 13, 3], [62, 208, 13, 11, 13, 3], [62, 259, 13, 13, 13, 3], [62, 309, 13, 12, 13, 2], [62, 361, 13, 11, 13, 3], [62, 412, 13, 12, 13, 3], [62, 463, 13, 12, 13, 3], [62, 518, 7, 7, 7, 7], [62, 569, 7, 9, 7, 7], [62, 619, 9, 8, 9, 6], [62, 671, 11, 7, 11, 7], [62, 721, 9, 8, 9, 6], [62, 769, 12, 11, 12, 3], [123, 7, 14, 8, 14, 6], [123, 55, 15, 11, 15, 3], [123, 106, 13, 11, 13, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 13, 11, 13, 3], [123, 412, 13, 11, 13, 3], [123, 463, 9, 11, 9, 3], [123, 514, 8, 14, 8, 3], [123, 565, 13, 11, 13, 3], [123, 616, 11, 11, 11, 3], [123, 667, 15, 11, 15, 3], [123, 718, 13, 11, 13, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 13, 12, 3], [184, 106, 13, 11, 13, 3], [184, 157, 12, 11, 12, 3], [184, 208, 11, 11, 11, 3], [184, 259, 14, 11, 14, 3], [184, 310, 15, 11, 15, 3], [184, 361, 17, 11, 17, 3], [184, 412, 13, 11, 13, 3], [184, 463, 13, 11, 13, 3], [184, 514, 11, 11, 11, 3], [184, 564, 7, 13, 7, 2], [184, 617, 10, 10, 10, 4], [184, 666, 7, 13, 7, 2], [184, 719, 10, 10, 10, 4], [184, 774, 10, 6, 10, 8], [245, 6, 8, 9, 8, 5], [245, 58, 11, 8, 11, 6], [245, 106, 12, 11, 12, 3], [245, 160, 10, 8, 10, 6], [245, 208, 12, 11, 12, 3], [245, 262, 11, 8, 11, 6], [245, 310, 8, 11, 8, 3], [245, 363, 11, 12, 11, 5], [245, 412, 13, 11, 13, 3], [245, 464, 7, 10, 7, 4], [245, 515, 8, 13, 8, 4], [245, 565, 11, 11, 11, 3], [245, 617, 7, 10, 7, 4], [245, 670, 17, 8, 17, 6], [245, 721, 13, 8, 13, 6], [245, 772, 11, 8, 11, 6], [306, 7, 12, 11, 12, 6], [306, 58, 12, 11, 12, 6], [306, 109, 11, 8, 11, 6], [306, 160, 10, 8, 10, 6], [306, 209, 9, 10, 9, 4], [306, 262, 13, 8, 13, 6], [306, 313, 13, 8, 13, 6], [306, 364, 15, 8, 15, 6], [306, 415, 11, 8, 11, 6], [306, 466, 13, 11, 13, 6], [306, 517, 10, 8, 10, 6], [306, 565, 8, 13, 8, 3], [306, 616, 6, 13, 6, 3], [306, 667, 8, 13, 8, 3], [306, 719, 11, 10, 11, 4], [306, 774, 3, 6, 3, 8], [367, 2, 15, 13, 15, 1], [367, 53, 15, 13, 15, 1], [367, 106, 12, 14, 12, 3], [367, 154, 11, 14, 11, 0], [367, 205, 13, 14, 13, 0], [367, 257, 12, 13, 12, 1], [367, 308, 14, 13, 14, 1], [367, 361, 11, 11, 11, 3], [367, 412, 11, 11, 11, 3], [367, 462, 11, 12, 11, 2], [367, 515, 11, 10, 11, 4], [367, 565, 11, 11, 11, 3], [367, 614, 11, 13, 11, 1], [367, 670, 10, 11, 10, 6], [367, 718, 11, 11, 11, 3], [367, 769, 11, 11, 11, 3], [428, 3, 11, 12, 11, 2], [428, 56, 11, 10, 11, 4], [428, 106, 9, 11, 9, 3], [428, 157, 9, 11, 9, 3], [428, 207, 9, 12, 9, 2], [428, 260, 9, 10, 9, 4], [428, 310, 13, 11, 13, 3], [428, 361, 11, 11, 11, 3], [428, 412, 11, 11, 11, 3], [428, 462, 11, 12, 11, 2], [428, 515, 11, 10, 11, 4], [428, 565, 11, 11, 11, 3], [428, 616, 13, 11, 13, 3], [428, 667, 13, 11, 13, 3], [428, 717, 13, 12, 13, 2], [428, 769, 13, 11, 13, 3], [489, 4, 7, 11, 7, 3], [489, 55, 8, 11, 8, 3], [489, 108, 10, 10, 10, 5], [489, 158, 12, 10, 12, 4], [489, 209, 9, 10, 9, 4], [489, 263, 11, 7, 11, 7], [489, 311, 12, 10, 12, 4], [489, 362, 11, 10, 11, 4], [489, 415, 13, 8, 13, 6], [489, 466, 13, 8, 13, 6], [489, 514, 13, 11, 13, 3], [489, 565, 8, 11, 8, 3], [489, 616, 8, 11, 8, 3], [489, 667, 13, 11, 13, 3], [489, 718, 17, 11, 17, 3], [489, 769, 13, 11, 13, 3], [550, 4, 13, 11, 13, 3], [550, 55, 13, 11, 13, 3], [550, 106, 13, 11, 13, 3], [550, 157, 13, 11, 13, 3], [550, 208, 13, 11, 13, 3], [550, 259, 13, 11, 13, 3], [550, 310, 13, 11, 13, 3], [550, 361, 13, 11, 13, 3], [550, 412, 13, 11, 13, 3], [550, 463, 13, 11, 13, 3], [550, 514, 13, 11, 13, 3], [550, 566, 10, 10, 10, 4], [550, 617, 9, 10, 9, 4], [550, 667, 13, 11, 13, 3], [550, 721, 17, 8, 17, 6], [550, 772, 10, 8, 10, 6], [611, 4, 12, 11, 12, 3], [611, 55, 8, 11, 8, 3], [611, 106, 13, 11, 13, 3], [611, 157, 13, 11, 13, 3], [611, 208, 13, 11, 13, 3], [611, 259, 13, 11, 13, 3], [611, 310, 13, 11, 13, 3], [611, 365, 12, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 468, 13, 6, 13, 8], [611, 519, 13, 6, 13, 8], [611, 562, 15, 14, 15, 0], [611, 613, 15, 14, 15, 0], [611, 664, 15, 14, 15, 0], [611, 718, 19, 11, 19, 3], [611, 772, 18, 8, 18, 6], [672, 9, 10, 6, 10, 8], [672, 60, 12, 6, 12, 8], [672, 107, 10, 10, 10, 4], [672, 158, 10, 10, 10, 4], [672, 209, 7, 10, 7, 4], [672, 260, 7, 10, 7, 4], [672, 310, 13, 11, 13, 3], [672, 364, 12, 8, 12, 6], [672, 412, 13, 14, 13, 3], [1, 9, 7, 6, 7, 8], [794, 769, 13, 11, 13, 3], [672, 565, 13, 11, 13, 3], [672, 616, 13, 11, 13, 3], [672, 667, 13, 11, 13, 3], [672, 718, 13, 11, 13, 3], [672, 769, 13, 11, 13, 3], [733, 4, 13, 11, 13, 3], [733, 55, 13, 11, 13, 3], [733, 106, 13, 11, 13, 3], [733, 157, 13, 11, 13, 3], [733, 208, 13, 11, 13, 3], [733, 259, 13, 11, 13, 3], [733, 310, 13, 11, 13, 3], [733, 361, 13, 11, 13, 3], [733, 412, 13, 11, 13, 3], [733, 463, 13, 11, 13, 3], [733, 514, 13, 11, 13, 3], [733, 565, 13, 11, 13, 3], [733, 616, 13, 11, 13, 3], [733, 667, 13, 11, 13, 3], [733, 718, 13, 11, 13, 3], [733, 769, 13, 11, 13, 3], [1, 9, 7, 6, 7, 8], [794, 55, 13, 11, 13, 3], [794, 106, 13, 11, 13, 3], [794, 157, 13, 11, 13, 3], [794, 208, 13, 11, 13, 3], [794, 259, 13, 11, 13, 3], [794, 310, 13, 11, 13, 3], [794, 361, 13, 11, 13, 3], [794, 412, 13, 11, 13, 3], [794, 463, 13, 11, 13, 3], [794, 514, 13, 11, 13, 3], [794, 565, 13, 11, 13, 3], [794, 616, 13, 11, 13, 3], [794, 667, 13, 11, 13, 3], [794, 718, 13, 11, 13, 3], [794, 769, 13, 11, 13, 3], [855, 4, 13, 11, 13, 3], [855, 55, 13, 11, 13, 3], [855, 106, 13, 11, 13, 3], [855, 157, 13, 11, 13, 3], [855, 208, 13, 11, 13, 3], [855, 259, 13, 11, 13, 3], [855, 310, 13, 11, 13, 3], [855, 361, 13, 11, 13, 3], [855, 412, 13, 11, 13, 3], [855, 463, 13, 11, 13, 3], [855, 514, 13, 11, 13, 3], [855, 565, 13, 11, 13, 3], [855, 616, 13, 11, 13, 3], [855, 667, 13, 11, 13, 3], [855, 718, 13, 11, 13, 3], [855, 769, 13, 11, 13, 3]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 17, 16, 11, 3], [1, 106, 20, 5, 15, 3], [1, 157, 22, 10, 17, 3], [1, 206, 22, 20, 17, 1], [1, 259, 23, 16, 21, 3], [1, 310, 23, 16, 21, 3], [1, 361, 16, 5, 11, 3], [1, 410, 20, 20, 13, 1], [1, 461, 18, 20, 13, 1], [1, 514, 20, 10, 13, 3], [1, 570, 18, 9, 17, 8], [1, 628, 11, 6, 11, 15], [1, 675, 17, 3, 15, 11], [1, 730, 11, 4, 11, 15], [1, 769, 21, 16, 15, 3], [62, 4, 22, 16, 17, 3], [62, 55, 20, 16, 17, 3], [62, 106, 22, 16, 17, 3], [62, 157, 22, 17, 17, 3], [62, 208, 22, 16, 17, 3], [62, 259, 22, 18, 17, 3], [62, 309, 23, 17, 17, 2], [62, 361, 23, 16, 17, 3], [62, 412, 21, 16, 17, 3], [62, 463, 22, 17, 17, 3], [62, 519, 15, 11, 11, 8], [62, 570, 15, 13, 11, 8], [62, 621, 17, 11, 13, 8], [62, 674, 18, 5, 15, 10], [62, 723, 16, 11, 13, 8], [62, 769, 20, 16, 15, 3], [123, 8, 23, 13, 21, 7], [123, 55, 21, 16, 21, 3], [123, 106, 23, 16, 17, 3], [123, 157, 24, 16, 17, 3], [123, 208, 23, 16, 19, 3], [123, 259, 24, 16, 17, 3], [123, 310, 24, 16, 17, 3], [123, 361, 24, 16, 17, 3], [123, 412, 26, 16, 19, 3], [123, 463, 19, 16, 13, 3], [123, 514, 22, 20, 15, 3], [123, 565, 24, 16, 19, 3], [123, 616, 19, 16, 17, 3], [123, 667, 28, 16, 21, 3], [123, 718, 25, 16, 19, 3], [123, 769, 23, 16, 19, 3], [184, 4, 23, 16, 17, 3], [184, 55, 23, 19, 19, 3], [184, 106, 22, 16, 17, 3], [184, 157, 22, 16, 15, 3], [184, 208, 24, 16, 17, 3], [184, 259, 25, 16, 19, 3], [184, 310, 25, 16, 19, 3], [184, 361, 30, 16, 23, 3], [184, 412, 24, 16, 17, 3], [184, 463, 24, 16, 17, 3], [184, 514, 22, 16, 15, 3], [184, 563, 18, 20, 11, 1], [184, 616, 15, 16, 15, 3], [184, 665, 18, 20, 11, 1], [184, 718, 19, 5, 13, 3], [184, 782, 19, 3, 17, 16], [245, 4, 16, 5, 11, 3], [245, 59, 19, 12, 15, 7], [245, 106, 20, 16, 17, 3], [245, 161, 19, 12, 15, 7], [245, 208, 22, 16, 17, 3], [245, 263, 19, 12, 15, 7], [245, 310, 20, 16, 13, 3], [245, 365, 20, 15, 15, 7], [245, 412, 20, 16, 17, 3], [245, 463, 18, 16, 13, 3], [245, 514, 17, 20, 11, 3], [245, 565, 21, 16, 17, 3], [245, 616, 18, 16, 13, 3], [245, 671, 25, 12, 21, 7], [245, 722, 20, 12, 17, 7], [245, 773, 19, 12, 15, 7], [306, 8, 20, 15, 17, 7], [306, 59, 20, 15, 17, 7], [306, 110, 20, 12, 15, 7], [306, 161, 19, 12, 15, 7], [306, 210, 17, 14, 13, 5], [306, 263, 21, 12, 17, 7], [306, 314, 20, 12, 15, 7], [306, 365, 24, 12, 19, 7], [306, 416, 22, 12, 17, 7], [306, 467, 22, 15, 17, 7], [306, 518, 20, 12, 15, 7], [306, 563, 20, 20, 13, 1], [306, 614, 16, 20, 9, 1], [306, 665, 18, 20, 13, 1], [306, 718, 20, 4, 13, 3], [306, 766, 1, 1, 3, 1], [367, 2, 24, 18, 21, 1], [367, 52, 24, 19, 21, 0], [367, 106, 23, 19, 17, 3], [367, 154, 24, 19, 17, 0], [367, 205, 25, 19, 19, 0], [367, 257, 23, 18, 19, 1], [367, 308, 25, 18, 19, 1], [367, 361, 20, 16, 15, 3], [367, 412, 19, 16, 15, 3], [367, 463, 19, 16, 15, 3], [367, 515, 20, 15, 15, 4], [367, 566, 21, 15, 15, 4], [367, 615, 20, 17, 15, 2], [367, 671, 19, 15, 15, 7], [367, 718, 20, 16, 15, 3], [367, 769, 19, 16, 15, 3], [428, 4, 20, 16, 15, 3], [428, 56, 20, 15, 15, 4], [428, 106, 19, 16, 13, 3], [428, 157, 17, 16, 13, 3], [428, 208, 18, 16, 13, 3], [428, 260, 19, 15, 13, 4], [428, 311, 22, 15, 17, 4], [428, 361, 20, 16, 15, 3], [428, 412, 19, 16, 15, 3], [428, 463, 19, 16, 15, 3], [428, 515, 20, 15, 15, 4], [428, 566, 21, 15, 15, 4], [428, 616, 21, 16, 17, 3], [428, 667, 21, 16, 17, 3], [428, 718, 21, 16, 17, 3], [428, 770, 21, 15, 17, 4], [489, 3, 18, 8, 13, 2], [489, 55, 19, 6, 13, 3], [489, 108, 21, 16, 17, 5], [489, 157, 21, 16, 17, 3], [489, 208, 21, 16, 15, 3], [489, 263, 18, 8, 13, 7], [489, 310, 26, 16, 19, 3], [489, 361, 21, 16, 15, 3], [489, 417, 20, 11, 17, 8], [489, 468, 20, 11, 17, 8], [489, 514, 23, 6, 17, 3], [489, 565, 17, 5, 11, 3], [489, 616, 19, 3, 13, 3], [489, 667, 28, 17, 22, 3], [489, 718, 29, 16, 23, 3], [489, 769, 25, 16, 19, 3], [550, 4, 28, 17, 22, 3], [550, 55, 28, 17, 22, 3], [550, 106, 28, 17, 22, 3], [550, 157, 28, 17, 22, 3], [550, 208, 24, 16, 17, 3], [550, 259, 28, 17, 22, 3], [550, 310, 28, 17, 22, 3], [550, 361, 28, 17, 22, 3], [550, 412, 28, 17, 22, 3], [550, 463, 28, 17, 22, 3], [550, 514, 28, 17, 22, 3], [550, 565, 20, 12, 15, 3], [550, 616, 20, 12, 15, 3], [550, 667, 28, 17, 22, 3], [550, 722, 24, 12, 21, 7], [550, 773, 21, 12, 15, 7], [611, 4, 19, 16, 15, 3], [611, 55, 17, 16, 11, 3], [611, 106, 28, 17, 22, 3], [611, 157, 28, 17, 22, 3], [611, 208, 28, 17, 22, 3], [611, 259, 28, 17, 22, 3], [611, 310, 28, 17, 22, 3], [611, 366, 21, 11, 17, 8], [611, 417, 20, 11, 17, 8], [611, 475, 21, 4, 21, 15], [611, 511, 1, 1, 17, 1], [611, 562, 23, 19, 21, 0], [611, 613, 26, 19, 21, 0], [611, 664, 24, 19, 19, 0], [611, 718, 31, 16, 25, 3], [611, 773, 25, 12, 21, 7], [672, 12, 17, 3, 14, 11], [672, 63, 20, 3, 17, 11], [672, 106, 21, 6, 15, 3], [672, 157, 21, 6, 15, 3], [672, 208, 17, 6, 11, 3], [672, 259, 17, 6, 11, 3], [672, 310, 28, 17, 22, 3], [672, 362, 25, 15, 23, 4], [672, 413, 22, 18, 17, 4], [1, 1, 1, 1, 11, 1], [794, 769, 28, 17, 22, 3], [672, 565, 28, 17, 22, 3], [672, 616, 28, 17, 22, 3], [672, 667, 28, 17, 22, 3], [672, 718, 28, 17, 22, 3], [672, 769, 28, 17, 22, 3], [733, 4, 28, 17, 22, 3], [733, 55, 28, 17, 22, 3], [733, 106, 28, 17, 22, 3], [733, 157, 28, 17, 22, 3], [733, 208, 28, 17, 22, 3], [733, 259, 28, 17, 22, 3], [733, 310, 28, 17, 22, 3], [733, 361, 28, 17, 22, 3], [733, 412, 28, 17, 22, 3], [733, 463, 28, 17, 22, 3], [733, 514, 28, 17, 22, 3], [733, 565, 28, 17, 22, 3], [733, 616, 28, 17, 22, 3], [733, 667, 28, 17, 22, 3], [733, 718, 28, 17, 22, 3], [733, 769, 28, 17, 22, 3], [1, 1, 1, 1, 11, 1], [794, 55, 28, 17, 22, 3], [794, 106, 28, 17, 22, 3], [794, 157, 28, 17, 22, 3], [794, 208, 28, 17, 22, 3], [794, 259, 28, 17, 22, 3], [794, 310, 28, 17, 22, 3], [794, 361, 28, 17, 22, 3], [794, 412, 28, 17, 22, 3], [794, 463, 28, 17, 22, 3], [794, 514, 28, 17, 22, 3], [794, 565, 28, 17, 22, 3], [794, 616, 28, 17, 22, 3], [794, 667, 28, 17, 22, 3], [794, 718, 28, 17, 22, 3], [794, 769, 28, 17, 22, 3], [855, 4, 28, 17, 22, 3], [855, 55, 28, 17, 22, 3], [855, 106, 28, 17, 22, 3], [855, 157, 28, 17, 22, 3], [855, 208, 28, 17, 22, 3], [855, 259, 28, 17, 22, 3], [855, 310, 28, 17, 22, 3], [855, 361, 28, 17, 22, 3], [855, 412, 28, 17, 22, 3], [855, 463, 28, 17, 22, 3], [855, 514, 28, 17, 22, 3], [855, 565, 28, 17, 22, 3], [855, 616, 28, 17, 22, 3], [855, 667, 28, 17, 22, 3], [855, 718, 28, 17, 22, 3], [855, 769, 28, 17, 22, 3]], \"capHeight\": 18, \"widestlogicalchar\": 25, \"widestglyph\": 31, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 16, 14, 10, 3], [1, 106, 19, 3, 14, 3], [1, 157, 21, 8, 16, 3], [1, 206, 21, 18, 16, 1], [1, 259, 22, 14, 20, 3], [1, 310, 22, 14, 20, 3], [1, 361, 15, 3, 10, 3], [1, 410, 19, 18, 12, 1], [1, 461, 17, 18, 12, 1], [1, 514, 19, 8, 12, 3], [1, 570, 17, 7, 16, 8], [1, 628, 10, 4, 10, 15], [1, 675, 16, 1, 14, 11], [1, 730, 10, 2, 10, 15], [1, 769, 20, 14, 14, 3], [62, 4, 21, 14, 16, 3], [62, 55, 19, 14, 16, 3], [62, 106, 21, 14, 16, 3], [62, 157, 21, 15, 16, 3], [62, 208, 21, 14, 16, 3], [62, 259, 21, 16, 16, 3], [62, 309, 22, 15, 16, 2], [62, 361, 22, 14, 16, 3], [62, 412, 20, 14, 16, 3], [62, 463, 21, 15, 16, 3], [62, 519, 14, 9, 10, 8], [62, 570, 14, 11, 10, 8], [62, 621, 16, 9, 12, 8], [62, 674, 17, 3, 14, 10], [62, 723, 15, 9, 12, 8], [62, 769, 19, 14, 14, 3], [123, 8, 22, 11, 20, 7], [123, 55, 20, 14, 20, 3], [123, 106, 22, 14, 16, 3], [123, 157, 23, 14, 16, 3], [123, 208, 22, 14, 18, 3], [123, 259, 23, 14, 16, 3], [123, 310, 23, 14, 16, 3], [123, 361, 23, 14, 16, 3], [123, 412, 25, 14, 18, 3], [123, 463, 18, 14, 12, 3], [123, 514, 21, 18, 14, 3], [123, 565, 23, 14, 18, 3], [123, 616, 18, 14, 16, 3], [123, 667, 27, 14, 20, 3], [123, 718, 24, 14, 18, 3], [123, 769, 22, 14, 18, 3], [184, 4, 22, 14, 16, 3], [184, 55, 22, 17, 18, 3], [184, 106, 21, 14, 16, 3], [184, 157, 21, 14, 14, 3], [184, 208, 23, 14, 16, 3], [184, 259, 24, 14, 18, 3], [184, 310, 24, 14, 18, 3], [184, 361, 29, 14, 22, 3], [184, 412, 23, 14, 16, 3], [184, 463, 23, 14, 16, 3], [184, 514, 21, 14, 14, 3], [184, 563, 17, 18, 10, 1], [184, 616, 14, 14, 14, 3], [184, 665, 17, 18, 10, 1], [184, 718, 18, 3, 12, 3], [184, 782, 18, 1, 16, 16], [245, 4, 15, 3, 10, 3], [245, 59, 18, 10, 14, 7], [245, 106, 19, 14, 16, 3], [245, 161, 18, 10, 14, 7], [245, 208, 21, 14, 16, 3], [245, 263, 18, 10, 14, 7], [245, 310, 19, 14, 12, 3], [245, 365, 19, 13, 14, 7], [245, 412, 19, 14, 16, 3], [245, 463, 17, 14, 12, 3], [245, 514, 16, 18, 10, 3], [245, 565, 20, 14, 16, 3], [245, 616, 17, 14, 12, 3], [245, 671, 24, 10, 20, 7], [245, 722, 19, 10, 16, 7], [245, 773, 18, 10, 14, 7], [306, 8, 19, 13, 16, 7], [306, 59, 19, 13, 16, 7], [306, 110, 19, 10, 14, 7], [306, 161, 18, 10, 14, 7], [306, 210, 16, 12, 12, 5], [306, 263, 20, 10, 16, 7], [306, 314, 19, 10, 14, 7], [306, 365, 23, 10, 18, 7], [306, 416, 21, 10, 16, 7], [306, 467, 21, 13, 16, 7], [306, 518, 19, 10, 14, 7], [306, 563, 19, 18, 12, 1], [306, 614, 15, 18, 8, 1], [306, 665, 17, 18, 12, 1], [306, 718, 19, 2, 12, 3], [306, 766, 1, 1, 3, 1], [367, 2, 23, 16, 20, 1], [367, 52, 23, 17, 20, 0], [367, 106, 22, 17, 16, 3], [367, 154, 23, 17, 16, 0], [367, 205, 24, 17, 18, 0], [367, 257, 22, 16, 18, 1], [367, 308, 24, 16, 18, 1], [367, 361, 19, 14, 14, 3], [367, 412, 18, 14, 14, 3], [367, 463, 18, 14, 14, 3], [367, 515, 19, 13, 14, 4], [367, 566, 20, 13, 14, 4], [367, 615, 19, 15, 14, 2], [367, 671, 18, 13, 14, 7], [367, 718, 19, 14, 14, 3], [367, 769, 18, 14, 14, 3], [428, 4, 19, 14, 14, 3], [428, 56, 19, 13, 14, 4], [428, 106, 18, 14, 12, 3], [428, 157, 16, 14, 12, 3], [428, 208, 17, 14, 12, 3], [428, 260, 18, 13, 12, 4], [428, 311, 21, 13, 16, 4], [428, 361, 19, 14, 14, 3], [428, 412, 18, 14, 14, 3], [428, 463, 18, 14, 14, 3], [428, 515, 19, 13, 14, 4], [428, 566, 20, 13, 14, 4], [428, 616, 20, 14, 16, 3], [428, 667, 20, 14, 16, 3], [428, 718, 20, 14, 16, 3], [428, 770, 20, 13, 16, 4], [489, 3, 17, 6, 12, 2], [489, 55, 18, 4, 12, 3], [489, 108, 20, 14, 16, 5], [489, 157, 20, 14, 16, 3], [489, 208, 20, 14, 14, 3], [489, 263, 17, 6, 12, 7], [489, 310, 25, 14, 18, 3], [489, 361, 20, 14, 14, 3], [489, 417, 19, 9, 16, 8], [489, 468, 19, 9, 16, 8], [489, 514, 22, 4, 16, 3], [489, 565, 16, 3, 10, 3], [489, 616, 18, 1, 12, 3], [489, 667, 27, 15, 21, 3], [489, 718, 28, 14, 22, 3], [489, 769, 24, 14, 18, 3], [550, 4, 27, 15, 21, 3], [550, 55, 27, 15, 21, 3], [550, 106, 27, 15, 21, 3], [550, 157, 27, 15, 21, 3], [550, 208, 23, 14, 16, 3], [550, 259, 27, 15, 21, 3], [550, 310, 27, 15, 21, 3], [550, 361, 27, 15, 21, 3], [550, 412, 27, 15, 21, 3], [550, 463, 27, 15, 21, 3], [550, 514, 27, 15, 21, 3], [550, 565, 19, 10, 14, 3], [550, 616, 19, 10, 14, 3], [550, 667, 27, 15, 21, 3], [550, 722, 23, 10, 20, 7], [550, 773, 20, 10, 14, 7], [611, 4, 18, 14, 14, 3], [611, 55, 16, 14, 10, 3], [611, 106, 27, 15, 21, 3], [611, 157, 27, 15, 21, 3], [611, 208, 27, 15, 21, 3], [611, 259, 27, 15, 21, 3], [611, 310, 27, 15, 21, 3], [611, 366, 20, 9, 16, 8], [611, 417, 19, 9, 16, 8], [611, 475, 20, 2, 20, 15], [611, 511, 1, 1, 16, 1], [611, 562, 22, 17, 20, 0], [611, 613, 23, 17, 20, 0], [611, 664, 22, 17, 18, 0], [611, 718, 30, 14, 24, 3], [611, 773, 24, 10, 20, 7], [672, 12, 16, 1, 13, 11], [672, 63, 19, 1, 16, 11], [672, 106, 20, 4, 14, 3], [672, 157, 20, 4, 14, 3], [672, 208, 16, 4, 10, 3], [672, 259, 16, 4, 10, 3], [672, 310, 27, 15, 21, 3], [672, 362, 24, 13, 22, 4], [672, 413, 21, 16, 16, 4], [1, 1, 1, 1, 10, 1], [794, 769, 27, 15, 21, 3], [672, 565, 27, 15, 21, 3], [672, 616, 27, 15, 21, 3], [672, 667, 27, 15, 21, 3], [672, 718, 27, 15, 21, 3], [672, 769, 27, 15, 21, 3], [733, 4, 27, 15, 21, 3], [733, 55, 27, 15, 21, 3], [733, 106, 27, 15, 21, 3], [733, 157, 27, 15, 21, 3], [733, 208, 27, 15, 21, 3], [733, 259, 27, 15, 21, 3], [733, 310, 27, 15, 21, 3], [733, 361, 27, 15, 21, 3], [733, 412, 27, 15, 21, 3], [733, 463, 27, 15, 21, 3], [733, 514, 27, 15, 21, 3], [733, 565, 27, 15, 21, 3], [733, 616, 27, 15, 21, 3], [733, 667, 27, 15, 21, 3], [733, 718, 27, 15, 21, 3], [733, 769, 27, 15, 21, 3], [1, 1, 1, 1, 10, 1], [794, 55, 27, 15, 21, 3], [794, 106, 27, 15, 21, 3], [794, 157, 27, 15, 21, 3], [794, 208, 27, 15, 21, 3], [794, 259, 27, 15, 21, 3], [794, 310, 27, 15, 21, 3], [794, 361, 27, 15, 21, 3], [794, 412, 27, 15, 21, 3], [794, 463, 27, 15, 21, 3], [794, 514, 27, 15, 21, 3], [794, 565, 27, 15, 21, 3], [794, 616, 27, 15, 21, 3], [794, 667, 27, 15, 21, 3], [794, 718, 27, 15, 21, 3], [794, 769, 27, 15, 21, 3], [855, 4, 27, 15, 21, 3], [855, 55, 27, 15, 21, 3], [855, 106, 27, 15, 21, 3], [855, 157, 27, 15, 21, 3], [855, 208, 27, 15, 21, 3], [855, 259, 27, 15, 21, 3], [855, 310, 27, 15, 21, 3], [855, 361, 27, 15, 21, 3], [855, 412, 27, 15, 21, 3], [855, 463, 27, 15, 21, 3], [855, 514, 27, 15, 21, 3], [855, 565, 27, 15, 21, 3], [855, 616, 27, 15, 21, 3], [855, 667, 27, 15, 21, 3], [855, 718, 27, 15, 21, 3], [855, 769, 27, 15, 21, 3]], \"capHeight\": 17, \"widestlogicalchar\": 24, \"widestglyph\": 30, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 11, 6, 11, 12], [1, 55, 11, 16, 11, 3], [1, 106, 15, 15, 15, 3], [1, 157, 17, 15, 17, 3], [1, 206, 17, 20, 17, 1], [1, 259, 21, 16, 21, 3], [1, 310, 21, 16, 21, 3], [1, 361, 11, 15, 11, 3], [1, 410, 13, 20, 13, 1], [1, 461, 13, 20, 13, 1], [1, 514, 13, 15, 13, 3], [1, 570, 17, 10, 17, 8], [1, 625, 11, 9, 11, 12], [1, 675, 15, 7, 15, 11], [1, 727, 11, 7, 11, 12], [1, 769, 15, 16, 15, 3], [62, 4, 17, 16, 17, 3], [62, 55, 17, 16, 17, 3], [62, 106, 17, 16, 17, 3], [62, 157, 17, 17, 17, 3], [62, 208, 17, 16, 17, 3], [62, 259, 17, 18, 17, 3], [62, 309, 17, 17, 17, 2], [62, 361, 17, 16, 17, 3], [62, 412, 17, 16, 17, 3], [62, 463, 17, 17, 17, 3], [62, 519, 11, 11, 11, 8], [62, 570, 11, 13, 11, 8], [62, 621, 13, 11, 13, 8], [62, 674, 15, 8, 15, 10], [62, 723, 13, 11, 13, 8], [62, 769, 15, 16, 15, 3], [123, 8, 21, 13, 21, 7], [123, 55, 21, 16, 21, 3], [123, 106, 17, 16, 17, 3], [123, 157, 17, 16, 17, 3], [123, 208, 19, 16, 19, 3], [123, 259, 17, 16, 17, 3], [123, 310, 17, 16, 17, 3], [123, 361, 17, 16, 17, 3], [123, 412, 19, 16, 19, 3], [123, 463, 13, 16, 13, 3], [123, 514, 15, 20, 15, 3], [123, 565, 19, 16, 19, 3], [123, 616, 17, 16, 17, 3], [123, 667, 21, 16, 21, 3], [123, 718, 19, 16, 19, 3], [123, 769, 19, 16, 19, 3], [184, 4, 17, 16, 17, 3], [184, 55, 19, 19, 19, 3], [184, 106, 17, 16, 17, 3], [184, 157, 15, 16, 15, 3], [184, 208, 17, 16, 17, 3], [184, 259, 19, 16, 19, 3], [184, 310, 19, 16, 19, 3], [184, 361, 23, 16, 23, 3], [184, 412, 17, 16, 17, 3], [184, 463, 17, 16, 17, 3], [184, 514, 15, 16, 15, 3], [184, 563, 11, 20, 11, 1], [184, 616, 15, 16, 15, 3], [184, 665, 11, 20, 11, 1], [184, 718, 13, 15, 13, 3], [184, 778, 17, 7, 17, 12], [245, 4, 11, 15, 11, 3], [245, 59, 15, 12, 15, 7], [245, 106, 17, 16, 17, 3], [245, 161, 15, 12, 15, 7], [245, 208, 17, 16, 17, 3], [245, 263, 15, 12, 15, 7], [245, 310, 13, 16, 13, 3], [245, 365, 15, 15, 15, 7], [245, 412, 17, 16, 17, 3], [245, 463, 13, 16, 13, 3], [245, 514, 11, 20, 11, 3], [245, 565, 17, 16, 17, 3], [245, 616, 13, 16, 13, 3], [245, 671, 21, 12, 21, 7], [245, 722, 17, 12, 17, 7], [245, 773, 15, 12, 15, 7], [306, 8, 17, 15, 17, 7], [306, 59, 17, 15, 17, 7], [306, 110, 15, 12, 15, 7], [306, 161, 15, 12, 15, 7], [306, 210, 13, 14, 13, 5], [306, 263, 17, 12, 17, 7], [306, 314, 15, 12, 15, 7], [306, 365, 19, 12, 19, 7], [306, 416, 17, 12, 17, 7], [306, 467, 17, 15, 17, 7], [306, 518, 15, 12, 15, 7], [306, 563, 13, 20, 13, 1], [306, 614, 9, 20, 9, 1], [306, 665, 13, 20, 13, 1], [306, 718, 13, 15, 13, 3], [306, 778, 3, 6, 3, 12], [367, 2, 21, 18, 21, 1], [367, 52, 21, 19, 21, 0], [367, 106, 17, 19, 17, 3], [367, 154, 17, 19, 17, 0], [367, 205, 19, 19, 19, 0], [367, 257, 19, 18, 19, 1], [367, 308, 19, 18, 19, 1], [367, 361, 15, 16, 15, 3], [367, 412, 15, 16, 15, 3], [367, 463, 15, 16, 15, 3], [367, 515, 15, 15, 15, 4], [367, 566, 15, 15, 15, 4], [367, 615, 15, 17, 15, 2], [367, 671, 15, 15, 15, 7], [367, 718, 15, 16, 15, 3], [367, 769, 15, 16, 15, 3], [428, 4, 15, 16, 15, 3], [428, 56, 15, 15, 15, 4], [428, 106, 13, 16, 13, 3], [428, 157, 13, 16, 13, 3], [428, 208, 13, 16, 13, 3], [428, 260, 13, 15, 13, 4], [428, 311, 17, 15, 17, 4], [428, 361, 15, 16, 15, 3], [428, 412, 15, 16, 15, 3], [428, 463, 15, 16, 15, 3], [428, 515, 15, 15, 15, 4], [428, 566, 15, 15, 15, 4], [428, 616, 17, 16, 17, 3], [428, 667, 17, 16, 17, 3], [428, 718, 17, 16, 17, 3], [428, 770, 17, 15, 17, 4], [489, 3, 13, 16, 13, 2], [489, 55, 13, 15, 13, 3], [489, 108, 17, 16, 17, 5], [489, 157, 17, 16, 17, 3], [489, 208, 15, 16, 15, 3], [489, 263, 13, 11, 13, 7], [489, 310, 19, 16, 19, 3], [489, 361, 15, 16, 15, 3], [489, 417, 17, 11, 17, 8], [489, 468, 17, 11, 17, 8], [489, 514, 17, 15, 17, 3], [489, 565, 11, 15, 11, 3], [489, 616, 13, 15, 13, 3], [489, 667, 22, 17, 22, 3], [489, 718, 23, 16, 23, 3], [489, 769, 19, 16, 19, 3], [550, 4, 22, 17, 22, 3], [550, 55, 22, 17, 22, 3], [550, 106, 22, 17, 22, 3], [550, 157, 22, 17, 22, 3], [550, 208, 17, 16, 17, 3], [550, 259, 22, 17, 22, 3], [550, 310, 22, 17, 22, 3], [550, 361, 22, 17, 22, 3], [550, 412, 22, 17, 22, 3], [550, 463, 22, 17, 22, 3], [550, 514, 22, 17, 22, 3], [550, 565, 15, 15, 15, 3], [550, 616, 15, 15, 15, 3], [550, 667, 22, 17, 22, 3], [550, 722, 21, 12, 21, 7], [550, 773, 15, 12, 15, 7], [611, 4, 15, 16, 15, 3], [611, 55, 11, 16, 11, 3], [611, 106, 22, 17, 22, 3], [611, 157, 22, 17, 22, 3], [611, 208, 22, 17, 22, 3], [611, 259, 22, 17, 22, 3], [611, 310, 22, 17, 22, 3], [611, 366, 17, 11, 17, 8], [611, 417, 17, 11, 17, 8], [611, 472, 21, 7, 21, 12], [611, 523, 17, 6, 17, 12], [611, 562, 21, 19, 21, 0], [611, 613, 21, 19, 21, 0], [611, 664, 19, 19, 19, 0], [611, 718, 25, 16, 25, 3], [611, 773, 21, 12, 21, 7], [672, 12, 14, 7, 14, 11], [672, 63, 17, 7, 17, 11], [672, 106, 15, 15, 15, 3], [672, 157, 15, 15, 15, 3], [672, 208, 11, 15, 11, 3], [672, 259, 11, 15, 11, 3], [672, 310, 22, 17, 22, 3], [672, 362, 23, 15, 23, 4], [672, 413, 17, 18, 17, 4], [1, 13, 11, 6, 11, 12], [794, 769, 22, 17, 22, 3], [672, 565, 22, 17, 22, 3], [672, 616, 22, 17, 22, 3], [672, 667, 22, 17, 22, 3], [672, 718, 22, 17, 22, 3], [672, 769, 22, 17, 22, 3], [733, 4, 22, 17, 22, 3], [733, 55, 22, 17, 22, 3], [733, 106, 22, 17, 22, 3], [733, 157, 22, 17, 22, 3], [733, 208, 22, 17, 22, 3], [733, 259, 22, 17, 22, 3], [733, 310, 22, 17, 22, 3], [733, 361, 22, 17, 22, 3], [733, 412, 22, 17, 22, 3], [733, 463, 22, 17, 22, 3], [733, 514, 22, 17, 22, 3], [733, 565, 22, 17, 22, 3], [733, 616, 22, 17, 22, 3], [733, 667, 22, 17, 22, 3], [733, 718, 22, 17, 22, 3], [733, 769, 22, 17, 22, 3], [1, 13, 11, 6, 11, 12], [794, 55, 22, 17, 22, 3], [794, 106, 22, 17, 22, 3], [794, 157, 22, 17, 22, 3], [794, 208, 22, 17, 22, 3], [794, 259, 22, 17, 22, 3], [794, 310, 22, 17, 22, 3], [794, 361, 22, 17, 22, 3], [794, 412, 22, 17, 22, 3], [794, 463, 22, 17, 22, 3], [794, 514, 22, 17, 22, 3], [794, 565, 22, 17, 22, 3], [794, 616, 22, 17, 22, 3], [794, 667, 22, 17, 22, 3], [794, 718, 22, 17, 22, 3], [794, 769, 22, 17, 22, 3], [855, 4, 22, 17, 22, 3], [855, 55, 22, 17, 22, 3], [855, 106, 22, 17, 22, 3], [855, 157, 22, 17, 22, 3], [855, 208, 22, 17, 22, 3], [855, 259, 22, 17, 22, 3], [855, 310, 22, 17, 22, 3], [855, 361, 22, 17, 22, 3], [855, 412, 22, 17, 22, 3], [855, 463, 22, 17, 22, 3], [855, 514, 22, 17, 22, 3], [855, 565, 22, 17, 22, 3], [855, 616, 22, 17, 22, 3], [855, 667, 22, 17, 22, 3], [855, 718, 22, 17, 22, 3], [855, 769, 22, 17, 22, 3]], \"widestlogicalchar\": 25, \"widestglyph\": 25, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 17, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 12, 10, 6, 10, 11], [1, 55, 10, 14, 10, 3], [1, 106, 14, 14, 14, 3], [1, 157, 16, 14, 16, 3], [1, 206, 16, 18, 16, 1], [1, 259, 20, 14, 20, 3], [1, 310, 20, 14, 20, 3], [1, 361, 10, 14, 10, 3], [1, 410, 12, 18, 12, 1], [1, 461, 12, 18, 12, 1], [1, 514, 12, 14, 12, 3], [1, 570, 16, 9, 16, 8], [1, 624, 10, 8, 10, 11], [1, 675, 14, 6, 14, 11], [1, 726, 10, 6, 10, 11], [1, 769, 14, 14, 14, 3], [62, 4, 16, 14, 16, 3], [62, 55, 16, 14, 16, 3], [62, 106, 16, 14, 16, 3], [62, 157, 16, 15, 16, 3], [62, 208, 16, 14, 16, 3], [62, 259, 16, 16, 16, 3], [62, 309, 16, 15, 16, 2], [62, 361, 16, 14, 16, 3], [62, 412, 16, 14, 16, 3], [62, 463, 16, 15, 16, 3], [62, 519, 10, 9, 10, 8], [62, 570, 10, 11, 10, 8], [62, 621, 12, 9, 12, 8], [62, 674, 14, 7, 14, 10], [62, 723, 12, 9, 12, 8], [62, 769, 14, 14, 14, 3], [123, 8, 20, 11, 20, 7], [123, 55, 20, 14, 20, 3], [123, 106, 16, 14, 16, 3], [123, 157, 16, 14, 16, 3], [123, 208, 18, 14, 18, 3], [123, 259, 16, 14, 16, 3], [123, 310, 16, 14, 16, 3], [123, 361, 16, 14, 16, 3], [123, 412, 18, 14, 18, 3], [123, 463, 12, 14, 12, 3], [123, 514, 14, 18, 14, 3], [123, 565, 18, 14, 18, 3], [123, 616, 16, 14, 16, 3], [123, 667, 20, 14, 20, 3], [123, 718, 18, 14, 18, 3], [123, 769, 18, 14, 18, 3], [184, 4, 16, 14, 16, 3], [184, 55, 18, 17, 18, 3], [184, 106, 16, 14, 16, 3], [184, 157, 14, 14, 14, 3], [184, 208, 16, 14, 16, 3], [184, 259, 18, 14, 18, 3], [184, 310, 18, 14, 18, 3], [184, 361, 22, 14, 22, 3], [184, 412, 16, 14, 16, 3], [184, 463, 16, 14, 16, 3], [184, 514, 14, 14, 14, 3], [184, 563, 10, 18, 10, 1], [184, 616, 14, 14, 14, 3], [184, 665, 10, 18, 10, 1], [184, 718, 12, 14, 12, 3], [184, 777, 16, 6, 16, 11], [245, 4, 10, 14, 10, 3], [245, 59, 14, 10, 14, 7], [245, 106, 16, 14, 16, 3], [245, 161, 14, 10, 14, 7], [245, 208, 16, 14, 16, 3], [245, 263, 14, 10, 14, 7], [245, 310, 12, 14, 12, 3], [245, 365, 14, 13, 14, 7], [245, 412, 16, 14, 16, 3], [245, 463, 12, 14, 12, 3], [245, 514, 10, 18, 10, 3], [245, 565, 16, 14, 16, 3], [245, 616, 12, 14, 12, 3], [245, 671, 20, 10, 20, 7], [245, 722, 16, 10, 16, 7], [245, 773, 14, 10, 14, 7], [306, 8, 16, 13, 16, 7], [306, 59, 16, 13, 16, 7], [306, 110, 14, 10, 14, 7], [306, 161, 14, 10, 14, 7], [306, 210, 12, 12, 12, 5], [306, 263, 16, 10, 16, 7], [306, 314, 14, 10, 14, 7], [306, 365, 18, 10, 18, 7], [306, 416, 16, 10, 16, 7], [306, 467, 16, 13, 16, 7], [306, 518, 14, 10, 14, 7], [306, 563, 12, 18, 12, 1], [306, 614, 8, 18, 8, 1], [306, 665, 12, 18, 12, 1], [306, 718, 12, 14, 12, 3], [306, 777, 3, 6, 3, 11], [367, 2, 20, 16, 20, 1], [367, 52, 20, 17, 20, 0], [367, 106, 16, 17, 16, 3], [367, 154, 16, 17, 16, 0], [367, 205, 18, 17, 18, 0], [367, 257, 18, 16, 18, 1], [367, 308, 18, 16, 18, 1], [367, 361, 14, 14, 14, 3], [367, 412, 14, 14, 14, 3], [367, 463, 14, 14, 14, 3], [367, 515, 14, 13, 14, 4], [367, 566, 14, 13, 14, 4], [367, 615, 14, 15, 14, 2], [367, 671, 14, 13, 14, 7], [367, 718, 14, 14, 14, 3], [367, 769, 14, 14, 14, 3], [428, 4, 14, 14, 14, 3], [428, 56, 14, 13, 14, 4], [428, 106, 12, 14, 12, 3], [428, 157, 12, 14, 12, 3], [428, 208, 12, 14, 12, 3], [428, 260, 12, 13, 12, 4], [428, 311, 16, 13, 16, 4], [428, 361, 14, 14, 14, 3], [428, 412, 14, 14, 14, 3], [428, 463, 14, 14, 14, 3], [428, 515, 14, 13, 14, 4], [428, 566, 14, 13, 14, 4], [428, 616, 16, 14, 16, 3], [428, 667, 16, 14, 16, 3], [428, 718, 16, 14, 16, 3], [428, 770, 16, 13, 16, 4], [489, 3, 12, 15, 12, 2], [489, 55, 12, 14, 12, 3], [489, 108, 16, 14, 16, 5], [489, 157, 16, 14, 16, 3], [489, 208, 14, 14, 14, 3], [489, 263, 12, 10, 12, 7], [489, 310, 18, 14, 18, 3], [489, 361, 14, 14, 14, 3], [489, 417, 16, 9, 16, 8], [489, 468, 16, 9, 16, 8], [489, 514, 16, 14, 16, 3], [489, 565, 10, 14, 10, 3], [489, 616, 12, 14, 12, 3], [489, 667, 21, 15, 21, 3], [489, 718, 22, 14, 22, 3], [489, 769, 18, 14, 18, 3], [550, 4, 21, 15, 21, 3], [550, 55, 21, 15, 21, 3], [550, 106, 21, 15, 21, 3], [550, 157, 21, 15, 21, 3], [550, 208, 16, 14, 16, 3], [550, 259, 21, 15, 21, 3], [550, 310, 21, 15, 21, 3], [550, 361, 21, 15, 21, 3], [550, 412, 21, 15, 21, 3], [550, 463, 21, 15, 21, 3], [550, 514, 21, 15, 21, 3], [550, 565, 14, 14, 14, 3], [550, 616, 14, 14, 14, 3], [550, 667, 21, 15, 21, 3], [550, 722, 20, 10, 20, 7], [550, 773, 14, 10, 14, 7], [611, 4, 14, 14, 14, 3], [611, 55, 10, 14, 10, 3], [611, 106, 21, 15, 21, 3], [611, 157, 21, 15, 21, 3], [611, 208, 21, 15, 21, 3], [611, 259, 21, 15, 21, 3], [611, 310, 21, 15, 21, 3], [611, 366, 16, 9, 16, 8], [611, 417, 16, 9, 16, 8], [611, 471, 20, 6, 20, 11], [611, 522, 16, 6, 16, 11], [611, 562, 20, 17, 20, 0], [611, 613, 20, 17, 20, 0], [611, 664, 18, 17, 18, 0], [611, 718, 24, 14, 24, 3], [611, 773, 20, 10, 20, 7], [672, 12, 13, 6, 13, 11], [672, 63, 16, 6, 16, 11], [672, 106, 14, 14, 14, 3], [672, 157, 14, 14, 14, 3], [672, 208, 10, 14, 10, 3], [672, 259, 10, 14, 10, 3], [672, 310, 21, 15, 21, 3], [672, 362, 22, 13, 22, 4], [672, 413, 16, 16, 16, 4], [1, 12, 10, 6, 10, 11], [794, 769, 21, 15, 21, 3], [672, 565, 21, 15, 21, 3], [672, 616, 21, 15, 21, 3], [672, 667, 21, 15, 21, 3], [672, 718, 21, 15, 21, 3], [672, 769, 21, 15, 21, 3], [733, 4, 21, 15, 21, 3], [733, 55, 21, 15, 21, 3], [733, 106, 21, 15, 21, 3], [733, 157, 21, 15, 21, 3], [733, 208, 21, 15, 21, 3], [733, 259, 21, 15, 21, 3], [733, 310, 21, 15, 21, 3], [733, 361, 21, 15, 21, 3], [733, 412, 21, 15, 21, 3], [733, 463, 21, 15, 21, 3], [733, 514, 21, 15, 21, 3], [733, 565, 21, 15, 21, 3], [733, 616, 21, 15, 21, 3], [733, 667, 21, 15, 21, 3], [733, 718, 21, 15, 21, 3], [733, 769, 21, 15, 21, 3], [1, 12, 10, 6, 10, 11], [794, 55, 21, 15, 21, 3], [794, 106, 21, 15, 21, 3], [794, 157, 21, 15, 21, 3], [794, 208, 21, 15, 21, 3], [794, 259, 21, 15, 21, 3], [794, 310, 21, 15, 21, 3], [794, 361, 21, 15, 21, 3], [794, 412, 21, 15, 21, 3], [794, 463, 21, 15, 21, 3], [794, 514, 21, 15, 21, 3], [794, 565, 21, 15, 21, 3], [794, 616, 21, 15, 21, 3], [794, 667, 21, 15, 21, 3], [794, 718, 21, 15, 21, 3], [794, 769, 21, 15, 21, 3], [855, 4, 21, 15, 21, 3], [855, 55, 21, 15, 21, 3], [855, 106, 21, 15, 21, 3], [855, 157, 21, 15, 21, 3], [855, 208, 21, 15, 21, 3], [855, 259, 21, 15, 21, 3], [855, 310, 21, 15, 21, 3], [855, 361, 21, 15, 21, 3], [855, 412, 21, 15, 21, 3], [855, 463, 21, 15, 21, 3], [855, 514, 21, 15, 21, 3], [855, 565, 21, 15, 21, 3], [855, 616, 21, 15, 21, 3], [855, 667, 21, 15, 21, 3], [855, 718, 21, 15, 21, 3], [855, 769, 21, 15, 21, 3]], \"widestlogicalchar\": 24, \"widestglyph\": 24, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 16, 16, 10, 3], [1, 106, 19, 5, 14, 3], [1, 157, 21, 10, 16, 3], [1, 206, 21, 20, 16, 1], [1, 259, 22, 16, 20, 3], [1, 310, 22, 16, 20, 3], [1, 361, 15, 5, 10, 3], [1, 410, 19, 20, 12, 1], [1, 461, 17, 20, 12, 1], [1, 514, 19, 10, 12, 3], [1, 570, 17, 9, 16, 8], [1, 628, 10, 6, 10, 15], [1, 675, 16, 3, 14, 11], [1, 730, 10, 4, 10, 15], [1, 769, 20, 16, 14, 3], [62, 4, 21, 16, 16, 3], [62, 55, 19, 16, 16, 3], [62, 106, 21, 16, 16, 3], [62, 157, 21, 17, 16, 3], [62, 208, 21, 16, 16, 3], [62, 259, 21, 18, 16, 3], [62, 309, 22, 17, 16, 2], [62, 361, 22, 16, 16, 3], [62, 412, 20, 16, 16, 3], [62, 463, 21, 17, 16, 3], [62, 519, 14, 11, 10, 8], [62, 570, 14, 13, 10, 8], [62, 621, 16, 11, 12, 8], [62, 674, 17, 5, 14, 10], [62, 723, 15, 11, 12, 8], [62, 769, 19, 16, 14, 3], [123, 8, 22, 13, 20, 7], [123, 55, 20, 16, 20, 3], [123, 106, 22, 16, 16, 3], [123, 157, 23, 16, 16, 3], [123, 208, 22, 16, 18, 3], [123, 259, 23, 16, 16, 3], [123, 310, 23, 16, 16, 3], [123, 361, 23, 16, 16, 3], [123, 412, 25, 16, 18, 3], [123, 463, 18, 16, 12, 3], [123, 514, 21, 20, 14, 3], [123, 565, 23, 16, 18, 3], [123, 616, 18, 16, 16, 3], [123, 667, 27, 16, 20, 3], [123, 718, 24, 16, 18, 3], [123, 769, 22, 16, 18, 3], [184, 4, 22, 16, 16, 3], [184, 55, 22, 19, 18, 3], [184, 106, 21, 16, 16, 3], [184, 157, 21, 16, 14, 3], [184, 208, 23, 16, 16, 3], [184, 259, 24, 16, 18, 3], [184, 310, 24, 16, 18, 3], [184, 361, 29, 16, 22, 3], [184, 412, 23, 16, 16, 3], [184, 463, 23, 16, 16, 3], [184, 514, 21, 16, 14, 3], [184, 563, 17, 20, 10, 1], [184, 616, 14, 16, 14, 3], [184, 665, 17, 20, 10, 1], [184, 718, 18, 5, 12, 3], [184, 782, 18, 3, 16, 16], [245, 4, 15, 5, 10, 3], [245, 59, 18, 12, 14, 7], [245, 106, 19, 16, 16, 3], [245, 161, 18, 12, 14, 7], [245, 208, 21, 16, 16, 3], [245, 263, 18, 12, 14, 7], [245, 310, 19, 16, 12, 3], [245, 365, 19, 15, 14, 7], [245, 412, 19, 16, 16, 3], [245, 463, 17, 16, 12, 3], [245, 514, 16, 20, 10, 3], [245, 565, 20, 16, 16, 3], [245, 616, 17, 16, 12, 3], [245, 671, 24, 12, 20, 7], [245, 722, 19, 12, 16, 7], [245, 773, 18, 12, 14, 7], [306, 8, 19, 15, 16, 7], [306, 59, 19, 15, 16, 7], [306, 110, 19, 12, 14, 7], [306, 161, 18, 12, 14, 7], [306, 210, 16, 14, 12, 5], [306, 263, 20, 12, 16, 7], [306, 314, 19, 12, 14, 7], [306, 365, 23, 12, 18, 7], [306, 416, 21, 12, 16, 7], [306, 467, 21, 15, 16, 7], [306, 518, 19, 12, 14, 7], [306, 563, 19, 20, 12, 1], [306, 614, 15, 20, 8, 1], [306, 665, 17, 20, 12, 1], [306, 718, 19, 4, 12, 3], [306, 766, 1, 1, 3, 1], [367, 2, 23, 18, 20, 1], [367, 52, 23, 19, 20, 0], [367, 106, 22, 19, 16, 3], [367, 154, 23, 19, 16, 0], [367, 205, 24, 19, 18, 0], [367, 257, 22, 18, 18, 1], [367, 308, 24, 18, 18, 1], [367, 361, 19, 16, 14, 3], [367, 412, 18, 16, 14, 3], [367, 463, 18, 16, 14, 3], [367, 515, 19, 15, 14, 4], [367, 566, 20, 15, 14, 4], [367, 615, 19, 17, 14, 2], [367, 671, 18, 15, 14, 7], [367, 718, 19, 16, 14, 3], [367, 769, 18, 16, 14, 3], [428, 4, 19, 16, 14, 3], [428, 56, 19, 15, 14, 4], [428, 106, 18, 16, 12, 3], [428, 157, 16, 16, 12, 3], [428, 208, 17, 16, 12, 3], [428, 260, 18, 15, 12, 4], [428, 311, 21, 15, 16, 4], [428, 361, 19, 16, 14, 3], [428, 412, 18, 16, 14, 3], [428, 463, 18, 16, 14, 3], [428, 515, 19, 15, 14, 4], [428, 566, 20, 15, 14, 4], [428, 616, 20, 16, 16, 3], [428, 667, 20, 16, 16, 3], [428, 718, 20, 16, 16, 3], [428, 770, 20, 15, 16, 4], [489, 3, 17, 8, 12, 2], [489, 55, 18, 6, 12, 3], [489, 108, 20, 16, 16, 5], [489, 157, 20, 16, 16, 3], [489, 208, 20, 16, 14, 3], [489, 263, 17, 8, 12, 7], [489, 310, 25, 16, 18, 3], [489, 361, 20, 16, 14, 3], [489, 417, 19, 11, 16, 8], [489, 468, 19, 11, 16, 8], [489, 514, 22, 6, 16, 3], [489, 565, 16, 5, 10, 3], [489, 616, 18, 3, 12, 3], [489, 667, 27, 17, 21, 3], [489, 718, 28, 16, 22, 3], [489, 769, 24, 16, 18, 3], [550, 4, 27, 17, 21, 3], [550, 55, 27, 17, 21, 3], [550, 106, 27, 17, 21, 3], [550, 157, 27, 17, 21, 3], [550, 208, 23, 16, 16, 3], [550, 259, 27, 17, 21, 3], [550, 310, 27, 17, 21, 3], [550, 361, 27, 17, 21, 3], [550, 412, 27, 17, 21, 3], [550, 463, 27, 17, 21, 3], [550, 514, 27, 17, 21, 3], [550, 565, 19, 12, 14, 3], [550, 616, 19, 12, 14, 3], [550, 667, 27, 17, 21, 3], [550, 722, 23, 12, 20, 7], [550, 773, 20, 12, 14, 7], [611, 4, 18, 16, 14, 3], [611, 55, 16, 16, 10, 3], [611, 106, 27, 17, 21, 3], [611, 157, 27, 17, 21, 3], [611, 208, 27, 17, 21, 3], [611, 259, 27, 17, 21, 3], [611, 310, 27, 17, 21, 3], [611, 366, 20, 11, 16, 8], [611, 417, 19, 11, 16, 8], [611, 475, 20, 4, 20, 15], [611, 511, 1, 1, 16, 1], [611, 562, 22, 19, 20, 0], [611, 613, 25, 19, 20, 0], [611, 664, 23, 19, 18, 0], [611, 718, 30, 16, 24, 3], [611, 773, 24, 12, 20, 7], [672, 12, 16, 3, 13, 11], [672, 63, 19, 3, 16, 11], [672, 106, 20, 6, 14, 3], [672, 157, 20, 6, 14, 3], [672, 208, 16, 6, 10, 3], [672, 259, 16, 6, 10, 3], [672, 310, 27, 17, 21, 3], [672, 362, 24, 15, 22, 4], [672, 413, 21, 18, 16, 4], [1, 1, 1, 1, 10, 1], [794, 769, 27, 17, 21, 3], [672, 565, 27, 17, 21, 3], [672, 616, 27, 17, 21, 3], [672, 667, 27, 17, 21, 3], [672, 718, 27, 17, 21, 3], [672, 769, 27, 17, 21, 3], [733, 4, 27, 17, 21, 3], [733, 55, 27, 17, 21, 3], [733, 106, 27, 17, 21, 3], [733, 157, 27, 17, 21, 3], [733, 208, 27, 17, 21, 3], [733, 259, 27, 17, 21, 3], [733, 310, 27, 17, 21, 3], [733, 361, 27, 17, 21, 3], [733, 412, 27, 17, 21, 3], [733, 463, 27, 17, 21, 3], [733, 514, 27, 17, 21, 3], [733, 565, 27, 17, 21, 3], [733, 616, 27, 17, 21, 3], [733, 667, 27, 17, 21, 3], [733, 718, 27, 17, 21, 3], [733, 769, 27, 17, 21, 3], [1, 1, 1, 1, 10, 1], [794, 55, 27, 17, 21, 3], [794, 106, 27, 17, 21, 3], [794, 157, 27, 17, 21, 3], [794, 208, 27, 17, 21, 3], [794, 259, 27, 17, 21, 3], [794, 310, 27, 17, 21, 3], [794, 361, 27, 17, 21, 3], [794, 412, 27, 17, 21, 3], [794, 463, 27, 17, 21, 3], [794, 514, 27, 17, 21, 3], [794, 565, 27, 17, 21, 3], [794, 616, 27, 17, 21, 3], [794, 667, 27, 17, 21, 3], [794, 718, 27, 17, 21, 3], [794, 769, 27, 17, 21, 3], [855, 4, 27, 17, 21, 3], [855, 55, 27, 17, 21, 3], [855, 106, 27, 17, 21, 3], [855, 157, 27, 17, 21, 3], [855, 208, 27, 17, 21, 3], [855, 259, 27, 17, 21, 3], [855, 310, 27, 17, 21, 3], [855, 361, 27, 17, 21, 3], [855, 412, 27, 17, 21, 3], [855, 463, 27, 17, 21, 3], [855, 514, 27, 17, 21, 3], [855, 565, 27, 17, 21, 3], [855, 616, 27, 17, 21, 3], [855, 667, 27, 17, 21, 3], [855, 718, 27, 17, 21, 3], [855, 769, 27, 17, 21, 3]], \"capHeight\": 18, \"widestlogicalchar\": 24, \"widestglyph\": 30, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 55, 15, 14, 9, 3], [1, 106, 18, 3, 13, 3], [1, 157, 20, 8, 15, 3], [1, 206, 20, 18, 15, 1], [1, 259, 21, 14, 19, 3], [1, 310, 21, 14, 19, 3], [1, 361, 14, 3, 9, 3], [1, 410, 18, 18, 11, 1], [1, 461, 16, 18, 11, 1], [1, 514, 18, 8, 11, 3], [1, 570, 16, 7, 15, 8], [1, 628, 9, 4, 9, 15], [1, 675, 15, 1, 13, 11], [1, 730, 9, 2, 9, 15], [1, 769, 19, 14, 13, 3], [62, 4, 20, 14, 15, 3], [62, 55, 18, 14, 15, 3], [62, 106, 20, 14, 15, 3], [62, 157, 20, 15, 15, 3], [62, 208, 20, 14, 15, 3], [62, 259, 20, 16, 15, 3], [62, 309, 21, 15, 15, 2], [62, 361, 21, 14, 15, 3], [62, 412, 19, 14, 15, 3], [62, 463, 20, 15, 15, 3], [62, 519, 13, 9, 9, 8], [62, 570, 13, 11, 9, 8], [62, 621, 15, 9, 11, 8], [62, 674, 16, 3, 13, 10], [62, 723, 14, 9, 11, 8], [62, 769, 18, 14, 13, 3], [123, 8, 21, 11, 19, 7], [123, 55, 19, 14, 19, 3], [123, 106, 21, 14, 15, 3], [123, 157, 22, 14, 15, 3], [123, 208, 21, 14, 17, 3], [123, 259, 22, 14, 15, 3], [123, 310, 22, 14, 15, 3], [123, 361, 22, 14, 15, 3], [123, 412, 24, 14, 17, 3], [123, 463, 17, 14, 11, 3], [123, 514, 20, 18, 13, 3], [123, 565, 22, 14, 17, 3], [123, 616, 17, 14, 15, 3], [123, 667, 26, 14, 19, 3], [123, 718, 23, 14, 17, 3], [123, 769, 21, 14, 17, 3], [184, 4, 21, 14, 15, 3], [184, 55, 21, 17, 17, 3], [184, 106, 20, 14, 15, 3], [184, 157, 20, 14, 13, 3], [184, 208, 22, 14, 15, 3], [184, 259, 23, 14, 17, 3], [184, 310, 23, 14, 17, 3], [184, 361, 28, 14, 21, 3], [184, 412, 22, 14, 15, 3], [184, 463, 22, 14, 15, 3], [184, 514, 20, 14, 13, 3], [184, 563, 16, 18, 9, 1], [184, 616, 13, 14, 13, 3], [184, 665, 16, 18, 9, 1], [184, 718, 17, 3, 11, 3], [184, 782, 17, 1, 15, 16], [245, 4, 14, 3, 9, 3], [245, 59, 17, 10, 13, 7], [245, 106, 18, 14, 15, 3], [245, 161, 17, 10, 13, 7], [245, 208, 20, 14, 15, 3], [245, 263, 17, 10, 13, 7], [245, 310, 18, 14, 11, 3], [245, 365, 18, 13, 13, 7], [245, 412, 18, 14, 15, 3], [245, 463, 16, 14, 11, 3], [245, 514, 15, 18, 9, 3], [245, 565, 19, 14, 15, 3], [245, 616, 16, 14, 11, 3], [245, 671, 23, 10, 19, 7], [245, 722, 18, 10, 15, 7], [245, 773, 17, 10, 13, 7], [306, 8, 18, 13, 15, 7], [306, 59, 18, 13, 15, 7], [306, 110, 18, 10, 13, 7], [306, 161, 17, 10, 13, 7], [306, 210, 15, 12, 11, 5], [306, 263, 19, 10, 15, 7], [306, 314, 18, 10, 13, 7], [306, 365, 22, 10, 17, 7], [306, 416, 20, 10, 15, 7], [306, 467, 20, 13, 15, 7], [306, 518, 18, 10, 13, 7], [306, 563, 18, 18, 11, 1], [306, 614, 14, 18, 7, 1], [306, 665, 16, 18, 11, 1], [306, 718, 18, 2, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 22, 16, 19, 1], [367, 52, 22, 17, 19, 0], [367, 106, 21, 17, 15, 3], [367, 154, 22, 17, 15, 0], [367, 205, 23, 17, 17, 0], [367, 257, 21, 16, 17, 1], [367, 308, 23, 16, 17, 1], [367, 361, 18, 14, 13, 3], [367, 412, 17, 14, 13, 3], [367, 463, 17, 14, 13, 3], [367, 515, 18, 13, 13, 4], [367, 566, 19, 13, 13, 4], [367, 615, 18, 15, 13, 2], [367, 671, 17, 13, 13, 7], [367, 718, 18, 14, 13, 3], [367, 769, 17, 14, 13, 3], [428, 4, 18, 14, 13, 3], [428, 56, 18, 13, 13, 4], [428, 106, 17, 14, 11, 3], [428, 157, 15, 14, 11, 3], [428, 208, 16, 14, 11, 3], [428, 260, 17, 13, 11, 4], [428, 311, 20, 13, 15, 4], [428, 361, 18, 14, 13, 3], [428, 412, 17, 14, 13, 3], [428, 463, 17, 14, 13, 3], [428, 515, 18, 13, 13, 4], [428, 566, 19, 13, 13, 4], [428, 616, 19, 14, 15, 3], [428, 667, 19, 14, 15, 3], [428, 718, 19, 14, 15, 3], [428, 770, 19, 13, 15, 4], [489, 3, 16, 6, 11, 2], [489, 55, 17, 4, 11, 3], [489, 108, 19, 14, 15, 5], [489, 157, 19, 14, 15, 3], [489, 208, 19, 14, 13, 3], [489, 263, 16, 6, 11, 7], [489, 310, 24, 14, 17, 3], [489, 361, 19, 14, 13, 3], [489, 417, 18, 9, 15, 8], [489, 468, 18, 9, 15, 8], [489, 514, 21, 4, 15, 3], [489, 565, 15, 3, 9, 3], [489, 616, 17, 1, 11, 3], [489, 667, 26, 15, 20, 3], [489, 718, 27, 14, 21, 3], [489, 769, 23, 14, 17, 3], [550, 4, 26, 15, 20, 3], [550, 55, 26, 15, 20, 3], [550, 106, 26, 15, 20, 3], [550, 157, 26, 15, 20, 3], [550, 208, 22, 14, 15, 3], [550, 259, 26, 15, 20, 3], [550, 310, 26, 15, 20, 3], [550, 361, 26, 15, 20, 3], [550, 412, 26, 15, 20, 3], [550, 463, 26, 15, 20, 3], [550, 514, 26, 15, 20, 3], [550, 565, 18, 10, 13, 3], [550, 616, 18, 10, 13, 3], [550, 667, 26, 15, 20, 3], [550, 722, 22, 10, 19, 7], [550, 773, 19, 10, 13, 7], [611, 4, 17, 14, 13, 3], [611, 55, 15, 14, 9, 3], [611, 106, 26, 15, 20, 3], [611, 157, 26, 15, 20, 3], [611, 208, 26, 15, 20, 3], [611, 259, 26, 15, 20, 3], [611, 310, 26, 15, 20, 3], [611, 366, 19, 9, 15, 8], [611, 417, 18, 9, 15, 8], [611, 475, 19, 2, 19, 15], [611, 511, 1, 1, 15, 1], [611, 562, 21, 17, 19, 0], [611, 613, 22, 17, 19, 0], [611, 664, 21, 17, 17, 0], [611, 718, 29, 14, 23, 3], [611, 773, 23, 10, 19, 7], [672, 12, 15, 1, 12, 11], [672, 63, 18, 1, 15, 11], [672, 106, 19, 4, 13, 3], [672, 157, 19, 4, 13, 3], [672, 208, 15, 4, 9, 3], [672, 259, 15, 4, 9, 3], [672, 310, 26, 15, 20, 3], [672, 362, 23, 13, 21, 4], [672, 413, 20, 16, 15, 4], [1, 1, 1, 1, 9, 1], [794, 769, 26, 15, 20, 3], [672, 565, 26, 15, 20, 3], [672, 616, 26, 15, 20, 3], [672, 667, 26, 15, 20, 3], [672, 718, 26, 15, 20, 3], [672, 769, 26, 15, 20, 3], [733, 4, 26, 15, 20, 3], [733, 55, 26, 15, 20, 3], [733, 106, 26, 15, 20, 3], [733, 157, 26, 15, 20, 3], [733, 208, 26, 15, 20, 3], [733, 259, 26, 15, 20, 3], [733, 310, 26, 15, 20, 3], [733, 361, 26, 15, 20, 3], [733, 412, 26, 15, 20, 3], [733, 463, 26, 15, 20, 3], [733, 514, 26, 15, 20, 3], [733, 565, 26, 15, 20, 3], [733, 616, 26, 15, 20, 3], [733, 667, 26, 15, 20, 3], [733, 718, 26, 15, 20, 3], [733, 769, 26, 15, 20, 3], [1, 1, 1, 1, 9, 1], [794, 55, 26, 15, 20, 3], [794, 106, 26, 15, 20, 3], [794, 157, 26, 15, 20, 3], [794, 208, 26, 15, 20, 3], [794, 259, 26, 15, 20, 3], [794, 310, 26, 15, 20, 3], [794, 361, 26, 15, 20, 3], [794, 412, 26, 15, 20, 3], [794, 463, 26, 15, 20, 3], [794, 514, 26, 15, 20, 3], [794, 565, 26, 15, 20, 3], [794, 616, 26, 15, 20, 3], [794, 667, 26, 15, 20, 3], [794, 718, 26, 15, 20, 3], [794, 769, 26, 15, 20, 3], [855, 4, 26, 15, 20, 3], [855, 55, 26, 15, 20, 3], [855, 106, 26, 15, 20, 3], [855, 157, 26, 15, 20, 3], [855, 208, 26, 15, 20, 3], [855, 259, 26, 15, 20, 3], [855, 310, 26, 15, 20, 3], [855, 361, 26, 15, 20, 3], [855, 412, 26, 15, 20, 3], [855, 463, 26, 15, 20, 3], [855, 514, 26, 15, 20, 3], [855, 565, 26, 15, 20, 3], [855, 616, 26, 15, 20, 3], [855, 667, 26, 15, 20, 3], [855, 718, 26, 15, 20, 3], [855, 769, 26, 15, 20, 3]], \"capHeight\": 17, \"widestlogicalchar\": 23, \"widestglyph\": 29, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 10, 6, 10, 12], [1, 55, 10, 16, 10, 3], [1, 106, 14, 15, 14, 3], [1, 157, 16, 15, 16, 3], [1, 206, 16, 20, 16, 1], [1, 259, 20, 16, 20, 3], [1, 310, 20, 16, 20, 3], [1, 361, 10, 15, 10, 3], [1, 410, 12, 20, 12, 1], [1, 461, 12, 20, 12, 1], [1, 514, 12, 15, 12, 3], [1, 570, 16, 10, 16, 8], [1, 625, 10, 9, 10, 12], [1, 675, 14, 7, 14, 11], [1, 727, 10, 7, 10, 12], [1, 769, 14, 16, 14, 3], [62, 4, 16, 16, 16, 3], [62, 55, 16, 16, 16, 3], [62, 106, 16, 16, 16, 3], [62, 157, 16, 17, 16, 3], [62, 208, 16, 16, 16, 3], [62, 259, 16, 18, 16, 3], [62, 309, 16, 17, 16, 2], [62, 361, 16, 16, 16, 3], [62, 412, 16, 16, 16, 3], [62, 463, 16, 17, 16, 3], [62, 519, 10, 11, 10, 8], [62, 570, 10, 13, 10, 8], [62, 621, 12, 11, 12, 8], [62, 674, 14, 8, 14, 10], [62, 723, 12, 11, 12, 8], [62, 769, 14, 16, 14, 3], [123, 8, 20, 13, 20, 7], [123, 55, 20, 16, 20, 3], [123, 106, 16, 16, 16, 3], [123, 157, 16, 16, 16, 3], [123, 208, 18, 16, 18, 3], [123, 259, 16, 16, 16, 3], [123, 310, 16, 16, 16, 3], [123, 361, 16, 16, 16, 3], [123, 412, 18, 16, 18, 3], [123, 463, 12, 16, 12, 3], [123, 514, 14, 20, 14, 3], [123, 565, 18, 16, 18, 3], [123, 616, 16, 16, 16, 3], [123, 667, 20, 16, 20, 3], [123, 718, 18, 16, 18, 3], [123, 769, 18, 16, 18, 3], [184, 4, 16, 16, 16, 3], [184, 55, 18, 19, 18, 3], [184, 106, 16, 16, 16, 3], [184, 157, 14, 16, 14, 3], [184, 208, 16, 16, 16, 3], [184, 259, 18, 16, 18, 3], [184, 310, 18, 16, 18, 3], [184, 361, 22, 16, 22, 3], [184, 412, 16, 16, 16, 3], [184, 463, 16, 16, 16, 3], [184, 514, 14, 16, 14, 3], [184, 563, 10, 20, 10, 1], [184, 616, 14, 16, 14, 3], [184, 665, 10, 20, 10, 1], [184, 718, 12, 15, 12, 3], [184, 778, 16, 7, 16, 12], [245, 4, 10, 15, 10, 3], [245, 59, 14, 12, 14, 7], [245, 106, 16, 16, 16, 3], [245, 161, 14, 12, 14, 7], [245, 208, 16, 16, 16, 3], [245, 263, 14, 12, 14, 7], [245, 310, 12, 16, 12, 3], [245, 365, 14, 15, 14, 7], [245, 412, 16, 16, 16, 3], [245, 463, 12, 16, 12, 3], [245, 514, 10, 20, 10, 3], [245, 565, 16, 16, 16, 3], [245, 616, 12, 16, 12, 3], [245, 671, 20, 12, 20, 7], [245, 722, 16, 12, 16, 7], [245, 773, 14, 12, 14, 7], [306, 8, 16, 15, 16, 7], [306, 59, 16, 15, 16, 7], [306, 110, 14, 12, 14, 7], [306, 161, 14, 12, 14, 7], [306, 210, 12, 14, 12, 5], [306, 263, 16, 12, 16, 7], [306, 314, 14, 12, 14, 7], [306, 365, 18, 12, 18, 7], [306, 416, 16, 12, 16, 7], [306, 467, 16, 15, 16, 7], [306, 518, 14, 12, 14, 7], [306, 563, 12, 20, 12, 1], [306, 614, 8, 20, 8, 1], [306, 665, 12, 20, 12, 1], [306, 718, 12, 15, 12, 3], [306, 778, 3, 6, 3, 12], [367, 2, 20, 18, 20, 1], [367, 52, 20, 19, 20, 0], [367, 106, 16, 19, 16, 3], [367, 154, 16, 19, 16, 0], [367, 205, 18, 19, 18, 0], [367, 257, 18, 18, 18, 1], [367, 308, 18, 18, 18, 1], [367, 361, 14, 16, 14, 3], [367, 412, 14, 16, 14, 3], [367, 463, 14, 16, 14, 3], [367, 515, 14, 15, 14, 4], [367, 566, 14, 15, 14, 4], [367, 615, 14, 17, 14, 2], [367, 671, 14, 15, 14, 7], [367, 718, 14, 16, 14, 3], [367, 769, 14, 16, 14, 3], [428, 4, 14, 16, 14, 3], [428, 56, 14, 15, 14, 4], [428, 106, 12, 16, 12, 3], [428, 157, 12, 16, 12, 3], [428, 208, 12, 16, 12, 3], [428, 260, 12, 15, 12, 4], [428, 311, 16, 15, 16, 4], [428, 361, 14, 16, 14, 3], [428, 412, 14, 16, 14, 3], [428, 463, 14, 16, 14, 3], [428, 515, 14, 15, 14, 4], [428, 566, 14, 15, 14, 4], [428, 616, 16, 16, 16, 3], [428, 667, 16, 16, 16, 3], [428, 718, 16, 16, 16, 3], [428, 770, 16, 15, 16, 4], [489, 3, 12, 16, 12, 2], [489, 55, 12, 15, 12, 3], [489, 108, 16, 16, 16, 5], [489, 157, 16, 16, 16, 3], [489, 208, 14, 16, 14, 3], [489, 263, 12, 11, 12, 7], [489, 310, 18, 16, 18, 3], [489, 361, 14, 16, 14, 3], [489, 417, 16, 11, 16, 8], [489, 468, 16, 11, 16, 8], [489, 514, 16, 15, 16, 3], [489, 565, 10, 15, 10, 3], [489, 616, 12, 15, 12, 3], [489, 667, 21, 17, 21, 3], [489, 718, 22, 16, 22, 3], [489, 769, 18, 16, 18, 3], [550, 4, 21, 17, 21, 3], [550, 55, 21, 17, 21, 3], [550, 106, 21, 17, 21, 3], [550, 157, 21, 17, 21, 3], [550, 208, 16, 16, 16, 3], [550, 259, 21, 17, 21, 3], [550, 310, 21, 17, 21, 3], [550, 361, 21, 17, 21, 3], [550, 412, 21, 17, 21, 3], [550, 463, 21, 17, 21, 3], [550, 514, 21, 17, 21, 3], [550, 565, 14, 15, 14, 3], [550, 616, 14, 15, 14, 3], [550, 667, 21, 17, 21, 3], [550, 722, 20, 12, 20, 7], [550, 773, 14, 12, 14, 7], [611, 4, 14, 16, 14, 3], [611, 55, 10, 16, 10, 3], [611, 106, 21, 17, 21, 3], [611, 157, 21, 17, 21, 3], [611, 208, 21, 17, 21, 3], [611, 259, 21, 17, 21, 3], [611, 310, 21, 17, 21, 3], [611, 366, 16, 11, 16, 8], [611, 417, 16, 11, 16, 8], [611, 472, 20, 7, 20, 12], [611, 523, 16, 6, 16, 12], [611, 562, 20, 19, 20, 0], [611, 613, 20, 19, 20, 0], [611, 664, 18, 19, 18, 0], [611, 718, 24, 16, 24, 3], [611, 773, 20, 12, 20, 7], [672, 12, 13, 7, 13, 11], [672, 63, 16, 7, 16, 11], [672, 106, 14, 15, 14, 3], [672, 157, 14, 15, 14, 3], [672, 208, 10, 15, 10, 3], [672, 259, 10, 15, 10, 3], [672, 310, 21, 17, 21, 3], [672, 362, 22, 15, 22, 4], [672, 413, 16, 18, 16, 4], [1, 13, 10, 6, 10, 12], [794, 769, 21, 17, 21, 3], [672, 565, 21, 17, 21, 3], [672, 616, 21, 17, 21, 3], [672, 667, 21, 17, 21, 3], [672, 718, 21, 17, 21, 3], [672, 769, 21, 17, 21, 3], [733, 4, 21, 17, 21, 3], [733, 55, 21, 17, 21, 3], [733, 106, 21, 17, 21, 3], [733, 157, 21, 17, 21, 3], [733, 208, 21, 17, 21, 3], [733, 259, 21, 17, 21, 3], [733, 310, 21, 17, 21, 3], [733, 361, 21, 17, 21, 3], [733, 412, 21, 17, 21, 3], [733, 463, 21, 17, 21, 3], [733, 514, 21, 17, 21, 3], [733, 565, 21, 17, 21, 3], [733, 616, 21, 17, 21, 3], [733, 667, 21, 17, 21, 3], [733, 718, 21, 17, 21, 3], [733, 769, 21, 17, 21, 3], [1, 13, 10, 6, 10, 12], [794, 55, 21, 17, 21, 3], [794, 106, 21, 17, 21, 3], [794, 157, 21, 17, 21, 3], [794, 208, 21, 17, 21, 3], [794, 259, 21, 17, 21, 3], [794, 310, 21, 17, 21, 3], [794, 361, 21, 17, 21, 3], [794, 412, 21, 17, 21, 3], [794, 463, 21, 17, 21, 3], [794, 514, 21, 17, 21, 3], [794, 565, 21, 17, 21, 3], [794, 616, 21, 17, 21, 3], [794, 667, 21, 17, 21, 3], [794, 718, 21, 17, 21, 3], [794, 769, 21, 17, 21, 3], [855, 4, 21, 17, 21, 3], [855, 55, 21, 17, 21, 3], [855, 106, 21, 17, 21, 3], [855, 157, 21, 17, 21, 3], [855, 208, 21, 17, 21, 3], [855, 259, 21, 17, 21, 3], [855, 310, 21, 17, 21, 3], [855, 361, 21, 17, 21, 3], [855, 412, 21, 17, 21, 3], [855, 463, 21, 17, 21, 3], [855, 514, 21, 17, 21, 3], [855, 565, 21, 17, 21, 3], [855, 616, 21, 17, 21, 3], [855, 667, 21, 17, 21, 3], [855, 718, 21, 17, 21, 3], [855, 769, 21, 17, 21, 3]], \"widestlogicalchar\": 24, \"widestglyph\": 24, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 23, \"leftmost\": 3, \"capHeight\": 17, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 12, 9, 6, 9, 11], [1, 55, 9, 14, 9, 3], [1, 106, 13, 14, 13, 3], [1, 157, 15, 14, 15, 3], [1, 206, 15, 18, 15, 1], [1, 259, 19, 14, 19, 3], [1, 310, 19, 14, 19, 3], [1, 361, 9, 14, 9, 3], [1, 410, 11, 18, 11, 1], [1, 461, 11, 18, 11, 1], [1, 514, 11, 14, 11, 3], [1, 570, 15, 9, 15, 8], [1, 624, 9, 8, 9, 11], [1, 675, 13, 6, 13, 11], [1, 726, 9, 6, 9, 11], [1, 769, 13, 14, 13, 3], [62, 4, 15, 14, 15, 3], [62, 55, 15, 14, 15, 3], [62, 106, 15, 14, 15, 3], [62, 157, 15, 15, 15, 3], [62, 208, 15, 14, 15, 3], [62, 259, 15, 16, 15, 3], [62, 309, 15, 15, 15, 2], [62, 361, 15, 14, 15, 3], [62, 412, 15, 14, 15, 3], [62, 463, 15, 15, 15, 3], [62, 519, 9, 9, 9, 8], [62, 570, 9, 11, 9, 8], [62, 621, 11, 9, 11, 8], [62, 674, 13, 7, 13, 10], [62, 723, 11, 9, 11, 8], [62, 769, 13, 14, 13, 3], [123, 8, 19, 11, 19, 7], [123, 55, 19, 14, 19, 3], [123, 106, 15, 14, 15, 3], [123, 157, 15, 14, 15, 3], [123, 208, 17, 14, 17, 3], [123, 259, 15, 14, 15, 3], [123, 310, 15, 14, 15, 3], [123, 361, 15, 14, 15, 3], [123, 412, 17, 14, 17, 3], [123, 463, 11, 14, 11, 3], [123, 514, 13, 18, 13, 3], [123, 565, 17, 14, 17, 3], [123, 616, 15, 14, 15, 3], [123, 667, 19, 14, 19, 3], [123, 718, 17, 14, 17, 3], [123, 769, 17, 14, 17, 3], [184, 4, 15, 14, 15, 3], [184, 55, 17, 17, 17, 3], [184, 106, 15, 14, 15, 3], [184, 157, 13, 14, 13, 3], [184, 208, 15, 14, 15, 3], [184, 259, 17, 14, 17, 3], [184, 310, 17, 14, 17, 3], [184, 361, 21, 14, 21, 3], [184, 412, 15, 14, 15, 3], [184, 463, 15, 14, 15, 3], [184, 514, 13, 14, 13, 3], [184, 563, 9, 18, 9, 1], [184, 616, 13, 14, 13, 3], [184, 665, 9, 18, 9, 1], [184, 718, 11, 14, 11, 3], [184, 777, 15, 6, 15, 11], [245, 4, 9, 14, 9, 3], [245, 59, 13, 10, 13, 7], [245, 106, 15, 14, 15, 3], [245, 161, 13, 10, 13, 7], [245, 208, 15, 14, 15, 3], [245, 263, 13, 10, 13, 7], [245, 310, 11, 14, 11, 3], [245, 365, 13, 13, 13, 7], [245, 412, 15, 14, 15, 3], [245, 463, 11, 14, 11, 3], [245, 514, 9, 18, 9, 3], [245, 565, 15, 14, 15, 3], [245, 616, 11, 14, 11, 3], [245, 671, 19, 10, 19, 7], [245, 722, 15, 10, 15, 7], [245, 773, 13, 10, 13, 7], [306, 8, 15, 13, 15, 7], [306, 59, 15, 13, 15, 7], [306, 110, 13, 10, 13, 7], [306, 161, 13, 10, 13, 7], [306, 210, 11, 12, 11, 5], [306, 263, 15, 10, 15, 7], [306, 314, 13, 10, 13, 7], [306, 365, 17, 10, 17, 7], [306, 416, 15, 10, 15, 7], [306, 467, 15, 13, 15, 7], [306, 518, 13, 10, 13, 7], [306, 563, 11, 18, 11, 1], [306, 614, 7, 18, 7, 1], [306, 665, 11, 18, 11, 1], [306, 718, 11, 14, 11, 3], [306, 777, 3, 6, 3, 11], [367, 2, 19, 16, 19, 1], [367, 52, 19, 17, 19, 0], [367, 106, 15, 17, 15, 3], [367, 154, 15, 17, 15, 0], [367, 205, 17, 17, 17, 0], [367, 257, 17, 16, 17, 1], [367, 308, 17, 16, 17, 1], [367, 361, 13, 14, 13, 3], [367, 412, 13, 14, 13, 3], [367, 463, 13, 14, 13, 3], [367, 515, 13, 13, 13, 4], [367, 566, 13, 13, 13, 4], [367, 615, 13, 15, 13, 2], [367, 671, 13, 13, 13, 7], [367, 718, 13, 14, 13, 3], [367, 769, 13, 14, 13, 3], [428, 4, 13, 14, 13, 3], [428, 56, 13, 13, 13, 4], [428, 106, 11, 14, 11, 3], [428, 157, 11, 14, 11, 3], [428, 208, 11, 14, 11, 3], [428, 260, 11, 13, 11, 4], [428, 311, 15, 13, 15, 4], [428, 361, 13, 14, 13, 3], [428, 412, 13, 14, 13, 3], [428, 463, 13, 14, 13, 3], [428, 515, 13, 13, 13, 4], [428, 566, 13, 13, 13, 4], [428, 616, 15, 14, 15, 3], [428, 667, 15, 14, 15, 3], [428, 718, 15, 14, 15, 3], [428, 770, 15, 13, 15, 4], [489, 3, 11, 15, 11, 2], [489, 55, 11, 14, 11, 3], [489, 108, 15, 14, 15, 5], [489, 157, 15, 14, 15, 3], [489, 208, 13, 14, 13, 3], [489, 263, 11, 10, 11, 7], [489, 310, 17, 14, 17, 3], [489, 361, 13, 14, 13, 3], [489, 417, 15, 9, 15, 8], [489, 468, 15, 9, 15, 8], [489, 514, 15, 14, 15, 3], [489, 565, 9, 14, 9, 3], [489, 616, 11, 14, 11, 3], [489, 667, 20, 15, 20, 3], [489, 718, 21, 14, 21, 3], [489, 769, 17, 14, 17, 3], [550, 4, 20, 15, 20, 3], [550, 55, 20, 15, 20, 3], [550, 106, 20, 15, 20, 3], [550, 157, 20, 15, 20, 3], [550, 208, 15, 14, 15, 3], [550, 259, 20, 15, 20, 3], [550, 310, 20, 15, 20, 3], [550, 361, 20, 15, 20, 3], [550, 412, 20, 15, 20, 3], [550, 463, 20, 15, 20, 3], [550, 514, 20, 15, 20, 3], [550, 565, 13, 14, 13, 3], [550, 616, 13, 14, 13, 3], [550, 667, 20, 15, 20, 3], [550, 722, 19, 10, 19, 7], [550, 773, 13, 10, 13, 7], [611, 4, 13, 14, 13, 3], [611, 55, 9, 14, 9, 3], [611, 106, 20, 15, 20, 3], [611, 157, 20, 15, 20, 3], [611, 208, 20, 15, 20, 3], [611, 259, 20, 15, 20, 3], [611, 310, 20, 15, 20, 3], [611, 366, 15, 9, 15, 8], [611, 417, 15, 9, 15, 8], [611, 471, 19, 6, 19, 11], [611, 522, 15, 6, 15, 11], [611, 562, 19, 17, 19, 0], [611, 613, 19, 17, 19, 0], [611, 664, 17, 17, 17, 0], [611, 718, 23, 14, 23, 3], [611, 773, 19, 10, 19, 7], [672, 12, 12, 6, 12, 11], [672, 63, 15, 6, 15, 11], [672, 106, 13, 14, 13, 3], [672, 157, 13, 14, 13, 3], [672, 208, 9, 14, 9, 3], [672, 259, 9, 14, 9, 3], [672, 310, 20, 15, 20, 3], [672, 362, 21, 13, 21, 4], [672, 413, 15, 16, 15, 4], [1, 12, 9, 6, 9, 11], [794, 769, 20, 15, 20, 3], [672, 565, 20, 15, 20, 3], [672, 616, 20, 15, 20, 3], [672, 667, 20, 15, 20, 3], [672, 718, 20, 15, 20, 3], [672, 769, 20, 15, 20, 3], [733, 4, 20, 15, 20, 3], [733, 55, 20, 15, 20, 3], [733, 106, 20, 15, 20, 3], [733, 157, 20, 15, 20, 3], [733, 208, 20, 15, 20, 3], [733, 259, 20, 15, 20, 3], [733, 310, 20, 15, 20, 3], [733, 361, 20, 15, 20, 3], [733, 412, 20, 15, 20, 3], [733, 463, 20, 15, 20, 3], [733, 514, 20, 15, 20, 3], [733, 565, 20, 15, 20, 3], [733, 616, 20, 15, 20, 3], [733, 667, 20, 15, 20, 3], [733, 718, 20, 15, 20, 3], [733, 769, 20, 15, 20, 3], [1, 12, 9, 6, 9, 11], [794, 55, 20, 15, 20, 3], [794, 106, 20, 15, 20, 3], [794, 157, 20, 15, 20, 3], [794, 208, 20, 15, 20, 3], [794, 259, 20, 15, 20, 3], [794, 310, 20, 15, 20, 3], [794, 361, 20, 15, 20, 3], [794, 412, 20, 15, 20, 3], [794, 463, 20, 15, 20, 3], [794, 514, 20, 15, 20, 3], [794, 565, 20, 15, 20, 3], [794, 616, 20, 15, 20, 3], [794, 667, 20, 15, 20, 3], [794, 718, 20, 15, 20, 3], [794, 769, 20, 15, 20, 3], [855, 4, 20, 15, 20, 3], [855, 55, 20, 15, 20, 3], [855, 106, 20, 15, 20, 3], [855, 157, 20, 15, 20, 3], [855, 208, 20, 15, 20, 3], [855, 259, 20, 15, 20, 3], [855, 310, 20, 15, 20, 3], [855, 361, 20, 15, 20, 3], [855, 412, 20, 15, 20, 3], [855, 463, 20, 15, 20, 3], [855, 514, 20, 15, 20, 3], [855, 565, 20, 15, 20, 3], [855, 616, 20, 15, 20, 3], [855, 667, 20, 15, 20, 3], [855, 718, 20, 15, 20, 3], [855, 769, 20, 15, 20, 3]], \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 13, 1], [1, 55, 21, 20, 13, 3], [1, 106, 24, 6, 15, 3], [1, 157, 28, 14, 21, 3], [1, 206, 26, 24, 19, 1], [1, 261, 28, 18, 23, 5], [1, 310, 29, 20, 25, 3], [1, 361, 20, 6, 11, 3], [1, 410, 24, 24, 15, 1], [1, 461, 22, 24, 15, 1], [1, 514, 24, 10, 17, 3], [1, 571, 21, 11, 17, 9], [1, 632, 12, 7, 11, 19], [1, 677, 21, 3, 17, 13], [1, 734, 12, 4, 11, 19], [1, 769, 28, 20, 19, 3], [62, 4, 27, 20, 21, 3], [62, 55, 25, 20, 21, 3], [62, 106, 28, 20, 21, 3], [62, 157, 27, 22, 21, 3], [62, 208, 29, 20, 21, 3], [62, 259, 28, 22, 21, 3], [62, 309, 27, 21, 21, 2], [62, 361, 30, 20, 21, 3], [62, 412, 27, 20, 21, 3], [62, 463, 27, 20, 21, 3], [62, 520, 17, 14, 11, 9], [62, 571, 17, 17, 11, 9], [62, 621, 21, 13, 15, 8], [62, 676, 23, 6, 19, 12], [62, 723, 19, 13, 15, 8], [62, 769, 27, 20, 19, 3], [123, 10, 28, 15, 25, 9], [123, 55, 26, 20, 25, 3], [123, 106, 28, 20, 21, 3], [123, 157, 28, 20, 19, 3], [123, 208, 28, 20, 21, 3], [123, 259, 28, 20, 19, 3], [123, 310, 28, 20, 19, 3], [123, 361, 29, 20, 21, 3], [123, 412, 32, 20, 23, 3], [123, 463, 25, 20, 17, 3], [123, 514, 25, 25, 15, 3], [123, 565, 30, 20, 21, 3], [123, 616, 23, 20, 21, 3], [123, 667, 38, 20, 29, 3], [123, 718, 33, 20, 23, 3], [123, 769, 28, 20, 21, 3], [184, 4, 29, 20, 21, 3], [184, 55, 28, 24, 21, 3], [184, 106, 28, 20, 21, 3], [184, 157, 26, 20, 19, 3], [184, 207, 30, 21, 21, 2], [184, 259, 33, 20, 23, 3], [184, 310, 34, 20, 25, 3], [184, 361, 40, 20, 31, 3], [184, 412, 31, 20, 21, 3], [184, 463, 31, 20, 21, 3], [184, 513, 26, 21, 17, 2], [184, 563, 23, 24, 13, 1], [184, 616, 20, 20, 19, 3], [184, 665, 23, 24, 13, 1], [184, 718, 21, 5, 13, 3], [184, 786, 21, 3, 19, 20], [245, 4, 19, 5, 11, 3], [245, 60, 24, 15, 19, 8], [245, 106, 24, 20, 21, 3], [245, 162, 24, 15, 17, 8], [245, 208, 29, 20, 21, 3], [245, 264, 24, 15, 19, 8], [245, 310, 24, 20, 15, 3], [245, 366, 25, 19, 19, 8], [245, 412, 25, 20, 21, 3], [245, 463, 21, 20, 13, 3], [245, 514, 21, 25, 13, 3], [245, 565, 26, 20, 21, 3], [245, 616, 21, 20, 13, 3], [245, 672, 32, 15, 29, 8], [245, 723, 25, 15, 21, 8], [245, 774, 24, 15, 19, 8], [306, 9, 25, 19, 21, 8], [306, 60, 26, 19, 21, 8], [306, 111, 23, 15, 17, 8], [306, 162, 23, 15, 17, 8], [306, 210, 20, 18, 15, 5], [306, 264, 26, 15, 21, 8], [306, 315, 28, 15, 21, 8], [306, 366, 34, 15, 27, 8], [306, 417, 25, 15, 19, 8], [306, 468, 28, 20, 21, 8], [306, 518, 24, 16, 17, 7], [306, 564, 24, 23, 15, 2], [306, 615, 20, 23, 11, 2], [306, 666, 22, 23, 15, 2], [306, 718, 26, 4, 17, 3], [306, 766, 1, 1, 3, 1], [367, 1, 29, 23, 25, 0], [367, 52, 29, 23, 25, 0], [367, 106, 28, 24, 19, 3], [367, 154, 28, 23, 19, 0], [367, 205, 33, 23, 23, 0], [367, 256, 28, 23, 21, 0], [367, 307, 33, 23, 23, 0], [367, 361, 25, 20, 19, 3], [367, 412, 24, 20, 19, 3], [367, 463, 24, 20, 19, 3], [367, 516, 25, 18, 19, 5], [367, 566, 25, 19, 19, 4], [367, 615, 25, 21, 19, 2], [367, 672, 24, 18, 17, 8], [367, 718, 24, 20, 19, 3], [367, 769, 24, 20, 19, 3], [428, 4, 25, 20, 19, 3], [428, 57, 24, 18, 19, 5], [428, 106, 22, 20, 13, 3], [428, 157, 21, 20, 13, 3], [428, 208, 22, 20, 13, 3], [428, 261, 22, 18, 13, 5], [428, 311, 26, 19, 21, 4], [428, 361, 24, 20, 19, 3], [428, 412, 23, 20, 19, 3], [428, 463, 24, 20, 19, 3], [428, 516, 24, 18, 19, 5], [428, 566, 24, 19, 19, 4], [428, 616, 26, 20, 21, 3], [428, 667, 26, 20, 21, 3], [428, 718, 26, 20, 21, 3], [428, 771, 26, 18, 21, 5], [489, 2, 23, 12, 13, 1], [489, 54, 24, 7, 15, 2], [489, 109, 25, 19, 19, 6], [489, 157, 26, 20, 21, 3], [489, 208, 26, 20, 19, 3], [489, 264, 24, 12, 21, 8], [489, 310, 33, 20, 23, 3], [489, 361, 28, 20, 19, 3], [489, 418, 26, 14, 23, 9], [489, 469, 26, 14, 23, 9], [489, 514, 29, 7, 23, 3], [489, 565, 21, 5, 13, 3], [489, 616, 22, 3, 13, 3], [489, 666, 37, 21, 29, 2], [489, 718, 37, 20, 29, 3], [489, 769, 31, 20, 21, 3], [550, 3, 37, 21, 29, 2], [550, 54, 37, 21, 29, 2], [550, 105, 37, 21, 29, 2], [550, 156, 37, 21, 29, 2], [550, 208, 31, 20, 21, 3], [550, 258, 37, 21, 29, 2], [550, 309, 37, 21, 29, 2], [550, 360, 37, 21, 29, 2], [550, 411, 37, 21, 29, 2], [550, 462, 37, 21, 29, 2], [550, 513, 37, 21, 29, 2], [550, 565, 25, 15, 19, 3], [550, 616, 25, 15, 17, 3], [550, 666, 37, 21, 29, 2], [550, 723, 31, 15, 25, 8], [550, 774, 26, 15, 19, 8], [611, 4, 25, 20, 19, 3], [611, 55, 21, 20, 13, 3], [611, 105, 37, 21, 29, 2], [611, 156, 37, 21, 29, 2], [611, 207, 37, 21, 29, 2], [611, 258, 37, 21, 29, 2], [611, 309, 37, 21, 29, 2], [611, 368, 24, 13, 19, 10], [611, 419, 22, 13, 19, 10], [611, 479, 23, 4, 23, 19], [611, 511, 1, 1, 21, 1], [611, 562, 28, 23, 25, 0], [611, 613, 31, 23, 25, 0], [611, 664, 29, 23, 21, 0], [611, 718, 36, 20, 29, 3], [611, 774, 33, 15, 27, 8], [672, 13, 20, 4, 15, 12], [672, 64, 28, 4, 23, 12], [672, 106, 24, 7, 15, 3], [672, 157, 24, 7, 15, 3], [672, 208, 20, 7, 11, 3], [672, 259, 20, 7, 11, 3], [672, 309, 37, 21, 29, 2], [672, 363, 27, 16, 23, 5], [672, 413, 28, 24, 21, 4], [1, 1, 1, 1, 13, 1], [794, 768, 37, 21, 29, 2], [672, 564, 37, 21, 29, 2], [672, 615, 37, 21, 29, 2], [672, 666, 37, 21, 29, 2], [672, 717, 37, 21, 29, 2], [672, 768, 37, 21, 29, 2], [733, 3, 37, 21, 29, 2], [733, 54, 37, 21, 29, 2], [733, 105, 37, 21, 29, 2], [733, 156, 37, 21, 29, 2], [733, 207, 37, 21, 29, 2], [733, 258, 37, 21, 29, 2], [733, 309, 37, 21, 29, 2], [733, 360, 37, 21, 29, 2], [733, 411, 37, 21, 29, 2], [733, 462, 37, 21, 29, 2], [733, 513, 37, 21, 29, 2], [733, 564, 37, 21, 29, 2], [733, 615, 37, 21, 29, 2], [733, 666, 37, 21, 29, 2], [733, 717, 37, 21, 29, 2], [733, 768, 37, 21, 29, 2], [1, 1, 1, 1, 13, 1], [794, 54, 37, 21, 29, 2], [794, 105, 37, 21, 29, 2], [794, 156, 37, 21, 29, 2], [794, 207, 37, 21, 29, 2], [794, 258, 37, 21, 29, 2], [794, 309, 37, 21, 29, 2], [794, 360, 37, 21, 29, 2], [794, 411, 37, 21, 29, 2], [794, 462, 37, 21, 29, 2], [794, 513, 37, 21, 29, 2], [794, 564, 37, 21, 29, 2], [794, 615, 37, 21, 29, 2], [794, 666, 37, 21, 29, 2], [794, 717, 37, 21, 29, 2], [794, 768, 37, 21, 29, 2], [855, 3, 37, 21, 29, 2], [855, 54, 37, 21, 29, 2], [855, 105, 37, 21, 29, 2], [855, 156, 37, 21, 29, 2], [855, 207, 37, 21, 29, 2], [855, 258, 37, 21, 29, 2], [855, 309, 37, 21, 29, 2], [855, 360, 37, 21, 29, 2], [855, 411, 37, 21, 29, 2], [855, 462, 37, 21, 29, 2], [855, 513, 37, 21, 29, 2], [855, 564, 37, 21, 29, 2], [855, 615, 37, 21, 29, 2], [855, 666, 37, 21, 29, 2], [855, 717, 37, 21, 29, 2], [855, 768, 37, 21, 29, 2]], \"capHeight\": 22, \"widestlogicalchar\": 31, \"widestglyph\": 40, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 55, 20, 18, 12, 3], [1, 106, 23, 4, 14, 3], [1, 157, 27, 12, 20, 3], [1, 206, 25, 22, 18, 1], [1, 261, 27, 16, 22, 5], [1, 310, 28, 18, 24, 3], [1, 361, 19, 4, 10, 3], [1, 410, 23, 22, 14, 1], [1, 461, 21, 22, 14, 1], [1, 514, 23, 8, 16, 3], [1, 571, 20, 9, 16, 9], [1, 632, 11, 5, 10, 19], [1, 677, 20, 1, 16, 13], [1, 734, 11, 2, 10, 19], [1, 769, 27, 18, 18, 3], [62, 4, 26, 18, 20, 3], [62, 55, 24, 18, 20, 3], [62, 106, 27, 18, 20, 3], [62, 157, 26, 20, 20, 3], [62, 208, 28, 18, 20, 3], [62, 259, 27, 20, 20, 3], [62, 309, 26, 19, 20, 2], [62, 361, 29, 18, 20, 3], [62, 412, 26, 18, 20, 3], [62, 463, 26, 18, 20, 3], [62, 520, 16, 12, 10, 9], [62, 571, 16, 15, 10, 9], [62, 621, 20, 11, 14, 8], [62, 676, 22, 4, 18, 12], [62, 723, 18, 11, 14, 8], [62, 769, 26, 18, 18, 3], [123, 10, 27, 13, 24, 9], [123, 55, 25, 18, 24, 3], [123, 106, 27, 18, 20, 3], [123, 157, 27, 18, 18, 3], [123, 208, 27, 18, 20, 3], [123, 259, 27, 18, 18, 3], [123, 310, 27, 18, 18, 3], [123, 361, 28, 18, 20, 3], [123, 412, 31, 18, 22, 3], [123, 463, 24, 18, 16, 3], [123, 514, 24, 23, 14, 3], [123, 565, 29, 18, 20, 3], [123, 616, 22, 18, 20, 3], [123, 667, 37, 18, 28, 3], [123, 718, 32, 18, 22, 3], [123, 769, 27, 18, 20, 3], [184, 4, 28, 18, 20, 3], [184, 55, 27, 22, 20, 3], [184, 106, 27, 18, 20, 3], [184, 157, 25, 18, 18, 3], [184, 207, 29, 19, 20, 2], [184, 259, 32, 18, 22, 3], [184, 310, 33, 18, 24, 3], [184, 361, 39, 18, 30, 3], [184, 412, 30, 18, 20, 3], [184, 463, 30, 18, 20, 3], [184, 513, 25, 19, 16, 2], [184, 563, 22, 22, 12, 1], [184, 616, 19, 18, 18, 3], [184, 665, 22, 22, 12, 1], [184, 718, 20, 3, 12, 3], [184, 786, 20, 1, 18, 20], [245, 4, 18, 3, 10, 3], [245, 60, 23, 13, 18, 8], [245, 106, 23, 18, 20, 3], [245, 162, 23, 13, 16, 8], [245, 208, 28, 18, 20, 3], [245, 264, 23, 13, 18, 8], [245, 310, 23, 18, 14, 3], [245, 366, 24, 17, 18, 8], [245, 412, 24, 18, 20, 3], [245, 463, 20, 18, 12, 3], [245, 514, 20, 23, 12, 3], [245, 565, 25, 18, 20, 3], [245, 616, 20, 18, 12, 3], [245, 672, 31, 13, 28, 8], [245, 723, 24, 13, 20, 8], [245, 774, 23, 13, 18, 8], [306, 9, 24, 17, 20, 8], [306, 60, 25, 17, 20, 8], [306, 111, 22, 13, 16, 8], [306, 162, 22, 13, 16, 8], [306, 210, 19, 16, 14, 5], [306, 264, 25, 13, 20, 8], [306, 315, 27, 13, 20, 8], [306, 366, 33, 13, 26, 8], [306, 417, 24, 13, 18, 8], [306, 468, 27, 18, 20, 8], [306, 518, 23, 14, 16, 7], [306, 564, 23, 21, 14, 2], [306, 615, 19, 21, 10, 2], [306, 666, 21, 21, 14, 2], [306, 718, 25, 2, 16, 3], [306, 766, 1, 1, 3, 1], [367, 1, 25, 21, 24, 0], [367, 52, 28, 21, 24, 0], [367, 106, 27, 22, 18, 3], [367, 154, 27, 21, 18, 0], [367, 205, 32, 21, 22, 0], [367, 256, 27, 21, 20, 0], [367, 307, 32, 21, 22, 0], [367, 361, 24, 18, 18, 3], [367, 412, 23, 18, 18, 3], [367, 463, 23, 18, 18, 3], [367, 516, 24, 16, 18, 5], [367, 566, 24, 17, 18, 4], [367, 615, 24, 19, 18, 2], [367, 672, 23, 16, 16, 8], [367, 718, 23, 18, 18, 3], [367, 769, 23, 18, 18, 3], [428, 4, 24, 18, 18, 3], [428, 57, 23, 16, 18, 5], [428, 106, 21, 18, 12, 3], [428, 157, 20, 18, 12, 3], [428, 208, 21, 18, 12, 3], [428, 261, 21, 16, 12, 5], [428, 311, 25, 17, 20, 4], [428, 361, 23, 18, 18, 3], [428, 412, 22, 18, 18, 3], [428, 463, 23, 18, 18, 3], [428, 516, 23, 16, 18, 5], [428, 566, 23, 17, 18, 4], [428, 616, 25, 18, 20, 3], [428, 667, 25, 18, 20, 3], [428, 718, 25, 18, 20, 3], [428, 771, 25, 16, 20, 5], [489, 2, 22, 10, 12, 1], [489, 54, 23, 5, 14, 2], [489, 109, 24, 17, 18, 6], [489, 157, 25, 18, 20, 3], [489, 208, 25, 18, 18, 3], [489, 264, 23, 10, 20, 8], [489, 310, 32, 18, 22, 3], [489, 361, 27, 18, 18, 3], [489, 418, 25, 12, 22, 9], [489, 469, 25, 12, 22, 9], [489, 514, 28, 5, 22, 3], [489, 565, 20, 3, 12, 3], [489, 616, 21, 1, 12, 3], [489, 666, 36, 19, 28, 2], [489, 718, 36, 18, 28, 3], [489, 769, 30, 18, 20, 3], [550, 3, 36, 19, 28, 2], [550, 54, 36, 19, 28, 2], [550, 105, 36, 19, 28, 2], [550, 156, 36, 19, 28, 2], [550, 208, 30, 18, 20, 3], [550, 258, 36, 19, 28, 2], [550, 309, 36, 19, 28, 2], [550, 360, 36, 19, 28, 2], [550, 411, 36, 19, 28, 2], [550, 462, 36, 19, 28, 2], [550, 513, 36, 19, 28, 2], [550, 565, 24, 13, 18, 3], [550, 616, 24, 13, 16, 3], [550, 666, 36, 19, 28, 2], [550, 723, 30, 13, 24, 8], [550, 774, 25, 13, 18, 8], [611, 4, 24, 18, 18, 3], [611, 55, 20, 18, 12, 3], [611, 105, 36, 19, 28, 2], [611, 156, 36, 19, 28, 2], [611, 207, 36, 19, 28, 2], [611, 258, 36, 19, 28, 2], [611, 309, 36, 19, 28, 2], [611, 368, 23, 11, 18, 10], [611, 419, 21, 11, 18, 10], [611, 479, 22, 2, 22, 19], [611, 511, 1, 1, 20, 1], [611, 562, 27, 21, 24, 0], [611, 613, 29, 21, 24, 0], [611, 664, 27, 21, 20, 0], [611, 718, 35, 18, 28, 3], [611, 774, 32, 13, 26, 8], [672, 13, 19, 2, 14, 12], [672, 64, 27, 2, 22, 12], [672, 106, 23, 5, 14, 3], [672, 157, 23, 5, 14, 3], [672, 208, 19, 5, 10, 3], [672, 259, 19, 5, 10, 3], [672, 309, 36, 19, 28, 2], [672, 363, 26, 14, 22, 5], [672, 413, 27, 22, 20, 4], [1, 1, 1, 1, 12, 1], [794, 768, 36, 19, 28, 2], [672, 564, 36, 19, 28, 2], [672, 615, 36, 19, 28, 2], [672, 666, 36, 19, 28, 2], [672, 717, 36, 19, 28, 2], [672, 768, 36, 19, 28, 2], [733, 3, 36, 19, 28, 2], [733, 54, 36, 19, 28, 2], [733, 105, 36, 19, 28, 2], [733, 156, 36, 19, 28, 2], [733, 207, 36, 19, 28, 2], [733, 258, 36, 19, 28, 2], [733, 309, 36, 19, 28, 2], [733, 360, 36, 19, 28, 2], [733, 411, 36, 19, 28, 2], [733, 462, 36, 19, 28, 2], [733, 513, 36, 19, 28, 2], [733, 564, 36, 19, 28, 2], [733, 615, 36, 19, 28, 2], [733, 666, 36, 19, 28, 2], [733, 717, 36, 19, 28, 2], [733, 768, 36, 19, 28, 2], [1, 1, 1, 1, 12, 1], [794, 54, 36, 19, 28, 2], [794, 105, 36, 19, 28, 2], [794, 156, 36, 19, 28, 2], [794, 207, 36, 19, 28, 2], [794, 258, 36, 19, 28, 2], [794, 309, 36, 19, 28, 2], [794, 360, 36, 19, 28, 2], [794, 411, 36, 19, 28, 2], [794, 462, 36, 19, 28, 2], [794, 513, 36, 19, 28, 2], [794, 564, 36, 19, 28, 2], [794, 615, 36, 19, 28, 2], [794, 666, 36, 19, 28, 2], [794, 717, 36, 19, 28, 2], [794, 768, 36, 19, 28, 2], [855, 3, 36, 19, 28, 2], [855, 54, 36, 19, 28, 2], [855, 105, 36, 19, 28, 2], [855, 156, 36, 19, 28, 2], [855, 207, 36, 19, 28, 2], [855, 258, 36, 19, 28, 2], [855, 309, 36, 19, 28, 2], [855, 360, 36, 19, 28, 2], [855, 411, 36, 19, 28, 2], [855, 462, 36, 19, 28, 2], [855, 513, 36, 19, 28, 2], [855, 564, 36, 19, 28, 2], [855, 615, 36, 19, 28, 2], [855, 666, 36, 19, 28, 2], [855, 717, 36, 19, 28, 2], [855, 768, 36, 19, 28, 2]], \"capHeight\": 21, \"widestlogicalchar\": 30, \"widestglyph\": 39, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 2, \"capHeight\": 22, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 17, 13, 6, 13, 16], [1, 55, 13, 20, 13, 3], [1, 106, 15, 19, 15, 3], [1, 157, 21, 19, 21, 3], [1, 206, 19, 24, 19, 1], [1, 261, 23, 18, 23, 5], [1, 310, 25, 20, 25, 3], [1, 361, 11, 19, 11, 3], [1, 410, 15, 24, 15, 1], [1, 461, 15, 24, 15, 1], [1, 514, 17, 19, 17, 3], [1, 571, 17, 13, 17, 9], [1, 629, 11, 10, 11, 16], [1, 677, 17, 9, 17, 13], [1, 731, 11, 7, 11, 16], [1, 769, 19, 20, 19, 3], [62, 4, 21, 20, 21, 3], [62, 55, 21, 20, 21, 3], [62, 106, 21, 20, 21, 3], [62, 157, 21, 22, 21, 3], [62, 208, 21, 20, 21, 3], [62, 259, 21, 22, 21, 3], [62, 309, 21, 21, 21, 2], [62, 361, 21, 20, 21, 3], [62, 412, 21, 20, 21, 3], [62, 463, 21, 20, 21, 3], [62, 520, 11, 14, 11, 9], [62, 571, 11, 17, 11, 9], [62, 621, 15, 14, 15, 8], [62, 676, 19, 10, 19, 12], [62, 723, 15, 14, 15, 8], [62, 769, 19, 20, 19, 3], [123, 10, 25, 15, 25, 9], [123, 55, 25, 20, 25, 3], [123, 106, 21, 20, 21, 3], [123, 157, 19, 20, 19, 3], [123, 208, 21, 20, 21, 3], [123, 259, 19, 20, 19, 3], [123, 310, 19, 20, 19, 3], [123, 361, 21, 20, 21, 3], [123, 412, 23, 20, 23, 3], [123, 463, 17, 20, 17, 3], [123, 514, 15, 25, 15, 3], [123, 565, 21, 20, 21, 3], [123, 616, 21, 20, 21, 3], [123, 667, 29, 20, 29, 3], [123, 718, 23, 20, 23, 3], [123, 769, 21, 20, 21, 3], [184, 4, 21, 20, 21, 3], [184, 55, 21, 24, 21, 3], [184, 106, 21, 20, 21, 3], [184, 157, 19, 20, 19, 3], [184, 207, 21, 21, 21, 2], [184, 259, 23, 20, 23, 3], [184, 310, 25, 20, 25, 3], [184, 361, 31, 20, 31, 3], [184, 412, 21, 20, 21, 3], [184, 463, 21, 20, 21, 3], [184, 513, 17, 21, 17, 2], [184, 563, 13, 24, 13, 1], [184, 616, 19, 20, 19, 3], [184, 665, 13, 24, 13, 1], [184, 718, 13, 19, 13, 3], [184, 782, 19, 7, 19, 16], [245, 4, 11, 19, 11, 3], [245, 60, 19, 15, 19, 8], [245, 106, 21, 20, 21, 3], [245, 162, 17, 15, 17, 8], [245, 208, 21, 20, 21, 3], [245, 264, 19, 15, 19, 8], [245, 310, 15, 20, 15, 3], [245, 366, 19, 19, 19, 8], [245, 412, 21, 20, 21, 3], [245, 463, 13, 20, 13, 3], [245, 514, 13, 25, 13, 3], [245, 565, 21, 20, 21, 3], [245, 616, 13, 20, 13, 3], [245, 672, 29, 15, 29, 8], [245, 723, 21, 15, 21, 8], [245, 774, 19, 15, 19, 8], [306, 9, 21, 19, 21, 8], [306, 60, 21, 19, 21, 8], [306, 111, 17, 15, 17, 8], [306, 162, 17, 15, 17, 8], [306, 210, 15, 18, 15, 5], [306, 264, 21, 15, 21, 8], [306, 315, 21, 15, 21, 8], [306, 366, 27, 15, 27, 8], [306, 417, 19, 15, 19, 8], [306, 468, 21, 20, 21, 8], [306, 518, 17, 16, 17, 7], [306, 564, 15, 23, 15, 2], [306, 615, 11, 23, 11, 2], [306, 666, 15, 23, 15, 2], [306, 718, 17, 19, 17, 3], [306, 782, 3, 6, 3, 16], [367, 1, 25, 23, 25, 0], [367, 52, 25, 23, 25, 0], [367, 106, 19, 24, 19, 3], [367, 154, 19, 23, 19, 0], [367, 205, 23, 23, 23, 0], [367, 256, 21, 23, 21, 0], [367, 307, 23, 23, 23, 0], [367, 361, 19, 20, 19, 3], [367, 412, 19, 20, 19, 3], [367, 463, 19, 20, 19, 3], [367, 516, 19, 18, 19, 5], [367, 566, 19, 19, 19, 4], [367, 615, 19, 21, 19, 2], [367, 672, 17, 18, 17, 8], [367, 718, 19, 20, 19, 3], [367, 769, 19, 20, 19, 3], [428, 4, 19, 20, 19, 3], [428, 57, 19, 18, 19, 5], [428, 106, 13, 20, 13, 3], [428, 157, 13, 20, 13, 3], [428, 208, 13, 20, 13, 3], [428, 261, 13, 18, 13, 5], [428, 311, 21, 19, 21, 4], [428, 361, 19, 20, 19, 3], [428, 412, 19, 20, 19, 3], [428, 463, 19, 20, 19, 3], [428, 516, 19, 18, 19, 5], [428, 566, 19, 19, 19, 4], [428, 616, 21, 20, 21, 3], [428, 667, 21, 20, 21, 3], [428, 718, 21, 20, 21, 3], [428, 771, 21, 18, 21, 5], [489, 2, 13, 21, 13, 1], [489, 54, 15, 20, 15, 2], [489, 109, 19, 19, 19, 6], [489, 157, 21, 20, 21, 3], [489, 208, 19, 20, 19, 3], [489, 264, 21, 14, 21, 8], [489, 310, 23, 20, 23, 3], [489, 361, 19, 20, 19, 3], [489, 418, 23, 14, 23, 9], [489, 469, 23, 14, 23, 9], [489, 514, 23, 19, 23, 3], [489, 565, 13, 19, 13, 3], [489, 616, 13, 19, 13, 3], [489, 666, 29, 21, 29, 2], [489, 718, 29, 20, 29, 3], [489, 769, 21, 20, 21, 3], [550, 3, 29, 21, 29, 2], [550, 54, 29, 21, 29, 2], [550, 105, 29, 21, 29, 2], [550, 156, 29, 21, 29, 2], [550, 208, 21, 20, 21, 3], [550, 258, 29, 21, 29, 2], [550, 309, 29, 21, 29, 2], [550, 360, 29, 21, 29, 2], [550, 411, 29, 21, 29, 2], [550, 462, 29, 21, 29, 2], [550, 513, 29, 21, 29, 2], [550, 565, 19, 19, 19, 3], [550, 616, 17, 19, 17, 3], [550, 666, 29, 21, 29, 2], [550, 723, 25, 15, 25, 8], [550, 774, 19, 15, 19, 8], [611, 4, 19, 20, 19, 3], [611, 55, 13, 20, 13, 3], [611, 105, 29, 21, 29, 2], [611, 156, 29, 21, 29, 2], [611, 207, 29, 21, 29, 2], [611, 258, 29, 21, 29, 2], [611, 309, 29, 21, 29, 2], [611, 368, 19, 13, 19, 10], [611, 419, 19, 13, 19, 10], [611, 476, 23, 7, 23, 16], [611, 527, 21, 6, 21, 16], [611, 562, 25, 23, 25, 0], [611, 613, 25, 23, 25, 0], [611, 664, 21, 23, 21, 0], [611, 718, 29, 20, 29, 3], [611, 774, 27, 15, 27, 8], [672, 13, 15, 10, 15, 12], [672, 64, 23, 10, 23, 12], [672, 106, 15, 19, 15, 3], [672, 157, 15, 19, 15, 3], [672, 208, 11, 19, 11, 3], [672, 259, 11, 19, 11, 3], [672, 309, 29, 21, 29, 2], [672, 363, 23, 17, 23, 5], [672, 413, 21, 24, 21, 4], [1, 17, 13, 6, 13, 16], [794, 768, 29, 21, 29, 2], [672, 564, 29, 21, 29, 2], [672, 615, 29, 21, 29, 2], [672, 666, 29, 21, 29, 2], [672, 717, 29, 21, 29, 2], [672, 768, 29, 21, 29, 2], [733, 3, 29, 21, 29, 2], [733, 54, 29, 21, 29, 2], [733, 105, 29, 21, 29, 2], [733, 156, 29, 21, 29, 2], [733, 207, 29, 21, 29, 2], [733, 258, 29, 21, 29, 2], [733, 309, 29, 21, 29, 2], [733, 360, 29, 21, 29, 2], [733, 411, 29, 21, 29, 2], [733, 462, 29, 21, 29, 2], [733, 513, 29, 21, 29, 2], [733, 564, 29, 21, 29, 2], [733, 615, 29, 21, 29, 2], [733, 666, 29, 21, 29, 2], [733, 717, 29, 21, 29, 2], [733, 768, 29, 21, 29, 2], [1, 17, 13, 6, 13, 16], [794, 54, 29, 21, 29, 2], [794, 105, 29, 21, 29, 2], [794, 156, 29, 21, 29, 2], [794, 207, 29, 21, 29, 2], [794, 258, 29, 21, 29, 2], [794, 309, 29, 21, 29, 2], [794, 360, 29, 21, 29, 2], [794, 411, 29, 21, 29, 2], [794, 462, 29, 21, 29, 2], [794, 513, 29, 21, 29, 2], [794, 564, 29, 21, 29, 2], [794, 615, 29, 21, 29, 2], [794, 666, 29, 21, 29, 2], [794, 717, 29, 21, 29, 2], [794, 768, 29, 21, 29, 2], [855, 3, 29, 21, 29, 2], [855, 54, 29, 21, 29, 2], [855, 105, 29, 21, 29, 2], [855, 156, 29, 21, 29, 2], [855, 207, 29, 21, 29, 2], [855, 258, 29, 21, 29, 2], [855, 309, 29, 21, 29, 2], [855, 360, 29, 21, 29, 2], [855, 411, 29, 21, 29, 2], [855, 462, 29, 21, 29, 2], [855, 513, 29, 21, 29, 2], [855, 564, 29, 21, 29, 2], [855, 615, 29, 21, 29, 2], [855, 666, 29, 21, 29, 2], [855, 717, 29, 21, 29, 2], [855, 768, 29, 21, 29, 2]], \"widestlogicalchar\": 31, \"widestglyph\": 31, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 3, \"capHeight\": 21, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 16, 12, 6, 12, 15], [1, 55, 12, 18, 12, 3], [1, 106, 14, 18, 14, 3], [1, 157, 20, 18, 20, 3], [1, 206, 18, 22, 18, 1], [1, 261, 22, 16, 22, 5], [1, 310, 24, 18, 24, 3], [1, 361, 10, 18, 10, 3], [1, 410, 14, 22, 14, 1], [1, 461, 14, 22, 14, 1], [1, 514, 16, 18, 16, 3], [1, 571, 16, 12, 16, 9], [1, 628, 10, 9, 10, 15], [1, 677, 16, 8, 16, 13], [1, 730, 10, 6, 10, 15], [1, 769, 18, 18, 18, 3], [62, 4, 20, 18, 20, 3], [62, 55, 20, 18, 20, 3], [62, 106, 20, 18, 20, 3], [62, 157, 20, 20, 20, 3], [62, 208, 20, 18, 20, 3], [62, 259, 20, 20, 20, 3], [62, 309, 20, 19, 20, 2], [62, 361, 20, 18, 20, 3], [62, 412, 20, 18, 20, 3], [62, 463, 20, 18, 20, 3], [62, 520, 10, 12, 10, 9], [62, 571, 10, 15, 10, 9], [62, 621, 14, 13, 14, 8], [62, 676, 18, 9, 18, 12], [62, 723, 14, 13, 14, 8], [62, 769, 18, 18, 18, 3], [123, 10, 24, 13, 24, 9], [123, 55, 24, 18, 24, 3], [123, 106, 20, 18, 20, 3], [123, 157, 18, 18, 18, 3], [123, 208, 20, 18, 20, 3], [123, 259, 18, 18, 18, 3], [123, 310, 18, 18, 18, 3], [123, 361, 20, 18, 20, 3], [123, 412, 22, 18, 22, 3], [123, 463, 16, 18, 16, 3], [123, 514, 14, 23, 14, 3], [123, 565, 20, 18, 20, 3], [123, 616, 20, 18, 20, 3], [123, 667, 28, 18, 28, 3], [123, 718, 22, 18, 22, 3], [123, 769, 20, 18, 20, 3], [184, 4, 20, 18, 20, 3], [184, 55, 20, 22, 20, 3], [184, 106, 20, 18, 20, 3], [184, 157, 18, 18, 18, 3], [184, 207, 20, 19, 20, 2], [184, 259, 22, 18, 22, 3], [184, 310, 24, 18, 24, 3], [184, 361, 30, 18, 30, 3], [184, 412, 20, 18, 20, 3], [184, 463, 20, 18, 20, 3], [184, 513, 16, 19, 16, 2], [184, 563, 12, 22, 12, 1], [184, 616, 18, 18, 18, 3], [184, 665, 12, 22, 12, 1], [184, 718, 12, 18, 12, 3], [184, 781, 18, 6, 18, 15], [245, 4, 10, 18, 10, 3], [245, 60, 18, 13, 18, 8], [245, 106, 20, 18, 20, 3], [245, 162, 16, 13, 16, 8], [245, 208, 20, 18, 20, 3], [245, 264, 18, 13, 18, 8], [245, 310, 14, 18, 14, 3], [245, 366, 18, 17, 18, 8], [245, 412, 20, 18, 20, 3], [245, 463, 12, 18, 12, 3], [245, 514, 12, 23, 12, 3], [245, 565, 20, 18, 20, 3], [245, 616, 12, 18, 12, 3], [245, 672, 28, 13, 28, 8], [245, 723, 20, 13, 20, 8], [245, 774, 18, 13, 18, 8], [306, 9, 20, 17, 20, 8], [306, 60, 20, 17, 20, 8], [306, 111, 16, 13, 16, 8], [306, 162, 16, 13, 16, 8], [306, 210, 14, 16, 14, 5], [306, 264, 20, 13, 20, 8], [306, 315, 20, 13, 20, 8], [306, 366, 26, 13, 26, 8], [306, 417, 18, 13, 18, 8], [306, 468, 20, 18, 20, 8], [306, 518, 16, 14, 16, 7], [306, 564, 14, 21, 14, 2], [306, 615, 10, 21, 10, 2], [306, 666, 14, 21, 14, 2], [306, 718, 16, 18, 16, 3], [306, 781, 3, 6, 3, 15], [367, 1, 24, 21, 24, 0], [367, 52, 24, 21, 24, 0], [367, 106, 18, 22, 18, 3], [367, 154, 18, 21, 18, 0], [367, 205, 22, 21, 22, 0], [367, 256, 20, 21, 20, 0], [367, 307, 22, 21, 22, 0], [367, 361, 18, 18, 18, 3], [367, 412, 18, 18, 18, 3], [367, 463, 18, 18, 18, 3], [367, 516, 18, 16, 18, 5], [367, 566, 18, 17, 18, 4], [367, 615, 18, 19, 18, 2], [367, 672, 16, 16, 16, 8], [367, 718, 18, 18, 18, 3], [367, 769, 18, 18, 18, 3], [428, 4, 18, 18, 18, 3], [428, 57, 18, 16, 18, 5], [428, 106, 12, 18, 12, 3], [428, 157, 12, 18, 12, 3], [428, 208, 12, 18, 12, 3], [428, 261, 12, 16, 12, 5], [428, 311, 20, 17, 20, 4], [428, 361, 18, 18, 18, 3], [428, 412, 18, 18, 18, 3], [428, 463, 18, 18, 18, 3], [428, 516, 18, 16, 18, 5], [428, 566, 18, 17, 18, 4], [428, 616, 20, 18, 20, 3], [428, 667, 20, 18, 20, 3], [428, 718, 20, 18, 20, 3], [428, 771, 20, 16, 20, 5], [489, 2, 12, 20, 12, 1], [489, 54, 14, 19, 14, 2], [489, 109, 18, 17, 18, 6], [489, 157, 20, 18, 20, 3], [489, 208, 18, 18, 18, 3], [489, 264, 20, 13, 20, 8], [489, 310, 22, 18, 22, 3], [489, 361, 18, 18, 18, 3], [489, 418, 22, 12, 22, 9], [489, 469, 22, 12, 22, 9], [489, 514, 22, 18, 22, 3], [489, 565, 12, 18, 12, 3], [489, 616, 12, 18, 12, 3], [489, 666, 28, 19, 28, 2], [489, 718, 28, 18, 28, 3], [489, 769, 20, 18, 20, 3], [550, 3, 28, 19, 28, 2], [550, 54, 28, 19, 28, 2], [550, 105, 28, 19, 28, 2], [550, 156, 28, 19, 28, 2], [550, 208, 20, 18, 20, 3], [550, 258, 28, 19, 28, 2], [550, 309, 28, 19, 28, 2], [550, 360, 28, 19, 28, 2], [550, 411, 28, 19, 28, 2], [550, 462, 28, 19, 28, 2], [550, 513, 28, 19, 28, 2], [550, 565, 18, 18, 18, 3], [550, 616, 16, 18, 16, 3], [550, 666, 28, 19, 28, 2], [550, 723, 24, 13, 24, 8], [550, 774, 18, 13, 18, 8], [611, 4, 18, 18, 18, 3], [611, 55, 12, 18, 12, 3], [611, 105, 28, 19, 28, 2], [611, 156, 28, 19, 28, 2], [611, 207, 28, 19, 28, 2], [611, 258, 28, 19, 28, 2], [611, 309, 28, 19, 28, 2], [611, 368, 18, 11, 18, 10], [611, 419, 18, 11, 18, 10], [611, 475, 22, 6, 22, 15], [611, 526, 20, 6, 20, 15], [611, 562, 24, 21, 24, 0], [611, 613, 24, 21, 24, 0], [611, 664, 20, 21, 20, 0], [611, 718, 28, 18, 28, 3], [611, 774, 26, 13, 26, 8], [672, 13, 14, 9, 14, 12], [672, 64, 22, 9, 22, 12], [672, 106, 14, 18, 14, 3], [672, 157, 14, 18, 14, 3], [672, 208, 10, 18, 10, 3], [672, 259, 10, 18, 10, 3], [672, 309, 28, 19, 28, 2], [672, 363, 22, 16, 22, 5], [672, 413, 20, 22, 20, 4], [1, 16, 12, 6, 12, 15], [794, 768, 28, 19, 28, 2], [672, 564, 28, 19, 28, 2], [672, 615, 28, 19, 28, 2], [672, 666, 28, 19, 28, 2], [672, 717, 28, 19, 28, 2], [672, 768, 28, 19, 28, 2], [733, 3, 28, 19, 28, 2], [733, 54, 28, 19, 28, 2], [733, 105, 28, 19, 28, 2], [733, 156, 28, 19, 28, 2], [733, 207, 28, 19, 28, 2], [733, 258, 28, 19, 28, 2], [733, 309, 28, 19, 28, 2], [733, 360, 28, 19, 28, 2], [733, 411, 28, 19, 28, 2], [733, 462, 28, 19, 28, 2], [733, 513, 28, 19, 28, 2], [733, 564, 28, 19, 28, 2], [733, 615, 28, 19, 28, 2], [733, 666, 28, 19, 28, 2], [733, 717, 28, 19, 28, 2], [733, 768, 28, 19, 28, 2], [1, 16, 12, 6, 12, 15], [794, 54, 28, 19, 28, 2], [794, 105, 28, 19, 28, 2], [794, 156, 28, 19, 28, 2], [794, 207, 28, 19, 28, 2], [794, 258, 28, 19, 28, 2], [794, 309, 28, 19, 28, 2], [794, 360, 28, 19, 28, 2], [794, 411, 28, 19, 28, 2], [794, 462, 28, 19, 28, 2], [794, 513, 28, 19, 28, 2], [794, 564, 28, 19, 28, 2], [794, 615, 28, 19, 28, 2], [794, 666, 28, 19, 28, 2], [794, 717, 28, 19, 28, 2], [794, 768, 28, 19, 28, 2], [855, 3, 28, 19, 28, 2], [855, 54, 28, 19, 28, 2], [855, 105, 28, 19, 28, 2], [855, 156, 28, 19, 28, 2], [855, 207, 28, 19, 28, 2], [855, 258, 28, 19, 28, 2], [855, 309, 28, 19, 28, 2], [855, 360, 28, 19, 28, 2], [855, 411, 28, 19, 28, 2], [855, 462, 28, 19, 28, 2], [855, 513, 28, 19, 28, 2], [855, 564, 28, 19, 28, 2], [855, 615, 28, 19, 28, 2], [855, 666, 28, 19, 28, 2], [855, 717, 28, 19, 28, 2], [855, 768, 28, 19, 28, 2]], \"widestlogicalchar\": 30, \"widestglyph\": 30, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 55, 20, 20, 12, 3], [1, 106, 23, 6, 14, 3], [1, 157, 27, 14, 20, 3], [1, 206, 25, 24, 18, 1], [1, 261, 27, 18, 22, 5], [1, 310, 28, 20, 24, 3], [1, 361, 19, 6, 10, 3], [1, 410, 23, 24, 14, 1], [1, 461, 21, 24, 14, 1], [1, 514, 23, 10, 16, 3], [1, 571, 20, 11, 16, 9], [1, 632, 11, 7, 10, 19], [1, 677, 20, 3, 16, 13], [1, 734, 11, 4, 10, 19], [1, 769, 27, 20, 18, 3], [62, 4, 26, 20, 20, 3], [62, 55, 24, 20, 20, 3], [62, 106, 27, 20, 20, 3], [62, 157, 26, 22, 20, 3], [62, 208, 28, 20, 20, 3], [62, 259, 27, 22, 20, 3], [62, 309, 26, 21, 20, 2], [62, 361, 29, 20, 20, 3], [62, 412, 26, 20, 20, 3], [62, 463, 26, 20, 20, 3], [62, 520, 16, 14, 10, 9], [62, 571, 16, 17, 10, 9], [62, 621, 20, 13, 14, 8], [62, 676, 22, 6, 18, 12], [62, 723, 18, 13, 14, 8], [62, 769, 26, 20, 18, 3], [123, 10, 27, 15, 24, 9], [123, 55, 25, 20, 24, 3], [123, 106, 27, 20, 20, 3], [123, 157, 27, 20, 18, 3], [123, 208, 27, 20, 20, 3], [123, 259, 27, 20, 18, 3], [123, 310, 27, 20, 18, 3], [123, 361, 28, 20, 20, 3], [123, 412, 31, 20, 22, 3], [123, 463, 24, 20, 16, 3], [123, 514, 24, 25, 14, 3], [123, 565, 29, 20, 20, 3], [123, 616, 22, 20, 20, 3], [123, 667, 37, 20, 28, 3], [123, 718, 32, 20, 22, 3], [123, 769, 27, 20, 20, 3], [184, 4, 28, 20, 20, 3], [184, 55, 27, 24, 20, 3], [184, 106, 27, 20, 20, 3], [184, 157, 25, 20, 18, 3], [184, 207, 29, 21, 20, 2], [184, 259, 32, 20, 22, 3], [184, 310, 33, 20, 24, 3], [184, 361, 39, 20, 30, 3], [184, 412, 30, 20, 20, 3], [184, 463, 30, 20, 20, 3], [184, 513, 25, 21, 16, 2], [184, 563, 22, 24, 12, 1], [184, 616, 19, 20, 18, 3], [184, 665, 22, 24, 12, 1], [184, 718, 20, 5, 12, 3], [184, 786, 20, 3, 18, 20], [245, 4, 18, 5, 10, 3], [245, 60, 23, 15, 18, 8], [245, 106, 23, 20, 20, 3], [245, 162, 23, 15, 16, 8], [245, 208, 28, 20, 20, 3], [245, 264, 23, 15, 18, 8], [245, 310, 23, 20, 14, 3], [245, 366, 24, 19, 18, 8], [245, 412, 24, 20, 20, 3], [245, 463, 20, 20, 12, 3], [245, 514, 20, 25, 12, 3], [245, 565, 25, 20, 20, 3], [245, 616, 20, 20, 12, 3], [245, 672, 31, 15, 28, 8], [245, 723, 24, 15, 20, 8], [245, 774, 23, 15, 18, 8], [306, 9, 24, 19, 20, 8], [306, 60, 25, 19, 20, 8], [306, 111, 22, 15, 16, 8], [306, 162, 22, 15, 16, 8], [306, 210, 19, 18, 14, 5], [306, 264, 25, 15, 20, 8], [306, 315, 27, 15, 20, 8], [306, 366, 33, 15, 26, 8], [306, 417, 24, 15, 18, 8], [306, 468, 27, 20, 20, 8], [306, 518, 23, 16, 16, 7], [306, 564, 23, 23, 14, 2], [306, 615, 19, 23, 10, 2], [306, 666, 21, 23, 14, 2], [306, 718, 25, 4, 16, 3], [306, 766, 1, 1, 3, 1], [367, 1, 28, 23, 24, 0], [367, 52, 28, 23, 24, 0], [367, 106, 27, 24, 18, 3], [367, 154, 27, 23, 18, 0], [367, 205, 32, 23, 22, 0], [367, 256, 27, 23, 20, 0], [367, 307, 32, 23, 22, 0], [367, 361, 24, 20, 18, 3], [367, 412, 23, 20, 18, 3], [367, 463, 23, 20, 18, 3], [367, 516, 24, 18, 18, 5], [367, 566, 24, 19, 18, 4], [367, 615, 24, 21, 18, 2], [367, 672, 23, 18, 16, 8], [367, 718, 23, 20, 18, 3], [367, 769, 23, 20, 18, 3], [428, 4, 24, 20, 18, 3], [428, 57, 23, 18, 18, 5], [428, 106, 21, 20, 12, 3], [428, 157, 20, 20, 12, 3], [428, 208, 21, 20, 12, 3], [428, 261, 21, 18, 12, 5], [428, 311, 25, 19, 20, 4], [428, 361, 23, 20, 18, 3], [428, 412, 22, 20, 18, 3], [428, 463, 23, 20, 18, 3], [428, 516, 23, 18, 18, 5], [428, 566, 23, 19, 18, 4], [428, 616, 25, 20, 20, 3], [428, 667, 25, 20, 20, 3], [428, 718, 25, 20, 20, 3], [428, 771, 25, 18, 20, 5], [489, 2, 22, 12, 12, 1], [489, 54, 23, 7, 14, 2], [489, 109, 24, 19, 18, 6], [489, 157, 25, 20, 20, 3], [489, 208, 25, 20, 18, 3], [489, 264, 23, 12, 20, 8], [489, 310, 32, 20, 22, 3], [489, 361, 27, 20, 18, 3], [489, 418, 25, 14, 22, 9], [489, 469, 25, 14, 22, 9], [489, 514, 28, 7, 22, 3], [489, 565, 20, 5, 12, 3], [489, 616, 21, 3, 12, 3], [489, 666, 36, 21, 28, 2], [489, 718, 36, 20, 28, 3], [489, 769, 30, 20, 20, 3], [550, 3, 36, 21, 28, 2], [550, 54, 36, 21, 28, 2], [550, 105, 36, 21, 28, 2], [550, 156, 36, 21, 28, 2], [550, 208, 30, 20, 20, 3], [550, 258, 36, 21, 28, 2], [550, 309, 36, 21, 28, 2], [550, 360, 36, 21, 28, 2], [550, 411, 36, 21, 28, 2], [550, 462, 36, 21, 28, 2], [550, 513, 36, 21, 28, 2], [550, 565, 24, 15, 18, 3], [550, 616, 24, 15, 16, 3], [550, 666, 36, 21, 28, 2], [550, 723, 30, 15, 24, 8], [550, 774, 25, 15, 18, 8], [611, 4, 24, 20, 18, 3], [611, 55, 20, 20, 12, 3], [611, 105, 36, 21, 28, 2], [611, 156, 36, 21, 28, 2], [611, 207, 36, 21, 28, 2], [611, 258, 36, 21, 28, 2], [611, 309, 36, 21, 28, 2], [611, 368, 23, 13, 18, 10], [611, 419, 21, 13, 18, 10], [611, 479, 22, 4, 22, 19], [611, 511, 1, 1, 20, 1], [611, 562, 27, 23, 24, 0], [611, 613, 30, 23, 24, 0], [611, 664, 28, 23, 20, 0], [611, 718, 35, 20, 28, 3], [611, 774, 32, 15, 26, 8], [672, 13, 19, 4, 14, 12], [672, 64, 27, 4, 22, 12], [672, 106, 23, 7, 14, 3], [672, 157, 23, 7, 14, 3], [672, 208, 19, 7, 10, 3], [672, 259, 19, 7, 10, 3], [672, 309, 36, 21, 28, 2], [672, 363, 26, 16, 22, 5], [672, 413, 27, 24, 20, 4], [1, 1, 1, 1, 12, 1], [794, 768, 36, 21, 28, 2], [672, 564, 36, 21, 28, 2], [672, 615, 36, 21, 28, 2], [672, 666, 36, 21, 28, 2], [672, 717, 36, 21, 28, 2], [672, 768, 36, 21, 28, 2], [733, 3, 36, 21, 28, 2], [733, 54, 36, 21, 28, 2], [733, 105, 36, 21, 28, 2], [733, 156, 36, 21, 28, 2], [733, 207, 36, 21, 28, 2], [733, 258, 36, 21, 28, 2], [733, 309, 36, 21, 28, 2], [733, 360, 36, 21, 28, 2], [733, 411, 36, 21, 28, 2], [733, 462, 36, 21, 28, 2], [733, 513, 36, 21, 28, 2], [733, 564, 36, 21, 28, 2], [733, 615, 36, 21, 28, 2], [733, 666, 36, 21, 28, 2], [733, 717, 36, 21, 28, 2], [733, 768, 36, 21, 28, 2], [1, 1, 1, 1, 12, 1], [794, 54, 36, 21, 28, 2], [794, 105, 36, 21, 28, 2], [794, 156, 36, 21, 28, 2], [794, 207, 36, 21, 28, 2], [794, 258, 36, 21, 28, 2], [794, 309, 36, 21, 28, 2], [794, 360, 36, 21, 28, 2], [794, 411, 36, 21, 28, 2], [794, 462, 36, 21, 28, 2], [794, 513, 36, 21, 28, 2], [794, 564, 36, 21, 28, 2], [794, 615, 36, 21, 28, 2], [794, 666, 36, 21, 28, 2], [794, 717, 36, 21, 28, 2], [794, 768, 36, 21, 28, 2], [855, 3, 36, 21, 28, 2], [855, 54, 36, 21, 28, 2], [855, 105, 36, 21, 28, 2], [855, 156, 36, 21, 28, 2], [855, 207, 36, 21, 28, 2], [855, 258, 36, 21, 28, 2], [855, 309, 36, 21, 28, 2], [855, 360, 36, 21, 28, 2], [855, 411, 36, 21, 28, 2], [855, 462, 36, 21, 28, 2], [855, 513, 36, 21, 28, 2], [855, 564, 36, 21, 28, 2], [855, 615, 36, 21, 28, 2], [855, 666, 36, 21, 28, 2], [855, 717, 36, 21, 28, 2], [855, 768, 36, 21, 28, 2]], \"capHeight\": 22, \"widestlogicalchar\": 30, \"widestglyph\": 39, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 19, 18, 11, 3], [1, 106, 22, 4, 13, 3], [1, 157, 26, 12, 19, 3], [1, 206, 24, 22, 17, 1], [1, 261, 26, 16, 21, 5], [1, 310, 27, 18, 23, 3], [1, 361, 18, 4, 9, 3], [1, 410, 22, 22, 13, 1], [1, 461, 20, 22, 13, 1], [1, 514, 22, 8, 15, 3], [1, 571, 19, 9, 15, 9], [1, 632, 10, 5, 9, 19], [1, 677, 19, 1, 15, 13], [1, 734, 10, 2, 9, 19], [1, 769, 26, 18, 17, 3], [62, 4, 25, 18, 19, 3], [62, 55, 23, 18, 19, 3], [62, 106, 26, 18, 19, 3], [62, 157, 25, 20, 19, 3], [62, 208, 27, 18, 19, 3], [62, 259, 26, 20, 19, 3], [62, 309, 25, 19, 19, 2], [62, 361, 28, 18, 19, 3], [62, 412, 25, 18, 19, 3], [62, 463, 25, 18, 19, 3], [62, 520, 15, 12, 9, 9], [62, 571, 15, 15, 9, 9], [62, 621, 19, 11, 13, 8], [62, 676, 21, 4, 17, 12], [62, 723, 17, 11, 13, 8], [62, 769, 25, 18, 17, 3], [123, 10, 26, 13, 23, 9], [123, 55, 24, 18, 23, 3], [123, 106, 26, 18, 19, 3], [123, 157, 26, 18, 17, 3], [123, 208, 26, 18, 19, 3], [123, 259, 26, 18, 17, 3], [123, 310, 26, 18, 17, 3], [123, 361, 27, 18, 19, 3], [123, 412, 30, 18, 21, 3], [123, 463, 23, 18, 15, 3], [123, 514, 23, 23, 13, 3], [123, 565, 28, 18, 19, 3], [123, 616, 21, 18, 19, 3], [123, 667, 36, 18, 27, 3], [123, 718, 31, 18, 21, 3], [123, 769, 26, 18, 19, 3], [184, 4, 27, 18, 19, 3], [184, 55, 26, 22, 19, 3], [184, 106, 26, 18, 19, 3], [184, 157, 24, 18, 17, 3], [184, 207, 28, 19, 19, 2], [184, 259, 31, 18, 21, 3], [184, 310, 32, 18, 23, 3], [184, 361, 38, 18, 29, 3], [184, 412, 29, 18, 19, 3], [184, 463, 29, 18, 19, 3], [184, 513, 24, 19, 15, 2], [184, 563, 21, 22, 11, 1], [184, 616, 18, 18, 17, 3], [184, 665, 21, 22, 11, 1], [184, 718, 19, 3, 11, 3], [184, 786, 19, 1, 17, 20], [245, 4, 17, 3, 9, 3], [245, 60, 22, 13, 17, 8], [245, 106, 22, 18, 19, 3], [245, 162, 22, 13, 15, 8], [245, 208, 27, 18, 19, 3], [245, 264, 22, 13, 17, 8], [245, 310, 22, 18, 13, 3], [245, 366, 23, 17, 17, 8], [245, 412, 23, 18, 19, 3], [245, 463, 19, 18, 11, 3], [245, 514, 19, 23, 11, 3], [245, 565, 24, 18, 19, 3], [245, 616, 19, 18, 11, 3], [245, 672, 30, 13, 27, 8], [245, 723, 23, 13, 19, 8], [245, 774, 22, 13, 17, 8], [306, 9, 23, 17, 19, 8], [306, 60, 24, 17, 19, 8], [306, 111, 21, 13, 15, 8], [306, 162, 21, 13, 15, 8], [306, 210, 18, 16, 13, 5], [306, 264, 24, 13, 19, 8], [306, 315, 26, 13, 19, 8], [306, 366, 32, 13, 25, 8], [306, 417, 23, 13, 17, 8], [306, 468, 26, 18, 19, 8], [306, 518, 22, 14, 15, 7], [306, 564, 22, 21, 13, 2], [306, 615, 18, 21, 9, 2], [306, 666, 20, 21, 13, 2], [306, 718, 24, 2, 15, 3], [306, 766, 1, 1, 3, 1], [367, 1, 24, 21, 23, 0], [367, 52, 27, 21, 23, 0], [367, 106, 26, 22, 17, 3], [367, 154, 26, 21, 17, 0], [367, 205, 31, 21, 21, 0], [367, 256, 26, 21, 19, 0], [367, 307, 31, 21, 21, 0], [367, 361, 23, 18, 17, 3], [367, 412, 22, 18, 17, 3], [367, 463, 22, 18, 17, 3], [367, 516, 23, 16, 17, 5], [367, 566, 23, 17, 17, 4], [367, 615, 23, 19, 17, 2], [367, 672, 22, 16, 15, 8], [367, 718, 22, 18, 17, 3], [367, 769, 22, 18, 17, 3], [428, 4, 23, 18, 17, 3], [428, 57, 22, 16, 17, 5], [428, 106, 20, 18, 11, 3], [428, 157, 19, 18, 11, 3], [428, 208, 20, 18, 11, 3], [428, 261, 20, 16, 11, 5], [428, 311, 24, 17, 19, 4], [428, 361, 22, 18, 17, 3], [428, 412, 21, 18, 17, 3], [428, 463, 22, 18, 17, 3], [428, 516, 22, 16, 17, 5], [428, 566, 22, 17, 17, 4], [428, 616, 24, 18, 19, 3], [428, 667, 24, 18, 19, 3], [428, 718, 24, 18, 19, 3], [428, 771, 24, 16, 19, 5], [489, 2, 21, 10, 11, 1], [489, 54, 22, 5, 13, 2], [489, 109, 23, 17, 17, 6], [489, 157, 24, 18, 19, 3], [489, 208, 24, 18, 17, 3], [489, 264, 22, 10, 19, 8], [489, 310, 31, 18, 21, 3], [489, 361, 26, 18, 17, 3], [489, 418, 24, 12, 21, 9], [489, 469, 24, 12, 21, 9], [489, 514, 27, 5, 21, 3], [489, 565, 19, 3, 11, 3], [489, 616, 20, 1, 11, 3], [489, 666, 35, 19, 27, 2], [489, 718, 35, 18, 27, 3], [489, 769, 29, 18, 19, 3], [550, 3, 35, 19, 27, 2], [550, 54, 35, 19, 27, 2], [550, 105, 35, 19, 27, 2], [550, 156, 35, 19, 27, 2], [550, 208, 29, 18, 19, 3], [550, 258, 35, 19, 27, 2], [550, 309, 35, 19, 27, 2], [550, 360, 35, 19, 27, 2], [550, 411, 35, 19, 27, 2], [550, 462, 35, 19, 27, 2], [550, 513, 35, 19, 27, 2], [550, 565, 23, 13, 17, 3], [550, 616, 23, 13, 15, 3], [550, 666, 35, 19, 27, 2], [550, 723, 29, 13, 23, 8], [550, 774, 24, 13, 17, 8], [611, 4, 23, 18, 17, 3], [611, 55, 19, 18, 11, 3], [611, 105, 35, 19, 27, 2], [611, 156, 35, 19, 27, 2], [611, 207, 35, 19, 27, 2], [611, 258, 35, 19, 27, 2], [611, 309, 35, 19, 27, 2], [611, 368, 22, 11, 17, 10], [611, 419, 20, 11, 17, 10], [611, 479, 21, 2, 21, 19], [611, 511, 1, 1, 19, 1], [611, 562, 26, 21, 23, 0], [611, 613, 28, 21, 23, 0], [611, 664, 26, 21, 19, 0], [611, 718, 34, 18, 27, 3], [611, 774, 31, 13, 25, 8], [672, 13, 18, 2, 13, 12], [672, 64, 26, 2, 21, 12], [672, 106, 22, 5, 13, 3], [672, 157, 22, 5, 13, 3], [672, 208, 18, 5, 9, 3], [672, 259, 18, 5, 9, 3], [672, 309, 35, 19, 27, 2], [672, 363, 25, 14, 21, 5], [672, 413, 26, 22, 19, 4], [1, 1, 1, 1, 11, 1], [794, 768, 35, 19, 27, 2], [672, 564, 35, 19, 27, 2], [672, 615, 35, 19, 27, 2], [672, 666, 35, 19, 27, 2], [672, 717, 35, 19, 27, 2], [672, 768, 35, 19, 27, 2], [733, 3, 35, 19, 27, 2], [733, 54, 35, 19, 27, 2], [733, 105, 35, 19, 27, 2], [733, 156, 35, 19, 27, 2], [733, 207, 35, 19, 27, 2], [733, 258, 35, 19, 27, 2], [733, 309, 35, 19, 27, 2], [733, 360, 35, 19, 27, 2], [733, 411, 35, 19, 27, 2], [733, 462, 35, 19, 27, 2], [733, 513, 35, 19, 27, 2], [733, 564, 35, 19, 27, 2], [733, 615, 35, 19, 27, 2], [733, 666, 35, 19, 27, 2], [733, 717, 35, 19, 27, 2], [733, 768, 35, 19, 27, 2], [1, 1, 1, 1, 11, 1], [794, 54, 35, 19, 27, 2], [794, 105, 35, 19, 27, 2], [794, 156, 35, 19, 27, 2], [794, 207, 35, 19, 27, 2], [794, 258, 35, 19, 27, 2], [794, 309, 35, 19, 27, 2], [794, 360, 35, 19, 27, 2], [794, 411, 35, 19, 27, 2], [794, 462, 35, 19, 27, 2], [794, 513, 35, 19, 27, 2], [794, 564, 35, 19, 27, 2], [794, 615, 35, 19, 27, 2], [794, 666, 35, 19, 27, 2], [794, 717, 35, 19, 27, 2], [794, 768, 35, 19, 27, 2], [855, 3, 35, 19, 27, 2], [855, 54, 35, 19, 27, 2], [855, 105, 35, 19, 27, 2], [855, 156, 35, 19, 27, 2], [855, 207, 35, 19, 27, 2], [855, 258, 35, 19, 27, 2], [855, 309, 35, 19, 27, 2], [855, 360, 35, 19, 27, 2], [855, 411, 35, 19, 27, 2], [855, 462, 35, 19, 27, 2], [855, 513, 35, 19, 27, 2], [855, 564, 35, 19, 27, 2], [855, 615, 35, 19, 27, 2], [855, 666, 35, 19, 27, 2], [855, 717, 35, 19, 27, 2], [855, 768, 35, 19, 27, 2]], \"capHeight\": 21, \"widestlogicalchar\": 29, \"widestglyph\": 38, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 2, \"capHeight\": 22, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 17, 12, 6, 12, 16], [1, 55, 12, 20, 12, 3], [1, 106, 14, 19, 14, 3], [1, 157, 20, 19, 20, 3], [1, 206, 18, 24, 18, 1], [1, 261, 22, 18, 22, 5], [1, 310, 24, 20, 24, 3], [1, 361, 10, 19, 10, 3], [1, 410, 14, 24, 14, 1], [1, 461, 14, 24, 14, 1], [1, 514, 16, 19, 16, 3], [1, 571, 16, 13, 16, 9], [1, 629, 10, 10, 10, 16], [1, 677, 16, 9, 16, 13], [1, 731, 10, 7, 10, 16], [1, 769, 18, 20, 18, 3], [62, 4, 20, 20, 20, 3], [62, 55, 20, 20, 20, 3], [62, 106, 20, 20, 20, 3], [62, 157, 20, 22, 20, 3], [62, 208, 20, 20, 20, 3], [62, 259, 20, 22, 20, 3], [62, 309, 20, 21, 20, 2], [62, 361, 20, 20, 20, 3], [62, 412, 20, 20, 20, 3], [62, 463, 20, 20, 20, 3], [62, 520, 10, 14, 10, 9], [62, 571, 10, 17, 10, 9], [62, 621, 14, 14, 14, 8], [62, 676, 18, 10, 18, 12], [62, 723, 14, 14, 14, 8], [62, 769, 18, 20, 18, 3], [123, 10, 24, 15, 24, 9], [123, 55, 24, 20, 24, 3], [123, 106, 20, 20, 20, 3], [123, 157, 18, 20, 18, 3], [123, 208, 20, 20, 20, 3], [123, 259, 18, 20, 18, 3], [123, 310, 18, 20, 18, 3], [123, 361, 20, 20, 20, 3], [123, 412, 22, 20, 22, 3], [123, 463, 16, 20, 16, 3], [123, 514, 14, 25, 14, 3], [123, 565, 20, 20, 20, 3], [123, 616, 20, 20, 20, 3], [123, 667, 28, 20, 28, 3], [123, 718, 22, 20, 22, 3], [123, 769, 20, 20, 20, 3], [184, 4, 20, 20, 20, 3], [184, 55, 20, 24, 20, 3], [184, 106, 20, 20, 20, 3], [184, 157, 18, 20, 18, 3], [184, 207, 20, 21, 20, 2], [184, 259, 22, 20, 22, 3], [184, 310, 24, 20, 24, 3], [184, 361, 30, 20, 30, 3], [184, 412, 20, 20, 20, 3], [184, 463, 20, 20, 20, 3], [184, 513, 16, 21, 16, 2], [184, 563, 12, 24, 12, 1], [184, 616, 18, 20, 18, 3], [184, 665, 12, 24, 12, 1], [184, 718, 12, 19, 12, 3], [184, 782, 18, 7, 18, 16], [245, 4, 10, 19, 10, 3], [245, 60, 18, 15, 18, 8], [245, 106, 20, 20, 20, 3], [245, 162, 16, 15, 16, 8], [245, 208, 20, 20, 20, 3], [245, 264, 18, 15, 18, 8], [245, 310, 14, 20, 14, 3], [245, 366, 18, 19, 18, 8], [245, 412, 20, 20, 20, 3], [245, 463, 12, 20, 12, 3], [245, 514, 12, 25, 12, 3], [245, 565, 20, 20, 20, 3], [245, 616, 12, 20, 12, 3], [245, 672, 28, 15, 28, 8], [245, 723, 20, 15, 20, 8], [245, 774, 18, 15, 18, 8], [306, 9, 20, 19, 20, 8], [306, 60, 20, 19, 20, 8], [306, 111, 16, 15, 16, 8], [306, 162, 16, 15, 16, 8], [306, 210, 14, 18, 14, 5], [306, 264, 20, 15, 20, 8], [306, 315, 20, 15, 20, 8], [306, 366, 26, 15, 26, 8], [306, 417, 18, 15, 18, 8], [306, 468, 20, 20, 20, 8], [306, 518, 16, 16, 16, 7], [306, 564, 14, 23, 14, 2], [306, 615, 10, 23, 10, 2], [306, 666, 14, 23, 14, 2], [306, 718, 16, 19, 16, 3], [306, 782, 3, 6, 3, 16], [367, 1, 24, 23, 24, 0], [367, 52, 24, 23, 24, 0], [367, 106, 18, 24, 18, 3], [367, 154, 18, 23, 18, 0], [367, 205, 22, 23, 22, 0], [367, 256, 20, 23, 20, 0], [367, 307, 22, 23, 22, 0], [367, 361, 18, 20, 18, 3], [367, 412, 18, 20, 18, 3], [367, 463, 18, 20, 18, 3], [367, 516, 18, 18, 18, 5], [367, 566, 18, 19, 18, 4], [367, 615, 18, 21, 18, 2], [367, 672, 16, 18, 16, 8], [367, 718, 18, 20, 18, 3], [367, 769, 18, 20, 18, 3], [428, 4, 18, 20, 18, 3], [428, 57, 18, 18, 18, 5], [428, 106, 12, 20, 12, 3], [428, 157, 12, 20, 12, 3], [428, 208, 12, 20, 12, 3], [428, 261, 12, 18, 12, 5], [428, 311, 20, 19, 20, 4], [428, 361, 18, 20, 18, 3], [428, 412, 18, 20, 18, 3], [428, 463, 18, 20, 18, 3], [428, 516, 18, 18, 18, 5], [428, 566, 18, 19, 18, 4], [428, 616, 20, 20, 20, 3], [428, 667, 20, 20, 20, 3], [428, 718, 20, 20, 20, 3], [428, 771, 20, 18, 20, 5], [489, 2, 12, 21, 12, 1], [489, 54, 14, 20, 14, 2], [489, 109, 18, 19, 18, 6], [489, 157, 20, 20, 20, 3], [489, 208, 18, 20, 18, 3], [489, 264, 20, 14, 20, 8], [489, 310, 22, 20, 22, 3], [489, 361, 18, 20, 18, 3], [489, 418, 22, 14, 22, 9], [489, 469, 22, 14, 22, 9], [489, 514, 22, 19, 22, 3], [489, 565, 12, 19, 12, 3], [489, 616, 12, 19, 12, 3], [489, 666, 28, 21, 28, 2], [489, 718, 28, 20, 28, 3], [489, 769, 20, 20, 20, 3], [550, 3, 28, 21, 28, 2], [550, 54, 28, 21, 28, 2], [550, 105, 28, 21, 28, 2], [550, 156, 28, 21, 28, 2], [550, 208, 20, 20, 20, 3], [550, 258, 28, 21, 28, 2], [550, 309, 28, 21, 28, 2], [550, 360, 28, 21, 28, 2], [550, 411, 28, 21, 28, 2], [550, 462, 28, 21, 28, 2], [550, 513, 28, 21, 28, 2], [550, 565, 18, 19, 18, 3], [550, 616, 16, 19, 16, 3], [550, 666, 28, 21, 28, 2], [550, 723, 24, 15, 24, 8], [550, 774, 18, 15, 18, 8], [611, 4, 18, 20, 18, 3], [611, 55, 12, 20, 12, 3], [611, 105, 28, 21, 28, 2], [611, 156, 28, 21, 28, 2], [611, 207, 28, 21, 28, 2], [611, 258, 28, 21, 28, 2], [611, 309, 28, 21, 28, 2], [611, 368, 18, 13, 18, 10], [611, 419, 18, 13, 18, 10], [611, 476, 22, 7, 22, 16], [611, 527, 20, 6, 20, 16], [611, 562, 24, 23, 24, 0], [611, 613, 24, 23, 24, 0], [611, 664, 20, 23, 20, 0], [611, 718, 28, 20, 28, 3], [611, 774, 26, 15, 26, 8], [672, 13, 14, 10, 14, 12], [672, 64, 22, 10, 22, 12], [672, 106, 14, 19, 14, 3], [672, 157, 14, 19, 14, 3], [672, 208, 10, 19, 10, 3], [672, 259, 10, 19, 10, 3], [672, 309, 28, 21, 28, 2], [672, 363, 22, 17, 22, 5], [672, 413, 20, 24, 20, 4], [1, 17, 12, 6, 12, 16], [794, 768, 28, 21, 28, 2], [672, 564, 28, 21, 28, 2], [672, 615, 28, 21, 28, 2], [672, 666, 28, 21, 28, 2], [672, 717, 28, 21, 28, 2], [672, 768, 28, 21, 28, 2], [733, 3, 28, 21, 28, 2], [733, 54, 28, 21, 28, 2], [733, 105, 28, 21, 28, 2], [733, 156, 28, 21, 28, 2], [733, 207, 28, 21, 28, 2], [733, 258, 28, 21, 28, 2], [733, 309, 28, 21, 28, 2], [733, 360, 28, 21, 28, 2], [733, 411, 28, 21, 28, 2], [733, 462, 28, 21, 28, 2], [733, 513, 28, 21, 28, 2], [733, 564, 28, 21, 28, 2], [733, 615, 28, 21, 28, 2], [733, 666, 28, 21, 28, 2], [733, 717, 28, 21, 28, 2], [733, 768, 28, 21, 28, 2], [1, 17, 12, 6, 12, 16], [794, 54, 28, 21, 28, 2], [794, 105, 28, 21, 28, 2], [794, 156, 28, 21, 28, 2], [794, 207, 28, 21, 28, 2], [794, 258, 28, 21, 28, 2], [794, 309, 28, 21, 28, 2], [794, 360, 28, 21, 28, 2], [794, 411, 28, 21, 28, 2], [794, 462, 28, 21, 28, 2], [794, 513, 28, 21, 28, 2], [794, 564, 28, 21, 28, 2], [794, 615, 28, 21, 28, 2], [794, 666, 28, 21, 28, 2], [794, 717, 28, 21, 28, 2], [794, 768, 28, 21, 28, 2], [855, 3, 28, 21, 28, 2], [855, 54, 28, 21, 28, 2], [855, 105, 28, 21, 28, 2], [855, 156, 28, 21, 28, 2], [855, 207, 28, 21, 28, 2], [855, 258, 28, 21, 28, 2], [855, 309, 28, 21, 28, 2], [855, 360, 28, 21, 28, 2], [855, 411, 28, 21, 28, 2], [855, 462, 28, 21, 28, 2], [855, 513, 28, 21, 28, 2], [855, 564, 28, 21, 28, 2], [855, 615, 28, 21, 28, 2], [855, 666, 28, 21, 28, 2], [855, 717, 28, 21, 28, 2], [855, 768, 28, 21, 28, 2]], \"widestlogicalchar\": 30, \"widestglyph\": 30, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 29, \"leftmost\": 3, \"capHeight\": 21, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 16, 11, 6, 11, 15], [1, 55, 11, 18, 11, 3], [1, 106, 13, 18, 13, 3], [1, 157, 19, 18, 19, 3], [1, 206, 17, 22, 17, 1], [1, 261, 21, 16, 21, 5], [1, 310, 23, 18, 23, 3], [1, 361, 9, 18, 9, 3], [1, 410, 13, 22, 13, 1], [1, 461, 13, 22, 13, 1], [1, 514, 15, 18, 15, 3], [1, 571, 15, 12, 15, 9], [1, 628, 9, 9, 9, 15], [1, 677, 15, 8, 15, 13], [1, 730, 9, 6, 9, 15], [1, 769, 17, 18, 17, 3], [62, 4, 19, 18, 19, 3], [62, 55, 19, 18, 19, 3], [62, 106, 19, 18, 19, 3], [62, 157, 19, 20, 19, 3], [62, 208, 19, 18, 19, 3], [62, 259, 19, 20, 19, 3], [62, 309, 19, 19, 19, 2], [62, 361, 19, 18, 19, 3], [62, 412, 19, 18, 19, 3], [62, 463, 19, 18, 19, 3], [62, 520, 9, 12, 9, 9], [62, 571, 9, 15, 9, 9], [62, 621, 13, 13, 13, 8], [62, 676, 17, 9, 17, 12], [62, 723, 13, 13, 13, 8], [62, 769, 17, 18, 17, 3], [123, 10, 23, 13, 23, 9], [123, 55, 23, 18, 23, 3], [123, 106, 19, 18, 19, 3], [123, 157, 17, 18, 17, 3], [123, 208, 19, 18, 19, 3], [123, 259, 17, 18, 17, 3], [123, 310, 17, 18, 17, 3], [123, 361, 19, 18, 19, 3], [123, 412, 21, 18, 21, 3], [123, 463, 15, 18, 15, 3], [123, 514, 13, 23, 13, 3], [123, 565, 19, 18, 19, 3], [123, 616, 19, 18, 19, 3], [123, 667, 27, 18, 27, 3], [123, 718, 21, 18, 21, 3], [123, 769, 19, 18, 19, 3], [184, 4, 19, 18, 19, 3], [184, 55, 19, 22, 19, 3], [184, 106, 19, 18, 19, 3], [184, 157, 17, 18, 17, 3], [184, 207, 19, 19, 19, 2], [184, 259, 21, 18, 21, 3], [184, 310, 23, 18, 23, 3], [184, 361, 29, 18, 29, 3], [184, 412, 19, 18, 19, 3], [184, 463, 19, 18, 19, 3], [184, 513, 15, 19, 15, 2], [184, 563, 11, 22, 11, 1], [184, 616, 17, 18, 17, 3], [184, 665, 11, 22, 11, 1], [184, 718, 11, 18, 11, 3], [184, 781, 17, 6, 17, 15], [245, 4, 9, 18, 9, 3], [245, 60, 17, 13, 17, 8], [245, 106, 19, 18, 19, 3], [245, 162, 15, 13, 15, 8], [245, 208, 19, 18, 19, 3], [245, 264, 17, 13, 17, 8], [245, 310, 13, 18, 13, 3], [245, 366, 17, 17, 17, 8], [245, 412, 19, 18, 19, 3], [245, 463, 11, 18, 11, 3], [245, 514, 11, 23, 11, 3], [245, 565, 19, 18, 19, 3], [245, 616, 11, 18, 11, 3], [245, 672, 27, 13, 27, 8], [245, 723, 19, 13, 19, 8], [245, 774, 17, 13, 17, 8], [306, 9, 19, 17, 19, 8], [306, 60, 19, 17, 19, 8], [306, 111, 15, 13, 15, 8], [306, 162, 15, 13, 15, 8], [306, 210, 13, 16, 13, 5], [306, 264, 19, 13, 19, 8], [306, 315, 19, 13, 19, 8], [306, 366, 25, 13, 25, 8], [306, 417, 17, 13, 17, 8], [306, 468, 19, 18, 19, 8], [306, 518, 15, 14, 15, 7], [306, 564, 13, 21, 13, 2], [306, 615, 9, 21, 9, 2], [306, 666, 13, 21, 13, 2], [306, 718, 15, 18, 15, 3], [306, 781, 3, 6, 3, 15], [367, 1, 23, 21, 23, 0], [367, 52, 23, 21, 23, 0], [367, 106, 17, 22, 17, 3], [367, 154, 17, 21, 17, 0], [367, 205, 21, 21, 21, 0], [367, 256, 19, 21, 19, 0], [367, 307, 21, 21, 21, 0], [367, 361, 17, 18, 17, 3], [367, 412, 17, 18, 17, 3], [367, 463, 17, 18, 17, 3], [367, 516, 17, 16, 17, 5], [367, 566, 17, 17, 17, 4], [367, 615, 17, 19, 17, 2], [367, 672, 15, 16, 15, 8], [367, 718, 17, 18, 17, 3], [367, 769, 17, 18, 17, 3], [428, 4, 17, 18, 17, 3], [428, 57, 17, 16, 17, 5], [428, 106, 11, 18, 11, 3], [428, 157, 11, 18, 11, 3], [428, 208, 11, 18, 11, 3], [428, 261, 11, 16, 11, 5], [428, 311, 19, 17, 19, 4], [428, 361, 17, 18, 17, 3], [428, 412, 17, 18, 17, 3], [428, 463, 17, 18, 17, 3], [428, 516, 17, 16, 17, 5], [428, 566, 17, 17, 17, 4], [428, 616, 19, 18, 19, 3], [428, 667, 19, 18, 19, 3], [428, 718, 19, 18, 19, 3], [428, 771, 19, 16, 19, 5], [489, 2, 11, 20, 11, 1], [489, 54, 13, 19, 13, 2], [489, 109, 17, 17, 17, 6], [489, 157, 19, 18, 19, 3], [489, 208, 17, 18, 17, 3], [489, 264, 19, 13, 19, 8], [489, 310, 21, 18, 21, 3], [489, 361, 17, 18, 17, 3], [489, 418, 21, 12, 21, 9], [489, 469, 21, 12, 21, 9], [489, 514, 21, 18, 21, 3], [489, 565, 11, 18, 11, 3], [489, 616, 11, 18, 11, 3], [489, 666, 27, 19, 27, 2], [489, 718, 27, 18, 27, 3], [489, 769, 19, 18, 19, 3], [550, 3, 27, 19, 27, 2], [550, 54, 27, 19, 27, 2], [550, 105, 27, 19, 27, 2], [550, 156, 27, 19, 27, 2], [550, 208, 19, 18, 19, 3], [550, 258, 27, 19, 27, 2], [550, 309, 27, 19, 27, 2], [550, 360, 27, 19, 27, 2], [550, 411, 27, 19, 27, 2], [550, 462, 27, 19, 27, 2], [550, 513, 27, 19, 27, 2], [550, 565, 17, 18, 17, 3], [550, 616, 15, 18, 15, 3], [550, 666, 27, 19, 27, 2], [550, 723, 23, 13, 23, 8], [550, 774, 17, 13, 17, 8], [611, 4, 17, 18, 17, 3], [611, 55, 11, 18, 11, 3], [611, 105, 27, 19, 27, 2], [611, 156, 27, 19, 27, 2], [611, 207, 27, 19, 27, 2], [611, 258, 27, 19, 27, 2], [611, 309, 27, 19, 27, 2], [611, 368, 17, 11, 17, 10], [611, 419, 17, 11, 17, 10], [611, 475, 21, 6, 21, 15], [611, 526, 19, 6, 19, 15], [611, 562, 23, 21, 23, 0], [611, 613, 23, 21, 23, 0], [611, 664, 19, 21, 19, 0], [611, 718, 27, 18, 27, 3], [611, 774, 25, 13, 25, 8], [672, 13, 13, 9, 13, 12], [672, 64, 21, 9, 21, 12], [672, 106, 13, 18, 13, 3], [672, 157, 13, 18, 13, 3], [672, 208, 9, 18, 9, 3], [672, 259, 9, 18, 9, 3], [672, 309, 27, 19, 27, 2], [672, 363, 21, 16, 21, 5], [672, 413, 19, 22, 19, 4], [1, 16, 11, 6, 11, 15], [794, 768, 27, 19, 27, 2], [672, 564, 27, 19, 27, 2], [672, 615, 27, 19, 27, 2], [672, 666, 27, 19, 27, 2], [672, 717, 27, 19, 27, 2], [672, 768, 27, 19, 27, 2], [733, 3, 27, 19, 27, 2], [733, 54, 27, 19, 27, 2], [733, 105, 27, 19, 27, 2], [733, 156, 27, 19, 27, 2], [733, 207, 27, 19, 27, 2], [733, 258, 27, 19, 27, 2], [733, 309, 27, 19, 27, 2], [733, 360, 27, 19, 27, 2], [733, 411, 27, 19, 27, 2], [733, 462, 27, 19, 27, 2], [733, 513, 27, 19, 27, 2], [733, 564, 27, 19, 27, 2], [733, 615, 27, 19, 27, 2], [733, 666, 27, 19, 27, 2], [733, 717, 27, 19, 27, 2], [733, 768, 27, 19, 27, 2], [1, 16, 11, 6, 11, 15], [794, 54, 27, 19, 27, 2], [794, 105, 27, 19, 27, 2], [794, 156, 27, 19, 27, 2], [794, 207, 27, 19, 27, 2], [794, 258, 27, 19, 27, 2], [794, 309, 27, 19, 27, 2], [794, 360, 27, 19, 27, 2], [794, 411, 27, 19, 27, 2], [794, 462, 27, 19, 27, 2], [794, 513, 27, 19, 27, 2], [794, 564, 27, 19, 27, 2], [794, 615, 27, 19, 27, 2], [794, 666, 27, 19, 27, 2], [794, 717, 27, 19, 27, 2], [794, 768, 27, 19, 27, 2], [855, 3, 27, 19, 27, 2], [855, 54, 27, 19, 27, 2], [855, 105, 27, 19, 27, 2], [855, 156, 27, 19, 27, 2], [855, 207, 27, 19, 27, 2], [855, 258, 27, 19, 27, 2], [855, 309, 27, 19, 27, 2], [855, 360, 27, 19, 27, 2], [855, 411, 27, 19, 27, 2], [855, 462, 27, 19, 27, 2], [855, 513, 27, 19, 27, 2], [855, 564, 27, 19, 27, 2], [855, 615, 27, 19, 27, 2], [855, 666, 27, 19, 27, 2], [855, 717, 27, 19, 27, 2], [855, 768, 27, 19, 27, 2]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 11, 9, 8, 3], [1, 106, 13, 4, 10, 3], [1, 157, 13, 7, 11, 3], [1, 207, 13, 11, 11, 2], [1, 259, 15, 9, 13, 3], [1, 310, 13, 9, 13, 3], [1, 361, 11, 4, 8, 3], [1, 411, 12, 11, 9, 2], [1, 462, 11, 11, 9, 2], [1, 513, 12, 6, 9, 2], [1, 566, 12, 7, 11, 4], [1, 622, 8, 4, 8, 9], [1, 670, 11, 3, 10, 6], [1, 724, 8, 3, 8, 9], [1, 768, 13, 10, 10, 2], [62, 4, 13, 9, 11, 3], [62, 55, 12, 9, 11, 3], [62, 106, 13, 9, 11, 3], [62, 157, 13, 10, 11, 3], [62, 208, 13, 9, 11, 3], [62, 259, 14, 10, 11, 3], [62, 309, 13, 10, 11, 2], [62, 361, 14, 9, 11, 3], [62, 412, 13, 9, 11, 3], [62, 463, 13, 10, 11, 3], [62, 516, 10, 7, 8, 5], [62, 567, 10, 8, 8, 5], [62, 617, 11, 7, 9, 4], [62, 669, 12, 5, 10, 5], [62, 719, 10, 7, 9, 4], [62, 769, 12, 9, 10, 3], [123, 5, 14, 9, 13, 4], [123, 55, 13, 9, 13, 3], [123, 106, 13, 9, 11, 3], [123, 157, 14, 9, 11, 3], [123, 208, 14, 9, 12, 3], [123, 259, 14, 9, 11, 3], [123, 310, 14, 9, 11, 3], [123, 361, 14, 9, 11, 3], [123, 412, 15, 9, 12, 3], [123, 463, 12, 9, 9, 3], [123, 514, 13, 11, 10, 3], [123, 565, 15, 9, 12, 3], [123, 616, 12, 9, 11, 3], [123, 667, 16, 9, 13, 3], [123, 718, 16, 9, 12, 3], [123, 769, 14, 9, 12, 3], [184, 4, 13, 9, 11, 3], [184, 55, 14, 11, 12, 3], [184, 106, 13, 9, 11, 3], [184, 157, 13, 9, 10, 3], [184, 208, 14, 9, 11, 3], [184, 259, 16, 9, 12, 3], [184, 310, 16, 9, 12, 3], [184, 361, 18, 9, 14, 3], [184, 412, 14, 9, 11, 3], [184, 463, 14, 9, 11, 3], [184, 514, 13, 9, 10, 3], [184, 564, 11, 11, 8, 2], [184, 615, 10, 10, 10, 2], [184, 666, 11, 11, 8, 2], [184, 718, 11, 4, 9, 3], [184, 775, 12, 3, 11, 9], [245, 4, 10, 4, 8, 3], [245, 57, 11, 7, 10, 5], [245, 106, 12, 9, 11, 3], [245, 159, 12, 7, 10, 5], [245, 208, 13, 9, 11, 3], [245, 261, 11, 7, 10, 5], [245, 310, 12, 9, 9, 3], [245, 362, 12, 10, 10, 4], [245, 412, 12, 9, 11, 3], [245, 463, 11, 9, 9, 3], [245, 514, 11, 11, 8, 3], [245, 565, 13, 9, 11, 3], [245, 616, 11, 9, 9, 3], [245, 669, 14, 7, 13, 5], [245, 720, 12, 7, 11, 5], [245, 771, 11, 7, 10, 5], [306, 6, 12, 9, 11, 5], [306, 57, 12, 9, 11, 5], [306, 108, 12, 7, 10, 5], [306, 159, 12, 7, 10, 5], [306, 208, 11, 9, 9, 3], [306, 261, 13, 7, 11, 5], [306, 312, 13, 7, 10, 5], [306, 363, 15, 7, 12, 5], [306, 414, 13, 7, 11, 5], [306, 465, 13, 9, 11, 5], [306, 516, 12, 7, 10, 5], [306, 564, 12, 11, 9, 2], [306, 615, 10, 11, 7, 2], [306, 666, 11, 11, 9, 2], [306, 718, 13, 4, 9, 3], [306, 766, 1, 1, 3, 1], [367, 2, 15, 11, 13, 1], [367, 52, 15, 12, 13, 0], [367, 106, 14, 11, 11, 3], [367, 155, 14, 11, 11, 1], [367, 205, 16, 12, 12, 0], [367, 257, 15, 11, 12, 1], [367, 308, 16, 11, 12, 1], [367, 360, 12, 10, 10, 2], [367, 411, 12, 10, 10, 2], [367, 462, 13, 10, 10, 2], [367, 514, 13, 9, 10, 3], [367, 564, 13, 10, 10, 2], [367, 614, 13, 11, 10, 1], [367, 669, 12, 9, 10, 5], [367, 717, 12, 10, 10, 2], [367, 768, 12, 10, 10, 2], [428, 3, 12, 10, 10, 2], [428, 55, 13, 9, 10, 3], [428, 105, 11, 10, 9, 2], [428, 156, 11, 10, 9, 2], [428, 207, 12, 10, 9, 2], [428, 259, 12, 9, 9, 3], [428, 309, 14, 10, 11, 2], [428, 360, 12, 10, 10, 2], [428, 411, 12, 10, 10, 2], [428, 462, 12, 10, 10, 2], [428, 514, 13, 9, 10, 3], [428, 564, 13, 10, 10, 2], [428, 615, 14, 10, 11, 2], [428, 666, 13, 10, 11, 2], [428, 717, 14, 10, 11, 2], [428, 769, 13, 9, 11, 3], [489, 3, 12, 6, 9, 2], [489, 54, 12, 6, 9, 2], [489, 107, 12, 9, 11, 4], [489, 157, 13, 9, 11, 3], [489, 207, 13, 11, 10, 2], [489, 261, 11, 5, 9, 5], [489, 310, 15, 9, 12, 3], [489, 361, 12, 9, 10, 3], [489, 414, 12, 7, 11, 5], [489, 465, 12, 7, 11, 5], [489, 514, 14, 5, 11, 3], [489, 565, 11, 4, 8, 3], [489, 616, 12, 3, 9, 3], [489, 666, 16, 10, 13, 2], [489, 718, 17, 9, 14, 3], [489, 769, 16, 9, 12, 3], [550, 3, 16, 10, 13, 2], [550, 54, 16, 10, 13, 2], [550, 105, 16, 10, 13, 2], [550, 156, 16, 10, 13, 2], [550, 208, 14, 9, 11, 3], [550, 258, 16, 10, 13, 2], [550, 309, 16, 10, 13, 2], [550, 360, 16, 10, 13, 2], [550, 411, 16, 10, 13, 2], [550, 462, 16, 10, 13, 2], [550, 513, 16, 10, 13, 2], [550, 565, 13, 8, 10, 3], [550, 616, 12, 8, 10, 3], [550, 666, 16, 10, 13, 2], [550, 720, 14, 7, 13, 5], [550, 771, 13, 7, 10, 5], [611, 4, 12, 9, 10, 3], [611, 55, 11, 9, 8, 3], [611, 105, 16, 10, 13, 2], [611, 156, 16, 10, 13, 2], [611, 207, 16, 10, 13, 2], [611, 258, 16, 10, 13, 2], [611, 309, 16, 10, 13, 2], [611, 363, 13, 7, 11, 5], [611, 414, 12, 7, 11, 5], [611, 469, 12, 3, 13, 9], [611, 511, 1, 1, 11, 1], [611, 563, 14, 11, 13, 1], [611, 613, 16, 12, 13, 0], [611, 664, 16, 12, 12, 0], [611, 718, 18, 9, 15, 3], [611, 771, 14, 7, 13, 5], [672, 8, 10, 3, 9, 7], [672, 59, 11, 3, 10, 7], [672, 106, 13, 5, 10, 3], [672, 157, 13, 5, 10, 3], [672, 208, 11, 5, 8, 3], [672, 259, 11, 5, 8, 3], [672, 309, 16, 10, 13, 2], [672, 361, 14, 9, 14, 3], [672, 412, 13, 11, 11, 3], [1, 1, 1, 1, 8, 1], [794, 768, 16, 10, 13, 2], [672, 564, 16, 10, 13, 2], [672, 615, 16, 10, 13, 2], [672, 666, 16, 10, 13, 2], [672, 717, 16, 10, 13, 2], [672, 768, 16, 10, 13, 2], [733, 3, 16, 10, 13, 2], [733, 54, 16, 10, 13, 2], [733, 105, 16, 10, 13, 2], [733, 156, 16, 10, 13, 2], [733, 207, 16, 10, 13, 2], [733, 258, 16, 10, 13, 2], [733, 309, 16, 10, 13, 2], [733, 360, 16, 10, 13, 2], [733, 411, 16, 10, 13, 2], [733, 462, 16, 10, 13, 2], [733, 513, 16, 10, 13, 2], [733, 564, 16, 10, 13, 2], [733, 615, 16, 10, 13, 2], [733, 666, 16, 10, 13, 2], [733, 717, 16, 10, 13, 2], [733, 768, 16, 10, 13, 2], [1, 1, 1, 1, 8, 1], [794, 54, 16, 10, 13, 2], [794, 105, 16, 10, 13, 2], [794, 156, 16, 10, 13, 2], [794, 207, 16, 10, 13, 2], [794, 258, 16, 10, 13, 2], [794, 309, 16, 10, 13, 2], [794, 360, 16, 10, 13, 2], [794, 411, 16, 10, 13, 2], [794, 462, 16, 10, 13, 2], [794, 513, 16, 10, 13, 2], [794, 564, 16, 10, 13, 2], [794, 615, 16, 10, 13, 2], [794, 666, 16, 10, 13, 2], [794, 717, 16, 10, 13, 2], [794, 768, 16, 10, 13, 2], [855, 3, 16, 10, 13, 2], [855, 54, 16, 10, 13, 2], [855, 105, 16, 10, 13, 2], [855, 156, 16, 10, 13, 2], [855, 207, 16, 10, 13, 2], [855, 258, 16, 10, 13, 2], [855, 309, 16, 10, 13, 2], [855, 360, 16, 10, 13, 2], [855, 411, 16, 10, 13, 2], [855, 462, 16, 10, 13, 2], [855, 513, 16, 10, 13, 2], [855, 564, 16, 10, 13, 2], [855, 615, 16, 10, 13, 2], [855, 666, 16, 10, 13, 2], [855, 717, 16, 10, 13, 2], [855, 768, 16, 10, 13, 2]], \"capHeight\": 11, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 10, 7, 7, 3], [1, 106, 12, 2, 9, 3], [1, 157, 12, 5, 10, 3], [1, 207, 12, 9, 10, 2], [1, 259, 14, 7, 12, 3], [1, 310, 12, 7, 12, 3], [1, 361, 10, 2, 7, 3], [1, 411, 11, 9, 8, 2], [1, 462, 10, 9, 8, 2], [1, 513, 11, 4, 8, 2], [1, 566, 11, 5, 10, 4], [1, 622, 7, 2, 7, 9], [1, 670, 10, 1, 9, 6], [1, 724, 7, 1, 7, 9], [1, 768, 12, 8, 9, 2], [62, 4, 12, 7, 10, 3], [62, 55, 11, 7, 10, 3], [62, 106, 12, 7, 10, 3], [62, 157, 12, 8, 10, 3], [62, 208, 12, 7, 10, 3], [62, 259, 13, 8, 10, 3], [62, 309, 12, 8, 10, 2], [62, 361, 13, 7, 10, 3], [62, 412, 12, 7, 10, 3], [62, 463, 12, 8, 10, 3], [62, 516, 9, 5, 7, 5], [62, 567, 9, 6, 7, 5], [62, 617, 10, 5, 8, 4], [62, 669, 11, 3, 9, 5], [62, 719, 9, 5, 8, 4], [62, 769, 11, 7, 9, 3], [123, 5, 13, 7, 12, 4], [123, 55, 12, 7, 12, 3], [123, 106, 12, 7, 10, 3], [123, 157, 13, 7, 10, 3], [123, 208, 13, 7, 11, 3], [123, 259, 13, 7, 10, 3], [123, 310, 13, 7, 10, 3], [123, 361, 13, 7, 10, 3], [123, 412, 14, 7, 11, 3], [123, 463, 11, 7, 8, 3], [123, 514, 12, 9, 9, 3], [123, 565, 14, 7, 11, 3], [123, 616, 11, 7, 10, 3], [123, 667, 15, 7, 12, 3], [123, 718, 15, 7, 11, 3], [123, 769, 13, 7, 11, 3], [184, 4, 12, 7, 10, 3], [184, 55, 13, 9, 11, 3], [184, 106, 12, 7, 10, 3], [184, 157, 12, 7, 9, 3], [184, 208, 13, 7, 10, 3], [184, 259, 15, 7, 11, 3], [184, 310, 15, 7, 11, 3], [184, 361, 17, 7, 13, 3], [184, 412, 13, 7, 10, 3], [184, 463, 13, 7, 10, 3], [184, 514, 12, 7, 9, 3], [184, 564, 10, 9, 7, 2], [184, 615, 9, 8, 9, 2], [184, 666, 10, 9, 7, 2], [184, 718, 10, 2, 8, 3], [184, 775, 11, 1, 10, 9], [245, 4, 9, 2, 7, 3], [245, 57, 10, 5, 9, 5], [245, 106, 11, 7, 10, 3], [245, 159, 11, 5, 9, 5], [245, 208, 12, 7, 10, 3], [245, 261, 10, 5, 9, 5], [245, 310, 11, 7, 8, 3], [245, 362, 11, 8, 9, 4], [245, 412, 11, 7, 10, 3], [245, 463, 10, 7, 8, 3], [245, 514, 10, 9, 7, 3], [245, 565, 12, 7, 10, 3], [245, 616, 10, 7, 8, 3], [245, 669, 13, 5, 12, 5], [245, 720, 11, 5, 10, 5], [245, 771, 10, 5, 9, 5], [306, 6, 11, 7, 10, 5], [306, 57, 11, 7, 10, 5], [306, 108, 11, 5, 9, 5], [306, 159, 11, 5, 9, 5], [306, 208, 10, 7, 8, 3], [306, 261, 12, 5, 10, 5], [306, 312, 12, 5, 9, 5], [306, 363, 14, 5, 11, 5], [306, 414, 12, 5, 10, 5], [306, 465, 12, 7, 10, 5], [306, 516, 11, 5, 9, 5], [306, 564, 11, 9, 8, 2], [306, 615, 9, 9, 6, 2], [306, 666, 10, 9, 8, 2], [306, 718, 12, 2, 8, 3], [306, 766, 1, 1, 3, 1], [367, 2, 14, 9, 12, 1], [367, 52, 14, 10, 12, 0], [367, 106, 13, 9, 10, 3], [367, 155, 13, 9, 10, 1], [367, 205, 15, 10, 11, 0], [367, 257, 14, 9, 11, 1], [367, 308, 15, 9, 11, 1], [367, 360, 11, 8, 9, 2], [367, 411, 11, 8, 9, 2], [367, 462, 12, 8, 9, 2], [367, 514, 12, 7, 9, 3], [367, 564, 12, 8, 9, 2], [367, 614, 12, 9, 9, 1], [367, 669, 11, 7, 9, 5], [367, 717, 11, 8, 9, 2], [367, 768, 11, 8, 9, 2], [428, 3, 11, 8, 9, 2], [428, 55, 12, 7, 9, 3], [428, 105, 10, 8, 8, 2], [428, 156, 10, 8, 8, 2], [428, 207, 11, 8, 8, 2], [428, 259, 11, 7, 8, 3], [428, 309, 13, 8, 10, 2], [428, 360, 11, 8, 9, 2], [428, 411, 11, 8, 9, 2], [428, 462, 11, 8, 9, 2], [428, 514, 12, 7, 9, 3], [428, 564, 12, 8, 9, 2], [428, 615, 13, 8, 10, 2], [428, 666, 12, 8, 10, 2], [428, 717, 13, 8, 10, 2], [428, 769, 12, 7, 10, 3], [489, 3, 11, 4, 8, 2], [489, 54, 11, 4, 8, 2], [489, 107, 11, 7, 10, 4], [489, 157, 12, 7, 10, 3], [489, 207, 12, 9, 9, 2], [489, 261, 10, 3, 8, 5], [489, 310, 14, 7, 11, 3], [489, 361, 11, 7, 9, 3], [489, 414, 11, 5, 10, 5], [489, 465, 11, 5, 10, 5], [489, 514, 13, 3, 10, 3], [489, 565, 10, 2, 7, 3], [489, 616, 11, 1, 8, 3], [489, 666, 15, 8, 12, 2], [489, 718, 16, 7, 13, 3], [489, 769, 15, 7, 11, 3], [550, 3, 15, 8, 12, 2], [550, 54, 15, 8, 12, 2], [550, 105, 15, 8, 12, 2], [550, 156, 15, 8, 12, 2], [550, 208, 13, 7, 10, 3], [550, 258, 15, 8, 12, 2], [550, 309, 15, 8, 12, 2], [550, 360, 15, 8, 12, 2], [550, 411, 15, 8, 12, 2], [550, 462, 15, 8, 12, 2], [550, 513, 15, 8, 12, 2], [550, 565, 12, 6, 9, 3], [550, 616, 11, 6, 9, 3], [550, 666, 15, 8, 12, 2], [550, 720, 13, 5, 12, 5], [550, 771, 12, 5, 9, 5], [611, 4, 11, 7, 9, 3], [611, 55, 10, 7, 7, 3], [611, 105, 15, 8, 12, 2], [611, 156, 15, 8, 12, 2], [611, 207, 15, 8, 12, 2], [611, 258, 15, 8, 12, 2], [611, 309, 15, 8, 12, 2], [611, 363, 12, 5, 10, 5], [611, 414, 11, 5, 10, 5], [611, 469, 11, 1, 12, 9], [611, 511, 1, 1, 10, 1], [611, 563, 13, 9, 12, 1], [611, 613, 14, 10, 12, 0], [611, 664, 14, 10, 11, 0], [611, 718, 17, 7, 14, 3], [611, 771, 13, 5, 12, 5], [672, 8, 9, 1, 8, 7], [672, 59, 10, 1, 9, 7], [672, 106, 12, 3, 9, 3], [672, 157, 12, 3, 9, 3], [672, 208, 10, 3, 7, 3], [672, 259, 10, 3, 7, 3], [672, 309, 15, 8, 12, 2], [672, 361, 13, 7, 13, 3], [672, 412, 12, 9, 10, 3], [1, 1, 1, 1, 7, 1], [794, 768, 15, 8, 12, 2], [672, 564, 15, 8, 12, 2], [672, 615, 15, 8, 12, 2], [672, 666, 15, 8, 12, 2], [672, 717, 15, 8, 12, 2], [672, 768, 15, 8, 12, 2], [733, 3, 15, 8, 12, 2], [733, 54, 15, 8, 12, 2], [733, 105, 15, 8, 12, 2], [733, 156, 15, 8, 12, 2], [733, 207, 15, 8, 12, 2], [733, 258, 15, 8, 12, 2], [733, 309, 15, 8, 12, 2], [733, 360, 15, 8, 12, 2], [733, 411, 15, 8, 12, 2], [733, 462, 15, 8, 12, 2], [733, 513, 15, 8, 12, 2], [733, 564, 15, 8, 12, 2], [733, 615, 15, 8, 12, 2], [733, 666, 15, 8, 12, 2], [733, 717, 15, 8, 12, 2], [733, 768, 15, 8, 12, 2], [1, 1, 1, 1, 7, 1], [794, 54, 15, 8, 12, 2], [794, 105, 15, 8, 12, 2], [794, 156, 15, 8, 12, 2], [794, 207, 15, 8, 12, 2], [794, 258, 15, 8, 12, 2], [794, 309, 15, 8, 12, 2], [794, 360, 15, 8, 12, 2], [794, 411, 15, 8, 12, 2], [794, 462, 15, 8, 12, 2], [794, 513, 15, 8, 12, 2], [794, 564, 15, 8, 12, 2], [794, 615, 15, 8, 12, 2], [794, 666, 15, 8, 12, 2], [794, 717, 15, 8, 12, 2], [794, 768, 15, 8, 12, 2], [855, 3, 15, 8, 12, 2], [855, 54, 15, 8, 12, 2], [855, 105, 15, 8, 12, 2], [855, 156, 15, 8, 12, 2], [855, 207, 15, 8, 12, 2], [855, 258, 15, 8, 12, 2], [855, 309, 15, 8, 12, 2], [855, 360, 15, 8, 12, 2], [855, 411, 15, 8, 12, 2], [855, 462, 15, 8, 12, 2], [855, 513, 15, 8, 12, 2], [855, 564, 15, 8, 12, 2], [855, 615, 15, 8, 12, 2], [855, 666, 15, 8, 12, 2], [855, 717, 15, 8, 12, 2], [855, 768, 15, 8, 12, 2]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 55, 8, 9, 8, 3], [1, 106, 10, 8, 10, 3], [1, 157, 11, 8, 11, 3], [1, 207, 11, 11, 11, 2], [1, 259, 13, 9, 13, 3], [1, 310, 13, 9, 13, 3], [1, 361, 8, 8, 8, 3], [1, 411, 9, 11, 9, 2], [1, 462, 9, 11, 9, 2], [1, 513, 9, 9, 9, 2], [1, 566, 11, 7, 11, 4], [1, 618, 8, 8, 8, 5], [1, 669, 10, 6, 10, 5], [1, 720, 8, 7, 8, 5], [1, 768, 10, 10, 10, 2], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 10, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 10, 11, 3], [62, 309, 11, 10, 11, 2], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 10, 11, 3], [62, 516, 8, 7, 8, 5], [62, 567, 8, 8, 8, 5], [62, 617, 9, 7, 9, 4], [62, 669, 10, 6, 10, 5], [62, 719, 9, 7, 9, 4], [62, 769, 10, 9, 10, 3], [123, 5, 13, 9, 13, 4], [123, 55, 13, 9, 13, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 12, 9, 12, 3], [123, 259, 11, 9, 11, 3], [123, 310, 11, 9, 11, 3], [123, 361, 11, 9, 11, 3], [123, 412, 12, 9, 12, 3], [123, 463, 9, 9, 9, 3], [123, 514, 10, 11, 10, 3], [123, 565, 12, 9, 12, 3], [123, 616, 11, 9, 11, 3], [123, 667, 13, 9, 13, 3], [123, 718, 12, 9, 12, 3], [123, 769, 12, 9, 12, 3], [184, 4, 11, 9, 11, 3], [184, 55, 12, 11, 12, 3], [184, 106, 11, 9, 11, 3], [184, 157, 10, 9, 10, 3], [184, 208, 11, 9, 11, 3], [184, 259, 12, 9, 12, 3], [184, 310, 12, 9, 12, 3], [184, 361, 14, 9, 14, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 10, 9, 10, 3], [184, 564, 8, 11, 8, 2], [184, 615, 10, 10, 10, 2], [184, 666, 8, 11, 8, 2], [184, 718, 9, 8, 9, 3], [184, 771, 11, 7, 11, 5], [245, 4, 8, 8, 8, 3], [245, 57, 10, 7, 10, 5], [245, 106, 11, 9, 11, 3], [245, 159, 10, 7, 10, 5], [245, 208, 11, 9, 11, 3], [245, 261, 10, 7, 10, 5], [245, 310, 9, 9, 9, 3], [245, 362, 10, 10, 10, 4], [245, 412, 11, 9, 11, 3], [245, 463, 9, 9, 9, 3], [245, 514, 8, 11, 8, 3], [245, 565, 11, 9, 11, 3], [245, 616, 9, 9, 9, 3], [245, 669, 13, 7, 13, 5], [245, 720, 11, 7, 11, 5], [245, 771, 10, 7, 10, 5], [306, 6, 11, 9, 11, 5], [306, 57, 11, 9, 11, 5], [306, 108, 10, 7, 10, 5], [306, 159, 10, 7, 10, 5], [306, 208, 9, 9, 9, 3], [306, 261, 11, 7, 11, 5], [306, 312, 10, 7, 10, 5], [306, 363, 12, 7, 12, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 9, 11, 5], [306, 516, 10, 7, 10, 5], [306, 564, 9, 11, 9, 2], [306, 615, 7, 11, 7, 2], [306, 666, 9, 11, 9, 2], [306, 718, 9, 8, 9, 3], [306, 771, 3, 6, 3, 5], [367, 2, 13, 11, 13, 1], [367, 52, 13, 12, 13, 0], [367, 106, 11, 11, 11, 3], [367, 155, 11, 11, 11, 1], [367, 205, 12, 12, 12, 0], [367, 257, 12, 11, 12, 1], [367, 308, 12, 11, 12, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 614, 10, 11, 10, 1], [367, 669, 10, 9, 10, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 9, 10, 9, 2], [428, 156, 9, 10, 9, 2], [428, 207, 9, 10, 9, 2], [428, 259, 9, 9, 9, 3], [428, 309, 11, 10, 11, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 3, 9, 9, 9, 2], [489, 54, 9, 9, 9, 2], [489, 107, 11, 9, 11, 4], [489, 157, 11, 9, 11, 3], [489, 207, 10, 11, 10, 2], [489, 261, 9, 6, 9, 5], [489, 310, 12, 9, 12, 3], [489, 361, 10, 9, 10, 3], [489, 414, 11, 7, 11, 5], [489, 465, 11, 7, 11, 5], [489, 514, 11, 8, 11, 3], [489, 565, 8, 8, 8, 3], [489, 616, 9, 8, 9, 3], [489, 666, 13, 10, 13, 2], [489, 718, 14, 9, 14, 3], [489, 769, 12, 9, 12, 3], [550, 3, 13, 10, 13, 2], [550, 54, 13, 10, 13, 2], [550, 105, 13, 10, 13, 2], [550, 156, 13, 10, 13, 2], [550, 208, 11, 9, 11, 3], [550, 258, 13, 10, 13, 2], [550, 309, 13, 10, 13, 2], [550, 360, 13, 10, 13, 2], [550, 411, 13, 10, 13, 2], [550, 462, 13, 10, 13, 2], [550, 513, 13, 10, 13, 2], [550, 565, 10, 8, 10, 3], [550, 616, 10, 8, 10, 3], [550, 666, 13, 10, 13, 2], [550, 720, 13, 7, 13, 5], [550, 771, 10, 7, 10, 5], [611, 4, 10, 9, 10, 3], [611, 55, 8, 9, 8, 3], [611, 105, 13, 10, 13, 2], [611, 156, 13, 10, 13, 2], [611, 207, 13, 10, 13, 2], [611, 258, 13, 10, 13, 2], [611, 309, 13, 10, 13, 2], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 13, 7, 13, 5], [611, 516, 11, 6, 11, 5], [611, 563, 13, 11, 13, 1], [611, 613, 13, 12, 13, 0], [611, 664, 12, 12, 12, 0], [611, 718, 15, 9, 15, 3], [611, 771, 13, 7, 13, 5], [672, 6, 9, 6, 9, 5], [672, 57, 10, 6, 10, 5], [672, 106, 10, 8, 10, 3], [672, 157, 10, 8, 10, 3], [672, 208, 8, 8, 8, 3], [672, 259, 8, 8, 8, 3], [672, 309, 13, 10, 13, 2], [672, 361, 14, 9, 14, 3], [672, 412, 11, 11, 11, 3], [1, 6, 8, 6, 8, 5], [794, 768, 13, 10, 13, 2], [672, 564, 13, 10, 13, 2], [672, 615, 13, 10, 13, 2], [672, 666, 13, 10, 13, 2], [672, 717, 13, 10, 13, 2], [672, 768, 13, 10, 13, 2], [733, 3, 13, 10, 13, 2], [733, 54, 13, 10, 13, 2], [733, 105, 13, 10, 13, 2], [733, 156, 13, 10, 13, 2], [733, 207, 13, 10, 13, 2], [733, 258, 13, 10, 13, 2], [733, 309, 13, 10, 13, 2], [733, 360, 13, 10, 13, 2], [733, 411, 13, 10, 13, 2], [733, 462, 13, 10, 13, 2], [733, 513, 13, 10, 13, 2], [733, 564, 13, 10, 13, 2], [733, 615, 13, 10, 13, 2], [733, 666, 13, 10, 13, 2], [733, 717, 13, 10, 13, 2], [733, 768, 13, 10, 13, 2], [1, 6, 8, 6, 8, 5], [794, 54, 13, 10, 13, 2], [794, 105, 13, 10, 13, 2], [794, 156, 13, 10, 13, 2], [794, 207, 13, 10, 13, 2], [794, 258, 13, 10, 13, 2], [794, 309, 13, 10, 13, 2], [794, 360, 13, 10, 13, 2], [794, 411, 13, 10, 13, 2], [794, 462, 13, 10, 13, 2], [794, 513, 13, 10, 13, 2], [794, 564, 13, 10, 13, 2], [794, 615, 13, 10, 13, 2], [794, 666, 13, 10, 13, 2], [794, 717, 13, 10, 13, 2], [794, 768, 13, 10, 13, 2], [855, 3, 13, 10, 13, 2], [855, 54, 13, 10, 13, 2], [855, 105, 13, 10, 13, 2], [855, 156, 13, 10, 13, 2], [855, 207, 13, 10, 13, 2], [855, 258, 13, 10, 13, 2], [855, 309, 13, 10, 13, 2], [855, 360, 13, 10, 13, 2], [855, 411, 13, 10, 13, 2], [855, 462, 13, 10, 13, 2], [855, 513, 13, 10, 13, 2], [855, 564, 13, 10, 13, 2], [855, 615, 13, 10, 13, 2], [855, 666, 13, 10, 13, 2], [855, 717, 13, 10, 13, 2], [855, 768, 13, 10, 13, 2]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 55, 7, 7, 7, 3], [1, 106, 9, 7, 9, 3], [1, 157, 10, 7, 10, 3], [1, 207, 10, 9, 10, 2], [1, 259, 12, 7, 12, 3], [1, 310, 12, 7, 12, 3], [1, 361, 7, 7, 7, 3], [1, 411, 8, 9, 8, 2], [1, 462, 8, 9, 8, 2], [1, 513, 8, 8, 8, 2], [1, 566, 10, 6, 10, 4], [1, 617, 7, 7, 7, 4], [1, 668, 9, 6, 9, 4], [1, 719, 7, 6, 7, 4], [1, 768, 9, 8, 9, 2], [62, 4, 10, 7, 10, 3], [62, 55, 10, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 8, 10, 3], [62, 208, 10, 7, 10, 3], [62, 259, 10, 8, 10, 3], [62, 309, 10, 8, 10, 2], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 8, 10, 3], [62, 515, 7, 6, 7, 4], [62, 566, 7, 7, 7, 4], [62, 617, 8, 6, 8, 4], [62, 668, 9, 6, 9, 4], [62, 719, 8, 6, 8, 4], [62, 769, 9, 7, 9, 3], [123, 5, 12, 7, 12, 4], [123, 55, 12, 7, 12, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 11, 7, 11, 3], [123, 259, 10, 7, 10, 3], [123, 310, 10, 7, 10, 3], [123, 361, 10, 7, 10, 3], [123, 412, 11, 7, 11, 3], [123, 463, 8, 7, 8, 3], [123, 514, 9, 9, 9, 3], [123, 565, 11, 7, 11, 3], [123, 616, 10, 7, 10, 3], [123, 667, 12, 7, 12, 3], [123, 718, 11, 7, 11, 3], [123, 769, 11, 7, 11, 3], [184, 4, 10, 7, 10, 3], [184, 55, 11, 9, 11, 3], [184, 106, 10, 7, 10, 3], [184, 157, 9, 7, 9, 3], [184, 208, 10, 7, 10, 3], [184, 259, 11, 7, 11, 3], [184, 310, 11, 7, 11, 3], [184, 361, 13, 7, 13, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 9, 7, 9, 3], [184, 564, 7, 9, 7, 2], [184, 615, 9, 8, 9, 2], [184, 666, 7, 9, 7, 2], [184, 718, 8, 7, 8, 3], [184, 770, 10, 6, 10, 4], [245, 4, 7, 7, 7, 3], [245, 56, 9, 6, 9, 4], [245, 106, 10, 7, 10, 3], [245, 158, 9, 6, 9, 4], [245, 208, 10, 7, 10, 3], [245, 260, 9, 6, 9, 4], [245, 310, 8, 7, 8, 3], [245, 362, 9, 8, 9, 4], [245, 412, 10, 7, 10, 3], [245, 463, 8, 7, 8, 3], [245, 514, 7, 9, 7, 3], [245, 565, 10, 7, 10, 3], [245, 616, 8, 7, 8, 3], [245, 668, 12, 6, 12, 4], [245, 719, 10, 6, 10, 4], [245, 770, 9, 6, 9, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 208, 8, 7, 8, 3], [306, 260, 10, 6, 10, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 9, 6, 9, 4], [306, 564, 8, 9, 8, 2], [306, 615, 6, 9, 6, 2], [306, 666, 8, 9, 8, 2], [306, 718, 8, 7, 8, 3], [306, 770, 3, 6, 3, 4], [367, 2, 12, 9, 12, 1], [367, 52, 12, 10, 12, 0], [367, 106, 10, 9, 10, 3], [367, 155, 10, 9, 10, 1], [367, 205, 11, 10, 11, 0], [367, 257, 11, 9, 11, 1], [367, 308, 11, 9, 11, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 614, 9, 9, 9, 1], [367, 668, 9, 8, 9, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 8, 8, 8, 2], [428, 156, 8, 8, 8, 2], [428, 207, 8, 8, 8, 2], [428, 259, 8, 7, 8, 3], [428, 309, 10, 8, 10, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 10, 8, 10, 2], [428, 666, 10, 8, 10, 2], [428, 717, 10, 8, 10, 2], [428, 769, 10, 7, 10, 3], [489, 3, 8, 8, 8, 2], [489, 54, 8, 8, 8, 2], [489, 107, 10, 7, 10, 4], [489, 157, 10, 7, 10, 3], [489, 207, 9, 9, 9, 2], [489, 260, 8, 6, 8, 4], [489, 310, 11, 7, 11, 3], [489, 361, 9, 7, 9, 3], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 514, 10, 7, 10, 3], [489, 565, 7, 7, 7, 3], [489, 616, 8, 7, 8, 3], [489, 666, 12, 8, 12, 2], [489, 718, 13, 7, 13, 3], [489, 769, 11, 7, 11, 3], [550, 3, 12, 8, 12, 2], [550, 54, 12, 8, 12, 2], [550, 105, 12, 8, 12, 2], [550, 156, 12, 8, 12, 2], [550, 208, 10, 7, 10, 3], [550, 258, 12, 8, 12, 2], [550, 309, 12, 8, 12, 2], [550, 360, 12, 8, 12, 2], [550, 411, 12, 8, 12, 2], [550, 462, 12, 8, 12, 2], [550, 513, 12, 8, 12, 2], [550, 565, 9, 7, 9, 3], [550, 616, 9, 7, 9, 3], [550, 666, 12, 8, 12, 2], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 4, 9, 7, 9, 3], [611, 55, 7, 7, 7, 3], [611, 105, 12, 8, 12, 2], [611, 156, 12, 8, 12, 2], [611, 207, 12, 8, 12, 2], [611, 258, 12, 8, 12, 2], [611, 309, 12, 8, 12, 2], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 12, 6, 12, 4], [611, 515, 10, 6, 10, 4], [611, 563, 12, 9, 12, 1], [611, 613, 12, 10, 12, 0], [611, 664, 11, 10, 11, 0], [611, 718, 14, 7, 14, 3], [611, 770, 12, 6, 12, 4], [672, 5, 8, 6, 8, 4], [672, 56, 9, 6, 9, 4], [672, 106, 9, 7, 9, 3], [672, 157, 9, 7, 9, 3], [672, 208, 7, 7, 7, 3], [672, 259, 7, 7, 7, 3], [672, 309, 12, 8, 12, 2], [672, 361, 13, 7, 13, 3], [672, 412, 10, 9, 10, 3], [1, 5, 7, 6, 7, 4], [794, 768, 12, 8, 12, 2], [672, 564, 12, 8, 12, 2], [672, 615, 12, 8, 12, 2], [672, 666, 12, 8, 12, 2], [672, 717, 12, 8, 12, 2], [672, 768, 12, 8, 12, 2], [733, 3, 12, 8, 12, 2], [733, 54, 12, 8, 12, 2], [733, 105, 12, 8, 12, 2], [733, 156, 12, 8, 12, 2], [733, 207, 12, 8, 12, 2], [733, 258, 12, 8, 12, 2], [733, 309, 12, 8, 12, 2], [733, 360, 12, 8, 12, 2], [733, 411, 12, 8, 12, 2], [733, 462, 12, 8, 12, 2], [733, 513, 12, 8, 12, 2], [733, 564, 12, 8, 12, 2], [733, 615, 12, 8, 12, 2], [733, 666, 12, 8, 12, 2], [733, 717, 12, 8, 12, 2], [733, 768, 12, 8, 12, 2], [1, 5, 7, 6, 7, 4], [794, 54, 12, 8, 12, 2], [794, 105, 12, 8, 12, 2], [794, 156, 12, 8, 12, 2], [794, 207, 12, 8, 12, 2], [794, 258, 12, 8, 12, 2], [794, 309, 12, 8, 12, 2], [794, 360, 12, 8, 12, 2], [794, 411, 12, 8, 12, 2], [794, 462, 12, 8, 12, 2], [794, 513, 12, 8, 12, 2], [794, 564, 12, 8, 12, 2], [794, 615, 12, 8, 12, 2], [794, 666, 12, 8, 12, 2], [794, 717, 12, 8, 12, 2], [794, 768, 12, 8, 12, 2], [855, 3, 12, 8, 12, 2], [855, 54, 12, 8, 12, 2], [855, 105, 12, 8, 12, 2], [855, 156, 12, 8, 12, 2], [855, 207, 12, 8, 12, 2], [855, 258, 12, 8, 12, 2], [855, 309, 12, 8, 12, 2], [855, 360, 12, 8, 12, 2], [855, 411, 12, 8, 12, 2], [855, 462, 12, 8, 12, 2], [855, 513, 12, 8, 12, 2], [855, 564, 12, 8, 12, 2], [855, 615, 12, 8, 12, 2], [855, 666, 12, 8, 12, 2], [855, 717, 12, 8, 12, 2], [855, 768, 12, 8, 12, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 55, 10, 9, 7, 3], [1, 106, 12, 4, 9, 3], [1, 157, 12, 7, 10, 3], [1, 207, 12, 11, 10, 2], [1, 259, 14, 9, 12, 3], [1, 310, 12, 9, 12, 3], [1, 361, 10, 4, 7, 3], [1, 411, 11, 11, 8, 2], [1, 462, 10, 11, 8, 2], [1, 513, 11, 6, 8, 2], [1, 566, 11, 7, 10, 4], [1, 622, 7, 4, 7, 9], [1, 670, 10, 3, 9, 6], [1, 724, 7, 3, 7, 9], [1, 768, 12, 10, 9, 2], [62, 4, 12, 9, 10, 3], [62, 55, 11, 9, 10, 3], [62, 106, 12, 9, 10, 3], [62, 157, 12, 10, 10, 3], [62, 208, 12, 9, 10, 3], [62, 259, 13, 10, 10, 3], [62, 309, 12, 10, 10, 2], [62, 361, 13, 9, 10, 3], [62, 412, 12, 9, 10, 3], [62, 463, 12, 10, 10, 3], [62, 516, 9, 7, 7, 5], [62, 567, 9, 8, 7, 5], [62, 617, 10, 7, 8, 4], [62, 669, 11, 5, 9, 5], [62, 719, 9, 7, 8, 4], [62, 769, 11, 9, 9, 3], [123, 5, 13, 9, 12, 4], [123, 55, 12, 9, 12, 3], [123, 106, 12, 9, 10, 3], [123, 157, 13, 9, 10, 3], [123, 208, 13, 9, 11, 3], [123, 259, 13, 9, 10, 3], [123, 310, 13, 9, 10, 3], [123, 361, 13, 9, 10, 3], [123, 412, 14, 9, 11, 3], [123, 463, 11, 9, 8, 3], [123, 514, 12, 11, 9, 3], [123, 565, 14, 9, 11, 3], [123, 616, 11, 9, 10, 3], [123, 667, 15, 9, 12, 3], [123, 718, 15, 9, 11, 3], [123, 769, 13, 9, 11, 3], [184, 4, 12, 9, 10, 3], [184, 55, 13, 11, 11, 3], [184, 106, 12, 9, 10, 3], [184, 157, 12, 9, 9, 3], [184, 208, 13, 9, 10, 3], [184, 259, 15, 9, 11, 3], [184, 310, 15, 9, 11, 3], [184, 361, 17, 9, 13, 3], [184, 412, 13, 9, 10, 3], [184, 463, 13, 9, 10, 3], [184, 514, 12, 9, 9, 3], [184, 564, 10, 11, 7, 2], [184, 615, 9, 10, 9, 2], [184, 666, 10, 11, 7, 2], [184, 718, 10, 4, 8, 3], [184, 775, 11, 3, 10, 9], [245, 4, 9, 4, 7, 3], [245, 57, 10, 7, 9, 5], [245, 106, 11, 9, 10, 3], [245, 159, 11, 7, 9, 5], [245, 208, 12, 9, 10, 3], [245, 261, 10, 7, 9, 5], [245, 310, 11, 9, 8, 3], [245, 362, 11, 10, 9, 4], [245, 412, 11, 9, 10, 3], [245, 463, 10, 9, 8, 3], [245, 514, 10, 11, 7, 3], [245, 565, 12, 9, 10, 3], [245, 616, 10, 9, 8, 3], [245, 669, 13, 7, 12, 5], [245, 720, 11, 7, 10, 5], [245, 771, 10, 7, 9, 5], [306, 6, 11, 9, 10, 5], [306, 57, 11, 9, 10, 5], [306, 108, 11, 7, 9, 5], [306, 159, 11, 7, 9, 5], [306, 208, 10, 9, 8, 3], [306, 261, 12, 7, 10, 5], [306, 312, 12, 7, 9, 5], [306, 363, 14, 7, 11, 5], [306, 414, 12, 7, 10, 5], [306, 465, 12, 9, 10, 5], [306, 516, 11, 7, 9, 5], [306, 564, 11, 11, 8, 2], [306, 615, 9, 11, 6, 2], [306, 666, 10, 11, 8, 2], [306, 718, 12, 4, 8, 3], [306, 766, 1, 1, 3, 1], [367, 2, 14, 11, 12, 1], [367, 52, 14, 12, 12, 0], [367, 106, 13, 11, 10, 3], [367, 155, 13, 11, 10, 1], [367, 205, 15, 12, 11, 0], [367, 257, 14, 11, 11, 1], [367, 308, 15, 11, 11, 1], [367, 360, 11, 10, 9, 2], [367, 411, 11, 10, 9, 2], [367, 462, 12, 10, 9, 2], [367, 514, 12, 9, 9, 3], [367, 564, 12, 10, 9, 2], [367, 614, 12, 11, 9, 1], [367, 669, 11, 9, 9, 5], [367, 717, 11, 10, 9, 2], [367, 768, 11, 10, 9, 2], [428, 3, 11, 10, 9, 2], [428, 55, 12, 9, 9, 3], [428, 105, 10, 10, 8, 2], [428, 156, 10, 10, 8, 2], [428, 207, 11, 10, 8, 2], [428, 259, 11, 9, 8, 3], [428, 309, 13, 10, 10, 2], [428, 360, 11, 10, 9, 2], [428, 411, 11, 10, 9, 2], [428, 462, 11, 10, 9, 2], [428, 514, 12, 9, 9, 3], [428, 564, 12, 10, 9, 2], [428, 615, 13, 10, 10, 2], [428, 666, 12, 10, 10, 2], [428, 717, 13, 10, 10, 2], [428, 769, 12, 9, 10, 3], [489, 3, 11, 6, 8, 2], [489, 54, 11, 6, 8, 2], [489, 107, 11, 9, 10, 4], [489, 157, 12, 9, 10, 3], [489, 207, 12, 11, 9, 2], [489, 261, 10, 5, 8, 5], [489, 310, 14, 9, 11, 3], [489, 361, 11, 9, 9, 3], [489, 414, 11, 7, 10, 5], [489, 465, 11, 7, 10, 5], [489, 514, 13, 5, 10, 3], [489, 565, 10, 4, 7, 3], [489, 616, 11, 3, 8, 3], [489, 666, 15, 10, 12, 2], [489, 718, 16, 9, 13, 3], [489, 769, 15, 9, 11, 3], [550, 3, 15, 10, 12, 2], [550, 54, 15, 10, 12, 2], [550, 105, 15, 10, 12, 2], [550, 156, 15, 10, 12, 2], [550, 208, 13, 9, 10, 3], [550, 258, 15, 10, 12, 2], [550, 309, 15, 10, 12, 2], [550, 360, 15, 10, 12, 2], [550, 411, 15, 10, 12, 2], [550, 462, 15, 10, 12, 2], [550, 513, 15, 10, 12, 2], [550, 565, 12, 8, 9, 3], [550, 616, 11, 8, 9, 3], [550, 666, 15, 10, 12, 2], [550, 720, 13, 7, 12, 5], [550, 771, 12, 7, 9, 5], [611, 4, 11, 9, 9, 3], [611, 55, 10, 9, 7, 3], [611, 105, 15, 10, 12, 2], [611, 156, 15, 10, 12, 2], [611, 207, 15, 10, 12, 2], [611, 258, 15, 10, 12, 2], [611, 309, 15, 10, 12, 2], [611, 363, 12, 7, 10, 5], [611, 414, 11, 7, 10, 5], [611, 469, 11, 3, 12, 9], [611, 511, 1, 1, 10, 1], [611, 563, 13, 11, 12, 1], [611, 613, 15, 12, 12, 0], [611, 664, 15, 12, 11, 0], [611, 718, 17, 9, 14, 3], [611, 771, 13, 7, 12, 5], [672, 8, 9, 3, 8, 7], [672, 59, 10, 3, 9, 7], [672, 106, 12, 5, 9, 3], [672, 157, 12, 5, 9, 3], [672, 208, 10, 5, 7, 3], [672, 259, 10, 5, 7, 3], [672, 309, 15, 10, 12, 2], [672, 361, 13, 9, 13, 3], [672, 412, 12, 11, 10, 3], [1, 1, 1, 1, 7, 1], [794, 768, 15, 10, 12, 2], [672, 564, 15, 10, 12, 2], [672, 615, 15, 10, 12, 2], [672, 666, 15, 10, 12, 2], [672, 717, 15, 10, 12, 2], [672, 768, 15, 10, 12, 2], [733, 3, 15, 10, 12, 2], [733, 54, 15, 10, 12, 2], [733, 105, 15, 10, 12, 2], [733, 156, 15, 10, 12, 2], [733, 207, 15, 10, 12, 2], [733, 258, 15, 10, 12, 2], [733, 309, 15, 10, 12, 2], [733, 360, 15, 10, 12, 2], [733, 411, 15, 10, 12, 2], [733, 462, 15, 10, 12, 2], [733, 513, 15, 10, 12, 2], [733, 564, 15, 10, 12, 2], [733, 615, 15, 10, 12, 2], [733, 666, 15, 10, 12, 2], [733, 717, 15, 10, 12, 2], [733, 768, 15, 10, 12, 2], [1, 1, 1, 1, 7, 1], [794, 54, 15, 10, 12, 2], [794, 105, 15, 10, 12, 2], [794, 156, 15, 10, 12, 2], [794, 207, 15, 10, 12, 2], [794, 258, 15, 10, 12, 2], [794, 309, 15, 10, 12, 2], [794, 360, 15, 10, 12, 2], [794, 411, 15, 10, 12, 2], [794, 462, 15, 10, 12, 2], [794, 513, 15, 10, 12, 2], [794, 564, 15, 10, 12, 2], [794, 615, 15, 10, 12, 2], [794, 666, 15, 10, 12, 2], [794, 717, 15, 10, 12, 2], [794, 768, 15, 10, 12, 2], [855, 3, 15, 10, 12, 2], [855, 54, 15, 10, 12, 2], [855, 105, 15, 10, 12, 2], [855, 156, 15, 10, 12, 2], [855, 207, 15, 10, 12, 2], [855, 258, 15, 10, 12, 2], [855, 309, 15, 10, 12, 2], [855, 360, 15, 10, 12, 2], [855, 411, 15, 10, 12, 2], [855, 462, 15, 10, 12, 2], [855, 513, 15, 10, 12, 2], [855, 564, 15, 10, 12, 2], [855, 615, 15, 10, 12, 2], [855, 666, 15, 10, 12, 2], [855, 717, 15, 10, 12, 2], [855, 768, 15, 10, 12, 2]], \"capHeight\": 11, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 55, 9, 7, 6, 3], [1, 106, 11, 2, 8, 3], [1, 157, 11, 5, 9, 3], [1, 207, 11, 9, 9, 2], [1, 259, 13, 7, 11, 3], [1, 310, 11, 7, 11, 3], [1, 361, 9, 2, 6, 3], [1, 411, 10, 9, 7, 2], [1, 462, 9, 9, 7, 2], [1, 513, 10, 4, 7, 2], [1, 566, 10, 5, 9, 4], [1, 622, 6, 2, 6, 9], [1, 670, 9, 1, 8, 6], [1, 724, 6, 1, 6, 9], [1, 768, 11, 8, 8, 2], [62, 4, 11, 7, 9, 3], [62, 55, 10, 7, 9, 3], [62, 106, 11, 7, 9, 3], [62, 157, 11, 8, 9, 3], [62, 208, 11, 7, 9, 3], [62, 259, 12, 8, 9, 3], [62, 309, 11, 8, 9, 2], [62, 361, 12, 7, 9, 3], [62, 412, 11, 7, 9, 3], [62, 463, 11, 8, 9, 3], [62, 516, 8, 5, 6, 5], [62, 567, 8, 6, 6, 5], [62, 617, 9, 5, 7, 4], [62, 669, 10, 3, 8, 5], [62, 719, 8, 5, 7, 4], [62, 769, 10, 7, 8, 3], [123, 5, 12, 7, 11, 4], [123, 55, 11, 7, 11, 3], [123, 106, 11, 7, 9, 3], [123, 157, 12, 7, 9, 3], [123, 208, 12, 7, 10, 3], [123, 259, 12, 7, 9, 3], [123, 310, 12, 7, 9, 3], [123, 361, 12, 7, 9, 3], [123, 412, 13, 7, 10, 3], [123, 463, 10, 7, 7, 3], [123, 514, 11, 9, 8, 3], [123, 565, 13, 7, 10, 3], [123, 616, 10, 7, 9, 3], [123, 667, 14, 7, 11, 3], [123, 718, 14, 7, 10, 3], [123, 769, 12, 7, 10, 3], [184, 4, 11, 7, 9, 3], [184, 55, 12, 9, 10, 3], [184, 106, 11, 7, 9, 3], [184, 157, 11, 7, 8, 3], [184, 208, 12, 7, 9, 3], [184, 259, 14, 7, 10, 3], [184, 310, 14, 7, 10, 3], [184, 361, 16, 7, 12, 3], [184, 412, 12, 7, 9, 3], [184, 463, 12, 7, 9, 3], [184, 514, 11, 7, 8, 3], [184, 564, 9, 9, 6, 2], [184, 615, 8, 8, 8, 2], [184, 666, 9, 9, 6, 2], [184, 718, 9, 2, 7, 3], [184, 775, 10, 1, 9, 9], [245, 4, 8, 2, 6, 3], [245, 57, 9, 5, 8, 5], [245, 106, 10, 7, 9, 3], [245, 159, 10, 5, 8, 5], [245, 208, 11, 7, 9, 3], [245, 261, 9, 5, 8, 5], [245, 310, 10, 7, 7, 3], [245, 362, 10, 8, 8, 4], [245, 412, 10, 7, 9, 3], [245, 463, 9, 7, 7, 3], [245, 514, 9, 9, 6, 3], [245, 565, 11, 7, 9, 3], [245, 616, 9, 7, 7, 3], [245, 669, 12, 5, 11, 5], [245, 720, 10, 5, 9, 5], [245, 771, 9, 5, 8, 5], [306, 6, 10, 7, 9, 5], [306, 57, 10, 7, 9, 5], [306, 108, 10, 5, 8, 5], [306, 159, 10, 5, 8, 5], [306, 208, 9, 7, 7, 3], [306, 261, 11, 5, 9, 5], [306, 312, 11, 5, 8, 5], [306, 363, 13, 5, 10, 5], [306, 414, 11, 5, 9, 5], [306, 465, 11, 7, 9, 5], [306, 516, 10, 5, 8, 5], [306, 564, 10, 9, 7, 2], [306, 615, 8, 9, 5, 2], [306, 666, 9, 9, 7, 2], [306, 718, 11, 2, 7, 3], [306, 766, 1, 1, 3, 1], [367, 2, 13, 9, 11, 1], [367, 52, 13, 10, 11, 0], [367, 106, 12, 9, 9, 3], [367, 155, 12, 9, 9, 1], [367, 205, 14, 10, 10, 0], [367, 257, 13, 9, 10, 1], [367, 308, 14, 9, 10, 1], [367, 360, 10, 8, 8, 2], [367, 411, 10, 8, 8, 2], [367, 462, 11, 8, 8, 2], [367, 514, 11, 7, 8, 3], [367, 564, 11, 8, 8, 2], [367, 614, 11, 9, 8, 1], [367, 669, 10, 7, 8, 5], [367, 717, 10, 8, 8, 2], [367, 768, 10, 8, 8, 2], [428, 3, 10, 8, 8, 2], [428, 55, 11, 7, 8, 3], [428, 105, 9, 8, 7, 2], [428, 156, 9, 8, 7, 2], [428, 207, 10, 8, 7, 2], [428, 259, 10, 7, 7, 3], [428, 309, 12, 8, 9, 2], [428, 360, 10, 8, 8, 2], [428, 411, 10, 8, 8, 2], [428, 462, 10, 8, 8, 2], [428, 514, 11, 7, 8, 3], [428, 564, 11, 8, 8, 2], [428, 615, 12, 8, 9, 2], [428, 666, 11, 8, 9, 2], [428, 717, 12, 8, 9, 2], [428, 769, 11, 7, 9, 3], [489, 3, 10, 4, 7, 2], [489, 54, 10, 4, 7, 2], [489, 107, 10, 7, 9, 4], [489, 157, 11, 7, 9, 3], [489, 207, 11, 9, 8, 2], [489, 261, 9, 3, 7, 5], [489, 310, 13, 7, 10, 3], [489, 361, 10, 7, 8, 3], [489, 414, 10, 5, 9, 5], [489, 465, 10, 5, 9, 5], [489, 514, 12, 3, 9, 3], [489, 565, 9, 2, 6, 3], [489, 616, 10, 1, 7, 3], [489, 666, 14, 8, 11, 2], [489, 718, 15, 7, 12, 3], [489, 769, 14, 7, 10, 3], [550, 3, 14, 8, 11, 2], [550, 54, 14, 8, 11, 2], [550, 105, 14, 8, 11, 2], [550, 156, 14, 8, 11, 2], [550, 208, 12, 7, 9, 3], [550, 258, 14, 8, 11, 2], [550, 309, 14, 8, 11, 2], [550, 360, 14, 8, 11, 2], [550, 411, 14, 8, 11, 2], [550, 462, 14, 8, 11, 2], [550, 513, 14, 8, 11, 2], [550, 565, 11, 6, 8, 3], [550, 616, 10, 6, 8, 3], [550, 666, 14, 8, 11, 2], [550, 720, 12, 5, 11, 5], [550, 771, 11, 5, 8, 5], [611, 4, 10, 7, 8, 3], [611, 55, 9, 7, 6, 3], [611, 105, 14, 8, 11, 2], [611, 156, 14, 8, 11, 2], [611, 207, 14, 8, 11, 2], [611, 258, 14, 8, 11, 2], [611, 309, 14, 8, 11, 2], [611, 363, 11, 5, 9, 5], [611, 414, 10, 5, 9, 5], [611, 469, 10, 1, 11, 9], [611, 511, 1, 1, 9, 1], [611, 563, 12, 9, 11, 1], [611, 613, 13, 10, 11, 0], [611, 664, 13, 10, 10, 0], [611, 718, 16, 7, 13, 3], [611, 771, 12, 5, 11, 5], [672, 8, 8, 1, 7, 7], [672, 59, 9, 1, 8, 7], [672, 106, 11, 3, 8, 3], [672, 157, 11, 3, 8, 3], [672, 208, 9, 3, 6, 3], [672, 259, 9, 3, 6, 3], [672, 309, 14, 8, 11, 2], [672, 361, 12, 7, 12, 3], [672, 412, 11, 9, 9, 3], [1, 1, 1, 1, 6, 1], [794, 768, 14, 8, 11, 2], [672, 564, 14, 8, 11, 2], [672, 615, 14, 8, 11, 2], [672, 666, 14, 8, 11, 2], [672, 717, 14, 8, 11, 2], [672, 768, 14, 8, 11, 2], [733, 3, 14, 8, 11, 2], [733, 54, 14, 8, 11, 2], [733, 105, 14, 8, 11, 2], [733, 156, 14, 8, 11, 2], [733, 207, 14, 8, 11, 2], [733, 258, 14, 8, 11, 2], [733, 309, 14, 8, 11, 2], [733, 360, 14, 8, 11, 2], [733, 411, 14, 8, 11, 2], [733, 462, 14, 8, 11, 2], [733, 513, 14, 8, 11, 2], [733, 564, 14, 8, 11, 2], [733, 615, 14, 8, 11, 2], [733, 666, 14, 8, 11, 2], [733, 717, 14, 8, 11, 2], [733, 768, 14, 8, 11, 2], [1, 1, 1, 1, 6, 1], [794, 54, 14, 8, 11, 2], [794, 105, 14, 8, 11, 2], [794, 156, 14, 8, 11, 2], [794, 207, 14, 8, 11, 2], [794, 258, 14, 8, 11, 2], [794, 309, 14, 8, 11, 2], [794, 360, 14, 8, 11, 2], [794, 411, 14, 8, 11, 2], [794, 462, 14, 8, 11, 2], [794, 513, 14, 8, 11, 2], [794, 564, 14, 8, 11, 2], [794, 615, 14, 8, 11, 2], [794, 666, 14, 8, 11, 2], [794, 717, 14, 8, 11, 2], [794, 768, 14, 8, 11, 2], [855, 3, 14, 8, 11, 2], [855, 54, 14, 8, 11, 2], [855, 105, 14, 8, 11, 2], [855, 156, 14, 8, 11, 2], [855, 207, 14, 8, 11, 2], [855, 258, 14, 8, 11, 2], [855, 309, 14, 8, 11, 2], [855, 360, 14, 8, 11, 2], [855, 411, 14, 8, 11, 2], [855, 462, 14, 8, 11, 2], [855, 513, 14, 8, 11, 2], [855, 564, 14, 8, 11, 2], [855, 615, 14, 8, 11, 2], [855, 666, 14, 8, 11, 2], [855, 717, 14, 8, 11, 2], [855, 768, 14, 8, 11, 2]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 55, 7, 9, 7, 3], [1, 106, 9, 8, 9, 3], [1, 157, 10, 8, 10, 3], [1, 207, 10, 11, 10, 2], [1, 259, 12, 9, 12, 3], [1, 310, 12, 9, 12, 3], [1, 361, 7, 8, 7, 3], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 513, 8, 9, 8, 2], [1, 566, 10, 7, 10, 4], [1, 618, 7, 8, 7, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 7, 7, 5], [1, 768, 9, 10, 9, 2], [62, 4, 10, 9, 10, 3], [62, 55, 10, 9, 10, 3], [62, 106, 10, 9, 10, 3], [62, 157, 10, 10, 10, 3], [62, 208, 10, 9, 10, 3], [62, 259, 10, 10, 10, 3], [62, 309, 10, 10, 10, 2], [62, 361, 10, 9, 10, 3], [62, 412, 10, 9, 10, 3], [62, 463, 10, 10, 10, 3], [62, 516, 7, 7, 7, 5], [62, 567, 7, 8, 7, 5], [62, 617, 8, 7, 8, 4], [62, 669, 9, 6, 9, 5], [62, 719, 8, 7, 8, 4], [62, 769, 9, 9, 9, 3], [123, 5, 12, 9, 12, 4], [123, 55, 12, 9, 12, 3], [123, 106, 10, 9, 10, 3], [123, 157, 10, 9, 10, 3], [123, 208, 11, 9, 11, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 10, 9, 10, 3], [123, 412, 11, 9, 11, 3], [123, 463, 8, 9, 8, 3], [123, 514, 9, 11, 9, 3], [123, 565, 11, 9, 11, 3], [123, 616, 10, 9, 10, 3], [123, 667, 12, 9, 12, 3], [123, 718, 11, 9, 11, 3], [123, 769, 11, 9, 11, 3], [184, 4, 10, 9, 10, 3], [184, 55, 11, 11, 11, 3], [184, 106, 10, 9, 10, 3], [184, 157, 9, 9, 9, 3], [184, 208, 10, 9, 10, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 13, 9, 13, 3], [184, 412, 10, 9, 10, 3], [184, 463, 10, 9, 10, 3], [184, 514, 9, 9, 9, 3], [184, 564, 7, 11, 7, 2], [184, 615, 9, 10, 9, 2], [184, 666, 7, 11, 7, 2], [184, 718, 8, 8, 8, 3], [184, 771, 10, 7, 10, 5], [245, 4, 7, 8, 7, 3], [245, 57, 9, 7, 9, 5], [245, 106, 10, 9, 10, 3], [245, 159, 9, 7, 9, 5], [245, 208, 10, 9, 10, 3], [245, 261, 9, 7, 9, 5], [245, 310, 8, 9, 8, 3], [245, 362, 9, 10, 9, 4], [245, 412, 10, 9, 10, 3], [245, 463, 8, 9, 8, 3], [245, 514, 7, 11, 7, 3], [245, 565, 10, 9, 10, 3], [245, 616, 8, 9, 8, 3], [245, 669, 12, 7, 12, 5], [245, 720, 10, 7, 10, 5], [245, 771, 9, 7, 9, 5], [306, 6, 10, 9, 10, 5], [306, 57, 10, 9, 10, 5], [306, 108, 9, 7, 9, 5], [306, 159, 9, 7, 9, 5], [306, 208, 8, 9, 8, 3], [306, 261, 10, 7, 10, 5], [306, 312, 9, 7, 9, 5], [306, 363, 11, 7, 11, 5], [306, 414, 10, 7, 10, 5], [306, 465, 10, 9, 10, 5], [306, 516, 9, 7, 9, 5], [306, 564, 8, 11, 8, 2], [306, 615, 6, 11, 6, 2], [306, 666, 8, 11, 8, 2], [306, 718, 8, 8, 8, 3], [306, 771, 3, 6, 3, 5], [367, 2, 12, 11, 12, 1], [367, 52, 12, 12, 12, 0], [367, 106, 10, 11, 10, 3], [367, 155, 10, 11, 10, 1], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 9, 10, 9, 2], [367, 411, 9, 10, 9, 2], [367, 462, 9, 10, 9, 2], [367, 514, 9, 9, 9, 3], [367, 564, 9, 10, 9, 2], [367, 614, 9, 11, 9, 1], [367, 669, 9, 9, 9, 5], [367, 717, 9, 10, 9, 2], [367, 768, 9, 10, 9, 2], [428, 3, 9, 10, 9, 2], [428, 55, 9, 9, 9, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 207, 8, 10, 8, 2], [428, 259, 8, 9, 8, 3], [428, 309, 10, 10, 10, 2], [428, 360, 9, 10, 9, 2], [428, 411, 9, 10, 9, 2], [428, 462, 9, 10, 9, 2], [428, 514, 9, 9, 9, 3], [428, 564, 9, 10, 9, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 8, 9, 8, 2], [489, 54, 8, 9, 8, 2], [489, 107, 10, 9, 10, 4], [489, 157, 10, 9, 10, 3], [489, 207, 9, 11, 9, 2], [489, 261, 8, 6, 8, 5], [489, 310, 11, 9, 11, 3], [489, 361, 9, 9, 9, 3], [489, 414, 10, 7, 10, 5], [489, 465, 10, 7, 10, 5], [489, 514, 10, 8, 10, 3], [489, 565, 7, 8, 7, 3], [489, 616, 8, 8, 8, 3], [489, 666, 12, 10, 12, 2], [489, 718, 13, 9, 13, 3], [489, 769, 11, 9, 11, 3], [550, 3, 12, 10, 12, 2], [550, 54, 12, 10, 12, 2], [550, 105, 12, 10, 12, 2], [550, 156, 12, 10, 12, 2], [550, 208, 10, 9, 10, 3], [550, 258, 12, 10, 12, 2], [550, 309, 12, 10, 12, 2], [550, 360, 12, 10, 12, 2], [550, 411, 12, 10, 12, 2], [550, 462, 12, 10, 12, 2], [550, 513, 12, 10, 12, 2], [550, 565, 9, 8, 9, 3], [550, 616, 9, 8, 9, 3], [550, 666, 12, 10, 12, 2], [550, 720, 12, 7, 12, 5], [550, 771, 9, 7, 9, 5], [611, 4, 9, 9, 9, 3], [611, 55, 7, 9, 7, 3], [611, 105, 12, 10, 12, 2], [611, 156, 12, 10, 12, 2], [611, 207, 12, 10, 12, 2], [611, 258, 12, 10, 12, 2], [611, 309, 12, 10, 12, 2], [611, 363, 10, 7, 10, 5], [611, 414, 10, 7, 10, 5], [611, 465, 12, 7, 12, 5], [611, 516, 10, 6, 10, 5], [611, 563, 12, 11, 12, 1], [611, 613, 12, 12, 12, 0], [611, 664, 11, 12, 11, 0], [611, 718, 14, 9, 14, 3], [611, 771, 12, 7, 12, 5], [672, 6, 8, 6, 8, 5], [672, 57, 9, 6, 9, 5], [672, 106, 9, 8, 9, 3], [672, 157, 9, 8, 9, 3], [672, 208, 7, 8, 7, 3], [672, 259, 7, 8, 7, 3], [672, 309, 12, 10, 12, 2], [672, 361, 13, 9, 13, 3], [672, 412, 10, 11, 10, 3], [1, 6, 7, 6, 7, 5], [794, 768, 12, 10, 12, 2], [672, 564, 12, 10, 12, 2], [672, 615, 12, 10, 12, 2], [672, 666, 12, 10, 12, 2], [672, 717, 12, 10, 12, 2], [672, 768, 12, 10, 12, 2], [733, 3, 12, 10, 12, 2], [733, 54, 12, 10, 12, 2], [733, 105, 12, 10, 12, 2], [733, 156, 12, 10, 12, 2], [733, 207, 12, 10, 12, 2], [733, 258, 12, 10, 12, 2], [733, 309, 12, 10, 12, 2], [733, 360, 12, 10, 12, 2], [733, 411, 12, 10, 12, 2], [733, 462, 12, 10, 12, 2], [733, 513, 12, 10, 12, 2], [733, 564, 12, 10, 12, 2], [733, 615, 12, 10, 12, 2], [733, 666, 12, 10, 12, 2], [733, 717, 12, 10, 12, 2], [733, 768, 12, 10, 12, 2], [1, 6, 7, 6, 7, 5], [794, 54, 12, 10, 12, 2], [794, 105, 12, 10, 12, 2], [794, 156, 12, 10, 12, 2], [794, 207, 12, 10, 12, 2], [794, 258, 12, 10, 12, 2], [794, 309, 12, 10, 12, 2], [794, 360, 12, 10, 12, 2], [794, 411, 12, 10, 12, 2], [794, 462, 12, 10, 12, 2], [794, 513, 12, 10, 12, 2], [794, 564, 12, 10, 12, 2], [794, 615, 12, 10, 12, 2], [794, 666, 12, 10, 12, 2], [794, 717, 12, 10, 12, 2], [794, 768, 12, 10, 12, 2], [855, 3, 12, 10, 12, 2], [855, 54, 12, 10, 12, 2], [855, 105, 12, 10, 12, 2], [855, 156, 12, 10, 12, 2], [855, 207, 12, 10, 12, 2], [855, 258, 12, 10, 12, 2], [855, 309, 12, 10, 12, 2], [855, 360, 12, 10, 12, 2], [855, 411, 12, 10, 12, 2], [855, 462, 12, 10, 12, 2], [855, 513, 12, 10, 12, 2], [855, 564, 12, 10, 12, 2], [855, 615, 12, 10, 12, 2], [855, 666, 12, 10, 12, 2], [855, 717, 12, 10, 12, 2], [855, 768, 12, 10, 12, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/03_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 8, 7, 8, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 9, 9, 2], [1, 259, 11, 7, 11, 3], [1, 310, 11, 7, 11, 3], [1, 361, 6, 7, 6, 3], [1, 411, 7, 9, 7, 2], [1, 462, 7, 9, 7, 2], [1, 513, 7, 8, 7, 2], [1, 566, 9, 6, 9, 4], [1, 617, 6, 7, 6, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 768, 8, 8, 8, 2], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 8, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 8, 9, 3], [62, 309, 9, 8, 9, 2], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 8, 9, 3], [62, 515, 6, 6, 6, 4], [62, 566, 6, 7, 6, 4], [62, 617, 7, 6, 7, 4], [62, 668, 8, 6, 8, 4], [62, 719, 7, 6, 7, 4], [62, 769, 8, 7, 8, 3], [123, 5, 11, 7, 11, 4], [123, 55, 11, 7, 11, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 9, 7, 9, 3], [123, 412, 10, 7, 10, 3], [123, 463, 7, 7, 7, 3], [123, 514, 8, 9, 8, 3], [123, 565, 10, 7, 10, 3], [123, 616, 9, 7, 9, 3], [123, 667, 11, 7, 11, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 9, 7, 9, 3], [184, 55, 10, 9, 10, 3], [184, 106, 9, 7, 9, 3], [184, 157, 8, 7, 8, 3], [184, 208, 9, 7, 9, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 8, 7, 8, 3], [184, 564, 6, 9, 6, 2], [184, 615, 8, 8, 8, 2], [184, 666, 6, 9, 6, 2], [184, 718, 7, 7, 7, 3], [184, 770, 9, 6, 9, 4], [245, 4, 6, 7, 6, 3], [245, 56, 8, 6, 8, 4], [245, 106, 9, 7, 9, 3], [245, 158, 8, 6, 8, 4], [245, 208, 9, 7, 9, 3], [245, 260, 8, 6, 8, 4], [245, 310, 7, 7, 7, 3], [245, 362, 8, 8, 8, 4], [245, 412, 9, 7, 9, 3], [245, 463, 7, 7, 7, 3], [245, 514, 6, 9, 6, 3], [245, 565, 9, 7, 9, 3], [245, 616, 7, 7, 7, 3], [245, 668, 11, 6, 11, 4], [245, 719, 9, 6, 9, 4], [245, 770, 8, 6, 8, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 8, 6, 8, 4], [306, 158, 8, 6, 8, 4], [306, 208, 7, 7, 7, 3], [306, 260, 9, 6, 9, 4], [306, 311, 8, 6, 8, 4], [306, 362, 10, 6, 10, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 564, 7, 9, 7, 2], [306, 615, 5, 9, 5, 2], [306, 666, 7, 9, 7, 2], [306, 718, 7, 7, 7, 3], [306, 770, 3, 6, 3, 4], [367, 2, 11, 9, 11, 1], [367, 52, 11, 10, 11, 0], [367, 106, 9, 9, 9, 3], [367, 155, 9, 9, 9, 1], [367, 205, 10, 10, 10, 0], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 8, 8, 8, 2], [367, 411, 8, 8, 8, 2], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 717, 8, 8, 8, 2], [367, 768, 8, 8, 8, 2], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 7, 8, 7, 2], [428, 156, 7, 8, 7, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 9, 8, 9, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 3, 7, 8, 7, 2], [489, 54, 7, 8, 7, 2], [489, 107, 9, 7, 9, 4], [489, 157, 9, 7, 9, 3], [489, 207, 8, 9, 8, 2], [489, 260, 7, 6, 7, 4], [489, 310, 10, 7, 10, 3], [489, 361, 8, 7, 8, 3], [489, 413, 9, 6, 9, 4], [489, 464, 9, 6, 9, 4], [489, 514, 9, 7, 9, 3], [489, 565, 6, 7, 6, 3], [489, 616, 7, 7, 7, 3], [489, 666, 11, 8, 11, 2], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 3, 11, 8, 11, 2], [550, 54, 11, 8, 11, 2], [550, 105, 11, 8, 11, 2], [550, 156, 11, 8, 11, 2], [550, 208, 9, 7, 9, 3], [550, 258, 11, 8, 11, 2], [550, 309, 11, 8, 11, 2], [550, 360, 11, 8, 11, 2], [550, 411, 11, 8, 11, 2], [550, 462, 11, 8, 11, 2], [550, 513, 11, 8, 11, 2], [550, 565, 8, 7, 8, 3], [550, 616, 8, 7, 8, 3], [550, 666, 11, 8, 11, 2], [550, 719, 11, 6, 11, 4], [550, 770, 8, 6, 8, 4], [611, 4, 8, 7, 8, 3], [611, 55, 6, 7, 6, 3], [611, 105, 11, 8, 11, 2], [611, 156, 11, 8, 11, 2], [611, 207, 11, 8, 11, 2], [611, 258, 11, 8, 11, 2], [611, 309, 11, 8, 11, 2], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 11, 6, 11, 4], [611, 515, 9, 6, 9, 4], [611, 563, 11, 9, 11, 1], [611, 613, 11, 10, 11, 0], [611, 664, 10, 10, 10, 0], [611, 718, 13, 7, 13, 3], [611, 770, 11, 6, 11, 4], [672, 5, 7, 6, 7, 4], [672, 56, 8, 6, 8, 4], [672, 106, 8, 7, 8, 3], [672, 157, 8, 7, 8, 3], [672, 208, 6, 7, 6, 3], [672, 259, 6, 7, 6, 3], [672, 309, 11, 8, 11, 2], [672, 361, 12, 7, 12, 3], [672, 412, 9, 9, 9, 3], [1, 5, 6, 6, 6, 4], [794, 768, 11, 8, 11, 2], [672, 564, 11, 8, 11, 2], [672, 615, 11, 8, 11, 2], [672, 666, 11, 8, 11, 2], [672, 717, 11, 8, 11, 2], [672, 768, 11, 8, 11, 2], [733, 3, 11, 8, 11, 2], [733, 54, 11, 8, 11, 2], [733, 105, 11, 8, 11, 2], [733, 156, 11, 8, 11, 2], [733, 207, 11, 8, 11, 2], [733, 258, 11, 8, 11, 2], [733, 309, 11, 8, 11, 2], [733, 360, 11, 8, 11, 2], [733, 411, 11, 8, 11, 2], [733, 462, 11, 8, 11, 2], [733, 513, 11, 8, 11, 2], [733, 564, 11, 8, 11, 2], [733, 615, 11, 8, 11, 2], [733, 666, 11, 8, 11, 2], [733, 717, 11, 8, 11, 2], [733, 768, 11, 8, 11, 2], [1, 5, 6, 6, 6, 4], [794, 54, 11, 8, 11, 2], [794, 105, 11, 8, 11, 2], [794, 156, 11, 8, 11, 2], [794, 207, 11, 8, 11, 2], [794, 258, 11, 8, 11, 2], [794, 309, 11, 8, 11, 2], [794, 360, 11, 8, 11, 2], [794, 411, 11, 8, 11, 2], [794, 462, 11, 8, 11, 2], [794, 513, 11, 8, 11, 2], [794, 564, 11, 8, 11, 2], [794, 615, 11, 8, 11, 2], [794, 666, 11, 8, 11, 2], [794, 717, 11, 8, 11, 2], [794, 768, 11, 8, 11, 2], [855, 3, 11, 8, 11, 2], [855, 54, 11, 8, 11, 2], [855, 105, 11, 8, 11, 2], [855, 156, 11, 8, 11, 2], [855, 207, 11, 8, 11, 2], [855, 258, 11, 8, 11, 2], [855, 309, 11, 8, 11, 2], [855, 360, 11, 8, 11, 2], [855, 411, 11, 8, 11, 2], [855, 462, 11, 8, 11, 2], [855, 513, 11, 8, 11, 2], [855, 564, 11, 8, 11, 2], [855, 615, 11, 8, 11, 2], [855, 666, 11, 8, 11, 2], [855, 717, 11, 8, 11, 2], [855, 768, 11, 8, 11, 2]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 9, 7, 2], [1, 105, 12, 4, 8, 2], [1, 156, 13, 9, 9, 2], [1, 206, 12, 11, 9, 1], [1, 258, 16, 9, 12, 2], [1, 309, 14, 9, 12, 2], [1, 360, 10, 4, 6, 2], [1, 411, 11, 11, 7, 2], [1, 462, 10, 11, 7, 2], [1, 513, 13, 7, 9, 2], [1, 566, 12, 7, 10, 4], [1, 621, 8, 5, 7, 8], [1, 670, 10, 3, 7, 6], [1, 723, 8, 3, 7, 8], [1, 768, 11, 9, 7, 2], [62, 3, 12, 9, 9, 2], [62, 54, 12, 9, 9, 2], [62, 105, 12, 9, 9, 2], [62, 156, 12, 9, 9, 2], [62, 207, 13, 9, 9, 2], [62, 258, 13, 9, 9, 2], [62, 309, 12, 9, 9, 2], [62, 360, 13, 9, 9, 2], [62, 411, 12, 9, 9, 2], [62, 462, 12, 9, 9, 2], [62, 515, 10, 7, 7, 4], [62, 566, 10, 9, 7, 4], [62, 617, 12, 7, 10, 4], [62, 669, 11, 5, 9, 5], [62, 719, 11, 7, 10, 4], [62, 768, 12, 9, 8, 2], [123, 3, 16, 10, 13, 2], [123, 54, 13, 9, 11, 2], [123, 105, 13, 9, 10, 2], [123, 156, 15, 9, 11, 2], [123, 207, 14, 9, 11, 2], [123, 258, 14, 9, 10, 2], [123, 309, 14, 9, 10, 2], [123, 360, 15, 9, 11, 2], [123, 411, 16, 9, 11, 2], [123, 462, 12, 9, 7, 2], [123, 513, 13, 9, 8, 2], [123, 564, 15, 9, 11, 2], [123, 615, 12, 9, 10, 2], [123, 666, 18, 9, 13, 2], [123, 717, 16, 9, 11, 2], [123, 768, 14, 9, 11, 2], [184, 3, 13, 9, 10, 2], [184, 54, 14, 11, 11, 2], [184, 105, 14, 9, 11, 2], [184, 156, 14, 9, 10, 2], [184, 207, 14, 9, 10, 2], [184, 258, 16, 9, 11, 2], [184, 309, 16, 9, 11, 2], [184, 360, 18, 9, 13, 2], [184, 411, 16, 9, 11, 2], [184, 462, 16, 9, 11, 2], [184, 513, 14, 9, 10, 2], [184, 564, 11, 11, 7, 2], [184, 615, 10, 9, 7, 2], [184, 666, 11, 11, 7, 2], [184, 717, 11, 4, 7, 2], [184, 776, 10, 3, 9, 10], [245, 3, 10, 4, 7, 2], [245, 56, 10, 7, 8, 4], [245, 105, 11, 9, 9, 2], [245, 158, 11, 7, 8, 4], [245, 207, 12, 9, 8, 2], [245, 260, 10, 7, 8, 4], [245, 309, 12, 9, 7, 2], [245, 362, 13, 9, 9, 4], [245, 411, 11, 9, 9, 2], [245, 462, 11, 9, 7, 2], [245, 513, 11, 11, 7, 2], [245, 564, 12, 9, 9, 2], [245, 615, 11, 9, 7, 2], [245, 668, 13, 7, 12, 4], [245, 719, 11, 7, 9, 4], [245, 770, 11, 7, 9, 4], [306, 5, 11, 9, 9, 4], [306, 56, 11, 9, 8, 4], [306, 107, 11, 7, 7, 4], [306, 158, 11, 7, 8, 4], [306, 208, 10, 8, 7, 3], [306, 260, 12, 7, 9, 4], [306, 311, 13, 7, 9, 4], [306, 362, 15, 7, 11, 4], [306, 413, 13, 7, 9, 4], [306, 464, 13, 9, 9, 4], [306, 515, 11, 7, 8, 4], [306, 564, 12, 11, 8, 2], [306, 615, 10, 11, 6, 2], [306, 666, 10, 11, 8, 2], [306, 719, 12, 4, 9, 4], [306, 768, 11, 9, 10, 2], [367, 1, 15, 11, 11, 0], [367, 52, 15, 11, 11, 0], [367, 105, 15, 11, 11, 2], [367, 154, 14, 11, 10, 0], [367, 205, 16, 11, 11, 0], [367, 256, 15, 11, 11, 0], [367, 307, 16, 11, 11, 0], [367, 359, 11, 10, 8, 1], [367, 410, 11, 10, 8, 1], [367, 461, 12, 10, 8, 1], [367, 513, 12, 9, 8, 2], [367, 563, 13, 10, 8, 1], [367, 614, 12, 10, 8, 1], [367, 668, 11, 9, 8, 4], [367, 716, 12, 10, 8, 1], [367, 767, 12, 10, 8, 1], [428, 2, 12, 10, 8, 1], [428, 54, 12, 9, 8, 2], [428, 104, 11, 10, 7, 1], [428, 155, 11, 10, 7, 1], [428, 206, 12, 10, 7, 1], [428, 258, 12, 9, 7, 2], [428, 308, 13, 10, 9, 1], [428, 359, 12, 10, 9, 1], [428, 410, 12, 10, 9, 1], [428, 461, 13, 10, 9, 1], [428, 513, 13, 9, 9, 2], [428, 563, 13, 10, 9, 1], [428, 614, 12, 10, 9, 1], [428, 665, 12, 10, 9, 1], [428, 716, 13, 10, 9, 1], [428, 768, 13, 9, 9, 2], [489, 3, 12, 10, 9, 2], [489, 54, 11, 4, 7, 2], [489, 106, 12, 9, 9, 3], [489, 156, 13, 9, 9, 2], [489, 206, 13, 12, 9, 1], [489, 260, 10, 4, 7, 4], [489, 309, 13, 11, 9, 2], [489, 360, 12, 9, 9, 2], [489, 411, 15, 9, 12, 2], [489, 462, 15, 9, 12, 2], [489, 513, 17, 6, 13, 2], [489, 564, 11, 4, 7, 2], [489, 615, 12, 3, 7, 2], [489, 668, 12, 7, 9, 4], [489, 717, 17, 9, 13, 2], [489, 768, 15, 9, 11, 2], [550, 5, 12, 6, 10, 4], [550, 56, 12, 7, 10, 4], [550, 107, 12, 7, 10, 4], [550, 158, 12, 7, 10, 4], [550, 207, 14, 9, 9, 2], [550, 260, 12, 9, 10, 4], [550, 309, 12, 9, 9, 2], [550, 360, 15, 10, 11, 2], [550, 411, 16, 10, 12, 2], [550, 464, 13, 7, 10, 4], [550, 513, 12, 11, 7, 2], [550, 564, 11, 6, 7, 2], [550, 615, 11, 6, 7, 2], [550, 666, 15, 9, 12, 2], [550, 719, 13, 7, 11, 4], [550, 770, 13, 7, 9, 4], [611, 5, 11, 9, 8, 4], [611, 56, 10, 9, 7, 4], [611, 108, 12, 5, 10, 5], [611, 156, 14, 9, 9, 2], [611, 207, 13, 11, 9, 2], [611, 259, 12, 7, 9, 3], [611, 309, 12, 9, 10, 2], [611, 363, 11, 6, 9, 5], [611, 414, 11, 6, 9, 5], [611, 468, 14, 3, 14, 8], [611, 511, 1, 1, 9, 1], [611, 563, 13, 10, 11, 1], [611, 614, 15, 10, 11, 1], [611, 665, 14, 10, 11, 1], [611, 717, 17, 9, 13, 2], [611, 770, 13, 7, 11, 4], [672, 7, 11, 3, 9, 6], [672, 58, 16, 3, 14, 6], [672, 105, 12, 4, 8, 2], [672, 156, 12, 4, 8, 2], [672, 207, 11, 4, 7, 2], [672, 258, 11, 4, 7, 2], [672, 311, 12, 7, 10, 4], [672, 360, 12, 9, 9, 2], [672, 411, 13, 11, 9, 2], [1, 1, 1, 1, 7, 1], [794, 766, 14, 4, 9, 0], [672, 565, 12, 6, 9, 3], [672, 618, 9, 6, 7, 5], [672, 669, 9, 6, 7, 5], [672, 717, 13, 9, 10, 2], [672, 768, 14, 9, 10, 2], [733, 3, 12, 10, 9, 2], [733, 57, 9, 3, 7, 5], [733, 111, 8, 5, 7, 8], [733, 162, 10, 5, 8, 8], [733, 207, 16, 9, 14, 2], [733, 256, 14, 11, 11, 0], [733, 307, 14, 11, 10, 0], [733, 359, 14, 10, 11, 1], [733, 410, 14, 10, 10, 1], [733, 461, 14, 10, 10, 1], [733, 511, 12, 11, 7, 0], [733, 562, 12, 11, 7, 0], [733, 613, 12, 11, 7, 0], [733, 664, 12, 11, 7, 0], [733, 715, 15, 11, 11, 0], [733, 766, 14, 11, 11, 0], [1, 1, 1, 1, 7, 1], [794, 52, 14, 11, 11, 0], [794, 103, 16, 11, 11, 0], [794, 154, 16, 11, 11, 0], [794, 205, 16, 11, 11, 0], [794, 260, 10, 7, 7, 4], [794, 308, 12, 4, 7, 1], [794, 359, 13, 4, 8, 1], [794, 411, 12, 3, 7, 2], [794, 461, 12, 4, 7, 1], [794, 513, 11, 3, 7, 2], [794, 564, 11, 3, 7, 2], [794, 620, 8, 6, 7, 7], [794, 665, 12, 4, 7, 1], [794, 723, 8, 5, 7, 8], [794, 766, 14, 4, 9, 0], [855, 1, 14, 4, 9, 0], [855, 52, 14, 4, 9, 0], [855, 103, 14, 4, 9, 0], [855, 154, 14, 4, 9, 0], [855, 205, 14, 4, 9, 0], [855, 256, 14, 4, 9, 0], [855, 307, 14, 4, 9, 0], [855, 358, 14, 4, 9, 0], [855, 409, 14, 4, 9, 0], [855, 460, 14, 4, 9, 0], [855, 511, 14, 4, 9, 0], [855, 562, 14, 4, 9, 0], [855, 613, 14, 4, 9, 0], [855, 664, 14, 4, 9, 0], [855, 715, 14, 4, 9, 0], [855, 766, 14, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 18, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 10, 7, 7, 2], [1, 105, 11, 2, 8, 2], [1, 156, 12, 7, 9, 2], [1, 206, 11, 9, 9, 1], [1, 258, 15, 7, 12, 2], [1, 309, 13, 7, 12, 2], [1, 360, 9, 2, 6, 2], [1, 411, 10, 9, 7, 2], [1, 462, 9, 9, 7, 2], [1, 513, 12, 5, 9, 2], [1, 566, 11, 5, 10, 4], [1, 621, 7, 3, 7, 8], [1, 670, 9, 1, 7, 6], [1, 723, 7, 1, 7, 8], [1, 768, 10, 7, 7, 2], [62, 3, 11, 7, 9, 2], [62, 54, 11, 7, 9, 2], [62, 105, 11, 7, 9, 2], [62, 156, 11, 7, 9, 2], [62, 207, 12, 7, 9, 2], [62, 258, 12, 7, 9, 2], [62, 309, 11, 7, 9, 2], [62, 360, 12, 7, 9, 2], [62, 411, 11, 7, 9, 2], [62, 462, 11, 7, 9, 2], [62, 515, 9, 5, 7, 4], [62, 566, 9, 7, 7, 4], [62, 617, 11, 5, 10, 4], [62, 669, 10, 3, 9, 5], [62, 719, 10, 5, 10, 4], [62, 768, 11, 7, 8, 2], [123, 3, 15, 8, 13, 2], [123, 54, 12, 7, 11, 2], [123, 105, 12, 7, 10, 2], [123, 156, 14, 7, 11, 2], [123, 207, 13, 7, 11, 2], [123, 258, 13, 7, 10, 2], [123, 309, 13, 7, 10, 2], [123, 360, 14, 7, 11, 2], [123, 411, 15, 7, 11, 2], [123, 462, 11, 7, 7, 2], [123, 513, 12, 7, 8, 2], [123, 564, 14, 7, 11, 2], [123, 615, 11, 7, 10, 2], [123, 666, 17, 7, 13, 2], [123, 717, 15, 7, 11, 2], [123, 768, 13, 7, 11, 2], [184, 3, 12, 7, 10, 2], [184, 54, 13, 9, 11, 2], [184, 105, 13, 7, 11, 2], [184, 156, 13, 7, 10, 2], [184, 207, 13, 7, 10, 2], [184, 258, 15, 7, 11, 2], [184, 309, 15, 7, 11, 2], [184, 360, 17, 7, 13, 2], [184, 411, 15, 7, 11, 2], [184, 462, 15, 7, 11, 2], [184, 513, 13, 7, 10, 2], [184, 564, 10, 9, 7, 2], [184, 615, 9, 7, 7, 2], [184, 666, 10, 9, 7, 2], [184, 717, 10, 2, 7, 2], [184, 776, 9, 1, 9, 10], [245, 3, 9, 2, 7, 2], [245, 56, 9, 5, 8, 4], [245, 105, 10, 7, 9, 2], [245, 158, 10, 5, 8, 4], [245, 207, 11, 7, 8, 2], [245, 260, 9, 5, 8, 4], [245, 309, 11, 7, 7, 2], [245, 362, 12, 7, 9, 4], [245, 411, 10, 7, 9, 2], [245, 462, 10, 7, 7, 2], [245, 513, 10, 9, 7, 2], [245, 564, 11, 7, 9, 2], [245, 615, 10, 7, 7, 2], [245, 668, 12, 5, 12, 4], [245, 719, 10, 5, 9, 4], [245, 770, 10, 5, 9, 4], [306, 5, 10, 7, 9, 4], [306, 56, 10, 7, 8, 4], [306, 107, 10, 5, 7, 4], [306, 158, 10, 5, 8, 4], [306, 208, 9, 6, 7, 3], [306, 260, 11, 5, 9, 4], [306, 311, 12, 5, 9, 4], [306, 362, 14, 5, 11, 4], [306, 413, 12, 5, 9, 4], [306, 464, 12, 7, 9, 4], [306, 515, 10, 5, 8, 4], [306, 564, 11, 9, 8, 2], [306, 615, 9, 9, 6, 2], [306, 666, 9, 9, 8, 2], [306, 719, 11, 2, 9, 4], [306, 768, 10, 7, 10, 2], [367, 1, 12, 9, 11, 0], [367, 52, 13, 9, 11, 0], [367, 105, 14, 9, 11, 2], [367, 154, 13, 9, 10, 0], [367, 205, 15, 9, 11, 0], [367, 256, 13, 9, 11, 0], [367, 307, 15, 9, 11, 0], [367, 359, 10, 8, 8, 1], [367, 410, 10, 8, 8, 1], [367, 461, 11, 8, 8, 1], [367, 513, 11, 7, 8, 2], [367, 563, 12, 8, 8, 1], [367, 614, 11, 8, 8, 1], [367, 668, 10, 7, 8, 4], [367, 716, 11, 8, 8, 1], [367, 767, 11, 8, 8, 1], [428, 2, 11, 8, 8, 1], [428, 54, 11, 7, 8, 2], [428, 104, 10, 8, 7, 1], [428, 155, 10, 8, 7, 1], [428, 206, 11, 8, 7, 1], [428, 258, 11, 7, 7, 2], [428, 308, 12, 8, 9, 1], [428, 359, 11, 8, 9, 1], [428, 410, 11, 8, 9, 1], [428, 461, 12, 8, 9, 1], [428, 513, 12, 7, 9, 2], [428, 563, 12, 8, 9, 1], [428, 614, 11, 8, 9, 1], [428, 665, 11, 8, 9, 1], [428, 716, 12, 8, 9, 1], [428, 768, 12, 7, 9, 2], [489, 3, 11, 8, 9, 2], [489, 54, 10, 2, 7, 2], [489, 106, 11, 7, 9, 3], [489, 156, 12, 7, 9, 2], [489, 206, 12, 10, 9, 1], [489, 260, 9, 2, 7, 4], [489, 309, 12, 9, 9, 2], [489, 360, 11, 7, 9, 2], [489, 411, 14, 7, 12, 2], [489, 462, 14, 7, 12, 2], [489, 513, 16, 4, 13, 2], [489, 564, 10, 2, 7, 2], [489, 615, 11, 1, 7, 2], [489, 668, 11, 5, 9, 4], [489, 717, 16, 7, 13, 2], [489, 768, 14, 7, 11, 2], [550, 5, 11, 4, 10, 4], [550, 56, 11, 5, 10, 4], [550, 107, 11, 5, 10, 4], [550, 158, 11, 5, 10, 4], [550, 207, 13, 7, 9, 2], [550, 260, 11, 7, 10, 4], [550, 309, 11, 7, 9, 2], [550, 360, 14, 8, 11, 2], [550, 411, 15, 8, 12, 2], [550, 464, 12, 5, 10, 4], [550, 513, 11, 9, 7, 2], [550, 564, 10, 4, 7, 2], [550, 615, 10, 4, 7, 2], [550, 666, 14, 7, 12, 2], [550, 719, 12, 5, 11, 4], [550, 770, 12, 5, 9, 4], [611, 5, 10, 7, 8, 4], [611, 56, 9, 7, 7, 4], [611, 108, 11, 3, 10, 5], [611, 156, 13, 7, 9, 2], [611, 207, 12, 9, 9, 2], [611, 259, 11, 5, 9, 3], [611, 309, 11, 7, 10, 2], [611, 363, 10, 4, 9, 5], [611, 414, 10, 4, 9, 5], [611, 468, 13, 1, 14, 8], [611, 511, 1, 1, 9, 1], [611, 563, 12, 8, 11, 1], [611, 614, 14, 8, 11, 1], [611, 665, 13, 8, 11, 1], [611, 717, 16, 7, 13, 2], [611, 770, 12, 5, 11, 4], [672, 7, 10, 1, 9, 6], [672, 58, 15, 1, 14, 6], [672, 105, 11, 2, 8, 2], [672, 156, 11, 2, 8, 2], [672, 207, 10, 2, 7, 2], [672, 258, 10, 2, 7, 2], [672, 311, 11, 5, 10, 4], [672, 360, 11, 7, 9, 2], [672, 411, 12, 9, 9, 2], [1, 1, 1, 1, 7, 1], [794, 766, 11, 2, 9, 0], [672, 565, 11, 4, 9, 3], [672, 618, 8, 4, 7, 5], [672, 669, 8, 4, 7, 5], [672, 717, 12, 7, 10, 2], [672, 768, 13, 7, 10, 2], [733, 3, 11, 8, 9, 2], [733, 57, 8, 1, 7, 5], [733, 111, 7, 3, 7, 8], [733, 162, 9, 3, 8, 8], [733, 207, 15, 7, 14, 2], [733, 256, 13, 9, 11, 0], [733, 307, 13, 9, 10, 0], [733, 359, 13, 8, 11, 1], [733, 410, 13, 8, 10, 1], [733, 461, 13, 8, 10, 1], [733, 511, 11, 9, 7, 0], [733, 562, 11, 9, 7, 0], [733, 613, 11, 9, 7, 0], [733, 664, 11, 9, 7, 0], [733, 715, 13, 9, 11, 0], [733, 766, 13, 9, 11, 0], [1, 1, 1, 1, 7, 1], [794, 52, 13, 9, 11, 0], [794, 103, 15, 9, 11, 0], [794, 154, 15, 9, 11, 0], [794, 205, 15, 9, 11, 0], [794, 260, 9, 5, 7, 4], [794, 308, 11, 2, 7, 1], [794, 359, 12, 2, 8, 1], [794, 411, 11, 1, 7, 2], [794, 461, 11, 2, 7, 1], [794, 513, 10, 1, 7, 2], [794, 564, 10, 1, 7, 2], [794, 620, 7, 4, 7, 7], [794, 665, 11, 2, 7, 1], [794, 723, 7, 3, 7, 8], [794, 766, 11, 2, 9, 0], [855, 1, 11, 2, 9, 0], [855, 52, 11, 2, 9, 0], [855, 103, 11, 2, 9, 0], [855, 154, 11, 2, 9, 0], [855, 205, 11, 2, 9, 0], [855, 256, 11, 2, 9, 0], [855, 307, 11, 2, 9, 0], [855, 358, 11, 2, 9, 0], [855, 409, 11, 2, 9, 0], [855, 460, 11, 2, 9, 0], [855, 511, 11, 2, 9, 0], [855, 562, 11, 2, 9, 0], [855, 613, 11, 2, 9, 0], [855, 664, 11, 2, 9, 0], [855, 715, 11, 2, 9, 0], [855, 766, 11, 2, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 7, 9, 7, 2], [1, 105, 8, 8, 8, 2], [1, 156, 9, 9, 9, 2], [1, 206, 9, 11, 9, 1], [1, 258, 12, 9, 12, 2], [1, 309, 12, 9, 12, 2], [1, 360, 6, 8, 6, 2], [1, 411, 7, 11, 7, 2], [1, 462, 7, 11, 7, 2], [1, 513, 9, 8, 9, 2], [1, 566, 10, 7, 10, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 10, 7, 10, 4], [62, 668, 9, 6, 9, 4], [62, 719, 10, 7, 10, 4], [62, 768, 8, 9, 8, 2], [123, 3, 13, 10, 13, 2], [123, 54, 11, 9, 11, 2], [123, 105, 10, 9, 10, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 10, 9, 10, 2], [123, 309, 10, 9, 10, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 7, 9, 7, 2], [123, 513, 8, 9, 8, 2], [123, 564, 11, 9, 11, 2], [123, 615, 10, 9, 10, 2], [123, 666, 13, 9, 13, 2], [123, 717, 11, 9, 11, 2], [123, 768, 11, 9, 11, 2], [184, 3, 10, 9, 10, 2], [184, 54, 11, 11, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 13, 9, 13, 2], [184, 411, 11, 9, 11, 2], [184, 462, 11, 9, 11, 2], [184, 513, 10, 9, 10, 2], [184, 564, 7, 11, 7, 2], [184, 615, 7, 9, 7, 2], [184, 666, 7, 11, 7, 2], [184, 717, 7, 8, 7, 2], [184, 770, 9, 9, 9, 4], [245, 3, 7, 8, 7, 2], [245, 56, 8, 7, 8, 4], [245, 105, 9, 9, 9, 2], [245, 158, 8, 7, 8, 4], [245, 207, 8, 9, 8, 2], [245, 260, 8, 7, 8, 4], [245, 309, 7, 9, 7, 2], [245, 362, 9, 9, 9, 4], [245, 411, 9, 9, 9, 2], [245, 462, 7, 9, 7, 2], [245, 513, 7, 11, 7, 2], [245, 564, 9, 9, 9, 2], [245, 615, 7, 9, 7, 2], [245, 668, 12, 7, 12, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 8, 9, 8, 4], [306, 107, 7, 7, 7, 4], [306, 158, 8, 7, 8, 4], [306, 208, 7, 8, 7, 3], [306, 260, 9, 7, 9, 4], [306, 311, 9, 7, 9, 4], [306, 362, 11, 7, 11, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 8, 7, 8, 4], [306, 564, 8, 11, 8, 2], [306, 615, 6, 11, 6, 2], [306, 666, 8, 11, 8, 2], [306, 719, 9, 6, 9, 4], [306, 768, 10, 9, 10, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 105, 11, 11, 11, 2], [367, 154, 10, 11, 10, 0], [367, 205, 11, 11, 11, 0], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 8, 10, 8, 1], [367, 410, 8, 10, 8, 1], [367, 461, 8, 10, 8, 1], [367, 513, 8, 9, 8, 2], [367, 563, 8, 10, 8, 1], [367, 614, 8, 10, 8, 1], [367, 668, 8, 9, 8, 4], [367, 716, 8, 10, 8, 1], [367, 767, 8, 10, 8, 1], [428, 2, 8, 10, 8, 1], [428, 54, 8, 9, 8, 2], [428, 104, 7, 10, 7, 1], [428, 155, 7, 10, 7, 1], [428, 206, 7, 10, 7, 1], [428, 258, 7, 9, 7, 2], [428, 308, 9, 10, 9, 1], [428, 359, 9, 10, 9, 1], [428, 410, 9, 10, 9, 1], [428, 461, 9, 10, 9, 1], [428, 513, 9, 9, 9, 2], [428, 563, 9, 10, 9, 1], [428, 614, 9, 10, 9, 1], [428, 665, 9, 10, 9, 1], [428, 716, 9, 10, 9, 1], [428, 768, 9, 9, 9, 2], [489, 3, 9, 10, 9, 2], [489, 54, 7, 8, 7, 2], [489, 106, 9, 9, 9, 3], [489, 156, 9, 9, 9, 2], [489, 206, 9, 12, 9, 1], [489, 260, 7, 6, 7, 4], [489, 309, 9, 11, 9, 2], [489, 360, 9, 9, 9, 2], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 13, 8, 13, 2], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 9, 7, 9, 4], [489, 717, 13, 9, 13, 2], [489, 768, 11, 9, 11, 2], [550, 5, 10, 6, 10, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 207, 9, 9, 9, 2], [550, 260, 10, 9, 10, 4], [550, 309, 9, 9, 9, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 464, 10, 7, 10, 4], [550, 513, 7, 11, 7, 2], [550, 564, 7, 8, 7, 2], [550, 615, 7, 8, 7, 2], [550, 666, 12, 9, 12, 2], [550, 719, 11, 7, 11, 4], [550, 770, 9, 7, 9, 4], [611, 5, 8, 9, 8, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 207, 9, 11, 9, 2], [611, 259, 9, 7, 9, 3], [611, 309, 10, 9, 10, 2], [611, 362, 9, 7, 9, 4], [611, 413, 9, 7, 9, 4], [611, 464, 14, 7, 14, 4], [611, 515, 9, 6, 9, 4], [611, 563, 11, 10, 11, 1], [611, 614, 11, 10, 11, 1], [611, 665, 11, 10, 11, 1], [611, 717, 13, 9, 13, 2], [611, 770, 11, 7, 11, 4], [672, 5, 9, 6, 9, 4], [672, 56, 14, 6, 14, 4], [672, 105, 8, 8, 8, 2], [672, 156, 8, 8, 8, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 10, 7, 10, 4], [672, 360, 9, 9, 9, 2], [672, 411, 9, 11, 9, 2], [1, 5, 7, 6, 7, 4], [794, 766, 9, 10, 9, 0], [672, 565, 9, 7, 9, 3], [672, 617, 7, 7, 7, 4], [672, 668, 7, 7, 7, 4], [672, 717, 10, 9, 10, 2], [672, 768, 10, 9, 10, 2], [733, 3, 9, 10, 9, 2], [733, 56, 7, 6, 7, 4], [733, 107, 7, 9, 7, 4], [733, 158, 8, 9, 8, 4], [733, 207, 14, 9, 14, 2], [733, 256, 11, 11, 11, 0], [733, 307, 10, 11, 10, 0], [733, 359, 11, 10, 11, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 511, 7, 11, 7, 0], [733, 562, 7, 11, 7, 0], [733, 613, 7, 11, 7, 0], [733, 664, 7, 11, 7, 0], [733, 715, 11, 11, 11, 0], [733, 766, 11, 11, 11, 0], [1, 5, 7, 6, 7, 4], [794, 52, 11, 11, 11, 0], [794, 103, 11, 11, 11, 0], [794, 154, 11, 11, 11, 0], [794, 205, 11, 11, 11, 0], [794, 260, 7, 7, 7, 4], [794, 308, 7, 9, 7, 1], [794, 359, 8, 9, 8, 1], [794, 411, 7, 8, 7, 2], [794, 461, 7, 9, 7, 1], [794, 513, 7, 8, 7, 2], [794, 564, 7, 8, 7, 2], [794, 617, 7, 9, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 9, 7, 4], [794, 766, 9, 10, 9, 0], [855, 1, 9, 10, 9, 0], [855, 52, 9, 10, 9, 0], [855, 103, 9, 10, 9, 0], [855, 154, 9, 10, 9, 0], [855, 205, 9, 10, 9, 0], [855, 256, 9, 10, 9, 0], [855, 307, 9, 10, 9, 0], [855, 358, 9, 10, 9, 0], [855, 409, 9, 10, 9, 0], [855, 460, 9, 10, 9, 0], [855, 511, 9, 10, 9, 0], [855, 562, 9, 10, 9, 0], [855, 613, 9, 10, 9, 0], [855, 664, 9, 10, 9, 0], [855, 715, 9, 10, 9, 0], [855, 766, 9, 10, 9, 0]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 55, 7, 7, 7, 3], [1, 106, 8, 7, 8, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 9, 9, 2], [1, 259, 12, 7, 12, 3], [1, 310, 12, 7, 12, 3], [1, 361, 6, 7, 6, 3], [1, 412, 7, 9, 7, 3], [1, 463, 7, 9, 7, 3], [1, 514, 9, 7, 9, 3], [1, 566, 10, 6, 10, 4], [1, 617, 7, 8, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 6, 7, 4], [1, 769, 7, 7, 7, 3], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 10, 6, 10, 4], [62, 668, 9, 6, 9, 4], [62, 719, 10, 6, 10, 4], [62, 769, 8, 7, 8, 3], [123, 4, 13, 8, 13, 3], [123, 55, 11, 7, 11, 3], [123, 106, 10, 7, 10, 3], [123, 157, 11, 7, 11, 3], [123, 208, 11, 7, 11, 3], [123, 259, 10, 7, 10, 3], [123, 310, 10, 7, 10, 3], [123, 361, 11, 7, 11, 3], [123, 412, 11, 7, 11, 3], [123, 463, 7, 7, 7, 3], [123, 514, 8, 7, 8, 3], [123, 565, 11, 7, 11, 3], [123, 616, 10, 7, 10, 3], [123, 667, 13, 7, 13, 3], [123, 718, 11, 7, 11, 3], [123, 769, 11, 7, 11, 3], [184, 4, 10, 7, 10, 3], [184, 55, 11, 9, 11, 3], [184, 106, 11, 7, 11, 3], [184, 157, 10, 7, 10, 3], [184, 208, 10, 7, 10, 3], [184, 259, 11, 7, 11, 3], [184, 310, 11, 7, 11, 3], [184, 361, 13, 7, 13, 3], [184, 412, 11, 7, 11, 3], [184, 463, 11, 7, 11, 3], [184, 514, 10, 7, 10, 3], [184, 565, 7, 9, 7, 3], [184, 616, 7, 7, 7, 3], [184, 667, 7, 9, 7, 3], [184, 718, 7, 7, 7, 3], [184, 770, 9, 8, 9, 4], [245, 4, 7, 7, 7, 3], [245, 56, 8, 6, 8, 4], [245, 106, 9, 7, 9, 3], [245, 158, 8, 6, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 8, 6, 8, 4], [245, 310, 7, 7, 7, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 7, 7, 7, 3], [245, 514, 7, 9, 7, 3], [245, 565, 9, 7, 9, 3], [245, 616, 7, 7, 7, 3], [245, 668, 12, 6, 12, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 8, 8, 8, 4], [306, 107, 7, 6, 7, 4], [306, 158, 8, 6, 8, 4], [306, 209, 7, 6, 7, 4], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 565, 8, 9, 8, 3], [306, 616, 6, 9, 6, 3], [306, 667, 8, 9, 8, 3], [306, 719, 9, 6, 9, 4], [306, 769, 10, 7, 10, 3], [367, 2, 11, 9, 11, 1], [367, 53, 11, 9, 11, 1], [367, 106, 11, 9, 11, 3], [367, 155, 10, 9, 10, 1], [367, 206, 11, 9, 11, 1], [367, 257, 11, 9, 11, 1], [367, 308, 11, 9, 11, 1], [367, 360, 8, 8, 8, 2], [367, 411, 8, 8, 8, 2], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 615, 8, 8, 8, 2], [367, 668, 8, 8, 8, 4], [367, 717, 8, 8, 8, 2], [367, 768, 8, 8, 8, 2], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 7, 8, 7, 2], [428, 156, 7, 8, 7, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 4, 9, 8, 9, 3], [489, 55, 7, 7, 7, 3], [489, 107, 9, 7, 9, 4], [489, 157, 9, 7, 9, 3], [489, 207, 9, 10, 9, 2], [489, 260, 7, 6, 7, 4], [489, 310, 9, 9, 9, 3], [489, 361, 9, 7, 9, 3], [489, 412, 12, 7, 12, 3], [489, 463, 12, 7, 12, 3], [489, 514, 13, 7, 13, 3], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 6, 9, 4], [489, 718, 13, 7, 13, 3], [489, 769, 11, 7, 11, 3], [550, 5, 10, 6, 10, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 208, 9, 7, 9, 3], [550, 260, 10, 8, 10, 4], [550, 310, 9, 7, 9, 3], [550, 361, 11, 8, 11, 3], [550, 412, 12, 8, 12, 3], [550, 464, 10, 6, 10, 4], [550, 514, 7, 9, 7, 3], [550, 565, 7, 7, 7, 3], [550, 616, 7, 7, 7, 3], [550, 667, 12, 7, 12, 3], [550, 719, 11, 6, 11, 4], [550, 770, 9, 6, 9, 4], [611, 5, 8, 8, 8, 4], [611, 56, 7, 8, 7, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 7, 9, 3], [611, 208, 9, 9, 9, 3], [611, 260, 9, 6, 9, 4], [611, 310, 10, 7, 10, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 14, 6, 14, 4], [611, 515, 9, 6, 9, 4], [611, 564, 11, 8, 11, 2], [611, 615, 11, 8, 11, 2], [611, 666, 11, 8, 11, 2], [611, 718, 13, 7, 13, 3], [611, 770, 11, 6, 11, 4], [672, 5, 9, 6, 9, 4], [672, 56, 14, 6, 14, 4], [672, 106, 8, 7, 8, 3], [672, 157, 8, 7, 8, 3], [672, 208, 7, 7, 7, 3], [672, 259, 7, 7, 7, 3], [672, 311, 10, 6, 10, 4], [672, 361, 9, 7, 9, 3], [672, 412, 9, 9, 9, 3], [1, 5, 7, 6, 7, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 9, 8, 9, 3], [733, 56, 7, 6, 7, 4], [733, 107, 7, 8, 7, 4], [733, 158, 8, 8, 8, 4], [733, 208, 14, 7, 14, 3], [733, 257, 11, 9, 11, 1], [733, 308, 10, 9, 10, 1], [733, 360, 11, 8, 11, 2], [733, 411, 10, 8, 10, 2], [733, 462, 10, 8, 10, 2], [733, 512, 7, 9, 7, 1], [733, 563, 7, 9, 7, 1], [733, 614, 7, 9, 7, 1], [733, 665, 7, 9, 7, 1], [733, 716, 11, 9, 11, 1], [733, 767, 11, 9, 11, 1], [1, 5, 7, 6, 7, 4], [794, 53, 11, 9, 11, 1], [794, 104, 11, 9, 11, 1], [794, 155, 11, 9, 11, 1], [794, 206, 11, 9, 11, 1], [794, 260, 7, 6, 7, 4], [794, 309, 7, 8, 7, 2], [794, 360, 8, 8, 8, 2], [794, 412, 7, 7, 7, 3], [794, 462, 7, 8, 7, 2], [794, 514, 7, 7, 7, 3], [794, 565, 7, 7, 7, 3], [794, 617, 7, 8, 7, 4], [794, 666, 7, 8, 7, 2], [794, 719, 7, 8, 7, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 10, 9, 7, 2], [1, 105, 11, 4, 8, 2], [1, 156, 12, 9, 9, 2], [1, 206, 11, 11, 9, 1], [1, 258, 15, 9, 12, 2], [1, 309, 13, 9, 12, 2], [1, 360, 9, 4, 6, 2], [1, 411, 10, 11, 7, 2], [1, 462, 9, 11, 7, 2], [1, 513, 12, 7, 9, 2], [1, 566, 11, 7, 10, 4], [1, 621, 7, 5, 7, 8], [1, 670, 9, 3, 7, 6], [1, 723, 7, 3, 7, 8], [1, 768, 10, 9, 7, 2], [62, 3, 11, 9, 9, 2], [62, 54, 11, 9, 9, 2], [62, 105, 11, 9, 9, 2], [62, 156, 11, 9, 9, 2], [62, 207, 12, 9, 9, 2], [62, 258, 12, 9, 9, 2], [62, 309, 11, 9, 9, 2], [62, 360, 12, 9, 9, 2], [62, 411, 11, 9, 9, 2], [62, 462, 11, 9, 9, 2], [62, 515, 9, 7, 7, 4], [62, 566, 9, 9, 7, 4], [62, 617, 11, 7, 10, 4], [62, 669, 10, 5, 9, 5], [62, 719, 10, 7, 10, 4], [62, 768, 11, 9, 8, 2], [123, 3, 15, 10, 13, 2], [123, 54, 12, 9, 11, 2], [123, 105, 12, 9, 10, 2], [123, 156, 14, 9, 11, 2], [123, 207, 13, 9, 11, 2], [123, 258, 13, 9, 10, 2], [123, 309, 13, 9, 10, 2], [123, 360, 14, 9, 11, 2], [123, 411, 15, 9, 11, 2], [123, 462, 11, 9, 7, 2], [123, 513, 12, 9, 8, 2], [123, 564, 14, 9, 11, 2], [123, 615, 11, 9, 10, 2], [123, 666, 17, 9, 13, 2], [123, 717, 15, 9, 11, 2], [123, 768, 13, 9, 11, 2], [184, 3, 12, 9, 10, 2], [184, 54, 13, 11, 11, 2], [184, 105, 13, 9, 11, 2], [184, 156, 13, 9, 10, 2], [184, 207, 13, 9, 10, 2], [184, 258, 15, 9, 11, 2], [184, 309, 15, 9, 11, 2], [184, 360, 17, 9, 13, 2], [184, 411, 15, 9, 11, 2], [184, 462, 15, 9, 11, 2], [184, 513, 13, 9, 10, 2], [184, 564, 10, 11, 7, 2], [184, 615, 9, 9, 7, 2], [184, 666, 10, 11, 7, 2], [184, 717, 10, 4, 7, 2], [184, 776, 9, 3, 9, 10], [245, 3, 9, 4, 7, 2], [245, 56, 9, 7, 8, 4], [245, 105, 10, 9, 9, 2], [245, 158, 10, 7, 8, 4], [245, 207, 11, 9, 8, 2], [245, 260, 9, 7, 8, 4], [245, 309, 11, 9, 7, 2], [245, 362, 12, 9, 9, 4], [245, 411, 10, 9, 9, 2], [245, 462, 10, 9, 7, 2], [245, 513, 10, 11, 7, 2], [245, 564, 11, 9, 9, 2], [245, 615, 10, 9, 7, 2], [245, 668, 12, 7, 12, 4], [245, 719, 10, 7, 9, 4], [245, 770, 10, 7, 9, 4], [306, 5, 10, 9, 9, 4], [306, 56, 10, 9, 8, 4], [306, 107, 10, 7, 7, 4], [306, 158, 10, 7, 8, 4], [306, 208, 9, 8, 7, 3], [306, 260, 11, 7, 9, 4], [306, 311, 12, 7, 9, 4], [306, 362, 14, 7, 11, 4], [306, 413, 12, 7, 9, 4], [306, 464, 12, 9, 9, 4], [306, 515, 10, 7, 8, 4], [306, 564, 11, 11, 8, 2], [306, 615, 9, 11, 6, 2], [306, 666, 9, 11, 8, 2], [306, 719, 11, 4, 9, 4], [306, 768, 10, 9, 10, 2], [367, 1, 14, 11, 11, 0], [367, 52, 14, 11, 11, 0], [367, 105, 14, 11, 11, 2], [367, 154, 13, 11, 10, 0], [367, 205, 15, 11, 11, 0], [367, 256, 14, 11, 11, 0], [367, 307, 15, 11, 11, 0], [367, 359, 10, 10, 8, 1], [367, 410, 10, 10, 8, 1], [367, 461, 11, 10, 8, 1], [367, 513, 11, 9, 8, 2], [367, 563, 12, 10, 8, 1], [367, 614, 11, 10, 8, 1], [367, 668, 10, 9, 8, 4], [367, 716, 11, 10, 8, 1], [367, 767, 11, 10, 8, 1], [428, 2, 11, 10, 8, 1], [428, 54, 11, 9, 8, 2], [428, 104, 10, 10, 7, 1], [428, 155, 10, 10, 7, 1], [428, 206, 11, 10, 7, 1], [428, 258, 11, 9, 7, 2], [428, 308, 12, 10, 9, 1], [428, 359, 11, 10, 9, 1], [428, 410, 11, 10, 9, 1], [428, 461, 12, 10, 9, 1], [428, 513, 12, 9, 9, 2], [428, 563, 12, 10, 9, 1], [428, 614, 11, 10, 9, 1], [428, 665, 11, 10, 9, 1], [428, 716, 12, 10, 9, 1], [428, 768, 12, 9, 9, 2], [489, 3, 11, 10, 9, 2], [489, 54, 10, 4, 7, 2], [489, 106, 11, 9, 9, 3], [489, 156, 12, 9, 9, 2], [489, 206, 12, 12, 9, 1], [489, 260, 9, 4, 7, 4], [489, 309, 12, 11, 9, 2], [489, 360, 11, 9, 9, 2], [489, 411, 14, 9, 12, 2], [489, 462, 14, 9, 12, 2], [489, 513, 16, 6, 13, 2], [489, 564, 10, 4, 7, 2], [489, 615, 11, 3, 7, 2], [489, 668, 11, 7, 9, 4], [489, 717, 16, 9, 13, 2], [489, 768, 14, 9, 11, 2], [550, 5, 11, 6, 10, 4], [550, 56, 11, 7, 10, 4], [550, 107, 11, 7, 10, 4], [550, 158, 11, 7, 10, 4], [550, 207, 13, 9, 9, 2], [550, 260, 11, 9, 10, 4], [550, 309, 11, 9, 9, 2], [550, 360, 14, 10, 11, 2], [550, 411, 15, 10, 12, 2], [550, 464, 12, 7, 10, 4], [550, 513, 11, 11, 7, 2], [550, 564, 10, 6, 7, 2], [550, 615, 10, 6, 7, 2], [550, 666, 14, 9, 12, 2], [550, 719, 12, 7, 11, 4], [550, 770, 12, 7, 9, 4], [611, 5, 10, 9, 8, 4], [611, 56, 9, 9, 7, 4], [611, 108, 11, 5, 10, 5], [611, 156, 13, 9, 9, 2], [611, 207, 12, 11, 9, 2], [611, 259, 11, 7, 9, 3], [611, 309, 11, 9, 10, 2], [611, 363, 10, 6, 9, 5], [611, 414, 10, 6, 9, 5], [611, 468, 13, 3, 14, 8], [611, 511, 1, 1, 9, 1], [611, 563, 12, 10, 11, 1], [611, 614, 14, 10, 11, 1], [611, 665, 13, 10, 11, 1], [611, 717, 16, 9, 13, 2], [611, 770, 12, 7, 11, 4], [672, 7, 10, 3, 9, 6], [672, 58, 15, 3, 14, 6], [672, 105, 11, 4, 8, 2], [672, 156, 11, 4, 8, 2], [672, 207, 10, 4, 7, 2], [672, 258, 10, 4, 7, 2], [672, 311, 11, 7, 10, 4], [672, 360, 11, 9, 9, 2], [672, 411, 12, 11, 9, 2], [1, 1, 1, 1, 7, 1], [794, 766, 13, 4, 9, 0], [672, 565, 11, 6, 9, 3], [672, 618, 8, 6, 7, 5], [672, 669, 8, 6, 7, 5], [672, 717, 12, 9, 10, 2], [672, 768, 13, 9, 10, 2], [733, 3, 11, 10, 9, 2], [733, 57, 8, 3, 7, 5], [733, 111, 7, 5, 7, 8], [733, 162, 9, 5, 8, 8], [733, 207, 15, 9, 14, 2], [733, 256, 13, 11, 11, 0], [733, 307, 13, 11, 10, 0], [733, 359, 13, 10, 11, 1], [733, 410, 13, 10, 10, 1], [733, 461, 13, 10, 10, 1], [733, 511, 11, 11, 7, 0], [733, 562, 11, 11, 7, 0], [733, 613, 11, 11, 7, 0], [733, 664, 11, 11, 7, 0], [733, 715, 14, 11, 11, 0], [733, 766, 13, 11, 11, 0], [1, 1, 1, 1, 7, 1], [794, 52, 13, 11, 11, 0], [794, 103, 15, 11, 11, 0], [794, 154, 15, 11, 11, 0], [794, 205, 15, 11, 11, 0], [794, 260, 9, 7, 7, 4], [794, 308, 11, 4, 7, 1], [794, 359, 12, 4, 8, 1], [794, 411, 11, 3, 7, 2], [794, 461, 11, 4, 7, 1], [794, 513, 10, 3, 7, 2], [794, 564, 10, 3, 7, 2], [794, 620, 7, 6, 7, 7], [794, 665, 11, 4, 7, 1], [794, 723, 7, 5, 7, 8], [794, 766, 13, 4, 9, 0], [855, 1, 13, 4, 9, 0], [855, 52, 13, 4, 9, 0], [855, 103, 13, 4, 9, 0], [855, 154, 13, 4, 9, 0], [855, 205, 13, 4, 9, 0], [855, 256, 13, 4, 9, 0], [855, 307, 13, 4, 9, 0], [855, 358, 13, 4, 9, 0], [855, 409, 13, 4, 9, 0], [855, 460, 13, 4, 9, 0], [855, 511, 13, 4, 9, 0], [855, 562, 13, 4, 9, 0], [855, 613, 13, 4, 9, 0], [855, 664, 13, 4, 9, 0], [855, 715, 13, 4, 9, 0], [855, 766, 13, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 9, 7, 6, 2], [1, 105, 10, 2, 7, 2], [1, 156, 11, 7, 8, 2], [1, 206, 10, 9, 8, 1], [1, 258, 14, 7, 11, 2], [1, 309, 12, 7, 11, 2], [1, 360, 8, 2, 5, 2], [1, 411, 9, 9, 6, 2], [1, 462, 8, 9, 6, 2], [1, 513, 11, 5, 8, 2], [1, 566, 10, 5, 9, 4], [1, 621, 6, 3, 6, 8], [1, 670, 8, 1, 6, 6], [1, 723, 6, 1, 6, 8], [1, 768, 9, 7, 6, 2], [62, 3, 10, 7, 8, 2], [62, 54, 10, 7, 8, 2], [62, 105, 10, 7, 8, 2], [62, 156, 10, 7, 8, 2], [62, 207, 11, 7, 8, 2], [62, 258, 11, 7, 8, 2], [62, 309, 10, 7, 8, 2], [62, 360, 11, 7, 8, 2], [62, 411, 10, 7, 8, 2], [62, 462, 10, 7, 8, 2], [62, 515, 8, 5, 6, 4], [62, 566, 8, 7, 6, 4], [62, 617, 10, 5, 9, 4], [62, 669, 9, 3, 8, 5], [62, 719, 9, 5, 9, 4], [62, 768, 10, 7, 7, 2], [123, 3, 14, 8, 12, 2], [123, 54, 11, 7, 10, 2], [123, 105, 11, 7, 9, 2], [123, 156, 13, 7, 10, 2], [123, 207, 12, 7, 10, 2], [123, 258, 12, 7, 9, 2], [123, 309, 12, 7, 9, 2], [123, 360, 13, 7, 10, 2], [123, 411, 14, 7, 10, 2], [123, 462, 10, 7, 6, 2], [123, 513, 11, 7, 7, 2], [123, 564, 13, 7, 10, 2], [123, 615, 10, 7, 9, 2], [123, 666, 16, 7, 12, 2], [123, 717, 14, 7, 10, 2], [123, 768, 12, 7, 10, 2], [184, 3, 11, 7, 9, 2], [184, 54, 12, 9, 10, 2], [184, 105, 12, 7, 10, 2], [184, 156, 12, 7, 9, 2], [184, 207, 12, 7, 9, 2], [184, 258, 14, 7, 10, 2], [184, 309, 14, 7, 10, 2], [184, 360, 16, 7, 12, 2], [184, 411, 14, 7, 10, 2], [184, 462, 14, 7, 10, 2], [184, 513, 12, 7, 9, 2], [184, 564, 9, 9, 6, 2], [184, 615, 8, 7, 6, 2], [184, 666, 9, 9, 6, 2], [184, 717, 9, 2, 6, 2], [184, 776, 8, 1, 8, 10], [245, 3, 8, 2, 6, 2], [245, 56, 8, 5, 7, 4], [245, 105, 9, 7, 8, 2], [245, 158, 9, 5, 7, 4], [245, 207, 10, 7, 7, 2], [245, 260, 8, 5, 7, 4], [245, 309, 10, 7, 6, 2], [245, 362, 11, 7, 8, 4], [245, 411, 9, 7, 8, 2], [245, 462, 9, 7, 6, 2], [245, 513, 9, 9, 6, 2], [245, 564, 10, 7, 8, 2], [245, 615, 9, 7, 6, 2], [245, 668, 11, 5, 11, 4], [245, 719, 9, 5, 8, 4], [245, 770, 9, 5, 8, 4], [306, 5, 9, 7, 8, 4], [306, 56, 9, 7, 7, 4], [306, 107, 9, 5, 6, 4], [306, 158, 9, 5, 7, 4], [306, 208, 8, 6, 6, 3], [306, 260, 10, 5, 8, 4], [306, 311, 11, 5, 8, 4], [306, 362, 13, 5, 10, 4], [306, 413, 11, 5, 8, 4], [306, 464, 11, 7, 8, 4], [306, 515, 9, 5, 7, 4], [306, 564, 10, 9, 7, 2], [306, 615, 8, 9, 5, 2], [306, 666, 8, 9, 7, 2], [306, 719, 10, 2, 8, 4], [306, 768, 9, 7, 9, 2], [367, 1, 11, 9, 10, 0], [367, 52, 12, 9, 10, 0], [367, 105, 13, 9, 10, 2], [367, 154, 12, 9, 9, 0], [367, 205, 14, 9, 10, 0], [367, 256, 12, 9, 10, 0], [367, 307, 14, 9, 10, 0], [367, 359, 9, 8, 7, 1], [367, 410, 9, 8, 7, 1], [367, 461, 10, 8, 7, 1], [367, 513, 10, 7, 7, 2], [367, 563, 11, 8, 7, 1], [367, 614, 10, 8, 7, 1], [367, 668, 9, 7, 7, 4], [367, 716, 10, 8, 7, 1], [367, 767, 10, 8, 7, 1], [428, 2, 10, 8, 7, 1], [428, 54, 10, 7, 7, 2], [428, 104, 9, 8, 6, 1], [428, 155, 9, 8, 6, 1], [428, 206, 10, 8, 6, 1], [428, 258, 10, 7, 6, 2], [428, 308, 11, 8, 8, 1], [428, 359, 10, 8, 8, 1], [428, 410, 10, 8, 8, 1], [428, 461, 11, 8, 8, 1], [428, 513, 11, 7, 8, 2], [428, 563, 11, 8, 8, 1], [428, 614, 10, 8, 8, 1], [428, 665, 10, 8, 8, 1], [428, 716, 11, 8, 8, 1], [428, 768, 11, 7, 8, 2], [489, 3, 10, 8, 8, 2], [489, 54, 9, 2, 6, 2], [489, 106, 10, 7, 8, 3], [489, 156, 11, 7, 8, 2], [489, 206, 11, 10, 8, 1], [489, 260, 8, 2, 6, 4], [489, 309, 11, 9, 8, 2], [489, 360, 10, 7, 8, 2], [489, 411, 13, 7, 11, 2], [489, 462, 13, 7, 11, 2], [489, 513, 15, 4, 12, 2], [489, 564, 9, 2, 6, 2], [489, 615, 10, 1, 6, 2], [489, 668, 10, 5, 8, 4], [489, 717, 15, 7, 12, 2], [489, 768, 13, 7, 10, 2], [550, 5, 10, 4, 9, 4], [550, 56, 10, 5, 9, 4], [550, 107, 10, 5, 9, 4], [550, 158, 10, 5, 9, 4], [550, 207, 12, 7, 8, 2], [550, 260, 10, 7, 9, 4], [550, 309, 10, 7, 8, 2], [550, 360, 13, 8, 10, 2], [550, 411, 14, 8, 11, 2], [550, 464, 11, 5, 9, 4], [550, 513, 10, 9, 6, 2], [550, 564, 9, 4, 6, 2], [550, 615, 9, 4, 6, 2], [550, 666, 13, 7, 11, 2], [550, 719, 11, 5, 10, 4], [550, 770, 11, 5, 8, 4], [611, 5, 9, 7, 7, 4], [611, 56, 8, 7, 6, 4], [611, 108, 10, 3, 9, 5], [611, 156, 12, 7, 8, 2], [611, 207, 11, 9, 8, 2], [611, 259, 10, 5, 8, 3], [611, 309, 10, 7, 9, 2], [611, 363, 9, 4, 8, 5], [611, 414, 9, 4, 8, 5], [611, 468, 12, 1, 13, 8], [611, 511, 1, 1, 8, 1], [611, 563, 11, 8, 10, 1], [611, 614, 13, 8, 10, 1], [611, 665, 12, 8, 10, 1], [611, 717, 15, 7, 12, 2], [611, 770, 11, 5, 10, 4], [672, 7, 9, 1, 8, 6], [672, 58, 14, 1, 13, 6], [672, 105, 10, 2, 7, 2], [672, 156, 10, 2, 7, 2], [672, 207, 9, 2, 6, 2], [672, 258, 9, 2, 6, 2], [672, 311, 10, 5, 9, 4], [672, 360, 10, 7, 8, 2], [672, 411, 11, 9, 8, 2], [1, 1, 1, 1, 6, 1], [794, 766, 10, 2, 8, 0], [672, 565, 10, 4, 8, 3], [672, 618, 7, 4, 6, 5], [672, 669, 7, 4, 6, 5], [672, 717, 11, 7, 9, 2], [672, 768, 12, 7, 9, 2], [733, 3, 10, 8, 8, 2], [733, 57, 7, 1, 6, 5], [733, 111, 6, 3, 6, 8], [733, 162, 8, 3, 7, 8], [733, 207, 14, 7, 13, 2], [733, 256, 12, 9, 10, 0], [733, 307, 12, 9, 9, 0], [733, 359, 12, 8, 10, 1], [733, 410, 12, 8, 9, 1], [733, 461, 12, 8, 9, 1], [733, 512, 10, 8, 6, 1], [733, 562, 10, 9, 6, 0], [733, 613, 10, 9, 6, 0], [733, 664, 10, 9, 6, 0], [733, 715, 12, 9, 10, 0], [733, 766, 12, 9, 10, 0], [1, 1, 1, 1, 6, 1], [794, 52, 12, 9, 10, 0], [794, 103, 14, 9, 10, 0], [794, 154, 14, 9, 10, 0], [794, 205, 14, 9, 10, 0], [794, 260, 8, 5, 6, 4], [794, 308, 10, 2, 6, 1], [794, 359, 11, 2, 7, 1], [794, 411, 10, 1, 6, 2], [794, 461, 10, 2, 6, 1], [794, 513, 9, 1, 6, 2], [794, 564, 9, 1, 6, 2], [794, 620, 6, 4, 6, 7], [794, 665, 10, 2, 6, 1], [794, 723, 6, 3, 6, 8], [794, 766, 10, 2, 8, 0], [855, 1, 10, 2, 8, 0], [855, 52, 10, 2, 8, 0], [855, 103, 10, 2, 8, 0], [855, 154, 10, 2, 8, 0], [855, 205, 10, 2, 8, 0], [855, 256, 10, 2, 8, 0], [855, 307, 10, 2, 8, 0], [855, 358, 10, 2, 8, 0], [855, 409, 10, 2, 8, 0], [855, 460, 10, 2, 8, 0], [855, 511, 10, 2, 8, 0], [855, 562, 10, 2, 8, 0], [855, 613, 10, 2, 8, 0], [855, 664, 10, 2, 8, 0], [855, 715, 10, 2, 8, 0], [855, 766, 10, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 7, 9, 7, 2], [1, 105, 8, 8, 8, 2], [1, 156, 9, 9, 9, 2], [1, 206, 9, 11, 9, 1], [1, 258, 12, 9, 12, 2], [1, 309, 12, 9, 12, 2], [1, 360, 6, 8, 6, 2], [1, 411, 7, 11, 7, 2], [1, 462, 7, 11, 7, 2], [1, 513, 9, 8, 9, 2], [1, 566, 10, 7, 10, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 10, 7, 10, 4], [62, 668, 9, 6, 9, 4], [62, 719, 10, 7, 10, 4], [62, 768, 8, 9, 8, 2], [123, 3, 13, 10, 13, 2], [123, 54, 11, 9, 11, 2], [123, 105, 10, 9, 10, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 10, 9, 10, 2], [123, 309, 10, 9, 10, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 7, 9, 7, 2], [123, 513, 8, 9, 8, 2], [123, 564, 11, 9, 11, 2], [123, 615, 10, 9, 10, 2], [123, 666, 13, 9, 13, 2], [123, 717, 11, 9, 11, 2], [123, 768, 11, 9, 11, 2], [184, 3, 10, 9, 10, 2], [184, 54, 11, 11, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 13, 9, 13, 2], [184, 411, 11, 9, 11, 2], [184, 462, 11, 9, 11, 2], [184, 513, 10, 9, 10, 2], [184, 564, 7, 11, 7, 2], [184, 615, 7, 9, 7, 2], [184, 666, 7, 11, 7, 2], [184, 717, 7, 8, 7, 2], [184, 770, 9, 9, 9, 4], [245, 3, 7, 8, 7, 2], [245, 56, 8, 7, 8, 4], [245, 105, 9, 9, 9, 2], [245, 158, 8, 7, 8, 4], [245, 207, 8, 9, 8, 2], [245, 260, 8, 7, 8, 4], [245, 309, 7, 9, 7, 2], [245, 362, 9, 9, 9, 4], [245, 411, 9, 9, 9, 2], [245, 462, 7, 9, 7, 2], [245, 513, 7, 11, 7, 2], [245, 564, 9, 9, 9, 2], [245, 615, 7, 9, 7, 2], [245, 668, 12, 7, 12, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 8, 9, 8, 4], [306, 107, 7, 7, 7, 4], [306, 158, 8, 7, 8, 4], [306, 208, 7, 8, 7, 3], [306, 260, 9, 7, 9, 4], [306, 311, 9, 7, 9, 4], [306, 362, 11, 7, 11, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 8, 7, 8, 4], [306, 564, 8, 11, 8, 2], [306, 615, 6, 11, 6, 2], [306, 666, 8, 11, 8, 2], [306, 719, 9, 6, 9, 4], [306, 768, 10, 9, 10, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 105, 11, 11, 11, 2], [367, 154, 10, 11, 10, 0], [367, 205, 11, 11, 11, 0], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 8, 10, 8, 1], [367, 410, 8, 10, 8, 1], [367, 461, 8, 10, 8, 1], [367, 513, 8, 9, 8, 2], [367, 563, 8, 10, 8, 1], [367, 614, 8, 10, 8, 1], [367, 668, 8, 9, 8, 4], [367, 716, 8, 10, 8, 1], [367, 767, 8, 10, 8, 1], [428, 2, 8, 10, 8, 1], [428, 54, 8, 9, 8, 2], [428, 104, 7, 10, 7, 1], [428, 155, 7, 10, 7, 1], [428, 206, 7, 10, 7, 1], [428, 258, 7, 9, 7, 2], [428, 308, 9, 10, 9, 1], [428, 359, 9, 10, 9, 1], [428, 410, 9, 10, 9, 1], [428, 461, 9, 10, 9, 1], [428, 513, 9, 9, 9, 2], [428, 563, 9, 10, 9, 1], [428, 614, 9, 10, 9, 1], [428, 665, 9, 10, 9, 1], [428, 716, 9, 10, 9, 1], [428, 768, 9, 9, 9, 2], [489, 3, 9, 10, 9, 2], [489, 54, 7, 8, 7, 2], [489, 106, 9, 9, 9, 3], [489, 156, 9, 9, 9, 2], [489, 206, 9, 12, 9, 1], [489, 260, 7, 6, 7, 4], [489, 309, 9, 11, 9, 2], [489, 360, 9, 9, 9, 2], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 13, 8, 13, 2], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 9, 7, 9, 4], [489, 717, 13, 9, 13, 2], [489, 768, 11, 9, 11, 2], [550, 5, 10, 6, 10, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 207, 9, 9, 9, 2], [550, 260, 10, 9, 10, 4], [550, 309, 9, 9, 9, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 464, 10, 7, 10, 4], [550, 513, 7, 11, 7, 2], [550, 564, 7, 8, 7, 2], [550, 615, 7, 8, 7, 2], [550, 666, 12, 9, 12, 2], [550, 719, 11, 7, 11, 4], [550, 770, 9, 7, 9, 4], [611, 5, 8, 9, 8, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 207, 9, 11, 9, 2], [611, 259, 9, 7, 9, 3], [611, 309, 10, 9, 10, 2], [611, 362, 9, 7, 9, 4], [611, 413, 9, 7, 9, 4], [611, 464, 14, 7, 14, 4], [611, 515, 9, 6, 9, 4], [611, 563, 11, 10, 11, 1], [611, 614, 11, 10, 11, 1], [611, 665, 11, 10, 11, 1], [611, 717, 13, 9, 13, 2], [611, 770, 11, 7, 11, 4], [672, 5, 9, 6, 9, 4], [672, 56, 14, 6, 14, 4], [672, 105, 8, 8, 8, 2], [672, 156, 8, 8, 8, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 10, 7, 10, 4], [672, 360, 9, 9, 9, 2], [672, 411, 9, 11, 9, 2], [1, 5, 7, 6, 7, 4], [794, 766, 9, 10, 9, 0], [672, 565, 9, 7, 9, 3], [672, 617, 7, 7, 7, 4], [672, 668, 7, 7, 7, 4], [672, 717, 10, 9, 10, 2], [672, 768, 10, 9, 10, 2], [733, 3, 9, 10, 9, 2], [733, 56, 7, 6, 7, 4], [733, 107, 7, 9, 7, 4], [733, 158, 8, 9, 8, 4], [733, 207, 14, 9, 14, 2], [733, 256, 11, 11, 11, 0], [733, 307, 10, 11, 10, 0], [733, 359, 11, 10, 11, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 511, 7, 11, 7, 0], [733, 562, 7, 11, 7, 0], [733, 613, 7, 11, 7, 0], [733, 664, 7, 11, 7, 0], [733, 715, 11, 11, 11, 0], [733, 766, 11, 11, 11, 0], [1, 5, 7, 6, 7, 4], [794, 52, 11, 11, 11, 0], [794, 103, 11, 11, 11, 0], [794, 154, 11, 11, 11, 0], [794, 205, 11, 11, 11, 0], [794, 260, 7, 7, 7, 4], [794, 308, 7, 9, 7, 1], [794, 359, 8, 9, 8, 1], [794, 411, 7, 8, 7, 2], [794, 461, 7, 9, 7, 1], [794, 513, 7, 8, 7, 2], [794, 564, 7, 8, 7, 2], [794, 617, 7, 9, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 9, 7, 4], [794, 766, 9, 10, 9, 0], [855, 1, 9, 10, 9, 0], [855, 52, 9, 10, 9, 0], [855, 103, 9, 10, 9, 0], [855, 154, 9, 10, 9, 0], [855, 205, 9, 10, 9, 0], [855, 256, 9, 10, 9, 0], [855, 307, 9, 10, 9, 0], [855, 358, 9, 10, 9, 0], [855, 409, 9, 10, 9, 0], [855, 460, 9, 10, 9, 0], [855, 511, 9, 10, 9, 0], [855, 562, 9, 10, 9, 0], [855, 613, 9, 10, 9, 0], [855, 664, 9, 10, 9, 0], [855, 715, 9, 10, 9, 0], [855, 766, 9, 10, 9, 0]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 7, 7, 7, 3], [1, 157, 8, 7, 8, 3], [1, 207, 8, 9, 8, 2], [1, 259, 11, 7, 11, 3], [1, 310, 11, 7, 11, 3], [1, 361, 5, 7, 5, 3], [1, 412, 6, 9, 6, 3], [1, 463, 6, 9, 6, 3], [1, 514, 8, 7, 8, 3], [1, 566, 9, 6, 9, 4], [1, 617, 6, 8, 6, 4], [1, 668, 6, 6, 6, 4], [1, 719, 6, 6, 6, 4], [1, 769, 6, 7, 6, 3], [62, 4, 8, 7, 8, 3], [62, 55, 8, 7, 8, 3], [62, 106, 8, 7, 8, 3], [62, 157, 8, 7, 8, 3], [62, 208, 8, 7, 8, 3], [62, 259, 8, 7, 8, 3], [62, 310, 8, 7, 8, 3], [62, 361, 8, 7, 8, 3], [62, 412, 8, 7, 8, 3], [62, 463, 8, 7, 8, 3], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 9, 6, 9, 4], [62, 668, 8, 6, 8, 4], [62, 719, 9, 6, 9, 4], [62, 769, 7, 7, 7, 3], [123, 4, 12, 8, 12, 3], [123, 55, 10, 7, 10, 3], [123, 106, 9, 7, 9, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 6, 7, 6, 3], [123, 514, 7, 7, 7, 3], [123, 565, 10, 7, 10, 3], [123, 616, 9, 7, 9, 3], [123, 667, 12, 7, 12, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 9, 7, 9, 3], [184, 55, 10, 9, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 9, 7, 9, 3], [184, 565, 6, 9, 6, 3], [184, 616, 6, 7, 6, 3], [184, 667, 6, 9, 6, 3], [184, 718, 6, 7, 6, 3], [184, 770, 8, 8, 8, 4], [245, 4, 6, 7, 6, 3], [245, 56, 7, 6, 7, 4], [245, 106, 8, 7, 8, 3], [245, 158, 7, 6, 7, 4], [245, 208, 7, 7, 7, 3], [245, 260, 7, 6, 7, 4], [245, 310, 6, 7, 6, 3], [245, 362, 8, 8, 8, 4], [245, 412, 8, 7, 8, 3], [245, 463, 6, 7, 6, 3], [245, 514, 6, 9, 6, 3], [245, 565, 8, 7, 8, 3], [245, 616, 6, 7, 6, 3], [245, 668, 11, 6, 11, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 7, 8, 7, 4], [306, 107, 6, 6, 6, 4], [306, 158, 7, 6, 7, 4], [306, 209, 6, 6, 6, 4], [306, 260, 8, 6, 8, 4], [306, 311, 8, 6, 8, 4], [306, 362, 10, 6, 10, 4], [306, 413, 8, 6, 8, 4], [306, 464, 8, 8, 8, 4], [306, 515, 7, 6, 7, 4], [306, 565, 7, 9, 7, 3], [306, 616, 5, 9, 5, 3], [306, 667, 7, 9, 7, 3], [306, 719, 8, 6, 8, 4], [306, 769, 9, 7, 9, 3], [367, 2, 10, 9, 10, 1], [367, 53, 10, 9, 10, 1], [367, 106, 10, 9, 10, 3], [367, 155, 9, 9, 9, 1], [367, 206, 10, 9, 10, 1], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 7, 8, 7, 2], [367, 411, 7, 8, 7, 2], [367, 462, 7, 8, 7, 2], [367, 514, 7, 7, 7, 3], [367, 564, 7, 8, 7, 2], [367, 615, 7, 8, 7, 2], [367, 668, 7, 8, 7, 4], [367, 717, 7, 8, 7, 2], [367, 768, 7, 8, 7, 2], [428, 3, 7, 8, 7, 2], [428, 55, 7, 7, 7, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 6, 8, 6, 2], [428, 259, 6, 7, 6, 3], [428, 309, 8, 8, 8, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 8, 8, 8, 2], [428, 666, 8, 8, 8, 2], [428, 717, 8, 8, 8, 2], [428, 769, 8, 7, 8, 3], [489, 4, 8, 8, 8, 3], [489, 55, 6, 7, 6, 3], [489, 107, 8, 7, 8, 4], [489, 157, 8, 7, 8, 3], [489, 207, 8, 10, 8, 2], [489, 260, 6, 6, 6, 4], [489, 310, 8, 9, 8, 3], [489, 361, 8, 7, 8, 3], [489, 412, 11, 7, 11, 3], [489, 463, 11, 7, 11, 3], [489, 514, 12, 7, 12, 3], [489, 565, 6, 7, 6, 3], [489, 616, 6, 7, 6, 3], [489, 668, 8, 6, 8, 4], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 5, 9, 6, 9, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 208, 8, 7, 8, 3], [550, 260, 9, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 10, 8, 10, 3], [550, 412, 11, 8, 11, 3], [550, 464, 9, 6, 9, 4], [550, 514, 6, 9, 6, 3], [550, 565, 6, 7, 6, 3], [550, 616, 6, 7, 6, 3], [550, 667, 11, 7, 11, 3], [550, 719, 10, 6, 10, 4], [550, 770, 8, 6, 8, 4], [611, 5, 7, 8, 7, 4], [611, 56, 6, 8, 6, 4], [611, 107, 9, 6, 9, 4], [611, 157, 8, 7, 8, 3], [611, 208, 8, 9, 8, 3], [611, 260, 8, 6, 8, 4], [611, 310, 9, 7, 9, 3], [611, 362, 8, 6, 8, 4], [611, 413, 8, 6, 8, 4], [611, 464, 13, 6, 13, 4], [611, 515, 8, 6, 8, 4], [611, 564, 10, 8, 10, 2], [611, 615, 10, 8, 10, 2], [611, 666, 10, 8, 10, 2], [611, 718, 12, 7, 12, 3], [611, 770, 10, 6, 10, 4], [672, 5, 8, 6, 8, 4], [672, 56, 13, 6, 13, 4], [672, 106, 7, 7, 7, 3], [672, 157, 7, 7, 7, 3], [672, 208, 6, 7, 6, 3], [672, 259, 6, 7, 6, 3], [672, 311, 9, 6, 9, 4], [672, 361, 8, 7, 8, 3], [672, 412, 8, 9, 8, 3], [1, 5, 6, 6, 6, 4], [794, 767, 8, 9, 8, 1], [672, 566, 8, 6, 8, 4], [672, 617, 6, 6, 6, 4], [672, 668, 6, 6, 6, 4], [672, 718, 9, 7, 9, 3], [672, 769, 9, 7, 9, 3], [733, 4, 8, 8, 8, 3], [733, 56, 6, 6, 6, 4], [733, 107, 6, 8, 6, 4], [733, 158, 7, 8, 7, 4], [733, 208, 13, 7, 13, 3], [733, 257, 10, 9, 10, 1], [733, 308, 9, 9, 9, 1], [733, 360, 10, 8, 10, 2], [733, 411, 9, 8, 9, 2], [733, 462, 9, 8, 9, 2], [733, 512, 6, 9, 6, 1], [733, 563, 6, 9, 6, 1], [733, 614, 6, 9, 6, 1], [733, 665, 6, 9, 6, 1], [733, 716, 10, 9, 10, 1], [733, 767, 10, 9, 10, 1], [1, 5, 6, 6, 6, 4], [794, 53, 10, 9, 10, 1], [794, 104, 10, 9, 10, 1], [794, 155, 10, 9, 10, 1], [794, 206, 10, 9, 10, 1], [794, 260, 6, 6, 6, 4], [794, 309, 6, 8, 6, 2], [794, 360, 7, 8, 7, 2], [794, 412, 6, 7, 6, 3], [794, 462, 6, 8, 6, 2], [794, 514, 6, 7, 6, 3], [794, 565, 6, 7, 6, 3], [794, 617, 6, 8, 6, 4], [794, 666, 6, 8, 6, 2], [794, 719, 6, 8, 6, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 53, 13, 10, 9, 1], [1, 104, 14, 5, 10, 1], [1, 155, 14, 10, 11, 1], [1, 205, 14, 12, 11, 0], [1, 257, 19, 10, 15, 1], [1, 308, 15, 10, 14, 1], [1, 359, 12, 5, 9, 1], [1, 410, 13, 12, 9, 1], [1, 461, 11, 12, 9, 1], [1, 512, 14, 7, 11, 1], [1, 565, 14, 7, 12, 3], [1, 621, 9, 5, 9, 8], [1, 669, 11, 3, 9, 5], [1, 723, 8, 3, 9, 8], [1, 767, 12, 10, 8, 1], [62, 2, 14, 10, 11, 1], [62, 53, 13, 10, 11, 1], [62, 104, 14, 10, 11, 1], [62, 155, 14, 10, 11, 1], [62, 206, 15, 10, 11, 1], [62, 257, 15, 10, 11, 1], [62, 308, 14, 10, 11, 1], [62, 359, 15, 10, 11, 1], [62, 410, 14, 10, 11, 1], [62, 461, 14, 10, 11, 1], [62, 514, 11, 8, 8, 3], [62, 565, 11, 10, 8, 3], [62, 616, 15, 7, 12, 3], [62, 668, 14, 5, 12, 4], [62, 718, 14, 7, 12, 3], [62, 767, 13, 10, 10, 1], [123, 2, 19, 12, 16, 1], [123, 53, 14, 10, 13, 1], [123, 104, 15, 10, 13, 1], [123, 155, 17, 10, 13, 1], [123, 206, 16, 10, 13, 1], [123, 257, 16, 10, 12, 1], [123, 308, 16, 10, 12, 1], [123, 359, 17, 10, 14, 1], [123, 410, 18, 10, 14, 1], [123, 461, 13, 10, 9, 1], [123, 512, 14, 10, 10, 1], [123, 563, 17, 10, 14, 1], [123, 614, 13, 10, 12, 1], [123, 665, 19, 10, 15, 1], [123, 716, 18, 10, 14, 1], [123, 767, 16, 10, 13, 1], [184, 2, 15, 10, 12, 1], [184, 53, 16, 12, 13, 1], [184, 104, 16, 10, 13, 1], [184, 155, 16, 10, 12, 1], [184, 206, 16, 10, 12, 1], [184, 257, 18, 10, 14, 1], [184, 308, 17, 10, 13, 1], [184, 359, 20, 10, 16, 1], [184, 410, 18, 10, 14, 1], [184, 461, 17, 10, 13, 1], [184, 512, 16, 10, 12, 1], [184, 563, 13, 12, 9, 1], [184, 614, 11, 10, 8, 1], [184, 665, 13, 12, 9, 1], [184, 716, 14, 5, 11, 1], [184, 776, 11, 3, 11, 10], [245, 2, 12, 4, 9, 1], [245, 55, 12, 8, 10, 3], [245, 104, 13, 10, 11, 1], [245, 157, 13, 8, 10, 3], [245, 206, 14, 10, 11, 1], [245, 259, 12, 8, 10, 3], [245, 308, 13, 10, 9, 1], [245, 361, 14, 10, 11, 3], [245, 410, 13, 10, 11, 1], [245, 461, 12, 10, 8, 1], [245, 512, 12, 12, 8, 1], [245, 563, 14, 10, 11, 1], [245, 614, 12, 10, 8, 1], [245, 667, 16, 8, 14, 3], [245, 718, 13, 8, 11, 3], [245, 769, 13, 8, 11, 3], [306, 4, 13, 10, 11, 3], [306, 55, 13, 10, 11, 3], [306, 106, 13, 8, 9, 3], [306, 157, 13, 8, 10, 3], [306, 207, 12, 9, 8, 2], [306, 259, 14, 8, 11, 3], [306, 310, 15, 8, 11, 3], [306, 361, 18, 8, 14, 3], [306, 412, 14, 8, 11, 3], [306, 463, 15, 10, 11, 3], [306, 514, 13, 8, 10, 3], [306, 563, 14, 12, 11, 1], [306, 614, 11, 12, 7, 1], [306, 665, 12, 12, 11, 1], [306, 718, 14, 4, 11, 3], [306, 767, 12, 10, 11, 1], [367, 1, 15, 11, 13, 0], [367, 52, 15, 11, 13, 0], [367, 104, 16, 12, 13, 1], [367, 154, 15, 11, 12, 0], [367, 205, 17, 11, 14, 0], [367, 256, 16, 11, 13, 0], [367, 307, 18, 11, 14, 0], [367, 358, 13, 11, 10, 0], [367, 409, 13, 11, 10, 0], [367, 460, 14, 11, 10, 0], [367, 512, 14, 10, 10, 1], [367, 562, 14, 11, 10, 0], [367, 613, 14, 11, 10, 0], [367, 667, 13, 10, 10, 3], [367, 715, 13, 11, 10, 0], [367, 766, 13, 11, 10, 0], [428, 1, 14, 11, 10, 0], [428, 53, 14, 10, 10, 1], [428, 103, 12, 11, 8, 0], [428, 154, 12, 11, 8, 0], [428, 205, 12, 11, 8, 0], [428, 257, 12, 10, 8, 1], [428, 307, 15, 11, 11, 0], [428, 358, 14, 11, 11, 0], [428, 409, 13, 11, 11, 0], [428, 460, 14, 11, 11, 0], [428, 512, 14, 10, 11, 1], [428, 562, 15, 11, 11, 0], [428, 613, 14, 11, 11, 0], [428, 664, 14, 11, 11, 0], [428, 715, 14, 11, 11, 0], [428, 767, 14, 10, 11, 1], [489, 2, 14, 11, 11, 1], [489, 53, 12, 4, 8, 1], [489, 105, 13, 10, 11, 2], [489, 155, 14, 10, 11, 1], [489, 205, 15, 13, 11, 0], [489, 260, 11, 5, 9, 4], [489, 308, 15, 12, 11, 1], [489, 359, 14, 10, 11, 1], [489, 410, 17, 10, 14, 1], [489, 461, 17, 10, 14, 1], [489, 512, 20, 7, 16, 1], [489, 563, 13, 4, 9, 1], [489, 614, 13, 3, 9, 1], [489, 667, 14, 7, 12, 3], [489, 716, 20, 10, 16, 1], [489, 767, 18, 10, 14, 1], [550, 5, 16, 5, 14, 4], [550, 55, 14, 8, 12, 3], [550, 105, 15, 9, 12, 2], [550, 156, 14, 9, 12, 2], [550, 206, 15, 10, 11, 1], [550, 259, 14, 10, 12, 3], [550, 308, 14, 10, 11, 1], [550, 359, 18, 11, 14, 1], [550, 410, 19, 11, 15, 1], [550, 463, 15, 8, 12, 3], [550, 512, 12, 12, 8, 1], [550, 563, 12, 7, 8, 1], [550, 614, 13, 7, 9, 1], [550, 665, 17, 10, 14, 1], [550, 718, 15, 8, 13, 3], [550, 769, 13, 8, 11, 3], [611, 4, 12, 10, 10, 3], [611, 55, 11, 10, 9, 3], [611, 108, 16, 5, 14, 5], [611, 154, 16, 11, 12, 0], [611, 206, 15, 12, 11, 1], [611, 260, 14, 6, 12, 4], [611, 308, 14, 10, 12, 1], [611, 361, 14, 8, 11, 3], [611, 412, 13, 8, 11, 3], [611, 468, 17, 3, 17, 8], [611, 511, 1, 1, 11, 1], [611, 562, 14, 11, 13, 0], [611, 613, 16, 11, 13, 0], [611, 664, 16, 11, 13, 0], [611, 716, 20, 10, 16, 1], [611, 769, 16, 8, 14, 3], [672, 6, 13, 3, 11, 5], [672, 57, 19, 3, 17, 5], [672, 104, 14, 5, 10, 1], [672, 155, 14, 5, 10, 1], [672, 206, 13, 5, 9, 1], [672, 257, 13, 5, 9, 1], [672, 310, 14, 7, 12, 3], [672, 359, 13, 10, 11, 1], [672, 410, 15, 12, 11, 1], [1, 1, 1, 1, 8, 1], [794, 766, 13, 4, 9, 0], [672, 564, 13, 8, 11, 2], [672, 616, 12, 7, 9, 3], [672, 667, 11, 7, 9, 3], [672, 716, 14, 10, 12, 1], [672, 767, 15, 10, 12, 1], [733, 2, 14, 11, 11, 1], [733, 57, 10, 3, 9, 5], [733, 111, 9, 5, 9, 8], [733, 162, 10, 5, 10, 8], [733, 206, 19, 10, 17, 1], [733, 256, 15, 11, 13, 0], [733, 307, 15, 11, 12, 0], [733, 358, 15, 11, 13, 0], [733, 409, 16, 11, 12, 0], [733, 460, 15, 11, 12, 0], [733, 511, 13, 11, 9, 0], [733, 562, 13, 11, 9, 0], [733, 613, 13, 11, 9, 0], [733, 664, 12, 11, 9, 0], [733, 715, 15, 11, 13, 0], [733, 766, 15, 11, 13, 0], [1, 1, 1, 1, 8, 1], [794, 52, 15, 11, 13, 0], [794, 103, 17, 11, 14, 0], [794, 154, 17, 11, 14, 0], [794, 205, 17, 11, 14, 0], [794, 259, 11, 8, 9, 3], [794, 307, 13, 4, 9, 0], [794, 358, 13, 4, 9, 0], [794, 409, 13, 3, 9, 0], [794, 460, 13, 4, 9, 0], [794, 512, 12, 3, 9, 1], [794, 562, 13, 6, 9, 0], [794, 620, 9, 6, 9, 7], [794, 664, 13, 4, 9, 0], [794, 722, 9, 6, 9, 7], [794, 766, 13, 4, 9, 0], [855, 1, 13, 4, 9, 0], [855, 52, 13, 4, 9, 0], [855, 103, 13, 4, 9, 0], [855, 154, 13, 4, 9, 0], [855, 205, 13, 4, 9, 0], [855, 256, 13, 4, 9, 0], [855, 307, 13, 4, 9, 0], [855, 358, 13, 4, 9, 0], [855, 409, 13, 4, 9, 0], [855, 460, 13, 4, 9, 0], [855, 511, 13, 4, 9, 0], [855, 562, 13, 4, 9, 0], [855, 613, 13, 4, 9, 0], [855, 664, 13, 4, 9, 0], [855, 715, 13, 4, 9, 0], [855, 766, 13, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 17, \"widestglyph\": 20, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 12, 8, 8, 1], [1, 104, 13, 3, 9, 1], [1, 155, 13, 8, 10, 1], [1, 205, 13, 10, 10, 0], [1, 257, 18, 8, 14, 1], [1, 308, 14, 8, 13, 1], [1, 359, 11, 3, 8, 1], [1, 410, 12, 10, 8, 1], [1, 461, 10, 10, 8, 1], [1, 512, 13, 5, 10, 1], [1, 565, 13, 5, 11, 3], [1, 621, 8, 3, 8, 8], [1, 669, 10, 1, 8, 5], [1, 723, 7, 1, 8, 8], [1, 767, 11, 8, 7, 1], [62, 2, 13, 8, 10, 1], [62, 53, 12, 8, 10, 1], [62, 104, 13, 8, 10, 1], [62, 155, 13, 8, 10, 1], [62, 206, 14, 8, 10, 1], [62, 257, 14, 8, 10, 1], [62, 308, 13, 8, 10, 1], [62, 359, 14, 8, 10, 1], [62, 410, 13, 8, 10, 1], [62, 461, 13, 8, 10, 1], [62, 514, 10, 6, 7, 3], [62, 565, 10, 8, 7, 3], [62, 616, 14, 5, 11, 3], [62, 668, 13, 3, 11, 4], [62, 718, 13, 5, 11, 3], [62, 767, 12, 8, 9, 1], [123, 2, 18, 10, 15, 1], [123, 53, 13, 8, 12, 1], [123, 104, 14, 8, 12, 1], [123, 155, 16, 8, 12, 1], [123, 206, 15, 8, 12, 1], [123, 257, 15, 8, 11, 1], [123, 308, 15, 8, 11, 1], [123, 359, 16, 8, 13, 1], [123, 410, 17, 8, 13, 1], [123, 461, 12, 8, 8, 1], [123, 512, 13, 8, 9, 1], [123, 563, 16, 8, 13, 1], [123, 614, 12, 8, 11, 1], [123, 665, 18, 8, 14, 1], [123, 716, 17, 8, 13, 1], [123, 767, 15, 8, 12, 1], [184, 2, 14, 8, 11, 1], [184, 53, 15, 10, 12, 1], [184, 104, 15, 8, 12, 1], [184, 155, 15, 8, 11, 1], [184, 206, 15, 8, 11, 1], [184, 257, 17, 8, 13, 1], [184, 308, 16, 8, 12, 1], [184, 359, 19, 8, 15, 1], [184, 410, 17, 8, 13, 1], [184, 461, 16, 8, 12, 1], [184, 512, 15, 8, 11, 1], [184, 563, 12, 10, 8, 1], [184, 614, 10, 8, 7, 1], [184, 665, 12, 10, 8, 1], [184, 716, 13, 3, 10, 1], [184, 776, 10, 1, 10, 10], [245, 2, 11, 2, 8, 1], [245, 55, 11, 6, 9, 3], [245, 104, 12, 8, 10, 1], [245, 157, 12, 6, 9, 3], [245, 206, 13, 8, 10, 1], [245, 259, 11, 6, 9, 3], [245, 308, 12, 8, 8, 1], [245, 361, 13, 8, 10, 3], [245, 410, 12, 8, 10, 1], [245, 461, 11, 8, 7, 1], [245, 512, 11, 10, 7, 1], [245, 563, 13, 8, 10, 1], [245, 614, 11, 8, 7, 1], [245, 667, 15, 6, 13, 3], [245, 718, 12, 6, 10, 3], [245, 769, 12, 6, 10, 3], [306, 4, 12, 8, 10, 3], [306, 55, 12, 8, 10, 3], [306, 106, 12, 6, 8, 3], [306, 157, 12, 6, 9, 3], [306, 207, 11, 7, 7, 2], [306, 259, 13, 6, 10, 3], [306, 310, 14, 6, 10, 3], [306, 361, 17, 6, 13, 3], [306, 412, 13, 6, 10, 3], [306, 463, 14, 8, 10, 3], [306, 514, 12, 6, 9, 3], [306, 563, 13, 10, 10, 1], [306, 614, 10, 10, 6, 1], [306, 665, 11, 10, 10, 1], [306, 718, 13, 2, 10, 3], [306, 767, 11, 8, 10, 1], [367, 1, 13, 9, 12, 0], [367, 52, 14, 9, 12, 0], [367, 104, 15, 10, 12, 1], [367, 154, 14, 9, 11, 0], [367, 205, 16, 9, 13, 0], [367, 256, 15, 9, 12, 0], [367, 307, 17, 9, 13, 0], [367, 358, 11, 9, 9, 0], [367, 409, 12, 9, 9, 0], [367, 460, 13, 9, 9, 0], [367, 512, 13, 8, 9, 1], [367, 562, 12, 9, 9, 0], [367, 613, 13, 9, 9, 0], [367, 667, 12, 8, 9, 3], [367, 715, 11, 9, 9, 0], [367, 766, 12, 9, 9, 0], [428, 1, 13, 9, 9, 0], [428, 53, 13, 8, 9, 1], [428, 103, 10, 9, 7, 0], [428, 154, 11, 9, 7, 0], [428, 205, 11, 9, 7, 0], [428, 257, 11, 8, 7, 1], [428, 307, 13, 9, 10, 0], [428, 358, 12, 9, 10, 0], [428, 409, 12, 9, 10, 0], [428, 460, 13, 9, 10, 0], [428, 512, 13, 8, 10, 1], [428, 562, 13, 9, 10, 0], [428, 613, 13, 9, 10, 0], [428, 664, 13, 9, 10, 0], [428, 715, 13, 9, 10, 0], [428, 767, 13, 8, 10, 1], [489, 2, 13, 9, 10, 1], [489, 53, 11, 2, 7, 1], [489, 105, 12, 8, 10, 2], [489, 155, 13, 8, 10, 1], [489, 205, 14, 11, 10, 0], [489, 260, 10, 3, 8, 4], [489, 308, 14, 10, 10, 1], [489, 359, 13, 8, 10, 1], [489, 410, 16, 8, 13, 1], [489, 461, 16, 8, 13, 1], [489, 512, 19, 5, 15, 1], [489, 563, 12, 2, 8, 1], [489, 614, 12, 1, 8, 1], [489, 667, 13, 5, 11, 3], [489, 716, 19, 8, 15, 1], [489, 767, 17, 8, 13, 1], [550, 5, 15, 3, 13, 4], [550, 55, 13, 6, 11, 3], [550, 105, 14, 7, 11, 2], [550, 156, 13, 7, 11, 2], [550, 206, 14, 8, 10, 1], [550, 259, 13, 8, 11, 3], [550, 308, 13, 8, 10, 1], [550, 359, 17, 9, 13, 1], [550, 410, 18, 9, 14, 1], [550, 463, 14, 6, 11, 3], [550, 512, 11, 10, 7, 1], [550, 563, 11, 5, 7, 1], [550, 614, 12, 5, 8, 1], [550, 665, 16, 8, 13, 1], [550, 718, 14, 6, 12, 3], [550, 769, 12, 6, 10, 3], [611, 4, 11, 8, 9, 3], [611, 55, 10, 8, 8, 3], [611, 108, 15, 3, 13, 5], [611, 154, 15, 9, 11, 0], [611, 206, 14, 10, 10, 1], [611, 260, 13, 4, 11, 4], [611, 308, 13, 8, 11, 1], [611, 361, 13, 6, 10, 3], [611, 412, 12, 6, 10, 3], [611, 468, 16, 1, 16, 8], [611, 511, 1, 1, 10, 1], [611, 562, 13, 9, 12, 0], [611, 613, 14, 9, 12, 0], [611, 664, 14, 9, 12, 0], [611, 716, 19, 8, 15, 1], [611, 769, 15, 6, 13, 3], [672, 6, 12, 1, 10, 5], [672, 57, 18, 1, 16, 5], [672, 104, 13, 3, 9, 1], [672, 155, 13, 3, 9, 1], [672, 206, 12, 3, 8, 1], [672, 257, 12, 3, 8, 1], [672, 310, 13, 5, 11, 3], [672, 359, 12, 8, 10, 1], [672, 410, 14, 10, 10, 1], [1, 1, 1, 1, 7, 1], [794, 766, 11, 2, 8, 0], [672, 564, 12, 6, 10, 2], [672, 616, 11, 5, 8, 3], [672, 667, 10, 5, 8, 3], [672, 716, 13, 8, 11, 1], [672, 767, 14, 8, 11, 1], [733, 2, 13, 9, 10, 1], [733, 57, 9, 1, 8, 5], [733, 111, 8, 3, 8, 8], [733, 162, 9, 3, 9, 8], [733, 206, 18, 8, 16, 1], [733, 256, 14, 9, 12, 0], [733, 307, 14, 9, 11, 0], [733, 358, 13, 9, 12, 0], [733, 409, 15, 9, 11, 0], [733, 460, 14, 9, 11, 0], [733, 511, 11, 9, 8, 0], [733, 562, 12, 9, 8, 0], [733, 613, 11, 9, 8, 0], [733, 664, 11, 9, 8, 0], [733, 715, 14, 9, 12, 0], [733, 766, 14, 9, 12, 0], [1, 1, 1, 1, 7, 1], [794, 52, 14, 9, 12, 0], [794, 103, 16, 9, 13, 0], [794, 154, 16, 9, 13, 0], [794, 205, 16, 9, 13, 0], [794, 259, 10, 6, 8, 3], [794, 307, 12, 2, 8, 0], [794, 358, 12, 2, 8, 0], [794, 409, 1, 1, 8, 1], [794, 460, 12, 2, 8, 0], [794, 512, 11, 1, 8, 1], [794, 562, 12, 4, 8, 0], [794, 620, 8, 4, 8, 7], [794, 664, 12, 2, 8, 0], [794, 722, 8, 4, 8, 7], [794, 766, 11, 2, 8, 0], [855, 1, 11, 2, 8, 0], [855, 52, 11, 2, 8, 0], [855, 103, 11, 2, 8, 0], [855, 154, 11, 2, 8, 0], [855, 205, 11, 2, 8, 0], [855, 256, 11, 2, 8, 0], [855, 307, 11, 2, 8, 0], [855, 358, 11, 2, 8, 0], [855, 409, 11, 2, 8, 0], [855, 460, 11, 2, 8, 0], [855, 511, 11, 2, 8, 0], [855, 562, 11, 2, 8, 0], [855, 613, 11, 2, 8, 0], [855, 664, 11, 2, 8, 0], [855, 715, 11, 2, 8, 0], [855, 766, 11, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 16, \"widestglyph\": 19, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 8, 6, 8, 4], [1, 53, 9, 10, 9, 1], [1, 104, 10, 9, 10, 1], [1, 155, 11, 10, 11, 1], [1, 205, 11, 12, 11, 0], [1, 257, 15, 10, 15, 1], [1, 308, 14, 10, 14, 1], [1, 359, 9, 9, 9, 1], [1, 410, 9, 12, 9, 1], [1, 461, 9, 12, 9, 1], [1, 512, 11, 9, 11, 1], [1, 565, 12, 7, 12, 3], [1, 617, 9, 9, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 7, 9, 4], [1, 767, 8, 10, 8, 1], [62, 2, 11, 10, 11, 1], [62, 53, 11, 10, 11, 1], [62, 104, 11, 10, 11, 1], [62, 155, 11, 10, 11, 1], [62, 206, 11, 10, 11, 1], [62, 257, 11, 10, 11, 1], [62, 308, 11, 10, 11, 1], [62, 359, 11, 10, 11, 1], [62, 410, 11, 10, 11, 1], [62, 461, 11, 10, 11, 1], [62, 514, 8, 8, 8, 3], [62, 565, 8, 10, 8, 3], [62, 616, 12, 7, 12, 3], [62, 668, 12, 6, 12, 4], [62, 718, 12, 7, 12, 3], [62, 767, 10, 10, 10, 1], [123, 2, 16, 12, 16, 1], [123, 53, 13, 10, 13, 1], [123, 104, 13, 10, 13, 1], [123, 155, 13, 10, 13, 1], [123, 206, 13, 10, 13, 1], [123, 257, 12, 10, 12, 1], [123, 308, 12, 10, 12, 1], [123, 359, 14, 10, 14, 1], [123, 410, 14, 10, 14, 1], [123, 461, 9, 10, 9, 1], [123, 512, 10, 10, 10, 1], [123, 563, 14, 10, 14, 1], [123, 614, 12, 10, 12, 1], [123, 665, 15, 10, 15, 1], [123, 716, 14, 10, 14, 1], [123, 767, 13, 10, 13, 1], [184, 2, 12, 10, 12, 1], [184, 53, 13, 12, 13, 1], [184, 104, 13, 10, 13, 1], [184, 155, 12, 10, 12, 1], [184, 206, 12, 10, 12, 1], [184, 257, 14, 10, 14, 1], [184, 308, 13, 10, 13, 1], [184, 359, 16, 10, 16, 1], [184, 410, 14, 10, 14, 1], [184, 461, 13, 10, 13, 1], [184, 512, 12, 10, 12, 1], [184, 563, 9, 12, 9, 1], [184, 614, 8, 10, 8, 1], [184, 665, 9, 12, 9, 1], [184, 716, 11, 9, 11, 1], [184, 770, 11, 9, 11, 4], [245, 2, 9, 9, 9, 1], [245, 55, 10, 8, 10, 3], [245, 104, 11, 10, 11, 1], [245, 157, 10, 8, 10, 3], [245, 206, 11, 10, 11, 1], [245, 259, 10, 8, 10, 3], [245, 308, 9, 10, 9, 1], [245, 361, 11, 10, 11, 3], [245, 410, 11, 10, 11, 1], [245, 461, 8, 10, 8, 1], [245, 512, 8, 12, 8, 1], [245, 563, 11, 10, 11, 1], [245, 614, 8, 10, 8, 1], [245, 667, 14, 8, 14, 3], [245, 718, 11, 8, 11, 3], [245, 769, 11, 8, 11, 3], [306, 4, 11, 10, 11, 3], [306, 55, 11, 10, 11, 3], [306, 106, 9, 8, 9, 3], [306, 157, 10, 8, 10, 3], [306, 207, 8, 9, 8, 2], [306, 259, 11, 8, 11, 3], [306, 310, 11, 8, 11, 3], [306, 361, 14, 8, 14, 3], [306, 412, 11, 8, 11, 3], [306, 463, 11, 10, 11, 3], [306, 514, 10, 8, 10, 3], [306, 563, 11, 12, 11, 1], [306, 614, 7, 12, 7, 1], [306, 665, 11, 12, 11, 1], [306, 718, 11, 7, 11, 3], [306, 767, 11, 10, 11, 1], [367, 1, 13, 11, 13, 0], [367, 52, 13, 11, 13, 0], [367, 104, 13, 12, 13, 1], [367, 154, 12, 11, 12, 0], [367, 205, 14, 11, 14, 0], [367, 256, 13, 11, 13, 0], [367, 307, 14, 11, 14, 0], [367, 358, 10, 11, 10, 0], [367, 409, 10, 11, 10, 0], [367, 460, 10, 11, 10, 0], [367, 512, 10, 10, 10, 1], [367, 562, 10, 11, 10, 0], [367, 613, 10, 11, 10, 0], [367, 667, 10, 10, 10, 3], [367, 715, 10, 11, 10, 0], [367, 766, 10, 11, 10, 0], [428, 1, 10, 11, 10, 0], [428, 53, 10, 10, 10, 1], [428, 103, 8, 11, 8, 0], [428, 154, 8, 11, 8, 0], [428, 205, 8, 11, 8, 0], [428, 257, 8, 10, 8, 1], [428, 307, 11, 11, 11, 0], [428, 358, 11, 11, 11, 0], [428, 409, 11, 11, 11, 0], [428, 460, 11, 11, 11, 0], [428, 512, 11, 10, 11, 1], [428, 562, 11, 11, 11, 0], [428, 613, 11, 11, 11, 0], [428, 664, 11, 11, 11, 0], [428, 715, 11, 11, 11, 0], [428, 767, 11, 10, 11, 1], [489, 2, 11, 11, 11, 1], [489, 53, 8, 9, 8, 1], [489, 105, 11, 10, 11, 2], [489, 155, 11, 10, 11, 1], [489, 205, 11, 13, 11, 0], [489, 260, 9, 6, 9, 4], [489, 308, 11, 12, 11, 1], [489, 359, 11, 10, 11, 1], [489, 410, 14, 10, 14, 1], [489, 461, 14, 10, 14, 1], [489, 512, 16, 9, 16, 1], [489, 563, 9, 9, 9, 1], [489, 614, 9, 9, 9, 1], [489, 667, 12, 7, 12, 3], [489, 716, 16, 10, 16, 1], [489, 767, 14, 10, 14, 1], [550, 5, 14, 6, 14, 4], [550, 55, 12, 8, 12, 3], [550, 105, 12, 9, 12, 2], [550, 156, 12, 9, 12, 2], [550, 206, 11, 10, 11, 1], [550, 259, 12, 10, 12, 3], [550, 308, 11, 10, 11, 1], [550, 359, 14, 11, 14, 1], [550, 410, 15, 11, 15, 1], [550, 463, 12, 8, 12, 3], [550, 512, 8, 12, 8, 1], [550, 563, 8, 9, 8, 1], [550, 614, 9, 9, 9, 1], [550, 665, 14, 10, 14, 1], [550, 718, 13, 8, 13, 3], [550, 769, 11, 8, 11, 3], [611, 4, 10, 10, 10, 3], [611, 55, 9, 10, 9, 3], [611, 107, 14, 6, 14, 4], [611, 154, 12, 11, 12, 0], [611, 206, 11, 12, 11, 1], [611, 260, 12, 6, 12, 4], [611, 308, 12, 10, 12, 1], [611, 361, 11, 8, 11, 3], [611, 412, 11, 8, 11, 3], [611, 464, 17, 7, 17, 4], [611, 515, 11, 6, 11, 4], [611, 562, 13, 11, 13, 0], [611, 613, 13, 11, 13, 0], [611, 664, 13, 11, 13, 0], [611, 716, 16, 10, 16, 1], [611, 769, 14, 8, 14, 3], [672, 5, 11, 6, 11, 4], [672, 56, 17, 6, 17, 4], [672, 104, 10, 9, 10, 1], [672, 155, 10, 9, 10, 1], [672, 206, 9, 9, 9, 1], [672, 257, 9, 9, 9, 1], [672, 310, 12, 7, 12, 3], [672, 359, 11, 10, 11, 1], [672, 410, 11, 12, 11, 1], [1, 5, 8, 6, 8, 4], [794, 766, 9, 10, 9, 0], [672, 564, 11, 8, 11, 2], [672, 616, 9, 7, 9, 3], [672, 667, 9, 7, 9, 3], [672, 716, 12, 10, 12, 1], [672, 767, 12, 10, 12, 1], [733, 2, 11, 11, 11, 1], [733, 56, 9, 6, 9, 4], [733, 107, 9, 9, 9, 4], [733, 158, 10, 9, 10, 4], [733, 206, 17, 10, 17, 1], [733, 256, 13, 11, 13, 0], [733, 307, 12, 11, 12, 0], [733, 358, 13, 11, 13, 0], [733, 409, 12, 11, 12, 0], [733, 460, 12, 11, 12, 0], [733, 511, 9, 11, 9, 0], [733, 562, 9, 11, 9, 0], [733, 613, 9, 11, 9, 0], [733, 664, 9, 11, 9, 0], [733, 715, 13, 11, 13, 0], [733, 766, 13, 11, 13, 0], [1, 5, 8, 6, 8, 4], [794, 52, 13, 11, 13, 0], [794, 103, 14, 11, 14, 0], [794, 154, 14, 11, 14, 0], [794, 205, 14, 11, 14, 0], [794, 259, 9, 8, 9, 3], [794, 307, 9, 10, 9, 0], [794, 358, 9, 10, 9, 0], [794, 409, 9, 10, 9, 0], [794, 460, 9, 10, 9, 0], [794, 512, 9, 9, 9, 1], [794, 562, 9, 10, 9, 0], [794, 617, 9, 9, 9, 4], [794, 664, 9, 10, 9, 0], [794, 719, 9, 9, 9, 4], [794, 766, 9, 10, 9, 0], [855, 1, 9, 10, 9, 0], [855, 52, 9, 10, 9, 0], [855, 103, 9, 10, 9, 0], [855, 154, 9, 10, 9, 0], [855, 205, 9, 10, 9, 0], [855, 256, 9, 10, 9, 0], [855, 307, 9, 10, 9, 0], [855, 358, 9, 10, 9, 0], [855, 409, 9, 10, 9, 0], [855, 460, 9, 10, 9, 0], [855, 511, 9, 10, 9, 0], [855, 562, 9, 10, 9, 0], [855, 613, 9, 10, 9, 0], [855, 664, 9, 10, 9, 0], [855, 715, 9, 10, 9, 0], [855, 766, 9, 10, 9, 0]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 8, 8, 8, 2], [1, 105, 9, 8, 9, 2], [1, 156, 10, 8, 10, 2], [1, 206, 10, 10, 10, 1], [1, 258, 14, 8, 14, 2], [1, 309, 13, 8, 13, 2], [1, 360, 8, 8, 8, 2], [1, 411, 8, 10, 8, 2], [1, 462, 8, 10, 8, 2], [1, 513, 10, 8, 10, 2], [1, 566, 11, 6, 11, 4], [1, 617, 8, 8, 8, 4], [1, 668, 8, 6, 8, 4], [1, 719, 8, 6, 8, 4], [1, 768, 7, 8, 7, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 11, 6, 11, 4], [62, 668, 11, 6, 11, 4], [62, 719, 11, 6, 11, 4], [62, 768, 9, 8, 9, 2], [123, 3, 15, 10, 15, 2], [123, 54, 12, 8, 12, 2], [123, 105, 12, 8, 12, 2], [123, 156, 12, 8, 12, 2], [123, 207, 12, 8, 12, 2], [123, 258, 11, 8, 11, 2], [123, 309, 11, 8, 11, 2], [123, 360, 13, 8, 13, 2], [123, 411, 13, 8, 13, 2], [123, 462, 8, 8, 8, 2], [123, 513, 9, 8, 9, 2], [123, 564, 13, 8, 13, 2], [123, 615, 11, 8, 11, 2], [123, 666, 14, 8, 14, 2], [123, 717, 13, 8, 13, 2], [123, 768, 12, 8, 12, 2], [184, 3, 11, 8, 11, 2], [184, 54, 12, 10, 12, 2], [184, 105, 12, 8, 12, 2], [184, 156, 11, 8, 11, 2], [184, 207, 11, 8, 11, 2], [184, 258, 13, 8, 13, 2], [184, 309, 12, 8, 12, 2], [184, 360, 15, 8, 15, 2], [184, 411, 13, 8, 13, 2], [184, 462, 12, 8, 12, 2], [184, 513, 11, 8, 11, 2], [184, 564, 8, 10, 8, 2], [184, 615, 7, 8, 7, 2], [184, 666, 8, 10, 8, 2], [184, 717, 10, 8, 10, 2], [184, 770, 10, 8, 10, 4], [245, 3, 8, 8, 8, 2], [245, 56, 9, 6, 9, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 10, 8, 10, 2], [245, 260, 9, 6, 9, 4], [245, 309, 8, 8, 8, 2], [245, 362, 10, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 7, 8, 7, 2], [245, 513, 7, 10, 7, 2], [245, 564, 10, 8, 10, 2], [245, 615, 7, 8, 7, 2], [245, 668, 13, 6, 13, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 8, 6, 8, 4], [306, 158, 9, 6, 9, 4], [306, 208, 7, 7, 7, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 13, 6, 13, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 9, 6, 9, 4], [306, 564, 10, 10, 10, 2], [306, 615, 6, 10, 6, 2], [306, 666, 10, 10, 10, 2], [306, 719, 10, 6, 10, 4], [306, 768, 10, 8, 10, 2], [367, 2, 12, 9, 12, 1], [367, 53, 12, 9, 12, 1], [367, 105, 12, 10, 12, 2], [367, 155, 11, 9, 11, 1], [367, 206, 13, 9, 13, 1], [367, 257, 12, 9, 12, 1], [367, 308, 13, 9, 13, 1], [367, 359, 9, 9, 9, 1], [367, 410, 9, 9, 9, 1], [367, 461, 9, 9, 9, 1], [367, 513, 9, 8, 9, 2], [367, 563, 9, 9, 9, 1], [367, 614, 9, 9, 9, 1], [367, 668, 9, 8, 9, 4], [367, 716, 9, 9, 9, 1], [367, 767, 9, 9, 9, 1], [428, 2, 9, 9, 9, 1], [428, 54, 9, 8, 9, 2], [428, 104, 7, 9, 7, 1], [428, 155, 7, 9, 7, 1], [428, 206, 7, 9, 7, 1], [428, 258, 7, 8, 7, 2], [428, 308, 10, 9, 10, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 10, 8, 10, 2], [428, 563, 10, 9, 10, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 3, 10, 9, 10, 2], [489, 54, 7, 8, 7, 2], [489, 106, 10, 8, 10, 3], [489, 156, 10, 8, 10, 2], [489, 206, 10, 11, 10, 1], [489, 260, 8, 6, 8, 4], [489, 309, 10, 10, 10, 2], [489, 360, 10, 8, 10, 2], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 513, 15, 8, 15, 2], [489, 564, 8, 8, 8, 2], [489, 615, 8, 8, 8, 2], [489, 668, 11, 6, 11, 4], [489, 717, 15, 8, 15, 2], [489, 768, 13, 8, 13, 2], [550, 5, 13, 6, 13, 4], [550, 56, 11, 6, 11, 4], [550, 106, 11, 7, 11, 3], [550, 157, 11, 7, 11, 3], [550, 207, 10, 8, 10, 2], [550, 260, 11, 8, 11, 4], [550, 309, 10, 8, 10, 2], [550, 360, 13, 9, 13, 2], [550, 411, 14, 9, 14, 2], [550, 464, 11, 6, 11, 4], [550, 513, 7, 10, 7, 2], [550, 564, 7, 8, 7, 2], [550, 615, 8, 8, 8, 2], [550, 666, 13, 8, 13, 2], [550, 719, 12, 6, 12, 4], [550, 770, 10, 6, 10, 4], [611, 5, 9, 8, 9, 4], [611, 56, 8, 8, 8, 4], [611, 107, 13, 6, 13, 4], [611, 155, 11, 9, 11, 1], [611, 207, 10, 10, 10, 2], [611, 260, 11, 6, 11, 4], [611, 309, 11, 8, 11, 2], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 16, 6, 16, 4], [611, 515, 10, 6, 10, 4], [611, 563, 12, 9, 12, 1], [611, 614, 12, 9, 12, 1], [611, 665, 12, 9, 12, 1], [611, 717, 15, 8, 15, 2], [611, 770, 13, 6, 13, 4], [672, 5, 10, 6, 10, 4], [672, 56, 16, 6, 16, 4], [672, 105, 9, 8, 9, 2], [672, 156, 9, 8, 9, 2], [672, 207, 8, 8, 8, 2], [672, 258, 8, 8, 8, 2], [672, 311, 11, 6, 11, 4], [672, 360, 10, 8, 10, 2], [672, 411, 10, 10, 10, 2], [1, 5, 7, 6, 7, 4], [794, 767, 8, 9, 8, 1], [672, 565, 10, 7, 10, 3], [672, 617, 8, 6, 8, 4], [672, 668, 8, 6, 8, 4], [672, 717, 11, 8, 11, 2], [672, 768, 11, 8, 11, 2], [733, 3, 10, 9, 10, 2], [733, 56, 8, 6, 8, 4], [733, 107, 8, 8, 8, 4], [733, 158, 9, 8, 9, 4], [733, 207, 16, 8, 16, 2], [733, 257, 12, 9, 12, 1], [733, 308, 11, 9, 11, 1], [733, 359, 12, 9, 12, 1], [733, 410, 11, 9, 11, 1], [733, 461, 11, 9, 11, 1], [733, 512, 8, 9, 8, 1], [733, 563, 8, 9, 8, 1], [733, 614, 8, 9, 8, 1], [733, 665, 8, 9, 8, 1], [733, 716, 12, 9, 12, 1], [733, 767, 12, 9, 12, 1], [1, 5, 7, 6, 7, 4], [794, 53, 12, 9, 12, 1], [794, 104, 13, 9, 13, 1], [794, 155, 13, 9, 13, 1], [794, 206, 13, 9, 13, 1], [794, 260, 8, 6, 8, 4], [794, 308, 8, 9, 8, 1], [794, 359, 8, 9, 8, 1], [794, 410, 8, 9, 8, 1], [794, 461, 8, 9, 8, 1], [794, 513, 8, 8, 8, 2], [794, 563, 8, 9, 8, 1], [794, 617, 8, 8, 8, 4], [794, 665, 8, 9, 8, 1], [794, 719, 8, 8, 8, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 12, 10, 8, 1], [1, 104, 13, 5, 9, 1], [1, 155, 13, 10, 10, 1], [1, 205, 13, 12, 10, 0], [1, 257, 18, 10, 14, 1], [1, 308, 14, 10, 13, 1], [1, 359, 11, 5, 8, 1], [1, 410, 12, 12, 8, 1], [1, 461, 10, 12, 8, 1], [1, 512, 13, 7, 10, 1], [1, 565, 13, 7, 11, 3], [1, 621, 8, 5, 8, 8], [1, 669, 10, 3, 8, 5], [1, 723, 7, 3, 8, 8], [1, 767, 11, 10, 7, 1], [62, 2, 13, 10, 10, 1], [62, 53, 12, 10, 10, 1], [62, 104, 13, 10, 10, 1], [62, 155, 13, 10, 10, 1], [62, 206, 14, 10, 10, 1], [62, 257, 14, 10, 10, 1], [62, 308, 13, 10, 10, 1], [62, 359, 14, 10, 10, 1], [62, 410, 13, 10, 10, 1], [62, 461, 13, 10, 10, 1], [62, 514, 10, 8, 7, 3], [62, 565, 10, 10, 7, 3], [62, 616, 14, 7, 11, 3], [62, 668, 13, 5, 11, 4], [62, 718, 13, 7, 11, 3], [62, 767, 12, 10, 9, 1], [123, 2, 18, 12, 15, 1], [123, 53, 13, 10, 12, 1], [123, 104, 14, 10, 12, 1], [123, 155, 16, 10, 12, 1], [123, 206, 15, 10, 12, 1], [123, 257, 15, 10, 11, 1], [123, 308, 15, 10, 11, 1], [123, 359, 16, 10, 13, 1], [123, 410, 17, 10, 13, 1], [123, 461, 12, 10, 8, 1], [123, 512, 13, 10, 9, 1], [123, 563, 16, 10, 13, 1], [123, 614, 12, 10, 11, 1], [123, 665, 18, 10, 14, 1], [123, 716, 17, 10, 13, 1], [123, 767, 15, 10, 12, 1], [184, 2, 14, 10, 11, 1], [184, 53, 15, 12, 12, 1], [184, 104, 15, 10, 12, 1], [184, 155, 15, 10, 11, 1], [184, 206, 15, 10, 11, 1], [184, 257, 17, 10, 13, 1], [184, 308, 16, 10, 12, 1], [184, 359, 19, 10, 15, 1], [184, 410, 17, 10, 13, 1], [184, 461, 16, 10, 12, 1], [184, 512, 15, 10, 11, 1], [184, 563, 12, 12, 8, 1], [184, 614, 10, 10, 7, 1], [184, 665, 12, 12, 8, 1], [184, 716, 13, 5, 10, 1], [184, 776, 10, 3, 10, 10], [245, 2, 11, 4, 8, 1], [245, 55, 11, 8, 9, 3], [245, 104, 12, 10, 10, 1], [245, 157, 12, 8, 9, 3], [245, 206, 13, 10, 10, 1], [245, 259, 11, 8, 9, 3], [245, 308, 12, 10, 8, 1], [245, 361, 13, 10, 10, 3], [245, 410, 12, 10, 10, 1], [245, 461, 11, 10, 7, 1], [245, 512, 11, 12, 7, 1], [245, 563, 13, 10, 10, 1], [245, 614, 11, 10, 7, 1], [245, 667, 15, 8, 13, 3], [245, 718, 12, 8, 10, 3], [245, 769, 12, 8, 10, 3], [306, 4, 12, 10, 10, 3], [306, 55, 12, 10, 10, 3], [306, 106, 12, 8, 8, 3], [306, 157, 12, 8, 9, 3], [306, 207, 11, 9, 7, 2], [306, 259, 13, 8, 10, 3], [306, 310, 14, 8, 10, 3], [306, 361, 17, 8, 13, 3], [306, 412, 13, 8, 10, 3], [306, 463, 14, 10, 10, 3], [306, 514, 12, 8, 9, 3], [306, 563, 13, 12, 10, 1], [306, 614, 10, 12, 6, 1], [306, 665, 11, 12, 10, 1], [306, 718, 13, 4, 10, 3], [306, 767, 11, 10, 10, 1], [367, 1, 14, 11, 12, 0], [367, 52, 14, 11, 12, 0], [367, 104, 15, 12, 12, 1], [367, 154, 14, 11, 11, 0], [367, 205, 16, 11, 13, 0], [367, 256, 15, 11, 12, 0], [367, 307, 17, 11, 13, 0], [367, 358, 12, 11, 9, 0], [367, 409, 12, 11, 9, 0], [367, 460, 13, 11, 9, 0], [367, 512, 13, 10, 9, 1], [367, 562, 13, 11, 9, 0], [367, 613, 13, 11, 9, 0], [367, 667, 12, 10, 9, 3], [367, 715, 12, 11, 9, 0], [367, 766, 12, 11, 9, 0], [428, 1, 13, 11, 9, 0], [428, 53, 13, 10, 9, 1], [428, 103, 11, 11, 7, 0], [428, 154, 11, 11, 7, 0], [428, 205, 11, 11, 7, 0], [428, 257, 11, 10, 7, 1], [428, 307, 14, 11, 10, 0], [428, 358, 13, 11, 10, 0], [428, 409, 12, 11, 10, 0], [428, 460, 13, 11, 10, 0], [428, 512, 13, 10, 10, 1], [428, 562, 14, 11, 10, 0], [428, 613, 13, 11, 10, 0], [428, 664, 13, 11, 10, 0], [428, 715, 13, 11, 10, 0], [428, 767, 13, 10, 10, 1], [489, 2, 13, 11, 10, 1], [489, 53, 11, 4, 7, 1], [489, 105, 12, 10, 10, 2], [489, 155, 13, 10, 10, 1], [489, 205, 14, 13, 10, 0], [489, 260, 10, 5, 8, 4], [489, 308, 14, 12, 10, 1], [489, 359, 13, 10, 10, 1], [489, 410, 16, 10, 13, 1], [489, 461, 16, 10, 13, 1], [489, 512, 19, 7, 15, 1], [489, 563, 12, 4, 8, 1], [489, 614, 12, 3, 8, 1], [489, 667, 13, 7, 11, 3], [489, 716, 19, 10, 15, 1], [489, 767, 17, 10, 13, 1], [550, 5, 15, 5, 13, 4], [550, 55, 13, 8, 11, 3], [550, 105, 14, 9, 11, 2], [550, 156, 13, 9, 11, 2], [550, 206, 14, 10, 10, 1], [550, 259, 13, 10, 11, 3], [550, 308, 13, 10, 10, 1], [550, 359, 17, 11, 13, 1], [550, 410, 18, 11, 14, 1], [550, 463, 14, 8, 11, 3], [550, 512, 11, 12, 7, 1], [550, 563, 11, 7, 7, 1], [550, 614, 12, 7, 8, 1], [550, 665, 16, 10, 13, 1], [550, 718, 14, 8, 12, 3], [550, 769, 12, 8, 10, 3], [611, 4, 11, 10, 9, 3], [611, 55, 10, 10, 8, 3], [611, 108, 15, 5, 13, 5], [611, 154, 15, 11, 11, 0], [611, 206, 14, 12, 10, 1], [611, 260, 13, 6, 11, 4], [611, 308, 13, 10, 11, 1], [611, 361, 13, 8, 10, 3], [611, 412, 12, 8, 10, 3], [611, 468, 16, 3, 16, 8], [611, 511, 1, 1, 10, 1], [611, 562, 13, 11, 12, 0], [611, 613, 15, 11, 12, 0], [611, 664, 15, 11, 12, 0], [611, 716, 19, 10, 15, 1], [611, 769, 15, 8, 13, 3], [672, 6, 12, 3, 10, 5], [672, 57, 18, 3, 16, 5], [672, 104, 13, 5, 9, 1], [672, 155, 13, 5, 9, 1], [672, 206, 12, 5, 8, 1], [672, 257, 12, 5, 8, 1], [672, 310, 13, 7, 11, 3], [672, 359, 12, 10, 10, 1], [672, 410, 14, 12, 10, 1], [1, 1, 1, 1, 7, 1], [794, 766, 12, 4, 8, 0], [672, 564, 12, 8, 10, 2], [672, 616, 11, 7, 8, 3], [672, 667, 10, 7, 8, 3], [672, 716, 13, 10, 11, 1], [672, 767, 14, 10, 11, 1], [733, 2, 13, 11, 10, 1], [733, 57, 9, 3, 8, 5], [733, 111, 8, 5, 8, 8], [733, 162, 9, 5, 9, 8], [733, 206, 18, 10, 16, 1], [733, 256, 14, 11, 12, 0], [733, 307, 14, 11, 11, 0], [733, 358, 14, 11, 12, 0], [733, 409, 15, 11, 11, 0], [733, 460, 14, 11, 11, 0], [733, 511, 12, 11, 8, 0], [733, 562, 12, 11, 8, 0], [733, 613, 12, 11, 8, 0], [733, 664, 11, 11, 8, 0], [733, 715, 14, 11, 12, 0], [733, 766, 14, 11, 12, 0], [1, 1, 1, 1, 7, 1], [794, 52, 14, 11, 12, 0], [794, 103, 16, 11, 13, 0], [794, 154, 16, 11, 13, 0], [794, 205, 16, 11, 13, 0], [794, 259, 10, 8, 8, 3], [794, 307, 12, 4, 8, 0], [794, 358, 12, 4, 8, 0], [794, 409, 12, 3, 8, 0], [794, 460, 12, 4, 8, 0], [794, 512, 11, 3, 8, 1], [794, 562, 12, 6, 8, 0], [794, 620, 8, 6, 8, 7], [794, 664, 12, 4, 8, 0], [794, 722, 8, 6, 8, 7], [794, 766, 12, 4, 8, 0], [855, 1, 12, 4, 8, 0], [855, 52, 12, 4, 8, 0], [855, 103, 12, 4, 8, 0], [855, 154, 12, 4, 8, 0], [855, 205, 12, 4, 8, 0], [855, 256, 12, 4, 8, 0], [855, 307, 12, 4, 8, 0], [855, 358, 12, 4, 8, 0], [855, 409, 12, 4, 8, 0], [855, 460, 12, 4, 8, 0], [855, 511, 12, 4, 8, 0], [855, 562, 12, 4, 8, 0], [855, 613, 12, 4, 8, 0], [855, 664, 12, 4, 8, 0], [855, 715, 12, 4, 8, 0], [855, 766, 12, 4, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 16, \"widestglyph\": 19, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 11, 8, 7, 1], [1, 104, 12, 3, 8, 1], [1, 155, 12, 8, 9, 1], [1, 205, 12, 10, 9, 0], [1, 257, 17, 8, 13, 1], [1, 308, 13, 8, 12, 1], [1, 359, 10, 3, 7, 1], [1, 410, 11, 10, 7, 1], [1, 461, 9, 10, 7, 1], [1, 512, 12, 5, 9, 1], [1, 565, 12, 5, 10, 3], [1, 621, 7, 3, 7, 8], [1, 669, 9, 1, 7, 5], [1, 723, 6, 1, 7, 8], [1, 767, 10, 8, 6, 1], [62, 2, 12, 8, 9, 1], [62, 53, 11, 8, 9, 1], [62, 104, 12, 8, 9, 1], [62, 155, 12, 8, 9, 1], [62, 206, 13, 8, 9, 1], [62, 257, 13, 8, 9, 1], [62, 308, 12, 8, 9, 1], [62, 359, 13, 8, 9, 1], [62, 410, 12, 8, 9, 1], [62, 461, 12, 8, 9, 1], [62, 514, 9, 6, 6, 3], [62, 565, 9, 8, 6, 3], [62, 616, 13, 5, 10, 3], [62, 668, 12, 3, 10, 4], [62, 718, 12, 5, 10, 3], [62, 767, 11, 8, 8, 1], [123, 2, 17, 10, 14, 1], [123, 53, 12, 8, 11, 1], [123, 104, 13, 8, 11, 1], [123, 155, 15, 8, 11, 1], [123, 206, 14, 8, 11, 1], [123, 257, 14, 8, 10, 1], [123, 308, 14, 8, 10, 1], [123, 359, 15, 8, 12, 1], [123, 410, 16, 8, 12, 1], [123, 461, 11, 8, 7, 1], [123, 512, 12, 8, 8, 1], [123, 563, 15, 8, 12, 1], [123, 614, 11, 8, 10, 1], [123, 665, 17, 8, 13, 1], [123, 716, 16, 8, 12, 1], [123, 767, 14, 8, 11, 1], [184, 2, 13, 8, 10, 1], [184, 53, 14, 10, 11, 1], [184, 104, 14, 8, 11, 1], [184, 155, 14, 8, 10, 1], [184, 206, 14, 8, 10, 1], [184, 257, 16, 8, 12, 1], [184, 308, 15, 8, 11, 1], [184, 359, 18, 8, 14, 1], [184, 410, 16, 8, 12, 1], [184, 461, 15, 8, 11, 1], [184, 512, 14, 8, 10, 1], [184, 563, 11, 10, 7, 1], [184, 614, 9, 8, 6, 1], [184, 665, 11, 10, 7, 1], [184, 716, 12, 3, 9, 1], [184, 776, 9, 1, 9, 10], [245, 2, 10, 2, 7, 1], [245, 55, 10, 6, 8, 3], [245, 104, 11, 8, 9, 1], [245, 157, 11, 6, 8, 3], [245, 206, 12, 8, 9, 1], [245, 259, 10, 6, 8, 3], [245, 308, 11, 8, 7, 1], [245, 361, 12, 8, 9, 3], [245, 410, 11, 8, 9, 1], [245, 461, 10, 8, 6, 1], [245, 512, 10, 10, 6, 1], [245, 563, 12, 8, 9, 1], [245, 614, 10, 8, 6, 1], [245, 667, 14, 6, 12, 3], [245, 718, 11, 6, 9, 3], [245, 769, 11, 6, 9, 3], [306, 4, 11, 8, 9, 3], [306, 55, 11, 8, 9, 3], [306, 106, 11, 6, 7, 3], [306, 157, 11, 6, 8, 3], [306, 207, 10, 7, 6, 2], [306, 259, 12, 6, 9, 3], [306, 310, 13, 6, 9, 3], [306, 361, 16, 6, 12, 3], [306, 412, 12, 6, 9, 3], [306, 463, 13, 8, 9, 3], [306, 514, 11, 6, 8, 3], [306, 563, 12, 10, 9, 1], [306, 614, 9, 10, 5, 1], [306, 665, 10, 10, 9, 1], [306, 718, 12, 2, 9, 3], [306, 767, 10, 8, 9, 1], [367, 1, 12, 9, 11, 0], [367, 52, 13, 9, 11, 0], [367, 104, 14, 10, 11, 1], [367, 154, 13, 9, 10, 0], [367, 205, 15, 9, 12, 0], [367, 256, 14, 9, 11, 0], [367, 307, 16, 9, 12, 0], [367, 358, 10, 9, 8, 0], [367, 409, 11, 9, 8, 0], [367, 460, 12, 9, 8, 0], [367, 512, 12, 8, 8, 1], [367, 562, 11, 9, 8, 0], [367, 613, 12, 9, 8, 0], [367, 667, 11, 8, 8, 3], [367, 715, 10, 9, 8, 0], [367, 766, 11, 9, 8, 0], [428, 1, 12, 9, 8, 0], [428, 53, 12, 8, 8, 1], [428, 103, 9, 9, 6, 0], [428, 154, 10, 9, 6, 0], [428, 205, 9, 9, 6, 0], [428, 257, 9, 8, 6, 1], [428, 307, 12, 9, 9, 0], [428, 358, 11, 9, 9, 0], [428, 409, 11, 9, 9, 0], [428, 460, 12, 9, 9, 0], [428, 512, 12, 8, 9, 1], [428, 562, 12, 9, 9, 0], [428, 613, 12, 9, 9, 0], [428, 664, 12, 9, 9, 0], [428, 715, 12, 9, 9, 0], [428, 767, 12, 8, 9, 1], [489, 2, 12, 9, 9, 1], [489, 53, 10, 2, 6, 1], [489, 105, 11, 8, 9, 2], [489, 155, 12, 8, 9, 1], [489, 205, 13, 11, 9, 0], [489, 260, 9, 3, 7, 4], [489, 308, 13, 10, 9, 1], [489, 359, 12, 8, 9, 1], [489, 410, 15, 8, 12, 1], [489, 461, 15, 8, 12, 1], [489, 512, 18, 5, 14, 1], [489, 563, 11, 2, 7, 1], [489, 614, 11, 1, 7, 1], [489, 667, 12, 5, 10, 3], [489, 716, 18, 8, 14, 1], [489, 767, 16, 8, 12, 1], [550, 5, 14, 3, 12, 4], [550, 55, 12, 6, 10, 3], [550, 105, 13, 7, 10, 2], [550, 156, 12, 7, 10, 2], [550, 206, 13, 8, 9, 1], [550, 259, 12, 8, 10, 3], [550, 308, 12, 8, 9, 1], [550, 359, 16, 9, 12, 1], [550, 410, 17, 9, 13, 1], [550, 463, 13, 6, 10, 3], [550, 513, 9, 9, 6, 2], [550, 563, 10, 5, 6, 1], [550, 614, 11, 5, 7, 1], [550, 665, 15, 8, 12, 1], [550, 718, 13, 6, 11, 3], [550, 769, 11, 6, 9, 3], [611, 4, 10, 8, 8, 3], [611, 55, 9, 8, 7, 3], [611, 108, 14, 3, 12, 5], [611, 155, 14, 8, 10, 1], [611, 206, 13, 10, 9, 1], [611, 260, 12, 4, 10, 4], [611, 308, 12, 8, 10, 1], [611, 361, 12, 6, 9, 3], [611, 412, 11, 6, 9, 3], [611, 468, 15, 1, 15, 8], [611, 511, 1, 1, 9, 1], [611, 562, 12, 9, 11, 0], [611, 613, 13, 9, 11, 0], [611, 664, 13, 9, 11, 0], [611, 716, 18, 8, 14, 1], [611, 769, 14, 6, 12, 3], [672, 6, 11, 1, 9, 5], [672, 57, 17, 1, 15, 5], [672, 104, 12, 3, 8, 1], [672, 155, 12, 3, 8, 1], [672, 206, 11, 3, 7, 1], [672, 257, 11, 3, 7, 1], [672, 310, 12, 5, 10, 3], [672, 359, 11, 8, 9, 1], [672, 410, 13, 10, 9, 1], [1, 1, 1, 1, 6, 1], [794, 766, 10, 2, 7, 0], [672, 564, 11, 6, 9, 2], [672, 616, 10, 5, 7, 3], [672, 667, 9, 5, 7, 3], [672, 716, 12, 8, 10, 1], [672, 767, 13, 8, 10, 1], [733, 2, 12, 9, 9, 1], [733, 57, 8, 1, 7, 5], [733, 111, 7, 3, 7, 8], [733, 162, 8, 3, 8, 8], [733, 206, 17, 8, 15, 1], [733, 256, 13, 9, 11, 0], [733, 307, 13, 9, 10, 0], [733, 358, 12, 9, 11, 0], [733, 409, 14, 9, 10, 0], [733, 460, 13, 9, 10, 0], [733, 511, 10, 9, 7, 0], [733, 562, 11, 9, 7, 0], [733, 613, 10, 9, 7, 0], [733, 664, 10, 9, 7, 0], [733, 715, 13, 9, 11, 0], [733, 766, 13, 9, 11, 0], [1, 1, 1, 1, 6, 1], [794, 52, 13, 9, 11, 0], [794, 103, 15, 9, 12, 0], [794, 154, 15, 9, 12, 0], [794, 205, 15, 9, 12, 0], [794, 259, 9, 6, 7, 3], [794, 307, 11, 2, 7, 0], [794, 358, 11, 2, 7, 0], [794, 409, 1, 1, 7, 1], [794, 460, 11, 2, 7, 0], [794, 512, 10, 1, 7, 1], [794, 562, 11, 4, 7, 0], [794, 620, 7, 4, 7, 7], [794, 664, 11, 2, 7, 0], [794, 722, 7, 4, 7, 7], [794, 766, 10, 2, 7, 0], [855, 1, 10, 2, 7, 0], [855, 52, 10, 2, 7, 0], [855, 103, 10, 2, 7, 0], [855, 154, 10, 2, 7, 0], [855, 205, 10, 2, 7, 0], [855, 256, 10, 2, 7, 0], [855, 307, 10, 2, 7, 0], [855, 358, 10, 2, 7, 0], [855, 409, 10, 2, 7, 0], [855, 460, 10, 2, 7, 0], [855, 511, 10, 2, 7, 0], [855, 562, 10, 2, 7, 0], [855, 613, 10, 2, 7, 0], [855, 664, 10, 2, 7, 0], [855, 715, 10, 2, 7, 0], [855, 766, 10, 2, 7, 0]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 53, 8, 10, 8, 1], [1, 104, 9, 9, 9, 1], [1, 155, 10, 10, 10, 1], [1, 205, 10, 12, 10, 0], [1, 257, 14, 10, 14, 1], [1, 308, 13, 10, 13, 1], [1, 359, 8, 9, 8, 1], [1, 410, 8, 12, 8, 1], [1, 461, 8, 12, 8, 1], [1, 512, 10, 9, 10, 1], [1, 565, 11, 7, 11, 3], [1, 617, 8, 9, 8, 4], [1, 668, 8, 6, 8, 4], [1, 719, 8, 7, 8, 4], [1, 767, 7, 10, 7, 1], [62, 2, 10, 10, 10, 1], [62, 53, 10, 10, 10, 1], [62, 104, 10, 10, 10, 1], [62, 155, 10, 10, 10, 1], [62, 206, 10, 10, 10, 1], [62, 257, 10, 10, 10, 1], [62, 308, 10, 10, 10, 1], [62, 359, 10, 10, 10, 1], [62, 410, 10, 10, 10, 1], [62, 461, 10, 10, 10, 1], [62, 514, 7, 8, 7, 3], [62, 565, 7, 10, 7, 3], [62, 616, 11, 7, 11, 3], [62, 668, 11, 6, 11, 4], [62, 718, 11, 7, 11, 3], [62, 767, 9, 10, 9, 1], [123, 2, 15, 12, 15, 1], [123, 53, 12, 10, 12, 1], [123, 104, 12, 10, 12, 1], [123, 155, 12, 10, 12, 1], [123, 206, 12, 10, 12, 1], [123, 257, 11, 10, 11, 1], [123, 308, 11, 10, 11, 1], [123, 359, 13, 10, 13, 1], [123, 410, 13, 10, 13, 1], [123, 461, 8, 10, 8, 1], [123, 512, 9, 10, 9, 1], [123, 563, 13, 10, 13, 1], [123, 614, 11, 10, 11, 1], [123, 665, 14, 10, 14, 1], [123, 716, 13, 10, 13, 1], [123, 767, 12, 10, 12, 1], [184, 2, 11, 10, 11, 1], [184, 53, 12, 12, 12, 1], [184, 104, 12, 10, 12, 1], [184, 155, 11, 10, 11, 1], [184, 206, 11, 10, 11, 1], [184, 257, 13, 10, 13, 1], [184, 308, 12, 10, 12, 1], [184, 359, 15, 10, 15, 1], [184, 410, 13, 10, 13, 1], [184, 461, 12, 10, 12, 1], [184, 512, 11, 10, 11, 1], [184, 563, 8, 12, 8, 1], [184, 614, 7, 10, 7, 1], [184, 665, 8, 12, 8, 1], [184, 716, 10, 9, 10, 1], [184, 770, 10, 9, 10, 4], [245, 2, 8, 9, 8, 1], [245, 55, 9, 8, 9, 3], [245, 104, 10, 10, 10, 1], [245, 157, 9, 8, 9, 3], [245, 206, 10, 10, 10, 1], [245, 259, 9, 8, 9, 3], [245, 308, 8, 10, 8, 1], [245, 361, 10, 10, 10, 3], [245, 410, 10, 10, 10, 1], [245, 461, 7, 10, 7, 1], [245, 512, 7, 12, 7, 1], [245, 563, 10, 10, 10, 1], [245, 614, 7, 10, 7, 1], [245, 667, 13, 8, 13, 3], [245, 718, 10, 8, 10, 3], [245, 769, 10, 8, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 10, 10, 10, 3], [306, 106, 8, 8, 8, 3], [306, 157, 9, 8, 9, 3], [306, 207, 7, 9, 7, 2], [306, 259, 10, 8, 10, 3], [306, 310, 10, 8, 10, 3], [306, 361, 13, 8, 13, 3], [306, 412, 10, 8, 10, 3], [306, 463, 10, 10, 10, 3], [306, 514, 9, 8, 9, 3], [306, 563, 10, 12, 10, 1], [306, 614, 6, 12, 6, 1], [306, 665, 10, 12, 10, 1], [306, 718, 10, 7, 10, 3], [306, 767, 10, 10, 10, 1], [367, 1, 12, 11, 12, 0], [367, 52, 12, 11, 12, 0], [367, 104, 12, 12, 12, 1], [367, 154, 11, 11, 11, 0], [367, 205, 13, 11, 13, 0], [367, 256, 12, 11, 12, 0], [367, 307, 13, 11, 13, 0], [367, 358, 9, 11, 9, 0], [367, 409, 9, 11, 9, 0], [367, 460, 9, 11, 9, 0], [367, 512, 9, 10, 9, 1], [367, 562, 9, 11, 9, 0], [367, 613, 9, 11, 9, 0], [367, 667, 9, 10, 9, 3], [367, 715, 9, 11, 9, 0], [367, 766, 9, 11, 9, 0], [428, 1, 9, 11, 9, 0], [428, 53, 9, 10, 9, 1], [428, 103, 7, 11, 7, 0], [428, 154, 7, 11, 7, 0], [428, 205, 7, 11, 7, 0], [428, 257, 7, 10, 7, 1], [428, 307, 10, 11, 10, 0], [428, 358, 10, 11, 10, 0], [428, 409, 10, 11, 10, 0], [428, 460, 10, 11, 10, 0], [428, 512, 10, 10, 10, 1], [428, 562, 10, 11, 10, 0], [428, 613, 10, 11, 10, 0], [428, 664, 10, 11, 10, 0], [428, 715, 10, 11, 10, 0], [428, 767, 10, 10, 10, 1], [489, 2, 10, 11, 10, 1], [489, 53, 7, 9, 7, 1], [489, 105, 10, 10, 10, 2], [489, 155, 10, 10, 10, 1], [489, 205, 10, 13, 10, 0], [489, 260, 8, 6, 8, 4], [489, 308, 10, 12, 10, 1], [489, 359, 10, 10, 10, 1], [489, 410, 13, 10, 13, 1], [489, 461, 13, 10, 13, 1], [489, 512, 15, 9, 15, 1], [489, 563, 8, 9, 8, 1], [489, 614, 8, 9, 8, 1], [489, 667, 11, 7, 11, 3], [489, 716, 15, 10, 15, 1], [489, 767, 13, 10, 13, 1], [550, 5, 13, 6, 13, 4], [550, 55, 11, 8, 11, 3], [550, 105, 11, 9, 11, 2], [550, 156, 11, 9, 11, 2], [550, 206, 10, 10, 10, 1], [550, 259, 11, 10, 11, 3], [550, 308, 10, 10, 10, 1], [550, 359, 13, 11, 13, 1], [550, 410, 14, 11, 14, 1], [550, 463, 11, 8, 11, 3], [550, 512, 7, 12, 7, 1], [550, 563, 7, 9, 7, 1], [550, 614, 8, 9, 8, 1], [550, 665, 13, 10, 13, 1], [550, 718, 12, 8, 12, 3], [550, 769, 10, 8, 10, 3], [611, 4, 9, 10, 9, 3], [611, 55, 8, 10, 8, 3], [611, 107, 13, 6, 13, 4], [611, 154, 11, 11, 11, 0], [611, 206, 10, 12, 10, 1], [611, 260, 11, 6, 11, 4], [611, 308, 11, 10, 11, 1], [611, 361, 10, 8, 10, 3], [611, 412, 10, 8, 10, 3], [611, 464, 16, 7, 16, 4], [611, 515, 10, 6, 10, 4], [611, 562, 12, 11, 12, 0], [611, 613, 12, 11, 12, 0], [611, 664, 12, 11, 12, 0], [611, 716, 15, 10, 15, 1], [611, 769, 13, 8, 13, 3], [672, 5, 10, 6, 10, 4], [672, 56, 16, 6, 16, 4], [672, 104, 9, 9, 9, 1], [672, 155, 9, 9, 9, 1], [672, 206, 8, 9, 8, 1], [672, 257, 8, 9, 8, 1], [672, 310, 11, 7, 11, 3], [672, 359, 10, 10, 10, 1], [672, 410, 10, 12, 10, 1], [1, 5, 7, 6, 7, 4], [794, 766, 8, 10, 8, 0], [672, 564, 10, 8, 10, 2], [672, 616, 8, 7, 8, 3], [672, 667, 8, 7, 8, 3], [672, 716, 11, 10, 11, 1], [672, 767, 11, 10, 11, 1], [733, 2, 10, 11, 10, 1], [733, 56, 8, 6, 8, 4], [733, 107, 8, 9, 8, 4], [733, 158, 9, 9, 9, 4], [733, 206, 16, 10, 16, 1], [733, 256, 12, 11, 12, 0], [733, 307, 11, 11, 11, 0], [733, 358, 12, 11, 12, 0], [733, 409, 11, 11, 11, 0], [733, 460, 11, 11, 11, 0], [733, 511, 8, 11, 8, 0], [733, 562, 8, 11, 8, 0], [733, 613, 8, 11, 8, 0], [733, 664, 8, 11, 8, 0], [733, 715, 12, 11, 12, 0], [733, 766, 12, 11, 12, 0], [1, 5, 7, 6, 7, 4], [794, 52, 12, 11, 12, 0], [794, 103, 13, 11, 13, 0], [794, 154, 13, 11, 13, 0], [794, 205, 13, 11, 13, 0], [794, 259, 8, 8, 8, 3], [794, 307, 8, 10, 8, 0], [794, 358, 8, 10, 8, 0], [794, 409, 8, 10, 8, 0], [794, 460, 8, 10, 8, 0], [794, 512, 8, 9, 8, 1], [794, 562, 8, 10, 8, 0], [794, 617, 8, 9, 8, 4], [794, 664, 8, 10, 8, 0], [794, 719, 8, 9, 8, 4], [794, 766, 8, 10, 8, 0], [855, 1, 8, 10, 8, 0], [855, 52, 8, 10, 8, 0], [855, 103, 8, 10, 8, 0], [855, 154, 8, 10, 8, 0], [855, 205, 8, 10, 8, 0], [855, 256, 8, 10, 8, 0], [855, 307, 8, 10, 8, 0], [855, 358, 8, 10, 8, 0], [855, 409, 8, 10, 8, 0], [855, 460, 8, 10, 8, 0], [855, 511, 8, 10, 8, 0], [855, 562, 8, 10, 8, 0], [855, 613, 8, 10, 8, 0], [855, 664, 8, 10, 8, 0], [855, 715, 8, 10, 8, 0], [855, 766, 8, 10, 8, 0]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 7, 8, 7, 2], [1, 105, 8, 8, 8, 2], [1, 156, 9, 8, 9, 2], [1, 206, 9, 10, 9, 1], [1, 258, 13, 8, 13, 2], [1, 309, 12, 8, 12, 2], [1, 360, 7, 8, 7, 2], [1, 411, 7, 10, 7, 2], [1, 462, 7, 10, 7, 2], [1, 513, 9, 8, 9, 2], [1, 566, 10, 6, 10, 4], [1, 617, 7, 8, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 6, 7, 4], [1, 768, 6, 8, 6, 2], [62, 3, 9, 8, 9, 2], [62, 54, 9, 8, 9, 2], [62, 105, 9, 8, 9, 2], [62, 156, 9, 8, 9, 2], [62, 207, 9, 8, 9, 2], [62, 258, 9, 8, 9, 2], [62, 309, 9, 8, 9, 2], [62, 360, 9, 8, 9, 2], [62, 411, 9, 8, 9, 2], [62, 462, 9, 8, 9, 2], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 768, 8, 8, 8, 2], [123, 3, 14, 10, 14, 2], [123, 54, 11, 8, 11, 2], [123, 105, 11, 8, 11, 2], [123, 156, 11, 8, 11, 2], [123, 207, 11, 8, 11, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 12, 8, 12, 2], [123, 411, 12, 8, 12, 2], [123, 462, 7, 8, 7, 2], [123, 513, 8, 8, 8, 2], [123, 564, 12, 8, 12, 2], [123, 615, 10, 8, 10, 2], [123, 666, 13, 8, 13, 2], [123, 717, 12, 8, 12, 2], [123, 768, 11, 8, 11, 2], [184, 3, 10, 8, 10, 2], [184, 54, 11, 10, 11, 2], [184, 105, 11, 8, 11, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 12, 8, 12, 2], [184, 309, 11, 8, 11, 2], [184, 360, 14, 8, 14, 2], [184, 411, 12, 8, 12, 2], [184, 462, 11, 8, 11, 2], [184, 513, 10, 8, 10, 2], [184, 564, 7, 10, 7, 2], [184, 615, 6, 8, 6, 2], [184, 666, 7, 10, 7, 2], [184, 717, 9, 8, 9, 2], [184, 770, 9, 8, 9, 4], [245, 3, 7, 8, 7, 2], [245, 56, 8, 6, 8, 4], [245, 105, 9, 8, 9, 2], [245, 158, 8, 6, 8, 4], [245, 207, 9, 8, 9, 2], [245, 260, 8, 6, 8, 4], [245, 309, 7, 8, 7, 2], [245, 362, 9, 8, 9, 4], [245, 411, 9, 8, 9, 2], [245, 462, 6, 8, 6, 2], [245, 513, 6, 10, 6, 2], [245, 564, 9, 8, 9, 2], [245, 615, 6, 8, 6, 2], [245, 668, 12, 6, 12, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 7, 6, 7, 4], [306, 158, 8, 6, 8, 4], [306, 208, 6, 7, 6, 3], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 12, 6, 12, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 564, 9, 10, 9, 2], [306, 615, 5, 10, 5, 2], [306, 666, 9, 10, 9, 2], [306, 719, 9, 6, 9, 4], [306, 768, 9, 8, 9, 2], [367, 2, 11, 9, 11, 1], [367, 53, 11, 9, 11, 1], [367, 105, 11, 10, 11, 2], [367, 155, 10, 9, 10, 1], [367, 206, 12, 9, 12, 1], [367, 257, 11, 9, 11, 1], [367, 308, 12, 9, 12, 1], [367, 359, 8, 9, 8, 1], [367, 410, 8, 9, 8, 1], [367, 461, 8, 9, 8, 1], [367, 513, 8, 8, 8, 2], [367, 563, 8, 9, 8, 1], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 716, 8, 9, 8, 1], [367, 767, 8, 9, 8, 1], [428, 2, 8, 9, 8, 1], [428, 54, 8, 8, 8, 2], [428, 104, 6, 9, 6, 1], [428, 155, 6, 9, 6, 1], [428, 206, 6, 9, 6, 1], [428, 258, 6, 8, 6, 2], [428, 308, 9, 9, 9, 1], [428, 359, 9, 9, 9, 1], [428, 410, 9, 9, 9, 1], [428, 461, 9, 9, 9, 1], [428, 513, 9, 8, 9, 2], [428, 563, 9, 9, 9, 1], [428, 614, 9, 9, 9, 1], [428, 665, 9, 9, 9, 1], [428, 716, 9, 9, 9, 1], [428, 768, 9, 8, 9, 2], [489, 3, 9, 9, 9, 2], [489, 54, 6, 8, 6, 2], [489, 106, 9, 8, 9, 3], [489, 156, 9, 8, 9, 2], [489, 206, 9, 11, 9, 1], [489, 260, 7, 6, 7, 4], [489, 309, 9, 10, 9, 2], [489, 360, 9, 8, 9, 2], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 513, 14, 8, 14, 2], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 10, 6, 10, 4], [489, 717, 14, 8, 14, 2], [489, 768, 12, 8, 12, 2], [550, 5, 12, 6, 12, 4], [550, 56, 10, 6, 10, 4], [550, 106, 10, 7, 10, 3], [550, 157, 10, 7, 10, 3], [550, 207, 9, 8, 9, 2], [550, 260, 10, 8, 10, 4], [550, 309, 9, 8, 9, 2], [550, 360, 12, 9, 12, 2], [550, 411, 13, 9, 13, 2], [550, 464, 10, 6, 10, 4], [550, 513, 6, 10, 6, 2], [550, 564, 6, 8, 6, 2], [550, 615, 7, 8, 7, 2], [550, 666, 12, 8, 12, 2], [550, 719, 11, 6, 11, 4], [550, 770, 9, 6, 9, 4], [611, 5, 8, 8, 8, 4], [611, 56, 7, 8, 7, 4], [611, 107, 12, 6, 12, 4], [611, 155, 10, 9, 10, 1], [611, 207, 9, 10, 9, 2], [611, 260, 10, 6, 10, 4], [611, 309, 10, 8, 10, 2], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 15, 6, 15, 4], [611, 515, 9, 6, 9, 4], [611, 563, 11, 9, 11, 1], [611, 614, 11, 9, 11, 1], [611, 665, 11, 9, 11, 1], [611, 717, 14, 8, 14, 2], [611, 770, 12, 6, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 15, 6, 15, 4], [672, 105, 8, 8, 8, 2], [672, 156, 8, 8, 8, 2], [672, 207, 7, 8, 7, 2], [672, 258, 7, 8, 7, 2], [672, 311, 10, 6, 10, 4], [672, 360, 9, 8, 9, 2], [672, 411, 9, 10, 9, 2], [1, 5, 6, 6, 6, 4], [794, 767, 7, 9, 7, 1], [672, 565, 9, 7, 9, 3], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 717, 10, 8, 10, 2], [672, 768, 10, 8, 10, 2], [733, 3, 9, 9, 9, 2], [733, 56, 7, 6, 7, 4], [733, 107, 7, 8, 7, 4], [733, 158, 8, 8, 8, 4], [733, 207, 15, 8, 15, 2], [733, 257, 11, 9, 11, 1], [733, 308, 10, 9, 10, 1], [733, 359, 11, 9, 11, 1], [733, 410, 10, 9, 10, 1], [733, 461, 10, 9, 10, 1], [733, 512, 7, 9, 7, 1], [733, 563, 7, 9, 7, 1], [733, 614, 7, 9, 7, 1], [733, 665, 7, 9, 7, 1], [733, 716, 11, 9, 11, 1], [733, 767, 11, 9, 11, 1], [1, 5, 6, 6, 6, 4], [794, 53, 11, 9, 11, 1], [794, 104, 12, 9, 12, 1], [794, 155, 12, 9, 12, 1], [794, 206, 12, 9, 12, 1], [794, 260, 7, 6, 7, 4], [794, 308, 7, 9, 7, 1], [794, 359, 7, 9, 7, 1], [794, 410, 7, 9, 7, 1], [794, 461, 7, 9, 7, 1], [794, 513, 7, 8, 7, 2], [794, 563, 7, 9, 7, 1], [794, 617, 7, 8, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 8, 7, 4], [794, 767, 7, 9, 7, 1], [855, 2, 7, 9, 7, 1], [855, 53, 7, 9, 7, 1], [855, 104, 7, 9, 7, 1], [855, 155, 7, 9, 7, 1], [855, 206, 7, 9, 7, 1], [855, 257, 7, 9, 7, 1], [855, 308, 7, 9, 7, 1], [855, 359, 7, 9, 7, 1], [855, 410, 7, 9, 7, 1], [855, 461, 7, 9, 7, 1], [855, 512, 7, 9, 7, 1], [855, 563, 7, 9, 7, 1], [855, 614, 7, 9, 7, 1], [855, 665, 7, 9, 7, 1], [855, 716, 7, 9, 7, 1], [855, 767, 7, 9, 7, 1]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 14, 12, 10, 2], [1, 105, 15, 5, 11, 2], [1, 156, 17, 11, 12, 2], [1, 206, 16, 14, 12, 1], [1, 258, 21, 12, 17, 2], [1, 309, 18, 12, 16, 2], [1, 360, 13, 5, 9, 2], [1, 411, 15, 15, 10, 2], [1, 462, 13, 15, 10, 2], [1, 513, 16, 7, 12, 2], [1, 567, 15, 9, 13, 5], [1, 624, 8, 6, 9, 11], [1, 672, 12, 3, 10, 8], [1, 726, 8, 3, 9, 11], [1, 768, 14, 12, 9, 2], [62, 3, 16, 12, 12, 2], [62, 54, 15, 12, 12, 2], [62, 105, 16, 12, 12, 2], [62, 156, 16, 12, 12, 2], [62, 207, 16, 12, 12, 2], [62, 258, 17, 12, 12, 2], [62, 309, 16, 12, 12, 2], [62, 360, 17, 12, 12, 2], [62, 411, 16, 12, 12, 2], [62, 462, 16, 12, 12, 2], [62, 516, 11, 9, 9, 5], [62, 567, 12, 12, 9, 5], [62, 619, 16, 7, 13, 6], [62, 671, 15, 5, 13, 7], [62, 721, 15, 7, 13, 6], [62, 768, 15, 12, 11, 2], [123, 3, 21, 13, 18, 2], [123, 54, 16, 12, 15, 2], [123, 105, 18, 12, 14, 2], [123, 156, 18, 12, 14, 2], [123, 207, 18, 12, 15, 2], [123, 258, 19, 12, 14, 2], [123, 309, 18, 12, 13, 2], [123, 360, 20, 12, 15, 2], [123, 411, 19, 12, 14, 2], [123, 462, 15, 12, 10, 2], [123, 513, 15, 12, 10, 2], [123, 564, 20, 12, 15, 2], [123, 615, 15, 12, 14, 2], [123, 666, 22, 12, 17, 2], [123, 717, 20, 12, 15, 2], [123, 768, 18, 12, 15, 2], [184, 3, 17, 12, 13, 2], [184, 54, 18, 14, 15, 2], [184, 105, 17, 12, 14, 2], [184, 156, 17, 12, 12, 2], [184, 207, 19, 12, 14, 2], [184, 258, 20, 12, 15, 2], [184, 309, 20, 12, 15, 2], [184, 360, 23, 12, 18, 2], [184, 411, 20, 12, 15, 2], [184, 462, 20, 12, 15, 2], [184, 513, 19, 12, 14, 2], [184, 564, 14, 15, 9, 2], [184, 615, 12, 12, 9, 2], [184, 666, 14, 15, 9, 2], [184, 717, 15, 5, 11, 2], [184, 780, 12, 3, 12, 14], [245, 3, 13, 5, 9, 2], [245, 57, 14, 9, 11, 5], [245, 105, 15, 12, 12, 2], [245, 159, 14, 9, 11, 5], [245, 207, 16, 12, 12, 2], [245, 261, 14, 9, 11, 5], [245, 309, 15, 12, 10, 2], [245, 363, 16, 12, 12, 5], [245, 411, 15, 12, 12, 2], [245, 462, 13, 12, 9, 2], [245, 513, 14, 15, 9, 2], [245, 564, 15, 12, 12, 2], [245, 615, 13, 12, 9, 2], [245, 669, 19, 9, 16, 5], [245, 720, 15, 9, 12, 5], [245, 771, 14, 9, 12, 5], [306, 6, 15, 12, 12, 5], [306, 57, 14, 12, 12, 5], [306, 108, 14, 9, 11, 5], [306, 159, 13, 9, 10, 5], [306, 208, 12, 11, 9, 3], [306, 261, 15, 9, 12, 5], [306, 312, 16, 9, 12, 5], [306, 363, 18, 9, 15, 5], [306, 414, 16, 9, 12, 5], [306, 465, 16, 12, 12, 5], [306, 516, 14, 9, 11, 5], [306, 564, 16, 15, 12, 2], [306, 615, 13, 15, 8, 2], [306, 666, 15, 15, 12, 2], [306, 721, 15, 4, 12, 6], [306, 768, 16, 12, 12, 2], [367, 2, 18, 13, 15, 1], [367, 52, 18, 14, 15, 0], [367, 105, 19, 15, 14, 2], [367, 154, 19, 14, 14, 0], [367, 205, 20, 14, 15, 0], [367, 256, 19, 14, 15, 0], [367, 307, 20, 14, 15, 0], [367, 360, 15, 12, 11, 2], [367, 411, 14, 12, 11, 2], [367, 462, 14, 12, 11, 2], [367, 514, 14, 11, 11, 3], [367, 564, 16, 12, 11, 2], [367, 613, 15, 14, 11, 0], [367, 669, 14, 12, 11, 5], [367, 717, 15, 12, 11, 2], [367, 768, 14, 12, 11, 2], [428, 3, 14, 12, 11, 2], [428, 55, 14, 11, 11, 3], [428, 105, 14, 12, 9, 2], [428, 156, 12, 12, 9, 2], [428, 207, 13, 12, 9, 2], [428, 259, 13, 11, 9, 3], [428, 309, 17, 12, 12, 2], [428, 360, 15, 12, 12, 2], [428, 411, 14, 12, 12, 2], [428, 462, 15, 12, 12, 2], [428, 514, 15, 11, 12, 3], [428, 564, 17, 12, 12, 2], [428, 615, 15, 12, 12, 2], [428, 666, 15, 12, 12, 2], [428, 717, 15, 12, 12, 2], [428, 769, 15, 11, 12, 3], [489, 3, 16, 13, 12, 2], [489, 54, 14, 6, 10, 2], [489, 107, 15, 11, 11, 4], [489, 156, 15, 12, 12, 2], [489, 206, 17, 15, 12, 1], [489, 261, 13, 6, 10, 5], [489, 309, 16, 14, 11, 2], [489, 360, 15, 12, 12, 2], [489, 411, 19, 12, 16, 2], [489, 462, 19, 12, 16, 2], [489, 513, 22, 7, 17, 2], [489, 564, 15, 5, 10, 2], [489, 615, 15, 3, 10, 2], [489, 670, 15, 7, 13, 6], [489, 717, 22, 12, 17, 2], [489, 768, 20, 12, 15, 2], [550, 6, 18, 7, 15, 5], [550, 57, 15, 9, 13, 5], [550, 109, 16, 8, 13, 6], [550, 160, 15, 8, 13, 6], [550, 207, 17, 12, 12, 2], [550, 261, 14, 11, 13, 5], [550, 309, 16, 12, 12, 2], [550, 360, 20, 13, 15, 2], [550, 411, 21, 13, 17, 2], [550, 465, 16, 9, 13, 5], [550, 513, 14, 15, 9, 2], [550, 564, 13, 9, 9, 2], [550, 615, 14, 9, 10, 2], [550, 666, 19, 12, 16, 2], [550, 720, 17, 9, 14, 5], [550, 771, 15, 9, 12, 5], [611, 6, 12, 12, 11, 5], [611, 57, 12, 12, 10, 5], [611, 111, 17, 6, 15, 8], [611, 156, 18, 12, 13, 2], [611, 207, 17, 15, 12, 2], [611, 263, 15, 6, 13, 7], [611, 309, 16, 12, 14, 2], [611, 364, 15, 8, 12, 6], [611, 415, 14, 8, 12, 6], [611, 471, 18, 3, 19, 11], [611, 511, 1, 1, 12, 1], [611, 562, 17, 14, 15, 0], [611, 613, 20, 14, 15, 0], [611, 664, 19, 14, 15, 0], [611, 717, 21, 12, 16, 2], [611, 771, 17, 9, 15, 5], [672, 9, 14, 3, 12, 8], [672, 60, 21, 3, 19, 8], [672, 105, 16, 6, 11, 2], [672, 156, 15, 6, 11, 2], [672, 207, 14, 6, 9, 2], [672, 258, 13, 6, 9, 2], [672, 313, 15, 7, 13, 6], [672, 360, 15, 12, 12, 2], [672, 412, 16, 14, 12, 3], [1, 1, 1, 1, 9, 1], [794, 766, 17, 5, 12, 0], [672, 566, 16, 8, 12, 4], [672, 619, 13, 7, 10, 6], [672, 670, 12, 7, 10, 6], [672, 717, 15, 12, 13, 2], [672, 768, 17, 12, 13, 2], [733, 3, 15, 13, 11, 2], [733, 59, 11, 3, 10, 7], [733, 114, 9, 6, 9, 11], [733, 165, 11, 6, 11, 11], [733, 207, 21, 12, 19, 2], [733, 256, 17, 14, 15, 0], [733, 307, 18, 14, 14, 0], [733, 358, 19, 14, 15, 0], [733, 409, 19, 14, 14, 0], [733, 460, 19, 14, 14, 0], [733, 511, 15, 14, 10, 0], [733, 562, 15, 14, 10, 0], [733, 613, 15, 14, 10, 0], [733, 664, 15, 14, 10, 0], [733, 715, 18, 14, 15, 0], [733, 766, 18, 14, 15, 0], [1, 1, 1, 1, 9, 1], [794, 52, 18, 14, 15, 0], [794, 103, 20, 14, 15, 0], [794, 154, 21, 14, 16, 0], [794, 205, 21, 14, 16, 0], [794, 261, 11, 9, 9, 5], [794, 309, 14, 4, 10, 2], [794, 360, 15, 4, 10, 2], [794, 412, 14, 3, 10, 3], [794, 462, 15, 4, 10, 2], [794, 513, 14, 3, 10, 2], [794, 564, 14, 6, 10, 2], [794, 623, 10, 7, 10, 10], [794, 666, 15, 4, 10, 2], [794, 726, 9, 6, 10, 11], [794, 766, 17, 5, 12, 0], [855, 1, 17, 5, 12, 0], [855, 52, 17, 5, 12, 0], [855, 103, 17, 5, 12, 0], [855, 154, 17, 5, 12, 0], [855, 205, 17, 5, 12, 0], [855, 256, 17, 5, 12, 0], [855, 307, 17, 5, 12, 0], [855, 358, 17, 5, 12, 0], [855, 409, 17, 5, 12, 0], [855, 460, 17, 5, 12, 0], [855, 511, 17, 5, 12, 0], [855, 562, 17, 5, 12, 0], [855, 613, 17, 5, 12, 0], [855, 664, 17, 5, 12, 0], [855, 715, 17, 5, 12, 0], [855, 766, 17, 5, 12, 0]], \"capHeight\": 13, \"widestlogicalchar\": 19, \"widestglyph\": 23, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 13, 10, 9, 2], [1, 105, 14, 3, 10, 2], [1, 156, 16, 9, 11, 2], [1, 206, 15, 12, 11, 1], [1, 258, 20, 10, 16, 2], [1, 309, 17, 10, 15, 2], [1, 360, 12, 3, 8, 2], [1, 411, 14, 13, 9, 2], [1, 462, 12, 13, 9, 2], [1, 513, 15, 5, 11, 2], [1, 567, 14, 7, 12, 5], [1, 624, 7, 4, 8, 11], [1, 672, 11, 1, 9, 8], [1, 726, 7, 1, 8, 11], [1, 768, 13, 10, 8, 2], [62, 3, 15, 10, 11, 2], [62, 54, 14, 10, 11, 2], [62, 105, 15, 10, 11, 2], [62, 156, 15, 10, 11, 2], [62, 207, 15, 10, 11, 2], [62, 258, 16, 10, 11, 2], [62, 309, 15, 10, 11, 2], [62, 360, 16, 10, 11, 2], [62, 411, 15, 10, 11, 2], [62, 462, 15, 10, 11, 2], [62, 516, 10, 7, 8, 5], [62, 567, 11, 10, 8, 5], [62, 619, 15, 5, 12, 6], [62, 671, 14, 3, 12, 7], [62, 721, 14, 5, 12, 6], [62, 768, 14, 10, 10, 2], [123, 3, 20, 11, 17, 2], [123, 54, 15, 10, 14, 2], [123, 105, 17, 10, 13, 2], [123, 156, 17, 10, 13, 2], [123, 207, 17, 10, 14, 2], [123, 258, 18, 10, 13, 2], [123, 309, 17, 10, 12, 2], [123, 360, 19, 10, 14, 2], [123, 411, 18, 10, 13, 2], [123, 462, 14, 10, 9, 2], [123, 513, 14, 10, 9, 2], [123, 564, 19, 10, 14, 2], [123, 615, 14, 10, 13, 2], [123, 666, 21, 10, 16, 2], [123, 717, 19, 10, 14, 2], [123, 768, 17, 10, 14, 2], [184, 3, 16, 10, 12, 2], [184, 54, 17, 12, 14, 2], [184, 105, 16, 10, 13, 2], [184, 156, 16, 10, 11, 2], [184, 207, 18, 10, 13, 2], [184, 258, 19, 10, 14, 2], [184, 309, 19, 10, 14, 2], [184, 360, 22, 10, 17, 2], [184, 411, 19, 10, 14, 2], [184, 462, 19, 10, 14, 2], [184, 513, 18, 10, 13, 2], [184, 564, 13, 13, 8, 2], [184, 615, 11, 10, 8, 2], [184, 666, 13, 13, 8, 2], [184, 717, 14, 3, 10, 2], [184, 780, 11, 1, 11, 14], [245, 3, 12, 3, 8, 2], [245, 57, 13, 7, 10, 5], [245, 105, 14, 10, 11, 2], [245, 159, 13, 7, 10, 5], [245, 207, 15, 10, 11, 2], [245, 261, 13, 7, 10, 5], [245, 309, 14, 10, 9, 2], [245, 363, 15, 10, 11, 5], [245, 411, 14, 10, 11, 2], [245, 462, 12, 10, 8, 2], [245, 513, 13, 13, 8, 2], [245, 564, 14, 10, 11, 2], [245, 615, 12, 10, 8, 2], [245, 669, 18, 7, 15, 5], [245, 720, 14, 7, 11, 5], [245, 771, 13, 7, 11, 5], [306, 6, 14, 10, 11, 5], [306, 57, 13, 10, 11, 5], [306, 108, 13, 7, 10, 5], [306, 159, 12, 7, 9, 5], [306, 208, 11, 9, 8, 3], [306, 261, 14, 7, 11, 5], [306, 312, 15, 7, 11, 5], [306, 363, 17, 7, 14, 5], [306, 414, 15, 7, 11, 5], [306, 465, 15, 10, 11, 5], [306, 516, 13, 7, 10, 5], [306, 564, 15, 13, 11, 2], [306, 615, 12, 13, 7, 2], [306, 666, 14, 13, 11, 2], [306, 721, 14, 2, 11, 6], [306, 768, 15, 10, 11, 2], [367, 2, 17, 11, 14, 1], [367, 52, 17, 12, 14, 0], [367, 105, 18, 13, 13, 2], [367, 154, 18, 12, 13, 0], [367, 205, 19, 12, 14, 0], [367, 256, 17, 12, 14, 0], [367, 307, 19, 12, 14, 0], [367, 360, 14, 10, 10, 2], [367, 411, 13, 10, 10, 2], [367, 462, 13, 10, 10, 2], [367, 514, 13, 9, 10, 3], [367, 564, 15, 10, 10, 2], [367, 613, 14, 12, 10, 0], [367, 669, 13, 10, 10, 5], [367, 717, 14, 10, 10, 2], [367, 768, 13, 10, 10, 2], [428, 3, 13, 10, 10, 2], [428, 55, 13, 9, 10, 3], [428, 105, 13, 10, 8, 2], [428, 156, 11, 10, 8, 2], [428, 207, 12, 10, 8, 2], [428, 259, 12, 9, 8, 3], [428, 309, 16, 10, 11, 2], [428, 360, 14, 10, 11, 2], [428, 411, 13, 10, 11, 2], [428, 462, 14, 10, 11, 2], [428, 514, 14, 9, 11, 3], [428, 564, 16, 10, 11, 2], [428, 615, 14, 10, 11, 2], [428, 666, 14, 10, 11, 2], [428, 717, 14, 10, 11, 2], [428, 769, 14, 9, 11, 3], [489, 3, 15, 11, 11, 2], [489, 54, 13, 4, 9, 2], [489, 107, 14, 9, 10, 4], [489, 156, 14, 10, 11, 2], [489, 206, 16, 13, 11, 1], [489, 261, 12, 4, 9, 5], [489, 309, 15, 12, 10, 2], [489, 360, 14, 10, 11, 2], [489, 411, 18, 10, 15, 2], [489, 462, 18, 10, 15, 2], [489, 513, 21, 5, 16, 2], [489, 564, 14, 3, 9, 2], [489, 615, 14, 1, 9, 2], [489, 670, 14, 5, 12, 6], [489, 717, 21, 10, 16, 2], [489, 768, 19, 10, 14, 2], [550, 6, 17, 5, 14, 5], [550, 57, 14, 7, 12, 5], [550, 109, 15, 6, 12, 6], [550, 160, 14, 6, 12, 6], [550, 207, 16, 10, 11, 2], [550, 261, 13, 9, 12, 5], [550, 309, 15, 10, 11, 2], [550, 360, 19, 11, 14, 2], [550, 411, 20, 11, 16, 2], [550, 465, 15, 7, 12, 5], [550, 513, 13, 13, 8, 2], [550, 564, 12, 7, 8, 2], [550, 615, 13, 7, 9, 2], [550, 666, 18, 10, 15, 2], [550, 720, 16, 7, 13, 5], [550, 771, 14, 7, 11, 5], [611, 6, 11, 10, 10, 5], [611, 57, 11, 10, 9, 5], [611, 111, 16, 4, 14, 8], [611, 156, 17, 10, 12, 2], [611, 207, 16, 13, 11, 2], [611, 263, 14, 4, 12, 7], [611, 309, 15, 10, 13, 2], [611, 364, 14, 6, 11, 6], [611, 415, 13, 6, 11, 6], [611, 471, 17, 1, 18, 11], [611, 511, 1, 1, 11, 1], [611, 562, 16, 12, 14, 0], [611, 613, 17, 12, 14, 0], [611, 664, 17, 12, 14, 0], [611, 717, 20, 10, 15, 2], [611, 771, 16, 7, 14, 5], [672, 9, 13, 1, 11, 8], [672, 60, 20, 1, 18, 8], [672, 105, 15, 4, 10, 2], [672, 156, 14, 4, 10, 2], [672, 207, 13, 4, 8, 2], [672, 258, 12, 4, 8, 2], [672, 313, 14, 5, 12, 6], [672, 360, 14, 10, 11, 2], [672, 412, 15, 12, 11, 3], [1, 1, 1, 1, 8, 1], [794, 766, 15, 3, 11, 0], [672, 566, 15, 6, 11, 4], [672, 619, 12, 5, 9, 6], [672, 670, 11, 5, 9, 6], [672, 717, 14, 10, 12, 2], [672, 768, 16, 10, 12, 2], [733, 3, 14, 11, 10, 2], [733, 59, 10, 1, 9, 7], [733, 114, 8, 4, 8, 11], [733, 165, 10, 4, 10, 11], [733, 207, 20, 10, 18, 2], [733, 256, 16, 12, 14, 0], [733, 307, 17, 12, 13, 0], [733, 358, 16, 12, 14, 0], [733, 409, 18, 12, 13, 0], [733, 460, 18, 12, 13, 0], [733, 511, 14, 12, 9, 0], [733, 562, 14, 12, 9, 0], [733, 613, 14, 12, 9, 0], [733, 664, 14, 12, 9, 0], [733, 715, 17, 12, 14, 0], [733, 766, 17, 12, 14, 0], [1, 1, 1, 1, 8, 1], [794, 52, 17, 12, 14, 0], [794, 103, 19, 12, 14, 0], [794, 154, 20, 12, 15, 0], [794, 205, 20, 12, 15, 0], [794, 261, 10, 7, 8, 5], [794, 309, 13, 2, 9, 2], [794, 360, 14, 2, 9, 2], [794, 412, 13, 1, 9, 3], [794, 462, 14, 2, 9, 2], [794, 513, 13, 1, 9, 2], [794, 564, 13, 4, 9, 2], [794, 623, 9, 5, 9, 10], [794, 666, 14, 2, 9, 2], [794, 726, 8, 4, 9, 11], [794, 766, 15, 3, 11, 0], [855, 1, 15, 3, 11, 0], [855, 52, 15, 3, 11, 0], [855, 103, 15, 3, 11, 0], [855, 154, 15, 3, 11, 0], [855, 205, 15, 3, 11, 0], [855, 256, 15, 3, 11, 0], [855, 307, 15, 3, 11, 0], [855, 358, 15, 3, 11, 0], [855, 409, 15, 3, 11, 0], [855, 460, 15, 3, 11, 0], [855, 511, 15, 3, 11, 0], [855, 562, 15, 3, 11, 0], [855, 613, 15, 3, 11, 0], [855, 664, 15, 3, 11, 0], [855, 715, 15, 3, 11, 0], [855, 766, 15, 3, 11, 0]], \"capHeight\": 12, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 9, 6, 9, 7], [1, 54, 10, 12, 10, 2], [1, 105, 11, 11, 11, 2], [1, 156, 12, 11, 12, 2], [1, 206, 12, 14, 12, 1], [1, 258, 17, 12, 17, 2], [1, 309, 16, 12, 16, 2], [1, 360, 9, 11, 9, 2], [1, 411, 10, 15, 10, 2], [1, 462, 10, 15, 10, 2], [1, 513, 12, 11, 12, 2], [1, 567, 13, 9, 13, 5], [1, 620, 9, 10, 9, 7], [1, 671, 10, 6, 10, 7], [1, 722, 9, 7, 9, 7], [1, 768, 9, 12, 9, 2], [62, 3, 12, 12, 12, 2], [62, 54, 12, 12, 12, 2], [62, 105, 12, 12, 12, 2], [62, 156, 12, 12, 12, 2], [62, 207, 12, 12, 12, 2], [62, 258, 12, 12, 12, 2], [62, 309, 12, 12, 12, 2], [62, 360, 12, 12, 12, 2], [62, 411, 12, 12, 12, 2], [62, 462, 12, 12, 12, 2], [62, 516, 9, 9, 9, 5], [62, 567, 9, 12, 9, 5], [62, 619, 13, 7, 13, 6], [62, 671, 13, 6, 13, 7], [62, 721, 13, 7, 13, 6], [62, 768, 11, 12, 11, 2], [123, 3, 18, 13, 18, 2], [123, 54, 15, 12, 15, 2], [123, 105, 14, 12, 14, 2], [123, 156, 14, 12, 14, 2], [123, 207, 15, 12, 15, 2], [123, 258, 14, 12, 14, 2], [123, 309, 13, 12, 13, 2], [123, 360, 15, 12, 15, 2], [123, 411, 14, 12, 14, 2], [123, 462, 10, 12, 10, 2], [123, 513, 10, 12, 10, 2], [123, 564, 15, 12, 15, 2], [123, 615, 14, 12, 14, 2], [123, 666, 17, 12, 17, 2], [123, 717, 15, 12, 15, 2], [123, 768, 15, 12, 15, 2], [184, 3, 13, 12, 13, 2], [184, 54, 15, 14, 15, 2], [184, 105, 14, 12, 14, 2], [184, 156, 12, 12, 12, 2], [184, 207, 14, 12, 14, 2], [184, 258, 15, 12, 15, 2], [184, 309, 15, 12, 15, 2], [184, 360, 18, 12, 18, 2], [184, 411, 15, 12, 15, 2], [184, 462, 15, 12, 15, 2], [184, 513, 14, 12, 14, 2], [184, 564, 9, 15, 9, 2], [184, 615, 9, 12, 9, 2], [184, 666, 9, 15, 9, 2], [184, 717, 11, 11, 11, 2], [184, 773, 12, 10, 12, 7], [245, 3, 9, 11, 9, 2], [245, 57, 11, 9, 11, 5], [245, 105, 12, 12, 12, 2], [245, 159, 11, 9, 11, 5], [245, 207, 12, 12, 12, 2], [245, 261, 11, 9, 11, 5], [245, 309, 10, 12, 10, 2], [245, 363, 12, 12, 12, 5], [245, 411, 12, 12, 12, 2], [245, 462, 9, 12, 9, 2], [245, 513, 9, 15, 9, 2], [245, 564, 12, 12, 12, 2], [245, 615, 9, 12, 9, 2], [245, 669, 16, 9, 16, 5], [245, 720, 12, 9, 12, 5], [245, 771, 12, 9, 12, 5], [306, 6, 12, 12, 12, 5], [306, 57, 12, 12, 12, 5], [306, 108, 11, 9, 11, 5], [306, 159, 10, 9, 10, 5], [306, 208, 9, 11, 9, 3], [306, 261, 12, 9, 12, 5], [306, 312, 12, 9, 12, 5], [306, 363, 15, 9, 15, 5], [306, 414, 12, 9, 12, 5], [306, 465, 12, 12, 12, 5], [306, 516, 11, 9, 11, 5], [306, 564, 12, 15, 12, 2], [306, 615, 8, 15, 8, 2], [306, 666, 12, 15, 12, 2], [306, 721, 12, 7, 12, 6], [306, 768, 12, 12, 12, 2], [367, 2, 15, 13, 15, 1], [367, 52, 15, 14, 15, 0], [367, 105, 14, 15, 14, 2], [367, 154, 14, 14, 14, 0], [367, 205, 15, 14, 15, 0], [367, 256, 15, 14, 15, 0], [367, 307, 15, 14, 15, 0], [367, 360, 11, 12, 11, 2], [367, 411, 11, 12, 11, 2], [367, 462, 11, 12, 11, 2], [367, 514, 11, 11, 11, 3], [367, 564, 11, 12, 11, 2], [367, 613, 11, 14, 11, 0], [367, 669, 11, 12, 11, 5], [367, 717, 11, 12, 11, 2], [367, 768, 11, 12, 11, 2], [428, 3, 11, 12, 11, 2], [428, 55, 11, 11, 11, 3], [428, 105, 9, 12, 9, 2], [428, 156, 9, 12, 9, 2], [428, 207, 9, 12, 9, 2], [428, 259, 9, 11, 9, 3], [428, 309, 12, 12, 12, 2], [428, 360, 12, 12, 12, 2], [428, 411, 12, 12, 12, 2], [428, 462, 12, 12, 12, 2], [428, 514, 12, 11, 12, 3], [428, 564, 12, 12, 12, 2], [428, 615, 12, 12, 12, 2], [428, 666, 12, 12, 12, 2], [428, 717, 12, 12, 12, 2], [428, 769, 12, 11, 12, 3], [489, 3, 12, 13, 12, 2], [489, 54, 10, 11, 10, 2], [489, 107, 11, 11, 11, 4], [489, 156, 12, 12, 12, 2], [489, 206, 12, 15, 12, 1], [489, 261, 10, 8, 10, 5], [489, 309, 11, 14, 11, 2], [489, 360, 12, 12, 12, 2], [489, 411, 16, 12, 16, 2], [489, 462, 16, 12, 16, 2], [489, 513, 17, 11, 17, 2], [489, 564, 10, 11, 10, 2], [489, 615, 10, 11, 10, 2], [489, 670, 13, 7, 13, 6], [489, 717, 17, 12, 17, 2], [489, 768, 15, 12, 15, 2], [550, 6, 15, 8, 15, 5], [550, 57, 13, 9, 13, 5], [550, 109, 13, 8, 13, 6], [550, 160, 13, 8, 13, 6], [550, 207, 12, 12, 12, 2], [550, 261, 13, 11, 13, 5], [550, 309, 12, 12, 12, 2], [550, 360, 15, 13, 15, 2], [550, 411, 17, 13, 17, 2], [550, 465, 13, 9, 13, 5], [550, 513, 9, 15, 9, 2], [550, 564, 9, 11, 9, 2], [550, 615, 10, 11, 10, 2], [550, 666, 16, 12, 16, 2], [550, 720, 14, 9, 14, 5], [550, 771, 12, 9, 12, 5], [611, 6, 11, 12, 11, 5], [611, 57, 10, 12, 10, 5], [611, 110, 15, 7, 15, 7], [611, 156, 13, 12, 13, 2], [611, 207, 12, 15, 12, 2], [611, 263, 13, 6, 13, 7], [611, 309, 14, 12, 14, 2], [611, 364, 12, 8, 12, 6], [611, 415, 12, 8, 12, 6], [611, 467, 19, 7, 19, 7], [611, 518, 12, 6, 12, 7], [611, 562, 15, 14, 15, 0], [611, 613, 15, 14, 15, 0], [611, 664, 15, 14, 15, 0], [611, 717, 16, 12, 16, 2], [611, 771, 15, 9, 15, 5], [672, 8, 12, 6, 12, 7], [672, 59, 19, 6, 19, 7], [672, 105, 11, 11, 11, 2], [672, 156, 11, 11, 11, 2], [672, 207, 9, 11, 9, 2], [672, 258, 9, 11, 9, 2], [672, 313, 13, 7, 13, 6], [672, 360, 12, 12, 12, 2], [672, 412, 12, 14, 12, 3], [1, 8, 9, 6, 9, 7], [794, 766, 12, 13, 12, 0], [672, 566, 12, 9, 12, 4], [672, 619, 10, 7, 10, 6], [672, 670, 10, 7, 10, 6], [672, 717, 13, 12, 13, 2], [672, 768, 13, 12, 13, 2], [733, 3, 11, 13, 11, 2], [733, 59, 10, 6, 10, 7], [733, 110, 9, 10, 9, 7], [733, 161, 11, 10, 11, 7], [733, 207, 19, 12, 19, 2], [733, 256, 15, 14, 15, 0], [733, 307, 14, 14, 14, 0], [733, 358, 15, 14, 15, 0], [733, 409, 14, 14, 14, 0], [733, 460, 14, 14, 14, 0], [733, 511, 10, 14, 10, 0], [733, 562, 10, 14, 10, 0], [733, 613, 10, 14, 10, 0], [733, 664, 10, 14, 10, 0], [733, 715, 15, 14, 15, 0], [733, 766, 15, 14, 15, 0], [1, 8, 9, 6, 9, 7], [794, 52, 15, 14, 15, 0], [794, 103, 15, 14, 15, 0], [794, 154, 16, 14, 16, 0], [794, 205, 16, 14, 16, 0], [794, 261, 9, 9, 9, 5], [794, 309, 10, 11, 10, 2], [794, 360, 10, 11, 10, 2], [794, 412, 10, 10, 10, 3], [794, 462, 10, 11, 10, 2], [794, 513, 10, 11, 10, 2], [794, 564, 10, 11, 10, 2], [794, 620, 10, 10, 10, 7], [794, 666, 10, 11, 10, 2], [794, 722, 10, 10, 10, 7], [794, 766, 12, 13, 12, 0], [855, 1, 12, 13, 12, 0], [855, 52, 12, 13, 12, 0], [855, 103, 12, 13, 12, 0], [855, 154, 12, 13, 12, 0], [855, 205, 12, 13, 12, 0], [855, 256, 12, 13, 12, 0], [855, 307, 12, 13, 12, 0], [855, 358, 12, 13, 12, 0], [855, 409, 12, 13, 12, 0], [855, 460, 12, 13, 12, 0], [855, 511, 12, 13, 12, 0], [855, 562, 12, 13, 12, 0], [855, 613, 12, 13, 12, 0], [855, 664, 12, 13, 12, 0], [855, 715, 12, 13, 12, 0], [855, 766, 12, 13, 12, 0]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 8, 6, 8, 6], [1, 54, 9, 10, 9, 2], [1, 105, 10, 10, 10, 2], [1, 156, 11, 10, 11, 2], [1, 206, 11, 12, 11, 1], [1, 258, 16, 10, 16, 2], [1, 309, 15, 10, 15, 2], [1, 360, 8, 10, 8, 2], [1, 411, 9, 13, 9, 2], [1, 462, 9, 13, 9, 2], [1, 513, 11, 10, 11, 2], [1, 567, 12, 7, 12, 5], [1, 619, 8, 9, 8, 6], [1, 670, 9, 6, 9, 6], [1, 721, 8, 6, 8, 6], [1, 768, 8, 10, 8, 2], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 10, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 516, 8, 7, 8, 5], [62, 567, 8, 10, 8, 5], [62, 619, 12, 6, 12, 6], [62, 670, 12, 6, 12, 6], [62, 721, 12, 6, 12, 6], [62, 768, 10, 10, 10, 2], [123, 3, 17, 11, 17, 2], [123, 54, 14, 10, 14, 2], [123, 105, 13, 10, 13, 2], [123, 156, 13, 10, 13, 2], [123, 207, 14, 10, 14, 2], [123, 258, 13, 10, 13, 2], [123, 309, 12, 10, 12, 2], [123, 360, 14, 10, 14, 2], [123, 411, 13, 10, 13, 2], [123, 462, 9, 10, 9, 2], [123, 513, 9, 10, 9, 2], [123, 564, 14, 10, 14, 2], [123, 615, 13, 10, 13, 2], [123, 666, 16, 10, 16, 2], [123, 717, 14, 10, 14, 2], [123, 768, 14, 10, 14, 2], [184, 3, 12, 10, 12, 2], [184, 54, 14, 12, 14, 2], [184, 105, 13, 10, 13, 2], [184, 156, 11, 10, 11, 2], [184, 207, 13, 10, 13, 2], [184, 258, 14, 10, 14, 2], [184, 309, 14, 10, 14, 2], [184, 360, 17, 10, 17, 2], [184, 411, 14, 10, 14, 2], [184, 462, 14, 10, 14, 2], [184, 513, 13, 10, 13, 2], [184, 564, 8, 13, 8, 2], [184, 615, 8, 10, 8, 2], [184, 666, 8, 13, 8, 2], [184, 717, 10, 10, 10, 2], [184, 772, 11, 9, 11, 6], [245, 3, 8, 10, 8, 2], [245, 57, 10, 7, 10, 5], [245, 105, 11, 10, 11, 2], [245, 159, 10, 7, 10, 5], [245, 207, 11, 10, 11, 2], [245, 261, 10, 7, 10, 5], [245, 309, 9, 10, 9, 2], [245, 363, 11, 10, 11, 5], [245, 411, 11, 10, 11, 2], [245, 462, 8, 10, 8, 2], [245, 513, 8, 13, 8, 2], [245, 564, 11, 10, 11, 2], [245, 615, 8, 10, 8, 2], [245, 669, 15, 7, 15, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 10, 11, 5], [306, 57, 11, 10, 11, 5], [306, 108, 10, 7, 10, 5], [306, 159, 9, 7, 9, 5], [306, 208, 8, 9, 8, 3], [306, 261, 11, 7, 11, 5], [306, 312, 11, 7, 11, 5], [306, 363, 14, 7, 14, 5], [306, 414, 11, 7, 11, 5], [306, 465, 11, 10, 11, 5], [306, 516, 10, 7, 10, 5], [306, 564, 11, 13, 11, 2], [306, 615, 7, 13, 7, 2], [306, 666, 11, 13, 11, 2], [306, 721, 11, 6, 11, 6], [306, 768, 11, 10, 11, 2], [367, 2, 14, 11, 14, 1], [367, 52, 14, 12, 14, 0], [367, 105, 13, 13, 13, 2], [367, 154, 13, 12, 13, 0], [367, 205, 14, 12, 14, 0], [367, 256, 14, 12, 14, 0], [367, 307, 14, 12, 14, 0], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 613, 10, 12, 10, 0], [367, 669, 10, 10, 10, 5], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 8, 10, 8, 2], [428, 156, 8, 10, 8, 2], [428, 207, 8, 10, 8, 2], [428, 259, 8, 9, 8, 3], [428, 309, 11, 10, 11, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 3, 11, 11, 11, 2], [489, 54, 9, 10, 9, 2], [489, 107, 10, 9, 10, 4], [489, 156, 11, 10, 11, 2], [489, 206, 11, 13, 11, 1], [489, 261, 9, 7, 9, 5], [489, 309, 10, 12, 10, 2], [489, 360, 11, 10, 11, 2], [489, 411, 15, 10, 15, 2], [489, 462, 15, 10, 15, 2], [489, 513, 16, 10, 16, 2], [489, 564, 9, 10, 9, 2], [489, 615, 9, 10, 9, 2], [489, 670, 12, 6, 12, 6], [489, 717, 16, 10, 16, 2], [489, 768, 14, 10, 14, 2], [550, 6, 14, 7, 14, 5], [550, 57, 12, 7, 12, 5], [550, 109, 12, 6, 12, 6], [550, 160, 12, 6, 12, 6], [550, 207, 11, 10, 11, 2], [550, 261, 12, 9, 12, 5], [550, 309, 11, 10, 11, 2], [550, 360, 14, 11, 14, 2], [550, 411, 16, 11, 16, 2], [550, 465, 12, 7, 12, 5], [550, 513, 8, 13, 8, 2], [550, 564, 8, 10, 8, 2], [550, 615, 9, 10, 9, 2], [550, 666, 15, 10, 15, 2], [550, 720, 13, 7, 13, 5], [550, 771, 11, 7, 11, 5], [611, 6, 10, 10, 10, 5], [611, 57, 9, 10, 9, 5], [611, 109, 14, 6, 14, 6], [611, 156, 12, 10, 12, 2], [611, 207, 11, 13, 11, 2], [611, 262, 12, 6, 12, 6], [611, 309, 13, 10, 13, 2], [611, 364, 11, 6, 11, 6], [611, 415, 11, 6, 11, 6], [611, 466, 18, 6, 18, 6], [611, 517, 11, 6, 11, 6], [611, 562, 14, 12, 14, 0], [611, 613, 14, 12, 14, 0], [611, 664, 14, 12, 14, 0], [611, 717, 15, 10, 15, 2], [611, 771, 14, 7, 14, 5], [672, 7, 11, 6, 11, 6], [672, 58, 18, 6, 18, 6], [672, 105, 10, 10, 10, 2], [672, 156, 10, 10, 10, 2], [672, 207, 8, 10, 8, 2], [672, 258, 8, 10, 8, 2], [672, 313, 12, 6, 12, 6], [672, 360, 11, 10, 11, 2], [672, 412, 11, 12, 11, 3], [1, 7, 8, 6, 8, 6], [794, 766, 11, 12, 11, 0], [672, 566, 11, 8, 11, 4], [672, 619, 9, 6, 9, 6], [672, 670, 9, 6, 9, 6], [672, 717, 12, 10, 12, 2], [672, 768, 12, 10, 12, 2], [733, 3, 10, 11, 10, 2], [733, 58, 9, 6, 9, 6], [733, 109, 8, 9, 8, 6], [733, 160, 10, 9, 10, 6], [733, 207, 18, 10, 18, 2], [733, 256, 14, 12, 14, 0], [733, 307, 13, 12, 13, 0], [733, 358, 14, 12, 14, 0], [733, 409, 13, 12, 13, 0], [733, 460, 13, 12, 13, 0], [733, 511, 9, 12, 9, 0], [733, 562, 9, 12, 9, 0], [733, 613, 9, 12, 9, 0], [733, 664, 9, 12, 9, 0], [733, 715, 14, 12, 14, 0], [733, 766, 14, 12, 14, 0], [1, 7, 8, 6, 8, 6], [794, 52, 14, 12, 14, 0], [794, 103, 14, 12, 14, 0], [794, 154, 15, 12, 15, 0], [794, 205, 15, 12, 15, 0], [794, 261, 8, 7, 8, 5], [794, 309, 9, 10, 9, 2], [794, 360, 9, 10, 9, 2], [794, 412, 9, 9, 9, 3], [794, 462, 9, 10, 9, 2], [794, 513, 9, 10, 9, 2], [794, 564, 9, 10, 9, 2], [794, 619, 9, 9, 9, 6], [794, 666, 9, 10, 9, 2], [794, 721, 9, 9, 9, 6], [794, 766, 11, 12, 11, 0], [855, 1, 11, 12, 11, 0], [855, 52, 11, 12, 11, 0], [855, 103, 11, 12, 11, 0], [855, 154, 11, 12, 11, 0], [855, 205, 11, 12, 11, 0], [855, 256, 11, 12, 11, 0], [855, 307, 11, 12, 11, 0], [855, 358, 11, 12, 11, 0], [855, 409, 11, 12, 11, 0], [855, 460, 11, 12, 11, 0], [855, 511, 11, 12, 11, 0], [855, 562, 11, 12, 11, 0], [855, 613, 11, 12, 11, 0], [855, 664, 11, 12, 11, 0], [855, 715, 11, 12, 11, 0], [855, 766, 11, 12, 11, 0]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 13, 12, 9, 2], [1, 105, 14, 5, 10, 2], [1, 156, 16, 11, 11, 2], [1, 206, 15, 14, 11, 1], [1, 258, 20, 12, 16, 2], [1, 309, 17, 12, 15, 2], [1, 360, 12, 5, 8, 2], [1, 411, 14, 15, 9, 2], [1, 462, 12, 15, 9, 2], [1, 513, 15, 7, 11, 2], [1, 567, 14, 9, 12, 5], [1, 624, 7, 6, 8, 11], [1, 672, 11, 3, 9, 8], [1, 726, 7, 3, 8, 11], [1, 768, 13, 12, 8, 2], [62, 3, 15, 12, 11, 2], [62, 54, 14, 12, 11, 2], [62, 105, 15, 12, 11, 2], [62, 156, 15, 12, 11, 2], [62, 207, 15, 12, 11, 2], [62, 258, 16, 12, 11, 2], [62, 309, 15, 12, 11, 2], [62, 360, 16, 12, 11, 2], [62, 411, 15, 12, 11, 2], [62, 462, 15, 12, 11, 2], [62, 516, 10, 9, 8, 5], [62, 567, 11, 12, 8, 5], [62, 619, 15, 7, 12, 6], [62, 671, 14, 5, 12, 7], [62, 721, 14, 7, 12, 6], [62, 768, 14, 12, 10, 2], [123, 3, 20, 13, 17, 2], [123, 54, 15, 12, 14, 2], [123, 105, 17, 12, 13, 2], [123, 156, 17, 12, 13, 2], [123, 207, 17, 12, 14, 2], [123, 258, 18, 12, 13, 2], [123, 309, 17, 12, 12, 2], [123, 360, 19, 12, 14, 2], [123, 411, 18, 12, 13, 2], [123, 462, 14, 12, 9, 2], [123, 513, 14, 12, 9, 2], [123, 564, 19, 12, 14, 2], [123, 615, 14, 12, 13, 2], [123, 666, 21, 12, 16, 2], [123, 717, 19, 12, 14, 2], [123, 768, 17, 12, 14, 2], [184, 3, 16, 12, 12, 2], [184, 54, 17, 14, 14, 2], [184, 105, 16, 12, 13, 2], [184, 156, 16, 12, 11, 2], [184, 207, 18, 12, 13, 2], [184, 258, 19, 12, 14, 2], [184, 309, 19, 12, 14, 2], [184, 360, 22, 12, 17, 2], [184, 411, 19, 12, 14, 2], [184, 462, 19, 12, 14, 2], [184, 513, 18, 12, 13, 2], [184, 564, 13, 15, 8, 2], [184, 615, 11, 12, 8, 2], [184, 666, 13, 15, 8, 2], [184, 717, 14, 5, 10, 2], [184, 780, 11, 3, 11, 14], [245, 3, 12, 5, 8, 2], [245, 57, 13, 9, 10, 5], [245, 105, 14, 12, 11, 2], [245, 159, 13, 9, 10, 5], [245, 207, 15, 12, 11, 2], [245, 261, 13, 9, 10, 5], [245, 309, 14, 12, 9, 2], [245, 363, 15, 12, 11, 5], [245, 411, 14, 12, 11, 2], [245, 462, 12, 12, 8, 2], [245, 513, 13, 15, 8, 2], [245, 564, 14, 12, 11, 2], [245, 615, 12, 12, 8, 2], [245, 669, 18, 9, 15, 5], [245, 720, 14, 9, 11, 5], [245, 771, 13, 9, 11, 5], [306, 6, 14, 12, 11, 5], [306, 57, 13, 12, 11, 5], [306, 108, 13, 9, 10, 5], [306, 159, 12, 9, 9, 5], [306, 208, 11, 11, 8, 3], [306, 261, 14, 9, 11, 5], [306, 312, 15, 9, 11, 5], [306, 363, 17, 9, 14, 5], [306, 414, 15, 9, 11, 5], [306, 465, 15, 12, 11, 5], [306, 516, 13, 9, 10, 5], [306, 564, 15, 15, 11, 2], [306, 615, 12, 15, 7, 2], [306, 666, 14, 15, 11, 2], [306, 721, 14, 4, 11, 6], [306, 768, 15, 12, 11, 2], [367, 2, 17, 13, 14, 1], [367, 52, 17, 14, 14, 0], [367, 105, 18, 15, 13, 2], [367, 154, 18, 14, 13, 0], [367, 205, 19, 14, 14, 0], [367, 256, 18, 14, 14, 0], [367, 307, 19, 14, 14, 0], [367, 360, 14, 12, 10, 2], [367, 411, 13, 12, 10, 2], [367, 462, 13, 12, 10, 2], [367, 514, 13, 11, 10, 3], [367, 564, 15, 12, 10, 2], [367, 613, 14, 14, 10, 0], [367, 669, 13, 12, 10, 5], [367, 717, 14, 12, 10, 2], [367, 768, 13, 12, 10, 2], [428, 3, 13, 12, 10, 2], [428, 55, 13, 11, 10, 3], [428, 105, 13, 12, 8, 2], [428, 156, 11, 12, 8, 2], [428, 207, 12, 12, 8, 2], [428, 259, 12, 11, 8, 3], [428, 309, 16, 12, 11, 2], [428, 360, 14, 12, 11, 2], [428, 411, 13, 12, 11, 2], [428, 462, 14, 12, 11, 2], [428, 514, 14, 11, 11, 3], [428, 564, 16, 12, 11, 2], [428, 615, 14, 12, 11, 2], [428, 666, 14, 12, 11, 2], [428, 717, 14, 12, 11, 2], [428, 769, 14, 11, 11, 3], [489, 3, 15, 13, 11, 2], [489, 54, 13, 6, 9, 2], [489, 107, 14, 11, 10, 4], [489, 156, 14, 12, 11, 2], [489, 206, 16, 15, 11, 1], [489, 261, 12, 6, 9, 5], [489, 309, 15, 14, 10, 2], [489, 360, 14, 12, 11, 2], [489, 411, 18, 12, 15, 2], [489, 462, 18, 12, 15, 2], [489, 513, 21, 7, 16, 2], [489, 564, 14, 5, 9, 2], [489, 615, 14, 3, 9, 2], [489, 670, 14, 7, 12, 6], [489, 717, 21, 12, 16, 2], [489, 768, 19, 12, 14, 2], [550, 6, 17, 7, 14, 5], [550, 57, 14, 9, 12, 5], [550, 109, 15, 8, 12, 6], [550, 160, 14, 8, 12, 6], [550, 207, 16, 12, 11, 2], [550, 261, 13, 11, 12, 5], [550, 309, 15, 12, 11, 2], [550, 360, 19, 13, 14, 2], [550, 411, 20, 13, 16, 2], [550, 465, 15, 9, 12, 5], [550, 513, 13, 15, 8, 2], [550, 564, 12, 9, 8, 2], [550, 615, 13, 9, 9, 2], [550, 666, 18, 12, 15, 2], [550, 720, 16, 9, 13, 5], [550, 771, 14, 9, 11, 5], [611, 6, 11, 12, 10, 5], [611, 57, 11, 12, 9, 5], [611, 111, 16, 6, 14, 8], [611, 156, 17, 12, 12, 2], [611, 207, 16, 15, 11, 2], [611, 263, 14, 6, 12, 7], [611, 309, 15, 12, 13, 2], [611, 364, 14, 8, 11, 6], [611, 415, 13, 8, 11, 6], [611, 471, 17, 3, 18, 11], [611, 511, 1, 1, 11, 1], [611, 562, 16, 14, 14, 0], [611, 613, 19, 14, 14, 0], [611, 664, 18, 14, 14, 0], [611, 717, 20, 12, 15, 2], [611, 771, 16, 9, 14, 5], [672, 9, 13, 3, 11, 8], [672, 60, 20, 3, 18, 8], [672, 105, 15, 6, 10, 2], [672, 156, 14, 6, 10, 2], [672, 207, 13, 6, 8, 2], [672, 258, 12, 6, 8, 2], [672, 313, 14, 7, 12, 6], [672, 360, 14, 12, 11, 2], [672, 412, 15, 14, 11, 3], [1, 1, 1, 1, 8, 1], [794, 766, 16, 5, 11, 0], [672, 566, 15, 8, 11, 4], [672, 619, 12, 7, 9, 6], [672, 670, 11, 7, 9, 6], [672, 717, 14, 12, 12, 2], [672, 768, 16, 12, 12, 2], [733, 3, 14, 13, 10, 2], [733, 59, 10, 3, 9, 7], [733, 114, 8, 6, 8, 11], [733, 165, 10, 6, 10, 11], [733, 207, 20, 12, 18, 2], [733, 256, 16, 14, 14, 0], [733, 307, 17, 14, 13, 0], [733, 358, 18, 14, 14, 0], [733, 409, 18, 14, 13, 0], [733, 460, 18, 14, 13, 0], [733, 511, 14, 14, 9, 0], [733, 562, 14, 14, 9, 0], [733, 613, 14, 14, 9, 0], [733, 664, 14, 14, 9, 0], [733, 715, 17, 14, 14, 0], [733, 766, 17, 14, 14, 0], [1, 1, 1, 1, 8, 1], [794, 52, 17, 14, 14, 0], [794, 103, 19, 14, 14, 0], [794, 154, 20, 14, 15, 0], [794, 205, 20, 14, 15, 0], [794, 261, 10, 9, 8, 5], [794, 309, 13, 4, 9, 2], [794, 360, 14, 4, 9, 2], [794, 412, 13, 3, 9, 3], [794, 462, 14, 4, 9, 2], [794, 513, 13, 3, 9, 2], [794, 564, 13, 6, 9, 2], [794, 623, 9, 7, 9, 10], [794, 666, 14, 4, 9, 2], [794, 726, 8, 6, 9, 11], [794, 766, 16, 5, 11, 0], [855, 1, 16, 5, 11, 0], [855, 52, 16, 5, 11, 0], [855, 103, 16, 5, 11, 0], [855, 154, 16, 5, 11, 0], [855, 205, 16, 5, 11, 0], [855, 256, 16, 5, 11, 0], [855, 307, 16, 5, 11, 0], [855, 358, 16, 5, 11, 0], [855, 409, 16, 5, 11, 0], [855, 460, 16, 5, 11, 0], [855, 511, 16, 5, 11, 0], [855, 562, 16, 5, 11, 0], [855, 613, 16, 5, 11, 0], [855, 664, 16, 5, 11, 0], [855, 715, 16, 5, 11, 0], [855, 766, 16, 5, 11, 0]], \"capHeight\": 13, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 12, 10, 8, 2], [1, 105, 13, 3, 9, 2], [1, 156, 15, 9, 10, 2], [1, 206, 14, 12, 10, 1], [1, 258, 19, 10, 15, 2], [1, 309, 16, 10, 14, 2], [1, 360, 11, 3, 7, 2], [1, 411, 13, 13, 8, 2], [1, 462, 11, 13, 8, 2], [1, 513, 14, 5, 10, 2], [1, 567, 13, 7, 11, 5], [1, 624, 6, 4, 7, 11], [1, 672, 10, 1, 8, 8], [1, 726, 6, 1, 7, 11], [1, 768, 12, 10, 7, 2], [62, 3, 14, 10, 10, 2], [62, 54, 13, 10, 10, 2], [62, 105, 14, 10, 10, 2], [62, 156, 14, 10, 10, 2], [62, 207, 14, 10, 10, 2], [62, 258, 15, 10, 10, 2], [62, 309, 14, 10, 10, 2], [62, 360, 15, 10, 10, 2], [62, 411, 14, 10, 10, 2], [62, 462, 14, 10, 10, 2], [62, 516, 9, 7, 7, 5], [62, 567, 10, 10, 7, 5], [62, 619, 14, 5, 11, 6], [62, 671, 13, 3, 11, 7], [62, 721, 13, 5, 11, 6], [62, 768, 13, 10, 9, 2], [123, 3, 19, 11, 16, 2], [123, 54, 14, 10, 13, 2], [123, 105, 16, 10, 12, 2], [123, 156, 16, 10, 12, 2], [123, 207, 16, 10, 13, 2], [123, 258, 17, 10, 12, 2], [123, 309, 16, 10, 11, 2], [123, 360, 18, 10, 13, 2], [123, 411, 17, 10, 12, 2], [123, 462, 13, 10, 8, 2], [123, 513, 13, 10, 8, 2], [123, 564, 18, 10, 13, 2], [123, 615, 13, 10, 12, 2], [123, 666, 20, 10, 15, 2], [123, 717, 18, 10, 13, 2], [123, 768, 16, 10, 13, 2], [184, 3, 15, 10, 11, 2], [184, 54, 16, 12, 13, 2], [184, 105, 15, 10, 12, 2], [184, 156, 15, 10, 10, 2], [184, 207, 17, 10, 12, 2], [184, 258, 18, 10, 13, 2], [184, 309, 18, 10, 13, 2], [184, 360, 21, 10, 16, 2], [184, 411, 18, 10, 13, 2], [184, 462, 18, 10, 13, 2], [184, 513, 17, 10, 12, 2], [184, 564, 12, 13, 7, 2], [184, 615, 10, 10, 7, 2], [184, 666, 12, 13, 7, 2], [184, 717, 13, 3, 9, 2], [184, 780, 10, 1, 10, 14], [245, 3, 11, 3, 7, 2], [245, 57, 12, 7, 9, 5], [245, 105, 13, 10, 10, 2], [245, 159, 12, 7, 9, 5], [245, 207, 14, 10, 10, 2], [245, 261, 12, 7, 9, 5], [245, 309, 13, 10, 8, 2], [245, 363, 14, 10, 10, 5], [245, 411, 13, 10, 10, 2], [245, 462, 11, 10, 7, 2], [245, 513, 12, 13, 7, 2], [245, 564, 13, 10, 10, 2], [245, 615, 11, 10, 7, 2], [245, 669, 17, 7, 14, 5], [245, 720, 13, 7, 10, 5], [245, 771, 12, 7, 10, 5], [306, 6, 13, 10, 10, 5], [306, 57, 12, 10, 10, 5], [306, 108, 12, 7, 9, 5], [306, 159, 11, 7, 8, 5], [306, 208, 10, 9, 7, 3], [306, 261, 13, 7, 10, 5], [306, 312, 14, 7, 10, 5], [306, 363, 16, 7, 13, 5], [306, 414, 14, 7, 10, 5], [306, 465, 14, 10, 10, 5], [306, 516, 12, 7, 9, 5], [306, 564, 14, 13, 10, 2], [306, 615, 11, 13, 6, 2], [306, 666, 13, 13, 10, 2], [306, 721, 13, 2, 10, 6], [306, 768, 14, 10, 10, 2], [367, 2, 16, 11, 13, 1], [367, 52, 16, 12, 13, 0], [367, 105, 17, 13, 12, 2], [367, 154, 17, 12, 12, 0], [367, 205, 18, 12, 13, 0], [367, 256, 16, 12, 13, 0], [367, 307, 18, 12, 13, 0], [367, 360, 13, 10, 9, 2], [367, 411, 12, 10, 9, 2], [367, 462, 12, 10, 9, 2], [367, 514, 12, 9, 9, 3], [367, 564, 13, 10, 9, 2], [367, 613, 13, 12, 9, 0], [367, 669, 12, 10, 9, 5], [367, 717, 13, 10, 9, 2], [367, 768, 12, 10, 9, 2], [428, 3, 12, 10, 9, 2], [428, 55, 12, 9, 9, 3], [428, 105, 12, 10, 7, 2], [428, 156, 10, 10, 7, 2], [428, 207, 11, 10, 7, 2], [428, 259, 11, 9, 7, 3], [428, 309, 15, 10, 10, 2], [428, 360, 13, 10, 10, 2], [428, 411, 12, 10, 10, 2], [428, 462, 13, 10, 10, 2], [428, 514, 13, 9, 10, 3], [428, 564, 15, 10, 10, 2], [428, 615, 13, 10, 10, 2], [428, 666, 13, 10, 10, 2], [428, 717, 13, 10, 10, 2], [428, 769, 13, 9, 10, 3], [489, 3, 14, 11, 10, 2], [489, 54, 12, 4, 8, 2], [489, 107, 13, 9, 9, 4], [489, 156, 13, 10, 10, 2], [489, 206, 15, 13, 10, 1], [489, 261, 11, 4, 8, 5], [489, 309, 14, 12, 9, 2], [489, 360, 13, 10, 10, 2], [489, 411, 17, 10, 14, 2], [489, 462, 17, 10, 14, 2], [489, 513, 20, 5, 15, 2], [489, 564, 13, 3, 8, 2], [489, 615, 13, 1, 8, 2], [489, 670, 13, 5, 11, 6], [489, 717, 20, 10, 15, 2], [489, 768, 18, 10, 13, 2], [550, 6, 16, 5, 13, 5], [550, 57, 13, 7, 11, 5], [550, 109, 14, 6, 11, 6], [550, 160, 13, 6, 11, 6], [550, 207, 15, 10, 10, 2], [550, 261, 12, 9, 11, 5], [550, 309, 14, 10, 10, 2], [550, 360, 18, 11, 13, 2], [550, 411, 19, 11, 15, 2], [550, 465, 14, 7, 11, 5], [550, 513, 12, 13, 7, 2], [550, 564, 11, 7, 7, 2], [550, 615, 12, 7, 8, 2], [550, 666, 17, 10, 14, 2], [550, 720, 15, 7, 12, 5], [550, 771, 13, 7, 10, 5], [611, 6, 10, 10, 9, 5], [611, 57, 10, 10, 8, 5], [611, 111, 15, 4, 13, 8], [611, 156, 16, 10, 11, 2], [611, 207, 15, 13, 10, 2], [611, 263, 13, 4, 11, 7], [611, 309, 14, 10, 12, 2], [611, 364, 13, 6, 10, 6], [611, 415, 12, 6, 10, 6], [611, 471, 16, 1, 17, 11], [611, 511, 1, 1, 10, 1], [611, 562, 15, 12, 13, 0], [611, 613, 16, 12, 13, 0], [611, 664, 16, 12, 13, 0], [611, 717, 19, 10, 14, 2], [611, 771, 15, 7, 13, 5], [672, 9, 12, 1, 10, 8], [672, 60, 19, 1, 17, 8], [672, 105, 14, 4, 9, 2], [672, 156, 13, 4, 9, 2], [672, 207, 12, 4, 7, 2], [672, 258, 11, 4, 7, 2], [672, 313, 13, 5, 11, 6], [672, 360, 13, 10, 10, 2], [672, 412, 14, 12, 10, 3], [1, 1, 1, 1, 7, 1], [794, 766, 14, 3, 10, 0], [672, 566, 14, 6, 10, 4], [672, 619, 11, 5, 8, 6], [672, 670, 10, 5, 8, 6], [672, 717, 13, 10, 11, 2], [672, 768, 15, 10, 11, 2], [733, 3, 13, 11, 9, 2], [733, 59, 9, 1, 8, 7], [733, 114, 7, 4, 7, 11], [733, 165, 9, 4, 9, 11], [733, 207, 19, 10, 17, 2], [733, 256, 15, 12, 13, 0], [733, 307, 16, 12, 12, 0], [733, 358, 15, 12, 13, 0], [733, 409, 17, 12, 12, 0], [733, 460, 17, 12, 12, 0], [733, 512, 13, 11, 8, 1], [733, 562, 13, 12, 8, 0], [733, 613, 13, 12, 8, 0], [733, 664, 13, 12, 8, 0], [733, 715, 16, 12, 13, 0], [733, 766, 16, 12, 13, 0], [1, 1, 1, 1, 7, 1], [794, 52, 16, 12, 13, 0], [794, 103, 18, 12, 13, 0], [794, 154, 19, 12, 14, 0], [794, 205, 19, 12, 14, 0], [794, 261, 9, 7, 7, 5], [794, 309, 12, 2, 8, 2], [794, 360, 12, 2, 8, 2], [794, 412, 12, 1, 8, 3], [794, 462, 13, 2, 8, 2], [794, 513, 12, 1, 8, 2], [794, 564, 12, 4, 8, 2], [794, 623, 8, 5, 8, 10], [794, 666, 13, 2, 8, 2], [794, 726, 7, 4, 8, 11], [794, 766, 14, 3, 10, 0], [855, 1, 14, 3, 10, 0], [855, 52, 14, 3, 10, 0], [855, 103, 14, 3, 10, 0], [855, 154, 14, 3, 10, 0], [855, 205, 14, 3, 10, 0], [855, 256, 14, 3, 10, 0], [855, 307, 14, 3, 10, 0], [855, 358, 14, 3, 10, 0], [855, 409, 14, 3, 10, 0], [855, 460, 14, 3, 10, 0], [855, 511, 14, 3, 10, 0], [855, 562, 14, 3, 10, 0], [855, 613, 14, 3, 10, 0], [855, 664, 14, 3, 10, 0], [855, 715, 14, 3, 10, 0], [855, 766, 14, 3, 10, 0]], \"capHeight\": 12, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 54, 9, 12, 9, 2], [1, 105, 10, 11, 10, 2], [1, 156, 11, 11, 11, 2], [1, 206, 11, 14, 11, 1], [1, 258, 16, 12, 16, 2], [1, 309, 15, 12, 15, 2], [1, 360, 8, 11, 8, 2], [1, 411, 9, 15, 9, 2], [1, 462, 9, 15, 9, 2], [1, 513, 11, 11, 11, 2], [1, 567, 12, 9, 12, 5], [1, 620, 8, 10, 8, 7], [1, 671, 9, 6, 9, 7], [1, 722, 8, 7, 8, 7], [1, 768, 8, 12, 8, 2], [62, 3, 11, 12, 11, 2], [62, 54, 11, 12, 11, 2], [62, 105, 11, 12, 11, 2], [62, 156, 11, 12, 11, 2], [62, 207, 11, 12, 11, 2], [62, 258, 11, 12, 11, 2], [62, 309, 11, 12, 11, 2], [62, 360, 11, 12, 11, 2], [62, 411, 11, 12, 11, 2], [62, 462, 11, 12, 11, 2], [62, 516, 8, 9, 8, 5], [62, 567, 8, 12, 8, 5], [62, 619, 12, 7, 12, 6], [62, 671, 12, 6, 12, 7], [62, 721, 12, 7, 12, 6], [62, 768, 10, 12, 10, 2], [123, 3, 17, 13, 17, 2], [123, 54, 14, 12, 14, 2], [123, 105, 13, 12, 13, 2], [123, 156, 13, 12, 13, 2], [123, 207, 14, 12, 14, 2], [123, 258, 13, 12, 13, 2], [123, 309, 12, 12, 12, 2], [123, 360, 14, 12, 14, 2], [123, 411, 13, 12, 13, 2], [123, 462, 9, 12, 9, 2], [123, 513, 9, 12, 9, 2], [123, 564, 14, 12, 14, 2], [123, 615, 13, 12, 13, 2], [123, 666, 16, 12, 16, 2], [123, 717, 14, 12, 14, 2], [123, 768, 14, 12, 14, 2], [184, 3, 12, 12, 12, 2], [184, 54, 14, 14, 14, 2], [184, 105, 13, 12, 13, 2], [184, 156, 11, 12, 11, 2], [184, 207, 13, 12, 13, 2], [184, 258, 14, 12, 14, 2], [184, 309, 14, 12, 14, 2], [184, 360, 17, 12, 17, 2], [184, 411, 14, 12, 14, 2], [184, 462, 14, 12, 14, 2], [184, 513, 13, 12, 13, 2], [184, 564, 8, 15, 8, 2], [184, 615, 8, 12, 8, 2], [184, 666, 8, 15, 8, 2], [184, 717, 10, 11, 10, 2], [184, 773, 11, 10, 11, 7], [245, 3, 8, 11, 8, 2], [245, 57, 10, 9, 10, 5], [245, 105, 11, 12, 11, 2], [245, 159, 10, 9, 10, 5], [245, 207, 11, 12, 11, 2], [245, 261, 10, 9, 10, 5], [245, 309, 9, 12, 9, 2], [245, 363, 11, 12, 11, 5], [245, 411, 11, 12, 11, 2], [245, 462, 8, 12, 8, 2], [245, 513, 8, 15, 8, 2], [245, 564, 11, 12, 11, 2], [245, 615, 8, 12, 8, 2], [245, 669, 15, 9, 15, 5], [245, 720, 11, 9, 11, 5], [245, 771, 11, 9, 11, 5], [306, 6, 11, 12, 11, 5], [306, 57, 11, 12, 11, 5], [306, 108, 10, 9, 10, 5], [306, 159, 9, 9, 9, 5], [306, 208, 8, 11, 8, 3], [306, 261, 11, 9, 11, 5], [306, 312, 11, 9, 11, 5], [306, 363, 14, 9, 14, 5], [306, 414, 11, 9, 11, 5], [306, 465, 11, 12, 11, 5], [306, 516, 10, 9, 10, 5], [306, 564, 11, 15, 11, 2], [306, 615, 7, 15, 7, 2], [306, 666, 11, 15, 11, 2], [306, 721, 11, 7, 11, 6], [306, 768, 11, 12, 11, 2], [367, 2, 14, 13, 14, 1], [367, 52, 14, 14, 14, 0], [367, 105, 13, 15, 13, 2], [367, 154, 13, 14, 13, 0], [367, 205, 14, 14, 14, 0], [367, 256, 14, 14, 14, 0], [367, 307, 14, 14, 14, 0], [367, 360, 10, 12, 10, 2], [367, 411, 10, 12, 10, 2], [367, 462, 10, 12, 10, 2], [367, 514, 10, 11, 10, 3], [367, 564, 10, 12, 10, 2], [367, 613, 10, 14, 10, 0], [367, 669, 10, 12, 10, 5], [367, 717, 10, 12, 10, 2], [367, 768, 10, 12, 10, 2], [428, 3, 10, 12, 10, 2], [428, 55, 10, 11, 10, 3], [428, 105, 8, 12, 8, 2], [428, 156, 8, 12, 8, 2], [428, 207, 8, 12, 8, 2], [428, 259, 8, 11, 8, 3], [428, 309, 11, 12, 11, 2], [428, 360, 11, 12, 11, 2], [428, 411, 11, 12, 11, 2], [428, 462, 11, 12, 11, 2], [428, 514, 11, 11, 11, 3], [428, 564, 11, 12, 11, 2], [428, 615, 11, 12, 11, 2], [428, 666, 11, 12, 11, 2], [428, 717, 11, 12, 11, 2], [428, 769, 11, 11, 11, 3], [489, 3, 11, 13, 11, 2], [489, 54, 9, 11, 9, 2], [489, 107, 10, 11, 10, 4], [489, 156, 11, 12, 11, 2], [489, 206, 11, 15, 11, 1], [489, 261, 9, 8, 9, 5], [489, 309, 10, 14, 10, 2], [489, 360, 11, 12, 11, 2], [489, 411, 15, 12, 15, 2], [489, 462, 15, 12, 15, 2], [489, 513, 16, 11, 16, 2], [489, 564, 9, 11, 9, 2], [489, 615, 9, 11, 9, 2], [489, 670, 12, 7, 12, 6], [489, 717, 16, 12, 16, 2], [489, 768, 14, 12, 14, 2], [550, 6, 14, 8, 14, 5], [550, 57, 12, 9, 12, 5], [550, 109, 12, 8, 12, 6], [550, 160, 12, 8, 12, 6], [550, 207, 11, 12, 11, 2], [550, 261, 12, 11, 12, 5], [550, 309, 11, 12, 11, 2], [550, 360, 14, 13, 14, 2], [550, 411, 16, 13, 16, 2], [550, 465, 12, 9, 12, 5], [550, 513, 8, 15, 8, 2], [550, 564, 8, 11, 8, 2], [550, 615, 9, 11, 9, 2], [550, 666, 15, 12, 15, 2], [550, 720, 13, 9, 13, 5], [550, 771, 11, 9, 11, 5], [611, 6, 10, 12, 10, 5], [611, 57, 9, 12, 9, 5], [611, 110, 14, 7, 14, 7], [611, 156, 12, 12, 12, 2], [611, 207, 11, 15, 11, 2], [611, 263, 12, 6, 12, 7], [611, 309, 13, 12, 13, 2], [611, 364, 11, 8, 11, 6], [611, 415, 11, 8, 11, 6], [611, 467, 18, 7, 18, 7], [611, 518, 11, 6, 11, 7], [611, 562, 14, 14, 14, 0], [611, 613, 14, 14, 14, 0], [611, 664, 14, 14, 14, 0], [611, 717, 15, 12, 15, 2], [611, 771, 14, 9, 14, 5], [672, 8, 11, 6, 11, 7], [672, 59, 18, 6, 18, 7], [672, 105, 10, 11, 10, 2], [672, 156, 10, 11, 10, 2], [672, 207, 8, 11, 8, 2], [672, 258, 8, 11, 8, 2], [672, 313, 12, 7, 12, 6], [672, 360, 11, 12, 11, 2], [672, 412, 11, 14, 11, 3], [1, 8, 8, 6, 8, 7], [794, 766, 11, 13, 11, 0], [672, 566, 11, 9, 11, 4], [672, 619, 9, 7, 9, 6], [672, 670, 9, 7, 9, 6], [672, 717, 12, 12, 12, 2], [672, 768, 12, 12, 12, 2], [733, 3, 10, 13, 10, 2], [733, 59, 9, 6, 9, 7], [733, 110, 8, 10, 8, 7], [733, 161, 10, 10, 10, 7], [733, 207, 18, 12, 18, 2], [733, 256, 14, 14, 14, 0], [733, 307, 13, 14, 13, 0], [733, 358, 14, 14, 14, 0], [733, 409, 13, 14, 13, 0], [733, 460, 13, 14, 13, 0], [733, 511, 9, 14, 9, 0], [733, 562, 9, 14, 9, 0], [733, 613, 9, 14, 9, 0], [733, 664, 9, 14, 9, 0], [733, 715, 14, 14, 14, 0], [733, 766, 14, 14, 14, 0], [1, 8, 8, 6, 8, 7], [794, 52, 14, 14, 14, 0], [794, 103, 14, 14, 14, 0], [794, 154, 15, 14, 15, 0], [794, 205, 15, 14, 15, 0], [794, 261, 8, 9, 8, 5], [794, 309, 9, 11, 9, 2], [794, 360, 9, 11, 9, 2], [794, 412, 9, 10, 9, 3], [794, 462, 9, 11, 9, 2], [794, 513, 9, 11, 9, 2], [794, 564, 9, 11, 9, 2], [794, 620, 9, 10, 9, 7], [794, 666, 9, 11, 9, 2], [794, 722, 9, 10, 9, 7], [794, 766, 11, 13, 11, 0], [855, 1, 11, 13, 11, 0], [855, 52, 11, 13, 11, 0], [855, 103, 11, 13, 11, 0], [855, 154, 11, 13, 11, 0], [855, 205, 11, 13, 11, 0], [855, 256, 11, 13, 11, 0], [855, 307, 11, 13, 11, 0], [855, 358, 11, 13, 11, 0], [855, 409, 11, 13, 11, 0], [855, 460, 11, 13, 11, 0], [855, 511, 11, 13, 11, 0], [855, 562, 11, 13, 11, 0], [855, 613, 11, 13, 11, 0], [855, 664, 11, 13, 11, 0], [855, 715, 11, 13, 11, 0], [855, 766, 11, 13, 11, 0]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 54, 8, 10, 8, 2], [1, 105, 9, 10, 9, 2], [1, 156, 10, 10, 10, 2], [1, 206, 10, 12, 10, 1], [1, 258, 15, 10, 15, 2], [1, 309, 14, 10, 14, 2], [1, 360, 7, 10, 7, 2], [1, 411, 8, 13, 8, 2], [1, 462, 8, 13, 8, 2], [1, 513, 10, 10, 10, 2], [1, 567, 11, 7, 11, 5], [1, 619, 7, 9, 7, 6], [1, 670, 8, 6, 8, 6], [1, 721, 7, 6, 7, 6], [1, 768, 7, 10, 7, 2], [62, 3, 10, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 10, 10, 10, 2], [62, 156, 10, 10, 10, 2], [62, 207, 10, 10, 10, 2], [62, 258, 10, 10, 10, 2], [62, 309, 10, 10, 10, 2], [62, 360, 10, 10, 10, 2], [62, 411, 10, 10, 10, 2], [62, 462, 10, 10, 10, 2], [62, 516, 7, 7, 7, 5], [62, 567, 7, 10, 7, 5], [62, 619, 11, 6, 11, 6], [62, 670, 11, 6, 11, 6], [62, 721, 11, 6, 11, 6], [62, 768, 9, 10, 9, 2], [123, 3, 16, 11, 16, 2], [123, 54, 13, 10, 13, 2], [123, 105, 12, 10, 12, 2], [123, 156, 12, 10, 12, 2], [123, 207, 13, 10, 13, 2], [123, 258, 12, 10, 12, 2], [123, 309, 11, 10, 11, 2], [123, 360, 13, 10, 13, 2], [123, 411, 12, 10, 12, 2], [123, 462, 8, 10, 8, 2], [123, 513, 8, 10, 8, 2], [123, 564, 13, 10, 13, 2], [123, 615, 12, 10, 12, 2], [123, 666, 15, 10, 15, 2], [123, 717, 13, 10, 13, 2], [123, 768, 13, 10, 13, 2], [184, 3, 11, 10, 11, 2], [184, 54, 13, 12, 13, 2], [184, 105, 12, 10, 12, 2], [184, 156, 10, 10, 10, 2], [184, 207, 12, 10, 12, 2], [184, 258, 13, 10, 13, 2], [184, 309, 13, 10, 13, 2], [184, 360, 16, 10, 16, 2], [184, 411, 13, 10, 13, 2], [184, 462, 13, 10, 13, 2], [184, 513, 12, 10, 12, 2], [184, 564, 7, 13, 7, 2], [184, 615, 7, 10, 7, 2], [184, 666, 7, 13, 7, 2], [184, 717, 9, 10, 9, 2], [184, 772, 10, 9, 10, 6], [245, 3, 7, 10, 7, 2], [245, 57, 9, 7, 9, 5], [245, 105, 10, 10, 10, 2], [245, 159, 9, 7, 9, 5], [245, 207, 10, 10, 10, 2], [245, 261, 9, 7, 9, 5], [245, 309, 8, 10, 8, 2], [245, 363, 10, 10, 10, 5], [245, 411, 10, 10, 10, 2], [245, 462, 7, 10, 7, 2], [245, 513, 7, 13, 7, 2], [245, 564, 10, 10, 10, 2], [245, 615, 7, 10, 7, 2], [245, 669, 14, 7, 14, 5], [245, 720, 10, 7, 10, 5], [245, 771, 10, 7, 10, 5], [306, 6, 10, 10, 10, 5], [306, 57, 10, 10, 10, 5], [306, 108, 9, 7, 9, 5], [306, 159, 8, 7, 8, 5], [306, 208, 7, 9, 7, 3], [306, 261, 10, 7, 10, 5], [306, 312, 10, 7, 10, 5], [306, 363, 13, 7, 13, 5], [306, 414, 10, 7, 10, 5], [306, 465, 10, 10, 10, 5], [306, 516, 9, 7, 9, 5], [306, 564, 10, 13, 10, 2], [306, 615, 6, 13, 6, 2], [306, 666, 10, 13, 10, 2], [306, 721, 10, 6, 10, 6], [306, 768, 10, 10, 10, 2], [367, 2, 13, 11, 13, 1], [367, 52, 13, 12, 13, 0], [367, 105, 12, 13, 12, 2], [367, 154, 12, 12, 12, 0], [367, 205, 13, 12, 13, 0], [367, 256, 13, 12, 13, 0], [367, 307, 13, 12, 13, 0], [367, 360, 9, 10, 9, 2], [367, 411, 9, 10, 9, 2], [367, 462, 9, 10, 9, 2], [367, 514, 9, 9, 9, 3], [367, 564, 9, 10, 9, 2], [367, 613, 9, 12, 9, 0], [367, 669, 9, 10, 9, 5], [367, 717, 9, 10, 9, 2], [367, 768, 9, 10, 9, 2], [428, 3, 9, 10, 9, 2], [428, 55, 9, 9, 9, 3], [428, 105, 7, 10, 7, 2], [428, 156, 7, 10, 7, 2], [428, 207, 7, 10, 7, 2], [428, 259, 7, 9, 7, 3], [428, 309, 10, 10, 10, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 10, 11, 10, 2], [489, 54, 8, 10, 8, 2], [489, 107, 9, 9, 9, 4], [489, 156, 10, 10, 10, 2], [489, 206, 10, 13, 10, 1], [489, 261, 8, 7, 8, 5], [489, 309, 9, 12, 9, 2], [489, 360, 10, 10, 10, 2], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 513, 15, 10, 15, 2], [489, 564, 8, 10, 8, 2], [489, 615, 8, 10, 8, 2], [489, 670, 11, 6, 11, 6], [489, 717, 15, 10, 15, 2], [489, 768, 13, 10, 13, 2], [550, 6, 13, 7, 13, 5], [550, 57, 11, 7, 11, 5], [550, 109, 11, 6, 11, 6], [550, 160, 11, 6, 11, 6], [550, 207, 10, 10, 10, 2], [550, 261, 11, 9, 11, 5], [550, 309, 10, 10, 10, 2], [550, 360, 13, 11, 13, 2], [550, 411, 15, 11, 15, 2], [550, 465, 11, 7, 11, 5], [550, 513, 7, 13, 7, 2], [550, 564, 7, 10, 7, 2], [550, 615, 8, 10, 8, 2], [550, 666, 14, 10, 14, 2], [550, 720, 12, 7, 12, 5], [550, 771, 10, 7, 10, 5], [611, 6, 9, 10, 9, 5], [611, 57, 8, 10, 8, 5], [611, 109, 13, 6, 13, 6], [611, 156, 11, 10, 11, 2], [611, 207, 10, 13, 10, 2], [611, 262, 11, 6, 11, 6], [611, 309, 12, 10, 12, 2], [611, 364, 10, 6, 10, 6], [611, 415, 10, 6, 10, 6], [611, 466, 17, 6, 17, 6], [611, 517, 10, 6, 10, 6], [611, 562, 13, 12, 13, 0], [611, 613, 13, 12, 13, 0], [611, 664, 13, 12, 13, 0], [611, 717, 14, 10, 14, 2], [611, 771, 13, 7, 13, 5], [672, 7, 10, 6, 10, 6], [672, 58, 17, 6, 17, 6], [672, 105, 9, 10, 9, 2], [672, 156, 9, 10, 9, 2], [672, 207, 7, 10, 7, 2], [672, 258, 7, 10, 7, 2], [672, 313, 11, 6, 11, 6], [672, 360, 10, 10, 10, 2], [672, 412, 10, 12, 10, 3], [1, 7, 7, 6, 7, 6], [794, 766, 10, 12, 10, 0], [672, 566, 10, 8, 10, 4], [672, 619, 8, 6, 8, 6], [672, 670, 8, 6, 8, 6], [672, 717, 11, 10, 11, 2], [672, 768, 11, 10, 11, 2], [733, 3, 9, 11, 9, 2], [733, 58, 8, 6, 8, 6], [733, 109, 7, 9, 7, 6], [733, 160, 9, 9, 9, 6], [733, 207, 17, 10, 17, 2], [733, 256, 13, 12, 13, 0], [733, 307, 12, 12, 12, 0], [733, 358, 13, 12, 13, 0], [733, 409, 12, 12, 12, 0], [733, 460, 12, 12, 12, 0], [733, 511, 8, 12, 8, 0], [733, 562, 8, 12, 8, 0], [733, 613, 8, 12, 8, 0], [733, 664, 8, 12, 8, 0], [733, 715, 13, 12, 13, 0], [733, 766, 13, 12, 13, 0], [1, 7, 7, 6, 7, 6], [794, 52, 13, 12, 13, 0], [794, 103, 13, 12, 13, 0], [794, 154, 14, 12, 14, 0], [794, 205, 14, 12, 14, 0], [794, 261, 7, 7, 7, 5], [794, 309, 8, 10, 8, 2], [794, 360, 8, 10, 8, 2], [794, 412, 8, 9, 8, 3], [794, 462, 8, 10, 8, 2], [794, 513, 8, 10, 8, 2], [794, 564, 8, 10, 8, 2], [794, 619, 8, 9, 8, 6], [794, 666, 8, 10, 8, 2], [794, 721, 8, 9, 8, 6], [794, 766, 10, 12, 10, 0], [855, 1, 10, 12, 10, 0], [855, 52, 10, 12, 10, 0], [855, 103, 10, 12, 10, 0], [855, 154, 10, 12, 10, 0], [855, 205, 10, 12, 10, 0], [855, 256, 10, 12, 10, 0], [855, 307, 10, 12, 10, 0], [855, 358, 10, 12, 10, 0], [855, 409, 10, 12, 10, 0], [855, 460, 10, 12, 10, 0], [855, 511, 10, 12, 10, 0], [855, 562, 10, 12, 10, 0], [855, 613, 10, 12, 10, 0], [855, 664, 10, 12, 10, 0], [855, 715, 10, 12, 10, 0], [855, 766, 10, 12, 10, 0]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 16, 14, 12, 2], [1, 105, 17, 6, 13, 2], [1, 157, 19, 13, 15, 3], [1, 206, 20, 17, 15, 1], [1, 258, 24, 14, 21, 2], [1, 309, 23, 14, 20, 2], [1, 360, 14, 6, 9, 2], [1, 411, 17, 18, 12, 2], [1, 462, 15, 18, 12, 2], [1, 513, 20, 9, 15, 2], [1, 567, 18, 11, 16, 5], [1, 625, 11, 7, 12, 12], [1, 673, 14, 3, 12, 9], [1, 727, 11, 4, 12, 12], [1, 768, 16, 14, 11, 2], [62, 3, 19, 14, 15, 2], [62, 54, 17, 14, 15, 2], [62, 105, 19, 14, 15, 2], [62, 156, 19, 14, 15, 2], [62, 207, 19, 14, 15, 2], [62, 258, 20, 14, 15, 2], [62, 309, 19, 14, 15, 2], [62, 360, 20, 14, 15, 2], [62, 411, 20, 14, 15, 2], [62, 462, 19, 14, 15, 2], [62, 517, 13, 10, 11, 6], [62, 568, 14, 13, 11, 6], [62, 619, 19, 9, 16, 6], [62, 671, 19, 7, 16, 7], [62, 721, 18, 9, 16, 6], [62, 768, 19, 14, 14, 2], [123, 3, 26, 17, 23, 2], [123, 54, 19, 14, 19, 2], [123, 105, 22, 14, 18, 2], [123, 156, 23, 14, 18, 2], [123, 207, 22, 14, 19, 2], [123, 258, 22, 14, 17, 2], [123, 309, 21, 14, 16, 2], [123, 360, 23, 14, 19, 2], [123, 411, 24, 14, 19, 2], [123, 462, 17, 14, 12, 2], [123, 513, 18, 14, 13, 2], [123, 564, 23, 14, 19, 2], [123, 615, 18, 14, 17, 2], [123, 666, 27, 14, 22, 2], [123, 717, 24, 14, 19, 2], [123, 768, 22, 14, 19, 2], [184, 3, 20, 14, 16, 2], [184, 54, 22, 17, 19, 2], [184, 105, 20, 14, 18, 2], [184, 156, 21, 14, 16, 2], [184, 207, 22, 14, 17, 2], [184, 258, 24, 14, 19, 2], [184, 309, 24, 14, 19, 2], [184, 360, 28, 14, 23, 2], [184, 411, 23, 14, 19, 2], [184, 462, 23, 14, 19, 2], [184, 513, 22, 14, 17, 2], [184, 564, 17, 18, 12, 2], [184, 615, 13, 14, 11, 2], [184, 666, 16, 18, 12, 2], [184, 717, 17, 8, 14, 2], [184, 783, 14, 3, 15, 17], [245, 3, 15, 5, 12, 2], [245, 58, 16, 10, 14, 6], [245, 105, 17, 14, 15, 2], [245, 160, 17, 10, 14, 6], [245, 207, 20, 14, 15, 2], [245, 262, 16, 10, 14, 6], [245, 309, 17, 14, 12, 2], [245, 364, 19, 14, 15, 6], [245, 411, 18, 14, 15, 2], [245, 462, 15, 14, 11, 2], [245, 513, 15, 18, 11, 2], [245, 564, 18, 14, 15, 2], [245, 615, 15, 14, 11, 2], [245, 670, 23, 10, 20, 6], [245, 721, 18, 10, 15, 6], [245, 772, 17, 10, 15, 6], [306, 7, 17, 14, 15, 6], [306, 58, 17, 14, 15, 6], [306, 109, 16, 10, 12, 6], [306, 160, 16, 10, 13, 6], [306, 209, 14, 12, 11, 4], [306, 262, 18, 10, 15, 6], [306, 313, 19, 10, 15, 6], [306, 364, 23, 10, 19, 6], [306, 415, 18, 10, 15, 6], [306, 466, 19, 14, 15, 6], [306, 517, 17, 10, 14, 6], [306, 564, 18, 18, 15, 2], [306, 615, 14, 18, 10, 2], [306, 666, 17, 18, 15, 2], [306, 722, 19, 4, 16, 7], [306, 768, 14, 14, 14, 2], [367, 1, 22, 16, 19, 0], [367, 52, 22, 16, 19, 0], [367, 105, 23, 18, 18, 2], [367, 154, 22, 16, 17, 0], [367, 205, 24, 16, 19, 0], [367, 256, 22, 16, 19, 0], [367, 307, 24, 16, 19, 0], [367, 361, 16, 13, 14, 3], [367, 412, 16, 13, 14, 3], [367, 462, 17, 14, 14, 2], [367, 515, 16, 12, 14, 4], [367, 565, 18, 13, 14, 3], [367, 614, 17, 15, 14, 1], [367, 670, 17, 13, 14, 6], [367, 718, 17, 13, 14, 3], [367, 769, 16, 13, 14, 3], [428, 3, 17, 14, 14, 2], [428, 56, 16, 12, 14, 4], [428, 105, 15, 14, 11, 2], [428, 156, 15, 14, 11, 2], [428, 207, 15, 14, 11, 2], [428, 260, 14, 12, 11, 4], [428, 310, 19, 13, 15, 3], [428, 361, 17, 13, 15, 3], [428, 412, 17, 13, 15, 3], [428, 462, 17, 14, 15, 2], [428, 515, 17, 12, 15, 4], [428, 565, 19, 13, 15, 3], [428, 616, 18, 13, 15, 3], [428, 667, 18, 13, 15, 3], [428, 717, 18, 14, 15, 2], [428, 770, 18, 12, 15, 4], [489, 2, 18, 16, 15, 1], [489, 54, 16, 6, 12, 2], [489, 107, 18, 14, 15, 4], [489, 156, 19, 14, 15, 2], [489, 206, 19, 16, 15, 1], [489, 261, 15, 7, 12, 5], [489, 309, 19, 18, 14, 2], [489, 360, 19, 14, 15, 2], [489, 411, 23, 14, 20, 2], [489, 462, 23, 14, 20, 2], [489, 513, 27, 8, 22, 2], [489, 564, 16, 5, 12, 2], [489, 615, 17, 4, 12, 2], [489, 669, 19, 11, 16, 5], [489, 717, 27, 14, 22, 2], [489, 768, 23, 14, 19, 2], [550, 7, 22, 7, 19, 6], [550, 57, 17, 11, 16, 5], [550, 109, 19, 10, 16, 6], [550, 160, 18, 10, 16, 6], [550, 207, 20, 14, 15, 2], [550, 262, 17, 13, 16, 6], [550, 309, 19, 14, 15, 2], [550, 360, 22, 15, 19, 2], [550, 411, 25, 15, 21, 2], [550, 466, 18, 10, 15, 6], [550, 513, 16, 18, 11, 2], [550, 564, 16, 9, 11, 2], [550, 615, 17, 9, 12, 2], [550, 666, 24, 14, 20, 2], [550, 721, 21, 10, 18, 6], [550, 772, 18, 10, 15, 6], [611, 7, 15, 14, 14, 6], [611, 58, 14, 14, 12, 6], [611, 112, 20, 6, 19, 9], [611, 154, 21, 16, 16, 0], [611, 207, 19, 18, 15, 2], [611, 264, 18, 7, 16, 8], [611, 309, 18, 14, 17, 2], [611, 364, 19, 9, 15, 6], [611, 415, 18, 9, 15, 6], [611, 472, 23, 4, 24, 12], [611, 511, 1, 1, 15, 1], [611, 562, 20, 16, 19, 0], [611, 613, 23, 16, 19, 0], [611, 664, 22, 16, 19, 0], [611, 717, 27, 14, 22, 2], [611, 772, 22, 10, 19, 6], [672, 10, 17, 3, 15, 9], [672, 61, 25, 3, 24, 9], [672, 105, 19, 7, 14, 2], [672, 156, 19, 7, 14, 2], [672, 207, 16, 7, 12, 2], [672, 258, 16, 7, 12, 2], [672, 313, 17, 9, 16, 6], [672, 360, 18, 14, 15, 2], [672, 413, 19, 16, 15, 4], [1, 1, 1, 1, 11, 1], [794, 767, 18, 5, 13, 1], [672, 567, 19, 9, 15, 5], [672, 619, 16, 9, 12, 6], [672, 670, 15, 9, 12, 6], [672, 717, 19, 14, 16, 2], [672, 768, 20, 14, 16, 2], [733, 2, 18, 16, 15, 1], [733, 59, 14, 4, 12, 7], [733, 115, 11, 7, 12, 12], [733, 166, 14, 7, 14, 12], [733, 207, 27, 14, 24, 2], [733, 256, 21, 16, 19, 0], [733, 307, 22, 16, 17, 0], [733, 358, 21, 16, 19, 0], [733, 409, 22, 16, 17, 0], [733, 460, 22, 16, 17, 0], [733, 511, 17, 16, 12, 0], [733, 562, 17, 16, 12, 0], [733, 613, 17, 16, 12, 0], [733, 664, 17, 16, 12, 0], [733, 715, 22, 16, 19, 0], [733, 766, 22, 16, 19, 0], [1, 1, 1, 1, 11, 1], [794, 52, 22, 16, 19, 0], [794, 103, 24, 16, 19, 0], [794, 154, 24, 16, 19, 0], [794, 205, 24, 16, 19, 0], [794, 262, 13, 10, 11, 6], [794, 308, 17, 6, 12, 1], [794, 360, 17, 4, 12, 2], [794, 412, 17, 3, 12, 3], [794, 462, 17, 4, 12, 2], [794, 514, 15, 3, 12, 3], [794, 564, 16, 6, 12, 2], [794, 626, 10, 7, 12, 13], [794, 666, 17, 4, 12, 2], [794, 729, 10, 6, 12, 14], [794, 767, 18, 5, 13, 1], [855, 2, 18, 5, 13, 1], [855, 53, 18, 5, 13, 1], [855, 104, 18, 5, 13, 1], [855, 155, 18, 5, 13, 1], [855, 206, 18, 5, 13, 1], [855, 257, 18, 5, 13, 1], [855, 308, 18, 5, 13, 1], [855, 359, 18, 5, 13, 1], [855, 410, 18, 5, 13, 1], [855, 461, 18, 5, 13, 1], [855, 512, 18, 5, 13, 1], [855, 563, 18, 5, 13, 1], [855, 614, 18, 5, 13, 1], [855, 665, 18, 5, 13, 1], [855, 716, 18, 5, 13, 1], [855, 767, 18, 5, 13, 1]], \"capHeight\": 15, \"widestlogicalchar\": 24, \"widestglyph\": 28, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 15, 12, 10, 2], [1, 105, 16, 4, 11, 2], [1, 157, 18, 11, 13, 3], [1, 206, 19, 15, 13, 1], [1, 258, 23, 12, 19, 2], [1, 309, 22, 12, 18, 2], [1, 360, 13, 4, 7, 2], [1, 411, 16, 16, 10, 2], [1, 462, 14, 16, 10, 2], [1, 513, 19, 7, 13, 2], [1, 567, 17, 9, 14, 5], [1, 625, 10, 5, 10, 12], [1, 673, 13, 1, 10, 9], [1, 727, 10, 2, 10, 12], [1, 768, 15, 12, 9, 2], [62, 3, 18, 12, 13, 2], [62, 54, 16, 12, 13, 2], [62, 105, 18, 12, 13, 2], [62, 156, 18, 12, 13, 2], [62, 207, 18, 12, 13, 2], [62, 258, 19, 12, 13, 2], [62, 309, 18, 12, 13, 2], [62, 360, 19, 12, 13, 2], [62, 411, 19, 12, 13, 2], [62, 462, 18, 12, 13, 2], [62, 517, 12, 8, 9, 6], [62, 568, 13, 11, 9, 6], [62, 619, 18, 7, 14, 6], [62, 671, 18, 5, 14, 7], [62, 721, 17, 7, 14, 6], [62, 768, 18, 12, 12, 2], [123, 3, 25, 15, 21, 2], [123, 54, 18, 12, 17, 2], [123, 105, 21, 12, 16, 2], [123, 156, 22, 12, 16, 2], [123, 207, 21, 12, 17, 2], [123, 258, 21, 12, 15, 2], [123, 309, 20, 12, 14, 2], [123, 360, 22, 12, 17, 2], [123, 411, 23, 12, 17, 2], [123, 462, 16, 12, 10, 2], [123, 513, 17, 12, 11, 2], [123, 564, 22, 12, 17, 2], [123, 615, 17, 12, 15, 2], [123, 666, 26, 12, 20, 2], [123, 717, 23, 12, 17, 2], [123, 768, 21, 12, 17, 2], [184, 3, 19, 12, 14, 2], [184, 54, 21, 15, 17, 2], [184, 105, 19, 12, 16, 2], [184, 156, 20, 12, 14, 2], [184, 207, 21, 12, 15, 2], [184, 258, 23, 12, 17, 2], [184, 309, 23, 12, 17, 2], [184, 360, 27, 12, 21, 2], [184, 411, 22, 12, 17, 2], [184, 462, 22, 12, 17, 2], [184, 513, 21, 12, 15, 2], [184, 564, 16, 16, 10, 2], [184, 615, 12, 12, 9, 2], [184, 666, 15, 16, 10, 2], [184, 717, 16, 6, 12, 2], [184, 783, 13, 1, 13, 17], [245, 3, 14, 3, 10, 2], [245, 58, 15, 8, 12, 6], [245, 105, 16, 12, 13, 2], [245, 160, 16, 8, 12, 6], [245, 207, 19, 12, 13, 2], [245, 262, 15, 8, 12, 6], [245, 309, 16, 12, 10, 2], [245, 364, 18, 12, 13, 6], [245, 411, 17, 12, 13, 2], [245, 462, 14, 12, 9, 2], [245, 513, 14, 16, 9, 2], [245, 564, 17, 12, 13, 2], [245, 615, 14, 12, 9, 2], [245, 670, 22, 8, 18, 6], [245, 721, 17, 8, 13, 6], [245, 772, 16, 8, 13, 6], [306, 7, 16, 12, 13, 6], [306, 58, 16, 12, 13, 6], [306, 109, 15, 8, 10, 6], [306, 160, 15, 8, 11, 6], [306, 209, 13, 10, 9, 4], [306, 262, 17, 8, 13, 6], [306, 313, 18, 8, 13, 6], [306, 364, 22, 8, 17, 6], [306, 415, 17, 8, 13, 6], [306, 466, 18, 12, 13, 6], [306, 517, 16, 8, 12, 6], [306, 564, 17, 16, 13, 2], [306, 615, 13, 16, 8, 2], [306, 666, 16, 16, 13, 2], [306, 722, 18, 2, 14, 7], [306, 768, 13, 12, 12, 2], [367, 1, 18, 14, 17, 0], [367, 52, 21, 14, 17, 0], [367, 105, 22, 16, 16, 2], [367, 154, 21, 14, 15, 0], [367, 205, 23, 14, 17, 0], [367, 256, 21, 14, 17, 0], [367, 307, 23, 14, 17, 0], [367, 361, 15, 11, 12, 3], [367, 412, 15, 11, 12, 3], [367, 462, 16, 12, 12, 2], [367, 515, 15, 10, 12, 4], [367, 565, 17, 11, 12, 3], [367, 614, 16, 13, 12, 1], [367, 670, 16, 11, 12, 6], [367, 718, 16, 11, 12, 3], [367, 769, 15, 11, 12, 3], [428, 3, 16, 12, 12, 2], [428, 56, 15, 10, 12, 4], [428, 105, 14, 12, 9, 2], [428, 156, 14, 12, 9, 2], [428, 207, 14, 12, 9, 2], [428, 260, 13, 10, 9, 4], [428, 310, 18, 11, 13, 3], [428, 361, 16, 11, 13, 3], [428, 412, 16, 11, 13, 3], [428, 462, 16, 12, 13, 2], [428, 515, 16, 10, 13, 4], [428, 565, 18, 11, 13, 3], [428, 616, 17, 11, 13, 3], [428, 667, 17, 11, 13, 3], [428, 717, 17, 12, 13, 2], [428, 770, 17, 10, 13, 4], [489, 2, 17, 14, 13, 1], [489, 54, 15, 4, 10, 2], [489, 107, 17, 12, 13, 4], [489, 156, 18, 12, 13, 2], [489, 206, 18, 14, 13, 1], [489, 261, 14, 5, 10, 5], [489, 309, 18, 16, 12, 2], [489, 360, 18, 12, 13, 2], [489, 411, 22, 12, 18, 2], [489, 462, 22, 12, 18, 2], [489, 513, 26, 6, 20, 2], [489, 564, 15, 3, 10, 2], [489, 615, 16, 2, 10, 2], [489, 669, 18, 9, 14, 5], [489, 717, 26, 12, 20, 2], [489, 768, 22, 12, 17, 2], [550, 7, 21, 5, 17, 6], [550, 57, 16, 9, 14, 5], [550, 109, 18, 8, 14, 6], [550, 160, 17, 8, 14, 6], [550, 207, 19, 12, 13, 2], [550, 262, 16, 11, 14, 6], [550, 309, 18, 12, 13, 2], [550, 360, 21, 13, 17, 2], [550, 411, 24, 13, 19, 2], [550, 466, 17, 8, 13, 6], [550, 513, 15, 16, 9, 2], [550, 564, 15, 7, 9, 2], [550, 615, 16, 7, 10, 2], [550, 666, 23, 12, 18, 2], [550, 721, 20, 8, 16, 6], [550, 772, 17, 8, 13, 6], [611, 7, 14, 12, 12, 6], [611, 58, 13, 12, 10, 6], [611, 112, 19, 4, 17, 9], [611, 155, 20, 13, 14, 1], [611, 207, 18, 16, 13, 2], [611, 264, 17, 5, 14, 8], [611, 309, 17, 12, 15, 2], [611, 364, 18, 7, 13, 6], [611, 415, 17, 7, 13, 6], [611, 472, 22, 2, 22, 12], [611, 511, 1, 1, 13, 1], [611, 562, 19, 14, 17, 0], [611, 613, 21, 14, 17, 0], [611, 664, 21, 14, 17, 0], [611, 717, 26, 12, 20, 2], [611, 772, 21, 8, 17, 6], [672, 10, 16, 1, 13, 9], [672, 61, 24, 1, 22, 9], [672, 105, 18, 5, 12, 2], [672, 156, 18, 5, 12, 2], [672, 207, 15, 5, 10, 2], [672, 258, 15, 5, 10, 2], [672, 313, 16, 7, 14, 6], [672, 360, 17, 12, 13, 2], [672, 413, 18, 14, 13, 4], [1, 1, 1, 1, 9, 1], [794, 767, 17, 3, 11, 1], [672, 567, 18, 7, 13, 5], [672, 619, 15, 7, 10, 6], [672, 670, 14, 7, 10, 6], [672, 717, 18, 12, 14, 2], [672, 768, 19, 12, 14, 2], [733, 2, 17, 14, 13, 1], [733, 59, 13, 2, 10, 7], [733, 115, 10, 5, 10, 12], [733, 166, 13, 5, 12, 12], [733, 207, 26, 12, 22, 2], [733, 256, 20, 14, 17, 0], [733, 307, 21, 14, 15, 0], [733, 358, 19, 14, 17, 0], [733, 409, 21, 14, 15, 0], [733, 460, 21, 14, 15, 0], [733, 511, 16, 14, 10, 0], [733, 562, 16, 14, 10, 0], [733, 613, 16, 14, 10, 0], [733, 664, 16, 14, 10, 0], [733, 715, 21, 14, 17, 0], [733, 766, 21, 14, 17, 0], [1, 1, 1, 1, 9, 1], [794, 52, 21, 14, 17, 0], [794, 103, 23, 14, 17, 0], [794, 154, 23, 14, 17, 0], [794, 205, 23, 14, 17, 0], [794, 262, 12, 8, 9, 6], [794, 308, 16, 4, 10, 1], [794, 360, 16, 2, 10, 2], [794, 412, 16, 1, 10, 3], [794, 462, 16, 2, 10, 2], [794, 514, 14, 1, 10, 3], [794, 564, 15, 4, 10, 2], [794, 626, 9, 5, 10, 13], [794, 666, 16, 2, 10, 2], [794, 729, 9, 4, 10, 14], [794, 767, 17, 3, 11, 1], [855, 2, 17, 3, 11, 1], [855, 53, 17, 3, 11, 1], [855, 104, 17, 3, 11, 1], [855, 155, 17, 3, 11, 1], [855, 206, 17, 3, 11, 1], [855, 257, 17, 3, 11, 1], [855, 308, 17, 3, 11, 1], [855, 359, 17, 3, 11, 1], [855, 410, 17, 3, 11, 1], [855, 461, 17, 3, 11, 1], [855, 512, 17, 3, 11, 1], [855, 563, 17, 3, 11, 1], [855, 614, 17, 3, 11, 1], [855, 665, 17, 3, 11, 1], [855, 716, 17, 3, 11, 1], [855, 767, 17, 3, 11, 1]], \"capHeight\": 14, \"widestlogicalchar\": 22, \"widestglyph\": 27, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 11, 6, 11, 9], [1, 54, 12, 14, 12, 2], [1, 105, 13, 13, 13, 2], [1, 157, 15, 13, 15, 3], [1, 206, 15, 17, 15, 1], [1, 258, 21, 14, 21, 2], [1, 309, 20, 14, 20, 2], [1, 360, 9, 13, 9, 2], [1, 411, 12, 18, 12, 2], [1, 462, 12, 18, 12, 2], [1, 513, 15, 13, 15, 2], [1, 567, 16, 11, 16, 5], [1, 622, 12, 10, 12, 9], [1, 673, 12, 6, 12, 9], [1, 724, 12, 7, 12, 9], [1, 768, 11, 14, 11, 2], [62, 3, 15, 14, 15, 2], [62, 54, 15, 14, 15, 2], [62, 105, 15, 14, 15, 2], [62, 156, 15, 14, 15, 2], [62, 207, 15, 14, 15, 2], [62, 258, 15, 14, 15, 2], [62, 309, 15, 14, 15, 2], [62, 360, 15, 14, 15, 2], [62, 411, 15, 14, 15, 2], [62, 462, 15, 14, 15, 2], [62, 517, 11, 10, 11, 6], [62, 568, 11, 13, 11, 6], [62, 619, 16, 9, 16, 6], [62, 671, 16, 8, 16, 7], [62, 721, 16, 9, 16, 6], [62, 768, 14, 14, 14, 2], [123, 3, 23, 17, 23, 2], [123, 54, 19, 14, 19, 2], [123, 105, 18, 14, 18, 2], [123, 156, 18, 14, 18, 2], [123, 207, 19, 14, 19, 2], [123, 258, 17, 14, 17, 2], [123, 309, 16, 14, 16, 2], [123, 360, 19, 14, 19, 2], [123, 411, 19, 14, 19, 2], [123, 462, 12, 14, 12, 2], [123, 513, 13, 14, 13, 2], [123, 564, 19, 14, 19, 2], [123, 615, 17, 14, 17, 2], [123, 666, 22, 14, 22, 2], [123, 717, 19, 14, 19, 2], [123, 768, 19, 14, 19, 2], [184, 3, 16, 14, 16, 2], [184, 54, 19, 17, 19, 2], [184, 105, 18, 14, 18, 2], [184, 156, 16, 14, 16, 2], [184, 207, 17, 14, 17, 2], [184, 258, 19, 14, 19, 2], [184, 309, 19, 14, 19, 2], [184, 360, 23, 14, 23, 2], [184, 411, 19, 14, 19, 2], [184, 462, 19, 14, 19, 2], [184, 513, 17, 14, 17, 2], [184, 564, 12, 18, 12, 2], [184, 615, 11, 14, 11, 2], [184, 666, 12, 18, 12, 2], [184, 717, 14, 13, 14, 2], [184, 775, 15, 11, 15, 9], [245, 3, 12, 13, 12, 2], [245, 58, 14, 10, 14, 6], [245, 105, 15, 14, 15, 2], [245, 160, 14, 10, 14, 6], [245, 207, 15, 14, 15, 2], [245, 262, 14, 10, 14, 6], [245, 309, 12, 14, 12, 2], [245, 364, 15, 14, 15, 6], [245, 411, 15, 14, 15, 2], [245, 462, 11, 14, 11, 2], [245, 513, 11, 18, 11, 2], [245, 564, 15, 14, 15, 2], [245, 615, 11, 14, 11, 2], [245, 670, 20, 10, 20, 6], [245, 721, 15, 10, 15, 6], [245, 772, 15, 10, 15, 6], [306, 7, 15, 14, 15, 6], [306, 58, 15, 14, 15, 6], [306, 109, 12, 10, 12, 6], [306, 160, 13, 10, 13, 6], [306, 209, 11, 12, 11, 4], [306, 262, 15, 10, 15, 6], [306, 313, 15, 10, 15, 6], [306, 364, 19, 10, 19, 6], [306, 415, 15, 10, 15, 6], [306, 466, 15, 14, 15, 6], [306, 517, 14, 10, 14, 6], [306, 564, 15, 18, 15, 2], [306, 615, 10, 18, 10, 2], [306, 666, 15, 18, 15, 2], [306, 722, 16, 8, 16, 7], [306, 768, 14, 14, 14, 2], [367, 1, 19, 16, 19, 0], [367, 52, 19, 16, 19, 0], [367, 105, 18, 18, 18, 2], [367, 154, 17, 16, 17, 0], [367, 205, 19, 16, 19, 0], [367, 256, 19, 16, 19, 0], [367, 307, 19, 16, 19, 0], [367, 361, 14, 13, 14, 3], [367, 412, 14, 13, 14, 3], [367, 462, 14, 14, 14, 2], [367, 515, 14, 12, 14, 4], [367, 565, 14, 13, 14, 3], [367, 614, 14, 15, 14, 1], [367, 670, 14, 13, 14, 6], [367, 718, 14, 13, 14, 3], [367, 769, 14, 13, 14, 3], [428, 3, 14, 14, 14, 2], [428, 56, 14, 12, 14, 4], [428, 105, 11, 14, 11, 2], [428, 156, 11, 14, 11, 2], [428, 207, 11, 14, 11, 2], [428, 260, 11, 12, 11, 4], [428, 310, 15, 13, 15, 3], [428, 361, 15, 13, 15, 3], [428, 412, 15, 13, 15, 3], [428, 462, 15, 14, 15, 2], [428, 515, 15, 12, 15, 4], [428, 565, 15, 13, 15, 3], [428, 616, 15, 13, 15, 3], [428, 667, 15, 13, 15, 3], [428, 717, 15, 14, 15, 2], [428, 770, 15, 12, 15, 4], [489, 2, 15, 16, 15, 1], [489, 54, 12, 13, 12, 2], [489, 107, 15, 14, 15, 4], [489, 156, 15, 14, 15, 2], [489, 206, 15, 16, 15, 1], [489, 261, 12, 10, 12, 5], [489, 309, 14, 18, 14, 2], [489, 360, 15, 14, 15, 2], [489, 411, 20, 14, 20, 2], [489, 462, 20, 14, 20, 2], [489, 513, 22, 13, 22, 2], [489, 564, 12, 13, 12, 2], [489, 615, 12, 13, 12, 2], [489, 669, 16, 11, 16, 5], [489, 717, 22, 14, 22, 2], [489, 768, 19, 14, 19, 2], [550, 7, 19, 9, 19, 6], [550, 57, 16, 11, 16, 5], [550, 109, 16, 10, 16, 6], [550, 160, 16, 10, 16, 6], [550, 207, 15, 14, 15, 2], [550, 262, 16, 13, 16, 6], [550, 309, 15, 14, 15, 2], [550, 360, 19, 15, 19, 2], [550, 411, 21, 15, 21, 2], [550, 466, 15, 10, 15, 6], [550, 513, 11, 18, 11, 2], [550, 564, 11, 13, 11, 2], [550, 615, 12, 13, 12, 2], [550, 666, 20, 14, 20, 2], [550, 721, 18, 10, 18, 6], [550, 772, 15, 10, 15, 6], [611, 7, 14, 14, 14, 6], [611, 58, 12, 14, 12, 6], [611, 112, 19, 6, 19, 9], [611, 154, 16, 16, 16, 0], [611, 207, 15, 18, 15, 2], [611, 264, 16, 7, 16, 8], [611, 309, 17, 14, 17, 2], [611, 364, 15, 9, 15, 6], [611, 415, 15, 9, 15, 6], [611, 469, 24, 7, 24, 9], [611, 520, 15, 6, 15, 9], [611, 562, 19, 16, 19, 0], [611, 613, 19, 16, 19, 0], [611, 664, 19, 16, 19, 0], [611, 717, 22, 14, 22, 2], [611, 772, 19, 10, 19, 6], [672, 10, 15, 6, 15, 9], [672, 61, 24, 6, 24, 9], [672, 105, 14, 13, 14, 2], [672, 156, 14, 13, 14, 2], [672, 207, 12, 13, 12, 2], [672, 258, 12, 13, 12, 2], [672, 313, 16, 9, 16, 6], [672, 360, 15, 14, 15, 2], [672, 413, 15, 16, 15, 4], [1, 10, 11, 6, 11, 9], [794, 767, 13, 14, 13, 1], [672, 567, 15, 10, 15, 5], [672, 619, 12, 9, 12, 6], [672, 670, 12, 9, 12, 6], [672, 717, 16, 14, 16, 2], [672, 768, 16, 14, 16, 2], [733, 2, 15, 16, 15, 1], [733, 59, 12, 8, 12, 7], [733, 112, 12, 10, 12, 9], [733, 163, 14, 10, 14, 9], [733, 207, 24, 14, 24, 2], [733, 256, 19, 16, 19, 0], [733, 307, 17, 16, 17, 0], [733, 358, 19, 16, 19, 0], [733, 409, 17, 16, 17, 0], [733, 460, 17, 16, 17, 0], [733, 511, 12, 16, 12, 0], [733, 562, 12, 16, 12, 0], [733, 613, 12, 16, 12, 0], [733, 664, 12, 16, 12, 0], [733, 715, 19, 16, 19, 0], [733, 766, 19, 16, 19, 0], [1, 10, 11, 6, 11, 9], [794, 52, 19, 16, 19, 0], [794, 103, 19, 16, 19, 0], [794, 154, 19, 16, 19, 0], [794, 205, 19, 16, 19, 0], [794, 262, 11, 10, 11, 6], [794, 308, 12, 14, 12, 1], [794, 360, 12, 13, 12, 2], [794, 412, 12, 12, 12, 3], [794, 462, 12, 13, 12, 2], [794, 514, 12, 12, 12, 3], [794, 564, 12, 13, 12, 2], [794, 622, 12, 11, 12, 9], [794, 666, 12, 13, 12, 2], [794, 724, 12, 11, 12, 9], [794, 767, 13, 14, 13, 1], [855, 2, 13, 14, 13, 1], [855, 53, 13, 14, 13, 1], [855, 104, 13, 14, 13, 1], [855, 155, 13, 14, 13, 1], [855, 206, 13, 14, 13, 1], [855, 257, 13, 14, 13, 1], [855, 308, 13, 14, 13, 1], [855, 359, 13, 14, 13, 1], [855, 410, 13, 14, 13, 1], [855, 461, 13, 14, 13, 1], [855, 512, 13, 14, 13, 1], [855, 563, 13, 14, 13, 1], [855, 614, 13, 14, 13, 1], [855, 665, 13, 14, 13, 1], [855, 716, 13, 14, 13, 1], [855, 767, 13, 14, 13, 1]], \"widestlogicalchar\": 24, \"widestglyph\": 24, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 9, 6, 9, 8], [1, 54, 10, 12, 10, 2], [1, 105, 11, 12, 11, 2], [1, 157, 13, 11, 13, 3], [1, 206, 13, 15, 13, 1], [1, 258, 19, 12, 19, 2], [1, 309, 18, 12, 18, 2], [1, 360, 7, 12, 7, 2], [1, 411, 10, 16, 10, 2], [1, 462, 10, 16, 10, 2], [1, 513, 13, 12, 13, 2], [1, 567, 14, 9, 14, 5], [1, 621, 10, 9, 10, 8], [1, 672, 10, 6, 10, 8], [1, 723, 10, 6, 10, 8], [1, 768, 9, 12, 9, 2], [62, 3, 13, 12, 13, 2], [62, 54, 13, 12, 13, 2], [62, 105, 13, 12, 13, 2], [62, 156, 13, 12, 13, 2], [62, 207, 13, 12, 13, 2], [62, 258, 13, 12, 13, 2], [62, 309, 13, 12, 13, 2], [62, 360, 13, 12, 13, 2], [62, 411, 13, 12, 13, 2], [62, 462, 13, 12, 13, 2], [62, 517, 9, 8, 9, 6], [62, 568, 9, 11, 9, 6], [62, 619, 14, 8, 14, 6], [62, 671, 14, 7, 14, 7], [62, 721, 14, 8, 14, 6], [62, 768, 12, 12, 12, 2], [123, 3, 21, 15, 21, 2], [123, 54, 17, 12, 17, 2], [123, 105, 16, 12, 16, 2], [123, 156, 16, 12, 16, 2], [123, 207, 17, 12, 17, 2], [123, 258, 15, 12, 15, 2], [123, 309, 14, 12, 14, 2], [123, 360, 17, 12, 17, 2], [123, 411, 17, 12, 17, 2], [123, 462, 10, 12, 10, 2], [123, 513, 11, 12, 11, 2], [123, 564, 17, 12, 17, 2], [123, 615, 15, 12, 15, 2], [123, 666, 20, 12, 20, 2], [123, 717, 17, 12, 17, 2], [123, 768, 17, 12, 17, 2], [184, 3, 14, 12, 14, 2], [184, 54, 17, 15, 17, 2], [184, 105, 16, 12, 16, 2], [184, 156, 14, 12, 14, 2], [184, 207, 15, 12, 15, 2], [184, 258, 17, 12, 17, 2], [184, 309, 17, 12, 17, 2], [184, 360, 21, 12, 21, 2], [184, 411, 17, 12, 17, 2], [184, 462, 17, 12, 17, 2], [184, 513, 15, 12, 15, 2], [184, 564, 10, 16, 10, 2], [184, 615, 9, 12, 9, 2], [184, 666, 10, 16, 10, 2], [184, 717, 12, 12, 12, 2], [184, 774, 13, 10, 13, 8], [245, 3, 10, 12, 10, 2], [245, 58, 12, 8, 12, 6], [245, 105, 13, 12, 13, 2], [245, 160, 12, 8, 12, 6], [245, 207, 13, 12, 13, 2], [245, 262, 12, 8, 12, 6], [245, 309, 10, 12, 10, 2], [245, 364, 13, 12, 13, 6], [245, 411, 13, 12, 13, 2], [245, 462, 9, 12, 9, 2], [245, 513, 9, 16, 9, 2], [245, 564, 13, 12, 13, 2], [245, 615, 9, 12, 9, 2], [245, 670, 18, 8, 18, 6], [245, 721, 13, 8, 13, 6], [245, 772, 13, 8, 13, 6], [306, 7, 13, 12, 13, 6], [306, 58, 13, 12, 13, 6], [306, 109, 10, 8, 10, 6], [306, 160, 11, 8, 11, 6], [306, 209, 9, 10, 9, 4], [306, 262, 13, 8, 13, 6], [306, 313, 13, 8, 13, 6], [306, 364, 17, 8, 17, 6], [306, 415, 13, 8, 13, 6], [306, 466, 13, 12, 13, 6], [306, 517, 12, 8, 12, 6], [306, 564, 13, 16, 13, 2], [306, 615, 8, 16, 8, 2], [306, 666, 13, 16, 13, 2], [306, 722, 14, 7, 14, 7], [306, 768, 12, 12, 12, 2], [367, 1, 17, 14, 17, 0], [367, 52, 17, 14, 17, 0], [367, 105, 16, 16, 16, 2], [367, 154, 15, 14, 15, 0], [367, 205, 17, 14, 17, 0], [367, 256, 17, 14, 17, 0], [367, 307, 17, 14, 17, 0], [367, 361, 12, 11, 12, 3], [367, 412, 12, 11, 12, 3], [367, 462, 12, 12, 12, 2], [367, 515, 12, 10, 12, 4], [367, 565, 12, 11, 12, 3], [367, 614, 12, 13, 12, 1], [367, 670, 12, 11, 12, 6], [367, 718, 12, 11, 12, 3], [367, 769, 12, 11, 12, 3], [428, 3, 12, 12, 12, 2], [428, 56, 12, 10, 12, 4], [428, 105, 9, 12, 9, 2], [428, 156, 9, 12, 9, 2], [428, 207, 9, 12, 9, 2], [428, 260, 9, 10, 9, 4], [428, 310, 13, 11, 13, 3], [428, 361, 13, 11, 13, 3], [428, 412, 13, 11, 13, 3], [428, 462, 13, 12, 13, 2], [428, 515, 13, 10, 13, 4], [428, 565, 13, 11, 13, 3], [428, 616, 13, 11, 13, 3], [428, 667, 13, 11, 13, 3], [428, 717, 13, 12, 13, 2], [428, 770, 13, 10, 13, 4], [489, 2, 13, 14, 13, 1], [489, 54, 10, 12, 10, 2], [489, 107, 13, 12, 13, 4], [489, 156, 13, 12, 13, 2], [489, 206, 13, 14, 13, 1], [489, 261, 10, 9, 10, 5], [489, 309, 12, 16, 12, 2], [489, 360, 13, 12, 13, 2], [489, 411, 18, 12, 18, 2], [489, 462, 18, 12, 18, 2], [489, 513, 20, 12, 20, 2], [489, 564, 10, 12, 10, 2], [489, 615, 10, 12, 10, 2], [489, 669, 14, 9, 14, 5], [489, 717, 20, 12, 20, 2], [489, 768, 17, 12, 17, 2], [550, 7, 17, 8, 17, 6], [550, 57, 14, 9, 14, 5], [550, 109, 14, 8, 14, 6], [550, 160, 14, 8, 14, 6], [550, 207, 13, 12, 13, 2], [550, 262, 14, 11, 14, 6], [550, 309, 13, 12, 13, 2], [550, 360, 17, 13, 17, 2], [550, 411, 19, 13, 19, 2], [550, 466, 13, 8, 13, 6], [550, 513, 9, 16, 9, 2], [550, 564, 9, 12, 9, 2], [550, 615, 10, 12, 10, 2], [550, 666, 18, 12, 18, 2], [550, 721, 16, 8, 16, 6], [550, 772, 13, 8, 13, 6], [611, 7, 12, 12, 12, 6], [611, 58, 10, 12, 10, 6], [611, 111, 17, 6, 17, 8], [611, 154, 14, 14, 14, 0], [611, 207, 13, 16, 13, 2], [611, 264, 14, 6, 14, 8], [611, 309, 15, 12, 15, 2], [611, 364, 13, 8, 13, 6], [611, 415, 13, 8, 13, 6], [611, 468, 22, 6, 22, 8], [611, 519, 13, 6, 13, 8], [611, 562, 17, 14, 17, 0], [611, 613, 17, 14, 17, 0], [611, 664, 17, 14, 17, 0], [611, 717, 20, 12, 20, 2], [611, 772, 17, 8, 17, 6], [672, 9, 13, 6, 13, 8], [672, 60, 22, 6, 22, 8], [672, 105, 12, 12, 12, 2], [672, 156, 12, 12, 12, 2], [672, 207, 10, 12, 10, 2], [672, 258, 10, 12, 10, 2], [672, 313, 14, 8, 14, 6], [672, 360, 13, 12, 13, 2], [672, 413, 13, 14, 13, 4], [1, 9, 9, 6, 9, 8], [794, 767, 11, 13, 11, 1], [672, 567, 13, 9, 13, 5], [672, 619, 10, 8, 10, 6], [672, 670, 10, 8, 10, 6], [672, 717, 14, 12, 14, 2], [672, 768, 14, 12, 14, 2], [733, 2, 13, 14, 13, 1], [733, 59, 10, 7, 10, 7], [733, 111, 10, 9, 10, 8], [733, 162, 12, 9, 12, 8], [733, 207, 22, 12, 22, 2], [733, 256, 17, 14, 17, 0], [733, 307, 15, 14, 15, 0], [733, 358, 17, 14, 17, 0], [733, 409, 15, 14, 15, 0], [733, 460, 15, 14, 15, 0], [733, 511, 10, 14, 10, 0], [733, 562, 10, 14, 10, 0], [733, 613, 10, 14, 10, 0], [733, 664, 10, 14, 10, 0], [733, 715, 17, 14, 17, 0], [733, 766, 17, 14, 17, 0], [1, 9, 9, 6, 9, 8], [794, 52, 17, 14, 17, 0], [794, 103, 17, 14, 17, 0], [794, 154, 17, 14, 17, 0], [794, 205, 17, 14, 17, 0], [794, 262, 9, 8, 9, 6], [794, 308, 10, 13, 10, 1], [794, 360, 10, 12, 10, 2], [794, 412, 10, 11, 10, 3], [794, 462, 10, 12, 10, 2], [794, 514, 10, 11, 10, 3], [794, 564, 10, 12, 10, 2], [794, 621, 10, 10, 10, 8], [794, 666, 10, 12, 10, 2], [794, 723, 10, 10, 10, 8], [794, 767, 11, 13, 11, 1], [855, 2, 11, 13, 11, 1], [855, 53, 11, 13, 11, 1], [855, 104, 11, 13, 11, 1], [855, 155, 11, 13, 11, 1], [855, 206, 11, 13, 11, 1], [855, 257, 11, 13, 11, 1], [855, 308, 11, 13, 11, 1], [855, 359, 11, 13, 11, 1], [855, 410, 11, 13, 11, 1], [855, 461, 11, 13, 11, 1], [855, 512, 11, 13, 11, 1], [855, 563, 11, 13, 11, 1], [855, 614, 11, 13, 11, 1], [855, 665, 11, 13, 11, 1], [855, 716, 11, 13, 11, 1], [855, 767, 11, 13, 11, 1]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 15, 14, 10, 2], [1, 105, 16, 6, 11, 2], [1, 157, 18, 13, 13, 3], [1, 206, 19, 17, 13, 1], [1, 258, 23, 14, 19, 2], [1, 309, 22, 14, 18, 2], [1, 360, 13, 6, 7, 2], [1, 411, 16, 18, 10, 2], [1, 462, 14, 18, 10, 2], [1, 513, 19, 9, 13, 2], [1, 567, 17, 11, 14, 5], [1, 625, 10, 7, 10, 12], [1, 673, 13, 3, 10, 9], [1, 727, 10, 4, 10, 12], [1, 768, 15, 14, 9, 2], [62, 3, 18, 14, 13, 2], [62, 54, 16, 14, 13, 2], [62, 105, 18, 14, 13, 2], [62, 156, 18, 14, 13, 2], [62, 207, 18, 14, 13, 2], [62, 258, 19, 14, 13, 2], [62, 309, 18, 14, 13, 2], [62, 360, 19, 14, 13, 2], [62, 411, 19, 14, 13, 2], [62, 462, 18, 14, 13, 2], [62, 517, 12, 10, 9, 6], [62, 568, 13, 13, 9, 6], [62, 619, 18, 9, 14, 6], [62, 671, 18, 7, 14, 7], [62, 721, 17, 9, 14, 6], [62, 768, 18, 14, 12, 2], [123, 3, 25, 17, 21, 2], [123, 54, 18, 14, 17, 2], [123, 105, 21, 14, 16, 2], [123, 156, 22, 14, 16, 2], [123, 207, 21, 14, 17, 2], [123, 258, 21, 14, 15, 2], [123, 309, 20, 14, 14, 2], [123, 360, 22, 14, 17, 2], [123, 411, 23, 14, 17, 2], [123, 462, 16, 14, 10, 2], [123, 513, 17, 14, 11, 2], [123, 564, 22, 14, 17, 2], [123, 615, 17, 14, 15, 2], [123, 666, 26, 14, 20, 2], [123, 717, 23, 14, 17, 2], [123, 768, 21, 14, 17, 2], [184, 3, 19, 14, 14, 2], [184, 54, 21, 17, 17, 2], [184, 105, 19, 14, 16, 2], [184, 156, 20, 14, 14, 2], [184, 207, 21, 14, 15, 2], [184, 258, 23, 14, 17, 2], [184, 309, 23, 14, 17, 2], [184, 360, 27, 14, 21, 2], [184, 411, 22, 14, 17, 2], [184, 462, 22, 14, 17, 2], [184, 513, 21, 14, 15, 2], [184, 564, 16, 18, 10, 2], [184, 615, 12, 14, 9, 2], [184, 666, 15, 18, 10, 2], [184, 717, 16, 8, 12, 2], [184, 783, 13, 3, 13, 17], [245, 3, 14, 5, 10, 2], [245, 58, 15, 10, 12, 6], [245, 105, 16, 14, 13, 2], [245, 160, 16, 10, 12, 6], [245, 207, 19, 14, 13, 2], [245, 262, 15, 10, 12, 6], [245, 309, 16, 14, 10, 2], [245, 364, 18, 14, 13, 6], [245, 411, 17, 14, 13, 2], [245, 462, 14, 14, 9, 2], [245, 513, 14, 18, 9, 2], [245, 564, 17, 14, 13, 2], [245, 615, 14, 14, 9, 2], [245, 670, 22, 10, 18, 6], [245, 721, 17, 10, 13, 6], [245, 772, 16, 10, 13, 6], [306, 7, 16, 14, 13, 6], [306, 58, 16, 14, 13, 6], [306, 109, 15, 10, 10, 6], [306, 160, 15, 10, 11, 6], [306, 209, 13, 12, 9, 4], [306, 262, 17, 10, 13, 6], [306, 313, 18, 10, 13, 6], [306, 364, 22, 10, 17, 6], [306, 415, 17, 10, 13, 6], [306, 466, 18, 14, 13, 6], [306, 517, 16, 10, 12, 6], [306, 564, 17, 18, 13, 2], [306, 615, 13, 18, 8, 2], [306, 666, 16, 18, 13, 2], [306, 722, 18, 4, 14, 7], [306, 768, 13, 14, 12, 2], [367, 1, 21, 16, 17, 0], [367, 52, 21, 16, 17, 0], [367, 105, 22, 18, 16, 2], [367, 154, 21, 16, 15, 0], [367, 205, 23, 16, 17, 0], [367, 256, 21, 16, 17, 0], [367, 307, 23, 16, 17, 0], [367, 361, 15, 13, 12, 3], [367, 412, 15, 13, 12, 3], [367, 462, 16, 14, 12, 2], [367, 515, 15, 12, 12, 4], [367, 565, 17, 13, 12, 3], [367, 614, 16, 15, 12, 1], [367, 670, 16, 13, 12, 6], [367, 718, 16, 13, 12, 3], [367, 769, 15, 13, 12, 3], [428, 3, 16, 14, 12, 2], [428, 56, 15, 12, 12, 4], [428, 105, 14, 14, 9, 2], [428, 156, 14, 14, 9, 2], [428, 207, 14, 14, 9, 2], [428, 260, 13, 12, 9, 4], [428, 310, 18, 13, 13, 3], [428, 361, 16, 13, 13, 3], [428, 412, 16, 13, 13, 3], [428, 462, 16, 14, 13, 2], [428, 515, 16, 12, 13, 4], [428, 565, 18, 13, 13, 3], [428, 616, 17, 13, 13, 3], [428, 667, 17, 13, 13, 3], [428, 717, 17, 14, 13, 2], [428, 770, 17, 12, 13, 4], [489, 2, 17, 16, 13, 1], [489, 54, 15, 6, 10, 2], [489, 107, 17, 14, 13, 4], [489, 156, 18, 14, 13, 2], [489, 206, 18, 16, 13, 1], [489, 261, 14, 7, 10, 5], [489, 309, 18, 18, 12, 2], [489, 360, 18, 14, 13, 2], [489, 411, 22, 14, 18, 2], [489, 462, 22, 14, 18, 2], [489, 513, 26, 8, 20, 2], [489, 564, 15, 5, 10, 2], [489, 615, 16, 4, 10, 2], [489, 669, 18, 11, 14, 5], [489, 717, 26, 14, 20, 2], [489, 768, 22, 14, 17, 2], [550, 7, 21, 7, 17, 6], [550, 57, 16, 11, 14, 5], [550, 109, 18, 10, 14, 6], [550, 160, 17, 10, 14, 6], [550, 207, 19, 14, 13, 2], [550, 262, 16, 13, 14, 6], [550, 309, 18, 14, 13, 2], [550, 360, 21, 15, 17, 2], [550, 411, 24, 15, 19, 2], [550, 466, 17, 10, 13, 6], [550, 513, 15, 18, 9, 2], [550, 564, 15, 9, 9, 2], [550, 615, 16, 9, 10, 2], [550, 666, 23, 14, 18, 2], [550, 721, 20, 10, 16, 6], [550, 772, 17, 10, 13, 6], [611, 7, 14, 14, 12, 6], [611, 58, 13, 14, 10, 6], [611, 112, 19, 6, 17, 9], [611, 154, 20, 16, 14, 0], [611, 207, 18, 18, 13, 2], [611, 264, 17, 7, 14, 8], [611, 309, 17, 14, 15, 2], [611, 364, 18, 9, 13, 6], [611, 415, 17, 9, 13, 6], [611, 472, 22, 4, 22, 12], [611, 511, 1, 1, 13, 1], [611, 562, 19, 16, 17, 0], [611, 613, 22, 16, 17, 0], [611, 664, 21, 16, 17, 0], [611, 717, 26, 14, 20, 2], [611, 772, 21, 10, 17, 6], [672, 10, 16, 3, 13, 9], [672, 61, 24, 3, 22, 9], [672, 105, 18, 7, 12, 2], [672, 156, 18, 7, 12, 2], [672, 207, 15, 7, 10, 2], [672, 258, 15, 7, 10, 2], [672, 313, 16, 9, 14, 6], [672, 360, 17, 14, 13, 2], [672, 413, 18, 16, 13, 4], [1, 1, 1, 1, 9, 1], [794, 767, 17, 5, 11, 1], [672, 567, 18, 9, 13, 5], [672, 619, 15, 9, 10, 6], [672, 670, 14, 9, 10, 6], [672, 717, 18, 14, 14, 2], [672, 768, 19, 14, 14, 2], [733, 2, 17, 16, 13, 1], [733, 59, 13, 4, 10, 7], [733, 115, 10, 7, 10, 12], [733, 166, 13, 7, 12, 12], [733, 207, 26, 14, 22, 2], [733, 256, 20, 16, 17, 0], [733, 307, 21, 16, 15, 0], [733, 358, 20, 16, 17, 0], [733, 409, 21, 16, 15, 0], [733, 460, 21, 16, 15, 0], [733, 511, 16, 16, 10, 0], [733, 562, 16, 16, 10, 0], [733, 613, 16, 16, 10, 0], [733, 664, 16, 16, 10, 0], [733, 715, 21, 16, 17, 0], [733, 766, 21, 16, 17, 0], [1, 1, 1, 1, 9, 1], [794, 52, 21, 16, 17, 0], [794, 103, 23, 16, 17, 0], [794, 154, 23, 16, 17, 0], [794, 205, 23, 16, 17, 0], [794, 262, 12, 10, 9, 6], [794, 308, 16, 6, 10, 1], [794, 360, 16, 4, 10, 2], [794, 412, 16, 3, 10, 3], [794, 462, 16, 4, 10, 2], [794, 514, 14, 3, 10, 3], [794, 564, 15, 6, 10, 2], [794, 626, 9, 7, 10, 13], [794, 666, 16, 4, 10, 2], [794, 729, 9, 6, 10, 14], [794, 767, 17, 5, 11, 1], [855, 2, 17, 5, 11, 1], [855, 53, 17, 5, 11, 1], [855, 104, 17, 5, 11, 1], [855, 155, 17, 5, 11, 1], [855, 206, 17, 5, 11, 1], [855, 257, 17, 5, 11, 1], [855, 308, 17, 5, 11, 1], [855, 359, 17, 5, 11, 1], [855, 410, 17, 5, 11, 1], [855, 461, 17, 5, 11, 1], [855, 512, 17, 5, 11, 1], [855, 563, 17, 5, 11, 1], [855, 614, 17, 5, 11, 1], [855, 665, 17, 5, 11, 1], [855, 716, 17, 5, 11, 1], [855, 767, 17, 5, 11, 1]], \"capHeight\": 15, \"widestlogicalchar\": 22, \"widestglyph\": 27, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 14, 12, 9, 2], [1, 105, 15, 4, 10, 2], [1, 157, 17, 11, 12, 3], [1, 206, 18, 15, 12, 1], [1, 258, 22, 12, 18, 2], [1, 309, 21, 12, 17, 2], [1, 360, 12, 4, 6, 2], [1, 411, 15, 16, 9, 2], [1, 462, 13, 16, 9, 2], [1, 513, 18, 7, 12, 2], [1, 567, 16, 9, 13, 5], [1, 625, 9, 5, 9, 12], [1, 673, 12, 1, 9, 9], [1, 727, 9, 2, 9, 12], [1, 768, 14, 12, 8, 2], [62, 3, 17, 12, 12, 2], [62, 54, 15, 12, 12, 2], [62, 105, 17, 12, 12, 2], [62, 156, 17, 12, 12, 2], [62, 207, 17, 12, 12, 2], [62, 258, 18, 12, 12, 2], [62, 309, 17, 12, 12, 2], [62, 360, 18, 12, 12, 2], [62, 411, 18, 12, 12, 2], [62, 462, 17, 12, 12, 2], [62, 517, 11, 8, 8, 6], [62, 568, 12, 11, 8, 6], [62, 619, 17, 7, 13, 6], [62, 671, 17, 5, 13, 7], [62, 721, 16, 7, 13, 6], [62, 768, 17, 12, 11, 2], [123, 3, 24, 15, 20, 2], [123, 54, 17, 12, 16, 2], [123, 105, 20, 12, 15, 2], [123, 156, 21, 12, 15, 2], [123, 207, 20, 12, 16, 2], [123, 258, 20, 12, 14, 2], [123, 309, 19, 12, 13, 2], [123, 360, 21, 12, 16, 2], [123, 411, 22, 12, 16, 2], [123, 462, 15, 12, 9, 2], [123, 513, 16, 12, 10, 2], [123, 564, 21, 12, 16, 2], [123, 615, 16, 12, 14, 2], [123, 666, 25, 12, 19, 2], [123, 717, 22, 12, 16, 2], [123, 768, 20, 12, 16, 2], [184, 3, 18, 12, 13, 2], [184, 54, 20, 15, 16, 2], [184, 105, 18, 12, 15, 2], [184, 156, 19, 12, 13, 2], [184, 207, 20, 12, 14, 2], [184, 258, 22, 12, 16, 2], [184, 309, 22, 12, 16, 2], [184, 360, 26, 12, 20, 2], [184, 411, 21, 12, 16, 2], [184, 462, 21, 12, 16, 2], [184, 513, 20, 12, 14, 2], [184, 564, 15, 16, 9, 2], [184, 615, 11, 12, 8, 2], [184, 666, 14, 16, 9, 2], [184, 717, 15, 6, 11, 2], [184, 783, 12, 1, 12, 17], [245, 3, 13, 3, 9, 2], [245, 58, 14, 8, 11, 6], [245, 105, 15, 12, 12, 2], [245, 160, 15, 8, 11, 6], [245, 207, 18, 12, 12, 2], [245, 262, 14, 8, 11, 6], [245, 309, 15, 12, 9, 2], [245, 364, 17, 12, 12, 6], [245, 411, 16, 12, 12, 2], [245, 462, 13, 12, 8, 2], [245, 513, 13, 16, 8, 2], [245, 564, 16, 12, 12, 2], [245, 615, 13, 12, 8, 2], [245, 670, 21, 8, 17, 6], [245, 721, 16, 8, 12, 6], [245, 772, 15, 8, 12, 6], [306, 7, 15, 12, 12, 6], [306, 58, 15, 12, 12, 6], [306, 109, 14, 8, 9, 6], [306, 160, 14, 8, 10, 6], [306, 209, 12, 10, 8, 4], [306, 262, 16, 8, 12, 6], [306, 313, 17, 8, 12, 6], [306, 364, 21, 8, 16, 6], [306, 415, 16, 8, 12, 6], [306, 466, 17, 12, 12, 6], [306, 517, 15, 8, 11, 6], [306, 564, 16, 16, 12, 2], [306, 615, 12, 16, 7, 2], [306, 666, 15, 16, 12, 2], [306, 722, 17, 2, 13, 7], [306, 768, 12, 12, 11, 2], [367, 1, 17, 14, 16, 0], [367, 52, 20, 14, 16, 0], [367, 105, 21, 16, 15, 2], [367, 154, 20, 14, 14, 0], [367, 205, 22, 14, 16, 0], [367, 256, 20, 14, 16, 0], [367, 307, 22, 14, 16, 0], [367, 361, 14, 11, 11, 3], [367, 412, 14, 11, 11, 3], [367, 462, 15, 12, 11, 2], [367, 515, 14, 10, 11, 4], [367, 565, 16, 11, 11, 3], [367, 614, 15, 13, 11, 1], [367, 670, 15, 11, 11, 6], [367, 718, 15, 11, 11, 3], [367, 769, 14, 11, 11, 3], [428, 3, 15, 12, 11, 2], [428, 56, 14, 10, 11, 4], [428, 105, 13, 12, 8, 2], [428, 156, 13, 12, 8, 2], [428, 207, 13, 12, 8, 2], [428, 260, 12, 10, 8, 4], [428, 310, 17, 11, 12, 3], [428, 361, 15, 11, 12, 3], [428, 412, 15, 11, 12, 3], [428, 462, 15, 12, 12, 2], [428, 515, 15, 10, 12, 4], [428, 565, 17, 11, 12, 3], [428, 616, 16, 11, 12, 3], [428, 667, 16, 11, 12, 3], [428, 717, 16, 12, 12, 2], [428, 770, 16, 10, 12, 4], [489, 2, 16, 14, 12, 1], [489, 54, 14, 4, 9, 2], [489, 107, 16, 12, 12, 4], [489, 156, 17, 12, 12, 2], [489, 206, 17, 14, 12, 1], [489, 261, 13, 5, 9, 5], [489, 309, 17, 16, 11, 2], [489, 360, 17, 12, 12, 2], [489, 411, 21, 12, 17, 2], [489, 462, 21, 12, 17, 2], [489, 513, 25, 6, 19, 2], [489, 564, 14, 3, 9, 2], [489, 615, 15, 2, 9, 2], [489, 669, 17, 9, 13, 5], [489, 717, 25, 12, 19, 2], [489, 768, 21, 12, 16, 2], [550, 7, 20, 5, 16, 6], [550, 57, 15, 9, 13, 5], [550, 109, 17, 8, 13, 6], [550, 160, 16, 8, 13, 6], [550, 207, 18, 12, 12, 2], [550, 262, 15, 11, 13, 6], [550, 309, 17, 12, 12, 2], [550, 360, 20, 13, 16, 2], [550, 411, 23, 13, 18, 2], [550, 466, 16, 8, 12, 6], [550, 513, 14, 16, 8, 2], [550, 564, 14, 7, 8, 2], [550, 615, 15, 7, 9, 2], [550, 666, 22, 12, 17, 2], [550, 721, 19, 8, 15, 6], [550, 772, 16, 8, 12, 6], [611, 7, 13, 12, 11, 6], [611, 58, 12, 12, 9, 6], [611, 112, 18, 4, 16, 9], [611, 156, 19, 12, 13, 2], [611, 207, 17, 16, 12, 2], [611, 264, 16, 5, 13, 8], [611, 309, 16, 12, 14, 2], [611, 364, 17, 7, 12, 6], [611, 415, 16, 7, 12, 6], [611, 472, 21, 2, 21, 12], [611, 511, 1, 1, 12, 1], [611, 562, 18, 14, 16, 0], [611, 613, 20, 14, 16, 0], [611, 664, 20, 14, 16, 0], [611, 717, 25, 12, 19, 2], [611, 772, 20, 8, 16, 6], [672, 10, 15, 1, 12, 9], [672, 61, 23, 1, 21, 9], [672, 105, 17, 5, 11, 2], [672, 156, 17, 5, 11, 2], [672, 207, 14, 5, 9, 2], [672, 258, 14, 5, 9, 2], [672, 313, 15, 7, 13, 6], [672, 360, 16, 12, 12, 2], [672, 413, 17, 14, 12, 4], [1, 1, 1, 1, 8, 1], [794, 767, 16, 3, 10, 1], [672, 567, 17, 7, 12, 5], [672, 619, 14, 7, 9, 6], [672, 670, 13, 7, 9, 6], [672, 717, 17, 12, 13, 2], [672, 768, 18, 12, 13, 2], [733, 2, 16, 14, 12, 1], [733, 59, 12, 2, 9, 7], [733, 115, 9, 5, 9, 12], [733, 166, 12, 5, 11, 12], [733, 207, 25, 12, 21, 2], [733, 256, 19, 14, 16, 0], [733, 307, 20, 14, 14, 0], [733, 358, 18, 14, 16, 0], [733, 409, 20, 14, 14, 0], [733, 460, 20, 14, 14, 0], [733, 512, 15, 13, 9, 1], [733, 562, 15, 14, 9, 0], [733, 613, 15, 14, 9, 0], [733, 664, 15, 14, 9, 0], [733, 715, 20, 14, 16, 0], [733, 766, 20, 14, 16, 0], [1, 1, 1, 1, 8, 1], [794, 52, 20, 14, 16, 0], [794, 103, 22, 14, 16, 0], [794, 154, 22, 14, 16, 0], [794, 205, 22, 14, 16, 0], [794, 262, 11, 8, 8, 6], [794, 308, 15, 4, 9, 1], [794, 360, 15, 2, 9, 2], [794, 412, 15, 1, 9, 3], [794, 462, 15, 2, 9, 2], [794, 514, 13, 1, 9, 3], [794, 564, 14, 4, 9, 2], [794, 626, 8, 5, 9, 13], [794, 666, 15, 2, 9, 2], [794, 729, 8, 4, 9, 14], [794, 767, 16, 3, 10, 1], [855, 2, 16, 3, 10, 1], [855, 53, 16, 3, 10, 1], [855, 104, 16, 3, 10, 1], [855, 155, 16, 3, 10, 1], [855, 206, 16, 3, 10, 1], [855, 257, 16, 3, 10, 1], [855, 308, 16, 3, 10, 1], [855, 359, 16, 3, 10, 1], [855, 410, 16, 3, 10, 1], [855, 461, 16, 3, 10, 1], [855, 512, 16, 3, 10, 1], [855, 563, 16, 3, 10, 1], [855, 614, 16, 3, 10, 1], [855, 665, 16, 3, 10, 1], [855, 716, 16, 3, 10, 1], [855, 767, 16, 3, 10, 1]], \"capHeight\": 14, \"widestlogicalchar\": 21, \"widestglyph\": 26, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 21, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 9, 6, 9, 9], [1, 54, 10, 14, 10, 2], [1, 105, 11, 13, 11, 2], [1, 157, 13, 13, 13, 3], [1, 206, 13, 17, 13, 1], [1, 258, 19, 14, 19, 2], [1, 309, 18, 14, 18, 2], [1, 360, 7, 13, 7, 2], [1, 411, 10, 18, 10, 2], [1, 462, 10, 18, 10, 2], [1, 513, 13, 13, 13, 2], [1, 567, 14, 11, 14, 5], [1, 622, 10, 10, 10, 9], [1, 673, 10, 6, 10, 9], [1, 724, 10, 7, 10, 9], [1, 768, 9, 14, 9, 2], [62, 3, 13, 14, 13, 2], [62, 54, 13, 14, 13, 2], [62, 105, 13, 14, 13, 2], [62, 156, 13, 14, 13, 2], [62, 207, 13, 14, 13, 2], [62, 258, 13, 14, 13, 2], [62, 309, 13, 14, 13, 2], [62, 360, 13, 14, 13, 2], [62, 411, 13, 14, 13, 2], [62, 462, 13, 14, 13, 2], [62, 517, 9, 10, 9, 6], [62, 568, 9, 13, 9, 6], [62, 619, 14, 9, 14, 6], [62, 671, 14, 8, 14, 7], [62, 721, 14, 9, 14, 6], [62, 768, 12, 14, 12, 2], [123, 3, 21, 17, 21, 2], [123, 54, 17, 14, 17, 2], [123, 105, 16, 14, 16, 2], [123, 156, 16, 14, 16, 2], [123, 207, 17, 14, 17, 2], [123, 258, 15, 14, 15, 2], [123, 309, 14, 14, 14, 2], [123, 360, 17, 14, 17, 2], [123, 411, 17, 14, 17, 2], [123, 462, 10, 14, 10, 2], [123, 513, 11, 14, 11, 2], [123, 564, 17, 14, 17, 2], [123, 615, 15, 14, 15, 2], [123, 666, 20, 14, 20, 2], [123, 717, 17, 14, 17, 2], [123, 768, 17, 14, 17, 2], [184, 3, 14, 14, 14, 2], [184, 54, 17, 17, 17, 2], [184, 105, 16, 14, 16, 2], [184, 156, 14, 14, 14, 2], [184, 207, 15, 14, 15, 2], [184, 258, 17, 14, 17, 2], [184, 309, 17, 14, 17, 2], [184, 360, 21, 14, 21, 2], [184, 411, 17, 14, 17, 2], [184, 462, 17, 14, 17, 2], [184, 513, 15, 14, 15, 2], [184, 564, 10, 18, 10, 2], [184, 615, 9, 14, 9, 2], [184, 666, 10, 18, 10, 2], [184, 717, 12, 13, 12, 2], [184, 775, 13, 11, 13, 9], [245, 3, 10, 13, 10, 2], [245, 58, 12, 10, 12, 6], [245, 105, 13, 14, 13, 2], [245, 160, 12, 10, 12, 6], [245, 207, 13, 14, 13, 2], [245, 262, 12, 10, 12, 6], [245, 309, 10, 14, 10, 2], [245, 364, 13, 14, 13, 6], [245, 411, 13, 14, 13, 2], [245, 462, 9, 14, 9, 2], [245, 513, 9, 18, 9, 2], [245, 564, 13, 14, 13, 2], [245, 615, 9, 14, 9, 2], [245, 670, 18, 10, 18, 6], [245, 721, 13, 10, 13, 6], [245, 772, 13, 10, 13, 6], [306, 7, 13, 14, 13, 6], [306, 58, 13, 14, 13, 6], [306, 109, 10, 10, 10, 6], [306, 160, 11, 10, 11, 6], [306, 209, 9, 12, 9, 4], [306, 262, 13, 10, 13, 6], [306, 313, 13, 10, 13, 6], [306, 364, 17, 10, 17, 6], [306, 415, 13, 10, 13, 6], [306, 466, 13, 14, 13, 6], [306, 517, 12, 10, 12, 6], [306, 564, 13, 18, 13, 2], [306, 615, 8, 18, 8, 2], [306, 666, 13, 18, 13, 2], [306, 722, 14, 8, 14, 7], [306, 768, 12, 14, 12, 2], [367, 1, 17, 16, 17, 0], [367, 52, 17, 16, 17, 0], [367, 105, 16, 18, 16, 2], [367, 154, 15, 16, 15, 0], [367, 205, 17, 16, 17, 0], [367, 256, 17, 16, 17, 0], [367, 307, 17, 16, 17, 0], [367, 361, 12, 13, 12, 3], [367, 412, 12, 13, 12, 3], [367, 462, 12, 14, 12, 2], [367, 515, 12, 12, 12, 4], [367, 565, 12, 13, 12, 3], [367, 614, 12, 15, 12, 1], [367, 670, 12, 13, 12, 6], [367, 718, 12, 13, 12, 3], [367, 769, 12, 13, 12, 3], [428, 3, 12, 14, 12, 2], [428, 56, 12, 12, 12, 4], [428, 105, 9, 14, 9, 2], [428, 156, 9, 14, 9, 2], [428, 207, 9, 14, 9, 2], [428, 260, 9, 12, 9, 4], [428, 310, 13, 13, 13, 3], [428, 361, 13, 13, 13, 3], [428, 412, 13, 13, 13, 3], [428, 462, 13, 14, 13, 2], [428, 515, 13, 12, 13, 4], [428, 565, 13, 13, 13, 3], [428, 616, 13, 13, 13, 3], [428, 667, 13, 13, 13, 3], [428, 717, 13, 14, 13, 2], [428, 770, 13, 12, 13, 4], [489, 2, 13, 16, 13, 1], [489, 54, 10, 13, 10, 2], [489, 107, 13, 14, 13, 4], [489, 156, 13, 14, 13, 2], [489, 206, 13, 16, 13, 1], [489, 261, 10, 10, 10, 5], [489, 309, 12, 18, 12, 2], [489, 360, 13, 14, 13, 2], [489, 411, 18, 14, 18, 2], [489, 462, 18, 14, 18, 2], [489, 513, 20, 13, 20, 2], [489, 564, 10, 13, 10, 2], [489, 615, 10, 13, 10, 2], [489, 669, 14, 11, 14, 5], [489, 717, 20, 14, 20, 2], [489, 768, 17, 14, 17, 2], [550, 7, 17, 9, 17, 6], [550, 57, 14, 11, 14, 5], [550, 109, 14, 10, 14, 6], [550, 160, 14, 10, 14, 6], [550, 207, 13, 14, 13, 2], [550, 262, 14, 13, 14, 6], [550, 309, 13, 14, 13, 2], [550, 360, 17, 15, 17, 2], [550, 411, 19, 15, 19, 2], [550, 466, 13, 10, 13, 6], [550, 513, 9, 18, 9, 2], [550, 564, 9, 13, 9, 2], [550, 615, 10, 13, 10, 2], [550, 666, 18, 14, 18, 2], [550, 721, 16, 10, 16, 6], [550, 772, 13, 10, 13, 6], [611, 7, 12, 14, 12, 6], [611, 58, 10, 14, 10, 6], [611, 112, 17, 6, 17, 9], [611, 154, 14, 16, 14, 0], [611, 207, 13, 18, 13, 2], [611, 264, 14, 7, 14, 8], [611, 309, 15, 14, 15, 2], [611, 364, 13, 9, 13, 6], [611, 415, 13, 9, 13, 6], [611, 469, 22, 7, 22, 9], [611, 520, 13, 6, 13, 9], [611, 562, 17, 16, 17, 0], [611, 613, 17, 16, 17, 0], [611, 664, 17, 16, 17, 0], [611, 717, 20, 14, 20, 2], [611, 772, 17, 10, 17, 6], [672, 10, 13, 6, 13, 9], [672, 61, 22, 6, 22, 9], [672, 105, 12, 13, 12, 2], [672, 156, 12, 13, 12, 2], [672, 207, 10, 13, 10, 2], [672, 258, 10, 13, 10, 2], [672, 313, 14, 9, 14, 6], [672, 360, 13, 14, 13, 2], [672, 413, 13, 16, 13, 4], [1, 10, 9, 6, 9, 9], [794, 767, 11, 14, 11, 1], [672, 567, 13, 10, 13, 5], [672, 619, 10, 9, 10, 6], [672, 670, 10, 9, 10, 6], [672, 717, 14, 14, 14, 2], [672, 768, 14, 14, 14, 2], [733, 2, 13, 16, 13, 1], [733, 59, 10, 8, 10, 7], [733, 112, 10, 10, 10, 9], [733, 163, 12, 10, 12, 9], [733, 207, 22, 14, 22, 2], [733, 256, 17, 16, 17, 0], [733, 307, 15, 16, 15, 0], [733, 358, 17, 16, 17, 0], [733, 409, 15, 16, 15, 0], [733, 460, 15, 16, 15, 0], [733, 511, 10, 16, 10, 0], [733, 562, 10, 16, 10, 0], [733, 613, 10, 16, 10, 0], [733, 664, 10, 16, 10, 0], [733, 715, 17, 16, 17, 0], [733, 766, 17, 16, 17, 0], [1, 10, 9, 6, 9, 9], [794, 52, 17, 16, 17, 0], [794, 103, 17, 16, 17, 0], [794, 154, 17, 16, 17, 0], [794, 205, 17, 16, 17, 0], [794, 262, 9, 10, 9, 6], [794, 308, 10, 14, 10, 1], [794, 360, 10, 13, 10, 2], [794, 412, 10, 12, 10, 3], [794, 462, 10, 13, 10, 2], [794, 514, 10, 12, 10, 3], [794, 564, 10, 13, 10, 2], [794, 622, 10, 11, 10, 9], [794, 666, 10, 13, 10, 2], [794, 724, 10, 11, 10, 9], [794, 767, 11, 14, 11, 1], [855, 2, 11, 14, 11, 1], [855, 53, 11, 14, 11, 1], [855, 104, 11, 14, 11, 1], [855, 155, 11, 14, 11, 1], [855, 206, 11, 14, 11, 1], [855, 257, 11, 14, 11, 1], [855, 308, 11, 14, 11, 1], [855, 359, 11, 14, 11, 1], [855, 410, 11, 14, 11, 1], [855, 461, 11, 14, 11, 1], [855, 512, 11, 14, 11, 1], [855, 563, 11, 14, 11, 1], [855, 614, 11, 14, 11, 1], [855, 665, 11, 14, 11, 1], [855, 716, 11, 14, 11, 1], [855, 767, 11, 14, 11, 1]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 8, 6, 8, 8], [1, 54, 9, 12, 9, 2], [1, 105, 10, 12, 10, 2], [1, 157, 12, 11, 12, 3], [1, 206, 12, 15, 12, 1], [1, 258, 18, 12, 18, 2], [1, 309, 17, 12, 17, 2], [1, 360, 6, 12, 6, 2], [1, 411, 9, 16, 9, 2], [1, 462, 9, 16, 9, 2], [1, 513, 12, 12, 12, 2], [1, 567, 13, 9, 13, 5], [1, 621, 9, 9, 9, 8], [1, 672, 9, 6, 9, 8], [1, 723, 9, 6, 9, 8], [1, 768, 8, 12, 8, 2], [62, 3, 12, 12, 12, 2], [62, 54, 12, 12, 12, 2], [62, 105, 12, 12, 12, 2], [62, 156, 12, 12, 12, 2], [62, 207, 12, 12, 12, 2], [62, 258, 12, 12, 12, 2], [62, 309, 12, 12, 12, 2], [62, 360, 12, 12, 12, 2], [62, 411, 12, 12, 12, 2], [62, 462, 12, 12, 12, 2], [62, 517, 8, 8, 8, 6], [62, 568, 8, 11, 8, 6], [62, 619, 13, 8, 13, 6], [62, 671, 13, 7, 13, 7], [62, 721, 13, 8, 13, 6], [62, 768, 11, 12, 11, 2], [123, 3, 20, 15, 20, 2], [123, 54, 16, 12, 16, 2], [123, 105, 15, 12, 15, 2], [123, 156, 15, 12, 15, 2], [123, 207, 16, 12, 16, 2], [123, 258, 14, 12, 14, 2], [123, 309, 13, 12, 13, 2], [123, 360, 16, 12, 16, 2], [123, 411, 16, 12, 16, 2], [123, 462, 9, 12, 9, 2], [123, 513, 10, 12, 10, 2], [123, 564, 16, 12, 16, 2], [123, 615, 14, 12, 14, 2], [123, 666, 19, 12, 19, 2], [123, 717, 16, 12, 16, 2], [123, 768, 16, 12, 16, 2], [184, 3, 13, 12, 13, 2], [184, 54, 16, 15, 16, 2], [184, 105, 15, 12, 15, 2], [184, 156, 13, 12, 13, 2], [184, 207, 14, 12, 14, 2], [184, 258, 16, 12, 16, 2], [184, 309, 16, 12, 16, 2], [184, 360, 20, 12, 20, 2], [184, 411, 16, 12, 16, 2], [184, 462, 16, 12, 16, 2], [184, 513, 14, 12, 14, 2], [184, 564, 9, 16, 9, 2], [184, 615, 8, 12, 8, 2], [184, 666, 9, 16, 9, 2], [184, 717, 11, 12, 11, 2], [184, 774, 12, 10, 12, 8], [245, 3, 9, 12, 9, 2], [245, 58, 11, 8, 11, 6], [245, 105, 12, 12, 12, 2], [245, 160, 11, 8, 11, 6], [245, 207, 12, 12, 12, 2], [245, 262, 11, 8, 11, 6], [245, 309, 9, 12, 9, 2], [245, 364, 12, 12, 12, 6], [245, 411, 12, 12, 12, 2], [245, 462, 8, 12, 8, 2], [245, 513, 8, 16, 8, 2], [245, 564, 12, 12, 12, 2], [245, 615, 8, 12, 8, 2], [245, 670, 17, 8, 17, 6], [245, 721, 12, 8, 12, 6], [245, 772, 12, 8, 12, 6], [306, 7, 12, 12, 12, 6], [306, 58, 12, 12, 12, 6], [306, 109, 9, 8, 9, 6], [306, 160, 10, 8, 10, 6], [306, 209, 8, 10, 8, 4], [306, 262, 12, 8, 12, 6], [306, 313, 12, 8, 12, 6], [306, 364, 16, 8, 16, 6], [306, 415, 12, 8, 12, 6], [306, 466, 12, 12, 12, 6], [306, 517, 11, 8, 11, 6], [306, 564, 12, 16, 12, 2], [306, 615, 7, 16, 7, 2], [306, 666, 12, 16, 12, 2], [306, 722, 13, 7, 13, 7], [306, 768, 11, 12, 11, 2], [367, 1, 16, 14, 16, 0], [367, 52, 16, 14, 16, 0], [367, 105, 15, 16, 15, 2], [367, 154, 14, 14, 14, 0], [367, 205, 16, 14, 16, 0], [367, 256, 16, 14, 16, 0], [367, 307, 16, 14, 16, 0], [367, 361, 11, 11, 11, 3], [367, 412, 11, 11, 11, 3], [367, 462, 11, 12, 11, 2], [367, 515, 11, 10, 11, 4], [367, 565, 11, 11, 11, 3], [367, 614, 11, 13, 11, 1], [367, 670, 11, 11, 11, 6], [367, 718, 11, 11, 11, 3], [367, 769, 11, 11, 11, 3], [428, 3, 11, 12, 11, 2], [428, 56, 11, 10, 11, 4], [428, 105, 8, 12, 8, 2], [428, 156, 8, 12, 8, 2], [428, 207, 8, 12, 8, 2], [428, 260, 8, 10, 8, 4], [428, 310, 12, 11, 12, 3], [428, 361, 12, 11, 12, 3], [428, 412, 12, 11, 12, 3], [428, 462, 12, 12, 12, 2], [428, 515, 12, 10, 12, 4], [428, 565, 12, 11, 12, 3], [428, 616, 12, 11, 12, 3], [428, 667, 12, 11, 12, 3], [428, 717, 12, 12, 12, 2], [428, 770, 12, 10, 12, 4], [489, 2, 12, 14, 12, 1], [489, 54, 9, 12, 9, 2], [489, 107, 12, 12, 12, 4], [489, 156, 12, 12, 12, 2], [489, 206, 12, 14, 12, 1], [489, 261, 9, 9, 9, 5], [489, 309, 11, 16, 11, 2], [489, 360, 12, 12, 12, 2], [489, 411, 17, 12, 17, 2], [489, 462, 17, 12, 17, 2], [489, 513, 19, 12, 19, 2], [489, 564, 9, 12, 9, 2], [489, 615, 9, 12, 9, 2], [489, 669, 13, 9, 13, 5], [489, 717, 19, 12, 19, 2], [489, 768, 16, 12, 16, 2], [550, 7, 16, 8, 16, 6], [550, 57, 13, 9, 13, 5], [550, 109, 13, 8, 13, 6], [550, 160, 13, 8, 13, 6], [550, 207, 12, 12, 12, 2], [550, 262, 13, 11, 13, 6], [550, 309, 12, 12, 12, 2], [550, 360, 16, 13, 16, 2], [550, 411, 18, 13, 18, 2], [550, 466, 12, 8, 12, 6], [550, 513, 8, 16, 8, 2], [550, 564, 8, 12, 8, 2], [550, 615, 9, 12, 9, 2], [550, 666, 17, 12, 17, 2], [550, 721, 15, 8, 15, 6], [550, 772, 12, 8, 12, 6], [611, 7, 11, 12, 11, 6], [611, 58, 9, 12, 9, 6], [611, 111, 16, 6, 16, 8], [611, 154, 13, 14, 13, 0], [611, 207, 12, 16, 12, 2], [611, 264, 13, 6, 13, 8], [611, 309, 14, 12, 14, 2], [611, 364, 12, 8, 12, 6], [611, 415, 12, 8, 12, 6], [611, 468, 21, 6, 21, 8], [611, 519, 12, 6, 12, 8], [611, 562, 16, 14, 16, 0], [611, 613, 16, 14, 16, 0], [611, 664, 16, 14, 16, 0], [611, 717, 19, 12, 19, 2], [611, 772, 16, 8, 16, 6], [672, 9, 12, 6, 12, 8], [672, 60, 21, 6, 21, 8], [672, 105, 11, 12, 11, 2], [672, 156, 11, 12, 11, 2], [672, 207, 9, 12, 9, 2], [672, 258, 9, 12, 9, 2], [672, 313, 13, 8, 13, 6], [672, 360, 12, 12, 12, 2], [672, 413, 12, 14, 12, 4], [1, 9, 8, 6, 8, 8], [794, 767, 10, 13, 10, 1], [672, 567, 12, 9, 12, 5], [672, 619, 9, 8, 9, 6], [672, 670, 9, 8, 9, 6], [672, 717, 13, 12, 13, 2], [672, 768, 13, 12, 13, 2], [733, 2, 12, 14, 12, 1], [733, 59, 9, 7, 9, 7], [733, 111, 9, 9, 9, 8], [733, 162, 11, 9, 11, 8], [733, 207, 21, 12, 21, 2], [733, 256, 16, 14, 16, 0], [733, 307, 14, 14, 14, 0], [733, 358, 16, 14, 16, 0], [733, 409, 14, 14, 14, 0], [733, 460, 14, 14, 14, 0], [733, 511, 9, 14, 9, 0], [733, 562, 9, 14, 9, 0], [733, 613, 9, 14, 9, 0], [733, 664, 9, 14, 9, 0], [733, 715, 16, 14, 16, 0], [733, 766, 16, 14, 16, 0], [1, 9, 8, 6, 8, 8], [794, 52, 16, 14, 16, 0], [794, 103, 16, 14, 16, 0], [794, 154, 16, 14, 16, 0], [794, 205, 16, 14, 16, 0], [794, 262, 8, 8, 8, 6], [794, 308, 9, 13, 9, 1], [794, 360, 9, 12, 9, 2], [794, 412, 9, 11, 9, 3], [794, 462, 9, 12, 9, 2], [794, 514, 9, 11, 9, 3], [794, 564, 9, 12, 9, 2], [794, 621, 9, 10, 9, 8], [794, 666, 9, 12, 9, 2], [794, 723, 9, 10, 9, 8], [794, 767, 10, 13, 10, 1], [855, 2, 10, 13, 10, 1], [855, 53, 10, 13, 10, 1], [855, 104, 10, 13, 10, 1], [855, 155, 10, 13, 10, 1], [855, 206, 10, 13, 10, 1], [855, 257, 10, 13, 10, 1], [855, 308, 10, 13, 10, 1], [855, 359, 10, 13, 10, 1], [855, 410, 10, 13, 10, 1], [855, 461, 10, 13, 10, 1], [855, 512, 10, 13, 10, 1], [855, 563, 10, 13, 10, 1], [855, 614, 10, 13, 10, 1], [855, 665, 10, 13, 10, 1], [855, 716, 10, 13, 10, 1], [855, 767, 10, 13, 10, 1]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 54, 21, 18, 14, 2], [1, 105, 22, 7, 16, 2], [1, 157, 24, 16, 18, 3], [1, 205, 25, 23, 18, 0], [1, 257, 33, 19, 26, 1], [1, 309, 29, 18, 25, 2], [1, 360, 18, 7, 12, 2], [1, 411, 21, 23, 14, 2], [1, 462, 19, 23, 14, 2], [1, 513, 24, 10, 18, 2], [1, 569, 22, 13, 20, 7], [1, 629, 13, 7, 14, 16], [1, 676, 17, 3, 14, 12], [1, 731, 12, 4, 14, 16], [1, 768, 20, 18, 13, 2], [62, 3, 24, 18, 18, 2], [62, 54, 22, 18, 18, 2], [62, 105, 23, 18, 18, 2], [62, 156, 23, 18, 18, 2], [62, 207, 24, 18, 18, 2], [62, 258, 25, 18, 18, 2], [62, 309, 25, 18, 18, 2], [62, 360, 25, 18, 18, 2], [62, 411, 24, 18, 18, 2], [62, 462, 25, 18, 18, 2], [62, 518, 17, 13, 13, 7], [62, 569, 17, 16, 13, 7], [62, 621, 23, 11, 20, 8], [62, 674, 24, 7, 20, 10], [62, 723, 22, 11, 20, 8], [62, 768, 24, 18, 17, 2], [123, 3, 34, 21, 28, 2], [123, 54, 25, 18, 23, 2], [123, 105, 27, 18, 22, 2], [123, 156, 29, 18, 22, 2], [123, 207, 28, 18, 23, 2], [123, 258, 28, 18, 21, 2], [123, 309, 26, 18, 19, 2], [123, 360, 30, 18, 23, 2], [123, 411, 30, 18, 23, 2], [123, 462, 21, 18, 14, 2], [123, 513, 22, 18, 15, 2], [123, 564, 30, 18, 23, 2], [123, 615, 23, 18, 21, 2], [123, 666, 34, 18, 27, 2], [123, 717, 30, 18, 23, 2], [123, 768, 29, 18, 23, 2], [184, 3, 26, 18, 19, 2], [184, 54, 29, 22, 23, 2], [184, 105, 26, 18, 22, 2], [184, 156, 26, 18, 19, 2], [184, 207, 28, 18, 21, 2], [184, 258, 30, 18, 23, 2], [184, 309, 30, 18, 23, 2], [184, 360, 36, 18, 29, 2], [184, 411, 30, 18, 23, 2], [184, 462, 30, 18, 23, 2], [184, 513, 28, 18, 21, 2], [184, 564, 21, 23, 14, 2], [184, 615, 17, 18, 13, 2], [184, 666, 21, 23, 14, 2], [184, 717, 21, 10, 17, 2], [184, 788, 17, 3, 18, 22], [245, 3, 20, 6, 14, 2], [245, 59, 21, 13, 17, 7], [245, 105, 22, 18, 18, 2], [245, 161, 22, 13, 17, 7], [245, 207, 25, 18, 18, 2], [245, 263, 22, 13, 17, 7], [245, 309, 21, 18, 14, 2], [245, 365, 24, 19, 18, 7], [245, 411, 22, 18, 18, 2], [245, 462, 19, 18, 13, 2], [245, 513, 20, 24, 13, 2], [245, 564, 24, 18, 18, 2], [245, 615, 19, 18, 13, 2], [245, 671, 28, 13, 25, 7], [245, 722, 22, 13, 18, 7], [245, 773, 22, 13, 18, 7], [306, 8, 22, 19, 18, 7], [306, 59, 22, 19, 18, 7], [306, 110, 20, 13, 14, 7], [306, 161, 21, 13, 15, 7], [306, 210, 19, 15, 13, 5], [306, 263, 23, 13, 18, 7], [306, 314, 25, 13, 18, 7], [306, 365, 29, 13, 23, 7], [306, 416, 24, 13, 18, 7], [306, 467, 25, 19, 18, 7], [306, 518, 23, 13, 17, 7], [306, 564, 23, 23, 18, 2], [306, 615, 18, 23, 11, 2], [306, 666, 21, 23, 18, 2], [306, 723, 24, 5, 19, 8], [306, 768, 14, 18, 7, 2], [367, 1, 27, 20, 23, 0], [367, 52, 27, 20, 23, 0], [367, 105, 29, 23, 22, 2], [367, 154, 28, 20, 21, 0], [367, 205, 30, 20, 23, 0], [367, 256, 29, 20, 23, 0], [367, 307, 30, 20, 23, 0], [367, 361, 22, 17, 17, 3], [367, 412, 21, 17, 17, 3], [367, 463, 22, 17, 17, 3], [367, 515, 22, 16, 17, 4], [367, 566, 23, 16, 17, 4], [367, 615, 23, 18, 17, 2], [367, 671, 22, 17, 17, 7], [367, 718, 22, 17, 17, 3], [367, 769, 22, 17, 17, 3], [428, 4, 23, 17, 17, 3], [428, 56, 22, 16, 17, 4], [428, 106, 19, 17, 13, 3], [428, 157, 18, 17, 13, 3], [428, 208, 20, 17, 13, 3], [428, 261, 19, 15, 13, 5], [428, 310, 25, 17, 18, 3], [428, 361, 22, 17, 18, 3], [428, 412, 22, 17, 18, 3], [428, 463, 23, 17, 18, 3], [428, 515, 22, 16, 18, 4], [428, 566, 24, 16, 18, 4], [428, 616, 23, 17, 18, 3], [428, 667, 23, 17, 18, 3], [428, 718, 23, 17, 18, 3], [428, 770, 23, 16, 18, 4], [489, 2, 23, 22, 18, 1], [489, 54, 20, 7, 13, 2], [489, 108, 22, 17, 18, 5], [489, 156, 25, 18, 18, 2], [489, 205, 25, 22, 18, 0], [489, 263, 19, 8, 14, 7], [489, 309, 24, 24, 17, 2], [489, 360, 24, 18, 18, 2], [489, 411, 30, 18, 25, 2], [489, 462, 30, 18, 25, 2], [489, 513, 35, 9, 28, 2], [489, 564, 21, 6, 14, 2], [489, 615, 21, 3, 14, 2], [489, 672, 23, 11, 19, 8], [489, 717, 34, 18, 27, 2], [489, 768, 29, 18, 23, 2], [550, 9, 26, 9, 23, 8], [550, 58, 22, 14, 20, 6], [550, 110, 24, 13, 20, 7], [550, 161, 22, 13, 20, 7], [550, 207, 25, 18, 18, 2], [550, 263, 22, 18, 20, 7], [550, 309, 23, 18, 18, 2], [550, 360, 29, 20, 23, 2], [550, 411, 32, 20, 26, 2], [550, 467, 25, 13, 20, 7], [550, 513, 20, 22, 13, 2], [550, 564, 20, 11, 13, 2], [550, 615, 20, 11, 13, 2], [550, 666, 29, 18, 24, 2], [550, 722, 27, 13, 22, 7], [550, 773, 24, 13, 18, 7], [611, 8, 20, 19, 17, 7], [611, 59, 18, 19, 14, 7], [611, 115, 24, 7, 23, 12], [611, 154, 26, 20, 19, 0], [611, 207, 25, 23, 18, 2], [611, 265, 25, 9, 19, 9], [611, 309, 23, 18, 21, 2], [611, 366, 23, 12, 18, 8], [611, 417, 21, 12, 18, 8], [611, 476, 29, 4, 30, 16], [611, 511, 1, 1, 12, 1], [611, 562, 25, 20, 23, 0], [611, 613, 29, 20, 23, 0], [611, 664, 29, 20, 23, 0], [611, 717, 34, 18, 27, 2], [611, 773, 28, 13, 23, 7], [672, 13, 21, 3, 18, 12], [672, 64, 32, 3, 30, 12], [672, 105, 22, 7, 17, 2], [672, 156, 23, 7, 17, 2], [672, 207, 20, 7, 14, 2], [672, 258, 19, 7, 14, 2], [672, 315, 22, 11, 19, 8], [672, 360, 22, 18, 18, 2], [672, 413, 25, 22, 18, 4], [1, 1, 1, 1, 12, 1], [794, 768, 20, 5, 13, 2], [672, 568, 23, 11, 18, 6], [672, 620, 20, 13, 14, 7], [672, 671, 17, 13, 14, 7], [672, 717, 24, 18, 19, 2], [672, 768, 25, 18, 19, 2], [733, 2, 22, 23, 18, 1], [733, 61, 17, 4, 14, 9], [733, 119, 13, 7, 14, 16], [733, 170, 16, 7, 17, 16], [733, 206, 34, 19, 30, 1], [733, 256, 26, 20, 23, 0], [733, 307, 28, 20, 21, 0], [733, 358, 26, 20, 23, 0], [733, 409, 28, 20, 21, 0], [733, 460, 28, 20, 21, 0], [733, 511, 21, 20, 14, 0], [733, 562, 21, 20, 14, 0], [733, 613, 21, 20, 14, 0], [733, 664, 21, 20, 14, 0], [733, 715, 29, 20, 23, 0], [733, 766, 29, 20, 23, 0], [1, 1, 1, 1, 12, 1], [794, 52, 29, 20, 23, 0], [794, 103, 30, 20, 23, 0], [794, 154, 30, 20, 23, 0], [794, 205, 30, 20, 23, 0], [794, 263, 17, 13, 13, 7], [794, 309, 20, 5, 14, 2], [794, 361, 21, 4, 14, 3], [794, 412, 21, 3, 14, 3], [794, 463, 21, 4, 14, 3], [794, 514, 19, 4, 14, 3], [794, 564, 20, 6, 14, 2], [794, 630, 13, 8, 14, 17], [794, 666, 21, 6, 14, 2], [794, 733, 13, 6, 14, 18], [794, 768, 20, 5, 13, 2], [855, 3, 20, 5, 13, 2], [855, 54, 20, 5, 13, 2], [855, 105, 20, 5, 13, 2], [855, 156, 20, 5, 13, 2], [855, 207, 20, 5, 13, 2], [855, 258, 20, 5, 13, 2], [855, 309, 20, 5, 13, 2], [855, 360, 20, 5, 13, 2], [855, 411, 20, 5, 13, 2], [855, 462, 20, 5, 13, 2], [855, 513, 20, 5, 13, 2], [855, 564, 20, 5, 13, 2], [855, 615, 20, 5, 13, 2], [855, 666, 20, 5, 13, 2], [855, 717, 20, 5, 13, 2], [855, 768, 20, 5, 13, 2]], \"capHeight\": 19, \"widestlogicalchar\": 30, \"widestglyph\": 36, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 20, 16, 13, 2], [1, 105, 21, 5, 15, 2], [1, 157, 23, 14, 17, 3], [1, 205, 24, 21, 17, 0], [1, 257, 32, 17, 25, 1], [1, 309, 28, 16, 24, 2], [1, 360, 17, 5, 11, 2], [1, 411, 20, 21, 13, 2], [1, 462, 18, 21, 13, 2], [1, 513, 23, 8, 17, 2], [1, 569, 21, 11, 19, 7], [1, 629, 12, 5, 13, 16], [1, 676, 16, 1, 13, 12], [1, 731, 11, 2, 13, 16], [1, 768, 19, 16, 12, 2], [62, 3, 23, 16, 17, 2], [62, 54, 21, 16, 17, 2], [62, 105, 22, 16, 17, 2], [62, 156, 22, 16, 17, 2], [62, 207, 23, 16, 17, 2], [62, 258, 24, 16, 17, 2], [62, 309, 24, 16, 17, 2], [62, 360, 24, 16, 17, 2], [62, 411, 23, 16, 17, 2], [62, 462, 24, 16, 17, 2], [62, 518, 16, 11, 12, 7], [62, 569, 16, 14, 12, 7], [62, 621, 22, 9, 19, 8], [62, 674, 23, 5, 19, 10], [62, 723, 21, 9, 19, 8], [62, 768, 23, 16, 16, 2], [123, 3, 33, 19, 27, 2], [123, 54, 24, 16, 22, 2], [123, 105, 26, 16, 21, 2], [123, 156, 28, 16, 21, 2], [123, 207, 27, 16, 22, 2], [123, 258, 27, 16, 20, 2], [123, 309, 25, 16, 18, 2], [123, 360, 29, 16, 22, 2], [123, 411, 29, 16, 22, 2], [123, 462, 20, 16, 13, 2], [123, 513, 21, 16, 14, 2], [123, 564, 29, 16, 22, 2], [123, 615, 22, 16, 20, 2], [123, 666, 33, 16, 26, 2], [123, 717, 29, 16, 22, 2], [123, 768, 28, 16, 22, 2], [184, 3, 25, 16, 18, 2], [184, 54, 28, 20, 22, 2], [184, 105, 25, 16, 21, 2], [184, 156, 25, 16, 18, 2], [184, 207, 27, 16, 20, 2], [184, 258, 29, 16, 22, 2], [184, 309, 29, 16, 22, 2], [184, 360, 35, 16, 28, 2], [184, 411, 29, 16, 22, 2], [184, 462, 29, 16, 22, 2], [184, 513, 27, 16, 20, 2], [184, 564, 20, 21, 13, 2], [184, 615, 16, 16, 12, 2], [184, 666, 20, 21, 13, 2], [184, 717, 20, 8, 16, 2], [184, 788, 16, 1, 17, 22], [245, 3, 19, 4, 13, 2], [245, 59, 20, 11, 16, 7], [245, 105, 21, 16, 17, 2], [245, 161, 21, 11, 16, 7], [245, 207, 24, 16, 17, 2], [245, 263, 21, 11, 16, 7], [245, 309, 20, 16, 13, 2], [245, 365, 23, 17, 17, 7], [245, 411, 21, 16, 17, 2], [245, 462, 18, 16, 12, 2], [245, 513, 19, 22, 12, 2], [245, 564, 23, 16, 17, 2], [245, 615, 18, 16, 12, 2], [245, 671, 27, 11, 24, 7], [245, 722, 21, 11, 17, 7], [245, 773, 21, 11, 17, 7], [306, 8, 21, 17, 17, 7], [306, 59, 21, 17, 17, 7], [306, 110, 19, 11, 13, 7], [306, 161, 20, 11, 14, 7], [306, 210, 18, 13, 12, 5], [306, 263, 22, 11, 17, 7], [306, 314, 24, 11, 17, 7], [306, 365, 28, 11, 22, 7], [306, 416, 23, 11, 17, 7], [306, 467, 24, 17, 17, 7], [306, 518, 22, 11, 16, 7], [306, 564, 22, 21, 17, 2], [306, 615, 17, 21, 10, 2], [306, 666, 20, 21, 17, 2], [306, 723, 23, 3, 18, 8], [306, 768, 13, 16, 6, 2], [367, 1, 24, 18, 22, 0], [367, 52, 26, 18, 22, 0], [367, 105, 28, 21, 21, 2], [367, 154, 27, 18, 20, 0], [367, 205, 29, 18, 22, 0], [367, 256, 28, 18, 22, 0], [367, 307, 29, 18, 22, 0], [367, 361, 21, 15, 16, 3], [367, 412, 20, 15, 16, 3], [367, 463, 21, 15, 16, 3], [367, 515, 21, 14, 16, 4], [367, 566, 22, 14, 16, 4], [367, 615, 22, 16, 16, 2], [367, 671, 21, 15, 16, 7], [367, 718, 21, 15, 16, 3], [367, 769, 21, 15, 16, 3], [428, 4, 22, 15, 16, 3], [428, 56, 21, 14, 16, 4], [428, 106, 18, 15, 12, 3], [428, 157, 17, 15, 12, 3], [428, 208, 19, 15, 12, 3], [428, 261, 18, 13, 12, 5], [428, 310, 24, 15, 17, 3], [428, 361, 21, 15, 17, 3], [428, 412, 21, 15, 17, 3], [428, 463, 22, 15, 17, 3], [428, 515, 21, 14, 17, 4], [428, 566, 23, 14, 17, 4], [428, 616, 22, 15, 17, 3], [428, 667, 22, 15, 17, 3], [428, 718, 22, 15, 17, 3], [428, 770, 22, 14, 17, 4], [489, 2, 22, 20, 17, 1], [489, 54, 19, 5, 12, 2], [489, 108, 21, 15, 17, 5], [489, 156, 24, 16, 17, 2], [489, 205, 24, 20, 17, 0], [489, 263, 18, 6, 13, 7], [489, 309, 23, 22, 16, 2], [489, 360, 23, 16, 17, 2], [489, 411, 29, 16, 24, 2], [489, 462, 29, 16, 24, 2], [489, 513, 34, 7, 27, 2], [489, 564, 20, 4, 13, 2], [489, 615, 20, 1, 13, 2], [489, 672, 22, 9, 18, 8], [489, 717, 33, 16, 26, 2], [489, 768, 28, 16, 22, 2], [550, 9, 25, 7, 22, 8], [550, 58, 21, 12, 19, 6], [550, 110, 23, 11, 19, 7], [550, 161, 21, 11, 19, 7], [550, 207, 24, 16, 17, 2], [550, 263, 21, 16, 19, 7], [550, 309, 22, 16, 17, 2], [550, 360, 28, 18, 22, 2], [550, 411, 31, 18, 25, 2], [550, 467, 24, 11, 19, 7], [550, 513, 19, 20, 12, 2], [550, 564, 19, 9, 12, 2], [550, 615, 19, 9, 12, 2], [550, 666, 28, 16, 23, 2], [550, 722, 26, 11, 21, 7], [550, 773, 23, 11, 17, 7], [611, 8, 19, 17, 16, 7], [611, 59, 17, 17, 13, 7], [611, 115, 23, 5, 22, 12], [611, 156, 25, 16, 18, 2], [611, 207, 24, 21, 17, 2], [611, 265, 24, 7, 18, 9], [611, 309, 22, 16, 20, 2], [611, 366, 22, 10, 17, 8], [611, 417, 20, 10, 17, 8], [611, 476, 28, 2, 29, 16], [611, 511, 1, 1, 11, 1], [611, 562, 24, 18, 22, 0], [611, 613, 27, 18, 22, 0], [611, 664, 28, 18, 22, 0], [611, 717, 33, 16, 26, 2], [611, 773, 27, 11, 22, 7], [672, 13, 20, 1, 17, 12], [672, 64, 31, 1, 29, 12], [672, 105, 21, 5, 16, 2], [672, 156, 22, 5, 16, 2], [672, 207, 19, 5, 13, 2], [672, 258, 18, 5, 13, 2], [672, 315, 21, 9, 18, 8], [672, 360, 21, 16, 17, 2], [672, 413, 24, 20, 17, 4], [1, 1, 1, 1, 11, 1], [794, 768, 19, 3, 12, 2], [672, 568, 22, 9, 17, 6], [672, 620, 19, 11, 13, 7], [672, 671, 16, 11, 13, 7], [672, 717, 23, 16, 18, 2], [672, 768, 24, 16, 18, 2], [733, 2, 21, 21, 17, 1], [733, 61, 16, 2, 13, 9], [733, 119, 12, 5, 13, 16], [733, 170, 15, 5, 16, 16], [733, 206, 33, 17, 29, 1], [733, 256, 25, 18, 22, 0], [733, 307, 27, 18, 20, 0], [733, 358, 24, 18, 22, 0], [733, 409, 27, 18, 20, 0], [733, 460, 27, 18, 20, 0], [733, 511, 20, 18, 13, 0], [733, 562, 20, 18, 13, 0], [733, 613, 20, 18, 13, 0], [733, 664, 20, 18, 13, 0], [733, 715, 28, 18, 22, 0], [733, 766, 28, 18, 22, 0], [1, 1, 1, 1, 11, 1], [794, 52, 28, 18, 22, 0], [794, 103, 29, 18, 22, 0], [794, 154, 29, 18, 22, 0], [794, 205, 29, 18, 22, 0], [794, 263, 16, 11, 12, 7], [794, 309, 19, 3, 13, 2], [794, 361, 20, 2, 13, 3], [794, 412, 20, 1, 13, 3], [794, 463, 20, 2, 13, 3], [794, 514, 18, 2, 13, 3], [794, 564, 19, 4, 13, 2], [794, 630, 12, 6, 13, 17], [794, 666, 20, 4, 13, 2], [794, 733, 12, 4, 13, 18], [794, 768, 19, 3, 12, 2], [855, 3, 19, 3, 12, 2], [855, 54, 19, 3, 12, 2], [855, 105, 19, 3, 12, 2], [855, 156, 19, 3, 12, 2], [855, 207, 19, 3, 12, 2], [855, 258, 19, 3, 12, 2], [855, 309, 19, 3, 12, 2], [855, 360, 19, 3, 12, 2], [855, 411, 19, 3, 12, 2], [855, 462, 19, 3, 12, 2], [855, 513, 19, 3, 12, 2], [855, 564, 19, 3, 12, 2], [855, 615, 19, 3, 12, 2], [855, 666, 19, 3, 12, 2], [855, 717, 19, 3, 12, 2], [855, 768, 19, 3, 12, 2]], \"capHeight\": 18, \"widestlogicalchar\": 29, \"widestglyph\": 35, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 12, 6, 12, 13], [1, 54, 14, 18, 14, 2], [1, 105, 16, 17, 16, 2], [1, 157, 18, 16, 18, 3], [1, 205, 18, 23, 18, 0], [1, 257, 26, 19, 26, 1], [1, 309, 25, 18, 25, 2], [1, 360, 12, 17, 12, 2], [1, 411, 14, 23, 14, 2], [1, 462, 14, 23, 14, 2], [1, 513, 18, 17, 18, 2], [1, 569, 20, 13, 20, 7], [1, 626, 14, 10, 14, 13], [1, 676, 14, 7, 14, 12], [1, 728, 14, 7, 14, 13], [1, 768, 13, 18, 13, 2], [62, 3, 18, 18, 18, 2], [62, 54, 18, 18, 18, 2], [62, 105, 18, 18, 18, 2], [62, 156, 18, 18, 18, 2], [62, 207, 18, 18, 18, 2], [62, 258, 18, 18, 18, 2], [62, 309, 18, 18, 18, 2], [62, 360, 18, 18, 18, 2], [62, 411, 18, 18, 18, 2], [62, 462, 18, 18, 18, 2], [62, 518, 13, 13, 13, 7], [62, 569, 13, 16, 13, 7], [62, 621, 20, 11, 20, 8], [62, 674, 20, 9, 20, 10], [62, 723, 20, 11, 20, 8], [62, 768, 17, 18, 17, 2], [123, 3, 28, 21, 28, 2], [123, 54, 23, 18, 23, 2], [123, 105, 22, 18, 22, 2], [123, 156, 22, 18, 22, 2], [123, 207, 23, 18, 23, 2], [123, 258, 21, 18, 21, 2], [123, 309, 19, 18, 19, 2], [123, 360, 23, 18, 23, 2], [123, 411, 23, 18, 23, 2], [123, 462, 14, 18, 14, 2], [123, 513, 15, 18, 15, 2], [123, 564, 23, 18, 23, 2], [123, 615, 21, 18, 21, 2], [123, 666, 27, 18, 27, 2], [123, 717, 23, 18, 23, 2], [123, 768, 23, 18, 23, 2], [184, 3, 19, 18, 19, 2], [184, 54, 23, 22, 23, 2], [184, 105, 22, 18, 22, 2], [184, 156, 19, 18, 19, 2], [184, 207, 21, 18, 21, 2], [184, 258, 23, 18, 23, 2], [184, 309, 23, 18, 23, 2], [184, 360, 29, 18, 29, 2], [184, 411, 23, 18, 23, 2], [184, 462, 23, 18, 23, 2], [184, 513, 21, 18, 21, 2], [184, 564, 14, 23, 14, 2], [184, 615, 13, 18, 13, 2], [184, 666, 14, 23, 14, 2], [184, 717, 17, 17, 17, 2], [184, 779, 18, 12, 18, 13], [245, 3, 14, 17, 14, 2], [245, 59, 17, 13, 17, 7], [245, 105, 18, 18, 18, 2], [245, 161, 17, 13, 17, 7], [245, 207, 18, 18, 18, 2], [245, 263, 17, 13, 17, 7], [245, 309, 14, 18, 14, 2], [245, 365, 18, 19, 18, 7], [245, 411, 18, 18, 18, 2], [245, 462, 13, 18, 13, 2], [245, 513, 13, 24, 13, 2], [245, 564, 18, 18, 18, 2], [245, 615, 13, 18, 13, 2], [245, 671, 25, 13, 25, 7], [245, 722, 18, 13, 18, 7], [245, 773, 18, 13, 18, 7], [306, 8, 18, 19, 18, 7], [306, 59, 18, 19, 18, 7], [306, 110, 14, 13, 14, 7], [306, 161, 15, 13, 15, 7], [306, 210, 13, 15, 13, 5], [306, 263, 18, 13, 18, 7], [306, 314, 18, 13, 18, 7], [306, 365, 23, 13, 23, 7], [306, 416, 18, 13, 18, 7], [306, 467, 18, 19, 18, 7], [306, 518, 17, 13, 17, 7], [306, 564, 18, 23, 18, 2], [306, 615, 11, 23, 11, 2], [306, 666, 18, 23, 18, 2], [306, 723, 19, 11, 19, 8], [306, 768, 7, 18, 7, 2], [367, 1, 23, 20, 23, 0], [367, 52, 23, 20, 23, 0], [367, 105, 22, 23, 22, 2], [367, 154, 21, 20, 21, 0], [367, 205, 23, 20, 23, 0], [367, 256, 23, 20, 23, 0], [367, 307, 23, 20, 23, 0], [367, 361, 17, 17, 17, 3], [367, 412, 17, 17, 17, 3], [367, 463, 17, 17, 17, 3], [367, 515, 17, 16, 17, 4], [367, 566, 17, 16, 17, 4], [367, 615, 17, 18, 17, 2], [367, 671, 17, 17, 17, 7], [367, 718, 17, 17, 17, 3], [367, 769, 17, 17, 17, 3], [428, 4, 17, 17, 17, 3], [428, 56, 17, 16, 17, 4], [428, 106, 13, 17, 13, 3], [428, 157, 13, 17, 13, 3], [428, 208, 13, 17, 13, 3], [428, 261, 13, 15, 13, 5], [428, 310, 18, 17, 18, 3], [428, 361, 18, 17, 18, 3], [428, 412, 18, 17, 18, 3], [428, 463, 18, 17, 18, 3], [428, 515, 18, 16, 18, 4], [428, 566, 18, 16, 18, 4], [428, 616, 18, 17, 18, 3], [428, 667, 18, 17, 18, 3], [428, 718, 18, 17, 18, 3], [428, 770, 18, 16, 18, 4], [489, 2, 18, 22, 18, 1], [489, 54, 13, 17, 13, 2], [489, 108, 18, 17, 18, 5], [489, 156, 18, 18, 18, 2], [489, 205, 18, 22, 18, 0], [489, 263, 14, 12, 14, 7], [489, 309, 17, 24, 17, 2], [489, 360, 18, 18, 18, 2], [489, 411, 25, 18, 25, 2], [489, 462, 25, 18, 25, 2], [489, 513, 28, 17, 28, 2], [489, 564, 14, 17, 14, 2], [489, 615, 14, 17, 14, 2], [489, 672, 19, 11, 19, 8], [489, 717, 27, 18, 27, 2], [489, 768, 23, 18, 23, 2], [550, 9, 23, 11, 23, 8], [550, 58, 20, 14, 20, 6], [550, 110, 20, 13, 20, 7], [550, 161, 20, 13, 20, 7], [550, 207, 18, 18, 18, 2], [550, 263, 20, 18, 20, 7], [550, 309, 18, 18, 18, 2], [550, 360, 23, 20, 23, 2], [550, 411, 26, 20, 26, 2], [550, 467, 20, 13, 20, 7], [550, 513, 13, 22, 13, 2], [550, 564, 13, 17, 13, 2], [550, 615, 13, 17, 13, 2], [550, 666, 24, 18, 24, 2], [550, 722, 22, 13, 22, 7], [550, 773, 18, 13, 18, 7], [611, 8, 17, 19, 17, 7], [611, 59, 14, 19, 14, 7], [611, 115, 23, 7, 23, 12], [611, 154, 19, 20, 19, 0], [611, 207, 18, 23, 18, 2], [611, 265, 19, 10, 19, 9], [611, 309, 21, 18, 21, 2], [611, 366, 18, 12, 18, 8], [611, 417, 18, 12, 18, 8], [611, 473, 30, 7, 30, 13], [611, 524, 12, 6, 12, 13], [611, 562, 23, 20, 23, 0], [611, 613, 23, 20, 23, 0], [611, 664, 23, 20, 23, 0], [611, 717, 27, 18, 27, 2], [611, 773, 23, 13, 23, 7], [672, 13, 18, 7, 18, 12], [672, 64, 30, 7, 30, 12], [672, 105, 17, 17, 17, 2], [672, 156, 17, 17, 17, 2], [672, 207, 14, 17, 14, 2], [672, 258, 14, 17, 14, 2], [672, 315, 19, 11, 19, 8], [672, 360, 18, 18, 18, 2], [672, 413, 18, 22, 18, 4], [1, 14, 12, 6, 12, 13], [794, 768, 13, 17, 13, 2], [672, 568, 18, 13, 18, 6], [672, 620, 14, 13, 14, 7], [672, 671, 14, 13, 14, 7], [672, 717, 19, 18, 19, 2], [672, 768, 19, 18, 19, 2], [733, 2, 18, 23, 18, 1], [733, 61, 14, 10, 14, 9], [733, 116, 14, 10, 14, 13], [733, 167, 17, 10, 17, 13], [733, 206, 30, 19, 30, 1], [733, 256, 23, 20, 23, 0], [733, 307, 21, 20, 21, 0], [733, 358, 23, 20, 23, 0], [733, 409, 21, 20, 21, 0], [733, 460, 21, 20, 21, 0], [733, 511, 14, 20, 14, 0], [733, 562, 14, 20, 14, 0], [733, 613, 14, 20, 14, 0], [733, 664, 14, 20, 14, 0], [733, 715, 23, 20, 23, 0], [733, 766, 23, 20, 23, 0], [1, 14, 12, 6, 12, 13], [794, 52, 23, 20, 23, 0], [794, 103, 23, 20, 23, 0], [794, 154, 23, 20, 23, 0], [794, 205, 23, 20, 23, 0], [794, 263, 13, 13, 13, 7], [794, 309, 14, 17, 14, 2], [794, 361, 14, 16, 14, 3], [794, 412, 14, 16, 14, 3], [794, 463, 14, 16, 14, 3], [794, 514, 14, 16, 14, 3], [794, 564, 14, 17, 14, 2], [794, 626, 14, 12, 14, 13], [794, 666, 14, 17, 14, 2], [794, 728, 14, 11, 14, 13], [794, 768, 13, 17, 13, 2], [855, 3, 13, 17, 13, 2], [855, 54, 13, 17, 13, 2], [855, 105, 13, 17, 13, 2], [855, 156, 13, 17, 13, 2], [855, 207, 13, 17, 13, 2], [855, 258, 13, 17, 13, 2], [855, 309, 13, 17, 13, 2], [855, 360, 13, 17, 13, 2], [855, 411, 13, 17, 13, 2], [855, 462, 13, 17, 13, 2], [855, 513, 13, 17, 13, 2], [855, 564, 13, 17, 13, 2], [855, 615, 13, 17, 13, 2], [855, 666, 13, 17, 13, 2], [855, 717, 13, 17, 13, 2], [855, 768, 13, 17, 13, 2]], \"widestlogicalchar\": 30, \"widestglyph\": 30, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 11, 6, 11, 12], [1, 54, 13, 16, 13, 2], [1, 105, 15, 16, 15, 2], [1, 157, 17, 15, 17, 3], [1, 205, 17, 21, 17, 0], [1, 257, 25, 17, 25, 1], [1, 309, 24, 16, 24, 2], [1, 360, 11, 16, 11, 2], [1, 411, 13, 21, 13, 2], [1, 462, 13, 21, 13, 2], [1, 513, 17, 16, 17, 2], [1, 569, 19, 11, 19, 7], [1, 625, 13, 9, 13, 12], [1, 676, 13, 6, 13, 12], [1, 727, 13, 6, 13, 12], [1, 768, 12, 16, 12, 2], [62, 3, 17, 16, 17, 2], [62, 54, 17, 16, 17, 2], [62, 105, 17, 16, 17, 2], [62, 156, 17, 16, 17, 2], [62, 207, 17, 16, 17, 2], [62, 258, 17, 16, 17, 2], [62, 309, 17, 16, 17, 2], [62, 360, 17, 16, 17, 2], [62, 411, 17, 16, 17, 2], [62, 462, 17, 16, 17, 2], [62, 518, 12, 11, 12, 7], [62, 569, 12, 14, 12, 7], [62, 621, 19, 10, 19, 8], [62, 674, 19, 8, 19, 10], [62, 723, 19, 10, 19, 8], [62, 768, 16, 16, 16, 2], [123, 3, 27, 19, 27, 2], [123, 54, 22, 16, 22, 2], [123, 105, 21, 16, 21, 2], [123, 156, 21, 16, 21, 2], [123, 207, 22, 16, 22, 2], [123, 258, 20, 16, 20, 2], [123, 309, 18, 16, 18, 2], [123, 360, 22, 16, 22, 2], [123, 411, 22, 16, 22, 2], [123, 462, 13, 16, 13, 2], [123, 513, 14, 16, 14, 2], [123, 564, 22, 16, 22, 2], [123, 615, 20, 16, 20, 2], [123, 666, 26, 16, 26, 2], [123, 717, 22, 16, 22, 2], [123, 768, 22, 16, 22, 2], [184, 3, 18, 16, 18, 2], [184, 54, 22, 20, 22, 2], [184, 105, 21, 16, 21, 2], [184, 156, 18, 16, 18, 2], [184, 207, 20, 16, 20, 2], [184, 258, 22, 16, 22, 2], [184, 309, 22, 16, 22, 2], [184, 360, 28, 16, 28, 2], [184, 411, 22, 16, 22, 2], [184, 462, 22, 16, 22, 2], [184, 513, 20, 16, 20, 2], [184, 564, 13, 21, 13, 2], [184, 615, 12, 16, 12, 2], [184, 666, 13, 21, 13, 2], [184, 717, 16, 16, 16, 2], [184, 778, 17, 11, 17, 12], [245, 3, 13, 16, 13, 2], [245, 59, 16, 11, 16, 7], [245, 105, 17, 16, 17, 2], [245, 161, 16, 11, 16, 7], [245, 207, 17, 16, 17, 2], [245, 263, 16, 11, 16, 7], [245, 309, 13, 16, 13, 2], [245, 365, 17, 17, 17, 7], [245, 411, 17, 16, 17, 2], [245, 462, 12, 16, 12, 2], [245, 513, 12, 22, 12, 2], [245, 564, 17, 16, 17, 2], [245, 615, 12, 16, 12, 2], [245, 671, 24, 11, 24, 7], [245, 722, 17, 11, 17, 7], [245, 773, 17, 11, 17, 7], [306, 8, 17, 17, 17, 7], [306, 59, 17, 17, 17, 7], [306, 110, 13, 11, 13, 7], [306, 161, 14, 11, 14, 7], [306, 210, 12, 13, 12, 5], [306, 263, 17, 11, 17, 7], [306, 314, 17, 11, 17, 7], [306, 365, 22, 11, 22, 7], [306, 416, 17, 11, 17, 7], [306, 467, 17, 17, 17, 7], [306, 518, 16, 11, 16, 7], [306, 564, 17, 21, 17, 2], [306, 615, 10, 21, 10, 2], [306, 666, 17, 21, 17, 2], [306, 723, 18, 10, 18, 8], [306, 768, 6, 16, 6, 2], [367, 1, 22, 18, 22, 0], [367, 52, 22, 18, 22, 0], [367, 105, 21, 21, 21, 2], [367, 154, 20, 18, 20, 0], [367, 205, 22, 18, 22, 0], [367, 256, 22, 18, 22, 0], [367, 307, 22, 18, 22, 0], [367, 361, 16, 15, 16, 3], [367, 412, 16, 15, 16, 3], [367, 463, 16, 15, 16, 3], [367, 515, 16, 14, 16, 4], [367, 566, 16, 14, 16, 4], [367, 615, 16, 16, 16, 2], [367, 671, 16, 15, 16, 7], [367, 718, 16, 15, 16, 3], [367, 769, 16, 15, 16, 3], [428, 4, 16, 15, 16, 3], [428, 56, 16, 14, 16, 4], [428, 106, 12, 15, 12, 3], [428, 157, 12, 15, 12, 3], [428, 208, 12, 15, 12, 3], [428, 261, 12, 13, 12, 5], [428, 310, 17, 15, 17, 3], [428, 361, 17, 15, 17, 3], [428, 412, 17, 15, 17, 3], [428, 463, 17, 15, 17, 3], [428, 515, 17, 14, 17, 4], [428, 566, 17, 14, 17, 4], [428, 616, 17, 15, 17, 3], [428, 667, 17, 15, 17, 3], [428, 718, 17, 15, 17, 3], [428, 770, 17, 14, 17, 4], [489, 2, 17, 20, 17, 1], [489, 54, 12, 16, 12, 2], [489, 108, 17, 15, 17, 5], [489, 156, 17, 16, 17, 2], [489, 205, 17, 20, 17, 0], [489, 263, 13, 11, 13, 7], [489, 309, 16, 22, 16, 2], [489, 360, 17, 16, 17, 2], [489, 411, 24, 16, 24, 2], [489, 462, 24, 16, 24, 2], [489, 513, 27, 16, 27, 2], [489, 564, 13, 16, 13, 2], [489, 615, 13, 16, 13, 2], [489, 672, 18, 10, 18, 8], [489, 717, 26, 16, 26, 2], [489, 768, 22, 16, 22, 2], [550, 9, 22, 10, 22, 8], [550, 58, 19, 12, 19, 6], [550, 110, 19, 11, 19, 7], [550, 161, 19, 11, 19, 7], [550, 207, 17, 16, 17, 2], [550, 263, 19, 16, 19, 7], [550, 309, 17, 16, 17, 2], [550, 360, 22, 18, 22, 2], [550, 411, 25, 18, 25, 2], [550, 467, 19, 11, 19, 7], [550, 513, 12, 20, 12, 2], [550, 564, 12, 16, 12, 2], [550, 615, 12, 16, 12, 2], [550, 666, 23, 16, 23, 2], [550, 722, 21, 11, 21, 7], [550, 773, 17, 11, 17, 7], [611, 8, 16, 17, 16, 7], [611, 59, 13, 17, 13, 7], [611, 115, 22, 6, 22, 12], [611, 154, 18, 18, 18, 0], [611, 207, 17, 21, 17, 2], [611, 265, 18, 9, 18, 9], [611, 309, 20, 16, 20, 2], [611, 366, 17, 10, 17, 8], [611, 417, 17, 10, 17, 8], [611, 472, 29, 6, 29, 12], [611, 523, 11, 6, 11, 12], [611, 562, 22, 18, 22, 0], [611, 613, 22, 18, 22, 0], [611, 664, 22, 18, 22, 0], [611, 717, 26, 16, 26, 2], [611, 773, 22, 11, 22, 7], [672, 13, 17, 6, 17, 12], [672, 64, 29, 6, 29, 12], [672, 105, 16, 16, 16, 2], [672, 156, 16, 16, 16, 2], [672, 207, 13, 16, 13, 2], [672, 258, 13, 16, 13, 2], [672, 315, 18, 10, 18, 8], [672, 360, 17, 16, 17, 2], [672, 413, 17, 20, 17, 4], [1, 13, 11, 6, 11, 12], [794, 768, 12, 16, 12, 2], [672, 568, 17, 12, 17, 6], [672, 620, 13, 11, 13, 7], [672, 671, 13, 11, 13, 7], [672, 717, 18, 16, 18, 2], [672, 768, 18, 16, 18, 2], [733, 2, 17, 21, 17, 1], [733, 61, 13, 9, 13, 9], [733, 115, 13, 9, 13, 12], [733, 166, 16, 9, 16, 12], [733, 206, 29, 17, 29, 1], [733, 256, 22, 18, 22, 0], [733, 307, 20, 18, 20, 0], [733, 358, 22, 18, 22, 0], [733, 409, 20, 18, 20, 0], [733, 460, 20, 18, 20, 0], [733, 511, 13, 18, 13, 0], [733, 562, 13, 18, 13, 0], [733, 613, 13, 18, 13, 0], [733, 664, 13, 18, 13, 0], [733, 715, 22, 18, 22, 0], [733, 766, 22, 18, 22, 0], [1, 13, 11, 6, 11, 12], [794, 52, 22, 18, 22, 0], [794, 103, 22, 18, 22, 0], [794, 154, 22, 18, 22, 0], [794, 205, 22, 18, 22, 0], [794, 263, 12, 11, 12, 7], [794, 309, 13, 16, 13, 2], [794, 361, 13, 15, 13, 3], [794, 412, 13, 15, 13, 3], [794, 463, 13, 15, 13, 3], [794, 514, 13, 15, 13, 3], [794, 564, 13, 16, 13, 2], [794, 625, 13, 11, 13, 12], [794, 666, 13, 16, 13, 2], [794, 727, 13, 10, 13, 12], [794, 768, 12, 16, 12, 2], [855, 3, 12, 16, 12, 2], [855, 54, 12, 16, 12, 2], [855, 105, 12, 16, 12, 2], [855, 156, 12, 16, 12, 2], [855, 207, 12, 16, 12, 2], [855, 258, 12, 16, 12, 2], [855, 309, 12, 16, 12, 2], [855, 360, 12, 16, 12, 2], [855, 411, 12, 16, 12, 2], [855, 462, 12, 16, 12, 2], [855, 513, 12, 16, 12, 2], [855, 564, 12, 16, 12, 2], [855, 615, 12, 16, 12, 2], [855, 666, 12, 16, 12, 2], [855, 717, 12, 16, 12, 2], [855, 768, 12, 16, 12, 2]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 20, 18, 13, 2], [1, 105, 21, 7, 15, 2], [1, 157, 23, 16, 17, 3], [1, 205, 24, 23, 17, 0], [1, 257, 32, 19, 25, 1], [1, 309, 28, 18, 24, 2], [1, 360, 17, 7, 11, 2], [1, 411, 20, 23, 13, 2], [1, 462, 18, 23, 13, 2], [1, 513, 23, 10, 17, 2], [1, 569, 21, 13, 19, 7], [1, 629, 12, 7, 13, 16], [1, 676, 16, 3, 13, 12], [1, 731, 11, 4, 13, 16], [1, 768, 19, 18, 12, 2], [62, 3, 23, 18, 17, 2], [62, 54, 21, 18, 17, 2], [62, 105, 22, 18, 17, 2], [62, 156, 22, 18, 17, 2], [62, 207, 23, 18, 17, 2], [62, 258, 24, 18, 17, 2], [62, 309, 24, 18, 17, 2], [62, 360, 24, 18, 17, 2], [62, 411, 23, 18, 17, 2], [62, 462, 24, 18, 17, 2], [62, 518, 16, 13, 12, 7], [62, 569, 16, 16, 12, 7], [62, 621, 22, 11, 19, 8], [62, 674, 23, 7, 19, 10], [62, 723, 21, 11, 19, 8], [62, 768, 23, 18, 16, 2], [123, 3, 33, 21, 27, 2], [123, 54, 24, 18, 22, 2], [123, 105, 26, 18, 21, 2], [123, 156, 28, 18, 21, 2], [123, 207, 27, 18, 22, 2], [123, 258, 27, 18, 20, 2], [123, 309, 25, 18, 18, 2], [123, 360, 29, 18, 22, 2], [123, 411, 29, 18, 22, 2], [123, 462, 20, 18, 13, 2], [123, 513, 21, 18, 14, 2], [123, 564, 29, 18, 22, 2], [123, 615, 22, 18, 20, 2], [123, 666, 33, 18, 26, 2], [123, 717, 29, 18, 22, 2], [123, 768, 28, 18, 22, 2], [184, 3, 25, 18, 18, 2], [184, 54, 28, 22, 22, 2], [184, 105, 25, 18, 21, 2], [184, 156, 25, 18, 18, 2], [184, 207, 27, 18, 20, 2], [184, 258, 29, 18, 22, 2], [184, 309, 29, 18, 22, 2], [184, 360, 35, 18, 28, 2], [184, 411, 29, 18, 22, 2], [184, 462, 29, 18, 22, 2], [184, 513, 27, 18, 20, 2], [184, 564, 20, 23, 13, 2], [184, 615, 16, 18, 12, 2], [184, 666, 20, 23, 13, 2], [184, 717, 20, 10, 16, 2], [184, 788, 16, 3, 17, 22], [245, 3, 19, 6, 13, 2], [245, 59, 20, 13, 16, 7], [245, 105, 21, 18, 17, 2], [245, 161, 21, 13, 16, 7], [245, 207, 24, 18, 17, 2], [245, 263, 21, 13, 16, 7], [245, 309, 20, 18, 13, 2], [245, 365, 23, 19, 17, 7], [245, 411, 21, 18, 17, 2], [245, 462, 18, 18, 12, 2], [245, 513, 19, 24, 12, 2], [245, 564, 23, 18, 17, 2], [245, 615, 18, 18, 12, 2], [245, 671, 27, 13, 24, 7], [245, 722, 21, 13, 17, 7], [245, 773, 21, 13, 17, 7], [306, 8, 21, 19, 17, 7], [306, 59, 21, 19, 17, 7], [306, 110, 19, 13, 13, 7], [306, 161, 20, 13, 14, 7], [306, 210, 18, 15, 12, 5], [306, 263, 22, 13, 17, 7], [306, 314, 24, 13, 17, 7], [306, 365, 28, 13, 22, 7], [306, 416, 23, 13, 17, 7], [306, 467, 24, 19, 17, 7], [306, 518, 22, 13, 16, 7], [306, 564, 22, 23, 17, 2], [306, 615, 17, 23, 10, 2], [306, 666, 20, 23, 17, 2], [306, 723, 23, 5, 18, 8], [306, 768, 13, 18, 6, 2], [367, 1, 26, 20, 22, 0], [367, 52, 26, 20, 22, 0], [367, 105, 28, 23, 21, 2], [367, 154, 27, 20, 20, 0], [367, 205, 29, 20, 22, 0], [367, 256, 28, 20, 22, 0], [367, 307, 29, 20, 22, 0], [367, 361, 21, 17, 16, 3], [367, 412, 20, 17, 16, 3], [367, 463, 21, 17, 16, 3], [367, 515, 21, 16, 16, 4], [367, 566, 22, 16, 16, 4], [367, 615, 22, 18, 16, 2], [367, 671, 21, 17, 16, 7], [367, 718, 21, 17, 16, 3], [367, 769, 21, 17, 16, 3], [428, 4, 22, 17, 16, 3], [428, 56, 21, 16, 16, 4], [428, 106, 18, 17, 12, 3], [428, 157, 17, 17, 12, 3], [428, 208, 19, 17, 12, 3], [428, 261, 18, 15, 12, 5], [428, 310, 24, 17, 17, 3], [428, 361, 21, 17, 17, 3], [428, 412, 21, 17, 17, 3], [428, 463, 22, 17, 17, 3], [428, 515, 21, 16, 17, 4], [428, 566, 23, 16, 17, 4], [428, 616, 22, 17, 17, 3], [428, 667, 22, 17, 17, 3], [428, 718, 22, 17, 17, 3], [428, 770, 22, 16, 17, 4], [489, 2, 22, 22, 17, 1], [489, 54, 19, 7, 12, 2], [489, 108, 21, 17, 17, 5], [489, 156, 24, 18, 17, 2], [489, 205, 24, 22, 17, 0], [489, 263, 18, 8, 13, 7], [489, 309, 23, 24, 16, 2], [489, 360, 23, 18, 17, 2], [489, 411, 29, 18, 24, 2], [489, 462, 29, 18, 24, 2], [489, 513, 34, 9, 27, 2], [489, 564, 20, 6, 13, 2], [489, 615, 20, 3, 13, 2], [489, 672, 22, 11, 18, 8], [489, 717, 33, 18, 26, 2], [489, 768, 28, 18, 22, 2], [550, 9, 25, 9, 22, 8], [550, 58, 21, 14, 19, 6], [550, 110, 23, 13, 19, 7], [550, 161, 21, 13, 19, 7], [550, 207, 24, 18, 17, 2], [550, 263, 21, 18, 19, 7], [550, 309, 22, 18, 17, 2], [550, 360, 28, 20, 22, 2], [550, 411, 31, 20, 25, 2], [550, 467, 24, 13, 19, 7], [550, 513, 19, 22, 12, 2], [550, 564, 19, 11, 12, 2], [550, 615, 19, 11, 12, 2], [550, 666, 28, 18, 23, 2], [550, 722, 26, 13, 21, 7], [550, 773, 23, 13, 17, 7], [611, 8, 19, 19, 16, 7], [611, 59, 17, 19, 13, 7], [611, 115, 23, 7, 22, 12], [611, 155, 25, 19, 18, 1], [611, 207, 24, 23, 17, 2], [611, 265, 24, 9, 18, 9], [611, 309, 22, 18, 20, 2], [611, 366, 22, 12, 17, 8], [611, 417, 20, 12, 17, 8], [611, 476, 28, 4, 29, 16], [611, 511, 1, 1, 11, 1], [611, 562, 24, 20, 22, 0], [611, 613, 28, 20, 22, 0], [611, 664, 28, 20, 22, 0], [611, 717, 33, 18, 26, 2], [611, 773, 27, 13, 22, 7], [672, 13, 20, 3, 17, 12], [672, 64, 31, 3, 29, 12], [672, 105, 21, 7, 16, 2], [672, 156, 22, 7, 16, 2], [672, 207, 19, 7, 13, 2], [672, 258, 18, 7, 13, 2], [672, 315, 21, 11, 18, 8], [672, 360, 21, 18, 17, 2], [672, 413, 24, 22, 17, 4], [1, 1, 1, 1, 11, 1], [794, 768, 19, 5, 12, 2], [672, 568, 22, 11, 17, 6], [672, 620, 19, 13, 13, 7], [672, 671, 16, 13, 13, 7], [672, 717, 23, 18, 18, 2], [672, 768, 24, 18, 18, 2], [733, 2, 21, 23, 17, 1], [733, 61, 16, 4, 13, 9], [733, 119, 12, 7, 13, 16], [733, 170, 15, 7, 16, 16], [733, 206, 33, 19, 29, 1], [733, 256, 25, 20, 22, 0], [733, 307, 27, 20, 20, 0], [733, 358, 25, 20, 22, 0], [733, 409, 27, 20, 20, 0], [733, 460, 27, 20, 20, 0], [733, 511, 20, 20, 13, 0], [733, 562, 20, 20, 13, 0], [733, 613, 20, 20, 13, 0], [733, 664, 20, 20, 13, 0], [733, 715, 28, 20, 22, 0], [733, 766, 28, 20, 22, 0], [1, 1, 1, 1, 11, 1], [794, 52, 28, 20, 22, 0], [794, 103, 29, 20, 22, 0], [794, 154, 29, 20, 22, 0], [794, 205, 29, 20, 22, 0], [794, 263, 16, 13, 12, 7], [794, 309, 19, 5, 13, 2], [794, 361, 20, 4, 13, 3], [794, 412, 20, 3, 13, 3], [794, 463, 20, 4, 13, 3], [794, 514, 18, 4, 13, 3], [794, 564, 19, 6, 13, 2], [794, 630, 12, 8, 13, 17], [794, 666, 20, 6, 13, 2], [794, 733, 12, 6, 13, 18], [794, 768, 19, 5, 12, 2], [855, 3, 19, 5, 12, 2], [855, 54, 19, 5, 12, 2], [855, 105, 19, 5, 12, 2], [855, 156, 19, 5, 12, 2], [855, 207, 19, 5, 12, 2], [855, 258, 19, 5, 12, 2], [855, 309, 19, 5, 12, 2], [855, 360, 19, 5, 12, 2], [855, 411, 19, 5, 12, 2], [855, 462, 19, 5, 12, 2], [855, 513, 19, 5, 12, 2], [855, 564, 19, 5, 12, 2], [855, 615, 19, 5, 12, 2], [855, 666, 19, 5, 12, 2], [855, 717, 19, 5, 12, 2], [855, 768, 19, 5, 12, 2]], \"capHeight\": 19, \"widestlogicalchar\": 29, \"widestglyph\": 35, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 19, 16, 11, 2], [1, 105, 20, 5, 13, 2], [1, 157, 22, 14, 15, 3], [1, 205, 23, 21, 15, 0], [1, 257, 31, 17, 23, 1], [1, 309, 27, 16, 22, 2], [1, 360, 16, 5, 9, 2], [1, 412, 19, 20, 11, 3], [1, 462, 17, 21, 11, 2], [1, 513, 22, 8, 15, 2], [1, 569, 20, 11, 17, 7], [1, 629, 11, 5, 11, 16], [1, 676, 15, 1, 11, 12], [1, 731, 10, 2, 11, 16], [1, 770, 18, 14, 10, 4], [62, 3, 22, 16, 15, 2], [62, 54, 20, 16, 15, 2], [62, 105, 21, 16, 15, 2], [62, 156, 21, 16, 15, 2], [62, 207, 22, 16, 15, 2], [62, 258, 23, 16, 15, 2], [62, 309, 23, 16, 15, 2], [62, 360, 23, 16, 15, 2], [62, 411, 22, 16, 15, 2], [62, 462, 23, 16, 15, 2], [62, 518, 15, 11, 10, 7], [62, 569, 15, 14, 10, 7], [62, 621, 21, 9, 17, 8], [62, 674, 22, 5, 17, 10], [62, 723, 20, 9, 17, 8], [62, 768, 22, 16, 14, 2], [123, 3, 32, 19, 25, 2], [123, 54, 23, 16, 20, 2], [123, 105, 25, 16, 19, 2], [123, 156, 27, 16, 19, 2], [123, 207, 26, 16, 20, 2], [123, 258, 26, 16, 18, 2], [123, 309, 24, 16, 16, 2], [123, 360, 28, 16, 20, 2], [123, 411, 28, 16, 20, 2], [123, 462, 19, 16, 11, 2], [123, 513, 20, 16, 12, 2], [123, 564, 28, 16, 20, 2], [123, 615, 21, 16, 18, 2], [123, 666, 32, 16, 24, 2], [123, 717, 28, 16, 20, 2], [123, 768, 27, 16, 20, 2], [184, 3, 24, 16, 16, 2], [184, 54, 27, 20, 20, 2], [184, 105, 24, 16, 19, 2], [184, 156, 24, 16, 16, 2], [184, 207, 26, 16, 18, 2], [184, 258, 28, 16, 20, 2], [184, 309, 28, 16, 20, 2], [184, 360, 34, 16, 26, 2], [184, 411, 28, 16, 20, 2], [184, 462, 28, 16, 20, 2], [184, 513, 26, 16, 18, 2], [184, 564, 19, 21, 11, 2], [184, 615, 15, 16, 10, 2], [184, 666, 19, 21, 11, 2], [184, 717, 19, 8, 14, 2], [184, 788, 15, 1, 15, 22], [245, 3, 18, 4, 11, 2], [245, 59, 19, 11, 14, 7], [245, 105, 20, 16, 15, 2], [245, 161, 20, 11, 14, 7], [245, 207, 23, 16, 15, 2], [245, 263, 20, 11, 14, 7], [245, 309, 19, 16, 11, 2], [245, 365, 22, 17, 15, 7], [245, 411, 20, 16, 15, 2], [245, 462, 17, 16, 10, 2], [245, 513, 18, 22, 10, 2], [245, 564, 22, 16, 15, 2], [245, 615, 17, 16, 10, 2], [245, 671, 26, 11, 22, 7], [245, 722, 20, 11, 15, 7], [245, 773, 20, 11, 15, 7], [306, 8, 20, 17, 15, 7], [306, 59, 20, 17, 15, 7], [306, 110, 18, 11, 11, 7], [306, 161, 19, 11, 12, 7], [306, 210, 17, 13, 10, 5], [306, 263, 21, 11, 15, 7], [306, 314, 23, 11, 15, 7], [306, 365, 27, 11, 20, 7], [306, 416, 22, 11, 15, 7], [306, 467, 23, 17, 15, 7], [306, 518, 21, 11, 14, 7], [306, 564, 21, 21, 15, 2], [306, 615, 16, 21, 8, 2], [306, 666, 19, 21, 15, 2], [306, 723, 22, 3, 16, 8], [306, 768, 12, 16, 4, 2], [367, 1, 23, 18, 20, 0], [367, 52, 25, 18, 20, 0], [367, 105, 27, 21, 19, 2], [367, 154, 26, 18, 18, 0], [367, 205, 28, 18, 20, 0], [367, 256, 27, 18, 20, 0], [367, 307, 28, 18, 20, 0], [367, 361, 20, 15, 14, 3], [367, 412, 19, 15, 14, 3], [367, 463, 20, 15, 14, 3], [367, 515, 20, 14, 14, 4], [367, 566, 21, 14, 14, 4], [367, 615, 21, 16, 14, 2], [367, 671, 20, 15, 14, 7], [367, 718, 20, 15, 14, 3], [367, 769, 20, 15, 14, 3], [428, 4, 21, 15, 14, 3], [428, 56, 20, 14, 14, 4], [428, 106, 17, 15, 10, 3], [428, 157, 16, 15, 10, 3], [428, 208, 18, 15, 10, 3], [428, 261, 17, 13, 10, 5], [428, 310, 23, 15, 15, 3], [428, 361, 20, 15, 15, 3], [428, 412, 20, 15, 15, 3], [428, 463, 21, 15, 15, 3], [428, 515, 20, 14, 15, 4], [428, 566, 22, 14, 15, 4], [428, 616, 21, 15, 15, 3], [428, 667, 21, 15, 15, 3], [428, 718, 21, 15, 15, 3], [428, 770, 21, 14, 15, 4], [489, 2, 21, 20, 15, 1], [489, 54, 18, 5, 10, 2], [489, 108, 20, 15, 15, 5], [489, 156, 23, 16, 15, 2], [489, 205, 23, 20, 15, 0], [489, 263, 17, 6, 11, 7], [489, 309, 22, 22, 14, 2], [489, 360, 22, 16, 15, 2], [489, 411, 28, 16, 22, 2], [489, 462, 28, 16, 22, 2], [489, 513, 33, 7, 25, 2], [489, 564, 19, 4, 11, 2], [489, 615, 19, 1, 11, 2], [489, 672, 21, 9, 16, 8], [489, 717, 32, 16, 24, 2], [489, 768, 27, 16, 20, 2], [550, 9, 24, 7, 20, 8], [550, 58, 20, 12, 17, 6], [550, 110, 22, 11, 17, 7], [550, 161, 20, 11, 17, 7], [550, 207, 23, 16, 15, 2], [550, 263, 20, 16, 17, 7], [550, 309, 21, 16, 15, 2], [550, 360, 27, 18, 20, 2], [550, 411, 30, 18, 23, 2], [550, 467, 23, 11, 17, 7], [550, 513, 18, 20, 10, 2], [550, 564, 18, 9, 10, 2], [550, 615, 18, 9, 10, 2], [550, 666, 27, 16, 21, 2], [550, 722, 25, 11, 19, 7], [550, 773, 22, 11, 15, 7], [611, 8, 18, 17, 14, 7], [611, 59, 16, 17, 11, 7], [611, 115, 22, 5, 20, 12], [611, 157, 24, 15, 16, 3], [611, 207, 23, 21, 15, 2], [611, 265, 23, 7, 16, 9], [611, 309, 21, 16, 18, 2], [611, 366, 21, 10, 15, 8], [611, 417, 19, 10, 15, 8], [611, 476, 27, 2, 27, 16], [611, 511, 1, 1, 9, 1], [611, 562, 23, 18, 20, 0], [611, 613, 26, 18, 20, 0], [611, 664, 27, 18, 20, 0], [611, 717, 32, 16, 24, 2], [611, 773, 26, 11, 20, 7], [672, 13, 19, 1, 15, 12], [672, 64, 30, 1, 27, 12], [672, 105, 20, 5, 14, 2], [672, 156, 21, 5, 14, 2], [672, 207, 18, 5, 11, 2], [672, 258, 17, 5, 11, 2], [672, 315, 20, 9, 16, 8], [672, 360, 20, 16, 15, 2], [672, 413, 23, 20, 15, 4], [1, 1, 1, 1, 9, 1], [794, 768, 18, 3, 10, 2], [672, 568, 21, 9, 15, 6], [672, 620, 18, 11, 11, 7], [672, 671, 15, 11, 11, 7], [672, 717, 22, 16, 16, 2], [672, 768, 23, 16, 16, 2], [733, 2, 20, 21, 15, 1], [733, 61, 15, 2, 11, 9], [733, 119, 11, 5, 11, 16], [733, 170, 14, 5, 14, 16], [733, 206, 32, 17, 27, 1], [733, 256, 24, 18, 20, 0], [733, 307, 26, 18, 18, 0], [733, 358, 23, 18, 20, 0], [733, 409, 26, 18, 18, 0], [733, 460, 26, 18, 18, 0], [733, 511, 19, 18, 11, 0], [733, 562, 19, 18, 11, 0], [733, 613, 19, 18, 11, 0], [733, 664, 19, 18, 11, 0], [733, 715, 27, 18, 20, 0], [733, 766, 27, 18, 20, 0], [1, 1, 1, 1, 9, 1], [794, 52, 27, 18, 20, 0], [794, 103, 28, 18, 20, 0], [794, 154, 28, 18, 20, 0], [794, 205, 28, 18, 20, 0], [794, 263, 15, 11, 10, 7], [794, 309, 18, 3, 11, 2], [794, 361, 18, 2, 11, 3], [794, 412, 19, 1, 11, 3], [794, 463, 19, 2, 11, 3], [794, 514, 17, 2, 11, 3], [794, 564, 18, 4, 11, 2], [794, 630, 11, 6, 11, 17], [794, 666, 19, 4, 11, 2], [794, 733, 11, 4, 11, 18], [794, 768, 18, 3, 10, 2], [855, 3, 18, 3, 10, 2], [855, 54, 18, 3, 10, 2], [855, 105, 18, 3, 10, 2], [855, 156, 18, 3, 10, 2], [855, 207, 18, 3, 10, 2], [855, 258, 18, 3, 10, 2], [855, 309, 18, 3, 10, 2], [855, 360, 18, 3, 10, 2], [855, 411, 18, 3, 10, 2], [855, 462, 18, 3, 10, 2], [855, 513, 18, 3, 10, 2], [855, 564, 18, 3, 10, 2], [855, 615, 18, 3, 10, 2], [855, 666, 18, 3, 10, 2], [855, 717, 18, 3, 10, 2], [855, 768, 18, 3, 10, 2]], \"capHeight\": 18, \"widestlogicalchar\": 27, \"widestglyph\": 34, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 11, 6, 11, 13], [1, 54, 13, 18, 13, 2], [1, 105, 15, 17, 15, 2], [1, 157, 17, 16, 17, 3], [1, 205, 17, 23, 17, 0], [1, 257, 25, 19, 25, 1], [1, 309, 24, 18, 24, 2], [1, 360, 11, 17, 11, 2], [1, 411, 13, 23, 13, 2], [1, 462, 13, 23, 13, 2], [1, 513, 17, 17, 17, 2], [1, 569, 19, 13, 19, 7], [1, 626, 13, 10, 13, 13], [1, 676, 13, 7, 13, 12], [1, 728, 13, 7, 13, 13], [1, 768, 12, 18, 12, 2], [62, 3, 17, 18, 17, 2], [62, 54, 17, 18, 17, 2], [62, 105, 17, 18, 17, 2], [62, 156, 17, 18, 17, 2], [62, 207, 17, 18, 17, 2], [62, 258, 17, 18, 17, 2], [62, 309, 17, 18, 17, 2], [62, 360, 17, 18, 17, 2], [62, 411, 17, 18, 17, 2], [62, 462, 17, 18, 17, 2], [62, 518, 12, 13, 12, 7], [62, 569, 12, 16, 12, 7], [62, 621, 19, 11, 19, 8], [62, 674, 19, 9, 19, 10], [62, 723, 19, 11, 19, 8], [62, 768, 16, 18, 16, 2], [123, 3, 27, 21, 27, 2], [123, 54, 22, 18, 22, 2], [123, 105, 21, 18, 21, 2], [123, 156, 21, 18, 21, 2], [123, 207, 22, 18, 22, 2], [123, 258, 20, 18, 20, 2], [123, 309, 18, 18, 18, 2], [123, 360, 22, 18, 22, 2], [123, 411, 22, 18, 22, 2], [123, 462, 13, 18, 13, 2], [123, 513, 14, 18, 14, 2], [123, 564, 22, 18, 22, 2], [123, 615, 20, 18, 20, 2], [123, 666, 26, 18, 26, 2], [123, 717, 22, 18, 22, 2], [123, 768, 22, 18, 22, 2], [184, 3, 18, 18, 18, 2], [184, 54, 22, 22, 22, 2], [184, 105, 21, 18, 21, 2], [184, 156, 18, 18, 18, 2], [184, 207, 20, 18, 20, 2], [184, 258, 22, 18, 22, 2], [184, 309, 22, 18, 22, 2], [184, 360, 28, 18, 28, 2], [184, 411, 22, 18, 22, 2], [184, 462, 22, 18, 22, 2], [184, 513, 20, 18, 20, 2], [184, 564, 13, 23, 13, 2], [184, 615, 12, 18, 12, 2], [184, 666, 13, 23, 13, 2], [184, 717, 16, 17, 16, 2], [184, 779, 17, 12, 17, 13], [245, 3, 13, 17, 13, 2], [245, 59, 16, 13, 16, 7], [245, 105, 17, 18, 17, 2], [245, 161, 16, 13, 16, 7], [245, 207, 17, 18, 17, 2], [245, 263, 16, 13, 16, 7], [245, 309, 13, 18, 13, 2], [245, 365, 17, 19, 17, 7], [245, 411, 17, 18, 17, 2], [245, 462, 12, 18, 12, 2], [245, 513, 12, 24, 12, 2], [245, 564, 17, 18, 17, 2], [245, 615, 12, 18, 12, 2], [245, 671, 24, 13, 24, 7], [245, 722, 17, 13, 17, 7], [245, 773, 17, 13, 17, 7], [306, 8, 17, 19, 17, 7], [306, 59, 17, 19, 17, 7], [306, 110, 13, 13, 13, 7], [306, 161, 14, 13, 14, 7], [306, 210, 12, 15, 12, 5], [306, 263, 17, 13, 17, 7], [306, 314, 17, 13, 17, 7], [306, 365, 22, 13, 22, 7], [306, 416, 17, 13, 17, 7], [306, 467, 17, 19, 17, 7], [306, 518, 16, 13, 16, 7], [306, 564, 17, 23, 17, 2], [306, 615, 10, 23, 10, 2], [306, 666, 17, 23, 17, 2], [306, 723, 18, 11, 18, 8], [306, 768, 6, 18, 6, 2], [367, 1, 22, 20, 22, 0], [367, 52, 22, 20, 22, 0], [367, 105, 21, 23, 21, 2], [367, 154, 20, 20, 20, 0], [367, 205, 22, 20, 22, 0], [367, 256, 22, 20, 22, 0], [367, 307, 22, 20, 22, 0], [367, 361, 16, 17, 16, 3], [367, 412, 16, 17, 16, 3], [367, 463, 16, 17, 16, 3], [367, 515, 16, 16, 16, 4], [367, 566, 16, 16, 16, 4], [367, 615, 16, 18, 16, 2], [367, 671, 16, 17, 16, 7], [367, 718, 16, 17, 16, 3], [367, 769, 16, 17, 16, 3], [428, 4, 16, 17, 16, 3], [428, 56, 16, 16, 16, 4], [428, 106, 12, 17, 12, 3], [428, 157, 12, 17, 12, 3], [428, 208, 12, 17, 12, 3], [428, 261, 12, 15, 12, 5], [428, 310, 17, 17, 17, 3], [428, 361, 17, 17, 17, 3], [428, 412, 17, 17, 17, 3], [428, 463, 17, 17, 17, 3], [428, 515, 17, 16, 17, 4], [428, 566, 17, 16, 17, 4], [428, 616, 17, 17, 17, 3], [428, 667, 17, 17, 17, 3], [428, 718, 17, 17, 17, 3], [428, 770, 17, 16, 17, 4], [489, 2, 17, 22, 17, 1], [489, 54, 12, 17, 12, 2], [489, 108, 17, 17, 17, 5], [489, 156, 17, 18, 17, 2], [489, 205, 17, 22, 17, 0], [489, 263, 13, 12, 13, 7], [489, 309, 16, 24, 16, 2], [489, 360, 17, 18, 17, 2], [489, 411, 24, 18, 24, 2], [489, 462, 24, 18, 24, 2], [489, 513, 27, 17, 27, 2], [489, 564, 13, 17, 13, 2], [489, 615, 13, 17, 13, 2], [489, 672, 18, 11, 18, 8], [489, 717, 26, 18, 26, 2], [489, 768, 22, 18, 22, 2], [550, 9, 22, 11, 22, 8], [550, 58, 19, 14, 19, 6], [550, 110, 19, 13, 19, 7], [550, 161, 19, 13, 19, 7], [550, 207, 17, 18, 17, 2], [550, 263, 19, 18, 19, 7], [550, 309, 17, 18, 17, 2], [550, 360, 22, 20, 22, 2], [550, 411, 25, 20, 25, 2], [550, 467, 19, 13, 19, 7], [550, 513, 12, 22, 12, 2], [550, 564, 12, 17, 12, 2], [550, 615, 12, 17, 12, 2], [550, 666, 23, 18, 23, 2], [550, 722, 21, 13, 21, 7], [550, 773, 17, 13, 17, 7], [611, 8, 16, 19, 16, 7], [611, 59, 13, 19, 13, 7], [611, 115, 22, 7, 22, 12], [611, 154, 18, 20, 18, 0], [611, 207, 17, 23, 17, 2], [611, 265, 18, 10, 18, 9], [611, 309, 20, 18, 20, 2], [611, 366, 17, 12, 17, 8], [611, 417, 17, 12, 17, 8], [611, 473, 29, 7, 29, 13], [611, 524, 11, 6, 11, 13], [611, 562, 22, 20, 22, 0], [611, 613, 22, 20, 22, 0], [611, 664, 22, 20, 22, 0], [611, 717, 26, 18, 26, 2], [611, 773, 22, 13, 22, 7], [672, 13, 17, 7, 17, 12], [672, 64, 29, 7, 29, 12], [672, 105, 16, 17, 16, 2], [672, 156, 16, 17, 16, 2], [672, 207, 13, 17, 13, 2], [672, 258, 13, 17, 13, 2], [672, 315, 18, 11, 18, 8], [672, 360, 17, 18, 17, 2], [672, 413, 17, 22, 17, 4], [1, 14, 11, 6, 11, 13], [794, 768, 12, 17, 12, 2], [672, 568, 17, 13, 17, 6], [672, 620, 13, 13, 13, 7], [672, 671, 13, 13, 13, 7], [672, 717, 18, 18, 18, 2], [672, 768, 18, 18, 18, 2], [733, 2, 17, 23, 17, 1], [733, 61, 13, 10, 13, 9], [733, 116, 13, 10, 13, 13], [733, 167, 16, 10, 16, 13], [733, 206, 29, 19, 29, 1], [733, 256, 22, 20, 22, 0], [733, 307, 20, 20, 20, 0], [733, 358, 22, 20, 22, 0], [733, 409, 20, 20, 20, 0], [733, 460, 20, 20, 20, 0], [733, 511, 13, 20, 13, 0], [733, 562, 13, 20, 13, 0], [733, 613, 13, 20, 13, 0], [733, 664, 13, 20, 13, 0], [733, 715, 22, 20, 22, 0], [733, 766, 22, 20, 22, 0], [1, 14, 11, 6, 11, 13], [794, 52, 22, 20, 22, 0], [794, 103, 22, 20, 22, 0], [794, 154, 22, 20, 22, 0], [794, 205, 22, 20, 22, 0], [794, 263, 12, 13, 12, 7], [794, 309, 13, 17, 13, 2], [794, 361, 13, 16, 13, 3], [794, 412, 13, 16, 13, 3], [794, 463, 13, 16, 13, 3], [794, 514, 13, 16, 13, 3], [794, 564, 13, 17, 13, 2], [794, 626, 13, 12, 13, 13], [794, 666, 13, 17, 13, 2], [794, 728, 13, 11, 13, 13], [794, 768, 12, 17, 12, 2], [855, 3, 12, 17, 12, 2], [855, 54, 12, 17, 12, 2], [855, 105, 12, 17, 12, 2], [855, 156, 12, 17, 12, 2], [855, 207, 12, 17, 12, 2], [855, 258, 12, 17, 12, 2], [855, 309, 12, 17, 12, 2], [855, 360, 12, 17, 12, 2], [855, 411, 12, 17, 12, 2], [855, 462, 12, 17, 12, 2], [855, 513, 12, 17, 12, 2], [855, 564, 12, 17, 12, 2], [855, 615, 12, 17, 12, 2], [855, 666, 12, 17, 12, 2], [855, 717, 12, 17, 12, 2], [855, 768, 12, 17, 12, 2]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 9, 6, 9, 12], [1, 54, 11, 16, 11, 2], [1, 105, 13, 16, 13, 2], [1, 157, 15, 15, 15, 3], [1, 205, 15, 21, 15, 0], [1, 257, 23, 17, 23, 1], [1, 309, 22, 16, 22, 2], [1, 360, 9, 16, 9, 2], [1, 411, 11, 21, 11, 2], [1, 462, 11, 21, 11, 2], [1, 513, 15, 16, 15, 2], [1, 569, 17, 11, 17, 7], [1, 625, 11, 9, 11, 12], [1, 676, 11, 6, 11, 12], [1, 727, 11, 6, 11, 12], [1, 768, 10, 16, 10, 2], [62, 3, 15, 16, 15, 2], [62, 54, 15, 16, 15, 2], [62, 105, 15, 16, 15, 2], [62, 156, 15, 16, 15, 2], [62, 207, 15, 16, 15, 2], [62, 258, 15, 16, 15, 2], [62, 309, 15, 16, 15, 2], [62, 360, 15, 16, 15, 2], [62, 411, 15, 16, 15, 2], [62, 462, 15, 16, 15, 2], [62, 518, 10, 11, 10, 7], [62, 569, 10, 14, 10, 7], [62, 621, 17, 10, 17, 8], [62, 674, 17, 8, 17, 10], [62, 723, 17, 10, 17, 8], [62, 768, 14, 16, 14, 2], [123, 3, 25, 19, 25, 2], [123, 54, 20, 16, 20, 2], [123, 105, 19, 16, 19, 2], [123, 156, 19, 16, 19, 2], [123, 207, 20, 16, 20, 2], [123, 258, 18, 16, 18, 2], [123, 309, 16, 16, 16, 2], [123, 360, 20, 16, 20, 2], [123, 411, 20, 16, 20, 2], [123, 462, 11, 16, 11, 2], [123, 513, 12, 16, 12, 2], [123, 564, 20, 16, 20, 2], [123, 615, 18, 16, 18, 2], [123, 666, 24, 16, 24, 2], [123, 717, 20, 16, 20, 2], [123, 768, 20, 16, 20, 2], [184, 3, 16, 16, 16, 2], [184, 54, 20, 20, 20, 2], [184, 105, 19, 16, 19, 2], [184, 156, 16, 16, 16, 2], [184, 207, 18, 16, 18, 2], [184, 258, 20, 16, 20, 2], [184, 309, 20, 16, 20, 2], [184, 360, 26, 16, 26, 2], [184, 411, 20, 16, 20, 2], [184, 462, 20, 16, 20, 2], [184, 513, 18, 16, 18, 2], [184, 564, 11, 21, 11, 2], [184, 615, 10, 16, 10, 2], [184, 666, 11, 21, 11, 2], [184, 717, 14, 16, 14, 2], [184, 778, 15, 11, 15, 12], [245, 3, 11, 16, 11, 2], [245, 59, 14, 11, 14, 7], [245, 105, 15, 16, 15, 2], [245, 161, 14, 11, 14, 7], [245, 207, 15, 16, 15, 2], [245, 263, 14, 11, 14, 7], [245, 309, 11, 16, 11, 2], [245, 365, 15, 17, 15, 7], [245, 411, 15, 16, 15, 2], [245, 462, 10, 16, 10, 2], [245, 513, 10, 22, 10, 2], [245, 564, 15, 16, 15, 2], [245, 615, 10, 16, 10, 2], [245, 671, 22, 11, 22, 7], [245, 722, 15, 11, 15, 7], [245, 773, 15, 11, 15, 7], [306, 8, 15, 17, 15, 7], [306, 59, 15, 17, 15, 7], [306, 110, 11, 11, 11, 7], [306, 161, 12, 11, 12, 7], [306, 210, 10, 13, 10, 5], [306, 263, 15, 11, 15, 7], [306, 314, 15, 11, 15, 7], [306, 365, 20, 11, 20, 7], [306, 416, 15, 11, 15, 7], [306, 467, 15, 17, 15, 7], [306, 518, 14, 11, 14, 7], [306, 564, 15, 21, 15, 2], [306, 615, 8, 21, 8, 2], [306, 666, 15, 21, 15, 2], [306, 723, 16, 10, 16, 8], [306, 768, 4, 16, 4, 2], [367, 1, 20, 18, 20, 0], [367, 52, 20, 18, 20, 0], [367, 105, 19, 21, 19, 2], [367, 154, 18, 18, 18, 0], [367, 205, 20, 18, 20, 0], [367, 256, 20, 18, 20, 0], [367, 307, 20, 18, 20, 0], [367, 361, 14, 15, 14, 3], [367, 412, 14, 15, 14, 3], [367, 463, 14, 15, 14, 3], [367, 515, 14, 14, 14, 4], [367, 566, 14, 14, 14, 4], [367, 615, 14, 16, 14, 2], [367, 671, 14, 15, 14, 7], [367, 718, 14, 15, 14, 3], [367, 769, 14, 15, 14, 3], [428, 4, 14, 15, 14, 3], [428, 56, 14, 14, 14, 4], [428, 106, 10, 15, 10, 3], [428, 157, 10, 15, 10, 3], [428, 208, 10, 15, 10, 3], [428, 261, 10, 13, 10, 5], [428, 310, 15, 15, 15, 3], [428, 361, 15, 15, 15, 3], [428, 412, 15, 15, 15, 3], [428, 463, 15, 15, 15, 3], [428, 515, 15, 14, 15, 4], [428, 566, 15, 14, 15, 4], [428, 616, 15, 15, 15, 3], [428, 667, 15, 15, 15, 3], [428, 718, 15, 15, 15, 3], [428, 770, 15, 14, 15, 4], [489, 2, 15, 20, 15, 1], [489, 54, 10, 16, 10, 2], [489, 108, 15, 15, 15, 5], [489, 156, 15, 16, 15, 2], [489, 205, 15, 20, 15, 0], [489, 263, 11, 11, 11, 7], [489, 309, 14, 22, 14, 2], [489, 360, 15, 16, 15, 2], [489, 411, 22, 16, 22, 2], [489, 462, 22, 16, 22, 2], [489, 513, 25, 16, 25, 2], [489, 564, 11, 16, 11, 2], [489, 615, 11, 16, 11, 2], [489, 672, 16, 10, 16, 8], [489, 717, 24, 16, 24, 2], [489, 768, 20, 16, 20, 2], [550, 9, 20, 10, 20, 8], [550, 58, 17, 12, 17, 6], [550, 110, 17, 11, 17, 7], [550, 161, 17, 11, 17, 7], [550, 207, 15, 16, 15, 2], [550, 263, 17, 16, 17, 7], [550, 309, 15, 16, 15, 2], [550, 360, 20, 18, 20, 2], [550, 411, 23, 18, 23, 2], [550, 467, 17, 11, 17, 7], [550, 513, 10, 20, 10, 2], [550, 564, 10, 16, 10, 2], [550, 615, 10, 16, 10, 2], [550, 666, 21, 16, 21, 2], [550, 722, 19, 11, 19, 7], [550, 773, 15, 11, 15, 7], [611, 8, 14, 17, 14, 7], [611, 59, 11, 17, 11, 7], [611, 115, 20, 6, 20, 12], [611, 154, 16, 18, 16, 0], [611, 207, 15, 21, 15, 2], [611, 265, 16, 9, 16, 9], [611, 309, 18, 16, 18, 2], [611, 366, 15, 10, 15, 8], [611, 417, 15, 10, 15, 8], [611, 472, 27, 6, 27, 12], [611, 523, 9, 6, 9, 12], [611, 562, 20, 18, 20, 0], [611, 613, 20, 18, 20, 0], [611, 664, 20, 18, 20, 0], [611, 717, 24, 16, 24, 2], [611, 773, 20, 11, 20, 7], [672, 13, 15, 6, 15, 12], [672, 64, 27, 6, 27, 12], [672, 105, 14, 16, 14, 2], [672, 156, 14, 16, 14, 2], [672, 207, 11, 16, 11, 2], [672, 258, 11, 16, 11, 2], [672, 315, 16, 10, 16, 8], [672, 360, 15, 16, 15, 2], [672, 413, 15, 20, 15, 4], [1, 13, 9, 6, 9, 12], [794, 768, 10, 16, 10, 2], [672, 568, 15, 12, 15, 6], [672, 620, 11, 11, 11, 7], [672, 671, 11, 11, 11, 7], [672, 717, 16, 16, 16, 2], [672, 768, 16, 16, 16, 2], [733, 2, 15, 21, 15, 1], [733, 61, 11, 9, 11, 9], [733, 115, 11, 9, 11, 12], [733, 166, 14, 9, 14, 12], [733, 206, 27, 17, 27, 1], [733, 256, 20, 18, 20, 0], [733, 307, 18, 18, 18, 0], [733, 358, 20, 18, 20, 0], [733, 409, 18, 18, 18, 0], [733, 460, 18, 18, 18, 0], [733, 511, 11, 18, 11, 0], [733, 562, 11, 18, 11, 0], [733, 613, 11, 18, 11, 0], [733, 664, 11, 18, 11, 0], [733, 715, 20, 18, 20, 0], [733, 766, 20, 18, 20, 0], [1, 13, 9, 6, 9, 12], [794, 52, 20, 18, 20, 0], [794, 103, 20, 18, 20, 0], [794, 154, 20, 18, 20, 0], [794, 205, 20, 18, 20, 0], [794, 263, 10, 11, 10, 7], [794, 309, 11, 16, 11, 2], [794, 361, 11, 15, 11, 3], [794, 412, 11, 15, 11, 3], [794, 463, 11, 15, 11, 3], [794, 514, 11, 15, 11, 3], [794, 564, 11, 16, 11, 2], [794, 625, 11, 11, 11, 12], [794, 666, 11, 16, 11, 2], [794, 727, 11, 10, 11, 12], [794, 768, 10, 16, 10, 2], [855, 3, 10, 16, 10, 2], [855, 54, 10, 16, 10, 2], [855, 105, 10, 16, 10, 2], [855, 156, 10, 16, 10, 2], [855, 207, 10, 16, 10, 2], [855, 258, 10, 16, 10, 2], [855, 309, 10, 16, 10, 2], [855, 360, 10, 16, 10, 2], [855, 411, 10, 16, 10, 2], [855, 462, 10, 16, 10, 2], [855, 513, 10, 16, 10, 2], [855, 564, 10, 16, 10, 2], [855, 615, 10, 16, 10, 2], [855, 666, 10, 16, 10, 2], [855, 717, 10, 16, 10, 2], [855, 768, 10, 16, 10, 2]], \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 22}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 10, 8, 7, 2], [1, 105, 11, 4, 8, 2], [1, 156, 12, 8, 9, 2], [1, 206, 12, 10, 9, 1], [1, 258, 14, 8, 11, 2], [1, 309, 13, 8, 11, 2], [1, 360, 9, 4, 6, 2], [1, 411, 10, 10, 7, 2], [1, 462, 10, 10, 7, 2], [1, 513, 12, 6, 9, 2], [1, 565, 12, 7, 9, 3], [1, 620, 8, 5, 7, 7], [1, 669, 10, 3, 7, 5], [1, 722, 8, 3, 7, 7], [1, 768, 10, 8, 7, 2], [62, 3, 12, 8, 9, 2], [62, 54, 11, 8, 9, 2], [62, 105, 12, 8, 9, 2], [62, 156, 12, 8, 9, 2], [62, 207, 11, 8, 9, 2], [62, 258, 12, 8, 9, 2], [62, 309, 11, 8, 9, 2], [62, 360, 12, 8, 9, 2], [62, 411, 12, 8, 9, 2], [62, 462, 12, 8, 9, 2], [62, 515, 9, 6, 7, 4], [62, 566, 9, 8, 7, 4], [62, 616, 12, 7, 9, 3], [62, 668, 11, 5, 9, 4], [62, 718, 11, 7, 9, 3], [62, 768, 11, 8, 8, 2], [123, 3, 14, 9, 12, 2], [123, 54, 12, 8, 10, 2], [123, 105, 13, 8, 10, 2], [123, 156, 12, 8, 10, 2], [123, 207, 12, 8, 10, 2], [123, 258, 12, 8, 9, 2], [123, 309, 12, 8, 9, 2], [123, 360, 13, 8, 10, 2], [123, 411, 13, 8, 10, 2], [123, 462, 11, 8, 7, 2], [123, 513, 12, 8, 8, 2], [123, 564, 14, 8, 10, 2], [123, 615, 11, 8, 9, 2], [123, 666, 15, 8, 12, 2], [123, 717, 14, 8, 10, 2], [123, 768, 13, 8, 10, 2], [184, 3, 12, 8, 9, 2], [184, 54, 13, 10, 10, 2], [184, 105, 13, 8, 10, 2], [184, 156, 12, 8, 9, 2], [184, 207, 13, 8, 9, 2], [184, 258, 14, 8, 10, 2], [184, 309, 14, 8, 10, 2], [184, 360, 15, 8, 12, 2], [184, 411, 13, 8, 10, 2], [184, 462, 14, 8, 10, 2], [184, 513, 12, 8, 9, 2], [184, 564, 10, 10, 7, 2], [184, 615, 9, 8, 7, 2], [184, 666, 10, 10, 7, 2], [184, 717, 11, 4, 8, 2], [184, 775, 10, 3, 9, 9], [245, 3, 10, 4, 7, 2], [245, 56, 10, 6, 8, 4], [245, 105, 11, 8, 9, 2], [245, 158, 10, 6, 8, 4], [245, 207, 11, 8, 8, 2], [245, 260, 10, 6, 8, 4], [245, 309, 10, 8, 7, 2], [245, 362, 11, 8, 9, 4], [245, 411, 11, 8, 9, 2], [245, 462, 10, 8, 7, 2], [245, 513, 10, 10, 7, 2], [245, 564, 11, 8, 9, 2], [245, 615, 10, 8, 7, 2], [245, 668, 13, 6, 11, 4], [245, 719, 11, 6, 9, 4], [245, 770, 11, 6, 9, 4], [306, 5, 11, 8, 9, 4], [306, 56, 10, 8, 8, 4], [306, 107, 10, 6, 7, 4], [306, 158, 10, 6, 8, 4], [306, 208, 9, 7, 7, 3], [306, 260, 10, 6, 8, 4], [306, 311, 12, 6, 9, 4], [306, 362, 13, 6, 10, 4], [306, 413, 11, 6, 9, 4], [306, 464, 12, 8, 9, 4], [306, 515, 10, 6, 8, 4], [306, 564, 11, 10, 8, 2], [306, 615, 9, 10, 6, 2], [306, 666, 10, 10, 8, 2], [306, 719, 11, 4, 9, 4], [306, 768, 9, 8, 9, 2], [367, 1, 13, 10, 10, 0], [367, 52, 14, 10, 10, 0], [367, 105, 13, 10, 10, 2], [367, 154, 13, 10, 9, 0], [367, 205, 14, 10, 10, 0], [367, 256, 13, 10, 10, 0], [367, 307, 14, 10, 10, 0], [367, 359, 11, 9, 8, 1], [367, 410, 10, 9, 8, 1], [367, 461, 11, 9, 8, 1], [367, 513, 11, 8, 8, 2], [367, 563, 12, 9, 8, 1], [367, 614, 11, 9, 8, 1], [367, 668, 10, 8, 8, 4], [367, 716, 12, 9, 8, 1], [367, 767, 11, 9, 8, 1], [428, 2, 11, 9, 8, 1], [428, 54, 11, 8, 8, 2], [428, 104, 11, 9, 7, 1], [428, 155, 10, 9, 7, 1], [428, 206, 11, 9, 7, 1], [428, 258, 11, 8, 7, 2], [428, 308, 13, 9, 9, 1], [428, 359, 12, 9, 9, 1], [428, 410, 11, 9, 9, 1], [428, 461, 12, 9, 9, 1], [428, 513, 12, 8, 9, 2], [428, 563, 13, 9, 9, 1], [428, 614, 11, 9, 8, 1], [428, 665, 10, 9, 8, 1], [428, 716, 11, 9, 8, 1], [428, 768, 11, 8, 8, 2], [489, 3, 11, 9, 9, 2], [489, 54, 10, 4, 7, 2], [489, 106, 12, 8, 9, 3], [489, 156, 12, 8, 9, 2], [489, 206, 12, 11, 9, 1], [489, 260, 9, 4, 7, 4], [489, 309, 11, 10, 8, 2], [489, 360, 12, 8, 9, 2], [489, 411, 14, 8, 11, 2], [489, 462, 14, 8, 11, 2], [489, 513, 15, 5, 12, 2], [489, 564, 10, 4, 7, 2], [489, 615, 11, 3, 7, 2], [489, 667, 12, 7, 9, 3], [489, 717, 15, 8, 12, 2], [489, 768, 13, 8, 10, 2], [550, 5, 12, 5, 10, 4], [550, 55, 12, 7, 9, 3], [550, 106, 12, 7, 9, 3], [550, 157, 11, 7, 9, 3], [550, 207, 13, 8, 9, 2], [550, 260, 11, 8, 9, 4], [550, 309, 12, 8, 9, 2], [550, 360, 13, 9, 10, 2], [550, 411, 15, 9, 12, 2], [550, 464, 12, 6, 9, 4], [550, 513, 11, 10, 7, 2], [550, 564, 9, 4, 6, 2], [550, 615, 10, 4, 7, 2], [550, 666, 14, 8, 11, 2], [550, 719, 12, 6, 10, 4], [550, 770, 11, 6, 9, 4], [611, 5, 9, 8, 8, 4], [611, 56, 9, 8, 7, 4], [611, 108, 12, 4, 10, 5], [611, 155, 13, 9, 9, 1], [611, 207, 11, 10, 9, 2], [611, 259, 12, 7, 9, 3], [611, 309, 11, 8, 10, 2], [611, 362, 11, 5, 9, 4], [611, 413, 11, 5, 9, 4], [611, 467, 14, 3, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 13, 10, 10, 0], [611, 613, 14, 10, 10, 0], [611, 664, 14, 10, 10, 0], [611, 717, 15, 8, 12, 2], [611, 770, 12, 6, 10, 4], [672, 6, 11, 3, 9, 5], [672, 57, 15, 3, 13, 5], [672, 105, 12, 5, 8, 2], [672, 156, 12, 5, 8, 2], [672, 207, 10, 5, 7, 2], [672, 258, 10, 5, 7, 2], [672, 310, 12, 7, 9, 3], [672, 360, 10, 8, 8, 2], [672, 411, 12, 10, 9, 2], [1, 1, 1, 1, 6, 1], [794, 766, 13, 4, 9, 0], [672, 565, 11, 6, 9, 3], [672, 617, 9, 6, 7, 4], [672, 668, 9, 6, 7, 4], [672, 717, 12, 8, 9, 2], [672, 768, 12, 8, 9, 2], [733, 3, 12, 8, 9, 2], [733, 56, 9, 3, 7, 4], [733, 110, 8, 5, 7, 7], [733, 161, 10, 5, 8, 7], [733, 207, 15, 8, 13, 2], [733, 256, 14, 10, 11, 0], [733, 307, 13, 10, 10, 0], [733, 358, 13, 10, 11, 0], [733, 409, 13, 10, 10, 0], [733, 460, 13, 10, 10, 0], [733, 511, 11, 10, 7, 0], [733, 562, 11, 10, 7, 0], [733, 613, 11, 10, 7, 0], [733, 664, 11, 10, 7, 0], [733, 715, 13, 10, 10, 0], [733, 766, 13, 10, 10, 0], [1, 1, 1, 1, 6, 1], [794, 52, 13, 10, 10, 0], [794, 103, 14, 10, 11, 0], [794, 154, 14, 10, 11, 0], [794, 205, 14, 10, 11, 0], [794, 260, 9, 6, 7, 4], [794, 309, 11, 4, 7, 2], [794, 360, 11, 4, 7, 2], [794, 411, 11, 3, 7, 2], [794, 462, 11, 4, 7, 2], [794, 513, 10, 3, 7, 2], [794, 564, 10, 3, 7, 2], [794, 619, 7, 6, 7, 6], [794, 666, 11, 4, 7, 2], [794, 722, 8, 5, 7, 7], [794, 766, 13, 4, 9, 0], [855, 1, 13, 4, 9, 0], [855, 52, 13, 4, 9, 0], [855, 103, 13, 4, 9, 0], [855, 154, 13, 4, 9, 0], [855, 205, 13, 4, 9, 0], [855, 256, 13, 4, 9, 0], [855, 307, 13, 4, 9, 0], [855, 358, 13, 4, 9, 0], [855, 409, 13, 4, 9, 0], [855, 460, 13, 4, 9, 0], [855, 511, 13, 4, 9, 0], [855, 562, 13, 4, 9, 0], [855, 613, 13, 4, 9, 0], [855, 664, 13, 4, 9, 0], [855, 715, 13, 4, 9, 0], [855, 766, 13, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 15, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 9, 6, 7, 2], [1, 105, 10, 2, 8, 2], [1, 156, 11, 6, 9, 2], [1, 206, 11, 8, 9, 1], [1, 258, 13, 6, 11, 2], [1, 309, 12, 6, 11, 2], [1, 360, 8, 2, 6, 2], [1, 411, 9, 8, 7, 2], [1, 462, 9, 8, 7, 2], [1, 513, 11, 4, 9, 2], [1, 565, 11, 5, 9, 3], [1, 620, 7, 3, 7, 7], [1, 669, 9, 1, 7, 5], [1, 722, 7, 1, 7, 7], [1, 768, 9, 6, 7, 2], [62, 3, 11, 6, 9, 2], [62, 54, 10, 6, 9, 2], [62, 105, 11, 6, 9, 2], [62, 156, 11, 6, 9, 2], [62, 207, 10, 6, 9, 2], [62, 258, 11, 6, 9, 2], [62, 309, 10, 6, 9, 2], [62, 360, 11, 6, 9, 2], [62, 411, 11, 6, 9, 2], [62, 462, 11, 6, 9, 2], [62, 515, 8, 4, 7, 4], [62, 566, 8, 6, 7, 4], [62, 616, 11, 5, 9, 3], [62, 668, 10, 3, 9, 4], [62, 718, 10, 5, 9, 3], [62, 768, 10, 6, 8, 2], [123, 3, 13, 7, 12, 2], [123, 54, 11, 6, 10, 2], [123, 105, 12, 6, 10, 2], [123, 156, 11, 6, 10, 2], [123, 207, 11, 6, 10, 2], [123, 258, 11, 6, 9, 2], [123, 309, 11, 6, 9, 2], [123, 360, 12, 6, 10, 2], [123, 411, 12, 6, 10, 2], [123, 462, 10, 6, 7, 2], [123, 513, 11, 6, 8, 2], [123, 564, 13, 6, 10, 2], [123, 615, 10, 6, 9, 2], [123, 666, 14, 6, 12, 2], [123, 717, 13, 6, 10, 2], [123, 768, 12, 6, 10, 2], [184, 3, 11, 6, 9, 2], [184, 54, 12, 8, 10, 2], [184, 105, 12, 6, 10, 2], [184, 156, 11, 6, 9, 2], [184, 207, 12, 6, 9, 2], [184, 258, 13, 6, 10, 2], [184, 309, 13, 6, 10, 2], [184, 360, 14, 6, 12, 2], [184, 411, 12, 6, 10, 2], [184, 462, 13, 6, 10, 2], [184, 513, 11, 6, 9, 2], [184, 564, 9, 8, 7, 2], [184, 615, 8, 6, 7, 2], [184, 666, 9, 8, 7, 2], [184, 717, 10, 2, 8, 2], [184, 775, 9, 1, 9, 9], [245, 3, 9, 2, 7, 2], [245, 56, 9, 4, 8, 4], [245, 105, 10, 6, 9, 2], [245, 158, 9, 4, 8, 4], [245, 207, 10, 6, 8, 2], [245, 260, 9, 4, 8, 4], [245, 309, 9, 6, 7, 2], [245, 362, 10, 6, 9, 4], [245, 411, 10, 6, 9, 2], [245, 462, 9, 6, 7, 2], [245, 513, 9, 8, 7, 2], [245, 564, 10, 6, 9, 2], [245, 615, 9, 6, 7, 2], [245, 668, 12, 4, 11, 4], [245, 719, 10, 4, 9, 4], [245, 770, 10, 4, 9, 4], [306, 5, 10, 6, 9, 4], [306, 56, 9, 6, 8, 4], [306, 107, 9, 4, 7, 4], [306, 158, 9, 4, 8, 4], [306, 208, 8, 5, 7, 3], [306, 260, 9, 4, 8, 4], [306, 311, 11, 4, 9, 4], [306, 362, 12, 4, 10, 4], [306, 413, 10, 4, 9, 4], [306, 464, 11, 6, 9, 4], [306, 515, 9, 4, 8, 4], [306, 564, 10, 8, 8, 2], [306, 615, 8, 8, 6, 2], [306, 666, 9, 8, 8, 2], [306, 719, 10, 2, 9, 4], [306, 768, 8, 6, 9, 2], [367, 1, 11, 8, 10, 0], [367, 52, 13, 8, 10, 0], [367, 105, 12, 8, 10, 2], [367, 154, 11, 8, 9, 0], [367, 205, 13, 8, 10, 0], [367, 256, 12, 8, 10, 0], [367, 307, 13, 8, 10, 0], [367, 359, 10, 7, 8, 1], [367, 410, 9, 7, 8, 1], [367, 461, 10, 7, 8, 1], [367, 513, 10, 6, 8, 2], [367, 563, 11, 7, 8, 1], [367, 614, 10, 7, 8, 1], [367, 668, 9, 6, 8, 4], [367, 716, 11, 7, 8, 1], [367, 767, 10, 7, 8, 1], [428, 2, 10, 7, 8, 1], [428, 54, 10, 6, 8, 2], [428, 104, 10, 7, 7, 1], [428, 155, 9, 7, 7, 1], [428, 206, 10, 7, 7, 1], [428, 258, 10, 6, 7, 2], [428, 308, 12, 7, 9, 1], [428, 359, 11, 7, 9, 1], [428, 410, 10, 7, 9, 1], [428, 461, 11, 7, 9, 1], [428, 513, 11, 6, 9, 2], [428, 563, 12, 7, 9, 1], [428, 614, 10, 7, 8, 1], [428, 665, 9, 7, 8, 1], [428, 716, 10, 7, 8, 1], [428, 768, 10, 6, 8, 2], [489, 3, 10, 7, 9, 2], [489, 54, 9, 2, 7, 2], [489, 106, 11, 6, 9, 3], [489, 156, 11, 6, 9, 2], [489, 206, 11, 9, 9, 1], [489, 260, 8, 2, 7, 4], [489, 309, 10, 8, 8, 2], [489, 360, 11, 6, 9, 2], [489, 411, 13, 6, 11, 2], [489, 462, 13, 6, 11, 2], [489, 513, 14, 3, 12, 2], [489, 564, 9, 2, 7, 2], [489, 615, 10, 1, 7, 2], [489, 667, 11, 5, 9, 3], [489, 717, 14, 6, 12, 2], [489, 768, 12, 6, 10, 2], [550, 5, 11, 3, 10, 4], [550, 55, 11, 5, 9, 3], [550, 106, 11, 5, 9, 3], [550, 157, 10, 5, 9, 3], [550, 207, 12, 6, 9, 2], [550, 260, 10, 6, 9, 4], [550, 309, 11, 6, 9, 2], [550, 360, 12, 7, 10, 2], [550, 411, 14, 7, 12, 2], [550, 464, 11, 4, 9, 4], [550, 513, 10, 8, 7, 2], [550, 564, 8, 2, 6, 2], [550, 615, 9, 2, 7, 2], [550, 666, 13, 6, 11, 2], [550, 719, 11, 4, 10, 4], [550, 770, 10, 4, 9, 4], [611, 5, 8, 6, 8, 4], [611, 56, 8, 6, 7, 4], [611, 108, 11, 2, 10, 5], [611, 155, 12, 7, 9, 1], [611, 207, 10, 8, 9, 2], [611, 259, 11, 5, 9, 3], [611, 309, 10, 6, 10, 2], [611, 362, 10, 3, 9, 4], [611, 413, 10, 3, 9, 4], [611, 467, 13, 1, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 12, 8, 10, 0], [611, 613, 12, 8, 10, 0], [611, 664, 12, 8, 10, 0], [611, 717, 14, 6, 12, 2], [611, 770, 11, 4, 10, 4], [672, 6, 10, 1, 9, 5], [672, 57, 14, 1, 13, 5], [672, 105, 11, 3, 8, 2], [672, 156, 11, 3, 8, 2], [672, 207, 9, 3, 7, 2], [672, 258, 9, 3, 7, 2], [672, 310, 11, 5, 9, 3], [672, 360, 9, 6, 8, 2], [672, 411, 11, 8, 9, 2], [1, 1, 1, 1, 6, 1], [794, 766, 11, 2, 9, 0], [672, 565, 10, 4, 9, 3], [672, 617, 8, 4, 7, 4], [672, 668, 8, 4, 7, 4], [672, 717, 11, 6, 9, 2], [672, 768, 11, 6, 9, 2], [733, 3, 11, 6, 9, 2], [733, 56, 8, 1, 7, 4], [733, 110, 7, 3, 7, 7], [733, 161, 9, 3, 8, 7], [733, 207, 14, 6, 13, 2], [733, 256, 13, 8, 11, 0], [733, 307, 12, 8, 10, 0], [733, 358, 12, 8, 11, 0], [733, 409, 12, 8, 10, 0], [733, 460, 12, 8, 10, 0], [733, 511, 10, 8, 7, 0], [733, 562, 10, 8, 7, 0], [733, 613, 10, 8, 7, 0], [733, 664, 10, 8, 7, 0], [733, 715, 12, 8, 10, 0], [733, 766, 12, 8, 10, 0], [1, 1, 1, 1, 6, 1], [794, 52, 12, 8, 10, 0], [794, 103, 13, 8, 11, 0], [794, 154, 13, 8, 11, 0], [794, 205, 13, 8, 11, 0], [794, 260, 8, 4, 7, 4], [794, 309, 10, 2, 7, 2], [794, 360, 10, 2, 7, 2], [794, 411, 10, 1, 7, 2], [794, 462, 10, 2, 7, 2], [794, 513, 9, 1, 7, 2], [794, 564, 9, 1, 7, 2], [794, 619, 6, 4, 7, 6], [794, 666, 10, 2, 7, 2], [794, 722, 7, 3, 7, 7], [794, 766, 11, 2, 9, 0], [855, 1, 11, 2, 9, 0], [855, 52, 11, 2, 9, 0], [855, 103, 11, 2, 9, 0], [855, 154, 11, 2, 9, 0], [855, 205, 11, 2, 9, 0], [855, 256, 11, 2, 9, 0], [855, 307, 11, 2, 9, 0], [855, 358, 11, 2, 9, 0], [855, 409, 11, 2, 9, 0], [855, 460, 11, 2, 9, 0], [855, 511, 11, 2, 9, 0], [855, 562, 11, 2, 9, 0], [855, 613, 11, 2, 9, 0], [855, 664, 11, 2, 9, 0], [855, 715, 11, 2, 9, 0], [855, 766, 11, 2, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 14, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 7, 8, 7, 3], [1, 106, 8, 7, 8, 3], [1, 157, 9, 8, 9, 3], [1, 207, 9, 10, 9, 2], [1, 259, 11, 8, 11, 3], [1, 310, 11, 8, 11, 3], [1, 361, 6, 7, 6, 3], [1, 412, 7, 10, 7, 3], [1, 463, 7, 10, 7, 3], [1, 514, 9, 7, 9, 3], [1, 566, 9, 7, 9, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 769, 7, 8, 7, 3], [62, 4, 9, 8, 9, 3], [62, 55, 9, 8, 9, 3], [62, 106, 9, 8, 9, 3], [62, 157, 9, 8, 9, 3], [62, 208, 9, 8, 9, 3], [62, 259, 9, 8, 9, 3], [62, 310, 9, 8, 9, 3], [62, 361, 9, 8, 9, 3], [62, 412, 9, 8, 9, 3], [62, 463, 9, 8, 9, 3], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 9, 7, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 7, 9, 4], [62, 769, 8, 8, 8, 3], [123, 4, 12, 9, 12, 3], [123, 55, 10, 8, 10, 3], [123, 106, 10, 8, 10, 3], [123, 157, 10, 8, 10, 3], [123, 208, 10, 8, 10, 3], [123, 259, 9, 8, 9, 3], [123, 310, 9, 8, 9, 3], [123, 361, 10, 8, 10, 3], [123, 412, 10, 8, 10, 3], [123, 463, 7, 8, 7, 3], [123, 514, 8, 8, 8, 3], [123, 565, 10, 8, 10, 3], [123, 616, 9, 8, 9, 3], [123, 667, 12, 8, 12, 3], [123, 718, 10, 8, 10, 3], [123, 769, 10, 8, 10, 3], [184, 4, 9, 8, 9, 3], [184, 55, 10, 10, 10, 3], [184, 106, 10, 8, 10, 3], [184, 157, 9, 8, 9, 3], [184, 208, 9, 8, 9, 3], [184, 259, 10, 8, 10, 3], [184, 310, 10, 8, 10, 3], [184, 361, 12, 8, 12, 3], [184, 412, 10, 8, 10, 3], [184, 463, 10, 8, 10, 3], [184, 514, 9, 8, 9, 3], [184, 565, 7, 10, 7, 3], [184, 616, 7, 8, 7, 3], [184, 667, 7, 10, 7, 3], [184, 718, 8, 7, 8, 3], [184, 770, 9, 9, 9, 4], [245, 4, 7, 7, 7, 3], [245, 56, 8, 7, 8, 4], [245, 106, 9, 8, 9, 3], [245, 158, 8, 7, 8, 4], [245, 208, 8, 8, 8, 3], [245, 260, 8, 7, 8, 4], [245, 310, 7, 8, 7, 3], [245, 362, 9, 9, 9, 4], [245, 412, 9, 8, 9, 3], [245, 463, 7, 8, 7, 3], [245, 514, 7, 10, 7, 3], [245, 565, 9, 8, 9, 3], [245, 616, 7, 8, 7, 3], [245, 668, 11, 7, 11, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 8, 9, 8, 4], [306, 107, 7, 7, 7, 4], [306, 158, 8, 7, 8, 4], [306, 209, 7, 7, 7, 4], [306, 260, 8, 7, 8, 4], [306, 311, 9, 7, 9, 4], [306, 362, 10, 7, 10, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 8, 7, 8, 4], [306, 565, 8, 10, 8, 3], [306, 616, 6, 10, 6, 3], [306, 667, 8, 10, 8, 3], [306, 719, 9, 6, 9, 4], [306, 769, 9, 8, 9, 3], [367, 2, 10, 10, 10, 1], [367, 53, 10, 10, 10, 1], [367, 106, 10, 10, 10, 3], [367, 155, 9, 10, 9, 1], [367, 206, 10, 10, 10, 1], [367, 257, 10, 10, 10, 1], [367, 308, 10, 10, 10, 1], [367, 360, 8, 9, 8, 2], [367, 411, 8, 9, 8, 2], [367, 462, 8, 9, 8, 2], [367, 514, 8, 8, 8, 3], [367, 564, 8, 9, 8, 2], [367, 615, 8, 9, 8, 2], [367, 668, 8, 9, 8, 4], [367, 717, 8, 9, 8, 2], [367, 768, 8, 9, 8, 2], [428, 3, 8, 9, 8, 2], [428, 55, 8, 8, 8, 3], [428, 105, 7, 9, 7, 2], [428, 156, 7, 9, 7, 2], [428, 207, 7, 9, 7, 2], [428, 259, 7, 8, 7, 3], [428, 309, 9, 9, 9, 2], [428, 360, 9, 9, 9, 2], [428, 411, 9, 9, 9, 2], [428, 462, 9, 9, 9, 2], [428, 514, 9, 8, 9, 3], [428, 564, 9, 9, 9, 2], [428, 615, 8, 9, 8, 2], [428, 666, 8, 9, 8, 2], [428, 717, 8, 9, 8, 2], [428, 769, 8, 8, 8, 3], [489, 4, 9, 9, 9, 3], [489, 55, 7, 7, 7, 3], [489, 107, 9, 8, 9, 4], [489, 157, 9, 8, 9, 3], [489, 207, 9, 11, 9, 2], [489, 260, 7, 6, 7, 4], [489, 310, 8, 10, 8, 3], [489, 361, 9, 8, 9, 3], [489, 412, 11, 8, 11, 3], [489, 463, 11, 8, 11, 3], [489, 514, 12, 7, 12, 3], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 7, 9, 4], [489, 718, 12, 8, 12, 3], [489, 769, 10, 8, 10, 3], [550, 5, 10, 6, 10, 4], [550, 56, 9, 7, 9, 4], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 208, 9, 8, 9, 3], [550, 260, 9, 9, 9, 4], [550, 310, 9, 8, 9, 3], [550, 361, 10, 9, 10, 3], [550, 412, 12, 9, 12, 3], [550, 464, 9, 7, 9, 4], [550, 514, 7, 10, 7, 3], [550, 565, 6, 7, 6, 3], [550, 616, 7, 7, 7, 3], [550, 667, 11, 8, 11, 3], [550, 719, 10, 7, 10, 4], [550, 770, 9, 7, 9, 4], [611, 5, 8, 9, 8, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 208, 9, 10, 9, 3], [611, 260, 9, 7, 9, 4], [611, 310, 10, 8, 10, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 7, 13, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 10, 10, 1], [611, 614, 10, 10, 10, 1], [611, 665, 10, 10, 10, 1], [611, 718, 12, 8, 12, 3], [611, 770, 10, 7, 10, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 106, 8, 7, 8, 3], [672, 157, 8, 7, 8, 3], [672, 208, 7, 7, 7, 3], [672, 259, 7, 7, 7, 3], [672, 311, 9, 7, 9, 4], [672, 361, 8, 8, 8, 3], [672, 412, 9, 10, 9, 3], [1, 5, 6, 6, 6, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 7, 7, 7, 4], [672, 668, 7, 7, 7, 4], [672, 718, 9, 8, 9, 3], [672, 769, 9, 8, 9, 3], [733, 4, 9, 8, 9, 3], [733, 56, 7, 6, 7, 4], [733, 107, 7, 9, 7, 4], [733, 158, 8, 9, 8, 4], [733, 208, 13, 8, 13, 3], [733, 257, 11, 10, 11, 1], [733, 308, 10, 10, 10, 1], [733, 359, 11, 10, 11, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 512, 7, 10, 7, 1], [733, 563, 7, 10, 7, 1], [733, 614, 7, 10, 7, 1], [733, 665, 7, 10, 7, 1], [733, 716, 10, 10, 10, 1], [733, 767, 10, 10, 10, 1], [1, 5, 6, 6, 6, 4], [794, 53, 10, 10, 10, 1], [794, 104, 11, 10, 11, 1], [794, 155, 11, 10, 11, 1], [794, 206, 11, 10, 11, 1], [794, 260, 7, 7, 7, 4], [794, 310, 7, 7, 7, 3], [794, 361, 7, 7, 7, 3], [794, 412, 7, 7, 7, 3], [794, 463, 7, 7, 7, 3], [794, 514, 7, 7, 7, 3], [794, 565, 7, 7, 7, 3], [794, 617, 7, 9, 7, 4], [794, 667, 7, 7, 7, 3], [794, 719, 7, 9, 7, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 56, 7, 6, 7, 4], [1, 107, 8, 6, 8, 4], [1, 158, 9, 6, 9, 4], [1, 208, 9, 8, 9, 3], [1, 260, 11, 6, 11, 4], [1, 311, 11, 6, 11, 4], [1, 362, 6, 6, 6, 4], [1, 413, 7, 8, 7, 4], [1, 464, 7, 8, 7, 4], [1, 515, 9, 6, 9, 4], [1, 566, 9, 6, 9, 4], [1, 617, 7, 8, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 6, 7, 4], [1, 770, 7, 6, 7, 4], [62, 5, 9, 6, 9, 4], [62, 56, 9, 6, 9, 4], [62, 107, 9, 6, 9, 4], [62, 158, 9, 6, 9, 4], [62, 209, 9, 6, 9, 4], [62, 260, 9, 6, 9, 4], [62, 311, 9, 6, 9, 4], [62, 362, 9, 6, 9, 4], [62, 413, 9, 6, 9, 4], [62, 464, 9, 6, 9, 4], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 770, 8, 6, 8, 4], [123, 5, 12, 7, 12, 4], [123, 56, 10, 6, 10, 4], [123, 107, 10, 6, 10, 4], [123, 158, 10, 6, 10, 4], [123, 209, 10, 6, 10, 4], [123, 260, 9, 6, 9, 4], [123, 311, 9, 6, 9, 4], [123, 362, 10, 6, 10, 4], [123, 413, 10, 6, 10, 4], [123, 464, 7, 6, 7, 4], [123, 515, 8, 6, 8, 4], [123, 566, 10, 6, 10, 4], [123, 617, 9, 6, 9, 4], [123, 668, 12, 6, 12, 4], [123, 719, 10, 6, 10, 4], [123, 770, 10, 6, 10, 4], [184, 5, 9, 6, 9, 4], [184, 56, 10, 8, 10, 4], [184, 107, 10, 6, 10, 4], [184, 158, 9, 6, 9, 4], [184, 209, 9, 6, 9, 4], [184, 260, 10, 6, 10, 4], [184, 311, 10, 6, 10, 4], [184, 362, 12, 6, 12, 4], [184, 413, 10, 6, 10, 4], [184, 464, 10, 6, 10, 4], [184, 515, 9, 6, 9, 4], [184, 566, 7, 8, 7, 4], [184, 617, 7, 6, 7, 4], [184, 668, 7, 8, 7, 4], [184, 719, 8, 6, 8, 4], [184, 770, 9, 8, 9, 4], [245, 5, 7, 6, 7, 4], [245, 56, 8, 6, 8, 4], [245, 107, 9, 6, 9, 4], [245, 158, 8, 6, 8, 4], [245, 209, 8, 6, 8, 4], [245, 260, 8, 6, 8, 4], [245, 311, 7, 6, 7, 4], [245, 362, 9, 8, 9, 4], [245, 413, 9, 6, 9, 4], [245, 464, 7, 6, 7, 4], [245, 515, 7, 8, 7, 4], [245, 566, 9, 6, 9, 4], [245, 617, 7, 6, 7, 4], [245, 668, 11, 6, 11, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 8, 8, 8, 4], [306, 107, 7, 6, 7, 4], [306, 158, 8, 6, 8, 4], [306, 209, 7, 6, 7, 4], [306, 260, 8, 6, 8, 4], [306, 311, 9, 6, 9, 4], [306, 362, 10, 6, 10, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 8, 6, 8, 4], [306, 566, 8, 8, 8, 4], [306, 617, 6, 8, 6, 4], [306, 668, 8, 8, 8, 4], [306, 719, 9, 6, 9, 4], [306, 770, 9, 6, 9, 4], [367, 3, 10, 8, 10, 2], [367, 54, 10, 8, 10, 2], [367, 107, 10, 8, 10, 4], [367, 156, 9, 8, 9, 2], [367, 207, 10, 8, 10, 2], [367, 258, 10, 8, 10, 2], [367, 309, 10, 8, 10, 2], [367, 361, 8, 7, 8, 3], [367, 412, 8, 7, 8, 3], [367, 463, 8, 7, 8, 3], [367, 515, 8, 6, 8, 4], [367, 565, 8, 7, 8, 3], [367, 616, 8, 7, 8, 3], [367, 668, 8, 8, 8, 4], [367, 718, 8, 7, 8, 3], [367, 769, 8, 7, 8, 3], [428, 4, 8, 7, 8, 3], [428, 56, 8, 6, 8, 4], [428, 106, 7, 7, 7, 3], [428, 157, 7, 7, 7, 3], [428, 208, 7, 7, 7, 3], [428, 260, 7, 6, 7, 4], [428, 310, 9, 7, 9, 3], [428, 361, 9, 7, 9, 3], [428, 412, 9, 7, 9, 3], [428, 463, 9, 7, 9, 3], [428, 515, 9, 6, 9, 4], [428, 565, 9, 7, 9, 3], [428, 616, 8, 7, 8, 3], [428, 667, 8, 7, 8, 3], [428, 718, 8, 7, 8, 3], [428, 770, 8, 6, 8, 4], [489, 5, 9, 7, 9, 4], [489, 56, 7, 6, 7, 4], [489, 107, 9, 7, 9, 4], [489, 158, 9, 6, 9, 4], [489, 208, 9, 9, 9, 3], [489, 260, 7, 6, 7, 4], [489, 311, 8, 8, 8, 4], [489, 362, 9, 6, 9, 4], [489, 413, 11, 6, 11, 4], [489, 464, 11, 6, 11, 4], [489, 515, 12, 6, 12, 4], [489, 566, 7, 6, 7, 4], [489, 617, 7, 6, 7, 4], [489, 668, 9, 6, 9, 4], [489, 719, 12, 6, 12, 4], [489, 770, 10, 6, 10, 4], [550, 5, 10, 6, 10, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 209, 9, 6, 9, 4], [550, 260, 9, 8, 9, 4], [550, 311, 9, 6, 9, 4], [550, 362, 10, 7, 10, 4], [550, 413, 12, 7, 12, 4], [550, 464, 9, 6, 9, 4], [550, 515, 7, 8, 7, 4], [550, 566, 6, 6, 6, 4], [550, 617, 7, 6, 7, 4], [550, 668, 11, 6, 11, 4], [550, 719, 10, 6, 10, 4], [550, 770, 9, 6, 9, 4], [611, 5, 8, 8, 8, 4], [611, 56, 7, 8, 7, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 7, 9, 3], [611, 209, 9, 8, 9, 4], [611, 260, 9, 6, 9, 4], [611, 311, 10, 6, 10, 4], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 6, 13, 4], [611, 515, 9, 6, 9, 4], [611, 564, 10, 8, 10, 2], [611, 615, 10, 8, 10, 2], [611, 666, 10, 8, 10, 2], [611, 719, 12, 6, 12, 4], [611, 770, 10, 6, 10, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 107, 8, 6, 8, 4], [672, 158, 8, 6, 8, 4], [672, 209, 7, 6, 7, 4], [672, 260, 7, 6, 7, 4], [672, 311, 9, 6, 9, 4], [672, 362, 8, 6, 8, 4], [672, 413, 9, 8, 9, 4], [1, 5, 6, 6, 6, 4], [794, 768, 9, 8, 9, 2], [672, 566, 9, 6, 9, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 719, 9, 6, 9, 4], [672, 770, 9, 6, 9, 4], [733, 5, 9, 6, 9, 4], [733, 56, 7, 6, 7, 4], [733, 107, 7, 8, 7, 4], [733, 158, 8, 8, 8, 4], [733, 209, 13, 6, 13, 4], [733, 258, 11, 8, 11, 2], [733, 309, 10, 8, 10, 2], [733, 360, 11, 8, 11, 2], [733, 411, 10, 8, 10, 2], [733, 462, 10, 8, 10, 2], [733, 513, 7, 8, 7, 2], [733, 564, 7, 8, 7, 2], [733, 615, 7, 8, 7, 2], [733, 666, 7, 8, 7, 2], [733, 717, 10, 8, 10, 2], [733, 768, 10, 8, 10, 2], [1, 5, 6, 6, 6, 4], [794, 54, 10, 8, 10, 2], [794, 105, 11, 8, 11, 2], [794, 156, 11, 8, 11, 2], [794, 207, 11, 8, 11, 2], [794, 260, 7, 6, 7, 4], [794, 311, 7, 6, 7, 4], [794, 362, 7, 6, 7, 4], [794, 413, 7, 6, 7, 4], [794, 464, 7, 6, 7, 4], [794, 515, 7, 6, 7, 4], [794, 566, 7, 6, 7, 4], [794, 617, 7, 8, 7, 4], [794, 668, 7, 6, 7, 4], [794, 719, 7, 8, 7, 4], [794, 768, 9, 8, 9, 2], [855, 3, 9, 8, 9, 2], [855, 54, 9, 8, 9, 2], [855, 105, 9, 8, 9, 2], [855, 156, 9, 8, 9, 2], [855, 207, 9, 8, 9, 2], [855, 258, 9, 8, 9, 2], [855, 309, 9, 8, 9, 2], [855, 360, 9, 8, 9, 2], [855, 411, 9, 8, 9, 2], [855, 462, 9, 8, 9, 2], [855, 513, 9, 8, 9, 2], [855, 564, 9, 8, 9, 2], [855, 615, 9, 8, 9, 2], [855, 666, 9, 8, 9, 2], [855, 717, 9, 8, 9, 2], [855, 768, 9, 8, 9, 2]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 9, 8, 7, 2], [1, 105, 10, 4, 8, 2], [1, 156, 11, 8, 9, 2], [1, 206, 11, 10, 9, 1], [1, 258, 13, 8, 11, 2], [1, 309, 12, 8, 11, 2], [1, 360, 8, 4, 6, 2], [1, 411, 9, 10, 7, 2], [1, 462, 9, 10, 7, 2], [1, 513, 11, 6, 9, 2], [1, 565, 11, 7, 9, 3], [1, 620, 7, 5, 7, 7], [1, 669, 9, 3, 7, 5], [1, 722, 7, 3, 7, 7], [1, 768, 9, 8, 7, 2], [62, 3, 11, 8, 9, 2], [62, 54, 10, 8, 9, 2], [62, 105, 11, 8, 9, 2], [62, 156, 11, 8, 9, 2], [62, 207, 10, 8, 9, 2], [62, 258, 11, 8, 9, 2], [62, 309, 10, 8, 9, 2], [62, 360, 11, 8, 9, 2], [62, 411, 11, 8, 9, 2], [62, 462, 11, 8, 9, 2], [62, 515, 8, 6, 7, 4], [62, 566, 8, 8, 7, 4], [62, 616, 11, 7, 9, 3], [62, 668, 10, 5, 9, 4], [62, 718, 10, 7, 9, 3], [62, 768, 10, 8, 8, 2], [123, 3, 13, 9, 12, 2], [123, 54, 11, 8, 10, 2], [123, 105, 12, 8, 10, 2], [123, 156, 11, 8, 10, 2], [123, 207, 11, 8, 10, 2], [123, 258, 11, 8, 9, 2], [123, 309, 11, 8, 9, 2], [123, 360, 12, 8, 10, 2], [123, 411, 12, 8, 10, 2], [123, 462, 10, 8, 7, 2], [123, 513, 11, 8, 8, 2], [123, 564, 13, 8, 10, 2], [123, 615, 10, 8, 9, 2], [123, 666, 14, 8, 12, 2], [123, 717, 13, 8, 10, 2], [123, 768, 12, 8, 10, 2], [184, 3, 11, 8, 9, 2], [184, 54, 12, 10, 10, 2], [184, 105, 12, 8, 10, 2], [184, 156, 11, 8, 9, 2], [184, 207, 12, 8, 9, 2], [184, 258, 13, 8, 10, 2], [184, 309, 13, 8, 10, 2], [184, 360, 14, 8, 12, 2], [184, 411, 12, 8, 10, 2], [184, 462, 13, 8, 10, 2], [184, 513, 11, 8, 9, 2], [184, 564, 9, 10, 7, 2], [184, 615, 8, 8, 7, 2], [184, 666, 9, 10, 7, 2], [184, 717, 10, 4, 8, 2], [184, 775, 9, 3, 9, 9], [245, 3, 9, 4, 7, 2], [245, 56, 9, 6, 8, 4], [245, 105, 10, 8, 9, 2], [245, 158, 9, 6, 8, 4], [245, 207, 10, 8, 8, 2], [245, 260, 9, 6, 8, 4], [245, 309, 9, 8, 7, 2], [245, 362, 10, 8, 9, 4], [245, 411, 10, 8, 9, 2], [245, 462, 9, 8, 7, 2], [245, 513, 9, 10, 7, 2], [245, 564, 10, 8, 9, 2], [245, 615, 9, 8, 7, 2], [245, 668, 12, 6, 11, 4], [245, 719, 10, 6, 9, 4], [245, 770, 10, 6, 9, 4], [306, 5, 10, 8, 9, 4], [306, 56, 9, 8, 8, 4], [306, 107, 9, 6, 7, 4], [306, 158, 9, 6, 8, 4], [306, 208, 8, 7, 7, 3], [306, 260, 9, 6, 8, 4], [306, 311, 11, 6, 9, 4], [306, 362, 12, 6, 10, 4], [306, 413, 10, 6, 9, 4], [306, 464, 11, 8, 9, 4], [306, 515, 9, 6, 8, 4], [306, 564, 10, 10, 8, 2], [306, 615, 8, 10, 6, 2], [306, 666, 9, 10, 8, 2], [306, 719, 10, 4, 9, 4], [306, 768, 8, 8, 9, 2], [367, 1, 12, 10, 10, 0], [367, 52, 13, 10, 10, 0], [367, 105, 12, 10, 10, 2], [367, 154, 12, 10, 9, 0], [367, 205, 13, 10, 10, 0], [367, 256, 12, 10, 10, 0], [367, 307, 13, 10, 10, 0], [367, 359, 10, 9, 8, 1], [367, 410, 9, 9, 8, 1], [367, 461, 10, 9, 8, 1], [367, 513, 10, 8, 8, 2], [367, 563, 11, 9, 8, 1], [367, 614, 10, 9, 8, 1], [367, 668, 9, 8, 8, 4], [367, 716, 11, 9, 8, 1], [367, 767, 10, 9, 8, 1], [428, 2, 10, 9, 8, 1], [428, 54, 10, 8, 8, 2], [428, 104, 10, 9, 7, 1], [428, 155, 9, 9, 7, 1], [428, 206, 10, 9, 7, 1], [428, 258, 10, 8, 7, 2], [428, 308, 12, 9, 9, 1], [428, 359, 11, 9, 9, 1], [428, 410, 10, 9, 9, 1], [428, 461, 11, 9, 9, 1], [428, 513, 11, 8, 9, 2], [428, 563, 12, 9, 9, 1], [428, 614, 10, 9, 8, 1], [428, 665, 9, 9, 8, 1], [428, 716, 10, 9, 8, 1], [428, 768, 10, 8, 8, 2], [489, 3, 10, 9, 9, 2], [489, 54, 9, 4, 7, 2], [489, 106, 11, 8, 9, 3], [489, 156, 11, 8, 9, 2], [489, 206, 11, 11, 9, 1], [489, 260, 8, 4, 7, 4], [489, 309, 10, 10, 8, 2], [489, 360, 11, 8, 9, 2], [489, 411, 13, 8, 11, 2], [489, 462, 13, 8, 11, 2], [489, 513, 14, 5, 12, 2], [489, 564, 9, 4, 7, 2], [489, 615, 10, 3, 7, 2], [489, 667, 11, 7, 9, 3], [489, 717, 14, 8, 12, 2], [489, 768, 12, 8, 10, 2], [550, 5, 11, 5, 10, 4], [550, 55, 11, 7, 9, 3], [550, 106, 11, 7, 9, 3], [550, 157, 10, 7, 9, 3], [550, 207, 12, 8, 9, 2], [550, 260, 10, 8, 9, 4], [550, 309, 11, 8, 9, 2], [550, 360, 12, 9, 10, 2], [550, 411, 14, 9, 12, 2], [550, 464, 11, 6, 9, 4], [550, 513, 10, 10, 7, 2], [550, 564, 8, 4, 6, 2], [550, 615, 9, 4, 7, 2], [550, 666, 13, 8, 11, 2], [550, 719, 11, 6, 10, 4], [550, 770, 10, 6, 9, 4], [611, 5, 8, 8, 8, 4], [611, 56, 8, 8, 7, 4], [611, 108, 11, 4, 10, 5], [611, 155, 12, 9, 9, 1], [611, 207, 10, 10, 9, 2], [611, 259, 11, 7, 9, 3], [611, 309, 10, 8, 10, 2], [611, 362, 10, 5, 9, 4], [611, 413, 10, 5, 9, 4], [611, 467, 13, 3, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 12, 10, 10, 0], [611, 613, 13, 10, 10, 0], [611, 664, 13, 10, 10, 0], [611, 717, 14, 8, 12, 2], [611, 770, 11, 6, 10, 4], [672, 6, 10, 3, 9, 5], [672, 57, 14, 3, 13, 5], [672, 105, 11, 5, 8, 2], [672, 156, 11, 5, 8, 2], [672, 207, 9, 5, 7, 2], [672, 258, 9, 5, 7, 2], [672, 310, 11, 7, 9, 3], [672, 360, 9, 8, 8, 2], [672, 411, 11, 10, 9, 2], [1, 1, 1, 1, 6, 1], [794, 766, 12, 4, 9, 0], [672, 565, 10, 6, 9, 3], [672, 617, 8, 6, 7, 4], [672, 668, 8, 6, 7, 4], [672, 717, 11, 8, 9, 2], [672, 768, 11, 8, 9, 2], [733, 3, 11, 8, 9, 2], [733, 56, 8, 3, 7, 4], [733, 110, 7, 5, 7, 7], [733, 161, 9, 5, 8, 7], [733, 207, 14, 8, 13, 2], [733, 256, 13, 10, 11, 0], [733, 307, 12, 10, 10, 0], [733, 358, 12, 10, 11, 0], [733, 409, 12, 10, 10, 0], [733, 460, 12, 10, 10, 0], [733, 511, 10, 10, 7, 0], [733, 562, 10, 10, 7, 0], [733, 613, 10, 10, 7, 0], [733, 664, 10, 10, 7, 0], [733, 715, 12, 10, 10, 0], [733, 766, 12, 10, 10, 0], [1, 1, 1, 1, 6, 1], [794, 52, 12, 10, 10, 0], [794, 103, 13, 10, 11, 0], [794, 154, 13, 10, 11, 0], [794, 205, 13, 10, 11, 0], [794, 260, 8, 6, 7, 4], [794, 309, 10, 4, 7, 2], [794, 360, 10, 4, 7, 2], [794, 411, 10, 3, 7, 2], [794, 462, 10, 4, 7, 2], [794, 513, 9, 3, 7, 2], [794, 564, 9, 3, 7, 2], [794, 619, 6, 6, 7, 6], [794, 666, 10, 4, 7, 2], [794, 722, 7, 5, 7, 7], [794, 766, 12, 4, 9, 0], [855, 1, 12, 4, 9, 0], [855, 52, 12, 4, 9, 0], [855, 103, 12, 4, 9, 0], [855, 154, 12, 4, 9, 0], [855, 205, 12, 4, 9, 0], [855, 256, 12, 4, 9, 0], [855, 307, 12, 4, 9, 0], [855, 358, 12, 4, 9, 0], [855, 409, 12, 4, 9, 0], [855, 460, 12, 4, 9, 0], [855, 511, 12, 4, 9, 0], [855, 562, 12, 4, 9, 0], [855, 613, 12, 4, 9, 0], [855, 664, 12, 4, 9, 0], [855, 715, 12, 4, 9, 0], [855, 766, 12, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 5, 1], [1, 54, 8, 6, 6, 2], [1, 105, 9, 2, 7, 2], [1, 156, 10, 6, 8, 2], [1, 206, 10, 8, 8, 1], [1, 258, 12, 6, 10, 2], [1, 309, 11, 6, 10, 2], [1, 360, 7, 2, 5, 2], [1, 411, 8, 8, 6, 2], [1, 462, 8, 8, 6, 2], [1, 513, 10, 4, 8, 2], [1, 565, 10, 5, 8, 3], [1, 620, 6, 3, 6, 7], [1, 669, 8, 1, 6, 5], [1, 722, 6, 1, 6, 7], [1, 768, 8, 6, 6, 2], [62, 3, 10, 6, 8, 2], [62, 54, 9, 6, 8, 2], [62, 105, 10, 6, 8, 2], [62, 156, 10, 6, 8, 2], [62, 207, 9, 6, 8, 2], [62, 258, 10, 6, 8, 2], [62, 309, 9, 6, 8, 2], [62, 360, 10, 6, 8, 2], [62, 411, 10, 6, 8, 2], [62, 462, 10, 6, 8, 2], [62, 515, 7, 4, 6, 4], [62, 566, 7, 6, 6, 4], [62, 616, 10, 5, 8, 3], [62, 668, 9, 3, 8, 4], [62, 718, 9, 5, 8, 3], [62, 768, 9, 6, 7, 2], [123, 3, 12, 7, 11, 2], [123, 54, 10, 6, 9, 2], [123, 105, 11, 6, 9, 2], [123, 156, 10, 6, 9, 2], [123, 207, 10, 6, 9, 2], [123, 258, 10, 6, 8, 2], [123, 309, 10, 6, 8, 2], [123, 360, 11, 6, 9, 2], [123, 411, 11, 6, 9, 2], [123, 462, 9, 6, 6, 2], [123, 513, 10, 6, 7, 2], [123, 564, 12, 6, 9, 2], [123, 615, 9, 6, 8, 2], [123, 666, 13, 6, 11, 2], [123, 717, 12, 6, 9, 2], [123, 768, 11, 6, 9, 2], [184, 3, 10, 6, 8, 2], [184, 54, 11, 8, 9, 2], [184, 105, 11, 6, 9, 2], [184, 156, 10, 6, 8, 2], [184, 207, 11, 6, 8, 2], [184, 258, 12, 6, 9, 2], [184, 309, 12, 6, 9, 2], [184, 360, 13, 6, 11, 2], [184, 411, 11, 6, 9, 2], [184, 462, 12, 6, 9, 2], [184, 513, 10, 6, 8, 2], [184, 564, 8, 8, 6, 2], [184, 615, 7, 6, 6, 2], [184, 666, 8, 8, 6, 2], [184, 717, 9, 2, 7, 2], [184, 775, 8, 1, 8, 9], [245, 3, 8, 2, 6, 2], [245, 56, 8, 4, 7, 4], [245, 105, 9, 6, 8, 2], [245, 158, 8, 4, 7, 4], [245, 207, 9, 6, 7, 2], [245, 260, 8, 4, 7, 4], [245, 309, 8, 6, 6, 2], [245, 362, 9, 6, 8, 4], [245, 411, 9, 6, 8, 2], [245, 462, 8, 6, 6, 2], [245, 513, 8, 8, 6, 2], [245, 564, 9, 6, 8, 2], [245, 615, 8, 6, 6, 2], [245, 668, 11, 4, 10, 4], [245, 719, 9, 4, 8, 4], [245, 770, 9, 4, 8, 4], [306, 5, 9, 6, 8, 4], [306, 56, 8, 6, 7, 4], [306, 107, 8, 4, 6, 4], [306, 158, 8, 4, 7, 4], [306, 208, 7, 5, 6, 3], [306, 260, 8, 4, 7, 4], [306, 311, 10, 4, 8, 4], [306, 362, 11, 4, 9, 4], [306, 413, 9, 4, 8, 4], [306, 464, 10, 6, 8, 4], [306, 515, 8, 4, 7, 4], [306, 564, 9, 8, 7, 2], [306, 615, 7, 8, 5, 2], [306, 666, 8, 8, 7, 2], [306, 719, 9, 2, 8, 4], [306, 768, 7, 6, 8, 2], [367, 1, 10, 8, 9, 0], [367, 52, 12, 8, 9, 0], [367, 105, 11, 8, 9, 2], [367, 154, 10, 8, 8, 0], [367, 205, 12, 8, 9, 0], [367, 256, 11, 8, 9, 0], [367, 307, 12, 8, 9, 0], [367, 359, 9, 7, 7, 1], [367, 410, 8, 7, 7, 1], [367, 461, 9, 7, 7, 1], [367, 513, 9, 6, 7, 2], [367, 563, 9, 7, 7, 1], [367, 614, 9, 7, 7, 1], [367, 668, 8, 6, 7, 4], [367, 716, 10, 7, 7, 1], [367, 767, 9, 7, 7, 1], [428, 2, 9, 7, 7, 1], [428, 54, 9, 6, 7, 2], [428, 104, 9, 7, 6, 1], [428, 155, 8, 7, 6, 1], [428, 206, 9, 7, 6, 1], [428, 258, 9, 6, 6, 2], [428, 308, 11, 7, 8, 1], [428, 359, 10, 7, 8, 1], [428, 410, 9, 7, 8, 1], [428, 461, 10, 7, 8, 1], [428, 513, 10, 6, 8, 2], [428, 563, 11, 7, 8, 1], [428, 614, 9, 7, 7, 1], [428, 665, 8, 7, 7, 1], [428, 716, 9, 7, 7, 1], [428, 768, 9, 6, 7, 2], [489, 3, 9, 7, 8, 2], [489, 54, 8, 2, 6, 2], [489, 106, 10, 6, 8, 3], [489, 156, 10, 6, 8, 2], [489, 206, 10, 9, 8, 1], [489, 260, 7, 2, 6, 4], [489, 309, 9, 8, 7, 2], [489, 360, 10, 6, 8, 2], [489, 411, 12, 6, 10, 2], [489, 462, 12, 6, 10, 2], [489, 513, 13, 3, 11, 2], [489, 564, 8, 2, 6, 2], [489, 615, 9, 1, 6, 2], [489, 667, 10, 5, 8, 3], [489, 717, 13, 6, 11, 2], [489, 768, 11, 6, 9, 2], [550, 5, 10, 3, 9, 4], [550, 55, 10, 5, 8, 3], [550, 106, 10, 5, 8, 3], [550, 157, 9, 5, 8, 3], [550, 207, 11, 6, 8, 2], [550, 260, 9, 6, 8, 4], [550, 309, 10, 6, 8, 2], [550, 360, 11, 7, 9, 2], [550, 411, 13, 7, 11, 2], [550, 464, 10, 4, 8, 4], [550, 513, 9, 8, 6, 2], [550, 564, 7, 2, 5, 2], [550, 615, 8, 2, 6, 2], [550, 666, 12, 6, 10, 2], [550, 719, 10, 4, 9, 4], [550, 770, 9, 4, 8, 4], [611, 5, 7, 6, 7, 4], [611, 56, 7, 6, 6, 4], [611, 108, 10, 2, 9, 5], [611, 156, 11, 6, 8, 2], [611, 207, 9, 8, 8, 2], [611, 259, 10, 5, 8, 3], [611, 309, 9, 6, 9, 2], [611, 362, 9, 3, 8, 4], [611, 413, 9, 3, 8, 4], [611, 467, 12, 1, 12, 7], [611, 511, 1, 1, 8, 1], [611, 562, 11, 8, 9, 0], [611, 613, 11, 8, 9, 0], [611, 664, 11, 8, 9, 0], [611, 717, 13, 6, 11, 2], [611, 770, 10, 4, 9, 4], [672, 6, 9, 1, 8, 5], [672, 57, 13, 1, 12, 5], [672, 105, 10, 3, 7, 2], [672, 156, 10, 3, 7, 2], [672, 207, 8, 3, 6, 2], [672, 258, 8, 3, 6, 2], [672, 310, 10, 5, 8, 3], [672, 360, 8, 6, 7, 2], [672, 411, 10, 8, 8, 2], [1, 1, 1, 1, 5, 1], [794, 766, 10, 2, 8, 0], [672, 565, 9, 4, 8, 3], [672, 617, 7, 4, 6, 4], [672, 668, 7, 4, 6, 4], [672, 717, 10, 6, 8, 2], [672, 768, 10, 6, 8, 2], [733, 3, 10, 6, 8, 2], [733, 56, 7, 1, 6, 4], [733, 110, 6, 3, 6, 7], [733, 161, 8, 3, 7, 7], [733, 207, 13, 6, 12, 2], [733, 256, 12, 8, 10, 0], [733, 307, 11, 8, 9, 0], [733, 358, 11, 8, 10, 0], [733, 409, 11, 8, 9, 0], [733, 460, 11, 8, 9, 0], [733, 512, 9, 7, 6, 1], [733, 562, 9, 8, 6, 0], [733, 613, 9, 8, 6, 0], [733, 664, 9, 8, 6, 0], [733, 715, 11, 8, 9, 0], [733, 766, 11, 8, 9, 0], [1, 1, 1, 1, 5, 1], [794, 52, 11, 8, 9, 0], [794, 103, 12, 8, 10, 0], [794, 154, 12, 8, 10, 0], [794, 205, 12, 8, 10, 0], [794, 260, 7, 4, 6, 4], [794, 309, 9, 2, 6, 2], [794, 360, 9, 2, 6, 2], [794, 411, 9, 1, 6, 2], [794, 462, 9, 2, 6, 2], [794, 513, 8, 1, 6, 2], [794, 564, 8, 1, 6, 2], [794, 619, 5, 4, 6, 6], [794, 666, 9, 2, 6, 2], [794, 722, 6, 3, 6, 7], [794, 766, 10, 2, 8, 0], [855, 1, 10, 2, 8, 0], [855, 52, 10, 2, 8, 0], [855, 103, 10, 2, 8, 0], [855, 154, 10, 2, 8, 0], [855, 205, 10, 2, 8, 0], [855, 256, 10, 2, 8, 0], [855, 307, 10, 2, 8, 0], [855, 358, 10, 2, 8, 0], [855, 409, 10, 2, 8, 0], [855, 460, 10, 2, 8, 0], [855, 511, 10, 2, 8, 0], [855, 562, 10, 2, 8, 0], [855, 613, 10, 2, 8, 0], [855, 664, 10, 2, 8, 0], [855, 715, 10, 2, 8, 0], [855, 766, 10, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 13, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 7, 8, 7, 3], [1, 106, 8, 7, 8, 3], [1, 157, 9, 8, 9, 3], [1, 207, 9, 10, 9, 2], [1, 259, 11, 8, 11, 3], [1, 310, 11, 8, 11, 3], [1, 361, 6, 7, 6, 3], [1, 412, 7, 10, 7, 3], [1, 463, 7, 10, 7, 3], [1, 514, 9, 7, 9, 3], [1, 566, 9, 7, 9, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 769, 7, 8, 7, 3], [62, 4, 9, 8, 9, 3], [62, 55, 9, 8, 9, 3], [62, 106, 9, 8, 9, 3], [62, 157, 9, 8, 9, 3], [62, 208, 9, 8, 9, 3], [62, 259, 9, 8, 9, 3], [62, 310, 9, 8, 9, 3], [62, 361, 9, 8, 9, 3], [62, 412, 9, 8, 9, 3], [62, 463, 9, 8, 9, 3], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 9, 7, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 7, 9, 4], [62, 769, 8, 8, 8, 3], [123, 4, 12, 9, 12, 3], [123, 55, 10, 8, 10, 3], [123, 106, 10, 8, 10, 3], [123, 157, 10, 8, 10, 3], [123, 208, 10, 8, 10, 3], [123, 259, 9, 8, 9, 3], [123, 310, 9, 8, 9, 3], [123, 361, 10, 8, 10, 3], [123, 412, 10, 8, 10, 3], [123, 463, 7, 8, 7, 3], [123, 514, 8, 8, 8, 3], [123, 565, 10, 8, 10, 3], [123, 616, 9, 8, 9, 3], [123, 667, 12, 8, 12, 3], [123, 718, 10, 8, 10, 3], [123, 769, 10, 8, 10, 3], [184, 4, 9, 8, 9, 3], [184, 55, 10, 10, 10, 3], [184, 106, 10, 8, 10, 3], [184, 157, 9, 8, 9, 3], [184, 208, 9, 8, 9, 3], [184, 259, 10, 8, 10, 3], [184, 310, 10, 8, 10, 3], [184, 361, 12, 8, 12, 3], [184, 412, 10, 8, 10, 3], [184, 463, 10, 8, 10, 3], [184, 514, 9, 8, 9, 3], [184, 565, 7, 10, 7, 3], [184, 616, 7, 8, 7, 3], [184, 667, 7, 10, 7, 3], [184, 718, 8, 7, 8, 3], [184, 770, 9, 9, 9, 4], [245, 4, 7, 7, 7, 3], [245, 56, 8, 7, 8, 4], [245, 106, 9, 8, 9, 3], [245, 158, 8, 7, 8, 4], [245, 208, 8, 8, 8, 3], [245, 260, 8, 7, 8, 4], [245, 310, 7, 8, 7, 3], [245, 362, 9, 9, 9, 4], [245, 412, 9, 8, 9, 3], [245, 463, 7, 8, 7, 3], [245, 514, 7, 10, 7, 3], [245, 565, 9, 8, 9, 3], [245, 616, 7, 8, 7, 3], [245, 668, 11, 7, 11, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 8, 9, 8, 4], [306, 107, 7, 7, 7, 4], [306, 158, 8, 7, 8, 4], [306, 209, 7, 7, 7, 4], [306, 260, 8, 7, 8, 4], [306, 311, 9, 7, 9, 4], [306, 362, 10, 7, 10, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 8, 7, 8, 4], [306, 565, 8, 10, 8, 3], [306, 616, 6, 10, 6, 3], [306, 667, 8, 10, 8, 3], [306, 719, 9, 6, 9, 4], [306, 769, 9, 8, 9, 3], [367, 2, 10, 10, 10, 1], [367, 53, 10, 10, 10, 1], [367, 106, 10, 10, 10, 3], [367, 155, 9, 10, 9, 1], [367, 206, 10, 10, 10, 1], [367, 257, 10, 10, 10, 1], [367, 308, 10, 10, 10, 1], [367, 360, 8, 9, 8, 2], [367, 411, 8, 9, 8, 2], [367, 462, 8, 9, 8, 2], [367, 514, 8, 8, 8, 3], [367, 564, 8, 9, 8, 2], [367, 615, 8, 9, 8, 2], [367, 668, 8, 9, 8, 4], [367, 717, 8, 9, 8, 2], [367, 768, 8, 9, 8, 2], [428, 3, 8, 9, 8, 2], [428, 55, 8, 8, 8, 3], [428, 105, 7, 9, 7, 2], [428, 156, 7, 9, 7, 2], [428, 207, 7, 9, 7, 2], [428, 259, 7, 8, 7, 3], [428, 309, 9, 9, 9, 2], [428, 360, 9, 9, 9, 2], [428, 411, 9, 9, 9, 2], [428, 462, 9, 9, 9, 2], [428, 514, 9, 8, 9, 3], [428, 564, 9, 9, 9, 2], [428, 615, 8, 9, 8, 2], [428, 666, 8, 9, 8, 2], [428, 717, 8, 9, 8, 2], [428, 769, 8, 8, 8, 3], [489, 4, 9, 9, 9, 3], [489, 55, 7, 7, 7, 3], [489, 107, 9, 8, 9, 4], [489, 157, 9, 8, 9, 3], [489, 207, 9, 11, 9, 2], [489, 260, 7, 6, 7, 4], [489, 310, 8, 10, 8, 3], [489, 361, 9, 8, 9, 3], [489, 412, 11, 8, 11, 3], [489, 463, 11, 8, 11, 3], [489, 514, 12, 7, 12, 3], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 7, 9, 4], [489, 718, 12, 8, 12, 3], [489, 769, 10, 8, 10, 3], [550, 5, 10, 6, 10, 4], [550, 56, 9, 7, 9, 4], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 208, 9, 8, 9, 3], [550, 260, 9, 9, 9, 4], [550, 310, 9, 8, 9, 3], [550, 361, 10, 9, 10, 3], [550, 412, 12, 9, 12, 3], [550, 464, 9, 7, 9, 4], [550, 514, 7, 10, 7, 3], [550, 565, 6, 7, 6, 3], [550, 616, 7, 7, 7, 3], [550, 667, 11, 8, 11, 3], [550, 719, 10, 7, 10, 4], [550, 770, 9, 7, 9, 4], [611, 5, 8, 9, 8, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 208, 9, 10, 9, 3], [611, 260, 9, 7, 9, 4], [611, 310, 10, 8, 10, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 7, 13, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 10, 10, 1], [611, 614, 10, 10, 10, 1], [611, 665, 10, 10, 10, 1], [611, 718, 12, 8, 12, 3], [611, 770, 10, 7, 10, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 106, 8, 7, 8, 3], [672, 157, 8, 7, 8, 3], [672, 208, 7, 7, 7, 3], [672, 259, 7, 7, 7, 3], [672, 311, 9, 7, 9, 4], [672, 361, 8, 8, 8, 3], [672, 412, 9, 10, 9, 3], [1, 5, 6, 6, 6, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 7, 7, 7, 4], [672, 668, 7, 7, 7, 4], [672, 718, 9, 8, 9, 3], [672, 769, 9, 8, 9, 3], [733, 4, 9, 8, 9, 3], [733, 56, 7, 6, 7, 4], [733, 107, 7, 9, 7, 4], [733, 158, 8, 9, 8, 4], [733, 208, 13, 8, 13, 3], [733, 257, 11, 10, 11, 1], [733, 308, 10, 10, 10, 1], [733, 359, 11, 10, 11, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 512, 7, 10, 7, 1], [733, 563, 7, 10, 7, 1], [733, 614, 7, 10, 7, 1], [733, 665, 7, 10, 7, 1], [733, 716, 10, 10, 10, 1], [733, 767, 10, 10, 10, 1], [1, 5, 6, 6, 6, 4], [794, 53, 10, 10, 10, 1], [794, 104, 11, 10, 11, 1], [794, 155, 11, 10, 11, 1], [794, 206, 11, 10, 11, 1], [794, 260, 7, 7, 7, 4], [794, 310, 7, 7, 7, 3], [794, 361, 7, 7, 7, 3], [794, 412, 7, 7, 7, 3], [794, 463, 7, 7, 7, 3], [794, 514, 7, 7, 7, 3], [794, 565, 7, 7, 7, 3], [794, 617, 7, 9, 7, 4], [794, 667, 7, 7, 7, 3], [794, 719, 7, 9, 7, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/04_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 5, 6, 5, 4], [1, 56, 6, 6, 6, 4], [1, 107, 7, 6, 7, 4], [1, 158, 8, 6, 8, 4], [1, 208, 8, 8, 8, 3], [1, 260, 10, 6, 10, 4], [1, 311, 10, 6, 10, 4], [1, 362, 5, 6, 5, 4], [1, 413, 6, 8, 6, 4], [1, 464, 6, 8, 6, 4], [1, 515, 8, 6, 8, 4], [1, 566, 8, 6, 8, 4], [1, 617, 6, 8, 6, 4], [1, 668, 6, 6, 6, 4], [1, 719, 6, 6, 6, 4], [1, 770, 6, 6, 6, 4], [62, 5, 8, 6, 8, 4], [62, 56, 8, 6, 8, 4], [62, 107, 8, 6, 8, 4], [62, 158, 8, 6, 8, 4], [62, 209, 8, 6, 8, 4], [62, 260, 8, 6, 8, 4], [62, 311, 8, 6, 8, 4], [62, 362, 8, 6, 8, 4], [62, 413, 8, 6, 8, 4], [62, 464, 8, 6, 8, 4], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 8, 6, 8, 4], [62, 668, 8, 6, 8, 4], [62, 719, 8, 6, 8, 4], [62, 770, 7, 6, 7, 4], [123, 5, 11, 7, 11, 4], [123, 56, 9, 6, 9, 4], [123, 107, 9, 6, 9, 4], [123, 158, 9, 6, 9, 4], [123, 209, 9, 6, 9, 4], [123, 260, 8, 6, 8, 4], [123, 311, 8, 6, 8, 4], [123, 362, 9, 6, 9, 4], [123, 413, 9, 6, 9, 4], [123, 464, 6, 6, 6, 4], [123, 515, 7, 6, 7, 4], [123, 566, 9, 6, 9, 4], [123, 617, 8, 6, 8, 4], [123, 668, 11, 6, 11, 4], [123, 719, 9, 6, 9, 4], [123, 770, 9, 6, 9, 4], [184, 5, 8, 6, 8, 4], [184, 56, 9, 8, 9, 4], [184, 107, 9, 6, 9, 4], [184, 158, 8, 6, 8, 4], [184, 209, 8, 6, 8, 4], [184, 260, 9, 6, 9, 4], [184, 311, 9, 6, 9, 4], [184, 362, 11, 6, 11, 4], [184, 413, 9, 6, 9, 4], [184, 464, 9, 6, 9, 4], [184, 515, 8, 6, 8, 4], [184, 566, 6, 8, 6, 4], [184, 617, 6, 6, 6, 4], [184, 668, 6, 8, 6, 4], [184, 719, 7, 6, 7, 4], [184, 770, 8, 8, 8, 4], [245, 5, 6, 6, 6, 4], [245, 56, 7, 6, 7, 4], [245, 107, 8, 6, 8, 4], [245, 158, 7, 6, 7, 4], [245, 209, 7, 6, 7, 4], [245, 260, 7, 6, 7, 4], [245, 311, 6, 6, 6, 4], [245, 362, 8, 8, 8, 4], [245, 413, 8, 6, 8, 4], [245, 464, 6, 6, 6, 4], [245, 515, 6, 8, 6, 4], [245, 566, 8, 6, 8, 4], [245, 617, 6, 6, 6, 4], [245, 668, 10, 6, 10, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 7, 8, 7, 4], [306, 107, 6, 6, 6, 4], [306, 158, 7, 6, 7, 4], [306, 209, 6, 6, 6, 4], [306, 260, 7, 6, 7, 4], [306, 311, 8, 6, 8, 4], [306, 362, 9, 6, 9, 4], [306, 413, 8, 6, 8, 4], [306, 464, 8, 8, 8, 4], [306, 515, 7, 6, 7, 4], [306, 566, 7, 8, 7, 4], [306, 617, 5, 8, 5, 4], [306, 668, 7, 8, 7, 4], [306, 719, 8, 6, 8, 4], [306, 770, 8, 6, 8, 4], [367, 3, 9, 8, 9, 2], [367, 54, 9, 8, 9, 2], [367, 107, 9, 8, 9, 4], [367, 156, 8, 8, 8, 2], [367, 207, 9, 8, 9, 2], [367, 258, 9, 8, 9, 2], [367, 309, 9, 8, 9, 2], [367, 361, 7, 7, 7, 3], [367, 412, 7, 7, 7, 3], [367, 463, 7, 7, 7, 3], [367, 515, 7, 6, 7, 4], [367, 565, 7, 7, 7, 3], [367, 616, 7, 7, 7, 3], [367, 668, 7, 8, 7, 4], [367, 718, 7, 7, 7, 3], [367, 769, 7, 7, 7, 3], [428, 4, 7, 7, 7, 3], [428, 56, 7, 6, 7, 4], [428, 106, 6, 7, 6, 3], [428, 157, 6, 7, 6, 3], [428, 208, 6, 7, 6, 3], [428, 260, 6, 6, 6, 4], [428, 310, 8, 7, 8, 3], [428, 361, 8, 7, 8, 3], [428, 412, 8, 7, 8, 3], [428, 463, 8, 7, 8, 3], [428, 515, 8, 6, 8, 4], [428, 565, 8, 7, 8, 3], [428, 616, 7, 7, 7, 3], [428, 667, 7, 7, 7, 3], [428, 718, 7, 7, 7, 3], [428, 770, 7, 6, 7, 4], [489, 5, 8, 7, 8, 4], [489, 56, 6, 6, 6, 4], [489, 107, 8, 7, 8, 4], [489, 158, 8, 6, 8, 4], [489, 208, 8, 9, 8, 3], [489, 260, 6, 6, 6, 4], [489, 311, 7, 8, 7, 4], [489, 362, 8, 6, 8, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 11, 6, 11, 4], [489, 566, 6, 6, 6, 4], [489, 617, 6, 6, 6, 4], [489, 668, 8, 6, 8, 4], [489, 719, 11, 6, 11, 4], [489, 770, 9, 6, 9, 4], [550, 5, 9, 6, 9, 4], [550, 56, 8, 6, 8, 4], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 209, 8, 6, 8, 4], [550, 260, 8, 8, 8, 4], [550, 311, 8, 6, 8, 4], [550, 362, 9, 7, 9, 4], [550, 413, 11, 7, 11, 4], [550, 464, 8, 6, 8, 4], [550, 515, 6, 8, 6, 4], [550, 566, 5, 6, 5, 4], [550, 617, 6, 6, 6, 4], [550, 668, 10, 6, 10, 4], [550, 719, 9, 6, 9, 4], [550, 770, 8, 6, 8, 4], [611, 5, 7, 8, 7, 4], [611, 56, 6, 8, 6, 4], [611, 107, 9, 6, 9, 4], [611, 157, 8, 7, 8, 3], [611, 209, 8, 8, 8, 4], [611, 260, 8, 6, 8, 4], [611, 311, 9, 6, 9, 4], [611, 362, 8, 6, 8, 4], [611, 413, 8, 6, 8, 4], [611, 464, 12, 6, 12, 4], [611, 515, 8, 6, 8, 4], [611, 564, 9, 8, 9, 2], [611, 615, 9, 8, 9, 2], [611, 666, 9, 8, 9, 2], [611, 719, 11, 6, 11, 4], [611, 770, 9, 6, 9, 4], [672, 5, 8, 6, 8, 4], [672, 56, 12, 6, 12, 4], [672, 107, 7, 6, 7, 4], [672, 158, 7, 6, 7, 4], [672, 209, 6, 6, 6, 4], [672, 260, 6, 6, 6, 4], [672, 311, 8, 6, 8, 4], [672, 362, 7, 6, 7, 4], [672, 413, 8, 8, 8, 4], [1, 5, 5, 6, 5, 4], [794, 768, 8, 8, 8, 2], [672, 566, 8, 6, 8, 4], [672, 617, 6, 6, 6, 4], [672, 668, 6, 6, 6, 4], [672, 719, 8, 6, 8, 4], [672, 770, 8, 6, 8, 4], [733, 5, 8, 6, 8, 4], [733, 56, 6, 6, 6, 4], [733, 107, 6, 8, 6, 4], [733, 158, 7, 8, 7, 4], [733, 209, 12, 6, 12, 4], [733, 258, 10, 8, 10, 2], [733, 309, 9, 8, 9, 2], [733, 360, 10, 8, 10, 2], [733, 411, 9, 8, 9, 2], [733, 462, 9, 8, 9, 2], [733, 513, 6, 8, 6, 2], [733, 564, 6, 8, 6, 2], [733, 615, 6, 8, 6, 2], [733, 666, 6, 8, 6, 2], [733, 717, 9, 8, 9, 2], [733, 768, 9, 8, 9, 2], [1, 5, 5, 6, 5, 4], [794, 54, 9, 8, 9, 2], [794, 105, 10, 8, 10, 2], [794, 156, 10, 8, 10, 2], [794, 207, 10, 8, 10, 2], [794, 260, 6, 6, 6, 4], [794, 311, 6, 6, 6, 4], [794, 362, 6, 6, 6, 4], [794, 413, 6, 6, 6, 4], [794, 464, 6, 6, 6, 4], [794, 515, 6, 6, 6, 4], [794, 566, 6, 6, 6, 4], [794, 617, 6, 8, 6, 4], [794, 668, 6, 6, 6, 4], [794, 719, 6, 8, 6, 4], [794, 768, 8, 8, 8, 2], [855, 3, 8, 8, 8, 2], [855, 54, 8, 8, 8, 2], [855, 105, 8, 8, 8, 2], [855, 156, 8, 8, 8, 2], [855, 207, 8, 8, 8, 2], [855, 258, 8, 8, 8, 2], [855, 309, 8, 8, 8, 2], [855, 360, 8, 8, 8, 2], [855, 411, 8, 8, 8, 2], [855, 462, 8, 8, 8, 2], [855, 513, 8, 8, 8, 2], [855, 564, 8, 8, 8, 2], [855, 615, 8, 8, 8, 2], [855, 666, 8, 8, 8, 2], [855, 717, 8, 8, 8, 2], [855, 768, 8, 8, 8, 2]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 11, 10, 7, 1], [1, 104, 12, 4, 8, 1], [1, 155, 14, 10, 10, 1], [1, 205, 14, 12, 10, 0], [1, 257, 17, 10, 13, 1], [1, 308, 14, 10, 11, 1], [1, 359, 10, 4, 6, 1], [1, 410, 11, 12, 7, 1], [1, 461, 11, 12, 7, 1], [1, 512, 12, 6, 8, 1], [1, 565, 12, 7, 10, 3], [1, 621, 8, 5, 7, 8], [1, 669, 10, 3, 7, 5], [1, 723, 8, 3, 7, 8], [1, 767, 11, 10, 7, 1], [62, 2, 14, 10, 10, 1], [62, 53, 13, 10, 10, 1], [62, 104, 14, 10, 10, 1], [62, 155, 14, 10, 10, 1], [62, 206, 13, 10, 10, 1], [62, 257, 14, 10, 10, 1], [62, 308, 14, 10, 10, 1], [62, 359, 14, 10, 10, 1], [62, 410, 14, 10, 10, 1], [62, 461, 14, 10, 10, 1], [62, 514, 10, 8, 7, 3], [62, 565, 10, 10, 7, 3], [62, 616, 12, 7, 10, 3], [62, 668, 13, 5, 10, 4], [62, 718, 12, 7, 10, 3], [62, 767, 13, 10, 9, 1], [123, 2, 17, 11, 14, 1], [123, 53, 13, 10, 11, 1], [123, 104, 15, 10, 11, 1], [123, 155, 15, 10, 11, 1], [123, 206, 14, 10, 11, 1], [123, 257, 15, 10, 11, 1], [123, 308, 14, 10, 10, 1], [123, 359, 15, 10, 11, 1], [123, 410, 15, 10, 11, 1], [123, 461, 10, 10, 6, 1], [123, 512, 13, 10, 9, 1], [123, 563, 15, 10, 11, 1], [123, 614, 11, 10, 10, 1], [123, 665, 16, 10, 12, 1], [123, 716, 15, 10, 11, 1], [123, 767, 15, 10, 12, 1], [184, 2, 15, 10, 11, 1], [184, 53, 15, 10, 12, 1], [184, 104, 15, 10, 11, 1], [184, 155, 15, 10, 11, 1], [184, 206, 14, 10, 10, 1], [184, 257, 15, 10, 11, 1], [184, 308, 15, 10, 11, 1], [184, 359, 18, 10, 13, 1], [184, 410, 14, 10, 10, 1], [184, 461, 14, 10, 10, 1], [184, 512, 14, 10, 10, 1], [184, 563, 11, 12, 7, 1], [184, 614, 10, 10, 7, 1], [184, 665, 11, 12, 7, 1], [184, 716, 12, 4, 7, 1], [184, 776, 11, 3, 10, 10], [245, 2, 11, 4, 7, 1], [245, 55, 12, 8, 9, 3], [245, 104, 13, 10, 10, 1], [245, 157, 12, 8, 9, 3], [245, 206, 14, 10, 10, 1], [245, 259, 13, 8, 10, 3], [245, 308, 11, 10, 7, 1], [245, 361, 13, 10, 10, 3], [245, 410, 13, 10, 10, 1], [245, 461, 10, 10, 6, 1], [245, 512, 10, 12, 6, 1], [245, 563, 12, 10, 9, 1], [245, 614, 10, 10, 6, 1], [245, 667, 15, 8, 12, 3], [245, 718, 13, 8, 10, 3], [245, 769, 13, 8, 10, 3], [306, 4, 13, 10, 10, 3], [306, 55, 13, 10, 10, 3], [306, 106, 11, 8, 7, 3], [306, 157, 12, 8, 9, 3], [306, 206, 10, 10, 7, 1], [306, 259, 13, 8, 10, 3], [306, 310, 13, 8, 9, 3], [306, 361, 15, 8, 11, 3], [306, 412, 13, 8, 9, 3], [306, 463, 13, 10, 9, 3], [306, 514, 12, 8, 9, 3], [306, 563, 12, 12, 7, 1], [306, 614, 10, 12, 6, 1], [306, 665, 11, 12, 7, 1], [306, 719, 13, 4, 10, 4], [306, 768, 14, 9, 10, 2], [367, 1, 15, 11, 11, 0], [367, 52, 14, 11, 11, 0], [367, 104, 15, 12, 11, 1], [367, 154, 15, 11, 11, 0], [367, 205, 16, 11, 11, 0], [367, 256, 16, 11, 12, 0], [367, 307, 15, 11, 11, 0], [367, 358, 13, 11, 9, 0], [367, 409, 12, 11, 9, 0], [367, 460, 13, 11, 9, 0], [367, 512, 13, 10, 9, 1], [367, 562, 14, 11, 9, 0], [367, 613, 13, 11, 9, 0], [367, 667, 12, 10, 9, 3], [367, 715, 14, 11, 10, 0], [367, 766, 13, 11, 10, 0], [428, 1, 14, 11, 10, 0], [428, 53, 14, 10, 10, 1], [428, 103, 12, 11, 7, 0], [428, 154, 11, 11, 7, 0], [428, 205, 12, 11, 7, 0], [428, 257, 12, 10, 7, 1], [428, 307, 15, 11, 10, 0], [428, 358, 14, 11, 10, 0], [428, 409, 13, 11, 10, 0], [428, 460, 14, 11, 10, 0], [428, 512, 14, 10, 10, 1], [428, 562, 15, 11, 10, 0], [428, 613, 14, 11, 10, 0], [428, 664, 13, 11, 10, 0], [428, 715, 14, 11, 10, 0], [428, 767, 14, 10, 10, 1], [489, 2, 13, 12, 10, 1], [489, 53, 12, 6, 7, 1], [489, 105, 13, 10, 10, 2], [489, 155, 14, 10, 10, 1], [489, 206, 14, 11, 10, 1], [489, 260, 11, 5, 8, 4], [489, 308, 14, 12, 9, 1], [489, 359, 14, 10, 10, 1], [489, 411, 15, 9, 12, 2], [489, 462, 15, 9, 12, 2], [489, 513, 17, 6, 13, 2], [489, 563, 11, 4, 7, 1], [489, 614, 12, 3, 7, 1], [489, 667, 12, 7, 9, 3], [489, 716, 18, 10, 14, 1], [489, 767, 16, 10, 12, 1], [550, 5, 12, 6, 10, 4], [550, 56, 12, 7, 10, 4], [550, 107, 12, 7, 10, 4], [550, 158, 12, 7, 10, 4], [550, 206, 14, 10, 10, 1], [550, 260, 12, 9, 10, 4], [550, 309, 12, 9, 9, 2], [550, 360, 15, 10, 11, 2], [550, 411, 16, 10, 12, 2], [550, 464, 13, 7, 10, 4], [550, 513, 12, 11, 7, 2], [550, 563, 12, 8, 8, 1], [550, 614, 12, 8, 8, 1], [550, 666, 15, 9, 12, 2], [550, 718, 16, 8, 13, 3], [550, 769, 14, 8, 10, 3], [611, 4, 12, 10, 10, 3], [611, 55, 10, 10, 7, 3], [611, 108, 12, 5, 10, 5], [611, 156, 14, 9, 9, 2], [611, 206, 14, 12, 10, 1], [611, 259, 13, 7, 10, 3], [611, 309, 12, 9, 10, 2], [611, 361, 13, 7, 10, 3], [611, 412, 12, 7, 10, 3], [611, 468, 14, 3, 14, 8], [611, 511, 1, 1, 10, 1], [611, 562, 13, 11, 11, 0], [611, 613, 16, 11, 11, 0], [611, 664, 16, 11, 12, 0], [611, 716, 18, 10, 14, 1], [611, 769, 16, 8, 13, 3], [672, 6, 12, 3, 10, 5], [672, 57, 16, 3, 14, 5], [672, 104, 13, 5, 8, 1], [672, 155, 13, 5, 8, 1], [672, 206, 11, 5, 6, 1], [672, 257, 11, 5, 6, 1], [672, 311, 12, 7, 10, 4], [672, 360, 12, 9, 9, 2], [672, 410, 13, 12, 9, 1], [1, 1, 1, 1, 6, 1], [794, 767, 12, 4, 8, 1], [672, 565, 13, 6, 10, 3], [672, 616, 11, 7, 7, 3], [672, 667, 10, 7, 7, 3], [672, 716, 13, 10, 9, 1], [672, 767, 13, 10, 9, 1], [733, 2, 13, 12, 10, 1], [733, 57, 9, 3, 7, 5], [733, 111, 8, 5, 6, 8], [733, 162, 9, 5, 7, 8], [733, 206, 17, 10, 14, 1], [733, 256, 14, 11, 11, 0], [733, 307, 15, 11, 11, 0], [733, 358, 15, 11, 11, 0], [733, 409, 15, 11, 11, 0], [733, 460, 15, 11, 11, 0], [733, 511, 12, 11, 7, 0], [733, 562, 12, 11, 7, 0], [733, 613, 12, 11, 7, 0], [733, 664, 12, 11, 7, 0], [733, 715, 16, 11, 12, 0], [733, 766, 15, 11, 12, 0], [1, 1, 1, 1, 6, 1], [794, 52, 15, 11, 12, 0], [794, 103, 16, 11, 12, 0], [794, 154, 16, 11, 12, 0], [794, 205, 16, 11, 12, 0], [794, 259, 10, 8, 7, 3], [794, 308, 12, 4, 7, 1], [794, 359, 12, 4, 7, 1], [794, 410, 11, 3, 7, 1], [794, 461, 13, 4, 9, 1], [794, 512, 11, 3, 7, 1], [794, 563, 11, 3, 7, 1], [794, 620, 8, 6, 7, 7], [794, 665, 12, 4, 7, 1], [794, 723, 8, 5, 7, 8], [794, 767, 12, 4, 8, 1], [855, 2, 12, 4, 8, 1], [855, 53, 12, 4, 8, 1], [855, 104, 12, 4, 8, 1], [855, 155, 12, 4, 8, 1], [855, 206, 12, 4, 8, 1], [855, 257, 12, 4, 8, 1], [855, 308, 12, 4, 8, 1], [855, 359, 12, 4, 8, 1], [855, 410, 12, 4, 8, 1], [855, 461, 12, 4, 8, 1], [855, 512, 12, 4, 8, 1], [855, 563, 12, 4, 8, 1], [855, 614, 12, 4, 8, 1], [855, 665, 12, 4, 8, 1], [855, 716, 12, 4, 8, 1], [855, 767, 12, 4, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 18, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 10, 8, 7, 1], [1, 104, 11, 2, 8, 1], [1, 155, 13, 8, 10, 1], [1, 205, 13, 10, 10, 0], [1, 257, 16, 8, 13, 1], [1, 308, 13, 8, 11, 1], [1, 359, 9, 2, 6, 1], [1, 410, 10, 10, 7, 1], [1, 461, 10, 10, 7, 1], [1, 512, 11, 4, 8, 1], [1, 565, 11, 5, 10, 3], [1, 621, 7, 3, 7, 8], [1, 669, 9, 1, 7, 5], [1, 723, 7, 1, 7, 8], [1, 767, 10, 8, 7, 1], [62, 2, 13, 8, 10, 1], [62, 53, 12, 8, 10, 1], [62, 104, 13, 8, 10, 1], [62, 155, 13, 8, 10, 1], [62, 206, 12, 8, 10, 1], [62, 257, 13, 8, 10, 1], [62, 308, 13, 8, 10, 1], [62, 359, 13, 8, 10, 1], [62, 410, 13, 8, 10, 1], [62, 461, 13, 8, 10, 1], [62, 514, 9, 6, 7, 3], [62, 565, 9, 8, 7, 3], [62, 616, 11, 5, 10, 3], [62, 668, 12, 3, 10, 4], [62, 718, 11, 5, 10, 3], [62, 767, 12, 8, 9, 1], [123, 2, 16, 9, 14, 1], [123, 53, 12, 8, 11, 1], [123, 104, 14, 8, 11, 1], [123, 155, 14, 8, 11, 1], [123, 206, 13, 8, 11, 1], [123, 257, 14, 8, 11, 1], [123, 308, 13, 8, 10, 1], [123, 359, 14, 8, 11, 1], [123, 410, 14, 8, 11, 1], [123, 461, 9, 8, 6, 1], [123, 512, 12, 8, 9, 1], [123, 563, 14, 8, 11, 1], [123, 614, 10, 8, 10, 1], [123, 665, 15, 8, 12, 1], [123, 716, 14, 8, 11, 1], [123, 767, 14, 8, 12, 1], [184, 2, 14, 8, 11, 1], [184, 53, 14, 8, 12, 1], [184, 104, 14, 8, 11, 1], [184, 155, 14, 8, 11, 1], [184, 206, 13, 8, 10, 1], [184, 257, 14, 8, 11, 1], [184, 308, 14, 8, 11, 1], [184, 359, 17, 8, 13, 1], [184, 410, 13, 8, 10, 1], [184, 461, 13, 8, 10, 1], [184, 512, 13, 8, 10, 1], [184, 563, 10, 10, 7, 1], [184, 614, 9, 8, 7, 1], [184, 665, 10, 10, 7, 1], [184, 716, 11, 2, 7, 1], [184, 776, 10, 1, 10, 10], [245, 2, 10, 2, 7, 1], [245, 55, 11, 6, 9, 3], [245, 104, 12, 8, 10, 1], [245, 157, 11, 6, 9, 3], [245, 206, 13, 8, 10, 1], [245, 259, 12, 6, 10, 3], [245, 308, 10, 8, 7, 1], [245, 361, 12, 8, 10, 3], [245, 410, 12, 8, 10, 1], [245, 461, 9, 8, 6, 1], [245, 512, 9, 10, 6, 1], [245, 563, 11, 8, 9, 1], [245, 614, 9, 8, 6, 1], [245, 667, 14, 6, 12, 3], [245, 718, 12, 6, 10, 3], [245, 769, 12, 6, 10, 3], [306, 4, 12, 8, 10, 3], [306, 55, 12, 8, 10, 3], [306, 106, 10, 6, 7, 3], [306, 157, 11, 6, 9, 3], [306, 206, 9, 8, 7, 1], [306, 259, 12, 6, 10, 3], [306, 310, 12, 6, 9, 3], [306, 361, 14, 6, 11, 3], [306, 412, 12, 6, 9, 3], [306, 463, 12, 8, 9, 3], [306, 514, 11, 6, 9, 3], [306, 563, 11, 10, 7, 1], [306, 614, 9, 10, 6, 1], [306, 665, 10, 10, 7, 1], [306, 719, 12, 2, 10, 4], [306, 768, 13, 7, 10, 2], [367, 1, 12, 9, 11, 0], [367, 52, 13, 9, 11, 0], [367, 104, 14, 10, 11, 1], [367, 154, 14, 9, 11, 0], [367, 205, 14, 9, 11, 0], [367, 256, 14, 9, 12, 0], [367, 307, 14, 9, 11, 0], [367, 358, 11, 9, 9, 0], [367, 409, 11, 9, 9, 0], [367, 460, 12, 9, 9, 0], [367, 512, 12, 8, 9, 1], [367, 562, 12, 9, 9, 0], [367, 613, 12, 9, 9, 0], [367, 667, 11, 8, 9, 3], [367, 715, 12, 9, 10, 0], [367, 766, 12, 9, 10, 0], [428, 1, 13, 9, 10, 0], [428, 53, 13, 8, 10, 1], [428, 103, 9, 9, 7, 0], [428, 154, 10, 9, 7, 0], [428, 205, 11, 9, 7, 0], [428, 257, 11, 8, 7, 1], [428, 307, 12, 9, 10, 0], [428, 358, 12, 9, 10, 0], [428, 409, 12, 9, 10, 0], [428, 460, 13, 9, 10, 0], [428, 512, 13, 8, 10, 1], [428, 562, 12, 9, 10, 0], [428, 613, 12, 9, 10, 0], [428, 664, 12, 9, 10, 0], [428, 715, 13, 9, 10, 0], [428, 767, 13, 8, 10, 1], [489, 2, 12, 10, 10, 1], [489, 53, 11, 4, 7, 1], [489, 105, 12, 8, 10, 2], [489, 155, 13, 8, 10, 1], [489, 206, 13, 9, 10, 1], [489, 260, 10, 3, 8, 4], [489, 308, 13, 10, 9, 1], [489, 359, 13, 8, 10, 1], [489, 411, 14, 7, 12, 2], [489, 462, 14, 7, 12, 2], [489, 513, 16, 4, 13, 2], [489, 563, 10, 2, 7, 1], [489, 614, 11, 1, 7, 1], [489, 667, 11, 5, 9, 3], [489, 716, 17, 8, 14, 1], [489, 767, 15, 8, 12, 1], [550, 5, 11, 4, 10, 4], [550, 56, 11, 5, 10, 4], [550, 107, 11, 5, 10, 4], [550, 158, 11, 5, 10, 4], [550, 206, 13, 8, 10, 1], [550, 260, 11, 7, 10, 4], [550, 309, 11, 7, 9, 2], [550, 360, 14, 8, 11, 2], [550, 411, 15, 8, 12, 2], [550, 464, 12, 5, 10, 4], [550, 513, 11, 9, 7, 2], [550, 563, 11, 6, 8, 1], [550, 614, 11, 6, 8, 1], [550, 666, 14, 7, 12, 2], [550, 718, 15, 6, 13, 3], [550, 769, 13, 6, 10, 3], [611, 4, 11, 8, 10, 3], [611, 55, 9, 8, 7, 3], [611, 108, 11, 3, 10, 5], [611, 156, 13, 7, 9, 2], [611, 206, 13, 10, 10, 1], [611, 259, 12, 5, 10, 3], [611, 309, 11, 7, 10, 2], [611, 361, 12, 5, 10, 3], [611, 412, 11, 5, 10, 3], [611, 468, 13, 1, 14, 8], [611, 511, 1, 1, 10, 1], [611, 562, 12, 9, 11, 0], [611, 613, 13, 9, 11, 0], [611, 664, 14, 9, 12, 0], [611, 716, 17, 8, 14, 1], [611, 769, 15, 6, 13, 3], [672, 6, 11, 1, 10, 5], [672, 57, 15, 1, 14, 5], [672, 104, 12, 3, 8, 1], [672, 155, 12, 3, 8, 1], [672, 206, 10, 3, 6, 1], [672, 257, 10, 3, 6, 1], [672, 311, 11, 5, 10, 4], [672, 360, 11, 7, 9, 2], [672, 410, 12, 10, 9, 1], [1, 1, 1, 1, 6, 1], [794, 767, 11, 2, 8, 1], [672, 565, 12, 4, 10, 3], [672, 616, 10, 5, 7, 3], [672, 667, 9, 5, 7, 3], [672, 716, 12, 8, 9, 1], [672, 767, 12, 8, 9, 1], [733, 2, 12, 10, 10, 1], [733, 57, 8, 1, 7, 5], [733, 111, 7, 3, 6, 8], [733, 162, 8, 3, 7, 8], [733, 206, 16, 8, 14, 1], [733, 256, 13, 9, 11, 0], [733, 307, 14, 9, 11, 0], [733, 358, 12, 9, 11, 0], [733, 409, 14, 9, 11, 0], [733, 460, 14, 9, 11, 0], [733, 511, 10, 9, 7, 0], [733, 562, 11, 9, 7, 0], [733, 613, 10, 9, 7, 0], [733, 664, 11, 9, 7, 0], [733, 715, 14, 9, 12, 0], [733, 766, 14, 9, 12, 0], [1, 1, 1, 1, 6, 1], [794, 52, 14, 9, 12, 0], [794, 103, 15, 9, 12, 0], [794, 154, 15, 9, 12, 0], [794, 205, 15, 9, 12, 0], [794, 259, 9, 6, 7, 3], [794, 308, 11, 2, 7, 1], [794, 359, 11, 2, 7, 1], [794, 410, 10, 1, 7, 1], [794, 461, 12, 2, 9, 1], [794, 512, 10, 1, 7, 1], [794, 563, 10, 1, 7, 1], [794, 620, 7, 4, 7, 7], [794, 665, 11, 2, 7, 1], [794, 723, 7, 3, 7, 8], [794, 767, 11, 2, 8, 1], [855, 2, 11, 2, 8, 1], [855, 53, 11, 2, 8, 1], [855, 104, 11, 2, 8, 1], [855, 155, 11, 2, 8, 1], [855, 206, 11, 2, 8, 1], [855, 257, 11, 2, 8, 1], [855, 308, 11, 2, 8, 1], [855, 359, 11, 2, 8, 1], [855, 410, 11, 2, 8, 1], [855, 461, 11, 2, 8, 1], [855, 512, 11, 2, 8, 1], [855, 563, 11, 2, 8, 1], [855, 614, 11, 2, 8, 1], [855, 665, 11, 2, 8, 1], [855, 716, 11, 2, 8, 1], [855, 767, 11, 2, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 53, 7, 10, 7, 1], [1, 104, 8, 9, 8, 1], [1, 155, 10, 10, 10, 1], [1, 205, 10, 12, 10, 0], [1, 257, 13, 10, 13, 1], [1, 308, 11, 10, 11, 1], [1, 359, 6, 9, 6, 1], [1, 410, 7, 12, 7, 1], [1, 461, 7, 12, 7, 1], [1, 512, 8, 9, 8, 1], [1, 565, 10, 7, 10, 3], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 767, 7, 10, 7, 1], [62, 2, 10, 10, 10, 1], [62, 53, 10, 10, 10, 1], [62, 104, 10, 10, 10, 1], [62, 155, 10, 10, 10, 1], [62, 206, 10, 10, 10, 1], [62, 257, 10, 10, 10, 1], [62, 308, 10, 10, 10, 1], [62, 359, 10, 10, 10, 1], [62, 410, 10, 10, 10, 1], [62, 461, 10, 10, 10, 1], [62, 514, 7, 8, 7, 3], [62, 565, 7, 10, 7, 3], [62, 616, 10, 7, 10, 3], [62, 668, 10, 6, 10, 4], [62, 718, 10, 7, 10, 3], [62, 767, 9, 10, 9, 1], [123, 2, 14, 11, 14, 1], [123, 53, 11, 10, 11, 1], [123, 104, 11, 10, 11, 1], [123, 155, 11, 10, 11, 1], [123, 206, 11, 10, 11, 1], [123, 257, 11, 10, 11, 1], [123, 308, 10, 10, 10, 1], [123, 359, 11, 10, 11, 1], [123, 410, 11, 10, 11, 1], [123, 461, 6, 10, 6, 1], [123, 512, 9, 10, 9, 1], [123, 563, 11, 10, 11, 1], [123, 614, 10, 10, 10, 1], [123, 665, 12, 10, 12, 1], [123, 716, 11, 10, 11, 1], [123, 767, 12, 10, 12, 1], [184, 2, 11, 10, 11, 1], [184, 53, 12, 10, 12, 1], [184, 104, 11, 10, 11, 1], [184, 155, 11, 10, 11, 1], [184, 206, 10, 10, 10, 1], [184, 257, 11, 10, 11, 1], [184, 308, 11, 10, 11, 1], [184, 359, 13, 10, 13, 1], [184, 410, 10, 10, 10, 1], [184, 461, 10, 10, 10, 1], [184, 512, 10, 10, 10, 1], [184, 563, 7, 12, 7, 1], [184, 614, 7, 10, 7, 1], [184, 665, 7, 12, 7, 1], [184, 716, 7, 9, 7, 1], [184, 770, 10, 9, 10, 4], [245, 2, 7, 9, 7, 1], [245, 55, 9, 8, 9, 3], [245, 104, 10, 10, 10, 1], [245, 157, 9, 8, 9, 3], [245, 206, 10, 10, 10, 1], [245, 259, 10, 8, 10, 3], [245, 308, 7, 10, 7, 1], [245, 361, 10, 10, 10, 3], [245, 410, 10, 10, 10, 1], [245, 461, 6, 10, 6, 1], [245, 512, 6, 12, 6, 1], [245, 563, 9, 10, 9, 1], [245, 614, 6, 10, 6, 1], [245, 667, 12, 8, 12, 3], [245, 718, 10, 8, 10, 3], [245, 769, 10, 8, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 10, 10, 10, 3], [306, 106, 7, 8, 7, 3], [306, 157, 9, 8, 9, 3], [306, 206, 7, 10, 7, 1], [306, 259, 10, 8, 10, 3], [306, 310, 9, 8, 9, 3], [306, 361, 11, 8, 11, 3], [306, 412, 9, 8, 9, 3], [306, 463, 9, 10, 9, 3], [306, 514, 9, 8, 9, 3], [306, 563, 7, 12, 7, 1], [306, 614, 6, 12, 6, 1], [306, 665, 7, 12, 7, 1], [306, 719, 10, 6, 10, 4], [306, 768, 10, 9, 10, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 104, 11, 12, 11, 1], [367, 154, 11, 11, 11, 0], [367, 205, 11, 11, 11, 0], [367, 256, 12, 11, 12, 0], [367, 307, 11, 11, 11, 0], [367, 358, 9, 11, 9, 0], [367, 409, 9, 11, 9, 0], [367, 460, 9, 11, 9, 0], [367, 512, 9, 10, 9, 1], [367, 562, 9, 11, 9, 0], [367, 613, 9, 11, 9, 0], [367, 667, 9, 10, 9, 3], [367, 715, 10, 11, 10, 0], [367, 766, 10, 11, 10, 0], [428, 1, 10, 11, 10, 0], [428, 53, 10, 10, 10, 1], [428, 103, 7, 11, 7, 0], [428, 154, 7, 11, 7, 0], [428, 205, 7, 11, 7, 0], [428, 257, 7, 10, 7, 1], [428, 307, 10, 11, 10, 0], [428, 358, 10, 11, 10, 0], [428, 409, 10, 11, 10, 0], [428, 460, 10, 11, 10, 0], [428, 512, 10, 10, 10, 1], [428, 562, 10, 11, 10, 0], [428, 613, 10, 11, 10, 0], [428, 664, 10, 11, 10, 0], [428, 715, 10, 11, 10, 0], [428, 767, 10, 10, 10, 1], [489, 2, 10, 12, 10, 1], [489, 53, 7, 9, 7, 1], [489, 105, 10, 10, 10, 2], [489, 155, 10, 10, 10, 1], [489, 206, 10, 11, 10, 1], [489, 260, 8, 6, 8, 4], [489, 308, 9, 12, 9, 1], [489, 359, 10, 10, 10, 1], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 13, 8, 13, 2], [489, 563, 7, 9, 7, 1], [489, 614, 7, 9, 7, 1], [489, 667, 9, 7, 9, 3], [489, 716, 14, 10, 14, 1], [489, 767, 12, 10, 12, 1], [550, 5, 10, 6, 10, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 206, 10, 10, 10, 1], [550, 260, 10, 9, 10, 4], [550, 309, 9, 9, 9, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 464, 10, 7, 10, 4], [550, 513, 7, 11, 7, 2], [550, 563, 8, 9, 8, 1], [550, 614, 8, 9, 8, 1], [550, 666, 12, 9, 12, 2], [550, 718, 13, 8, 13, 3], [550, 769, 10, 8, 10, 3], [611, 4, 10, 10, 10, 3], [611, 55, 7, 10, 7, 3], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 206, 10, 12, 10, 1], [611, 259, 10, 7, 10, 3], [611, 309, 10, 9, 10, 2], [611, 361, 10, 7, 10, 3], [611, 412, 10, 7, 10, 3], [611, 464, 14, 7, 14, 4], [611, 515, 10, 6, 10, 4], [611, 562, 11, 11, 11, 0], [611, 613, 11, 11, 11, 0], [611, 664, 12, 11, 12, 0], [611, 716, 14, 10, 14, 1], [611, 769, 13, 8, 13, 3], [672, 5, 10, 6, 10, 4], [672, 56, 14, 6, 14, 4], [672, 104, 8, 9, 8, 1], [672, 155, 8, 9, 8, 1], [672, 206, 6, 9, 6, 1], [672, 257, 6, 9, 6, 1], [672, 311, 10, 7, 10, 4], [672, 360, 9, 9, 9, 2], [672, 410, 9, 12, 9, 1], [1, 5, 6, 6, 6, 4], [794, 767, 8, 9, 8, 1], [672, 565, 10, 7, 10, 3], [672, 616, 7, 7, 7, 3], [672, 667, 7, 7, 7, 3], [672, 716, 9, 10, 9, 1], [672, 767, 9, 10, 9, 1], [733, 2, 10, 12, 10, 1], [733, 56, 7, 6, 7, 4], [733, 107, 6, 9, 6, 4], [733, 158, 7, 9, 7, 4], [733, 206, 14, 10, 14, 1], [733, 256, 11, 11, 11, 0], [733, 307, 11, 11, 11, 0], [733, 358, 11, 11, 11, 0], [733, 409, 11, 11, 11, 0], [733, 460, 11, 11, 11, 0], [733, 511, 7, 11, 7, 0], [733, 562, 7, 11, 7, 0], [733, 613, 7, 11, 7, 0], [733, 664, 7, 11, 7, 0], [733, 715, 12, 11, 12, 0], [733, 766, 12, 11, 12, 0], [1, 5, 6, 6, 6, 4], [794, 52, 12, 11, 12, 0], [794, 103, 12, 11, 12, 0], [794, 154, 12, 11, 12, 0], [794, 205, 12, 11, 12, 0], [794, 259, 7, 8, 7, 3], [794, 308, 7, 9, 7, 1], [794, 359, 7, 9, 7, 1], [794, 410, 7, 9, 7, 1], [794, 461, 9, 9, 9, 1], [794, 512, 7, 9, 7, 1], [794, 563, 7, 9, 7, 1], [794, 617, 7, 9, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 9, 7, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 7, 8, 7, 2], [1, 105, 8, 8, 8, 2], [1, 156, 10, 8, 10, 2], [1, 206, 10, 10, 10, 1], [1, 258, 13, 8, 13, 2], [1, 309, 11, 8, 11, 2], [1, 360, 6, 8, 6, 2], [1, 411, 7, 10, 7, 2], [1, 462, 7, 10, 7, 2], [1, 513, 8, 8, 8, 2], [1, 566, 10, 6, 10, 4], [1, 617, 7, 8, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 6, 7, 4], [1, 768, 7, 8, 7, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 768, 9, 8, 9, 2], [123, 3, 14, 9, 14, 2], [123, 54, 11, 8, 11, 2], [123, 105, 11, 8, 11, 2], [123, 156, 11, 8, 11, 2], [123, 207, 11, 8, 11, 2], [123, 258, 11, 8, 11, 2], [123, 309, 10, 8, 10, 2], [123, 360, 11, 8, 11, 2], [123, 411, 11, 8, 11, 2], [123, 462, 6, 8, 6, 2], [123, 513, 9, 8, 9, 2], [123, 564, 11, 8, 11, 2], [123, 615, 10, 8, 10, 2], [123, 666, 12, 8, 12, 2], [123, 717, 11, 8, 11, 2], [123, 768, 12, 8, 12, 2], [184, 3, 11, 8, 11, 2], [184, 54, 12, 8, 12, 2], [184, 105, 11, 8, 11, 2], [184, 156, 11, 8, 11, 2], [184, 207, 10, 8, 10, 2], [184, 258, 11, 8, 11, 2], [184, 309, 11, 8, 11, 2], [184, 360, 13, 8, 13, 2], [184, 411, 10, 8, 10, 2], [184, 462, 10, 8, 10, 2], [184, 513, 10, 8, 10, 2], [184, 564, 7, 10, 7, 2], [184, 615, 7, 8, 7, 2], [184, 666, 7, 10, 7, 2], [184, 717, 7, 8, 7, 2], [184, 770, 10, 8, 10, 4], [245, 3, 7, 8, 7, 2], [245, 56, 9, 6, 9, 4], [245, 105, 10, 8, 10, 2], [245, 158, 9, 6, 9, 4], [245, 207, 10, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 7, 8, 7, 2], [245, 362, 10, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 6, 8, 6, 2], [245, 513, 6, 10, 6, 2], [245, 564, 9, 8, 9, 2], [245, 615, 6, 8, 6, 2], [245, 668, 12, 6, 12, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 7, 6, 7, 4], [306, 158, 9, 6, 9, 4], [306, 207, 7, 8, 7, 2], [306, 260, 10, 6, 10, 4], [306, 311, 9, 6, 9, 4], [306, 362, 11, 6, 11, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 564, 7, 10, 7, 2], [306, 615, 6, 10, 6, 2], [306, 666, 7, 10, 7, 2], [306, 719, 10, 6, 10, 4], [306, 769, 10, 7, 10, 3], [367, 2, 11, 9, 11, 1], [367, 53, 11, 9, 11, 1], [367, 105, 11, 10, 11, 2], [367, 155, 11, 9, 11, 1], [367, 206, 11, 9, 11, 1], [367, 257, 12, 9, 12, 1], [367, 308, 11, 9, 11, 1], [367, 359, 9, 9, 9, 1], [367, 410, 9, 9, 9, 1], [367, 461, 9, 9, 9, 1], [367, 513, 9, 8, 9, 2], [367, 563, 9, 9, 9, 1], [367, 614, 9, 9, 9, 1], [367, 668, 9, 8, 9, 4], [367, 716, 10, 9, 10, 1], [367, 767, 10, 9, 10, 1], [428, 2, 10, 9, 10, 1], [428, 54, 10, 8, 10, 2], [428, 104, 7, 9, 7, 1], [428, 155, 7, 9, 7, 1], [428, 206, 7, 9, 7, 1], [428, 258, 7, 8, 7, 2], [428, 308, 10, 9, 10, 1], [428, 359, 10, 9, 10, 1], [428, 410, 10, 9, 10, 1], [428, 461, 10, 9, 10, 1], [428, 513, 10, 8, 10, 2], [428, 563, 10, 9, 10, 1], [428, 614, 10, 9, 10, 1], [428, 665, 10, 9, 10, 1], [428, 716, 10, 9, 10, 1], [428, 768, 10, 8, 10, 2], [489, 3, 10, 10, 10, 2], [489, 54, 7, 8, 7, 2], [489, 106, 10, 8, 10, 3], [489, 156, 10, 8, 10, 2], [489, 207, 10, 9, 10, 2], [489, 260, 8, 6, 8, 4], [489, 309, 9, 10, 9, 2], [489, 360, 10, 8, 10, 2], [489, 412, 12, 7, 12, 3], [489, 463, 12, 7, 12, 3], [489, 514, 13, 7, 13, 3], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 9, 6, 9, 4], [489, 717, 14, 8, 14, 2], [489, 768, 12, 8, 12, 2], [550, 5, 10, 6, 10, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 207, 10, 8, 10, 2], [550, 260, 10, 8, 10, 4], [550, 310, 9, 7, 9, 3], [550, 361, 11, 8, 11, 3], [550, 412, 12, 8, 12, 3], [550, 464, 10, 6, 10, 4], [550, 514, 7, 9, 7, 3], [550, 564, 8, 8, 8, 2], [550, 615, 8, 8, 8, 2], [550, 667, 12, 7, 12, 3], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 7, 8, 7, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 7, 9, 3], [611, 207, 10, 10, 10, 2], [611, 260, 10, 6, 10, 4], [611, 310, 10, 7, 10, 3], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 14, 6, 14, 4], [611, 515, 10, 6, 10, 4], [611, 563, 11, 9, 11, 1], [611, 614, 11, 9, 11, 1], [611, 665, 12, 9, 12, 1], [611, 717, 14, 8, 14, 2], [611, 770, 13, 6, 13, 4], [672, 5, 10, 6, 10, 4], [672, 56, 14, 6, 14, 4], [672, 105, 8, 8, 8, 2], [672, 156, 8, 8, 8, 2], [672, 207, 6, 8, 6, 2], [672, 258, 6, 8, 6, 2], [672, 311, 10, 6, 10, 4], [672, 361, 9, 7, 9, 3], [672, 411, 9, 10, 9, 2], [1, 5, 6, 6, 6, 4], [794, 768, 8, 8, 8, 2], [672, 566, 10, 6, 10, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 717, 9, 8, 9, 2], [672, 768, 9, 8, 9, 2], [733, 3, 10, 10, 10, 2], [733, 56, 7, 6, 7, 4], [733, 107, 6, 8, 6, 4], [733, 158, 7, 8, 7, 4], [733, 207, 14, 8, 14, 2], [733, 257, 11, 9, 11, 1], [733, 308, 11, 9, 11, 1], [733, 359, 11, 9, 11, 1], [733, 410, 11, 9, 11, 1], [733, 461, 11, 9, 11, 1], [733, 512, 7, 9, 7, 1], [733, 563, 7, 9, 7, 1], [733, 614, 7, 9, 7, 1], [733, 665, 7, 9, 7, 1], [733, 716, 12, 9, 12, 1], [733, 767, 12, 9, 12, 1], [1, 5, 6, 6, 6, 4], [794, 53, 12, 9, 12, 1], [794, 104, 12, 9, 12, 1], [794, 155, 12, 9, 12, 1], [794, 206, 12, 9, 12, 1], [794, 260, 7, 6, 7, 4], [794, 309, 7, 8, 7, 2], [794, 360, 7, 8, 7, 2], [794, 411, 7, 8, 7, 2], [794, 462, 9, 8, 9, 2], [794, 513, 7, 8, 7, 2], [794, 564, 7, 8, 7, 2], [794, 617, 7, 8, 7, 4], [794, 666, 7, 8, 7, 2], [794, 719, 7, 8, 7, 4], [794, 768, 8, 8, 8, 2], [855, 3, 8, 8, 8, 2], [855, 54, 8, 8, 8, 2], [855, 105, 8, 8, 8, 2], [855, 156, 8, 8, 8, 2], [855, 207, 8, 8, 8, 2], [855, 258, 8, 8, 8, 2], [855, 309, 8, 8, 8, 2], [855, 360, 8, 8, 8, 2], [855, 411, 8, 8, 8, 2], [855, 462, 8, 8, 8, 2], [855, 513, 8, 8, 8, 2], [855, 564, 8, 8, 8, 2], [855, 615, 8, 8, 8, 2], [855, 666, 8, 8, 8, 2], [855, 717, 8, 8, 8, 2], [855, 768, 8, 8, 8, 2]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 10, 10, 7, 1], [1, 104, 11, 4, 8, 1], [1, 155, 13, 10, 10, 1], [1, 205, 13, 12, 10, 0], [1, 257, 16, 10, 13, 1], [1, 308, 13, 10, 11, 1], [1, 359, 9, 4, 6, 1], [1, 410, 10, 12, 7, 1], [1, 461, 10, 12, 7, 1], [1, 512, 11, 6, 8, 1], [1, 565, 11, 7, 10, 3], [1, 621, 7, 5, 7, 8], [1, 669, 9, 3, 7, 5], [1, 723, 7, 3, 7, 8], [1, 767, 10, 10, 7, 1], [62, 2, 13, 10, 10, 1], [62, 53, 12, 10, 10, 1], [62, 104, 13, 10, 10, 1], [62, 155, 13, 10, 10, 1], [62, 206, 12, 10, 10, 1], [62, 257, 13, 10, 10, 1], [62, 308, 13, 10, 10, 1], [62, 359, 13, 10, 10, 1], [62, 410, 13, 10, 10, 1], [62, 461, 13, 10, 10, 1], [62, 514, 9, 8, 7, 3], [62, 565, 9, 10, 7, 3], [62, 616, 11, 7, 10, 3], [62, 668, 12, 5, 10, 4], [62, 718, 11, 7, 10, 3], [62, 767, 12, 10, 9, 1], [123, 2, 16, 11, 14, 1], [123, 53, 12, 10, 11, 1], [123, 104, 14, 10, 11, 1], [123, 155, 14, 10, 11, 1], [123, 206, 13, 10, 11, 1], [123, 257, 14, 10, 11, 1], [123, 308, 13, 10, 10, 1], [123, 359, 14, 10, 11, 1], [123, 410, 14, 10, 11, 1], [123, 461, 9, 10, 6, 1], [123, 512, 12, 10, 9, 1], [123, 563, 14, 10, 11, 1], [123, 614, 10, 10, 10, 1], [123, 665, 15, 10, 12, 1], [123, 716, 14, 10, 11, 1], [123, 767, 14, 10, 12, 1], [184, 2, 14, 10, 11, 1], [184, 53, 14, 10, 12, 1], [184, 104, 14, 10, 11, 1], [184, 155, 14, 10, 11, 1], [184, 206, 13, 10, 10, 1], [184, 257, 14, 10, 11, 1], [184, 308, 14, 10, 11, 1], [184, 359, 17, 10, 13, 1], [184, 410, 13, 10, 10, 1], [184, 461, 13, 10, 10, 1], [184, 512, 13, 10, 10, 1], [184, 563, 10, 12, 7, 1], [184, 614, 9, 10, 7, 1], [184, 665, 10, 12, 7, 1], [184, 716, 11, 4, 7, 1], [184, 776, 10, 3, 10, 10], [245, 2, 10, 4, 7, 1], [245, 55, 11, 8, 9, 3], [245, 104, 12, 10, 10, 1], [245, 157, 11, 8, 9, 3], [245, 206, 13, 10, 10, 1], [245, 259, 12, 8, 10, 3], [245, 308, 10, 10, 7, 1], [245, 361, 12, 10, 10, 3], [245, 410, 12, 10, 10, 1], [245, 461, 9, 10, 6, 1], [245, 512, 9, 12, 6, 1], [245, 563, 11, 10, 9, 1], [245, 614, 9, 10, 6, 1], [245, 667, 14, 8, 12, 3], [245, 718, 12, 8, 10, 3], [245, 769, 12, 8, 10, 3], [306, 4, 12, 10, 10, 3], [306, 55, 12, 10, 10, 3], [306, 106, 10, 8, 7, 3], [306, 157, 11, 8, 9, 3], [306, 206, 9, 10, 7, 1], [306, 259, 12, 8, 10, 3], [306, 310, 12, 8, 9, 3], [306, 361, 14, 8, 11, 3], [306, 412, 12, 8, 9, 3], [306, 463, 12, 10, 9, 3], [306, 514, 11, 8, 9, 3], [306, 563, 11, 12, 7, 1], [306, 614, 9, 12, 6, 1], [306, 665, 10, 12, 7, 1], [306, 719, 12, 4, 10, 4], [306, 768, 13, 9, 10, 2], [367, 1, 14, 11, 11, 0], [367, 52, 13, 11, 11, 0], [367, 104, 14, 12, 11, 1], [367, 154, 14, 11, 11, 0], [367, 205, 15, 11, 11, 0], [367, 256, 15, 11, 12, 0], [367, 307, 14, 11, 11, 0], [367, 358, 12, 11, 9, 0], [367, 409, 11, 11, 9, 0], [367, 460, 12, 11, 9, 0], [367, 512, 12, 10, 9, 1], [367, 562, 13, 11, 9, 0], [367, 613, 12, 11, 9, 0], [367, 667, 11, 10, 9, 3], [367, 715, 13, 11, 10, 0], [367, 766, 12, 11, 10, 0], [428, 1, 13, 11, 10, 0], [428, 53, 13, 10, 10, 1], [428, 103, 11, 11, 7, 0], [428, 154, 10, 11, 7, 0], [428, 205, 11, 11, 7, 0], [428, 257, 11, 10, 7, 1], [428, 307, 14, 11, 10, 0], [428, 358, 13, 11, 10, 0], [428, 409, 12, 11, 10, 0], [428, 460, 13, 11, 10, 0], [428, 512, 13, 10, 10, 1], [428, 562, 14, 11, 10, 0], [428, 613, 13, 11, 10, 0], [428, 664, 12, 11, 10, 0], [428, 715, 13, 11, 10, 0], [428, 767, 13, 10, 10, 1], [489, 2, 12, 12, 10, 1], [489, 53, 11, 6, 7, 1], [489, 105, 12, 10, 10, 2], [489, 155, 13, 10, 10, 1], [489, 206, 13, 11, 10, 1], [489, 260, 10, 5, 8, 4], [489, 308, 13, 12, 9, 1], [489, 359, 13, 10, 10, 1], [489, 411, 14, 9, 12, 2], [489, 462, 14, 9, 12, 2], [489, 513, 16, 6, 13, 2], [489, 563, 10, 4, 7, 1], [489, 614, 11, 3, 7, 1], [489, 667, 11, 7, 9, 3], [489, 716, 17, 10, 14, 1], [489, 767, 15, 10, 12, 1], [550, 5, 11, 6, 10, 4], [550, 56, 11, 7, 10, 4], [550, 107, 11, 7, 10, 4], [550, 158, 11, 7, 10, 4], [550, 206, 13, 10, 10, 1], [550, 260, 11, 9, 10, 4], [550, 309, 11, 9, 9, 2], [550, 360, 14, 10, 11, 2], [550, 411, 15, 10, 12, 2], [550, 464, 12, 7, 10, 4], [550, 513, 11, 11, 7, 2], [550, 563, 11, 8, 8, 1], [550, 614, 11, 8, 8, 1], [550, 666, 14, 9, 12, 2], [550, 718, 15, 8, 13, 3], [550, 769, 13, 8, 10, 3], [611, 4, 11, 10, 10, 3], [611, 55, 9, 10, 7, 3], [611, 108, 11, 5, 10, 5], [611, 156, 13, 9, 9, 2], [611, 206, 13, 12, 10, 1], [611, 259, 12, 7, 10, 3], [611, 309, 11, 9, 10, 2], [611, 361, 12, 7, 10, 3], [611, 412, 11, 7, 10, 3], [611, 468, 13, 3, 14, 8], [611, 511, 1, 1, 10, 1], [611, 562, 12, 11, 11, 0], [611, 613, 15, 11, 11, 0], [611, 664, 15, 11, 12, 0], [611, 716, 17, 10, 14, 1], [611, 769, 15, 8, 13, 3], [672, 6, 11, 3, 10, 5], [672, 57, 15, 3, 14, 5], [672, 104, 12, 5, 8, 1], [672, 155, 12, 5, 8, 1], [672, 206, 10, 5, 6, 1], [672, 257, 10, 5, 6, 1], [672, 311, 11, 7, 10, 4], [672, 360, 11, 9, 9, 2], [672, 410, 12, 12, 9, 1], [1, 1, 1, 1, 6, 1], [794, 767, 11, 4, 8, 1], [672, 565, 12, 6, 10, 3], [672, 616, 10, 7, 7, 3], [672, 667, 9, 7, 7, 3], [672, 716, 12, 10, 9, 1], [672, 767, 12, 10, 9, 1], [733, 2, 12, 12, 10, 1], [733, 57, 8, 3, 7, 5], [733, 111, 7, 5, 6, 8], [733, 162, 8, 5, 7, 8], [733, 206, 16, 10, 14, 1], [733, 256, 13, 11, 11, 0], [733, 307, 14, 11, 11, 0], [733, 358, 14, 11, 11, 0], [733, 409, 14, 11, 11, 0], [733, 460, 14, 11, 11, 0], [733, 511, 11, 11, 7, 0], [733, 562, 11, 11, 7, 0], [733, 613, 11, 11, 7, 0], [733, 664, 11, 11, 7, 0], [733, 715, 15, 11, 12, 0], [733, 766, 14, 11, 12, 0], [1, 1, 1, 1, 6, 1], [794, 52, 14, 11, 12, 0], [794, 103, 15, 11, 12, 0], [794, 154, 15, 11, 12, 0], [794, 205, 15, 11, 12, 0], [794, 259, 9, 8, 7, 3], [794, 308, 11, 4, 7, 1], [794, 359, 11, 4, 7, 1], [794, 410, 10, 3, 7, 1], [794, 461, 12, 4, 9, 1], [794, 512, 10, 3, 7, 1], [794, 563, 10, 3, 7, 1], [794, 620, 7, 6, 7, 7], [794, 665, 11, 4, 7, 1], [794, 723, 7, 5, 7, 8], [794, 767, 11, 4, 8, 1], [855, 2, 11, 4, 8, 1], [855, 53, 11, 4, 8, 1], [855, 104, 11, 4, 8, 1], [855, 155, 11, 4, 8, 1], [855, 206, 11, 4, 8, 1], [855, 257, 11, 4, 8, 1], [855, 308, 11, 4, 8, 1], [855, 359, 11, 4, 8, 1], [855, 410, 11, 4, 8, 1], [855, 461, 11, 4, 8, 1], [855, 512, 11, 4, 8, 1], [855, 563, 11, 4, 8, 1], [855, 614, 11, 4, 8, 1], [855, 665, 11, 4, 8, 1], [855, 716, 11, 4, 8, 1], [855, 767, 11, 4, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 5, 1], [1, 53, 9, 8, 6, 1], [1, 104, 10, 2, 7, 1], [1, 155, 12, 8, 9, 1], [1, 205, 12, 10, 9, 0], [1, 257, 15, 8, 12, 1], [1, 308, 12, 8, 10, 1], [1, 359, 8, 2, 5, 1], [1, 410, 9, 10, 6, 1], [1, 461, 9, 10, 6, 1], [1, 512, 10, 4, 7, 1], [1, 565, 10, 5, 9, 3], [1, 621, 6, 3, 6, 8], [1, 669, 8, 1, 6, 5], [1, 723, 6, 1, 6, 8], [1, 767, 9, 8, 6, 1], [62, 2, 12, 8, 9, 1], [62, 53, 11, 8, 9, 1], [62, 104, 12, 8, 9, 1], [62, 155, 12, 8, 9, 1], [62, 206, 11, 8, 9, 1], [62, 257, 12, 8, 9, 1], [62, 308, 12, 8, 9, 1], [62, 359, 12, 8, 9, 1], [62, 410, 12, 8, 9, 1], [62, 461, 12, 8, 9, 1], [62, 514, 8, 6, 6, 3], [62, 565, 8, 8, 6, 3], [62, 616, 10, 5, 9, 3], [62, 668, 11, 3, 9, 4], [62, 718, 10, 5, 9, 3], [62, 767, 11, 8, 8, 1], [123, 2, 15, 9, 13, 1], [123, 53, 11, 8, 10, 1], [123, 104, 13, 8, 10, 1], [123, 155, 13, 8, 10, 1], [123, 206, 12, 8, 10, 1], [123, 257, 13, 8, 10, 1], [123, 308, 12, 8, 9, 1], [123, 359, 13, 8, 10, 1], [123, 410, 13, 8, 10, 1], [123, 461, 8, 8, 5, 1], [123, 512, 11, 8, 8, 1], [123, 563, 13, 8, 10, 1], [123, 614, 9, 8, 9, 1], [123, 665, 14, 8, 11, 1], [123, 716, 13, 8, 10, 1], [123, 767, 13, 8, 11, 1], [184, 2, 13, 8, 10, 1], [184, 53, 13, 8, 11, 1], [184, 104, 13, 8, 10, 1], [184, 155, 13, 8, 10, 1], [184, 206, 12, 8, 9, 1], [184, 257, 13, 8, 10, 1], [184, 308, 13, 8, 10, 1], [184, 359, 16, 8, 12, 1], [184, 410, 12, 8, 9, 1], [184, 461, 12, 8, 9, 1], [184, 512, 12, 8, 9, 1], [184, 563, 9, 10, 6, 1], [184, 614, 8, 8, 6, 1], [184, 665, 9, 10, 6, 1], [184, 716, 10, 2, 6, 1], [184, 776, 9, 1, 9, 10], [245, 2, 9, 2, 6, 1], [245, 55, 10, 6, 8, 3], [245, 104, 11, 8, 9, 1], [245, 157, 10, 6, 8, 3], [245, 206, 12, 8, 9, 1], [245, 259, 11, 6, 9, 3], [245, 308, 9, 8, 6, 1], [245, 361, 11, 8, 9, 3], [245, 410, 11, 8, 9, 1], [245, 461, 8, 8, 5, 1], [245, 512, 8, 10, 5, 1], [245, 563, 10, 8, 8, 1], [245, 614, 8, 8, 5, 1], [245, 667, 13, 6, 11, 3], [245, 718, 11, 6, 9, 3], [245, 769, 11, 6, 9, 3], [306, 4, 11, 8, 9, 3], [306, 55, 11, 8, 9, 3], [306, 106, 9, 6, 6, 3], [306, 157, 10, 6, 8, 3], [306, 206, 8, 8, 6, 1], [306, 259, 11, 6, 9, 3], [306, 310, 11, 6, 8, 3], [306, 361, 13, 6, 10, 3], [306, 412, 11, 6, 8, 3], [306, 463, 11, 8, 8, 3], [306, 514, 10, 6, 8, 3], [306, 563, 10, 10, 6, 1], [306, 614, 8, 10, 5, 1], [306, 665, 9, 10, 6, 1], [306, 719, 11, 2, 9, 4], [306, 768, 12, 7, 9, 2], [367, 1, 11, 9, 10, 0], [367, 52, 12, 9, 10, 0], [367, 104, 13, 10, 10, 1], [367, 154, 13, 9, 10, 0], [367, 205, 13, 9, 10, 0], [367, 256, 13, 9, 11, 0], [367, 307, 13, 9, 10, 0], [367, 358, 10, 9, 8, 0], [367, 409, 10, 9, 8, 0], [367, 460, 11, 9, 8, 0], [367, 512, 11, 8, 8, 1], [367, 562, 11, 9, 8, 0], [367, 613, 11, 9, 8, 0], [367, 667, 10, 8, 8, 3], [367, 715, 11, 9, 9, 0], [367, 766, 11, 9, 9, 0], [428, 1, 12, 9, 9, 0], [428, 53, 12, 8, 9, 1], [428, 103, 8, 9, 6, 0], [428, 154, 9, 9, 6, 0], [428, 205, 10, 9, 6, 0], [428, 257, 10, 8, 6, 1], [428, 307, 11, 9, 9, 0], [428, 358, 11, 9, 9, 0], [428, 409, 11, 9, 9, 0], [428, 460, 12, 9, 9, 0], [428, 512, 12, 8, 9, 1], [428, 562, 11, 9, 9, 0], [428, 613, 11, 9, 9, 0], [428, 664, 11, 9, 9, 0], [428, 715, 12, 9, 9, 0], [428, 767, 12, 8, 9, 1], [489, 2, 11, 10, 9, 1], [489, 53, 10, 4, 6, 1], [489, 105, 11, 8, 9, 2], [489, 155, 12, 8, 9, 1], [489, 206, 12, 9, 9, 1], [489, 260, 9, 3, 7, 4], [489, 308, 12, 10, 8, 1], [489, 359, 12, 8, 9, 1], [489, 411, 13, 7, 11, 2], [489, 462, 13, 7, 11, 2], [489, 513, 15, 4, 12, 2], [489, 563, 9, 2, 6, 1], [489, 614, 10, 1, 6, 1], [489, 667, 10, 5, 8, 3], [489, 716, 16, 8, 13, 1], [489, 767, 14, 8, 11, 1], [550, 5, 10, 4, 9, 4], [550, 56, 10, 5, 9, 4], [550, 107, 10, 5, 9, 4], [550, 158, 10, 5, 9, 4], [550, 206, 12, 8, 9, 1], [550, 260, 10, 7, 9, 4], [550, 309, 10, 7, 8, 2], [550, 360, 13, 8, 10, 2], [550, 411, 14, 8, 11, 2], [550, 464, 11, 5, 9, 4], [550, 513, 10, 9, 6, 2], [550, 563, 10, 6, 7, 1], [550, 614, 10, 6, 7, 1], [550, 666, 13, 7, 11, 2], [550, 718, 14, 6, 12, 3], [550, 769, 12, 6, 9, 3], [611, 4, 10, 8, 9, 3], [611, 55, 8, 8, 6, 3], [611, 108, 10, 3, 9, 5], [611, 156, 12, 7, 8, 2], [611, 206, 12, 10, 9, 1], [611, 259, 11, 5, 9, 3], [611, 309, 10, 7, 9, 2], [611, 361, 11, 5, 9, 3], [611, 412, 10, 5, 9, 3], [611, 468, 12, 1, 13, 8], [611, 511, 1, 1, 9, 1], [611, 562, 11, 9, 10, 0], [611, 613, 12, 9, 10, 0], [611, 664, 13, 9, 11, 0], [611, 716, 16, 8, 13, 1], [611, 769, 14, 6, 12, 3], [672, 6, 10, 1, 9, 5], [672, 57, 14, 1, 13, 5], [672, 104, 11, 3, 7, 1], [672, 155, 11, 3, 7, 1], [672, 206, 9, 3, 5, 1], [672, 257, 9, 3, 5, 1], [672, 311, 10, 5, 9, 4], [672, 360, 10, 7, 8, 2], [672, 410, 11, 10, 8, 1], [1, 1, 1, 1, 5, 1], [794, 767, 10, 2, 7, 1], [672, 565, 11, 4, 9, 3], [672, 616, 9, 5, 6, 3], [672, 667, 8, 5, 6, 3], [672, 716, 11, 8, 8, 1], [672, 767, 11, 8, 8, 1], [733, 2, 11, 10, 9, 1], [733, 57, 7, 1, 6, 5], [733, 111, 6, 3, 5, 8], [733, 162, 7, 3, 6, 8], [733, 206, 15, 8, 13, 1], [733, 256, 12, 9, 10, 0], [733, 307, 13, 9, 10, 0], [733, 358, 11, 9, 10, 0], [733, 409, 13, 9, 10, 0], [733, 460, 13, 9, 10, 0], [733, 511, 9, 9, 6, 0], [733, 562, 10, 9, 6, 0], [733, 613, 9, 9, 6, 0], [733, 664, 10, 9, 6, 0], [733, 715, 13, 9, 11, 0], [733, 766, 13, 9, 11, 0], [1, 1, 1, 1, 5, 1], [794, 52, 13, 9, 11, 0], [794, 103, 14, 9, 11, 0], [794, 154, 14, 9, 11, 0], [794, 205, 14, 9, 11, 0], [794, 259, 8, 6, 6, 3], [794, 308, 10, 2, 6, 1], [794, 359, 10, 2, 6, 1], [794, 410, 9, 1, 6, 1], [794, 461, 11, 2, 8, 1], [794, 512, 9, 1, 6, 1], [794, 563, 9, 1, 6, 1], [794, 620, 6, 4, 6, 7], [794, 665, 10, 2, 6, 1], [794, 723, 6, 3, 6, 8], [794, 767, 10, 2, 7, 1], [855, 2, 10, 2, 7, 1], [855, 53, 10, 2, 7, 1], [855, 104, 10, 2, 7, 1], [855, 155, 10, 2, 7, 1], [855, 206, 10, 2, 7, 1], [855, 257, 10, 2, 7, 1], [855, 308, 10, 2, 7, 1], [855, 359, 10, 2, 7, 1], [855, 410, 10, 2, 7, 1], [855, 461, 10, 2, 7, 1], [855, 512, 10, 2, 7, 1], [855, 563, 10, 2, 7, 1], [855, 614, 10, 2, 7, 1], [855, 665, 10, 2, 7, 1], [855, 716, 10, 2, 7, 1], [855, 767, 10, 2, 7, 1]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 53, 7, 10, 7, 1], [1, 104, 8, 9, 8, 1], [1, 155, 10, 10, 10, 1], [1, 205, 10, 12, 10, 0], [1, 257, 13, 10, 13, 1], [1, 308, 11, 10, 11, 1], [1, 359, 6, 9, 6, 1], [1, 410, 7, 12, 7, 1], [1, 461, 7, 12, 7, 1], [1, 512, 8, 9, 8, 1], [1, 565, 10, 7, 10, 3], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 767, 7, 10, 7, 1], [62, 2, 10, 10, 10, 1], [62, 53, 10, 10, 10, 1], [62, 104, 10, 10, 10, 1], [62, 155, 10, 10, 10, 1], [62, 206, 10, 10, 10, 1], [62, 257, 10, 10, 10, 1], [62, 308, 10, 10, 10, 1], [62, 359, 10, 10, 10, 1], [62, 410, 10, 10, 10, 1], [62, 461, 10, 10, 10, 1], [62, 514, 7, 8, 7, 3], [62, 565, 7, 10, 7, 3], [62, 616, 10, 7, 10, 3], [62, 668, 10, 6, 10, 4], [62, 718, 10, 7, 10, 3], [62, 767, 9, 10, 9, 1], [123, 2, 14, 11, 14, 1], [123, 53, 11, 10, 11, 1], [123, 104, 11, 10, 11, 1], [123, 155, 11, 10, 11, 1], [123, 206, 11, 10, 11, 1], [123, 257, 11, 10, 11, 1], [123, 308, 10, 10, 10, 1], [123, 359, 11, 10, 11, 1], [123, 410, 11, 10, 11, 1], [123, 461, 6, 10, 6, 1], [123, 512, 9, 10, 9, 1], [123, 563, 11, 10, 11, 1], [123, 614, 10, 10, 10, 1], [123, 665, 12, 10, 12, 1], [123, 716, 11, 10, 11, 1], [123, 767, 12, 10, 12, 1], [184, 2, 11, 10, 11, 1], [184, 53, 12, 10, 12, 1], [184, 104, 11, 10, 11, 1], [184, 155, 11, 10, 11, 1], [184, 206, 10, 10, 10, 1], [184, 257, 11, 10, 11, 1], [184, 308, 11, 10, 11, 1], [184, 359, 13, 10, 13, 1], [184, 410, 10, 10, 10, 1], [184, 461, 10, 10, 10, 1], [184, 512, 10, 10, 10, 1], [184, 563, 7, 12, 7, 1], [184, 614, 7, 10, 7, 1], [184, 665, 7, 12, 7, 1], [184, 716, 7, 9, 7, 1], [184, 770, 10, 9, 10, 4], [245, 2, 7, 9, 7, 1], [245, 55, 9, 8, 9, 3], [245, 104, 10, 10, 10, 1], [245, 157, 9, 8, 9, 3], [245, 206, 10, 10, 10, 1], [245, 259, 10, 8, 10, 3], [245, 308, 7, 10, 7, 1], [245, 361, 10, 10, 10, 3], [245, 410, 10, 10, 10, 1], [245, 461, 6, 10, 6, 1], [245, 512, 6, 12, 6, 1], [245, 563, 9, 10, 9, 1], [245, 614, 6, 10, 6, 1], [245, 667, 12, 8, 12, 3], [245, 718, 10, 8, 10, 3], [245, 769, 10, 8, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 10, 10, 10, 3], [306, 106, 7, 8, 7, 3], [306, 157, 9, 8, 9, 3], [306, 206, 7, 10, 7, 1], [306, 259, 10, 8, 10, 3], [306, 310, 9, 8, 9, 3], [306, 361, 11, 8, 11, 3], [306, 412, 9, 8, 9, 3], [306, 463, 9, 10, 9, 3], [306, 514, 9, 8, 9, 3], [306, 563, 7, 12, 7, 1], [306, 614, 6, 12, 6, 1], [306, 665, 7, 12, 7, 1], [306, 719, 10, 6, 10, 4], [306, 768, 10, 9, 10, 2], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 104, 11, 12, 11, 1], [367, 154, 11, 11, 11, 0], [367, 205, 11, 11, 11, 0], [367, 256, 12, 11, 12, 0], [367, 307, 11, 11, 11, 0], [367, 358, 9, 11, 9, 0], [367, 409, 9, 11, 9, 0], [367, 460, 9, 11, 9, 0], [367, 512, 9, 10, 9, 1], [367, 562, 9, 11, 9, 0], [367, 613, 9, 11, 9, 0], [367, 667, 9, 10, 9, 3], [367, 715, 10, 11, 10, 0], [367, 766, 10, 11, 10, 0], [428, 1, 10, 11, 10, 0], [428, 53, 10, 10, 10, 1], [428, 103, 7, 11, 7, 0], [428, 154, 7, 11, 7, 0], [428, 205, 7, 11, 7, 0], [428, 257, 7, 10, 7, 1], [428, 307, 10, 11, 10, 0], [428, 358, 10, 11, 10, 0], [428, 409, 10, 11, 10, 0], [428, 460, 10, 11, 10, 0], [428, 512, 10, 10, 10, 1], [428, 562, 10, 11, 10, 0], [428, 613, 10, 11, 10, 0], [428, 664, 10, 11, 10, 0], [428, 715, 10, 11, 10, 0], [428, 767, 10, 10, 10, 1], [489, 2, 10, 12, 10, 1], [489, 53, 7, 9, 7, 1], [489, 105, 10, 10, 10, 2], [489, 155, 10, 10, 10, 1], [489, 206, 10, 11, 10, 1], [489, 260, 8, 6, 8, 4], [489, 308, 9, 12, 9, 1], [489, 359, 10, 10, 10, 1], [489, 411, 12, 9, 12, 2], [489, 462, 12, 9, 12, 2], [489, 513, 13, 8, 13, 2], [489, 563, 7, 9, 7, 1], [489, 614, 7, 9, 7, 1], [489, 667, 9, 7, 9, 3], [489, 716, 14, 10, 14, 1], [489, 767, 12, 10, 12, 1], [550, 5, 10, 6, 10, 4], [550, 56, 10, 7, 10, 4], [550, 107, 10, 7, 10, 4], [550, 158, 10, 7, 10, 4], [550, 206, 10, 10, 10, 1], [550, 260, 10, 9, 10, 4], [550, 309, 9, 9, 9, 2], [550, 360, 11, 10, 11, 2], [550, 411, 12, 10, 12, 2], [550, 464, 10, 7, 10, 4], [550, 513, 7, 11, 7, 2], [550, 563, 8, 9, 8, 1], [550, 614, 8, 9, 8, 1], [550, 666, 12, 9, 12, 2], [550, 718, 13, 8, 13, 3], [550, 769, 10, 8, 10, 3], [611, 4, 10, 10, 10, 3], [611, 55, 7, 10, 7, 3], [611, 107, 10, 6, 10, 4], [611, 156, 9, 9, 9, 2], [611, 206, 10, 12, 10, 1], [611, 259, 10, 7, 10, 3], [611, 309, 10, 9, 10, 2], [611, 361, 10, 7, 10, 3], [611, 412, 10, 7, 10, 3], [611, 464, 14, 7, 14, 4], [611, 515, 10, 6, 10, 4], [611, 562, 11, 11, 11, 0], [611, 613, 11, 11, 11, 0], [611, 664, 12, 11, 12, 0], [611, 716, 14, 10, 14, 1], [611, 769, 13, 8, 13, 3], [672, 5, 10, 6, 10, 4], [672, 56, 14, 6, 14, 4], [672, 104, 8, 9, 8, 1], [672, 155, 8, 9, 8, 1], [672, 206, 6, 9, 6, 1], [672, 257, 6, 9, 6, 1], [672, 311, 10, 7, 10, 4], [672, 360, 9, 9, 9, 2], [672, 410, 9, 12, 9, 1], [1, 5, 6, 6, 6, 4], [794, 767, 8, 9, 8, 1], [672, 565, 10, 7, 10, 3], [672, 616, 7, 7, 7, 3], [672, 667, 7, 7, 7, 3], [672, 716, 9, 10, 9, 1], [672, 767, 9, 10, 9, 1], [733, 2, 10, 12, 10, 1], [733, 56, 7, 6, 7, 4], [733, 107, 6, 9, 6, 4], [733, 158, 7, 9, 7, 4], [733, 206, 14, 10, 14, 1], [733, 256, 11, 11, 11, 0], [733, 307, 11, 11, 11, 0], [733, 358, 11, 11, 11, 0], [733, 409, 11, 11, 11, 0], [733, 460, 11, 11, 11, 0], [733, 511, 7, 11, 7, 0], [733, 562, 7, 11, 7, 0], [733, 613, 7, 11, 7, 0], [733, 664, 7, 11, 7, 0], [733, 715, 12, 11, 12, 0], [733, 766, 12, 11, 12, 0], [1, 5, 6, 6, 6, 4], [794, 52, 12, 11, 12, 0], [794, 103, 12, 11, 12, 0], [794, 154, 12, 11, 12, 0], [794, 205, 12, 11, 12, 0], [794, 259, 7, 8, 7, 3], [794, 308, 7, 9, 7, 1], [794, 359, 7, 9, 7, 1], [794, 410, 7, 9, 7, 1], [794, 461, 9, 9, 9, 1], [794, 512, 7, 9, 7, 1], [794, 563, 7, 9, 7, 1], [794, 617, 7, 9, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 9, 7, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 5, 6, 5, 4], [1, 54, 6, 8, 6, 2], [1, 105, 7, 8, 7, 2], [1, 156, 9, 8, 9, 2], [1, 206, 9, 10, 9, 1], [1, 258, 12, 8, 12, 2], [1, 309, 10, 8, 10, 2], [1, 360, 5, 8, 5, 2], [1, 411, 6, 10, 6, 2], [1, 462, 6, 10, 6, 2], [1, 513, 7, 8, 7, 2], [1, 566, 9, 6, 9, 4], [1, 617, 6, 8, 6, 4], [1, 668, 6, 6, 6, 4], [1, 719, 6, 6, 6, 4], [1, 768, 6, 8, 6, 2], [62, 3, 9, 8, 9, 2], [62, 54, 9, 8, 9, 2], [62, 105, 9, 8, 9, 2], [62, 156, 9, 8, 9, 2], [62, 207, 9, 8, 9, 2], [62, 258, 9, 8, 9, 2], [62, 309, 9, 8, 9, 2], [62, 360, 9, 8, 9, 2], [62, 411, 9, 8, 9, 2], [62, 462, 9, 8, 9, 2], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 768, 8, 8, 8, 2], [123, 3, 13, 9, 13, 2], [123, 54, 10, 8, 10, 2], [123, 105, 10, 8, 10, 2], [123, 156, 10, 8, 10, 2], [123, 207, 10, 8, 10, 2], [123, 258, 10, 8, 10, 2], [123, 309, 9, 8, 9, 2], [123, 360, 10, 8, 10, 2], [123, 411, 10, 8, 10, 2], [123, 462, 5, 8, 5, 2], [123, 513, 8, 8, 8, 2], [123, 564, 10, 8, 10, 2], [123, 615, 9, 8, 9, 2], [123, 666, 11, 8, 11, 2], [123, 717, 10, 8, 10, 2], [123, 768, 11, 8, 11, 2], [184, 3, 10, 8, 10, 2], [184, 54, 11, 8, 11, 2], [184, 105, 10, 8, 10, 2], [184, 156, 10, 8, 10, 2], [184, 207, 9, 8, 9, 2], [184, 258, 10, 8, 10, 2], [184, 309, 10, 8, 10, 2], [184, 360, 12, 8, 12, 2], [184, 411, 9, 8, 9, 2], [184, 462, 9, 8, 9, 2], [184, 513, 9, 8, 9, 2], [184, 564, 6, 10, 6, 2], [184, 615, 6, 8, 6, 2], [184, 666, 6, 10, 6, 2], [184, 717, 6, 8, 6, 2], [184, 770, 9, 8, 9, 4], [245, 3, 6, 8, 6, 2], [245, 56, 8, 6, 8, 4], [245, 105, 9, 8, 9, 2], [245, 158, 8, 6, 8, 4], [245, 207, 9, 8, 9, 2], [245, 260, 9, 6, 9, 4], [245, 309, 6, 8, 6, 2], [245, 362, 9, 8, 9, 4], [245, 411, 9, 8, 9, 2], [245, 462, 5, 8, 5, 2], [245, 513, 5, 10, 5, 2], [245, 564, 8, 8, 8, 2], [245, 615, 5, 8, 5, 2], [245, 668, 11, 6, 11, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 6, 6, 6, 4], [306, 158, 8, 6, 8, 4], [306, 207, 6, 8, 6, 2], [306, 260, 9, 6, 9, 4], [306, 311, 8, 6, 8, 4], [306, 362, 10, 6, 10, 4], [306, 413, 8, 6, 8, 4], [306, 464, 8, 8, 8, 4], [306, 515, 8, 6, 8, 4], [306, 564, 6, 10, 6, 2], [306, 615, 5, 10, 5, 2], [306, 666, 6, 10, 6, 2], [306, 719, 9, 6, 9, 4], [306, 769, 9, 7, 9, 3], [367, 2, 10, 9, 10, 1], [367, 53, 10, 9, 10, 1], [367, 105, 10, 10, 10, 2], [367, 155, 10, 9, 10, 1], [367, 206, 10, 9, 10, 1], [367, 257, 11, 9, 11, 1], [367, 308, 10, 9, 10, 1], [367, 359, 8, 9, 8, 1], [367, 410, 8, 9, 8, 1], [367, 461, 8, 9, 8, 1], [367, 513, 8, 8, 8, 2], [367, 563, 8, 9, 8, 1], [367, 614, 8, 9, 8, 1], [367, 668, 8, 8, 8, 4], [367, 716, 9, 9, 9, 1], [367, 767, 9, 9, 9, 1], [428, 2, 9, 9, 9, 1], [428, 54, 9, 8, 9, 2], [428, 104, 6, 9, 6, 1], [428, 155, 6, 9, 6, 1], [428, 206, 6, 9, 6, 1], [428, 258, 6, 8, 6, 2], [428, 308, 9, 9, 9, 1], [428, 359, 9, 9, 9, 1], [428, 410, 9, 9, 9, 1], [428, 461, 9, 9, 9, 1], [428, 513, 9, 8, 9, 2], [428, 563, 9, 9, 9, 1], [428, 614, 9, 9, 9, 1], [428, 665, 9, 9, 9, 1], [428, 716, 9, 9, 9, 1], [428, 768, 9, 8, 9, 2], [489, 3, 9, 10, 9, 2], [489, 54, 6, 8, 6, 2], [489, 106, 9, 8, 9, 3], [489, 156, 9, 8, 9, 2], [489, 207, 9, 9, 9, 2], [489, 260, 7, 6, 7, 4], [489, 309, 8, 10, 8, 2], [489, 360, 9, 8, 9, 2], [489, 412, 11, 7, 11, 3], [489, 463, 11, 7, 11, 3], [489, 514, 12, 7, 12, 3], [489, 564, 6, 8, 6, 2], [489, 615, 6, 8, 6, 2], [489, 668, 8, 6, 8, 4], [489, 717, 13, 8, 13, 2], [489, 768, 11, 8, 11, 2], [550, 5, 9, 6, 9, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 207, 9, 8, 9, 2], [550, 260, 9, 8, 9, 4], [550, 310, 8, 7, 8, 3], [550, 361, 10, 8, 10, 3], [550, 412, 11, 8, 11, 3], [550, 464, 9, 6, 9, 4], [550, 514, 6, 9, 6, 3], [550, 564, 7, 8, 7, 2], [550, 615, 7, 8, 7, 2], [550, 667, 11, 7, 11, 3], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 6, 8, 6, 4], [611, 107, 9, 6, 9, 4], [611, 157, 8, 7, 8, 3], [611, 207, 9, 10, 9, 2], [611, 260, 9, 6, 9, 4], [611, 310, 9, 7, 9, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 6, 13, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 9, 10, 1], [611, 614, 10, 9, 10, 1], [611, 665, 11, 9, 11, 1], [611, 717, 13, 8, 13, 2], [611, 770, 12, 6, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 105, 7, 8, 7, 2], [672, 156, 7, 8, 7, 2], [672, 207, 5, 8, 5, 2], [672, 258, 5, 8, 5, 2], [672, 311, 9, 6, 9, 4], [672, 361, 8, 7, 8, 3], [672, 411, 8, 10, 8, 2], [1, 5, 5, 6, 5, 4], [794, 768, 7, 8, 7, 2], [672, 566, 9, 6, 9, 4], [672, 617, 6, 6, 6, 4], [672, 668, 6, 6, 6, 4], [672, 717, 8, 8, 8, 2], [672, 768, 8, 8, 8, 2], [733, 3, 9, 10, 9, 2], [733, 56, 6, 6, 6, 4], [733, 107, 5, 8, 5, 4], [733, 158, 6, 8, 6, 4], [733, 207, 13, 8, 13, 2], [733, 257, 10, 9, 10, 1], [733, 308, 10, 9, 10, 1], [733, 359, 10, 9, 10, 1], [733, 410, 10, 9, 10, 1], [733, 461, 10, 9, 10, 1], [733, 512, 6, 9, 6, 1], [733, 563, 6, 9, 6, 1], [733, 614, 6, 9, 6, 1], [733, 665, 6, 9, 6, 1], [733, 716, 11, 9, 11, 1], [733, 767, 11, 9, 11, 1], [1, 5, 5, 6, 5, 4], [794, 53, 11, 9, 11, 1], [794, 104, 11, 9, 11, 1], [794, 155, 11, 9, 11, 1], [794, 206, 11, 9, 11, 1], [794, 260, 6, 6, 6, 4], [794, 309, 6, 8, 6, 2], [794, 360, 6, 8, 6, 2], [794, 411, 6, 8, 6, 2], [794, 462, 8, 8, 8, 2], [794, 513, 6, 8, 6, 2], [794, 564, 6, 8, 6, 2], [794, 617, 6, 8, 6, 4], [794, 666, 6, 8, 6, 2], [794, 719, 6, 8, 6, 4], [794, 768, 7, 8, 7, 2], [855, 3, 7, 8, 7, 2], [855, 54, 7, 8, 7, 2], [855, 105, 7, 8, 7, 2], [855, 156, 7, 8, 7, 2], [855, 207, 7, 8, 7, 2], [855, 258, 7, 8, 7, 2], [855, 309, 7, 8, 7, 2], [855, 360, 7, 8, 7, 2], [855, 411, 7, 8, 7, 2], [855, 462, 7, 8, 7, 2], [855, 513, 7, 8, 7, 2], [855, 564, 7, 8, 7, 2], [855, 615, 7, 8, 7, 2], [855, 666, 7, 8, 7, 2], [855, 717, 7, 8, 7, 2], [855, 768, 7, 8, 7, 2]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 53, 12, 11, 8, 1], [1, 104, 13, 4, 9, 1], [1, 155, 16, 10, 12, 1], [1, 206, 15, 12, 12, 1], [1, 257, 19, 11, 16, 1], [1, 308, 15, 11, 13, 1], [1, 359, 12, 4, 8, 1], [1, 410, 13, 14, 9, 1], [1, 461, 12, 14, 9, 1], [1, 512, 14, 8, 10, 1], [1, 566, 14, 7, 12, 4], [1, 622, 8, 5, 8, 9], [1, 670, 11, 3, 9, 6], [1, 724, 8, 3, 8, 9], [1, 767, 12, 11, 8, 1], [62, 2, 16, 11, 12, 1], [62, 53, 14, 11, 12, 1], [62, 104, 16, 11, 12, 1], [62, 155, 16, 11, 12, 1], [62, 206, 15, 11, 12, 1], [62, 257, 16, 11, 12, 1], [62, 308, 16, 11, 12, 1], [62, 359, 16, 11, 12, 1], [62, 410, 16, 11, 12, 1], [62, 461, 16, 11, 12, 1], [62, 514, 11, 9, 8, 3], [62, 565, 11, 11, 8, 3], [62, 617, 15, 7, 12, 4], [62, 669, 14, 5, 12, 5], [62, 719, 14, 7, 12, 4], [62, 767, 16, 11, 12, 1], [123, 2, 20, 13, 17, 1], [123, 53, 14, 11, 13, 1], [123, 104, 17, 11, 13, 1], [123, 155, 17, 11, 14, 1], [123, 206, 17, 11, 14, 1], [123, 257, 17, 11, 13, 1], [123, 308, 16, 11, 12, 1], [123, 359, 17, 11, 14, 1], [123, 410, 18, 11, 14, 1], [123, 461, 12, 11, 8, 1], [123, 512, 15, 11, 11, 1], [123, 563, 17, 11, 13, 1], [123, 614, 12, 11, 12, 1], [123, 665, 19, 11, 15, 1], [123, 716, 18, 11, 14, 1], [123, 767, 17, 11, 14, 1], [184, 2, 17, 11, 13, 1], [184, 53, 17, 11, 14, 1], [184, 104, 17, 11, 13, 1], [184, 155, 17, 11, 14, 1], [184, 206, 16, 11, 12, 1], [184, 257, 18, 11, 14, 1], [184, 308, 17, 11, 13, 1], [184, 359, 20, 11, 16, 1], [184, 410, 17, 11, 13, 1], [184, 461, 17, 11, 13, 1], [184, 512, 16, 11, 12, 1], [184, 563, 12, 14, 8, 1], [184, 614, 11, 11, 8, 1], [184, 665, 12, 14, 8, 1], [184, 716, 14, 5, 11, 1], [184, 777, 12, 3, 12, 11], [245, 2, 13, 4, 9, 1], [245, 55, 14, 9, 12, 3], [245, 104, 14, 11, 12, 1], [245, 157, 14, 9, 11, 3], [245, 206, 16, 11, 12, 1], [245, 259, 14, 9, 12, 3], [245, 308, 12, 11, 8, 1], [245, 361, 15, 12, 12, 3], [245, 410, 15, 11, 12, 1], [245, 461, 12, 11, 8, 1], [245, 512, 12, 14, 8, 1], [245, 563, 14, 11, 11, 1], [245, 614, 12, 11, 8, 1], [245, 667, 18, 9, 15, 3], [245, 718, 15, 9, 12, 3], [245, 769, 14, 9, 12, 3], [306, 4, 14, 12, 12, 3], [306, 55, 15, 12, 12, 3], [306, 106, 13, 9, 9, 3], [306, 157, 14, 9, 11, 3], [306, 206, 12, 11, 8, 1], [306, 259, 15, 9, 12, 3], [306, 310, 14, 9, 11, 3], [306, 361, 18, 9, 14, 3], [306, 412, 14, 9, 11, 3], [306, 463, 14, 12, 11, 3], [306, 514, 14, 9, 11, 3], [306, 563, 13, 14, 9, 1], [306, 614, 12, 14, 8, 1], [306, 665, 12, 14, 9, 1], [306, 720, 14, 4, 12, 5], [306, 767, 16, 11, 12, 1], [367, 1, 17, 12, 13, 0], [367, 52, 16, 12, 13, 0], [367, 104, 17, 14, 14, 1], [367, 154, 17, 12, 13, 0], [367, 205, 18, 12, 14, 0], [367, 256, 17, 12, 14, 0], [367, 307, 18, 12, 14, 0], [367, 358, 15, 12, 12, 0], [367, 409, 14, 12, 12, 0], [367, 460, 14, 12, 12, 0], [367, 512, 14, 11, 12, 1], [367, 562, 16, 12, 12, 0], [367, 613, 15, 12, 12, 0], [367, 667, 14, 11, 11, 3], [367, 715, 15, 12, 12, 0], [367, 766, 14, 12, 12, 0], [428, 1, 15, 12, 12, 0], [428, 53, 15, 11, 12, 1], [428, 103, 12, 12, 8, 0], [428, 154, 12, 12, 8, 0], [428, 205, 12, 12, 8, 0], [428, 257, 12, 11, 8, 1], [428, 307, 16, 12, 12, 0], [428, 358, 15, 12, 12, 0], [428, 409, 14, 12, 12, 0], [428, 460, 15, 12, 12, 0], [428, 512, 15, 11, 12, 1], [428, 562, 16, 12, 12, 0], [428, 613, 16, 12, 12, 0], [428, 664, 15, 12, 12, 0], [428, 715, 15, 12, 12, 0], [428, 767, 15, 11, 12, 1], [489, 2, 15, 13, 12, 1], [489, 53, 14, 6, 10, 1], [489, 105, 15, 11, 12, 2], [489, 155, 15, 11, 12, 1], [489, 206, 15, 14, 12, 1], [489, 260, 12, 5, 9, 4], [489, 308, 15, 14, 11, 1], [489, 359, 16, 11, 12, 1], [489, 411, 17, 10, 14, 2], [489, 462, 17, 10, 14, 2], [489, 513, 20, 7, 16, 2], [489, 563, 13, 4, 9, 1], [489, 614, 13, 3, 9, 1], [489, 668, 14, 7, 12, 4], [489, 716, 21, 11, 17, 1], [489, 767, 18, 11, 14, 1], [550, 5, 16, 5, 14, 4], [550, 56, 14, 8, 12, 4], [550, 107, 15, 8, 12, 4], [550, 158, 14, 8, 12, 4], [550, 206, 16, 11, 12, 1], [550, 260, 14, 10, 12, 4], [550, 309, 14, 10, 11, 2], [550, 360, 18, 11, 14, 2], [550, 411, 19, 11, 15, 2], [550, 464, 15, 8, 12, 4], [550, 512, 12, 14, 8, 1], [550, 563, 13, 8, 9, 1], [550, 614, 13, 8, 9, 1], [550, 666, 17, 10, 14, 2], [550, 718, 18, 9, 16, 3], [550, 769, 15, 9, 12, 3], [611, 5, 13, 11, 12, 4], [611, 56, 11, 11, 9, 4], [611, 109, 16, 5, 14, 6], [611, 156, 16, 10, 12, 2], [611, 206, 15, 14, 11, 1], [611, 261, 14, 6, 12, 5], [611, 308, 14, 11, 12, 1], [611, 362, 15, 7, 12, 4], [611, 413, 15, 7, 12, 4], [611, 469, 16, 3, 17, 9], [611, 511, 1, 1, 12, 1], [611, 562, 15, 12, 13, 0], [611, 613, 17, 12, 13, 0], [611, 664, 19, 12, 15, 0], [611, 716, 21, 11, 17, 1], [611, 769, 18, 9, 16, 3], [672, 7, 14, 3, 12, 6], [672, 58, 19, 3, 17, 6], [672, 104, 13, 5, 9, 1], [672, 155, 13, 5, 9, 1], [672, 206, 12, 5, 8, 1], [672, 257, 12, 5, 8, 1], [672, 311, 14, 7, 12, 4], [672, 360, 13, 10, 11, 2], [672, 410, 14, 14, 11, 1], [1, 1, 1, 1, 8, 1], [794, 767, 14, 4, 10, 1], [672, 565, 15, 8, 12, 3], [672, 617, 12, 7, 9, 4], [672, 668, 11, 7, 9, 4], [672, 716, 15, 11, 11, 1], [672, 767, 15, 11, 11, 1], [733, 2, 15, 13, 12, 1], [733, 57, 10, 3, 8, 5], [733, 112, 8, 5, 8, 9], [733, 163, 10, 5, 10, 9], [733, 206, 19, 11, 17, 1], [733, 256, 16, 12, 13, 0], [733, 307, 17, 12, 13, 0], [733, 358, 16, 12, 13, 0], [733, 409, 17, 12, 13, 0], [733, 460, 17, 12, 13, 0], [733, 511, 12, 12, 8, 0], [733, 562, 12, 12, 8, 0], [733, 613, 12, 12, 8, 0], [733, 664, 12, 12, 8, 0], [733, 715, 18, 12, 14, 0], [733, 766, 18, 12, 15, 0], [1, 1, 1, 1, 8, 1], [794, 52, 17, 12, 14, 0], [794, 103, 18, 12, 14, 0], [794, 154, 18, 12, 14, 0], [794, 205, 18, 12, 14, 0], [794, 259, 11, 9, 8, 3], [794, 308, 13, 4, 9, 1], [794, 359, 13, 4, 9, 1], [794, 410, 13, 3, 9, 1], [794, 461, 13, 4, 9, 1], [794, 512, 12, 3, 9, 1], [794, 563, 12, 3, 9, 1], [794, 621, 9, 7, 9, 8], [794, 665, 13, 4, 9, 1], [794, 724, 9, 6, 9, 9], [794, 767, 14, 4, 10, 1], [855, 2, 14, 4, 10, 1], [855, 53, 14, 4, 10, 1], [855, 104, 14, 4, 10, 1], [855, 155, 14, 4, 10, 1], [855, 206, 14, 4, 10, 1], [855, 257, 14, 4, 10, 1], [855, 308, 14, 4, 10, 1], [855, 359, 14, 4, 10, 1], [855, 410, 14, 4, 10, 1], [855, 461, 14, 4, 10, 1], [855, 512, 14, 4, 10, 1], [855, 563, 14, 4, 10, 1], [855, 614, 14, 4, 10, 1], [855, 665, 14, 4, 10, 1], [855, 716, 14, 4, 10, 1], [855, 767, 14, 4, 10, 1]], \"capHeight\": 11, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 11, 9, 7, 1], [1, 104, 12, 2, 8, 1], [1, 155, 15, 8, 11, 1], [1, 206, 14, 10, 11, 1], [1, 257, 18, 9, 15, 1], [1, 308, 14, 9, 12, 1], [1, 359, 11, 2, 7, 1], [1, 410, 12, 12, 8, 1], [1, 461, 11, 12, 8, 1], [1, 512, 13, 6, 9, 1], [1, 566, 13, 5, 11, 4], [1, 622, 7, 3, 7, 9], [1, 670, 10, 1, 8, 6], [1, 724, 7, 1, 7, 9], [1, 767, 11, 9, 7, 1], [62, 2, 15, 9, 11, 1], [62, 53, 13, 9, 11, 1], [62, 104, 15, 9, 11, 1], [62, 155, 15, 9, 11, 1], [62, 206, 14, 9, 11, 1], [62, 257, 15, 9, 11, 1], [62, 308, 15, 9, 11, 1], [62, 359, 15, 9, 11, 1], [62, 410, 15, 9, 11, 1], [62, 461, 15, 9, 11, 1], [62, 514, 10, 7, 7, 3], [62, 565, 10, 9, 7, 3], [62, 617, 14, 5, 11, 4], [62, 669, 13, 3, 11, 5], [62, 719, 13, 5, 11, 4], [62, 767, 15, 9, 11, 1], [123, 2, 19, 11, 16, 1], [123, 53, 13, 9, 12, 1], [123, 104, 16, 9, 12, 1], [123, 155, 16, 9, 13, 1], [123, 206, 16, 9, 13, 1], [123, 257, 16, 9, 12, 1], [123, 308, 15, 9, 11, 1], [123, 359, 16, 9, 13, 1], [123, 410, 17, 9, 13, 1], [123, 461, 11, 9, 7, 1], [123, 512, 14, 9, 10, 1], [123, 563, 16, 9, 12, 1], [123, 614, 11, 9, 11, 1], [123, 665, 18, 9, 14, 1], [123, 716, 17, 9, 13, 1], [123, 767, 16, 9, 13, 1], [184, 2, 16, 9, 12, 1], [184, 53, 16, 9, 13, 1], [184, 104, 16, 9, 12, 1], [184, 155, 16, 9, 13, 1], [184, 206, 15, 9, 11, 1], [184, 257, 17, 9, 13, 1], [184, 308, 16, 9, 12, 1], [184, 359, 19, 9, 15, 1], [184, 410, 16, 9, 12, 1], [184, 461, 16, 9, 12, 1], [184, 512, 15, 9, 11, 1], [184, 563, 11, 12, 7, 1], [184, 614, 10, 9, 7, 1], [184, 665, 11, 12, 7, 1], [184, 716, 13, 3, 10, 1], [184, 777, 11, 1, 11, 11], [245, 2, 12, 2, 8, 1], [245, 55, 13, 7, 11, 3], [245, 104, 13, 9, 11, 1], [245, 157, 13, 7, 10, 3], [245, 206, 15, 9, 11, 1], [245, 259, 13, 7, 11, 3], [245, 308, 11, 9, 7, 1], [245, 361, 14, 10, 11, 3], [245, 410, 14, 9, 11, 1], [245, 461, 11, 9, 7, 1], [245, 512, 11, 12, 7, 1], [245, 563, 13, 9, 10, 1], [245, 614, 11, 9, 7, 1], [245, 667, 17, 7, 14, 3], [245, 718, 14, 7, 11, 3], [245, 769, 13, 7, 11, 3], [306, 4, 13, 10, 11, 3], [306, 55, 14, 10, 11, 3], [306, 106, 12, 7, 8, 3], [306, 157, 13, 7, 10, 3], [306, 206, 11, 9, 7, 1], [306, 259, 14, 7, 11, 3], [306, 310, 13, 7, 10, 3], [306, 361, 17, 7, 13, 3], [306, 412, 13, 7, 10, 3], [306, 463, 13, 10, 10, 3], [306, 514, 13, 7, 10, 3], [306, 563, 12, 12, 8, 1], [306, 614, 11, 12, 7, 1], [306, 665, 11, 12, 8, 1], [306, 720, 13, 2, 11, 5], [306, 767, 15, 9, 11, 1], [367, 1, 13, 10, 12, 0], [367, 52, 15, 10, 12, 0], [367, 104, 16, 12, 13, 1], [367, 154, 16, 10, 12, 0], [367, 205, 17, 10, 13, 0], [367, 256, 16, 10, 13, 0], [367, 307, 17, 10, 13, 0], [367, 358, 13, 10, 11, 0], [367, 409, 13, 10, 11, 0], [367, 460, 13, 10, 11, 0], [367, 512, 13, 9, 11, 1], [367, 562, 14, 10, 11, 0], [367, 613, 14, 10, 11, 0], [367, 667, 13, 9, 10, 3], [367, 715, 13, 10, 11, 0], [367, 766, 13, 10, 11, 0], [428, 1, 14, 10, 11, 0], [428, 53, 14, 9, 11, 1], [428, 104, 11, 9, 7, 1], [428, 154, 11, 10, 7, 0], [428, 205, 11, 10, 7, 0], [428, 257, 11, 9, 7, 1], [428, 307, 15, 10, 11, 0], [428, 358, 13, 10, 11, 0], [428, 409, 13, 10, 11, 0], [428, 460, 14, 10, 11, 0], [428, 512, 14, 9, 11, 1], [428, 562, 14, 10, 11, 0], [428, 613, 14, 10, 11, 0], [428, 664, 14, 10, 11, 0], [428, 715, 14, 10, 11, 0], [428, 767, 14, 9, 11, 1], [489, 2, 14, 11, 11, 1], [489, 53, 13, 4, 9, 1], [489, 105, 14, 9, 11, 2], [489, 155, 14, 9, 11, 1], [489, 206, 14, 12, 11, 1], [489, 260, 11, 3, 8, 4], [489, 308, 14, 12, 10, 1], [489, 359, 15, 9, 11, 1], [489, 411, 16, 8, 13, 2], [489, 462, 16, 8, 13, 2], [489, 513, 19, 5, 15, 2], [489, 563, 12, 2, 8, 1], [489, 614, 12, 1, 8, 1], [489, 668, 13, 5, 11, 4], [489, 716, 20, 9, 16, 1], [489, 767, 17, 9, 13, 1], [550, 5, 15, 3, 13, 4], [550, 56, 13, 6, 11, 4], [550, 107, 14, 6, 11, 4], [550, 158, 13, 6, 11, 4], [550, 206, 15, 9, 11, 1], [550, 260, 13, 8, 11, 4], [550, 309, 13, 8, 10, 2], [550, 360, 17, 9, 13, 2], [550, 411, 18, 9, 14, 2], [550, 464, 14, 6, 11, 4], [550, 512, 11, 12, 7, 1], [550, 563, 12, 6, 8, 1], [550, 614, 12, 6, 8, 1], [550, 666, 16, 8, 13, 2], [550, 718, 17, 7, 15, 3], [550, 769, 14, 7, 11, 3], [611, 5, 12, 9, 11, 4], [611, 56, 10, 9, 8, 4], [611, 109, 15, 3, 13, 6], [611, 156, 15, 8, 11, 2], [611, 206, 14, 12, 10, 1], [611, 261, 13, 4, 11, 5], [611, 308, 13, 9, 11, 1], [611, 362, 14, 5, 11, 4], [611, 413, 14, 5, 11, 4], [611, 469, 15, 1, 16, 9], [611, 511, 1, 1, 11, 1], [611, 562, 14, 10, 12, 0], [611, 613, 15, 10, 12, 0], [611, 664, 17, 10, 14, 0], [611, 716, 20, 9, 16, 1], [611, 769, 17, 7, 15, 3], [672, 7, 13, 1, 11, 6], [672, 58, 18, 1, 16, 6], [672, 104, 12, 3, 8, 1], [672, 155, 12, 3, 8, 1], [672, 206, 11, 3, 7, 1], [672, 257, 11, 3, 7, 1], [672, 311, 13, 5, 11, 4], [672, 360, 12, 8, 10, 2], [672, 410, 13, 12, 10, 1], [1, 1, 1, 1, 7, 1], [794, 767, 13, 2, 9, 1], [672, 565, 14, 6, 11, 3], [672, 617, 11, 5, 8, 4], [672, 668, 10, 5, 8, 4], [672, 716, 14, 9, 10, 1], [672, 767, 14, 9, 10, 1], [733, 2, 14, 11, 11, 1], [733, 57, 9, 1, 7, 5], [733, 112, 7, 3, 7, 9], [733, 163, 9, 3, 9, 9], [733, 206, 18, 9, 16, 1], [733, 256, 15, 10, 12, 0], [733, 307, 16, 10, 12, 0], [733, 358, 13, 10, 12, 0], [733, 409, 16, 10, 12, 0], [733, 460, 16, 10, 12, 0], [733, 511, 11, 10, 7, 0], [733, 562, 11, 10, 7, 0], [733, 613, 11, 10, 7, 0], [733, 664, 11, 10, 7, 0], [733, 715, 16, 10, 13, 0], [733, 766, 17, 10, 14, 0], [1, 1, 1, 1, 7, 1], [794, 52, 16, 10, 13, 0], [794, 103, 17, 10, 13, 0], [794, 154, 17, 10, 13, 0], [794, 205, 17, 10, 13, 0], [794, 259, 10, 7, 7, 3], [794, 308, 12, 2, 8, 1], [794, 359, 12, 2, 8, 1], [794, 410, 12, 1, 8, 1], [794, 461, 12, 2, 8, 1], [794, 512, 11, 1, 8, 1], [794, 563, 11, 1, 8, 1], [794, 621, 8, 5, 8, 8], [794, 665, 12, 2, 8, 1], [794, 724, 8, 4, 8, 9], [794, 767, 13, 2, 9, 1], [855, 2, 13, 2, 9, 1], [855, 53, 13, 2, 9, 1], [855, 104, 13, 2, 9, 1], [855, 155, 13, 2, 9, 1], [855, 206, 13, 2, 9, 1], [855, 257, 13, 2, 9, 1], [855, 308, 13, 2, 9, 1], [855, 359, 13, 2, 9, 1], [855, 410, 13, 2, 9, 1], [855, 461, 13, 2, 9, 1], [855, 512, 13, 2, 9, 1], [855, 563, 13, 2, 9, 1], [855, 614, 13, 2, 9, 1], [855, 665, 13, 2, 9, 1], [855, 716, 13, 2, 9, 1], [855, 767, 13, 2, 9, 1]], \"capHeight\": 10, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 8, 6, 8, 5], [1, 53, 8, 11, 8, 1], [1, 104, 9, 10, 9, 1], [1, 155, 12, 10, 12, 1], [1, 206, 12, 12, 12, 1], [1, 257, 16, 11, 16, 1], [1, 308, 13, 11, 13, 1], [1, 359, 8, 10, 8, 1], [1, 410, 9, 14, 9, 1], [1, 461, 9, 14, 9, 1], [1, 512, 10, 10, 10, 1], [1, 566, 12, 7, 12, 4], [1, 618, 8, 9, 8, 5], [1, 669, 9, 6, 9, 5], [1, 720, 8, 7, 8, 5], [1, 767, 8, 11, 8, 1], [62, 2, 12, 11, 12, 1], [62, 53, 12, 11, 12, 1], [62, 104, 12, 11, 12, 1], [62, 155, 12, 11, 12, 1], [62, 206, 12, 11, 12, 1], [62, 257, 12, 11, 12, 1], [62, 308, 12, 11, 12, 1], [62, 359, 12, 11, 12, 1], [62, 410, 12, 11, 12, 1], [62, 461, 12, 11, 12, 1], [62, 514, 8, 9, 8, 3], [62, 565, 8, 11, 8, 3], [62, 617, 12, 7, 12, 4], [62, 669, 12, 6, 12, 5], [62, 719, 12, 7, 12, 4], [62, 767, 12, 11, 12, 1], [123, 2, 17, 13, 17, 1], [123, 53, 13, 11, 13, 1], [123, 104, 13, 11, 13, 1], [123, 155, 14, 11, 14, 1], [123, 206, 14, 11, 14, 1], [123, 257, 13, 11, 13, 1], [123, 308, 12, 11, 12, 1], [123, 359, 14, 11, 14, 1], [123, 410, 14, 11, 14, 1], [123, 461, 8, 11, 8, 1], [123, 512, 11, 11, 11, 1], [123, 563, 13, 11, 13, 1], [123, 614, 12, 11, 12, 1], [123, 665, 15, 11, 15, 1], [123, 716, 14, 11, 14, 1], [123, 767, 14, 11, 14, 1], [184, 2, 13, 11, 13, 1], [184, 53, 14, 11, 14, 1], [184, 104, 13, 11, 13, 1], [184, 155, 14, 11, 14, 1], [184, 206, 12, 11, 12, 1], [184, 257, 14, 11, 14, 1], [184, 308, 13, 11, 13, 1], [184, 359, 16, 11, 16, 1], [184, 410, 13, 11, 13, 1], [184, 461, 13, 11, 13, 1], [184, 512, 12, 11, 12, 1], [184, 563, 8, 14, 8, 1], [184, 614, 8, 11, 8, 1], [184, 665, 8, 14, 8, 1], [184, 716, 11, 10, 11, 1], [184, 771, 12, 9, 12, 5], [245, 2, 9, 10, 9, 1], [245, 55, 12, 9, 12, 3], [245, 104, 12, 11, 12, 1], [245, 157, 11, 9, 11, 3], [245, 206, 12, 11, 12, 1], [245, 259, 12, 9, 12, 3], [245, 308, 8, 11, 8, 1], [245, 361, 12, 12, 12, 3], [245, 410, 12, 11, 12, 1], [245, 461, 8, 11, 8, 1], [245, 512, 8, 14, 8, 1], [245, 563, 11, 11, 11, 1], [245, 614, 8, 11, 8, 1], [245, 667, 15, 9, 15, 3], [245, 718, 12, 9, 12, 3], [245, 769, 12, 9, 12, 3], [306, 4, 12, 12, 12, 3], [306, 55, 12, 12, 12, 3], [306, 106, 9, 9, 9, 3], [306, 157, 11, 9, 11, 3], [306, 206, 8, 11, 8, 1], [306, 259, 12, 9, 12, 3], [306, 310, 11, 9, 11, 3], [306, 361, 14, 9, 14, 3], [306, 412, 11, 9, 11, 3], [306, 463, 11, 12, 11, 3], [306, 514, 11, 9, 11, 3], [306, 563, 9, 14, 9, 1], [306, 614, 8, 14, 8, 1], [306, 665, 9, 14, 9, 1], [306, 720, 12, 6, 12, 5], [306, 767, 12, 11, 12, 1], [367, 1, 13, 12, 13, 0], [367, 52, 13, 12, 13, 0], [367, 104, 14, 14, 14, 1], [367, 154, 13, 12, 13, 0], [367, 205, 14, 12, 14, 0], [367, 256, 14, 12, 14, 0], [367, 307, 14, 12, 14, 0], [367, 358, 12, 12, 12, 0], [367, 409, 12, 12, 12, 0], [367, 460, 12, 12, 12, 0], [367, 512, 12, 11, 12, 1], [367, 562, 12, 12, 12, 0], [367, 613, 12, 12, 12, 0], [367, 667, 11, 11, 11, 3], [367, 715, 12, 12, 12, 0], [367, 766, 12, 12, 12, 0], [428, 1, 12, 12, 12, 0], [428, 53, 12, 11, 12, 1], [428, 103, 8, 12, 8, 0], [428, 154, 8, 12, 8, 0], [428, 205, 8, 12, 8, 0], [428, 257, 8, 11, 8, 1], [428, 307, 12, 12, 12, 0], [428, 358, 12, 12, 12, 0], [428, 409, 12, 12, 12, 0], [428, 460, 12, 12, 12, 0], [428, 512, 12, 11, 12, 1], [428, 562, 12, 12, 12, 0], [428, 613, 12, 12, 12, 0], [428, 664, 12, 12, 12, 0], [428, 715, 12, 12, 12, 0], [428, 767, 12, 11, 12, 1], [489, 2, 12, 13, 12, 1], [489, 53, 10, 10, 10, 1], [489, 105, 12, 11, 12, 2], [489, 155, 12, 11, 12, 1], [489, 206, 12, 14, 12, 1], [489, 260, 9, 7, 9, 4], [489, 308, 11, 14, 11, 1], [489, 359, 12, 11, 12, 1], [489, 411, 14, 10, 14, 2], [489, 462, 14, 10, 14, 2], [489, 513, 16, 9, 16, 2], [489, 563, 9, 10, 9, 1], [489, 614, 9, 10, 9, 1], [489, 668, 12, 7, 12, 4], [489, 716, 17, 11, 17, 1], [489, 767, 14, 11, 14, 1], [550, 5, 14, 7, 14, 4], [550, 56, 12, 8, 12, 4], [550, 107, 12, 8, 12, 4], [550, 158, 12, 8, 12, 4], [550, 206, 12, 11, 12, 1], [550, 260, 12, 10, 12, 4], [550, 309, 11, 10, 11, 2], [550, 360, 14, 11, 14, 2], [550, 411, 15, 11, 15, 2], [550, 464, 12, 8, 12, 4], [550, 512, 8, 14, 8, 1], [550, 563, 9, 10, 9, 1], [550, 614, 9, 10, 9, 1], [550, 666, 14, 10, 14, 2], [550, 718, 16, 9, 16, 3], [550, 769, 12, 9, 12, 3], [611, 5, 12, 11, 12, 4], [611, 56, 9, 11, 9, 4], [611, 108, 14, 6, 14, 5], [611, 156, 12, 10, 12, 2], [611, 206, 11, 14, 11, 1], [611, 261, 12, 6, 12, 5], [611, 308, 12, 11, 12, 1], [611, 362, 12, 7, 12, 4], [611, 413, 12, 7, 12, 4], [611, 465, 17, 7, 17, 5], [611, 516, 12, 6, 12, 5], [611, 562, 13, 12, 13, 0], [611, 613, 13, 12, 13, 0], [611, 664, 15, 12, 15, 0], [611, 716, 17, 11, 17, 1], [611, 769, 16, 9, 16, 3], [672, 6, 12, 6, 12, 5], [672, 57, 17, 6, 17, 5], [672, 104, 9, 10, 9, 1], [672, 155, 9, 10, 9, 1], [672, 206, 8, 10, 8, 1], [672, 257, 8, 10, 8, 1], [672, 311, 12, 7, 12, 4], [672, 360, 11, 10, 11, 2], [672, 410, 11, 14, 11, 1], [1, 6, 8, 6, 8, 5], [794, 767, 10, 10, 10, 1], [672, 565, 12, 8, 12, 3], [672, 617, 9, 7, 9, 4], [672, 668, 9, 7, 9, 4], [672, 716, 11, 11, 11, 1], [672, 767, 11, 11, 11, 1], [733, 2, 12, 13, 12, 1], [733, 57, 8, 6, 8, 5], [733, 108, 8, 9, 8, 5], [733, 159, 10, 9, 10, 5], [733, 206, 17, 11, 17, 1], [733, 256, 13, 12, 13, 0], [733, 307, 13, 12, 13, 0], [733, 358, 13, 12, 13, 0], [733, 409, 13, 12, 13, 0], [733, 460, 13, 12, 13, 0], [733, 511, 8, 12, 8, 0], [733, 562, 8, 12, 8, 0], [733, 613, 8, 12, 8, 0], [733, 664, 8, 12, 8, 0], [733, 715, 14, 12, 14, 0], [733, 766, 15, 12, 15, 0], [1, 6, 8, 6, 8, 5], [794, 52, 14, 12, 14, 0], [794, 103, 14, 12, 14, 0], [794, 154, 14, 12, 14, 0], [794, 205, 14, 12, 14, 0], [794, 259, 8, 9, 8, 3], [794, 308, 9, 10, 9, 1], [794, 359, 9, 10, 9, 1], [794, 410, 9, 10, 9, 1], [794, 461, 9, 10, 9, 1], [794, 512, 9, 10, 9, 1], [794, 563, 9, 10, 9, 1], [794, 618, 9, 10, 9, 5], [794, 665, 9, 10, 9, 1], [794, 720, 9, 10, 9, 5], [794, 767, 10, 10, 10, 1], [855, 2, 10, 10, 10, 1], [855, 53, 10, 10, 10, 1], [855, 104, 10, 10, 10, 1], [855, 155, 10, 10, 10, 1], [855, 206, 10, 10, 10, 1], [855, 257, 10, 10, 10, 1], [855, 308, 10, 10, 10, 1], [855, 359, 10, 10, 10, 1], [855, 410, 10, 10, 10, 1], [855, 461, 10, 10, 10, 1], [855, 512, 10, 10, 10, 1], [855, 563, 10, 10, 10, 1], [855, 614, 10, 10, 10, 1], [855, 665, 10, 10, 10, 1], [855, 716, 10, 10, 10, 1], [855, 767, 10, 10, 10, 1]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 53, 7, 9, 7, 1], [1, 104, 8, 9, 8, 1], [1, 155, 11, 9, 11, 1], [1, 206, 11, 10, 11, 1], [1, 257, 15, 9, 15, 1], [1, 308, 12, 9, 12, 1], [1, 359, 7, 9, 7, 1], [1, 410, 8, 12, 8, 1], [1, 461, 8, 12, 8, 1], [1, 512, 9, 9, 9, 1], [1, 566, 11, 6, 11, 4], [1, 617, 7, 8, 7, 4], [1, 668, 8, 6, 8, 4], [1, 719, 7, 6, 7, 4], [1, 767, 7, 9, 7, 1], [62, 2, 11, 9, 11, 1], [62, 53, 11, 9, 11, 1], [62, 104, 11, 9, 11, 1], [62, 155, 11, 9, 11, 1], [62, 206, 11, 9, 11, 1], [62, 257, 11, 9, 11, 1], [62, 308, 11, 9, 11, 1], [62, 359, 11, 9, 11, 1], [62, 410, 11, 9, 11, 1], [62, 461, 11, 9, 11, 1], [62, 514, 7, 7, 7, 3], [62, 565, 7, 9, 7, 3], [62, 617, 11, 6, 11, 4], [62, 668, 11, 6, 11, 4], [62, 719, 11, 6, 11, 4], [62, 767, 11, 9, 11, 1], [123, 2, 16, 11, 16, 1], [123, 53, 12, 9, 12, 1], [123, 104, 12, 9, 12, 1], [123, 155, 13, 9, 13, 1], [123, 206, 13, 9, 13, 1], [123, 257, 12, 9, 12, 1], [123, 308, 11, 9, 11, 1], [123, 359, 13, 9, 13, 1], [123, 410, 13, 9, 13, 1], [123, 461, 7, 9, 7, 1], [123, 512, 10, 9, 10, 1], [123, 563, 12, 9, 12, 1], [123, 614, 11, 9, 11, 1], [123, 665, 14, 9, 14, 1], [123, 716, 13, 9, 13, 1], [123, 767, 13, 9, 13, 1], [184, 2, 12, 9, 12, 1], [184, 53, 13, 9, 13, 1], [184, 104, 12, 9, 12, 1], [184, 155, 13, 9, 13, 1], [184, 206, 11, 9, 11, 1], [184, 257, 13, 9, 13, 1], [184, 308, 12, 9, 12, 1], [184, 359, 15, 9, 15, 1], [184, 410, 12, 9, 12, 1], [184, 461, 12, 9, 12, 1], [184, 512, 11, 9, 11, 1], [184, 563, 7, 12, 7, 1], [184, 614, 7, 9, 7, 1], [184, 665, 7, 12, 7, 1], [184, 716, 10, 9, 10, 1], [184, 770, 11, 8, 11, 4], [245, 2, 8, 9, 8, 1], [245, 55, 11, 7, 11, 3], [245, 104, 11, 9, 11, 1], [245, 157, 10, 7, 10, 3], [245, 206, 11, 9, 11, 1], [245, 259, 11, 7, 11, 3], [245, 308, 7, 9, 7, 1], [245, 361, 11, 10, 11, 3], [245, 410, 11, 9, 11, 1], [245, 461, 7, 9, 7, 1], [245, 512, 7, 12, 7, 1], [245, 563, 10, 9, 10, 1], [245, 614, 7, 9, 7, 1], [245, 667, 14, 7, 14, 3], [245, 718, 11, 7, 11, 3], [245, 769, 11, 7, 11, 3], [306, 4, 11, 10, 11, 3], [306, 55, 11, 10, 11, 3], [306, 106, 8, 7, 8, 3], [306, 157, 10, 7, 10, 3], [306, 206, 7, 9, 7, 1], [306, 259, 11, 7, 11, 3], [306, 310, 10, 7, 10, 3], [306, 361, 13, 7, 13, 3], [306, 412, 10, 7, 10, 3], [306, 463, 10, 10, 10, 3], [306, 514, 10, 7, 10, 3], [306, 563, 8, 12, 8, 1], [306, 614, 7, 12, 7, 1], [306, 665, 8, 12, 8, 1], [306, 719, 11, 6, 11, 4], [306, 767, 11, 9, 11, 1], [367, 1, 12, 10, 12, 0], [367, 52, 12, 10, 12, 0], [367, 104, 13, 12, 13, 1], [367, 154, 12, 10, 12, 0], [367, 205, 13, 10, 13, 0], [367, 256, 13, 10, 13, 0], [367, 307, 13, 10, 13, 0], [367, 358, 11, 10, 11, 0], [367, 409, 11, 10, 11, 0], [367, 460, 11, 10, 11, 0], [367, 512, 11, 9, 11, 1], [367, 562, 11, 10, 11, 0], [367, 613, 11, 10, 11, 0], [367, 667, 10, 9, 10, 3], [367, 715, 11, 10, 11, 0], [367, 766, 11, 10, 11, 0], [428, 1, 11, 10, 11, 0], [428, 53, 11, 9, 11, 1], [428, 103, 7, 10, 7, 0], [428, 154, 7, 10, 7, 0], [428, 205, 7, 10, 7, 0], [428, 257, 7, 9, 7, 1], [428, 307, 11, 10, 11, 0], [428, 358, 11, 10, 11, 0], [428, 409, 11, 10, 11, 0], [428, 460, 11, 10, 11, 0], [428, 512, 11, 9, 11, 1], [428, 562, 11, 10, 11, 0], [428, 613, 11, 10, 11, 0], [428, 664, 11, 10, 11, 0], [428, 715, 11, 10, 11, 0], [428, 767, 11, 9, 11, 1], [489, 2, 11, 11, 11, 1], [489, 53, 9, 9, 9, 1], [489, 105, 11, 9, 11, 2], [489, 155, 11, 9, 11, 1], [489, 206, 11, 12, 11, 1], [489, 260, 8, 6, 8, 4], [489, 308, 10, 12, 10, 1], [489, 359, 11, 9, 11, 1], [489, 411, 13, 8, 13, 2], [489, 462, 13, 8, 13, 2], [489, 513, 15, 8, 15, 2], [489, 563, 8, 9, 8, 1], [489, 614, 8, 9, 8, 1], [489, 668, 11, 6, 11, 4], [489, 716, 16, 9, 16, 1], [489, 767, 13, 9, 13, 1], [550, 5, 13, 6, 13, 4], [550, 56, 11, 6, 11, 4], [550, 107, 11, 6, 11, 4], [550, 158, 11, 6, 11, 4], [550, 206, 11, 9, 11, 1], [550, 260, 11, 8, 11, 4], [550, 309, 10, 8, 10, 2], [550, 360, 13, 9, 13, 2], [550, 411, 14, 9, 14, 2], [550, 464, 11, 6, 11, 4], [550, 512, 7, 12, 7, 1], [550, 563, 8, 9, 8, 1], [550, 614, 8, 9, 8, 1], [550, 666, 13, 8, 13, 2], [550, 718, 15, 7, 15, 3], [550, 769, 11, 7, 11, 3], [611, 5, 11, 9, 11, 4], [611, 56, 8, 9, 8, 4], [611, 107, 13, 6, 13, 4], [611, 156, 11, 8, 11, 2], [611, 206, 10, 12, 10, 1], [611, 260, 11, 6, 11, 4], [611, 308, 11, 9, 11, 1], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 16, 6, 16, 4], [611, 515, 11, 6, 11, 4], [611, 562, 12, 10, 12, 0], [611, 613, 12, 10, 12, 0], [611, 664, 14, 10, 14, 0], [611, 716, 16, 9, 16, 1], [611, 769, 15, 7, 15, 3], [672, 5, 11, 6, 11, 4], [672, 56, 16, 6, 16, 4], [672, 104, 8, 9, 8, 1], [672, 155, 8, 9, 8, 1], [672, 206, 7, 9, 7, 1], [672, 257, 7, 9, 7, 1], [672, 311, 11, 6, 11, 4], [672, 360, 10, 8, 10, 2], [672, 410, 10, 12, 10, 1], [1, 5, 7, 6, 7, 4], [794, 767, 9, 9, 9, 1], [672, 565, 11, 7, 11, 3], [672, 617, 8, 6, 8, 4], [672, 668, 8, 6, 8, 4], [672, 716, 10, 9, 10, 1], [672, 767, 10, 9, 10, 1], [733, 2, 11, 11, 11, 1], [733, 56, 7, 6, 7, 4], [733, 107, 7, 8, 7, 4], [733, 158, 9, 8, 9, 4], [733, 206, 16, 9, 16, 1], [733, 256, 12, 10, 12, 0], [733, 307, 12, 10, 12, 0], [733, 358, 12, 10, 12, 0], [733, 409, 12, 10, 12, 0], [733, 460, 12, 10, 12, 0], [733, 511, 7, 10, 7, 0], [733, 562, 7, 10, 7, 0], [733, 613, 7, 10, 7, 0], [733, 664, 7, 10, 7, 0], [733, 715, 13, 10, 13, 0], [733, 766, 14, 10, 14, 0], [1, 5, 7, 6, 7, 4], [794, 52, 13, 10, 13, 0], [794, 103, 13, 10, 13, 0], [794, 154, 13, 10, 13, 0], [794, 205, 13, 10, 13, 0], [794, 259, 7, 7, 7, 3], [794, 308, 8, 9, 8, 1], [794, 359, 8, 9, 8, 1], [794, 410, 8, 9, 8, 1], [794, 461, 8, 9, 8, 1], [794, 512, 8, 9, 8, 1], [794, 563, 8, 9, 8, 1], [794, 617, 8, 9, 8, 4], [794, 665, 8, 9, 8, 1], [794, 719, 8, 9, 8, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 11, 11, 7, 1], [1, 104, 12, 4, 8, 1], [1, 155, 15, 10, 11, 1], [1, 206, 14, 12, 11, 1], [1, 257, 18, 11, 15, 1], [1, 308, 14, 11, 12, 1], [1, 359, 11, 4, 7, 1], [1, 410, 12, 14, 8, 1], [1, 461, 11, 14, 8, 1], [1, 512, 13, 8, 9, 1], [1, 566, 13, 7, 11, 4], [1, 622, 7, 5, 7, 9], [1, 670, 10, 3, 8, 6], [1, 724, 7, 3, 7, 9], [1, 767, 11, 11, 7, 1], [62, 2, 15, 11, 11, 1], [62, 53, 13, 11, 11, 1], [62, 104, 15, 11, 11, 1], [62, 155, 15, 11, 11, 1], [62, 206, 14, 11, 11, 1], [62, 257, 15, 11, 11, 1], [62, 308, 15, 11, 11, 1], [62, 359, 15, 11, 11, 1], [62, 410, 15, 11, 11, 1], [62, 461, 15, 11, 11, 1], [62, 514, 10, 9, 7, 3], [62, 565, 10, 11, 7, 3], [62, 617, 14, 7, 11, 4], [62, 669, 13, 5, 11, 5], [62, 719, 13, 7, 11, 4], [62, 767, 15, 11, 11, 1], [123, 2, 19, 13, 16, 1], [123, 53, 13, 11, 12, 1], [123, 104, 16, 11, 12, 1], [123, 155, 16, 11, 13, 1], [123, 206, 16, 11, 13, 1], [123, 257, 16, 11, 12, 1], [123, 308, 15, 11, 11, 1], [123, 359, 16, 11, 13, 1], [123, 410, 17, 11, 13, 1], [123, 461, 11, 11, 7, 1], [123, 512, 14, 11, 10, 1], [123, 563, 16, 11, 12, 1], [123, 614, 11, 11, 11, 1], [123, 665, 18, 11, 14, 1], [123, 716, 17, 11, 13, 1], [123, 767, 16, 11, 13, 1], [184, 2, 16, 11, 12, 1], [184, 53, 16, 11, 13, 1], [184, 104, 16, 11, 12, 1], [184, 155, 16, 11, 13, 1], [184, 206, 15, 11, 11, 1], [184, 257, 17, 11, 13, 1], [184, 308, 16, 11, 12, 1], [184, 359, 19, 11, 15, 1], [184, 410, 16, 11, 12, 1], [184, 461, 16, 11, 12, 1], [184, 512, 15, 11, 11, 1], [184, 563, 11, 14, 7, 1], [184, 614, 10, 11, 7, 1], [184, 665, 11, 14, 7, 1], [184, 716, 13, 5, 10, 1], [184, 777, 11, 3, 11, 11], [245, 2, 12, 4, 8, 1], [245, 55, 13, 9, 11, 3], [245, 104, 13, 11, 11, 1], [245, 157, 13, 9, 10, 3], [245, 206, 15, 11, 11, 1], [245, 259, 13, 9, 11, 3], [245, 308, 11, 11, 7, 1], [245, 361, 14, 12, 11, 3], [245, 410, 14, 11, 11, 1], [245, 461, 11, 11, 7, 1], [245, 512, 11, 14, 7, 1], [245, 563, 13, 11, 10, 1], [245, 614, 11, 11, 7, 1], [245, 667, 17, 9, 14, 3], [245, 718, 14, 9, 11, 3], [245, 769, 13, 9, 11, 3], [306, 4, 13, 12, 11, 3], [306, 55, 14, 12, 11, 3], [306, 106, 12, 9, 8, 3], [306, 157, 13, 9, 10, 3], [306, 206, 11, 11, 7, 1], [306, 259, 14, 9, 11, 3], [306, 310, 13, 9, 10, 3], [306, 361, 17, 9, 13, 3], [306, 412, 13, 9, 10, 3], [306, 463, 13, 12, 10, 3], [306, 514, 13, 9, 10, 3], [306, 563, 12, 14, 8, 1], [306, 614, 11, 14, 7, 1], [306, 665, 11, 14, 8, 1], [306, 720, 13, 4, 11, 5], [306, 767, 15, 11, 11, 1], [367, 1, 16, 12, 12, 0], [367, 52, 15, 12, 12, 0], [367, 104, 16, 14, 13, 1], [367, 154, 16, 12, 12, 0], [367, 205, 17, 12, 13, 0], [367, 256, 16, 12, 13, 0], [367, 307, 17, 12, 13, 0], [367, 358, 14, 12, 11, 0], [367, 409, 13, 12, 11, 0], [367, 460, 13, 12, 11, 0], [367, 512, 13, 11, 11, 1], [367, 562, 15, 12, 11, 0], [367, 613, 14, 12, 11, 0], [367, 667, 13, 11, 10, 3], [367, 715, 14, 12, 11, 0], [367, 766, 13, 12, 11, 0], [428, 1, 14, 12, 11, 0], [428, 53, 14, 11, 11, 1], [428, 103, 11, 12, 7, 0], [428, 154, 11, 12, 7, 0], [428, 205, 11, 12, 7, 0], [428, 257, 11, 11, 7, 1], [428, 307, 15, 12, 11, 0], [428, 358, 14, 12, 11, 0], [428, 409, 13, 12, 11, 0], [428, 460, 14, 12, 11, 0], [428, 512, 14, 11, 11, 1], [428, 562, 15, 12, 11, 0], [428, 613, 15, 12, 11, 0], [428, 664, 14, 12, 11, 0], [428, 715, 14, 12, 11, 0], [428, 767, 14, 11, 11, 1], [489, 2, 14, 13, 11, 1], [489, 53, 13, 6, 9, 1], [489, 105, 14, 11, 11, 2], [489, 155, 14, 11, 11, 1], [489, 206, 14, 14, 11, 1], [489, 260, 11, 5, 8, 4], [489, 308, 14, 14, 10, 1], [489, 359, 15, 11, 11, 1], [489, 411, 16, 10, 13, 2], [489, 462, 16, 10, 13, 2], [489, 513, 19, 7, 15, 2], [489, 563, 12, 4, 8, 1], [489, 614, 12, 3, 8, 1], [489, 668, 13, 7, 11, 4], [489, 716, 20, 11, 16, 1], [489, 767, 17, 11, 13, 1], [550, 5, 15, 5, 13, 4], [550, 56, 13, 8, 11, 4], [550, 107, 14, 8, 11, 4], [550, 158, 13, 8, 11, 4], [550, 206, 15, 11, 11, 1], [550, 260, 13, 10, 11, 4], [550, 309, 13, 10, 10, 2], [550, 360, 17, 11, 13, 2], [550, 411, 18, 11, 14, 2], [550, 464, 14, 8, 11, 4], [550, 512, 11, 14, 7, 1], [550, 563, 12, 8, 8, 1], [550, 614, 12, 8, 8, 1], [550, 666, 16, 10, 13, 2], [550, 718, 17, 9, 15, 3], [550, 769, 14, 9, 11, 3], [611, 5, 12, 11, 11, 4], [611, 56, 10, 11, 8, 4], [611, 109, 15, 5, 13, 6], [611, 156, 15, 10, 11, 2], [611, 206, 14, 14, 10, 1], [611, 261, 13, 6, 11, 5], [611, 308, 13, 11, 11, 1], [611, 362, 14, 7, 11, 4], [611, 413, 14, 7, 11, 4], [611, 469, 15, 3, 16, 9], [611, 511, 1, 1, 11, 1], [611, 562, 14, 12, 12, 0], [611, 613, 16, 12, 12, 0], [611, 664, 18, 12, 14, 0], [611, 716, 20, 11, 16, 1], [611, 769, 17, 9, 15, 3], [672, 7, 13, 3, 11, 6], [672, 58, 18, 3, 16, 6], [672, 104, 12, 5, 8, 1], [672, 155, 12, 5, 8, 1], [672, 206, 11, 5, 7, 1], [672, 257, 11, 5, 7, 1], [672, 311, 13, 7, 11, 4], [672, 360, 12, 10, 10, 2], [672, 410, 13, 14, 10, 1], [1, 1, 1, 1, 7, 1], [794, 767, 13, 4, 9, 1], [672, 565, 14, 8, 11, 3], [672, 617, 11, 7, 8, 4], [672, 668, 10, 7, 8, 4], [672, 716, 14, 11, 10, 1], [672, 767, 14, 11, 10, 1], [733, 2, 14, 13, 11, 1], [733, 57, 9, 3, 7, 5], [733, 112, 7, 5, 7, 9], [733, 163, 9, 5, 9, 9], [733, 206, 18, 11, 16, 1], [733, 256, 15, 12, 12, 0], [733, 307, 16, 12, 12, 0], [733, 358, 15, 12, 12, 0], [733, 409, 16, 12, 12, 0], [733, 460, 16, 12, 12, 0], [733, 511, 11, 12, 7, 0], [733, 562, 11, 12, 7, 0], [733, 613, 11, 12, 7, 0], [733, 664, 11, 12, 7, 0], [733, 715, 17, 12, 13, 0], [733, 766, 17, 12, 14, 0], [1, 1, 1, 1, 7, 1], [794, 52, 16, 12, 13, 0], [794, 103, 17, 12, 13, 0], [794, 154, 17, 12, 13, 0], [794, 205, 17, 12, 13, 0], [794, 259, 10, 9, 7, 3], [794, 308, 12, 4, 8, 1], [794, 359, 12, 4, 8, 1], [794, 410, 12, 3, 8, 1], [794, 461, 12, 4, 8, 1], [794, 512, 11, 3, 8, 1], [794, 563, 11, 3, 8, 1], [794, 621, 8, 7, 8, 8], [794, 665, 12, 4, 8, 1], [794, 724, 8, 6, 8, 9], [794, 767, 13, 4, 9, 1], [855, 2, 13, 4, 9, 1], [855, 53, 13, 4, 9, 1], [855, 104, 13, 4, 9, 1], [855, 155, 13, 4, 9, 1], [855, 206, 13, 4, 9, 1], [855, 257, 13, 4, 9, 1], [855, 308, 13, 4, 9, 1], [855, 359, 13, 4, 9, 1], [855, 410, 13, 4, 9, 1], [855, 461, 13, 4, 9, 1], [855, 512, 13, 4, 9, 1], [855, 563, 13, 4, 9, 1], [855, 614, 13, 4, 9, 1], [855, 665, 13, 4, 9, 1], [855, 716, 13, 4, 9, 1], [855, 767, 13, 4, 9, 1]], \"capHeight\": 11, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 10, 9, 6, 1], [1, 104, 11, 2, 7, 1], [1, 155, 14, 8, 10, 1], [1, 206, 13, 10, 10, 1], [1, 257, 17, 9, 14, 1], [1, 308, 13, 9, 11, 1], [1, 359, 10, 2, 6, 1], [1, 410, 11, 12, 7, 1], [1, 461, 10, 12, 7, 1], [1, 512, 12, 6, 8, 1], [1, 566, 12, 5, 10, 4], [1, 622, 6, 3, 6, 9], [1, 670, 9, 1, 7, 6], [1, 724, 6, 1, 6, 9], [1, 767, 10, 9, 6, 1], [62, 2, 14, 9, 10, 1], [62, 53, 12, 9, 10, 1], [62, 104, 14, 9, 10, 1], [62, 155, 14, 9, 10, 1], [62, 206, 13, 9, 10, 1], [62, 257, 14, 9, 10, 1], [62, 308, 14, 9, 10, 1], [62, 359, 14, 9, 10, 1], [62, 410, 14, 9, 10, 1], [62, 461, 14, 9, 10, 1], [62, 514, 9, 7, 6, 3], [62, 565, 9, 9, 6, 3], [62, 617, 13, 5, 10, 4], [62, 669, 12, 3, 10, 5], [62, 719, 12, 5, 10, 4], [62, 767, 14, 9, 10, 1], [123, 2, 18, 11, 15, 1], [123, 53, 12, 9, 11, 1], [123, 104, 15, 9, 11, 1], [123, 155, 15, 9, 12, 1], [123, 206, 15, 9, 12, 1], [123, 257, 15, 9, 11, 1], [123, 308, 14, 9, 10, 1], [123, 359, 15, 9, 12, 1], [123, 410, 16, 9, 12, 1], [123, 461, 10, 9, 6, 1], [123, 512, 13, 9, 9, 1], [123, 563, 15, 9, 11, 1], [123, 614, 10, 9, 10, 1], [123, 665, 17, 9, 13, 1], [123, 716, 16, 9, 12, 1], [123, 767, 15, 9, 12, 1], [184, 2, 15, 9, 11, 1], [184, 53, 15, 9, 12, 1], [184, 104, 15, 9, 11, 1], [184, 155, 15, 9, 12, 1], [184, 206, 14, 9, 10, 1], [184, 257, 16, 9, 12, 1], [184, 308, 15, 9, 11, 1], [184, 359, 17, 9, 14, 1], [184, 410, 15, 9, 11, 1], [184, 461, 15, 9, 11, 1], [184, 512, 14, 9, 10, 1], [184, 563, 10, 12, 6, 1], [184, 614, 9, 9, 6, 1], [184, 665, 10, 12, 6, 1], [184, 716, 12, 3, 9, 1], [184, 777, 10, 1, 10, 11], [245, 2, 11, 2, 7, 1], [245, 55, 12, 7, 10, 3], [245, 104, 12, 9, 10, 1], [245, 157, 12, 7, 9, 3], [245, 206, 14, 9, 10, 1], [245, 259, 12, 7, 10, 3], [245, 308, 10, 9, 6, 1], [245, 361, 13, 10, 10, 3], [245, 410, 13, 9, 10, 1], [245, 461, 10, 9, 6, 1], [245, 512, 10, 12, 6, 1], [245, 563, 12, 9, 9, 1], [245, 614, 10, 9, 6, 1], [245, 667, 16, 7, 13, 3], [245, 718, 13, 7, 10, 3], [245, 769, 12, 7, 10, 3], [306, 4, 12, 10, 10, 3], [306, 55, 13, 10, 10, 3], [306, 106, 11, 7, 7, 3], [306, 157, 12, 7, 9, 3], [306, 206, 10, 9, 6, 1], [306, 259, 13, 7, 10, 3], [306, 310, 12, 7, 9, 3], [306, 361, 16, 7, 12, 3], [306, 412, 12, 7, 9, 3], [306, 463, 12, 10, 9, 3], [306, 514, 12, 7, 9, 3], [306, 563, 11, 12, 7, 1], [306, 614, 10, 12, 6, 1], [306, 665, 10, 12, 7, 1], [306, 720, 12, 2, 10, 5], [306, 767, 14, 9, 10, 1], [367, 1, 12, 10, 11, 0], [367, 52, 14, 10, 11, 0], [367, 104, 15, 12, 12, 1], [367, 154, 15, 10, 11, 0], [367, 205, 16, 10, 12, 0], [367, 256, 15, 10, 12, 0], [367, 307, 16, 10, 12, 0], [367, 358, 12, 10, 10, 0], [367, 409, 12, 10, 10, 0], [367, 460, 12, 10, 10, 0], [367, 512, 12, 9, 10, 1], [367, 562, 13, 10, 10, 0], [367, 613, 13, 10, 10, 0], [367, 667, 12, 9, 9, 3], [367, 715, 12, 10, 10, 0], [367, 766, 12, 10, 10, 0], [428, 1, 13, 10, 10, 0], [428, 53, 13, 9, 10, 1], [428, 104, 10, 9, 6, 1], [428, 157, 9, 7, 6, 3], [428, 206, 9, 9, 6, 1], [428, 257, 9, 9, 6, 1], [428, 307, 14, 10, 10, 0], [428, 358, 12, 10, 10, 0], [428, 409, 12, 10, 10, 0], [428, 460, 13, 10, 10, 0], [428, 512, 13, 9, 10, 1], [428, 562, 13, 10, 10, 0], [428, 613, 13, 10, 10, 0], [428, 664, 13, 10, 10, 0], [428, 715, 13, 10, 10, 0], [428, 767, 13, 9, 10, 1], [489, 2, 13, 11, 10, 1], [489, 53, 12, 4, 8, 1], [489, 105, 13, 9, 10, 2], [489, 155, 13, 9, 10, 1], [489, 206, 13, 12, 10, 1], [489, 260, 10, 3, 7, 4], [489, 308, 13, 12, 9, 1], [489, 359, 14, 9, 10, 1], [489, 411, 15, 8, 12, 2], [489, 462, 15, 8, 12, 2], [489, 513, 18, 5, 14, 2], [489, 563, 11, 2, 7, 1], [489, 614, 11, 1, 7, 1], [489, 668, 12, 5, 10, 4], [489, 716, 19, 9, 15, 1], [489, 767, 16, 9, 12, 1], [550, 5, 14, 3, 12, 4], [550, 56, 12, 6, 10, 4], [550, 107, 13, 6, 10, 4], [550, 158, 12, 6, 10, 4], [550, 206, 14, 9, 10, 1], [550, 260, 12, 8, 10, 4], [550, 309, 12, 8, 9, 2], [550, 360, 16, 9, 12, 2], [550, 411, 17, 9, 13, 2], [550, 464, 13, 6, 10, 4], [550, 513, 10, 11, 6, 2], [550, 563, 11, 6, 7, 1], [550, 614, 11, 6, 7, 1], [550, 666, 15, 8, 12, 2], [550, 718, 16, 7, 14, 3], [550, 769, 13, 7, 10, 3], [611, 5, 11, 9, 10, 4], [611, 56, 9, 9, 7, 4], [611, 109, 14, 3, 12, 6], [611, 156, 14, 8, 10, 2], [611, 206, 13, 12, 9, 1], [611, 261, 12, 4, 10, 5], [611, 308, 12, 9, 10, 1], [611, 362, 13, 5, 10, 4], [611, 413, 13, 5, 10, 4], [611, 469, 14, 1, 15, 9], [611, 511, 1, 1, 10, 1], [611, 562, 13, 10, 11, 0], [611, 613, 14, 10, 11, 0], [611, 664, 16, 10, 13, 0], [611, 716, 19, 9, 15, 1], [611, 769, 16, 7, 14, 3], [672, 7, 12, 1, 10, 6], [672, 58, 17, 1, 15, 6], [672, 104, 11, 3, 7, 1], [672, 155, 10, 3, 7, 1], [672, 206, 10, 3, 6, 1], [672, 257, 10, 3, 6, 1], [672, 311, 12, 5, 10, 4], [672, 360, 11, 8, 9, 2], [672, 410, 12, 12, 9, 1], [1, 1, 1, 1, 6, 1], [794, 767, 12, 2, 8, 1], [672, 565, 13, 6, 10, 3], [672, 617, 10, 5, 7, 4], [672, 668, 9, 5, 7, 4], [672, 716, 13, 9, 9, 1], [672, 767, 13, 9, 9, 1], [733, 2, 13, 11, 10, 1], [733, 57, 8, 1, 6, 5], [733, 112, 6, 3, 6, 9], [733, 163, 8, 3, 8, 9], [733, 206, 17, 9, 15, 1], [733, 256, 14, 10, 11, 0], [733, 307, 15, 10, 11, 0], [733, 358, 12, 10, 11, 0], [733, 409, 15, 10, 11, 0], [733, 460, 15, 10, 11, 0], [733, 512, 10, 9, 6, 1], [733, 563, 10, 9, 6, 1], [733, 613, 10, 10, 6, 0], [733, 666, 10, 8, 6, 2], [733, 715, 15, 10, 12, 0], [733, 766, 16, 10, 13, 0], [1, 1, 1, 1, 6, 1], [794, 52, 15, 10, 12, 0], [794, 103, 16, 10, 12, 0], [794, 154, 16, 10, 12, 0], [794, 205, 16, 10, 12, 0], [794, 259, 9, 7, 6, 3], [794, 308, 11, 2, 7, 1], [794, 359, 11, 2, 7, 1], [794, 410, 11, 1, 7, 1], [794, 461, 11, 2, 7, 1], [794, 512, 10, 1, 7, 1], [794, 563, 10, 1, 7, 1], [794, 621, 7, 5, 7, 8], [794, 665, 11, 2, 7, 1], [794, 724, 7, 4, 7, 9], [794, 767, 12, 2, 8, 1], [855, 2, 12, 2, 8, 1], [855, 53, 12, 2, 8, 1], [855, 104, 12, 2, 8, 1], [855, 155, 12, 2, 8, 1], [855, 206, 12, 2, 8, 1], [855, 257, 12, 2, 8, 1], [855, 308, 12, 2, 8, 1], [855, 359, 12, 2, 8, 1], [855, 410, 12, 2, 8, 1], [855, 461, 12, 2, 8, 1], [855, 512, 12, 2, 8, 1], [855, 563, 12, 2, 8, 1], [855, 614, 12, 2, 8, 1], [855, 665, 12, 2, 8, 1], [855, 716, 12, 2, 8, 1], [855, 767, 12, 2, 8, 1]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 19, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 53, 7, 11, 7, 1], [1, 104, 8, 10, 8, 1], [1, 155, 11, 10, 11, 1], [1, 206, 11, 12, 11, 1], [1, 257, 15, 11, 15, 1], [1, 308, 12, 11, 12, 1], [1, 359, 7, 10, 7, 1], [1, 410, 8, 14, 8, 1], [1, 461, 8, 14, 8, 1], [1, 512, 9, 10, 9, 1], [1, 566, 11, 7, 11, 4], [1, 618, 7, 9, 7, 5], [1, 669, 8, 6, 8, 5], [1, 720, 7, 7, 7, 5], [1, 767, 7, 11, 7, 1], [62, 2, 11, 11, 11, 1], [62, 53, 11, 11, 11, 1], [62, 104, 11, 11, 11, 1], [62, 155, 11, 11, 11, 1], [62, 206, 11, 11, 11, 1], [62, 257, 11, 11, 11, 1], [62, 308, 11, 11, 11, 1], [62, 359, 11, 11, 11, 1], [62, 410, 11, 11, 11, 1], [62, 461, 11, 11, 11, 1], [62, 514, 7, 9, 7, 3], [62, 565, 7, 11, 7, 3], [62, 617, 11, 7, 11, 4], [62, 669, 11, 6, 11, 5], [62, 719, 11, 7, 11, 4], [62, 767, 11, 11, 11, 1], [123, 2, 16, 13, 16, 1], [123, 53, 12, 11, 12, 1], [123, 104, 12, 11, 12, 1], [123, 155, 13, 11, 13, 1], [123, 206, 13, 11, 13, 1], [123, 257, 12, 11, 12, 1], [123, 308, 11, 11, 11, 1], [123, 359, 13, 11, 13, 1], [123, 410, 13, 11, 13, 1], [123, 461, 7, 11, 7, 1], [123, 512, 10, 11, 10, 1], [123, 563, 12, 11, 12, 1], [123, 614, 11, 11, 11, 1], [123, 665, 14, 11, 14, 1], [123, 716, 13, 11, 13, 1], [123, 767, 13, 11, 13, 1], [184, 2, 12, 11, 12, 1], [184, 53, 13, 11, 13, 1], [184, 104, 12, 11, 12, 1], [184, 155, 13, 11, 13, 1], [184, 206, 11, 11, 11, 1], [184, 257, 13, 11, 13, 1], [184, 308, 12, 11, 12, 1], [184, 359, 15, 11, 15, 1], [184, 410, 12, 11, 12, 1], [184, 461, 12, 11, 12, 1], [184, 512, 11, 11, 11, 1], [184, 563, 7, 14, 7, 1], [184, 614, 7, 11, 7, 1], [184, 665, 7, 14, 7, 1], [184, 716, 10, 10, 10, 1], [184, 771, 11, 9, 11, 5], [245, 2, 8, 10, 8, 1], [245, 55, 11, 9, 11, 3], [245, 104, 11, 11, 11, 1], [245, 157, 10, 9, 10, 3], [245, 206, 11, 11, 11, 1], [245, 259, 11, 9, 11, 3], [245, 308, 7, 11, 7, 1], [245, 361, 11, 12, 11, 3], [245, 410, 11, 11, 11, 1], [245, 461, 7, 11, 7, 1], [245, 512, 7, 14, 7, 1], [245, 563, 10, 11, 10, 1], [245, 614, 7, 11, 7, 1], [245, 667, 14, 9, 14, 3], [245, 718, 11, 9, 11, 3], [245, 769, 11, 9, 11, 3], [306, 4, 11, 12, 11, 3], [306, 55, 11, 12, 11, 3], [306, 106, 8, 9, 8, 3], [306, 157, 10, 9, 10, 3], [306, 206, 7, 11, 7, 1], [306, 259, 11, 9, 11, 3], [306, 310, 10, 9, 10, 3], [306, 361, 13, 9, 13, 3], [306, 412, 10, 9, 10, 3], [306, 463, 10, 12, 10, 3], [306, 514, 10, 9, 10, 3], [306, 563, 8, 14, 8, 1], [306, 614, 7, 14, 7, 1], [306, 665, 8, 14, 8, 1], [306, 720, 11, 6, 11, 5], [306, 767, 11, 11, 11, 1], [367, 1, 12, 12, 12, 0], [367, 52, 12, 12, 12, 0], [367, 104, 13, 14, 13, 1], [367, 154, 12, 12, 12, 0], [367, 205, 13, 12, 13, 0], [367, 256, 13, 12, 13, 0], [367, 307, 13, 12, 13, 0], [367, 358, 11, 12, 11, 0], [367, 409, 11, 12, 11, 0], [367, 460, 11, 12, 11, 0], [367, 512, 11, 11, 11, 1], [367, 562, 11, 12, 11, 0], [367, 613, 11, 12, 11, 0], [367, 667, 10, 11, 10, 3], [367, 715, 11, 12, 11, 0], [367, 766, 11, 12, 11, 0], [428, 1, 11, 12, 11, 0], [428, 53, 11, 11, 11, 1], [428, 103, 7, 12, 7, 0], [428, 154, 7, 12, 7, 0], [428, 205, 7, 12, 7, 0], [428, 257, 7, 11, 7, 1], [428, 307, 11, 12, 11, 0], [428, 358, 11, 12, 11, 0], [428, 409, 11, 12, 11, 0], [428, 460, 11, 12, 11, 0], [428, 512, 11, 11, 11, 1], [428, 562, 11, 12, 11, 0], [428, 613, 11, 12, 11, 0], [428, 664, 11, 12, 11, 0], [428, 715, 11, 12, 11, 0], [428, 767, 11, 11, 11, 1], [489, 2, 11, 13, 11, 1], [489, 53, 9, 10, 9, 1], [489, 105, 11, 11, 11, 2], [489, 155, 11, 11, 11, 1], [489, 206, 11, 14, 11, 1], [489, 260, 8, 7, 8, 4], [489, 308, 10, 14, 10, 1], [489, 359, 11, 11, 11, 1], [489, 411, 13, 10, 13, 2], [489, 462, 13, 10, 13, 2], [489, 513, 15, 9, 15, 2], [489, 563, 8, 10, 8, 1], [489, 614, 8, 10, 8, 1], [489, 668, 11, 7, 11, 4], [489, 716, 16, 11, 16, 1], [489, 767, 13, 11, 13, 1], [550, 5, 13, 7, 13, 4], [550, 56, 11, 8, 11, 4], [550, 107, 11, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 206, 11, 11, 11, 1], [550, 260, 11, 10, 11, 4], [550, 309, 10, 10, 10, 2], [550, 360, 13, 11, 13, 2], [550, 411, 14, 11, 14, 2], [550, 464, 11, 8, 11, 4], [550, 512, 7, 14, 7, 1], [550, 563, 8, 10, 8, 1], [550, 614, 8, 10, 8, 1], [550, 666, 13, 10, 13, 2], [550, 718, 15, 9, 15, 3], [550, 769, 11, 9, 11, 3], [611, 5, 11, 11, 11, 4], [611, 56, 8, 11, 8, 4], [611, 108, 13, 6, 13, 5], [611, 156, 11, 10, 11, 2], [611, 206, 10, 14, 10, 1], [611, 261, 11, 6, 11, 5], [611, 308, 11, 11, 11, 1], [611, 362, 11, 7, 11, 4], [611, 413, 11, 7, 11, 4], [611, 465, 16, 7, 16, 5], [611, 516, 11, 6, 11, 5], [611, 562, 12, 12, 12, 0], [611, 613, 12, 12, 12, 0], [611, 664, 14, 12, 14, 0], [611, 716, 16, 11, 16, 1], [611, 769, 15, 9, 15, 3], [672, 6, 11, 6, 11, 5], [672, 57, 16, 6, 16, 5], [672, 104, 8, 10, 8, 1], [672, 155, 8, 10, 8, 1], [672, 206, 7, 10, 7, 1], [672, 257, 7, 10, 7, 1], [672, 311, 11, 7, 11, 4], [672, 360, 10, 10, 10, 2], [672, 410, 10, 14, 10, 1], [1, 6, 7, 6, 7, 5], [794, 767, 9, 10, 9, 1], [672, 565, 11, 8, 11, 3], [672, 617, 8, 7, 8, 4], [672, 668, 8, 7, 8, 4], [672, 716, 10, 11, 10, 1], [672, 767, 10, 11, 10, 1], [733, 2, 11, 13, 11, 1], [733, 57, 7, 6, 7, 5], [733, 108, 7, 9, 7, 5], [733, 159, 9, 9, 9, 5], [733, 206, 16, 11, 16, 1], [733, 256, 12, 12, 12, 0], [733, 307, 12, 12, 12, 0], [733, 358, 12, 12, 12, 0], [733, 409, 12, 12, 12, 0], [733, 460, 12, 12, 12, 0], [733, 511, 7, 12, 7, 0], [733, 562, 7, 12, 7, 0], [733, 613, 7, 12, 7, 0], [733, 664, 7, 12, 7, 0], [733, 715, 13, 12, 13, 0], [733, 766, 14, 12, 14, 0], [1, 6, 7, 6, 7, 5], [794, 52, 13, 12, 13, 0], [794, 103, 13, 12, 13, 0], [794, 154, 13, 12, 13, 0], [794, 205, 13, 12, 13, 0], [794, 259, 7, 9, 7, 3], [794, 308, 8, 10, 8, 1], [794, 359, 8, 10, 8, 1], [794, 410, 8, 10, 8, 1], [794, 461, 8, 10, 8, 1], [794, 512, 8, 10, 8, 1], [794, 563, 8, 10, 8, 1], [794, 618, 8, 10, 8, 5], [794, 665, 8, 10, 8, 1], [794, 720, 8, 10, 8, 5], [794, 767, 9, 10, 9, 1], [855, 2, 9, 10, 9, 1], [855, 53, 9, 10, 9, 1], [855, 104, 9, 10, 9, 1], [855, 155, 9, 10, 9, 1], [855, 206, 9, 10, 9, 1], [855, 257, 9, 10, 9, 1], [855, 308, 9, 10, 9, 1], [855, 359, 9, 10, 9, 1], [855, 410, 9, 10, 9, 1], [855, 461, 9, 10, 9, 1], [855, 512, 9, 10, 9, 1], [855, 563, 9, 10, 9, 1], [855, 614, 9, 10, 9, 1], [855, 665, 9, 10, 9, 1], [855, 716, 9, 10, 9, 1], [855, 767, 9, 10, 9, 1]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 53, 6, 9, 6, 1], [1, 104, 7, 9, 7, 1], [1, 155, 10, 9, 10, 1], [1, 206, 10, 10, 10, 1], [1, 257, 14, 9, 14, 1], [1, 308, 11, 9, 11, 1], [1, 359, 6, 9, 6, 1], [1, 410, 7, 12, 7, 1], [1, 461, 7, 12, 7, 1], [1, 512, 8, 9, 8, 1], [1, 566, 10, 6, 10, 4], [1, 617, 6, 8, 6, 4], [1, 668, 7, 6, 7, 4], [1, 719, 6, 6, 6, 4], [1, 767, 6, 9, 6, 1], [62, 2, 10, 9, 10, 1], [62, 53, 10, 9, 10, 1], [62, 104, 10, 9, 10, 1], [62, 155, 10, 9, 10, 1], [62, 206, 10, 9, 10, 1], [62, 257, 10, 9, 10, 1], [62, 308, 10, 9, 10, 1], [62, 359, 10, 9, 10, 1], [62, 410, 10, 9, 10, 1], [62, 461, 10, 9, 10, 1], [62, 514, 6, 7, 6, 3], [62, 565, 6, 9, 6, 3], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 767, 10, 9, 10, 1], [123, 2, 15, 11, 15, 1], [123, 53, 11, 9, 11, 1], [123, 104, 11, 9, 11, 1], [123, 155, 12, 9, 12, 1], [123, 206, 12, 9, 12, 1], [123, 257, 11, 9, 11, 1], [123, 308, 10, 9, 10, 1], [123, 359, 12, 9, 12, 1], [123, 410, 12, 9, 12, 1], [123, 461, 6, 9, 6, 1], [123, 512, 9, 9, 9, 1], [123, 563, 11, 9, 11, 1], [123, 614, 10, 9, 10, 1], [123, 665, 13, 9, 13, 1], [123, 716, 12, 9, 12, 1], [123, 767, 12, 9, 12, 1], [184, 2, 11, 9, 11, 1], [184, 53, 12, 9, 12, 1], [184, 104, 11, 9, 11, 1], [184, 155, 12, 9, 12, 1], [184, 206, 10, 9, 10, 1], [184, 257, 12, 9, 12, 1], [184, 308, 11, 9, 11, 1], [184, 359, 14, 9, 14, 1], [184, 410, 11, 9, 11, 1], [184, 461, 11, 9, 11, 1], [184, 512, 10, 9, 10, 1], [184, 563, 6, 12, 6, 1], [184, 614, 6, 9, 6, 1], [184, 665, 6, 12, 6, 1], [184, 716, 9, 9, 9, 1], [184, 770, 10, 8, 10, 4], [245, 2, 7, 9, 7, 1], [245, 55, 10, 7, 10, 3], [245, 104, 10, 9, 10, 1], [245, 157, 9, 7, 9, 3], [245, 206, 10, 9, 10, 1], [245, 259, 10, 7, 10, 3], [245, 308, 6, 9, 6, 1], [245, 361, 10, 10, 10, 3], [245, 410, 10, 9, 10, 1], [245, 461, 6, 9, 6, 1], [245, 512, 6, 12, 6, 1], [245, 563, 9, 9, 9, 1], [245, 614, 6, 9, 6, 1], [245, 667, 13, 7, 13, 3], [245, 718, 10, 7, 10, 3], [245, 769, 10, 7, 10, 3], [306, 4, 10, 10, 10, 3], [306, 55, 10, 10, 10, 3], [306, 106, 7, 7, 7, 3], [306, 157, 9, 7, 9, 3], [306, 206, 6, 9, 6, 1], [306, 259, 10, 7, 10, 3], [306, 310, 9, 7, 9, 3], [306, 361, 12, 7, 12, 3], [306, 412, 9, 7, 9, 3], [306, 463, 9, 10, 9, 3], [306, 514, 9, 7, 9, 3], [306, 563, 7, 12, 7, 1], [306, 614, 6, 12, 6, 1], [306, 665, 7, 12, 7, 1], [306, 719, 10, 6, 10, 4], [306, 767, 10, 9, 10, 1], [367, 1, 11, 10, 11, 0], [367, 52, 11, 10, 11, 0], [367, 104, 12, 12, 12, 1], [367, 154, 11, 10, 11, 0], [367, 205, 12, 10, 12, 0], [367, 256, 12, 10, 12, 0], [367, 307, 12, 10, 12, 0], [367, 358, 10, 10, 10, 0], [367, 409, 10, 10, 10, 0], [367, 460, 10, 10, 10, 0], [367, 512, 10, 9, 10, 1], [367, 562, 10, 10, 10, 0], [367, 613, 10, 10, 10, 0], [367, 667, 9, 9, 9, 3], [367, 715, 10, 10, 10, 0], [367, 766, 10, 10, 10, 0], [428, 1, 10, 10, 10, 0], [428, 53, 10, 9, 10, 1], [428, 103, 6, 10, 6, 0], [428, 154, 6, 10, 6, 0], [428, 205, 6, 10, 6, 0], [428, 257, 6, 9, 6, 1], [428, 307, 10, 10, 10, 0], [428, 358, 10, 10, 10, 0], [428, 409, 10, 10, 10, 0], [428, 460, 10, 10, 10, 0], [428, 512, 10, 9, 10, 1], [428, 562, 10, 10, 10, 0], [428, 613, 10, 10, 10, 0], [428, 664, 10, 10, 10, 0], [428, 715, 10, 10, 10, 0], [428, 767, 10, 9, 10, 1], [489, 2, 10, 11, 10, 1], [489, 53, 8, 9, 8, 1], [489, 105, 10, 9, 10, 2], [489, 155, 10, 9, 10, 1], [489, 206, 10, 12, 10, 1], [489, 260, 7, 6, 7, 4], [489, 308, 9, 12, 9, 1], [489, 359, 10, 9, 10, 1], [489, 411, 12, 8, 12, 2], [489, 462, 12, 8, 12, 2], [489, 513, 14, 8, 14, 2], [489, 563, 7, 9, 7, 1], [489, 614, 7, 9, 7, 1], [489, 668, 10, 6, 10, 4], [489, 716, 15, 9, 15, 1], [489, 767, 12, 9, 12, 1], [550, 5, 12, 6, 12, 4], [550, 56, 10, 6, 10, 4], [550, 107, 10, 6, 10, 4], [550, 158, 10, 6, 10, 4], [550, 206, 10, 9, 10, 1], [550, 260, 10, 8, 10, 4], [550, 309, 9, 8, 9, 2], [550, 360, 12, 9, 12, 2], [550, 411, 13, 9, 13, 2], [550, 464, 10, 6, 10, 4], [550, 512, 6, 12, 6, 1], [550, 563, 7, 9, 7, 1], [550, 614, 7, 9, 7, 1], [550, 666, 12, 8, 12, 2], [550, 718, 14, 7, 14, 3], [550, 769, 10, 7, 10, 3], [611, 5, 10, 9, 10, 4], [611, 56, 7, 9, 7, 4], [611, 107, 12, 6, 12, 4], [611, 156, 10, 8, 10, 2], [611, 206, 9, 12, 9, 1], [611, 260, 10, 6, 10, 4], [611, 308, 10, 9, 10, 1], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 15, 6, 15, 4], [611, 515, 10, 6, 10, 4], [611, 562, 11, 10, 11, 0], [611, 613, 11, 10, 11, 0], [611, 664, 13, 10, 13, 0], [611, 716, 15, 9, 15, 1], [611, 769, 14, 7, 14, 3], [672, 5, 10, 6, 10, 4], [672, 56, 15, 6, 15, 4], [672, 104, 7, 9, 7, 1], [672, 155, 7, 9, 7, 1], [672, 206, 6, 9, 6, 1], [672, 257, 6, 9, 6, 1], [672, 311, 10, 6, 10, 4], [672, 360, 9, 8, 9, 2], [672, 410, 9, 12, 9, 1], [1, 5, 6, 6, 6, 4], [794, 767, 8, 9, 8, 1], [672, 565, 10, 7, 10, 3], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 716, 9, 9, 9, 1], [672, 767, 9, 9, 9, 1], [733, 2, 10, 11, 10, 1], [733, 56, 6, 6, 6, 4], [733, 107, 6, 8, 6, 4], [733, 158, 8, 8, 8, 4], [733, 206, 15, 9, 15, 1], [733, 256, 11, 10, 11, 0], [733, 307, 11, 10, 11, 0], [733, 358, 11, 10, 11, 0], [733, 409, 11, 10, 11, 0], [733, 460, 11, 10, 11, 0], [733, 511, 6, 10, 6, 0], [733, 562, 6, 10, 6, 0], [733, 613, 6, 10, 6, 0], [733, 664, 6, 10, 6, 0], [733, 715, 12, 10, 12, 0], [733, 766, 13, 10, 13, 0], [1, 5, 6, 6, 6, 4], [794, 52, 12, 10, 12, 0], [794, 103, 12, 10, 12, 0], [794, 154, 12, 10, 12, 0], [794, 205, 12, 10, 12, 0], [794, 259, 6, 7, 6, 3], [794, 308, 7, 9, 7, 1], [794, 359, 7, 9, 7, 1], [794, 410, 7, 9, 7, 1], [794, 461, 7, 9, 7, 1], [794, 512, 7, 9, 7, 1], [794, 563, 7, 9, 7, 1], [794, 617, 7, 9, 7, 4], [794, 665, 7, 9, 7, 1], [794, 719, 7, 9, 7, 4], [794, 767, 8, 9, 8, 1], [855, 2, 8, 9, 8, 1], [855, 53, 8, 9, 8, 1], [855, 104, 8, 9, 8, 1], [855, 155, 8, 9, 8, 1], [855, 206, 8, 9, 8, 1], [855, 257, 8, 9, 8, 1], [855, 308, 8, 9, 8, 1], [855, 359, 8, 9, 8, 1], [855, 410, 8, 9, 8, 1], [855, 461, 8, 9, 8, 1], [855, 512, 8, 9, 8, 1], [855, 563, 8, 9, 8, 1], [855, 614, 8, 9, 8, 1], [855, 665, 8, 9, 8, 1], [855, 716, 8, 9, 8, 1], [855, 767, 8, 9, 8, 1]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 53, 13, 12, 9, 1], [1, 104, 14, 5, 9, 1], [1, 155, 17, 11, 13, 1], [1, 206, 16, 13, 13, 1], [1, 257, 21, 12, 17, 1], [1, 308, 15, 12, 14, 1], [1, 359, 13, 5, 8, 1], [1, 410, 15, 15, 10, 1], [1, 461, 13, 15, 10, 1], [1, 512, 15, 8, 11, 1], [1, 565, 15, 9, 13, 3], [1, 623, 9, 6, 9, 10], [1, 670, 12, 3, 10, 6], [1, 725, 8, 3, 8, 10], [1, 767, 14, 12, 9, 1], [62, 2, 16, 12, 13, 1], [62, 53, 15, 12, 13, 1], [62, 104, 17, 12, 13, 1], [62, 155, 17, 12, 13, 1], [62, 206, 17, 12, 13, 1], [62, 257, 18, 12, 13, 1], [62, 308, 16, 12, 13, 1], [62, 359, 18, 12, 13, 1], [62, 410, 17, 12, 13, 1], [62, 461, 17, 12, 13, 1], [62, 514, 12, 10, 8, 3], [62, 565, 12, 13, 8, 3], [62, 617, 16, 7, 13, 4], [62, 669, 15, 5, 12, 5], [62, 719, 15, 7, 13, 4], [62, 767, 17, 12, 13, 1], [123, 2, 21, 13, 19, 1], [123, 53, 16, 12, 14, 1], [123, 104, 18, 12, 14, 1], [123, 155, 19, 12, 15, 1], [123, 206, 19, 12, 15, 1], [123, 257, 19, 12, 14, 1], [123, 308, 19, 12, 14, 1], [123, 359, 19, 12, 16, 1], [123, 410, 20, 12, 15, 1], [123, 461, 13, 12, 9, 1], [123, 512, 16, 12, 11, 1], [123, 563, 18, 12, 14, 1], [123, 614, 13, 12, 13, 1], [123, 665, 21, 12, 17, 1], [123, 716, 20, 12, 15, 1], [123, 767, 19, 12, 16, 1], [184, 2, 18, 12, 14, 1], [184, 53, 19, 12, 16, 1], [184, 104, 19, 12, 15, 1], [184, 155, 18, 12, 14, 1], [184, 206, 19, 12, 14, 1], [184, 257, 20, 12, 15, 1], [184, 308, 19, 12, 14, 1], [184, 359, 23, 12, 18, 1], [184, 410, 19, 12, 14, 1], [184, 461, 19, 12, 14, 1], [184, 512, 19, 12, 14, 1], [184, 563, 14, 15, 9, 1], [184, 614, 12, 12, 9, 1], [184, 665, 14, 15, 9, 1], [184, 716, 15, 5, 11, 1], [184, 779, 13, 3, 13, 13], [245, 2, 13, 4, 9, 1], [245, 55, 15, 10, 13, 3], [245, 104, 16, 12, 13, 1], [245, 157, 15, 10, 12, 3], [245, 206, 18, 12, 13, 1], [245, 259, 16, 10, 13, 3], [245, 308, 14, 12, 9, 1], [245, 361, 17, 13, 13, 3], [245, 410, 16, 12, 13, 1], [245, 461, 13, 12, 8, 1], [245, 512, 13, 15, 8, 1], [245, 563, 16, 12, 12, 1], [245, 614, 13, 12, 8, 1], [245, 667, 20, 10, 17, 3], [245, 718, 16, 10, 13, 3], [245, 769, 16, 10, 13, 3], [306, 4, 16, 13, 13, 3], [306, 55, 17, 13, 13, 3], [306, 106, 15, 10, 10, 3], [306, 157, 15, 10, 12, 3], [306, 206, 13, 12, 9, 1], [306, 259, 17, 10, 13, 3], [306, 310, 16, 10, 12, 3], [306, 361, 19, 10, 15, 3], [306, 412, 16, 10, 12, 3], [306, 463, 17, 13, 12, 3], [306, 514, 16, 10, 12, 3], [306, 563, 15, 15, 10, 1], [306, 614, 13, 15, 8, 1], [306, 665, 13, 15, 10, 1], [306, 721, 14, 4, 12, 6], [306, 768, 16, 11, 12, 2], [367, 1, 18, 13, 14, 0], [367, 52, 18, 13, 14, 0], [367, 104, 19, 15, 15, 1], [367, 154, 18, 13, 14, 0], [367, 205, 20, 13, 15, 0], [367, 256, 19, 13, 16, 0], [367, 307, 20, 13, 15, 0], [367, 358, 15, 13, 13, 0], [367, 409, 15, 13, 13, 0], [367, 460, 16, 13, 13, 0], [367, 512, 16, 12, 13, 1], [367, 562, 17, 13, 13, 0], [367, 613, 16, 13, 13, 0], [367, 667, 15, 13, 12, 3], [367, 715, 16, 13, 13, 0], [367, 766, 16, 13, 13, 0], [428, 1, 17, 13, 13, 0], [428, 53, 17, 12, 13, 1], [428, 103, 13, 13, 9, 0], [428, 154, 13, 13, 9, 0], [428, 205, 14, 13, 9, 0], [428, 257, 14, 12, 9, 1], [428, 307, 17, 13, 12, 0], [428, 358, 16, 13, 13, 0], [428, 409, 16, 13, 13, 0], [428, 460, 16, 13, 12, 0], [428, 511, 16, 13, 12, 0], [428, 562, 17, 13, 12, 0], [428, 613, 17, 13, 13, 0], [428, 664, 17, 13, 13, 0], [428, 715, 17, 13, 13, 0], [428, 767, 17, 12, 13, 1], [489, 2, 16, 14, 12, 1], [489, 53, 14, 6, 10, 1], [489, 106, 15, 11, 12, 3], [489, 155, 16, 12, 13, 1], [489, 206, 16, 15, 13, 1], [489, 260, 13, 6, 10, 4], [489, 308, 18, 15, 13, 1], [489, 359, 17, 12, 14, 1], [489, 410, 19, 12, 16, 1], [489, 461, 19, 12, 16, 1], [489, 512, 22, 7, 17, 1], [489, 563, 14, 4, 10, 1], [489, 614, 15, 3, 10, 1], [489, 669, 15, 7, 13, 5], [489, 716, 23, 12, 19, 1], [489, 767, 20, 12, 16, 1], [550, 5, 18, 7, 15, 4], [550, 56, 15, 9, 13, 4], [550, 108, 16, 8, 13, 5], [550, 159, 15, 8, 13, 5], [550, 206, 18, 12, 13, 1], [550, 260, 14, 11, 13, 4], [550, 309, 16, 11, 12, 2], [550, 359, 20, 13, 15, 1], [550, 410, 21, 13, 17, 1], [550, 464, 16, 9, 13, 4], [550, 512, 14, 15, 9, 1], [550, 563, 14, 9, 10, 1], [550, 614, 14, 9, 10, 1], [550, 665, 19, 12, 16, 1], [550, 718, 20, 10, 17, 3], [550, 769, 17, 10, 14, 3], [611, 4, 14, 13, 12, 3], [611, 55, 12, 13, 9, 3], [611, 109, 17, 5, 15, 6], [611, 155, 18, 12, 13, 1], [611, 206, 17, 15, 12, 1], [611, 262, 15, 6, 13, 6], [611, 308, 16, 12, 14, 1], [611, 362, 15, 7, 13, 4], [611, 413, 15, 7, 13, 4], [611, 470, 18, 3, 19, 10], [611, 511, 1, 1, 13, 1], [611, 562, 16, 13, 14, 0], [611, 613, 18, 13, 14, 0], [611, 664, 19, 13, 16, 0], [611, 716, 24, 12, 19, 1], [611, 769, 21, 10, 18, 3], [672, 7, 15, 3, 13, 6], [672, 58, 20, 3, 19, 6], [672, 104, 15, 5, 10, 1], [672, 155, 15, 5, 10, 1], [672, 206, 13, 5, 8, 1], [672, 257, 13, 5, 8, 1], [672, 312, 15, 7, 13, 5], [672, 359, 15, 12, 12, 1], [672, 410, 17, 15, 12, 1], [1, 1, 1, 1, 8, 1], [794, 767, 16, 5, 11, 1], [672, 565, 17, 8, 13, 3], [672, 616, 14, 9, 10, 3], [672, 667, 12, 9, 10, 3], [672, 716, 17, 12, 12, 1], [672, 767, 17, 12, 12, 1], [733, 2, 16, 14, 12, 1], [733, 57, 12, 3, 10, 5], [733, 113, 8, 6, 8, 10], [733, 164, 10, 6, 9, 10], [733, 206, 20, 12, 19, 1], [733, 256, 17, 13, 14, 0], [733, 307, 18, 13, 15, 0], [733, 358, 17, 13, 14, 0], [733, 409, 19, 13, 14, 0], [733, 460, 18, 13, 14, 0], [733, 511, 13, 13, 9, 0], [733, 562, 14, 13, 9, 0], [733, 613, 14, 13, 9, 0], [733, 664, 14, 13, 9, 0], [733, 715, 19, 13, 16, 0], [733, 766, 19, 13, 16, 0], [1, 1, 1, 1, 8, 1], [794, 52, 19, 13, 16, 0], [794, 103, 20, 13, 15, 0], [794, 154, 20, 13, 15, 0], [794, 205, 20, 13, 15, 0], [794, 259, 12, 10, 9, 3], [794, 308, 14, 4, 10, 1], [794, 359, 15, 4, 10, 1], [794, 411, 14, 3, 10, 2], [794, 461, 15, 4, 10, 1], [794, 512, 14, 3, 10, 1], [794, 563, 14, 6, 10, 1], [794, 622, 10, 7, 10, 9], [794, 665, 15, 4, 10, 1], [794, 725, 9, 6, 10, 10], [794, 767, 16, 5, 11, 1], [855, 2, 16, 5, 11, 1], [855, 53, 16, 5, 11, 1], [855, 104, 16, 5, 11, 1], [855, 155, 16, 5, 11, 1], [855, 206, 16, 5, 11, 1], [855, 257, 16, 5, 11, 1], [855, 308, 16, 5, 11, 1], [855, 359, 16, 5, 11, 1], [855, 410, 16, 5, 11, 1], [855, 461, 16, 5, 11, 1], [855, 512, 16, 5, 11, 1], [855, 563, 16, 5, 11, 1], [855, 614, 16, 5, 11, 1], [855, 665, 16, 5, 11, 1], [855, 716, 16, 5, 11, 1], [855, 767, 16, 5, 11, 1]], \"capHeight\": 12, \"widestlogicalchar\": 19, \"widestglyph\": 24, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 12, 10, 8, 1], [1, 104, 13, 3, 8, 1], [1, 155, 16, 9, 12, 1], [1, 206, 15, 11, 12, 1], [1, 257, 20, 10, 16, 1], [1, 308, 14, 10, 13, 1], [1, 359, 12, 3, 7, 1], [1, 410, 14, 13, 9, 1], [1, 461, 12, 13, 9, 1], [1, 512, 14, 6, 10, 1], [1, 565, 14, 7, 12, 3], [1, 623, 8, 4, 8, 10], [1, 670, 11, 1, 9, 6], [1, 725, 7, 1, 7, 10], [1, 767, 13, 10, 8, 1], [62, 2, 15, 10, 12, 1], [62, 53, 14, 10, 12, 1], [62, 104, 16, 10, 12, 1], [62, 155, 16, 10, 12, 1], [62, 206, 16, 10, 12, 1], [62, 257, 17, 10, 12, 1], [62, 308, 15, 10, 12, 1], [62, 359, 17, 10, 12, 1], [62, 410, 16, 10, 12, 1], [62, 461, 16, 10, 12, 1], [62, 514, 11, 8, 7, 3], [62, 565, 11, 11, 7, 3], [62, 617, 15, 5, 12, 4], [62, 669, 14, 3, 11, 5], [62, 719, 14, 5, 12, 4], [62, 767, 16, 10, 12, 1], [123, 2, 20, 11, 18, 1], [123, 53, 15, 10, 13, 1], [123, 104, 17, 10, 13, 1], [123, 155, 18, 10, 14, 1], [123, 206, 18, 10, 14, 1], [123, 257, 18, 10, 13, 1], [123, 308, 18, 10, 13, 1], [123, 359, 18, 10, 15, 1], [123, 410, 19, 10, 14, 1], [123, 461, 12, 10, 8, 1], [123, 512, 15, 10, 10, 1], [123, 563, 17, 10, 13, 1], [123, 614, 12, 10, 12, 1], [123, 665, 20, 10, 16, 1], [123, 716, 19, 10, 14, 1], [123, 767, 18, 10, 15, 1], [184, 2, 17, 10, 13, 1], [184, 53, 18, 10, 15, 1], [184, 104, 18, 10, 14, 1], [184, 155, 17, 10, 13, 1], [184, 206, 18, 10, 13, 1], [184, 257, 19, 10, 14, 1], [184, 308, 18, 10, 13, 1], [184, 359, 22, 10, 17, 1], [184, 410, 18, 10, 13, 1], [184, 461, 18, 10, 13, 1], [184, 512, 18, 10, 13, 1], [184, 563, 13, 13, 8, 1], [184, 614, 11, 10, 8, 1], [184, 665, 13, 13, 8, 1], [184, 716, 14, 3, 10, 1], [184, 779, 12, 1, 12, 13], [245, 2, 12, 2, 8, 1], [245, 55, 14, 8, 12, 3], [245, 104, 15, 10, 12, 1], [245, 157, 14, 8, 11, 3], [245, 206, 17, 10, 12, 1], [245, 259, 15, 8, 12, 3], [245, 308, 13, 10, 8, 1], [245, 361, 16, 11, 12, 3], [245, 410, 15, 10, 12, 1], [245, 461, 12, 10, 7, 1], [245, 512, 12, 13, 7, 1], [245, 563, 15, 10, 11, 1], [245, 614, 12, 10, 7, 1], [245, 667, 19, 8, 16, 3], [245, 718, 15, 8, 12, 3], [245, 769, 15, 8, 12, 3], [306, 4, 15, 11, 12, 3], [306, 55, 16, 11, 12, 3], [306, 106, 14, 8, 9, 3], [306, 157, 14, 8, 11, 3], [306, 206, 12, 10, 8, 1], [306, 259, 16, 8, 12, 3], [306, 310, 15, 8, 11, 3], [306, 361, 18, 8, 14, 3], [306, 412, 15, 8, 11, 3], [306, 463, 16, 11, 11, 3], [306, 514, 15, 8, 11, 3], [306, 563, 14, 13, 9, 1], [306, 614, 12, 13, 7, 1], [306, 665, 12, 13, 9, 1], [306, 721, 13, 2, 11, 6], [306, 768, 15, 9, 11, 2], [367, 1, 15, 11, 13, 0], [367, 52, 17, 11, 13, 0], [367, 104, 18, 13, 14, 1], [367, 154, 17, 11, 13, 0], [367, 205, 19, 11, 14, 0], [367, 256, 18, 11, 15, 0], [367, 307, 19, 11, 14, 0], [367, 358, 14, 11, 12, 0], [367, 409, 14, 11, 12, 0], [367, 460, 15, 11, 12, 0], [367, 512, 15, 10, 12, 1], [367, 562, 15, 11, 12, 0], [367, 613, 15, 11, 12, 0], [367, 667, 14, 11, 11, 3], [367, 715, 15, 11, 12, 0], [367, 766, 15, 11, 12, 0], [428, 1, 16, 11, 12, 0], [428, 53, 16, 10, 12, 1], [428, 103, 11, 11, 8, 0], [428, 154, 12, 11, 8, 0], [428, 205, 13, 11, 8, 0], [428, 257, 13, 10, 8, 1], [428, 307, 15, 11, 11, 0], [428, 358, 15, 11, 12, 0], [428, 409, 15, 11, 12, 0], [428, 460, 15, 11, 11, 0], [428, 511, 14, 11, 11, 0], [428, 562, 15, 11, 11, 0], [428, 613, 16, 11, 12, 0], [428, 664, 16, 11, 12, 0], [428, 715, 16, 11, 12, 0], [428, 767, 16, 10, 12, 1], [489, 2, 15, 12, 11, 1], [489, 53, 13, 4, 9, 1], [489, 106, 14, 9, 11, 3], [489, 155, 15, 10, 12, 1], [489, 206, 15, 13, 12, 1], [489, 260, 12, 4, 9, 4], [489, 308, 17, 13, 12, 1], [489, 359, 16, 10, 13, 1], [489, 410, 18, 10, 15, 1], [489, 461, 18, 10, 15, 1], [489, 512, 21, 5, 16, 1], [489, 563, 13, 2, 9, 1], [489, 614, 14, 1, 9, 1], [489, 669, 14, 5, 12, 5], [489, 716, 22, 10, 18, 1], [489, 767, 19, 10, 15, 1], [550, 5, 17, 5, 14, 4], [550, 56, 14, 7, 12, 4], [550, 108, 15, 6, 12, 5], [550, 159, 14, 6, 12, 5], [550, 206, 17, 10, 12, 1], [550, 260, 13, 9, 12, 4], [550, 309, 15, 9, 11, 2], [550, 359, 19, 11, 14, 1], [550, 410, 20, 11, 16, 1], [550, 464, 15, 7, 12, 4], [550, 512, 13, 13, 8, 1], [550, 563, 13, 7, 9, 1], [550, 614, 13, 7, 9, 1], [550, 665, 18, 10, 15, 1], [550, 718, 19, 8, 16, 3], [550, 769, 16, 8, 13, 3], [611, 4, 13, 11, 11, 3], [611, 55, 11, 11, 8, 3], [611, 109, 16, 3, 14, 6], [611, 155, 17, 10, 12, 1], [611, 206, 16, 13, 11, 1], [611, 262, 14, 4, 12, 6], [611, 308, 15, 10, 13, 1], [611, 362, 14, 5, 12, 4], [611, 413, 14, 5, 12, 4], [611, 470, 17, 1, 18, 10], [611, 511, 1, 1, 12, 1], [611, 562, 15, 11, 13, 0], [611, 613, 16, 11, 13, 0], [611, 664, 18, 11, 15, 0], [611, 716, 23, 10, 18, 1], [611, 769, 20, 8, 17, 3], [672, 7, 14, 1, 12, 6], [672, 58, 19, 1, 18, 6], [672, 104, 14, 3, 9, 1], [672, 155, 14, 3, 9, 1], [672, 206, 12, 3, 7, 1], [672, 257, 12, 3, 7, 1], [672, 312, 14, 5, 12, 5], [672, 359, 14, 10, 11, 1], [672, 410, 16, 13, 11, 1], [1, 1, 1, 1, 7, 1], [794, 767, 15, 3, 10, 1], [672, 565, 16, 6, 12, 3], [672, 616, 13, 7, 9, 3], [672, 667, 11, 7, 9, 3], [672, 716, 16, 10, 11, 1], [672, 767, 16, 10, 11, 1], [733, 2, 15, 12, 11, 1], [733, 57, 11, 1, 9, 5], [733, 113, 7, 4, 7, 10], [733, 164, 9, 4, 8, 10], [733, 206, 19, 10, 18, 1], [733, 256, 16, 11, 13, 0], [733, 307, 17, 11, 14, 0], [733, 358, 15, 11, 13, 0], [733, 409, 18, 11, 13, 0], [733, 460, 17, 11, 13, 0], [733, 511, 11, 11, 8, 0], [733, 562, 13, 11, 8, 0], [733, 613, 11, 11, 8, 0], [733, 664, 13, 11, 8, 0], [733, 715, 18, 11, 15, 0], [733, 766, 18, 11, 15, 0], [1, 1, 1, 1, 7, 1], [794, 52, 18, 11, 15, 0], [794, 103, 19, 11, 14, 0], [794, 154, 19, 11, 14, 0], [794, 205, 19, 11, 14, 0], [794, 259, 11, 8, 8, 3], [794, 308, 13, 2, 9, 1], [794, 359, 14, 2, 9, 1], [794, 411, 13, 1, 9, 2], [794, 461, 14, 2, 9, 1], [794, 512, 13, 1, 9, 1], [794, 563, 13, 4, 9, 1], [794, 622, 9, 5, 9, 9], [794, 665, 14, 2, 9, 1], [794, 725, 8, 4, 9, 10], [794, 767, 15, 3, 10, 1], [855, 2, 15, 3, 10, 1], [855, 53, 15, 3, 10, 1], [855, 104, 15, 3, 10, 1], [855, 155, 15, 3, 10, 1], [855, 206, 15, 3, 10, 1], [855, 257, 15, 3, 10, 1], [855, 308, 15, 3, 10, 1], [855, 359, 15, 3, 10, 1], [855, 410, 15, 3, 10, 1], [855, 461, 15, 3, 10, 1], [855, 512, 15, 3, 10, 1], [855, 563, 15, 3, 10, 1], [855, 614, 15, 3, 10, 1], [855, 665, 15, 3, 10, 1], [855, 716, 15, 3, 10, 1], [855, 767, 15, 3, 10, 1]], \"capHeight\": 11, \"widestlogicalchar\": 18, \"widestglyph\": 23, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 8, 6, 8, 6], [1, 53, 9, 12, 9, 1], [1, 104, 9, 11, 9, 1], [1, 155, 13, 11, 13, 1], [1, 206, 13, 13, 13, 1], [1, 257, 17, 12, 17, 1], [1, 308, 14, 12, 14, 1], [1, 359, 8, 11, 8, 1], [1, 410, 10, 15, 10, 1], [1, 461, 10, 15, 10, 1], [1, 512, 11, 11, 11, 1], [1, 565, 13, 9, 13, 3], [1, 619, 9, 10, 9, 6], [1, 670, 10, 6, 10, 6], [1, 721, 8, 7, 8, 6], [1, 767, 9, 12, 9, 1], [62, 2, 13, 12, 13, 1], [62, 53, 13, 12, 13, 1], [62, 104, 13, 12, 13, 1], [62, 155, 13, 12, 13, 1], [62, 206, 13, 12, 13, 1], [62, 257, 13, 12, 13, 1], [62, 308, 13, 12, 13, 1], [62, 359, 13, 12, 13, 1], [62, 410, 13, 12, 13, 1], [62, 461, 13, 12, 13, 1], [62, 514, 8, 10, 8, 3], [62, 565, 8, 13, 8, 3], [62, 617, 13, 8, 13, 4], [62, 669, 12, 7, 12, 5], [62, 719, 13, 8, 13, 4], [62, 767, 13, 12, 13, 1], [123, 2, 19, 13, 19, 1], [123, 53, 14, 12, 14, 1], [123, 104, 14, 12, 14, 1], [123, 155, 15, 12, 15, 1], [123, 206, 15, 12, 15, 1], [123, 257, 14, 12, 14, 1], [123, 308, 14, 12, 14, 1], [123, 359, 16, 12, 16, 1], [123, 410, 15, 12, 15, 1], [123, 461, 9, 12, 9, 1], [123, 512, 11, 12, 11, 1], [123, 563, 14, 12, 14, 1], [123, 614, 13, 12, 13, 1], [123, 665, 17, 12, 17, 1], [123, 716, 15, 12, 15, 1], [123, 767, 16, 12, 16, 1], [184, 2, 14, 12, 14, 1], [184, 53, 16, 12, 16, 1], [184, 104, 15, 12, 15, 1], [184, 155, 14, 12, 14, 1], [184, 206, 14, 12, 14, 1], [184, 257, 15, 12, 15, 1], [184, 308, 14, 12, 14, 1], [184, 359, 18, 12, 18, 1], [184, 410, 14, 12, 14, 1], [184, 461, 14, 12, 14, 1], [184, 512, 14, 12, 14, 1], [184, 563, 9, 15, 9, 1], [184, 614, 9, 12, 9, 1], [184, 665, 9, 15, 9, 1], [184, 716, 11, 11, 11, 1], [184, 772, 13, 10, 13, 6], [245, 2, 9, 11, 9, 1], [245, 55, 13, 10, 13, 3], [245, 104, 13, 12, 13, 1], [245, 157, 12, 10, 12, 3], [245, 206, 13, 12, 13, 1], [245, 259, 13, 10, 13, 3], [245, 308, 9, 12, 9, 1], [245, 361, 13, 13, 13, 3], [245, 410, 13, 12, 13, 1], [245, 461, 8, 12, 8, 1], [245, 512, 8, 15, 8, 1], [245, 563, 12, 12, 12, 1], [245, 614, 8, 12, 8, 1], [245, 667, 17, 10, 17, 3], [245, 718, 13, 10, 13, 3], [245, 769, 13, 10, 13, 3], [306, 4, 13, 13, 13, 3], [306, 55, 13, 13, 13, 3], [306, 106, 10, 10, 10, 3], [306, 157, 12, 10, 12, 3], [306, 206, 9, 12, 9, 1], [306, 259, 13, 10, 13, 3], [306, 310, 12, 10, 12, 3], [306, 361, 15, 10, 15, 3], [306, 412, 12, 10, 12, 3], [306, 463, 12, 13, 12, 3], [306, 514, 12, 10, 12, 3], [306, 563, 10, 15, 10, 1], [306, 614, 8, 15, 8, 1], [306, 665, 10, 15, 10, 1], [306, 721, 12, 6, 12, 6], [306, 768, 12, 11, 12, 2], [367, 1, 14, 13, 14, 0], [367, 52, 14, 13, 14, 0], [367, 104, 15, 15, 15, 1], [367, 154, 14, 13, 14, 0], [367, 205, 15, 13, 15, 0], [367, 256, 16, 13, 16, 0], [367, 307, 15, 13, 15, 0], [367, 358, 13, 13, 13, 0], [367, 409, 13, 13, 13, 0], [367, 460, 13, 13, 13, 0], [367, 512, 13, 12, 13, 1], [367, 562, 13, 13, 13, 0], [367, 613, 13, 13, 13, 0], [367, 667, 12, 13, 12, 3], [367, 715, 13, 13, 13, 0], [367, 766, 13, 13, 13, 0], [428, 1, 13, 13, 13, 0], [428, 53, 13, 12, 13, 1], [428, 103, 9, 13, 9, 0], [428, 154, 9, 13, 9, 0], [428, 205, 9, 13, 9, 0], [428, 257, 9, 12, 9, 1], [428, 307, 12, 13, 12, 0], [428, 358, 13, 13, 13, 0], [428, 409, 13, 13, 13, 0], [428, 460, 12, 13, 12, 0], [428, 511, 12, 13, 12, 0], [428, 562, 12, 13, 12, 0], [428, 613, 13, 13, 13, 0], [428, 664, 13, 13, 13, 0], [428, 715, 13, 13, 13, 0], [428, 767, 13, 12, 13, 1], [489, 2, 12, 14, 12, 1], [489, 53, 10, 11, 10, 1], [489, 106, 12, 11, 12, 3], [489, 155, 13, 12, 13, 1], [489, 206, 13, 15, 13, 1], [489, 260, 10, 8, 10, 4], [489, 308, 13, 15, 13, 1], [489, 359, 14, 12, 14, 1], [489, 410, 16, 12, 16, 1], [489, 461, 16, 12, 16, 1], [489, 512, 17, 11, 17, 1], [489, 563, 10, 11, 10, 1], [489, 614, 10, 11, 10, 1], [489, 669, 13, 7, 13, 5], [489, 716, 19, 12, 19, 1], [489, 767, 16, 12, 16, 1], [550, 5, 15, 8, 15, 4], [550, 56, 13, 9, 13, 4], [550, 108, 13, 8, 13, 5], [550, 159, 13, 8, 13, 5], [550, 206, 13, 12, 13, 1], [550, 260, 13, 11, 13, 4], [550, 309, 12, 11, 12, 2], [550, 359, 15, 13, 15, 1], [550, 410, 17, 13, 17, 1], [550, 464, 13, 9, 13, 4], [550, 512, 9, 15, 9, 1], [550, 563, 10, 11, 10, 1], [550, 614, 10, 11, 10, 1], [550, 665, 16, 12, 16, 1], [550, 718, 17, 10, 17, 3], [550, 769, 14, 10, 14, 3], [611, 4, 12, 13, 12, 3], [611, 55, 9, 13, 9, 3], [611, 109, 15, 6, 15, 6], [611, 155, 13, 12, 13, 1], [611, 206, 12, 15, 12, 1], [611, 262, 13, 6, 13, 6], [611, 308, 14, 12, 14, 1], [611, 362, 13, 8, 13, 4], [611, 413, 13, 8, 13, 4], [611, 466, 19, 7, 19, 6], [611, 517, 13, 6, 13, 6], [611, 562, 14, 13, 14, 0], [611, 613, 14, 13, 14, 0], [611, 664, 16, 13, 16, 0], [611, 716, 19, 12, 19, 1], [611, 769, 18, 10, 18, 3], [672, 7, 13, 6, 13, 6], [672, 58, 19, 6, 19, 6], [672, 104, 10, 11, 10, 1], [672, 155, 10, 11, 10, 1], [672, 206, 8, 11, 8, 1], [672, 257, 8, 11, 8, 1], [672, 312, 13, 7, 13, 5], [672, 359, 12, 12, 12, 1], [672, 410, 12, 15, 12, 1], [1, 7, 8, 6, 8, 6], [794, 767, 11, 11, 11, 1], [672, 565, 13, 9, 13, 3], [672, 616, 10, 9, 10, 3], [672, 667, 10, 9, 10, 3], [672, 716, 12, 12, 12, 1], [672, 767, 12, 12, 12, 1], [733, 2, 12, 14, 12, 1], [733, 57, 10, 7, 10, 5], [733, 109, 8, 10, 8, 6], [733, 160, 9, 10, 9, 6], [733, 206, 19, 12, 19, 1], [733, 256, 14, 13, 14, 0], [733, 307, 15, 13, 15, 0], [733, 358, 14, 13, 14, 0], [733, 409, 14, 13, 14, 0], [733, 460, 14, 13, 14, 0], [733, 511, 9, 13, 9, 0], [733, 562, 9, 13, 9, 0], [733, 613, 9, 13, 9, 0], [733, 664, 9, 13, 9, 0], [733, 715, 16, 13, 16, 0], [733, 766, 16, 13, 16, 0], [1, 7, 8, 6, 8, 6], [794, 52, 16, 13, 16, 0], [794, 103, 15, 13, 15, 0], [794, 154, 15, 13, 15, 0], [794, 205, 15, 13, 15, 0], [794, 259, 9, 10, 9, 3], [794, 308, 10, 11, 10, 1], [794, 359, 10, 11, 10, 1], [794, 411, 10, 10, 10, 2], [794, 461, 10, 11, 10, 1], [794, 512, 10, 11, 10, 1], [794, 563, 10, 11, 10, 1], [794, 619, 10, 10, 10, 6], [794, 665, 10, 11, 10, 1], [794, 721, 10, 10, 10, 6], [794, 767, 11, 11, 11, 1], [855, 2, 11, 11, 11, 1], [855, 53, 11, 11, 11, 1], [855, 104, 11, 11, 11, 1], [855, 155, 11, 11, 11, 1], [855, 206, 11, 11, 11, 1], [855, 257, 11, 11, 11, 1], [855, 308, 11, 11, 11, 1], [855, 359, 11, 11, 11, 1], [855, 410, 11, 11, 11, 1], [855, 461, 11, 11, 11, 1], [855, 512, 11, 11, 11, 1], [855, 563, 11, 11, 11, 1], [855, 614, 11, 11, 11, 1], [855, 665, 11, 11, 11, 1], [855, 716, 11, 11, 11, 1], [855, 767, 11, 11, 11, 1]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 53, 8, 10, 8, 1], [1, 104, 8, 10, 8, 1], [1, 155, 12, 10, 12, 1], [1, 206, 12, 11, 12, 1], [1, 257, 16, 10, 16, 1], [1, 308, 13, 10, 13, 1], [1, 359, 7, 10, 7, 1], [1, 410, 9, 13, 9, 1], [1, 461, 9, 13, 9, 1], [1, 512, 10, 10, 10, 1], [1, 565, 12, 8, 12, 3], [1, 618, 8, 9, 8, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 6, 7, 5], [1, 767, 8, 10, 8, 1], [62, 2, 12, 10, 12, 1], [62, 53, 12, 10, 12, 1], [62, 104, 12, 10, 12, 1], [62, 155, 12, 10, 12, 1], [62, 206, 12, 10, 12, 1], [62, 257, 12, 10, 12, 1], [62, 308, 12, 10, 12, 1], [62, 359, 12, 10, 12, 1], [62, 410, 12, 10, 12, 1], [62, 461, 12, 10, 12, 1], [62, 514, 7, 8, 7, 3], [62, 565, 7, 11, 7, 3], [62, 617, 12, 7, 12, 4], [62, 669, 11, 6, 11, 5], [62, 719, 12, 7, 12, 4], [62, 767, 12, 10, 12, 1], [123, 2, 18, 11, 18, 1], [123, 53, 13, 10, 13, 1], [123, 104, 13, 10, 13, 1], [123, 155, 14, 10, 14, 1], [123, 206, 14, 10, 14, 1], [123, 257, 13, 10, 13, 1], [123, 308, 13, 10, 13, 1], [123, 359, 15, 10, 15, 1], [123, 410, 14, 10, 14, 1], [123, 461, 8, 10, 8, 1], [123, 512, 10, 10, 10, 1], [123, 563, 13, 10, 13, 1], [123, 614, 12, 10, 12, 1], [123, 665, 16, 10, 16, 1], [123, 716, 14, 10, 14, 1], [123, 767, 15, 10, 15, 1], [184, 2, 13, 10, 13, 1], [184, 53, 15, 10, 15, 1], [184, 104, 14, 10, 14, 1], [184, 155, 13, 10, 13, 1], [184, 206, 13, 10, 13, 1], [184, 257, 14, 10, 14, 1], [184, 308, 13, 10, 13, 1], [184, 359, 17, 10, 17, 1], [184, 410, 13, 10, 13, 1], [184, 461, 13, 10, 13, 1], [184, 512, 13, 10, 13, 1], [184, 563, 8, 13, 8, 1], [184, 614, 8, 10, 8, 1], [184, 665, 8, 13, 8, 1], [184, 716, 10, 10, 10, 1], [184, 771, 12, 9, 12, 5], [245, 2, 8, 10, 8, 1], [245, 55, 12, 8, 12, 3], [245, 104, 12, 10, 12, 1], [245, 157, 11, 8, 11, 3], [245, 206, 12, 10, 12, 1], [245, 259, 12, 8, 12, 3], [245, 308, 8, 10, 8, 1], [245, 361, 12, 11, 12, 3], [245, 410, 12, 10, 12, 1], [245, 461, 7, 10, 7, 1], [245, 512, 7, 13, 7, 1], [245, 563, 11, 10, 11, 1], [245, 614, 7, 10, 7, 1], [245, 667, 16, 8, 16, 3], [245, 718, 12, 8, 12, 3], [245, 769, 12, 8, 12, 3], [306, 4, 12, 11, 12, 3], [306, 55, 12, 11, 12, 3], [306, 106, 9, 8, 9, 3], [306, 157, 11, 8, 11, 3], [306, 206, 8, 10, 8, 1], [306, 259, 12, 8, 12, 3], [306, 310, 11, 8, 11, 3], [306, 361, 14, 8, 14, 3], [306, 412, 11, 8, 11, 3], [306, 463, 11, 11, 11, 3], [306, 514, 11, 8, 11, 3], [306, 563, 9, 13, 9, 1], [306, 614, 7, 13, 7, 1], [306, 665, 9, 13, 9, 1], [306, 720, 11, 6, 11, 5], [306, 768, 11, 9, 11, 2], [367, 1, 13, 11, 13, 0], [367, 52, 13, 11, 13, 0], [367, 104, 14, 13, 14, 1], [367, 154, 13, 11, 13, 0], [367, 205, 14, 11, 14, 0], [367, 256, 15, 11, 15, 0], [367, 307, 14, 11, 14, 0], [367, 358, 12, 11, 12, 0], [367, 409, 12, 11, 12, 0], [367, 460, 12, 11, 12, 0], [367, 512, 12, 10, 12, 1], [367, 562, 12, 11, 12, 0], [367, 613, 12, 11, 12, 0], [367, 667, 11, 11, 11, 3], [367, 715, 12, 11, 12, 0], [367, 766, 12, 11, 12, 0], [428, 1, 12, 11, 12, 0], [428, 53, 12, 10, 12, 1], [428, 103, 8, 11, 8, 0], [428, 154, 8, 11, 8, 0], [428, 205, 8, 11, 8, 0], [428, 257, 8, 10, 8, 1], [428, 307, 11, 11, 11, 0], [428, 358, 12, 11, 12, 0], [428, 409, 12, 11, 12, 0], [428, 460, 11, 11, 11, 0], [428, 511, 11, 11, 11, 0], [428, 562, 11, 11, 11, 0], [428, 613, 12, 11, 12, 0], [428, 664, 12, 11, 12, 0], [428, 715, 12, 11, 12, 0], [428, 767, 12, 10, 12, 1], [489, 2, 11, 12, 11, 1], [489, 53, 9, 10, 9, 1], [489, 106, 11, 9, 11, 3], [489, 155, 12, 10, 12, 1], [489, 206, 12, 13, 12, 1], [489, 260, 9, 7, 9, 4], [489, 308, 12, 13, 12, 1], [489, 359, 13, 10, 13, 1], [489, 410, 15, 10, 15, 1], [489, 461, 15, 10, 15, 1], [489, 512, 16, 10, 16, 1], [489, 563, 9, 10, 9, 1], [489, 614, 9, 10, 9, 1], [489, 669, 12, 6, 12, 5], [489, 716, 18, 10, 18, 1], [489, 767, 15, 10, 15, 1], [550, 5, 14, 7, 14, 4], [550, 56, 12, 7, 12, 4], [550, 108, 12, 6, 12, 5], [550, 159, 12, 6, 12, 5], [550, 206, 12, 10, 12, 1], [550, 260, 12, 9, 12, 4], [550, 309, 11, 9, 11, 2], [550, 359, 14, 11, 14, 1], [550, 410, 16, 11, 16, 1], [550, 464, 12, 7, 12, 4], [550, 512, 8, 13, 8, 1], [550, 563, 9, 10, 9, 1], [550, 614, 9, 10, 9, 1], [550, 665, 15, 10, 15, 1], [550, 718, 16, 8, 16, 3], [550, 769, 13, 8, 13, 3], [611, 4, 11, 11, 11, 3], [611, 55, 8, 11, 8, 3], [611, 108, 14, 6, 14, 5], [611, 155, 12, 10, 12, 1], [611, 206, 11, 13, 11, 1], [611, 261, 12, 6, 12, 5], [611, 308, 13, 10, 13, 1], [611, 362, 12, 7, 12, 4], [611, 413, 12, 7, 12, 4], [611, 465, 18, 6, 18, 5], [611, 516, 12, 6, 12, 5], [611, 562, 13, 11, 13, 0], [611, 613, 13, 11, 13, 0], [611, 664, 15, 11, 15, 0], [611, 716, 18, 10, 18, 1], [611, 769, 17, 8, 17, 3], [672, 6, 12, 6, 12, 5], [672, 57, 18, 6, 18, 5], [672, 104, 9, 10, 9, 1], [672, 155, 9, 10, 9, 1], [672, 206, 7, 10, 7, 1], [672, 257, 7, 10, 7, 1], [672, 312, 12, 6, 12, 5], [672, 359, 11, 10, 11, 1], [672, 410, 11, 13, 11, 1], [1, 6, 7, 6, 7, 5], [794, 767, 10, 10, 10, 1], [672, 565, 12, 8, 12, 3], [672, 616, 9, 8, 9, 3], [672, 667, 9, 8, 9, 3], [672, 716, 11, 10, 11, 1], [672, 767, 11, 10, 11, 1], [733, 2, 11, 12, 11, 1], [733, 57, 9, 6, 9, 5], [733, 108, 7, 9, 7, 5], [733, 159, 8, 9, 8, 5], [733, 206, 18, 10, 18, 1], [733, 256, 13, 11, 13, 0], [733, 307, 14, 11, 14, 0], [733, 358, 13, 11, 13, 0], [733, 409, 13, 11, 13, 0], [733, 460, 13, 11, 13, 0], [733, 511, 8, 11, 8, 0], [733, 562, 8, 11, 8, 0], [733, 613, 8, 11, 8, 0], [733, 664, 8, 11, 8, 0], [733, 715, 15, 11, 15, 0], [733, 766, 15, 11, 15, 0], [1, 6, 7, 6, 7, 5], [794, 52, 15, 11, 15, 0], [794, 103, 14, 11, 14, 0], [794, 154, 14, 11, 14, 0], [794, 205, 14, 11, 14, 0], [794, 259, 8, 8, 8, 3], [794, 308, 9, 10, 9, 1], [794, 359, 9, 10, 9, 1], [794, 411, 9, 9, 9, 2], [794, 461, 9, 10, 9, 1], [794, 512, 9, 10, 9, 1], [794, 563, 9, 10, 9, 1], [794, 618, 9, 9, 9, 5], [794, 665, 9, 10, 9, 1], [794, 720, 9, 9, 9, 5], [794, 767, 10, 10, 10, 1], [855, 2, 10, 10, 10, 1], [855, 53, 10, 10, 10, 1], [855, 104, 10, 10, 10, 1], [855, 155, 10, 10, 10, 1], [855, 206, 10, 10, 10, 1], [855, 257, 10, 10, 10, 1], [855, 308, 10, 10, 10, 1], [855, 359, 10, 10, 10, 1], [855, 410, 10, 10, 10, 1], [855, 461, 10, 10, 10, 1], [855, 512, 10, 10, 10, 1], [855, 563, 10, 10, 10, 1], [855, 614, 10, 10, 10, 1], [855, 665, 10, 10, 10, 1], [855, 716, 10, 10, 10, 1], [855, 767, 10, 10, 10, 1]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 12, 12, 8, 1], [1, 104, 13, 5, 8, 1], [1, 155, 16, 11, 12, 1], [1, 206, 15, 13, 12, 1], [1, 257, 20, 12, 16, 1], [1, 308, 14, 12, 13, 1], [1, 359, 12, 5, 7, 1], [1, 410, 14, 15, 9, 1], [1, 461, 12, 15, 9, 1], [1, 512, 14, 8, 10, 1], [1, 565, 14, 9, 12, 3], [1, 623, 8, 6, 8, 10], [1, 670, 11, 3, 9, 6], [1, 725, 7, 3, 7, 10], [1, 767, 13, 12, 8, 1], [62, 2, 15, 12, 12, 1], [62, 53, 14, 12, 12, 1], [62, 104, 16, 12, 12, 1], [62, 155, 16, 12, 12, 1], [62, 206, 16, 12, 12, 1], [62, 257, 17, 12, 12, 1], [62, 308, 15, 12, 12, 1], [62, 359, 17, 12, 12, 1], [62, 410, 16, 12, 12, 1], [62, 461, 16, 12, 12, 1], [62, 514, 11, 10, 7, 3], [62, 565, 11, 13, 7, 3], [62, 617, 15, 7, 12, 4], [62, 669, 14, 5, 11, 5], [62, 719, 14, 7, 12, 4], [62, 767, 16, 12, 12, 1], [123, 2, 20, 13, 18, 1], [123, 53, 15, 12, 13, 1], [123, 104, 17, 12, 13, 1], [123, 155, 18, 12, 14, 1], [123, 206, 18, 12, 14, 1], [123, 257, 18, 12, 13, 1], [123, 308, 18, 12, 13, 1], [123, 359, 18, 12, 15, 1], [123, 410, 19, 12, 14, 1], [123, 461, 12, 12, 8, 1], [123, 512, 15, 12, 10, 1], [123, 563, 17, 12, 13, 1], [123, 614, 12, 12, 12, 1], [123, 665, 20, 12, 16, 1], [123, 716, 19, 12, 14, 1], [123, 767, 18, 12, 15, 1], [184, 2, 17, 12, 13, 1], [184, 53, 18, 12, 15, 1], [184, 104, 18, 12, 14, 1], [184, 155, 17, 12, 13, 1], [184, 206, 18, 12, 13, 1], [184, 257, 19, 12, 14, 1], [184, 308, 18, 12, 13, 1], [184, 359, 22, 12, 17, 1], [184, 410, 18, 12, 13, 1], [184, 461, 18, 12, 13, 1], [184, 512, 18, 12, 13, 1], [184, 563, 13, 15, 8, 1], [184, 614, 11, 12, 8, 1], [184, 665, 13, 15, 8, 1], [184, 716, 14, 5, 10, 1], [184, 779, 12, 3, 12, 13], [245, 2, 12, 4, 8, 1], [245, 55, 14, 10, 12, 3], [245, 104, 15, 12, 12, 1], [245, 157, 14, 10, 11, 3], [245, 206, 17, 12, 12, 1], [245, 259, 15, 10, 12, 3], [245, 308, 13, 12, 8, 1], [245, 361, 16, 13, 12, 3], [245, 410, 15, 12, 12, 1], [245, 461, 12, 12, 7, 1], [245, 512, 12, 15, 7, 1], [245, 563, 15, 12, 11, 1], [245, 614, 12, 12, 7, 1], [245, 667, 19, 10, 16, 3], [245, 718, 15, 10, 12, 3], [245, 769, 15, 10, 12, 3], [306, 4, 15, 13, 12, 3], [306, 55, 16, 13, 12, 3], [306, 106, 14, 10, 9, 3], [306, 157, 14, 10, 11, 3], [306, 206, 12, 12, 8, 1], [306, 259, 16, 10, 12, 3], [306, 310, 15, 10, 11, 3], [306, 361, 18, 10, 14, 3], [306, 412, 15, 10, 11, 3], [306, 463, 16, 13, 11, 3], [306, 514, 15, 10, 11, 3], [306, 563, 14, 15, 9, 1], [306, 614, 12, 15, 7, 1], [306, 665, 12, 15, 9, 1], [306, 721, 13, 4, 11, 6], [306, 768, 15, 11, 11, 2], [367, 1, 17, 13, 13, 0], [367, 52, 17, 13, 13, 0], [367, 104, 18, 15, 14, 1], [367, 154, 17, 13, 13, 0], [367, 205, 19, 13, 14, 0], [367, 256, 18, 13, 15, 0], [367, 307, 19, 13, 14, 0], [367, 358, 14, 13, 12, 0], [367, 409, 14, 13, 12, 0], [367, 460, 15, 13, 12, 0], [367, 512, 15, 12, 12, 1], [367, 562, 16, 13, 12, 0], [367, 613, 15, 13, 12, 0], [367, 667, 14, 13, 11, 3], [367, 715, 15, 13, 12, 0], [367, 766, 15, 13, 12, 0], [428, 1, 16, 13, 12, 0], [428, 53, 16, 12, 12, 1], [428, 103, 12, 13, 8, 0], [428, 154, 12, 13, 8, 0], [428, 205, 13, 13, 8, 0], [428, 257, 13, 12, 8, 1], [428, 307, 16, 13, 11, 0], [428, 358, 15, 13, 12, 0], [428, 409, 15, 13, 12, 0], [428, 460, 15, 13, 11, 0], [428, 511, 15, 13, 11, 0], [428, 562, 16, 13, 11, 0], [428, 613, 16, 13, 12, 0], [428, 664, 16, 13, 12, 0], [428, 715, 16, 13, 12, 0], [428, 767, 16, 12, 12, 1], [489, 2, 15, 14, 11, 1], [489, 53, 13, 6, 9, 1], [489, 106, 14, 11, 11, 3], [489, 155, 15, 12, 12, 1], [489, 206, 15, 15, 12, 1], [489, 260, 12, 6, 9, 4], [489, 308, 17, 15, 12, 1], [489, 359, 16, 12, 13, 1], [489, 410, 18, 12, 15, 1], [489, 461, 18, 12, 15, 1], [489, 512, 21, 7, 16, 1], [489, 563, 13, 4, 9, 1], [489, 614, 14, 3, 9, 1], [489, 669, 14, 7, 12, 5], [489, 716, 22, 12, 18, 1], [489, 767, 19, 12, 15, 1], [550, 5, 17, 7, 14, 4], [550, 56, 14, 9, 12, 4], [550, 108, 15, 8, 12, 5], [550, 159, 14, 8, 12, 5], [550, 206, 17, 12, 12, 1], [550, 260, 13, 11, 12, 4], [550, 309, 15, 11, 11, 2], [550, 359, 19, 13, 14, 1], [550, 410, 20, 13, 16, 1], [550, 464, 15, 9, 12, 4], [550, 512, 13, 15, 8, 1], [550, 563, 13, 9, 9, 1], [550, 614, 13, 9, 9, 1], [550, 665, 18, 12, 15, 1], [550, 718, 19, 10, 16, 3], [550, 769, 16, 10, 13, 3], [611, 4, 13, 13, 11, 3], [611, 55, 11, 13, 8, 3], [611, 109, 16, 5, 14, 6], [611, 155, 17, 12, 12, 1], [611, 206, 16, 15, 11, 1], [611, 262, 14, 6, 12, 6], [611, 308, 15, 12, 13, 1], [611, 362, 14, 7, 12, 4], [611, 413, 14, 7, 12, 4], [611, 470, 17, 3, 18, 10], [611, 511, 1, 1, 12, 1], [611, 562, 15, 13, 13, 0], [611, 613, 17, 13, 13, 0], [611, 664, 18, 13, 15, 0], [611, 716, 23, 12, 18, 1], [611, 769, 20, 10, 17, 3], [672, 7, 14, 3, 12, 6], [672, 58, 19, 3, 18, 6], [672, 104, 14, 5, 9, 1], [672, 155, 14, 5, 9, 1], [672, 206, 12, 5, 7, 1], [672, 257, 12, 5, 7, 1], [672, 312, 14, 7, 12, 5], [672, 359, 14, 12, 11, 1], [672, 410, 16, 15, 11, 1], [1, 1, 1, 1, 7, 1], [794, 767, 15, 5, 10, 1], [672, 565, 16, 8, 12, 3], [672, 616, 13, 9, 9, 3], [672, 667, 11, 9, 9, 3], [672, 716, 16, 12, 11, 1], [672, 767, 16, 12, 11, 1], [733, 2, 15, 14, 11, 1], [733, 57, 11, 3, 9, 5], [733, 113, 7, 6, 7, 10], [733, 164, 9, 6, 8, 10], [733, 206, 19, 12, 18, 1], [733, 256, 16, 13, 13, 0], [733, 307, 17, 13, 14, 0], [733, 358, 16, 13, 13, 0], [733, 409, 18, 13, 13, 0], [733, 460, 17, 13, 13, 0], [733, 511, 12, 13, 8, 0], [733, 562, 13, 13, 8, 0], [733, 613, 13, 13, 8, 0], [733, 664, 13, 13, 8, 0], [733, 715, 18, 13, 15, 0], [733, 766, 18, 13, 15, 0], [1, 1, 1, 1, 7, 1], [794, 52, 18, 13, 15, 0], [794, 103, 19, 13, 14, 0], [794, 154, 19, 13, 14, 0], [794, 205, 19, 13, 14, 0], [794, 259, 11, 10, 8, 3], [794, 308, 13, 4, 9, 1], [794, 359, 14, 4, 9, 1], [794, 411, 13, 3, 9, 2], [794, 461, 14, 4, 9, 1], [794, 512, 13, 3, 9, 1], [794, 563, 13, 6, 9, 1], [794, 622, 9, 7, 9, 9], [794, 665, 14, 4, 9, 1], [794, 725, 8, 6, 9, 10], [794, 767, 15, 5, 10, 1], [855, 2, 15, 5, 10, 1], [855, 53, 15, 5, 10, 1], [855, 104, 15, 5, 10, 1], [855, 155, 15, 5, 10, 1], [855, 206, 15, 5, 10, 1], [855, 257, 15, 5, 10, 1], [855, 308, 15, 5, 10, 1], [855, 359, 15, 5, 10, 1], [855, 410, 15, 5, 10, 1], [855, 461, 15, 5, 10, 1], [855, 512, 15, 5, 10, 1], [855, 563, 15, 5, 10, 1], [855, 614, 15, 5, 10, 1], [855, 665, 15, 5, 10, 1], [855, 716, 15, 5, 10, 1], [855, 767, 15, 5, 10, 1]], \"capHeight\": 12, \"widestlogicalchar\": 18, \"widestglyph\": 23, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 11, 10, 7, 1], [1, 104, 12, 3, 7, 1], [1, 155, 15, 9, 11, 1], [1, 206, 14, 11, 11, 1], [1, 257, 19, 10, 15, 1], [1, 308, 13, 10, 12, 1], [1, 359, 11, 3, 6, 1], [1, 410, 13, 13, 8, 1], [1, 461, 11, 13, 8, 1], [1, 512, 13, 6, 9, 1], [1, 565, 13, 7, 11, 3], [1, 623, 7, 4, 7, 10], [1, 670, 10, 1, 8, 6], [1, 725, 6, 1, 6, 10], [1, 767, 12, 10, 7, 1], [62, 2, 14, 10, 11, 1], [62, 53, 13, 10, 11, 1], [62, 104, 15, 10, 11, 1], [62, 155, 15, 10, 11, 1], [62, 206, 15, 10, 11, 1], [62, 257, 16, 10, 11, 1], [62, 308, 14, 10, 11, 1], [62, 359, 16, 10, 11, 1], [62, 410, 15, 10, 11, 1], [62, 461, 15, 10, 11, 1], [62, 514, 10, 8, 6, 3], [62, 565, 10, 11, 6, 3], [62, 617, 14, 5, 11, 4], [62, 669, 13, 3, 10, 5], [62, 719, 13, 5, 11, 4], [62, 767, 15, 10, 11, 1], [123, 2, 19, 11, 17, 1], [123, 53, 14, 10, 12, 1], [123, 104, 16, 10, 12, 1], [123, 155, 17, 10, 13, 1], [123, 206, 17, 10, 13, 1], [123, 257, 17, 10, 12, 1], [123, 308, 17, 10, 12, 1], [123, 359, 17, 10, 14, 1], [123, 410, 18, 10, 13, 1], [123, 461, 11, 10, 7, 1], [123, 512, 14, 10, 9, 1], [123, 563, 16, 10, 12, 1], [123, 614, 11, 10, 11, 1], [123, 665, 19, 10, 15, 1], [123, 716, 18, 10, 13, 1], [123, 767, 17, 10, 14, 1], [184, 2, 16, 10, 12, 1], [184, 53, 17, 10, 14, 1], [184, 104, 17, 10, 13, 1], [184, 155, 16, 10, 12, 1], [184, 206, 17, 10, 12, 1], [184, 257, 18, 10, 13, 1], [184, 308, 17, 10, 12, 1], [184, 359, 21, 10, 16, 1], [184, 410, 16, 10, 12, 1], [184, 461, 16, 10, 12, 1], [184, 512, 17, 10, 12, 1], [184, 563, 12, 13, 7, 1], [184, 614, 10, 10, 7, 1], [184, 665, 12, 13, 7, 1], [184, 716, 13, 3, 9, 1], [184, 779, 11, 1, 11, 13], [245, 2, 11, 2, 7, 1], [245, 55, 13, 8, 11, 3], [245, 104, 14, 10, 11, 1], [245, 157, 13, 8, 10, 3], [245, 206, 16, 10, 11, 1], [245, 259, 14, 8, 11, 3], [245, 308, 12, 10, 7, 1], [245, 361, 15, 11, 11, 3], [245, 410, 14, 10, 11, 1], [245, 461, 11, 10, 6, 1], [245, 512, 11, 13, 6, 1], [245, 563, 14, 10, 10, 1], [245, 614, 11, 10, 6, 1], [245, 667, 18, 8, 15, 3], [245, 718, 14, 8, 11, 3], [245, 769, 14, 8, 11, 3], [306, 4, 14, 11, 11, 3], [306, 55, 15, 11, 11, 3], [306, 106, 13, 8, 8, 3], [306, 157, 13, 8, 10, 3], [306, 206, 11, 10, 7, 1], [306, 259, 15, 8, 11, 3], [306, 310, 14, 8, 10, 3], [306, 361, 17, 8, 13, 3], [306, 412, 14, 8, 10, 3], [306, 463, 15, 11, 10, 3], [306, 514, 14, 8, 10, 3], [306, 563, 13, 13, 8, 1], [306, 614, 11, 13, 6, 1], [306, 665, 11, 13, 8, 1], [306, 721, 12, 2, 10, 6], [306, 768, 14, 9, 10, 2], [367, 1, 14, 11, 12, 0], [367, 52, 16, 11, 12, 0], [367, 104, 17, 13, 13, 1], [367, 154, 16, 11, 12, 0], [367, 205, 18, 11, 13, 0], [367, 256, 17, 11, 14, 0], [367, 307, 18, 11, 13, 0], [367, 358, 13, 11, 11, 0], [367, 409, 13, 11, 11, 0], [367, 460, 14, 11, 11, 0], [367, 512, 14, 10, 11, 1], [367, 562, 14, 11, 11, 0], [367, 613, 14, 11, 11, 0], [367, 667, 13, 11, 10, 3], [367, 715, 14, 11, 11, 0], [367, 766, 14, 11, 11, 0], [428, 1, 15, 11, 11, 0], [428, 53, 15, 10, 11, 1], [428, 103, 10, 11, 7, 0], [428, 154, 11, 11, 7, 0], [428, 205, 12, 11, 7, 0], [428, 257, 12, 10, 7, 1], [428, 307, 14, 11, 10, 0], [428, 358, 14, 11, 11, 0], [428, 409, 14, 11, 11, 0], [428, 460, 14, 11, 10, 0], [428, 511, 13, 11, 10, 0], [428, 562, 14, 11, 10, 0], [428, 613, 15, 11, 11, 0], [428, 664, 15, 11, 11, 0], [428, 715, 15, 11, 11, 0], [428, 767, 15, 10, 11, 1], [489, 2, 14, 12, 10, 1], [489, 53, 12, 4, 8, 1], [489, 106, 13, 9, 10, 3], [489, 155, 14, 10, 11, 1], [489, 206, 14, 13, 11, 1], [489, 260, 11, 4, 8, 4], [489, 308, 16, 13, 11, 1], [489, 359, 15, 10, 12, 1], [489, 410, 17, 10, 14, 1], [489, 461, 17, 10, 14, 1], [489, 512, 20, 5, 15, 1], [489, 563, 12, 2, 8, 1], [489, 614, 13, 1, 8, 1], [489, 669, 13, 5, 11, 5], [489, 716, 21, 10, 17, 1], [489, 767, 18, 10, 14, 1], [550, 5, 16, 5, 13, 4], [550, 56, 13, 7, 11, 4], [550, 108, 14, 6, 11, 5], [550, 159, 13, 6, 11, 5], [550, 206, 16, 10, 11, 1], [550, 260, 12, 9, 11, 4], [550, 309, 14, 9, 10, 2], [550, 359, 18, 11, 13, 1], [550, 410, 19, 11, 15, 1], [550, 464, 14, 7, 11, 4], [550, 512, 12, 13, 7, 1], [550, 563, 12, 7, 8, 1], [550, 614, 12, 7, 8, 1], [550, 665, 17, 10, 14, 1], [550, 718, 18, 8, 15, 3], [550, 769, 15, 8, 12, 3], [611, 4, 12, 11, 10, 3], [611, 55, 10, 11, 7, 3], [611, 109, 15, 3, 13, 6], [611, 155, 16, 10, 11, 1], [611, 206, 15, 13, 10, 1], [611, 262, 13, 4, 11, 6], [611, 308, 14, 10, 12, 1], [611, 362, 13, 5, 11, 4], [611, 413, 13, 5, 11, 4], [611, 470, 16, 1, 17, 10], [611, 511, 1, 1, 11, 1], [611, 562, 14, 11, 12, 0], [611, 613, 15, 11, 12, 0], [611, 664, 17, 11, 14, 0], [611, 716, 22, 10, 17, 1], [611, 769, 19, 8, 16, 3], [672, 7, 13, 1, 11, 6], [672, 58, 18, 1, 17, 6], [672, 104, 13, 3, 8, 1], [672, 155, 13, 3, 8, 1], [672, 206, 11, 3, 6, 1], [672, 257, 11, 3, 6, 1], [672, 312, 13, 5, 11, 5], [672, 359, 13, 10, 10, 1], [672, 410, 15, 13, 10, 1], [1, 1, 1, 1, 6, 1], [794, 767, 14, 3, 9, 1], [672, 565, 15, 6, 11, 3], [672, 616, 12, 7, 8, 3], [672, 667, 10, 7, 8, 3], [672, 716, 15, 10, 10, 1], [672, 767, 15, 10, 10, 1], [733, 2, 14, 12, 10, 1], [733, 57, 10, 1, 8, 5], [733, 113, 6, 4, 6, 10], [733, 164, 8, 4, 7, 10], [733, 206, 18, 10, 17, 1], [733, 256, 15, 11, 12, 0], [733, 307, 16, 11, 13, 0], [733, 358, 14, 11, 12, 0], [733, 409, 17, 11, 12, 0], [733, 460, 16, 11, 12, 0], [733, 511, 10, 11, 7, 0], [733, 562, 12, 11, 7, 0], [733, 613, 10, 11, 7, 0], [733, 664, 12, 11, 7, 0], [733, 715, 17, 11, 14, 0], [733, 766, 17, 11, 14, 0], [1, 1, 1, 1, 6, 1], [794, 52, 17, 11, 14, 0], [794, 103, 18, 11, 13, 0], [794, 154, 18, 11, 13, 0], [794, 205, 18, 11, 13, 0], [794, 259, 10, 8, 7, 3], [794, 308, 12, 2, 8, 1], [794, 359, 12, 2, 8, 1], [794, 411, 12, 1, 8, 2], [794, 461, 13, 2, 8, 1], [794, 512, 12, 1, 8, 1], [794, 563, 12, 4, 8, 1], [794, 622, 8, 5, 8, 9], [794, 665, 13, 2, 8, 1], [794, 725, 7, 4, 8, 10], [794, 767, 14, 3, 9, 1], [855, 2, 14, 3, 9, 1], [855, 53, 14, 3, 9, 1], [855, 104, 14, 3, 9, 1], [855, 155, 14, 3, 9, 1], [855, 206, 14, 3, 9, 1], [855, 257, 14, 3, 9, 1], [855, 308, 14, 3, 9, 1], [855, 359, 14, 3, 9, 1], [855, 410, 14, 3, 9, 1], [855, 461, 14, 3, 9, 1], [855, 512, 14, 3, 9, 1], [855, 563, 14, 3, 9, 1], [855, 614, 14, 3, 9, 1], [855, 665, 14, 3, 9, 1], [855, 716, 14, 3, 9, 1], [855, 767, 14, 3, 9, 1]], \"capHeight\": 11, \"widestlogicalchar\": 17, \"widestglyph\": 22, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 53, 8, 12, 8, 1], [1, 104, 8, 11, 8, 1], [1, 155, 12, 11, 12, 1], [1, 206, 12, 13, 12, 1], [1, 257, 16, 12, 16, 1], [1, 308, 13, 12, 13, 1], [1, 359, 7, 11, 7, 1], [1, 410, 9, 15, 9, 1], [1, 461, 9, 15, 9, 1], [1, 512, 10, 11, 10, 1], [1, 565, 12, 9, 12, 3], [1, 619, 8, 10, 8, 6], [1, 670, 9, 6, 9, 6], [1, 721, 7, 7, 7, 6], [1, 767, 8, 12, 8, 1], [62, 2, 12, 12, 12, 1], [62, 53, 12, 12, 12, 1], [62, 104, 12, 12, 12, 1], [62, 155, 12, 12, 12, 1], [62, 206, 12, 12, 12, 1], [62, 257, 12, 12, 12, 1], [62, 308, 12, 12, 12, 1], [62, 359, 12, 12, 12, 1], [62, 410, 12, 12, 12, 1], [62, 461, 12, 12, 12, 1], [62, 514, 7, 10, 7, 3], [62, 565, 7, 13, 7, 3], [62, 617, 12, 8, 12, 4], [62, 669, 11, 7, 11, 5], [62, 719, 12, 8, 12, 4], [62, 767, 12, 12, 12, 1], [123, 2, 18, 13, 18, 1], [123, 53, 13, 12, 13, 1], [123, 104, 13, 12, 13, 1], [123, 155, 14, 12, 14, 1], [123, 206, 14, 12, 14, 1], [123, 257, 13, 12, 13, 1], [123, 308, 13, 12, 13, 1], [123, 359, 15, 12, 15, 1], [123, 410, 14, 12, 14, 1], [123, 461, 8, 12, 8, 1], [123, 512, 10, 12, 10, 1], [123, 563, 13, 12, 13, 1], [123, 614, 12, 12, 12, 1], [123, 665, 16, 12, 16, 1], [123, 716, 14, 12, 14, 1], [123, 767, 15, 12, 15, 1], [184, 2, 13, 12, 13, 1], [184, 53, 15, 12, 15, 1], [184, 104, 14, 12, 14, 1], [184, 155, 13, 12, 13, 1], [184, 206, 13, 12, 13, 1], [184, 257, 14, 12, 14, 1], [184, 308, 13, 12, 13, 1], [184, 359, 17, 12, 17, 1], [184, 410, 13, 12, 13, 1], [184, 461, 13, 12, 13, 1], [184, 512, 13, 12, 13, 1], [184, 563, 8, 15, 8, 1], [184, 614, 8, 12, 8, 1], [184, 665, 8, 15, 8, 1], [184, 716, 10, 11, 10, 1], [184, 772, 12, 10, 12, 6], [245, 2, 8, 11, 8, 1], [245, 55, 12, 10, 12, 3], [245, 104, 12, 12, 12, 1], [245, 157, 11, 10, 11, 3], [245, 206, 12, 12, 12, 1], [245, 259, 12, 10, 12, 3], [245, 308, 8, 12, 8, 1], [245, 361, 12, 13, 12, 3], [245, 410, 12, 12, 12, 1], [245, 461, 7, 12, 7, 1], [245, 512, 7, 15, 7, 1], [245, 563, 11, 12, 11, 1], [245, 614, 7, 12, 7, 1], [245, 667, 16, 10, 16, 3], [245, 718, 12, 10, 12, 3], [245, 769, 12, 10, 12, 3], [306, 4, 12, 13, 12, 3], [306, 55, 12, 13, 12, 3], [306, 106, 9, 10, 9, 3], [306, 157, 11, 10, 11, 3], [306, 206, 8, 12, 8, 1], [306, 259, 12, 10, 12, 3], [306, 310, 11, 10, 11, 3], [306, 361, 14, 10, 14, 3], [306, 412, 11, 10, 11, 3], [306, 463, 11, 13, 11, 3], [306, 514, 11, 10, 11, 3], [306, 563, 9, 15, 9, 1], [306, 614, 7, 15, 7, 1], [306, 665, 9, 15, 9, 1], [306, 721, 11, 6, 11, 6], [306, 768, 11, 11, 11, 2], [367, 1, 13, 13, 13, 0], [367, 52, 13, 13, 13, 0], [367, 104, 14, 15, 14, 1], [367, 154, 13, 13, 13, 0], [367, 205, 14, 13, 14, 0], [367, 256, 15, 13, 15, 0], [367, 307, 14, 13, 14, 0], [367, 358, 12, 13, 12, 0], [367, 409, 12, 13, 12, 0], [367, 460, 12, 13, 12, 0], [367, 512, 12, 12, 12, 1], [367, 562, 12, 13, 12, 0], [367, 613, 12, 13, 12, 0], [367, 667, 11, 13, 11, 3], [367, 715, 12, 13, 12, 0], [367, 766, 12, 13, 12, 0], [428, 1, 12, 13, 12, 0], [428, 53, 12, 12, 12, 1], [428, 103, 8, 13, 8, 0], [428, 154, 8, 13, 8, 0], [428, 205, 8, 13, 8, 0], [428, 257, 8, 12, 8, 1], [428, 307, 11, 13, 11, 0], [428, 358, 12, 13, 12, 0], [428, 409, 12, 13, 12, 0], [428, 460, 11, 13, 11, 0], [428, 511, 11, 13, 11, 0], [428, 562, 11, 13, 11, 0], [428, 613, 12, 13, 12, 0], [428, 664, 12, 13, 12, 0], [428, 715, 12, 13, 12, 0], [428, 767, 12, 12, 12, 1], [489, 2, 11, 14, 11, 1], [489, 53, 9, 11, 9, 1], [489, 106, 11, 11, 11, 3], [489, 155, 12, 12, 12, 1], [489, 206, 12, 15, 12, 1], [489, 260, 9, 8, 9, 4], [489, 308, 12, 15, 12, 1], [489, 359, 13, 12, 13, 1], [489, 410, 15, 12, 15, 1], [489, 461, 15, 12, 15, 1], [489, 512, 16, 11, 16, 1], [489, 563, 9, 11, 9, 1], [489, 614, 9, 11, 9, 1], [489, 669, 12, 7, 12, 5], [489, 716, 18, 12, 18, 1], [489, 767, 15, 12, 15, 1], [550, 5, 14, 8, 14, 4], [550, 56, 12, 9, 12, 4], [550, 108, 12, 8, 12, 5], [550, 159, 12, 8, 12, 5], [550, 206, 12, 12, 12, 1], [550, 260, 12, 11, 12, 4], [550, 309, 11, 11, 11, 2], [550, 359, 14, 13, 14, 1], [550, 410, 16, 13, 16, 1], [550, 464, 12, 9, 12, 4], [550, 512, 8, 15, 8, 1], [550, 563, 9, 11, 9, 1], [550, 614, 9, 11, 9, 1], [550, 665, 15, 12, 15, 1], [550, 718, 16, 10, 16, 3], [550, 769, 13, 10, 13, 3], [611, 4, 11, 13, 11, 3], [611, 55, 8, 13, 8, 3], [611, 109, 14, 6, 14, 6], [611, 155, 12, 12, 12, 1], [611, 206, 11, 15, 11, 1], [611, 262, 12, 6, 12, 6], [611, 308, 13, 12, 13, 1], [611, 362, 12, 8, 12, 4], [611, 413, 12, 8, 12, 4], [611, 466, 18, 7, 18, 6], [611, 517, 12, 6, 12, 6], [611, 562, 13, 13, 13, 0], [611, 613, 13, 13, 13, 0], [611, 664, 15, 13, 15, 0], [611, 716, 18, 12, 18, 1], [611, 769, 17, 10, 17, 3], [672, 7, 12, 6, 12, 6], [672, 58, 18, 6, 18, 6], [672, 104, 9, 11, 9, 1], [672, 155, 9, 11, 9, 1], [672, 206, 7, 11, 7, 1], [672, 257, 7, 11, 7, 1], [672, 312, 12, 7, 12, 5], [672, 359, 11, 12, 11, 1], [672, 410, 11, 15, 11, 1], [1, 7, 7, 6, 7, 6], [794, 767, 10, 11, 10, 1], [672, 565, 12, 9, 12, 3], [672, 616, 9, 9, 9, 3], [672, 667, 9, 9, 9, 3], [672, 716, 11, 12, 11, 1], [672, 767, 11, 12, 11, 1], [733, 2, 11, 14, 11, 1], [733, 57, 9, 7, 9, 5], [733, 109, 7, 10, 7, 6], [733, 160, 8, 10, 8, 6], [733, 206, 18, 12, 18, 1], [733, 256, 13, 13, 13, 0], [733, 307, 14, 13, 14, 0], [733, 358, 13, 13, 13, 0], [733, 409, 13, 13, 13, 0], [733, 460, 13, 13, 13, 0], [733, 511, 8, 13, 8, 0], [733, 562, 8, 13, 8, 0], [733, 613, 8, 13, 8, 0], [733, 664, 8, 13, 8, 0], [733, 715, 15, 13, 15, 0], [733, 766, 15, 13, 15, 0], [1, 7, 7, 6, 7, 6], [794, 52, 15, 13, 15, 0], [794, 103, 14, 13, 14, 0], [794, 154, 14, 13, 14, 0], [794, 205, 14, 13, 14, 0], [794, 259, 8, 10, 8, 3], [794, 308, 9, 11, 9, 1], [794, 359, 9, 11, 9, 1], [794, 411, 9, 10, 9, 2], [794, 461, 9, 11, 9, 1], [794, 512, 9, 11, 9, 1], [794, 563, 9, 11, 9, 1], [794, 619, 9, 10, 9, 6], [794, 665, 9, 11, 9, 1], [794, 721, 9, 10, 9, 6], [794, 767, 10, 11, 10, 1], [855, 2, 10, 11, 10, 1], [855, 53, 10, 11, 10, 1], [855, 104, 10, 11, 10, 1], [855, 155, 10, 11, 10, 1], [855, 206, 10, 11, 10, 1], [855, 257, 10, 11, 10, 1], [855, 308, 10, 11, 10, 1], [855, 359, 10, 11, 10, 1], [855, 410, 10, 11, 10, 1], [855, 461, 10, 11, 10, 1], [855, 512, 10, 11, 10, 1], [855, 563, 10, 11, 10, 1], [855, 614, 10, 11, 10, 1], [855, 665, 10, 11, 10, 1], [855, 716, 10, 11, 10, 1], [855, 767, 10, 11, 10, 1]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 6, 6, 6, 5], [1, 53, 7, 10, 7, 1], [1, 104, 7, 10, 7, 1], [1, 155, 11, 10, 11, 1], [1, 206, 11, 11, 11, 1], [1, 257, 15, 10, 15, 1], [1, 308, 12, 10, 12, 1], [1, 359, 6, 10, 6, 1], [1, 410, 8, 13, 8, 1], [1, 461, 8, 13, 8, 1], [1, 512, 9, 10, 9, 1], [1, 565, 11, 8, 11, 3], [1, 618, 7, 9, 7, 5], [1, 669, 8, 6, 8, 5], [1, 720, 6, 6, 6, 5], [1, 767, 7, 10, 7, 1], [62, 2, 11, 10, 11, 1], [62, 53, 11, 10, 11, 1], [62, 104, 11, 10, 11, 1], [62, 155, 11, 10, 11, 1], [62, 206, 11, 10, 11, 1], [62, 257, 11, 10, 11, 1], [62, 308, 11, 10, 11, 1], [62, 359, 11, 10, 11, 1], [62, 410, 11, 10, 11, 1], [62, 461, 11, 10, 11, 1], [62, 514, 6, 8, 6, 3], [62, 565, 6, 11, 6, 3], [62, 617, 11, 7, 11, 4], [62, 669, 10, 6, 10, 5], [62, 719, 11, 7, 11, 4], [62, 767, 11, 10, 11, 1], [123, 2, 17, 11, 17, 1], [123, 53, 12, 10, 12, 1], [123, 104, 12, 10, 12, 1], [123, 155, 13, 10, 13, 1], [123, 206, 13, 10, 13, 1], [123, 257, 12, 10, 12, 1], [123, 308, 12, 10, 12, 1], [123, 359, 14, 10, 14, 1], [123, 410, 13, 10, 13, 1], [123, 461, 7, 10, 7, 1], [123, 512, 9, 10, 9, 1], [123, 563, 12, 10, 12, 1], [123, 614, 11, 10, 11, 1], [123, 665, 15, 10, 15, 1], [123, 716, 13, 10, 13, 1], [123, 767, 14, 10, 14, 1], [184, 2, 12, 10, 12, 1], [184, 53, 14, 10, 14, 1], [184, 104, 13, 10, 13, 1], [184, 155, 12, 10, 12, 1], [184, 206, 12, 10, 12, 1], [184, 257, 13, 10, 13, 1], [184, 308, 12, 10, 12, 1], [184, 359, 16, 10, 16, 1], [184, 410, 12, 10, 12, 1], [184, 461, 12, 10, 12, 1], [184, 512, 12, 10, 12, 1], [184, 563, 7, 13, 7, 1], [184, 614, 7, 10, 7, 1], [184, 665, 7, 13, 7, 1], [184, 716, 9, 10, 9, 1], [184, 771, 11, 9, 11, 5], [245, 2, 7, 10, 7, 1], [245, 55, 11, 8, 11, 3], [245, 104, 11, 10, 11, 1], [245, 157, 10, 8, 10, 3], [245, 206, 11, 10, 11, 1], [245, 259, 11, 8, 11, 3], [245, 308, 7, 10, 7, 1], [245, 361, 11, 11, 11, 3], [245, 410, 11, 10, 11, 1], [245, 461, 6, 10, 6, 1], [245, 512, 6, 13, 6, 1], [245, 563, 10, 10, 10, 1], [245, 614, 6, 10, 6, 1], [245, 667, 15, 8, 15, 3], [245, 718, 11, 8, 11, 3], [245, 769, 11, 8, 11, 3], [306, 4, 11, 11, 11, 3], [306, 55, 11, 11, 11, 3], [306, 106, 8, 8, 8, 3], [306, 157, 10, 8, 10, 3], [306, 206, 7, 10, 7, 1], [306, 259, 11, 8, 11, 3], [306, 310, 10, 8, 10, 3], [306, 361, 13, 8, 13, 3], [306, 412, 10, 8, 10, 3], [306, 463, 10, 11, 10, 3], [306, 514, 10, 8, 10, 3], [306, 563, 8, 13, 8, 1], [306, 614, 6, 13, 6, 1], [306, 665, 8, 13, 8, 1], [306, 720, 10, 6, 10, 5], [306, 768, 10, 9, 10, 2], [367, 1, 12, 11, 12, 0], [367, 52, 12, 11, 12, 0], [367, 104, 13, 13, 13, 1], [367, 154, 12, 11, 12, 0], [367, 205, 13, 11, 13, 0], [367, 256, 14, 11, 14, 0], [367, 307, 13, 11, 13, 0], [367, 358, 11, 11, 11, 0], [367, 409, 11, 11, 11, 0], [367, 460, 11, 11, 11, 0], [367, 512, 11, 10, 11, 1], [367, 562, 11, 11, 11, 0], [367, 613, 11, 11, 11, 0], [367, 667, 10, 11, 10, 3], [367, 715, 11, 11, 11, 0], [367, 766, 11, 11, 11, 0], [428, 1, 11, 11, 11, 0], [428, 53, 11, 10, 11, 1], [428, 103, 7, 11, 7, 0], [428, 154, 7, 11, 7, 0], [428, 205, 7, 11, 7, 0], [428, 257, 7, 10, 7, 1], [428, 307, 10, 11, 10, 0], [428, 358, 11, 11, 11, 0], [428, 409, 11, 11, 11, 0], [428, 460, 10, 11, 10, 0], [428, 511, 10, 11, 10, 0], [428, 562, 10, 11, 10, 0], [428, 613, 11, 11, 11, 0], [428, 664, 11, 11, 11, 0], [428, 715, 11, 11, 11, 0], [428, 767, 11, 10, 11, 1], [489, 2, 10, 12, 10, 1], [489, 53, 8, 10, 8, 1], [489, 106, 10, 9, 10, 3], [489, 155, 11, 10, 11, 1], [489, 206, 11, 13, 11, 1], [489, 260, 8, 7, 8, 4], [489, 308, 11, 13, 11, 1], [489, 359, 12, 10, 12, 1], [489, 410, 14, 10, 14, 1], [489, 461, 14, 10, 14, 1], [489, 512, 15, 10, 15, 1], [489, 563, 8, 10, 8, 1], [489, 614, 8, 10, 8, 1], [489, 669, 11, 6, 11, 5], [489, 716, 17, 10, 17, 1], [489, 767, 14, 10, 14, 1], [550, 5, 13, 7, 13, 4], [550, 56, 11, 7, 11, 4], [550, 108, 11, 6, 11, 5], [550, 159, 11, 6, 11, 5], [550, 206, 11, 10, 11, 1], [550, 260, 11, 9, 11, 4], [550, 309, 10, 9, 10, 2], [550, 359, 13, 11, 13, 1], [550, 410, 15, 11, 15, 1], [550, 464, 11, 7, 11, 4], [550, 512, 7, 13, 7, 1], [550, 563, 8, 10, 8, 1], [550, 614, 8, 10, 8, 1], [550, 665, 14, 10, 14, 1], [550, 718, 15, 8, 15, 3], [550, 769, 12, 8, 12, 3], [611, 4, 10, 11, 10, 3], [611, 55, 7, 11, 7, 3], [611, 108, 13, 6, 13, 5], [611, 155, 11, 10, 11, 1], [611, 206, 10, 13, 10, 1], [611, 261, 11, 6, 11, 5], [611, 308, 12, 10, 12, 1], [611, 362, 11, 7, 11, 4], [611, 413, 11, 7, 11, 4], [611, 465, 17, 6, 17, 5], [611, 516, 11, 6, 11, 5], [611, 562, 12, 11, 12, 0], [611, 613, 12, 11, 12, 0], [611, 664, 14, 11, 14, 0], [611, 716, 17, 10, 17, 1], [611, 769, 16, 8, 16, 3], [672, 6, 11, 6, 11, 5], [672, 57, 17, 6, 17, 5], [672, 104, 8, 10, 8, 1], [672, 155, 8, 10, 8, 1], [672, 206, 6, 10, 6, 1], [672, 257, 6, 10, 6, 1], [672, 312, 11, 6, 11, 5], [672, 359, 10, 10, 10, 1], [672, 410, 10, 13, 10, 1], [1, 6, 6, 6, 6, 5], [794, 767, 9, 10, 9, 1], [672, 565, 11, 8, 11, 3], [672, 616, 8, 8, 8, 3], [672, 667, 8, 8, 8, 3], [672, 716, 10, 10, 10, 1], [672, 767, 10, 10, 10, 1], [733, 2, 10, 12, 10, 1], [733, 57, 8, 6, 8, 5], [733, 108, 6, 9, 6, 5], [733, 159, 7, 9, 7, 5], [733, 206, 17, 10, 17, 1], [733, 256, 12, 11, 12, 0], [733, 307, 13, 11, 13, 0], [733, 358, 12, 11, 12, 0], [733, 409, 12, 11, 12, 0], [733, 460, 12, 11, 12, 0], [733, 511, 7, 11, 7, 0], [733, 562, 7, 11, 7, 0], [733, 613, 7, 11, 7, 0], [733, 664, 7, 11, 7, 0], [733, 715, 14, 11, 14, 0], [733, 766, 14, 11, 14, 0], [1, 6, 6, 6, 6, 5], [794, 52, 14, 11, 14, 0], [794, 103, 13, 11, 13, 0], [794, 154, 13, 11, 13, 0], [794, 205, 13, 11, 13, 0], [794, 259, 7, 8, 7, 3], [794, 308, 8, 10, 8, 1], [794, 359, 8, 10, 8, 1], [794, 411, 8, 9, 8, 2], [794, 461, 8, 10, 8, 1], [794, 512, 8, 10, 8, 1], [794, 563, 8, 10, 8, 1], [794, 618, 8, 9, 8, 5], [794, 665, 8, 10, 8, 1], [794, 720, 8, 9, 8, 5], [794, 767, 9, 10, 9, 1], [855, 2, 9, 10, 9, 1], [855, 53, 9, 10, 9, 1], [855, 104, 9, 10, 9, 1], [855, 155, 9, 10, 9, 1], [855, 206, 9, 10, 9, 1], [855, 257, 9, 10, 9, 1], [855, 308, 9, 10, 9, 1], [855, 359, 9, 10, 9, 1], [855, 410, 9, 10, 9, 1], [855, 461, 9, 10, 9, 1], [855, 512, 9, 10, 9, 1], [855, 563, 9, 10, 9, 1], [855, 614, 9, 10, 9, 1], [855, 665, 9, 10, 9, 1], [855, 716, 9, 10, 9, 1], [855, 767, 9, 10, 9, 1]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 53, 16, 15, 11, 1], [1, 104, 17, 6, 12, 1], [1, 155, 21, 13, 16, 1], [1, 205, 21, 18, 16, 0], [1, 257, 24, 15, 22, 1], [1, 308, 21, 15, 18, 1], [1, 359, 15, 6, 10, 1], [1, 410, 17, 19, 12, 1], [1, 461, 16, 19, 12, 1], [1, 512, 17, 8, 13, 1], [1, 567, 18, 10, 17, 5], [1, 625, 10, 7, 11, 12], [1, 672, 14, 4, 12, 8], [1, 727, 10, 4, 11, 12], [1, 767, 16, 15, 11, 1], [62, 2, 20, 15, 16, 1], [62, 53, 19, 15, 16, 1], [62, 104, 19, 15, 16, 1], [62, 155, 19, 15, 16, 1], [62, 206, 20, 15, 16, 1], [62, 257, 21, 15, 16, 1], [62, 308, 20, 15, 16, 1], [62, 359, 21, 15, 16, 1], [62, 410, 20, 15, 16, 1], [62, 461, 20, 15, 16, 1], [62, 515, 15, 12, 11, 4], [62, 566, 15, 15, 11, 4], [62, 617, 21, 11, 17, 4], [62, 670, 20, 8, 17, 6], [62, 719, 19, 11, 17, 4], [62, 767, 20, 15, 16, 1], [123, 2, 28, 17, 24, 1], [123, 53, 19, 15, 18, 1], [123, 104, 22, 15, 18, 1], [123, 155, 24, 15, 19, 1], [123, 206, 23, 15, 19, 1], [123, 257, 23, 15, 18, 1], [123, 308, 22, 15, 17, 1], [123, 359, 24, 15, 20, 1], [123, 410, 24, 15, 19, 1], [123, 461, 16, 15, 11, 1], [123, 512, 20, 15, 15, 1], [123, 563, 23, 15, 18, 1], [123, 614, 16, 15, 16, 1], [123, 665, 26, 15, 21, 1], [123, 716, 24, 15, 19, 1], [123, 767, 24, 15, 20, 1], [184, 2, 23, 15, 18, 1], [184, 53, 24, 15, 20, 1], [184, 104, 24, 15, 19, 1], [184, 155, 22, 15, 18, 1], [184, 206, 22, 15, 17, 1], [184, 257, 24, 15, 19, 1], [184, 308, 23, 15, 18, 1], [184, 359, 28, 15, 23, 1], [184, 410, 23, 15, 18, 1], [184, 461, 23, 15, 18, 1], [184, 512, 22, 15, 17, 1], [184, 563, 16, 19, 11, 1], [184, 614, 15, 15, 11, 1], [184, 665, 16, 19, 11, 1], [184, 716, 18, 6, 14, 1], [184, 783, 15, 3, 16, 17], [245, 2, 17, 6, 12, 1], [245, 56, 18, 12, 16, 4], [245, 104, 19, 15, 16, 1], [245, 158, 19, 12, 15, 4], [245, 206, 21, 15, 16, 1], [245, 260, 19, 12, 16, 4], [245, 308, 16, 15, 11, 1], [245, 362, 20, 16, 16, 4], [245, 410, 19, 15, 16, 1], [245, 461, 15, 15, 10, 1], [245, 512, 15, 19, 10, 1], [245, 563, 20, 15, 15, 1], [245, 614, 15, 15, 10, 1], [245, 668, 23, 12, 21, 4], [245, 719, 19, 12, 16, 4], [245, 770, 19, 12, 16, 4], [306, 5, 19, 15, 16, 4], [306, 56, 20, 15, 16, 4], [306, 107, 17, 12, 12, 4], [306, 158, 19, 12, 15, 4], [306, 207, 15, 14, 11, 2], [306, 260, 20, 12, 16, 4], [306, 311, 19, 12, 15, 4], [306, 362, 23, 12, 19, 4], [306, 413, 19, 12, 15, 4], [306, 464, 20, 16, 15, 4], [306, 515, 19, 12, 15, 4], [306, 563, 17, 19, 12, 1], [306, 614, 16, 19, 11, 1], [306, 665, 16, 19, 12, 1], [306, 721, 19, 5, 17, 6], [306, 768, 19, 14, 15, 2], [367, 1, 22, 16, 18, 0], [367, 52, 21, 16, 18, 0], [367, 104, 24, 18, 19, 1], [367, 154, 22, 16, 18, 0], [367, 205, 24, 16, 19, 0], [367, 256, 24, 16, 20, 0], [367, 307, 24, 16, 19, 0], [367, 358, 20, 16, 16, 0], [367, 409, 18, 16, 16, 0], [367, 460, 19, 16, 16, 0], [367, 512, 20, 15, 16, 1], [367, 563, 20, 15, 16, 1], [367, 613, 19, 16, 16, 0], [367, 668, 19, 15, 15, 4], [367, 715, 20, 16, 16, 0], [367, 766, 19, 16, 16, 0], [428, 1, 20, 16, 16, 0], [428, 53, 21, 15, 16, 1], [428, 103, 16, 16, 11, 0], [428, 154, 16, 16, 11, 0], [428, 205, 17, 16, 12, 0], [428, 257, 16, 15, 11, 1], [428, 308, 21, 15, 16, 1], [428, 358, 20, 16, 16, 0], [428, 409, 19, 16, 16, 0], [428, 460, 20, 16, 16, 0], [428, 512, 20, 15, 16, 1], [428, 563, 20, 15, 16, 1], [428, 613, 21, 16, 16, 0], [428, 664, 20, 16, 16, 0], [428, 715, 20, 16, 16, 0], [428, 767, 21, 15, 16, 1], [489, 2, 20, 18, 16, 1], [489, 53, 16, 6, 12, 1], [489, 106, 19, 14, 16, 3], [489, 155, 20, 15, 16, 1], [489, 206, 19, 19, 16, 1], [489, 262, 15, 7, 12, 6], [489, 308, 21, 18, 16, 1], [489, 359, 21, 15, 17, 1], [489, 411, 23, 14, 20, 2], [489, 462, 23, 14, 20, 2], [489, 513, 27, 8, 22, 2], [489, 563, 17, 5, 12, 1], [489, 614, 17, 4, 12, 1], [489, 669, 19, 11, 16, 5], [489, 716, 29, 15, 24, 1], [489, 767, 25, 15, 20, 1], [550, 7, 22, 7, 19, 6], [550, 57, 17, 11, 16, 5], [550, 109, 19, 10, 16, 6], [550, 160, 18, 10, 16, 6], [550, 206, 22, 15, 17, 1], [550, 262, 17, 13, 16, 6], [550, 309, 19, 14, 15, 2], [550, 360, 23, 15, 19, 2], [550, 411, 26, 15, 21, 2], [550, 466, 18, 10, 15, 6], [550, 512, 16, 19, 11, 1], [550, 563, 16, 9, 12, 1], [550, 614, 16, 9, 12, 1], [550, 666, 24, 14, 20, 2], [550, 719, 25, 12, 22, 4], [550, 770, 20, 12, 17, 4], [611, 5, 17, 16, 17, 4], [611, 56, 15, 16, 12, 4], [611, 111, 20, 7, 19, 8], [611, 156, 21, 14, 16, 2], [611, 206, 20, 19, 15, 1], [611, 264, 18, 7, 16, 8], [611, 309, 18, 14, 17, 2], [611, 365, 19, 7, 16, 7], [611, 416, 18, 7, 16, 7], [611, 472, 23, 4, 24, 12], [611, 511, 1, 1, 16, 1], [611, 562, 19, 16, 18, 0], [611, 613, 22, 16, 18, 0], [611, 664, 24, 16, 20, 0], [611, 716, 29, 15, 24, 1], [611, 770, 25, 12, 23, 4], [672, 9, 17, 4, 16, 8], [672, 60, 26, 4, 24, 8], [672, 104, 17, 7, 12, 1], [672, 155, 17, 7, 12, 1], [672, 206, 15, 7, 10, 1], [672, 257, 15, 7, 10, 1], [672, 312, 19, 10, 16, 5], [672, 360, 19, 14, 15, 2], [672, 410, 20, 19, 15, 1], [1, 1, 1, 1, 10, 1], [794, 767, 17, 5, 12, 1], [672, 566, 20, 11, 16, 4], [672, 620, 15, 7, 12, 7], [672, 671, 14, 7, 12, 7], [672, 716, 21, 15, 16, 1], [672, 767, 21, 15, 16, 1], [733, 2, 20, 19, 16, 1], [733, 59, 13, 4, 12, 7], [733, 115, 10, 7, 10, 12], [733, 166, 13, 7, 14, 12], [733, 206, 25, 15, 24, 1], [733, 256, 21, 16, 18, 0], [733, 307, 22, 16, 18, 0], [733, 358, 21, 16, 18, 0], [733, 409, 22, 16, 18, 0], [733, 460, 22, 16, 18, 0], [733, 511, 16, 16, 11, 0], [733, 562, 16, 16, 11, 0], [733, 613, 16, 16, 11, 0], [733, 664, 16, 16, 11, 0], [733, 715, 24, 16, 20, 0], [733, 766, 24, 16, 20, 0], [1, 1, 1, 1, 10, 1], [794, 52, 24, 16, 20, 0], [794, 103, 24, 16, 19, 0], [794, 154, 24, 16, 19, 0], [794, 205, 24, 16, 19, 0], [794, 260, 14, 12, 10, 4], [794, 308, 17, 5, 12, 1], [794, 359, 17, 4, 12, 1], [794, 410, 17, 4, 12, 1], [794, 461, 17, 5, 12, 1], [794, 512, 17, 4, 12, 1], [794, 563, 17, 6, 12, 1], [794, 625, 11, 8, 12, 12], [794, 665, 17, 5, 12, 1], [794, 728, 10, 7, 12, 13], [794, 767, 17, 5, 12, 1], [855, 2, 17, 5, 12, 1], [855, 53, 17, 5, 12, 1], [855, 104, 17, 5, 12, 1], [855, 155, 17, 5, 12, 1], [855, 206, 17, 5, 12, 1], [855, 257, 17, 5, 12, 1], [855, 308, 17, 5, 12, 1], [855, 359, 17, 5, 12, 1], [855, 410, 17, 5, 12, 1], [855, 461, 17, 5, 12, 1], [855, 512, 17, 5, 12, 1], [855, 563, 17, 5, 12, 1], [855, 614, 17, 5, 12, 1], [855, 665, 17, 5, 12, 1], [855, 716, 17, 5, 12, 1], [855, 767, 17, 5, 12, 1]], \"capHeight\": 15, \"widestlogicalchar\": 24, \"widestglyph\": 29, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 53, 15, 13, 9, 1], [1, 104, 16, 4, 10, 1], [1, 155, 20, 11, 14, 1], [1, 205, 20, 16, 14, 0], [1, 257, 23, 13, 20, 1], [1, 308, 20, 13, 16, 1], [1, 359, 14, 4, 8, 1], [1, 410, 16, 17, 10, 1], [1, 461, 15, 17, 10, 1], [1, 512, 16, 6, 11, 1], [1, 567, 17, 8, 15, 5], [1, 625, 9, 5, 9, 12], [1, 672, 13, 2, 10, 8], [1, 727, 9, 2, 9, 12], [1, 767, 15, 13, 9, 1], [62, 2, 19, 13, 14, 1], [62, 53, 18, 13, 14, 1], [62, 104, 18, 13, 14, 1], [62, 155, 18, 13, 14, 1], [62, 206, 19, 13, 14, 1], [62, 257, 20, 13, 14, 1], [62, 308, 19, 13, 14, 1], [62, 359, 20, 13, 14, 1], [62, 410, 19, 13, 14, 1], [62, 461, 19, 13, 14, 1], [62, 515, 14, 10, 9, 4], [62, 566, 14, 13, 9, 4], [62, 617, 20, 9, 15, 4], [62, 670, 19, 6, 15, 6], [62, 719, 18, 9, 15, 4], [62, 767, 19, 13, 14, 1], [123, 2, 27, 15, 22, 1], [123, 53, 18, 13, 16, 1], [123, 104, 21, 13, 16, 1], [123, 155, 23, 13, 17, 1], [123, 206, 22, 13, 17, 1], [123, 257, 22, 13, 16, 1], [123, 308, 21, 13, 15, 1], [123, 359, 23, 13, 18, 1], [123, 410, 23, 13, 17, 1], [123, 461, 15, 13, 9, 1], [123, 512, 19, 13, 13, 1], [123, 563, 22, 13, 16, 1], [123, 614, 15, 13, 14, 1], [123, 665, 25, 13, 19, 1], [123, 716, 23, 13, 17, 1], [123, 767, 23, 13, 18, 1], [184, 2, 22, 13, 16, 1], [184, 53, 23, 13, 18, 1], [184, 104, 23, 13, 17, 1], [184, 155, 21, 13, 16, 1], [184, 206, 21, 13, 15, 1], [184, 257, 23, 13, 17, 1], [184, 308, 22, 13, 16, 1], [184, 359, 27, 13, 21, 1], [184, 410, 22, 13, 16, 1], [184, 461, 22, 13, 16, 1], [184, 512, 21, 13, 15, 1], [184, 563, 15, 17, 9, 1], [184, 614, 14, 13, 9, 1], [184, 665, 15, 17, 9, 1], [184, 716, 17, 4, 12, 1], [184, 783, 14, 1, 14, 17], [245, 2, 16, 4, 10, 1], [245, 56, 17, 10, 14, 4], [245, 104, 18, 13, 14, 1], [245, 158, 18, 10, 13, 4], [245, 206, 20, 13, 14, 1], [245, 260, 18, 10, 14, 4], [245, 308, 15, 13, 9, 1], [245, 362, 19, 14, 14, 4], [245, 410, 18, 13, 14, 1], [245, 461, 14, 13, 8, 1], [245, 512, 14, 17, 8, 1], [245, 563, 19, 13, 13, 1], [245, 614, 14, 13, 8, 1], [245, 668, 22, 10, 19, 4], [245, 719, 18, 10, 14, 4], [245, 770, 18, 10, 14, 4], [306, 5, 18, 13, 14, 4], [306, 56, 19, 13, 14, 4], [306, 107, 16, 10, 10, 4], [306, 158, 18, 10, 13, 4], [306, 207, 14, 12, 9, 2], [306, 260, 19, 10, 14, 4], [306, 311, 18, 10, 13, 4], [306, 362, 22, 10, 17, 4], [306, 413, 18, 10, 13, 4], [306, 464, 19, 14, 13, 4], [306, 515, 18, 10, 13, 4], [306, 563, 16, 17, 10, 1], [306, 614, 15, 17, 9, 1], [306, 665, 15, 17, 10, 1], [306, 721, 18, 3, 15, 6], [306, 768, 18, 12, 13, 2], [367, 1, 21, 14, 16, 0], [367, 52, 20, 14, 16, 0], [367, 104, 23, 16, 17, 1], [367, 154, 21, 14, 16, 0], [367, 205, 23, 14, 17, 0], [367, 256, 23, 14, 18, 0], [367, 307, 23, 14, 17, 0], [367, 358, 18, 14, 14, 0], [367, 409, 17, 14, 14, 0], [367, 460, 18, 14, 14, 0], [367, 512, 19, 13, 14, 1], [367, 563, 19, 13, 14, 1], [367, 613, 18, 14, 14, 0], [367, 668, 18, 13, 13, 4], [367, 715, 18, 14, 14, 0], [367, 766, 18, 14, 14, 0], [428, 1, 19, 14, 14, 0], [428, 53, 20, 13, 14, 1], [428, 103, 15, 14, 9, 0], [428, 154, 15, 14, 9, 0], [428, 205, 16, 14, 10, 0], [428, 257, 15, 13, 9, 1], [428, 308, 20, 13, 14, 1], [428, 358, 18, 14, 14, 0], [428, 409, 18, 14, 14, 0], [428, 460, 19, 14, 14, 0], [428, 512, 19, 13, 14, 1], [428, 563, 19, 13, 14, 1], [428, 613, 19, 14, 14, 0], [428, 664, 19, 14, 14, 0], [428, 715, 19, 14, 14, 0], [428, 767, 20, 13, 14, 1], [489, 2, 19, 16, 14, 1], [489, 53, 15, 4, 10, 1], [489, 106, 18, 12, 14, 3], [489, 155, 19, 13, 14, 1], [489, 206, 18, 17, 14, 1], [489, 262, 14, 5, 10, 6], [489, 308, 20, 16, 14, 1], [489, 359, 20, 13, 15, 1], [489, 411, 22, 12, 18, 2], [489, 462, 22, 12, 18, 2], [489, 513, 26, 6, 20, 2], [489, 563, 16, 3, 10, 1], [489, 614, 16, 2, 10, 1], [489, 669, 18, 9, 14, 5], [489, 716, 28, 13, 22, 1], [489, 767, 24, 13, 18, 1], [550, 7, 21, 5, 17, 6], [550, 57, 16, 9, 14, 5], [550, 109, 18, 8, 14, 6], [550, 160, 17, 8, 14, 6], [550, 206, 21, 13, 15, 1], [550, 262, 16, 11, 14, 6], [550, 309, 18, 12, 13, 2], [550, 360, 22, 13, 17, 2], [550, 411, 25, 13, 19, 2], [550, 466, 17, 8, 13, 6], [550, 512, 15, 17, 9, 1], [550, 563, 15, 7, 10, 1], [550, 614, 15, 7, 10, 1], [550, 666, 23, 12, 18, 2], [550, 719, 24, 10, 20, 4], [550, 770, 19, 10, 15, 4], [611, 5, 16, 14, 15, 4], [611, 56, 14, 14, 10, 4], [611, 111, 19, 5, 17, 8], [611, 156, 20, 12, 14, 2], [611, 206, 19, 17, 13, 1], [611, 264, 17, 5, 14, 8], [611, 309, 17, 12, 15, 2], [611, 365, 18, 5, 14, 7], [611, 416, 17, 5, 14, 7], [611, 472, 22, 2, 22, 12], [611, 511, 1, 1, 14, 1], [611, 562, 18, 14, 16, 0], [611, 613, 20, 14, 16, 0], [611, 664, 23, 14, 18, 0], [611, 716, 28, 13, 22, 1], [611, 770, 24, 10, 21, 4], [672, 9, 16, 2, 14, 8], [672, 60, 25, 2, 22, 8], [672, 104, 16, 5, 10, 1], [672, 155, 16, 5, 10, 1], [672, 206, 14, 5, 8, 1], [672, 257, 14, 5, 8, 1], [672, 312, 18, 8, 14, 5], [672, 360, 18, 12, 13, 2], [672, 410, 19, 17, 13, 1], [1, 1, 1, 1, 8, 1], [794, 767, 16, 3, 10, 1], [672, 566, 19, 9, 14, 4], [672, 620, 14, 5, 10, 7], [672, 671, 13, 5, 10, 7], [672, 716, 20, 13, 14, 1], [672, 767, 20, 13, 14, 1], [733, 2, 19, 17, 14, 1], [733, 59, 12, 2, 10, 7], [733, 115, 9, 5, 8, 12], [733, 166, 12, 5, 12, 12], [733, 206, 24, 13, 22, 1], [733, 256, 20, 14, 16, 0], [733, 307, 21, 14, 16, 0], [733, 358, 19, 14, 16, 0], [733, 409, 21, 14, 16, 0], [733, 460, 21, 14, 16, 0], [733, 511, 15, 14, 9, 0], [733, 562, 15, 14, 9, 0], [733, 613, 15, 14, 9, 0], [733, 664, 15, 14, 9, 0], [733, 715, 23, 14, 18, 0], [733, 766, 23, 14, 18, 0], [1, 1, 1, 1, 8, 1], [794, 52, 23, 14, 18, 0], [794, 103, 23, 14, 17, 0], [794, 154, 23, 14, 17, 0], [794, 205, 23, 14, 17, 0], [794, 260, 13, 10, 8, 4], [794, 308, 16, 3, 10, 1], [794, 359, 16, 2, 10, 1], [794, 410, 16, 2, 10, 1], [794, 461, 16, 3, 10, 1], [794, 512, 16, 2, 10, 1], [794, 563, 16, 4, 10, 1], [794, 625, 10, 6, 10, 12], [794, 665, 16, 3, 10, 1], [794, 728, 9, 5, 10, 13], [794, 767, 16, 3, 10, 1], [855, 2, 16, 3, 10, 1], [855, 53, 16, 3, 10, 1], [855, 104, 16, 3, 10, 1], [855, 155, 16, 3, 10, 1], [855, 206, 16, 3, 10, 1], [855, 257, 16, 3, 10, 1], [855, 308, 16, 3, 10, 1], [855, 359, 16, 3, 10, 1], [855, 410, 16, 3, 10, 1], [855, 461, 16, 3, 10, 1], [855, 512, 16, 3, 10, 1], [855, 563, 16, 3, 10, 1], [855, 614, 16, 3, 10, 1], [855, 665, 16, 3, 10, 1], [855, 716, 16, 3, 10, 1], [855, 767, 16, 3, 10, 1]], \"capHeight\": 14, \"widestlogicalchar\": 22, \"widestglyph\": 28, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 10, 6, 10, 9], [1, 53, 11, 15, 11, 1], [1, 104, 12, 14, 12, 1], [1, 155, 16, 14, 16, 1], [1, 205, 16, 18, 16, 0], [1, 257, 22, 15, 22, 1], [1, 308, 18, 15, 18, 1], [1, 359, 10, 14, 10, 1], [1, 410, 12, 19, 12, 1], [1, 461, 12, 19, 12, 1], [1, 512, 13, 14, 13, 1], [1, 567, 17, 10, 17, 5], [1, 622, 11, 10, 11, 9], [1, 672, 12, 7, 12, 8], [1, 724, 11, 7, 11, 9], [1, 767, 11, 15, 11, 1], [62, 2, 16, 15, 16, 1], [62, 53, 16, 15, 16, 1], [62, 104, 16, 15, 16, 1], [62, 155, 16, 15, 16, 1], [62, 206, 16, 15, 16, 1], [62, 257, 16, 15, 16, 1], [62, 308, 16, 15, 16, 1], [62, 359, 16, 15, 16, 1], [62, 410, 16, 15, 16, 1], [62, 461, 16, 15, 16, 1], [62, 515, 11, 12, 11, 4], [62, 566, 11, 15, 11, 4], [62, 617, 17, 11, 17, 4], [62, 670, 17, 9, 17, 6], [62, 719, 17, 11, 17, 4], [62, 767, 16, 15, 16, 1], [123, 2, 24, 17, 24, 1], [123, 53, 18, 15, 18, 1], [123, 104, 18, 15, 18, 1], [123, 155, 19, 15, 19, 1], [123, 206, 19, 15, 19, 1], [123, 257, 18, 15, 18, 1], [123, 308, 17, 15, 17, 1], [123, 359, 20, 15, 20, 1], [123, 410, 19, 15, 19, 1], [123, 461, 11, 15, 11, 1], [123, 512, 15, 15, 15, 1], [123, 563, 18, 15, 18, 1], [123, 614, 16, 15, 16, 1], [123, 665, 21, 15, 21, 1], [123, 716, 19, 15, 19, 1], [123, 767, 20, 15, 20, 1], [184, 2, 18, 15, 18, 1], [184, 53, 20, 15, 20, 1], [184, 104, 19, 15, 19, 1], [184, 155, 18, 15, 18, 1], [184, 206, 17, 15, 17, 1], [184, 257, 19, 15, 19, 1], [184, 308, 18, 15, 18, 1], [184, 359, 23, 15, 23, 1], [184, 410, 18, 15, 18, 1], [184, 461, 18, 15, 18, 1], [184, 512, 17, 15, 17, 1], [184, 563, 11, 19, 11, 1], [184, 614, 11, 15, 11, 1], [184, 665, 11, 19, 11, 1], [184, 716, 14, 14, 14, 1], [184, 775, 16, 11, 16, 9], [245, 2, 12, 14, 12, 1], [245, 56, 16, 12, 16, 4], [245, 104, 16, 15, 16, 1], [245, 158, 15, 12, 15, 4], [245, 206, 16, 15, 16, 1], [245, 260, 16, 12, 16, 4], [245, 308, 11, 15, 11, 1], [245, 362, 16, 16, 16, 4], [245, 410, 16, 15, 16, 1], [245, 461, 10, 15, 10, 1], [245, 512, 10, 19, 10, 1], [245, 563, 15, 15, 15, 1], [245, 614, 10, 15, 10, 1], [245, 668, 21, 12, 21, 4], [245, 719, 16, 12, 16, 4], [245, 770, 16, 12, 16, 4], [306, 5, 16, 15, 16, 4], [306, 56, 16, 15, 16, 4], [306, 107, 12, 12, 12, 4], [306, 158, 15, 12, 15, 4], [306, 207, 11, 14, 11, 2], [306, 260, 16, 12, 16, 4], [306, 311, 15, 12, 15, 4], [306, 362, 19, 12, 19, 4], [306, 413, 15, 12, 15, 4], [306, 464, 15, 16, 15, 4], [306, 515, 15, 12, 15, 4], [306, 563, 12, 19, 12, 1], [306, 614, 11, 19, 11, 1], [306, 665, 12, 19, 12, 1], [306, 721, 17, 9, 17, 6], [306, 768, 15, 14, 15, 2], [367, 1, 18, 16, 18, 0], [367, 52, 18, 16, 18, 0], [367, 104, 19, 18, 19, 1], [367, 154, 18, 16, 18, 0], [367, 205, 19, 16, 19, 0], [367, 256, 20, 16, 20, 0], [367, 307, 19, 16, 19, 0], [367, 358, 16, 16, 16, 0], [367, 409, 16, 16, 16, 0], [367, 460, 16, 16, 16, 0], [367, 512, 16, 15, 16, 1], [367, 563, 16, 15, 16, 1], [367, 613, 16, 16, 16, 0], [367, 668, 15, 15, 15, 4], [367, 715, 16, 16, 16, 0], [367, 766, 16, 16, 16, 0], [428, 1, 16, 16, 16, 0], [428, 53, 16, 15, 16, 1], [428, 103, 11, 16, 11, 0], [428, 154, 11, 16, 11, 0], [428, 205, 12, 16, 12, 0], [428, 257, 11, 15, 11, 1], [428, 308, 16, 15, 16, 1], [428, 358, 16, 16, 16, 0], [428, 409, 16, 16, 16, 0], [428, 460, 16, 16, 16, 0], [428, 512, 16, 15, 16, 1], [428, 563, 16, 15, 16, 1], [428, 613, 16, 16, 16, 0], [428, 664, 16, 16, 16, 0], [428, 715, 16, 16, 16, 0], [428, 767, 16, 15, 16, 1], [489, 2, 16, 18, 16, 1], [489, 53, 12, 14, 12, 1], [489, 106, 16, 14, 16, 3], [489, 155, 16, 15, 16, 1], [489, 206, 16, 19, 16, 1], [489, 262, 12, 9, 12, 6], [489, 308, 16, 18, 16, 1], [489, 359, 17, 15, 17, 1], [489, 411, 20, 14, 20, 2], [489, 462, 20, 14, 20, 2], [489, 513, 22, 13, 22, 2], [489, 563, 12, 14, 12, 1], [489, 614, 12, 14, 12, 1], [489, 669, 16, 11, 16, 5], [489, 716, 24, 15, 24, 1], [489, 767, 20, 15, 20, 1], [550, 7, 19, 9, 19, 6], [550, 57, 16, 11, 16, 5], [550, 109, 16, 10, 16, 6], [550, 160, 16, 10, 16, 6], [550, 206, 17, 15, 17, 1], [550, 262, 16, 13, 16, 6], [550, 309, 15, 14, 15, 2], [550, 360, 19, 15, 19, 2], [550, 411, 21, 15, 21, 2], [550, 466, 15, 10, 15, 6], [550, 512, 11, 19, 11, 1], [550, 563, 12, 14, 12, 1], [550, 614, 12, 14, 12, 1], [550, 666, 20, 14, 20, 2], [550, 719, 22, 12, 22, 4], [550, 770, 17, 12, 17, 4], [611, 5, 17, 16, 17, 4], [611, 56, 12, 16, 12, 4], [611, 111, 19, 7, 19, 8], [611, 156, 16, 14, 16, 2], [611, 206, 15, 19, 15, 1], [611, 264, 16, 7, 16, 8], [611, 309, 17, 14, 17, 2], [611, 365, 16, 8, 16, 7], [611, 416, 16, 8, 16, 7], [611, 469, 24, 7, 24, 9], [611, 520, 16, 6, 16, 9], [611, 562, 18, 16, 18, 0], [611, 613, 18, 16, 18, 0], [611, 664, 20, 16, 20, 0], [611, 716, 24, 15, 24, 1], [611, 770, 23, 12, 23, 4], [672, 9, 16, 7, 16, 8], [672, 60, 24, 7, 24, 8], [672, 104, 12, 14, 12, 1], [672, 155, 12, 14, 12, 1], [672, 206, 10, 14, 10, 1], [672, 257, 10, 14, 10, 1], [672, 312, 16, 10, 16, 5], [672, 360, 15, 14, 15, 2], [672, 410, 15, 19, 15, 1], [1, 10, 10, 6, 10, 9], [794, 767, 12, 14, 12, 1], [672, 566, 16, 11, 16, 4], [672, 620, 12, 8, 12, 7], [672, 671, 12, 8, 12, 7], [672, 716, 16, 15, 16, 1], [672, 767, 16, 15, 16, 1], [733, 2, 16, 19, 16, 1], [733, 59, 12, 8, 12, 7], [733, 112, 10, 10, 10, 9], [733, 163, 14, 10, 14, 9], [733, 206, 24, 15, 24, 1], [733, 256, 18, 16, 18, 0], [733, 307, 18, 16, 18, 0], [733, 358, 18, 16, 18, 0], [733, 409, 18, 16, 18, 0], [733, 460, 18, 16, 18, 0], [733, 511, 11, 16, 11, 0], [733, 562, 11, 16, 11, 0], [733, 613, 11, 16, 11, 0], [733, 664, 11, 16, 11, 0], [733, 715, 20, 16, 20, 0], [733, 766, 20, 16, 20, 0], [1, 10, 10, 6, 10, 9], [794, 52, 20, 16, 20, 0], [794, 103, 19, 16, 19, 0], [794, 154, 19, 16, 19, 0], [794, 205, 19, 16, 19, 0], [794, 260, 10, 12, 10, 4], [794, 308, 12, 14, 12, 1], [794, 359, 12, 14, 12, 1], [794, 410, 12, 14, 12, 1], [794, 461, 12, 14, 12, 1], [794, 512, 12, 14, 12, 1], [794, 563, 12, 14, 12, 1], [794, 622, 12, 11, 12, 9], [794, 665, 12, 14, 12, 1], [794, 724, 12, 11, 12, 9], [794, 767, 12, 14, 12, 1], [855, 2, 12, 14, 12, 1], [855, 53, 12, 14, 12, 1], [855, 104, 12, 14, 12, 1], [855, 155, 12, 14, 12, 1], [855, 206, 12, 14, 12, 1], [855, 257, 12, 14, 12, 1], [855, 308, 12, 14, 12, 1], [855, 359, 12, 14, 12, 1], [855, 410, 12, 14, 12, 1], [855, 461, 12, 14, 12, 1], [855, 512, 12, 14, 12, 1], [855, 563, 12, 14, 12, 1], [855, 614, 12, 14, 12, 1], [855, 665, 12, 14, 12, 1], [855, 716, 12, 14, 12, 1], [855, 767, 12, 14, 12, 1]], \"widestlogicalchar\": 24, \"widestglyph\": 24, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 8, 6, 8, 8], [1, 53, 9, 13, 9, 1], [1, 104, 10, 13, 10, 1], [1, 155, 14, 13, 14, 1], [1, 205, 14, 16, 14, 0], [1, 257, 20, 13, 20, 1], [1, 308, 16, 13, 16, 1], [1, 359, 8, 13, 8, 1], [1, 410, 10, 17, 10, 1], [1, 461, 10, 17, 10, 1], [1, 512, 11, 13, 11, 1], [1, 567, 15, 9, 15, 5], [1, 621, 9, 9, 9, 8], [1, 672, 10, 6, 10, 8], [1, 723, 9, 6, 9, 8], [1, 767, 9, 13, 9, 1], [62, 2, 14, 13, 14, 1], [62, 53, 14, 13, 14, 1], [62, 104, 14, 13, 14, 1], [62, 155, 14, 13, 14, 1], [62, 206, 14, 13, 14, 1], [62, 257, 14, 13, 14, 1], [62, 308, 14, 13, 14, 1], [62, 359, 14, 13, 14, 1], [62, 410, 14, 13, 14, 1], [62, 461, 14, 13, 14, 1], [62, 515, 9, 10, 9, 4], [62, 566, 9, 13, 9, 4], [62, 617, 15, 10, 15, 4], [62, 670, 15, 8, 15, 6], [62, 719, 15, 10, 15, 4], [62, 767, 14, 13, 14, 1], [123, 2, 22, 15, 22, 1], [123, 53, 16, 13, 16, 1], [123, 104, 16, 13, 16, 1], [123, 155, 17, 13, 17, 1], [123, 206, 17, 13, 17, 1], [123, 257, 16, 13, 16, 1], [123, 308, 15, 13, 15, 1], [123, 359, 18, 13, 18, 1], [123, 410, 17, 13, 17, 1], [123, 461, 9, 13, 9, 1], [123, 512, 13, 13, 13, 1], [123, 563, 16, 13, 16, 1], [123, 614, 14, 13, 14, 1], [123, 665, 19, 13, 19, 1], [123, 716, 17, 13, 17, 1], [123, 767, 18, 13, 18, 1], [184, 2, 16, 13, 16, 1], [184, 53, 18, 13, 18, 1], [184, 104, 17, 13, 17, 1], [184, 155, 16, 13, 16, 1], [184, 206, 15, 13, 15, 1], [184, 257, 17, 13, 17, 1], [184, 308, 16, 13, 16, 1], [184, 359, 21, 13, 21, 1], [184, 410, 16, 13, 16, 1], [184, 461, 16, 13, 16, 1], [184, 512, 15, 13, 15, 1], [184, 563, 9, 17, 9, 1], [184, 614, 9, 13, 9, 1], [184, 665, 9, 17, 9, 1], [184, 716, 12, 13, 12, 1], [184, 774, 14, 10, 14, 8], [245, 2, 10, 13, 10, 1], [245, 56, 14, 10, 14, 4], [245, 104, 14, 13, 14, 1], [245, 158, 13, 10, 13, 4], [245, 206, 14, 13, 14, 1], [245, 260, 14, 10, 14, 4], [245, 308, 9, 13, 9, 1], [245, 362, 14, 14, 14, 4], [245, 410, 14, 13, 14, 1], [245, 461, 8, 13, 8, 1], [245, 512, 8, 17, 8, 1], [245, 563, 13, 13, 13, 1], [245, 614, 8, 13, 8, 1], [245, 668, 19, 10, 19, 4], [245, 719, 14, 10, 14, 4], [245, 770, 14, 10, 14, 4], [306, 5, 14, 13, 14, 4], [306, 56, 14, 13, 14, 4], [306, 107, 10, 10, 10, 4], [306, 158, 13, 10, 13, 4], [306, 207, 9, 12, 9, 2], [306, 260, 14, 10, 14, 4], [306, 311, 13, 10, 13, 4], [306, 362, 17, 10, 17, 4], [306, 413, 13, 10, 13, 4], [306, 464, 13, 14, 13, 4], [306, 515, 13, 10, 13, 4], [306, 563, 10, 17, 10, 1], [306, 614, 9, 17, 9, 1], [306, 665, 10, 17, 10, 1], [306, 721, 15, 8, 15, 6], [306, 768, 13, 12, 13, 2], [367, 1, 16, 14, 16, 0], [367, 52, 16, 14, 16, 0], [367, 104, 17, 16, 17, 1], [367, 154, 16, 14, 16, 0], [367, 205, 17, 14, 17, 0], [367, 256, 18, 14, 18, 0], [367, 307, 17, 14, 17, 0], [367, 358, 14, 14, 14, 0], [367, 409, 14, 14, 14, 0], [367, 460, 14, 14, 14, 0], [367, 512, 14, 13, 14, 1], [367, 563, 14, 13, 14, 1], [367, 613, 14, 14, 14, 0], [367, 668, 13, 13, 13, 4], [367, 715, 14, 14, 14, 0], [367, 766, 14, 14, 14, 0], [428, 1, 14, 14, 14, 0], [428, 53, 14, 13, 14, 1], [428, 103, 9, 14, 9, 0], [428, 154, 9, 14, 9, 0], [428, 205, 10, 14, 10, 0], [428, 257, 9, 13, 9, 1], [428, 308, 14, 13, 14, 1], [428, 358, 14, 14, 14, 0], [428, 409, 14, 14, 14, 0], [428, 460, 14, 14, 14, 0], [428, 512, 14, 13, 14, 1], [428, 563, 14, 13, 14, 1], [428, 613, 14, 14, 14, 0], [428, 664, 14, 14, 14, 0], [428, 715, 14, 14, 14, 0], [428, 767, 14, 13, 14, 1], [489, 2, 14, 16, 14, 1], [489, 53, 10, 13, 10, 1], [489, 106, 14, 12, 14, 3], [489, 155, 14, 13, 14, 1], [489, 206, 14, 17, 14, 1], [489, 262, 10, 8, 10, 6], [489, 308, 14, 16, 14, 1], [489, 359, 15, 13, 15, 1], [489, 411, 18, 12, 18, 2], [489, 462, 18, 12, 18, 2], [489, 513, 20, 12, 20, 2], [489, 563, 10, 13, 10, 1], [489, 614, 10, 13, 10, 1], [489, 669, 14, 9, 14, 5], [489, 716, 22, 13, 22, 1], [489, 767, 18, 13, 18, 1], [550, 7, 17, 8, 17, 6], [550, 57, 14, 9, 14, 5], [550, 109, 14, 8, 14, 6], [550, 160, 14, 8, 14, 6], [550, 206, 15, 13, 15, 1], [550, 262, 14, 11, 14, 6], [550, 309, 13, 12, 13, 2], [550, 360, 17, 13, 17, 2], [550, 411, 19, 13, 19, 2], [550, 466, 13, 8, 13, 6], [550, 512, 9, 17, 9, 1], [550, 563, 10, 13, 10, 1], [550, 614, 10, 13, 10, 1], [550, 666, 18, 12, 18, 2], [550, 719, 20, 10, 20, 4], [550, 770, 15, 10, 15, 4], [611, 5, 15, 14, 15, 4], [611, 56, 10, 14, 10, 4], [611, 111, 17, 6, 17, 8], [611, 156, 14, 12, 14, 2], [611, 206, 13, 17, 13, 1], [611, 264, 14, 6, 14, 8], [611, 309, 15, 12, 15, 2], [611, 365, 14, 7, 14, 7], [611, 416, 14, 7, 14, 7], [611, 468, 22, 6, 22, 8], [611, 519, 14, 6, 14, 8], [611, 562, 16, 14, 16, 0], [611, 613, 16, 14, 16, 0], [611, 664, 18, 14, 18, 0], [611, 716, 22, 13, 22, 1], [611, 770, 21, 10, 21, 4], [672, 9, 14, 6, 14, 8], [672, 60, 22, 6, 22, 8], [672, 104, 10, 13, 10, 1], [672, 155, 10, 13, 10, 1], [672, 206, 8, 13, 8, 1], [672, 257, 8, 13, 8, 1], [672, 312, 14, 9, 14, 5], [672, 360, 13, 12, 13, 2], [672, 410, 13, 17, 13, 1], [1, 9, 8, 6, 8, 8], [794, 767, 10, 13, 10, 1], [672, 566, 14, 10, 14, 4], [672, 620, 10, 7, 10, 7], [672, 671, 10, 7, 10, 7], [672, 716, 14, 13, 14, 1], [672, 767, 14, 13, 14, 1], [733, 2, 14, 17, 14, 1], [733, 59, 10, 7, 10, 7], [733, 111, 8, 9, 8, 8], [733, 162, 12, 9, 12, 8], [733, 206, 22, 13, 22, 1], [733, 256, 16, 14, 16, 0], [733, 307, 16, 14, 16, 0], [733, 358, 16, 14, 16, 0], [733, 409, 16, 14, 16, 0], [733, 460, 16, 14, 16, 0], [733, 511, 9, 14, 9, 0], [733, 562, 9, 14, 9, 0], [733, 613, 9, 14, 9, 0], [733, 664, 9, 14, 9, 0], [733, 715, 18, 14, 18, 0], [733, 766, 18, 14, 18, 0], [1, 9, 8, 6, 8, 8], [794, 52, 18, 14, 18, 0], [794, 103, 17, 14, 17, 0], [794, 154, 17, 14, 17, 0], [794, 205, 17, 14, 17, 0], [794, 260, 8, 10, 8, 4], [794, 308, 10, 13, 10, 1], [794, 359, 10, 13, 10, 1], [794, 410, 10, 13, 10, 1], [794, 461, 10, 13, 10, 1], [794, 512, 10, 13, 10, 1], [794, 563, 10, 13, 10, 1], [794, 621, 10, 10, 10, 8], [794, 665, 10, 13, 10, 1], [794, 723, 10, 10, 10, 8], [794, 767, 10, 13, 10, 1], [855, 2, 10, 13, 10, 1], [855, 53, 10, 13, 10, 1], [855, 104, 10, 13, 10, 1], [855, 155, 10, 13, 10, 1], [855, 206, 10, 13, 10, 1], [855, 257, 10, 13, 10, 1], [855, 308, 10, 13, 10, 1], [855, 359, 10, 13, 10, 1], [855, 410, 10, 13, 10, 1], [855, 461, 10, 13, 10, 1], [855, 512, 10, 13, 10, 1], [855, 563, 10, 13, 10, 1], [855, 614, 10, 13, 10, 1], [855, 665, 10, 13, 10, 1], [855, 716, 10, 13, 10, 1], [855, 767, 10, 13, 10, 1]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 53, 15, 15, 9, 1], [1, 104, 16, 6, 10, 1], [1, 155, 20, 13, 14, 1], [1, 205, 20, 18, 14, 0], [1, 257, 23, 15, 20, 1], [1, 308, 20, 15, 16, 1], [1, 359, 14, 6, 8, 1], [1, 410, 16, 19, 10, 1], [1, 461, 15, 19, 10, 1], [1, 512, 16, 8, 11, 1], [1, 567, 17, 10, 15, 5], [1, 625, 9, 7, 9, 12], [1, 672, 13, 4, 10, 8], [1, 727, 9, 4, 9, 12], [1, 767, 15, 15, 9, 1], [62, 2, 19, 15, 14, 1], [62, 53, 18, 15, 14, 1], [62, 104, 18, 15, 14, 1], [62, 155, 18, 15, 14, 1], [62, 206, 19, 15, 14, 1], [62, 257, 20, 15, 14, 1], [62, 308, 19, 15, 14, 1], [62, 359, 20, 15, 14, 1], [62, 410, 19, 15, 14, 1], [62, 461, 19, 15, 14, 1], [62, 515, 14, 12, 9, 4], [62, 566, 14, 15, 9, 4], [62, 617, 20, 11, 15, 4], [62, 670, 19, 8, 15, 6], [62, 719, 18, 11, 15, 4], [62, 767, 19, 15, 14, 1], [123, 2, 27, 17, 22, 1], [123, 53, 18, 15, 16, 1], [123, 104, 21, 15, 16, 1], [123, 155, 23, 15, 17, 1], [123, 206, 22, 15, 17, 1], [123, 257, 22, 15, 16, 1], [123, 308, 21, 15, 15, 1], [123, 359, 23, 15, 18, 1], [123, 410, 23, 15, 17, 1], [123, 461, 15, 15, 9, 1], [123, 512, 19, 15, 13, 1], [123, 563, 22, 15, 16, 1], [123, 614, 15, 15, 14, 1], [123, 665, 25, 15, 19, 1], [123, 716, 23, 15, 17, 1], [123, 767, 23, 15, 18, 1], [184, 2, 22, 15, 16, 1], [184, 53, 23, 15, 18, 1], [184, 104, 23, 15, 17, 1], [184, 155, 21, 15, 16, 1], [184, 206, 21, 15, 15, 1], [184, 257, 23, 15, 17, 1], [184, 308, 22, 15, 16, 1], [184, 359, 27, 15, 21, 1], [184, 410, 22, 15, 16, 1], [184, 461, 22, 15, 16, 1], [184, 512, 21, 15, 15, 1], [184, 563, 15, 19, 9, 1], [184, 614, 14, 15, 9, 1], [184, 665, 15, 19, 9, 1], [184, 716, 17, 6, 12, 1], [184, 783, 14, 3, 14, 17], [245, 2, 16, 6, 10, 1], [245, 56, 17, 12, 14, 4], [245, 104, 18, 15, 14, 1], [245, 158, 18, 12, 13, 4], [245, 206, 20, 15, 14, 1], [245, 260, 18, 12, 14, 4], [245, 308, 15, 15, 9, 1], [245, 362, 19, 16, 14, 4], [245, 410, 18, 15, 14, 1], [245, 461, 14, 15, 8, 1], [245, 512, 14, 19, 8, 1], [245, 563, 19, 15, 13, 1], [245, 614, 14, 15, 8, 1], [245, 668, 22, 12, 19, 4], [245, 719, 18, 12, 14, 4], [245, 770, 18, 12, 14, 4], [306, 5, 18, 15, 14, 4], [306, 56, 19, 15, 14, 4], [306, 107, 16, 12, 10, 4], [306, 158, 18, 12, 13, 4], [306, 207, 14, 14, 9, 2], [306, 260, 19, 12, 14, 4], [306, 311, 18, 12, 13, 4], [306, 362, 22, 12, 17, 4], [306, 413, 18, 12, 13, 4], [306, 464, 19, 16, 13, 4], [306, 515, 18, 12, 13, 4], [306, 563, 16, 19, 10, 1], [306, 614, 15, 19, 9, 1], [306, 665, 15, 19, 10, 1], [306, 721, 18, 5, 15, 6], [306, 768, 18, 14, 13, 2], [367, 1, 21, 16, 16, 0], [367, 52, 20, 16, 16, 0], [367, 104, 23, 18, 17, 1], [367, 154, 21, 16, 16, 0], [367, 205, 23, 16, 17, 0], [367, 256, 23, 16, 18, 0], [367, 307, 23, 16, 17, 0], [367, 358, 19, 16, 14, 0], [367, 409, 17, 16, 14, 0], [367, 460, 18, 16, 14, 0], [367, 512, 19, 15, 14, 1], [367, 563, 19, 15, 14, 1], [367, 613, 18, 16, 14, 0], [367, 668, 18, 15, 13, 4], [367, 715, 19, 16, 14, 0], [367, 766, 18, 16, 14, 0], [428, 1, 19, 16, 14, 0], [428, 53, 20, 15, 14, 1], [428, 103, 15, 16, 9, 0], [428, 154, 15, 16, 9, 0], [428, 205, 16, 16, 10, 0], [428, 257, 15, 15, 9, 1], [428, 308, 20, 15, 14, 1], [428, 358, 19, 16, 14, 0], [428, 409, 18, 16, 14, 0], [428, 460, 19, 16, 14, 0], [428, 512, 19, 15, 14, 1], [428, 563, 19, 15, 14, 1], [428, 613, 20, 16, 14, 0], [428, 664, 19, 16, 14, 0], [428, 715, 19, 16, 14, 0], [428, 767, 20, 15, 14, 1], [489, 2, 19, 18, 14, 1], [489, 53, 15, 6, 10, 1], [489, 106, 18, 14, 14, 3], [489, 155, 19, 15, 14, 1], [489, 206, 18, 19, 14, 1], [489, 262, 14, 7, 10, 6], [489, 308, 20, 18, 14, 1], [489, 359, 20, 15, 15, 1], [489, 411, 22, 14, 18, 2], [489, 462, 22, 14, 18, 2], [489, 513, 26, 8, 20, 2], [489, 563, 16, 5, 10, 1], [489, 614, 16, 4, 10, 1], [489, 669, 18, 11, 14, 5], [489, 716, 28, 15, 22, 1], [489, 767, 24, 15, 18, 1], [550, 7, 21, 7, 17, 6], [550, 57, 16, 11, 14, 5], [550, 109, 18, 10, 14, 6], [550, 160, 17, 10, 14, 6], [550, 206, 21, 15, 15, 1], [550, 262, 16, 13, 14, 6], [550, 309, 18, 14, 13, 2], [550, 360, 22, 15, 17, 2], [550, 411, 25, 15, 19, 2], [550, 466, 17, 10, 13, 6], [550, 512, 15, 19, 9, 1], [550, 563, 15, 9, 10, 1], [550, 614, 15, 9, 10, 1], [550, 666, 23, 14, 18, 2], [550, 719, 24, 12, 20, 4], [550, 770, 19, 12, 15, 4], [611, 5, 16, 16, 15, 4], [611, 56, 14, 16, 10, 4], [611, 111, 19, 7, 17, 8], [611, 156, 20, 14, 14, 2], [611, 206, 19, 19, 13, 1], [611, 264, 17, 7, 14, 8], [611, 309, 17, 14, 15, 2], [611, 365, 18, 7, 14, 7], [611, 416, 17, 7, 14, 7], [611, 472, 22, 4, 22, 12], [611, 511, 1, 1, 14, 1], [611, 562, 18, 16, 16, 0], [611, 613, 21, 16, 16, 0], [611, 664, 23, 16, 18, 0], [611, 716, 28, 15, 22, 1], [611, 770, 24, 12, 21, 4], [672, 9, 16, 4, 14, 8], [672, 60, 25, 4, 22, 8], [672, 104, 16, 7, 10, 1], [672, 155, 16, 7, 10, 1], [672, 206, 14, 7, 8, 1], [672, 257, 14, 7, 8, 1], [672, 312, 18, 10, 14, 5], [672, 360, 18, 14, 13, 2], [672, 410, 19, 19, 13, 1], [1, 1, 1, 1, 8, 1], [794, 767, 16, 5, 10, 1], [672, 566, 19, 11, 14, 4], [672, 620, 14, 7, 10, 7], [672, 671, 13, 7, 10, 7], [672, 716, 20, 15, 14, 1], [672, 767, 20, 15, 14, 1], [733, 2, 19, 19, 14, 1], [733, 59, 12, 4, 10, 7], [733, 115, 9, 7, 8, 12], [733, 166, 12, 7, 12, 12], [733, 206, 24, 15, 22, 1], [733, 256, 20, 16, 16, 0], [733, 307, 21, 16, 16, 0], [733, 358, 20, 16, 16, 0], [733, 409, 21, 16, 16, 0], [733, 460, 21, 16, 16, 0], [733, 511, 15, 16, 9, 0], [733, 562, 15, 16, 9, 0], [733, 613, 15, 16, 9, 0], [733, 664, 15, 16, 9, 0], [733, 715, 23, 16, 18, 0], [733, 766, 23, 16, 18, 0], [1, 1, 1, 1, 8, 1], [794, 52, 23, 16, 18, 0], [794, 103, 23, 16, 17, 0], [794, 154, 23, 16, 17, 0], [794, 205, 23, 16, 17, 0], [794, 260, 13, 12, 8, 4], [794, 308, 16, 5, 10, 1], [794, 359, 16, 4, 10, 1], [794, 410, 16, 4, 10, 1], [794, 461, 16, 5, 10, 1], [794, 512, 16, 4, 10, 1], [794, 563, 16, 6, 10, 1], [794, 625, 10, 8, 10, 12], [794, 665, 16, 5, 10, 1], [794, 728, 9, 7, 10, 13], [794, 767, 16, 5, 10, 1], [855, 2, 16, 5, 10, 1], [855, 53, 16, 5, 10, 1], [855, 104, 16, 5, 10, 1], [855, 155, 16, 5, 10, 1], [855, 206, 16, 5, 10, 1], [855, 257, 16, 5, 10, 1], [855, 308, 16, 5, 10, 1], [855, 359, 16, 5, 10, 1], [855, 410, 16, 5, 10, 1], [855, 461, 16, 5, 10, 1], [855, 512, 16, 5, 10, 1], [855, 563, 16, 5, 10, 1], [855, 614, 16, 5, 10, 1], [855, 665, 16, 5, 10, 1], [855, 716, 16, 5, 10, 1], [855, 767, 16, 5, 10, 1]], \"capHeight\": 15, \"widestlogicalchar\": 22, \"widestglyph\": 28, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 53, 14, 13, 8, 1], [1, 104, 15, 4, 9, 1], [1, 155, 19, 11, 13, 1], [1, 205, 19, 16, 13, 0], [1, 257, 22, 13, 19, 1], [1, 308, 19, 13, 15, 1], [1, 359, 13, 4, 7, 1], [1, 411, 14, 16, 9, 2], [1, 461, 14, 17, 9, 1], [1, 512, 15, 6, 10, 1], [1, 567, 16, 8, 14, 5], [1, 625, 8, 5, 8, 12], [1, 672, 12, 2, 9, 8], [1, 727, 8, 2, 8, 12], [1, 767, 14, 13, 8, 1], [62, 2, 18, 13, 13, 1], [62, 53, 17, 13, 13, 1], [62, 104, 17, 13, 13, 1], [62, 155, 17, 13, 13, 1], [62, 206, 18, 13, 13, 1], [62, 257, 19, 13, 13, 1], [62, 308, 18, 13, 13, 1], [62, 359, 19, 13, 13, 1], [62, 410, 18, 13, 13, 1], [62, 461, 18, 13, 13, 1], [62, 515, 13, 10, 8, 4], [62, 566, 13, 13, 8, 4], [62, 617, 19, 9, 14, 4], [62, 670, 18, 6, 14, 6], [62, 719, 17, 9, 14, 4], [62, 767, 18, 13, 13, 1], [123, 2, 26, 15, 21, 1], [123, 53, 17, 13, 15, 1], [123, 104, 20, 13, 15, 1], [123, 155, 22, 13, 16, 1], [123, 206, 21, 13, 16, 1], [123, 257, 21, 13, 15, 1], [123, 308, 20, 13, 14, 1], [123, 359, 22, 13, 17, 1], [123, 410, 22, 13, 16, 1], [123, 461, 14, 13, 8, 1], [123, 512, 18, 13, 12, 1], [123, 563, 21, 13, 15, 1], [123, 614, 14, 13, 13, 1], [123, 665, 24, 13, 18, 1], [123, 716, 22, 13, 16, 1], [123, 767, 22, 13, 17, 1], [184, 2, 21, 13, 15, 1], [184, 53, 22, 13, 17, 1], [184, 104, 22, 13, 16, 1], [184, 155, 20, 13, 15, 1], [184, 206, 20, 13, 14, 1], [184, 257, 22, 13, 16, 1], [184, 308, 21, 13, 15, 1], [184, 359, 26, 13, 20, 1], [184, 410, 21, 13, 15, 1], [184, 461, 21, 13, 15, 1], [184, 512, 20, 13, 14, 1], [184, 563, 14, 17, 8, 1], [184, 614, 13, 13, 8, 1], [184, 665, 14, 17, 8, 1], [184, 716, 16, 4, 11, 1], [184, 783, 13, 1, 13, 17], [245, 2, 15, 4, 9, 1], [245, 56, 16, 10, 13, 4], [245, 104, 17, 13, 13, 1], [245, 158, 17, 10, 12, 4], [245, 206, 19, 13, 13, 1], [245, 260, 17, 10, 13, 4], [245, 308, 14, 13, 8, 1], [245, 362, 18, 14, 13, 4], [245, 410, 17, 13, 13, 1], [245, 461, 13, 13, 7, 1], [245, 512, 13, 17, 7, 1], [245, 563, 18, 13, 12, 1], [245, 614, 13, 13, 7, 1], [245, 668, 21, 10, 18, 4], [245, 719, 17, 10, 13, 4], [245, 770, 17, 10, 13, 4], [306, 5, 17, 13, 13, 4], [306, 56, 18, 13, 13, 4], [306, 107, 15, 10, 9, 4], [306, 158, 17, 10, 12, 4], [306, 207, 13, 12, 8, 2], [306, 260, 18, 10, 13, 4], [306, 311, 17, 10, 12, 4], [306, 362, 21, 10, 16, 4], [306, 413, 17, 10, 12, 4], [306, 464, 18, 14, 12, 4], [306, 515, 17, 10, 12, 4], [306, 563, 15, 17, 9, 1], [306, 614, 14, 17, 8, 1], [306, 665, 14, 17, 9, 1], [306, 721, 17, 3, 14, 6], [306, 768, 17, 12, 12, 2], [367, 1, 20, 14, 15, 0], [367, 52, 19, 14, 15, 0], [367, 104, 22, 16, 16, 1], [367, 154, 20, 14, 15, 0], [367, 205, 22, 14, 16, 0], [367, 256, 22, 14, 17, 0], [367, 307, 22, 14, 16, 0], [367, 358, 17, 14, 13, 0], [367, 409, 16, 14, 13, 0], [367, 460, 17, 14, 13, 0], [367, 512, 18, 13, 13, 1], [367, 563, 18, 13, 13, 1], [367, 613, 17, 14, 13, 0], [367, 668, 17, 13, 12, 4], [367, 715, 17, 14, 13, 0], [367, 766, 17, 14, 13, 0], [428, 1, 18, 14, 13, 0], [428, 53, 19, 13, 13, 1], [428, 103, 14, 14, 8, 0], [428, 154, 14, 14, 8, 0], [428, 205, 15, 14, 9, 0], [428, 257, 14, 13, 8, 1], [428, 308, 19, 13, 13, 1], [428, 358, 17, 14, 13, 0], [428, 409, 17, 14, 13, 0], [428, 460, 18, 14, 13, 0], [428, 512, 18, 13, 13, 1], [428, 563, 18, 13, 13, 1], [428, 613, 18, 14, 13, 0], [428, 664, 18, 14, 13, 0], [428, 715, 18, 14, 13, 0], [428, 767, 19, 13, 13, 1], [489, 2, 18, 16, 13, 1], [489, 53, 14, 4, 9, 1], [489, 106, 17, 12, 13, 3], [489, 155, 18, 13, 13, 1], [489, 206, 17, 17, 13, 1], [489, 262, 13, 5, 9, 6], [489, 308, 19, 16, 13, 1], [489, 359, 19, 13, 14, 1], [489, 411, 21, 12, 17, 2], [489, 462, 21, 12, 17, 2], [489, 513, 25, 6, 19, 2], [489, 563, 15, 3, 9, 1], [489, 614, 15, 2, 9, 1], [489, 669, 17, 9, 13, 5], [489, 716, 27, 13, 21, 1], [489, 767, 23, 13, 17, 1], [550, 7, 20, 5, 16, 6], [550, 57, 15, 9, 13, 5], [550, 109, 17, 8, 13, 6], [550, 160, 16, 8, 13, 6], [550, 206, 20, 13, 14, 1], [550, 262, 15, 11, 13, 6], [550, 309, 17, 12, 12, 2], [550, 360, 21, 13, 16, 2], [550, 411, 24, 13, 18, 2], [550, 466, 16, 8, 12, 6], [550, 513, 13, 16, 8, 2], [550, 563, 14, 7, 9, 1], [550, 614, 14, 7, 9, 1], [550, 666, 22, 12, 17, 2], [550, 719, 23, 10, 19, 4], [550, 770, 18, 10, 14, 4], [611, 5, 15, 14, 14, 4], [611, 56, 13, 14, 9, 4], [611, 111, 18, 5, 16, 8], [611, 156, 19, 12, 13, 2], [611, 206, 18, 17, 12, 1], [611, 264, 16, 5, 13, 8], [611, 309, 16, 12, 14, 2], [611, 365, 17, 5, 13, 7], [611, 416, 16, 5, 13, 7], [611, 472, 21, 2, 21, 12], [611, 511, 1, 1, 13, 1], [611, 562, 17, 14, 15, 0], [611, 613, 19, 14, 15, 0], [611, 664, 22, 14, 17, 0], [611, 716, 27, 13, 21, 1], [611, 770, 23, 10, 20, 4], [672, 9, 15, 2, 13, 8], [672, 60, 24, 2, 21, 8], [672, 104, 14, 5, 9, 1], [672, 155, 15, 5, 9, 1], [672, 206, 13, 5, 7, 1], [672, 257, 13, 5, 7, 1], [672, 312, 17, 8, 13, 5], [672, 360, 17, 12, 12, 2], [672, 410, 18, 17, 12, 1], [1, 1, 1, 1, 7, 1], [794, 767, 14, 3, 9, 1], [672, 566, 18, 9, 13, 4], [672, 620, 13, 5, 9, 7], [672, 671, 12, 5, 9, 7], [672, 716, 19, 13, 13, 1], [672, 767, 19, 13, 13, 1], [733, 2, 18, 17, 13, 1], [733, 59, 11, 2, 9, 7], [733, 115, 8, 5, 7, 12], [733, 166, 11, 5, 11, 12], [733, 206, 23, 13, 21, 1], [733, 256, 19, 14, 15, 0], [733, 307, 20, 14, 15, 0], [733, 358, 18, 14, 15, 0], [733, 409, 20, 14, 15, 0], [733, 460, 20, 14, 15, 0], [733, 512, 14, 13, 8, 1], [733, 562, 13, 14, 8, 0], [733, 613, 13, 14, 8, 0], [733, 664, 14, 14, 8, 0], [733, 715, 22, 14, 17, 0], [733, 766, 22, 14, 17, 0], [1, 1, 1, 1, 7, 1], [794, 52, 22, 14, 17, 0], [794, 103, 22, 14, 16, 0], [794, 154, 22, 14, 16, 0], [794, 205, 22, 14, 16, 0], [794, 260, 12, 10, 7, 4], [794, 308, 15, 3, 9, 1], [794, 359, 15, 2, 9, 1], [794, 410, 15, 2, 9, 1], [794, 461, 15, 3, 9, 1], [794, 512, 15, 2, 9, 1], [794, 563, 15, 4, 9, 1], [794, 625, 9, 6, 9, 12], [794, 665, 15, 3, 9, 1], [794, 728, 8, 5, 9, 13], [794, 767, 14, 3, 9, 1], [855, 2, 14, 3, 9, 1], [855, 53, 14, 3, 9, 1], [855, 104, 14, 3, 9, 1], [855, 155, 14, 3, 9, 1], [855, 206, 14, 3, 9, 1], [855, 257, 14, 3, 9, 1], [855, 308, 14, 3, 9, 1], [855, 359, 14, 3, 9, 1], [855, 410, 14, 3, 9, 1], [855, 461, 14, 3, 9, 1], [855, 512, 14, 3, 9, 1], [855, 563, 14, 3, 9, 1], [855, 614, 14, 3, 9, 1], [855, 665, 14, 3, 9, 1], [855, 716, 14, 3, 9, 1], [855, 767, 14, 3, 9, 1]], \"capHeight\": 14, \"widestlogicalchar\": 21, \"widestglyph\": 27, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 8, 6, 8, 9], [1, 53, 9, 15, 9, 1], [1, 104, 10, 14, 10, 1], [1, 155, 14, 14, 14, 1], [1, 205, 14, 18, 14, 0], [1, 257, 20, 15, 20, 1], [1, 308, 16, 15, 16, 1], [1, 359, 8, 14, 8, 1], [1, 410, 10, 19, 10, 1], [1, 461, 10, 19, 10, 1], [1, 512, 11, 14, 11, 1], [1, 567, 15, 10, 15, 5], [1, 622, 9, 10, 9, 9], [1, 672, 10, 7, 10, 8], [1, 724, 9, 7, 9, 9], [1, 767, 9, 15, 9, 1], [62, 2, 14, 15, 14, 1], [62, 53, 14, 15, 14, 1], [62, 104, 14, 15, 14, 1], [62, 155, 14, 15, 14, 1], [62, 206, 14, 15, 14, 1], [62, 257, 14, 15, 14, 1], [62, 308, 14, 15, 14, 1], [62, 359, 14, 15, 14, 1], [62, 410, 14, 15, 14, 1], [62, 461, 14, 15, 14, 1], [62, 515, 9, 12, 9, 4], [62, 566, 9, 15, 9, 4], [62, 617, 15, 11, 15, 4], [62, 670, 15, 9, 15, 6], [62, 719, 15, 11, 15, 4], [62, 767, 14, 15, 14, 1], [123, 2, 22, 17, 22, 1], [123, 53, 16, 15, 16, 1], [123, 104, 16, 15, 16, 1], [123, 155, 17, 15, 17, 1], [123, 206, 17, 15, 17, 1], [123, 257, 16, 15, 16, 1], [123, 308, 15, 15, 15, 1], [123, 359, 18, 15, 18, 1], [123, 410, 17, 15, 17, 1], [123, 461, 9, 15, 9, 1], [123, 512, 13, 15, 13, 1], [123, 563, 16, 15, 16, 1], [123, 614, 14, 15, 14, 1], [123, 665, 19, 15, 19, 1], [123, 716, 17, 15, 17, 1], [123, 767, 18, 15, 18, 1], [184, 2, 16, 15, 16, 1], [184, 53, 18, 15, 18, 1], [184, 104, 17, 15, 17, 1], [184, 155, 16, 15, 16, 1], [184, 206, 15, 15, 15, 1], [184, 257, 17, 15, 17, 1], [184, 308, 16, 15, 16, 1], [184, 359, 21, 15, 21, 1], [184, 410, 16, 15, 16, 1], [184, 461, 16, 15, 16, 1], [184, 512, 15, 15, 15, 1], [184, 563, 9, 19, 9, 1], [184, 614, 9, 15, 9, 1], [184, 665, 9, 19, 9, 1], [184, 716, 12, 14, 12, 1], [184, 775, 14, 11, 14, 9], [245, 2, 10, 14, 10, 1], [245, 56, 14, 12, 14, 4], [245, 104, 14, 15, 14, 1], [245, 158, 13, 12, 13, 4], [245, 206, 14, 15, 14, 1], [245, 260, 14, 12, 14, 4], [245, 308, 9, 15, 9, 1], [245, 362, 14, 16, 14, 4], [245, 410, 14, 15, 14, 1], [245, 461, 8, 15, 8, 1], [245, 512, 8, 19, 8, 1], [245, 563, 13, 15, 13, 1], [245, 614, 8, 15, 8, 1], [245, 668, 19, 12, 19, 4], [245, 719, 14, 12, 14, 4], [245, 770, 14, 12, 14, 4], [306, 5, 14, 15, 14, 4], [306, 56, 14, 15, 14, 4], [306, 107, 10, 12, 10, 4], [306, 158, 13, 12, 13, 4], [306, 207, 9, 14, 9, 2], [306, 260, 14, 12, 14, 4], [306, 311, 13, 12, 13, 4], [306, 362, 17, 12, 17, 4], [306, 413, 13, 12, 13, 4], [306, 464, 13, 16, 13, 4], [306, 515, 13, 12, 13, 4], [306, 563, 10, 19, 10, 1], [306, 614, 9, 19, 9, 1], [306, 665, 10, 19, 10, 1], [306, 721, 15, 9, 15, 6], [306, 768, 13, 14, 13, 2], [367, 1, 16, 16, 16, 0], [367, 52, 16, 16, 16, 0], [367, 104, 17, 18, 17, 1], [367, 154, 16, 16, 16, 0], [367, 205, 17, 16, 17, 0], [367, 256, 18, 16, 18, 0], [367, 307, 17, 16, 17, 0], [367, 358, 14, 16, 14, 0], [367, 409, 14, 16, 14, 0], [367, 460, 14, 16, 14, 0], [367, 512, 14, 15, 14, 1], [367, 563, 14, 15, 14, 1], [367, 613, 14, 16, 14, 0], [367, 668, 13, 15, 13, 4], [367, 715, 14, 16, 14, 0], [367, 766, 14, 16, 14, 0], [428, 1, 14, 16, 14, 0], [428, 53, 14, 15, 14, 1], [428, 103, 9, 16, 9, 0], [428, 154, 9, 16, 9, 0], [428, 205, 10, 16, 10, 0], [428, 257, 9, 15, 9, 1], [428, 308, 14, 15, 14, 1], [428, 358, 14, 16, 14, 0], [428, 409, 14, 16, 14, 0], [428, 460, 14, 16, 14, 0], [428, 512, 14, 15, 14, 1], [428, 563, 14, 15, 14, 1], [428, 613, 14, 16, 14, 0], [428, 664, 14, 16, 14, 0], [428, 715, 14, 16, 14, 0], [428, 767, 14, 15, 14, 1], [489, 2, 14, 18, 14, 1], [489, 53, 10, 14, 10, 1], [489, 106, 14, 14, 14, 3], [489, 155, 14, 15, 14, 1], [489, 206, 14, 19, 14, 1], [489, 262, 10, 9, 10, 6], [489, 308, 14, 18, 14, 1], [489, 359, 15, 15, 15, 1], [489, 411, 18, 14, 18, 2], [489, 462, 18, 14, 18, 2], [489, 513, 20, 13, 20, 2], [489, 563, 10, 14, 10, 1], [489, 614, 10, 14, 10, 1], [489, 669, 14, 11, 14, 5], [489, 716, 22, 15, 22, 1], [489, 767, 18, 15, 18, 1], [550, 7, 17, 9, 17, 6], [550, 57, 14, 11, 14, 5], [550, 109, 14, 10, 14, 6], [550, 160, 14, 10, 14, 6], [550, 206, 15, 15, 15, 1], [550, 262, 14, 13, 14, 6], [550, 309, 13, 14, 13, 2], [550, 360, 17, 15, 17, 2], [550, 411, 19, 15, 19, 2], [550, 466, 13, 10, 13, 6], [550, 512, 9, 19, 9, 1], [550, 563, 10, 14, 10, 1], [550, 614, 10, 14, 10, 1], [550, 666, 18, 14, 18, 2], [550, 719, 20, 12, 20, 4], [550, 770, 15, 12, 15, 4], [611, 5, 15, 16, 15, 4], [611, 56, 10, 16, 10, 4], [611, 111, 17, 7, 17, 8], [611, 156, 14, 14, 14, 2], [611, 206, 13, 19, 13, 1], [611, 264, 14, 7, 14, 8], [611, 309, 15, 14, 15, 2], [611, 365, 14, 8, 14, 7], [611, 416, 14, 8, 14, 7], [611, 469, 22, 7, 22, 9], [611, 520, 14, 6, 14, 9], [611, 562, 16, 16, 16, 0], [611, 613, 16, 16, 16, 0], [611, 664, 18, 16, 18, 0], [611, 716, 22, 15, 22, 1], [611, 770, 21, 12, 21, 4], [672, 9, 14, 7, 14, 8], [672, 60, 22, 7, 22, 8], [672, 104, 10, 14, 10, 1], [672, 155, 10, 14, 10, 1], [672, 206, 8, 14, 8, 1], [672, 257, 8, 14, 8, 1], [672, 312, 14, 10, 14, 5], [672, 360, 13, 14, 13, 2], [672, 410, 13, 19, 13, 1], [1, 10, 8, 6, 8, 9], [794, 767, 10, 14, 10, 1], [672, 566, 14, 11, 14, 4], [672, 620, 10, 8, 10, 7], [672, 671, 10, 8, 10, 7], [672, 716, 14, 15, 14, 1], [672, 767, 14, 15, 14, 1], [733, 2, 14, 19, 14, 1], [733, 59, 10, 8, 10, 7], [733, 112, 8, 10, 8, 9], [733, 163, 12, 10, 12, 9], [733, 206, 22, 15, 22, 1], [733, 256, 16, 16, 16, 0], [733, 307, 16, 16, 16, 0], [733, 358, 16, 16, 16, 0], [733, 409, 16, 16, 16, 0], [733, 460, 16, 16, 16, 0], [733, 511, 9, 16, 9, 0], [733, 562, 9, 16, 9, 0], [733, 613, 9, 16, 9, 0], [733, 664, 9, 16, 9, 0], [733, 715, 18, 16, 18, 0], [733, 766, 18, 16, 18, 0], [1, 10, 8, 6, 8, 9], [794, 52, 18, 16, 18, 0], [794, 103, 17, 16, 17, 0], [794, 154, 17, 16, 17, 0], [794, 205, 17, 16, 17, 0], [794, 260, 8, 12, 8, 4], [794, 308, 10, 14, 10, 1], [794, 359, 10, 14, 10, 1], [794, 410, 10, 14, 10, 1], [794, 461, 10, 14, 10, 1], [794, 512, 10, 14, 10, 1], [794, 563, 10, 14, 10, 1], [794, 622, 10, 11, 10, 9], [794, 665, 10, 14, 10, 1], [794, 724, 10, 11, 10, 9], [794, 767, 10, 14, 10, 1], [855, 2, 10, 14, 10, 1], [855, 53, 10, 14, 10, 1], [855, 104, 10, 14, 10, 1], [855, 155, 10, 14, 10, 1], [855, 206, 10, 14, 10, 1], [855, 257, 10, 14, 10, 1], [855, 308, 10, 14, 10, 1], [855, 359, 10, 14, 10, 1], [855, 410, 10, 14, 10, 1], [855, 461, 10, 14, 10, 1], [855, 512, 10, 14, 10, 1], [855, 563, 10, 14, 10, 1], [855, 614, 10, 14, 10, 1], [855, 665, 10, 14, 10, 1], [855, 716, 10, 14, 10, 1], [855, 767, 10, 14, 10, 1]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 7, 6, 7, 8], [1, 53, 8, 13, 8, 1], [1, 104, 9, 13, 9, 1], [1, 155, 13, 13, 13, 1], [1, 205, 13, 16, 13, 0], [1, 257, 19, 13, 19, 1], [1, 308, 15, 13, 15, 1], [1, 359, 7, 13, 7, 1], [1, 410, 9, 17, 9, 1], [1, 461, 9, 17, 9, 1], [1, 512, 10, 13, 10, 1], [1, 567, 14, 9, 14, 5], [1, 621, 8, 9, 8, 8], [1, 672, 9, 6, 9, 8], [1, 723, 8, 6, 8, 8], [1, 767, 8, 13, 8, 1], [62, 2, 13, 13, 13, 1], [62, 53, 13, 13, 13, 1], [62, 104, 13, 13, 13, 1], [62, 155, 13, 13, 13, 1], [62, 206, 13, 13, 13, 1], [62, 257, 13, 13, 13, 1], [62, 308, 13, 13, 13, 1], [62, 359, 13, 13, 13, 1], [62, 410, 13, 13, 13, 1], [62, 461, 13, 13, 13, 1], [62, 515, 8, 10, 8, 4], [62, 566, 8, 13, 8, 4], [62, 617, 14, 10, 14, 4], [62, 670, 14, 8, 14, 6], [62, 719, 14, 10, 14, 4], [62, 767, 13, 13, 13, 1], [123, 2, 21, 15, 21, 1], [123, 53, 15, 13, 15, 1], [123, 104, 15, 13, 15, 1], [123, 155, 16, 13, 16, 1], [123, 206, 16, 13, 16, 1], [123, 257, 15, 13, 15, 1], [123, 308, 14, 13, 14, 1], [123, 359, 17, 13, 17, 1], [123, 410, 16, 13, 16, 1], [123, 461, 8, 13, 8, 1], [123, 512, 12, 13, 12, 1], [123, 563, 15, 13, 15, 1], [123, 614, 13, 13, 13, 1], [123, 665, 18, 13, 18, 1], [123, 716, 16, 13, 16, 1], [123, 767, 17, 13, 17, 1], [184, 2, 15, 13, 15, 1], [184, 53, 17, 13, 17, 1], [184, 104, 16, 13, 16, 1], [184, 155, 15, 13, 15, 1], [184, 206, 14, 13, 14, 1], [184, 257, 16, 13, 16, 1], [184, 308, 15, 13, 15, 1], [184, 359, 20, 13, 20, 1], [184, 410, 15, 13, 15, 1], [184, 461, 15, 13, 15, 1], [184, 512, 14, 13, 14, 1], [184, 563, 8, 17, 8, 1], [184, 614, 8, 13, 8, 1], [184, 665, 8, 17, 8, 1], [184, 716, 11, 13, 11, 1], [184, 774, 13, 10, 13, 8], [245, 2, 9, 13, 9, 1], [245, 56, 13, 10, 13, 4], [245, 104, 13, 13, 13, 1], [245, 158, 12, 10, 12, 4], [245, 206, 13, 13, 13, 1], [245, 260, 13, 10, 13, 4], [245, 308, 8, 13, 8, 1], [245, 362, 13, 14, 13, 4], [245, 410, 13, 13, 13, 1], [245, 461, 7, 13, 7, 1], [245, 512, 7, 17, 7, 1], [245, 563, 12, 13, 12, 1], [245, 614, 7, 13, 7, 1], [245, 668, 18, 10, 18, 4], [245, 719, 13, 10, 13, 4], [245, 770, 13, 10, 13, 4], [306, 5, 13, 13, 13, 4], [306, 56, 13, 13, 13, 4], [306, 107, 9, 10, 9, 4], [306, 158, 12, 10, 12, 4], [306, 207, 8, 12, 8, 2], [306, 260, 13, 10, 13, 4], [306, 311, 12, 10, 12, 4], [306, 362, 16, 10, 16, 4], [306, 413, 12, 10, 12, 4], [306, 464, 12, 14, 12, 4], [306, 515, 12, 10, 12, 4], [306, 563, 9, 17, 9, 1], [306, 614, 8, 17, 8, 1], [306, 665, 9, 17, 9, 1], [306, 721, 14, 8, 14, 6], [306, 768, 12, 12, 12, 2], [367, 1, 15, 14, 15, 0], [367, 52, 15, 14, 15, 0], [367, 104, 16, 16, 16, 1], [367, 154, 15, 14, 15, 0], [367, 205, 16, 14, 16, 0], [367, 256, 17, 14, 17, 0], [367, 307, 16, 14, 16, 0], [367, 358, 13, 14, 13, 0], [367, 409, 13, 14, 13, 0], [367, 460, 13, 14, 13, 0], [367, 512, 13, 13, 13, 1], [367, 563, 13, 13, 13, 1], [367, 613, 13, 14, 13, 0], [367, 668, 12, 13, 12, 4], [367, 715, 13, 14, 13, 0], [367, 766, 13, 14, 13, 0], [428, 1, 13, 14, 13, 0], [428, 53, 13, 13, 13, 1], [428, 103, 8, 14, 8, 0], [428, 154, 8, 14, 8, 0], [428, 205, 9, 14, 9, 0], [428, 257, 8, 13, 8, 1], [428, 308, 13, 13, 13, 1], [428, 358, 13, 14, 13, 0], [428, 409, 13, 14, 13, 0], [428, 460, 13, 14, 13, 0], [428, 512, 13, 13, 13, 1], [428, 563, 13, 13, 13, 1], [428, 613, 13, 14, 13, 0], [428, 664, 13, 14, 13, 0], [428, 715, 13, 14, 13, 0], [428, 767, 13, 13, 13, 1], [489, 2, 13, 16, 13, 1], [489, 53, 9, 13, 9, 1], [489, 106, 13, 12, 13, 3], [489, 155, 13, 13, 13, 1], [489, 206, 13, 17, 13, 1], [489, 262, 9, 8, 9, 6], [489, 308, 13, 16, 13, 1], [489, 359, 14, 13, 14, 1], [489, 411, 17, 12, 17, 2], [489, 462, 17, 12, 17, 2], [489, 513, 19, 12, 19, 2], [489, 563, 9, 13, 9, 1], [489, 614, 9, 13, 9, 1], [489, 669, 13, 9, 13, 5], [489, 716, 21, 13, 21, 1], [489, 767, 17, 13, 17, 1], [550, 7, 16, 8, 16, 6], [550, 57, 13, 9, 13, 5], [550, 109, 13, 8, 13, 6], [550, 160, 13, 8, 13, 6], [550, 206, 14, 13, 14, 1], [550, 262, 13, 11, 13, 6], [550, 309, 12, 12, 12, 2], [550, 360, 16, 13, 16, 2], [550, 411, 18, 13, 18, 2], [550, 466, 12, 8, 12, 6], [550, 512, 8, 17, 8, 1], [550, 563, 9, 13, 9, 1], [550, 614, 9, 13, 9, 1], [550, 666, 17, 12, 17, 2], [550, 719, 19, 10, 19, 4], [550, 770, 14, 10, 14, 4], [611, 5, 14, 14, 14, 4], [611, 56, 9, 14, 9, 4], [611, 111, 16, 6, 16, 8], [611, 156, 13, 12, 13, 2], [611, 206, 12, 17, 12, 1], [611, 264, 13, 6, 13, 8], [611, 309, 14, 12, 14, 2], [611, 365, 13, 7, 13, 7], [611, 416, 13, 7, 13, 7], [611, 468, 21, 6, 21, 8], [611, 519, 13, 6, 13, 8], [611, 562, 15, 14, 15, 0], [611, 613, 15, 14, 15, 0], [611, 664, 17, 14, 17, 0], [611, 716, 21, 13, 21, 1], [611, 770, 20, 10, 20, 4], [672, 9, 13, 6, 13, 8], [672, 60, 21, 6, 21, 8], [672, 104, 9, 13, 9, 1], [672, 155, 9, 13, 9, 1], [672, 206, 7, 13, 7, 1], [672, 257, 7, 13, 7, 1], [672, 312, 13, 9, 13, 5], [672, 360, 12, 12, 12, 2], [672, 410, 12, 17, 12, 1], [1, 9, 7, 6, 7, 8], [794, 767, 9, 13, 9, 1], [672, 566, 13, 10, 13, 4], [672, 620, 9, 7, 9, 7], [672, 671, 9, 7, 9, 7], [672, 716, 13, 13, 13, 1], [672, 767, 13, 13, 13, 1], [733, 2, 13, 17, 13, 1], [733, 59, 9, 7, 9, 7], [733, 111, 7, 9, 7, 8], [733, 162, 11, 9, 11, 8], [733, 206, 21, 13, 21, 1], [733, 256, 15, 14, 15, 0], [733, 307, 15, 14, 15, 0], [733, 358, 15, 14, 15, 0], [733, 409, 15, 14, 15, 0], [733, 460, 15, 14, 15, 0], [733, 511, 8, 14, 8, 0], [733, 562, 8, 14, 8, 0], [733, 613, 8, 14, 8, 0], [733, 664, 8, 14, 8, 0], [733, 715, 17, 14, 17, 0], [733, 766, 17, 14, 17, 0], [1, 9, 7, 6, 7, 8], [794, 52, 17, 14, 17, 0], [794, 103, 16, 14, 16, 0], [794, 154, 16, 14, 16, 0], [794, 205, 16, 14, 16, 0], [794, 260, 7, 10, 7, 4], [794, 308, 9, 13, 9, 1], [794, 359, 9, 13, 9, 1], [794, 410, 9, 13, 9, 1], [794, 461, 9, 13, 9, 1], [794, 512, 9, 13, 9, 1], [794, 563, 9, 13, 9, 1], [794, 621, 9, 10, 9, 8], [794, 665, 9, 13, 9, 1], [794, 723, 9, 10, 9, 8], [794, 767, 9, 13, 9, 1], [855, 2, 9, 13, 9, 1], [855, 53, 9, 13, 9, 1], [855, 104, 9, 13, 9, 1], [855, 155, 9, 13, 9, 1], [855, 206, 9, 13, 9, 1], [855, 257, 9, 13, 9, 1], [855, 308, 9, 13, 9, 1], [855, 359, 9, 13, 9, 1], [855, 410, 9, 13, 9, 1], [855, 461, 9, 13, 9, 1], [855, 512, 9, 13, 9, 1], [855, 563, 9, 13, 9, 1], [855, 614, 9, 13, 9, 1], [855, 665, 9, 13, 9, 1], [855, 716, 9, 13, 9, 1], [855, 767, 9, 13, 9, 1]], \"widestlogicalchar\": 21, \"widestglyph\": 21, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 27, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 20, 19, 13, 3], [1, 106, 22, 7, 15, 3], [1, 157, 26, 15, 19, 3], [1, 206, 26, 23, 19, 1], [1, 258, 31, 20, 27, 2], [1, 310, 25, 19, 22, 3], [1, 361, 18, 7, 11, 3], [1, 412, 21, 24, 14, 3], [1, 463, 18, 24, 14, 3], [1, 513, 23, 9, 15, 2], [1, 569, 23, 12, 20, 7], [1, 631, 12, 7, 13, 18], [1, 675, 18, 4, 14, 11], [1, 733, 12, 4, 13, 18], [1, 769, 21, 19, 13, 3], [62, 4, 25, 19, 19, 3], [62, 55, 23, 19, 19, 3], [62, 106, 26, 19, 19, 3], [62, 157, 25, 19, 19, 3], [62, 208, 26, 19, 19, 3], [62, 259, 26, 19, 19, 3], [62, 310, 26, 19, 19, 3], [62, 361, 27, 19, 19, 3], [62, 412, 25, 19, 19, 3], [62, 463, 25, 19, 19, 3], [62, 518, 18, 15, 13, 7], [62, 569, 18, 18, 13, 7], [62, 621, 25, 12, 20, 8], [62, 674, 25, 8, 20, 10], [62, 723, 23, 12, 20, 8], [62, 768, 25, 20, 19, 2], [123, 3, 36, 24, 30, 2], [123, 54, 24, 20, 22, 2], [123, 105, 28, 20, 22, 2], [123, 156, 29, 20, 23, 2], [123, 207, 28, 20, 23, 2], [123, 258, 30, 20, 22, 2], [123, 309, 29, 20, 21, 2], [123, 360, 30, 20, 25, 2], [123, 411, 31, 20, 23, 2], [123, 462, 20, 20, 13, 2], [123, 513, 26, 20, 18, 2], [123, 564, 30, 20, 22, 2], [123, 615, 20, 20, 19, 2], [123, 666, 34, 20, 26, 2], [123, 717, 31, 20, 23, 2], [123, 768, 30, 20, 25, 2], [184, 3, 29, 20, 22, 2], [184, 54, 30, 20, 25, 2], [184, 105, 29, 20, 23, 2], [184, 156, 28, 20, 22, 2], [184, 207, 29, 20, 21, 2], [184, 258, 31, 20, 23, 2], [184, 309, 30, 20, 22, 2], [184, 360, 37, 20, 29, 2], [184, 411, 30, 20, 22, 2], [184, 462, 30, 20, 22, 2], [184, 513, 29, 20, 21, 2], [184, 564, 21, 25, 13, 2], [184, 615, 18, 20, 13, 2], [184, 666, 21, 25, 13, 2], [184, 718, 23, 6, 17, 3], [184, 789, 18, 3, 19, 23], [245, 3, 20, 7, 14, 2], [245, 59, 23, 15, 19, 7], [245, 105, 23, 20, 19, 2], [245, 161, 23, 15, 18, 7], [245, 207, 27, 20, 19, 2], [245, 263, 23, 15, 19, 7], [245, 309, 21, 20, 13, 2], [245, 365, 25, 20, 19, 7], [245, 411, 23, 20, 19, 2], [245, 462, 19, 20, 11, 2], [245, 513, 19, 25, 11, 2], [245, 564, 23, 20, 18, 2], [245, 615, 19, 20, 11, 2], [245, 671, 30, 15, 26, 7], [245, 722, 23, 15, 19, 7], [245, 773, 23, 15, 19, 7], [306, 8, 23, 20, 19, 7], [306, 59, 25, 20, 19, 7], [306, 110, 20, 15, 14, 7], [306, 161, 23, 15, 18, 7], [306, 209, 19, 18, 13, 4], [306, 263, 24, 15, 19, 7], [306, 314, 24, 15, 18, 7], [306, 365, 29, 15, 23, 7], [306, 416, 24, 15, 18, 7], [306, 467, 24, 20, 18, 7], [306, 518, 24, 15, 18, 7], [306, 564, 22, 25, 14, 2], [306, 615, 20, 25, 12, 2], [306, 666, 19, 25, 14, 2], [306, 725, 24, 5, 20, 10], [306, 769, 25, 19, 17, 3], [367, 1, 28, 22, 22, 0], [367, 52, 26, 22, 22, 0], [367, 105, 30, 25, 23, 2], [367, 154, 30, 22, 22, 0], [367, 205, 31, 22, 23, 0], [367, 256, 32, 22, 25, 0], [367, 307, 30, 22, 23, 0], [367, 361, 24, 19, 19, 3], [367, 412, 23, 19, 19, 3], [367, 462, 24, 20, 19, 2], [367, 515, 25, 18, 19, 4], [367, 565, 26, 19, 19, 3], [367, 615, 24, 20, 19, 2], [367, 671, 23, 19, 18, 7], [367, 718, 24, 19, 19, 3], [367, 769, 23, 19, 19, 3], [428, 3, 24, 20, 19, 2], [428, 56, 25, 18, 19, 4], [428, 106, 19, 19, 11, 3], [428, 157, 18, 19, 11, 3], [428, 207, 21, 20, 13, 2], [428, 260, 20, 18, 12, 4], [428, 310, 24, 19, 19, 3], [428, 361, 25, 19, 19, 3], [428, 412, 23, 19, 19, 3], [428, 462, 24, 20, 19, 2], [428, 515, 25, 18, 19, 4], [428, 565, 25, 19, 19, 3], [428, 615, 25, 20, 19, 2], [428, 666, 24, 20, 19, 2], [428, 716, 24, 21, 19, 1], [428, 770, 24, 18, 19, 4], [489, 3, 25, 24, 19, 2], [489, 55, 19, 6, 11, 3], [489, 108, 23, 18, 18, 5], [489, 157, 25, 19, 19, 3], [489, 207, 26, 25, 19, 2], [489, 265, 19, 8, 14, 9], [489, 309, 27, 25, 19, 2], [489, 360, 26, 20, 21, 2], [489, 413, 29, 18, 25, 4], [489, 464, 29, 18, 25, 4], [489, 514, 34, 9, 27, 3], [489, 565, 21, 5, 14, 3], [489, 616, 22, 4, 14, 3], [489, 674, 23, 11, 19, 10], [489, 717, 38, 20, 30, 2], [489, 768, 33, 20, 25, 2], [550, 10, 27, 7, 23, 9], [550, 62, 23, 13, 20, 10], [550, 113, 24, 13, 20, 10], [550, 164, 22, 13, 20, 10], [550, 208, 26, 19, 19, 3], [550, 263, 22, 20, 20, 7], [550, 311, 23, 18, 18, 4], [550, 362, 30, 20, 23, 4], [550, 413, 33, 20, 26, 4], [550, 469, 24, 13, 20, 9], [550, 513, 21, 25, 13, 2], [550, 564, 22, 13, 15, 2], [550, 615, 22, 13, 15, 2], [550, 668, 29, 18, 24, 4], [550, 722, 31, 15, 27, 7], [550, 773, 26, 15, 21, 7], [611, 8, 22, 20, 21, 7], [611, 59, 18, 20, 14, 7], [611, 117, 25, 7, 23, 14], [611, 158, 27, 18, 19, 4], [611, 207, 26, 25, 19, 2], [611, 267, 23, 9, 19, 11], [611, 311, 23, 18, 21, 4], [611, 367, 23, 11, 19, 9], [611, 418, 21, 11, 19, 9], [611, 478, 29, 4, 30, 18], [611, 511, 1, 1, 19, 1], [611, 562, 24, 22, 22, 0], [611, 613, 28, 22, 22, 0], [611, 664, 30, 22, 25, 0], [611, 717, 38, 20, 30, 2], [611, 773, 32, 15, 29, 7], [672, 13, 23, 4, 19, 12], [672, 64, 32, 4, 30, 12], [672, 106, 22, 7, 14, 3], [672, 157, 22, 7, 14, 3], [672, 208, 19, 7, 11, 3], [672, 259, 19, 7, 11, 3], [672, 316, 22, 12, 19, 9], [672, 362, 22, 19, 18, 4], [672, 413, 24, 23, 18, 4], [1, 1, 1, 1, 11, 1], [794, 769, 20, 5, 13, 3], [672, 569, 25, 13, 19, 7], [672, 622, 18, 11, 14, 9], [672, 673, 16, 11, 14, 9], [672, 717, 26, 20, 18, 2], [672, 768, 26, 20, 18, 2], [733, 3, 25, 24, 19, 2], [733, 63, 15, 4, 13, 11], [733, 121, 11, 7, 11, 18], [733, 172, 15, 7, 14, 18], [733, 207, 33, 20, 30, 2], [733, 256, 26, 22, 22, 0], [733, 307, 30, 22, 22, 0], [733, 358, 27, 22, 22, 0], [733, 409, 30, 22, 22, 0], [733, 460, 30, 22, 22, 0], [733, 511, 21, 22, 13, 0], [733, 562, 21, 22, 13, 0], [733, 613, 21, 22, 13, 0], [733, 664, 20, 22, 13, 0], [733, 715, 30, 22, 25, 0], [733, 766, 30, 22, 25, 0], [1, 1, 1, 1, 11, 1], [794, 52, 30, 22, 25, 0], [794, 103, 31, 22, 23, 0], [794, 154, 31, 22, 23, 0], [794, 205, 31, 22, 23, 0], [794, 263, 17, 15, 12, 7], [794, 309, 21, 6, 14, 2], [794, 361, 22, 4, 14, 3], [794, 412, 22, 4, 14, 3], [794, 463, 22, 4, 14, 3], [794, 514, 19, 4, 14, 3], [794, 565, 20, 6, 14, 3], [794, 632, 12, 7, 14, 19], [794, 666, 22, 6, 14, 2], [794, 735, 12, 6, 14, 20], [794, 769, 20, 5, 13, 3], [855, 4, 20, 5, 13, 3], [855, 55, 20, 5, 13, 3], [855, 106, 20, 5, 13, 3], [855, 157, 20, 5, 13, 3], [855, 208, 20, 5, 13, 3], [855, 259, 20, 5, 13, 3], [855, 310, 20, 5, 13, 3], [855, 361, 20, 5, 13, 3], [855, 412, 20, 5, 13, 3], [855, 463, 20, 5, 13, 3], [855, 514, 20, 5, 13, 3], [855, 565, 20, 5, 13, 3], [855, 616, 20, 5, 13, 3], [855, 667, 20, 5, 13, 3], [855, 718, 20, 5, 13, 3], [855, 769, 20, 5, 13, 3]], \"capHeight\": 21, \"widestlogicalchar\": 30, \"widestglyph\": 38, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 19, 17, 12, 3], [1, 106, 21, 5, 14, 3], [1, 157, 25, 13, 18, 3], [1, 206, 25, 21, 18, 1], [1, 258, 30, 18, 26, 2], [1, 310, 24, 17, 21, 3], [1, 361, 17, 5, 10, 3], [1, 412, 20, 22, 13, 3], [1, 463, 17, 22, 13, 3], [1, 513, 22, 7, 14, 2], [1, 569, 22, 10, 19, 7], [1, 631, 11, 5, 12, 18], [1, 675, 17, 2, 13, 11], [1, 733, 11, 2, 12, 18], [1, 769, 20, 17, 12, 3], [62, 4, 24, 17, 18, 3], [62, 55, 22, 17, 18, 3], [62, 106, 25, 17, 18, 3], [62, 157, 24, 17, 18, 3], [62, 208, 25, 17, 18, 3], [62, 259, 25, 17, 18, 3], [62, 310, 25, 17, 18, 3], [62, 361, 26, 17, 18, 3], [62, 412, 24, 17, 18, 3], [62, 463, 24, 17, 18, 3], [62, 518, 17, 13, 12, 7], [62, 569, 17, 16, 12, 7], [62, 621, 24, 10, 19, 8], [62, 674, 24, 6, 19, 10], [62, 723, 22, 10, 19, 8], [62, 768, 24, 18, 18, 2], [123, 3, 35, 22, 29, 2], [123, 54, 23, 18, 21, 2], [123, 105, 27, 18, 21, 2], [123, 156, 28, 18, 22, 2], [123, 207, 27, 18, 22, 2], [123, 258, 29, 18, 21, 2], [123, 309, 28, 18, 20, 2], [123, 360, 29, 18, 24, 2], [123, 411, 30, 18, 22, 2], [123, 462, 19, 18, 12, 2], [123, 513, 25, 18, 17, 2], [123, 564, 29, 18, 21, 2], [123, 615, 19, 18, 18, 2], [123, 666, 33, 18, 25, 2], [123, 717, 30, 18, 22, 2], [123, 768, 29, 18, 24, 2], [184, 3, 28, 18, 21, 2], [184, 54, 29, 18, 24, 2], [184, 105, 28, 18, 22, 2], [184, 156, 27, 18, 21, 2], [184, 207, 28, 18, 20, 2], [184, 258, 30, 18, 22, 2], [184, 309, 29, 18, 21, 2], [184, 360, 36, 18, 28, 2], [184, 411, 29, 18, 21, 2], [184, 462, 29, 18, 21, 2], [184, 513, 28, 18, 20, 2], [184, 564, 20, 23, 12, 2], [184, 615, 17, 18, 12, 2], [184, 666, 20, 23, 12, 2], [184, 718, 22, 4, 16, 3], [184, 789, 17, 1, 18, 23], [245, 3, 19, 5, 13, 2], [245, 59, 22, 13, 18, 7], [245, 105, 22, 18, 18, 2], [245, 161, 22, 13, 17, 7], [245, 207, 26, 18, 18, 2], [245, 263, 22, 13, 18, 7], [245, 309, 20, 18, 12, 2], [245, 365, 24, 18, 18, 7], [245, 411, 22, 18, 18, 2], [245, 462, 18, 18, 10, 2], [245, 513, 18, 23, 10, 2], [245, 564, 22, 18, 17, 2], [245, 615, 18, 18, 10, 2], [245, 671, 29, 13, 25, 7], [245, 722, 22, 13, 18, 7], [245, 773, 22, 13, 18, 7], [306, 8, 22, 18, 18, 7], [306, 59, 24, 18, 18, 7], [306, 110, 19, 13, 13, 7], [306, 161, 22, 13, 17, 7], [306, 209, 18, 16, 12, 4], [306, 263, 23, 13, 18, 7], [306, 314, 23, 13, 17, 7], [306, 365, 28, 13, 22, 7], [306, 416, 23, 13, 17, 7], [306, 467, 23, 18, 17, 7], [306, 518, 23, 13, 17, 7], [306, 564, 21, 23, 13, 2], [306, 615, 19, 23, 11, 2], [306, 666, 18, 23, 13, 2], [306, 725, 23, 3, 19, 10], [306, 769, 24, 17, 16, 3], [367, 1, 26, 20, 21, 0], [367, 52, 25, 20, 21, 0], [367, 105, 29, 23, 22, 2], [367, 154, 29, 20, 21, 0], [367, 205, 30, 20, 22, 0], [367, 256, 30, 20, 24, 0], [367, 307, 29, 20, 22, 0], [367, 361, 23, 17, 18, 3], [367, 412, 22, 17, 18, 3], [367, 462, 23, 18, 18, 2], [367, 515, 24, 16, 18, 4], [367, 565, 25, 17, 18, 3], [367, 615, 23, 18, 18, 2], [367, 671, 22, 17, 17, 7], [367, 718, 23, 17, 18, 3], [367, 769, 22, 17, 18, 3], [428, 3, 23, 18, 18, 2], [428, 56, 24, 16, 18, 4], [428, 106, 18, 17, 10, 3], [428, 157, 17, 17, 10, 3], [428, 207, 20, 18, 12, 2], [428, 260, 19, 16, 11, 4], [428, 310, 23, 17, 18, 3], [428, 361, 24, 17, 18, 3], [428, 412, 22, 17, 18, 3], [428, 462, 23, 18, 18, 2], [428, 515, 24, 16, 18, 4], [428, 565, 24, 17, 18, 3], [428, 615, 24, 18, 18, 2], [428, 666, 23, 18, 18, 2], [428, 716, 23, 19, 18, 1], [428, 770, 23, 16, 18, 4], [489, 3, 24, 22, 18, 2], [489, 55, 18, 4, 10, 3], [489, 108, 22, 16, 17, 5], [489, 157, 24, 17, 18, 3], [489, 207, 25, 23, 18, 2], [489, 265, 18, 6, 13, 9], [489, 309, 26, 23, 18, 2], [489, 360, 25, 18, 20, 2], [489, 413, 28, 16, 24, 4], [489, 464, 28, 16, 24, 4], [489, 514, 33, 7, 26, 3], [489, 565, 20, 3, 13, 3], [489, 616, 21, 2, 13, 3], [489, 674, 22, 9, 18, 10], [489, 717, 37, 18, 29, 2], [489, 768, 32, 18, 24, 2], [550, 10, 26, 5, 22, 9], [550, 62, 22, 11, 19, 10], [550, 113, 23, 11, 19, 10], [550, 164, 21, 11, 19, 10], [550, 208, 25, 17, 18, 3], [550, 263, 21, 18, 19, 7], [550, 311, 22, 16, 17, 4], [550, 362, 29, 18, 22, 4], [550, 413, 32, 18, 25, 4], [550, 469, 23, 11, 19, 9], [550, 513, 20, 23, 12, 2], [550, 564, 21, 11, 14, 2], [550, 615, 21, 11, 14, 2], [550, 668, 28, 16, 23, 4], [550, 722, 30, 13, 26, 7], [550, 773, 25, 13, 20, 7], [611, 8, 21, 18, 20, 7], [611, 59, 17, 18, 13, 7], [611, 117, 24, 5, 22, 14], [611, 158, 26, 16, 18, 4], [611, 207, 25, 23, 18, 2], [611, 267, 22, 7, 18, 11], [611, 311, 22, 16, 20, 4], [611, 367, 22, 9, 18, 9], [611, 418, 20, 9, 18, 9], [611, 478, 28, 2, 29, 18], [611, 511, 1, 1, 18, 1], [611, 562, 23, 20, 21, 0], [611, 613, 25, 20, 21, 0], [611, 664, 29, 20, 24, 0], [611, 717, 37, 18, 29, 2], [611, 773, 31, 13, 28, 7], [672, 13, 22, 2, 18, 12], [672, 64, 31, 2, 29, 12], [672, 106, 21, 5, 13, 3], [672, 157, 21, 5, 13, 3], [672, 208, 18, 5, 10, 3], [672, 259, 18, 5, 10, 3], [672, 316, 21, 10, 18, 9], [672, 362, 21, 17, 17, 4], [672, 413, 23, 21, 17, 4], [1, 1, 1, 1, 10, 1], [794, 769, 19, 3, 12, 3], [672, 569, 24, 11, 18, 7], [672, 622, 17, 9, 13, 9], [672, 673, 15, 9, 13, 9], [672, 717, 25, 18, 17, 2], [672, 768, 25, 18, 17, 2], [733, 3, 24, 22, 18, 2], [733, 63, 14, 2, 12, 11], [733, 121, 10, 5, 10, 18], [733, 172, 14, 5, 13, 18], [733, 207, 32, 18, 29, 2], [733, 256, 25, 20, 21, 0], [733, 307, 29, 20, 21, 0], [733, 358, 24, 20, 21, 0], [733, 409, 29, 20, 21, 0], [733, 460, 29, 20, 21, 0], [733, 511, 20, 20, 12, 0], [733, 562, 20, 20, 12, 0], [733, 613, 20, 20, 12, 0], [733, 664, 19, 20, 12, 0], [733, 715, 29, 20, 24, 0], [733, 766, 29, 20, 24, 0], [1, 1, 1, 1, 10, 1], [794, 52, 29, 20, 24, 0], [794, 103, 30, 20, 22, 0], [794, 154, 30, 20, 22, 0], [794, 205, 30, 20, 22, 0], [794, 263, 16, 13, 11, 7], [794, 309, 20, 4, 13, 2], [794, 361, 21, 2, 13, 3], [794, 412, 21, 2, 13, 3], [794, 463, 21, 2, 13, 3], [794, 514, 18, 2, 13, 3], [794, 565, 19, 4, 13, 3], [794, 632, 11, 5, 13, 19], [794, 666, 21, 4, 13, 2], [794, 735, 11, 4, 13, 20], [794, 769, 19, 3, 12, 3], [855, 4, 19, 3, 12, 3], [855, 55, 19, 3, 12, 3], [855, 106, 19, 3, 12, 3], [855, 157, 19, 3, 12, 3], [855, 208, 19, 3, 12, 3], [855, 259, 19, 3, 12, 3], [855, 310, 19, 3, 12, 3], [855, 361, 19, 3, 12, 3], [855, 412, 19, 3, 12, 3], [855, 463, 19, 3, 12, 3], [855, 514, 19, 3, 12, 3], [855, 565, 19, 3, 12, 3], [855, 616, 19, 3, 12, 3], [855, 667, 19, 3, 12, 3], [855, 718, 19, 3, 12, 3], [855, 769, 19, 3, 12, 3]], \"capHeight\": 20, \"widestlogicalchar\": 29, \"widestglyph\": 37, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 27, \"leftmost\": 2, \"capHeight\": 21, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 16, 11, 6, 11, 15], [1, 55, 13, 19, 13, 3], [1, 106, 15, 18, 15, 3], [1, 157, 19, 18, 19, 3], [1, 206, 19, 23, 19, 1], [1, 258, 27, 20, 27, 2], [1, 310, 22, 19, 22, 3], [1, 361, 11, 18, 11, 3], [1, 412, 14, 24, 14, 3], [1, 463, 14, 24, 14, 3], [1, 513, 15, 19, 15, 2], [1, 569, 20, 14, 20, 7], [1, 628, 13, 10, 13, 15], [1, 675, 14, 10, 14, 11], [1, 730, 13, 7, 13, 15], [1, 769, 13, 19, 13, 3], [62, 4, 19, 19, 19, 3], [62, 55, 19, 19, 19, 3], [62, 106, 19, 19, 19, 3], [62, 157, 19, 19, 19, 3], [62, 208, 19, 19, 19, 3], [62, 259, 19, 19, 19, 3], [62, 310, 19, 19, 19, 3], [62, 361, 19, 19, 19, 3], [62, 412, 19, 19, 19, 3], [62, 463, 19, 19, 19, 3], [62, 518, 13, 15, 13, 7], [62, 569, 13, 18, 13, 7], [62, 621, 20, 13, 20, 8], [62, 674, 20, 11, 20, 10], [62, 723, 20, 13, 20, 8], [62, 768, 19, 20, 19, 2], [123, 3, 30, 24, 30, 2], [123, 54, 22, 20, 22, 2], [123, 105, 22, 20, 22, 2], [123, 156, 23, 20, 23, 2], [123, 207, 23, 20, 23, 2], [123, 258, 22, 20, 22, 2], [123, 309, 21, 20, 21, 2], [123, 360, 25, 20, 25, 2], [123, 411, 23, 20, 23, 2], [123, 462, 13, 20, 13, 2], [123, 513, 18, 20, 18, 2], [123, 564, 22, 20, 22, 2], [123, 615, 19, 20, 19, 2], [123, 666, 26, 20, 26, 2], [123, 717, 23, 20, 23, 2], [123, 768, 25, 20, 25, 2], [184, 3, 22, 20, 22, 2], [184, 54, 25, 20, 25, 2], [184, 105, 23, 20, 23, 2], [184, 156, 22, 20, 22, 2], [184, 207, 21, 20, 21, 2], [184, 258, 23, 20, 23, 2], [184, 309, 22, 20, 22, 2], [184, 360, 29, 20, 29, 2], [184, 411, 22, 20, 22, 2], [184, 462, 22, 20, 22, 2], [184, 513, 21, 20, 21, 2], [184, 564, 13, 25, 13, 2], [184, 615, 13, 20, 13, 2], [184, 666, 13, 25, 13, 2], [184, 718, 17, 18, 17, 3], [184, 781, 19, 11, 19, 15], [245, 3, 14, 19, 14, 2], [245, 59, 19, 15, 19, 7], [245, 105, 19, 20, 19, 2], [245, 161, 18, 15, 18, 7], [245, 207, 19, 20, 19, 2], [245, 263, 19, 15, 19, 7], [245, 309, 13, 20, 13, 2], [245, 365, 19, 20, 19, 7], [245, 411, 19, 20, 19, 2], [245, 462, 11, 20, 11, 2], [245, 513, 11, 25, 11, 2], [245, 564, 18, 20, 18, 2], [245, 615, 11, 20, 11, 2], [245, 671, 26, 15, 26, 7], [245, 722, 19, 15, 19, 7], [245, 773, 19, 15, 19, 7], [306, 8, 19, 20, 19, 7], [306, 59, 19, 20, 19, 7], [306, 110, 14, 15, 14, 7], [306, 161, 18, 15, 18, 7], [306, 209, 13, 18, 13, 4], [306, 263, 19, 15, 19, 7], [306, 314, 18, 15, 18, 7], [306, 365, 23, 15, 23, 7], [306, 416, 18, 15, 18, 7], [306, 467, 18, 20, 18, 7], [306, 518, 18, 15, 18, 7], [306, 564, 14, 25, 14, 2], [306, 615, 12, 25, 12, 2], [306, 666, 14, 25, 14, 2], [306, 725, 20, 11, 20, 10], [306, 769, 17, 19, 17, 3], [367, 1, 22, 22, 22, 0], [367, 52, 22, 22, 22, 0], [367, 105, 23, 25, 23, 2], [367, 154, 22, 22, 22, 0], [367, 205, 23, 22, 23, 0], [367, 256, 25, 22, 25, 0], [367, 307, 23, 22, 23, 0], [367, 361, 19, 19, 19, 3], [367, 412, 19, 19, 19, 3], [367, 462, 19, 20, 19, 2], [367, 515, 19, 18, 19, 4], [367, 565, 19, 19, 19, 3], [367, 615, 19, 20, 19, 2], [367, 671, 18, 19, 18, 7], [367, 718, 19, 19, 19, 3], [367, 769, 19, 19, 19, 3], [428, 3, 19, 20, 19, 2], [428, 56, 19, 18, 19, 4], [428, 106, 11, 19, 11, 3], [428, 157, 11, 19, 11, 3], [428, 207, 13, 20, 13, 2], [428, 260, 12, 18, 12, 4], [428, 310, 19, 19, 19, 3], [428, 361, 19, 19, 19, 3], [428, 412, 19, 19, 19, 3], [428, 462, 19, 20, 19, 2], [428, 515, 19, 18, 19, 4], [428, 565, 19, 19, 19, 3], [428, 615, 19, 20, 19, 2], [428, 666, 19, 20, 19, 2], [428, 716, 19, 21, 19, 1], [428, 770, 19, 18, 19, 4], [489, 3, 19, 24, 19, 2], [489, 55, 11, 18, 11, 3], [489, 108, 18, 18, 18, 5], [489, 157, 19, 19, 19, 3], [489, 207, 19, 25, 19, 2], [489, 265, 14, 12, 14, 9], [489, 309, 19, 25, 19, 2], [489, 360, 21, 20, 21, 2], [489, 413, 25, 18, 25, 4], [489, 464, 25, 18, 25, 4], [489, 514, 27, 18, 27, 3], [489, 565, 14, 18, 14, 3], [489, 616, 14, 18, 14, 3], [489, 674, 19, 11, 19, 10], [489, 717, 30, 20, 30, 2], [489, 768, 25, 20, 25, 2], [550, 10, 23, 12, 23, 9], [550, 62, 20, 13, 20, 10], [550, 113, 20, 13, 20, 10], [550, 164, 20, 13, 20, 10], [550, 208, 19, 19, 19, 3], [550, 263, 20, 20, 20, 7], [550, 311, 18, 18, 18, 4], [550, 362, 23, 20, 23, 4], [550, 413, 26, 20, 26, 4], [550, 469, 20, 13, 20, 9], [550, 513, 13, 25, 13, 2], [550, 564, 15, 19, 15, 2], [550, 615, 15, 19, 15, 2], [550, 668, 24, 18, 24, 4], [550, 722, 27, 15, 27, 7], [550, 773, 21, 15, 21, 7], [611, 8, 21, 20, 21, 7], [611, 59, 14, 20, 14, 7], [611, 117, 23, 7, 23, 14], [611, 158, 19, 18, 19, 4], [611, 207, 19, 25, 19, 2], [611, 267, 19, 10, 19, 11], [611, 311, 21, 18, 21, 4], [611, 367, 19, 12, 19, 9], [611, 418, 19, 12, 19, 9], [611, 475, 30, 7, 30, 15], [611, 526, 19, 6, 19, 15], [611, 562, 22, 22, 22, 0], [611, 613, 22, 22, 22, 0], [611, 664, 25, 22, 25, 0], [611, 717, 30, 20, 30, 2], [611, 773, 29, 15, 29, 7], [672, 13, 19, 9, 19, 12], [672, 64, 30, 9, 30, 12], [672, 106, 14, 18, 14, 3], [672, 157, 14, 18, 14, 3], [672, 208, 11, 18, 11, 3], [672, 259, 11, 18, 11, 3], [672, 316, 19, 12, 19, 9], [672, 362, 18, 19, 18, 4], [672, 413, 18, 23, 18, 4], [1, 16, 11, 6, 11, 15], [794, 769, 13, 18, 13, 3], [672, 569, 19, 14, 19, 7], [672, 622, 14, 12, 14, 9], [672, 673, 14, 12, 14, 9], [672, 717, 18, 20, 18, 2], [672, 768, 18, 20, 18, 2], [733, 3, 19, 24, 19, 2], [733, 63, 13, 10, 13, 11], [733, 118, 11, 10, 11, 15], [733, 169, 14, 10, 14, 15], [733, 207, 30, 20, 30, 2], [733, 256, 22, 22, 22, 0], [733, 307, 22, 22, 22, 0], [733, 358, 22, 22, 22, 0], [733, 409, 22, 22, 22, 0], [733, 460, 22, 22, 22, 0], [733, 511, 13, 22, 13, 0], [733, 562, 13, 22, 13, 0], [733, 613, 13, 22, 13, 0], [733, 664, 13, 22, 13, 0], [733, 715, 25, 22, 25, 0], [733, 766, 25, 22, 25, 0], [1, 16, 11, 6, 11, 15], [794, 52, 25, 22, 25, 0], [794, 103, 23, 22, 23, 0], [794, 154, 23, 22, 23, 0], [794, 205, 23, 22, 23, 0], [794, 263, 12, 15, 12, 7], [794, 309, 14, 19, 14, 2], [794, 361, 14, 18, 14, 3], [794, 412, 14, 18, 14, 3], [794, 463, 14, 18, 14, 3], [794, 514, 14, 18, 14, 3], [794, 565, 14, 18, 14, 3], [794, 628, 14, 11, 14, 15], [794, 666, 14, 19, 14, 2], [794, 730, 14, 11, 14, 15], [794, 769, 13, 18, 13, 3], [855, 4, 13, 18, 13, 3], [855, 55, 13, 18, 13, 3], [855, 106, 13, 18, 13, 3], [855, 157, 13, 18, 13, 3], [855, 208, 13, 18, 13, 3], [855, 259, 13, 18, 13, 3], [855, 310, 13, 18, 13, 3], [855, 361, 13, 18, 13, 3], [855, 412, 13, 18, 13, 3], [855, 463, 13, 18, 13, 3], [855, 514, 13, 18, 13, 3], [855, 565, 13, 18, 13, 3], [855, 616, 13, 18, 13, 3], [855, 667, 13, 18, 13, 3], [855, 718, 13, 18, 13, 3], [855, 769, 13, 18, 13, 3]], \"widestlogicalchar\": 30, \"widestglyph\": 30, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"capHeight\": 20, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 15, 10, 6, 10, 14], [1, 55, 12, 17, 12, 3], [1, 106, 14, 17, 14, 3], [1, 157, 18, 17, 18, 3], [1, 206, 18, 21, 18, 1], [1, 258, 26, 18, 26, 2], [1, 310, 21, 17, 21, 3], [1, 361, 10, 17, 10, 3], [1, 412, 13, 22, 13, 3], [1, 463, 13, 22, 13, 3], [1, 513, 14, 18, 14, 2], [1, 569, 19, 13, 19, 7], [1, 627, 12, 9, 12, 14], [1, 675, 13, 9, 13, 11], [1, 729, 12, 6, 12, 14], [1, 769, 12, 17, 12, 3], [62, 4, 18, 17, 18, 3], [62, 55, 18, 17, 18, 3], [62, 106, 18, 17, 18, 3], [62, 157, 18, 17, 18, 3], [62, 208, 18, 17, 18, 3], [62, 259, 18, 17, 18, 3], [62, 310, 18, 17, 18, 3], [62, 361, 18, 17, 18, 3], [62, 412, 18, 17, 18, 3], [62, 463, 18, 17, 18, 3], [62, 518, 12, 13, 12, 7], [62, 569, 12, 16, 12, 7], [62, 621, 19, 12, 19, 8], [62, 674, 19, 10, 19, 10], [62, 723, 19, 12, 19, 8], [62, 768, 18, 18, 18, 2], [123, 3, 29, 22, 29, 2], [123, 54, 21, 18, 21, 2], [123, 105, 21, 18, 21, 2], [123, 156, 22, 18, 22, 2], [123, 207, 22, 18, 22, 2], [123, 258, 21, 18, 21, 2], [123, 309, 20, 18, 20, 2], [123, 360, 24, 18, 24, 2], [123, 411, 22, 18, 22, 2], [123, 462, 12, 18, 12, 2], [123, 513, 17, 18, 17, 2], [123, 564, 21, 18, 21, 2], [123, 615, 18, 18, 18, 2], [123, 666, 25, 18, 25, 2], [123, 717, 22, 18, 22, 2], [123, 768, 24, 18, 24, 2], [184, 3, 21, 18, 21, 2], [184, 54, 24, 18, 24, 2], [184, 105, 22, 18, 22, 2], [184, 156, 21, 18, 21, 2], [184, 207, 20, 18, 20, 2], [184, 258, 22, 18, 22, 2], [184, 309, 21, 18, 21, 2], [184, 360, 28, 18, 28, 2], [184, 411, 21, 18, 21, 2], [184, 462, 21, 18, 21, 2], [184, 513, 20, 18, 20, 2], [184, 564, 12, 23, 12, 2], [184, 615, 12, 18, 12, 2], [184, 666, 12, 23, 12, 2], [184, 718, 16, 17, 16, 3], [184, 780, 18, 10, 18, 14], [245, 3, 13, 18, 13, 2], [245, 59, 18, 13, 18, 7], [245, 105, 18, 18, 18, 2], [245, 161, 17, 13, 17, 7], [245, 207, 18, 18, 18, 2], [245, 263, 18, 13, 18, 7], [245, 309, 12, 18, 12, 2], [245, 365, 18, 18, 18, 7], [245, 411, 18, 18, 18, 2], [245, 462, 10, 18, 10, 2], [245, 513, 10, 23, 10, 2], [245, 564, 17, 18, 17, 2], [245, 615, 10, 18, 10, 2], [245, 671, 25, 13, 25, 7], [245, 722, 18, 13, 18, 7], [245, 773, 18, 13, 18, 7], [306, 8, 18, 18, 18, 7], [306, 59, 18, 18, 18, 7], [306, 110, 13, 13, 13, 7], [306, 161, 17, 13, 17, 7], [306, 209, 12, 16, 12, 4], [306, 263, 18, 13, 18, 7], [306, 314, 17, 13, 17, 7], [306, 365, 22, 13, 22, 7], [306, 416, 17, 13, 17, 7], [306, 467, 17, 18, 17, 7], [306, 518, 17, 13, 17, 7], [306, 564, 13, 23, 13, 2], [306, 615, 11, 23, 11, 2], [306, 666, 13, 23, 13, 2], [306, 725, 19, 10, 19, 10], [306, 769, 16, 17, 16, 3], [367, 1, 21, 20, 21, 0], [367, 52, 21, 20, 21, 0], [367, 105, 22, 23, 22, 2], [367, 154, 21, 20, 21, 0], [367, 205, 22, 20, 22, 0], [367, 256, 24, 20, 24, 0], [367, 307, 22, 20, 22, 0], [367, 361, 18, 17, 18, 3], [367, 412, 18, 17, 18, 3], [367, 462, 18, 18, 18, 2], [367, 515, 18, 16, 18, 4], [367, 565, 18, 17, 18, 3], [367, 615, 18, 18, 18, 2], [367, 671, 17, 17, 17, 7], [367, 718, 18, 17, 18, 3], [367, 769, 18, 17, 18, 3], [428, 3, 18, 18, 18, 2], [428, 56, 18, 16, 18, 4], [428, 106, 10, 17, 10, 3], [428, 157, 10, 17, 10, 3], [428, 207, 12, 18, 12, 2], [428, 260, 11, 16, 11, 4], [428, 310, 18, 17, 18, 3], [428, 361, 18, 17, 18, 3], [428, 412, 18, 17, 18, 3], [428, 462, 18, 18, 18, 2], [428, 515, 18, 16, 18, 4], [428, 565, 18, 17, 18, 3], [428, 615, 18, 18, 18, 2], [428, 666, 18, 18, 18, 2], [428, 716, 18, 19, 18, 1], [428, 770, 18, 16, 18, 4], [489, 3, 18, 22, 18, 2], [489, 55, 10, 17, 10, 3], [489, 108, 17, 16, 17, 5], [489, 157, 18, 17, 18, 3], [489, 207, 18, 23, 18, 2], [489, 265, 13, 11, 13, 9], [489, 309, 18, 23, 18, 2], [489, 360, 20, 18, 20, 2], [489, 413, 24, 16, 24, 4], [489, 464, 24, 16, 24, 4], [489, 514, 26, 17, 26, 3], [489, 565, 13, 17, 13, 3], [489, 616, 13, 17, 13, 3], [489, 674, 18, 10, 18, 10], [489, 717, 29, 18, 29, 2], [489, 768, 24, 18, 24, 2], [550, 10, 22, 11, 22, 9], [550, 62, 19, 11, 19, 10], [550, 113, 19, 11, 19, 10], [550, 164, 19, 11, 19, 10], [550, 208, 18, 17, 18, 3], [550, 263, 19, 18, 19, 7], [550, 311, 17, 16, 17, 4], [550, 362, 22, 18, 22, 4], [550, 413, 25, 18, 25, 4], [550, 469, 19, 11, 19, 9], [550, 513, 12, 23, 12, 2], [550, 564, 14, 18, 14, 2], [550, 615, 14, 18, 14, 2], [550, 668, 23, 16, 23, 4], [550, 722, 26, 13, 26, 7], [550, 773, 20, 13, 20, 7], [611, 8, 20, 18, 20, 7], [611, 59, 13, 18, 13, 7], [611, 117, 22, 6, 22, 14], [611, 158, 18, 16, 18, 4], [611, 207, 18, 23, 18, 2], [611, 267, 18, 9, 18, 11], [611, 311, 20, 16, 20, 4], [611, 367, 18, 11, 18, 9], [611, 418, 18, 11, 18, 9], [611, 474, 29, 6, 29, 14], [611, 525, 18, 6, 18, 14], [611, 562, 21, 20, 21, 0], [611, 613, 21, 20, 21, 0], [611, 664, 24, 20, 24, 0], [611, 717, 29, 18, 29, 2], [611, 773, 28, 13, 28, 7], [672, 13, 18, 8, 18, 12], [672, 64, 29, 8, 29, 12], [672, 106, 13, 17, 13, 3], [672, 157, 13, 17, 13, 3], [672, 208, 10, 17, 10, 3], [672, 259, 10, 17, 10, 3], [672, 316, 18, 11, 18, 9], [672, 362, 17, 17, 17, 4], [672, 413, 17, 21, 17, 4], [1, 15, 10, 6, 10, 14], [794, 769, 12, 17, 12, 3], [672, 569, 18, 13, 18, 7], [672, 622, 13, 11, 13, 9], [672, 673, 13, 11, 13, 9], [672, 717, 17, 18, 17, 2], [672, 768, 17, 18, 17, 2], [733, 3, 18, 22, 18, 2], [733, 63, 12, 9, 12, 11], [733, 117, 10, 9, 10, 14], [733, 168, 13, 9, 13, 14], [733, 207, 29, 18, 29, 2], [733, 256, 21, 20, 21, 0], [733, 307, 21, 20, 21, 0], [733, 358, 21, 20, 21, 0], [733, 409, 21, 20, 21, 0], [733, 460, 21, 20, 21, 0], [733, 511, 12, 20, 12, 0], [733, 562, 12, 20, 12, 0], [733, 613, 12, 20, 12, 0], [733, 664, 12, 20, 12, 0], [733, 715, 24, 20, 24, 0], [733, 766, 24, 20, 24, 0], [1, 15, 10, 6, 10, 14], [794, 52, 24, 20, 24, 0], [794, 103, 22, 20, 22, 0], [794, 154, 22, 20, 22, 0], [794, 205, 22, 20, 22, 0], [794, 263, 11, 13, 11, 7], [794, 309, 13, 18, 13, 2], [794, 361, 13, 17, 13, 3], [794, 412, 13, 17, 13, 3], [794, 463, 13, 17, 13, 3], [794, 514, 13, 17, 13, 3], [794, 565, 13, 17, 13, 3], [794, 627, 13, 10, 13, 14], [794, 666, 13, 18, 13, 2], [794, 729, 13, 10, 13, 14], [794, 769, 12, 17, 12, 3], [855, 4, 12, 17, 12, 3], [855, 55, 12, 17, 12, 3], [855, 106, 12, 17, 12, 3], [855, 157, 12, 17, 12, 3], [855, 208, 12, 17, 12, 3], [855, 259, 12, 17, 12, 3], [855, 310, 12, 17, 12, 3], [855, 361, 12, 17, 12, 3], [855, 412, 12, 17, 12, 3], [855, 463, 12, 17, 12, 3], [855, 514, 12, 17, 12, 3], [855, 565, 12, 17, 12, 3], [855, 616, 12, 17, 12, 3], [855, 667, 12, 17, 12, 3], [855, 718, 12, 17, 12, 3], [855, 769, 12, 17, 12, 3]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 27, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 19, 19, 12, 3], [1, 106, 21, 7, 14, 3], [1, 157, 25, 15, 18, 3], [1, 206, 25, 23, 18, 1], [1, 258, 30, 20, 26, 2], [1, 310, 24, 19, 21, 3], [1, 361, 17, 7, 10, 3], [1, 412, 20, 24, 13, 3], [1, 463, 17, 24, 13, 3], [1, 513, 22, 9, 14, 2], [1, 569, 22, 12, 19, 7], [1, 631, 11, 7, 12, 18], [1, 675, 17, 4, 13, 11], [1, 733, 11, 4, 12, 18], [1, 769, 20, 19, 12, 3], [62, 4, 24, 19, 18, 3], [62, 55, 22, 19, 18, 3], [62, 106, 25, 19, 18, 3], [62, 157, 24, 19, 18, 3], [62, 208, 25, 19, 18, 3], [62, 259, 25, 19, 18, 3], [62, 310, 25, 19, 18, 3], [62, 361, 26, 19, 18, 3], [62, 412, 24, 19, 18, 3], [62, 463, 24, 19, 18, 3], [62, 518, 17, 15, 12, 7], [62, 569, 17, 18, 12, 7], [62, 621, 24, 12, 19, 8], [62, 674, 24, 8, 19, 10], [62, 723, 22, 12, 19, 8], [62, 768, 24, 20, 18, 2], [123, 3, 35, 24, 29, 2], [123, 54, 23, 20, 21, 2], [123, 105, 27, 20, 21, 2], [123, 156, 28, 20, 22, 2], [123, 207, 27, 20, 22, 2], [123, 258, 29, 20, 21, 2], [123, 309, 28, 20, 20, 2], [123, 360, 29, 20, 24, 2], [123, 411, 30, 20, 22, 2], [123, 462, 19, 20, 12, 2], [123, 513, 25, 20, 17, 2], [123, 564, 29, 20, 21, 2], [123, 615, 19, 20, 18, 2], [123, 666, 33, 20, 25, 2], [123, 717, 30, 20, 22, 2], [123, 768, 29, 20, 24, 2], [184, 3, 28, 20, 21, 2], [184, 54, 29, 20, 24, 2], [184, 105, 28, 20, 22, 2], [184, 156, 27, 20, 21, 2], [184, 207, 28, 20, 20, 2], [184, 258, 30, 20, 22, 2], [184, 309, 29, 20, 21, 2], [184, 360, 36, 20, 28, 2], [184, 411, 29, 20, 21, 2], [184, 462, 29, 20, 21, 2], [184, 513, 28, 20, 20, 2], [184, 564, 20, 25, 12, 2], [184, 615, 17, 20, 12, 2], [184, 666, 20, 25, 12, 2], [184, 718, 22, 6, 16, 3], [184, 789, 17, 3, 18, 23], [245, 3, 19, 7, 13, 2], [245, 59, 22, 15, 18, 7], [245, 105, 22, 20, 18, 2], [245, 161, 22, 15, 17, 7], [245, 207, 26, 20, 18, 2], [245, 263, 22, 15, 18, 7], [245, 309, 20, 20, 12, 2], [245, 365, 24, 20, 18, 7], [245, 411, 22, 20, 18, 2], [245, 462, 18, 20, 10, 2], [245, 513, 18, 25, 10, 2], [245, 564, 22, 20, 17, 2], [245, 615, 18, 20, 10, 2], [245, 671, 29, 15, 25, 7], [245, 722, 22, 15, 18, 7], [245, 773, 22, 15, 18, 7], [306, 8, 22, 20, 18, 7], [306, 59, 24, 20, 18, 7], [306, 110, 19, 15, 13, 7], [306, 161, 22, 15, 17, 7], [306, 209, 18, 18, 12, 4], [306, 263, 23, 15, 18, 7], [306, 314, 23, 15, 17, 7], [306, 365, 28, 15, 22, 7], [306, 416, 23, 15, 17, 7], [306, 467, 23, 20, 17, 7], [306, 518, 23, 15, 17, 7], [306, 564, 21, 25, 13, 2], [306, 615, 19, 25, 11, 2], [306, 666, 18, 25, 13, 2], [306, 725, 23, 5, 19, 10], [306, 769, 24, 19, 16, 3], [367, 1, 27, 22, 21, 0], [367, 52, 25, 22, 21, 0], [367, 105, 29, 25, 22, 2], [367, 154, 29, 22, 21, 0], [367, 205, 30, 22, 22, 0], [367, 256, 31, 22, 24, 0], [367, 307, 29, 22, 22, 0], [367, 361, 23, 19, 18, 3], [367, 412, 22, 19, 18, 3], [367, 462, 23, 20, 18, 2], [367, 515, 24, 18, 18, 4], [367, 565, 25, 19, 18, 3], [367, 615, 23, 20, 18, 2], [367, 671, 22, 19, 17, 7], [367, 718, 23, 19, 18, 3], [367, 769, 22, 19, 18, 3], [428, 3, 23, 20, 18, 2], [428, 56, 24, 18, 18, 4], [428, 106, 18, 19, 10, 3], [428, 157, 17, 19, 10, 3], [428, 207, 20, 20, 12, 2], [428, 260, 19, 18, 11, 4], [428, 310, 23, 19, 18, 3], [428, 361, 24, 19, 18, 3], [428, 412, 22, 19, 18, 3], [428, 462, 23, 20, 18, 2], [428, 515, 24, 18, 18, 4], [428, 565, 24, 19, 18, 3], [428, 615, 24, 20, 18, 2], [428, 666, 23, 20, 18, 2], [428, 716, 23, 21, 18, 1], [428, 770, 23, 18, 18, 4], [489, 3, 24, 24, 18, 2], [489, 55, 18, 6, 10, 3], [489, 108, 22, 18, 17, 5], [489, 157, 24, 19, 18, 3], [489, 207, 25, 25, 18, 2], [489, 265, 18, 8, 13, 9], [489, 309, 26, 25, 18, 2], [489, 360, 25, 20, 20, 2], [489, 413, 28, 18, 24, 4], [489, 464, 28, 18, 24, 4], [489, 514, 33, 9, 26, 3], [489, 565, 20, 5, 13, 3], [489, 616, 21, 4, 13, 3], [489, 674, 22, 11, 18, 10], [489, 717, 37, 20, 29, 2], [489, 768, 32, 20, 24, 2], [550, 10, 26, 7, 22, 9], [550, 62, 22, 13, 19, 10], [550, 113, 23, 13, 19, 10], [550, 164, 21, 13, 19, 10], [550, 208, 25, 19, 18, 3], [550, 263, 21, 20, 19, 7], [550, 311, 22, 18, 17, 4], [550, 362, 29, 20, 22, 4], [550, 413, 32, 20, 25, 4], [550, 469, 23, 13, 19, 9], [550, 513, 20, 25, 12, 2], [550, 564, 21, 13, 14, 2], [550, 615, 21, 13, 14, 2], [550, 668, 28, 18, 23, 4], [550, 722, 30, 15, 26, 7], [550, 773, 25, 15, 20, 7], [611, 8, 21, 20, 20, 7], [611, 59, 17, 20, 13, 7], [611, 117, 24, 7, 22, 14], [611, 158, 26, 18, 18, 4], [611, 207, 25, 25, 18, 2], [611, 267, 22, 9, 18, 11], [611, 311, 22, 18, 20, 4], [611, 367, 22, 11, 18, 9], [611, 418, 20, 11, 18, 9], [611, 478, 28, 4, 29, 18], [611, 511, 1, 1, 18, 1], [611, 562, 23, 22, 21, 0], [611, 613, 27, 22, 21, 0], [611, 664, 29, 22, 24, 0], [611, 717, 37, 20, 29, 2], [611, 773, 31, 15, 28, 7], [672, 13, 22, 4, 18, 12], [672, 64, 31, 4, 29, 12], [672, 106, 21, 7, 13, 3], [672, 157, 21, 7, 13, 3], [672, 208, 18, 7, 10, 3], [672, 259, 18, 7, 10, 3], [672, 316, 21, 12, 18, 9], [672, 362, 21, 19, 17, 4], [672, 413, 23, 23, 17, 4], [1, 1, 1, 1, 10, 1], [794, 769, 19, 5, 12, 3], [672, 569, 24, 13, 18, 7], [672, 622, 17, 11, 13, 9], [672, 673, 15, 11, 13, 9], [672, 717, 25, 20, 17, 2], [672, 768, 25, 20, 17, 2], [733, 3, 24, 24, 18, 2], [733, 63, 14, 4, 12, 11], [733, 121, 10, 7, 10, 18], [733, 172, 14, 7, 13, 18], [733, 207, 32, 20, 29, 2], [733, 256, 25, 22, 21, 0], [733, 307, 29, 22, 21, 0], [733, 358, 26, 22, 21, 0], [733, 409, 29, 22, 21, 0], [733, 460, 29, 22, 21, 0], [733, 511, 20, 22, 12, 0], [733, 562, 20, 22, 12, 0], [733, 613, 20, 22, 12, 0], [733, 664, 19, 22, 12, 0], [733, 715, 29, 22, 24, 0], [733, 766, 29, 22, 24, 0], [1, 1, 1, 1, 10, 1], [794, 52, 29, 22, 24, 0], [794, 103, 30, 22, 22, 0], [794, 154, 30, 22, 22, 0], [794, 205, 30, 22, 22, 0], [794, 263, 16, 15, 11, 7], [794, 309, 20, 6, 13, 2], [794, 361, 21, 4, 13, 3], [794, 412, 21, 4, 13, 3], [794, 463, 21, 4, 13, 3], [794, 514, 18, 4, 13, 3], [794, 565, 19, 6, 13, 3], [794, 632, 11, 7, 13, 19], [794, 666, 21, 6, 13, 2], [794, 735, 11, 6, 13, 20], [794, 769, 19, 5, 12, 3], [855, 4, 19, 5, 12, 3], [855, 55, 19, 5, 12, 3], [855, 106, 19, 5, 12, 3], [855, 157, 19, 5, 12, 3], [855, 208, 19, 5, 12, 3], [855, 259, 19, 5, 12, 3], [855, 310, 19, 5, 12, 3], [855, 361, 19, 5, 12, 3], [855, 412, 19, 5, 12, 3], [855, 463, 19, 5, 12, 3], [855, 514, 19, 5, 12, 3], [855, 565, 19, 5, 12, 3], [855, 616, 19, 5, 12, 3], [855, 667, 19, 5, 12, 3], [855, 718, 19, 5, 12, 3], [855, 769, 19, 5, 12, 3]], \"capHeight\": 21, \"widestlogicalchar\": 29, \"widestglyph\": 37, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 55, 18, 17, 10, 3], [1, 106, 20, 5, 12, 3], [1, 157, 24, 13, 16, 3], [1, 206, 24, 21, 16, 1], [1, 258, 29, 18, 24, 2], [1, 310, 23, 17, 19, 3], [1, 361, 16, 5, 8, 3], [1, 412, 19, 22, 11, 3], [1, 463, 16, 22, 11, 3], [1, 513, 21, 7, 12, 2], [1, 569, 21, 10, 17, 7], [1, 631, 10, 5, 10, 18], [1, 675, 16, 2, 11, 11], [1, 733, 10, 2, 10, 18], [1, 769, 19, 17, 10, 3], [62, 4, 23, 17, 16, 3], [62, 55, 21, 17, 16, 3], [62, 106, 24, 17, 16, 3], [62, 157, 23, 17, 16, 3], [62, 208, 24, 17, 16, 3], [62, 259, 24, 17, 16, 3], [62, 310, 24, 17, 16, 3], [62, 361, 25, 17, 16, 3], [62, 412, 23, 17, 16, 3], [62, 463, 23, 17, 16, 3], [62, 518, 16, 13, 10, 7], [62, 569, 16, 16, 10, 7], [62, 621, 23, 10, 17, 8], [62, 674, 23, 6, 17, 10], [62, 723, 21, 10, 17, 8], [62, 768, 23, 18, 16, 2], [123, 3, 34, 22, 27, 2], [123, 54, 22, 18, 19, 2], [123, 105, 26, 18, 19, 2], [123, 156, 27, 18, 20, 2], [123, 207, 26, 18, 20, 2], [123, 258, 28, 18, 19, 2], [123, 309, 27, 18, 18, 2], [123, 360, 28, 18, 22, 2], [123, 411, 29, 18, 20, 2], [123, 462, 18, 18, 10, 2], [123, 513, 24, 18, 15, 2], [123, 564, 28, 18, 19, 2], [123, 615, 18, 18, 16, 2], [123, 666, 32, 18, 23, 2], [123, 717, 29, 18, 20, 2], [123, 768, 28, 18, 22, 2], [184, 3, 27, 18, 19, 2], [184, 54, 28, 18, 22, 2], [184, 105, 27, 18, 20, 2], [184, 156, 26, 18, 19, 2], [184, 207, 27, 18, 18, 2], [184, 258, 29, 18, 20, 2], [184, 309, 28, 18, 19, 2], [184, 360, 35, 18, 26, 2], [184, 411, 28, 18, 19, 2], [184, 462, 28, 18, 19, 2], [184, 513, 27, 18, 18, 2], [184, 564, 19, 23, 10, 2], [184, 615, 16, 18, 10, 2], [184, 666, 19, 23, 10, 2], [184, 718, 21, 4, 14, 3], [184, 789, 16, 1, 16, 23], [245, 3, 18, 5, 11, 2], [245, 59, 21, 13, 16, 7], [245, 105, 21, 18, 16, 2], [245, 161, 21, 13, 15, 7], [245, 207, 25, 18, 16, 2], [245, 263, 21, 13, 16, 7], [245, 309, 19, 18, 10, 2], [245, 365, 23, 18, 16, 7], [245, 411, 21, 18, 16, 2], [245, 462, 17, 18, 8, 2], [245, 513, 17, 23, 8, 2], [245, 564, 21, 18, 15, 2], [245, 615, 17, 18, 8, 2], [245, 671, 28, 13, 23, 7], [245, 722, 21, 13, 16, 7], [245, 773, 21, 13, 16, 7], [306, 8, 21, 18, 16, 7], [306, 59, 23, 18, 16, 7], [306, 110, 18, 13, 11, 7], [306, 161, 21, 13, 15, 7], [306, 209, 17, 16, 10, 4], [306, 263, 22, 13, 16, 7], [306, 314, 22, 13, 15, 7], [306, 365, 27, 13, 20, 7], [306, 416, 22, 13, 15, 7], [306, 467, 22, 18, 15, 7], [306, 518, 22, 13, 15, 7], [306, 564, 20, 23, 11, 2], [306, 615, 18, 23, 9, 2], [306, 666, 17, 23, 11, 2], [306, 725, 22, 3, 17, 10], [306, 769, 23, 17, 14, 3], [367, 1, 25, 20, 19, 0], [367, 52, 24, 20, 19, 0], [367, 105, 28, 23, 20, 2], [367, 154, 28, 20, 19, 0], [367, 205, 29, 20, 20, 0], [367, 256, 29, 20, 22, 0], [367, 307, 28, 20, 20, 0], [367, 361, 22, 17, 16, 3], [367, 412, 21, 17, 16, 3], [367, 462, 22, 18, 16, 2], [367, 515, 23, 16, 16, 4], [367, 565, 24, 17, 16, 3], [367, 615, 22, 18, 16, 2], [367, 671, 21, 17, 15, 7], [367, 718, 22, 17, 16, 3], [367, 769, 21, 17, 16, 3], [428, 3, 22, 18, 16, 2], [428, 56, 23, 16, 16, 4], [428, 106, 17, 17, 8, 3], [428, 157, 16, 17, 8, 3], [428, 207, 19, 18, 10, 2], [428, 260, 18, 16, 9, 4], [428, 310, 22, 17, 16, 3], [428, 361, 23, 17, 16, 3], [428, 412, 21, 17, 16, 3], [428, 462, 22, 18, 16, 2], [428, 515, 23, 16, 16, 4], [428, 565, 23, 17, 16, 3], [428, 615, 23, 18, 16, 2], [428, 666, 22, 18, 16, 2], [428, 716, 22, 19, 16, 1], [428, 770, 22, 16, 16, 4], [489, 3, 23, 22, 16, 2], [489, 55, 17, 4, 8, 3], [489, 108, 21, 16, 15, 5], [489, 157, 23, 17, 16, 3], [489, 207, 24, 23, 16, 2], [489, 265, 17, 6, 11, 9], [489, 309, 25, 23, 16, 2], [489, 360, 24, 18, 18, 2], [489, 413, 27, 16, 22, 4], [489, 464, 27, 16, 22, 4], [489, 514, 32, 7, 24, 3], [489, 565, 19, 3, 11, 3], [489, 616, 20, 2, 11, 3], [489, 674, 21, 9, 16, 10], [489, 717, 36, 18, 27, 2], [489, 768, 31, 18, 22, 2], [550, 10, 25, 5, 20, 9], [550, 62, 21, 11, 17, 10], [550, 113, 22, 11, 17, 10], [550, 164, 20, 11, 17, 10], [550, 208, 24, 17, 16, 3], [550, 263, 20, 18, 17, 7], [550, 311, 21, 16, 15, 4], [550, 362, 28, 18, 20, 4], [550, 413, 31, 18, 23, 4], [550, 469, 22, 11, 17, 9], [550, 513, 19, 23, 10, 2], [550, 564, 20, 11, 12, 2], [550, 615, 20, 11, 12, 2], [550, 668, 27, 16, 21, 4], [550, 722, 29, 13, 24, 7], [550, 773, 24, 13, 18, 7], [611, 8, 20, 18, 18, 7], [611, 59, 16, 18, 11, 7], [611, 117, 23, 5, 20, 14], [611, 158, 25, 16, 16, 4], [611, 207, 24, 23, 16, 2], [611, 267, 21, 7, 16, 11], [611, 311, 21, 16, 18, 4], [611, 367, 21, 9, 16, 9], [611, 418, 19, 9, 16, 9], [611, 478, 27, 2, 27, 18], [611, 511, 1, 1, 16, 1], [611, 562, 22, 20, 19, 0], [611, 613, 24, 20, 19, 0], [611, 664, 28, 20, 22, 0], [611, 717, 36, 18, 27, 2], [611, 773, 30, 13, 26, 7], [672, 13, 21, 2, 16, 12], [672, 64, 30, 2, 27, 12], [672, 106, 20, 5, 11, 3], [672, 157, 20, 5, 11, 3], [672, 208, 17, 5, 8, 3], [672, 259, 17, 5, 8, 3], [672, 316, 20, 10, 16, 9], [672, 362, 20, 17, 15, 4], [672, 413, 22, 21, 15, 4], [1, 1, 1, 1, 8, 1], [794, 769, 18, 3, 10, 3], [672, 569, 23, 11, 16, 7], [672, 622, 16, 9, 11, 9], [672, 673, 14, 9, 11, 9], [672, 717, 24, 18, 15, 2], [672, 768, 24, 18, 15, 2], [733, 3, 23, 22, 16, 2], [733, 63, 13, 2, 10, 11], [733, 121, 9, 5, 8, 18], [733, 172, 13, 5, 11, 18], [733, 207, 31, 18, 27, 2], [733, 256, 24, 20, 19, 0], [733, 307, 28, 20, 19, 0], [733, 358, 23, 20, 19, 0], [733, 409, 28, 20, 19, 0], [733, 460, 28, 20, 19, 0], [733, 512, 19, 19, 10, 1], [733, 562, 19, 20, 10, 0], [733, 613, 19, 20, 10, 0], [733, 664, 18, 20, 10, 0], [733, 715, 28, 20, 22, 0], [733, 766, 28, 20, 22, 0], [1, 1, 1, 1, 8, 1], [794, 52, 28, 20, 22, 0], [794, 103, 29, 20, 20, 0], [794, 154, 29, 20, 20, 0], [794, 205, 29, 20, 20, 0], [794, 263, 15, 13, 9, 7], [794, 309, 19, 4, 11, 2], [794, 361, 20, 2, 11, 3], [794, 412, 20, 2, 11, 3], [794, 463, 20, 2, 11, 3], [794, 514, 17, 2, 11, 3], [794, 565, 18, 4, 11, 3], [794, 632, 10, 5, 11, 19], [794, 666, 20, 4, 11, 2], [794, 735, 10, 4, 11, 20], [794, 769, 18, 3, 10, 3], [855, 4, 18, 3, 10, 3], [855, 55, 18, 3, 10, 3], [855, 106, 18, 3, 10, 3], [855, 157, 18, 3, 10, 3], [855, 208, 18, 3, 10, 3], [855, 259, 18, 3, 10, 3], [855, 310, 18, 3, 10, 3], [855, 361, 18, 3, 10, 3], [855, 412, 18, 3, 10, 3], [855, 463, 18, 3, 10, 3], [855, 514, 18, 3, 10, 3], [855, 565, 18, 3, 10, 3], [855, 616, 18, 3, 10, 3], [855, 667, 18, 3, 10, 3], [855, 718, 18, 3, 10, 3], [855, 769, 18, 3, 10, 3]], \"capHeight\": 20, \"widestlogicalchar\": 27, \"widestglyph\": 36, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 27, \"leftmost\": 2, \"capHeight\": 21, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 16, 10, 6, 10, 15], [1, 55, 12, 19, 12, 3], [1, 106, 14, 18, 14, 3], [1, 157, 18, 18, 18, 3], [1, 206, 18, 23, 18, 1], [1, 258, 26, 20, 26, 2], [1, 310, 21, 19, 21, 3], [1, 361, 10, 18, 10, 3], [1, 412, 13, 24, 13, 3], [1, 463, 13, 24, 13, 3], [1, 513, 14, 19, 14, 2], [1, 569, 19, 14, 19, 7], [1, 628, 12, 10, 12, 15], [1, 675, 13, 10, 13, 11], [1, 730, 12, 7, 12, 15], [1, 769, 12, 19, 12, 3], [62, 4, 18, 19, 18, 3], [62, 55, 18, 19, 18, 3], [62, 106, 18, 19, 18, 3], [62, 157, 18, 19, 18, 3], [62, 208, 18, 19, 18, 3], [62, 259, 18, 19, 18, 3], [62, 310, 18, 19, 18, 3], [62, 361, 18, 19, 18, 3], [62, 412, 18, 19, 18, 3], [62, 463, 18, 19, 18, 3], [62, 518, 12, 15, 12, 7], [62, 569, 12, 18, 12, 7], [62, 621, 19, 13, 19, 8], [62, 674, 19, 11, 19, 10], [62, 723, 19, 13, 19, 8], [62, 768, 18, 20, 18, 2], [123, 3, 29, 24, 29, 2], [123, 54, 21, 20, 21, 2], [123, 105, 21, 20, 21, 2], [123, 156, 22, 20, 22, 2], [123, 207, 22, 20, 22, 2], [123, 258, 21, 20, 21, 2], [123, 309, 20, 20, 20, 2], [123, 360, 24, 20, 24, 2], [123, 411, 22, 20, 22, 2], [123, 462, 12, 20, 12, 2], [123, 513, 17, 20, 17, 2], [123, 564, 21, 20, 21, 2], [123, 615, 18, 20, 18, 2], [123, 666, 25, 20, 25, 2], [123, 717, 22, 20, 22, 2], [123, 768, 24, 20, 24, 2], [184, 3, 21, 20, 21, 2], [184, 54, 24, 20, 24, 2], [184, 105, 22, 20, 22, 2], [184, 156, 21, 20, 21, 2], [184, 207, 20, 20, 20, 2], [184, 258, 22, 20, 22, 2], [184, 309, 21, 20, 21, 2], [184, 360, 28, 20, 28, 2], [184, 411, 21, 20, 21, 2], [184, 462, 21, 20, 21, 2], [184, 513, 20, 20, 20, 2], [184, 564, 12, 25, 12, 2], [184, 615, 12, 20, 12, 2], [184, 666, 12, 25, 12, 2], [184, 718, 16, 18, 16, 3], [184, 781, 18, 11, 18, 15], [245, 3, 13, 19, 13, 2], [245, 59, 18, 15, 18, 7], [245, 105, 18, 20, 18, 2], [245, 161, 17, 15, 17, 7], [245, 207, 18, 20, 18, 2], [245, 263, 18, 15, 18, 7], [245, 309, 12, 20, 12, 2], [245, 365, 18, 20, 18, 7], [245, 411, 18, 20, 18, 2], [245, 462, 10, 20, 10, 2], [245, 513, 10, 25, 10, 2], [245, 564, 17, 20, 17, 2], [245, 615, 10, 20, 10, 2], [245, 671, 25, 15, 25, 7], [245, 722, 18, 15, 18, 7], [245, 773, 18, 15, 18, 7], [306, 8, 18, 20, 18, 7], [306, 59, 18, 20, 18, 7], [306, 110, 13, 15, 13, 7], [306, 161, 17, 15, 17, 7], [306, 209, 12, 18, 12, 4], [306, 263, 18, 15, 18, 7], [306, 314, 17, 15, 17, 7], [306, 365, 22, 15, 22, 7], [306, 416, 17, 15, 17, 7], [306, 467, 17, 20, 17, 7], [306, 518, 17, 15, 17, 7], [306, 564, 13, 25, 13, 2], [306, 615, 11, 25, 11, 2], [306, 666, 13, 25, 13, 2], [306, 725, 19, 11, 19, 10], [306, 769, 16, 19, 16, 3], [367, 1, 21, 22, 21, 0], [367, 52, 21, 22, 21, 0], [367, 105, 22, 25, 22, 2], [367, 154, 21, 22, 21, 0], [367, 205, 22, 22, 22, 0], [367, 256, 24, 22, 24, 0], [367, 307, 22, 22, 22, 0], [367, 361, 18, 19, 18, 3], [367, 412, 18, 19, 18, 3], [367, 462, 18, 20, 18, 2], [367, 515, 18, 18, 18, 4], [367, 565, 18, 19, 18, 3], [367, 615, 18, 20, 18, 2], [367, 671, 17, 19, 17, 7], [367, 718, 18, 19, 18, 3], [367, 769, 18, 19, 18, 3], [428, 3, 18, 20, 18, 2], [428, 56, 18, 18, 18, 4], [428, 106, 10, 19, 10, 3], [428, 157, 10, 19, 10, 3], [428, 207, 12, 20, 12, 2], [428, 260, 11, 18, 11, 4], [428, 310, 18, 19, 18, 3], [428, 361, 18, 19, 18, 3], [428, 412, 18, 19, 18, 3], [428, 462, 18, 20, 18, 2], [428, 515, 18, 18, 18, 4], [428, 565, 18, 19, 18, 3], [428, 615, 18, 20, 18, 2], [428, 666, 18, 20, 18, 2], [428, 716, 18, 21, 18, 1], [428, 770, 18, 18, 18, 4], [489, 3, 18, 24, 18, 2], [489, 55, 10, 18, 10, 3], [489, 108, 17, 18, 17, 5], [489, 157, 18, 19, 18, 3], [489, 207, 18, 25, 18, 2], [489, 265, 13, 12, 13, 9], [489, 309, 18, 25, 18, 2], [489, 360, 20, 20, 20, 2], [489, 413, 24, 18, 24, 4], [489, 464, 24, 18, 24, 4], [489, 514, 26, 18, 26, 3], [489, 565, 13, 18, 13, 3], [489, 616, 13, 18, 13, 3], [489, 674, 18, 11, 18, 10], [489, 717, 29, 20, 29, 2], [489, 768, 24, 20, 24, 2], [550, 10, 22, 12, 22, 9], [550, 62, 19, 13, 19, 10], [550, 113, 19, 13, 19, 10], [550, 164, 19, 13, 19, 10], [550, 208, 18, 19, 18, 3], [550, 263, 19, 20, 19, 7], [550, 311, 17, 18, 17, 4], [550, 362, 22, 20, 22, 4], [550, 413, 25, 20, 25, 4], [550, 469, 19, 13, 19, 9], [550, 513, 12, 25, 12, 2], [550, 564, 14, 19, 14, 2], [550, 615, 14, 19, 14, 2], [550, 668, 23, 18, 23, 4], [550, 722, 26, 15, 26, 7], [550, 773, 20, 15, 20, 7], [611, 8, 20, 20, 20, 7], [611, 59, 13, 20, 13, 7], [611, 117, 22, 7, 22, 14], [611, 158, 18, 18, 18, 4], [611, 207, 18, 25, 18, 2], [611, 267, 18, 10, 18, 11], [611, 311, 20, 18, 20, 4], [611, 367, 18, 12, 18, 9], [611, 418, 18, 12, 18, 9], [611, 475, 29, 7, 29, 15], [611, 526, 18, 6, 18, 15], [611, 562, 21, 22, 21, 0], [611, 613, 21, 22, 21, 0], [611, 664, 24, 22, 24, 0], [611, 717, 29, 20, 29, 2], [611, 773, 28, 15, 28, 7], [672, 13, 18, 9, 18, 12], [672, 64, 29, 9, 29, 12], [672, 106, 13, 18, 13, 3], [672, 157, 13, 18, 13, 3], [672, 208, 10, 18, 10, 3], [672, 259, 10, 18, 10, 3], [672, 316, 18, 12, 18, 9], [672, 362, 17, 19, 17, 4], [672, 413, 17, 23, 17, 4], [1, 16, 10, 6, 10, 15], [794, 769, 12, 18, 12, 3], [672, 569, 18, 14, 18, 7], [672, 622, 13, 12, 13, 9], [672, 673, 13, 12, 13, 9], [672, 717, 17, 20, 17, 2], [672, 768, 17, 20, 17, 2], [733, 3, 18, 24, 18, 2], [733, 63, 12, 10, 12, 11], [733, 118, 10, 10, 10, 15], [733, 169, 13, 10, 13, 15], [733, 207, 29, 20, 29, 2], [733, 256, 21, 22, 21, 0], [733, 307, 21, 22, 21, 0], [733, 358, 21, 22, 21, 0], [733, 409, 21, 22, 21, 0], [733, 460, 21, 22, 21, 0], [733, 511, 12, 22, 12, 0], [733, 562, 12, 22, 12, 0], [733, 613, 12, 22, 12, 0], [733, 664, 12, 22, 12, 0], [733, 715, 24, 22, 24, 0], [733, 766, 24, 22, 24, 0], [1, 16, 10, 6, 10, 15], [794, 52, 24, 22, 24, 0], [794, 103, 22, 22, 22, 0], [794, 154, 22, 22, 22, 0], [794, 205, 22, 22, 22, 0], [794, 263, 11, 15, 11, 7], [794, 309, 13, 19, 13, 2], [794, 361, 13, 18, 13, 3], [794, 412, 13, 18, 13, 3], [794, 463, 13, 18, 13, 3], [794, 514, 13, 18, 13, 3], [794, 565, 13, 18, 13, 3], [794, 628, 13, 11, 13, 15], [794, 666, 13, 19, 13, 2], [794, 730, 13, 11, 13, 15], [794, 769, 12, 18, 12, 3], [855, 4, 12, 18, 12, 3], [855, 55, 12, 18, 12, 3], [855, 106, 12, 18, 12, 3], [855, 157, 12, 18, 12, 3], [855, 208, 12, 18, 12, 3], [855, 259, 12, 18, 12, 3], [855, 310, 12, 18, 12, 3], [855, 361, 12, 18, 12, 3], [855, 412, 12, 18, 12, 3], [855, 463, 12, 18, 12, 3], [855, 514, 12, 18, 12, 3], [855, 565, 12, 18, 12, 3], [855, 616, 12, 18, 12, 3], [855, 667, 12, 18, 12, 3], [855, 718, 12, 18, 12, 3], [855, 769, 12, 18, 12, 3]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 25}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 25, \"leftmost\": 3, \"capHeight\": 20, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 15, 8, 6, 8, 14], [1, 55, 10, 17, 10, 3], [1, 106, 12, 17, 12, 3], [1, 157, 16, 17, 16, 3], [1, 206, 16, 21, 16, 1], [1, 258, 24, 18, 24, 2], [1, 310, 19, 17, 19, 3], [1, 361, 8, 17, 8, 3], [1, 412, 11, 22, 11, 3], [1, 463, 11, 22, 11, 3], [1, 513, 12, 18, 12, 2], [1, 569, 17, 13, 17, 7], [1, 627, 10, 9, 10, 14], [1, 675, 11, 9, 11, 11], [1, 729, 10, 6, 10, 14], [1, 769, 10, 17, 10, 3], [62, 4, 16, 17, 16, 3], [62, 55, 16, 17, 16, 3], [62, 106, 16, 17, 16, 3], [62, 157, 16, 17, 16, 3], [62, 208, 16, 17, 16, 3], [62, 259, 16, 17, 16, 3], [62, 310, 16, 17, 16, 3], [62, 361, 16, 17, 16, 3], [62, 412, 16, 17, 16, 3], [62, 463, 16, 17, 16, 3], [62, 518, 10, 13, 10, 7], [62, 569, 10, 16, 10, 7], [62, 621, 17, 12, 17, 8], [62, 674, 17, 10, 17, 10], [62, 723, 17, 12, 17, 8], [62, 768, 16, 18, 16, 2], [123, 3, 27, 22, 27, 2], [123, 54, 19, 18, 19, 2], [123, 105, 19, 18, 19, 2], [123, 156, 20, 18, 20, 2], [123, 207, 20, 18, 20, 2], [123, 258, 19, 18, 19, 2], [123, 309, 18, 18, 18, 2], [123, 360, 22, 18, 22, 2], [123, 411, 20, 18, 20, 2], [123, 462, 10, 18, 10, 2], [123, 513, 15, 18, 15, 2], [123, 564, 19, 18, 19, 2], [123, 615, 16, 18, 16, 2], [123, 666, 23, 18, 23, 2], [123, 717, 20, 18, 20, 2], [123, 768, 22, 18, 22, 2], [184, 3, 19, 18, 19, 2], [184, 54, 22, 18, 22, 2], [184, 105, 20, 18, 20, 2], [184, 156, 19, 18, 19, 2], [184, 207, 18, 18, 18, 2], [184, 258, 20, 18, 20, 2], [184, 309, 19, 18, 19, 2], [184, 360, 26, 18, 26, 2], [184, 411, 19, 18, 19, 2], [184, 462, 19, 18, 19, 2], [184, 513, 18, 18, 18, 2], [184, 564, 10, 23, 10, 2], [184, 615, 10, 18, 10, 2], [184, 666, 10, 23, 10, 2], [184, 718, 14, 17, 14, 3], [184, 780, 16, 10, 16, 14], [245, 3, 11, 18, 11, 2], [245, 59, 16, 13, 16, 7], [245, 105, 16, 18, 16, 2], [245, 161, 15, 13, 15, 7], [245, 207, 16, 18, 16, 2], [245, 263, 16, 13, 16, 7], [245, 309, 10, 18, 10, 2], [245, 365, 16, 18, 16, 7], [245, 411, 16, 18, 16, 2], [245, 462, 8, 18, 8, 2], [245, 513, 8, 23, 8, 2], [245, 564, 15, 18, 15, 2], [245, 615, 8, 18, 8, 2], [245, 671, 23, 13, 23, 7], [245, 722, 16, 13, 16, 7], [245, 773, 16, 13, 16, 7], [306, 8, 16, 18, 16, 7], [306, 59, 16, 18, 16, 7], [306, 110, 11, 13, 11, 7], [306, 161, 15, 13, 15, 7], [306, 209, 10, 16, 10, 4], [306, 263, 16, 13, 16, 7], [306, 314, 15, 13, 15, 7], [306, 365, 20, 13, 20, 7], [306, 416, 15, 13, 15, 7], [306, 467, 15, 18, 15, 7], [306, 518, 15, 13, 15, 7], [306, 564, 11, 23, 11, 2], [306, 615, 9, 23, 9, 2], [306, 666, 11, 23, 11, 2], [306, 725, 17, 10, 17, 10], [306, 769, 14, 17, 14, 3], [367, 1, 19, 20, 19, 0], [367, 52, 19, 20, 19, 0], [367, 105, 20, 23, 20, 2], [367, 154, 19, 20, 19, 0], [367, 205, 20, 20, 20, 0], [367, 256, 22, 20, 22, 0], [367, 307, 20, 20, 20, 0], [367, 361, 16, 17, 16, 3], [367, 412, 16, 17, 16, 3], [367, 462, 16, 18, 16, 2], [367, 515, 16, 16, 16, 4], [367, 565, 16, 17, 16, 3], [367, 615, 16, 18, 16, 2], [367, 671, 15, 17, 15, 7], [367, 718, 16, 17, 16, 3], [367, 769, 16, 17, 16, 3], [428, 3, 16, 18, 16, 2], [428, 56, 16, 16, 16, 4], [428, 106, 8, 17, 8, 3], [428, 157, 8, 17, 8, 3], [428, 207, 10, 18, 10, 2], [428, 260, 9, 16, 9, 4], [428, 310, 16, 17, 16, 3], [428, 361, 16, 17, 16, 3], [428, 412, 16, 17, 16, 3], [428, 462, 16, 18, 16, 2], [428, 515, 16, 16, 16, 4], [428, 565, 16, 17, 16, 3], [428, 615, 16, 18, 16, 2], [428, 666, 16, 18, 16, 2], [428, 716, 16, 19, 16, 1], [428, 770, 16, 16, 16, 4], [489, 3, 16, 22, 16, 2], [489, 55, 8, 17, 8, 3], [489, 108, 15, 16, 15, 5], [489, 157, 16, 17, 16, 3], [489, 207, 16, 23, 16, 2], [489, 265, 11, 11, 11, 9], [489, 309, 16, 23, 16, 2], [489, 360, 18, 18, 18, 2], [489, 413, 22, 16, 22, 4], [489, 464, 22, 16, 22, 4], [489, 514, 24, 17, 24, 3], [489, 565, 11, 17, 11, 3], [489, 616, 11, 17, 11, 3], [489, 674, 16, 10, 16, 10], [489, 717, 27, 18, 27, 2], [489, 768, 22, 18, 22, 2], [550, 10, 20, 11, 20, 9], [550, 62, 17, 11, 17, 10], [550, 113, 17, 11, 17, 10], [550, 164, 17, 11, 17, 10], [550, 208, 16, 17, 16, 3], [550, 263, 17, 18, 17, 7], [550, 311, 15, 16, 15, 4], [550, 362, 20, 18, 20, 4], [550, 413, 23, 18, 23, 4], [550, 469, 17, 11, 17, 9], [550, 513, 10, 23, 10, 2], [550, 564, 12, 18, 12, 2], [550, 615, 12, 18, 12, 2], [550, 668, 21, 16, 21, 4], [550, 722, 24, 13, 24, 7], [550, 773, 18, 13, 18, 7], [611, 8, 18, 18, 18, 7], [611, 59, 11, 18, 11, 7], [611, 117, 20, 6, 20, 14], [611, 158, 16, 16, 16, 4], [611, 207, 16, 23, 16, 2], [611, 267, 16, 9, 16, 11], [611, 311, 18, 16, 18, 4], [611, 367, 16, 11, 16, 9], [611, 418, 16, 11, 16, 9], [611, 474, 27, 6, 27, 14], [611, 525, 16, 6, 16, 14], [611, 562, 19, 20, 19, 0], [611, 613, 19, 20, 19, 0], [611, 664, 22, 20, 22, 0], [611, 717, 27, 18, 27, 2], [611, 773, 26, 13, 26, 7], [672, 13, 16, 8, 16, 12], [672, 64, 27, 8, 27, 12], [672, 106, 11, 17, 11, 3], [672, 157, 11, 17, 11, 3], [672, 208, 8, 17, 8, 3], [672, 259, 8, 17, 8, 3], [672, 316, 16, 11, 16, 9], [672, 362, 15, 17, 15, 4], [672, 413, 15, 21, 15, 4], [1, 15, 8, 6, 8, 14], [794, 769, 10, 17, 10, 3], [672, 569, 16, 13, 16, 7], [672, 622, 11, 11, 11, 9], [672, 673, 11, 11, 11, 9], [672, 717, 15, 18, 15, 2], [672, 768, 15, 18, 15, 2], [733, 3, 16, 22, 16, 2], [733, 63, 10, 9, 10, 11], [733, 117, 8, 9, 8, 14], [733, 168, 11, 9, 11, 14], [733, 207, 27, 18, 27, 2], [733, 256, 19, 20, 19, 0], [733, 307, 19, 20, 19, 0], [733, 358, 19, 20, 19, 0], [733, 409, 19, 20, 19, 0], [733, 460, 19, 20, 19, 0], [733, 511, 10, 20, 10, 0], [733, 562, 10, 20, 10, 0], [733, 613, 10, 20, 10, 0], [733, 664, 10, 20, 10, 0], [733, 715, 22, 20, 22, 0], [733, 766, 22, 20, 22, 0], [1, 15, 8, 6, 8, 14], [794, 52, 22, 20, 22, 0], [794, 103, 20, 20, 20, 0], [794, 154, 20, 20, 20, 0], [794, 205, 20, 20, 20, 0], [794, 263, 9, 13, 9, 7], [794, 309, 11, 18, 11, 2], [794, 361, 11, 17, 11, 3], [794, 412, 11, 17, 11, 3], [794, 463, 11, 17, 11, 3], [794, 514, 11, 17, 11, 3], [794, 565, 11, 17, 11, 3], [794, 627, 11, 10, 11, 14], [794, 666, 11, 18, 11, 2], [794, 729, 11, 10, 11, 14], [794, 769, 10, 17, 10, 3], [855, 4, 10, 17, 10, 3], [855, 55, 10, 17, 10, 3], [855, 106, 10, 17, 10, 3], [855, 157, 10, 17, 10, 3], [855, 208, 10, 17, 10, 3], [855, 259, 10, 17, 10, 3], [855, 310, 10, 17, 10, 3], [855, 361, 10, 17, 10, 3], [855, 412, 10, 17, 10, 3], [855, 463, 10, 17, 10, 3], [855, 514, 10, 17, 10, 3], [855, 565, 10, 17, 10, 3], [855, 616, 10, 17, 10, 3], [855, 667, 10, 17, 10, 3], [855, 718, 10, 17, 10, 3], [855, 769, 10, 17, 10, 3]], \"widestlogicalchar\": 27, \"widestglyph\": 27, \"tallestglyph\": 23}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 11, 9, 7, 1], [1, 104, 11, 4, 7, 1], [1, 155, 13, 9, 9, 1], [1, 205, 12, 11, 9, 0], [1, 257, 16, 9, 12, 1], [1, 308, 12, 9, 10, 1], [1, 359, 10, 4, 6, 1], [1, 410, 11, 11, 7, 1], [1, 461, 10, 11, 7, 1], [1, 512, 11, 5, 8, 1], [1, 565, 12, 7, 9, 3], [1, 620, 8, 5, 7, 7], [1, 669, 10, 3, 7, 5], [1, 722, 8, 3, 7, 7], [1, 767, 11, 9, 7, 1], [62, 2, 12, 9, 9, 1], [62, 53, 12, 9, 9, 1], [62, 104, 12, 9, 9, 1], [62, 155, 12, 9, 9, 1], [62, 206, 13, 9, 9, 1], [62, 257, 13, 9, 9, 1], [62, 308, 12, 9, 9, 1], [62, 359, 13, 9, 9, 1], [62, 410, 12, 9, 9, 1], [62, 461, 12, 9, 9, 1], [62, 514, 10, 7, 7, 3], [62, 565, 10, 9, 7, 3], [62, 616, 12, 7, 9, 3], [62, 668, 11, 5, 9, 4], [62, 718, 11, 7, 9, 3], [62, 767, 12, 9, 9, 1], [123, 2, 16, 10, 13, 1], [123, 53, 12, 9, 10, 1], [123, 104, 13, 9, 10, 1], [123, 155, 13, 9, 10, 1], [123, 206, 13, 9, 10, 1], [123, 257, 14, 9, 10, 1], [123, 308, 13, 9, 9, 1], [123, 359, 14, 9, 11, 1], [123, 410, 14, 9, 10, 1], [123, 461, 11, 9, 7, 1], [123, 512, 13, 9, 9, 1], [123, 563, 14, 9, 10, 1], [123, 614, 10, 9, 9, 1], [123, 665, 15, 9, 11, 1], [123, 716, 14, 9, 10, 1], [123, 767, 14, 9, 11, 1], [184, 2, 13, 9, 10, 1], [184, 53, 14, 9, 11, 1], [184, 104, 13, 9, 10, 1], [184, 155, 13, 9, 10, 1], [184, 206, 13, 9, 9, 1], [184, 257, 14, 9, 10, 1], [184, 308, 14, 9, 10, 1], [184, 359, 16, 9, 12, 1], [184, 410, 14, 9, 10, 1], [184, 461, 14, 9, 10, 1], [184, 512, 13, 9, 9, 1], [184, 563, 11, 11, 7, 1], [184, 614, 10, 9, 7, 1], [184, 665, 11, 11, 7, 1], [184, 716, 11, 4, 8, 1], [184, 775, 10, 3, 9, 9], [245, 2, 10, 4, 7, 1], [245, 55, 11, 7, 9, 3], [245, 104, 11, 9, 9, 1], [245, 157, 11, 7, 9, 3], [245, 206, 13, 9, 9, 1], [245, 259, 11, 7, 9, 3], [245, 308, 11, 9, 7, 1], [245, 361, 12, 9, 9, 3], [245, 410, 11, 9, 9, 1], [245, 461, 10, 9, 6, 1], [245, 512, 10, 11, 6, 1], [245, 563, 12, 9, 9, 1], [245, 614, 10, 9, 6, 1], [245, 667, 13, 7, 11, 3], [245, 718, 11, 7, 9, 3], [245, 769, 11, 7, 9, 3], [306, 4, 11, 9, 9, 3], [306, 55, 12, 9, 9, 3], [306, 106, 11, 7, 7, 3], [306, 157, 12, 7, 9, 3], [306, 207, 10, 8, 7, 2], [306, 259, 12, 7, 9, 3], [306, 310, 13, 7, 9, 3], [306, 361, 13, 7, 10, 3], [306, 412, 13, 7, 9, 3], [306, 463, 13, 9, 9, 3], [306, 514, 12, 7, 9, 3], [306, 563, 11, 11, 7, 1], [306, 614, 10, 11, 6, 1], [306, 665, 10, 11, 7, 1], [306, 716, 13, 4, 9, 1], [306, 767, 13, 9, 9, 1], [367, 1, 13, 10, 10, 0], [367, 52, 13, 10, 10, 0], [367, 104, 13, 11, 10, 1], [367, 154, 13, 10, 10, 0], [367, 205, 14, 10, 10, 0], [367, 256, 14, 10, 11, 0], [367, 307, 14, 10, 10, 0], [367, 359, 12, 9, 9, 1], [367, 410, 11, 9, 9, 1], [367, 460, 13, 10, 9, 0], [367, 512, 13, 9, 9, 1], [367, 562, 13, 10, 9, 0], [367, 613, 13, 10, 9, 0], [367, 667, 11, 9, 9, 3], [367, 716, 12, 9, 9, 1], [367, 767, 11, 9, 9, 1], [428, 1, 13, 10, 9, 0], [428, 53, 13, 9, 9, 1], [428, 103, 10, 10, 6, 0], [428, 154, 10, 10, 6, 0], [428, 205, 11, 10, 7, 0], [428, 257, 11, 9, 7, 1], [428, 307, 13, 10, 9, 0], [428, 358, 12, 10, 9, 0], [428, 409, 12, 10, 9, 0], [428, 460, 13, 10, 9, 0], [428, 512, 13, 9, 9, 1], [428, 562, 13, 10, 9, 0], [428, 613, 12, 10, 9, 0], [428, 664, 12, 10, 9, 0], [428, 715, 13, 10, 9, 0], [428, 767, 13, 9, 9, 1], [489, 2, 12, 11, 9, 1], [489, 53, 11, 6, 7, 1], [489, 105, 12, 9, 9, 2], [489, 155, 12, 9, 9, 1], [489, 206, 12, 11, 9, 1], [489, 260, 9, 4, 7, 4], [489, 308, 13, 11, 9, 1], [489, 359, 12, 9, 9, 1], [489, 411, 14, 8, 11, 2], [489, 462, 14, 8, 11, 2], [489, 513, 15, 5, 12, 2], [489, 563, 11, 4, 7, 1], [489, 614, 11, 3, 7, 1], [489, 667, 12, 7, 9, 3], [489, 716, 17, 9, 13, 1], [489, 767, 15, 9, 11, 1], [550, 4, 13, 5, 10, 3], [550, 55, 12, 7, 9, 3], [550, 106, 12, 7, 9, 3], [550, 157, 11, 7, 9, 3], [550, 206, 13, 9, 9, 1], [550, 260, 11, 8, 9, 4], [550, 309, 11, 8, 8, 2], [550, 360, 13, 9, 10, 2], [550, 410, 16, 10, 12, 1], [550, 463, 13, 7, 9, 3], [550, 512, 11, 11, 7, 1], [550, 563, 11, 6, 7, 1], [550, 614, 11, 6, 7, 1], [550, 666, 14, 8, 11, 2], [550, 718, 14, 7, 12, 3], [550, 769, 11, 7, 9, 3], [611, 4, 11, 9, 9, 3], [611, 55, 10, 9, 7, 3], [611, 108, 12, 5, 10, 5], [611, 155, 13, 9, 9, 1], [611, 206, 13, 11, 9, 1], [611, 259, 12, 7, 9, 3], [611, 309, 11, 8, 10, 2], [611, 362, 11, 5, 9, 4], [611, 413, 11, 5, 9, 4], [611, 467, 14, 3, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 12, 10, 10, 0], [611, 613, 14, 10, 10, 0], [611, 664, 14, 10, 11, 0], [611, 716, 17, 9, 13, 1], [611, 769, 14, 7, 12, 3], [672, 6, 11, 3, 9, 5], [672, 57, 15, 3, 13, 5], [672, 104, 11, 4, 7, 1], [672, 155, 11, 4, 7, 1], [672, 206, 10, 5, 6, 1], [672, 257, 10, 5, 6, 1], [672, 310, 12, 7, 9, 3], [672, 360, 10, 8, 8, 2], [672, 410, 13, 11, 9, 1], [1, 1, 1, 1, 6, 1], [794, 766, 13, 4, 9, 0], [672, 565, 11, 6, 9, 3], [672, 617, 9, 5, 7, 4], [672, 668, 9, 5, 7, 4], [672, 716, 13, 9, 9, 1], [672, 767, 13, 9, 9, 1], [733, 2, 12, 11, 9, 1], [733, 56, 9, 3, 7, 4], [733, 110, 8, 5, 6, 7], [733, 161, 9, 5, 7, 7], [733, 206, 16, 9, 13, 1], [733, 256, 13, 10, 10, 0], [733, 307, 13, 10, 10, 0], [733, 358, 13, 10, 10, 0], [733, 409, 14, 10, 10, 0], [733, 460, 13, 10, 10, 0], [733, 511, 11, 10, 7, 0], [733, 562, 11, 10, 7, 0], [733, 613, 11, 10, 7, 0], [733, 664, 11, 10, 7, 0], [733, 715, 14, 10, 11, 0], [733, 766, 14, 10, 11, 0], [1, 1, 1, 1, 6, 1], [794, 52, 14, 10, 11, 0], [794, 103, 14, 10, 10, 0], [794, 154, 14, 10, 10, 0], [794, 205, 14, 10, 10, 0], [794, 259, 9, 7, 6, 3], [794, 308, 11, 4, 7, 1], [794, 359, 11, 4, 7, 1], [794, 410, 11, 3, 7, 1], [794, 461, 12, 4, 8, 1], [794, 512, 11, 3, 7, 1], [794, 563, 11, 3, 7, 1], [794, 619, 7, 6, 7, 6], [794, 665, 11, 4, 7, 1], [794, 722, 8, 5, 7, 7], [794, 766, 13, 4, 9, 0], [855, 1, 13, 4, 9, 0], [855, 52, 13, 4, 9, 0], [855, 103, 13, 4, 9, 0], [855, 154, 13, 4, 9, 0], [855, 205, 13, 4, 9, 0], [855, 256, 13, 4, 9, 0], [855, 307, 13, 4, 9, 0], [855, 358, 13, 4, 9, 0], [855, 409, 13, 4, 9, 0], [855, 460, 13, 4, 9, 0], [855, 511, 13, 4, 9, 0], [855, 562, 13, 4, 9, 0], [855, 613, 13, 4, 9, 0], [855, 664, 13, 4, 9, 0], [855, 715, 13, 4, 9, 0], [855, 766, 13, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 10, 7, 7, 1], [1, 104, 10, 2, 7, 1], [1, 155, 12, 7, 9, 1], [1, 205, 11, 9, 9, 0], [1, 257, 15, 7, 12, 1], [1, 308, 11, 7, 10, 1], [1, 359, 9, 2, 6, 1], [1, 410, 10, 9, 7, 1], [1, 461, 9, 9, 7, 1], [1, 512, 10, 3, 8, 1], [1, 565, 11, 5, 9, 3], [1, 620, 7, 3, 7, 7], [1, 669, 9, 1, 7, 5], [1, 722, 7, 1, 7, 7], [1, 767, 10, 7, 7, 1], [62, 2, 11, 7, 9, 1], [62, 53, 11, 7, 9, 1], [62, 104, 11, 7, 9, 1], [62, 155, 11, 7, 9, 1], [62, 206, 12, 7, 9, 1], [62, 257, 12, 7, 9, 1], [62, 308, 11, 7, 9, 1], [62, 359, 12, 7, 9, 1], [62, 410, 11, 7, 9, 1], [62, 461, 11, 7, 9, 1], [62, 514, 9, 5, 7, 3], [62, 565, 9, 7, 7, 3], [62, 616, 11, 5, 9, 3], [62, 668, 10, 3, 9, 4], [62, 718, 10, 5, 9, 3], [62, 767, 11, 7, 9, 1], [123, 2, 15, 8, 13, 1], [123, 53, 11, 7, 10, 1], [123, 104, 12, 7, 10, 1], [123, 155, 12, 7, 10, 1], [123, 206, 12, 7, 10, 1], [123, 257, 13, 7, 10, 1], [123, 308, 12, 7, 9, 1], [123, 359, 13, 7, 11, 1], [123, 410, 13, 7, 10, 1], [123, 461, 10, 7, 7, 1], [123, 512, 12, 7, 9, 1], [123, 563, 13, 7, 10, 1], [123, 614, 9, 7, 9, 1], [123, 665, 14, 7, 11, 1], [123, 716, 13, 7, 10, 1], [123, 767, 13, 7, 11, 1], [184, 2, 12, 7, 10, 1], [184, 53, 13, 7, 11, 1], [184, 104, 12, 7, 10, 1], [184, 155, 12, 7, 10, 1], [184, 206, 12, 7, 9, 1], [184, 257, 13, 7, 10, 1], [184, 308, 13, 7, 10, 1], [184, 359, 15, 7, 12, 1], [184, 410, 13, 7, 10, 1], [184, 461, 13, 7, 10, 1], [184, 512, 12, 7, 9, 1], [184, 563, 10, 9, 7, 1], [184, 614, 9, 7, 7, 1], [184, 665, 10, 9, 7, 1], [184, 716, 10, 2, 8, 1], [184, 775, 9, 1, 9, 9], [245, 2, 9, 2, 7, 1], [245, 55, 10, 5, 9, 3], [245, 104, 10, 7, 9, 1], [245, 157, 10, 5, 9, 3], [245, 206, 12, 7, 9, 1], [245, 259, 10, 5, 9, 3], [245, 308, 10, 7, 7, 1], [245, 361, 11, 7, 9, 3], [245, 410, 10, 7, 9, 1], [245, 461, 9, 7, 6, 1], [245, 512, 9, 9, 6, 1], [245, 563, 11, 7, 9, 1], [245, 614, 9, 7, 6, 1], [245, 667, 12, 5, 11, 3], [245, 718, 10, 5, 9, 3], [245, 769, 10, 5, 9, 3], [306, 4, 10, 7, 9, 3], [306, 55, 11, 7, 9, 3], [306, 106, 10, 5, 7, 3], [306, 157, 11, 5, 9, 3], [306, 207, 9, 6, 7, 2], [306, 259, 11, 5, 9, 3], [306, 310, 12, 5, 9, 3], [306, 361, 12, 5, 10, 3], [306, 412, 12, 5, 9, 3], [306, 463, 12, 7, 9, 3], [306, 514, 11, 5, 9, 3], [306, 563, 10, 9, 7, 1], [306, 614, 9, 9, 6, 1], [306, 665, 9, 9, 7, 1], [306, 716, 12, 2, 9, 1], [306, 767, 12, 7, 9, 1], [367, 1, 11, 8, 10, 0], [367, 52, 12, 8, 10, 0], [367, 104, 12, 9, 10, 1], [367, 154, 12, 8, 10, 0], [367, 205, 13, 8, 10, 0], [367, 256, 13, 8, 11, 0], [367, 307, 13, 8, 10, 0], [367, 359, 11, 7, 9, 1], [367, 410, 10, 7, 9, 1], [367, 460, 12, 8, 9, 0], [367, 512, 12, 7, 9, 1], [367, 562, 12, 8, 9, 0], [367, 613, 12, 8, 9, 0], [367, 667, 10, 7, 9, 3], [367, 716, 11, 7, 9, 1], [367, 767, 10, 7, 9, 1], [428, 1, 12, 8, 9, 0], [428, 53, 12, 7, 9, 1], [428, 103, 9, 8, 6, 0], [428, 154, 9, 8, 6, 0], [428, 205, 10, 8, 7, 0], [428, 257, 10, 7, 7, 1], [428, 307, 12, 8, 9, 0], [428, 358, 10, 8, 9, 0], [428, 409, 11, 8, 9, 0], [428, 460, 12, 8, 9, 0], [428, 512, 12, 7, 9, 1], [428, 562, 12, 8, 9, 0], [428, 613, 11, 8, 9, 0], [428, 664, 11, 8, 9, 0], [428, 715, 12, 8, 9, 0], [428, 767, 12, 7, 9, 1], [489, 2, 11, 9, 9, 1], [489, 53, 10, 4, 7, 1], [489, 105, 11, 7, 9, 2], [489, 155, 11, 7, 9, 1], [489, 206, 11, 9, 9, 1], [489, 260, 8, 2, 7, 4], [489, 308, 12, 9, 9, 1], [489, 359, 11, 7, 9, 1], [489, 411, 13, 6, 11, 2], [489, 462, 13, 6, 11, 2], [489, 513, 14, 3, 12, 2], [489, 563, 10, 2, 7, 1], [489, 614, 10, 1, 7, 1], [489, 667, 11, 5, 9, 3], [489, 716, 16, 7, 13, 1], [489, 767, 14, 7, 11, 1], [550, 4, 12, 3, 10, 3], [550, 55, 11, 5, 9, 3], [550, 106, 11, 5, 9, 3], [550, 157, 10, 5, 9, 3], [550, 206, 12, 7, 9, 1], [550, 260, 10, 6, 9, 4], [550, 309, 10, 6, 8, 2], [550, 360, 12, 7, 10, 2], [550, 410, 15, 8, 12, 1], [550, 463, 12, 5, 9, 3], [550, 512, 10, 9, 7, 1], [550, 563, 10, 4, 7, 1], [550, 614, 10, 4, 7, 1], [550, 666, 13, 6, 11, 2], [550, 718, 13, 5, 12, 3], [550, 769, 10, 5, 9, 3], [611, 4, 10, 7, 9, 3], [611, 55, 9, 7, 7, 3], [611, 108, 11, 3, 10, 5], [611, 155, 12, 7, 9, 1], [611, 206, 12, 9, 9, 1], [611, 259, 11, 5, 9, 3], [611, 309, 10, 6, 10, 2], [611, 362, 10, 3, 9, 4], [611, 413, 10, 3, 9, 4], [611, 467, 13, 1, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 11, 8, 10, 0], [611, 613, 12, 8, 10, 0], [611, 664, 13, 8, 11, 0], [611, 716, 16, 7, 13, 1], [611, 769, 13, 5, 12, 3], [672, 6, 10, 1, 9, 5], [672, 57, 14, 1, 13, 5], [672, 104, 10, 2, 7, 1], [672, 155, 10, 2, 7, 1], [672, 206, 9, 3, 6, 1], [672, 257, 9, 3, 6, 1], [672, 310, 11, 5, 9, 3], [672, 360, 9, 6, 8, 2], [672, 410, 12, 9, 9, 1], [1, 1, 1, 1, 6, 1], [794, 766, 11, 2, 9, 0], [672, 565, 10, 4, 9, 3], [672, 617, 8, 3, 7, 4], [672, 668, 8, 3, 7, 4], [672, 716, 12, 7, 9, 1], [672, 767, 12, 7, 9, 1], [733, 2, 11, 9, 9, 1], [733, 56, 8, 1, 7, 4], [733, 110, 7, 3, 6, 7], [733, 161, 8, 3, 7, 7], [733, 206, 15, 7, 13, 1], [733, 256, 12, 8, 10, 0], [733, 307, 12, 8, 10, 0], [733, 358, 11, 8, 10, 0], [733, 409, 13, 8, 10, 0], [733, 460, 12, 8, 10, 0], [733, 511, 10, 8, 7, 0], [733, 562, 10, 8, 7, 0], [733, 613, 10, 8, 7, 0], [733, 664, 10, 8, 7, 0], [733, 715, 13, 8, 11, 0], [733, 766, 13, 8, 11, 0], [1, 1, 1, 1, 6, 1], [794, 52, 13, 8, 11, 0], [794, 103, 13, 8, 10, 0], [794, 154, 13, 8, 10, 0], [794, 205, 13, 8, 10, 0], [794, 259, 8, 5, 6, 3], [794, 308, 10, 2, 7, 1], [794, 359, 10, 2, 7, 1], [794, 410, 10, 1, 7, 1], [794, 461, 11, 2, 8, 1], [794, 512, 10, 1, 7, 1], [794, 563, 10, 1, 7, 1], [794, 619, 6, 4, 7, 6], [794, 665, 10, 2, 7, 1], [794, 722, 7, 3, 7, 7], [794, 766, 11, 2, 9, 0], [855, 1, 11, 2, 9, 0], [855, 52, 11, 2, 9, 0], [855, 103, 11, 2, 9, 0], [855, 154, 11, 2, 9, 0], [855, 205, 11, 2, 9, 0], [855, 256, 11, 2, 9, 0], [855, 307, 11, 2, 9, 0], [855, 358, 11, 2, 9, 0], [855, 409, 11, 2, 9, 0], [855, 460, 11, 2, 9, 0], [855, 511, 11, 2, 9, 0], [855, 562, 11, 2, 9, 0], [855, 613, 11, 2, 9, 0], [855, 664, 11, 2, 9, 0], [855, 715, 11, 2, 9, 0], [855, 766, 11, 2, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 7, 9, 7, 2], [1, 105, 7, 8, 7, 2], [1, 156, 9, 9, 9, 2], [1, 206, 9, 11, 9, 1], [1, 258, 12, 9, 12, 2], [1, 309, 10, 9, 10, 2], [1, 360, 6, 8, 6, 2], [1, 411, 7, 11, 7, 2], [1, 462, 7, 11, 7, 2], [1, 513, 8, 8, 8, 2], [1, 566, 9, 7, 9, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 9, 7, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 7, 9, 4], [62, 768, 9, 9, 9, 2], [123, 3, 13, 10, 13, 2], [123, 54, 10, 9, 10, 2], [123, 105, 10, 9, 10, 2], [123, 156, 10, 9, 10, 2], [123, 207, 10, 9, 10, 2], [123, 258, 10, 9, 10, 2], [123, 309, 9, 9, 9, 2], [123, 360, 11, 9, 11, 2], [123, 411, 10, 9, 10, 2], [123, 462, 7, 9, 7, 2], [123, 513, 9, 9, 9, 2], [123, 564, 10, 9, 10, 2], [123, 615, 9, 9, 9, 2], [123, 666, 11, 9, 11, 2], [123, 717, 10, 9, 10, 2], [123, 768, 11, 9, 11, 2], [184, 3, 10, 9, 10, 2], [184, 54, 11, 9, 11, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 9, 9, 9, 2], [184, 258, 10, 9, 10, 2], [184, 309, 10, 9, 10, 2], [184, 360, 12, 9, 12, 2], [184, 411, 10, 9, 10, 2], [184, 462, 10, 9, 10, 2], [184, 513, 9, 9, 9, 2], [184, 564, 7, 11, 7, 2], [184, 615, 7, 9, 7, 2], [184, 666, 7, 11, 7, 2], [184, 717, 8, 8, 8, 2], [184, 770, 9, 9, 9, 4], [245, 3, 7, 8, 7, 2], [245, 56, 9, 7, 9, 4], [245, 105, 9, 9, 9, 2], [245, 158, 9, 7, 9, 4], [245, 207, 9, 9, 9, 2], [245, 260, 9, 7, 9, 4], [245, 309, 7, 9, 7, 2], [245, 362, 9, 9, 9, 4], [245, 411, 9, 9, 9, 2], [245, 462, 6, 9, 6, 2], [245, 513, 6, 11, 6, 2], [245, 564, 9, 9, 9, 2], [245, 615, 6, 9, 6, 2], [245, 668, 11, 7, 11, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 9, 9, 9, 4], [306, 107, 7, 7, 7, 4], [306, 158, 9, 7, 9, 4], [306, 208, 7, 8, 7, 3], [306, 260, 9, 7, 9, 4], [306, 311, 9, 7, 9, 4], [306, 362, 10, 7, 10, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 9, 7, 9, 4], [306, 564, 7, 11, 7, 2], [306, 615, 6, 11, 6, 2], [306, 666, 7, 11, 7, 2], [306, 717, 9, 8, 9, 2], [306, 768, 9, 9, 9, 2], [367, 2, 10, 10, 10, 1], [367, 53, 10, 10, 10, 1], [367, 105, 10, 11, 10, 2], [367, 155, 10, 10, 10, 1], [367, 206, 10, 10, 10, 1], [367, 257, 11, 10, 11, 1], [367, 308, 10, 10, 10, 1], [367, 360, 9, 9, 9, 2], [367, 411, 9, 9, 9, 2], [367, 461, 9, 10, 9, 1], [367, 513, 9, 9, 9, 2], [367, 563, 9, 10, 9, 1], [367, 614, 9, 10, 9, 1], [367, 668, 9, 9, 9, 4], [367, 717, 9, 9, 9, 2], [367, 768, 9, 9, 9, 2], [428, 2, 9, 10, 9, 1], [428, 54, 9, 9, 9, 2], [428, 104, 6, 10, 6, 1], [428, 155, 6, 10, 6, 1], [428, 206, 7, 10, 7, 1], [428, 258, 7, 9, 7, 2], [428, 308, 9, 10, 9, 1], [428, 359, 9, 10, 9, 1], [428, 410, 9, 10, 9, 1], [428, 461, 9, 10, 9, 1], [428, 513, 9, 9, 9, 2], [428, 563, 9, 10, 9, 1], [428, 614, 9, 10, 9, 1], [428, 665, 9, 10, 9, 1], [428, 716, 9, 10, 9, 1], [428, 768, 9, 9, 9, 2], [489, 3, 9, 11, 9, 2], [489, 54, 7, 8, 7, 2], [489, 106, 9, 9, 9, 3], [489, 156, 9, 9, 9, 2], [489, 207, 9, 11, 9, 2], [489, 260, 7, 6, 7, 4], [489, 309, 9, 11, 9, 2], [489, 360, 9, 9, 9, 2], [489, 412, 11, 8, 11, 3], [489, 463, 11, 8, 11, 3], [489, 514, 12, 7, 12, 3], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 9, 7, 9, 4], [489, 717, 13, 9, 13, 2], [489, 768, 11, 9, 11, 2], [550, 5, 10, 6, 10, 4], [550, 56, 9, 7, 9, 4], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 207, 9, 9, 9, 2], [550, 260, 9, 9, 9, 4], [550, 310, 8, 8, 8, 3], [550, 361, 10, 9, 10, 3], [550, 411, 12, 10, 12, 2], [550, 464, 9, 7, 9, 4], [550, 513, 7, 11, 7, 2], [550, 564, 7, 8, 7, 2], [550, 615, 7, 8, 7, 2], [550, 667, 11, 8, 11, 3], [550, 719, 12, 7, 12, 4], [550, 770, 9, 7, 9, 4], [611, 5, 9, 9, 9, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 7, 10, 4], [611, 156, 9, 9, 9, 2], [611, 207, 9, 11, 9, 2], [611, 260, 9, 7, 9, 4], [611, 310, 10, 8, 10, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 7, 13, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 10, 10, 1], [611, 614, 10, 10, 10, 1], [611, 665, 11, 10, 11, 1], [611, 717, 13, 9, 13, 2], [611, 770, 12, 7, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 105, 7, 8, 7, 2], [672, 156, 7, 8, 7, 2], [672, 207, 6, 8, 6, 2], [672, 258, 6, 8, 6, 2], [672, 311, 9, 7, 9, 4], [672, 361, 8, 8, 8, 3], [672, 411, 9, 11, 9, 2], [1, 5, 6, 6, 6, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 717, 9, 9, 9, 2], [672, 768, 9, 9, 9, 2], [733, 3, 9, 11, 9, 2], [733, 56, 7, 6, 7, 4], [733, 107, 6, 9, 6, 4], [733, 158, 7, 9, 7, 4], [733, 207, 13, 9, 13, 2], [733, 257, 10, 10, 10, 1], [733, 308, 10, 10, 10, 1], [733, 359, 10, 10, 10, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 512, 7, 10, 7, 1], [733, 563, 7, 10, 7, 1], [733, 614, 7, 10, 7, 1], [733, 665, 7, 10, 7, 1], [733, 716, 11, 10, 11, 1], [733, 767, 11, 10, 11, 1], [1, 5, 6, 6, 6, 4], [794, 53, 11, 10, 11, 1], [794, 104, 10, 10, 10, 1], [794, 155, 10, 10, 10, 1], [794, 206, 10, 10, 10, 1], [794, 260, 6, 7, 6, 4], [794, 309, 7, 8, 7, 2], [794, 360, 7, 8, 7, 2], [794, 411, 7, 8, 7, 2], [794, 462, 8, 8, 8, 2], [794, 513, 7, 8, 7, 2], [794, 564, 7, 8, 7, 2], [794, 617, 7, 9, 7, 4], [794, 666, 7, 8, 7, 2], [794, 719, 7, 9, 7, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 7, 7, 7, 3], [1, 106, 7, 7, 7, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 9, 9, 2], [1, 259, 12, 7, 12, 3], [1, 310, 10, 7, 10, 3], [1, 361, 6, 7, 6, 3], [1, 412, 7, 9, 7, 3], [1, 463, 7, 9, 7, 3], [1, 514, 8, 7, 8, 3], [1, 566, 9, 6, 9, 4], [1, 617, 7, 8, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 6, 7, 4], [1, 769, 7, 7, 7, 3], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 7, 6, 7, 4], [62, 566, 7, 8, 7, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 769, 9, 7, 9, 3], [123, 4, 13, 8, 13, 3], [123, 55, 10, 7, 10, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 10, 7, 10, 3], [123, 310, 9, 7, 9, 3], [123, 361, 11, 7, 11, 3], [123, 412, 10, 7, 10, 3], [123, 463, 7, 7, 7, 3], [123, 514, 9, 7, 9, 3], [123, 565, 10, 7, 10, 3], [123, 616, 9, 7, 9, 3], [123, 667, 11, 7, 11, 3], [123, 718, 10, 7, 10, 3], [123, 769, 11, 7, 11, 3], [184, 4, 10, 7, 10, 3], [184, 55, 11, 7, 11, 3], [184, 106, 10, 7, 10, 3], [184, 157, 10, 7, 10, 3], [184, 208, 9, 7, 9, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 9, 7, 9, 3], [184, 565, 7, 9, 7, 3], [184, 616, 7, 7, 7, 3], [184, 667, 7, 9, 7, 3], [184, 718, 8, 7, 8, 3], [184, 770, 9, 8, 9, 4], [245, 4, 7, 7, 7, 3], [245, 56, 9, 6, 9, 4], [245, 106, 9, 7, 9, 3], [245, 158, 9, 6, 9, 4], [245, 208, 9, 7, 9, 3], [245, 260, 9, 6, 9, 4], [245, 310, 7, 7, 7, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 6, 7, 6, 3], [245, 514, 6, 9, 6, 3], [245, 565, 9, 7, 9, 3], [245, 616, 6, 7, 6, 3], [245, 668, 11, 6, 11, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 7, 6, 7, 4], [306, 158, 9, 6, 9, 4], [306, 209, 7, 6, 7, 4], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 10, 6, 10, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 565, 7, 9, 7, 3], [306, 616, 6, 9, 6, 3], [306, 667, 7, 9, 7, 3], [306, 718, 9, 7, 9, 3], [306, 769, 9, 7, 9, 3], [367, 3, 10, 8, 10, 2], [367, 54, 10, 8, 10, 2], [367, 106, 10, 9, 10, 3], [367, 156, 10, 8, 10, 2], [367, 207, 10, 8, 10, 2], [367, 258, 11, 8, 11, 2], [367, 309, 10, 8, 10, 2], [367, 361, 9, 7, 9, 3], [367, 412, 9, 7, 9, 3], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 615, 9, 8, 9, 2], [367, 668, 9, 8, 9, 4], [367, 718, 9, 7, 9, 3], [367, 769, 9, 7, 9, 3], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 6, 8, 6, 2], [428, 156, 6, 8, 6, 2], [428, 207, 7, 8, 7, 2], [428, 259, 7, 7, 7, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 4, 9, 9, 9, 3], [489, 55, 7, 7, 7, 3], [489, 107, 9, 7, 9, 4], [489, 157, 9, 7, 9, 3], [489, 208, 9, 9, 9, 3], [489, 260, 7, 6, 7, 4], [489, 310, 9, 9, 9, 3], [489, 361, 9, 7, 9, 3], [489, 413, 11, 6, 11, 4], [489, 464, 11, 6, 11, 4], [489, 515, 12, 6, 12, 4], [489, 565, 7, 7, 7, 3], [489, 616, 7, 7, 7, 3], [489, 668, 9, 6, 9, 4], [489, 718, 13, 7, 13, 3], [489, 769, 11, 7, 11, 3], [550, 5, 10, 6, 10, 4], [550, 56, 9, 6, 9, 4], [550, 107, 9, 6, 9, 4], [550, 158, 9, 6, 9, 4], [550, 208, 9, 7, 9, 3], [550, 260, 9, 8, 9, 4], [550, 311, 8, 6, 8, 4], [550, 362, 10, 7, 10, 4], [550, 412, 12, 8, 12, 3], [550, 464, 9, 6, 9, 4], [550, 514, 7, 9, 7, 3], [550, 565, 7, 7, 7, 3], [550, 616, 7, 7, 7, 3], [550, 668, 11, 6, 11, 4], [550, 719, 12, 6, 12, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 7, 8, 7, 4], [611, 107, 10, 6, 10, 4], [611, 157, 9, 7, 9, 3], [611, 208, 9, 9, 9, 3], [611, 260, 9, 6, 9, 4], [611, 311, 10, 6, 10, 4], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 6, 13, 4], [611, 515, 9, 6, 9, 4], [611, 564, 10, 8, 10, 2], [611, 615, 10, 8, 10, 2], [611, 666, 11, 8, 11, 2], [611, 718, 13, 7, 13, 3], [611, 770, 12, 6, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 106, 7, 7, 7, 3], [672, 157, 7, 7, 7, 3], [672, 208, 6, 7, 6, 3], [672, 259, 6, 7, 6, 3], [672, 311, 9, 6, 9, 4], [672, 362, 8, 6, 8, 4], [672, 412, 9, 9, 9, 3], [1, 5, 6, 6, 6, 4], [794, 768, 9, 8, 9, 2], [672, 566, 9, 6, 9, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 718, 9, 7, 9, 3], [672, 769, 9, 7, 9, 3], [733, 4, 9, 9, 9, 3], [733, 56, 7, 6, 7, 4], [733, 107, 6, 8, 6, 4], [733, 158, 7, 8, 7, 4], [733, 208, 13, 7, 13, 3], [733, 258, 10, 8, 10, 2], [733, 309, 10, 8, 10, 2], [733, 360, 10, 8, 10, 2], [733, 411, 10, 8, 10, 2], [733, 462, 10, 8, 10, 2], [733, 513, 7, 8, 7, 2], [733, 564, 7, 8, 7, 2], [733, 615, 7, 8, 7, 2], [733, 666, 7, 8, 7, 2], [733, 717, 11, 8, 11, 2], [733, 768, 11, 8, 11, 2], [1, 5, 6, 6, 6, 4], [794, 54, 11, 8, 11, 2], [794, 105, 10, 8, 10, 2], [794, 156, 10, 8, 10, 2], [794, 207, 10, 8, 10, 2], [794, 260, 6, 6, 6, 4], [794, 310, 7, 7, 7, 3], [794, 361, 7, 7, 7, 3], [794, 412, 7, 7, 7, 3], [794, 463, 8, 7, 8, 3], [794, 514, 7, 7, 7, 3], [794, 565, 7, 7, 7, 3], [794, 617, 7, 8, 7, 4], [794, 667, 7, 7, 7, 3], [794, 719, 7, 8, 7, 4], [794, 768, 9, 8, 9, 2], [855, 3, 9, 8, 9, 2], [855, 54, 9, 8, 9, 2], [855, 105, 9, 8, 9, 2], [855, 156, 9, 8, 9, 2], [855, 207, 9, 8, 9, 2], [855, 258, 9, 8, 9, 2], [855, 309, 9, 8, 9, 2], [855, 360, 9, 8, 9, 2], [855, 411, 9, 8, 9, 2], [855, 462, 9, 8, 9, 2], [855, 513, 9, 8, 9, 2], [855, 564, 9, 8, 9, 2], [855, 615, 9, 8, 9, 2], [855, 666, 9, 8, 9, 2], [855, 717, 9, 8, 9, 2], [855, 768, 9, 8, 9, 2]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 53, 10, 9, 7, 1], [1, 104, 10, 4, 7, 1], [1, 155, 12, 9, 9, 1], [1, 205, 11, 11, 9, 0], [1, 257, 15, 9, 12, 1], [1, 308, 11, 9, 10, 1], [1, 359, 9, 4, 6, 1], [1, 410, 10, 11, 7, 1], [1, 461, 9, 11, 7, 1], [1, 512, 10, 5, 8, 1], [1, 565, 11, 7, 9, 3], [1, 620, 7, 5, 7, 7], [1, 669, 9, 3, 7, 5], [1, 722, 7, 3, 7, 7], [1, 767, 10, 9, 7, 1], [62, 2, 11, 9, 9, 1], [62, 53, 11, 9, 9, 1], [62, 104, 11, 9, 9, 1], [62, 155, 11, 9, 9, 1], [62, 206, 12, 9, 9, 1], [62, 257, 12, 9, 9, 1], [62, 308, 11, 9, 9, 1], [62, 359, 12, 9, 9, 1], [62, 410, 11, 9, 9, 1], [62, 461, 11, 9, 9, 1], [62, 514, 9, 7, 7, 3], [62, 565, 9, 9, 7, 3], [62, 616, 11, 7, 9, 3], [62, 668, 10, 5, 9, 4], [62, 718, 10, 7, 9, 3], [62, 767, 11, 9, 9, 1], [123, 2, 15, 10, 13, 1], [123, 53, 11, 9, 10, 1], [123, 104, 12, 9, 10, 1], [123, 155, 12, 9, 10, 1], [123, 206, 12, 9, 10, 1], [123, 257, 13, 9, 10, 1], [123, 308, 12, 9, 9, 1], [123, 359, 13, 9, 11, 1], [123, 410, 13, 9, 10, 1], [123, 461, 10, 9, 7, 1], [123, 512, 12, 9, 9, 1], [123, 563, 13, 9, 10, 1], [123, 614, 9, 9, 9, 1], [123, 665, 14, 9, 11, 1], [123, 716, 13, 9, 10, 1], [123, 767, 13, 9, 11, 1], [184, 2, 12, 9, 10, 1], [184, 53, 13, 9, 11, 1], [184, 104, 12, 9, 10, 1], [184, 155, 12, 9, 10, 1], [184, 206, 12, 9, 9, 1], [184, 257, 13, 9, 10, 1], [184, 308, 13, 9, 10, 1], [184, 359, 15, 9, 12, 1], [184, 410, 13, 9, 10, 1], [184, 461, 13, 9, 10, 1], [184, 512, 12, 9, 9, 1], [184, 563, 10, 11, 7, 1], [184, 614, 9, 9, 7, 1], [184, 665, 10, 11, 7, 1], [184, 716, 10, 4, 8, 1], [184, 775, 9, 3, 9, 9], [245, 2, 9, 4, 7, 1], [245, 55, 10, 7, 9, 3], [245, 104, 10, 9, 9, 1], [245, 157, 10, 7, 9, 3], [245, 206, 12, 9, 9, 1], [245, 259, 10, 7, 9, 3], [245, 308, 10, 9, 7, 1], [245, 361, 11, 9, 9, 3], [245, 410, 10, 9, 9, 1], [245, 461, 9, 9, 6, 1], [245, 512, 9, 11, 6, 1], [245, 563, 11, 9, 9, 1], [245, 614, 9, 9, 6, 1], [245, 667, 12, 7, 11, 3], [245, 718, 10, 7, 9, 3], [245, 769, 10, 7, 9, 3], [306, 4, 10, 9, 9, 3], [306, 55, 11, 9, 9, 3], [306, 106, 10, 7, 7, 3], [306, 157, 11, 7, 9, 3], [306, 207, 9, 8, 7, 2], [306, 259, 11, 7, 9, 3], [306, 310, 12, 7, 9, 3], [306, 361, 12, 7, 10, 3], [306, 412, 12, 7, 9, 3], [306, 463, 12, 9, 9, 3], [306, 514, 11, 7, 9, 3], [306, 563, 10, 11, 7, 1], [306, 614, 9, 11, 6, 1], [306, 665, 9, 11, 7, 1], [306, 716, 12, 4, 9, 1], [306, 767, 12, 9, 9, 1], [367, 1, 12, 10, 10, 0], [367, 52, 12, 10, 10, 0], [367, 104, 12, 11, 10, 1], [367, 154, 12, 10, 10, 0], [367, 205, 13, 10, 10, 0], [367, 256, 13, 10, 11, 0], [367, 307, 13, 10, 10, 0], [367, 359, 11, 9, 9, 1], [367, 410, 10, 9, 9, 1], [367, 460, 12, 10, 9, 0], [367, 512, 12, 9, 9, 1], [367, 562, 12, 10, 9, 0], [367, 613, 12, 10, 9, 0], [367, 667, 10, 9, 9, 3], [367, 716, 11, 9, 9, 1], [367, 767, 10, 9, 9, 1], [428, 1, 12, 10, 9, 0], [428, 53, 12, 9, 9, 1], [428, 103, 9, 10, 6, 0], [428, 154, 9, 10, 6, 0], [428, 205, 10, 10, 7, 0], [428, 257, 10, 9, 7, 1], [428, 307, 12, 10, 9, 0], [428, 358, 11, 10, 9, 0], [428, 409, 11, 10, 9, 0], [428, 460, 12, 10, 9, 0], [428, 512, 12, 9, 9, 1], [428, 562, 12, 10, 9, 0], [428, 613, 11, 10, 9, 0], [428, 664, 11, 10, 9, 0], [428, 715, 12, 10, 9, 0], [428, 767, 12, 9, 9, 1], [489, 2, 11, 11, 9, 1], [489, 53, 10, 6, 7, 1], [489, 105, 11, 9, 9, 2], [489, 155, 11, 9, 9, 1], [489, 206, 11, 11, 9, 1], [489, 260, 8, 4, 7, 4], [489, 308, 12, 11, 9, 1], [489, 359, 11, 9, 9, 1], [489, 411, 13, 8, 11, 2], [489, 462, 13, 8, 11, 2], [489, 513, 14, 5, 12, 2], [489, 563, 10, 4, 7, 1], [489, 614, 10, 3, 7, 1], [489, 667, 11, 7, 9, 3], [489, 716, 16, 9, 13, 1], [489, 767, 14, 9, 11, 1], [550, 4, 12, 5, 10, 3], [550, 55, 11, 7, 9, 3], [550, 106, 11, 7, 9, 3], [550, 157, 10, 7, 9, 3], [550, 206, 12, 9, 9, 1], [550, 260, 10, 8, 9, 4], [550, 309, 10, 8, 8, 2], [550, 360, 12, 9, 10, 2], [550, 410, 15, 10, 12, 1], [550, 463, 12, 7, 9, 3], [550, 512, 10, 11, 7, 1], [550, 563, 10, 6, 7, 1], [550, 614, 10, 6, 7, 1], [550, 666, 13, 8, 11, 2], [550, 718, 13, 7, 12, 3], [550, 769, 10, 7, 9, 3], [611, 4, 10, 9, 9, 3], [611, 55, 9, 9, 7, 3], [611, 108, 11, 5, 10, 5], [611, 155, 12, 9, 9, 1], [611, 206, 12, 11, 9, 1], [611, 259, 11, 7, 9, 3], [611, 309, 10, 8, 10, 2], [611, 362, 10, 5, 9, 4], [611, 413, 10, 5, 9, 4], [611, 467, 13, 3, 13, 7], [611, 511, 1, 1, 9, 1], [611, 562, 11, 10, 10, 0], [611, 613, 13, 10, 10, 0], [611, 664, 13, 10, 11, 0], [611, 716, 16, 9, 13, 1], [611, 769, 13, 7, 12, 3], [672, 6, 10, 3, 9, 5], [672, 57, 14, 3, 13, 5], [672, 104, 10, 4, 7, 1], [672, 155, 10, 4, 7, 1], [672, 206, 9, 5, 6, 1], [672, 257, 9, 5, 6, 1], [672, 310, 11, 7, 9, 3], [672, 360, 9, 8, 8, 2], [672, 410, 12, 11, 9, 1], [1, 1, 1, 1, 6, 1], [794, 766, 12, 4, 9, 0], [672, 565, 10, 6, 9, 3], [672, 617, 8, 5, 7, 4], [672, 668, 8, 5, 7, 4], [672, 716, 12, 9, 9, 1], [672, 767, 12, 9, 9, 1], [733, 2, 11, 11, 9, 1], [733, 56, 8, 3, 7, 4], [733, 110, 7, 5, 6, 7], [733, 161, 8, 5, 7, 7], [733, 206, 15, 9, 13, 1], [733, 256, 12, 10, 10, 0], [733, 307, 12, 10, 10, 0], [733, 358, 12, 10, 10, 0], [733, 409, 13, 10, 10, 0], [733, 460, 12, 10, 10, 0], [733, 511, 10, 10, 7, 0], [733, 562, 10, 10, 7, 0], [733, 613, 10, 10, 7, 0], [733, 664, 10, 10, 7, 0], [733, 715, 13, 10, 11, 0], [733, 766, 13, 10, 11, 0], [1, 1, 1, 1, 6, 1], [794, 52, 13, 10, 11, 0], [794, 103, 13, 10, 10, 0], [794, 154, 13, 10, 10, 0], [794, 205, 13, 10, 10, 0], [794, 259, 8, 7, 6, 3], [794, 308, 10, 4, 7, 1], [794, 359, 10, 4, 7, 1], [794, 410, 10, 3, 7, 1], [794, 461, 11, 4, 8, 1], [794, 512, 10, 3, 7, 1], [794, 563, 10, 3, 7, 1], [794, 619, 6, 6, 7, 6], [794, 665, 10, 4, 7, 1], [794, 722, 7, 5, 7, 7], [794, 766, 12, 4, 9, 0], [855, 1, 12, 4, 9, 0], [855, 52, 12, 4, 9, 0], [855, 103, 12, 4, 9, 0], [855, 154, 12, 4, 9, 0], [855, 205, 12, 4, 9, 0], [855, 256, 12, 4, 9, 0], [855, 307, 12, 4, 9, 0], [855, 358, 12, 4, 9, 0], [855, 409, 12, 4, 9, 0], [855, 460, 12, 4, 9, 0], [855, 511, 12, 4, 9, 0], [855, 562, 12, 4, 9, 0], [855, 613, 12, 4, 9, 0], [855, 664, 12, 4, 9, 0], [855, 715, 12, 4, 9, 0], [855, 766, 12, 4, 9, 0]], \"capHeight\": 10, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 5, 1], [1, 53, 9, 7, 6, 1], [1, 104, 9, 2, 6, 1], [1, 155, 11, 7, 8, 1], [1, 205, 10, 9, 8, 0], [1, 257, 14, 7, 11, 1], [1, 308, 10, 7, 9, 1], [1, 359, 8, 2, 5, 1], [1, 410, 9, 9, 6, 1], [1, 461, 8, 9, 6, 1], [1, 512, 9, 3, 7, 1], [1, 565, 10, 5, 8, 3], [1, 620, 6, 3, 6, 7], [1, 669, 8, 1, 6, 5], [1, 722, 6, 1, 6, 7], [1, 767, 9, 7, 6, 1], [62, 2, 10, 7, 8, 1], [62, 53, 10, 7, 8, 1], [62, 104, 10, 7, 8, 1], [62, 155, 10, 7, 8, 1], [62, 206, 11, 7, 8, 1], [62, 257, 11, 7, 8, 1], [62, 308, 10, 7, 8, 1], [62, 359, 11, 7, 8, 1], [62, 410, 10, 7, 8, 1], [62, 461, 10, 7, 8, 1], [62, 514, 8, 5, 6, 3], [62, 565, 8, 7, 6, 3], [62, 616, 10, 5, 8, 3], [62, 668, 9, 3, 8, 4], [62, 718, 9, 5, 8, 3], [62, 767, 10, 7, 8, 1], [123, 2, 14, 8, 12, 1], [123, 53, 10, 7, 9, 1], [123, 104, 11, 7, 9, 1], [123, 155, 11, 7, 9, 1], [123, 206, 11, 7, 9, 1], [123, 257, 12, 7, 9, 1], [123, 308, 11, 7, 8, 1], [123, 359, 12, 7, 10, 1], [123, 410, 12, 7, 9, 1], [123, 461, 9, 7, 6, 1], [123, 512, 11, 7, 8, 1], [123, 563, 12, 7, 9, 1], [123, 614, 8, 7, 8, 1], [123, 665, 13, 7, 10, 1], [123, 716, 12, 7, 9, 1], [123, 767, 12, 7, 10, 1], [184, 2, 11, 7, 9, 1], [184, 53, 12, 7, 10, 1], [184, 104, 11, 7, 9, 1], [184, 155, 11, 7, 9, 1], [184, 206, 11, 7, 8, 1], [184, 257, 12, 7, 9, 1], [184, 308, 12, 7, 9, 1], [184, 359, 14, 7, 11, 1], [184, 410, 12, 7, 9, 1], [184, 461, 12, 7, 9, 1], [184, 512, 11, 7, 8, 1], [184, 563, 9, 9, 6, 1], [184, 614, 8, 7, 6, 1], [184, 665, 9, 9, 6, 1], [184, 716, 9, 2, 7, 1], [184, 775, 8, 1, 8, 9], [245, 2, 8, 2, 6, 1], [245, 55, 9, 5, 8, 3], [245, 104, 9, 7, 8, 1], [245, 157, 9, 5, 8, 3], [245, 206, 11, 7, 8, 1], [245, 259, 9, 5, 8, 3], [245, 308, 9, 7, 6, 1], [245, 361, 10, 7, 8, 3], [245, 410, 9, 7, 8, 1], [245, 461, 8, 7, 5, 1], [245, 512, 8, 9, 5, 1], [245, 563, 10, 7, 8, 1], [245, 614, 8, 7, 5, 1], [245, 667, 11, 5, 10, 3], [245, 718, 9, 5, 8, 3], [245, 769, 9, 5, 8, 3], [306, 4, 9, 7, 8, 3], [306, 55, 10, 7, 8, 3], [306, 106, 9, 5, 6, 3], [306, 157, 10, 5, 8, 3], [306, 207, 8, 6, 6, 2], [306, 259, 10, 5, 8, 3], [306, 310, 11, 5, 8, 3], [306, 361, 11, 5, 9, 3], [306, 412, 11, 5, 8, 3], [306, 463, 11, 7, 8, 3], [306, 514, 10, 5, 8, 3], [306, 564, 8, 8, 6, 2], [306, 614, 8, 9, 5, 1], [306, 665, 8, 9, 6, 1], [306, 716, 10, 2, 8, 1], [306, 767, 11, 7, 8, 1], [367, 1, 10, 8, 9, 0], [367, 52, 11, 8, 9, 0], [367, 104, 11, 9, 9, 1], [367, 154, 11, 8, 9, 0], [367, 205, 12, 8, 9, 0], [367, 256, 12, 8, 10, 0], [367, 307, 12, 8, 9, 0], [367, 359, 10, 7, 8, 1], [367, 410, 9, 7, 8, 1], [367, 460, 11, 8, 8, 0], [367, 512, 11, 7, 8, 1], [367, 562, 11, 8, 8, 0], [367, 613, 11, 8, 8, 0], [367, 667, 9, 7, 8, 3], [367, 716, 10, 7, 8, 1], [367, 767, 9, 7, 8, 1], [428, 1, 11, 8, 8, 0], [428, 53, 11, 7, 8, 1], [428, 104, 8, 7, 5, 1], [428, 154, 7, 8, 5, 0], [428, 205, 8, 8, 6, 0], [428, 257, 8, 7, 6, 1], [428, 307, 11, 8, 8, 0], [428, 358, 9, 8, 8, 0], [428, 409, 10, 8, 8, 0], [428, 460, 11, 8, 8, 0], [428, 512, 11, 7, 8, 1], [428, 562, 11, 8, 8, 0], [428, 613, 10, 8, 8, 0], [428, 664, 10, 8, 8, 0], [428, 715, 11, 8, 8, 0], [428, 767, 11, 7, 8, 1], [489, 2, 10, 9, 8, 1], [489, 53, 9, 4, 6, 1], [489, 105, 10, 7, 8, 2], [489, 155, 10, 7, 8, 1], [489, 206, 10, 9, 8, 1], [489, 260, 7, 2, 6, 4], [489, 308, 11, 9, 8, 1], [489, 359, 10, 7, 8, 1], [489, 411, 12, 6, 10, 2], [489, 462, 12, 6, 10, 2], [489, 513, 13, 3, 11, 2], [489, 563, 9, 2, 6, 1], [489, 614, 8, 1, 6, 1], [489, 667, 10, 5, 8, 3], [489, 716, 15, 7, 12, 1], [489, 767, 13, 7, 10, 1], [550, 4, 11, 3, 9, 3], [550, 55, 10, 5, 8, 3], [550, 106, 10, 5, 8, 3], [550, 157, 9, 5, 8, 3], [550, 206, 10, 7, 8, 1], [550, 260, 9, 6, 8, 4], [550, 309, 9, 6, 7, 2], [550, 360, 11, 7, 9, 2], [550, 410, 14, 8, 11, 1], [550, 463, 11, 5, 8, 3], [550, 513, 8, 8, 6, 2], [550, 563, 9, 4, 6, 1], [550, 614, 9, 4, 6, 1], [550, 666, 12, 6, 10, 2], [550, 718, 12, 5, 11, 3], [550, 769, 9, 5, 8, 3], [611, 4, 9, 7, 8, 3], [611, 55, 8, 7, 6, 3], [611, 108, 10, 3, 9, 5], [611, 156, 11, 6, 8, 2], [611, 206, 11, 9, 8, 1], [611, 259, 10, 5, 8, 3], [611, 309, 9, 6, 9, 2], [611, 362, 9, 3, 8, 4], [611, 413, 9, 3, 8, 4], [611, 467, 12, 1, 12, 7], [611, 511, 1, 1, 8, 1], [611, 562, 10, 8, 9, 0], [611, 613, 11, 8, 9, 0], [611, 664, 12, 8, 10, 0], [611, 716, 15, 7, 12, 1], [611, 769, 12, 5, 11, 3], [672, 6, 9, 1, 8, 5], [672, 57, 13, 1, 12, 5], [672, 104, 9, 2, 6, 1], [672, 155, 9, 2, 6, 1], [672, 207, 7, 2, 5, 2], [672, 258, 8, 2, 5, 2], [672, 310, 10, 5, 8, 3], [672, 360, 8, 6, 7, 2], [672, 410, 11, 9, 8, 1], [1, 1, 1, 1, 5, 1], [794, 766, 10, 2, 8, 0], [672, 565, 9, 4, 8, 3], [672, 617, 7, 3, 6, 4], [672, 668, 7, 3, 6, 4], [672, 716, 11, 7, 8, 1], [672, 767, 11, 7, 8, 1], [733, 2, 10, 9, 8, 1], [733, 56, 7, 1, 6, 4], [733, 110, 6, 3, 5, 7], [733, 161, 7, 3, 6, 7], [733, 206, 14, 7, 12, 1], [733, 256, 11, 8, 9, 0], [733, 307, 11, 8, 9, 0], [733, 358, 10, 8, 9, 0], [733, 409, 12, 8, 9, 0], [733, 460, 11, 8, 9, 0], [733, 512, 9, 7, 6, 1], [733, 562, 9, 8, 6, 0], [733, 613, 9, 8, 6, 0], [733, 664, 9, 8, 6, 0], [733, 715, 12, 8, 10, 0], [733, 766, 12, 8, 10, 0], [1, 1, 1, 1, 5, 1], [794, 52, 12, 8, 10, 0], [794, 103, 12, 8, 9, 0], [794, 154, 12, 8, 9, 0], [794, 205, 12, 8, 9, 0], [794, 259, 7, 5, 5, 3], [794, 308, 9, 2, 6, 1], [794, 359, 8, 2, 6, 1], [794, 410, 9, 1, 6, 1], [794, 461, 9, 2, 7, 1], [794, 512, 9, 1, 6, 1], [794, 563, 9, 1, 6, 1], [794, 619, 5, 4, 6, 6], [794, 665, 9, 2, 6, 1], [794, 722, 6, 3, 6, 7], [794, 766, 10, 2, 8, 0], [855, 1, 10, 2, 8, 0], [855, 52, 10, 2, 8, 0], [855, 103, 10, 2, 8, 0], [855, 154, 10, 2, 8, 0], [855, 205, 10, 2, 8, 0], [855, 256, 10, 2, 8, 0], [855, 307, 10, 2, 8, 0], [855, 358, 10, 2, 8, 0], [855, 409, 10, 2, 8, 0], [855, 460, 10, 2, 8, 0], [855, 511, 10, 2, 8, 0], [855, 562, 10, 2, 8, 0], [855, 613, 10, 2, 8, 0], [855, 664, 10, 2, 8, 0], [855, 715, 10, 2, 8, 0], [855, 766, 10, 2, 8, 0]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 15, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 54, 7, 9, 7, 2], [1, 105, 7, 8, 7, 2], [1, 156, 9, 9, 9, 2], [1, 206, 9, 11, 9, 1], [1, 258, 12, 9, 12, 2], [1, 309, 10, 9, 10, 2], [1, 360, 6, 8, 6, 2], [1, 411, 7, 11, 7, 2], [1, 462, 7, 11, 7, 2], [1, 513, 8, 8, 8, 2], [1, 566, 9, 7, 9, 4], [1, 617, 7, 9, 7, 4], [1, 668, 7, 6, 7, 4], [1, 719, 7, 7, 7, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 7, 7, 7, 4], [62, 566, 7, 9, 7, 4], [62, 617, 9, 7, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 7, 9, 4], [62, 768, 9, 9, 9, 2], [123, 3, 13, 10, 13, 2], [123, 54, 10, 9, 10, 2], [123, 105, 10, 9, 10, 2], [123, 156, 10, 9, 10, 2], [123, 207, 10, 9, 10, 2], [123, 258, 10, 9, 10, 2], [123, 309, 9, 9, 9, 2], [123, 360, 11, 9, 11, 2], [123, 411, 10, 9, 10, 2], [123, 462, 7, 9, 7, 2], [123, 513, 9, 9, 9, 2], [123, 564, 10, 9, 10, 2], [123, 615, 9, 9, 9, 2], [123, 666, 11, 9, 11, 2], [123, 717, 10, 9, 10, 2], [123, 768, 11, 9, 11, 2], [184, 3, 10, 9, 10, 2], [184, 54, 11, 9, 11, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 9, 9, 9, 2], [184, 258, 10, 9, 10, 2], [184, 309, 10, 9, 10, 2], [184, 360, 12, 9, 12, 2], [184, 411, 10, 9, 10, 2], [184, 462, 10, 9, 10, 2], [184, 513, 9, 9, 9, 2], [184, 564, 7, 11, 7, 2], [184, 615, 7, 9, 7, 2], [184, 666, 7, 11, 7, 2], [184, 717, 8, 8, 8, 2], [184, 770, 9, 9, 9, 4], [245, 3, 7, 8, 7, 2], [245, 56, 9, 7, 9, 4], [245, 105, 9, 9, 9, 2], [245, 158, 9, 7, 9, 4], [245, 207, 9, 9, 9, 2], [245, 260, 9, 7, 9, 4], [245, 309, 7, 9, 7, 2], [245, 362, 9, 9, 9, 4], [245, 411, 9, 9, 9, 2], [245, 462, 6, 9, 6, 2], [245, 513, 6, 11, 6, 2], [245, 564, 9, 9, 9, 2], [245, 615, 6, 9, 6, 2], [245, 668, 11, 7, 11, 4], [245, 719, 9, 7, 9, 4], [245, 770, 9, 7, 9, 4], [306, 5, 9, 9, 9, 4], [306, 56, 9, 9, 9, 4], [306, 107, 7, 7, 7, 4], [306, 158, 9, 7, 9, 4], [306, 208, 7, 8, 7, 3], [306, 260, 9, 7, 9, 4], [306, 311, 9, 7, 9, 4], [306, 362, 10, 7, 10, 4], [306, 413, 9, 7, 9, 4], [306, 464, 9, 9, 9, 4], [306, 515, 9, 7, 9, 4], [306, 564, 7, 11, 7, 2], [306, 615, 6, 11, 6, 2], [306, 666, 7, 11, 7, 2], [306, 717, 9, 8, 9, 2], [306, 768, 9, 9, 9, 2], [367, 2, 10, 10, 10, 1], [367, 53, 10, 10, 10, 1], [367, 105, 10, 11, 10, 2], [367, 155, 10, 10, 10, 1], [367, 206, 10, 10, 10, 1], [367, 257, 11, 10, 11, 1], [367, 308, 10, 10, 10, 1], [367, 360, 9, 9, 9, 2], [367, 411, 9, 9, 9, 2], [367, 461, 9, 10, 9, 1], [367, 513, 9, 9, 9, 2], [367, 563, 9, 10, 9, 1], [367, 614, 9, 10, 9, 1], [367, 668, 9, 9, 9, 4], [367, 717, 9, 9, 9, 2], [367, 768, 9, 9, 9, 2], [428, 2, 9, 10, 9, 1], [428, 54, 9, 9, 9, 2], [428, 104, 6, 10, 6, 1], [428, 155, 6, 10, 6, 1], [428, 206, 7, 10, 7, 1], [428, 258, 7, 9, 7, 2], [428, 308, 9, 10, 9, 1], [428, 359, 9, 10, 9, 1], [428, 410, 9, 10, 9, 1], [428, 461, 9, 10, 9, 1], [428, 513, 9, 9, 9, 2], [428, 563, 9, 10, 9, 1], [428, 614, 9, 10, 9, 1], [428, 665, 9, 10, 9, 1], [428, 716, 9, 10, 9, 1], [428, 768, 9, 9, 9, 2], [489, 3, 9, 11, 9, 2], [489, 54, 7, 8, 7, 2], [489, 106, 9, 9, 9, 3], [489, 156, 9, 9, 9, 2], [489, 207, 9, 11, 9, 2], [489, 260, 7, 6, 7, 4], [489, 309, 9, 11, 9, 2], [489, 360, 9, 9, 9, 2], [489, 412, 11, 8, 11, 3], [489, 463, 11, 8, 11, 3], [489, 514, 12, 7, 12, 3], [489, 564, 7, 8, 7, 2], [489, 615, 7, 8, 7, 2], [489, 668, 9, 7, 9, 4], [489, 717, 13, 9, 13, 2], [489, 768, 11, 9, 11, 2], [550, 5, 10, 6, 10, 4], [550, 56, 9, 7, 9, 4], [550, 107, 9, 7, 9, 4], [550, 158, 9, 7, 9, 4], [550, 207, 9, 9, 9, 2], [550, 260, 9, 9, 9, 4], [550, 310, 8, 8, 8, 3], [550, 361, 10, 9, 10, 3], [550, 411, 12, 10, 12, 2], [550, 464, 9, 7, 9, 4], [550, 513, 7, 11, 7, 2], [550, 564, 7, 8, 7, 2], [550, 615, 7, 8, 7, 2], [550, 667, 11, 8, 11, 3], [550, 719, 12, 7, 12, 4], [550, 770, 9, 7, 9, 4], [611, 5, 9, 9, 9, 4], [611, 56, 7, 9, 7, 4], [611, 107, 10, 7, 10, 4], [611, 156, 9, 9, 9, 2], [611, 207, 9, 11, 9, 2], [611, 260, 9, 7, 9, 4], [611, 310, 10, 8, 10, 3], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 13, 7, 13, 4], [611, 515, 9, 6, 9, 4], [611, 563, 10, 10, 10, 1], [611, 614, 10, 10, 10, 1], [611, 665, 11, 10, 11, 1], [611, 717, 13, 9, 13, 2], [611, 770, 12, 7, 12, 4], [672, 5, 9, 6, 9, 4], [672, 56, 13, 6, 13, 4], [672, 105, 7, 8, 7, 2], [672, 156, 7, 8, 7, 2], [672, 207, 6, 8, 6, 2], [672, 258, 6, 8, 6, 2], [672, 311, 9, 7, 9, 4], [672, 361, 8, 8, 8, 3], [672, 411, 9, 11, 9, 2], [1, 5, 6, 6, 6, 4], [794, 767, 9, 9, 9, 1], [672, 566, 9, 6, 9, 4], [672, 617, 7, 6, 7, 4], [672, 668, 7, 6, 7, 4], [672, 717, 9, 9, 9, 2], [672, 768, 9, 9, 9, 2], [733, 3, 9, 11, 9, 2], [733, 56, 7, 6, 7, 4], [733, 107, 6, 9, 6, 4], [733, 158, 7, 9, 7, 4], [733, 207, 13, 9, 13, 2], [733, 257, 10, 10, 10, 1], [733, 308, 10, 10, 10, 1], [733, 359, 10, 10, 10, 1], [733, 410, 10, 10, 10, 1], [733, 461, 10, 10, 10, 1], [733, 512, 7, 10, 7, 1], [733, 563, 7, 10, 7, 1], [733, 614, 7, 10, 7, 1], [733, 665, 7, 10, 7, 1], [733, 716, 11, 10, 11, 1], [733, 767, 11, 10, 11, 1], [1, 5, 6, 6, 6, 4], [794, 53, 11, 10, 11, 1], [794, 104, 10, 10, 10, 1], [794, 155, 10, 10, 10, 1], [794, 206, 10, 10, 10, 1], [794, 260, 6, 7, 6, 4], [794, 309, 7, 8, 7, 2], [794, 360, 7, 8, 7, 2], [794, 411, 7, 8, 7, 2], [794, 462, 8, 8, 8, 2], [794, 513, 7, 8, 7, 2], [794, 564, 7, 8, 7, 2], [794, 617, 7, 9, 7, 4], [794, 666, 7, 8, 7, 2], [794, 719, 7, 9, 7, 4], [794, 767, 9, 9, 9, 1], [855, 2, 9, 9, 9, 1], [855, 53, 9, 9, 9, 1], [855, 104, 9, 9, 9, 1], [855, 155, 9, 9, 9, 1], [855, 206, 9, 9, 9, 1], [855, 257, 9, 9, 9, 1], [855, 308, 9, 9, 9, 1], [855, 359, 9, 9, 9, 1], [855, 410, 9, 9, 9, 1], [855, 461, 9, 9, 9, 1], [855, 512, 9, 9, 9, 1], [855, 563, 9, 9, 9, 1], [855, 614, 9, 9, 9, 1], [855, 665, 9, 9, 9, 1], [855, 716, 9, 9, 9, 1], [855, 767, 9, 9, 9, 1]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/05_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 5, 6, 5, 4], [1, 55, 6, 7, 6, 3], [1, 106, 6, 7, 6, 3], [1, 157, 8, 7, 8, 3], [1, 207, 8, 9, 8, 2], [1, 259, 11, 7, 11, 3], [1, 310, 9, 7, 9, 3], [1, 361, 5, 7, 5, 3], [1, 412, 6, 9, 6, 3], [1, 463, 6, 9, 6, 3], [1, 514, 7, 7, 7, 3], [1, 566, 8, 6, 8, 4], [1, 617, 6, 8, 6, 4], [1, 668, 6, 6, 6, 4], [1, 719, 6, 6, 6, 4], [1, 769, 6, 7, 6, 3], [62, 4, 8, 7, 8, 3], [62, 55, 8, 7, 8, 3], [62, 106, 8, 7, 8, 3], [62, 157, 8, 7, 8, 3], [62, 208, 8, 7, 8, 3], [62, 259, 8, 7, 8, 3], [62, 310, 8, 7, 8, 3], [62, 361, 8, 7, 8, 3], [62, 412, 8, 7, 8, 3], [62, 463, 8, 7, 8, 3], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 8, 6, 8, 4], [62, 668, 8, 6, 8, 4], [62, 719, 8, 6, 8, 4], [62, 769, 8, 7, 8, 3], [123, 4, 12, 8, 12, 3], [123, 55, 9, 7, 9, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 9, 7, 9, 3], [123, 310, 8, 7, 8, 3], [123, 361, 10, 7, 10, 3], [123, 412, 9, 7, 9, 3], [123, 463, 6, 7, 6, 3], [123, 514, 8, 7, 8, 3], [123, 565, 9, 7, 9, 3], [123, 616, 8, 7, 8, 3], [123, 667, 10, 7, 10, 3], [123, 718, 9, 7, 9, 3], [123, 769, 10, 7, 10, 3], [184, 4, 9, 7, 9, 3], [184, 55, 10, 7, 10, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 8, 7, 8, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 11, 7, 11, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 8, 7, 8, 3], [184, 565, 6, 9, 6, 3], [184, 616, 6, 7, 6, 3], [184, 667, 6, 9, 6, 3], [184, 718, 7, 7, 7, 3], [184, 770, 8, 8, 8, 4], [245, 4, 6, 7, 6, 3], [245, 56, 8, 6, 8, 4], [245, 106, 8, 7, 8, 3], [245, 158, 8, 6, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 8, 6, 8, 4], [245, 310, 6, 7, 6, 3], [245, 362, 8, 8, 8, 4], [245, 412, 8, 7, 8, 3], [245, 463, 5, 7, 5, 3], [245, 514, 5, 9, 5, 3], [245, 565, 8, 7, 8, 3], [245, 616, 5, 7, 5, 3], [245, 668, 10, 6, 10, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 8, 8, 4], [306, 56, 8, 8, 8, 4], [306, 107, 6, 6, 6, 4], [306, 158, 8, 6, 8, 4], [306, 209, 6, 6, 6, 4], [306, 260, 8, 6, 8, 4], [306, 311, 8, 6, 8, 4], [306, 362, 9, 6, 9, 4], [306, 413, 8, 6, 8, 4], [306, 464, 8, 8, 8, 4], [306, 515, 8, 6, 8, 4], [306, 565, 6, 9, 6, 3], [306, 616, 5, 9, 5, 3], [306, 667, 6, 9, 6, 3], [306, 718, 8, 7, 8, 3], [306, 769, 8, 7, 8, 3], [367, 3, 9, 8, 9, 2], [367, 54, 9, 8, 9, 2], [367, 106, 9, 9, 9, 3], [367, 156, 9, 8, 9, 2], [367, 207, 9, 8, 9, 2], [367, 258, 10, 8, 10, 2], [367, 309, 9, 8, 9, 2], [367, 361, 8, 7, 8, 3], [367, 412, 8, 7, 8, 3], [367, 462, 8, 8, 8, 2], [367, 514, 8, 7, 8, 3], [367, 564, 8, 8, 8, 2], [367, 615, 8, 8, 8, 2], [367, 668, 8, 8, 8, 4], [367, 718, 8, 7, 8, 3], [367, 769, 8, 7, 8, 3], [428, 3, 8, 8, 8, 2], [428, 55, 8, 7, 8, 3], [428, 105, 5, 8, 5, 2], [428, 156, 5, 8, 5, 2], [428, 207, 6, 8, 6, 2], [428, 259, 6, 7, 6, 3], [428, 309, 8, 8, 8, 2], [428, 360, 8, 8, 8, 2], [428, 411, 8, 8, 8, 2], [428, 462, 8, 8, 8, 2], [428, 514, 8, 7, 8, 3], [428, 564, 8, 8, 8, 2], [428, 615, 8, 8, 8, 2], [428, 666, 8, 8, 8, 2], [428, 717, 8, 8, 8, 2], [428, 769, 8, 7, 8, 3], [489, 4, 8, 9, 8, 3], [489, 55, 6, 7, 6, 3], [489, 107, 8, 7, 8, 4], [489, 157, 8, 7, 8, 3], [489, 208, 8, 9, 8, 3], [489, 260, 6, 6, 6, 4], [489, 310, 8, 9, 8, 3], [489, 361, 8, 7, 8, 3], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 11, 6, 11, 4], [489, 565, 6, 7, 6, 3], [489, 616, 6, 7, 6, 3], [489, 668, 8, 6, 8, 4], [489, 718, 12, 7, 12, 3], [489, 769, 10, 7, 10, 3], [550, 5, 9, 6, 9, 4], [550, 56, 8, 6, 8, 4], [550, 107, 8, 6, 8, 4], [550, 158, 8, 6, 8, 4], [550, 208, 8, 7, 8, 3], [550, 260, 8, 8, 8, 4], [550, 311, 7, 6, 7, 4], [550, 362, 9, 7, 9, 4], [550, 412, 11, 8, 11, 3], [550, 464, 8, 6, 8, 4], [550, 514, 6, 9, 6, 3], [550, 565, 6, 7, 6, 3], [550, 616, 6, 7, 6, 3], [550, 668, 10, 6, 10, 4], [550, 719, 11, 6, 11, 4], [550, 770, 8, 6, 8, 4], [611, 5, 8, 8, 8, 4], [611, 56, 6, 8, 6, 4], [611, 107, 9, 6, 9, 4], [611, 157, 8, 7, 8, 3], [611, 208, 8, 9, 8, 3], [611, 260, 8, 6, 8, 4], [611, 311, 9, 6, 9, 4], [611, 362, 8, 6, 8, 4], [611, 413, 8, 6, 8, 4], [611, 464, 12, 6, 12, 4], [611, 515, 8, 6, 8, 4], [611, 564, 9, 8, 9, 2], [611, 615, 9, 8, 9, 2], [611, 666, 10, 8, 10, 2], [611, 718, 12, 7, 12, 3], [611, 770, 11, 6, 11, 4], [672, 5, 8, 6, 8, 4], [672, 56, 12, 6, 12, 4], [672, 106, 6, 7, 6, 3], [672, 157, 6, 7, 6, 3], [672, 208, 5, 7, 5, 3], [672, 259, 5, 7, 5, 3], [672, 311, 8, 6, 8, 4], [672, 362, 7, 6, 7, 4], [672, 412, 8, 9, 8, 3], [1, 5, 5, 6, 5, 4], [794, 768, 8, 8, 8, 2], [672, 566, 8, 6, 8, 4], [672, 617, 6, 6, 6, 4], [672, 668, 6, 6, 6, 4], [672, 718, 8, 7, 8, 3], [672, 769, 8, 7, 8, 3], [733, 4, 8, 9, 8, 3], [733, 56, 6, 6, 6, 4], [733, 107, 5, 8, 5, 4], [733, 158, 6, 8, 6, 4], [733, 208, 12, 7, 12, 3], [733, 258, 9, 8, 9, 2], [733, 309, 9, 8, 9, 2], [733, 360, 9, 8, 9, 2], [733, 411, 9, 8, 9, 2], [733, 462, 9, 8, 9, 2], [733, 513, 6, 8, 6, 2], [733, 564, 6, 8, 6, 2], [733, 615, 6, 8, 6, 2], [733, 666, 6, 8, 6, 2], [733, 717, 10, 8, 10, 2], [733, 768, 10, 8, 10, 2], [1, 5, 5, 6, 5, 4], [794, 54, 10, 8, 10, 2], [794, 105, 9, 8, 9, 2], [794, 156, 9, 8, 9, 2], [794, 207, 9, 8, 9, 2], [794, 260, 5, 6, 5, 4], [794, 310, 6, 7, 6, 3], [794, 361, 6, 7, 6, 3], [794, 412, 6, 7, 6, 3], [794, 463, 7, 7, 7, 3], [794, 514, 6, 7, 6, 3], [794, 565, 6, 7, 6, 3], [794, 617, 6, 8, 6, 4], [794, 667, 6, 7, 6, 3], [794, 719, 6, 8, 6, 4], [794, 768, 8, 8, 8, 2], [855, 3, 8, 8, 8, 2], [855, 54, 8, 8, 8, 2], [855, 105, 8, 8, 8, 2], [855, 156, 8, 8, 8, 2], [855, 207, 8, 8, 8, 2], [855, 258, 8, 8, 8, 2], [855, 309, 8, 8, 8, 2], [855, 360, 8, 8, 8, 2], [855, 411, 8, 8, 8, 2], [855, 462, 8, 8, 8, 2], [855, 513, 8, 8, 8, 2], [855, 564, 8, 8, 8, 2], [855, 615, 8, 8, 8, 2], [855, 666, 8, 8, 8, 2], [855, 717, 8, 8, 8, 2], [855, 768, 8, 8, 8, 2]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 9}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 11, 10, 11, 2], [1, 105, 12, 5, 11, 2], [1, 156, 12, 10, 11, 2], [1, 206, 13, 12, 11, 1], [1, 258, 14, 10, 11, 2], [1, 309, 12, 10, 11, 2], [1, 360, 11, 5, 11, 2], [1, 411, 13, 12, 11, 2], [1, 462, 11, 12, 11, 2], [1, 513, 13, 6, 11, 2], [1, 567, 11, 7, 11, 5], [1, 621, 9, 6, 11, 8], [1, 670, 11, 3, 11, 6], [1, 723, 9, 4, 11, 8], [1, 768, 13, 10, 11, 2], [62, 3, 12, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 12, 10, 11, 2], [62, 156, 12, 10, 11, 2], [62, 207, 12, 10, 11, 2], [62, 258, 13, 10, 11, 2], [62, 309, 12, 10, 11, 2], [62, 360, 12, 10, 11, 2], [62, 411, 12, 10, 11, 2], [62, 462, 12, 10, 11, 2], [62, 515, 11, 8, 11, 4], [62, 566, 11, 10, 11, 4], [62, 618, 13, 7, 11, 5], [62, 670, 11, 5, 11, 6], [62, 720, 12, 7, 11, 5], [62, 768, 12, 10, 11, 2], [123, 3, 13, 10, 11, 2], [123, 54, 11, 10, 11, 2], [123, 105, 12, 10, 11, 2], [123, 156, 13, 10, 11, 2], [123, 207, 12, 10, 11, 2], [123, 258, 13, 10, 11, 2], [123, 309, 13, 10, 11, 2], [123, 360, 13, 10, 11, 2], [123, 411, 13, 10, 11, 2], [123, 462, 14, 10, 11, 2], [123, 513, 13, 10, 11, 2], [123, 564, 13, 10, 11, 2], [123, 615, 10, 10, 11, 2], [123, 666, 13, 10, 11, 2], [123, 717, 13, 10, 11, 2], [123, 768, 12, 10, 11, 2], [184, 3, 12, 10, 11, 2], [184, 54, 12, 12, 11, 2], [184, 105, 12, 10, 11, 2], [184, 156, 13, 10, 11, 2], [184, 207, 13, 10, 11, 2], [184, 258, 13, 10, 11, 2], [184, 309, 13, 10, 11, 2], [184, 360, 12, 10, 11, 2], [184, 411, 13, 10, 11, 2], [184, 462, 14, 10, 11, 2], [184, 513, 13, 10, 11, 2], [184, 564, 14, 12, 11, 2], [184, 615, 11, 10, 11, 2], [184, 666, 12, 12, 11, 2], [184, 718, 11, 6, 11, 3], [184, 776, 10, 3, 11, 10], [245, 3, 10, 4, 11, 2], [245, 56, 12, 8, 11, 4], [245, 105, 11, 10, 11, 2], [245, 158, 12, 8, 11, 4], [245, 207, 13, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 12, 10, 11, 2], [245, 362, 12, 10, 11, 4], [245, 411, 11, 10, 11, 2], [245, 462, 11, 10, 11, 2], [245, 513, 12, 12, 11, 2], [245, 564, 12, 10, 11, 2], [245, 615, 11, 10, 11, 2], [245, 668, 12, 8, 11, 4], [245, 719, 11, 8, 11, 4], [245, 770, 11, 8, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 12, 10, 11, 4], [306, 107, 12, 8, 11, 4], [306, 158, 12, 8, 11, 4], [306, 208, 12, 9, 11, 3], [306, 260, 12, 8, 11, 4], [306, 311, 12, 8, 11, 4], [306, 362, 12, 8, 11, 4], [306, 413, 11, 8, 11, 4], [306, 464, 12, 10, 11, 4], [306, 515, 12, 8, 11, 4], [306, 564, 13, 12, 11, 2], [306, 615, 11, 10, 11, 2], [306, 666, 11, 12, 11, 2], [306, 721, 12, 4, 11, 6], [306, 768, 13, 10, 11, 2], [367, 2, 12, 11, 11, 1], [367, 52, 13, 12, 11, 0], [367, 108, 12, 9, 11, 5], [367, 154, 13, 12, 11, 0], [367, 205, 13, 12, 11, 0], [367, 257, 12, 11, 11, 1], [367, 308, 13, 11, 11, 1], [367, 360, 13, 10, 11, 2], [367, 411, 12, 10, 11, 2], [367, 462, 12, 10, 11, 2], [367, 514, 12, 9, 11, 3], [367, 564, 12, 10, 11, 2], [367, 615, 12, 10, 11, 2], [367, 668, 12, 10, 11, 4], [367, 717, 13, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 3, 11, 10, 11, 2], [428, 55, 11, 9, 11, 3], [428, 105, 12, 10, 11, 2], [428, 156, 10, 10, 11, 2], [428, 207, 11, 10, 11, 2], [428, 259, 11, 9, 11, 3], [428, 309, 11, 10, 11, 2], [428, 360, 12, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 12, 10, 11, 2], [428, 666, 12, 10, 11, 2], [428, 717, 12, 10, 11, 2], [428, 769, 12, 9, 11, 3], [489, 3, 13, 12, 11, 2], [489, 54, 11, 5, 11, 2], [489, 104, 12, 12, 11, 1], [489, 156, 13, 10, 11, 2], [489, 207, 12, 11, 11, 2], [489, 260, 11, 6, 11, 4], [489, 310, 13, 11, 11, 3], [489, 360, 12, 10, 11, 2], [489, 411, 13, 10, 11, 2], [489, 462, 13, 10, 11, 2], [489, 513, 14, 6, 11, 2], [489, 564, 12, 4, 11, 2], [489, 616, 11, 3, 11, 3], [489, 668, 12, 7, 11, 4], [489, 717, 14, 10, 11, 2], [489, 768, 12, 10, 11, 2], [550, 7, 12, 5, 11, 6], [550, 55, 12, 9, 11, 3], [550, 106, 13, 9, 11, 3], [550, 157, 12, 9, 11, 3], [550, 207, 14, 10, 11, 2], [550, 260, 12, 10, 11, 4], [550, 309, 12, 10, 11, 2], [550, 360, 13, 12, 11, 2], [550, 411, 14, 12, 11, 2], [550, 464, 12, 8, 11, 4], [550, 513, 13, 12, 11, 2], [550, 564, 13, 5, 11, 2], [550, 615, 12, 5, 11, 2], [550, 666, 12, 10, 11, 2], [550, 719, 12, 8, 11, 4], [550, 770, 11, 8, 11, 4], [611, 5, 11, 10, 11, 4], [611, 56, 11, 10, 11, 4], [611, 110, 11, 4, 11, 7], [611, 156, 13, 12, 11, 2], [611, 207, 13, 11, 11, 2], [611, 261, 11, 6, 11, 5], [611, 309, 11, 10, 11, 2], [611, 363, 12, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 469, 10, 3, 11, 9], [611, 511, 1, 1, 11, 1], [611, 562, 11, 12, 11, 0], [611, 613, 12, 12, 11, 0], [611, 664, 12, 12, 11, 0], [611, 717, 14, 10, 11, 2], [611, 770, 12, 8, 11, 4], [672, 7, 11, 3, 11, 6], [672, 58, 11, 3, 11, 6], [672, 105, 14, 6, 11, 2], [672, 156, 12, 6, 11, 2], [672, 207, 12, 6, 11, 2], [672, 258, 11, 6, 11, 2], [672, 312, 11, 7, 11, 5], [672, 361, 11, 9, 11, 3], [672, 412, 11, 11, 11, 3], [1, 1, 1, 1, 11, 1], [794, 768, 10, 4, 11, 2], [672, 565, 13, 9, 11, 3], [672, 618, 12, 7, 11, 5], [672, 669, 10, 7, 11, 5], [672, 717, 13, 10, 11, 2], [672, 768, 13, 10, 11, 2], [733, 3, 13, 12, 11, 2], [733, 58, 10, 4, 11, 6], [733, 111, 9, 6, 11, 8], [733, 162, 10, 6, 11, 8], [733, 208, 13, 9, 11, 3], [733, 256, 11, 12, 11, 0], [733, 307, 13, 12, 11, 0], [733, 358, 12, 12, 11, 0], [733, 410, 13, 11, 11, 1], [733, 460, 13, 12, 11, 0], [733, 511, 14, 12, 11, 0], [733, 562, 14, 12, 11, 0], [733, 614, 14, 11, 11, 1], [733, 664, 14, 12, 11, 0], [733, 715, 12, 12, 11, 0], [733, 766, 12, 12, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 12, 12, 11, 0], [794, 103, 13, 12, 11, 0], [794, 154, 13, 12, 11, 0], [794, 205, 13, 12, 11, 0], [794, 260, 10, 8, 11, 4], [794, 309, 11, 4, 11, 2], [794, 360, 11, 4, 11, 2], [794, 412, 11, 3, 11, 3], [794, 462, 11, 4, 11, 2], [794, 513, 11, 4, 11, 2], [794, 564, 11, 4, 11, 2], [794, 623, 7, 4, 11, 10], [794, 666, 13, 4, 11, 2], [794, 725, 9, 4, 11, 10], [794, 768, 10, 4, 11, 2], [855, 3, 10, 4, 11, 2], [855, 54, 10, 4, 11, 2], [855, 105, 10, 4, 11, 2], [855, 156, 10, 4, 11, 2], [855, 207, 10, 4, 11, 2], [855, 258, 10, 4, 11, 2], [855, 309, 10, 4, 11, 2], [855, 360, 10, 4, 11, 2], [855, 411, 10, 4, 11, 2], [855, 462, 10, 4, 11, 2], [855, 513, 10, 4, 11, 2], [855, 564, 10, 4, 11, 2], [855, 615, 10, 4, 11, 2], [855, 666, 10, 4, 11, 2], [855, 717, 10, 4, 11, 2], [855, 768, 10, 4, 11, 2]], \"capHeight\": 11, \"widestlogicalchar\": 11, \"widestglyph\": 14, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 10, 8, 10, 2], [1, 105, 11, 3, 10, 2], [1, 156, 11, 8, 10, 2], [1, 206, 12, 10, 10, 1], [1, 258, 13, 8, 10, 2], [1, 309, 11, 8, 10, 2], [1, 360, 10, 3, 10, 2], [1, 411, 12, 10, 10, 2], [1, 462, 10, 10, 10, 2], [1, 513, 12, 4, 10, 2], [1, 567, 10, 5, 10, 5], [1, 621, 8, 4, 10, 8], [1, 670, 10, 1, 10, 6], [1, 723, 8, 2, 10, 8], [1, 768, 12, 8, 10, 2], [62, 3, 11, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 11, 8, 10, 2], [62, 156, 11, 8, 10, 2], [62, 207, 11, 8, 10, 2], [62, 258, 12, 8, 10, 2], [62, 309, 11, 8, 10, 2], [62, 360, 11, 8, 10, 2], [62, 411, 11, 8, 10, 2], [62, 462, 11, 8, 10, 2], [62, 515, 10, 6, 10, 4], [62, 566, 10, 8, 10, 4], [62, 618, 12, 5, 10, 5], [62, 670, 10, 3, 10, 6], [62, 720, 11, 5, 10, 5], [62, 768, 11, 8, 10, 2], [123, 3, 12, 8, 10, 2], [123, 54, 10, 8, 10, 2], [123, 105, 11, 8, 10, 2], [123, 156, 12, 8, 10, 2], [123, 207, 11, 8, 10, 2], [123, 258, 12, 8, 10, 2], [123, 309, 12, 8, 10, 2], [123, 360, 12, 8, 10, 2], [123, 411, 12, 8, 10, 2], [123, 462, 13, 8, 10, 2], [123, 513, 12, 8, 10, 2], [123, 564, 12, 8, 10, 2], [123, 615, 9, 8, 10, 2], [123, 666, 12, 8, 10, 2], [123, 717, 12, 8, 10, 2], [123, 768, 11, 8, 10, 2], [184, 3, 11, 8, 10, 2], [184, 54, 11, 10, 10, 2], [184, 105, 11, 8, 10, 2], [184, 156, 12, 8, 10, 2], [184, 207, 12, 8, 10, 2], [184, 258, 12, 8, 10, 2], [184, 309, 12, 8, 10, 2], [184, 360, 11, 8, 10, 2], [184, 411, 12, 8, 10, 2], [184, 462, 13, 8, 10, 2], [184, 513, 12, 8, 10, 2], [184, 564, 13, 10, 10, 2], [184, 615, 10, 8, 10, 2], [184, 666, 11, 10, 10, 2], [184, 718, 10, 4, 10, 3], [184, 776, 9, 1, 10, 10], [245, 3, 9, 2, 10, 2], [245, 56, 11, 6, 10, 4], [245, 105, 10, 8, 10, 2], [245, 158, 11, 6, 10, 4], [245, 207, 12, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 11, 8, 10, 2], [245, 362, 11, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 10, 8, 10, 2], [245, 513, 11, 10, 10, 2], [245, 564, 11, 8, 10, 2], [245, 615, 10, 8, 10, 2], [245, 668, 11, 6, 10, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 11, 8, 10, 4], [306, 107, 11, 6, 10, 4], [306, 158, 11, 6, 10, 4], [306, 208, 11, 7, 10, 3], [306, 260, 11, 6, 10, 4], [306, 311, 11, 6, 10, 4], [306, 362, 11, 6, 10, 4], [306, 413, 10, 6, 10, 4], [306, 464, 11, 8, 10, 4], [306, 515, 11, 6, 10, 4], [306, 564, 12, 10, 10, 2], [306, 615, 10, 8, 10, 2], [306, 666, 10, 10, 10, 2], [306, 721, 11, 2, 10, 6], [306, 768, 12, 8, 10, 2], [367, 2, 11, 9, 10, 1], [367, 52, 12, 10, 10, 0], [367, 108, 11, 7, 10, 5], [367, 154, 12, 10, 10, 0], [367, 205, 12, 10, 10, 0], [367, 257, 11, 9, 10, 1], [367, 308, 12, 9, 10, 1], [367, 360, 12, 8, 10, 2], [367, 411, 11, 8, 10, 2], [367, 462, 11, 8, 10, 2], [367, 514, 11, 7, 10, 3], [367, 564, 11, 8, 10, 2], [367, 615, 11, 8, 10, 2], [367, 668, 11, 8, 10, 4], [367, 717, 12, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 3, 10, 8, 10, 2], [428, 55, 10, 7, 10, 3], [428, 105, 11, 8, 10, 2], [428, 156, 9, 8, 10, 2], [428, 207, 10, 8, 10, 2], [428, 259, 10, 7, 10, 3], [428, 309, 10, 8, 10, 2], [428, 360, 11, 8, 10, 2], [428, 411, 10, 8, 10, 2], [428, 462, 10, 8, 10, 2], [428, 514, 10, 7, 10, 3], [428, 564, 10, 8, 10, 2], [428, 615, 11, 8, 10, 2], [428, 666, 11, 8, 10, 2], [428, 717, 11, 8, 10, 2], [428, 769, 11, 7, 10, 3], [489, 3, 12, 10, 10, 2], [489, 54, 10, 3, 10, 2], [489, 104, 11, 10, 10, 1], [489, 156, 12, 8, 10, 2], [489, 207, 11, 9, 10, 2], [489, 260, 10, 4, 10, 4], [489, 310, 12, 9, 10, 3], [489, 360, 11, 8, 10, 2], [489, 411, 12, 8, 10, 2], [489, 462, 12, 8, 10, 2], [489, 513, 13, 4, 10, 2], [489, 564, 11, 2, 10, 2], [489, 616, 10, 1, 10, 3], [489, 668, 11, 5, 10, 4], [489, 717, 13, 8, 10, 2], [489, 768, 11, 8, 10, 2], [550, 7, 11, 3, 10, 6], [550, 55, 11, 7, 10, 3], [550, 106, 12, 7, 10, 3], [550, 157, 11, 7, 10, 3], [550, 207, 13, 8, 10, 2], [550, 260, 11, 8, 10, 4], [550, 309, 11, 8, 10, 2], [550, 360, 12, 10, 10, 2], [550, 411, 13, 10, 10, 2], [550, 464, 11, 6, 10, 4], [550, 513, 12, 10, 10, 2], [550, 564, 12, 3, 10, 2], [550, 615, 11, 3, 10, 2], [550, 666, 11, 8, 10, 2], [550, 719, 11, 6, 10, 4], [550, 770, 10, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 110, 10, 2, 10, 7], [611, 156, 12, 10, 10, 2], [611, 207, 12, 9, 10, 2], [611, 261, 10, 4, 10, 5], [611, 309, 10, 8, 10, 2], [611, 363, 11, 5, 10, 5], [611, 414, 10, 5, 10, 5], [611, 469, 9, 1, 10, 9], [611, 511, 1, 1, 10, 1], [611, 562, 10, 10, 10, 0], [611, 613, 11, 10, 10, 0], [611, 664, 11, 10, 10, 0], [611, 717, 13, 8, 10, 2], [611, 770, 11, 6, 10, 4], [672, 7, 10, 1, 10, 6], [672, 58, 10, 1, 10, 6], [672, 105, 13, 4, 10, 2], [672, 156, 11, 4, 10, 2], [672, 207, 11, 4, 10, 2], [672, 258, 10, 4, 10, 2], [672, 312, 10, 5, 10, 5], [672, 361, 10, 7, 10, 3], [672, 412, 10, 9, 10, 3], [1, 1, 1, 1, 10, 1], [794, 768, 9, 2, 10, 2], [672, 565, 12, 7, 10, 3], [672, 618, 11, 5, 10, 5], [672, 669, 9, 5, 10, 5], [672, 717, 12, 8, 10, 2], [672, 768, 12, 8, 10, 2], [733, 3, 12, 10, 10, 2], [733, 58, 9, 2, 10, 6], [733, 111, 8, 4, 10, 8], [733, 162, 9, 4, 10, 8], [733, 208, 12, 7, 10, 3], [733, 256, 10, 10, 10, 0], [733, 307, 12, 10, 10, 0], [733, 358, 10, 10, 10, 0], [733, 410, 12, 9, 10, 1], [733, 460, 12, 10, 10, 0], [733, 511, 13, 10, 10, 0], [733, 562, 13, 10, 10, 0], [733, 614, 13, 9, 10, 1], [733, 664, 13, 10, 10, 0], [733, 715, 11, 10, 10, 0], [733, 766, 11, 10, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 11, 10, 10, 0], [794, 103, 12, 10, 10, 0], [794, 154, 12, 10, 10, 0], [794, 205, 12, 10, 10, 0], [794, 260, 9, 6, 10, 4], [794, 309, 10, 2, 10, 2], [794, 360, 10, 2, 10, 2], [794, 412, 10, 1, 10, 3], [794, 462, 10, 2, 10, 2], [794, 513, 10, 2, 10, 2], [794, 564, 10, 2, 10, 2], [794, 623, 6, 2, 10, 10], [794, 666, 12, 2, 10, 2], [794, 725, 8, 2, 10, 10], [794, 768, 9, 2, 10, 2], [855, 3, 9, 2, 10, 2], [855, 54, 9, 2, 10, 2], [855, 105, 9, 2, 10, 2], [855, 156, 9, 2, 10, 2], [855, 207, 9, 2, 10, 2], [855, 258, 9, 2, 10, 2], [855, 309, 9, 2, 10, 2], [855, 360, 9, 2, 10, 2], [855, 411, 9, 2, 10, 2], [855, 462, 9, 2, 10, 2], [855, 513, 9, 2, 10, 2], [855, 564, 9, 2, 10, 2], [855, 615, 9, 2, 10, 2], [855, 666, 9, 2, 10, 2], [855, 717, 9, 2, 10, 2], [855, 768, 9, 2, 10, 2]], \"capHeight\": 10, \"widestlogicalchar\": 10, \"widestglyph\": 13, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 11, 6, 11, 5], [1, 54, 11, 10, 11, 2], [1, 105, 11, 9, 11, 2], [1, 156, 11, 10, 11, 2], [1, 206, 11, 12, 11, 1], [1, 258, 11, 10, 11, 2], [1, 309, 11, 10, 11, 2], [1, 360, 11, 9, 11, 2], [1, 411, 11, 12, 11, 2], [1, 462, 11, 12, 11, 2], [1, 513, 11, 9, 11, 2], [1, 567, 11, 7, 11, 5], [1, 618, 11, 9, 11, 5], [1, 669, 11, 6, 11, 5], [1, 720, 11, 7, 11, 5], [1, 768, 11, 10, 11, 2], [62, 3, 11, 10, 11, 2], [62, 54, 11, 10, 11, 2], [62, 105, 11, 10, 11, 2], [62, 156, 11, 10, 11, 2], [62, 207, 11, 10, 11, 2], [62, 258, 11, 10, 11, 2], [62, 309, 11, 10, 11, 2], [62, 360, 11, 10, 11, 2], [62, 411, 11, 10, 11, 2], [62, 462, 11, 10, 11, 2], [62, 515, 11, 8, 11, 4], [62, 566, 11, 10, 11, 4], [62, 618, 11, 7, 11, 5], [62, 669, 11, 6, 11, 5], [62, 720, 11, 7, 11, 5], [62, 768, 11, 10, 11, 2], [123, 3, 11, 10, 11, 2], [123, 54, 11, 10, 11, 2], [123, 105, 11, 10, 11, 2], [123, 156, 11, 10, 11, 2], [123, 207, 11, 10, 11, 2], [123, 258, 11, 10, 11, 2], [123, 309, 11, 10, 11, 2], [123, 360, 11, 10, 11, 2], [123, 411, 11, 10, 11, 2], [123, 462, 11, 10, 11, 2], [123, 513, 11, 10, 11, 2], [123, 564, 11, 10, 11, 2], [123, 615, 11, 10, 11, 2], [123, 666, 11, 10, 11, 2], [123, 717, 11, 10, 11, 2], [123, 768, 11, 10, 11, 2], [184, 3, 11, 10, 11, 2], [184, 54, 11, 12, 11, 2], [184, 105, 11, 10, 11, 2], [184, 156, 11, 10, 11, 2], [184, 207, 11, 10, 11, 2], [184, 258, 11, 10, 11, 2], [184, 309, 11, 10, 11, 2], [184, 360, 11, 10, 11, 2], [184, 411, 11, 10, 11, 2], [184, 462, 11, 10, 11, 2], [184, 513, 11, 10, 11, 2], [184, 564, 11, 12, 11, 2], [184, 615, 11, 10, 11, 2], [184, 666, 11, 12, 11, 2], [184, 717, 11, 9, 11, 2], [184, 771, 11, 8, 11, 5], [245, 3, 11, 9, 11, 2], [245, 56, 11, 8, 11, 4], [245, 105, 11, 10, 11, 2], [245, 158, 11, 8, 11, 4], [245, 207, 11, 10, 11, 2], [245, 260, 11, 8, 11, 4], [245, 309, 11, 10, 11, 2], [245, 362, 11, 10, 11, 4], [245, 411, 11, 10, 11, 2], [245, 462, 11, 10, 11, 2], [245, 513, 11, 12, 11, 2], [245, 564, 11, 10, 11, 2], [245, 615, 11, 10, 11, 2], [245, 668, 11, 8, 11, 4], [245, 719, 11, 8, 11, 4], [245, 770, 11, 8, 11, 4], [306, 5, 11, 10, 11, 4], [306, 56, 11, 10, 11, 4], [306, 107, 11, 8, 11, 4], [306, 158, 11, 8, 11, 4], [306, 208, 11, 9, 11, 3], [306, 260, 11, 8, 11, 4], [306, 311, 11, 8, 11, 4], [306, 362, 11, 8, 11, 4], [306, 413, 11, 8, 11, 4], [306, 464, 11, 10, 11, 4], [306, 515, 11, 8, 11, 4], [306, 564, 11, 12, 11, 2], [306, 615, 11, 10, 11, 2], [306, 666, 11, 12, 11, 2], [306, 720, 11, 6, 11, 5], [306, 768, 11, 10, 11, 2], [367, 2, 11, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 108, 11, 9, 11, 5], [367, 154, 11, 12, 11, 0], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 360, 11, 10, 11, 2], [367, 411, 11, 10, 11, 2], [367, 462, 11, 10, 11, 2], [367, 514, 11, 9, 11, 3], [367, 564, 11, 10, 11, 2], [367, 615, 11, 10, 11, 2], [367, 668, 11, 10, 11, 4], [367, 717, 11, 10, 11, 2], [367, 768, 11, 10, 11, 2], [428, 3, 11, 10, 11, 2], [428, 55, 11, 9, 11, 3], [428, 105, 11, 10, 11, 2], [428, 156, 11, 10, 11, 2], [428, 207, 11, 10, 11, 2], [428, 259, 11, 9, 11, 3], [428, 309, 11, 10, 11, 2], [428, 360, 11, 10, 11, 2], [428, 411, 11, 10, 11, 2], [428, 462, 11, 10, 11, 2], [428, 514, 11, 9, 11, 3], [428, 564, 11, 10, 11, 2], [428, 615, 11, 10, 11, 2], [428, 666, 11, 10, 11, 2], [428, 717, 11, 10, 11, 2], [428, 769, 11, 9, 11, 3], [489, 3, 11, 12, 11, 2], [489, 54, 11, 9, 11, 2], [489, 104, 11, 12, 11, 1], [489, 156, 11, 10, 11, 2], [489, 207, 11, 11, 11, 2], [489, 260, 11, 7, 11, 4], [489, 310, 11, 11, 11, 3], [489, 360, 11, 10, 11, 2], [489, 411, 11, 10, 11, 2], [489, 462, 11, 10, 11, 2], [489, 513, 11, 9, 11, 2], [489, 564, 11, 9, 11, 2], [489, 616, 11, 8, 11, 3], [489, 668, 11, 7, 11, 4], [489, 717, 11, 10, 11, 2], [489, 768, 11, 10, 11, 2], [550, 6, 11, 6, 11, 5], [550, 55, 11, 9, 11, 3], [550, 106, 11, 9, 11, 3], [550, 157, 11, 9, 11, 3], [550, 207, 11, 10, 11, 2], [550, 260, 11, 10, 11, 4], [550, 309, 11, 10, 11, 2], [550, 360, 11, 12, 11, 2], [550, 411, 11, 12, 11, 2], [550, 464, 11, 8, 11, 4], [550, 513, 11, 12, 11, 2], [550, 564, 11, 9, 11, 2], [550, 615, 11, 9, 11, 2], [550, 666, 11, 10, 11, 2], [550, 719, 11, 8, 11, 4], [550, 770, 11, 8, 11, 4], [611, 5, 11, 10, 11, 4], [611, 56, 11, 10, 11, 4], [611, 108, 11, 6, 11, 5], [611, 156, 11, 12, 11, 2], [611, 207, 11, 11, 11, 2], [611, 261, 11, 6, 11, 5], [611, 309, 11, 10, 11, 2], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 11, 7, 11, 5], [611, 516, 11, 6, 11, 5], [611, 562, 11, 12, 11, 0], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 717, 11, 10, 11, 2], [611, 770, 11, 8, 11, 4], [672, 6, 11, 6, 11, 5], [672, 57, 11, 6, 11, 5], [672, 105, 11, 9, 11, 2], [672, 156, 11, 9, 11, 2], [672, 207, 11, 9, 11, 2], [672, 258, 11, 9, 11, 2], [672, 312, 11, 7, 11, 5], [672, 361, 11, 9, 11, 3], [672, 412, 11, 11, 11, 3], [1, 6, 11, 6, 11, 5], [794, 768, 11, 9, 11, 2], [672, 566, 11, 7, 11, 4], [672, 618, 11, 7, 11, 5], [672, 669, 11, 7, 11, 5], [672, 717, 11, 10, 11, 2], [672, 768, 11, 10, 11, 2], [733, 3, 11, 12, 11, 2], [733, 57, 11, 6, 11, 5], [733, 108, 11, 9, 11, 5], [733, 159, 11, 9, 11, 5], [733, 208, 11, 9, 11, 3], [733, 256, 11, 12, 11, 0], [733, 307, 11, 12, 11, 0], [733, 358, 11, 12, 11, 0], [733, 410, 11, 11, 11, 1], [733, 460, 11, 12, 11, 0], [733, 511, 11, 12, 11, 0], [733, 562, 11, 12, 11, 0], [733, 614, 11, 11, 11, 1], [733, 664, 11, 12, 11, 0], [733, 715, 11, 12, 11, 0], [733, 766, 11, 12, 11, 0], [1, 6, 11, 6, 11, 5], [794, 52, 11, 12, 11, 0], [794, 103, 11, 12, 11, 0], [794, 154, 11, 12, 11, 0], [794, 205, 11, 12, 11, 0], [794, 260, 11, 8, 11, 4], [794, 309, 11, 9, 11, 2], [794, 360, 11, 9, 11, 2], [794, 412, 11, 8, 11, 3], [794, 462, 11, 9, 11, 2], [794, 513, 11, 9, 11, 2], [794, 564, 11, 9, 11, 2], [794, 618, 11, 9, 11, 5], [794, 666, 11, 9, 11, 2], [794, 720, 11, 9, 11, 5], [794, 768, 11, 9, 11, 2], [855, 3, 11, 9, 11, 2], [855, 54, 11, 9, 11, 2], [855, 105, 11, 9, 11, 2], [855, 156, 11, 9, 11, 2], [855, 207, 11, 9, 11, 2], [855, 258, 11, 9, 11, 2], [855, 309, 11, 9, 11, 2], [855, 360, 11, 9, 11, 2], [855, 411, 11, 9, 11, 2], [855, 462, 11, 9, 11, 2], [855, 513, 11, 9, 11, 2], [855, 564, 11, 9, 11, 2], [855, 615, 11, 9, 11, 2], [855, 666, 11, 9, 11, 2], [855, 717, 11, 9, 11, 2], [855, 768, 11, 9, 11, 2]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 54, 10, 8, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 10, 8, 10, 2], [1, 206, 10, 10, 10, 1], [1, 258, 10, 8, 10, 2], [1, 309, 10, 8, 10, 2], [1, 360, 10, 8, 10, 2], [1, 411, 10, 10, 10, 2], [1, 462, 10, 10, 10, 2], [1, 513, 10, 8, 10, 2], [1, 566, 10, 6, 10, 4], [1, 617, 10, 8, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 6, 10, 4], [1, 768, 10, 8, 10, 2], [62, 3, 10, 8, 10, 2], [62, 54, 10, 8, 10, 2], [62, 105, 10, 8, 10, 2], [62, 156, 10, 8, 10, 2], [62, 207, 10, 8, 10, 2], [62, 258, 10, 8, 10, 2], [62, 309, 10, 8, 10, 2], [62, 360, 10, 8, 10, 2], [62, 411, 10, 8, 10, 2], [62, 462, 10, 8, 10, 2], [62, 515, 10, 6, 10, 4], [62, 566, 10, 8, 10, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 768, 10, 8, 10, 2], [123, 3, 10, 8, 10, 2], [123, 54, 10, 8, 10, 2], [123, 105, 10, 8, 10, 2], [123, 156, 10, 8, 10, 2], [123, 207, 10, 8, 10, 2], [123, 258, 10, 8, 10, 2], [123, 309, 10, 8, 10, 2], [123, 360, 10, 8, 10, 2], [123, 411, 10, 8, 10, 2], [123, 462, 10, 8, 10, 2], [123, 513, 10, 8, 10, 2], [123, 564, 10, 8, 10, 2], [123, 615, 10, 8, 10, 2], [123, 666, 10, 8, 10, 2], [123, 717, 10, 8, 10, 2], [123, 768, 10, 8, 10, 2], [184, 3, 10, 8, 10, 2], [184, 54, 10, 10, 10, 2], [184, 105, 10, 8, 10, 2], [184, 156, 10, 8, 10, 2], [184, 207, 10, 8, 10, 2], [184, 258, 10, 8, 10, 2], [184, 309, 10, 8, 10, 2], [184, 360, 10, 8, 10, 2], [184, 411, 10, 8, 10, 2], [184, 462, 10, 8, 10, 2], [184, 513, 10, 8, 10, 2], [184, 564, 10, 10, 10, 2], [184, 615, 10, 8, 10, 2], [184, 666, 10, 10, 10, 2], [184, 717, 10, 8, 10, 2], [184, 770, 10, 7, 10, 4], [245, 3, 10, 8, 10, 2], [245, 56, 10, 6, 10, 4], [245, 105, 10, 8, 10, 2], [245, 158, 10, 6, 10, 4], [245, 207, 10, 8, 10, 2], [245, 260, 10, 6, 10, 4], [245, 309, 10, 8, 10, 2], [245, 362, 10, 8, 10, 4], [245, 411, 10, 8, 10, 2], [245, 462, 10, 8, 10, 2], [245, 513, 10, 10, 10, 2], [245, 564, 10, 8, 10, 2], [245, 615, 10, 8, 10, 2], [245, 668, 10, 6, 10, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 10, 6, 10, 4], [306, 158, 10, 6, 10, 4], [306, 208, 10, 7, 10, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 10, 6, 10, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 564, 10, 10, 10, 2], [306, 615, 10, 8, 10, 2], [306, 666, 10, 10, 10, 2], [306, 719, 10, 6, 10, 4], [306, 768, 10, 8, 10, 2], [367, 2, 10, 9, 10, 1], [367, 52, 10, 10, 10, 0], [367, 107, 10, 8, 10, 4], [367, 154, 10, 10, 10, 0], [367, 205, 10, 10, 10, 0], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 10, 8, 10, 2], [367, 411, 10, 8, 10, 2], [367, 462, 10, 8, 10, 2], [367, 514, 10, 7, 10, 3], [367, 564, 10, 8, 10, 2], [367, 615, 10, 8, 10, 2], [367, 668, 10, 8, 10, 4], [367, 717, 10, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 3, 10, 8, 10, 2], [428, 55, 10, 7, 10, 3], [428, 105, 10, 8, 10, 2], [428, 156, 10, 8, 10, 2], [428, 207, 10, 8, 10, 2], [428, 259, 10, 7, 10, 3], [428, 309, 10, 8, 10, 2], [428, 360, 10, 8, 10, 2], [428, 411, 10, 8, 10, 2], [428, 462, 10, 8, 10, 2], [428, 514, 10, 7, 10, 3], [428, 564, 10, 8, 10, 2], [428, 615, 10, 8, 10, 2], [428, 666, 10, 8, 10, 2], [428, 717, 10, 8, 10, 2], [428, 769, 10, 7, 10, 3], [489, 3, 10, 10, 10, 2], [489, 54, 10, 8, 10, 2], [489, 104, 10, 10, 10, 1], [489, 156, 10, 8, 10, 2], [489, 207, 10, 9, 10, 2], [489, 260, 10, 6, 10, 4], [489, 310, 10, 9, 10, 3], [489, 360, 10, 8, 10, 2], [489, 411, 10, 8, 10, 2], [489, 462, 10, 8, 10, 2], [489, 513, 10, 8, 10, 2], [489, 564, 10, 8, 10, 2], [489, 616, 10, 7, 10, 3], [489, 668, 10, 6, 10, 4], [489, 717, 10, 8, 10, 2], [489, 768, 10, 8, 10, 2], [550, 5, 10, 6, 10, 4], [550, 55, 10, 7, 10, 3], [550, 106, 10, 7, 10, 3], [550, 157, 10, 7, 10, 3], [550, 207, 10, 8, 10, 2], [550, 260, 10, 8, 10, 4], [550, 309, 10, 8, 10, 2], [550, 360, 10, 10, 10, 2], [550, 411, 10, 10, 10, 2], [550, 464, 10, 6, 10, 4], [550, 513, 10, 10, 10, 2], [550, 564, 10, 8, 10, 2], [550, 615, 10, 8, 10, 2], [550, 666, 10, 8, 10, 2], [550, 719, 10, 6, 10, 4], [550, 770, 10, 6, 10, 4], [611, 5, 10, 8, 10, 4], [611, 56, 10, 8, 10, 4], [611, 107, 10, 6, 10, 4], [611, 156, 10, 10, 10, 2], [611, 207, 10, 9, 10, 2], [611, 260, 10, 6, 10, 4], [611, 309, 10, 8, 10, 2], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 6, 10, 4], [611, 562, 10, 10, 10, 0], [611, 613, 10, 10, 10, 0], [611, 664, 10, 10, 10, 0], [611, 717, 10, 8, 10, 2], [611, 770, 10, 6, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 10, 8, 10, 2], [672, 258, 10, 8, 10, 2], [672, 311, 10, 6, 10, 4], [672, 361, 10, 7, 10, 3], [672, 412, 10, 9, 10, 3], [1, 5, 10, 6, 10, 4], [794, 768, 10, 8, 10, 2], [672, 566, 10, 6, 10, 4], [672, 617, 10, 6, 10, 4], [672, 668, 10, 6, 10, 4], [672, 717, 10, 8, 10, 2], [672, 768, 10, 8, 10, 2], [733, 3, 10, 10, 10, 2], [733, 56, 10, 6, 10, 4], [733, 107, 10, 8, 10, 4], [733, 158, 10, 8, 10, 4], [733, 208, 10, 7, 10, 3], [733, 256, 10, 10, 10, 0], [733, 307, 10, 10, 10, 0], [733, 358, 10, 10, 10, 0], [733, 410, 10, 9, 10, 1], [733, 460, 10, 10, 10, 0], [733, 511, 10, 10, 10, 0], [733, 562, 10, 10, 10, 0], [733, 614, 10, 9, 10, 1], [733, 664, 10, 10, 10, 0], [733, 715, 10, 10, 10, 0], [733, 766, 10, 10, 10, 0], [1, 5, 10, 6, 10, 4], [794, 52, 10, 10, 10, 0], [794, 103, 10, 10, 10, 0], [794, 154, 10, 10, 10, 0], [794, 205, 10, 10, 10, 0], [794, 260, 10, 6, 10, 4], [794, 309, 10, 8, 10, 2], [794, 360, 10, 8, 10, 2], [794, 412, 10, 7, 10, 3], [794, 462, 10, 8, 10, 2], [794, 513, 10, 8, 10, 2], [794, 564, 10, 8, 10, 2], [794, 617, 10, 8, 10, 4], [794, 666, 10, 8, 10, 2], [794, 719, 10, 8, 10, 4], [794, 768, 10, 8, 10, 2], [855, 3, 10, 8, 10, 2], [855, 54, 10, 8, 10, 2], [855, 105, 10, 8, 10, 2], [855, 156, 10, 8, 10, 2], [855, 207, 10, 8, 10, 2], [855, 258, 10, 8, 10, 2], [855, 309, 10, 8, 10, 2], [855, 360, 10, 8, 10, 2], [855, 411, 10, 8, 10, 2], [855, 462, 10, 8, 10, 2], [855, 513, 10, 8, 10, 2], [855, 564, 10, 8, 10, 2], [855, 615, 10, 8, 10, 2], [855, 666, 10, 8, 10, 2], [855, 717, 10, 8, 10, 2], [855, 768, 10, 8, 10, 2]], \"widestlogicalchar\": 10, \"widestglyph\": 10, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 10, 10, 10, 2], [1, 105, 11, 5, 10, 2], [1, 156, 11, 10, 10, 2], [1, 206, 12, 12, 10, 1], [1, 258, 13, 10, 10, 2], [1, 309, 11, 10, 10, 2], [1, 360, 10, 5, 10, 2], [1, 411, 12, 12, 10, 2], [1, 462, 10, 12, 10, 2], [1, 513, 12, 6, 10, 2], [1, 567, 10, 7, 10, 5], [1, 621, 8, 6, 10, 8], [1, 670, 10, 3, 10, 6], [1, 723, 8, 4, 10, 8], [1, 768, 12, 10, 10, 2], [62, 3, 11, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 11, 10, 10, 2], [62, 156, 11, 10, 10, 2], [62, 207, 11, 10, 10, 2], [62, 258, 12, 10, 10, 2], [62, 309, 11, 10, 10, 2], [62, 360, 11, 10, 10, 2], [62, 411, 11, 10, 10, 2], [62, 462, 11, 10, 10, 2], [62, 515, 10, 8, 10, 4], [62, 566, 10, 10, 10, 4], [62, 618, 12, 7, 10, 5], [62, 670, 10, 5, 10, 6], [62, 720, 11, 7, 10, 5], [62, 768, 11, 10, 10, 2], [123, 3, 12, 10, 10, 2], [123, 54, 10, 10, 10, 2], [123, 105, 11, 10, 10, 2], [123, 156, 12, 10, 10, 2], [123, 207, 11, 10, 10, 2], [123, 258, 12, 10, 10, 2], [123, 309, 12, 10, 10, 2], [123, 360, 12, 10, 10, 2], [123, 411, 12, 10, 10, 2], [123, 462, 13, 10, 10, 2], [123, 513, 12, 10, 10, 2], [123, 564, 12, 10, 10, 2], [123, 615, 9, 10, 10, 2], [123, 666, 12, 10, 10, 2], [123, 717, 12, 10, 10, 2], [123, 768, 11, 10, 10, 2], [184, 3, 11, 10, 10, 2], [184, 54, 11, 12, 10, 2], [184, 105, 11, 10, 10, 2], [184, 156, 12, 10, 10, 2], [184, 207, 12, 10, 10, 2], [184, 258, 12, 10, 10, 2], [184, 309, 12, 10, 10, 2], [184, 360, 11, 10, 10, 2], [184, 411, 12, 10, 10, 2], [184, 462, 13, 10, 10, 2], [184, 513, 12, 10, 10, 2], [184, 564, 13, 12, 10, 2], [184, 615, 10, 10, 10, 2], [184, 666, 11, 12, 10, 2], [184, 718, 10, 6, 10, 3], [184, 776, 9, 3, 10, 10], [245, 3, 9, 4, 10, 2], [245, 56, 11, 8, 10, 4], [245, 105, 10, 10, 10, 2], [245, 158, 11, 8, 10, 4], [245, 207, 12, 10, 10, 2], [245, 260, 10, 8, 10, 4], [245, 309, 11, 10, 10, 2], [245, 362, 11, 10, 10, 4], [245, 411, 10, 10, 10, 2], [245, 462, 10, 10, 10, 2], [245, 513, 11, 12, 10, 2], [245, 564, 11, 10, 10, 2], [245, 615, 10, 10, 10, 2], [245, 668, 11, 8, 10, 4], [245, 719, 10, 8, 10, 4], [245, 770, 10, 8, 10, 4], [306, 5, 10, 10, 10, 4], [306, 56, 11, 10, 10, 4], [306, 107, 11, 8, 10, 4], [306, 158, 11, 8, 10, 4], [306, 208, 11, 9, 10, 3], [306, 260, 11, 8, 10, 4], [306, 311, 11, 8, 10, 4], [306, 362, 11, 8, 10, 4], [306, 413, 10, 8, 10, 4], [306, 464, 11, 10, 10, 4], [306, 515, 11, 8, 10, 4], [306, 564, 12, 12, 10, 2], [306, 615, 10, 10, 10, 2], [306, 666, 10, 12, 10, 2], [306, 721, 11, 4, 10, 6], [306, 768, 12, 10, 10, 2], [367, 2, 11, 11, 10, 1], [367, 52, 12, 12, 10, 0], [367, 108, 11, 9, 10, 5], [367, 154, 12, 12, 10, 0], [367, 205, 12, 12, 10, 0], [367, 257, 11, 11, 10, 1], [367, 308, 12, 11, 10, 1], [367, 360, 12, 10, 10, 2], [367, 411, 11, 10, 10, 2], [367, 462, 11, 10, 10, 2], [367, 514, 11, 9, 10, 3], [367, 564, 11, 10, 10, 2], [367, 615, 11, 10, 10, 2], [367, 668, 11, 10, 10, 4], [367, 717, 12, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 11, 10, 10, 2], [428, 156, 9, 10, 10, 2], [428, 207, 10, 10, 10, 2], [428, 259, 10, 9, 10, 3], [428, 309, 10, 10, 10, 2], [428, 360, 11, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 11, 10, 10, 2], [428, 666, 11, 10, 10, 2], [428, 717, 11, 10, 10, 2], [428, 769, 11, 9, 10, 3], [489, 3, 12, 12, 10, 2], [489, 54, 10, 5, 10, 2], [489, 104, 11, 12, 10, 1], [489, 156, 12, 10, 10, 2], [489, 207, 11, 11, 10, 2], [489, 260, 10, 6, 10, 4], [489, 310, 12, 11, 10, 3], [489, 360, 11, 10, 10, 2], [489, 411, 12, 10, 10, 2], [489, 462, 12, 10, 10, 2], [489, 513, 13, 6, 10, 2], [489, 564, 11, 4, 10, 2], [489, 616, 10, 3, 10, 3], [489, 668, 11, 7, 10, 4], [489, 717, 13, 10, 10, 2], [489, 768, 11, 10, 10, 2], [550, 7, 11, 5, 10, 6], [550, 55, 11, 9, 10, 3], [550, 106, 12, 9, 10, 3], [550, 157, 11, 9, 10, 3], [550, 207, 13, 10, 10, 2], [550, 260, 11, 10, 10, 4], [550, 309, 11, 10, 10, 2], [550, 360, 12, 12, 10, 2], [550, 411, 13, 12, 10, 2], [550, 464, 11, 8, 10, 4], [550, 513, 12, 12, 10, 2], [550, 564, 12, 5, 10, 2], [550, 615, 11, 5, 10, 2], [550, 666, 11, 10, 10, 2], [550, 719, 11, 8, 10, 4], [550, 770, 10, 8, 10, 4], [611, 5, 10, 10, 10, 4], [611, 56, 10, 10, 10, 4], [611, 110, 10, 4, 10, 7], [611, 156, 12, 12, 10, 2], [611, 207, 12, 11, 10, 2], [611, 261, 10, 6, 10, 5], [611, 309, 10, 10, 10, 2], [611, 363, 11, 7, 10, 5], [611, 414, 10, 7, 10, 5], [611, 469, 9, 3, 10, 9], [611, 511, 1, 1, 10, 1], [611, 562, 10, 12, 10, 0], [611, 613, 11, 12, 10, 0], [611, 664, 11, 12, 10, 0], [611, 717, 13, 10, 10, 2], [611, 770, 11, 8, 10, 4], [672, 7, 10, 3, 10, 6], [672, 58, 10, 3, 10, 6], [672, 105, 13, 6, 10, 2], [672, 156, 11, 6, 10, 2], [672, 207, 11, 6, 10, 2], [672, 258, 10, 6, 10, 2], [672, 312, 10, 7, 10, 5], [672, 361, 10, 9, 10, 3], [672, 412, 10, 11, 10, 3], [1, 1, 1, 1, 10, 1], [794, 768, 9, 4, 10, 2], [672, 565, 12, 9, 10, 3], [672, 618, 11, 7, 10, 5], [672, 669, 9, 7, 10, 5], [672, 717, 12, 10, 10, 2], [672, 768, 12, 10, 10, 2], [733, 3, 12, 12, 10, 2], [733, 58, 9, 4, 10, 6], [733, 111, 8, 6, 10, 8], [733, 162, 9, 6, 10, 8], [733, 208, 12, 9, 10, 3], [733, 256, 10, 12, 10, 0], [733, 307, 12, 12, 10, 0], [733, 358, 11, 12, 10, 0], [733, 410, 12, 11, 10, 1], [733, 460, 12, 12, 10, 0], [733, 511, 13, 12, 10, 0], [733, 562, 13, 12, 10, 0], [733, 614, 13, 11, 10, 1], [733, 664, 13, 12, 10, 0], [733, 715, 11, 12, 10, 0], [733, 766, 11, 12, 10, 0], [1, 1, 1, 1, 10, 1], [794, 52, 11, 12, 10, 0], [794, 103, 12, 12, 10, 0], [794, 154, 12, 12, 10, 0], [794, 205, 12, 12, 10, 0], [794, 260, 9, 8, 10, 4], [794, 309, 10, 4, 10, 2], [794, 360, 10, 4, 10, 2], [794, 412, 10, 3, 10, 3], [794, 462, 10, 4, 10, 2], [794, 513, 10, 4, 10, 2], [794, 564, 10, 4, 10, 2], [794, 623, 6, 4, 10, 10], [794, 666, 12, 4, 10, 2], [794, 725, 8, 4, 10, 10], [794, 768, 9, 4, 10, 2], [855, 3, 9, 4, 10, 2], [855, 54, 9, 4, 10, 2], [855, 105, 9, 4, 10, 2], [855, 156, 9, 4, 10, 2], [855, 207, 9, 4, 10, 2], [855, 258, 9, 4, 10, 2], [855, 309, 9, 4, 10, 2], [855, 360, 9, 4, 10, 2], [855, 411, 9, 4, 10, 2], [855, 462, 9, 4, 10, 2], [855, 513, 9, 4, 10, 2], [855, 564, 9, 4, 10, 2], [855, 615, 9, 4, 10, 2], [855, 666, 9, 4, 10, 2], [855, 717, 9, 4, 10, 2], [855, 768, 9, 4, 10, 2]], \"capHeight\": 11, \"widestlogicalchar\": 10, \"widestglyph\": 13, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 9, 8, 9, 2], [1, 105, 10, 3, 9, 2], [1, 156, 10, 8, 9, 2], [1, 206, 11, 10, 9, 1], [1, 258, 12, 8, 9, 2], [1, 309, 10, 8, 9, 2], [1, 360, 9, 3, 9, 2], [1, 411, 11, 10, 9, 2], [1, 462, 9, 10, 9, 2], [1, 513, 11, 4, 9, 2], [1, 567, 9, 5, 9, 5], [1, 621, 7, 4, 9, 8], [1, 670, 9, 1, 9, 6], [1, 723, 7, 2, 9, 8], [1, 768, 11, 8, 9, 2], [62, 3, 10, 8, 9, 2], [62, 54, 9, 8, 9, 2], [62, 105, 10, 8, 9, 2], [62, 156, 10, 8, 9, 2], [62, 207, 10, 8, 9, 2], [62, 258, 11, 8, 9, 2], [62, 309, 10, 8, 9, 2], [62, 360, 10, 8, 9, 2], [62, 411, 10, 8, 9, 2], [62, 462, 10, 8, 9, 2], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 618, 11, 5, 9, 5], [62, 670, 9, 3, 9, 6], [62, 720, 10, 5, 9, 5], [62, 768, 10, 8, 9, 2], [123, 3, 11, 8, 9, 2], [123, 54, 9, 8, 9, 2], [123, 105, 10, 8, 9, 2], [123, 156, 11, 8, 9, 2], [123, 207, 10, 8, 9, 2], [123, 258, 11, 8, 9, 2], [123, 309, 11, 8, 9, 2], [123, 360, 11, 8, 9, 2], [123, 411, 11, 8, 9, 2], [123, 462, 12, 8, 9, 2], [123, 513, 11, 8, 9, 2], [123, 564, 11, 8, 9, 2], [123, 615, 8, 8, 9, 2], [123, 666, 11, 8, 9, 2], [123, 717, 11, 8, 9, 2], [123, 768, 10, 8, 9, 2], [184, 3, 10, 8, 9, 2], [184, 54, 10, 10, 9, 2], [184, 105, 10, 8, 9, 2], [184, 156, 11, 8, 9, 2], [184, 207, 11, 8, 9, 2], [184, 258, 11, 8, 9, 2], [184, 309, 11, 8, 9, 2], [184, 360, 10, 8, 9, 2], [184, 411, 11, 8, 9, 2], [184, 462, 12, 8, 9, 2], [184, 513, 11, 8, 9, 2], [184, 564, 12, 10, 9, 2], [184, 615, 9, 8, 9, 2], [184, 666, 10, 10, 9, 2], [184, 718, 9, 4, 9, 3], [184, 776, 8, 1, 9, 10], [245, 3, 8, 2, 9, 2], [245, 56, 10, 6, 9, 4], [245, 105, 9, 8, 9, 2], [245, 158, 10, 6, 9, 4], [245, 207, 11, 8, 9, 2], [245, 260, 9, 6, 9, 4], [245, 309, 10, 8, 9, 2], [245, 362, 10, 8, 9, 4], [245, 411, 9, 8, 9, 2], [245, 462, 9, 8, 9, 2], [245, 513, 10, 10, 9, 2], [245, 564, 10, 8, 9, 2], [245, 615, 9, 8, 9, 2], [245, 668, 10, 6, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 10, 8, 9, 4], [306, 107, 10, 6, 9, 4], [306, 158, 10, 6, 9, 4], [306, 208, 10, 7, 9, 3], [306, 260, 10, 6, 9, 4], [306, 311, 10, 6, 9, 4], [306, 362, 10, 6, 9, 4], [306, 413, 9, 6, 9, 4], [306, 464, 10, 8, 9, 4], [306, 515, 10, 6, 9, 4], [306, 564, 11, 10, 9, 2], [306, 615, 9, 8, 9, 2], [306, 666, 9, 10, 9, 2], [306, 721, 10, 2, 9, 6], [306, 768, 11, 8, 9, 2], [367, 2, 10, 9, 9, 1], [367, 52, 11, 10, 9, 0], [367, 108, 10, 7, 9, 5], [367, 154, 11, 10, 9, 0], [367, 205, 11, 10, 9, 0], [367, 257, 10, 9, 9, 1], [367, 308, 11, 9, 9, 1], [367, 360, 11, 8, 9, 2], [367, 411, 10, 8, 9, 2], [367, 462, 10, 8, 9, 2], [367, 514, 10, 7, 9, 3], [367, 564, 10, 8, 9, 2], [367, 615, 10, 8, 9, 2], [367, 668, 10, 8, 9, 4], [367, 717, 11, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 10, 8, 9, 2], [428, 156, 8, 8, 9, 2], [428, 207, 9, 8, 9, 2], [428, 259, 9, 7, 9, 3], [428, 309, 9, 8, 9, 2], [428, 360, 10, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 10, 8, 9, 2], [428, 666, 10, 8, 9, 2], [428, 717, 10, 8, 9, 2], [428, 769, 10, 7, 9, 3], [489, 3, 11, 10, 9, 2], [489, 54, 9, 3, 9, 2], [489, 104, 10, 10, 9, 1], [489, 156, 11, 8, 9, 2], [489, 207, 10, 9, 9, 2], [489, 260, 9, 4, 9, 4], [489, 310, 11, 9, 9, 3], [489, 360, 10, 8, 9, 2], [489, 411, 11, 8, 9, 2], [489, 462, 11, 8, 9, 2], [489, 513, 12, 4, 9, 2], [489, 564, 10, 2, 9, 2], [489, 616, 9, 1, 9, 3], [489, 668, 10, 5, 9, 4], [489, 717, 12, 8, 9, 2], [489, 768, 10, 8, 9, 2], [550, 7, 10, 3, 9, 6], [550, 55, 10, 7, 9, 3], [550, 106, 11, 7, 9, 3], [550, 157, 10, 7, 9, 3], [550, 207, 12, 8, 9, 2], [550, 260, 10, 8, 9, 4], [550, 309, 10, 8, 9, 2], [550, 360, 11, 10, 9, 2], [550, 411, 12, 10, 9, 2], [550, 464, 10, 6, 9, 4], [550, 513, 11, 10, 9, 2], [550, 564, 11, 3, 9, 2], [550, 615, 10, 3, 9, 2], [550, 666, 10, 8, 9, 2], [550, 719, 10, 6, 9, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 9, 8, 9, 4], [611, 110, 9, 2, 9, 7], [611, 156, 11, 10, 9, 2], [611, 207, 11, 9, 9, 2], [611, 261, 9, 4, 9, 5], [611, 309, 9, 8, 9, 2], [611, 363, 10, 5, 9, 5], [611, 414, 9, 5, 9, 5], [611, 469, 8, 1, 9, 9], [611, 511, 1, 1, 9, 1], [611, 562, 9, 10, 9, 0], [611, 613, 10, 10, 9, 0], [611, 664, 10, 10, 9, 0], [611, 717, 12, 8, 9, 2], [611, 770, 10, 6, 9, 4], [672, 7, 9, 1, 9, 6], [672, 58, 9, 1, 9, 6], [672, 105, 12, 4, 9, 2], [672, 156, 10, 4, 9, 2], [672, 207, 10, 4, 9, 2], [672, 258, 9, 4, 9, 2], [672, 312, 9, 5, 9, 5], [672, 361, 9, 7, 9, 3], [672, 412, 9, 9, 9, 3], [1, 1, 1, 1, 9, 1], [794, 768, 8, 2, 9, 2], [672, 565, 11, 7, 9, 3], [672, 618, 10, 5, 9, 5], [672, 669, 8, 5, 9, 5], [672, 717, 11, 8, 9, 2], [672, 768, 11, 8, 9, 2], [733, 3, 11, 10, 9, 2], [733, 58, 8, 2, 9, 6], [733, 111, 7, 4, 9, 8], [733, 162, 8, 4, 9, 8], [733, 208, 11, 7, 9, 3], [733, 256, 9, 10, 9, 0], [733, 307, 11, 10, 9, 0], [733, 358, 9, 10, 9, 0], [733, 410, 11, 9, 9, 1], [733, 460, 11, 10, 9, 0], [733, 511, 12, 10, 9, 0], [733, 562, 12, 10, 9, 0], [733, 614, 12, 9, 9, 1], [733, 664, 12, 10, 9, 0], [733, 715, 10, 10, 9, 0], [733, 766, 10, 10, 9, 0], [1, 1, 1, 1, 9, 1], [794, 52, 10, 10, 9, 0], [794, 103, 11, 10, 9, 0], [794, 154, 11, 10, 9, 0], [794, 205, 11, 10, 9, 0], [794, 260, 8, 6, 9, 4], [794, 309, 9, 2, 9, 2], [794, 360, 9, 2, 9, 2], [794, 412, 9, 1, 9, 3], [794, 462, 9, 2, 9, 2], [794, 513, 9, 2, 9, 2], [794, 564, 9, 2, 9, 2], [794, 623, 5, 2, 9, 10], [794, 666, 11, 2, 9, 2], [794, 725, 7, 2, 9, 10], [794, 768, 8, 2, 9, 2], [855, 3, 8, 2, 9, 2], [855, 54, 8, 2, 9, 2], [855, 105, 8, 2, 9, 2], [855, 156, 8, 2, 9, 2], [855, 207, 8, 2, 9, 2], [855, 258, 8, 2, 9, 2], [855, 309, 8, 2, 9, 2], [855, 360, 8, 2, 9, 2], [855, 411, 8, 2, 9, 2], [855, 462, 8, 2, 9, 2], [855, 513, 8, 2, 9, 2], [855, 564, 8, 2, 9, 2], [855, 615, 8, 2, 9, 2], [855, 666, 8, 2, 9, 2], [855, 717, 8, 2, 9, 2], [855, 768, 8, 2, 9, 2]], \"capHeight\": 10, \"widestlogicalchar\": 9, \"widestglyph\": 12, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 10, 6, 10, 5], [1, 54, 10, 10, 10, 2], [1, 105, 10, 9, 10, 2], [1, 156, 10, 10, 10, 2], [1, 206, 10, 12, 10, 1], [1, 258, 10, 10, 10, 2], [1, 309, 10, 10, 10, 2], [1, 360, 10, 9, 10, 2], [1, 411, 10, 12, 10, 2], [1, 462, 10, 12, 10, 2], [1, 513, 10, 9, 10, 2], [1, 567, 10, 7, 10, 5], [1, 618, 10, 9, 10, 5], [1, 669, 10, 6, 10, 5], [1, 720, 10, 7, 10, 5], [1, 768, 10, 10, 10, 2], [62, 3, 10, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 10, 10, 10, 2], [62, 156, 10, 10, 10, 2], [62, 207, 10, 10, 10, 2], [62, 258, 10, 10, 10, 2], [62, 309, 10, 10, 10, 2], [62, 360, 10, 10, 10, 2], [62, 411, 10, 10, 10, 2], [62, 462, 10, 10, 10, 2], [62, 515, 10, 8, 10, 4], [62, 566, 10, 10, 10, 4], [62, 618, 10, 7, 10, 5], [62, 669, 10, 6, 10, 5], [62, 720, 10, 7, 10, 5], [62, 768, 10, 10, 10, 2], [123, 3, 10, 10, 10, 2], [123, 54, 10, 10, 10, 2], [123, 105, 10, 10, 10, 2], [123, 156, 10, 10, 10, 2], [123, 207, 10, 10, 10, 2], [123, 258, 10, 10, 10, 2], [123, 309, 10, 10, 10, 2], [123, 360, 10, 10, 10, 2], [123, 411, 10, 10, 10, 2], [123, 462, 10, 10, 10, 2], [123, 513, 10, 10, 10, 2], [123, 564, 10, 10, 10, 2], [123, 615, 10, 10, 10, 2], [123, 666, 10, 10, 10, 2], [123, 717, 10, 10, 10, 2], [123, 768, 10, 10, 10, 2], [184, 3, 10, 10, 10, 2], [184, 54, 10, 12, 10, 2], [184, 105, 10, 10, 10, 2], [184, 156, 10, 10, 10, 2], [184, 207, 10, 10, 10, 2], [184, 258, 10, 10, 10, 2], [184, 309, 10, 10, 10, 2], [184, 360, 10, 10, 10, 2], [184, 411, 10, 10, 10, 2], [184, 462, 10, 10, 10, 2], [184, 513, 10, 10, 10, 2], [184, 564, 10, 12, 10, 2], [184, 615, 10, 10, 10, 2], [184, 666, 10, 12, 10, 2], [184, 717, 10, 9, 10, 2], [184, 771, 10, 8, 10, 5], [245, 3, 10, 9, 10, 2], [245, 56, 10, 8, 10, 4], [245, 105, 10, 10, 10, 2], [245, 158, 10, 8, 10, 4], [245, 207, 10, 10, 10, 2], [245, 260, 10, 8, 10, 4], [245, 309, 10, 10, 10, 2], [245, 362, 10, 10, 10, 4], [245, 411, 10, 10, 10, 2], [245, 462, 10, 10, 10, 2], [245, 513, 10, 12, 10, 2], [245, 564, 10, 10, 10, 2], [245, 615, 10, 10, 10, 2], [245, 668, 10, 8, 10, 4], [245, 719, 10, 8, 10, 4], [245, 770, 10, 8, 10, 4], [306, 5, 10, 10, 10, 4], [306, 56, 10, 10, 10, 4], [306, 107, 10, 8, 10, 4], [306, 158, 10, 8, 10, 4], [306, 208, 10, 9, 10, 3], [306, 260, 10, 8, 10, 4], [306, 311, 10, 8, 10, 4], [306, 362, 10, 8, 10, 4], [306, 413, 10, 8, 10, 4], [306, 464, 10, 10, 10, 4], [306, 515, 10, 8, 10, 4], [306, 564, 10, 12, 10, 2], [306, 615, 10, 10, 10, 2], [306, 666, 10, 12, 10, 2], [306, 720, 10, 6, 10, 5], [306, 768, 10, 10, 10, 2], [367, 2, 10, 11, 10, 1], [367, 52, 10, 12, 10, 0], [367, 108, 10, 9, 10, 5], [367, 154, 10, 12, 10, 0], [367, 205, 10, 12, 10, 0], [367, 257, 10, 11, 10, 1], [367, 308, 10, 11, 10, 1], [367, 360, 10, 10, 10, 2], [367, 411, 10, 10, 10, 2], [367, 462, 10, 10, 10, 2], [367, 514, 10, 9, 10, 3], [367, 564, 10, 10, 10, 2], [367, 615, 10, 10, 10, 2], [367, 668, 10, 10, 10, 4], [367, 717, 10, 10, 10, 2], [367, 768, 10, 10, 10, 2], [428, 3, 10, 10, 10, 2], [428, 55, 10, 9, 10, 3], [428, 105, 10, 10, 10, 2], [428, 156, 10, 10, 10, 2], [428, 207, 10, 10, 10, 2], [428, 259, 10, 9, 10, 3], [428, 309, 10, 10, 10, 2], [428, 360, 10, 10, 10, 2], [428, 411, 10, 10, 10, 2], [428, 462, 10, 10, 10, 2], [428, 514, 10, 9, 10, 3], [428, 564, 10, 10, 10, 2], [428, 615, 10, 10, 10, 2], [428, 666, 10, 10, 10, 2], [428, 717, 10, 10, 10, 2], [428, 769, 10, 9, 10, 3], [489, 3, 10, 12, 10, 2], [489, 54, 10, 9, 10, 2], [489, 104, 10, 12, 10, 1], [489, 156, 10, 10, 10, 2], [489, 207, 10, 11, 10, 2], [489, 260, 10, 7, 10, 4], [489, 310, 10, 11, 10, 3], [489, 360, 10, 10, 10, 2], [489, 411, 10, 10, 10, 2], [489, 462, 10, 10, 10, 2], [489, 513, 10, 9, 10, 2], [489, 564, 10, 9, 10, 2], [489, 616, 10, 8, 10, 3], [489, 668, 10, 7, 10, 4], [489, 717, 10, 10, 10, 2], [489, 768, 10, 10, 10, 2], [550, 6, 10, 6, 10, 5], [550, 55, 10, 9, 10, 3], [550, 106, 10, 9, 10, 3], [550, 157, 10, 9, 10, 3], [550, 207, 10, 10, 10, 2], [550, 260, 10, 10, 10, 4], [550, 309, 10, 10, 10, 2], [550, 360, 10, 12, 10, 2], [550, 411, 10, 12, 10, 2], [550, 464, 10, 8, 10, 4], [550, 513, 10, 12, 10, 2], [550, 564, 10, 9, 10, 2], [550, 615, 10, 9, 10, 2], [550, 666, 10, 10, 10, 2], [550, 719, 10, 8, 10, 4], [550, 770, 10, 8, 10, 4], [611, 5, 10, 10, 10, 4], [611, 56, 10, 10, 10, 4], [611, 108, 10, 6, 10, 5], [611, 156, 10, 12, 10, 2], [611, 207, 10, 11, 10, 2], [611, 261, 10, 6, 10, 5], [611, 309, 10, 10, 10, 2], [611, 363, 10, 7, 10, 5], [611, 414, 10, 7, 10, 5], [611, 465, 10, 7, 10, 5], [611, 516, 10, 6, 10, 5], [611, 562, 10, 12, 10, 0], [611, 613, 10, 12, 10, 0], [611, 664, 10, 12, 10, 0], [611, 717, 10, 10, 10, 2], [611, 770, 10, 8, 10, 4], [672, 6, 10, 6, 10, 5], [672, 57, 10, 6, 10, 5], [672, 105, 10, 9, 10, 2], [672, 156, 10, 9, 10, 2], [672, 207, 10, 9, 10, 2], [672, 258, 10, 9, 10, 2], [672, 312, 10, 7, 10, 5], [672, 361, 10, 9, 10, 3], [672, 412, 10, 11, 10, 3], [1, 6, 10, 6, 10, 5], [794, 768, 10, 9, 10, 2], [672, 566, 10, 7, 10, 4], [672, 618, 10, 7, 10, 5], [672, 669, 10, 7, 10, 5], [672, 717, 10, 10, 10, 2], [672, 768, 10, 10, 10, 2], [733, 3, 10, 12, 10, 2], [733, 57, 10, 6, 10, 5], [733, 108, 10, 9, 10, 5], [733, 159, 10, 9, 10, 5], [733, 208, 10, 9, 10, 3], [733, 256, 10, 12, 10, 0], [733, 307, 10, 12, 10, 0], [733, 358, 10, 12, 10, 0], [733, 410, 10, 11, 10, 1], [733, 460, 10, 12, 10, 0], [733, 511, 10, 12, 10, 0], [733, 562, 10, 12, 10, 0], [733, 614, 10, 11, 10, 1], [733, 664, 10, 12, 10, 0], [733, 715, 10, 12, 10, 0], [733, 766, 10, 12, 10, 0], [1, 6, 10, 6, 10, 5], [794, 52, 10, 12, 10, 0], [794, 103, 10, 12, 10, 0], [794, 154, 10, 12, 10, 0], [794, 205, 10, 12, 10, 0], [794, 260, 10, 8, 10, 4], [794, 309, 10, 9, 10, 2], [794, 360, 10, 9, 10, 2], [794, 412, 10, 8, 10, 3], [794, 462, 10, 9, 10, 2], [794, 513, 10, 9, 10, 2], [794, 564, 10, 9, 10, 2], [794, 618, 10, 9, 10, 5], [794, 666, 10, 9, 10, 2], [794, 720, 10, 9, 10, 5], [794, 768, 10, 9, 10, 2], [855, 3, 10, 9, 10, 2], [855, 54, 10, 9, 10, 2], [855, 105, 10, 9, 10, 2], [855, 156, 10, 9, 10, 2], [855, 207, 10, 9, 10, 2], [855, 258, 10, 9, 10, 2], [855, 309, 10, 9, 10, 2], [855, 360, 10, 9, 10, 2], [855, 411, 10, 9, 10, 2], [855, 462, 10, 9, 10, 2], [855, 513, 10, 9, 10, 2], [855, 564, 10, 9, 10, 2], [855, 615, 10, 9, 10, 2], [855, 666, 10, 9, 10, 2], [855, 717, 10, 9, 10, 2], [855, 768, 10, 9, 10, 2]], \"widestlogicalchar\": 10, \"widestglyph\": 10, \"tallestglyph\": 12}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 9, 6, 9, 4], [1, 54, 9, 8, 9, 2], [1, 105, 9, 8, 9, 2], [1, 156, 9, 8, 9, 2], [1, 206, 9, 10, 9, 1], [1, 258, 9, 8, 9, 2], [1, 309, 9, 8, 9, 2], [1, 360, 9, 8, 9, 2], [1, 411, 9, 10, 9, 2], [1, 462, 9, 10, 9, 2], [1, 513, 9, 8, 9, 2], [1, 566, 9, 6, 9, 4], [1, 617, 9, 8, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 6, 9, 4], [1, 768, 9, 8, 9, 2], [62, 3, 9, 8, 9, 2], [62, 54, 9, 8, 9, 2], [62, 105, 9, 8, 9, 2], [62, 156, 9, 8, 9, 2], [62, 207, 9, 8, 9, 2], [62, 258, 9, 8, 9, 2], [62, 309, 9, 8, 9, 2], [62, 360, 9, 8, 9, 2], [62, 411, 9, 8, 9, 2], [62, 462, 9, 8, 9, 2], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 768, 9, 8, 9, 2], [123, 3, 9, 8, 9, 2], [123, 54, 9, 8, 9, 2], [123, 105, 9, 8, 9, 2], [123, 156, 9, 8, 9, 2], [123, 207, 9, 8, 9, 2], [123, 258, 9, 8, 9, 2], [123, 309, 9, 8, 9, 2], [123, 360, 9, 8, 9, 2], [123, 411, 9, 8, 9, 2], [123, 462, 9, 8, 9, 2], [123, 513, 9, 8, 9, 2], [123, 564, 9, 8, 9, 2], [123, 615, 9, 8, 9, 2], [123, 666, 9, 8, 9, 2], [123, 717, 9, 8, 9, 2], [123, 768, 9, 8, 9, 2], [184, 3, 9, 8, 9, 2], [184, 54, 9, 10, 9, 2], [184, 105, 9, 8, 9, 2], [184, 156, 9, 8, 9, 2], [184, 207, 9, 8, 9, 2], [184, 258, 9, 8, 9, 2], [184, 309, 9, 8, 9, 2], [184, 360, 9, 8, 9, 2], [184, 411, 9, 8, 9, 2], [184, 462, 9, 8, 9, 2], [184, 513, 9, 8, 9, 2], [184, 564, 9, 10, 9, 2], [184, 615, 9, 8, 9, 2], [184, 666, 9, 10, 9, 2], [184, 717, 9, 8, 9, 2], [184, 770, 9, 7, 9, 4], [245, 3, 9, 8, 9, 2], [245, 56, 9, 6, 9, 4], [245, 105, 9, 8, 9, 2], [245, 158, 9, 6, 9, 4], [245, 207, 9, 8, 9, 2], [245, 260, 9, 6, 9, 4], [245, 309, 9, 8, 9, 2], [245, 362, 9, 8, 9, 4], [245, 411, 9, 8, 9, 2], [245, 462, 9, 8, 9, 2], [245, 513, 9, 10, 9, 2], [245, 564, 9, 8, 9, 2], [245, 615, 9, 8, 9, 2], [245, 668, 9, 6, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 208, 9, 7, 9, 3], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 564, 9, 10, 9, 2], [306, 615, 9, 8, 9, 2], [306, 666, 9, 10, 9, 2], [306, 719, 9, 6, 9, 4], [306, 768, 9, 8, 9, 2], [367, 2, 9, 9, 9, 1], [367, 52, 9, 10, 9, 0], [367, 107, 9, 8, 9, 4], [367, 154, 9, 10, 9, 0], [367, 205, 9, 10, 9, 0], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 615, 9, 8, 9, 2], [367, 668, 9, 8, 9, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 9, 8, 9, 2], [428, 156, 9, 8, 9, 2], [428, 207, 9, 8, 9, 2], [428, 259, 9, 7, 9, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 3, 9, 10, 9, 2], [489, 54, 9, 8, 9, 2], [489, 104, 9, 10, 9, 1], [489, 156, 9, 8, 9, 2], [489, 207, 9, 9, 9, 2], [489, 260, 9, 6, 9, 4], [489, 310, 9, 9, 9, 3], [489, 360, 9, 8, 9, 2], [489, 411, 9, 8, 9, 2], [489, 462, 9, 8, 9, 2], [489, 513, 9, 8, 9, 2], [489, 564, 9, 8, 9, 2], [489, 616, 9, 7, 9, 3], [489, 668, 9, 6, 9, 4], [489, 717, 9, 8, 9, 2], [489, 768, 9, 8, 9, 2], [550, 5, 9, 6, 9, 4], [550, 55, 9, 7, 9, 3], [550, 106, 9, 7, 9, 3], [550, 157, 9, 7, 9, 3], [550, 207, 9, 8, 9, 2], [550, 260, 9, 8, 9, 4], [550, 309, 9, 8, 9, 2], [550, 360, 9, 10, 9, 2], [550, 411, 9, 10, 9, 2], [550, 464, 9, 6, 9, 4], [550, 513, 9, 10, 9, 2], [550, 564, 9, 8, 9, 2], [550, 615, 9, 8, 9, 2], [550, 666, 9, 8, 9, 2], [550, 719, 9, 6, 9, 4], [550, 770, 9, 6, 9, 4], [611, 5, 9, 8, 9, 4], [611, 56, 9, 8, 9, 4], [611, 107, 9, 6, 9, 4], [611, 156, 9, 10, 9, 2], [611, 207, 9, 9, 9, 2], [611, 260, 9, 6, 9, 4], [611, 309, 9, 8, 9, 2], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 6, 9, 4], [611, 562, 9, 10, 9, 0], [611, 613, 9, 10, 9, 0], [611, 664, 9, 10, 9, 0], [611, 717, 9, 8, 9, 2], [611, 770, 9, 6, 9, 4], [672, 5, 9, 6, 9, 4], [672, 56, 9, 6, 9, 4], [672, 105, 9, 8, 9, 2], [672, 156, 9, 8, 9, 2], [672, 207, 9, 8, 9, 2], [672, 258, 9, 8, 9, 2], [672, 311, 9, 6, 9, 4], [672, 361, 9, 7, 9, 3], [672, 412, 9, 9, 9, 3], [1, 5, 9, 6, 9, 4], [794, 768, 9, 8, 9, 2], [672, 566, 9, 6, 9, 4], [672, 617, 9, 6, 9, 4], [672, 668, 9, 6, 9, 4], [672, 717, 9, 8, 9, 2], [672, 768, 9, 8, 9, 2], [733, 3, 9, 10, 9, 2], [733, 56, 9, 6, 9, 4], [733, 107, 9, 8, 9, 4], [733, 158, 9, 8, 9, 4], [733, 208, 9, 7, 9, 3], [733, 256, 9, 10, 9, 0], [733, 307, 9, 10, 9, 0], [733, 358, 9, 10, 9, 0], [733, 410, 9, 9, 9, 1], [733, 460, 9, 10, 9, 0], [733, 511, 9, 10, 9, 0], [733, 562, 9, 10, 9, 0], [733, 614, 9, 9, 9, 1], [733, 664, 9, 10, 9, 0], [733, 715, 9, 10, 9, 0], [733, 766, 9, 10, 9, 0], [1, 5, 9, 6, 9, 4], [794, 52, 9, 10, 9, 0], [794, 103, 9, 10, 9, 0], [794, 154, 9, 10, 9, 0], [794, 205, 9, 10, 9, 0], [794, 260, 9, 6, 9, 4], [794, 309, 9, 8, 9, 2], [794, 360, 9, 8, 9, 2], [794, 412, 9, 7, 9, 3], [794, 462, 9, 8, 9, 2], [794, 513, 9, 8, 9, 2], [794, 564, 9, 8, 9, 2], [794, 617, 9, 8, 9, 4], [794, 666, 9, 8, 9, 2], [794, 719, 9, 8, 9, 4], [794, 768, 9, 8, 9, 2], [855, 3, 9, 8, 9, 2], [855, 54, 9, 8, 9, 2], [855, 105, 9, 8, 9, 2], [855, 156, 9, 8, 9, 2], [855, 207, 9, 8, 9, 2], [855, 258, 9, 8, 9, 2], [855, 309, 9, 8, 9, 2], [855, 360, 9, 8, 9, 2], [855, 411, 9, 8, 9, 2], [855, 462, 9, 8, 9, 2], [855, 513, 9, 8, 9, 2], [855, 564, 9, 8, 9, 2], [855, 615, 9, 8, 9, 2], [855, 666, 9, 8, 9, 2], [855, 717, 9, 8, 9, 2], [855, 768, 9, 8, 9, 2]], \"widestlogicalchar\": 9, \"widestglyph\": 9, \"tallestglyph\": 10}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 55, 14, 11, 12, 3], [1, 106, 15, 5, 12, 3], [1, 157, 16, 8, 12, 3], [1, 207, 16, 13, 12, 2], [1, 259, 16, 11, 12, 3], [1, 310, 14, 11, 12, 3], [1, 361, 14, 5, 12, 3], [1, 411, 16, 13, 12, 2], [1, 462, 14, 13, 12, 2], [1, 514, 16, 8, 12, 3], [1, 567, 14, 7, 12, 5], [1, 623, 11, 6, 12, 10], [1, 672, 14, 3, 12, 8], [1, 725, 11, 4, 12, 10], [1, 769, 16, 12, 12, 3], [62, 4, 16, 11, 12, 3], [62, 55, 14, 11, 12, 3], [62, 106, 16, 11, 12, 3], [62, 157, 16, 11, 12, 3], [62, 208, 15, 11, 12, 3], [62, 259, 16, 11, 12, 3], [62, 310, 15, 11, 12, 3], [62, 361, 16, 11, 12, 3], [62, 412, 16, 11, 12, 3], [62, 463, 16, 11, 12, 3], [62, 517, 13, 8, 12, 6], [62, 568, 13, 10, 12, 6], [62, 617, 15, 9, 12, 4], [62, 670, 15, 5, 12, 6], [62, 719, 14, 9, 12, 4], [62, 769, 16, 11, 12, 3], [123, 6, 15, 9, 12, 5], [123, 55, 16, 11, 12, 3], [123, 106, 16, 11, 12, 3], [123, 157, 16, 11, 12, 3], [123, 208, 16, 11, 12, 3], [123, 259, 16, 11, 12, 3], [123, 310, 16, 11, 12, 3], [123, 361, 16, 11, 12, 3], [123, 412, 16, 11, 12, 3], [123, 463, 14, 11, 12, 3], [123, 514, 16, 11, 12, 3], [123, 565, 16, 11, 12, 3], [123, 616, 12, 11, 12, 3], [123, 667, 16, 11, 12, 3], [123, 718, 16, 11, 12, 3], [123, 769, 16, 11, 12, 3], [184, 4, 16, 11, 12, 3], [184, 55, 16, 13, 12, 3], [184, 106, 16, 11, 12, 3], [184, 157, 16, 11, 12, 3], [184, 208, 16, 11, 12, 3], [184, 259, 16, 11, 12, 3], [184, 310, 16, 11, 12, 3], [184, 361, 16, 11, 12, 3], [184, 412, 16, 11, 12, 3], [184, 463, 16, 11, 12, 3], [184, 514, 16, 11, 12, 3], [184, 564, 16, 13, 12, 2], [184, 616, 12, 12, 12, 3], [184, 666, 16, 13, 12, 2], [184, 718, 15, 5, 12, 3], [184, 777, 13, 3, 12, 11], [245, 4, 15, 4, 12, 3], [245, 58, 15, 8, 12, 6], [245, 106, 14, 11, 12, 3], [245, 160, 14, 8, 12, 6], [245, 208, 16, 11, 12, 3], [245, 262, 14, 8, 12, 6], [245, 310, 16, 11, 12, 3], [245, 364, 15, 11, 12, 6], [245, 412, 14, 11, 12, 3], [245, 463, 14, 11, 12, 3], [245, 514, 14, 14, 12, 3], [245, 565, 14, 11, 12, 3], [245, 616, 14, 11, 12, 3], [245, 670, 14, 8, 12, 6], [245, 721, 14, 8, 12, 6], [245, 772, 14, 8, 12, 6], [306, 7, 14, 10, 12, 6], [306, 58, 15, 10, 12, 6], [306, 109, 14, 8, 12, 6], [306, 160, 14, 8, 12, 6], [306, 209, 13, 10, 12, 4], [306, 262, 15, 8, 12, 6], [306, 313, 15, 8, 12, 6], [306, 364, 15, 8, 12, 6], [306, 415, 15, 8, 12, 6], [306, 466, 15, 11, 12, 6], [306, 517, 15, 8, 12, 6], [306, 564, 16, 13, 12, 2], [306, 615, 15, 13, 12, 2], [306, 666, 14, 13, 12, 2], [306, 718, 16, 4, 12, 3], [306, 766, 1, 1, 3, 1], [367, 2, 16, 13, 12, 1], [367, 52, 17, 14, 12, 0], [367, 106, 16, 14, 12, 3], [367, 155, 16, 13, 12, 1], [367, 205, 17, 14, 12, 0], [367, 257, 16, 13, 12, 1], [367, 308, 16, 13, 12, 1], [367, 361, 15, 11, 12, 3], [367, 412, 15, 11, 12, 3], [367, 463, 15, 11, 12, 3], [367, 515, 15, 10, 12, 4], [367, 565, 16, 11, 12, 3], [367, 615, 16, 12, 12, 2], [367, 670, 14, 11, 12, 6], [367, 718, 15, 11, 12, 3], [367, 769, 14, 11, 12, 3], [428, 4, 15, 11, 12, 3], [428, 56, 15, 10, 12, 4], [428, 106, 15, 11, 12, 3], [428, 157, 14, 11, 12, 3], [428, 208, 15, 11, 12, 3], [428, 260, 15, 10, 12, 4], [428, 310, 16, 11, 12, 3], [428, 361, 15, 11, 12, 3], [428, 412, 14, 11, 12, 3], [428, 463, 15, 11, 12, 3], [428, 515, 15, 10, 12, 4], [428, 565, 16, 11, 12, 3], [428, 616, 15, 11, 12, 3], [428, 667, 15, 11, 12, 3], [428, 718, 15, 11, 12, 3], [428, 770, 15, 10, 12, 4], [489, 4, 15, 7, 12, 3], [489, 55, 15, 6, 12, 3], [489, 108, 14, 10, 12, 5], [489, 157, 15, 11, 12, 3], [489, 207, 16, 12, 12, 2], [489, 262, 14, 7, 12, 6], [489, 310, 16, 11, 12, 3], [489, 361, 16, 12, 12, 3], [489, 413, 14, 10, 11, 4], [489, 464, 14, 10, 11, 4], [489, 514, 16, 5, 12, 3], [489, 565, 15, 4, 12, 3], [489, 616, 15, 3, 12, 3], [489, 669, 15, 7, 12, 5], [489, 718, 16, 11, 12, 3], [489, 769, 16, 11, 12, 3], [550, 8, 14, 5, 12, 7], [550, 57, 14, 9, 12, 5], [550, 107, 15, 10, 12, 4], [550, 158, 14, 10, 12, 4], [550, 208, 16, 11, 12, 3], [550, 262, 15, 10, 12, 6], [550, 311, 15, 10, 12, 4], [550, 361, 16, 11, 12, 3], [550, 412, 16, 11, 12, 3], [550, 466, 15, 8, 12, 6], [550, 512, 17, 15, 12, 1], [550, 565, 16, 9, 12, 3], [550, 616, 16, 9, 12, 3], [550, 667, 16, 11, 12, 3], [550, 721, 14, 8, 12, 6], [550, 772, 14, 8, 12, 6], [611, 4, 14, 11, 12, 3], [611, 55, 14, 11, 12, 3], [611, 110, 14, 5, 12, 7], [611, 157, 16, 11, 12, 3], [611, 206, 17, 15, 12, 1], [611, 261, 15, 7, 12, 5], [611, 313, 13, 8, 12, 6], [611, 364, 15, 8, 12, 6], [611, 415, 14, 8, 12, 6], [611, 471, 12, 3, 12, 11], [611, 511, 1, 1, 12, 1], [611, 563, 16, 13, 12, 1], [611, 613, 17, 14, 12, 0], [611, 664, 17, 14, 12, 0], [611, 718, 16, 11, 12, 3], [611, 772, 14, 8, 12, 6], [672, 9, 13, 3, 12, 8], [672, 60, 14, 3, 12, 8], [672, 106, 16, 5, 12, 3], [672, 157, 16, 5, 12, 3], [672, 208, 15, 5, 12, 3], [672, 259, 15, 5, 12, 3], [672, 312, 14, 7, 12, 5], [672, 364, 14, 7, 12, 6], [672, 413, 15, 13, 12, 4], [1, 1, 1, 1, 12, 1], [794, 769, 16, 11, 12, 3], [672, 565, 16, 11, 12, 3], [672, 616, 16, 11, 12, 3], [672, 667, 16, 11, 12, 3], [672, 718, 16, 11, 12, 3], [672, 769, 16, 11, 12, 3], [733, 4, 16, 11, 12, 3], [733, 55, 16, 11, 12, 3], [733, 106, 16, 11, 12, 3], [733, 157, 16, 11, 12, 3], [733, 208, 16, 11, 12, 3], [733, 259, 16, 11, 12, 3], [733, 310, 16, 11, 12, 3], [733, 361, 16, 11, 12, 3], [733, 412, 16, 11, 12, 3], [733, 463, 16, 11, 12, 3], [733, 514, 16, 11, 12, 3], [733, 565, 16, 11, 12, 3], [733, 616, 16, 11, 12, 3], [733, 667, 16, 11, 12, 3], [733, 718, 16, 11, 12, 3], [733, 769, 16, 11, 12, 3], [1, 1, 1, 1, 12, 1], [794, 55, 16, 11, 12, 3], [794, 106, 16, 11, 12, 3], [794, 157, 16, 11, 12, 3], [794, 208, 16, 11, 12, 3], [794, 259, 16, 11, 12, 3], [794, 310, 16, 11, 12, 3], [794, 361, 16, 11, 12, 3], [794, 412, 16, 11, 12, 3], [794, 463, 16, 11, 12, 3], [794, 514, 16, 11, 12, 3], [794, 565, 16, 11, 12, 3], [794, 616, 16, 11, 12, 3], [794, 667, 16, 11, 12, 3], [794, 718, 16, 11, 12, 3], [794, 769, 16, 11, 12, 3], [855, 4, 16, 11, 12, 3], [855, 55, 16, 11, 12, 3], [855, 106, 16, 11, 12, 3], [855, 157, 16, 11, 12, 3], [855, 208, 16, 11, 12, 3], [855, 259, 16, 11, 12, 3], [855, 310, 16, 11, 12, 3], [855, 361, 16, 11, 12, 3], [855, 412, 16, 11, 12, 3], [855, 463, 16, 11, 12, 3], [855, 514, 16, 11, 12, 3], [855, 565, 16, 11, 12, 3], [855, 616, 16, 11, 12, 3], [855, 667, 16, 11, 12, 3], [855, 718, 16, 11, 12, 3], [855, 769, 16, 11, 12, 3]], \"capHeight\": 13, \"widestlogicalchar\": 12, \"widestglyph\": 17, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 13, 9, 11, 3], [1, 106, 14, 3, 11, 3], [1, 157, 15, 6, 11, 3], [1, 207, 15, 11, 11, 2], [1, 259, 15, 9, 11, 3], [1, 310, 13, 9, 11, 3], [1, 361, 13, 3, 11, 3], [1, 411, 15, 11, 11, 2], [1, 462, 13, 11, 11, 2], [1, 514, 15, 6, 11, 3], [1, 567, 13, 5, 11, 5], [1, 623, 10, 4, 11, 10], [1, 672, 13, 1, 11, 8], [1, 725, 10, 2, 11, 10], [1, 769, 15, 10, 11, 3], [62, 4, 15, 9, 11, 3], [62, 55, 13, 9, 11, 3], [62, 106, 15, 9, 11, 3], [62, 157, 15, 9, 11, 3], [62, 208, 14, 9, 11, 3], [62, 259, 15, 9, 11, 3], [62, 310, 14, 9, 11, 3], [62, 361, 15, 9, 11, 3], [62, 412, 15, 9, 11, 3], [62, 463, 15, 9, 11, 3], [62, 517, 12, 6, 11, 6], [62, 568, 12, 8, 11, 6], [62, 617, 14, 7, 11, 4], [62, 670, 14, 3, 11, 6], [62, 719, 13, 7, 11, 4], [62, 769, 15, 9, 11, 3], [123, 6, 14, 7, 11, 5], [123, 55, 15, 9, 11, 3], [123, 106, 15, 9, 11, 3], [123, 157, 15, 9, 11, 3], [123, 208, 15, 9, 11, 3], [123, 259, 15, 9, 11, 3], [123, 310, 15, 9, 11, 3], [123, 361, 15, 9, 11, 3], [123, 412, 15, 9, 11, 3], [123, 463, 13, 9, 11, 3], [123, 514, 15, 9, 11, 3], [123, 565, 15, 9, 11, 3], [123, 616, 11, 9, 11, 3], [123, 667, 15, 9, 11, 3], [123, 718, 15, 9, 11, 3], [123, 769, 15, 9, 11, 3], [184, 4, 15, 9, 11, 3], [184, 55, 15, 11, 11, 3], [184, 106, 15, 9, 11, 3], [184, 157, 15, 9, 11, 3], [184, 208, 15, 9, 11, 3], [184, 259, 15, 9, 11, 3], [184, 310, 15, 9, 11, 3], [184, 361, 15, 9, 11, 3], [184, 412, 15, 9, 11, 3], [184, 463, 15, 9, 11, 3], [184, 514, 15, 9, 11, 3], [184, 564, 15, 11, 11, 2], [184, 616, 11, 10, 11, 3], [184, 666, 15, 11, 11, 2], [184, 718, 14, 3, 11, 3], [184, 777, 12, 1, 11, 11], [245, 4, 14, 2, 11, 3], [245, 58, 14, 6, 11, 6], [245, 106, 13, 9, 11, 3], [245, 160, 13, 6, 11, 6], [245, 208, 15, 9, 11, 3], [245, 262, 13, 6, 11, 6], [245, 310, 15, 9, 11, 3], [245, 364, 14, 9, 11, 6], [245, 412, 13, 9, 11, 3], [245, 463, 13, 9, 11, 3], [245, 514, 13, 12, 11, 3], [245, 565, 13, 9, 11, 3], [245, 616, 13, 9, 11, 3], [245, 670, 13, 6, 11, 6], [245, 721, 13, 6, 11, 6], [245, 772, 13, 6, 11, 6], [306, 7, 13, 8, 11, 6], [306, 58, 14, 8, 11, 6], [306, 109, 13, 6, 11, 6], [306, 160, 13, 6, 11, 6], [306, 209, 12, 8, 11, 4], [306, 262, 14, 6, 11, 6], [306, 313, 14, 6, 11, 6], [306, 364, 14, 6, 11, 6], [306, 415, 14, 6, 11, 6], [306, 466, 14, 9, 11, 6], [306, 517, 14, 6, 11, 6], [306, 564, 15, 11, 11, 2], [306, 615, 14, 11, 11, 2], [306, 666, 13, 11, 11, 2], [306, 718, 15, 2, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 15, 11, 11, 1], [367, 52, 16, 12, 11, 0], [367, 106, 15, 12, 11, 3], [367, 155, 15, 11, 11, 1], [367, 205, 15, 12, 11, 0], [367, 257, 15, 11, 11, 1], [367, 308, 15, 11, 11, 1], [367, 361, 14, 9, 11, 3], [367, 412, 14, 9, 11, 3], [367, 463, 14, 9, 11, 3], [367, 515, 14, 8, 11, 4], [367, 565, 15, 9, 11, 3], [367, 615, 15, 10, 11, 2], [367, 670, 13, 9, 11, 6], [367, 718, 14, 9, 11, 3], [367, 769, 13, 9, 11, 3], [428, 4, 14, 9, 11, 3], [428, 56, 14, 8, 11, 4], [428, 106, 14, 9, 11, 3], [428, 157, 13, 9, 11, 3], [428, 208, 14, 9, 11, 3], [428, 260, 14, 8, 11, 4], [428, 310, 15, 9, 11, 3], [428, 361, 14, 9, 11, 3], [428, 412, 13, 9, 11, 3], [428, 463, 14, 9, 11, 3], [428, 515, 14, 8, 11, 4], [428, 565, 15, 9, 11, 3], [428, 616, 14, 9, 11, 3], [428, 667, 14, 9, 11, 3], [428, 718, 14, 9, 11, 3], [428, 770, 14, 8, 11, 4], [489, 4, 14, 5, 11, 3], [489, 55, 14, 4, 11, 3], [489, 108, 13, 8, 11, 5], [489, 157, 14, 9, 11, 3], [489, 207, 15, 10, 11, 2], [489, 262, 13, 5, 11, 6], [489, 310, 15, 9, 11, 3], [489, 361, 15, 10, 11, 3], [489, 413, 13, 8, 10, 4], [489, 464, 13, 8, 10, 4], [489, 514, 15, 3, 11, 3], [489, 565, 14, 2, 11, 3], [489, 616, 14, 1, 11, 3], [489, 669, 14, 5, 11, 5], [489, 718, 15, 9, 11, 3], [489, 769, 15, 9, 11, 3], [550, 8, 13, 3, 11, 7], [550, 57, 13, 7, 11, 5], [550, 107, 14, 8, 11, 4], [550, 158, 13, 8, 11, 4], [550, 208, 15, 9, 11, 3], [550, 262, 14, 8, 11, 6], [550, 311, 14, 8, 11, 4], [550, 361, 15, 9, 11, 3], [550, 412, 15, 9, 11, 3], [550, 466, 14, 6, 11, 6], [550, 512, 16, 13, 11, 1], [550, 565, 15, 7, 11, 3], [550, 616, 15, 7, 11, 3], [550, 667, 15, 9, 11, 3], [550, 721, 13, 6, 11, 6], [550, 772, 13, 6, 11, 6], [611, 4, 13, 9, 11, 3], [611, 55, 13, 9, 11, 3], [611, 110, 13, 3, 11, 7], [611, 157, 15, 9, 11, 3], [611, 206, 16, 13, 11, 1], [611, 261, 14, 5, 11, 5], [611, 313, 12, 6, 11, 6], [611, 364, 14, 6, 11, 6], [611, 415, 13, 6, 11, 6], [611, 471, 11, 1, 11, 11], [611, 511, 1, 1, 11, 1], [611, 563, 15, 11, 11, 1], [611, 613, 15, 12, 11, 0], [611, 664, 15, 12, 11, 0], [611, 718, 15, 9, 11, 3], [611, 772, 13, 6, 11, 6], [672, 9, 12, 1, 11, 8], [672, 60, 13, 1, 11, 8], [672, 106, 15, 3, 11, 3], [672, 157, 15, 3, 11, 3], [672, 208, 14, 3, 11, 3], [672, 259, 14, 3, 11, 3], [672, 312, 13, 5, 11, 5], [672, 364, 13, 5, 11, 6], [672, 413, 14, 11, 11, 4], [1, 1, 1, 1, 11, 1], [794, 769, 15, 9, 11, 3], [672, 565, 15, 9, 11, 3], [672, 616, 15, 9, 11, 3], [672, 667, 15, 9, 11, 3], [672, 718, 15, 9, 11, 3], [672, 769, 15, 9, 11, 3], [733, 4, 15, 9, 11, 3], [733, 55, 15, 9, 11, 3], [733, 106, 15, 9, 11, 3], [733, 157, 15, 9, 11, 3], [733, 208, 15, 9, 11, 3], [733, 259, 15, 9, 11, 3], [733, 310, 15, 9, 11, 3], [733, 361, 15, 9, 11, 3], [733, 412, 15, 9, 11, 3], [733, 463, 15, 9, 11, 3], [733, 514, 15, 9, 11, 3], [733, 565, 15, 9, 11, 3], [733, 616, 15, 9, 11, 3], [733, 667, 15, 9, 11, 3], [733, 718, 15, 9, 11, 3], [733, 769, 15, 9, 11, 3], [1, 1, 1, 1, 11, 1], [794, 55, 15, 9, 11, 3], [794, 106, 15, 9, 11, 3], [794, 157, 15, 9, 11, 3], [794, 208, 15, 9, 11, 3], [794, 259, 15, 9, 11, 3], [794, 310, 15, 9, 11, 3], [794, 361, 15, 9, 11, 3], [794, 412, 15, 9, 11, 3], [794, 463, 15, 9, 11, 3], [794, 514, 15, 9, 11, 3], [794, 565, 15, 9, 11, 3], [794, 616, 15, 9, 11, 3], [794, 667, 15, 9, 11, 3], [794, 718, 15, 9, 11, 3], [794, 769, 15, 9, 11, 3], [855, 4, 15, 9, 11, 3], [855, 55, 15, 9, 11, 3], [855, 106, 15, 9, 11, 3], [855, 157, 15, 9, 11, 3], [855, 208, 15, 9, 11, 3], [855, 259, 15, 9, 11, 3], [855, 310, 15, 9, 11, 3], [855, 361, 15, 9, 11, 3], [855, 412, 15, 9, 11, 3], [855, 463, 15, 9, 11, 3], [855, 514, 15, 9, 11, 3], [855, 565, 15, 9, 11, 3], [855, 616, 15, 9, 11, 3], [855, 667, 15, 9, 11, 3], [855, 718, 15, 9, 11, 3], [855, 769, 15, 9, 11, 3]], \"capHeight\": 12, \"widestlogicalchar\": 11, \"widestglyph\": 16, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 12, 6, 12, 7], [1, 55, 12, 11, 12, 3], [1, 106, 12, 10, 12, 3], [1, 157, 12, 10, 12, 3], [1, 207, 12, 13, 12, 2], [1, 259, 12, 11, 12, 3], [1, 310, 12, 11, 12, 3], [1, 361, 12, 10, 12, 3], [1, 411, 12, 13, 12, 2], [1, 462, 12, 13, 12, 2], [1, 514, 12, 10, 12, 3], [1, 567, 12, 8, 12, 5], [1, 620, 12, 9, 12, 7], [1, 671, 12, 6, 12, 7], [1, 722, 12, 7, 12, 7], [1, 769, 12, 12, 12, 3], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 517, 12, 8, 12, 6], [62, 568, 12, 10, 12, 6], [62, 617, 12, 9, 12, 4], [62, 670, 12, 7, 12, 6], [62, 719, 12, 9, 12, 4], [62, 769, 12, 11, 12, 3], [123, 6, 12, 9, 12, 5], [123, 55, 12, 11, 12, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 12, 11, 12, 3], [123, 412, 12, 11, 12, 3], [123, 463, 12, 11, 12, 3], [123, 514, 12, 11, 12, 3], [123, 565, 12, 11, 12, 3], [123, 616, 12, 11, 12, 3], [123, 667, 12, 11, 12, 3], [123, 718, 12, 11, 12, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 13, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 12, 11, 12, 3], [184, 208, 12, 11, 12, 3], [184, 259, 12, 11, 12, 3], [184, 310, 12, 11, 12, 3], [184, 361, 12, 11, 12, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 12, 11, 12, 3], [184, 564, 12, 13, 12, 2], [184, 616, 12, 12, 12, 3], [184, 666, 12, 13, 12, 2], [184, 718, 12, 10, 12, 3], [184, 773, 12, 7, 12, 7], [245, 4, 12, 10, 12, 3], [245, 58, 12, 8, 12, 6], [245, 106, 12, 11, 12, 3], [245, 160, 12, 8, 12, 6], [245, 208, 12, 11, 12, 3], [245, 262, 12, 8, 12, 6], [245, 310, 12, 11, 12, 3], [245, 364, 12, 11, 12, 6], [245, 412, 12, 11, 12, 3], [245, 463, 12, 11, 12, 3], [245, 514, 12, 14, 12, 3], [245, 565, 12, 11, 12, 3], [245, 616, 12, 11, 12, 3], [245, 670, 12, 8, 12, 6], [245, 721, 12, 8, 12, 6], [245, 772, 12, 8, 12, 6], [306, 7, 12, 10, 12, 6], [306, 58, 12, 10, 12, 6], [306, 109, 12, 8, 12, 6], [306, 160, 12, 8, 12, 6], [306, 209, 12, 10, 12, 4], [306, 262, 12, 8, 12, 6], [306, 313, 12, 8, 12, 6], [306, 364, 12, 8, 12, 6], [306, 415, 12, 8, 12, 6], [306, 466, 12, 11, 12, 6], [306, 517, 12, 8, 12, 6], [306, 564, 12, 13, 12, 2], [306, 615, 12, 13, 12, 2], [306, 666, 12, 13, 12, 2], [306, 718, 12, 10, 12, 3], [306, 773, 3, 6, 3, 7], [367, 2, 12, 13, 12, 1], [367, 52, 12, 14, 12, 0], [367, 106, 12, 14, 12, 3], [367, 155, 12, 13, 12, 1], [367, 205, 12, 14, 12, 0], [367, 257, 12, 13, 12, 1], [367, 308, 12, 13, 12, 1], [367, 361, 12, 11, 12, 3], [367, 412, 12, 11, 12, 3], [367, 463, 12, 11, 12, 3], [367, 515, 12, 10, 12, 4], [367, 565, 12, 11, 12, 3], [367, 615, 12, 12, 12, 2], [367, 670, 12, 11, 12, 6], [367, 718, 12, 11, 12, 3], [367, 769, 12, 11, 12, 3], [428, 4, 12, 11, 12, 3], [428, 56, 12, 10, 12, 4], [428, 106, 12, 11, 12, 3], [428, 157, 12, 11, 12, 3], [428, 208, 12, 11, 12, 3], [428, 260, 12, 10, 12, 4], [428, 310, 12, 11, 12, 3], [428, 361, 12, 11, 12, 3], [428, 412, 12, 11, 12, 3], [428, 463, 12, 11, 12, 3], [428, 515, 12, 10, 12, 4], [428, 565, 12, 11, 12, 3], [428, 616, 12, 11, 12, 3], [428, 667, 12, 11, 12, 3], [428, 718, 12, 11, 12, 3], [428, 770, 12, 10, 12, 4], [489, 4, 12, 10, 12, 3], [489, 55, 12, 10, 12, 3], [489, 108, 12, 10, 12, 5], [489, 157, 12, 11, 12, 3], [489, 207, 12, 12, 12, 2], [489, 262, 12, 7, 12, 6], [489, 310, 12, 11, 12, 3], [489, 361, 12, 12, 12, 3], [489, 413, 11, 10, 11, 4], [489, 464, 11, 10, 11, 4], [489, 514, 12, 10, 12, 3], [489, 565, 12, 10, 12, 3], [489, 616, 12, 10, 12, 3], [489, 669, 12, 8, 12, 5], [489, 718, 12, 11, 12, 3], [489, 769, 12, 11, 12, 3], [550, 8, 12, 6, 12, 7], [550, 57, 12, 9, 12, 5], [550, 107, 12, 10, 12, 4], [550, 158, 12, 10, 12, 4], [550, 208, 12, 11, 12, 3], [550, 262, 12, 10, 12, 6], [550, 311, 12, 10, 12, 4], [550, 361, 12, 11, 12, 3], [550, 412, 12, 11, 12, 3], [550, 466, 12, 8, 12, 6], [550, 512, 12, 15, 12, 1], [550, 565, 12, 10, 12, 3], [550, 616, 12, 10, 12, 3], [550, 667, 12, 11, 12, 3], [550, 721, 12, 8, 12, 6], [550, 772, 12, 8, 12, 6], [611, 4, 12, 11, 12, 3], [611, 55, 12, 11, 12, 3], [611, 110, 12, 6, 12, 7], [611, 157, 12, 11, 12, 3], [611, 206, 12, 15, 12, 1], [611, 261, 12, 8, 12, 5], [611, 313, 12, 8, 12, 6], [611, 364, 12, 8, 12, 6], [611, 415, 12, 8, 12, 6], [611, 467, 12, 7, 12, 7], [611, 518, 12, 6, 12, 7], [611, 563, 12, 13, 12, 1], [611, 613, 12, 14, 12, 0], [611, 664, 12, 14, 12, 0], [611, 718, 12, 11, 12, 3], [611, 772, 12, 8, 12, 6], [672, 8, 12, 6, 12, 7], [672, 59, 12, 6, 12, 7], [672, 106, 12, 10, 12, 3], [672, 157, 12, 10, 12, 3], [672, 208, 12, 10, 12, 3], [672, 259, 12, 10, 12, 3], [672, 312, 12, 8, 12, 5], [672, 364, 12, 7, 12, 6], [672, 413, 12, 13, 12, 4], [1, 8, 12, 6, 12, 7], [794, 769, 12, 11, 12, 3], [672, 565, 12, 11, 12, 3], [672, 616, 12, 11, 12, 3], [672, 667, 12, 11, 12, 3], [672, 718, 12, 11, 12, 3], [672, 769, 12, 11, 12, 3], [733, 4, 12, 11, 12, 3], [733, 55, 12, 11, 12, 3], [733, 106, 12, 11, 12, 3], [733, 157, 12, 11, 12, 3], [733, 208, 12, 11, 12, 3], [733, 259, 12, 11, 12, 3], [733, 310, 12, 11, 12, 3], [733, 361, 12, 11, 12, 3], [733, 412, 12, 11, 12, 3], [733, 463, 12, 11, 12, 3], [733, 514, 12, 11, 12, 3], [733, 565, 12, 11, 12, 3], [733, 616, 12, 11, 12, 3], [733, 667, 12, 11, 12, 3], [733, 718, 12, 11, 12, 3], [733, 769, 12, 11, 12, 3], [1, 8, 12, 6, 12, 7], [794, 55, 12, 11, 12, 3], [794, 106, 12, 11, 12, 3], [794, 157, 12, 11, 12, 3], [794, 208, 12, 11, 12, 3], [794, 259, 12, 11, 12, 3], [794, 310, 12, 11, 12, 3], [794, 361, 12, 11, 12, 3], [794, 412, 12, 11, 12, 3], [794, 463, 12, 11, 12, 3], [794, 514, 12, 11, 12, 3], [794, 565, 12, 11, 12, 3], [794, 616, 12, 11, 12, 3], [794, 667, 12, 11, 12, 3], [794, 718, 12, 11, 12, 3], [794, 769, 12, 11, 12, 3], [855, 4, 12, 11, 12, 3], [855, 55, 12, 11, 12, 3], [855, 106, 12, 11, 12, 3], [855, 157, 12, 11, 12, 3], [855, 208, 12, 11, 12, 3], [855, 259, 12, 11, 12, 3], [855, 310, 12, 11, 12, 3], [855, 361, 12, 11, 12, 3], [855, 412, 12, 11, 12, 3], [855, 463, 12, 11, 12, 3], [855, 514, 12, 11, 12, 3], [855, 565, 12, 11, 12, 3], [855, 616, 12, 11, 12, 3], [855, 667, 12, 11, 12, 3], [855, 718, 12, 11, 12, 3], [855, 769, 12, 11, 12, 3]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 11, 6, 11, 6], [1, 55, 11, 9, 11, 3], [1, 106, 11, 9, 11, 3], [1, 157, 11, 9, 11, 3], [1, 207, 11, 11, 11, 2], [1, 259, 11, 9, 11, 3], [1, 310, 11, 9, 11, 3], [1, 361, 11, 9, 11, 3], [1, 411, 11, 11, 11, 2], [1, 462, 11, 11, 11, 2], [1, 514, 11, 9, 11, 3], [1, 567, 11, 7, 11, 5], [1, 619, 11, 8, 11, 6], [1, 670, 11, 6, 11, 6], [1, 721, 11, 6, 11, 6], [1, 769, 11, 10, 11, 3], [62, 4, 11, 9, 11, 3], [62, 55, 11, 9, 11, 3], [62, 106, 11, 9, 11, 3], [62, 157, 11, 9, 11, 3], [62, 208, 11, 9, 11, 3], [62, 259, 11, 9, 11, 3], [62, 310, 11, 9, 11, 3], [62, 361, 11, 9, 11, 3], [62, 412, 11, 9, 11, 3], [62, 463, 11, 9, 11, 3], [62, 517, 11, 6, 11, 6], [62, 568, 11, 8, 11, 6], [62, 617, 11, 8, 11, 4], [62, 670, 11, 6, 11, 6], [62, 719, 11, 8, 11, 4], [62, 769, 11, 9, 11, 3], [123, 6, 11, 7, 11, 5], [123, 55, 11, 9, 11, 3], [123, 106, 11, 9, 11, 3], [123, 157, 11, 9, 11, 3], [123, 208, 11, 9, 11, 3], [123, 259, 11, 9, 11, 3], [123, 310, 11, 9, 11, 3], [123, 361, 11, 9, 11, 3], [123, 412, 11, 9, 11, 3], [123, 463, 11, 9, 11, 3], [123, 514, 11, 9, 11, 3], [123, 565, 11, 9, 11, 3], [123, 616, 11, 9, 11, 3], [123, 667, 11, 9, 11, 3], [123, 718, 11, 9, 11, 3], [123, 769, 11, 9, 11, 3], [184, 4, 11, 9, 11, 3], [184, 55, 11, 11, 11, 3], [184, 106, 11, 9, 11, 3], [184, 157, 11, 9, 11, 3], [184, 208, 11, 9, 11, 3], [184, 259, 11, 9, 11, 3], [184, 310, 11, 9, 11, 3], [184, 361, 11, 9, 11, 3], [184, 412, 11, 9, 11, 3], [184, 463, 11, 9, 11, 3], [184, 514, 11, 9, 11, 3], [184, 564, 11, 11, 11, 2], [184, 616, 11, 10, 11, 3], [184, 666, 11, 11, 11, 2], [184, 718, 11, 9, 11, 3], [184, 772, 11, 6, 11, 6], [245, 4, 11, 9, 11, 3], [245, 58, 11, 6, 11, 6], [245, 106, 11, 9, 11, 3], [245, 160, 11, 6, 11, 6], [245, 208, 11, 9, 11, 3], [245, 262, 11, 6, 11, 6], [245, 310, 11, 9, 11, 3], [245, 364, 11, 9, 11, 6], [245, 412, 11, 9, 11, 3], [245, 463, 11, 9, 11, 3], [245, 514, 11, 12, 11, 3], [245, 565, 11, 9, 11, 3], [245, 616, 11, 9, 11, 3], [245, 670, 11, 6, 11, 6], [245, 721, 11, 6, 11, 6], [245, 772, 11, 6, 11, 6], [306, 7, 11, 8, 11, 6], [306, 58, 11, 8, 11, 6], [306, 109, 11, 6, 11, 6], [306, 160, 11, 6, 11, 6], [306, 209, 11, 8, 11, 4], [306, 262, 11, 6, 11, 6], [306, 313, 11, 6, 11, 6], [306, 364, 11, 6, 11, 6], [306, 415, 11, 6, 11, 6], [306, 466, 11, 9, 11, 6], [306, 517, 11, 6, 11, 6], [306, 564, 11, 11, 11, 2], [306, 615, 11, 11, 11, 2], [306, 666, 11, 11, 11, 2], [306, 718, 11, 9, 11, 3], [306, 772, 3, 6, 3, 6], [367, 2, 11, 11, 11, 1], [367, 52, 11, 12, 11, 0], [367, 106, 11, 12, 11, 3], [367, 155, 11, 11, 11, 1], [367, 205, 11, 12, 11, 0], [367, 257, 11, 11, 11, 1], [367, 308, 11, 11, 11, 1], [367, 361, 11, 9, 11, 3], [367, 412, 11, 9, 11, 3], [367, 463, 11, 9, 11, 3], [367, 515, 11, 8, 11, 4], [367, 565, 11, 9, 11, 3], [367, 615, 11, 10, 11, 2], [367, 670, 11, 9, 11, 6], [367, 718, 11, 9, 11, 3], [367, 769, 11, 9, 11, 3], [428, 4, 11, 9, 11, 3], [428, 56, 11, 8, 11, 4], [428, 106, 11, 9, 11, 3], [428, 157, 11, 9, 11, 3], [428, 208, 11, 9, 11, 3], [428, 260, 11, 8, 11, 4], [428, 310, 11, 9, 11, 3], [428, 361, 11, 9, 11, 3], [428, 412, 11, 9, 11, 3], [428, 463, 11, 9, 11, 3], [428, 515, 11, 8, 11, 4], [428, 565, 11, 9, 11, 3], [428, 616, 11, 9, 11, 3], [428, 667, 11, 9, 11, 3], [428, 718, 11, 9, 11, 3], [428, 770, 11, 8, 11, 4], [489, 4, 11, 9, 11, 3], [489, 55, 11, 9, 11, 3], [489, 108, 11, 8, 11, 5], [489, 157, 11, 9, 11, 3], [489, 207, 11, 10, 11, 2], [489, 262, 11, 6, 11, 6], [489, 310, 11, 9, 11, 3], [489, 361, 11, 10, 11, 3], [489, 413, 10, 8, 10, 4], [489, 464, 10, 8, 10, 4], [489, 514, 11, 9, 11, 3], [489, 565, 11, 9, 11, 3], [489, 616, 11, 9, 11, 3], [489, 669, 11, 7, 11, 5], [489, 718, 11, 9, 11, 3], [489, 769, 11, 9, 11, 3], [550, 7, 11, 6, 11, 6], [550, 57, 11, 7, 11, 5], [550, 107, 11, 8, 11, 4], [550, 158, 11, 8, 11, 4], [550, 208, 11, 9, 11, 3], [550, 262, 11, 8, 11, 6], [550, 311, 11, 8, 11, 4], [550, 361, 11, 9, 11, 3], [550, 412, 11, 9, 11, 3], [550, 466, 11, 6, 11, 6], [550, 512, 11, 13, 11, 1], [550, 565, 11, 9, 11, 3], [550, 616, 11, 9, 11, 3], [550, 667, 11, 9, 11, 3], [550, 721, 11, 6, 11, 6], [550, 772, 11, 6, 11, 6], [611, 4, 11, 9, 11, 3], [611, 55, 11, 9, 11, 3], [611, 109, 11, 6, 11, 6], [611, 157, 11, 9, 11, 3], [611, 206, 11, 13, 11, 1], [611, 261, 11, 7, 11, 5], [611, 313, 11, 6, 11, 6], [611, 364, 11, 6, 11, 6], [611, 415, 11, 6, 11, 6], [611, 466, 11, 6, 11, 6], [611, 517, 11, 6, 11, 6], [611, 563, 11, 11, 11, 1], [611, 613, 11, 12, 11, 0], [611, 664, 11, 12, 11, 0], [611, 718, 11, 9, 11, 3], [611, 772, 11, 6, 11, 6], [672, 7, 11, 6, 11, 6], [672, 58, 11, 6, 11, 6], [672, 106, 11, 9, 11, 3], [672, 157, 11, 9, 11, 3], [672, 208, 11, 9, 11, 3], [672, 259, 11, 9, 11, 3], [672, 312, 11, 7, 11, 5], [672, 364, 11, 6, 11, 6], [672, 413, 11, 11, 11, 4], [1, 7, 11, 6, 11, 6], [794, 769, 11, 9, 11, 3], [672, 565, 11, 9, 11, 3], [672, 616, 11, 9, 11, 3], [672, 667, 11, 9, 11, 3], [672, 718, 11, 9, 11, 3], [672, 769, 11, 9, 11, 3], [733, 4, 11, 9, 11, 3], [733, 55, 11, 9, 11, 3], [733, 106, 11, 9, 11, 3], [733, 157, 11, 9, 11, 3], [733, 208, 11, 9, 11, 3], [733, 259, 11, 9, 11, 3], [733, 310, 11, 9, 11, 3], [733, 361, 11, 9, 11, 3], [733, 412, 11, 9, 11, 3], [733, 463, 11, 9, 11, 3], [733, 514, 11, 9, 11, 3], [733, 565, 11, 9, 11, 3], [733, 616, 11, 9, 11, 3], [733, 667, 11, 9, 11, 3], [733, 718, 11, 9, 11, 3], [733, 769, 11, 9, 11, 3], [1, 7, 11, 6, 11, 6], [794, 55, 11, 9, 11, 3], [794, 106, 11, 9, 11, 3], [794, 157, 11, 9, 11, 3], [794, 208, 11, 9, 11, 3], [794, 259, 11, 9, 11, 3], [794, 310, 11, 9, 11, 3], [794, 361, 11, 9, 11, 3], [794, 412, 11, 9, 11, 3], [794, 463, 11, 9, 11, 3], [794, 514, 11, 9, 11, 3], [794, 565, 11, 9, 11, 3], [794, 616, 11, 9, 11, 3], [794, 667, 11, 9, 11, 3], [794, 718, 11, 9, 11, 3], [794, 769, 11, 9, 11, 3], [855, 4, 11, 9, 11, 3], [855, 55, 11, 9, 11, 3], [855, 106, 11, 9, 11, 3], [855, 157, 11, 9, 11, 3], [855, 208, 11, 9, 11, 3], [855, 259, 11, 9, 11, 3], [855, 310, 11, 9, 11, 3], [855, 361, 11, 9, 11, 3], [855, 412, 11, 9, 11, 3], [855, 463, 11, 9, 11, 3], [855, 514, 11, 9, 11, 3], [855, 565, 11, 9, 11, 3], [855, 616, 11, 9, 11, 3], [855, 667, 11, 9, 11, 3], [855, 718, 11, 9, 11, 3], [855, 769, 11, 9, 11, 3]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 13, 11, 11, 3], [1, 106, 14, 5, 11, 3], [1, 157, 15, 8, 11, 3], [1, 207, 15, 13, 11, 2], [1, 259, 15, 11, 11, 3], [1, 310, 13, 11, 11, 3], [1, 361, 13, 5, 11, 3], [1, 411, 15, 13, 11, 2], [1, 462, 13, 13, 11, 2], [1, 514, 15, 8, 11, 3], [1, 567, 13, 7, 11, 5], [1, 623, 10, 6, 11, 10], [1, 672, 13, 3, 11, 8], [1, 725, 10, 4, 11, 10], [1, 769, 15, 12, 11, 3], [62, 4, 15, 11, 11, 3], [62, 55, 13, 11, 11, 3], [62, 106, 15, 11, 11, 3], [62, 157, 15, 11, 11, 3], [62, 208, 14, 11, 11, 3], [62, 259, 15, 11, 11, 3], [62, 310, 14, 11, 11, 3], [62, 361, 15, 11, 11, 3], [62, 412, 15, 11, 11, 3], [62, 463, 15, 11, 11, 3], [62, 517, 12, 8, 11, 6], [62, 568, 12, 10, 11, 6], [62, 617, 14, 9, 11, 4], [62, 670, 14, 5, 11, 6], [62, 719, 13, 9, 11, 4], [62, 769, 15, 11, 11, 3], [123, 6, 14, 9, 11, 5], [123, 55, 15, 11, 11, 3], [123, 106, 15, 11, 11, 3], [123, 157, 15, 11, 11, 3], [123, 208, 15, 11, 11, 3], [123, 259, 15, 11, 11, 3], [123, 310, 15, 11, 11, 3], [123, 361, 15, 11, 11, 3], [123, 412, 15, 11, 11, 3], [123, 463, 13, 11, 11, 3], [123, 514, 15, 11, 11, 3], [123, 565, 15, 11, 11, 3], [123, 616, 11, 11, 11, 3], [123, 667, 15, 11, 11, 3], [123, 718, 15, 11, 11, 3], [123, 769, 15, 11, 11, 3], [184, 4, 15, 11, 11, 3], [184, 55, 15, 13, 11, 3], [184, 106, 15, 11, 11, 3], [184, 157, 15, 11, 11, 3], [184, 208, 15, 11, 11, 3], [184, 259, 15, 11, 11, 3], [184, 310, 15, 11, 11, 3], [184, 361, 15, 11, 11, 3], [184, 412, 15, 11, 11, 3], [184, 463, 15, 11, 11, 3], [184, 514, 15, 11, 11, 3], [184, 564, 15, 13, 11, 2], [184, 616, 11, 12, 11, 3], [184, 666, 15, 13, 11, 2], [184, 718, 14, 5, 11, 3], [184, 777, 12, 3, 11, 11], [245, 4, 14, 4, 11, 3], [245, 58, 14, 8, 11, 6], [245, 106, 13, 11, 11, 3], [245, 160, 13, 8, 11, 6], [245, 208, 15, 11, 11, 3], [245, 262, 13, 8, 11, 6], [245, 310, 15, 11, 11, 3], [245, 364, 14, 11, 11, 6], [245, 412, 13, 11, 11, 3], [245, 463, 13, 11, 11, 3], [245, 514, 13, 14, 11, 3], [245, 565, 13, 11, 11, 3], [245, 616, 13, 11, 11, 3], [245, 670, 13, 8, 11, 6], [245, 721, 13, 8, 11, 6], [245, 772, 13, 8, 11, 6], [306, 7, 13, 10, 11, 6], [306, 58, 14, 10, 11, 6], [306, 109, 13, 8, 11, 6], [306, 160, 13, 8, 11, 6], [306, 209, 12, 10, 11, 4], [306, 262, 14, 8, 11, 6], [306, 313, 14, 8, 11, 6], [306, 364, 14, 8, 11, 6], [306, 415, 14, 8, 11, 6], [306, 466, 14, 11, 11, 6], [306, 517, 14, 8, 11, 6], [306, 564, 15, 13, 11, 2], [306, 615, 14, 13, 11, 2], [306, 666, 13, 13, 11, 2], [306, 718, 15, 4, 11, 3], [306, 766, 1, 1, 3, 1], [367, 2, 15, 13, 11, 1], [367, 52, 16, 14, 11, 0], [367, 106, 15, 14, 11, 3], [367, 155, 15, 13, 11, 1], [367, 205, 16, 14, 11, 0], [367, 257, 15, 13, 11, 1], [367, 308, 15, 13, 11, 1], [367, 361, 14, 11, 11, 3], [367, 412, 14, 11, 11, 3], [367, 463, 14, 11, 11, 3], [367, 515, 14, 10, 11, 4], [367, 565, 15, 11, 11, 3], [367, 615, 15, 12, 11, 2], [367, 670, 13, 11, 11, 6], [367, 718, 14, 11, 11, 3], [367, 769, 13, 11, 11, 3], [428, 4, 14, 11, 11, 3], [428, 56, 14, 10, 11, 4], [428, 106, 14, 11, 11, 3], [428, 157, 13, 11, 11, 3], [428, 208, 14, 11, 11, 3], [428, 260, 14, 10, 11, 4], [428, 310, 15, 11, 11, 3], [428, 361, 14, 11, 11, 3], [428, 412, 13, 11, 11, 3], [428, 463, 14, 11, 11, 3], [428, 515, 14, 10, 11, 4], [428, 565, 15, 11, 11, 3], [428, 616, 14, 11, 11, 3], [428, 667, 14, 11, 11, 3], [428, 718, 14, 11, 11, 3], [428, 770, 14, 10, 11, 4], [489, 4, 14, 7, 11, 3], [489, 55, 14, 6, 11, 3], [489, 108, 13, 10, 11, 5], [489, 157, 14, 11, 11, 3], [489, 207, 15, 12, 11, 2], [489, 262, 13, 7, 11, 6], [489, 310, 15, 11, 11, 3], [489, 361, 15, 12, 11, 3], [489, 413, 13, 10, 10, 4], [489, 464, 13, 10, 10, 4], [489, 514, 15, 5, 11, 3], [489, 565, 14, 4, 11, 3], [489, 616, 14, 3, 11, 3], [489, 669, 14, 7, 11, 5], [489, 718, 15, 11, 11, 3], [489, 769, 15, 11, 11, 3], [550, 8, 13, 5, 11, 7], [550, 57, 13, 9, 11, 5], [550, 107, 14, 10, 11, 4], [550, 158, 13, 10, 11, 4], [550, 208, 15, 11, 11, 3], [550, 262, 14, 10, 11, 6], [550, 311, 14, 10, 11, 4], [550, 361, 15, 11, 11, 3], [550, 412, 15, 11, 11, 3], [550, 466, 14, 8, 11, 6], [550, 512, 16, 15, 11, 1], [550, 565, 15, 9, 11, 3], [550, 616, 15, 9, 11, 3], [550, 667, 15, 11, 11, 3], [550, 721, 13, 8, 11, 6], [550, 772, 13, 8, 11, 6], [611, 4, 13, 11, 11, 3], [611, 55, 13, 11, 11, 3], [611, 110, 13, 5, 11, 7], [611, 157, 15, 11, 11, 3], [611, 206, 16, 15, 11, 1], [611, 261, 14, 7, 11, 5], [611, 313, 12, 8, 11, 6], [611, 364, 14, 8, 11, 6], [611, 415, 13, 8, 11, 6], [611, 471, 11, 3, 11, 11], [611, 511, 1, 1, 11, 1], [611, 563, 15, 13, 11, 1], [611, 613, 16, 14, 11, 0], [611, 664, 16, 14, 11, 0], [611, 718, 15, 11, 11, 3], [611, 772, 13, 8, 11, 6], [672, 9, 12, 3, 11, 8], [672, 60, 13, 3, 11, 8], [672, 106, 15, 5, 11, 3], [672, 157, 15, 5, 11, 3], [672, 208, 14, 5, 11, 3], [672, 259, 14, 5, 11, 3], [672, 312, 13, 7, 11, 5], [672, 364, 13, 7, 11, 6], [672, 413, 14, 13, 11, 4], [1, 1, 1, 1, 11, 1], [794, 769, 15, 11, 11, 3], [672, 565, 15, 11, 11, 3], [672, 616, 15, 11, 11, 3], [672, 667, 15, 11, 11, 3], [672, 718, 15, 11, 11, 3], [672, 769, 15, 11, 11, 3], [733, 4, 15, 11, 11, 3], [733, 55, 15, 11, 11, 3], [733, 106, 15, 11, 11, 3], [733, 157, 15, 11, 11, 3], [733, 208, 15, 11, 11, 3], [733, 259, 15, 11, 11, 3], [733, 310, 15, 11, 11, 3], [733, 361, 15, 11, 11, 3], [733, 412, 15, 11, 11, 3], [733, 463, 15, 11, 11, 3], [733, 514, 15, 11, 11, 3], [733, 565, 15, 11, 11, 3], [733, 616, 15, 11, 11, 3], [733, 667, 15, 11, 11, 3], [733, 718, 15, 11, 11, 3], [733, 769, 15, 11, 11, 3], [1, 1, 1, 1, 11, 1], [794, 55, 15, 11, 11, 3], [794, 106, 15, 11, 11, 3], [794, 157, 15, 11, 11, 3], [794, 208, 15, 11, 11, 3], [794, 259, 15, 11, 11, 3], [794, 310, 15, 11, 11, 3], [794, 361, 15, 11, 11, 3], [794, 412, 15, 11, 11, 3], [794, 463, 15, 11, 11, 3], [794, 514, 15, 11, 11, 3], [794, 565, 15, 11, 11, 3], [794, 616, 15, 11, 11, 3], [794, 667, 15, 11, 11, 3], [794, 718, 15, 11, 11, 3], [794, 769, 15, 11, 11, 3], [855, 4, 15, 11, 11, 3], [855, 55, 15, 11, 11, 3], [855, 106, 15, 11, 11, 3], [855, 157, 15, 11, 11, 3], [855, 208, 15, 11, 11, 3], [855, 259, 15, 11, 11, 3], [855, 310, 15, 11, 11, 3], [855, 361, 15, 11, 11, 3], [855, 412, 15, 11, 11, 3], [855, 463, 15, 11, 11, 3], [855, 514, 15, 11, 11, 3], [855, 565, 15, 11, 11, 3], [855, 616, 15, 11, 11, 3], [855, 667, 15, 11, 11, 3], [855, 718, 15, 11, 11, 3], [855, 769, 15, 11, 11, 3]], \"capHeight\": 13, \"widestlogicalchar\": 11, \"widestglyph\": 16, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 4, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 55, 12, 9, 10, 3], [1, 106, 13, 3, 10, 3], [1, 157, 14, 6, 10, 3], [1, 207, 14, 11, 10, 2], [1, 259, 14, 9, 10, 3], [1, 310, 12, 9, 10, 3], [1, 361, 12, 3, 10, 3], [1, 411, 14, 11, 10, 2], [1, 462, 12, 11, 10, 2], [1, 514, 14, 6, 10, 3], [1, 567, 12, 5, 10, 5], [1, 623, 9, 4, 10, 10], [1, 672, 12, 1, 10, 8], [1, 725, 9, 2, 10, 10], [1, 769, 14, 10, 10, 3], [62, 4, 14, 9, 10, 3], [62, 55, 12, 9, 10, 3], [62, 106, 14, 9, 10, 3], [62, 157, 14, 9, 10, 3], [62, 208, 13, 9, 10, 3], [62, 259, 14, 9, 10, 3], [62, 310, 13, 9, 10, 3], [62, 361, 14, 9, 10, 3], [62, 412, 14, 9, 10, 3], [62, 463, 14, 9, 10, 3], [62, 517, 11, 6, 10, 6], [62, 568, 11, 8, 10, 6], [62, 617, 13, 7, 10, 4], [62, 670, 13, 3, 10, 6], [62, 719, 12, 7, 10, 4], [62, 769, 14, 9, 10, 3], [123, 6, 13, 7, 10, 5], [123, 55, 14, 9, 10, 3], [123, 106, 14, 9, 10, 3], [123, 157, 14, 9, 10, 3], [123, 208, 14, 9, 10, 3], [123, 259, 14, 9, 10, 3], [123, 310, 14, 9, 10, 3], [123, 361, 14, 9, 10, 3], [123, 412, 14, 9, 10, 3], [123, 463, 12, 9, 10, 3], [123, 514, 14, 9, 10, 3], [123, 565, 14, 9, 10, 3], [123, 616, 10, 9, 10, 3], [123, 667, 14, 9, 10, 3], [123, 718, 14, 9, 10, 3], [123, 769, 14, 9, 10, 3], [184, 4, 14, 9, 10, 3], [184, 55, 14, 11, 10, 3], [184, 106, 14, 9, 10, 3], [184, 157, 14, 9, 10, 3], [184, 208, 14, 9, 10, 3], [184, 259, 14, 9, 10, 3], [184, 310, 14, 9, 10, 3], [184, 361, 14, 9, 10, 3], [184, 412, 14, 9, 10, 3], [184, 463, 14, 9, 10, 3], [184, 514, 14, 9, 10, 3], [184, 564, 14, 11, 10, 2], [184, 616, 10, 10, 10, 3], [184, 666, 14, 11, 10, 2], [184, 718, 13, 3, 10, 3], [184, 777, 11, 1, 10, 11], [245, 4, 13, 2, 10, 3], [245, 58, 13, 6, 10, 6], [245, 106, 12, 9, 10, 3], [245, 160, 12, 6, 10, 6], [245, 208, 14, 9, 10, 3], [245, 262, 12, 6, 10, 6], [245, 310, 14, 9, 10, 3], [245, 364, 13, 9, 10, 6], [245, 412, 12, 9, 10, 3], [245, 463, 12, 9, 10, 3], [245, 514, 12, 12, 10, 3], [245, 565, 12, 9, 10, 3], [245, 616, 12, 9, 10, 3], [245, 670, 12, 6, 10, 6], [245, 721, 12, 6, 10, 6], [245, 772, 12, 6, 10, 6], [306, 7, 12, 8, 10, 6], [306, 58, 13, 8, 10, 6], [306, 109, 12, 6, 10, 6], [306, 160, 12, 6, 10, 6], [306, 209, 11, 8, 10, 4], [306, 262, 13, 6, 10, 6], [306, 313, 13, 6, 10, 6], [306, 364, 13, 6, 10, 6], [306, 415, 13, 6, 10, 6], [306, 466, 13, 9, 10, 6], [306, 517, 13, 6, 10, 6], [306, 564, 14, 11, 10, 2], [306, 615, 13, 11, 10, 2], [306, 666, 12, 11, 10, 2], [306, 718, 14, 2, 10, 3], [306, 766, 1, 1, 3, 1], [367, 2, 14, 11, 10, 1], [367, 52, 15, 12, 10, 0], [367, 106, 14, 12, 10, 3], [367, 155, 14, 11, 10, 1], [367, 205, 14, 12, 10, 0], [367, 257, 14, 11, 10, 1], [367, 308, 14, 11, 10, 1], [367, 361, 13, 9, 10, 3], [367, 412, 13, 9, 10, 3], [367, 463, 13, 9, 10, 3], [367, 515, 13, 8, 10, 4], [367, 565, 14, 9, 10, 3], [367, 615, 14, 10, 10, 2], [367, 670, 12, 9, 10, 6], [367, 718, 13, 9, 10, 3], [367, 769, 12, 9, 10, 3], [428, 4, 13, 9, 10, 3], [428, 56, 13, 8, 10, 4], [428, 106, 13, 9, 10, 3], [428, 157, 12, 9, 10, 3], [428, 208, 13, 9, 10, 3], [428, 260, 13, 8, 10, 4], [428, 310, 14, 9, 10, 3], [428, 361, 13, 9, 10, 3], [428, 412, 12, 9, 10, 3], [428, 463, 13, 9, 10, 3], [428, 515, 13, 8, 10, 4], [428, 565, 14, 9, 10, 3], [428, 616, 13, 9, 10, 3], [428, 667, 13, 9, 10, 3], [428, 718, 13, 9, 10, 3], [428, 770, 13, 8, 10, 4], [489, 4, 13, 5, 10, 3], [489, 55, 13, 4, 10, 3], [489, 108, 12, 8, 10, 5], [489, 157, 13, 9, 10, 3], [489, 207, 14, 10, 10, 2], [489, 262, 12, 5, 10, 6], [489, 310, 14, 9, 10, 3], [489, 361, 14, 10, 10, 3], [489, 413, 12, 8, 9, 4], [489, 464, 12, 8, 9, 4], [489, 514, 14, 3, 10, 3], [489, 565, 13, 2, 10, 3], [489, 616, 13, 1, 10, 3], [489, 669, 13, 5, 10, 5], [489, 718, 14, 9, 10, 3], [489, 769, 14, 9, 10, 3], [550, 8, 12, 3, 10, 7], [550, 57, 12, 7, 10, 5], [550, 107, 13, 8, 10, 4], [550, 158, 12, 8, 10, 4], [550, 208, 14, 9, 10, 3], [550, 262, 13, 8, 10, 6], [550, 311, 13, 8, 10, 4], [550, 361, 14, 9, 10, 3], [550, 412, 14, 9, 10, 3], [550, 466, 13, 6, 10, 6], [550, 512, 15, 13, 10, 1], [550, 565, 14, 7, 10, 3], [550, 616, 14, 7, 10, 3], [550, 667, 14, 9, 10, 3], [550, 721, 12, 6, 10, 6], [550, 772, 12, 6, 10, 6], [611, 4, 12, 9, 10, 3], [611, 55, 12, 9, 10, 3], [611, 110, 12, 3, 10, 7], [611, 157, 14, 9, 10, 3], [611, 206, 15, 13, 10, 1], [611, 261, 13, 5, 10, 5], [611, 313, 11, 6, 10, 6], [611, 364, 13, 6, 10, 6], [611, 415, 12, 6, 10, 6], [611, 471, 10, 1, 10, 11], [611, 511, 1, 1, 10, 1], [611, 563, 14, 11, 10, 1], [611, 613, 14, 12, 10, 0], [611, 664, 14, 12, 10, 0], [611, 718, 14, 9, 10, 3], [611, 772, 12, 6, 10, 6], [672, 9, 11, 1, 10, 8], [672, 60, 12, 1, 10, 8], [672, 106, 14, 3, 10, 3], [672, 157, 14, 3, 10, 3], [672, 208, 13, 3, 10, 3], [672, 259, 13, 3, 10, 3], [672, 312, 12, 5, 10, 5], [672, 364, 12, 5, 10, 6], [672, 413, 13, 11, 10, 4], [1, 1, 1, 1, 10, 1], [794, 769, 14, 9, 10, 3], [672, 565, 14, 9, 10, 3], [672, 616, 14, 9, 10, 3], [672, 667, 14, 9, 10, 3], [672, 718, 14, 9, 10, 3], [672, 769, 14, 9, 10, 3], [733, 4, 14, 9, 10, 3], [733, 55, 14, 9, 10, 3], [733, 106, 14, 9, 10, 3], [733, 157, 14, 9, 10, 3], [733, 208, 14, 9, 10, 3], [733, 259, 14, 9, 10, 3], [733, 310, 14, 9, 10, 3], [733, 361, 14, 9, 10, 3], [733, 412, 14, 9, 10, 3], [733, 463, 14, 9, 10, 3], [733, 514, 14, 9, 10, 3], [733, 565, 14, 9, 10, 3], [733, 616, 14, 9, 10, 3], [733, 667, 14, 9, 10, 3], [733, 718, 14, 9, 10, 3], [733, 769, 14, 9, 10, 3], [1, 1, 1, 1, 10, 1], [794, 55, 14, 9, 10, 3], [794, 106, 14, 9, 10, 3], [794, 157, 14, 9, 10, 3], [794, 208, 14, 9, 10, 3], [794, 259, 14, 9, 10, 3], [794, 310, 14, 9, 10, 3], [794, 361, 14, 9, 10, 3], [794, 412, 14, 9, 10, 3], [794, 463, 14, 9, 10, 3], [794, 514, 14, 9, 10, 3], [794, 565, 14, 9, 10, 3], [794, 616, 14, 9, 10, 3], [794, 667, 14, 9, 10, 3], [794, 718, 14, 9, 10, 3], [794, 769, 14, 9, 10, 3], [855, 4, 14, 9, 10, 3], [855, 55, 14, 9, 10, 3], [855, 106, 14, 9, 10, 3], [855, 157, 14, 9, 10, 3], [855, 208, 14, 9, 10, 3], [855, 259, 14, 9, 10, 3], [855, 310, 14, 9, 10, 3], [855, 361, 14, 9, 10, 3], [855, 412, 14, 9, 10, 3], [855, 463, 14, 9, 10, 3], [855, 514, 14, 9, 10, 3], [855, 565, 14, 9, 10, 3], [855, 616, 14, 9, 10, 3], [855, 667, 14, 9, 10, 3], [855, 718, 14, 9, 10, 3], [855, 769, 14, 9, 10, 3]], \"capHeight\": 12, \"widestlogicalchar\": 10, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 11, 6, 11, 7], [1, 55, 11, 11, 11, 3], [1, 106, 11, 10, 11, 3], [1, 157, 11, 10, 11, 3], [1, 207, 11, 13, 11, 2], [1, 259, 11, 11, 11, 3], [1, 310, 11, 11, 11, 3], [1, 361, 11, 10, 11, 3], [1, 411, 11, 13, 11, 2], [1, 462, 11, 13, 11, 2], [1, 514, 11, 10, 11, 3], [1, 567, 11, 8, 11, 5], [1, 620, 11, 9, 11, 7], [1, 671, 11, 6, 11, 7], [1, 722, 11, 7, 11, 7], [1, 769, 11, 12, 11, 3], [62, 4, 11, 11, 11, 3], [62, 55, 11, 11, 11, 3], [62, 106, 11, 11, 11, 3], [62, 157, 11, 11, 11, 3], [62, 208, 11, 11, 11, 3], [62, 259, 11, 11, 11, 3], [62, 310, 11, 11, 11, 3], [62, 361, 11, 11, 11, 3], [62, 412, 11, 11, 11, 3], [62, 463, 11, 11, 11, 3], [62, 517, 11, 8, 11, 6], [62, 568, 11, 10, 11, 6], [62, 617, 11, 9, 11, 4], [62, 670, 11, 7, 11, 6], [62, 719, 11, 9, 11, 4], [62, 769, 11, 11, 11, 3], [123, 6, 11, 9, 11, 5], [123, 55, 11, 11, 11, 3], [123, 106, 11, 11, 11, 3], [123, 157, 11, 11, 11, 3], [123, 208, 11, 11, 11, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 11, 11, 11, 3], [123, 412, 11, 11, 11, 3], [123, 463, 11, 11, 11, 3], [123, 514, 11, 11, 11, 3], [123, 565, 11, 11, 11, 3], [123, 616, 11, 11, 11, 3], [123, 667, 11, 11, 11, 3], [123, 718, 11, 11, 11, 3], [123, 769, 11, 11, 11, 3], [184, 4, 11, 11, 11, 3], [184, 55, 11, 13, 11, 3], [184, 106, 11, 11, 11, 3], [184, 157, 11, 11, 11, 3], [184, 208, 11, 11, 11, 3], [184, 259, 11, 11, 11, 3], [184, 310, 11, 11, 11, 3], [184, 361, 11, 11, 11, 3], [184, 412, 11, 11, 11, 3], [184, 463, 11, 11, 11, 3], [184, 514, 11, 11, 11, 3], [184, 564, 11, 13, 11, 2], [184, 616, 11, 12, 11, 3], [184, 666, 11, 13, 11, 2], [184, 718, 11, 10, 11, 3], [184, 773, 11, 7, 11, 7], [245, 4, 11, 10, 11, 3], [245, 58, 11, 8, 11, 6], [245, 106, 11, 11, 11, 3], [245, 160, 11, 8, 11, 6], [245, 208, 11, 11, 11, 3], [245, 262, 11, 8, 11, 6], [245, 310, 11, 11, 11, 3], [245, 364, 11, 11, 11, 6], [245, 412, 11, 11, 11, 3], [245, 463, 11, 11, 11, 3], [245, 514, 11, 14, 11, 3], [245, 565, 11, 11, 11, 3], [245, 616, 11, 11, 11, 3], [245, 670, 11, 8, 11, 6], [245, 721, 11, 8, 11, 6], [245, 772, 11, 8, 11, 6], [306, 7, 11, 10, 11, 6], [306, 58, 11, 10, 11, 6], [306, 109, 11, 8, 11, 6], [306, 160, 11, 8, 11, 6], [306, 209, 11, 10, 11, 4], [306, 262, 11, 8, 11, 6], [306, 313, 11, 8, 11, 6], [306, 364, 11, 8, 11, 6], [306, 415, 11, 8, 11, 6], [306, 466, 11, 11, 11, 6], [306, 517, 11, 8, 11, 6], [306, 564, 11, 13, 11, 2], [306, 615, 11, 13, 11, 2], [306, 666, 11, 13, 11, 2], [306, 718, 11, 10, 11, 3], [306, 773, 3, 6, 3, 7], [367, 2, 11, 13, 11, 1], [367, 52, 11, 14, 11, 0], [367, 106, 11, 14, 11, 3], [367, 155, 11, 13, 11, 1], [367, 205, 11, 14, 11, 0], [367, 257, 11, 13, 11, 1], [367, 308, 11, 13, 11, 1], [367, 361, 11, 11, 11, 3], [367, 412, 11, 11, 11, 3], [367, 463, 11, 11, 11, 3], [367, 515, 11, 10, 11, 4], [367, 565, 11, 11, 11, 3], [367, 615, 11, 12, 11, 2], [367, 670, 11, 11, 11, 6], [367, 718, 11, 11, 11, 3], [367, 769, 11, 11, 11, 3], [428, 4, 11, 11, 11, 3], [428, 56, 11, 10, 11, 4], [428, 106, 11, 11, 11, 3], [428, 157, 11, 11, 11, 3], [428, 208, 11, 11, 11, 3], [428, 260, 11, 10, 11, 4], [428, 310, 11, 11, 11, 3], [428, 361, 11, 11, 11, 3], [428, 412, 11, 11, 11, 3], [428, 463, 11, 11, 11, 3], [428, 515, 11, 10, 11, 4], [428, 565, 11, 11, 11, 3], [428, 616, 11, 11, 11, 3], [428, 667, 11, 11, 11, 3], [428, 718, 11, 11, 11, 3], [428, 770, 11, 10, 11, 4], [489, 4, 11, 10, 11, 3], [489, 55, 11, 10, 11, 3], [489, 108, 11, 10, 11, 5], [489, 157, 11, 11, 11, 3], [489, 207, 11, 12, 11, 2], [489, 262, 11, 7, 11, 6], [489, 310, 11, 11, 11, 3], [489, 361, 11, 12, 11, 3], [489, 413, 10, 10, 10, 4], [489, 464, 10, 10, 10, 4], [489, 514, 11, 10, 11, 3], [489, 565, 11, 10, 11, 3], [489, 616, 11, 10, 11, 3], [489, 669, 11, 8, 11, 5], [489, 718, 11, 11, 11, 3], [489, 769, 11, 11, 11, 3], [550, 8, 11, 6, 11, 7], [550, 57, 11, 9, 11, 5], [550, 107, 11, 10, 11, 4], [550, 158, 11, 10, 11, 4], [550, 208, 11, 11, 11, 3], [550, 262, 11, 10, 11, 6], [550, 311, 11, 10, 11, 4], [550, 361, 11, 11, 11, 3], [550, 412, 11, 11, 11, 3], [550, 466, 11, 8, 11, 6], [550, 512, 11, 15, 11, 1], [550, 565, 11, 10, 11, 3], [550, 616, 11, 10, 11, 3], [550, 667, 11, 11, 11, 3], [550, 721, 11, 8, 11, 6], [550, 772, 11, 8, 11, 6], [611, 4, 11, 11, 11, 3], [611, 55, 11, 11, 11, 3], [611, 110, 11, 6, 11, 7], [611, 157, 11, 11, 11, 3], [611, 206, 11, 15, 11, 1], [611, 261, 11, 8, 11, 5], [611, 313, 11, 8, 11, 6], [611, 364, 11, 8, 11, 6], [611, 415, 11, 8, 11, 6], [611, 467, 11, 7, 11, 7], [611, 518, 11, 6, 11, 7], [611, 563, 11, 13, 11, 1], [611, 613, 11, 14, 11, 0], [611, 664, 11, 14, 11, 0], [611, 718, 11, 11, 11, 3], [611, 772, 11, 8, 11, 6], [672, 8, 11, 6, 11, 7], [672, 59, 11, 6, 11, 7], [672, 106, 11, 10, 11, 3], [672, 157, 11, 10, 11, 3], [672, 208, 11, 10, 11, 3], [672, 259, 11, 10, 11, 3], [672, 312, 11, 8, 11, 5], [672, 364, 11, 7, 11, 6], [672, 413, 11, 13, 11, 4], [1, 8, 11, 6, 11, 7], [794, 769, 11, 11, 11, 3], [672, 565, 11, 11, 11, 3], [672, 616, 11, 11, 11, 3], [672, 667, 11, 11, 11, 3], [672, 718, 11, 11, 11, 3], [672, 769, 11, 11, 11, 3], [733, 4, 11, 11, 11, 3], [733, 55, 11, 11, 11, 3], [733, 106, 11, 11, 11, 3], [733, 157, 11, 11, 11, 3], [733, 208, 11, 11, 11, 3], [733, 259, 11, 11, 11, 3], [733, 310, 11, 11, 11, 3], [733, 361, 11, 11, 11, 3], [733, 412, 11, 11, 11, 3], [733, 463, 11, 11, 11, 3], [733, 514, 11, 11, 11, 3], [733, 565, 11, 11, 11, 3], [733, 616, 11, 11, 11, 3], [733, 667, 11, 11, 11, 3], [733, 718, 11, 11, 11, 3], [733, 769, 11, 11, 11, 3], [1, 8, 11, 6, 11, 7], [794, 55, 11, 11, 11, 3], [794, 106, 11, 11, 11, 3], [794, 157, 11, 11, 11, 3], [794, 208, 11, 11, 11, 3], [794, 259, 11, 11, 11, 3], [794, 310, 11, 11, 11, 3], [794, 361, 11, 11, 11, 3], [794, 412, 11, 11, 11, 3], [794, 463, 11, 11, 11, 3], [794, 514, 11, 11, 11, 3], [794, 565, 11, 11, 11, 3], [794, 616, 11, 11, 11, 3], [794, 667, 11, 11, 11, 3], [794, 718, 11, 11, 11, 3], [794, 769, 11, 11, 11, 3], [855, 4, 11, 11, 11, 3], [855, 55, 11, 11, 11, 3], [855, 106, 11, 11, 11, 3], [855, 157, 11, 11, 11, 3], [855, 208, 11, 11, 11, 3], [855, 259, 11, 11, 11, 3], [855, 310, 11, 11, 11, 3], [855, 361, 11, 11, 11, 3], [855, 412, 11, 11, 11, 3], [855, 463, 11, 11, 11, 3], [855, 514, 11, 11, 11, 3], [855, 565, 11, 11, 11, 3], [855, 616, 11, 11, 11, 3], [855, 667, 11, 11, 11, 3], [855, 718, 11, 11, 11, 3], [855, 769, 11, 11, 11, 3]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 10, 6, 10, 6], [1, 55, 10, 9, 10, 3], [1, 106, 10, 9, 10, 3], [1, 157, 10, 9, 10, 3], [1, 207, 10, 11, 10, 2], [1, 259, 10, 9, 10, 3], [1, 310, 10, 9, 10, 3], [1, 361, 10, 9, 10, 3], [1, 411, 10, 11, 10, 2], [1, 462, 10, 11, 10, 2], [1, 514, 10, 9, 10, 3], [1, 567, 10, 7, 10, 5], [1, 619, 10, 8, 10, 6], [1, 670, 10, 6, 10, 6], [1, 721, 10, 6, 10, 6], [1, 769, 10, 10, 10, 3], [62, 4, 10, 9, 10, 3], [62, 55, 10, 9, 10, 3], [62, 106, 10, 9, 10, 3], [62, 157, 10, 9, 10, 3], [62, 208, 10, 9, 10, 3], [62, 259, 10, 9, 10, 3], [62, 310, 10, 9, 10, 3], [62, 361, 10, 9, 10, 3], [62, 412, 10, 9, 10, 3], [62, 463, 10, 9, 10, 3], [62, 517, 10, 6, 10, 6], [62, 568, 10, 8, 10, 6], [62, 617, 10, 8, 10, 4], [62, 670, 10, 6, 10, 6], [62, 719, 10, 8, 10, 4], [62, 769, 10, 9, 10, 3], [123, 6, 10, 7, 10, 5], [123, 55, 10, 9, 10, 3], [123, 106, 10, 9, 10, 3], [123, 157, 10, 9, 10, 3], [123, 208, 10, 9, 10, 3], [123, 259, 10, 9, 10, 3], [123, 310, 10, 9, 10, 3], [123, 361, 10, 9, 10, 3], [123, 412, 10, 9, 10, 3], [123, 463, 10, 9, 10, 3], [123, 514, 10, 9, 10, 3], [123, 565, 10, 9, 10, 3], [123, 616, 10, 9, 10, 3], [123, 667, 10, 9, 10, 3], [123, 718, 10, 9, 10, 3], [123, 769, 10, 9, 10, 3], [184, 4, 10, 9, 10, 3], [184, 55, 10, 11, 10, 3], [184, 106, 10, 9, 10, 3], [184, 157, 10, 9, 10, 3], [184, 208, 10, 9, 10, 3], [184, 259, 10, 9, 10, 3], [184, 310, 10, 9, 10, 3], [184, 361, 10, 9, 10, 3], [184, 412, 10, 9, 10, 3], [184, 463, 10, 9, 10, 3], [184, 514, 10, 9, 10, 3], [184, 564, 10, 11, 10, 2], [184, 616, 10, 10, 10, 3], [184, 666, 10, 11, 10, 2], [184, 718, 10, 9, 10, 3], [184, 772, 10, 6, 10, 6], [245, 4, 10, 9, 10, 3], [245, 58, 10, 6, 10, 6], [245, 106, 10, 9, 10, 3], [245, 160, 10, 6, 10, 6], [245, 208, 10, 9, 10, 3], [245, 262, 10, 6, 10, 6], [245, 310, 10, 9, 10, 3], [245, 364, 10, 9, 10, 6], [245, 412, 10, 9, 10, 3], [245, 463, 10, 9, 10, 3], [245, 514, 10, 12, 10, 3], [245, 565, 10, 9, 10, 3], [245, 616, 10, 9, 10, 3], [245, 670, 10, 6, 10, 6], [245, 721, 10, 6, 10, 6], [245, 772, 10, 6, 10, 6], [306, 7, 10, 8, 10, 6], [306, 58, 10, 8, 10, 6], [306, 109, 10, 6, 10, 6], [306, 160, 10, 6, 10, 6], [306, 209, 10, 8, 10, 4], [306, 262, 10, 6, 10, 6], [306, 313, 10, 6, 10, 6], [306, 364, 10, 6, 10, 6], [306, 415, 10, 6, 10, 6], [306, 466, 10, 9, 10, 6], [306, 517, 10, 6, 10, 6], [306, 564, 10, 11, 10, 2], [306, 615, 10, 11, 10, 2], [306, 666, 10, 11, 10, 2], [306, 718, 10, 9, 10, 3], [306, 772, 3, 6, 3, 6], [367, 2, 10, 11, 10, 1], [367, 52, 10, 12, 10, 0], [367, 106, 10, 12, 10, 3], [367, 155, 10, 11, 10, 1], [367, 205, 10, 12, 10, 0], [367, 257, 10, 11, 10, 1], [367, 308, 10, 11, 10, 1], [367, 361, 10, 9, 10, 3], [367, 412, 10, 9, 10, 3], [367, 463, 10, 9, 10, 3], [367, 515, 10, 8, 10, 4], [367, 565, 10, 9, 10, 3], [367, 615, 10, 10, 10, 2], [367, 670, 10, 9, 10, 6], [367, 718, 10, 9, 10, 3], [367, 769, 10, 9, 10, 3], [428, 4, 10, 9, 10, 3], [428, 56, 10, 8, 10, 4], [428, 106, 10, 9, 10, 3], [428, 157, 10, 9, 10, 3], [428, 208, 10, 9, 10, 3], [428, 260, 10, 8, 10, 4], [428, 310, 10, 9, 10, 3], [428, 361, 10, 9, 10, 3], [428, 412, 10, 9, 10, 3], [428, 463, 10, 9, 10, 3], [428, 515, 10, 8, 10, 4], [428, 565, 10, 9, 10, 3], [428, 616, 10, 9, 10, 3], [428, 667, 10, 9, 10, 3], [428, 718, 10, 9, 10, 3], [428, 770, 10, 8, 10, 4], [489, 4, 10, 9, 10, 3], [489, 55, 10, 9, 10, 3], [489, 108, 10, 8, 10, 5], [489, 157, 10, 9, 10, 3], [489, 207, 10, 10, 10, 2], [489, 262, 10, 6, 10, 6], [489, 310, 10, 9, 10, 3], [489, 361, 10, 10, 10, 3], [489, 413, 9, 8, 9, 4], [489, 464, 9, 8, 9, 4], [489, 514, 10, 9, 10, 3], [489, 565, 10, 9, 10, 3], [489, 616, 10, 9, 10, 3], [489, 669, 10, 7, 10, 5], [489, 718, 10, 9, 10, 3], [489, 769, 10, 9, 10, 3], [550, 7, 10, 6, 10, 6], [550, 57, 10, 7, 10, 5], [550, 107, 10, 8, 10, 4], [550, 158, 10, 8, 10, 4], [550, 208, 10, 9, 10, 3], [550, 262, 10, 8, 10, 6], [550, 311, 10, 8, 10, 4], [550, 361, 10, 9, 10, 3], [550, 412, 10, 9, 10, 3], [550, 466, 10, 6, 10, 6], [550, 512, 10, 13, 10, 1], [550, 565, 10, 9, 10, 3], [550, 616, 10, 9, 10, 3], [550, 667, 10, 9, 10, 3], [550, 721, 10, 6, 10, 6], [550, 772, 10, 6, 10, 6], [611, 4, 10, 9, 10, 3], [611, 55, 10, 9, 10, 3], [611, 109, 10, 6, 10, 6], [611, 157, 10, 9, 10, 3], [611, 206, 10, 13, 10, 1], [611, 261, 10, 7, 10, 5], [611, 313, 10, 6, 10, 6], [611, 364, 10, 6, 10, 6], [611, 415, 10, 6, 10, 6], [611, 466, 10, 6, 10, 6], [611, 517, 10, 6, 10, 6], [611, 563, 10, 11, 10, 1], [611, 613, 10, 12, 10, 0], [611, 664, 10, 12, 10, 0], [611, 718, 10, 9, 10, 3], [611, 772, 10, 6, 10, 6], [672, 7, 10, 6, 10, 6], [672, 58, 10, 6, 10, 6], [672, 106, 10, 9, 10, 3], [672, 157, 10, 9, 10, 3], [672, 208, 10, 9, 10, 3], [672, 259, 10, 9, 10, 3], [672, 312, 10, 7, 10, 5], [672, 364, 10, 6, 10, 6], [672, 413, 10, 11, 10, 4], [1, 7, 10, 6, 10, 6], [794, 769, 10, 9, 10, 3], [672, 565, 10, 9, 10, 3], [672, 616, 10, 9, 10, 3], [672, 667, 10, 9, 10, 3], [672, 718, 10, 9, 10, 3], [672, 769, 10, 9, 10, 3], [733, 4, 10, 9, 10, 3], [733, 55, 10, 9, 10, 3], [733, 106, 10, 9, 10, 3], [733, 157, 10, 9, 10, 3], [733, 208, 10, 9, 10, 3], [733, 259, 10, 9, 10, 3], [733, 310, 10, 9, 10, 3], [733, 361, 10, 9, 10, 3], [733, 412, 10, 9, 10, 3], [733, 463, 10, 9, 10, 3], [733, 514, 10, 9, 10, 3], [733, 565, 10, 9, 10, 3], [733, 616, 10, 9, 10, 3], [733, 667, 10, 9, 10, 3], [733, 718, 10, 9, 10, 3], [733, 769, 10, 9, 10, 3], [1, 7, 10, 6, 10, 6], [794, 55, 10, 9, 10, 3], [794, 106, 10, 9, 10, 3], [794, 157, 10, 9, 10, 3], [794, 208, 10, 9, 10, 3], [794, 259, 10, 9, 10, 3], [794, 310, 10, 9, 10, 3], [794, 361, 10, 9, 10, 3], [794, 412, 10, 9, 10, 3], [794, 463, 10, 9, 10, 3], [794, 514, 10, 9, 10, 3], [794, 565, 10, 9, 10, 3], [794, 616, 10, 9, 10, 3], [794, 667, 10, 9, 10, 3], [794, 718, 10, 9, 10, 3], [794, 769, 10, 9, 10, 3], [855, 4, 10, 9, 10, 3], [855, 55, 10, 9, 10, 3], [855, 106, 10, 9, 10, 3], [855, 157, 10, 9, 10, 3], [855, 208, 10, 9, 10, 3], [855, 259, 10, 9, 10, 3], [855, 310, 10, 9, 10, 3], [855, 361, 10, 9, 10, 3], [855, 412, 10, 9, 10, 3], [855, 463, 10, 9, 10, 3], [855, 514, 10, 9, 10, 3], [855, 565, 10, 9, 10, 3], [855, 616, 10, 9, 10, 3], [855, 667, 10, 9, 10, 3], [855, 718, 10, 9, 10, 3], [855, 769, 10, 9, 10, 3]], \"widestlogicalchar\": 10, \"widestglyph\": 10, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 13, 1], [1, 55, 13, 13, 13, 3], [1, 106, 16, 6, 13, 3], [1, 157, 16, 13, 13, 3], [1, 207, 14, 15, 13, 2], [1, 259, 17, 13, 13, 3], [1, 310, 14, 13, 13, 3], [1, 361, 13, 6, 13, 3], [1, 412, 16, 16, 13, 3], [1, 463, 14, 16, 13, 3], [1, 514, 14, 8, 13, 3], [1, 569, 13, 9, 13, 7], [1, 625, 11, 7, 13, 12], [1, 673, 14, 3, 13, 9], [1, 727, 10, 4, 13, 12], [1, 769, 16, 13, 13, 3], [62, 4, 15, 13, 13, 3], [62, 55, 14, 13, 13, 3], [62, 106, 15, 13, 13, 3], [62, 157, 14, 13, 13, 3], [62, 208, 15, 13, 13, 3], [62, 259, 16, 13, 13, 3], [62, 310, 15, 13, 13, 3], [62, 361, 15, 13, 13, 3], [62, 412, 15, 13, 13, 3], [62, 463, 14, 13, 13, 3], [62, 517, 12, 10, 13, 6], [62, 568, 12, 13, 13, 6], [62, 620, 15, 9, 13, 7], [62, 673, 14, 5, 13, 9], [62, 722, 14, 9, 13, 7], [62, 769, 15, 13, 13, 3], [123, 4, 16, 13, 13, 3], [123, 55, 13, 13, 13, 3], [123, 106, 15, 13, 13, 3], [123, 157, 16, 13, 13, 3], [123, 208, 15, 13, 13, 3], [123, 259, 15, 13, 13, 3], [123, 310, 16, 13, 13, 3], [123, 361, 16, 13, 13, 3], [123, 412, 16, 13, 13, 3], [123, 463, 15, 13, 13, 3], [123, 514, 15, 13, 13, 3], [123, 565, 16, 13, 13, 3], [123, 616, 12, 13, 13, 3], [123, 667, 17, 13, 13, 3], [123, 718, 16, 13, 13, 3], [123, 769, 15, 13, 13, 3], [184, 4, 15, 13, 13, 3], [184, 55, 15, 16, 13, 3], [184, 106, 14, 13, 13, 3], [184, 157, 15, 13, 13, 3], [184, 208, 16, 13, 13, 3], [184, 259, 16, 13, 13, 3], [184, 310, 17, 13, 13, 3], [184, 361, 15, 13, 13, 3], [184, 412, 15, 13, 13, 3], [184, 463, 17, 13, 13, 3], [184, 514, 16, 13, 13, 3], [184, 565, 17, 16, 13, 3], [184, 616, 13, 13, 13, 3], [184, 667, 15, 16, 13, 3], [184, 719, 13, 8, 13, 4], [184, 780, 12, 3, 13, 14], [245, 4, 12, 4, 13, 3], [245, 58, 15, 10, 13, 6], [245, 106, 14, 13, 13, 3], [245, 160, 15, 10, 13, 6], [245, 208, 16, 13, 13, 3], [245, 262, 14, 10, 13, 6], [245, 310, 17, 13, 13, 3], [245, 364, 15, 13, 13, 6], [245, 412, 14, 13, 13, 3], [245, 463, 13, 13, 13, 3], [245, 514, 15, 16, 13, 3], [245, 565, 14, 13, 13, 3], [245, 616, 13, 13, 13, 3], [245, 670, 14, 10, 13, 6], [245, 721, 14, 10, 13, 6], [245, 772, 14, 10, 13, 6], [306, 7, 14, 13, 13, 6], [306, 58, 15, 13, 13, 6], [306, 109, 15, 10, 13, 6], [306, 160, 14, 10, 13, 6], [306, 209, 14, 12, 13, 4], [306, 262, 15, 10, 13, 6], [306, 313, 16, 10, 13, 6], [306, 364, 14, 10, 13, 6], [306, 415, 13, 10, 13, 6], [306, 466, 15, 13, 13, 6], [306, 517, 15, 10, 13, 6], [306, 565, 16, 16, 13, 3], [306, 616, 13, 13, 13, 3], [306, 667, 14, 16, 13, 3], [306, 723, 14, 5, 13, 8], [306, 769, 15, 13, 13, 3], [367, 2, 15, 15, 13, 1], [367, 53, 15, 15, 13, 1], [367, 106, 16, 16, 13, 3], [367, 154, 15, 16, 13, 0], [367, 205, 16, 16, 13, 0], [367, 257, 15, 15, 13, 1], [367, 308, 16, 15, 13, 1], [367, 361, 15, 13, 13, 3], [367, 412, 15, 13, 13, 3], [367, 463, 15, 13, 13, 3], [367, 515, 15, 12, 13, 4], [367, 565, 15, 13, 13, 3], [367, 616, 15, 13, 13, 3], [367, 670, 14, 13, 13, 6], [367, 718, 15, 13, 13, 3], [367, 769, 14, 13, 13, 3], [428, 4, 14, 13, 13, 3], [428, 56, 14, 12, 13, 4], [428, 106, 14, 13, 13, 3], [428, 157, 12, 13, 13, 3], [428, 208, 14, 13, 13, 3], [428, 260, 14, 12, 13, 4], [428, 310, 13, 13, 13, 3], [428, 361, 14, 13, 13, 3], [428, 412, 14, 13, 13, 3], [428, 463, 14, 13, 13, 3], [428, 515, 14, 12, 13, 4], [428, 565, 14, 13, 13, 3], [428, 616, 15, 13, 13, 3], [428, 667, 15, 13, 13, 3], [428, 718, 15, 13, 13, 3], [428, 770, 15, 12, 13, 4], [489, 4, 14, 16, 13, 3], [489, 55, 14, 6, 13, 3], [489, 105, 15, 14, 13, 2], [489, 157, 16, 13, 13, 3], [489, 208, 15, 15, 13, 3], [489, 262, 14, 8, 13, 6], [489, 311, 15, 15, 13, 4], [489, 361, 14, 13, 13, 3], [489, 412, 15, 13, 13, 3], [489, 463, 15, 13, 13, 3], [489, 514, 16, 7, 13, 3], [489, 565, 14, 4, 13, 3], [489, 617, 14, 3, 13, 4], [489, 671, 14, 8, 13, 7], [489, 718, 17, 13, 13, 3], [489, 769, 15, 13, 13, 3], [550, 9, 14, 7, 13, 8], [550, 57, 14, 11, 13, 5], [550, 108, 15, 11, 13, 5], [550, 159, 15, 11, 13, 5], [550, 208, 17, 13, 13, 3], [550, 262, 15, 12, 13, 6], [550, 310, 15, 13, 13, 3], [550, 361, 16, 16, 13, 3], [550, 413, 15, 15, 13, 4], [550, 466, 16, 10, 13, 6], [550, 514, 16, 15, 13, 3], [550, 565, 15, 7, 13, 3], [550, 616, 15, 7, 13, 3], [550, 667, 14, 13, 13, 3], [550, 721, 15, 10, 13, 6], [550, 772, 15, 10, 13, 6], [611, 7, 13, 13, 13, 6], [611, 58, 13, 13, 13, 6], [611, 113, 13, 5, 13, 10], [611, 157, 17, 16, 13, 3], [611, 208, 16, 16, 13, 3], [611, 263, 15, 8, 13, 7], [611, 311, 13, 12, 13, 4], [611, 365, 14, 9, 13, 7], [611, 416, 13, 9, 13, 7], [611, 473, 11, 3, 13, 13], [611, 511, 1, 1, 13, 1], [611, 562, 13, 16, 13, 0], [611, 613, 15, 16, 13, 0], [611, 664, 15, 16, 13, 0], [611, 718, 16, 13, 13, 3], [611, 772, 15, 10, 13, 6], [672, 10, 14, 3, 13, 9], [672, 61, 14, 3, 13, 9], [672, 106, 17, 7, 13, 3], [672, 157, 15, 7, 13, 3], [672, 208, 14, 7, 13, 3], [672, 259, 13, 7, 13, 3], [672, 316, 13, 7, 13, 9], [672, 362, 14, 12, 13, 4], [672, 413, 14, 15, 13, 4], [1, 1, 1, 1, 13, 1], [794, 769, 15, 4, 13, 3], [672, 567, 15, 9, 13, 5], [672, 620, 13, 9, 13, 7], [672, 671, 12, 9, 13, 7], [672, 718, 15, 13, 13, 3], [672, 769, 16, 13, 13, 3], [733, 4, 14, 16, 13, 3], [733, 61, 11, 4, 13, 9], [733, 115, 11, 7, 13, 12], [733, 166, 12, 7, 13, 12], [733, 208, 16, 13, 13, 3], [733, 256, 15, 16, 13, 0], [733, 307, 15, 16, 13, 0], [733, 358, 15, 16, 13, 0], [733, 410, 15, 15, 13, 1], [733, 460, 15, 16, 13, 0], [733, 511, 15, 16, 13, 0], [733, 562, 15, 16, 13, 0], [733, 614, 15, 15, 13, 1], [733, 664, 15, 16, 13, 0], [733, 715, 15, 16, 13, 0], [733, 766, 15, 16, 13, 0], [1, 1, 1, 1, 13, 1], [794, 52, 15, 16, 13, 0], [794, 103, 16, 16, 13, 0], [794, 154, 16, 16, 13, 0], [794, 205, 16, 16, 13, 0], [794, 262, 12, 10, 13, 6], [794, 310, 14, 4, 13, 3], [794, 361, 14, 4, 13, 3], [794, 413, 13, 3, 13, 4], [794, 463, 14, 4, 13, 3], [794, 514, 13, 4, 13, 3], [794, 565, 14, 5, 13, 3], [794, 627, 9, 5, 13, 14], [794, 667, 15, 4, 13, 3], [794, 729, 9, 5, 13, 14], [794, 769, 15, 4, 13, 3], [855, 4, 15, 4, 13, 3], [855, 55, 15, 4, 13, 3], [855, 106, 15, 4, 13, 3], [855, 157, 15, 4, 13, 3], [855, 208, 15, 4, 13, 3], [855, 259, 15, 4, 13, 3], [855, 310, 15, 4, 13, 3], [855, 361, 15, 4, 13, 3], [855, 412, 15, 4, 13, 3], [855, 463, 15, 4, 13, 3], [855, 514, 15, 4, 13, 3], [855, 565, 15, 4, 13, 3], [855, 616, 15, 4, 13, 3], [855, 667, 15, 4, 13, 3], [855, 718, 15, 4, 13, 3], [855, 769, 15, 4, 13, 3]], \"capHeight\": 15, \"widestlogicalchar\": 13, \"widestglyph\": 17, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 55, 12, 11, 12, 3], [1, 106, 15, 4, 12, 3], [1, 157, 15, 11, 12, 3], [1, 207, 13, 13, 12, 2], [1, 259, 16, 11, 12, 3], [1, 310, 13, 11, 12, 3], [1, 361, 12, 4, 12, 3], [1, 412, 15, 14, 12, 3], [1, 463, 13, 14, 12, 3], [1, 514, 13, 6, 12, 3], [1, 569, 12, 7, 12, 7], [1, 625, 10, 5, 12, 12], [1, 673, 13, 1, 12, 9], [1, 727, 9, 2, 12, 12], [1, 769, 15, 11, 12, 3], [62, 4, 14, 11, 12, 3], [62, 55, 13, 11, 12, 3], [62, 106, 14, 11, 12, 3], [62, 157, 13, 11, 12, 3], [62, 208, 14, 11, 12, 3], [62, 259, 15, 11, 12, 3], [62, 310, 14, 11, 12, 3], [62, 361, 14, 11, 12, 3], [62, 412, 14, 11, 12, 3], [62, 463, 13, 11, 12, 3], [62, 517, 11, 8, 12, 6], [62, 568, 11, 11, 12, 6], [62, 620, 14, 7, 12, 7], [62, 673, 13, 3, 12, 9], [62, 722, 13, 7, 12, 7], [62, 769, 14, 11, 12, 3], [123, 4, 15, 11, 12, 3], [123, 55, 12, 11, 12, 3], [123, 106, 14, 11, 12, 3], [123, 157, 15, 11, 12, 3], [123, 208, 14, 11, 12, 3], [123, 259, 14, 11, 12, 3], [123, 310, 15, 11, 12, 3], [123, 361, 15, 11, 12, 3], [123, 412, 15, 11, 12, 3], [123, 463, 14, 11, 12, 3], [123, 514, 14, 11, 12, 3], [123, 565, 15, 11, 12, 3], [123, 616, 11, 11, 12, 3], [123, 667, 16, 11, 12, 3], [123, 718, 15, 11, 12, 3], [123, 769, 14, 11, 12, 3], [184, 4, 14, 11, 12, 3], [184, 55, 14, 14, 12, 3], [184, 106, 13, 11, 12, 3], [184, 157, 14, 11, 12, 3], [184, 208, 15, 11, 12, 3], [184, 259, 15, 11, 12, 3], [184, 310, 16, 11, 12, 3], [184, 361, 14, 11, 12, 3], [184, 412, 14, 11, 12, 3], [184, 463, 16, 11, 12, 3], [184, 514, 15, 11, 12, 3], [184, 565, 16, 14, 12, 3], [184, 616, 12, 11, 12, 3], [184, 667, 14, 14, 12, 3], [184, 719, 12, 6, 12, 4], [184, 780, 11, 1, 12, 14], [245, 4, 11, 2, 12, 3], [245, 58, 14, 8, 12, 6], [245, 106, 13, 11, 12, 3], [245, 160, 14, 8, 12, 6], [245, 208, 15, 11, 12, 3], [245, 262, 13, 8, 12, 6], [245, 310, 16, 11, 12, 3], [245, 364, 14, 11, 12, 6], [245, 412, 13, 11, 12, 3], [245, 463, 12, 11, 12, 3], [245, 514, 14, 14, 12, 3], [245, 565, 13, 11, 12, 3], [245, 616, 12, 11, 12, 3], [245, 670, 13, 8, 12, 6], [245, 721, 13, 8, 12, 6], [245, 772, 13, 8, 12, 6], [306, 7, 13, 11, 12, 6], [306, 58, 14, 11, 12, 6], [306, 109, 14, 8, 12, 6], [306, 160, 13, 8, 12, 6], [306, 209, 13, 10, 12, 4], [306, 262, 14, 8, 12, 6], [306, 313, 15, 8, 12, 6], [306, 364, 13, 8, 12, 6], [306, 415, 12, 8, 12, 6], [306, 466, 14, 11, 12, 6], [306, 517, 14, 8, 12, 6], [306, 565, 15, 14, 12, 3], [306, 616, 12, 11, 12, 3], [306, 667, 13, 14, 12, 3], [306, 723, 13, 3, 12, 8], [306, 769, 14, 11, 12, 3], [367, 2, 14, 13, 12, 1], [367, 53, 14, 13, 12, 1], [367, 106, 15, 14, 12, 3], [367, 154, 14, 14, 12, 0], [367, 205, 15, 14, 12, 0], [367, 257, 14, 13, 12, 1], [367, 308, 15, 13, 12, 1], [367, 361, 14, 11, 12, 3], [367, 412, 14, 11, 12, 3], [367, 463, 14, 11, 12, 3], [367, 515, 14, 10, 12, 4], [367, 565, 14, 11, 12, 3], [367, 616, 14, 11, 12, 3], [367, 670, 13, 11, 12, 6], [367, 718, 14, 11, 12, 3], [367, 769, 13, 11, 12, 3], [428, 4, 13, 11, 12, 3], [428, 56, 13, 10, 12, 4], [428, 106, 13, 11, 12, 3], [428, 157, 11, 11, 12, 3], [428, 208, 13, 11, 12, 3], [428, 260, 13, 10, 12, 4], [428, 310, 12, 11, 12, 3], [428, 361, 13, 11, 12, 3], [428, 412, 13, 11, 12, 3], [428, 463, 13, 11, 12, 3], [428, 515, 13, 10, 12, 4], [428, 565, 13, 11, 12, 3], [428, 616, 14, 11, 12, 3], [428, 667, 14, 11, 12, 3], [428, 718, 14, 11, 12, 3], [428, 770, 14, 10, 12, 4], [489, 4, 13, 14, 12, 3], [489, 55, 13, 4, 12, 3], [489, 105, 14, 12, 12, 2], [489, 157, 15, 11, 12, 3], [489, 208, 14, 13, 12, 3], [489, 262, 13, 6, 12, 6], [489, 311, 14, 13, 12, 4], [489, 361, 13, 11, 12, 3], [489, 412, 14, 11, 12, 3], [489, 463, 14, 11, 12, 3], [489, 514, 15, 5, 12, 3], [489, 565, 13, 2, 12, 3], [489, 617, 13, 1, 12, 4], [489, 671, 13, 6, 12, 7], [489, 718, 16, 11, 12, 3], [489, 769, 14, 11, 12, 3], [550, 9, 13, 5, 12, 8], [550, 57, 13, 9, 12, 5], [550, 108, 14, 9, 12, 5], [550, 159, 14, 9, 12, 5], [550, 208, 16, 11, 12, 3], [550, 262, 14, 10, 12, 6], [550, 310, 14, 11, 12, 3], [550, 361, 15, 14, 12, 3], [550, 413, 14, 13, 12, 4], [550, 466, 15, 8, 12, 6], [550, 514, 15, 13, 12, 3], [550, 565, 14, 5, 12, 3], [550, 616, 14, 5, 12, 3], [550, 667, 13, 11, 12, 3], [550, 721, 14, 8, 12, 6], [550, 772, 14, 8, 12, 6], [611, 7, 12, 11, 12, 6], [611, 58, 12, 11, 12, 6], [611, 113, 12, 3, 12, 10], [611, 157, 16, 14, 12, 3], [611, 208, 15, 14, 12, 3], [611, 263, 14, 6, 12, 7], [611, 311, 12, 10, 12, 4], [611, 365, 13, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 473, 10, 1, 12, 13], [611, 511, 1, 1, 12, 1], [611, 562, 12, 14, 12, 0], [611, 613, 14, 14, 12, 0], [611, 664, 14, 14, 12, 0], [611, 718, 15, 11, 12, 3], [611, 772, 14, 8, 12, 6], [672, 10, 13, 1, 12, 9], [672, 61, 13, 1, 12, 9], [672, 106, 16, 5, 12, 3], [672, 157, 14, 5, 12, 3], [672, 208, 13, 5, 12, 3], [672, 259, 12, 5, 12, 3], [672, 316, 12, 5, 12, 9], [672, 362, 13, 10, 12, 4], [672, 413, 13, 13, 12, 4], [1, 1, 1, 1, 12, 1], [794, 769, 14, 2, 12, 3], [672, 567, 14, 7, 12, 5], [672, 620, 12, 7, 12, 7], [672, 671, 11, 7, 12, 7], [672, 718, 14, 11, 12, 3], [672, 769, 15, 11, 12, 3], [733, 4, 13, 14, 12, 3], [733, 61, 10, 2, 12, 9], [733, 115, 10, 5, 12, 12], [733, 166, 11, 5, 12, 12], [733, 208, 15, 11, 12, 3], [733, 256, 14, 14, 12, 0], [733, 307, 14, 14, 12, 0], [733, 358, 13, 14, 12, 0], [733, 410, 14, 13, 12, 1], [733, 460, 14, 14, 12, 0], [733, 511, 14, 14, 12, 0], [733, 562, 14, 14, 12, 0], [733, 614, 14, 13, 12, 1], [733, 664, 14, 14, 12, 0], [733, 715, 14, 14, 12, 0], [733, 766, 14, 14, 12, 0], [1, 1, 1, 1, 12, 1], [794, 52, 14, 14, 12, 0], [794, 103, 15, 14, 12, 0], [794, 154, 15, 14, 12, 0], [794, 205, 15, 14, 12, 0], [794, 262, 11, 8, 12, 6], [794, 310, 13, 2, 12, 3], [794, 361, 13, 2, 12, 3], [794, 413, 12, 1, 12, 4], [794, 463, 13, 2, 12, 3], [794, 514, 12, 2, 12, 3], [794, 565, 13, 3, 12, 3], [794, 627, 8, 3, 12, 14], [794, 667, 14, 2, 12, 3], [794, 729, 8, 3, 12, 14], [794, 769, 14, 2, 12, 3], [855, 4, 14, 2, 12, 3], [855, 55, 14, 2, 12, 3], [855, 106, 14, 2, 12, 3], [855, 157, 14, 2, 12, 3], [855, 208, 14, 2, 12, 3], [855, 259, 14, 2, 12, 3], [855, 310, 14, 2, 12, 3], [855, 361, 14, 2, 12, 3], [855, 412, 14, 2, 12, 3], [855, 463, 14, 2, 12, 3], [855, 514, 14, 2, 12, 3], [855, 565, 14, 2, 12, 3], [855, 616, 14, 2, 12, 3], [855, 667, 14, 2, 12, 3], [855, 718, 14, 2, 12, 3], [855, 769, 14, 2, 12, 3]], \"capHeight\": 14, \"widestlogicalchar\": 12, \"widestglyph\": 16, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 13, 6, 13, 9], [1, 55, 13, 13, 13, 3], [1, 106, 13, 12, 13, 3], [1, 157, 13, 13, 13, 3], [1, 207, 13, 15, 13, 2], [1, 259, 13, 13, 13, 3], [1, 310, 13, 13, 13, 3], [1, 361, 13, 12, 13, 3], [1, 412, 13, 16, 13, 3], [1, 463, 13, 16, 13, 3], [1, 514, 13, 12, 13, 3], [1, 569, 13, 9, 13, 7], [1, 622, 13, 10, 13, 9], [1, 673, 13, 6, 13, 9], [1, 724, 13, 7, 13, 9], [1, 769, 13, 13, 13, 3], [62, 4, 13, 13, 13, 3], [62, 55, 13, 13, 13, 3], [62, 106, 13, 13, 13, 3], [62, 157, 13, 13, 13, 3], [62, 208, 13, 13, 13, 3], [62, 259, 13, 13, 13, 3], [62, 310, 13, 13, 13, 3], [62, 361, 13, 13, 13, 3], [62, 412, 13, 13, 13, 3], [62, 463, 13, 13, 13, 3], [62, 517, 13, 10, 13, 6], [62, 568, 13, 13, 13, 6], [62, 620, 13, 9, 13, 7], [62, 673, 13, 6, 13, 9], [62, 722, 13, 9, 13, 7], [62, 769, 13, 13, 13, 3], [123, 4, 13, 13, 13, 3], [123, 55, 13, 13, 13, 3], [123, 106, 13, 13, 13, 3], [123, 157, 13, 13, 13, 3], [123, 208, 13, 13, 13, 3], [123, 259, 13, 13, 13, 3], [123, 310, 13, 13, 13, 3], [123, 361, 13, 13, 13, 3], [123, 412, 13, 13, 13, 3], [123, 463, 13, 13, 13, 3], [123, 514, 13, 13, 13, 3], [123, 565, 13, 13, 13, 3], [123, 616, 13, 13, 13, 3], [123, 667, 13, 13, 13, 3], [123, 718, 13, 13, 13, 3], [123, 769, 13, 13, 13, 3], [184, 4, 13, 13, 13, 3], [184, 55, 13, 16, 13, 3], [184, 106, 13, 13, 13, 3], [184, 157, 13, 13, 13, 3], [184, 208, 13, 13, 13, 3], [184, 259, 13, 13, 13, 3], [184, 310, 13, 13, 13, 3], [184, 361, 13, 13, 13, 3], [184, 412, 13, 13, 13, 3], [184, 463, 13, 13, 13, 3], [184, 514, 13, 13, 13, 3], [184, 565, 13, 16, 13, 3], [184, 616, 13, 13, 13, 3], [184, 667, 13, 16, 13, 3], [184, 718, 13, 12, 13, 3], [184, 775, 13, 8, 13, 9], [245, 4, 13, 12, 13, 3], [245, 58, 13, 10, 13, 6], [245, 106, 13, 13, 13, 3], [245, 160, 13, 10, 13, 6], [245, 208, 13, 13, 13, 3], [245, 262, 13, 10, 13, 6], [245, 310, 13, 13, 13, 3], [245, 364, 13, 13, 13, 6], [245, 412, 13, 13, 13, 3], [245, 463, 13, 13, 13, 3], [245, 514, 13, 16, 13, 3], [245, 565, 13, 13, 13, 3], [245, 616, 13, 13, 13, 3], [245, 670, 13, 10, 13, 6], [245, 721, 13, 10, 13, 6], [245, 772, 13, 10, 13, 6], [306, 7, 13, 13, 13, 6], [306, 58, 13, 13, 13, 6], [306, 109, 13, 10, 13, 6], [306, 160, 13, 10, 13, 6], [306, 209, 13, 12, 13, 4], [306, 262, 13, 10, 13, 6], [306, 313, 13, 10, 13, 6], [306, 364, 13, 10, 13, 6], [306, 415, 13, 10, 13, 6], [306, 466, 13, 13, 13, 6], [306, 517, 13, 10, 13, 6], [306, 565, 13, 16, 13, 3], [306, 616, 13, 13, 13, 3], [306, 667, 13, 16, 13, 3], [306, 723, 13, 7, 13, 8], [306, 769, 13, 13, 13, 3], [367, 2, 13, 15, 13, 1], [367, 53, 13, 15, 13, 1], [367, 106, 13, 16, 13, 3], [367, 154, 13, 16, 13, 0], [367, 205, 13, 16, 13, 0], [367, 257, 13, 15, 13, 1], [367, 308, 13, 15, 13, 1], [367, 361, 13, 13, 13, 3], [367, 412, 13, 13, 13, 3], [367, 463, 13, 13, 13, 3], [367, 515, 13, 12, 13, 4], [367, 565, 13, 13, 13, 3], [367, 616, 13, 13, 13, 3], [367, 670, 13, 13, 13, 6], [367, 718, 13, 13, 13, 3], [367, 769, 13, 13, 13, 3], [428, 4, 13, 13, 13, 3], [428, 56, 13, 12, 13, 4], [428, 106, 13, 13, 13, 3], [428, 157, 13, 13, 13, 3], [428, 208, 13, 13, 13, 3], [428, 260, 13, 12, 13, 4], [428, 310, 13, 13, 13, 3], [428, 361, 13, 13, 13, 3], [428, 412, 13, 13, 13, 3], [428, 463, 13, 13, 13, 3], [428, 515, 13, 12, 13, 4], [428, 565, 13, 13, 13, 3], [428, 616, 13, 13, 13, 3], [428, 667, 13, 13, 13, 3], [428, 718, 13, 13, 13, 3], [428, 770, 13, 12, 13, 4], [489, 4, 13, 16, 13, 3], [489, 55, 13, 12, 13, 3], [489, 105, 13, 14, 13, 2], [489, 157, 13, 13, 13, 3], [489, 208, 13, 15, 13, 3], [489, 262, 13, 9, 13, 6], [489, 311, 13, 15, 13, 4], [489, 361, 13, 13, 13, 3], [489, 412, 13, 13, 13, 3], [489, 463, 13, 13, 13, 3], [489, 514, 13, 12, 13, 3], [489, 565, 13, 12, 13, 3], [489, 617, 13, 11, 13, 4], [489, 671, 13, 8, 13, 7], [489, 718, 13, 13, 13, 3], [489, 769, 13, 13, 13, 3], [550, 9, 13, 7, 13, 8], [550, 57, 13, 11, 13, 5], [550, 108, 13, 11, 13, 5], [550, 159, 13, 11, 13, 5], [550, 208, 13, 13, 13, 3], [550, 262, 13, 12, 13, 6], [550, 310, 13, 13, 13, 3], [550, 361, 13, 16, 13, 3], [550, 413, 13, 15, 13, 4], [550, 466, 13, 10, 13, 6], [550, 514, 13, 15, 13, 3], [550, 565, 13, 12, 13, 3], [550, 616, 13, 12, 13, 3], [550, 667, 13, 13, 13, 3], [550, 721, 13, 10, 13, 6], [550, 772, 13, 10, 13, 6], [611, 7, 13, 13, 13, 6], [611, 58, 13, 13, 13, 6], [611, 112, 13, 6, 13, 9], [611, 157, 13, 16, 13, 3], [611, 208, 13, 16, 13, 3], [611, 263, 13, 8, 13, 7], [611, 311, 13, 12, 13, 4], [611, 365, 13, 9, 13, 7], [611, 416, 13, 9, 13, 7], [611, 469, 13, 7, 13, 9], [611, 520, 13, 6, 13, 9], [611, 562, 13, 16, 13, 0], [611, 613, 13, 16, 13, 0], [611, 664, 13, 16, 13, 0], [611, 718, 13, 13, 13, 3], [611, 772, 13, 10, 13, 6], [672, 10, 13, 6, 13, 9], [672, 61, 13, 6, 13, 9], [672, 106, 13, 12, 13, 3], [672, 157, 13, 12, 13, 3], [672, 208, 13, 12, 13, 3], [672, 259, 13, 12, 13, 3], [672, 316, 13, 7, 13, 9], [672, 361, 13, 13, 13, 3], [672, 413, 13, 15, 13, 4], [1, 10, 13, 6, 13, 9], [794, 769, 13, 12, 13, 3], [672, 568, 13, 9, 13, 6], [672, 620, 13, 9, 13, 7], [672, 671, 13, 9, 13, 7], [672, 718, 13, 13, 13, 3], [672, 769, 13, 13, 13, 3], [733, 4, 13, 16, 13, 3], [733, 61, 13, 6, 13, 9], [733, 112, 13, 10, 13, 9], [733, 163, 13, 10, 13, 9], [733, 208, 13, 13, 13, 3], [733, 256, 13, 16, 13, 0], [733, 307, 13, 16, 13, 0], [733, 358, 13, 16, 13, 0], [733, 410, 13, 15, 13, 1], [733, 460, 13, 16, 13, 0], [733, 511, 13, 16, 13, 0], [733, 562, 13, 16, 13, 0], [733, 614, 13, 15, 13, 1], [733, 664, 13, 16, 13, 0], [733, 715, 13, 16, 13, 0], [733, 766, 13, 16, 13, 0], [1, 10, 13, 6, 13, 9], [794, 52, 13, 16, 13, 0], [794, 103, 13, 16, 13, 0], [794, 154, 13, 16, 13, 0], [794, 205, 13, 16, 13, 0], [794, 262, 13, 10, 13, 6], [794, 310, 13, 12, 13, 3], [794, 361, 13, 12, 13, 3], [794, 413, 13, 11, 13, 4], [794, 463, 13, 12, 13, 3], [794, 514, 13, 12, 13, 3], [794, 565, 13, 12, 13, 3], [794, 622, 13, 10, 13, 9], [794, 667, 13, 12, 13, 3], [794, 724, 13, 10, 13, 9], [794, 769, 13, 12, 13, 3], [855, 4, 13, 12, 13, 3], [855, 55, 13, 12, 13, 3], [855, 106, 13, 12, 13, 3], [855, 157, 13, 12, 13, 3], [855, 208, 13, 12, 13, 3], [855, 259, 13, 12, 13, 3], [855, 310, 13, 12, 13, 3], [855, 361, 13, 12, 13, 3], [855, 412, 13, 12, 13, 3], [855, 463, 13, 12, 13, 3], [855, 514, 13, 12, 13, 3], [855, 565, 13, 12, 13, 3], [855, 616, 13, 12, 13, 3], [855, 667, 13, 12, 13, 3], [855, 718, 13, 12, 13, 3], [855, 769, 13, 12, 13, 3]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 12, 6, 12, 8], [1, 55, 12, 11, 12, 3], [1, 106, 12, 11, 12, 3], [1, 157, 12, 11, 12, 3], [1, 207, 12, 13, 12, 2], [1, 259, 12, 11, 12, 3], [1, 310, 12, 11, 12, 3], [1, 361, 12, 11, 12, 3], [1, 412, 12, 14, 12, 3], [1, 463, 12, 14, 12, 3], [1, 514, 12, 11, 12, 3], [1, 569, 12, 7, 12, 7], [1, 621, 12, 9, 12, 8], [1, 672, 12, 6, 12, 8], [1, 723, 12, 6, 12, 8], [1, 769, 12, 11, 12, 3], [62, 4, 12, 11, 12, 3], [62, 55, 12, 11, 12, 3], [62, 106, 12, 11, 12, 3], [62, 157, 12, 11, 12, 3], [62, 208, 12, 11, 12, 3], [62, 259, 12, 11, 12, 3], [62, 310, 12, 11, 12, 3], [62, 361, 12, 11, 12, 3], [62, 412, 12, 11, 12, 3], [62, 463, 12, 11, 12, 3], [62, 517, 12, 8, 12, 6], [62, 568, 12, 11, 12, 6], [62, 620, 12, 7, 12, 7], [62, 672, 12, 6, 12, 8], [62, 722, 12, 7, 12, 7], [62, 769, 12, 11, 12, 3], [123, 4, 12, 11, 12, 3], [123, 55, 12, 11, 12, 3], [123, 106, 12, 11, 12, 3], [123, 157, 12, 11, 12, 3], [123, 208, 12, 11, 12, 3], [123, 259, 12, 11, 12, 3], [123, 310, 12, 11, 12, 3], [123, 361, 12, 11, 12, 3], [123, 412, 12, 11, 12, 3], [123, 463, 12, 11, 12, 3], [123, 514, 12, 11, 12, 3], [123, 565, 12, 11, 12, 3], [123, 616, 12, 11, 12, 3], [123, 667, 12, 11, 12, 3], [123, 718, 12, 11, 12, 3], [123, 769, 12, 11, 12, 3], [184, 4, 12, 11, 12, 3], [184, 55, 12, 14, 12, 3], [184, 106, 12, 11, 12, 3], [184, 157, 12, 11, 12, 3], [184, 208, 12, 11, 12, 3], [184, 259, 12, 11, 12, 3], [184, 310, 12, 11, 12, 3], [184, 361, 12, 11, 12, 3], [184, 412, 12, 11, 12, 3], [184, 463, 12, 11, 12, 3], [184, 514, 12, 11, 12, 3], [184, 565, 12, 14, 12, 3], [184, 616, 12, 11, 12, 3], [184, 667, 12, 14, 12, 3], [184, 718, 12, 11, 12, 3], [184, 774, 12, 7, 12, 8], [245, 4, 12, 11, 12, 3], [245, 58, 12, 8, 12, 6], [245, 106, 12, 11, 12, 3], [245, 160, 12, 8, 12, 6], [245, 208, 12, 11, 12, 3], [245, 262, 12, 8, 12, 6], [245, 310, 12, 11, 12, 3], [245, 364, 12, 11, 12, 6], [245, 412, 12, 11, 12, 3], [245, 463, 12, 11, 12, 3], [245, 514, 12, 14, 12, 3], [245, 565, 12, 11, 12, 3], [245, 616, 12, 11, 12, 3], [245, 670, 12, 8, 12, 6], [245, 721, 12, 8, 12, 6], [245, 772, 12, 8, 12, 6], [306, 7, 12, 11, 12, 6], [306, 58, 12, 11, 12, 6], [306, 109, 12, 8, 12, 6], [306, 160, 12, 8, 12, 6], [306, 209, 12, 10, 12, 4], [306, 262, 12, 8, 12, 6], [306, 313, 12, 8, 12, 6], [306, 364, 12, 8, 12, 6], [306, 415, 12, 8, 12, 6], [306, 466, 12, 11, 12, 6], [306, 517, 12, 8, 12, 6], [306, 565, 12, 14, 12, 3], [306, 616, 12, 11, 12, 3], [306, 667, 12, 14, 12, 3], [306, 723, 12, 6, 12, 8], [306, 769, 12, 11, 12, 3], [367, 2, 12, 13, 12, 1], [367, 53, 12, 13, 12, 1], [367, 106, 12, 14, 12, 3], [367, 154, 12, 14, 12, 0], [367, 205, 12, 14, 12, 0], [367, 257, 12, 13, 12, 1], [367, 308, 12, 13, 12, 1], [367, 361, 12, 11, 12, 3], [367, 412, 12, 11, 12, 3], [367, 463, 12, 11, 12, 3], [367, 515, 12, 10, 12, 4], [367, 565, 12, 11, 12, 3], [367, 616, 12, 11, 12, 3], [367, 670, 12, 11, 12, 6], [367, 718, 12, 11, 12, 3], [367, 769, 12, 11, 12, 3], [428, 4, 12, 11, 12, 3], [428, 56, 12, 10, 12, 4], [428, 106, 12, 11, 12, 3], [428, 157, 12, 11, 12, 3], [428, 208, 12, 11, 12, 3], [428, 260, 12, 10, 12, 4], [428, 310, 12, 11, 12, 3], [428, 361, 12, 11, 12, 3], [428, 412, 12, 11, 12, 3], [428, 463, 12, 11, 12, 3], [428, 515, 12, 10, 12, 4], [428, 565, 12, 11, 12, 3], [428, 616, 12, 11, 12, 3], [428, 667, 12, 11, 12, 3], [428, 718, 12, 11, 12, 3], [428, 770, 12, 10, 12, 4], [489, 4, 12, 14, 12, 3], [489, 55, 12, 11, 12, 3], [489, 105, 12, 12, 12, 2], [489, 157, 12, 11, 12, 3], [489, 208, 12, 13, 12, 3], [489, 262, 12, 8, 12, 6], [489, 311, 12, 13, 12, 4], [489, 361, 12, 11, 12, 3], [489, 412, 12, 11, 12, 3], [489, 463, 12, 11, 12, 3], [489, 514, 12, 11, 12, 3], [489, 565, 12, 11, 12, 3], [489, 617, 12, 10, 12, 4], [489, 671, 12, 7, 12, 7], [489, 718, 12, 11, 12, 3], [489, 769, 12, 11, 12, 3], [550, 9, 12, 6, 12, 8], [550, 57, 12, 9, 12, 5], [550, 108, 12, 9, 12, 5], [550, 159, 12, 9, 12, 5], [550, 208, 12, 11, 12, 3], [550, 262, 12, 10, 12, 6], [550, 310, 12, 11, 12, 3], [550, 361, 12, 14, 12, 3], [550, 413, 12, 13, 12, 4], [550, 466, 12, 8, 12, 6], [550, 514, 12, 13, 12, 3], [550, 565, 12, 11, 12, 3], [550, 616, 12, 11, 12, 3], [550, 667, 12, 11, 12, 3], [550, 721, 12, 8, 12, 6], [550, 772, 12, 8, 12, 6], [611, 7, 12, 11, 12, 6], [611, 58, 12, 11, 12, 6], [611, 111, 12, 6, 12, 8], [611, 157, 12, 14, 12, 3], [611, 208, 12, 14, 12, 3], [611, 263, 12, 7, 12, 7], [611, 311, 12, 10, 12, 4], [611, 365, 12, 7, 12, 7], [611, 416, 12, 7, 12, 7], [611, 468, 12, 6, 12, 8], [611, 519, 12, 6, 12, 8], [611, 562, 12, 14, 12, 0], [611, 613, 12, 14, 12, 0], [611, 664, 12, 14, 12, 0], [611, 718, 12, 11, 12, 3], [611, 772, 12, 8, 12, 6], [672, 9, 12, 6, 12, 8], [672, 60, 12, 6, 12, 8], [672, 106, 12, 11, 12, 3], [672, 157, 12, 11, 12, 3], [672, 208, 12, 11, 12, 3], [672, 259, 12, 11, 12, 3], [672, 315, 12, 6, 12, 8], [672, 361, 12, 11, 12, 3], [672, 413, 12, 13, 12, 4], [1, 9, 12, 6, 12, 8], [794, 769, 12, 11, 12, 3], [672, 568, 12, 8, 12, 6], [672, 620, 12, 7, 12, 7], [672, 671, 12, 7, 12, 7], [672, 718, 12, 11, 12, 3], [672, 769, 12, 11, 12, 3], [733, 4, 12, 14, 12, 3], [733, 60, 12, 6, 12, 8], [733, 111, 12, 9, 12, 8], [733, 162, 12, 9, 12, 8], [733, 208, 12, 11, 12, 3], [733, 256, 12, 14, 12, 0], [733, 307, 12, 14, 12, 0], [733, 358, 12, 14, 12, 0], [733, 410, 12, 13, 12, 1], [733, 460, 12, 14, 12, 0], [733, 511, 12, 14, 12, 0], [733, 562, 12, 14, 12, 0], [733, 614, 12, 13, 12, 1], [733, 664, 12, 14, 12, 0], [733, 715, 12, 14, 12, 0], [733, 766, 12, 14, 12, 0], [1, 9, 12, 6, 12, 8], [794, 52, 12, 14, 12, 0], [794, 103, 12, 14, 12, 0], [794, 154, 12, 14, 12, 0], [794, 205, 12, 14, 12, 0], [794, 262, 12, 8, 12, 6], [794, 310, 12, 11, 12, 3], [794, 361, 12, 11, 12, 3], [794, 413, 12, 10, 12, 4], [794, 463, 12, 11, 12, 3], [794, 514, 12, 11, 12, 3], [794, 565, 12, 11, 12, 3], [794, 621, 12, 9, 12, 8], [794, 667, 12, 11, 12, 3], [794, 723, 12, 9, 12, 8], [794, 769, 12, 11, 12, 3], [855, 4, 12, 11, 12, 3], [855, 55, 12, 11, 12, 3], [855, 106, 12, 11, 12, 3], [855, 157, 12, 11, 12, 3], [855, 208, 12, 11, 12, 3], [855, 259, 12, 11, 12, 3], [855, 310, 12, 11, 12, 3], [855, 361, 12, 11, 12, 3], [855, 412, 12, 11, 12, 3], [855, 463, 12, 11, 12, 3], [855, 514, 12, 11, 12, 3], [855, 565, 12, 11, 12, 3], [855, 616, 12, 11, 12, 3], [855, 667, 12, 11, 12, 3], [855, 718, 12, 11, 12, 3], [855, 769, 12, 11, 12, 3]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 12, 1], [1, 55, 12, 13, 12, 3], [1, 106, 15, 6, 12, 3], [1, 157, 15, 13, 12, 3], [1, 207, 13, 15, 12, 2], [1, 259, 16, 13, 12, 3], [1, 310, 13, 13, 12, 3], [1, 361, 12, 6, 12, 3], [1, 412, 15, 16, 12, 3], [1, 463, 13, 16, 12, 3], [1, 514, 13, 8, 12, 3], [1, 569, 12, 9, 12, 7], [1, 625, 10, 7, 12, 12], [1, 673, 13, 3, 12, 9], [1, 727, 9, 4, 12, 12], [1, 769, 15, 13, 12, 3], [62, 4, 14, 13, 12, 3], [62, 55, 13, 13, 12, 3], [62, 106, 14, 13, 12, 3], [62, 157, 13, 13, 12, 3], [62, 208, 14, 13, 12, 3], [62, 259, 15, 13, 12, 3], [62, 310, 14, 13, 12, 3], [62, 361, 14, 13, 12, 3], [62, 412, 14, 13, 12, 3], [62, 463, 13, 13, 12, 3], [62, 517, 11, 10, 12, 6], [62, 568, 11, 13, 12, 6], [62, 620, 14, 9, 12, 7], [62, 673, 13, 5, 12, 9], [62, 722, 13, 9, 12, 7], [62, 769, 14, 13, 12, 3], [123, 4, 15, 13, 12, 3], [123, 55, 12, 13, 12, 3], [123, 106, 14, 13, 12, 3], [123, 157, 15, 13, 12, 3], [123, 208, 14, 13, 12, 3], [123, 259, 14, 13, 12, 3], [123, 310, 15, 13, 12, 3], [123, 361, 15, 13, 12, 3], [123, 412, 15, 13, 12, 3], [123, 463, 14, 13, 12, 3], [123, 514, 14, 13, 12, 3], [123, 565, 15, 13, 12, 3], [123, 616, 11, 13, 12, 3], [123, 667, 16, 13, 12, 3], [123, 718, 15, 13, 12, 3], [123, 769, 14, 13, 12, 3], [184, 4, 14, 13, 12, 3], [184, 55, 14, 16, 12, 3], [184, 106, 13, 13, 12, 3], [184, 157, 14, 13, 12, 3], [184, 208, 15, 13, 12, 3], [184, 259, 15, 13, 12, 3], [184, 310, 16, 13, 12, 3], [184, 361, 14, 13, 12, 3], [184, 412, 14, 13, 12, 3], [184, 463, 16, 13, 12, 3], [184, 514, 15, 13, 12, 3], [184, 565, 16, 16, 12, 3], [184, 616, 12, 13, 12, 3], [184, 667, 14, 16, 12, 3], [184, 719, 12, 8, 12, 4], [184, 780, 11, 3, 12, 14], [245, 4, 11, 4, 12, 3], [245, 58, 14, 10, 12, 6], [245, 106, 13, 13, 12, 3], [245, 160, 14, 10, 12, 6], [245, 208, 15, 13, 12, 3], [245, 262, 13, 10, 12, 6], [245, 310, 16, 13, 12, 3], [245, 364, 14, 13, 12, 6], [245, 412, 13, 13, 12, 3], [245, 463, 12, 13, 12, 3], [245, 514, 14, 16, 12, 3], [245, 565, 13, 13, 12, 3], [245, 616, 12, 13, 12, 3], [245, 670, 13, 10, 12, 6], [245, 721, 13, 10, 12, 6], [245, 772, 13, 10, 12, 6], [306, 7, 13, 13, 12, 6], [306, 58, 14, 13, 12, 6], [306, 109, 14, 10, 12, 6], [306, 160, 13, 10, 12, 6], [306, 209, 13, 12, 12, 4], [306, 262, 14, 10, 12, 6], [306, 313, 15, 10, 12, 6], [306, 364, 13, 10, 12, 6], [306, 415, 12, 10, 12, 6], [306, 466, 14, 13, 12, 6], [306, 517, 14, 10, 12, 6], [306, 565, 15, 16, 12, 3], [306, 616, 12, 13, 12, 3], [306, 667, 13, 16, 12, 3], [306, 723, 13, 5, 12, 8], [306, 769, 14, 13, 12, 3], [367, 2, 14, 15, 12, 1], [367, 53, 14, 15, 12, 1], [367, 106, 15, 16, 12, 3], [367, 154, 14, 16, 12, 0], [367, 205, 15, 16, 12, 0], [367, 257, 14, 15, 12, 1], [367, 308, 15, 15, 12, 1], [367, 361, 14, 13, 12, 3], [367, 412, 14, 13, 12, 3], [367, 463, 14, 13, 12, 3], [367, 515, 14, 12, 12, 4], [367, 565, 14, 13, 12, 3], [367, 616, 14, 13, 12, 3], [367, 670, 13, 13, 12, 6], [367, 718, 14, 13, 12, 3], [367, 769, 13, 13, 12, 3], [428, 4, 13, 13, 12, 3], [428, 56, 13, 12, 12, 4], [428, 106, 13, 13, 12, 3], [428, 157, 11, 13, 12, 3], [428, 208, 13, 13, 12, 3], [428, 260, 13, 12, 12, 4], [428, 310, 12, 13, 12, 3], [428, 361, 13, 13, 12, 3], [428, 412, 13, 13, 12, 3], [428, 463, 13, 13, 12, 3], [428, 515, 13, 12, 12, 4], [428, 565, 13, 13, 12, 3], [428, 616, 14, 13, 12, 3], [428, 667, 14, 13, 12, 3], [428, 718, 14, 13, 12, 3], [428, 770, 14, 12, 12, 4], [489, 4, 13, 16, 12, 3], [489, 55, 13, 6, 12, 3], [489, 105, 14, 14, 12, 2], [489, 157, 15, 13, 12, 3], [489, 208, 14, 15, 12, 3], [489, 262, 13, 8, 12, 6], [489, 311, 14, 15, 12, 4], [489, 361, 13, 13, 12, 3], [489, 412, 14, 13, 12, 3], [489, 463, 14, 13, 12, 3], [489, 514, 15, 7, 12, 3], [489, 565, 13, 4, 12, 3], [489, 617, 13, 3, 12, 4], [489, 671, 13, 8, 12, 7], [489, 718, 16, 13, 12, 3], [489, 769, 14, 13, 12, 3], [550, 9, 13, 7, 12, 8], [550, 57, 13, 11, 12, 5], [550, 108, 14, 11, 12, 5], [550, 159, 14, 11, 12, 5], [550, 208, 16, 13, 12, 3], [550, 262, 14, 12, 12, 6], [550, 310, 14, 13, 12, 3], [550, 361, 15, 16, 12, 3], [550, 413, 14, 15, 12, 4], [550, 466, 15, 10, 12, 6], [550, 514, 15, 15, 12, 3], [550, 565, 14, 7, 12, 3], [550, 616, 14, 7, 12, 3], [550, 667, 13, 13, 12, 3], [550, 721, 14, 10, 12, 6], [550, 772, 14, 10, 12, 6], [611, 7, 12, 13, 12, 6], [611, 58, 12, 13, 12, 6], [611, 113, 12, 5, 12, 10], [611, 157, 16, 16, 12, 3], [611, 208, 15, 16, 12, 3], [611, 263, 14, 8, 12, 7], [611, 311, 12, 12, 12, 4], [611, 365, 13, 9, 12, 7], [611, 416, 12, 9, 12, 7], [611, 473, 10, 3, 12, 13], [611, 511, 1, 1, 12, 1], [611, 562, 12, 16, 12, 0], [611, 613, 14, 16, 12, 0], [611, 664, 14, 16, 12, 0], [611, 718, 15, 13, 12, 3], [611, 772, 14, 10, 12, 6], [672, 10, 13, 3, 12, 9], [672, 61, 13, 3, 12, 9], [672, 106, 16, 7, 12, 3], [672, 157, 14, 7, 12, 3], [672, 208, 13, 7, 12, 3], [672, 259, 12, 7, 12, 3], [672, 316, 12, 7, 12, 9], [672, 362, 13, 12, 12, 4], [672, 413, 13, 15, 12, 4], [1, 1, 1, 1, 12, 1], [794, 769, 14, 4, 12, 3], [672, 567, 14, 9, 12, 5], [672, 620, 12, 9, 12, 7], [672, 671, 11, 9, 12, 7], [672, 718, 14, 13, 12, 3], [672, 769, 15, 13, 12, 3], [733, 4, 13, 16, 12, 3], [733, 61, 10, 4, 12, 9], [733, 115, 10, 7, 12, 12], [733, 166, 11, 7, 12, 12], [733, 208, 15, 13, 12, 3], [733, 256, 14, 16, 12, 0], [733, 307, 14, 16, 12, 0], [733, 358, 14, 16, 12, 0], [733, 410, 14, 15, 12, 1], [733, 460, 14, 16, 12, 0], [733, 511, 14, 16, 12, 0], [733, 562, 14, 16, 12, 0], [733, 614, 14, 15, 12, 1], [733, 664, 14, 16, 12, 0], [733, 715, 14, 16, 12, 0], [733, 766, 14, 16, 12, 0], [1, 1, 1, 1, 12, 1], [794, 52, 14, 16, 12, 0], [794, 103, 15, 16, 12, 0], [794, 154, 15, 16, 12, 0], [794, 205, 15, 16, 12, 0], [794, 262, 11, 10, 12, 6], [794, 310, 13, 4, 12, 3], [794, 361, 13, 4, 12, 3], [794, 413, 12, 3, 12, 4], [794, 463, 13, 4, 12, 3], [794, 514, 12, 4, 12, 3], [794, 565, 13, 5, 12, 3], [794, 627, 8, 5, 12, 14], [794, 667, 14, 4, 12, 3], [794, 729, 8, 5, 12, 14], [794, 769, 14, 4, 12, 3], [855, 4, 14, 4, 12, 3], [855, 55, 14, 4, 12, 3], [855, 106, 14, 4, 12, 3], [855, 157, 14, 4, 12, 3], [855, 208, 14, 4, 12, 3], [855, 259, 14, 4, 12, 3], [855, 310, 14, 4, 12, 3], [855, 361, 14, 4, 12, 3], [855, 412, 14, 4, 12, 3], [855, 463, 14, 4, 12, 3], [855, 514, 14, 4, 12, 3], [855, 565, 14, 4, 12, 3], [855, 616, 14, 4, 12, 3], [855, 667, 14, 4, 12, 3], [855, 718, 14, 4, 12, 3], [855, 769, 14, 4, 12, 3]], \"capHeight\": 15, \"widestlogicalchar\": 12, \"widestglyph\": 16, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 55, 11, 11, 11, 3], [1, 106, 14, 4, 11, 3], [1, 157, 14, 11, 11, 3], [1, 207, 12, 13, 11, 2], [1, 259, 15, 11, 11, 3], [1, 310, 12, 11, 11, 3], [1, 361, 11, 4, 11, 3], [1, 412, 14, 14, 11, 3], [1, 463, 12, 14, 11, 3], [1, 514, 12, 6, 11, 3], [1, 569, 11, 7, 11, 7], [1, 625, 9, 5, 11, 12], [1, 673, 12, 1, 11, 9], [1, 727, 8, 2, 11, 12], [1, 769, 14, 11, 11, 3], [62, 4, 13, 11, 11, 3], [62, 55, 12, 11, 11, 3], [62, 106, 13, 11, 11, 3], [62, 157, 12, 11, 11, 3], [62, 208, 13, 11, 11, 3], [62, 259, 14, 11, 11, 3], [62, 310, 13, 11, 11, 3], [62, 361, 13, 11, 11, 3], [62, 412, 13, 11, 11, 3], [62, 463, 12, 11, 11, 3], [62, 517, 10, 8, 11, 6], [62, 568, 10, 11, 11, 6], [62, 620, 13, 7, 11, 7], [62, 673, 12, 3, 11, 9], [62, 722, 12, 7, 11, 7], [62, 769, 13, 11, 11, 3], [123, 4, 14, 11, 11, 3], [123, 55, 11, 11, 11, 3], [123, 106, 13, 11, 11, 3], [123, 157, 14, 11, 11, 3], [123, 208, 13, 11, 11, 3], [123, 259, 13, 11, 11, 3], [123, 310, 14, 11, 11, 3], [123, 361, 14, 11, 11, 3], [123, 412, 14, 11, 11, 3], [123, 463, 13, 11, 11, 3], [123, 514, 13, 11, 11, 3], [123, 565, 14, 11, 11, 3], [123, 616, 10, 11, 11, 3], [123, 667, 15, 11, 11, 3], [123, 718, 14, 11, 11, 3], [123, 769, 13, 11, 11, 3], [184, 4, 13, 11, 11, 3], [184, 55, 13, 14, 11, 3], [184, 106, 12, 11, 11, 3], [184, 157, 13, 11, 11, 3], [184, 208, 14, 11, 11, 3], [184, 259, 14, 11, 11, 3], [184, 310, 15, 11, 11, 3], [184, 361, 13, 11, 11, 3], [184, 412, 13, 11, 11, 3], [184, 463, 15, 11, 11, 3], [184, 514, 14, 11, 11, 3], [184, 565, 15, 14, 11, 3], [184, 616, 11, 11, 11, 3], [184, 667, 13, 14, 11, 3], [184, 719, 11, 6, 11, 4], [184, 780, 10, 1, 11, 14], [245, 4, 10, 2, 11, 3], [245, 58, 13, 8, 11, 6], [245, 106, 12, 11, 11, 3], [245, 160, 13, 8, 11, 6], [245, 208, 14, 11, 11, 3], [245, 262, 12, 8, 11, 6], [245, 310, 15, 11, 11, 3], [245, 364, 13, 11, 11, 6], [245, 412, 12, 11, 11, 3], [245, 463, 11, 11, 11, 3], [245, 514, 13, 14, 11, 3], [245, 565, 12, 11, 11, 3], [245, 616, 11, 11, 11, 3], [245, 670, 12, 8, 11, 6], [245, 721, 12, 8, 11, 6], [245, 772, 12, 8, 11, 6], [306, 7, 12, 11, 11, 6], [306, 58, 13, 11, 11, 6], [306, 109, 13, 8, 11, 6], [306, 160, 12, 8, 11, 6], [306, 209, 12, 10, 11, 4], [306, 262, 13, 8, 11, 6], [306, 313, 14, 8, 11, 6], [306, 364, 12, 8, 11, 6], [306, 415, 11, 8, 11, 6], [306, 466, 13, 11, 11, 6], [306, 517, 13, 8, 11, 6], [306, 565, 14, 14, 11, 3], [306, 616, 11, 11, 11, 3], [306, 667, 12, 14, 11, 3], [306, 723, 12, 3, 11, 8], [306, 769, 13, 11, 11, 3], [367, 2, 13, 13, 11, 1], [367, 53, 13, 13, 11, 1], [367, 106, 14, 14, 11, 3], [367, 154, 13, 14, 11, 0], [367, 205, 14, 14, 11, 0], [367, 257, 13, 13, 11, 1], [367, 308, 14, 13, 11, 1], [367, 361, 13, 11, 11, 3], [367, 412, 13, 11, 11, 3], [367, 463, 13, 11, 11, 3], [367, 515, 13, 10, 11, 4], [367, 565, 13, 11, 11, 3], [367, 616, 13, 11, 11, 3], [367, 670, 12, 11, 11, 6], [367, 718, 13, 11, 11, 3], [367, 769, 12, 11, 11, 3], [428, 4, 12, 11, 11, 3], [428, 56, 12, 10, 11, 4], [428, 106, 12, 11, 11, 3], [428, 157, 10, 11, 11, 3], [428, 208, 12, 11, 11, 3], [428, 260, 12, 10, 11, 4], [428, 310, 11, 11, 11, 3], [428, 361, 12, 11, 11, 3], [428, 412, 12, 11, 11, 3], [428, 463, 12, 11, 11, 3], [428, 515, 12, 10, 11, 4], [428, 565, 12, 11, 11, 3], [428, 616, 13, 11, 11, 3], [428, 667, 13, 11, 11, 3], [428, 718, 13, 11, 11, 3], [428, 770, 13, 10, 11, 4], [489, 4, 12, 14, 11, 3], [489, 55, 12, 4, 11, 3], [489, 105, 13, 12, 11, 2], [489, 157, 14, 11, 11, 3], [489, 208, 13, 13, 11, 3], [489, 262, 12, 6, 11, 6], [489, 311, 13, 13, 11, 4], [489, 361, 12, 11, 11, 3], [489, 412, 13, 11, 11, 3], [489, 463, 13, 11, 11, 3], [489, 514, 14, 5, 11, 3], [489, 565, 12, 2, 11, 3], [489, 617, 12, 1, 11, 4], [489, 671, 12, 6, 11, 7], [489, 718, 15, 11, 11, 3], [489, 769, 13, 11, 11, 3], [550, 9, 12, 5, 11, 8], [550, 57, 12, 9, 11, 5], [550, 108, 13, 9, 11, 5], [550, 159, 13, 9, 11, 5], [550, 208, 15, 11, 11, 3], [550, 262, 13, 10, 11, 6], [550, 310, 13, 11, 11, 3], [550, 361, 14, 14, 11, 3], [550, 413, 13, 13, 11, 4], [550, 466, 14, 8, 11, 6], [550, 514, 14, 13, 11, 3], [550, 565, 13, 5, 11, 3], [550, 616, 13, 5, 11, 3], [550, 667, 12, 11, 11, 3], [550, 721, 13, 8, 11, 6], [550, 772, 13, 8, 11, 6], [611, 7, 11, 11, 11, 6], [611, 58, 11, 11, 11, 6], [611, 113, 11, 3, 11, 10], [611, 157, 15, 14, 11, 3], [611, 208, 14, 14, 11, 3], [611, 263, 13, 6, 11, 7], [611, 311, 11, 10, 11, 4], [611, 365, 12, 7, 11, 7], [611, 416, 11, 7, 11, 7], [611, 473, 9, 1, 11, 13], [611, 511, 1, 1, 11, 1], [611, 562, 11, 14, 11, 0], [611, 613, 13, 14, 11, 0], [611, 664, 13, 14, 11, 0], [611, 718, 14, 11, 11, 3], [611, 772, 13, 8, 11, 6], [672, 10, 12, 1, 11, 9], [672, 61, 12, 1, 11, 9], [672, 106, 15, 5, 11, 3], [672, 157, 13, 5, 11, 3], [672, 208, 12, 5, 11, 3], [672, 259, 11, 5, 11, 3], [672, 316, 11, 5, 11, 9], [672, 362, 12, 10, 11, 4], [672, 413, 12, 13, 11, 4], [1, 1, 1, 1, 11, 1], [794, 769, 13, 2, 11, 3], [672, 567, 13, 7, 11, 5], [672, 620, 11, 7, 11, 7], [672, 671, 10, 7, 11, 7], [672, 718, 13, 11, 11, 3], [672, 769, 14, 11, 11, 3], [733, 4, 12, 14, 11, 3], [733, 61, 9, 2, 11, 9], [733, 115, 9, 5, 11, 12], [733, 166, 10, 5, 11, 12], [733, 208, 14, 11, 11, 3], [733, 256, 13, 14, 11, 0], [733, 307, 13, 14, 11, 0], [733, 358, 12, 14, 11, 0], [733, 410, 13, 13, 11, 1], [733, 460, 13, 14, 11, 0], [733, 511, 13, 14, 11, 0], [733, 562, 13, 14, 11, 0], [733, 614, 13, 13, 11, 1], [733, 664, 13, 14, 11, 0], [733, 715, 13, 14, 11, 0], [733, 766, 13, 14, 11, 0], [1, 1, 1, 1, 11, 1], [794, 52, 13, 14, 11, 0], [794, 103, 14, 14, 11, 0], [794, 154, 14, 14, 11, 0], [794, 205, 14, 14, 11, 0], [794, 262, 10, 8, 11, 6], [794, 310, 12, 2, 11, 3], [794, 361, 12, 2, 11, 3], [794, 413, 11, 1, 11, 4], [794, 463, 12, 2, 11, 3], [794, 514, 11, 2, 11, 3], [794, 565, 12, 3, 11, 3], [794, 627, 7, 3, 11, 14], [794, 667, 13, 2, 11, 3], [794, 729, 7, 3, 11, 14], [794, 769, 13, 2, 11, 3], [855, 4, 13, 2, 11, 3], [855, 55, 13, 2, 11, 3], [855, 106, 13, 2, 11, 3], [855, 157, 13, 2, 11, 3], [855, 208, 13, 2, 11, 3], [855, 259, 13, 2, 11, 3], [855, 310, 13, 2, 11, 3], [855, 361, 13, 2, 11, 3], [855, 412, 13, 2, 11, 3], [855, 463, 13, 2, 11, 3], [855, 514, 13, 2, 11, 3], [855, 565, 13, 2, 11, 3], [855, 616, 13, 2, 11, 3], [855, 667, 13, 2, 11, 3], [855, 718, 13, 2, 11, 3], [855, 769, 13, 2, 11, 3]], \"capHeight\": 14, \"widestlogicalchar\": 11, \"widestglyph\": 15, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 1, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 10, 12, 6, 12, 9], [1, 55, 12, 13, 12, 3], [1, 106, 12, 12, 12, 3], [1, 157, 12, 13, 12, 3], [1, 207, 12, 15, 12, 2], [1, 259, 12, 13, 12, 3], [1, 310, 12, 13, 12, 3], [1, 361, 12, 12, 12, 3], [1, 412, 12, 16, 12, 3], [1, 463, 12, 16, 12, 3], [1, 514, 12, 12, 12, 3], [1, 569, 12, 9, 12, 7], [1, 622, 12, 10, 12, 9], [1, 673, 12, 6, 12, 9], [1, 724, 12, 7, 12, 9], [1, 769, 12, 13, 12, 3], [62, 4, 12, 13, 12, 3], [62, 55, 12, 13, 12, 3], [62, 106, 12, 13, 12, 3], [62, 157, 12, 13, 12, 3], [62, 208, 12, 13, 12, 3], [62, 259, 12, 13, 12, 3], [62, 310, 12, 13, 12, 3], [62, 361, 12, 13, 12, 3], [62, 412, 12, 13, 12, 3], [62, 463, 12, 13, 12, 3], [62, 517, 12, 10, 12, 6], [62, 568, 12, 13, 12, 6], [62, 620, 12, 9, 12, 7], [62, 673, 12, 6, 12, 9], [62, 722, 12, 9, 12, 7], [62, 769, 12, 13, 12, 3], [123, 4, 12, 13, 12, 3], [123, 55, 12, 13, 12, 3], [123, 106, 12, 13, 12, 3], [123, 157, 12, 13, 12, 3], [123, 208, 12, 13, 12, 3], [123, 259, 12, 13, 12, 3], [123, 310, 12, 13, 12, 3], [123, 361, 12, 13, 12, 3], [123, 412, 12, 13, 12, 3], [123, 463, 12, 13, 12, 3], [123, 514, 12, 13, 12, 3], [123, 565, 12, 13, 12, 3], [123, 616, 12, 13, 12, 3], [123, 667, 12, 13, 12, 3], [123, 718, 12, 13, 12, 3], [123, 769, 12, 13, 12, 3], [184, 4, 12, 13, 12, 3], [184, 55, 12, 16, 12, 3], [184, 106, 12, 13, 12, 3], [184, 157, 12, 13, 12, 3], [184, 208, 12, 13, 12, 3], [184, 259, 12, 13, 12, 3], [184, 310, 12, 13, 12, 3], [184, 361, 12, 13, 12, 3], [184, 412, 12, 13, 12, 3], [184, 463, 12, 13, 12, 3], [184, 514, 12, 13, 12, 3], [184, 565, 12, 16, 12, 3], [184, 616, 12, 13, 12, 3], [184, 667, 12, 16, 12, 3], [184, 718, 12, 12, 12, 3], [184, 775, 12, 8, 12, 9], [245, 4, 12, 12, 12, 3], [245, 58, 12, 10, 12, 6], [245, 106, 12, 13, 12, 3], [245, 160, 12, 10, 12, 6], [245, 208, 12, 13, 12, 3], [245, 262, 12, 10, 12, 6], [245, 310, 12, 13, 12, 3], [245, 364, 12, 13, 12, 6], [245, 412, 12, 13, 12, 3], [245, 463, 12, 13, 12, 3], [245, 514, 12, 16, 12, 3], [245, 565, 12, 13, 12, 3], [245, 616, 12, 13, 12, 3], [245, 670, 12, 10, 12, 6], [245, 721, 12, 10, 12, 6], [245, 772, 12, 10, 12, 6], [306, 7, 12, 13, 12, 6], [306, 58, 12, 13, 12, 6], [306, 109, 12, 10, 12, 6], [306, 160, 12, 10, 12, 6], [306, 209, 12, 12, 12, 4], [306, 262, 12, 10, 12, 6], [306, 313, 12, 10, 12, 6], [306, 364, 12, 10, 12, 6], [306, 415, 12, 10, 12, 6], [306, 466, 12, 13, 12, 6], [306, 517, 12, 10, 12, 6], [306, 565, 12, 16, 12, 3], [306, 616, 12, 13, 12, 3], [306, 667, 12, 16, 12, 3], [306, 723, 12, 7, 12, 8], [306, 769, 12, 13, 12, 3], [367, 2, 12, 15, 12, 1], [367, 53, 12, 15, 12, 1], [367, 106, 12, 16, 12, 3], [367, 154, 12, 16, 12, 0], [367, 205, 12, 16, 12, 0], [367, 257, 12, 15, 12, 1], [367, 308, 12, 15, 12, 1], [367, 361, 12, 13, 12, 3], [367, 412, 12, 13, 12, 3], [367, 463, 12, 13, 12, 3], [367, 515, 12, 12, 12, 4], [367, 565, 12, 13, 12, 3], [367, 616, 12, 13, 12, 3], [367, 670, 12, 13, 12, 6], [367, 718, 12, 13, 12, 3], [367, 769, 12, 13, 12, 3], [428, 4, 12, 13, 12, 3], [428, 56, 12, 12, 12, 4], [428, 106, 12, 13, 12, 3], [428, 157, 12, 13, 12, 3], [428, 208, 12, 13, 12, 3], [428, 260, 12, 12, 12, 4], [428, 310, 12, 13, 12, 3], [428, 361, 12, 13, 12, 3], [428, 412, 12, 13, 12, 3], [428, 463, 12, 13, 12, 3], [428, 515, 12, 12, 12, 4], [428, 565, 12, 13, 12, 3], [428, 616, 12, 13, 12, 3], [428, 667, 12, 13, 12, 3], [428, 718, 12, 13, 12, 3], [428, 770, 12, 12, 12, 4], [489, 4, 12, 16, 12, 3], [489, 55, 12, 12, 12, 3], [489, 105, 12, 14, 12, 2], [489, 157, 12, 13, 12, 3], [489, 208, 12, 15, 12, 3], [489, 262, 12, 9, 12, 6], [489, 311, 12, 15, 12, 4], [489, 361, 12, 13, 12, 3], [489, 412, 12, 13, 12, 3], [489, 463, 12, 13, 12, 3], [489, 514, 12, 12, 12, 3], [489, 565, 12, 12, 12, 3], [489, 617, 12, 11, 12, 4], [489, 671, 12, 8, 12, 7], [489, 718, 12, 13, 12, 3], [489, 769, 12, 13, 12, 3], [550, 9, 12, 7, 12, 8], [550, 57, 12, 11, 12, 5], [550, 108, 12, 11, 12, 5], [550, 159, 12, 11, 12, 5], [550, 208, 12, 13, 12, 3], [550, 262, 12, 12, 12, 6], [550, 310, 12, 13, 12, 3], [550, 361, 12, 16, 12, 3], [550, 413, 12, 15, 12, 4], [550, 466, 12, 10, 12, 6], [550, 514, 12, 15, 12, 3], [550, 565, 12, 12, 12, 3], [550, 616, 12, 12, 12, 3], [550, 667, 12, 13, 12, 3], [550, 721, 12, 10, 12, 6], [550, 772, 12, 10, 12, 6], [611, 7, 12, 13, 12, 6], [611, 58, 12, 13, 12, 6], [611, 112, 12, 6, 12, 9], [611, 157, 12, 16, 12, 3], [611, 208, 12, 16, 12, 3], [611, 263, 12, 8, 12, 7], [611, 311, 12, 12, 12, 4], [611, 365, 12, 9, 12, 7], [611, 416, 12, 9, 12, 7], [611, 469, 12, 7, 12, 9], [611, 520, 12, 6, 12, 9], [611, 562, 12, 16, 12, 0], [611, 613, 12, 16, 12, 0], [611, 664, 12, 16, 12, 0], [611, 718, 12, 13, 12, 3], [611, 772, 12, 10, 12, 6], [672, 10, 12, 6, 12, 9], [672, 61, 12, 6, 12, 9], [672, 106, 12, 12, 12, 3], [672, 157, 12, 12, 12, 3], [672, 208, 12, 12, 12, 3], [672, 259, 12, 12, 12, 3], [672, 316, 12, 7, 12, 9], [672, 361, 12, 13, 12, 3], [672, 413, 12, 15, 12, 4], [1, 10, 12, 6, 12, 9], [794, 769, 12, 12, 12, 3], [672, 568, 12, 9, 12, 6], [672, 620, 12, 9, 12, 7], [672, 671, 12, 9, 12, 7], [672, 718, 12, 13, 12, 3], [672, 769, 12, 13, 12, 3], [733, 4, 12, 16, 12, 3], [733, 61, 12, 6, 12, 9], [733, 112, 12, 10, 12, 9], [733, 163, 12, 10, 12, 9], [733, 208, 12, 13, 12, 3], [733, 256, 12, 16, 12, 0], [733, 307, 12, 16, 12, 0], [733, 358, 12, 16, 12, 0], [733, 410, 12, 15, 12, 1], [733, 460, 12, 16, 12, 0], [733, 511, 12, 16, 12, 0], [733, 562, 12, 16, 12, 0], [733, 614, 12, 15, 12, 1], [733, 664, 12, 16, 12, 0], [733, 715, 12, 16, 12, 0], [733, 766, 12, 16, 12, 0], [1, 10, 12, 6, 12, 9], [794, 52, 12, 16, 12, 0], [794, 103, 12, 16, 12, 0], [794, 154, 12, 16, 12, 0], [794, 205, 12, 16, 12, 0], [794, 262, 12, 10, 12, 6], [794, 310, 12, 12, 12, 3], [794, 361, 12, 12, 12, 3], [794, 413, 12, 11, 12, 4], [794, 463, 12, 12, 12, 3], [794, 514, 12, 12, 12, 3], [794, 565, 12, 12, 12, 3], [794, 622, 12, 10, 12, 9], [794, 667, 12, 12, 12, 3], [794, 724, 12, 10, 12, 9], [794, 769, 12, 12, 12, 3], [855, 4, 12, 12, 12, 3], [855, 55, 12, 12, 12, 3], [855, 106, 12, 12, 12, 3], [855, 157, 12, 12, 12, 3], [855, 208, 12, 12, 12, 3], [855, 259, 12, 12, 12, 3], [855, 310, 12, 12, 12, 3], [855, 361, 12, 12, 12, 3], [855, 412, 12, 12, 12, 3], [855, 463, 12, 12, 12, 3], [855, 514, 12, 12, 12, 3], [855, 565, 12, 12, 12, 3], [855, 616, 12, 12, 12, 3], [855, 667, 12, 12, 12, 3], [855, 718, 12, 12, 12, 3], [855, 769, 12, 12, 12, 3]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 16}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 11, 6, 11, 8], [1, 55, 11, 11, 11, 3], [1, 106, 11, 11, 11, 3], [1, 157, 11, 11, 11, 3], [1, 207, 11, 13, 11, 2], [1, 259, 11, 11, 11, 3], [1, 310, 11, 11, 11, 3], [1, 361, 11, 11, 11, 3], [1, 412, 11, 14, 11, 3], [1, 463, 11, 14, 11, 3], [1, 514, 11, 11, 11, 3], [1, 569, 11, 7, 11, 7], [1, 621, 11, 9, 11, 8], [1, 672, 11, 6, 11, 8], [1, 723, 11, 6, 11, 8], [1, 769, 11, 11, 11, 3], [62, 4, 11, 11, 11, 3], [62, 55, 11, 11, 11, 3], [62, 106, 11, 11, 11, 3], [62, 157, 11, 11, 11, 3], [62, 208, 11, 11, 11, 3], [62, 259, 11, 11, 11, 3], [62, 310, 11, 11, 11, 3], [62, 361, 11, 11, 11, 3], [62, 412, 11, 11, 11, 3], [62, 463, 11, 11, 11, 3], [62, 517, 11, 8, 11, 6], [62, 568, 11, 11, 11, 6], [62, 620, 11, 7, 11, 7], [62, 672, 11, 6, 11, 8], [62, 722, 11, 7, 11, 7], [62, 769, 11, 11, 11, 3], [123, 4, 11, 11, 11, 3], [123, 55, 11, 11, 11, 3], [123, 106, 11, 11, 11, 3], [123, 157, 11, 11, 11, 3], [123, 208, 11, 11, 11, 3], [123, 259, 11, 11, 11, 3], [123, 310, 11, 11, 11, 3], [123, 361, 11, 11, 11, 3], [123, 412, 11, 11, 11, 3], [123, 463, 11, 11, 11, 3], [123, 514, 11, 11, 11, 3], [123, 565, 11, 11, 11, 3], [123, 616, 11, 11, 11, 3], [123, 667, 11, 11, 11, 3], [123, 718, 11, 11, 11, 3], [123, 769, 11, 11, 11, 3], [184, 4, 11, 11, 11, 3], [184, 55, 11, 14, 11, 3], [184, 106, 11, 11, 11, 3], [184, 157, 11, 11, 11, 3], [184, 208, 11, 11, 11, 3], [184, 259, 11, 11, 11, 3], [184, 310, 11, 11, 11, 3], [184, 361, 11, 11, 11, 3], [184, 412, 11, 11, 11, 3], [184, 463, 11, 11, 11, 3], [184, 514, 11, 11, 11, 3], [184, 565, 11, 14, 11, 3], [184, 616, 11, 11, 11, 3], [184, 667, 11, 14, 11, 3], [184, 718, 11, 11, 11, 3], [184, 774, 11, 7, 11, 8], [245, 4, 11, 11, 11, 3], [245, 58, 11, 8, 11, 6], [245, 106, 11, 11, 11, 3], [245, 160, 11, 8, 11, 6], [245, 208, 11, 11, 11, 3], [245, 262, 11, 8, 11, 6], [245, 310, 11, 11, 11, 3], [245, 364, 11, 11, 11, 6], [245, 412, 11, 11, 11, 3], [245, 463, 11, 11, 11, 3], [245, 514, 11, 14, 11, 3], [245, 565, 11, 11, 11, 3], [245, 616, 11, 11, 11, 3], [245, 670, 11, 8, 11, 6], [245, 721, 11, 8, 11, 6], [245, 772, 11, 8, 11, 6], [306, 7, 11, 11, 11, 6], [306, 58, 11, 11, 11, 6], [306, 109, 11, 8, 11, 6], [306, 160, 11, 8, 11, 6], [306, 209, 11, 10, 11, 4], [306, 262, 11, 8, 11, 6], [306, 313, 11, 8, 11, 6], [306, 364, 11, 8, 11, 6], [306, 415, 11, 8, 11, 6], [306, 466, 11, 11, 11, 6], [306, 517, 11, 8, 11, 6], [306, 565, 11, 14, 11, 3], [306, 616, 11, 11, 11, 3], [306, 667, 11, 14, 11, 3], [306, 723, 11, 6, 11, 8], [306, 769, 11, 11, 11, 3], [367, 2, 11, 13, 11, 1], [367, 53, 11, 13, 11, 1], [367, 106, 11, 14, 11, 3], [367, 154, 11, 14, 11, 0], [367, 205, 11, 14, 11, 0], [367, 257, 11, 13, 11, 1], [367, 308, 11, 13, 11, 1], [367, 361, 11, 11, 11, 3], [367, 412, 11, 11, 11, 3], [367, 463, 11, 11, 11, 3], [367, 515, 11, 10, 11, 4], [367, 565, 11, 11, 11, 3], [367, 616, 11, 11, 11, 3], [367, 670, 11, 11, 11, 6], [367, 718, 11, 11, 11, 3], [367, 769, 11, 11, 11, 3], [428, 4, 11, 11, 11, 3], [428, 56, 11, 10, 11, 4], [428, 106, 11, 11, 11, 3], [428, 157, 11, 11, 11, 3], [428, 208, 11, 11, 11, 3], [428, 260, 11, 10, 11, 4], [428, 310, 11, 11, 11, 3], [428, 361, 11, 11, 11, 3], [428, 412, 11, 11, 11, 3], [428, 463, 11, 11, 11, 3], [428, 515, 11, 10, 11, 4], [428, 565, 11, 11, 11, 3], [428, 616, 11, 11, 11, 3], [428, 667, 11, 11, 11, 3], [428, 718, 11, 11, 11, 3], [428, 770, 11, 10, 11, 4], [489, 4, 11, 14, 11, 3], [489, 55, 11, 11, 11, 3], [489, 105, 11, 12, 11, 2], [489, 157, 11, 11, 11, 3], [489, 208, 11, 13, 11, 3], [489, 262, 11, 8, 11, 6], [489, 311, 11, 13, 11, 4], [489, 361, 11, 11, 11, 3], [489, 412, 11, 11, 11, 3], [489, 463, 11, 11, 11, 3], [489, 514, 11, 11, 11, 3], [489, 565, 11, 11, 11, 3], [489, 617, 11, 10, 11, 4], [489, 671, 11, 7, 11, 7], [489, 718, 11, 11, 11, 3], [489, 769, 11, 11, 11, 3], [550, 9, 11, 6, 11, 8], [550, 57, 11, 9, 11, 5], [550, 108, 11, 9, 11, 5], [550, 159, 11, 9, 11, 5], [550, 208, 11, 11, 11, 3], [550, 262, 11, 10, 11, 6], [550, 310, 11, 11, 11, 3], [550, 361, 11, 14, 11, 3], [550, 413, 11, 13, 11, 4], [550, 466, 11, 8, 11, 6], [550, 514, 11, 13, 11, 3], [550, 565, 11, 11, 11, 3], [550, 616, 11, 11, 11, 3], [550, 667, 11, 11, 11, 3], [550, 721, 11, 8, 11, 6], [550, 772, 11, 8, 11, 6], [611, 7, 11, 11, 11, 6], [611, 58, 11, 11, 11, 6], [611, 111, 11, 6, 11, 8], [611, 157, 11, 14, 11, 3], [611, 208, 11, 14, 11, 3], [611, 263, 11, 7, 11, 7], [611, 311, 11, 10, 11, 4], [611, 365, 11, 7, 11, 7], [611, 416, 11, 7, 11, 7], [611, 468, 11, 6, 11, 8], [611, 519, 11, 6, 11, 8], [611, 562, 11, 14, 11, 0], [611, 613, 11, 14, 11, 0], [611, 664, 11, 14, 11, 0], [611, 718, 11, 11, 11, 3], [611, 772, 11, 8, 11, 6], [672, 9, 11, 6, 11, 8], [672, 60, 11, 6, 11, 8], [672, 106, 11, 11, 11, 3], [672, 157, 11, 11, 11, 3], [672, 208, 11, 11, 11, 3], [672, 259, 11, 11, 11, 3], [672, 315, 11, 6, 11, 8], [672, 361, 11, 11, 11, 3], [672, 413, 11, 13, 11, 4], [1, 9, 11, 6, 11, 8], [794, 769, 11, 11, 11, 3], [672, 568, 11, 8, 11, 6], [672, 620, 11, 7, 11, 7], [672, 671, 11, 7, 11, 7], [672, 718, 11, 11, 11, 3], [672, 769, 11, 11, 11, 3], [733, 4, 11, 14, 11, 3], [733, 60, 11, 6, 11, 8], [733, 111, 11, 9, 11, 8], [733, 162, 11, 9, 11, 8], [733, 208, 11, 11, 11, 3], [733, 256, 11, 14, 11, 0], [733, 307, 11, 14, 11, 0], [733, 358, 11, 14, 11, 0], [733, 410, 11, 13, 11, 1], [733, 460, 11, 14, 11, 0], [733, 511, 11, 14, 11, 0], [733, 562, 11, 14, 11, 0], [733, 614, 11, 13, 11, 1], [733, 664, 11, 14, 11, 0], [733, 715, 11, 14, 11, 0], [733, 766, 11, 14, 11, 0], [1, 9, 11, 6, 11, 8], [794, 52, 11, 14, 11, 0], [794, 103, 11, 14, 11, 0], [794, 154, 11, 14, 11, 0], [794, 205, 11, 14, 11, 0], [794, 262, 11, 8, 11, 6], [794, 310, 11, 11, 11, 3], [794, 361, 11, 11, 11, 3], [794, 413, 11, 10, 11, 4], [794, 463, 11, 11, 11, 3], [794, 514, 11, 11, 11, 3], [794, 565, 11, 11, 11, 3], [794, 621, 11, 9, 11, 8], [794, 667, 11, 11, 11, 3], [794, 723, 11, 9, 11, 8], [794, 769, 11, 11, 11, 3], [855, 4, 11, 11, 11, 3], [855, 55, 11, 11, 11, 3], [855, 106, 11, 11, 11, 3], [855, 157, 11, 11, 11, 3], [855, 208, 11, 11, 11, 3], [855, 259, 11, 11, 11, 3], [855, 310, 11, 11, 11, 3], [855, 361, 11, 11, 11, 3], [855, 412, 11, 11, 11, 3], [855, 463, 11, 11, 11, 3], [855, 514, 11, 11, 11, 3], [855, 565, 11, 11, 11, 3], [855, 616, 11, 11, 11, 3], [855, 667, 11, 11, 11, 3], [855, 718, 11, 11, 11, 3], [855, 769, 11, 11, 11, 3]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 14}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 16, 1], [1, 57, 14, 15, 16, 5], [1, 108, 16, 7, 16, 5], [1, 159, 17, 15, 16, 5], [1, 209, 17, 17, 16, 4], [1, 261, 19, 15, 16, 5], [1, 312, 16, 15, 16, 5], [1, 363, 15, 7, 16, 5], [1, 413, 18, 19, 16, 4], [1, 464, 16, 19, 16, 4], [1, 515, 17, 10, 16, 4], [1, 571, 16, 11, 16, 9], [1, 628, 12, 9, 16, 15], [1, 676, 15, 3, 16, 12], [1, 730, 12, 5, 16, 15], [1, 770, 19, 16, 16, 4], [62, 6, 17, 15, 16, 5], [62, 57, 15, 15, 16, 5], [62, 108, 18, 15, 16, 5], [62, 159, 17, 15, 16, 5], [62, 210, 17, 15, 16, 5], [62, 261, 17, 15, 16, 5], [62, 312, 17, 15, 16, 5], [62, 363, 18, 15, 16, 5], [62, 414, 17, 15, 16, 5], [62, 465, 17, 15, 16, 5], [62, 519, 14, 12, 16, 8], [62, 570, 14, 16, 16, 8], [62, 622, 18, 11, 16, 9], [62, 675, 17, 6, 16, 11], [62, 724, 17, 11, 16, 9], [62, 771, 17, 15, 16, 5], [123, 5, 18, 16, 16, 4], [123, 57, 15, 15, 16, 5], [123, 108, 18, 15, 16, 5], [123, 159, 18, 15, 16, 5], [123, 210, 17, 15, 16, 5], [123, 261, 17, 15, 16, 5], [123, 312, 18, 15, 16, 5], [123, 363, 18, 15, 16, 5], [123, 414, 18, 15, 16, 5], [123, 465, 17, 15, 16, 5], [123, 516, 17, 15, 16, 5], [123, 567, 17, 15, 16, 5], [123, 618, 14, 15, 16, 5], [123, 669, 19, 15, 16, 5], [123, 720, 18, 15, 16, 5], [123, 771, 17, 15, 16, 5], [184, 6, 17, 15, 16, 5], [184, 57, 17, 18, 16, 5], [184, 108, 16, 15, 16, 5], [184, 159, 17, 15, 16, 5], [184, 210, 18, 15, 16, 5], [184, 261, 18, 15, 16, 5], [184, 312, 18, 15, 16, 5], [184, 363, 19, 15, 16, 5], [184, 414, 18, 15, 16, 5], [184, 465, 18, 15, 16, 5], [184, 516, 18, 15, 16, 5], [184, 566, 18, 19, 16, 4], [184, 617, 16, 16, 16, 4], [184, 668, 16, 19, 16, 4], [184, 721, 17, 11, 16, 6], [184, 784, 15, 3, 16, 18], [245, 5, 15, 5, 16, 4], [245, 60, 17, 12, 16, 8], [245, 107, 17, 16, 16, 4], [245, 162, 17, 12, 16, 8], [245, 209, 18, 16, 16, 4], [245, 264, 17, 12, 16, 8], [245, 311, 19, 16, 16, 4], [245, 366, 17, 16, 16, 8], [245, 413, 16, 16, 16, 4], [245, 464, 14, 16, 16, 4], [245, 515, 16, 20, 16, 4], [245, 566, 16, 16, 16, 4], [245, 617, 14, 16, 16, 4], [245, 672, 17, 12, 16, 8], [245, 723, 16, 12, 16, 8], [245, 774, 16, 12, 16, 8], [306, 9, 17, 16, 16, 8], [306, 60, 17, 16, 16, 8], [306, 111, 17, 12, 16, 8], [306, 162, 16, 12, 16, 8], [306, 210, 16, 15, 16, 5], [306, 264, 17, 12, 16, 8], [306, 315, 18, 12, 16, 8], [306, 366, 19, 12, 16, 8], [306, 417, 17, 12, 16, 8], [306, 468, 18, 16, 16, 8], [306, 519, 17, 12, 16, 8], [306, 566, 18, 19, 16, 4], [306, 617, 13, 16, 16, 4], [306, 668, 15, 19, 16, 4], [306, 727, 16, 5, 16, 12], [306, 770, 17, 16, 16, 4], [367, 2, 17, 19, 16, 1], [367, 54, 16, 18, 16, 2], [367, 108, 18, 18, 16, 5], [367, 154, 17, 20, 16, 0], [367, 206, 18, 19, 16, 1], [367, 257, 17, 19, 16, 1], [367, 308, 18, 19, 16, 1], [367, 362, 17, 16, 16, 4], [367, 413, 17, 16, 16, 4], [367, 465, 17, 15, 16, 5], [367, 516, 17, 15, 16, 5], [367, 567, 17, 15, 16, 5], [367, 617, 17, 16, 16, 4], [367, 672, 16, 16, 16, 8], [367, 719, 17, 16, 16, 4], [367, 770, 17, 16, 16, 4], [428, 6, 17, 15, 16, 5], [428, 57, 17, 15, 16, 5], [428, 107, 16, 16, 16, 4], [428, 158, 15, 16, 16, 4], [428, 210, 16, 15, 16, 5], [428, 261, 16, 15, 16, 5], [428, 312, 15, 15, 16, 5], [428, 362, 16, 16, 16, 4], [428, 413, 16, 16, 16, 4], [428, 465, 16, 15, 16, 5], [428, 516, 16, 15, 16, 5], [428, 567, 16, 15, 16, 5], [428, 617, 17, 16, 16, 4], [428, 668, 17, 16, 16, 4], [428, 720, 17, 15, 16, 5], [428, 771, 17, 15, 16, 5], [489, 5, 17, 19, 16, 4], [489, 56, 16, 7, 16, 4], [489, 106, 17, 18, 16, 3], [489, 158, 18, 16, 16, 4], [489, 209, 17, 19, 16, 4], [489, 264, 16, 9, 16, 8], [489, 311, 17, 19, 16, 4], [489, 362, 16, 16, 16, 4], [489, 413, 18, 16, 16, 4], [489, 464, 18, 16, 16, 4], [489, 516, 18, 9, 16, 5], [489, 566, 16, 5, 16, 4], [489, 618, 16, 4, 16, 5], [489, 673, 17, 10, 16, 9], [489, 720, 19, 15, 16, 5], [489, 771, 18, 15, 16, 5], [550, 11, 15, 8, 16, 10], [550, 59, 16, 13, 16, 7], [550, 110, 18, 13, 16, 7], [550, 161, 18, 13, 16, 7], [550, 210, 18, 15, 16, 5], [550, 264, 17, 15, 16, 8], [550, 311, 17, 16, 16, 4], [550, 363, 18, 19, 16, 5], [550, 414, 19, 19, 16, 5], [550, 468, 18, 12, 16, 8], [550, 515, 18, 19, 16, 4], [550, 566, 17, 8, 16, 4], [550, 617, 17, 8, 16, 4], [550, 668, 17, 16, 16, 4], [550, 723, 18, 12, 16, 8], [550, 774, 17, 12, 16, 8], [611, 9, 15, 16, 16, 8], [611, 60, 14, 16, 16, 8], [611, 116, 16, 6, 16, 13], [611, 157, 20, 19, 16, 3], [611, 209, 19, 19, 16, 4], [611, 266, 17, 8, 16, 10], [611, 311, 15, 16, 16, 4], [611, 366, 18, 11, 16, 8], [611, 417, 16, 11, 16, 8], [611, 476, 14, 4, 16, 16], [611, 511, 1, 1, 16, 1], [611, 562, 16, 20, 16, 0], [611, 614, 17, 19, 16, 1], [611, 665, 17, 19, 16, 1], [611, 720, 18, 15, 16, 5], [611, 774, 18, 12, 16, 8], [672, 13, 16, 3, 16, 12], [672, 64, 16, 3, 16, 12], [672, 107, 17, 9, 16, 4], [672, 158, 17, 9, 16, 4], [672, 209, 15, 9, 16, 4], [672, 260, 15, 9, 16, 4], [672, 318, 16, 9, 16, 11], [672, 363, 16, 15, 16, 5], [672, 414, 17, 19, 16, 5], [1, 1, 1, 1, 16, 1], [794, 770, 16, 5, 16, 4], [672, 569, 17, 10, 16, 7], [672, 622, 15, 11, 16, 9], [672, 673, 14, 11, 16, 9], [672, 719, 17, 16, 16, 4], [672, 770, 18, 16, 16, 4], [733, 5, 17, 19, 16, 4], [733, 64, 13, 5, 16, 12], [733, 118, 12, 9, 16, 15], [733, 169, 14, 9, 16, 15], [733, 210, 19, 15, 16, 5], [733, 257, 17, 19, 16, 1], [733, 308, 17, 19, 16, 1], [733, 358, 17, 20, 16, 0], [733, 410, 17, 19, 16, 1], [733, 460, 17, 20, 16, 0], [733, 511, 17, 20, 16, 0], [733, 563, 17, 19, 16, 1], [733, 614, 17, 19, 16, 1], [733, 664, 17, 20, 16, 0], [733, 715, 17, 20, 16, 0], [733, 767, 17, 19, 16, 1], [1, 1, 1, 1, 16, 1], [794, 52, 17, 20, 16, 0], [794, 103, 18, 20, 16, 0], [794, 155, 18, 19, 16, 1], [794, 205, 18, 20, 16, 0], [794, 264, 14, 12, 16, 8], [794, 312, 16, 4, 16, 5], [794, 363, 16, 4, 16, 5], [794, 415, 16, 3, 16, 6], [794, 464, 16, 5, 16, 4], [794, 515, 15, 5, 16, 4], [794, 566, 15, 5, 16, 4], [794, 631, 11, 6, 16, 18], [794, 668, 15, 5, 16, 4], [794, 733, 11, 6, 16, 18], [794, 770, 16, 5, 16, 4], [855, 5, 16, 5, 16, 4], [855, 56, 16, 5, 16, 4], [855, 107, 16, 5, 16, 4], [855, 158, 16, 5, 16, 4], [855, 209, 16, 5, 16, 4], [855, 260, 16, 5, 16, 4], [855, 311, 16, 5, 16, 4], [855, 362, 16, 5, 16, 4], [855, 413, 16, 5, 16, 4], [855, 464, 16, 5, 16, 4], [855, 515, 16, 5, 16, 4], [855, 566, 16, 5, 16, 4], [855, 617, 16, 5, 16, 4], [855, 668, 16, 5, 16, 4], [855, 719, 16, 5, 16, 4], [855, 770, 16, 5, 16, 4]], \"capHeight\": 19, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 15, 1], [1, 57, 13, 13, 15, 5], [1, 108, 15, 5, 15, 5], [1, 159, 16, 13, 15, 5], [1, 209, 16, 15, 15, 4], [1, 261, 18, 13, 15, 5], [1, 312, 15, 13, 15, 5], [1, 363, 14, 5, 15, 5], [1, 413, 17, 17, 15, 4], [1, 464, 15, 17, 15, 4], [1, 515, 16, 8, 15, 4], [1, 571, 15, 9, 15, 9], [1, 628, 11, 7, 15, 15], [1, 676, 14, 1, 15, 12], [1, 730, 11, 3, 15, 15], [1, 770, 18, 14, 15, 4], [62, 6, 16, 13, 15, 5], [62, 57, 14, 13, 15, 5], [62, 108, 17, 13, 15, 5], [62, 159, 16, 13, 15, 5], [62, 210, 16, 13, 15, 5], [62, 261, 16, 13, 15, 5], [62, 312, 16, 13, 15, 5], [62, 363, 17, 13, 15, 5], [62, 414, 16, 13, 15, 5], [62, 465, 16, 13, 15, 5], [62, 519, 13, 10, 15, 8], [62, 570, 13, 14, 15, 8], [62, 622, 17, 9, 15, 9], [62, 675, 16, 4, 15, 11], [62, 724, 16, 9, 15, 9], [62, 771, 16, 13, 15, 5], [123, 5, 17, 14, 15, 4], [123, 57, 14, 13, 15, 5], [123, 108, 17, 13, 15, 5], [123, 159, 17, 13, 15, 5], [123, 210, 16, 13, 15, 5], [123, 261, 16, 13, 15, 5], [123, 312, 17, 13, 15, 5], [123, 363, 17, 13, 15, 5], [123, 414, 17, 13, 15, 5], [123, 465, 16, 13, 15, 5], [123, 516, 16, 13, 15, 5], [123, 567, 16, 13, 15, 5], [123, 618, 13, 13, 15, 5], [123, 669, 18, 13, 15, 5], [123, 720, 17, 13, 15, 5], [123, 771, 16, 13, 15, 5], [184, 6, 16, 13, 15, 5], [184, 57, 16, 16, 15, 5], [184, 108, 15, 13, 15, 5], [184, 159, 16, 13, 15, 5], [184, 210, 17, 13, 15, 5], [184, 261, 17, 13, 15, 5], [184, 312, 17, 13, 15, 5], [184, 363, 18, 13, 15, 5], [184, 414, 17, 13, 15, 5], [184, 465, 17, 13, 15, 5], [184, 516, 17, 13, 15, 5], [184, 566, 17, 17, 15, 4], [184, 617, 15, 14, 15, 4], [184, 668, 15, 17, 15, 4], [184, 721, 16, 9, 15, 6], [184, 784, 14, 1, 15, 18], [245, 5, 14, 3, 15, 4], [245, 60, 16, 10, 15, 8], [245, 107, 16, 14, 15, 4], [245, 162, 16, 10, 15, 8], [245, 209, 17, 14, 15, 4], [245, 264, 16, 10, 15, 8], [245, 311, 18, 14, 15, 4], [245, 366, 16, 14, 15, 8], [245, 413, 15, 14, 15, 4], [245, 464, 13, 14, 15, 4], [245, 515, 15, 18, 15, 4], [245, 566, 15, 14, 15, 4], [245, 617, 13, 14, 15, 4], [245, 672, 16, 10, 15, 8], [245, 723, 15, 10, 15, 8], [245, 774, 15, 10, 15, 8], [306, 9, 16, 14, 15, 8], [306, 60, 16, 14, 15, 8], [306, 111, 16, 10, 15, 8], [306, 162, 15, 10, 15, 8], [306, 210, 15, 13, 15, 5], [306, 264, 16, 10, 15, 8], [306, 315, 17, 10, 15, 8], [306, 366, 18, 10, 15, 8], [306, 417, 16, 10, 15, 8], [306, 468, 17, 14, 15, 8], [306, 519, 16, 10, 15, 8], [306, 566, 17, 17, 15, 4], [306, 617, 12, 14, 15, 4], [306, 668, 14, 17, 15, 4], [306, 727, 15, 3, 15, 12], [306, 770, 16, 14, 15, 4], [367, 2, 16, 17, 15, 1], [367, 54, 15, 16, 15, 2], [367, 108, 17, 16, 15, 5], [367, 154, 16, 18, 15, 0], [367, 206, 17, 17, 15, 1], [367, 257, 16, 17, 15, 1], [367, 308, 17, 17, 15, 1], [367, 362, 16, 14, 15, 4], [367, 413, 16, 14, 15, 4], [367, 465, 16, 13, 15, 5], [367, 516, 16, 13, 15, 5], [367, 567, 16, 13, 15, 5], [367, 617, 16, 14, 15, 4], [367, 672, 15, 14, 15, 8], [367, 719, 16, 14, 15, 4], [367, 770, 16, 14, 15, 4], [428, 6, 16, 13, 15, 5], [428, 57, 16, 13, 15, 5], [428, 107, 15, 14, 15, 4], [428, 158, 14, 14, 15, 4], [428, 210, 15, 13, 15, 5], [428, 261, 15, 13, 15, 5], [428, 312, 14, 13, 15, 5], [428, 362, 15, 14, 15, 4], [428, 413, 15, 14, 15, 4], [428, 465, 15, 13, 15, 5], [428, 516, 15, 13, 15, 5], [428, 567, 15, 13, 15, 5], [428, 617, 16, 14, 15, 4], [428, 668, 16, 14, 15, 4], [428, 720, 16, 13, 15, 5], [428, 771, 16, 13, 15, 5], [489, 5, 16, 17, 15, 4], [489, 56, 15, 5, 15, 4], [489, 106, 16, 16, 15, 3], [489, 158, 17, 14, 15, 4], [489, 209, 16, 17, 15, 4], [489, 264, 15, 7, 15, 8], [489, 311, 16, 17, 15, 4], [489, 362, 15, 14, 15, 4], [489, 413, 17, 14, 15, 4], [489, 464, 17, 14, 15, 4], [489, 516, 17, 7, 15, 5], [489, 566, 15, 3, 15, 4], [489, 618, 15, 2, 15, 5], [489, 673, 16, 8, 15, 9], [489, 720, 18, 13, 15, 5], [489, 771, 17, 13, 15, 5], [550, 11, 14, 6, 15, 10], [550, 59, 15, 11, 15, 7], [550, 110, 17, 11, 15, 7], [550, 161, 17, 11, 15, 7], [550, 210, 17, 13, 15, 5], [550, 264, 16, 13, 15, 8], [550, 311, 16, 14, 15, 4], [550, 363, 17, 17, 15, 5], [550, 414, 18, 17, 15, 5], [550, 468, 17, 10, 15, 8], [550, 515, 17, 17, 15, 4], [550, 566, 16, 6, 15, 4], [550, 617, 16, 6, 15, 4], [550, 668, 16, 14, 15, 4], [550, 723, 17, 10, 15, 8], [550, 774, 16, 10, 15, 8], [611, 9, 14, 14, 15, 8], [611, 60, 13, 14, 15, 8], [611, 116, 15, 4, 15, 13], [611, 157, 19, 17, 15, 3], [611, 209, 18, 17, 15, 4], [611, 266, 16, 6, 15, 10], [611, 311, 14, 14, 15, 4], [611, 366, 17, 9, 15, 8], [611, 417, 15, 9, 15, 8], [611, 476, 13, 2, 15, 16], [611, 511, 1, 1, 15, 1], [611, 562, 15, 18, 15, 0], [611, 614, 16, 17, 15, 1], [611, 665, 16, 17, 15, 1], [611, 720, 17, 13, 15, 5], [611, 774, 17, 10, 15, 8], [672, 13, 15, 1, 15, 12], [672, 64, 15, 1, 15, 12], [672, 107, 16, 7, 15, 4], [672, 158, 16, 7, 15, 4], [672, 209, 14, 7, 15, 4], [672, 260, 14, 7, 15, 4], [672, 318, 15, 7, 15, 11], [672, 363, 15, 13, 15, 5], [672, 414, 16, 17, 15, 5], [1, 1, 1, 1, 15, 1], [794, 770, 15, 3, 15, 4], [672, 569, 16, 8, 15, 7], [672, 622, 14, 9, 15, 9], [672, 673, 13, 9, 15, 9], [672, 719, 16, 14, 15, 4], [672, 770, 17, 14, 15, 4], [733, 5, 16, 17, 15, 4], [733, 64, 12, 3, 15, 12], [733, 118, 11, 7, 15, 15], [733, 169, 13, 7, 15, 15], [733, 210, 18, 13, 15, 5], [733, 257, 16, 17, 15, 1], [733, 308, 16, 17, 15, 1], [733, 358, 14, 18, 15, 0], [733, 410, 16, 17, 15, 1], [733, 460, 16, 18, 15, 0], [733, 511, 16, 18, 15, 0], [733, 563, 16, 17, 15, 1], [733, 614, 16, 17, 15, 1], [733, 664, 16, 18, 15, 0], [733, 715, 16, 18, 15, 0], [733, 767, 16, 17, 15, 1], [1, 1, 1, 1, 15, 1], [794, 52, 16, 18, 15, 0], [794, 103, 17, 18, 15, 0], [794, 155, 17, 17, 15, 1], [794, 205, 17, 18, 15, 0], [794, 264, 13, 10, 15, 8], [794, 312, 15, 2, 15, 5], [794, 363, 15, 2, 15, 5], [794, 415, 15, 1, 15, 6], [794, 464, 15, 3, 15, 4], [794, 515, 14, 3, 15, 4], [794, 566, 14, 3, 15, 4], [794, 631, 10, 4, 15, 18], [794, 668, 14, 3, 15, 4], [794, 733, 10, 4, 15, 18], [794, 770, 15, 3, 15, 4], [855, 5, 15, 3, 15, 4], [855, 56, 15, 3, 15, 4], [855, 107, 15, 3, 15, 4], [855, 158, 15, 3, 15, 4], [855, 209, 15, 3, 15, 4], [855, 260, 15, 3, 15, 4], [855, 311, 15, 3, 15, 4], [855, 362, 15, 3, 15, 4], [855, 413, 15, 3, 15, 4], [855, 464, 15, 3, 15, 4], [855, 515, 15, 3, 15, 4], [855, 566, 15, 3, 15, 4], [855, 617, 15, 3, 15, 4], [855, 668, 15, 3, 15, 4], [855, 719, 15, 3, 15, 4], [855, 770, 15, 3, 15, 4]], \"capHeight\": 18, \"widestlogicalchar\": 15, \"widestglyph\": 19, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 1, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 16, 6, 16, 13], [1, 57, 16, 15, 16, 5], [1, 108, 16, 14, 16, 5], [1, 159, 16, 15, 16, 5], [1, 209, 16, 17, 16, 4], [1, 261, 16, 15, 16, 5], [1, 312, 16, 15, 16, 5], [1, 363, 16, 14, 16, 5], [1, 413, 16, 19, 16, 4], [1, 464, 16, 19, 16, 4], [1, 515, 16, 15, 16, 4], [1, 571, 16, 11, 16, 9], [1, 626, 16, 11, 16, 13], [1, 676, 16, 7, 16, 12], [1, 728, 16, 7, 16, 13], [1, 770, 16, 16, 16, 4], [62, 6, 16, 15, 16, 5], [62, 57, 16, 15, 16, 5], [62, 108, 16, 15, 16, 5], [62, 159, 16, 15, 16, 5], [62, 210, 16, 15, 16, 5], [62, 261, 16, 15, 16, 5], [62, 312, 16, 15, 16, 5], [62, 363, 16, 15, 16, 5], [62, 414, 16, 15, 16, 5], [62, 465, 16, 15, 16, 5], [62, 519, 16, 12, 16, 8], [62, 570, 16, 16, 16, 8], [62, 622, 16, 11, 16, 9], [62, 675, 16, 8, 16, 11], [62, 724, 16, 11, 16, 9], [62, 771, 16, 15, 16, 5], [123, 5, 16, 16, 16, 4], [123, 57, 16, 15, 16, 5], [123, 108, 16, 15, 16, 5], [123, 159, 16, 15, 16, 5], [123, 210, 16, 15, 16, 5], [123, 261, 16, 15, 16, 5], [123, 312, 16, 15, 16, 5], [123, 363, 16, 15, 16, 5], [123, 414, 16, 15, 16, 5], [123, 465, 16, 15, 16, 5], [123, 516, 16, 15, 16, 5], [123, 567, 16, 15, 16, 5], [123, 618, 16, 15, 16, 5], [123, 669, 16, 15, 16, 5], [123, 720, 16, 15, 16, 5], [123, 771, 16, 15, 16, 5], [184, 6, 16, 15, 16, 5], [184, 57, 16, 18, 16, 5], [184, 108, 16, 15, 16, 5], [184, 159, 16, 15, 16, 5], [184, 210, 16, 15, 16, 5], [184, 261, 16, 15, 16, 5], [184, 312, 16, 15, 16, 5], [184, 363, 16, 15, 16, 5], [184, 414, 16, 15, 16, 5], [184, 465, 16, 15, 16, 5], [184, 516, 16, 15, 16, 5], [184, 566, 16, 19, 16, 4], [184, 617, 16, 16, 16, 4], [184, 668, 16, 19, 16, 4], [184, 721, 16, 13, 16, 6], [184, 779, 16, 8, 16, 13], [245, 5, 16, 15, 16, 4], [245, 60, 16, 12, 16, 8], [245, 107, 16, 16, 16, 4], [245, 162, 16, 12, 16, 8], [245, 209, 16, 16, 16, 4], [245, 264, 16, 12, 16, 8], [245, 311, 16, 16, 16, 4], [245, 366, 16, 16, 16, 8], [245, 413, 16, 16, 16, 4], [245, 464, 16, 16, 16, 4], [245, 515, 16, 20, 16, 4], [245, 566, 16, 16, 16, 4], [245, 617, 16, 16, 16, 4], [245, 672, 16, 12, 16, 8], [245, 723, 16, 12, 16, 8], [245, 774, 16, 12, 16, 8], [306, 9, 16, 16, 16, 8], [306, 60, 16, 16, 16, 8], [306, 111, 16, 12, 16, 8], [306, 162, 16, 12, 16, 8], [306, 210, 16, 15, 16, 5], [306, 264, 16, 12, 16, 8], [306, 315, 16, 12, 16, 8], [306, 366, 16, 12, 16, 8], [306, 417, 16, 12, 16, 8], [306, 468, 16, 16, 16, 8], [306, 519, 16, 12, 16, 8], [306, 566, 16, 19, 16, 4], [306, 617, 16, 16, 16, 4], [306, 668, 16, 19, 16, 4], [306, 727, 16, 7, 16, 12], [306, 770, 16, 16, 16, 4], [367, 2, 16, 19, 16, 1], [367, 54, 16, 18, 16, 2], [367, 108, 16, 18, 16, 5], [367, 154, 16, 20, 16, 0], [367, 206, 16, 19, 16, 1], [367, 257, 16, 19, 16, 1], [367, 308, 16, 19, 16, 1], [367, 362, 16, 16, 16, 4], [367, 413, 16, 16, 16, 4], [367, 464, 16, 16, 16, 4], [367, 516, 16, 15, 16, 5], [367, 567, 16, 15, 16, 5], [367, 617, 16, 16, 16, 4], [367, 672, 16, 16, 16, 8], [367, 719, 16, 16, 16, 4], [367, 770, 16, 16, 16, 4], [428, 5, 16, 16, 16, 4], [428, 57, 16, 15, 16, 5], [428, 107, 16, 16, 16, 4], [428, 158, 16, 16, 16, 4], [428, 209, 16, 16, 16, 4], [428, 261, 16, 15, 16, 5], [428, 312, 16, 15, 16, 5], [428, 362, 16, 16, 16, 4], [428, 413, 16, 16, 16, 4], [428, 464, 16, 16, 16, 4], [428, 516, 16, 15, 16, 5], [428, 567, 16, 15, 16, 5], [428, 617, 16, 16, 16, 4], [428, 668, 16, 16, 16, 4], [428, 719, 16, 16, 16, 4], [428, 771, 16, 15, 16, 5], [489, 5, 16, 19, 16, 4], [489, 56, 16, 15, 16, 4], [489, 106, 16, 18, 16, 3], [489, 158, 16, 16, 16, 4], [489, 209, 16, 19, 16, 4], [489, 264, 16, 11, 16, 8], [489, 311, 16, 19, 16, 4], [489, 362, 16, 16, 16, 4], [489, 413, 16, 16, 16, 4], [489, 464, 16, 16, 16, 4], [489, 516, 16, 14, 16, 5], [489, 566, 16, 15, 16, 4], [489, 618, 16, 14, 16, 5], [489, 673, 16, 10, 16, 9], [489, 720, 16, 15, 16, 5], [489, 771, 16, 15, 16, 5], [550, 11, 16, 9, 16, 10], [550, 59, 16, 13, 16, 7], [550, 110, 16, 13, 16, 7], [550, 161, 16, 13, 16, 7], [550, 210, 16, 15, 16, 5], [550, 264, 16, 15, 16, 8], [550, 311, 16, 16, 16, 4], [550, 363, 16, 19, 16, 5], [550, 414, 16, 19, 16, 5], [550, 468, 16, 12, 16, 8], [550, 515, 16, 19, 16, 4], [550, 566, 16, 15, 16, 4], [550, 617, 16, 15, 16, 4], [550, 668, 16, 16, 16, 4], [550, 723, 16, 12, 16, 8], [550, 774, 16, 12, 16, 8], [611, 9, 16, 16, 16, 8], [611, 60, 16, 16, 16, 8], [611, 116, 16, 6, 16, 13], [611, 157, 16, 20, 16, 3], [611, 209, 16, 19, 16, 4], [611, 266, 16, 9, 16, 10], [611, 311, 16, 16, 16, 4], [611, 366, 16, 11, 16, 8], [611, 417, 16, 11, 16, 8], [611, 473, 16, 7, 16, 13], [611, 524, 16, 6, 16, 13], [611, 562, 16, 20, 16, 0], [611, 614, 16, 19, 16, 1], [611, 665, 16, 19, 16, 1], [611, 720, 16, 15, 16, 5], [611, 774, 16, 12, 16, 8], [672, 13, 16, 7, 16, 12], [672, 64, 16, 7, 16, 12], [672, 107, 16, 15, 16, 4], [672, 158, 16, 15, 16, 4], [672, 209, 16, 15, 16, 4], [672, 260, 16, 15, 16, 4], [672, 318, 16, 9, 16, 11], [672, 363, 16, 15, 16, 5], [672, 414, 16, 19, 16, 5], [1, 14, 16, 6, 16, 13], [794, 770, 16, 15, 16, 4], [672, 569, 16, 12, 16, 7], [672, 622, 16, 11, 16, 9], [672, 673, 16, 11, 16, 9], [672, 719, 16, 16, 16, 4], [672, 770, 16, 16, 16, 4], [733, 5, 16, 19, 16, 4], [733, 64, 16, 7, 16, 12], [733, 116, 16, 11, 16, 13], [733, 167, 16, 11, 16, 13], [733, 210, 16, 15, 16, 5], [733, 256, 16, 20, 16, 0], [733, 307, 16, 20, 16, 0], [733, 358, 16, 20, 16, 0], [733, 410, 16, 19, 16, 1], [733, 460, 16, 20, 16, 0], [733, 511, 16, 20, 16, 0], [733, 562, 16, 20, 16, 0], [733, 614, 16, 19, 16, 1], [733, 664, 16, 20, 16, 0], [733, 715, 16, 20, 16, 0], [733, 766, 16, 20, 16, 0], [1, 14, 16, 6, 16, 13], [794, 52, 16, 20, 16, 0], [794, 103, 16, 20, 16, 0], [794, 154, 16, 20, 16, 0], [794, 205, 16, 20, 16, 0], [794, 264, 16, 12, 16, 8], [794, 311, 16, 15, 16, 4], [794, 363, 16, 14, 16, 5], [794, 415, 16, 13, 16, 6], [794, 464, 16, 15, 16, 4], [794, 515, 16, 15, 16, 4], [794, 566, 16, 15, 16, 4], [794, 626, 16, 11, 16, 13], [794, 668, 16, 15, 16, 4], [794, 728, 16, 11, 16, 13], [794, 770, 16, 15, 16, 4], [855, 5, 16, 15, 16, 4], [855, 56, 16, 15, 16, 4], [855, 107, 16, 15, 16, 4], [855, 158, 16, 15, 16, 4], [855, 209, 16, 15, 16, 4], [855, 260, 16, 15, 16, 4], [855, 311, 16, 15, 16, 4], [855, 362, 16, 15, 16, 4], [855, 413, 16, 15, 16, 4], [855, 464, 16, 15, 16, 4], [855, 515, 16, 15, 16, 4], [855, 566, 16, 15, 16, 4], [855, 617, 16, 15, 16, 4], [855, 668, 16, 15, 16, 4], [855, 719, 16, 15, 16, 4], [855, 770, 16, 15, 16, 4]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 15, 6, 15, 12], [1, 57, 15, 13, 15, 5], [1, 108, 15, 13, 15, 5], [1, 159, 15, 13, 15, 5], [1, 209, 15, 15, 15, 4], [1, 261, 15, 13, 15, 5], [1, 312, 15, 13, 15, 5], [1, 363, 15, 13, 15, 5], [1, 413, 15, 17, 15, 4], [1, 464, 15, 17, 15, 4], [1, 515, 15, 14, 15, 4], [1, 571, 15, 9, 15, 9], [1, 625, 15, 10, 15, 12], [1, 676, 15, 6, 15, 12], [1, 727, 15, 6, 15, 12], [1, 770, 15, 14, 15, 4], [62, 6, 15, 13, 15, 5], [62, 57, 15, 13, 15, 5], [62, 108, 15, 13, 15, 5], [62, 159, 15, 13, 15, 5], [62, 210, 15, 13, 15, 5], [62, 261, 15, 13, 15, 5], [62, 312, 15, 13, 15, 5], [62, 363, 15, 13, 15, 5], [62, 414, 15, 13, 15, 5], [62, 465, 15, 13, 15, 5], [62, 519, 15, 10, 15, 8], [62, 570, 15, 14, 15, 8], [62, 622, 15, 9, 15, 9], [62, 675, 15, 7, 15, 11], [62, 724, 15, 9, 15, 9], [62, 771, 15, 13, 15, 5], [123, 5, 15, 14, 15, 4], [123, 57, 15, 13, 15, 5], [123, 108, 15, 13, 15, 5], [123, 159, 15, 13, 15, 5], [123, 210, 15, 13, 15, 5], [123, 261, 15, 13, 15, 5], [123, 312, 15, 13, 15, 5], [123, 363, 15, 13, 15, 5], [123, 414, 15, 13, 15, 5], [123, 465, 15, 13, 15, 5], [123, 516, 15, 13, 15, 5], [123, 567, 15, 13, 15, 5], [123, 618, 15, 13, 15, 5], [123, 669, 15, 13, 15, 5], [123, 720, 15, 13, 15, 5], [123, 771, 15, 13, 15, 5], [184, 6, 15, 13, 15, 5], [184, 57, 15, 16, 15, 5], [184, 108, 15, 13, 15, 5], [184, 159, 15, 13, 15, 5], [184, 210, 15, 13, 15, 5], [184, 261, 15, 13, 15, 5], [184, 312, 15, 13, 15, 5], [184, 363, 15, 13, 15, 5], [184, 414, 15, 13, 15, 5], [184, 465, 15, 13, 15, 5], [184, 516, 15, 13, 15, 5], [184, 566, 15, 17, 15, 4], [184, 617, 15, 14, 15, 4], [184, 668, 15, 17, 15, 4], [184, 721, 15, 12, 15, 6], [184, 778, 15, 7, 15, 12], [245, 5, 15, 14, 15, 4], [245, 60, 15, 10, 15, 8], [245, 107, 15, 14, 15, 4], [245, 162, 15, 10, 15, 8], [245, 209, 15, 14, 15, 4], [245, 264, 15, 10, 15, 8], [245, 311, 15, 14, 15, 4], [245, 366, 15, 14, 15, 8], [245, 413, 15, 14, 15, 4], [245, 464, 15, 14, 15, 4], [245, 515, 15, 18, 15, 4], [245, 566, 15, 14, 15, 4], [245, 617, 15, 14, 15, 4], [245, 672, 15, 10, 15, 8], [245, 723, 15, 10, 15, 8], [245, 774, 15, 10, 15, 8], [306, 9, 15, 14, 15, 8], [306, 60, 15, 14, 15, 8], [306, 111, 15, 10, 15, 8], [306, 162, 15, 10, 15, 8], [306, 210, 15, 13, 15, 5], [306, 264, 15, 10, 15, 8], [306, 315, 15, 10, 15, 8], [306, 366, 15, 10, 15, 8], [306, 417, 15, 10, 15, 8], [306, 468, 15, 14, 15, 8], [306, 519, 15, 10, 15, 8], [306, 566, 15, 17, 15, 4], [306, 617, 15, 14, 15, 4], [306, 668, 15, 17, 15, 4], [306, 727, 15, 6, 15, 12], [306, 770, 15, 14, 15, 4], [367, 2, 15, 17, 15, 1], [367, 54, 15, 16, 15, 2], [367, 108, 15, 16, 15, 5], [367, 154, 15, 18, 15, 0], [367, 206, 15, 17, 15, 1], [367, 257, 15, 17, 15, 1], [367, 308, 15, 17, 15, 1], [367, 362, 15, 14, 15, 4], [367, 413, 15, 14, 15, 4], [367, 464, 15, 14, 15, 4], [367, 516, 15, 13, 15, 5], [367, 567, 15, 13, 15, 5], [367, 617, 15, 14, 15, 4], [367, 672, 15, 14, 15, 8], [367, 719, 15, 14, 15, 4], [367, 770, 15, 14, 15, 4], [428, 5, 15, 14, 15, 4], [428, 57, 15, 13, 15, 5], [428, 107, 15, 14, 15, 4], [428, 158, 15, 14, 15, 4], [428, 209, 15, 14, 15, 4], [428, 261, 15, 13, 15, 5], [428, 312, 15, 13, 15, 5], [428, 362, 15, 14, 15, 4], [428, 413, 15, 14, 15, 4], [428, 464, 15, 14, 15, 4], [428, 516, 15, 13, 15, 5], [428, 567, 15, 13, 15, 5], [428, 617, 15, 14, 15, 4], [428, 668, 15, 14, 15, 4], [428, 719, 15, 14, 15, 4], [428, 771, 15, 13, 15, 5], [489, 5, 15, 17, 15, 4], [489, 56, 15, 14, 15, 4], [489, 106, 15, 16, 15, 3], [489, 158, 15, 14, 15, 4], [489, 209, 15, 17, 15, 4], [489, 264, 15, 10, 15, 8], [489, 311, 15, 17, 15, 4], [489, 362, 15, 14, 15, 4], [489, 413, 15, 14, 15, 4], [489, 464, 15, 14, 15, 4], [489, 516, 15, 13, 15, 5], [489, 566, 15, 14, 15, 4], [489, 618, 15, 13, 15, 5], [489, 673, 15, 9, 15, 9], [489, 720, 15, 13, 15, 5], [489, 771, 15, 13, 15, 5], [550, 11, 15, 8, 15, 10], [550, 59, 15, 11, 15, 7], [550, 110, 15, 11, 15, 7], [550, 161, 15, 11, 15, 7], [550, 210, 15, 13, 15, 5], [550, 264, 15, 13, 15, 8], [550, 311, 15, 14, 15, 4], [550, 363, 15, 17, 15, 5], [550, 414, 15, 17, 15, 5], [550, 468, 15, 10, 15, 8], [550, 515, 15, 17, 15, 4], [550, 566, 15, 14, 15, 4], [550, 617, 15, 14, 15, 4], [550, 668, 15, 14, 15, 4], [550, 723, 15, 10, 15, 8], [550, 774, 15, 10, 15, 8], [611, 9, 15, 14, 15, 8], [611, 60, 15, 14, 15, 8], [611, 115, 15, 6, 15, 12], [611, 157, 15, 18, 15, 3], [611, 209, 15, 17, 15, 4], [611, 266, 15, 8, 15, 10], [611, 311, 15, 14, 15, 4], [611, 366, 15, 10, 15, 8], [611, 417, 15, 10, 15, 8], [611, 472, 15, 6, 15, 12], [611, 523, 15, 6, 15, 12], [611, 562, 15, 18, 15, 0], [611, 614, 15, 17, 15, 1], [611, 665, 15, 17, 15, 1], [611, 720, 15, 13, 15, 5], [611, 774, 15, 10, 15, 8], [672, 13, 15, 6, 15, 12], [672, 64, 15, 6, 15, 12], [672, 107, 15, 14, 15, 4], [672, 158, 15, 14, 15, 4], [672, 209, 15, 14, 15, 4], [672, 260, 15, 14, 15, 4], [672, 318, 15, 7, 15, 11], [672, 363, 15, 13, 15, 5], [672, 414, 15, 17, 15, 5], [1, 13, 15, 6, 15, 12], [794, 770, 15, 14, 15, 4], [672, 569, 15, 11, 15, 7], [672, 622, 15, 9, 15, 9], [672, 673, 15, 9, 15, 9], [672, 719, 15, 14, 15, 4], [672, 770, 15, 14, 15, 4], [733, 5, 15, 17, 15, 4], [733, 64, 15, 6, 15, 12], [733, 115, 15, 10, 15, 12], [733, 166, 15, 10, 15, 12], [733, 210, 15, 13, 15, 5], [733, 256, 15, 18, 15, 0], [733, 307, 15, 18, 15, 0], [733, 358, 15, 18, 15, 0], [733, 410, 15, 17, 15, 1], [733, 460, 15, 18, 15, 0], [733, 511, 15, 18, 15, 0], [733, 562, 15, 18, 15, 0], [733, 614, 15, 17, 15, 1], [733, 664, 15, 18, 15, 0], [733, 715, 15, 18, 15, 0], [733, 766, 15, 18, 15, 0], [1, 13, 15, 6, 15, 12], [794, 52, 15, 18, 15, 0], [794, 103, 15, 18, 15, 0], [794, 154, 15, 18, 15, 0], [794, 205, 15, 18, 15, 0], [794, 264, 15, 10, 15, 8], [794, 311, 15, 14, 15, 4], [794, 363, 15, 13, 15, 5], [794, 415, 15, 12, 15, 6], [794, 464, 15, 14, 15, 4], [794, 515, 15, 14, 15, 4], [794, 566, 15, 14, 15, 4], [794, 625, 15, 10, 15, 12], [794, 668, 15, 14, 15, 4], [794, 727, 15, 10, 15, 12], [794, 770, 15, 14, 15, 4], [855, 5, 15, 14, 15, 4], [855, 56, 15, 14, 15, 4], [855, 107, 15, 14, 15, 4], [855, 158, 15, 14, 15, 4], [855, 209, 15, 14, 15, 4], [855, 260, 15, 14, 15, 4], [855, 311, 15, 14, 15, 4], [855, 362, 15, 14, 15, 4], [855, 413, 15, 14, 15, 4], [855, 464, 15, 14, 15, 4], [855, 515, 15, 14, 15, 4], [855, 566, 15, 14, 15, 4], [855, 617, 15, 14, 15, 4], [855, 668, 15, 14, 15, 4], [855, 719, 15, 14, 15, 4], [855, 770, 15, 14, 15, 4]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 15, 1], [1, 57, 13, 15, 15, 5], [1, 108, 15, 7, 15, 5], [1, 159, 16, 15, 15, 5], [1, 209, 16, 17, 15, 4], [1, 261, 18, 15, 15, 5], [1, 312, 15, 15, 15, 5], [1, 363, 14, 7, 15, 5], [1, 413, 17, 19, 15, 4], [1, 464, 15, 19, 15, 4], [1, 515, 16, 10, 15, 4], [1, 571, 15, 11, 15, 9], [1, 628, 11, 9, 15, 15], [1, 676, 14, 3, 15, 12], [1, 730, 11, 5, 15, 15], [1, 770, 18, 16, 15, 4], [62, 6, 16, 15, 15, 5], [62, 57, 14, 15, 15, 5], [62, 108, 17, 15, 15, 5], [62, 159, 16, 15, 15, 5], [62, 210, 16, 15, 15, 5], [62, 261, 16, 15, 15, 5], [62, 312, 16, 15, 15, 5], [62, 363, 17, 15, 15, 5], [62, 414, 16, 15, 15, 5], [62, 465, 16, 15, 15, 5], [62, 519, 13, 12, 15, 8], [62, 570, 13, 16, 15, 8], [62, 622, 17, 11, 15, 9], [62, 675, 16, 6, 15, 11], [62, 724, 16, 11, 15, 9], [62, 771, 16, 15, 15, 5], [123, 5, 17, 16, 15, 4], [123, 57, 14, 15, 15, 5], [123, 108, 17, 15, 15, 5], [123, 159, 17, 15, 15, 5], [123, 210, 16, 15, 15, 5], [123, 261, 16, 15, 15, 5], [123, 312, 17, 15, 15, 5], [123, 363, 17, 15, 15, 5], [123, 414, 17, 15, 15, 5], [123, 465, 16, 15, 15, 5], [123, 516, 16, 15, 15, 5], [123, 567, 16, 15, 15, 5], [123, 618, 13, 15, 15, 5], [123, 669, 18, 15, 15, 5], [123, 720, 17, 15, 15, 5], [123, 771, 16, 15, 15, 5], [184, 6, 16, 15, 15, 5], [184, 57, 16, 18, 15, 5], [184, 108, 15, 15, 15, 5], [184, 159, 16, 15, 15, 5], [184, 210, 17, 15, 15, 5], [184, 261, 17, 15, 15, 5], [184, 312, 17, 15, 15, 5], [184, 363, 18, 15, 15, 5], [184, 414, 17, 15, 15, 5], [184, 465, 17, 15, 15, 5], [184, 516, 17, 15, 15, 5], [184, 566, 17, 19, 15, 4], [184, 617, 15, 16, 15, 4], [184, 668, 15, 19, 15, 4], [184, 721, 16, 11, 15, 6], [184, 784, 14, 3, 15, 18], [245, 5, 14, 5, 15, 4], [245, 60, 16, 12, 15, 8], [245, 107, 16, 16, 15, 4], [245, 162, 16, 12, 15, 8], [245, 209, 17, 16, 15, 4], [245, 264, 16, 12, 15, 8], [245, 311, 18, 16, 15, 4], [245, 366, 16, 16, 15, 8], [245, 413, 15, 16, 15, 4], [245, 464, 13, 16, 15, 4], [245, 515, 15, 20, 15, 4], [245, 566, 15, 16, 15, 4], [245, 617, 13, 16, 15, 4], [245, 672, 16, 12, 15, 8], [245, 723, 15, 12, 15, 8], [245, 774, 15, 12, 15, 8], [306, 9, 16, 16, 15, 8], [306, 60, 16, 16, 15, 8], [306, 111, 16, 12, 15, 8], [306, 162, 15, 12, 15, 8], [306, 210, 15, 15, 15, 5], [306, 264, 16, 12, 15, 8], [306, 315, 17, 12, 15, 8], [306, 366, 18, 12, 15, 8], [306, 417, 16, 12, 15, 8], [306, 468, 17, 16, 15, 8], [306, 519, 16, 12, 15, 8], [306, 566, 17, 19, 15, 4], [306, 617, 12, 16, 15, 4], [306, 668, 14, 19, 15, 4], [306, 727, 15, 5, 15, 12], [306, 770, 16, 16, 15, 4], [367, 2, 16, 19, 15, 1], [367, 54, 15, 18, 15, 2], [367, 108, 17, 18, 15, 5], [367, 154, 16, 20, 15, 0], [367, 206, 17, 19, 15, 1], [367, 257, 16, 19, 15, 1], [367, 308, 17, 19, 15, 1], [367, 362, 16, 16, 15, 4], [367, 413, 16, 16, 15, 4], [367, 465, 16, 15, 15, 5], [367, 516, 16, 15, 15, 5], [367, 567, 16, 15, 15, 5], [367, 617, 16, 16, 15, 4], [367, 672, 15, 16, 15, 8], [367, 719, 16, 16, 15, 4], [367, 770, 16, 16, 15, 4], [428, 6, 16, 15, 15, 5], [428, 57, 16, 15, 15, 5], [428, 107, 15, 16, 15, 4], [428, 158, 14, 16, 15, 4], [428, 210, 15, 15, 15, 5], [428, 261, 15, 15, 15, 5], [428, 312, 14, 15, 15, 5], [428, 362, 15, 16, 15, 4], [428, 413, 15, 16, 15, 4], [428, 465, 15, 15, 15, 5], [428, 516, 15, 15, 15, 5], [428, 567, 15, 15, 15, 5], [428, 617, 16, 16, 15, 4], [428, 668, 16, 16, 15, 4], [428, 720, 16, 15, 15, 5], [428, 771, 16, 15, 15, 5], [489, 5, 16, 19, 15, 4], [489, 56, 15, 7, 15, 4], [489, 106, 16, 18, 15, 3], [489, 158, 17, 16, 15, 4], [489, 209, 16, 19, 15, 4], [489, 264, 15, 9, 15, 8], [489, 311, 16, 19, 15, 4], [489, 362, 15, 16, 15, 4], [489, 413, 17, 16, 15, 4], [489, 464, 17, 16, 15, 4], [489, 516, 17, 9, 15, 5], [489, 566, 15, 5, 15, 4], [489, 618, 15, 4, 15, 5], [489, 673, 16, 10, 15, 9], [489, 720, 18, 15, 15, 5], [489, 771, 17, 15, 15, 5], [550, 11, 14, 8, 15, 10], [550, 59, 15, 13, 15, 7], [550, 110, 17, 13, 15, 7], [550, 161, 17, 13, 15, 7], [550, 210, 17, 15, 15, 5], [550, 264, 16, 15, 15, 8], [550, 311, 16, 16, 15, 4], [550, 363, 17, 19, 15, 5], [550, 414, 18, 19, 15, 5], [550, 468, 17, 12, 15, 8], [550, 515, 17, 19, 15, 4], [550, 566, 16, 8, 15, 4], [550, 617, 16, 8, 15, 4], [550, 668, 16, 16, 15, 4], [550, 723, 17, 12, 15, 8], [550, 774, 16, 12, 15, 8], [611, 9, 14, 16, 15, 8], [611, 60, 13, 16, 15, 8], [611, 116, 15, 6, 15, 13], [611, 157, 19, 19, 15, 3], [611, 209, 18, 19, 15, 4], [611, 266, 16, 8, 15, 10], [611, 311, 14, 16, 15, 4], [611, 366, 17, 11, 15, 8], [611, 417, 15, 11, 15, 8], [611, 476, 13, 4, 15, 16], [611, 511, 1, 1, 15, 1], [611, 562, 15, 20, 15, 0], [611, 614, 16, 19, 15, 1], [611, 665, 16, 19, 15, 1], [611, 720, 17, 15, 15, 5], [611, 774, 17, 12, 15, 8], [672, 13, 15, 3, 15, 12], [672, 64, 15, 3, 15, 12], [672, 107, 16, 9, 15, 4], [672, 158, 16, 9, 15, 4], [672, 209, 14, 9, 15, 4], [672, 260, 14, 9, 15, 4], [672, 318, 15, 9, 15, 11], [672, 363, 15, 15, 15, 5], [672, 414, 16, 19, 15, 5], [1, 1, 1, 1, 15, 1], [794, 770, 15, 5, 15, 4], [672, 569, 16, 10, 15, 7], [672, 622, 14, 11, 15, 9], [672, 673, 13, 11, 15, 9], [672, 719, 16, 16, 15, 4], [672, 770, 17, 16, 15, 4], [733, 5, 16, 19, 15, 4], [733, 64, 12, 5, 15, 12], [733, 118, 11, 9, 15, 15], [733, 169, 13, 9, 15, 15], [733, 210, 18, 15, 15, 5], [733, 257, 16, 19, 15, 1], [733, 308, 16, 19, 15, 1], [733, 358, 16, 20, 15, 0], [733, 410, 16, 19, 15, 1], [733, 460, 16, 20, 15, 0], [733, 511, 16, 20, 15, 0], [733, 563, 16, 19, 15, 1], [733, 614, 16, 19, 15, 1], [733, 664, 16, 20, 15, 0], [733, 715, 16, 20, 15, 0], [733, 767, 16, 19, 15, 1], [1, 1, 1, 1, 15, 1], [794, 52, 16, 20, 15, 0], [794, 103, 17, 20, 15, 0], [794, 155, 17, 19, 15, 1], [794, 205, 17, 20, 15, 0], [794, 264, 13, 12, 15, 8], [794, 312, 15, 4, 15, 5], [794, 363, 15, 4, 15, 5], [794, 415, 15, 3, 15, 6], [794, 464, 15, 5, 15, 4], [794, 515, 14, 5, 15, 4], [794, 566, 14, 5, 15, 4], [794, 631, 10, 6, 15, 18], [794, 668, 14, 5, 15, 4], [794, 733, 10, 6, 15, 18], [794, 770, 15, 5, 15, 4], [855, 5, 15, 5, 15, 4], [855, 56, 15, 5, 15, 4], [855, 107, 15, 5, 15, 4], [855, 158, 15, 5, 15, 4], [855, 209, 15, 5, 15, 4], [855, 260, 15, 5, 15, 4], [855, 311, 15, 5, 15, 4], [855, 362, 15, 5, 15, 4], [855, 413, 15, 5, 15, 4], [855, 464, 15, 5, 15, 4], [855, 515, 15, 5, 15, 4], [855, 566, 15, 5, 15, 4], [855, 617, 15, 5, 15, 4], [855, 668, 15, 5, 15, 4], [855, 719, 15, 5, 15, 4], [855, 770, 15, 5, 15, 4]], \"capHeight\": 19, \"widestlogicalchar\": 15, \"widestglyph\": 19, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 14, 1], [1, 57, 12, 13, 14, 5], [1, 108, 14, 5, 14, 5], [1, 159, 15, 13, 14, 5], [1, 209, 15, 15, 14, 4], [1, 261, 17, 13, 14, 5], [1, 312, 14, 13, 14, 5], [1, 363, 13, 5, 14, 5], [1, 413, 16, 17, 14, 4], [1, 464, 14, 17, 14, 4], [1, 515, 15, 8, 14, 4], [1, 571, 14, 9, 14, 9], [1, 628, 10, 7, 14, 15], [1, 676, 13, 1, 14, 12], [1, 730, 10, 3, 14, 15], [1, 770, 17, 14, 14, 4], [62, 6, 15, 13, 14, 5], [62, 57, 13, 13, 14, 5], [62, 108, 16, 13, 14, 5], [62, 159, 15, 13, 14, 5], [62, 210, 15, 13, 14, 5], [62, 261, 15, 13, 14, 5], [62, 312, 15, 13, 14, 5], [62, 363, 16, 13, 14, 5], [62, 414, 15, 13, 14, 5], [62, 465, 15, 13, 14, 5], [62, 519, 12, 10, 14, 8], [62, 570, 12, 14, 14, 8], [62, 622, 16, 9, 14, 9], [62, 675, 15, 4, 14, 11], [62, 724, 15, 9, 14, 9], [62, 771, 15, 13, 14, 5], [123, 5, 16, 14, 14, 4], [123, 57, 13, 13, 14, 5], [123, 108, 16, 13, 14, 5], [123, 159, 16, 13, 14, 5], [123, 210, 15, 13, 14, 5], [123, 261, 15, 13, 14, 5], [123, 312, 16, 13, 14, 5], [123, 363, 16, 13, 14, 5], [123, 414, 16, 13, 14, 5], [123, 465, 15, 13, 14, 5], [123, 516, 15, 13, 14, 5], [123, 567, 15, 13, 14, 5], [123, 618, 12, 13, 14, 5], [123, 669, 17, 13, 14, 5], [123, 720, 16, 13, 14, 5], [123, 771, 15, 13, 14, 5], [184, 6, 15, 13, 14, 5], [184, 57, 15, 16, 14, 5], [184, 108, 14, 13, 14, 5], [184, 159, 15, 13, 14, 5], [184, 210, 16, 13, 14, 5], [184, 261, 16, 13, 14, 5], [184, 312, 16, 13, 14, 5], [184, 363, 17, 13, 14, 5], [184, 414, 16, 13, 14, 5], [184, 465, 16, 13, 14, 5], [184, 516, 16, 13, 14, 5], [184, 566, 16, 17, 14, 4], [184, 617, 14, 14, 14, 4], [184, 668, 14, 17, 14, 4], [184, 721, 15, 9, 14, 6], [184, 784, 13, 1, 14, 18], [245, 5, 13, 3, 14, 4], [245, 60, 15, 10, 14, 8], [245, 107, 15, 14, 14, 4], [245, 162, 15, 10, 14, 8], [245, 209, 16, 14, 14, 4], [245, 264, 15, 10, 14, 8], [245, 311, 17, 14, 14, 4], [245, 366, 15, 14, 14, 8], [245, 413, 14, 14, 14, 4], [245, 464, 12, 14, 14, 4], [245, 515, 14, 18, 14, 4], [245, 566, 14, 14, 14, 4], [245, 617, 12, 14, 14, 4], [245, 672, 15, 10, 14, 8], [245, 723, 14, 10, 14, 8], [245, 774, 14, 10, 14, 8], [306, 9, 15, 14, 14, 8], [306, 60, 15, 14, 14, 8], [306, 111, 15, 10, 14, 8], [306, 162, 14, 10, 14, 8], [306, 210, 14, 13, 14, 5], [306, 264, 15, 10, 14, 8], [306, 315, 16, 10, 14, 8], [306, 366, 17, 10, 14, 8], [306, 417, 15, 10, 14, 8], [306, 468, 16, 14, 14, 8], [306, 519, 15, 10, 14, 8], [306, 566, 16, 17, 14, 4], [306, 617, 11, 14, 14, 4], [306, 668, 13, 17, 14, 4], [306, 727, 14, 3, 14, 12], [306, 770, 15, 14, 14, 4], [367, 2, 15, 17, 14, 1], [367, 54, 14, 16, 14, 2], [367, 108, 16, 16, 14, 5], [367, 154, 15, 18, 14, 0], [367, 206, 16, 17, 14, 1], [367, 257, 15, 17, 14, 1], [367, 308, 16, 17, 14, 1], [367, 362, 15, 14, 14, 4], [367, 413, 15, 14, 14, 4], [367, 465, 15, 13, 14, 5], [367, 516, 15, 13, 14, 5], [367, 567, 15, 13, 14, 5], [367, 617, 15, 14, 14, 4], [367, 672, 14, 14, 14, 8], [367, 719, 15, 14, 14, 4], [367, 770, 15, 14, 14, 4], [428, 6, 15, 13, 14, 5], [428, 57, 15, 13, 14, 5], [428, 107, 14, 14, 14, 4], [428, 158, 13, 14, 14, 4], [428, 210, 14, 13, 14, 5], [428, 261, 14, 13, 14, 5], [428, 312, 13, 13, 14, 5], [428, 362, 14, 14, 14, 4], [428, 413, 14, 14, 14, 4], [428, 465, 14, 13, 14, 5], [428, 516, 14, 13, 14, 5], [428, 567, 14, 13, 14, 5], [428, 617, 15, 14, 14, 4], [428, 668, 15, 14, 14, 4], [428, 720, 15, 13, 14, 5], [428, 771, 15, 13, 14, 5], [489, 5, 15, 17, 14, 4], [489, 56, 14, 5, 14, 4], [489, 106, 15, 16, 14, 3], [489, 158, 16, 14, 14, 4], [489, 209, 15, 17, 14, 4], [489, 264, 14, 7, 14, 8], [489, 311, 15, 17, 14, 4], [489, 362, 14, 14, 14, 4], [489, 413, 16, 14, 14, 4], [489, 464, 16, 14, 14, 4], [489, 516, 16, 7, 14, 5], [489, 566, 14, 3, 14, 4], [489, 618, 14, 2, 14, 5], [489, 673, 15, 8, 14, 9], [489, 720, 17, 13, 14, 5], [489, 771, 16, 13, 14, 5], [550, 11, 13, 6, 14, 10], [550, 59, 14, 11, 14, 7], [550, 110, 16, 11, 14, 7], [550, 161, 16, 11, 14, 7], [550, 210, 16, 13, 14, 5], [550, 264, 15, 13, 14, 8], [550, 311, 15, 14, 14, 4], [550, 363, 16, 17, 14, 5], [550, 414, 17, 17, 14, 5], [550, 468, 16, 10, 14, 8], [550, 515, 16, 17, 14, 4], [550, 566, 15, 6, 14, 4], [550, 617, 15, 6, 14, 4], [550, 668, 15, 14, 14, 4], [550, 723, 16, 10, 14, 8], [550, 774, 15, 10, 14, 8], [611, 9, 13, 14, 14, 8], [611, 60, 12, 14, 14, 8], [611, 116, 14, 4, 14, 13], [611, 157, 18, 17, 14, 3], [611, 209, 17, 17, 14, 4], [611, 266, 15, 6, 14, 10], [611, 311, 13, 14, 14, 4], [611, 366, 16, 9, 14, 8], [611, 417, 14, 9, 14, 8], [611, 476, 12, 2, 14, 16], [611, 511, 1, 1, 14, 1], [611, 562, 14, 18, 14, 0], [611, 614, 15, 17, 14, 1], [611, 665, 15, 17, 14, 1], [611, 720, 16, 13, 14, 5], [611, 774, 16, 10, 14, 8], [672, 13, 14, 1, 14, 12], [672, 64, 14, 1, 14, 12], [672, 107, 15, 7, 14, 4], [672, 158, 15, 7, 14, 4], [672, 209, 13, 7, 14, 4], [672, 260, 13, 7, 14, 4], [672, 318, 14, 7, 14, 11], [672, 363, 14, 13, 14, 5], [672, 414, 15, 17, 14, 5], [1, 1, 1, 1, 14, 1], [794, 770, 14, 3, 14, 4], [672, 569, 15, 8, 14, 7], [672, 622, 13, 9, 14, 9], [672, 673, 12, 9, 14, 9], [672, 719, 15, 14, 14, 4], [672, 770, 16, 14, 14, 4], [733, 5, 15, 17, 14, 4], [733, 64, 11, 3, 14, 12], [733, 118, 10, 7, 14, 15], [733, 169, 12, 7, 14, 15], [733, 210, 17, 13, 14, 5], [733, 257, 15, 17, 14, 1], [733, 308, 15, 17, 14, 1], [733, 358, 13, 18, 14, 0], [733, 410, 15, 17, 14, 1], [733, 460, 15, 18, 14, 0], [733, 511, 15, 18, 14, 0], [733, 563, 15, 17, 14, 1], [733, 614, 15, 17, 14, 1], [733, 664, 15, 18, 14, 0], [733, 715, 15, 18, 14, 0], [733, 767, 15, 17, 14, 1], [1, 1, 1, 1, 14, 1], [794, 52, 15, 18, 14, 0], [794, 103, 16, 18, 14, 0], [794, 155, 16, 17, 14, 1], [794, 205, 16, 18, 14, 0], [794, 264, 12, 10, 14, 8], [794, 312, 14, 2, 14, 5], [794, 363, 14, 2, 14, 5], [794, 415, 14, 1, 14, 6], [794, 464, 14, 3, 14, 4], [794, 515, 13, 3, 14, 4], [794, 566, 13, 3, 14, 4], [794, 631, 9, 4, 14, 18], [794, 668, 13, 3, 14, 4], [794, 733, 9, 4, 14, 18], [794, 770, 14, 3, 14, 4], [855, 5, 14, 3, 14, 4], [855, 56, 14, 3, 14, 4], [855, 107, 14, 3, 14, 4], [855, 158, 14, 3, 14, 4], [855, 209, 14, 3, 14, 4], [855, 260, 14, 3, 14, 4], [855, 311, 14, 3, 14, 4], [855, 362, 14, 3, 14, 4], [855, 413, 14, 3, 14, 4], [855, 464, 14, 3, 14, 4], [855, 515, 14, 3, 14, 4], [855, 566, 14, 3, 14, 4], [855, 617, 14, 3, 14, 4], [855, 668, 14, 3, 14, 4], [855, 719, 14, 3, 14, 4], [855, 770, 14, 3, 14, 4]], \"capHeight\": 18, \"widestlogicalchar\": 14, \"widestglyph\": 18, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 1, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 15, 6, 15, 13], [1, 57, 15, 15, 15, 5], [1, 108, 15, 14, 15, 5], [1, 159, 15, 15, 15, 5], [1, 209, 15, 17, 15, 4], [1, 261, 15, 15, 15, 5], [1, 312, 15, 15, 15, 5], [1, 363, 15, 14, 15, 5], [1, 413, 15, 19, 15, 4], [1, 464, 15, 19, 15, 4], [1, 515, 15, 15, 15, 4], [1, 571, 15, 11, 15, 9], [1, 626, 15, 11, 15, 13], [1, 676, 15, 7, 15, 12], [1, 728, 15, 7, 15, 13], [1, 770, 15, 16, 15, 4], [62, 6, 15, 15, 15, 5], [62, 57, 15, 15, 15, 5], [62, 108, 15, 15, 15, 5], [62, 159, 15, 15, 15, 5], [62, 210, 15, 15, 15, 5], [62, 261, 15, 15, 15, 5], [62, 312, 15, 15, 15, 5], [62, 363, 15, 15, 15, 5], [62, 414, 15, 15, 15, 5], [62, 465, 15, 15, 15, 5], [62, 519, 15, 12, 15, 8], [62, 570, 15, 16, 15, 8], [62, 622, 15, 11, 15, 9], [62, 675, 15, 8, 15, 11], [62, 724, 15, 11, 15, 9], [62, 771, 15, 15, 15, 5], [123, 5, 15, 16, 15, 4], [123, 57, 15, 15, 15, 5], [123, 108, 15, 15, 15, 5], [123, 159, 15, 15, 15, 5], [123, 210, 15, 15, 15, 5], [123, 261, 15, 15, 15, 5], [123, 312, 15, 15, 15, 5], [123, 363, 15, 15, 15, 5], [123, 414, 15, 15, 15, 5], [123, 465, 15, 15, 15, 5], [123, 516, 15, 15, 15, 5], [123, 567, 15, 15, 15, 5], [123, 618, 15, 15, 15, 5], [123, 669, 15, 15, 15, 5], [123, 720, 15, 15, 15, 5], [123, 771, 15, 15, 15, 5], [184, 6, 15, 15, 15, 5], [184, 57, 15, 18, 15, 5], [184, 108, 15, 15, 15, 5], [184, 159, 15, 15, 15, 5], [184, 210, 15, 15, 15, 5], [184, 261, 15, 15, 15, 5], [184, 312, 15, 15, 15, 5], [184, 363, 15, 15, 15, 5], [184, 414, 15, 15, 15, 5], [184, 465, 15, 15, 15, 5], [184, 516, 15, 15, 15, 5], [184, 566, 15, 19, 15, 4], [184, 617, 15, 16, 15, 4], [184, 668, 15, 19, 15, 4], [184, 721, 15, 13, 15, 6], [184, 779, 15, 8, 15, 13], [245, 5, 15, 15, 15, 4], [245, 60, 15, 12, 15, 8], [245, 107, 15, 16, 15, 4], [245, 162, 15, 12, 15, 8], [245, 209, 15, 16, 15, 4], [245, 264, 15, 12, 15, 8], [245, 311, 15, 16, 15, 4], [245, 366, 15, 16, 15, 8], [245, 413, 15, 16, 15, 4], [245, 464, 15, 16, 15, 4], [245, 515, 15, 20, 15, 4], [245, 566, 15, 16, 15, 4], [245, 617, 15, 16, 15, 4], [245, 672, 15, 12, 15, 8], [245, 723, 15, 12, 15, 8], [245, 774, 15, 12, 15, 8], [306, 9, 15, 16, 15, 8], [306, 60, 15, 16, 15, 8], [306, 111, 15, 12, 15, 8], [306, 162, 15, 12, 15, 8], [306, 210, 15, 15, 15, 5], [306, 264, 15, 12, 15, 8], [306, 315, 15, 12, 15, 8], [306, 366, 15, 12, 15, 8], [306, 417, 15, 12, 15, 8], [306, 468, 15, 16, 15, 8], [306, 519, 15, 12, 15, 8], [306, 566, 15, 19, 15, 4], [306, 617, 15, 16, 15, 4], [306, 668, 15, 19, 15, 4], [306, 727, 15, 7, 15, 12], [306, 770, 15, 16, 15, 4], [367, 2, 15, 19, 15, 1], [367, 54, 15, 18, 15, 2], [367, 108, 15, 18, 15, 5], [367, 154, 15, 20, 15, 0], [367, 206, 15, 19, 15, 1], [367, 257, 15, 19, 15, 1], [367, 308, 15, 19, 15, 1], [367, 362, 15, 16, 15, 4], [367, 413, 15, 16, 15, 4], [367, 464, 15, 16, 15, 4], [367, 516, 15, 15, 15, 5], [367, 567, 15, 15, 15, 5], [367, 617, 15, 16, 15, 4], [367, 672, 15, 16, 15, 8], [367, 719, 15, 16, 15, 4], [367, 770, 15, 16, 15, 4], [428, 5, 15, 16, 15, 4], [428, 57, 15, 15, 15, 5], [428, 107, 15, 16, 15, 4], [428, 158, 15, 16, 15, 4], [428, 209, 15, 16, 15, 4], [428, 261, 15, 15, 15, 5], [428, 312, 15, 15, 15, 5], [428, 362, 15, 16, 15, 4], [428, 413, 15, 16, 15, 4], [428, 464, 15, 16, 15, 4], [428, 516, 15, 15, 15, 5], [428, 567, 15, 15, 15, 5], [428, 617, 15, 16, 15, 4], [428, 668, 15, 16, 15, 4], [428, 719, 15, 16, 15, 4], [428, 771, 15, 15, 15, 5], [489, 5, 15, 19, 15, 4], [489, 56, 15, 15, 15, 4], [489, 106, 15, 18, 15, 3], [489, 158, 15, 16, 15, 4], [489, 209, 15, 19, 15, 4], [489, 264, 15, 11, 15, 8], [489, 311, 15, 19, 15, 4], [489, 362, 15, 16, 15, 4], [489, 413, 15, 16, 15, 4], [489, 464, 15, 16, 15, 4], [489, 516, 15, 14, 15, 5], [489, 566, 15, 15, 15, 4], [489, 618, 15, 14, 15, 5], [489, 673, 15, 10, 15, 9], [489, 720, 15, 15, 15, 5], [489, 771, 15, 15, 15, 5], [550, 11, 15, 9, 15, 10], [550, 59, 15, 13, 15, 7], [550, 110, 15, 13, 15, 7], [550, 161, 15, 13, 15, 7], [550, 210, 15, 15, 15, 5], [550, 264, 15, 15, 15, 8], [550, 311, 15, 16, 15, 4], [550, 363, 15, 19, 15, 5], [550, 414, 15, 19, 15, 5], [550, 468, 15, 12, 15, 8], [550, 515, 15, 19, 15, 4], [550, 566, 15, 15, 15, 4], [550, 617, 15, 15, 15, 4], [550, 668, 15, 16, 15, 4], [550, 723, 15, 12, 15, 8], [550, 774, 15, 12, 15, 8], [611, 9, 15, 16, 15, 8], [611, 60, 15, 16, 15, 8], [611, 116, 15, 6, 15, 13], [611, 157, 15, 20, 15, 3], [611, 209, 15, 19, 15, 4], [611, 266, 15, 9, 15, 10], [611, 311, 15, 16, 15, 4], [611, 366, 15, 11, 15, 8], [611, 417, 15, 11, 15, 8], [611, 473, 15, 7, 15, 13], [611, 524, 15, 6, 15, 13], [611, 562, 15, 20, 15, 0], [611, 614, 15, 19, 15, 1], [611, 665, 15, 19, 15, 1], [611, 720, 15, 15, 15, 5], [611, 774, 15, 12, 15, 8], [672, 13, 15, 7, 15, 12], [672, 64, 15, 7, 15, 12], [672, 107, 15, 15, 15, 4], [672, 158, 15, 15, 15, 4], [672, 209, 15, 15, 15, 4], [672, 260, 15, 15, 15, 4], [672, 318, 15, 9, 15, 11], [672, 363, 15, 15, 15, 5], [672, 414, 15, 19, 15, 5], [1, 14, 15, 6, 15, 13], [794, 770, 15, 15, 15, 4], [672, 569, 15, 12, 15, 7], [672, 622, 15, 11, 15, 9], [672, 673, 15, 11, 15, 9], [672, 719, 15, 16, 15, 4], [672, 770, 15, 16, 15, 4], [733, 5, 15, 19, 15, 4], [733, 64, 15, 7, 15, 12], [733, 116, 15, 11, 15, 13], [733, 167, 15, 11, 15, 13], [733, 210, 15, 15, 15, 5], [733, 256, 15, 20, 15, 0], [733, 307, 15, 20, 15, 0], [733, 358, 15, 20, 15, 0], [733, 410, 15, 19, 15, 1], [733, 460, 15, 20, 15, 0], [733, 511, 15, 20, 15, 0], [733, 562, 15, 20, 15, 0], [733, 614, 15, 19, 15, 1], [733, 664, 15, 20, 15, 0], [733, 715, 15, 20, 15, 0], [733, 766, 15, 20, 15, 0], [1, 14, 15, 6, 15, 13], [794, 52, 15, 20, 15, 0], [794, 103, 15, 20, 15, 0], [794, 154, 15, 20, 15, 0], [794, 205, 15, 20, 15, 0], [794, 264, 15, 12, 15, 8], [794, 311, 15, 15, 15, 4], [794, 363, 15, 14, 15, 5], [794, 415, 15, 13, 15, 6], [794, 464, 15, 15, 15, 4], [794, 515, 15, 15, 15, 4], [794, 566, 15, 15, 15, 4], [794, 626, 15, 11, 15, 13], [794, 668, 15, 15, 15, 4], [794, 728, 15, 11, 15, 13], [794, 770, 15, 15, 15, 4], [855, 5, 15, 15, 15, 4], [855, 56, 15, 15, 15, 4], [855, 107, 15, 15, 15, 4], [855, 158, 15, 15, 15, 4], [855, 209, 15, 15, 15, 4], [855, 260, 15, 15, 15, 4], [855, 311, 15, 15, 15, 4], [855, 362, 15, 15, 15, 4], [855, 413, 15, 15, 15, 4], [855, 464, 15, 15, 15, 4], [855, 515, 15, 15, 15, 4], [855, 566, 15, 15, 15, 4], [855, 617, 15, 15, 15, 4], [855, 668, 15, 15, 15, 4], [855, 719, 15, 15, 15, 4], [855, 770, 15, 15, 15, 4]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 20}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 2, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 14, 6, 14, 12], [1, 57, 14, 13, 14, 5], [1, 108, 14, 13, 14, 5], [1, 159, 14, 13, 14, 5], [1, 209, 14, 15, 14, 4], [1, 261, 14, 13, 14, 5], [1, 312, 14, 13, 14, 5], [1, 363, 14, 13, 14, 5], [1, 413, 14, 17, 14, 4], [1, 464, 14, 17, 14, 4], [1, 515, 14, 14, 14, 4], [1, 571, 14, 9, 14, 9], [1, 625, 14, 10, 14, 12], [1, 676, 14, 6, 14, 12], [1, 727, 14, 6, 14, 12], [1, 770, 14, 14, 14, 4], [62, 6, 14, 13, 14, 5], [62, 57, 14, 13, 14, 5], [62, 108, 14, 13, 14, 5], [62, 159, 14, 13, 14, 5], [62, 210, 14, 13, 14, 5], [62, 261, 14, 13, 14, 5], [62, 312, 14, 13, 14, 5], [62, 363, 14, 13, 14, 5], [62, 414, 14, 13, 14, 5], [62, 465, 14, 13, 14, 5], [62, 519, 14, 10, 14, 8], [62, 570, 14, 14, 14, 8], [62, 622, 14, 9, 14, 9], [62, 675, 14, 7, 14, 11], [62, 724, 14, 9, 14, 9], [62, 771, 14, 13, 14, 5], [123, 5, 14, 14, 14, 4], [123, 57, 14, 13, 14, 5], [123, 108, 14, 13, 14, 5], [123, 159, 14, 13, 14, 5], [123, 210, 14, 13, 14, 5], [123, 261, 14, 13, 14, 5], [123, 312, 14, 13, 14, 5], [123, 363, 14, 13, 14, 5], [123, 414, 14, 13, 14, 5], [123, 465, 14, 13, 14, 5], [123, 516, 14, 13, 14, 5], [123, 567, 14, 13, 14, 5], [123, 618, 14, 13, 14, 5], [123, 669, 14, 13, 14, 5], [123, 720, 14, 13, 14, 5], [123, 771, 14, 13, 14, 5], [184, 6, 14, 13, 14, 5], [184, 57, 14, 16, 14, 5], [184, 108, 14, 13, 14, 5], [184, 159, 14, 13, 14, 5], [184, 210, 14, 13, 14, 5], [184, 261, 14, 13, 14, 5], [184, 312, 14, 13, 14, 5], [184, 363, 14, 13, 14, 5], [184, 414, 14, 13, 14, 5], [184, 465, 14, 13, 14, 5], [184, 516, 14, 13, 14, 5], [184, 566, 14, 17, 14, 4], [184, 617, 14, 14, 14, 4], [184, 668, 14, 17, 14, 4], [184, 721, 14, 12, 14, 6], [184, 778, 14, 7, 14, 12], [245, 5, 14, 14, 14, 4], [245, 60, 14, 10, 14, 8], [245, 107, 14, 14, 14, 4], [245, 162, 14, 10, 14, 8], [245, 209, 14, 14, 14, 4], [245, 264, 14, 10, 14, 8], [245, 311, 14, 14, 14, 4], [245, 366, 14, 14, 14, 8], [245, 413, 14, 14, 14, 4], [245, 464, 14, 14, 14, 4], [245, 515, 14, 18, 14, 4], [245, 566, 14, 14, 14, 4], [245, 617, 14, 14, 14, 4], [245, 672, 14, 10, 14, 8], [245, 723, 14, 10, 14, 8], [245, 774, 14, 10, 14, 8], [306, 9, 14, 14, 14, 8], [306, 60, 14, 14, 14, 8], [306, 111, 14, 10, 14, 8], [306, 162, 14, 10, 14, 8], [306, 210, 14, 13, 14, 5], [306, 264, 14, 10, 14, 8], [306, 315, 14, 10, 14, 8], [306, 366, 14, 10, 14, 8], [306, 417, 14, 10, 14, 8], [306, 468, 14, 14, 14, 8], [306, 519, 14, 10, 14, 8], [306, 566, 14, 17, 14, 4], [306, 617, 14, 14, 14, 4], [306, 668, 14, 17, 14, 4], [306, 727, 14, 6, 14, 12], [306, 770, 14, 14, 14, 4], [367, 2, 14, 17, 14, 1], [367, 54, 14, 16, 14, 2], [367, 108, 14, 16, 14, 5], [367, 154, 14, 18, 14, 0], [367, 206, 14, 17, 14, 1], [367, 257, 14, 17, 14, 1], [367, 308, 14, 17, 14, 1], [367, 362, 14, 14, 14, 4], [367, 413, 14, 14, 14, 4], [367, 464, 14, 14, 14, 4], [367, 516, 14, 13, 14, 5], [367, 567, 14, 13, 14, 5], [367, 617, 14, 14, 14, 4], [367, 672, 14, 14, 14, 8], [367, 719, 14, 14, 14, 4], [367, 770, 14, 14, 14, 4], [428, 5, 14, 14, 14, 4], [428, 57, 14, 13, 14, 5], [428, 107, 14, 14, 14, 4], [428, 158, 14, 14, 14, 4], [428, 209, 14, 14, 14, 4], [428, 261, 14, 13, 14, 5], [428, 312, 14, 13, 14, 5], [428, 362, 14, 14, 14, 4], [428, 413, 14, 14, 14, 4], [428, 464, 14, 14, 14, 4], [428, 516, 14, 13, 14, 5], [428, 567, 14, 13, 14, 5], [428, 617, 14, 14, 14, 4], [428, 668, 14, 14, 14, 4], [428, 719, 14, 14, 14, 4], [428, 771, 14, 13, 14, 5], [489, 5, 14, 17, 14, 4], [489, 56, 14, 14, 14, 4], [489, 106, 14, 16, 14, 3], [489, 158, 14, 14, 14, 4], [489, 209, 14, 17, 14, 4], [489, 264, 14, 10, 14, 8], [489, 311, 14, 17, 14, 4], [489, 362, 14, 14, 14, 4], [489, 413, 14, 14, 14, 4], [489, 464, 14, 14, 14, 4], [489, 516, 14, 13, 14, 5], [489, 566, 14, 14, 14, 4], [489, 618, 14, 13, 14, 5], [489, 673, 14, 9, 14, 9], [489, 720, 14, 13, 14, 5], [489, 771, 14, 13, 14, 5], [550, 11, 14, 8, 14, 10], [550, 59, 14, 11, 14, 7], [550, 110, 14, 11, 14, 7], [550, 161, 14, 11, 14, 7], [550, 210, 14, 13, 14, 5], [550, 264, 14, 13, 14, 8], [550, 311, 14, 14, 14, 4], [550, 363, 14, 17, 14, 5], [550, 414, 14, 17, 14, 5], [550, 468, 14, 10, 14, 8], [550, 515, 14, 17, 14, 4], [550, 566, 14, 14, 14, 4], [550, 617, 14, 14, 14, 4], [550, 668, 14, 14, 14, 4], [550, 723, 14, 10, 14, 8], [550, 774, 14, 10, 14, 8], [611, 9, 14, 14, 14, 8], [611, 60, 14, 14, 14, 8], [611, 115, 14, 6, 14, 12], [611, 157, 14, 18, 14, 3], [611, 209, 14, 17, 14, 4], [611, 266, 14, 8, 14, 10], [611, 311, 14, 14, 14, 4], [611, 366, 14, 10, 14, 8], [611, 417, 14, 10, 14, 8], [611, 472, 14, 6, 14, 12], [611, 523, 14, 6, 14, 12], [611, 562, 14, 18, 14, 0], [611, 614, 14, 17, 14, 1], [611, 665, 14, 17, 14, 1], [611, 720, 14, 13, 14, 5], [611, 774, 14, 10, 14, 8], [672, 13, 14, 6, 14, 12], [672, 64, 14, 6, 14, 12], [672, 107, 14, 14, 14, 4], [672, 158, 14, 14, 14, 4], [672, 209, 14, 14, 14, 4], [672, 260, 14, 14, 14, 4], [672, 318, 14, 7, 14, 11], [672, 363, 14, 13, 14, 5], [672, 414, 14, 17, 14, 5], [1, 13, 14, 6, 14, 12], [794, 770, 14, 14, 14, 4], [672, 569, 14, 11, 14, 7], [672, 622, 14, 9, 14, 9], [672, 673, 14, 9, 14, 9], [672, 719, 14, 14, 14, 4], [672, 770, 14, 14, 14, 4], [733, 5, 14, 17, 14, 4], [733, 64, 14, 6, 14, 12], [733, 115, 14, 10, 14, 12], [733, 166, 14, 10, 14, 12], [733, 210, 14, 13, 14, 5], [733, 256, 14, 18, 14, 0], [733, 307, 14, 18, 14, 0], [733, 358, 14, 18, 14, 0], [733, 410, 14, 17, 14, 1], [733, 460, 14, 18, 14, 0], [733, 511, 14, 18, 14, 0], [733, 562, 14, 18, 14, 0], [733, 614, 14, 17, 14, 1], [733, 664, 14, 18, 14, 0], [733, 715, 14, 18, 14, 0], [733, 766, 14, 18, 14, 0], [1, 13, 14, 6, 14, 12], [794, 52, 14, 18, 14, 0], [794, 103, 14, 18, 14, 0], [794, 154, 14, 18, 14, 0], [794, 205, 14, 18, 14, 0], [794, 264, 14, 10, 14, 8], [794, 311, 14, 14, 14, 4], [794, 363, 14, 13, 14, 5], [794, 415, 14, 12, 14, 6], [794, 464, 14, 14, 14, 4], [794, 515, 14, 14, 14, 4], [794, 566, 14, 14, 14, 4], [794, 625, 14, 10, 14, 12], [794, 668, 14, 14, 14, 4], [794, 727, 14, 10, 14, 12], [794, 770, 14, 14, 14, 4], [855, 5, 14, 14, 14, 4], [855, 56, 14, 14, 14, 4], [855, 107, 14, 14, 14, 4], [855, 158, 14, 14, 14, 4], [855, 209, 14, 14, 14, 4], [855, 260, 14, 14, 14, 4], [855, 311, 14, 14, 14, 4], [855, 362, 14, 14, 14, 4], [855, 413, 14, 14, 14, 4], [855, 464, 14, 14, 14, 4], [855, 515, 14, 14, 14, 4], [855, 566, 14, 14, 14, 4], [855, 617, 14, 14, 14, 4], [855, 668, 14, 14, 14, 4], [855, 719, 14, 14, 14, 4], [855, 770, 14, 14, 14, 4]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 18}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 19, 1], [1, 58, 16, 20, 19, 6], [1, 109, 19, 8, 19, 6], [1, 160, 21, 20, 19, 6], [1, 209, 18, 24, 19, 4], [1, 262, 23, 20, 19, 6], [1, 313, 19, 20, 19, 6], [1, 364, 17, 9, 19, 6], [1, 414, 21, 25, 19, 5], [1, 465, 19, 25, 19, 5], [1, 516, 20, 12, 19, 5], [1, 574, 19, 14, 19, 12], [1, 633, 14, 11, 19, 20], [1, 680, 18, 4, 19, 16], [1, 735, 14, 6, 19, 20], [1, 771, 22, 21, 19, 5], [62, 7, 20, 20, 19, 6], [62, 58, 17, 20, 19, 6], [62, 109, 20, 20, 19, 6], [62, 160, 19, 20, 19, 6], [62, 211, 19, 20, 19, 6], [62, 262, 19, 20, 19, 6], [62, 313, 20, 20, 19, 6], [62, 364, 21, 20, 19, 6], [62, 415, 19, 20, 19, 6], [62, 466, 20, 20, 19, 6], [62, 522, 16, 15, 19, 11], [62, 573, 16, 20, 19, 11], [62, 624, 22, 15, 19, 11], [62, 679, 20, 8, 19, 15], [62, 726, 21, 15, 19, 11], [62, 772, 20, 20, 19, 6], [123, 6, 21, 21, 19, 5], [123, 58, 19, 20, 19, 6], [123, 109, 20, 20, 19, 6], [123, 160, 20, 20, 19, 6], [123, 211, 20, 20, 19, 6], [123, 262, 20, 20, 19, 6], [123, 313, 20, 20, 19, 6], [123, 364, 20, 20, 19, 6], [123, 415, 20, 20, 19, 6], [123, 466, 20, 20, 19, 6], [123, 517, 19, 20, 19, 6], [123, 568, 21, 20, 19, 6], [123, 619, 17, 20, 19, 6], [123, 670, 21, 20, 19, 6], [123, 721, 20, 20, 19, 6], [123, 772, 20, 20, 19, 6], [184, 7, 21, 20, 19, 6], [184, 58, 20, 25, 19, 6], [184, 109, 20, 20, 19, 6], [184, 160, 19, 20, 19, 6], [184, 211, 21, 20, 19, 6], [184, 262, 20, 20, 19, 6], [184, 313, 23, 20, 19, 6], [184, 364, 21, 20, 19, 6], [184, 415, 21, 20, 19, 6], [184, 466, 22, 20, 19, 6], [184, 517, 20, 20, 19, 6], [184, 567, 22, 25, 19, 5], [184, 618, 18, 21, 19, 5], [184, 669, 19, 25, 19, 5], [184, 722, 20, 14, 19, 7], [184, 790, 18, 4, 19, 24], [245, 6, 17, 6, 19, 5], [245, 63, 19, 15, 19, 11], [245, 108, 20, 21, 19, 5], [245, 165, 19, 15, 19, 11], [245, 210, 21, 21, 19, 5], [245, 267, 19, 15, 19, 11], [245, 312, 22, 21, 19, 5], [245, 369, 19, 20, 19, 11], [245, 414, 19, 21, 19, 5], [245, 465, 16, 21, 19, 5], [245, 516, 19, 26, 19, 5], [245, 567, 20, 21, 19, 5], [245, 618, 16, 21, 19, 5], [245, 675, 19, 15, 19, 11], [245, 726, 19, 15, 19, 11], [245, 777, 19, 15, 19, 11], [306, 12, 20, 20, 19, 11], [306, 63, 19, 20, 19, 11], [306, 114, 19, 15, 19, 11], [306, 165, 18, 15, 19, 11], [306, 212, 19, 19, 19, 7], [306, 267, 19, 15, 19, 11], [306, 318, 22, 15, 19, 11], [306, 369, 21, 15, 19, 11], [306, 420, 20, 15, 19, 11], [306, 471, 21, 20, 19, 11], [306, 522, 19, 15, 19, 11], [306, 567, 21, 25, 19, 5], [306, 618, 17, 21, 19, 5], [306, 669, 18, 25, 19, 5], [306, 731, 19, 6, 19, 16], [306, 772, 19, 20, 19, 6], [367, 3, 19, 24, 19, 2], [367, 55, 19, 23, 19, 3], [367, 109, 20, 25, 19, 6], [367, 154, 20, 26, 19, 0], [367, 207, 20, 24, 19, 2], [367, 258, 20, 24, 19, 2], [367, 309, 20, 24, 19, 2], [367, 363, 20, 21, 19, 5], [367, 414, 19, 21, 19, 5], [367, 465, 19, 21, 19, 5], [367, 518, 19, 19, 19, 7], [367, 569, 19, 19, 19, 7], [367, 618, 19, 21, 19, 5], [367, 675, 20, 20, 19, 11], [367, 720, 19, 21, 19, 5], [367, 771, 19, 21, 19, 5], [428, 6, 19, 21, 19, 5], [428, 59, 19, 19, 19, 7], [428, 108, 18, 21, 19, 5], [428, 159, 17, 21, 19, 5], [428, 210, 17, 21, 19, 5], [428, 263, 17, 19, 19, 7], [428, 314, 18, 19, 19, 7], [428, 363, 19, 21, 19, 5], [428, 414, 19, 21, 19, 5], [428, 465, 19, 21, 19, 5], [428, 518, 19, 19, 19, 7], [428, 569, 19, 19, 19, 7], [428, 618, 19, 21, 19, 5], [428, 669, 19, 21, 19, 5], [428, 720, 19, 21, 19, 5], [428, 773, 19, 19, 19, 7], [489, 7, 20, 24, 19, 6], [489, 57, 18, 8, 19, 5], [489, 107, 19, 24, 19, 4], [489, 159, 21, 21, 19, 5], [489, 210, 19, 26, 19, 5], [489, 266, 19, 12, 19, 10], [489, 312, 23, 25, 19, 5], [489, 363, 19, 21, 19, 5], [489, 414, 21, 21, 19, 5], [489, 465, 21, 21, 19, 5], [489, 517, 20, 11, 19, 6], [489, 567, 18, 6, 19, 5], [489, 620, 18, 4, 19, 7], [489, 676, 20, 13, 19, 12], [489, 721, 21, 20, 19, 6], [489, 771, 21, 22, 19, 5], [550, 15, 21, 10, 19, 14], [550, 60, 20, 18, 19, 8], [550, 110, 21, 19, 19, 7], [550, 161, 21, 19, 19, 7], [550, 211, 22, 20, 19, 6], [550, 267, 19, 19, 19, 11], [550, 312, 20, 21, 19, 5], [550, 364, 20, 25, 19, 6], [550, 415, 21, 25, 19, 6], [550, 471, 21, 15, 19, 11], [550, 516, 20, 25, 19, 5], [550, 567, 19, 10, 19, 5], [550, 618, 20, 10, 19, 5], [550, 669, 20, 21, 19, 5], [550, 726, 20, 15, 19, 11], [550, 776, 20, 17, 19, 10], [611, 12, 17, 20, 19, 11], [611, 63, 16, 20, 19, 11], [611, 119, 19, 8, 19, 16], [611, 158, 23, 26, 19, 4], [611, 210, 23, 25, 19, 5], [611, 270, 21, 10, 19, 14], [611, 313, 18, 20, 19, 6], [611, 370, 20, 13, 19, 12], [611, 421, 18, 13, 19, 12], [611, 482, 15, 4, 19, 22], [611, 511, 1, 1, 19, 1], [611, 562, 19, 26, 19, 0], [611, 615, 19, 24, 19, 2], [611, 666, 20, 24, 19, 2], [611, 721, 21, 20, 19, 6], [611, 777, 20, 15, 19, 11], [672, 17, 19, 4, 19, 16], [672, 68, 19, 4, 19, 16], [672, 108, 20, 11, 19, 5], [672, 159, 20, 11, 19, 5], [672, 210, 18, 11, 19, 5], [672, 261, 17, 11, 19, 5], [672, 321, 19, 12, 19, 14], [672, 363, 21, 21, 19, 5], [672, 416, 20, 24, 19, 7], [1, 1, 1, 1, 19, 1], [794, 771, 18, 6, 19, 5], [672, 570, 22, 16, 19, 8], [672, 624, 18, 15, 19, 11], [672, 675, 17, 15, 19, 11], [672, 720, 20, 21, 19, 5], [672, 771, 22, 21, 19, 5], [733, 7, 20, 24, 19, 6], [733, 68, 15, 6, 19, 16], [733, 123, 14, 11, 19, 20], [733, 174, 17, 11, 19, 20], [733, 212, 22, 19, 19, 7], [733, 256, 19, 26, 19, 0], [733, 307, 20, 26, 19, 0], [733, 358, 19, 26, 19, 0], [733, 411, 20, 24, 19, 2], [733, 460, 20, 26, 19, 0], [733, 511, 20, 26, 19, 0], [733, 562, 20, 26, 19, 0], [733, 615, 20, 24, 19, 2], [733, 664, 20, 26, 19, 0], [733, 715, 20, 26, 19, 0], [733, 766, 20, 26, 19, 0], [1, 1, 1, 1, 19, 1], [794, 52, 20, 26, 19, 0], [794, 103, 20, 26, 19, 0], [794, 154, 20, 26, 19, 0], [794, 205, 20, 26, 19, 0], [794, 267, 17, 15, 19, 11], [794, 312, 17, 6, 19, 5], [794, 365, 18, 4, 19, 7], [794, 416, 18, 4, 19, 7], [794, 465, 19, 6, 19, 5], [794, 516, 17, 6, 19, 5], [794, 567, 17, 6, 19, 5], [794, 637, 13, 7, 19, 24], [794, 669, 21, 6, 19, 5], [794, 739, 13, 7, 19, 24], [794, 771, 18, 6, 19, 5], [855, 6, 18, 6, 19, 5], [855, 57, 18, 6, 19, 5], [855, 108, 18, 6, 19, 5], [855, 159, 18, 6, 19, 5], [855, 210, 18, 6, 19, 5], [855, 261, 18, 6, 19, 5], [855, 312, 18, 6, 19, 5], [855, 363, 18, 6, 19, 5], [855, 414, 18, 6, 19, 5], [855, 465, 18, 6, 19, 5], [855, 516, 18, 6, 19, 5], [855, 567, 18, 6, 19, 5], [855, 618, 18, 6, 19, 5], [855, 669, 18, 6, 19, 5], [855, 720, 18, 6, 19, 5], [855, 771, 18, 6, 19, 5]], \"capHeight\": 25, \"widestlogicalchar\": 19, \"widestglyph\": 23, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 18, 1], [1, 58, 15, 18, 18, 6], [1, 109, 18, 6, 18, 6], [1, 160, 20, 18, 18, 6], [1, 209, 17, 22, 18, 4], [1, 262, 22, 18, 18, 6], [1, 313, 18, 18, 18, 6], [1, 364, 16, 7, 18, 6], [1, 414, 20, 23, 18, 5], [1, 465, 18, 23, 18, 5], [1, 516, 19, 10, 18, 5], [1, 574, 18, 12, 18, 12], [1, 633, 13, 9, 18, 20], [1, 680, 17, 2, 18, 16], [1, 735, 13, 4, 18, 20], [1, 771, 21, 19, 18, 5], [62, 7, 19, 18, 18, 6], [62, 58, 16, 18, 18, 6], [62, 109, 19, 18, 18, 6], [62, 160, 18, 18, 18, 6], [62, 211, 18, 18, 18, 6], [62, 262, 18, 18, 18, 6], [62, 313, 19, 18, 18, 6], [62, 364, 20, 18, 18, 6], [62, 415, 18, 18, 18, 6], [62, 466, 19, 18, 18, 6], [62, 522, 15, 13, 18, 11], [62, 573, 15, 18, 18, 11], [62, 624, 21, 13, 18, 11], [62, 679, 19, 6, 18, 15], [62, 726, 20, 13, 18, 11], [62, 772, 19, 18, 18, 6], [123, 6, 20, 19, 18, 5], [123, 58, 18, 18, 18, 6], [123, 109, 19, 18, 18, 6], [123, 160, 19, 18, 18, 6], [123, 211, 19, 18, 18, 6], [123, 262, 19, 18, 18, 6], [123, 313, 19, 18, 18, 6], [123, 364, 19, 18, 18, 6], [123, 415, 19, 18, 18, 6], [123, 466, 19, 18, 18, 6], [123, 517, 18, 18, 18, 6], [123, 568, 20, 18, 18, 6], [123, 619, 16, 18, 18, 6], [123, 670, 20, 18, 18, 6], [123, 721, 19, 18, 18, 6], [123, 772, 19, 18, 18, 6], [184, 7, 20, 18, 18, 6], [184, 58, 19, 23, 18, 6], [184, 109, 19, 18, 18, 6], [184, 160, 18, 18, 18, 6], [184, 211, 20, 18, 18, 6], [184, 262, 19, 18, 18, 6], [184, 313, 22, 18, 18, 6], [184, 364, 20, 18, 18, 6], [184, 415, 20, 18, 18, 6], [184, 466, 21, 18, 18, 6], [184, 517, 19, 18, 18, 6], [184, 567, 21, 23, 18, 5], [184, 618, 17, 19, 18, 5], [184, 669, 18, 23, 18, 5], [184, 722, 19, 12, 18, 7], [184, 790, 17, 2, 18, 24], [245, 6, 16, 4, 18, 5], [245, 63, 18, 13, 18, 11], [245, 108, 19, 19, 18, 5], [245, 165, 18, 13, 18, 11], [245, 210, 20, 19, 18, 5], [245, 267, 18, 13, 18, 11], [245, 312, 21, 19, 18, 5], [245, 369, 18, 18, 18, 11], [245, 414, 18, 19, 18, 5], [245, 465, 15, 19, 18, 5], [245, 516, 18, 24, 18, 5], [245, 567, 19, 19, 18, 5], [245, 618, 15, 19, 18, 5], [245, 675, 18, 13, 18, 11], [245, 726, 18, 13, 18, 11], [245, 777, 18, 13, 18, 11], [306, 12, 19, 18, 18, 11], [306, 63, 18, 18, 18, 11], [306, 114, 18, 13, 18, 11], [306, 165, 17, 13, 18, 11], [306, 212, 18, 17, 18, 7], [306, 267, 18, 13, 18, 11], [306, 318, 21, 13, 18, 11], [306, 369, 20, 13, 18, 11], [306, 420, 19, 13, 18, 11], [306, 471, 20, 18, 18, 11], [306, 522, 18, 13, 18, 11], [306, 567, 20, 23, 18, 5], [306, 618, 16, 19, 18, 5], [306, 669, 17, 23, 18, 5], [306, 731, 18, 4, 18, 16], [306, 772, 18, 18, 18, 6], [367, 3, 18, 22, 18, 2], [367, 55, 18, 21, 18, 3], [367, 109, 19, 23, 18, 6], [367, 154, 19, 24, 18, 0], [367, 207, 19, 22, 18, 2], [367, 258, 19, 22, 18, 2], [367, 309, 19, 22, 18, 2], [367, 363, 19, 19, 18, 5], [367, 414, 18, 19, 18, 5], [367, 465, 18, 19, 18, 5], [367, 518, 18, 17, 18, 7], [367, 569, 18, 17, 18, 7], [367, 618, 18, 19, 18, 5], [367, 675, 19, 18, 18, 11], [367, 720, 18, 19, 18, 5], [367, 771, 18, 19, 18, 5], [428, 6, 18, 19, 18, 5], [428, 59, 18, 17, 18, 7], [428, 108, 17, 19, 18, 5], [428, 159, 16, 19, 18, 5], [428, 210, 16, 19, 18, 5], [428, 263, 16, 17, 18, 7], [428, 314, 17, 17, 18, 7], [428, 363, 18, 19, 18, 5], [428, 414, 18, 19, 18, 5], [428, 465, 18, 19, 18, 5], [428, 518, 18, 17, 18, 7], [428, 569, 18, 17, 18, 7], [428, 618, 18, 19, 18, 5], [428, 669, 18, 19, 18, 5], [428, 720, 18, 19, 18, 5], [428, 773, 18, 17, 18, 7], [489, 7, 19, 22, 18, 6], [489, 57, 17, 6, 18, 5], [489, 107, 18, 22, 18, 4], [489, 159, 20, 19, 18, 5], [489, 210, 18, 24, 18, 5], [489, 266, 18, 10, 18, 10], [489, 312, 22, 23, 18, 5], [489, 363, 18, 19, 18, 5], [489, 414, 20, 19, 18, 5], [489, 465, 20, 19, 18, 5], [489, 517, 19, 9, 18, 6], [489, 567, 17, 4, 18, 5], [489, 620, 17, 2, 18, 7], [489, 676, 19, 11, 18, 12], [489, 721, 20, 18, 18, 6], [489, 771, 20, 20, 18, 5], [550, 15, 20, 8, 18, 14], [550, 60, 19, 16, 18, 8], [550, 110, 20, 17, 18, 7], [550, 161, 20, 17, 18, 7], [550, 211, 21, 18, 18, 6], [550, 267, 18, 17, 18, 11], [550, 312, 19, 19, 18, 5], [550, 364, 19, 23, 18, 6], [550, 415, 20, 23, 18, 6], [550, 471, 20, 13, 18, 11], [550, 516, 19, 23, 18, 5], [550, 567, 18, 8, 18, 5], [550, 618, 19, 8, 18, 5], [550, 669, 19, 19, 18, 5], [550, 726, 19, 13, 18, 11], [550, 776, 19, 15, 18, 10], [611, 12, 16, 18, 18, 11], [611, 63, 15, 18, 18, 11], [611, 119, 18, 6, 18, 16], [611, 158, 22, 24, 18, 4], [611, 210, 22, 23, 18, 5], [611, 270, 20, 8, 18, 14], [611, 313, 17, 18, 18, 6], [611, 370, 19, 11, 18, 12], [611, 421, 17, 11, 18, 12], [611, 482, 14, 2, 18, 22], [611, 511, 1, 1, 18, 1], [611, 562, 18, 24, 18, 0], [611, 615, 18, 22, 18, 2], [611, 666, 19, 22, 18, 2], [611, 721, 20, 18, 18, 6], [611, 777, 19, 13, 18, 11], [672, 17, 18, 2, 18, 16], [672, 68, 18, 2, 18, 16], [672, 108, 19, 9, 18, 5], [672, 159, 19, 9, 18, 5], [672, 210, 17, 9, 18, 5], [672, 261, 16, 9, 18, 5], [672, 321, 18, 10, 18, 14], [672, 363, 20, 19, 18, 5], [672, 416, 19, 22, 18, 7], [1, 1, 1, 1, 18, 1], [794, 771, 17, 4, 18, 5], [672, 570, 21, 14, 18, 8], [672, 624, 17, 13, 18, 11], [672, 675, 16, 13, 18, 11], [672, 720, 19, 19, 18, 5], [672, 771, 21, 19, 18, 5], [733, 7, 19, 22, 18, 6], [733, 68, 14, 4, 18, 16], [733, 123, 13, 9, 18, 20], [733, 174, 16, 9, 18, 20], [733, 212, 21, 17, 18, 7], [733, 256, 18, 24, 18, 0], [733, 307, 19, 24, 18, 0], [733, 358, 18, 24, 18, 0], [733, 411, 19, 22, 18, 2], [733, 460, 19, 24, 18, 0], [733, 511, 19, 24, 18, 0], [733, 562, 19, 24, 18, 0], [733, 615, 19, 22, 18, 2], [733, 664, 19, 24, 18, 0], [733, 715, 19, 24, 18, 0], [733, 766, 19, 24, 18, 0], [1, 1, 1, 1, 18, 1], [794, 52, 19, 24, 18, 0], [794, 103, 19, 24, 18, 0], [794, 154, 19, 24, 18, 0], [794, 205, 19, 24, 18, 0], [794, 267, 16, 13, 18, 11], [794, 312, 16, 4, 18, 5], [794, 365, 17, 2, 18, 7], [794, 416, 17, 2, 18, 7], [794, 465, 18, 4, 18, 5], [794, 516, 16, 4, 18, 5], [794, 567, 16, 4, 18, 5], [794, 637, 12, 5, 18, 24], [794, 669, 20, 4, 18, 5], [794, 739, 12, 5, 18, 24], [794, 771, 17, 4, 18, 5], [855, 6, 17, 4, 18, 5], [855, 57, 17, 4, 18, 5], [855, 108, 17, 4, 18, 5], [855, 159, 17, 4, 18, 5], [855, 210, 17, 4, 18, 5], [855, 261, 17, 4, 18, 5], [855, 312, 17, 4, 18, 5], [855, 363, 17, 4, 18, 5], [855, 414, 17, 4, 18, 5], [855, 465, 17, 4, 18, 5], [855, 516, 17, 4, 18, 5], [855, 567, 17, 4, 18, 5], [855, 618, 17, 4, 18, 5], [855, 669, 17, 4, 18, 5], [855, 720, 17, 4, 18, 5], [855, 771, 17, 4, 18, 5]], \"capHeight\": 24, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 20, 19, 6, 19, 19], [1, 58, 19, 20, 19, 6], [1, 109, 19, 19, 19, 6], [1, 160, 19, 20, 19, 6], [1, 209, 19, 24, 19, 4], [1, 262, 19, 20, 19, 6], [1, 313, 19, 20, 19, 6], [1, 364, 19, 19, 19, 6], [1, 414, 19, 25, 19, 5], [1, 465, 19, 25, 19, 5], [1, 516, 19, 20, 19, 5], [1, 574, 19, 14, 19, 12], [1, 632, 19, 12, 19, 19], [1, 680, 19, 9, 19, 16], [1, 734, 19, 7, 19, 19], [1, 771, 19, 21, 19, 5], [62, 7, 19, 20, 19, 6], [62, 58, 19, 20, 19, 6], [62, 109, 19, 20, 19, 6], [62, 160, 19, 20, 19, 6], [62, 211, 19, 20, 19, 6], [62, 262, 19, 20, 19, 6], [62, 313, 19, 20, 19, 6], [62, 364, 19, 20, 19, 6], [62, 415, 19, 20, 19, 6], [62, 466, 19, 20, 19, 6], [62, 522, 19, 15, 19, 11], [62, 573, 19, 20, 19, 11], [62, 624, 19, 15, 19, 11], [62, 679, 19, 10, 19, 15], [62, 726, 19, 15, 19, 11], [62, 772, 19, 20, 19, 6], [123, 6, 19, 21, 19, 5], [123, 58, 19, 20, 19, 6], [123, 109, 19, 20, 19, 6], [123, 160, 19, 20, 19, 6], [123, 211, 19, 20, 19, 6], [123, 262, 19, 20, 19, 6], [123, 313, 19, 20, 19, 6], [123, 364, 19, 20, 19, 6], [123, 415, 19, 20, 19, 6], [123, 466, 19, 20, 19, 6], [123, 517, 19, 20, 19, 6], [123, 568, 19, 20, 19, 6], [123, 619, 19, 20, 19, 6], [123, 670, 19, 20, 19, 6], [123, 721, 19, 20, 19, 6], [123, 772, 19, 20, 19, 6], [184, 7, 19, 20, 19, 6], [184, 58, 19, 25, 19, 6], [184, 109, 19, 20, 19, 6], [184, 160, 19, 20, 19, 6], [184, 211, 19, 20, 19, 6], [184, 262, 19, 20, 19, 6], [184, 313, 19, 20, 19, 6], [184, 364, 19, 20, 19, 6], [184, 415, 19, 20, 19, 6], [184, 466, 19, 20, 19, 6], [184, 517, 19, 20, 19, 6], [184, 567, 19, 25, 19, 5], [184, 618, 19, 21, 19, 5], [184, 669, 19, 25, 19, 5], [184, 721, 19, 19, 19, 6], [184, 785, 19, 9, 19, 19], [245, 6, 19, 20, 19, 5], [245, 63, 19, 15, 19, 11], [245, 108, 19, 21, 19, 5], [245, 165, 19, 15, 19, 11], [245, 210, 19, 21, 19, 5], [245, 267, 19, 15, 19, 11], [245, 312, 19, 21, 19, 5], [245, 369, 19, 20, 19, 11], [245, 414, 19, 21, 19, 5], [245, 465, 19, 21, 19, 5], [245, 516, 19, 26, 19, 5], [245, 567, 19, 21, 19, 5], [245, 618, 19, 21, 19, 5], [245, 675, 19, 15, 19, 11], [245, 726, 19, 15, 19, 11], [245, 777, 19, 15, 19, 11], [306, 12, 19, 20, 19, 11], [306, 63, 19, 20, 19, 11], [306, 114, 19, 15, 19, 11], [306, 165, 19, 15, 19, 11], [306, 212, 19, 19, 19, 7], [306, 267, 19, 15, 19, 11], [306, 318, 19, 15, 19, 11], [306, 369, 19, 15, 19, 11], [306, 420, 19, 15, 19, 11], [306, 471, 19, 20, 19, 11], [306, 522, 19, 15, 19, 11], [306, 567, 19, 25, 19, 5], [306, 618, 19, 21, 19, 5], [306, 669, 19, 25, 19, 5], [306, 731, 19, 9, 19, 16], [306, 772, 19, 20, 19, 6], [367, 3, 19, 24, 19, 2], [367, 55, 19, 23, 19, 3], [367, 109, 19, 25, 19, 6], [367, 154, 19, 26, 19, 0], [367, 207, 19, 24, 19, 2], [367, 258, 19, 24, 19, 2], [367, 309, 19, 24, 19, 2], [367, 363, 19, 21, 19, 5], [367, 414, 19, 21, 19, 5], [367, 465, 19, 21, 19, 5], [367, 518, 19, 19, 19, 7], [367, 569, 19, 19, 19, 7], [367, 618, 19, 21, 19, 5], [367, 675, 19, 20, 19, 11], [367, 720, 19, 21, 19, 5], [367, 771, 19, 21, 19, 5], [428, 6, 19, 21, 19, 5], [428, 59, 19, 19, 19, 7], [428, 108, 19, 21, 19, 5], [428, 159, 19, 21, 19, 5], [428, 210, 19, 21, 19, 5], [428, 263, 19, 19, 19, 7], [428, 314, 19, 19, 19, 7], [428, 363, 19, 21, 19, 5], [428, 414, 19, 21, 19, 5], [428, 465, 19, 21, 19, 5], [428, 518, 19, 19, 19, 7], [428, 569, 19, 19, 19, 7], [428, 618, 19, 21, 19, 5], [428, 669, 19, 21, 19, 5], [428, 720, 19, 21, 19, 5], [428, 773, 19, 19, 19, 7], [489, 7, 19, 24, 19, 6], [489, 57, 19, 20, 19, 5], [489, 107, 19, 24, 19, 4], [489, 159, 19, 21, 19, 5], [489, 210, 19, 26, 19, 5], [489, 266, 19, 15, 19, 10], [489, 312, 19, 25, 19, 5], [489, 363, 19, 21, 19, 5], [489, 414, 19, 21, 19, 5], [489, 465, 19, 21, 19, 5], [489, 517, 19, 19, 19, 6], [489, 567, 19, 20, 19, 5], [489, 620, 19, 18, 19, 7], [489, 676, 19, 13, 19, 12], [489, 721, 19, 20, 19, 6], [489, 771, 19, 22, 19, 5], [550, 15, 19, 11, 19, 14], [550, 60, 19, 18, 19, 8], [550, 110, 19, 19, 19, 7], [550, 161, 19, 19, 19, 7], [550, 211, 19, 20, 19, 6], [550, 267, 19, 19, 19, 11], [550, 312, 19, 21, 19, 5], [550, 364, 19, 25, 19, 6], [550, 415, 19, 25, 19, 6], [550, 471, 19, 15, 19, 11], [550, 516, 19, 25, 19, 5], [550, 567, 19, 20, 19, 5], [550, 618, 19, 20, 19, 5], [550, 669, 19, 21, 19, 5], [550, 726, 19, 15, 19, 11], [550, 776, 19, 17, 19, 10], [611, 12, 19, 20, 19, 11], [611, 63, 19, 20, 19, 11], [611, 119, 19, 9, 19, 16], [611, 158, 19, 26, 19, 4], [611, 210, 19, 25, 19, 5], [611, 270, 19, 11, 19, 14], [611, 313, 19, 20, 19, 6], [611, 370, 19, 13, 19, 12], [611, 421, 19, 13, 19, 12], [611, 479, 19, 7, 19, 19], [611, 530, 19, 6, 19, 19], [611, 562, 19, 26, 19, 0], [611, 615, 19, 24, 19, 2], [611, 666, 19, 24, 19, 2], [611, 721, 19, 20, 19, 6], [611, 777, 19, 15, 19, 11], [672, 17, 19, 9, 19, 16], [672, 68, 19, 9, 19, 16], [672, 108, 19, 20, 19, 5], [672, 159, 19, 20, 19, 5], [672, 210, 19, 20, 19, 5], [672, 261, 19, 20, 19, 5], [672, 321, 19, 12, 19, 14], [672, 363, 19, 21, 19, 5], [672, 416, 19, 24, 19, 7], [1, 20, 19, 6, 19, 19], [794, 771, 19, 20, 19, 5], [672, 570, 19, 17, 19, 8], [672, 624, 19, 15, 19, 11], [672, 675, 19, 15, 19, 11], [672, 720, 19, 21, 19, 5], [672, 771, 19, 21, 19, 5], [733, 7, 19, 24, 19, 6], [733, 68, 19, 9, 19, 16], [733, 122, 19, 12, 19, 19], [733, 173, 19, 12, 19, 19], [733, 212, 19, 19, 19, 7], [733, 256, 19, 26, 19, 0], [733, 307, 19, 26, 19, 0], [733, 358, 19, 26, 19, 0], [733, 411, 19, 24, 19, 2], [733, 460, 19, 26, 19, 0], [733, 511, 19, 26, 19, 0], [733, 562, 19, 26, 19, 0], [733, 615, 19, 24, 19, 2], [733, 664, 19, 26, 19, 0], [733, 715, 19, 26, 19, 0], [733, 766, 19, 26, 19, 0], [1, 20, 19, 6, 19, 19], [794, 52, 19, 26, 19, 0], [794, 103, 19, 26, 19, 0], [794, 154, 19, 26, 19, 0], [794, 205, 19, 26, 19, 0], [794, 267, 19, 15, 19, 11], [794, 312, 19, 20, 19, 5], [794, 365, 19, 18, 19, 7], [794, 416, 19, 18, 19, 7], [794, 465, 19, 20, 19, 5], [794, 516, 19, 20, 19, 5], [794, 567, 19, 20, 19, 5], [794, 632, 19, 12, 19, 19], [794, 669, 19, 20, 19, 5], [794, 734, 19, 12, 19, 19], [794, 771, 19, 20, 19, 5], [855, 6, 19, 20, 19, 5], [855, 57, 19, 20, 19, 5], [855, 108, 19, 20, 19, 5], [855, 159, 19, 20, 19, 5], [855, 210, 19, 20, 19, 5], [855, 261, 19, 20, 19, 5], [855, 312, 19, 20, 19, 5], [855, 363, 19, 20, 19, 5], [855, 414, 19, 20, 19, 5], [855, 465, 19, 20, 19, 5], [855, 516, 19, 20, 19, 5], [855, 567, 19, 20, 19, 5], [855, 618, 19, 20, 19, 5], [855, 669, 19, 20, 19, 5], [855, 720, 19, 20, 19, 5], [855, 771, 19, 20, 19, 5]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 18, 6, 18, 18], [1, 58, 18, 18, 18, 6], [1, 109, 18, 18, 18, 6], [1, 160, 18, 18, 18, 6], [1, 209, 18, 22, 18, 4], [1, 262, 18, 18, 18, 6], [1, 313, 18, 18, 18, 6], [1, 364, 18, 18, 18, 6], [1, 414, 18, 23, 18, 5], [1, 465, 18, 23, 18, 5], [1, 516, 18, 19, 18, 5], [1, 574, 18, 12, 18, 12], [1, 631, 18, 11, 18, 18], [1, 680, 18, 8, 18, 16], [1, 733, 18, 6, 18, 18], [1, 771, 18, 19, 18, 5], [62, 7, 18, 18, 18, 6], [62, 58, 18, 18, 18, 6], [62, 109, 18, 18, 18, 6], [62, 160, 18, 18, 18, 6], [62, 211, 18, 18, 18, 6], [62, 262, 18, 18, 18, 6], [62, 313, 18, 18, 18, 6], [62, 364, 18, 18, 18, 6], [62, 415, 18, 18, 18, 6], [62, 466, 18, 18, 18, 6], [62, 522, 18, 13, 18, 11], [62, 573, 18, 18, 18, 11], [62, 624, 18, 13, 18, 11], [62, 679, 18, 9, 18, 15], [62, 726, 18, 13, 18, 11], [62, 772, 18, 18, 18, 6], [123, 6, 18, 19, 18, 5], [123, 58, 18, 18, 18, 6], [123, 109, 18, 18, 18, 6], [123, 160, 18, 18, 18, 6], [123, 211, 18, 18, 18, 6], [123, 262, 18, 18, 18, 6], [123, 313, 18, 18, 18, 6], [123, 364, 18, 18, 18, 6], [123, 415, 18, 18, 18, 6], [123, 466, 18, 18, 18, 6], [123, 517, 18, 18, 18, 6], [123, 568, 18, 18, 18, 6], [123, 619, 18, 18, 18, 6], [123, 670, 18, 18, 18, 6], [123, 721, 18, 18, 18, 6], [123, 772, 18, 18, 18, 6], [184, 7, 18, 18, 18, 6], [184, 58, 18, 23, 18, 6], [184, 109, 18, 18, 18, 6], [184, 160, 18, 18, 18, 6], [184, 211, 18, 18, 18, 6], [184, 262, 18, 18, 18, 6], [184, 313, 18, 18, 18, 6], [184, 364, 18, 18, 18, 6], [184, 415, 18, 18, 18, 6], [184, 466, 18, 18, 18, 6], [184, 517, 18, 18, 18, 6], [184, 567, 18, 23, 18, 5], [184, 618, 18, 19, 18, 5], [184, 669, 18, 23, 18, 5], [184, 721, 18, 18, 18, 6], [184, 784, 18, 8, 18, 18], [245, 6, 18, 19, 18, 5], [245, 63, 18, 13, 18, 11], [245, 108, 18, 19, 18, 5], [245, 165, 18, 13, 18, 11], [245, 210, 18, 19, 18, 5], [245, 267, 18, 13, 18, 11], [245, 312, 18, 19, 18, 5], [245, 369, 18, 18, 18, 11], [245, 414, 18, 19, 18, 5], [245, 465, 18, 19, 18, 5], [245, 516, 18, 24, 18, 5], [245, 567, 18, 19, 18, 5], [245, 618, 18, 19, 18, 5], [245, 675, 18, 13, 18, 11], [245, 726, 18, 13, 18, 11], [245, 777, 18, 13, 18, 11], [306, 12, 18, 18, 18, 11], [306, 63, 18, 18, 18, 11], [306, 114, 18, 13, 18, 11], [306, 165, 18, 13, 18, 11], [306, 212, 18, 17, 18, 7], [306, 267, 18, 13, 18, 11], [306, 318, 18, 13, 18, 11], [306, 369, 18, 13, 18, 11], [306, 420, 18, 13, 18, 11], [306, 471, 18, 18, 18, 11], [306, 522, 18, 13, 18, 11], [306, 567, 18, 23, 18, 5], [306, 618, 18, 19, 18, 5], [306, 669, 18, 23, 18, 5], [306, 731, 18, 8, 18, 16], [306, 772, 18, 18, 18, 6], [367, 3, 18, 22, 18, 2], [367, 55, 18, 21, 18, 3], [367, 109, 18, 23, 18, 6], [367, 154, 18, 24, 18, 0], [367, 207, 18, 22, 18, 2], [367, 258, 18, 22, 18, 2], [367, 309, 18, 22, 18, 2], [367, 363, 18, 19, 18, 5], [367, 414, 18, 19, 18, 5], [367, 465, 18, 19, 18, 5], [367, 518, 18, 17, 18, 7], [367, 569, 18, 17, 18, 7], [367, 618, 18, 19, 18, 5], [367, 675, 18, 18, 18, 11], [367, 720, 18, 19, 18, 5], [367, 771, 18, 19, 18, 5], [428, 6, 18, 19, 18, 5], [428, 59, 18, 17, 18, 7], [428, 108, 18, 19, 18, 5], [428, 159, 18, 19, 18, 5], [428, 210, 18, 19, 18, 5], [428, 263, 18, 17, 18, 7], [428, 314, 18, 17, 18, 7], [428, 363, 18, 19, 18, 5], [428, 414, 18, 19, 18, 5], [428, 465, 18, 19, 18, 5], [428, 518, 18, 17, 18, 7], [428, 569, 18, 17, 18, 7], [428, 618, 18, 19, 18, 5], [428, 669, 18, 19, 18, 5], [428, 720, 18, 19, 18, 5], [428, 773, 18, 17, 18, 7], [489, 7, 18, 22, 18, 6], [489, 57, 18, 19, 18, 5], [489, 107, 18, 22, 18, 4], [489, 159, 18, 19, 18, 5], [489, 210, 18, 24, 18, 5], [489, 266, 18, 14, 18, 10], [489, 312, 18, 23, 18, 5], [489, 363, 18, 19, 18, 5], [489, 414, 18, 19, 18, 5], [489, 465, 18, 19, 18, 5], [489, 517, 18, 18, 18, 6], [489, 567, 18, 19, 18, 5], [489, 620, 18, 17, 18, 7], [489, 676, 18, 12, 18, 12], [489, 721, 18, 18, 18, 6], [489, 771, 18, 20, 18, 5], [550, 15, 18, 10, 18, 14], [550, 60, 18, 16, 18, 8], [550, 110, 18, 17, 18, 7], [550, 161, 18, 17, 18, 7], [550, 211, 18, 18, 18, 6], [550, 267, 18, 17, 18, 11], [550, 312, 18, 19, 18, 5], [550, 364, 18, 23, 18, 6], [550, 415, 18, 23, 18, 6], [550, 471, 18, 13, 18, 11], [550, 516, 18, 23, 18, 5], [550, 567, 18, 19, 18, 5], [550, 618, 18, 19, 18, 5], [550, 669, 18, 19, 18, 5], [550, 726, 18, 13, 18, 11], [550, 776, 18, 15, 18, 10], [611, 12, 18, 18, 18, 11], [611, 63, 18, 18, 18, 11], [611, 119, 18, 8, 18, 16], [611, 158, 18, 24, 18, 4], [611, 210, 18, 23, 18, 5], [611, 270, 18, 10, 18, 14], [611, 313, 18, 18, 18, 6], [611, 370, 18, 12, 18, 12], [611, 421, 18, 12, 18, 12], [611, 478, 18, 6, 18, 18], [611, 529, 18, 6, 18, 18], [611, 562, 18, 24, 18, 0], [611, 615, 18, 22, 18, 2], [611, 666, 18, 22, 18, 2], [611, 721, 18, 18, 18, 6], [611, 777, 18, 13, 18, 11], [672, 17, 18, 8, 18, 16], [672, 68, 18, 8, 18, 16], [672, 108, 18, 19, 18, 5], [672, 159, 18, 19, 18, 5], [672, 210, 18, 19, 18, 5], [672, 261, 18, 19, 18, 5], [672, 321, 18, 10, 18, 14], [672, 363, 18, 19, 18, 5], [672, 416, 18, 22, 18, 7], [1, 19, 18, 6, 18, 18], [794, 771, 18, 19, 18, 5], [672, 570, 18, 16, 18, 8], [672, 624, 18, 13, 18, 11], [672, 675, 18, 13, 18, 11], [672, 720, 18, 19, 18, 5], [672, 771, 18, 19, 18, 5], [733, 7, 18, 22, 18, 6], [733, 68, 18, 8, 18, 16], [733, 121, 18, 11, 18, 18], [733, 172, 18, 11, 18, 18], [733, 212, 18, 17, 18, 7], [733, 256, 18, 24, 18, 0], [733, 307, 18, 24, 18, 0], [733, 358, 18, 24, 18, 0], [733, 411, 18, 22, 18, 2], [733, 460, 18, 24, 18, 0], [733, 511, 18, 24, 18, 0], [733, 562, 18, 24, 18, 0], [733, 615, 18, 22, 18, 2], [733, 664, 18, 24, 18, 0], [733, 715, 18, 24, 18, 0], [733, 766, 18, 24, 18, 0], [1, 19, 18, 6, 18, 18], [794, 52, 18, 24, 18, 0], [794, 103, 18, 24, 18, 0], [794, 154, 18, 24, 18, 0], [794, 205, 18, 24, 18, 0], [794, 267, 18, 13, 18, 11], [794, 312, 18, 19, 18, 5], [794, 365, 18, 17, 18, 7], [794, 416, 18, 17, 18, 7], [794, 465, 18, 19, 18, 5], [794, 516, 18, 19, 18, 5], [794, 567, 18, 19, 18, 5], [794, 631, 18, 11, 18, 18], [794, 669, 18, 19, 18, 5], [794, 733, 18, 11, 18, 18], [794, 771, 18, 19, 18, 5], [855, 6, 18, 19, 18, 5], [855, 57, 18, 19, 18, 5], [855, 108, 18, 19, 18, 5], [855, 159, 18, 19, 18, 5], [855, 210, 18, 19, 18, 5], [855, 261, 18, 19, 18, 5], [855, 312, 18, 19, 18, 5], [855, 363, 18, 19, 18, 5], [855, 414, 18, 19, 18, 5], [855, 465, 18, 19, 18, 5], [855, 516, 18, 19, 18, 5], [855, 567, 18, 19, 18, 5], [855, 618, 18, 19, 18, 5], [855, 669, 18, 19, 18, 5], [855, 720, 18, 19, 18, 5], [855, 771, 18, 19, 18, 5]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 18, 1], [1, 58, 15, 20, 18, 6], [1, 109, 18, 8, 18, 6], [1, 160, 20, 20, 18, 6], [1, 209, 17, 24, 18, 4], [1, 262, 22, 20, 18, 6], [1, 313, 18, 20, 18, 6], [1, 364, 16, 9, 18, 6], [1, 414, 20, 25, 18, 5], [1, 465, 18, 25, 18, 5], [1, 516, 19, 12, 18, 5], [1, 574, 18, 14, 18, 12], [1, 633, 13, 11, 18, 20], [1, 680, 17, 4, 18, 16], [1, 735, 13, 6, 18, 20], [1, 771, 21, 21, 18, 5], [62, 7, 19, 20, 18, 6], [62, 58, 16, 20, 18, 6], [62, 109, 19, 20, 18, 6], [62, 160, 18, 20, 18, 6], [62, 211, 18, 20, 18, 6], [62, 262, 18, 20, 18, 6], [62, 313, 19, 20, 18, 6], [62, 364, 20, 20, 18, 6], [62, 415, 18, 20, 18, 6], [62, 466, 19, 20, 18, 6], [62, 522, 15, 15, 18, 11], [62, 573, 15, 20, 18, 11], [62, 624, 21, 15, 18, 11], [62, 679, 19, 8, 18, 15], [62, 726, 20, 15, 18, 11], [62, 772, 19, 20, 18, 6], [123, 6, 20, 21, 18, 5], [123, 58, 18, 20, 18, 6], [123, 109, 19, 20, 18, 6], [123, 160, 19, 20, 18, 6], [123, 211, 19, 20, 18, 6], [123, 262, 19, 20, 18, 6], [123, 313, 19, 20, 18, 6], [123, 364, 19, 20, 18, 6], [123, 415, 19, 20, 18, 6], [123, 466, 19, 20, 18, 6], [123, 517, 18, 20, 18, 6], [123, 568, 20, 20, 18, 6], [123, 619, 16, 20, 18, 6], [123, 670, 20, 20, 18, 6], [123, 721, 19, 20, 18, 6], [123, 772, 19, 20, 18, 6], [184, 7, 20, 20, 18, 6], [184, 58, 19, 25, 18, 6], [184, 109, 19, 20, 18, 6], [184, 160, 18, 20, 18, 6], [184, 211, 20, 20, 18, 6], [184, 262, 19, 20, 18, 6], [184, 313, 22, 20, 18, 6], [184, 364, 20, 20, 18, 6], [184, 415, 20, 20, 18, 6], [184, 466, 21, 20, 18, 6], [184, 517, 19, 20, 18, 6], [184, 567, 21, 25, 18, 5], [184, 618, 17, 21, 18, 5], [184, 669, 18, 25, 18, 5], [184, 722, 19, 14, 18, 7], [184, 790, 17, 4, 18, 24], [245, 6, 16, 6, 18, 5], [245, 63, 18, 15, 18, 11], [245, 108, 19, 21, 18, 5], [245, 165, 18, 15, 18, 11], [245, 210, 20, 21, 18, 5], [245, 267, 18, 15, 18, 11], [245, 312, 21, 21, 18, 5], [245, 369, 18, 20, 18, 11], [245, 414, 18, 21, 18, 5], [245, 465, 15, 21, 18, 5], [245, 516, 18, 26, 18, 5], [245, 567, 19, 21, 18, 5], [245, 618, 15, 21, 18, 5], [245, 675, 18, 15, 18, 11], [245, 726, 18, 15, 18, 11], [245, 777, 18, 15, 18, 11], [306, 12, 19, 20, 18, 11], [306, 63, 18, 20, 18, 11], [306, 114, 18, 15, 18, 11], [306, 165, 17, 15, 18, 11], [306, 212, 18, 19, 18, 7], [306, 267, 18, 15, 18, 11], [306, 318, 21, 15, 18, 11], [306, 369, 20, 15, 18, 11], [306, 420, 19, 15, 18, 11], [306, 471, 20, 20, 18, 11], [306, 522, 18, 15, 18, 11], [306, 567, 20, 25, 18, 5], [306, 618, 16, 21, 18, 5], [306, 669, 17, 25, 18, 5], [306, 731, 18, 6, 18, 16], [306, 772, 18, 20, 18, 6], [367, 3, 18, 24, 18, 2], [367, 55, 18, 23, 18, 3], [367, 109, 19, 25, 18, 6], [367, 154, 19, 26, 18, 0], [367, 207, 19, 24, 18, 2], [367, 258, 19, 24, 18, 2], [367, 309, 19, 24, 18, 2], [367, 363, 19, 21, 18, 5], [367, 414, 18, 21, 18, 5], [367, 465, 18, 21, 18, 5], [367, 518, 18, 19, 18, 7], [367, 569, 18, 19, 18, 7], [367, 618, 18, 21, 18, 5], [367, 675, 19, 20, 18, 11], [367, 720, 18, 21, 18, 5], [367, 771, 18, 21, 18, 5], [428, 6, 18, 21, 18, 5], [428, 59, 18, 19, 18, 7], [428, 108, 17, 21, 18, 5], [428, 159, 16, 21, 18, 5], [428, 210, 16, 21, 18, 5], [428, 263, 16, 19, 18, 7], [428, 314, 17, 19, 18, 7], [428, 363, 18, 21, 18, 5], [428, 414, 18, 21, 18, 5], [428, 465, 18, 21, 18, 5], [428, 518, 18, 19, 18, 7], [428, 569, 18, 19, 18, 7], [428, 618, 18, 21, 18, 5], [428, 669, 18, 21, 18, 5], [428, 720, 18, 21, 18, 5], [428, 773, 18, 19, 18, 7], [489, 7, 19, 24, 18, 6], [489, 57, 17, 8, 18, 5], [489, 107, 18, 24, 18, 4], [489, 159, 20, 21, 18, 5], [489, 210, 18, 26, 18, 5], [489, 266, 18, 12, 18, 10], [489, 312, 22, 25, 18, 5], [489, 363, 18, 21, 18, 5], [489, 414, 20, 21, 18, 5], [489, 465, 20, 21, 18, 5], [489, 517, 19, 11, 18, 6], [489, 567, 17, 6, 18, 5], [489, 620, 17, 4, 18, 7], [489, 676, 19, 13, 18, 12], [489, 721, 20, 20, 18, 6], [489, 771, 20, 22, 18, 5], [550, 15, 20, 10, 18, 14], [550, 60, 19, 18, 18, 8], [550, 110, 20, 19, 18, 7], [550, 161, 20, 19, 18, 7], [550, 211, 21, 20, 18, 6], [550, 267, 18, 19, 18, 11], [550, 312, 19, 21, 18, 5], [550, 364, 19, 25, 18, 6], [550, 415, 20, 25, 18, 6], [550, 471, 20, 15, 18, 11], [550, 516, 19, 25, 18, 5], [550, 567, 18, 10, 18, 5], [550, 618, 19, 10, 18, 5], [550, 669, 19, 21, 18, 5], [550, 726, 19, 15, 18, 11], [550, 776, 19, 17, 18, 10], [611, 12, 16, 20, 18, 11], [611, 63, 15, 20, 18, 11], [611, 119, 18, 8, 18, 16], [611, 158, 22, 26, 18, 4], [611, 210, 22, 25, 18, 5], [611, 270, 20, 10, 18, 14], [611, 313, 17, 20, 18, 6], [611, 370, 19, 13, 18, 12], [611, 421, 17, 13, 18, 12], [611, 482, 14, 4, 18, 22], [611, 511, 1, 1, 18, 1], [611, 562, 18, 26, 18, 0], [611, 615, 18, 24, 18, 2], [611, 666, 19, 24, 18, 2], [611, 721, 20, 20, 18, 6], [611, 777, 19, 15, 18, 11], [672, 17, 18, 4, 18, 16], [672, 68, 18, 4, 18, 16], [672, 108, 19, 11, 18, 5], [672, 159, 19, 11, 18, 5], [672, 210, 17, 11, 18, 5], [672, 261, 16, 11, 18, 5], [672, 321, 18, 12, 18, 14], [672, 363, 20, 21, 18, 5], [672, 416, 19, 24, 18, 7], [1, 1, 1, 1, 18, 1], [794, 771, 17, 6, 18, 5], [672, 570, 21, 16, 18, 8], [672, 624, 17, 15, 18, 11], [672, 675, 16, 15, 18, 11], [672, 720, 19, 21, 18, 5], [672, 771, 21, 21, 18, 5], [733, 7, 19, 24, 18, 6], [733, 68, 14, 6, 18, 16], [733, 123, 13, 11, 18, 20], [733, 174, 16, 11, 18, 20], [733, 212, 21, 19, 18, 7], [733, 256, 18, 26, 18, 0], [733, 307, 19, 26, 18, 0], [733, 358, 18, 26, 18, 0], [733, 411, 19, 24, 18, 2], [733, 460, 19, 26, 18, 0], [733, 511, 19, 26, 18, 0], [733, 562, 19, 26, 18, 0], [733, 615, 19, 24, 18, 2], [733, 664, 19, 26, 18, 0], [733, 715, 19, 26, 18, 0], [733, 766, 19, 26, 18, 0], [1, 1, 1, 1, 18, 1], [794, 52, 19, 26, 18, 0], [794, 103, 19, 26, 18, 0], [794, 154, 19, 26, 18, 0], [794, 205, 19, 26, 18, 0], [794, 267, 16, 15, 18, 11], [794, 312, 16, 6, 18, 5], [794, 365, 17, 4, 18, 7], [794, 416, 17, 4, 18, 7], [794, 465, 18, 6, 18, 5], [794, 516, 16, 6, 18, 5], [794, 567, 16, 6, 18, 5], [794, 637, 12, 7, 18, 24], [794, 669, 20, 6, 18, 5], [794, 739, 12, 7, 18, 24], [794, 771, 17, 6, 18, 5], [855, 6, 17, 6, 18, 5], [855, 57, 17, 6, 18, 5], [855, 108, 17, 6, 18, 5], [855, 159, 17, 6, 18, 5], [855, 210, 17, 6, 18, 5], [855, 261, 17, 6, 18, 5], [855, 312, 17, 6, 18, 5], [855, 363, 17, 6, 18, 5], [855, 414, 17, 6, 18, 5], [855, 465, 17, 6, 18, 5], [855, 516, 17, 6, 18, 5], [855, 567, 17, 6, 18, 5], [855, 618, 17, 6, 18, 5], [855, 669, 17, 6, 18, 5], [855, 720, 17, 6, 18, 5], [855, 771, 17, 6, 18, 5]], \"capHeight\": 25, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 17, 1], [1, 58, 14, 18, 17, 6], [1, 109, 17, 6, 17, 6], [1, 160, 19, 18, 17, 6], [1, 209, 16, 22, 17, 4], [1, 262, 21, 18, 17, 6], [1, 313, 17, 18, 17, 6], [1, 364, 15, 7, 17, 6], [1, 414, 19, 23, 17, 5], [1, 465, 17, 23, 17, 5], [1, 516, 18, 10, 17, 5], [1, 574, 17, 12, 17, 12], [1, 633, 12, 9, 17, 20], [1, 680, 16, 2, 17, 16], [1, 735, 12, 4, 17, 20], [1, 771, 20, 19, 17, 5], [62, 7, 18, 18, 17, 6], [62, 58, 15, 18, 17, 6], [62, 109, 18, 18, 17, 6], [62, 160, 17, 18, 17, 6], [62, 211, 17, 18, 17, 6], [62, 262, 17, 18, 17, 6], [62, 313, 18, 18, 17, 6], [62, 364, 19, 18, 17, 6], [62, 415, 17, 18, 17, 6], [62, 466, 18, 18, 17, 6], [62, 522, 14, 13, 17, 11], [62, 573, 14, 18, 17, 11], [62, 624, 20, 13, 17, 11], [62, 679, 18, 6, 17, 15], [62, 726, 19, 13, 17, 11], [62, 772, 18, 18, 17, 6], [123, 6, 19, 19, 17, 5], [123, 58, 17, 18, 17, 6], [123, 109, 18, 18, 17, 6], [123, 160, 18, 18, 17, 6], [123, 211, 18, 18, 17, 6], [123, 262, 18, 18, 17, 6], [123, 313, 18, 18, 17, 6], [123, 364, 18, 18, 17, 6], [123, 415, 18, 18, 17, 6], [123, 466, 18, 18, 17, 6], [123, 517, 17, 18, 17, 6], [123, 568, 19, 18, 17, 6], [123, 619, 15, 18, 17, 6], [123, 670, 19, 18, 17, 6], [123, 721, 18, 18, 17, 6], [123, 772, 18, 18, 17, 6], [184, 7, 19, 18, 17, 6], [184, 58, 18, 23, 17, 6], [184, 109, 18, 18, 17, 6], [184, 160, 17, 18, 17, 6], [184, 211, 19, 18, 17, 6], [184, 262, 18, 18, 17, 6], [184, 313, 21, 18, 17, 6], [184, 364, 19, 18, 17, 6], [184, 415, 19, 18, 17, 6], [184, 466, 20, 18, 17, 6], [184, 517, 18, 18, 17, 6], [184, 567, 20, 23, 17, 5], [184, 618, 16, 19, 17, 5], [184, 669, 17, 23, 17, 5], [184, 722, 18, 12, 17, 7], [184, 790, 16, 2, 17, 24], [245, 6, 15, 4, 17, 5], [245, 63, 17, 13, 17, 11], [245, 108, 18, 19, 17, 5], [245, 165, 17, 13, 17, 11], [245, 210, 19, 19, 17, 5], [245, 267, 17, 13, 17, 11], [245, 312, 20, 19, 17, 5], [245, 369, 17, 18, 17, 11], [245, 414, 17, 19, 17, 5], [245, 465, 14, 19, 17, 5], [245, 516, 17, 24, 17, 5], [245, 567, 18, 19, 17, 5], [245, 618, 14, 19, 17, 5], [245, 675, 17, 13, 17, 11], [245, 726, 17, 13, 17, 11], [245, 777, 17, 13, 17, 11], [306, 12, 18, 18, 17, 11], [306, 63, 17, 18, 17, 11], [306, 114, 17, 13, 17, 11], [306, 165, 16, 13, 17, 11], [306, 212, 17, 17, 17, 7], [306, 267, 17, 13, 17, 11], [306, 318, 20, 13, 17, 11], [306, 369, 19, 13, 17, 11], [306, 420, 18, 13, 17, 11], [306, 471, 19, 18, 17, 11], [306, 522, 17, 13, 17, 11], [306, 567, 19, 23, 17, 5], [306, 618, 15, 19, 17, 5], [306, 669, 16, 23, 17, 5], [306, 731, 17, 4, 17, 16], [306, 772, 17, 18, 17, 6], [367, 3, 17, 22, 17, 2], [367, 55, 17, 21, 17, 3], [367, 109, 18, 23, 17, 6], [367, 154, 18, 24, 17, 0], [367, 207, 18, 22, 17, 2], [367, 258, 18, 22, 17, 2], [367, 309, 18, 22, 17, 2], [367, 363, 18, 19, 17, 5], [367, 414, 17, 19, 17, 5], [367, 465, 17, 19, 17, 5], [367, 518, 17, 17, 17, 7], [367, 569, 17, 17, 17, 7], [367, 618, 17, 19, 17, 5], [367, 675, 18, 18, 17, 11], [367, 720, 17, 19, 17, 5], [367, 771, 17, 19, 17, 5], [428, 6, 17, 19, 17, 5], [428, 59, 17, 17, 17, 7], [428, 108, 16, 19, 17, 5], [428, 159, 15, 19, 17, 5], [428, 210, 15, 19, 17, 5], [428, 263, 15, 17, 17, 7], [428, 314, 16, 17, 17, 7], [428, 363, 17, 19, 17, 5], [428, 414, 17, 19, 17, 5], [428, 465, 17, 19, 17, 5], [428, 518, 17, 17, 17, 7], [428, 569, 17, 17, 17, 7], [428, 618, 17, 19, 17, 5], [428, 669, 17, 19, 17, 5], [428, 720, 17, 19, 17, 5], [428, 773, 17, 17, 17, 7], [489, 7, 18, 22, 17, 6], [489, 57, 16, 6, 17, 5], [489, 107, 17, 22, 17, 4], [489, 159, 19, 19, 17, 5], [489, 210, 17, 24, 17, 5], [489, 266, 17, 10, 17, 10], [489, 312, 21, 23, 17, 5], [489, 363, 17, 19, 17, 5], [489, 414, 19, 19, 17, 5], [489, 465, 19, 19, 17, 5], [489, 517, 18, 9, 17, 6], [489, 567, 16, 4, 17, 5], [489, 620, 16, 2, 17, 7], [489, 676, 18, 11, 17, 12], [489, 721, 19, 18, 17, 6], [489, 771, 19, 20, 17, 5], [550, 15, 19, 8, 17, 14], [550, 60, 18, 16, 17, 8], [550, 110, 19, 17, 17, 7], [550, 161, 19, 17, 17, 7], [550, 211, 20, 18, 17, 6], [550, 267, 17, 17, 17, 11], [550, 312, 18, 19, 17, 5], [550, 364, 18, 23, 17, 6], [550, 415, 19, 23, 17, 6], [550, 471, 19, 13, 17, 11], [550, 516, 18, 23, 17, 5], [550, 567, 17, 8, 17, 5], [550, 618, 18, 8, 17, 5], [550, 669, 18, 19, 17, 5], [550, 726, 18, 13, 17, 11], [550, 776, 18, 15, 17, 10], [611, 12, 15, 18, 17, 11], [611, 63, 14, 18, 17, 11], [611, 119, 17, 6, 17, 16], [611, 158, 21, 24, 17, 4], [611, 210, 21, 23, 17, 5], [611, 270, 19, 8, 17, 14], [611, 313, 16, 18, 17, 6], [611, 370, 18, 11, 17, 12], [611, 421, 16, 11, 17, 12], [611, 482, 13, 2, 17, 22], [611, 511, 1, 1, 17, 1], [611, 562, 17, 24, 17, 0], [611, 615, 17, 22, 17, 2], [611, 666, 18, 22, 17, 2], [611, 721, 19, 18, 17, 6], [611, 777, 18, 13, 17, 11], [672, 17, 17, 2, 17, 16], [672, 68, 17, 2, 17, 16], [672, 108, 18, 9, 17, 5], [672, 159, 18, 9, 17, 5], [672, 210, 16, 9, 17, 5], [672, 261, 15, 9, 17, 5], [672, 321, 17, 10, 17, 14], [672, 363, 19, 19, 17, 5], [672, 416, 18, 22, 17, 7], [1, 1, 1, 1, 17, 1], [794, 771, 16, 4, 17, 5], [672, 570, 20, 14, 17, 8], [672, 624, 16, 13, 17, 11], [672, 675, 15, 13, 17, 11], [672, 720, 18, 19, 17, 5], [672, 771, 20, 19, 17, 5], [733, 7, 18, 22, 17, 6], [733, 68, 13, 4, 17, 16], [733, 123, 12, 9, 17, 20], [733, 174, 15, 9, 17, 20], [733, 212, 20, 17, 17, 7], [733, 256, 17, 24, 17, 0], [733, 307, 18, 24, 17, 0], [733, 358, 17, 24, 17, 0], [733, 411, 18, 22, 17, 2], [733, 460, 18, 24, 17, 0], [733, 511, 18, 24, 17, 0], [733, 562, 18, 24, 17, 0], [733, 615, 18, 22, 17, 2], [733, 664, 18, 24, 17, 0], [733, 715, 18, 24, 17, 0], [733, 766, 18, 24, 17, 0], [1, 1, 1, 1, 17, 1], [794, 52, 18, 24, 17, 0], [794, 103, 18, 24, 17, 0], [794, 154, 18, 24, 17, 0], [794, 205, 18, 24, 17, 0], [794, 267, 15, 13, 17, 11], [794, 312, 15, 4, 17, 5], [794, 365, 16, 2, 17, 7], [794, 416, 16, 2, 17, 7], [794, 465, 17, 4, 17, 5], [794, 516, 15, 4, 17, 5], [794, 567, 15, 4, 17, 5], [794, 637, 11, 5, 17, 24], [794, 669, 19, 4, 17, 5], [794, 739, 11, 5, 17, 24], [794, 771, 16, 4, 17, 5], [855, 6, 16, 4, 17, 5], [855, 57, 16, 4, 17, 5], [855, 108, 16, 4, 17, 5], [855, 159, 16, 4, 17, 5], [855, 210, 16, 4, 17, 5], [855, 261, 16, 4, 17, 5], [855, 312, 16, 4, 17, 5], [855, 363, 16, 4, 17, 5], [855, 414, 16, 4, 17, 5], [855, 465, 16, 4, 17, 5], [855, 516, 16, 4, 17, 5], [855, 567, 16, 4, 17, 5], [855, 618, 16, 4, 17, 5], [855, 669, 16, 4, 17, 5], [855, 720, 16, 4, 17, 5], [855, 771, 16, 4, 17, 5]], \"capHeight\": 24, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 20, 18, 6, 18, 19], [1, 58, 18, 20, 18, 6], [1, 109, 18, 19, 18, 6], [1, 160, 18, 20, 18, 6], [1, 209, 18, 24, 18, 4], [1, 262, 18, 20, 18, 6], [1, 313, 18, 20, 18, 6], [1, 364, 18, 19, 18, 6], [1, 414, 18, 25, 18, 5], [1, 465, 18, 25, 18, 5], [1, 516, 18, 20, 18, 5], [1, 574, 18, 14, 18, 12], [1, 632, 18, 12, 18, 19], [1, 680, 18, 9, 18, 16], [1, 734, 18, 7, 18, 19], [1, 771, 18, 21, 18, 5], [62, 7, 18, 20, 18, 6], [62, 58, 18, 20, 18, 6], [62, 109, 18, 20, 18, 6], [62, 160, 18, 20, 18, 6], [62, 211, 18, 20, 18, 6], [62, 262, 18, 20, 18, 6], [62, 313, 18, 20, 18, 6], [62, 364, 18, 20, 18, 6], [62, 415, 18, 20, 18, 6], [62, 466, 18, 20, 18, 6], [62, 522, 18, 15, 18, 11], [62, 573, 18, 20, 18, 11], [62, 624, 18, 15, 18, 11], [62, 679, 18, 10, 18, 15], [62, 726, 18, 15, 18, 11], [62, 772, 18, 20, 18, 6], [123, 6, 18, 21, 18, 5], [123, 58, 18, 20, 18, 6], [123, 109, 18, 20, 18, 6], [123, 160, 18, 20, 18, 6], [123, 211, 18, 20, 18, 6], [123, 262, 18, 20, 18, 6], [123, 313, 18, 20, 18, 6], [123, 364, 18, 20, 18, 6], [123, 415, 18, 20, 18, 6], [123, 466, 18, 20, 18, 6], [123, 517, 18, 20, 18, 6], [123, 568, 18, 20, 18, 6], [123, 619, 18, 20, 18, 6], [123, 670, 18, 20, 18, 6], [123, 721, 18, 20, 18, 6], [123, 772, 18, 20, 18, 6], [184, 7, 18, 20, 18, 6], [184, 58, 18, 25, 18, 6], [184, 109, 18, 20, 18, 6], [184, 160, 18, 20, 18, 6], [184, 211, 18, 20, 18, 6], [184, 262, 18, 20, 18, 6], [184, 313, 18, 20, 18, 6], [184, 364, 18, 20, 18, 6], [184, 415, 18, 20, 18, 6], [184, 466, 18, 20, 18, 6], [184, 517, 18, 20, 18, 6], [184, 567, 18, 25, 18, 5], [184, 618, 18, 21, 18, 5], [184, 669, 18, 25, 18, 5], [184, 721, 18, 19, 18, 6], [184, 785, 18, 9, 18, 19], [245, 6, 18, 20, 18, 5], [245, 63, 18, 15, 18, 11], [245, 108, 18, 21, 18, 5], [245, 165, 18, 15, 18, 11], [245, 210, 18, 21, 18, 5], [245, 267, 18, 15, 18, 11], [245, 312, 18, 21, 18, 5], [245, 369, 18, 20, 18, 11], [245, 414, 18, 21, 18, 5], [245, 465, 18, 21, 18, 5], [245, 516, 18, 26, 18, 5], [245, 567, 18, 21, 18, 5], [245, 618, 18, 21, 18, 5], [245, 675, 18, 15, 18, 11], [245, 726, 18, 15, 18, 11], [245, 777, 18, 15, 18, 11], [306, 12, 18, 20, 18, 11], [306, 63, 18, 20, 18, 11], [306, 114, 18, 15, 18, 11], [306, 165, 18, 15, 18, 11], [306, 212, 18, 19, 18, 7], [306, 267, 18, 15, 18, 11], [306, 318, 18, 15, 18, 11], [306, 369, 18, 15, 18, 11], [306, 420, 18, 15, 18, 11], [306, 471, 18, 20, 18, 11], [306, 522, 18, 15, 18, 11], [306, 567, 18, 25, 18, 5], [306, 618, 18, 21, 18, 5], [306, 669, 18, 25, 18, 5], [306, 731, 18, 9, 18, 16], [306, 772, 18, 20, 18, 6], [367, 3, 18, 24, 18, 2], [367, 55, 18, 23, 18, 3], [367, 109, 18, 25, 18, 6], [367, 154, 18, 26, 18, 0], [367, 207, 18, 24, 18, 2], [367, 258, 18, 24, 18, 2], [367, 309, 18, 24, 18, 2], [367, 363, 18, 21, 18, 5], [367, 414, 18, 21, 18, 5], [367, 465, 18, 21, 18, 5], [367, 518, 18, 19, 18, 7], [367, 569, 18, 19, 18, 7], [367, 618, 18, 21, 18, 5], [367, 675, 18, 20, 18, 11], [367, 720, 18, 21, 18, 5], [367, 771, 18, 21, 18, 5], [428, 6, 18, 21, 18, 5], [428, 59, 18, 19, 18, 7], [428, 108, 18, 21, 18, 5], [428, 159, 18, 21, 18, 5], [428, 210, 18, 21, 18, 5], [428, 263, 18, 19, 18, 7], [428, 314, 18, 19, 18, 7], [428, 363, 18, 21, 18, 5], [428, 414, 18, 21, 18, 5], [428, 465, 18, 21, 18, 5], [428, 518, 18, 19, 18, 7], [428, 569, 18, 19, 18, 7], [428, 618, 18, 21, 18, 5], [428, 669, 18, 21, 18, 5], [428, 720, 18, 21, 18, 5], [428, 773, 18, 19, 18, 7], [489, 7, 18, 24, 18, 6], [489, 57, 18, 20, 18, 5], [489, 107, 18, 24, 18, 4], [489, 159, 18, 21, 18, 5], [489, 210, 18, 26, 18, 5], [489, 266, 18, 15, 18, 10], [489, 312, 18, 25, 18, 5], [489, 363, 18, 21, 18, 5], [489, 414, 18, 21, 18, 5], [489, 465, 18, 21, 18, 5], [489, 517, 18, 19, 18, 6], [489, 567, 18, 20, 18, 5], [489, 620, 18, 18, 18, 7], [489, 676, 18, 13, 18, 12], [489, 721, 18, 20, 18, 6], [489, 771, 18, 22, 18, 5], [550, 15, 18, 11, 18, 14], [550, 60, 18, 18, 18, 8], [550, 110, 18, 19, 18, 7], [550, 161, 18, 19, 18, 7], [550, 211, 18, 20, 18, 6], [550, 267, 18, 19, 18, 11], [550, 312, 18, 21, 18, 5], [550, 364, 18, 25, 18, 6], [550, 415, 18, 25, 18, 6], [550, 471, 18, 15, 18, 11], [550, 516, 18, 25, 18, 5], [550, 567, 18, 20, 18, 5], [550, 618, 18, 20, 18, 5], [550, 669, 18, 21, 18, 5], [550, 726, 18, 15, 18, 11], [550, 776, 18, 17, 18, 10], [611, 12, 18, 20, 18, 11], [611, 63, 18, 20, 18, 11], [611, 119, 18, 9, 18, 16], [611, 158, 18, 26, 18, 4], [611, 210, 18, 25, 18, 5], [611, 270, 18, 11, 18, 14], [611, 313, 18, 20, 18, 6], [611, 370, 18, 13, 18, 12], [611, 421, 18, 13, 18, 12], [611, 479, 18, 7, 18, 19], [611, 530, 18, 6, 18, 19], [611, 562, 18, 26, 18, 0], [611, 615, 18, 24, 18, 2], [611, 666, 18, 24, 18, 2], [611, 721, 18, 20, 18, 6], [611, 777, 18, 15, 18, 11], [672, 17, 18, 9, 18, 16], [672, 68, 18, 9, 18, 16], [672, 108, 18, 20, 18, 5], [672, 159, 18, 20, 18, 5], [672, 210, 18, 20, 18, 5], [672, 261, 18, 20, 18, 5], [672, 321, 18, 12, 18, 14], [672, 363, 18, 21, 18, 5], [672, 416, 18, 24, 18, 7], [1, 20, 18, 6, 18, 19], [794, 771, 18, 20, 18, 5], [672, 570, 18, 17, 18, 8], [672, 624, 18, 15, 18, 11], [672, 675, 18, 15, 18, 11], [672, 720, 18, 21, 18, 5], [672, 771, 18, 21, 18, 5], [733, 7, 18, 24, 18, 6], [733, 68, 18, 9, 18, 16], [733, 122, 18, 12, 18, 19], [733, 173, 18, 12, 18, 19], [733, 212, 18, 19, 18, 7], [733, 256, 18, 26, 18, 0], [733, 307, 18, 26, 18, 0], [733, 358, 18, 26, 18, 0], [733, 411, 18, 24, 18, 2], [733, 460, 18, 26, 18, 0], [733, 511, 18, 26, 18, 0], [733, 562, 18, 26, 18, 0], [733, 615, 18, 24, 18, 2], [733, 664, 18, 26, 18, 0], [733, 715, 18, 26, 18, 0], [733, 766, 18, 26, 18, 0], [1, 20, 18, 6, 18, 19], [794, 52, 18, 26, 18, 0], [794, 103, 18, 26, 18, 0], [794, 154, 18, 26, 18, 0], [794, 205, 18, 26, 18, 0], [794, 267, 18, 15, 18, 11], [794, 312, 18, 20, 18, 5], [794, 365, 18, 18, 18, 7], [794, 416, 18, 18, 18, 7], [794, 465, 18, 20, 18, 5], [794, 516, 18, 20, 18, 5], [794, 567, 18, 20, 18, 5], [794, 632, 18, 12, 18, 19], [794, 669, 18, 20, 18, 5], [794, 734, 18, 12, 18, 19], [794, 771, 18, 20, 18, 5], [855, 6, 18, 20, 18, 5], [855, 57, 18, 20, 18, 5], [855, 108, 18, 20, 18, 5], [855, 159, 18, 20, 18, 5], [855, 210, 18, 20, 18, 5], [855, 261, 18, 20, 18, 5], [855, 312, 18, 20, 18, 5], [855, 363, 18, 20, 18, 5], [855, 414, 18, 20, 18, 5], [855, 465, 18, 20, 18, 5], [855, 516, 18, 20, 18, 5], [855, 567, 18, 20, 18, 5], [855, 618, 18, 20, 18, 5], [855, 669, 18, 20, 18, 5], [855, 720, 18, 20, 18, 5], [855, 771, 18, 20, 18, 5]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 17, 6, 17, 18], [1, 58, 17, 18, 17, 6], [1, 109, 17, 18, 17, 6], [1, 160, 17, 18, 17, 6], [1, 209, 17, 22, 17, 4], [1, 262, 17, 18, 17, 6], [1, 313, 17, 18, 17, 6], [1, 364, 17, 18, 17, 6], [1, 414, 17, 23, 17, 5], [1, 465, 17, 23, 17, 5], [1, 516, 17, 19, 17, 5], [1, 574, 17, 12, 17, 12], [1, 631, 17, 11, 17, 18], [1, 680, 17, 8, 17, 16], [1, 733, 17, 6, 17, 18], [1, 771, 17, 19, 17, 5], [62, 7, 17, 18, 17, 6], [62, 58, 17, 18, 17, 6], [62, 109, 17, 18, 17, 6], [62, 160, 17, 18, 17, 6], [62, 211, 17, 18, 17, 6], [62, 262, 17, 18, 17, 6], [62, 313, 17, 18, 17, 6], [62, 364, 17, 18, 17, 6], [62, 415, 17, 18, 17, 6], [62, 466, 17, 18, 17, 6], [62, 522, 17, 13, 17, 11], [62, 573, 17, 18, 17, 11], [62, 624, 17, 13, 17, 11], [62, 679, 17, 9, 17, 15], [62, 726, 17, 13, 17, 11], [62, 772, 17, 18, 17, 6], [123, 6, 17, 19, 17, 5], [123, 58, 17, 18, 17, 6], [123, 109, 17, 18, 17, 6], [123, 160, 17, 18, 17, 6], [123, 211, 17, 18, 17, 6], [123, 262, 17, 18, 17, 6], [123, 313, 17, 18, 17, 6], [123, 364, 17, 18, 17, 6], [123, 415, 17, 18, 17, 6], [123, 466, 17, 18, 17, 6], [123, 517, 17, 18, 17, 6], [123, 568, 17, 18, 17, 6], [123, 619, 17, 18, 17, 6], [123, 670, 17, 18, 17, 6], [123, 721, 17, 18, 17, 6], [123, 772, 17, 18, 17, 6], [184, 7, 17, 18, 17, 6], [184, 58, 17, 23, 17, 6], [184, 109, 17, 18, 17, 6], [184, 160, 17, 18, 17, 6], [184, 211, 17, 18, 17, 6], [184, 262, 17, 18, 17, 6], [184, 313, 17, 18, 17, 6], [184, 364, 17, 18, 17, 6], [184, 415, 17, 18, 17, 6], [184, 466, 17, 18, 17, 6], [184, 517, 17, 18, 17, 6], [184, 567, 17, 23, 17, 5], [184, 618, 17, 19, 17, 5], [184, 669, 17, 23, 17, 5], [184, 721, 17, 18, 17, 6], [184, 784, 17, 8, 17, 18], [245, 6, 17, 19, 17, 5], [245, 63, 17, 13, 17, 11], [245, 108, 17, 19, 17, 5], [245, 165, 17, 13, 17, 11], [245, 210, 17, 19, 17, 5], [245, 267, 17, 13, 17, 11], [245, 312, 17, 19, 17, 5], [245, 369, 17, 18, 17, 11], [245, 414, 17, 19, 17, 5], [245, 465, 17, 19, 17, 5], [245, 516, 17, 24, 17, 5], [245, 567, 17, 19, 17, 5], [245, 618, 17, 19, 17, 5], [245, 675, 17, 13, 17, 11], [245, 726, 17, 13, 17, 11], [245, 777, 17, 13, 17, 11], [306, 12, 17, 18, 17, 11], [306, 63, 17, 18, 17, 11], [306, 114, 17, 13, 17, 11], [306, 165, 17, 13, 17, 11], [306, 212, 17, 17, 17, 7], [306, 267, 17, 13, 17, 11], [306, 318, 17, 13, 17, 11], [306, 369, 17, 13, 17, 11], [306, 420, 17, 13, 17, 11], [306, 471, 17, 18, 17, 11], [306, 522, 17, 13, 17, 11], [306, 567, 17, 23, 17, 5], [306, 618, 17, 19, 17, 5], [306, 669, 17, 23, 17, 5], [306, 731, 17, 8, 17, 16], [306, 772, 17, 18, 17, 6], [367, 3, 17, 22, 17, 2], [367, 55, 17, 21, 17, 3], [367, 109, 17, 23, 17, 6], [367, 154, 17, 24, 17, 0], [367, 207, 17, 22, 17, 2], [367, 258, 17, 22, 17, 2], [367, 309, 17, 22, 17, 2], [367, 363, 17, 19, 17, 5], [367, 414, 17, 19, 17, 5], [367, 465, 17, 19, 17, 5], [367, 518, 17, 17, 17, 7], [367, 569, 17, 17, 17, 7], [367, 618, 17, 19, 17, 5], [367, 675, 17, 18, 17, 11], [367, 720, 17, 19, 17, 5], [367, 771, 17, 19, 17, 5], [428, 6, 17, 19, 17, 5], [428, 59, 17, 17, 17, 7], [428, 108, 17, 19, 17, 5], [428, 159, 17, 19, 17, 5], [428, 210, 17, 19, 17, 5], [428, 263, 17, 17, 17, 7], [428, 314, 17, 17, 17, 7], [428, 363, 17, 19, 17, 5], [428, 414, 17, 19, 17, 5], [428, 465, 17, 19, 17, 5], [428, 518, 17, 17, 17, 7], [428, 569, 17, 17, 17, 7], [428, 618, 17, 19, 17, 5], [428, 669, 17, 19, 17, 5], [428, 720, 17, 19, 17, 5], [428, 773, 17, 17, 17, 7], [489, 7, 17, 22, 17, 6], [489, 57, 17, 19, 17, 5], [489, 107, 17, 22, 17, 4], [489, 159, 17, 19, 17, 5], [489, 210, 17, 24, 17, 5], [489, 266, 17, 14, 17, 10], [489, 312, 17, 23, 17, 5], [489, 363, 17, 19, 17, 5], [489, 414, 17, 19, 17, 5], [489, 465, 17, 19, 17, 5], [489, 517, 17, 18, 17, 6], [489, 567, 17, 19, 17, 5], [489, 620, 17, 17, 17, 7], [489, 676, 17, 12, 17, 12], [489, 721, 17, 18, 17, 6], [489, 771, 17, 20, 17, 5], [550, 15, 17, 10, 17, 14], [550, 60, 17, 16, 17, 8], [550, 110, 17, 17, 17, 7], [550, 161, 17, 17, 17, 7], [550, 211, 17, 18, 17, 6], [550, 267, 17, 17, 17, 11], [550, 312, 17, 19, 17, 5], [550, 364, 17, 23, 17, 6], [550, 415, 17, 23, 17, 6], [550, 471, 17, 13, 17, 11], [550, 516, 17, 23, 17, 5], [550, 567, 17, 19, 17, 5], [550, 618, 17, 19, 17, 5], [550, 669, 17, 19, 17, 5], [550, 726, 17, 13, 17, 11], [550, 776, 17, 15, 17, 10], [611, 12, 17, 18, 17, 11], [611, 63, 17, 18, 17, 11], [611, 119, 17, 8, 17, 16], [611, 158, 17, 24, 17, 4], [611, 210, 17, 23, 17, 5], [611, 270, 17, 10, 17, 14], [611, 313, 17, 18, 17, 6], [611, 370, 17, 12, 17, 12], [611, 421, 17, 12, 17, 12], [611, 478, 17, 6, 17, 18], [611, 529, 17, 6, 17, 18], [611, 562, 17, 24, 17, 0], [611, 615, 17, 22, 17, 2], [611, 666, 17, 22, 17, 2], [611, 721, 17, 18, 17, 6], [611, 777, 17, 13, 17, 11], [672, 17, 17, 8, 17, 16], [672, 68, 17, 8, 17, 16], [672, 108, 17, 19, 17, 5], [672, 159, 17, 19, 17, 5], [672, 210, 17, 19, 17, 5], [672, 261, 17, 19, 17, 5], [672, 321, 17, 10, 17, 14], [672, 363, 17, 19, 17, 5], [672, 416, 17, 22, 17, 7], [1, 19, 17, 6, 17, 18], [794, 771, 17, 19, 17, 5], [672, 570, 17, 16, 17, 8], [672, 624, 17, 13, 17, 11], [672, 675, 17, 13, 17, 11], [672, 720, 17, 19, 17, 5], [672, 771, 17, 19, 17, 5], [733, 7, 17, 22, 17, 6], [733, 68, 17, 8, 17, 16], [733, 121, 17, 11, 17, 18], [733, 172, 17, 11, 17, 18], [733, 212, 17, 17, 17, 7], [733, 256, 17, 24, 17, 0], [733, 307, 17, 24, 17, 0], [733, 358, 17, 24, 17, 0], [733, 411, 17, 22, 17, 2], [733, 460, 17, 24, 17, 0], [733, 511, 17, 24, 17, 0], [733, 562, 17, 24, 17, 0], [733, 615, 17, 22, 17, 2], [733, 664, 17, 24, 17, 0], [733, 715, 17, 24, 17, 0], [733, 766, 17, 24, 17, 0], [1, 19, 17, 6, 17, 18], [794, 52, 17, 24, 17, 0], [794, 103, 17, 24, 17, 0], [794, 154, 17, 24, 17, 0], [794, 205, 17, 24, 17, 0], [794, 267, 17, 13, 17, 11], [794, 312, 17, 19, 17, 5], [794, 365, 17, 17, 17, 7], [794, 416, 17, 17, 17, 7], [794, 465, 17, 19, 17, 5], [794, 516, 17, 19, 17, 5], [794, 567, 17, 19, 17, 5], [794, 631, 17, 11, 17, 18], [794, 669, 17, 19, 17, 5], [794, 733, 17, 11, 17, 18], [794, 771, 17, 19, 17, 5], [855, 6, 17, 19, 17, 5], [855, 57, 17, 19, 17, 5], [855, 108, 17, 19, 17, 5], [855, 159, 17, 19, 17, 5], [855, 210, 17, 19, 17, 5], [855, 261, 17, 19, 17, 5], [855, 312, 17, 19, 17, 5], [855, 363, 17, 19, 17, 5], [855, 414, 17, 19, 17, 5], [855, 465, 17, 19, 17, 5], [855, 516, 17, 19, 17, 5], [855, 567, 17, 19, 17, 5], [855, 618, 17, 19, 17, 5], [855, 669, 17, 19, 17, 5], [855, 720, 17, 19, 17, 5], [855, 771, 17, 19, 17, 5]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 54, 12, 9, 11, 2], [1, 105, 13, 4, 11, 2], [1, 156, 13, 7, 11, 2], [1, 206, 13, 11, 11, 1], [1, 258, 14, 9, 11, 2], [1, 309, 12, 9, 11, 2], [1, 360, 12, 4, 11, 2], [1, 411, 13, 9, 11, 2], [1, 462, 13, 9, 11, 2], [1, 513, 13, 7, 11, 2], [1, 565, 12, 7, 11, 3], [1, 621, 9, 5, 11, 8], [1, 669, 12, 3, 11, 5], [1, 723, 9, 3, 11, 8], [1, 768, 14, 10, 11, 2], [62, 3, 13, 9, 11, 2], [62, 54, 13, 9, 11, 2], [62, 105, 13, 9, 11, 2], [62, 156, 13, 9, 11, 2], [62, 207, 13, 9, 11, 2], [62, 258, 14, 9, 11, 2], [62, 309, 13, 9, 11, 2], [62, 360, 14, 9, 11, 2], [62, 411, 13, 9, 11, 2], [62, 462, 13, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 11, 9, 11, 4], [62, 616, 12, 7, 11, 3], [62, 668, 13, 5, 11, 4], [62, 718, 11, 7, 11, 3], [62, 768, 13, 9, 11, 2], [123, 3, 13, 9, 11, 2], [123, 54, 13, 9, 11, 2], [123, 105, 13, 9, 11, 2], [123, 156, 13, 9, 11, 2], [123, 207, 13, 9, 11, 2], [123, 258, 14, 9, 11, 2], [123, 309, 14, 9, 11, 2], [123, 360, 13, 9, 11, 2], [123, 411, 14, 9, 11, 2], [123, 462, 12, 9, 11, 2], [123, 513, 14, 9, 11, 2], [123, 564, 14, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 14, 9, 11, 2], [123, 717, 14, 9, 11, 2], [123, 768, 13, 9, 11, 2], [184, 3, 13, 9, 11, 2], [184, 54, 13, 10, 11, 2], [184, 105, 13, 9, 11, 2], [184, 156, 13, 9, 11, 2], [184, 207, 14, 9, 11, 2], [184, 258, 14, 9, 11, 2], [184, 309, 14, 9, 11, 2], [184, 360, 14, 9, 11, 2], [184, 411, 14, 9, 11, 2], [184, 462, 14, 9, 11, 2], [184, 513, 14, 9, 11, 2], [184, 564, 13, 9, 11, 2], [184, 615, 11, 10, 11, 2], [184, 666, 13, 9, 11, 2], [184, 717, 12, 4, 11, 2], [184, 774, 12, 3, 11, 8], [245, 3, 12, 4, 11, 2], [245, 56, 13, 7, 11, 4], [245, 105, 12, 9, 11, 2], [245, 158, 12, 7, 11, 4], [245, 207, 14, 9, 11, 2], [245, 260, 12, 7, 11, 4], [245, 309, 14, 9, 11, 2], [245, 362, 13, 9, 11, 4], [245, 411, 12, 9, 11, 2], [245, 462, 12, 9, 11, 2], [245, 513, 12, 11, 11, 2], [245, 564, 12, 9, 11, 2], [245, 615, 12, 9, 11, 2], [245, 668, 12, 7, 11, 4], [245, 719, 12, 7, 11, 4], [245, 770, 12, 7, 11, 4], [306, 5, 12, 9, 11, 4], [306, 56, 13, 9, 11, 4], [306, 107, 12, 7, 11, 4], [306, 158, 13, 7, 11, 4], [306, 207, 12, 9, 11, 2], [306, 260, 13, 7, 11, 4], [306, 311, 13, 7, 11, 4], [306, 362, 13, 7, 11, 4], [306, 413, 13, 7, 11, 4], [306, 464, 13, 9, 11, 4], [306, 515, 13, 7, 11, 4], [306, 563, 14, 11, 11, 1], [306, 614, 12, 11, 11, 1], [306, 665, 12, 11, 11, 1], [306, 717, 14, 4, 11, 2], [306, 766, 1, 1, 3, 1], [367, 1, 14, 11, 11, 0], [367, 52, 13, 11, 11, 0], [367, 105, 13, 9, 11, 2], [367, 154, 14, 11, 11, 0], [367, 205, 15, 11, 11, 0], [367, 256, 14, 11, 11, 0], [367, 307, 14, 11, 11, 0], [367, 359, 13, 10, 11, 1], [367, 410, 13, 10, 11, 1], [367, 461, 13, 10, 11, 1], [367, 513, 13, 9, 11, 2], [367, 563, 14, 10, 11, 1], [367, 614, 14, 10, 11, 1], [367, 668, 12, 9, 11, 4], [367, 716, 13, 10, 11, 1], [367, 767, 12, 10, 11, 1], [428, 2, 13, 10, 11, 1], [428, 54, 13, 9, 11, 2], [428, 104, 13, 10, 11, 1], [428, 155, 12, 10, 11, 1], [428, 206, 13, 10, 11, 1], [428, 258, 13, 9, 11, 2], [428, 308, 14, 10, 11, 1], [428, 359, 13, 10, 11, 1], [428, 410, 12, 10, 11, 1], [428, 461, 13, 10, 11, 1], [428, 513, 13, 9, 11, 2], [428, 563, 14, 10, 11, 1], [428, 614, 13, 10, 11, 1], [428, 665, 13, 10, 11, 1], [428, 716, 13, 10, 11, 1], [428, 768, 13, 9, 11, 2], [489, 3, 12, 7, 11, 2], [489, 53, 14, 6, 11, 1], [489, 106, 12, 9, 11, 3], [489, 155, 13, 10, 11, 1], [489, 205, 14, 12, 11, 0], [489, 259, 13, 7, 11, 3], [489, 308, 14, 10, 11, 1], [489, 359, 14, 11, 11, 1], [489, 411, 13, 8, 11, 2], [489, 462, 13, 9, 11, 2], [489, 513, 15, 5, 11, 2], [489, 564, 13, 4, 11, 2], [489, 615, 13, 3, 11, 2], [489, 667, 13, 7, 11, 3], [489, 717, 14, 9, 11, 2], [489, 768, 13, 9, 11, 2], [550, 5, 13, 5, 11, 4], [550, 55, 12, 8, 11, 3], [550, 105, 13, 9, 11, 2], [550, 156, 13, 9, 11, 2], [550, 207, 14, 9, 11, 2], [550, 260, 12, 9, 11, 4], [550, 309, 13, 9, 11, 2], [550, 360, 14, 9, 11, 2], [550, 411, 14, 9, 11, 2], [550, 464, 13, 7, 11, 4], [550, 511, 15, 13, 11, 0], [550, 564, 14, 8, 11, 2], [550, 615, 13, 8, 11, 2], [550, 666, 13, 9, 11, 2], [550, 719, 12, 7, 11, 4], [550, 770, 12, 7, 11, 4], [611, 3, 12, 9, 11, 2], [611, 54, 13, 9, 11, 2], [611, 108, 12, 5, 11, 5], [611, 157, 13, 8, 11, 3], [611, 205, 15, 13, 11, 0], [611, 259, 13, 7, 11, 3], [611, 310, 11, 8, 11, 3], [611, 363, 12, 6, 11, 5], [611, 414, 12, 6, 11, 5], [611, 468, 11, 3, 11, 8], [611, 511, 1, 1, 11, 1], [611, 562, 13, 11, 11, 0], [611, 613, 15, 11, 11, 0], [611, 664, 15, 11, 11, 0], [611, 717, 14, 9, 11, 2], [611, 770, 12, 7, 11, 4], [672, 6, 11, 3, 11, 5], [672, 57, 13, 3, 11, 5], [672, 105, 14, 5, 11, 2], [672, 156, 14, 5, 11, 2], [672, 207, 13, 5, 11, 2], [672, 258, 13, 5, 11, 2], [672, 310, 12, 7, 11, 3], [672, 361, 12, 7, 11, 3], [672, 411, 13, 11, 11, 2], [1, 1, 1, 1, 11, 1], [794, 768, 14, 9, 11, 2], [672, 564, 14, 9, 11, 2], [672, 615, 14, 9, 11, 2], [672, 666, 14, 9, 11, 2], [672, 717, 14, 9, 11, 2], [672, 768, 14, 9, 11, 2], [733, 3, 14, 9, 11, 2], [733, 54, 14, 9, 11, 2], [733, 105, 14, 9, 11, 2], [733, 156, 14, 9, 11, 2], [733, 207, 14, 9, 11, 2], [733, 258, 14, 9, 11, 2], [733, 309, 14, 9, 11, 2], [733, 360, 14, 9, 11, 2], [733, 411, 14, 9, 11, 2], [733, 462, 14, 9, 11, 2], [733, 513, 14, 9, 11, 2], [733, 564, 14, 9, 11, 2], [733, 615, 14, 9, 11, 2], [733, 666, 14, 9, 11, 2], [733, 717, 14, 9, 11, 2], [733, 768, 14, 9, 11, 2], [1, 1, 1, 1, 11, 1], [794, 54, 14, 9, 11, 2], [794, 105, 14, 9, 11, 2], [794, 156, 14, 9, 11, 2], [794, 207, 14, 9, 11, 2], [794, 258, 14, 9, 11, 2], [794, 309, 14, 9, 11, 2], [794, 360, 14, 9, 11, 2], [794, 411, 14, 9, 11, 2], [794, 462, 14, 9, 11, 2], [794, 513, 14, 9, 11, 2], [794, 564, 14, 9, 11, 2], [794, 615, 14, 9, 11, 2], [794, 666, 14, 9, 11, 2], [794, 717, 14, 9, 11, 2], [794, 768, 14, 9, 11, 2], [855, 3, 14, 9, 11, 2], [855, 54, 14, 9, 11, 2], [855, 105, 14, 9, 11, 2], [855, 156, 14, 9, 11, 2], [855, 207, 14, 9, 11, 2], [855, 258, 14, 9, 11, 2], [855, 309, 14, 9, 11, 2], [855, 360, 14, 9, 11, 2], [855, 411, 14, 9, 11, 2], [855, 462, 14, 9, 11, 2], [855, 513, 14, 9, 11, 2], [855, 564, 14, 9, 11, 2], [855, 615, 14, 9, 11, 2], [855, 666, 14, 9, 11, 2], [855, 717, 14, 9, 11, 2], [855, 768, 14, 9, 11, 2]], \"capHeight\": 10, \"widestlogicalchar\": 11, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 7, 10, 2], [1, 105, 12, 2, 10, 2], [1, 156, 12, 5, 10, 2], [1, 206, 12, 9, 10, 1], [1, 258, 13, 7, 10, 2], [1, 309, 11, 7, 10, 2], [1, 360, 11, 2, 10, 2], [1, 411, 12, 7, 10, 2], [1, 462, 12, 7, 10, 2], [1, 513, 12, 5, 10, 2], [1, 565, 11, 5, 10, 3], [1, 621, 8, 3, 10, 8], [1, 669, 11, 1, 10, 5], [1, 723, 8, 1, 10, 8], [1, 768, 13, 8, 10, 2], [62, 3, 12, 7, 10, 2], [62, 54, 12, 7, 10, 2], [62, 105, 12, 7, 10, 2], [62, 156, 12, 7, 10, 2], [62, 207, 12, 7, 10, 2], [62, 258, 13, 7, 10, 2], [62, 309, 12, 7, 10, 2], [62, 360, 13, 7, 10, 2], [62, 411, 12, 7, 10, 2], [62, 462, 12, 7, 10, 2], [62, 515, 10, 5, 10, 4], [62, 566, 10, 7, 10, 4], [62, 616, 11, 5, 10, 3], [62, 668, 12, 3, 10, 4], [62, 718, 10, 5, 10, 3], [62, 768, 12, 7, 10, 2], [123, 3, 12, 7, 10, 2], [123, 54, 12, 7, 10, 2], [123, 105, 12, 7, 10, 2], [123, 156, 12, 7, 10, 2], [123, 207, 12, 7, 10, 2], [123, 258, 13, 7, 10, 2], [123, 309, 13, 7, 10, 2], [123, 360, 12, 7, 10, 2], [123, 411, 13, 7, 10, 2], [123, 462, 11, 7, 10, 2], [123, 513, 13, 7, 10, 2], [123, 564, 13, 7, 10, 2], [123, 615, 10, 7, 10, 2], [123, 666, 13, 7, 10, 2], [123, 717, 13, 7, 10, 2], [123, 768, 12, 7, 10, 2], [184, 3, 12, 7, 10, 2], [184, 54, 12, 8, 10, 2], [184, 105, 12, 7, 10, 2], [184, 156, 12, 7, 10, 2], [184, 207, 13, 7, 10, 2], [184, 258, 13, 7, 10, 2], [184, 309, 13, 7, 10, 2], [184, 360, 13, 7, 10, 2], [184, 411, 13, 7, 10, 2], [184, 462, 13, 7, 10, 2], [184, 513, 13, 7, 10, 2], [184, 564, 12, 7, 10, 2], [184, 615, 10, 8, 10, 2], [184, 666, 12, 7, 10, 2], [184, 717, 11, 2, 10, 2], [184, 774, 11, 1, 10, 8], [245, 3, 11, 2, 10, 2], [245, 56, 12, 5, 10, 4], [245, 105, 11, 7, 10, 2], [245, 158, 11, 5, 10, 4], [245, 207, 13, 7, 10, 2], [245, 260, 11, 5, 10, 4], [245, 309, 13, 7, 10, 2], [245, 362, 12, 7, 10, 4], [245, 411, 11, 7, 10, 2], [245, 462, 11, 7, 10, 2], [245, 513, 11, 9, 10, 2], [245, 564, 11, 7, 10, 2], [245, 615, 11, 7, 10, 2], [245, 668, 11, 5, 10, 4], [245, 719, 11, 5, 10, 4], [245, 770, 11, 5, 10, 4], [306, 5, 11, 7, 10, 4], [306, 56, 12, 7, 10, 4], [306, 107, 11, 5, 10, 4], [306, 158, 12, 5, 10, 4], [306, 207, 11, 7, 10, 2], [306, 260, 12, 5, 10, 4], [306, 311, 12, 5, 10, 4], [306, 362, 12, 5, 10, 4], [306, 413, 12, 5, 10, 4], [306, 464, 12, 7, 10, 4], [306, 515, 12, 5, 10, 4], [306, 563, 13, 9, 10, 1], [306, 614, 11, 9, 10, 1], [306, 665, 11, 9, 10, 1], [306, 717, 13, 2, 10, 2], [306, 766, 1, 1, 3, 1], [367, 1, 12, 9, 10, 0], [367, 52, 12, 9, 10, 0], [367, 105, 12, 7, 10, 2], [367, 154, 13, 9, 10, 0], [367, 205, 13, 9, 10, 0], [367, 256, 12, 9, 10, 0], [367, 307, 13, 9, 10, 0], [367, 359, 12, 8, 10, 1], [367, 410, 12, 8, 10, 1], [367, 461, 12, 8, 10, 1], [367, 513, 12, 7, 10, 2], [367, 563, 13, 8, 10, 1], [367, 614, 13, 8, 10, 1], [367, 668, 11, 7, 10, 4], [367, 716, 12, 8, 10, 1], [367, 767, 11, 8, 10, 1], [428, 2, 12, 8, 10, 1], [428, 54, 12, 7, 10, 2], [428, 104, 12, 8, 10, 1], [428, 155, 11, 8, 10, 1], [428, 206, 12, 8, 10, 1], [428, 258, 12, 7, 10, 2], [428, 308, 13, 8, 10, 1], [428, 359, 12, 8, 10, 1], [428, 410, 11, 8, 10, 1], [428, 461, 12, 8, 10, 1], [428, 513, 12, 7, 10, 2], [428, 563, 13, 8, 10, 1], [428, 614, 12, 8, 10, 1], [428, 665, 12, 8, 10, 1], [428, 716, 12, 8, 10, 1], [428, 768, 12, 7, 10, 2], [489, 3, 11, 5, 10, 2], [489, 53, 13, 4, 10, 1], [489, 106, 11, 7, 10, 3], [489, 155, 12, 8, 10, 1], [489, 205, 13, 10, 10, 0], [489, 259, 12, 5, 10, 3], [489, 308, 13, 8, 10, 1], [489, 359, 13, 9, 10, 1], [489, 411, 12, 6, 10, 2], [489, 462, 12, 7, 10, 2], [489, 513, 14, 3, 10, 2], [489, 564, 12, 2, 10, 2], [489, 615, 12, 1, 10, 2], [489, 667, 12, 5, 10, 3], [489, 717, 13, 7, 10, 2], [489, 768, 12, 7, 10, 2], [550, 5, 12, 3, 10, 4], [550, 55, 11, 6, 10, 3], [550, 105, 12, 7, 10, 2], [550, 156, 12, 7, 10, 2], [550, 207, 13, 7, 10, 2], [550, 260, 11, 7, 10, 4], [550, 309, 12, 7, 10, 2], [550, 360, 13, 7, 10, 2], [550, 411, 13, 7, 10, 2], [550, 464, 12, 5, 10, 4], [550, 511, 11, 11, 10, 0], [550, 564, 13, 6, 10, 2], [550, 615, 12, 6, 10, 2], [550, 666, 12, 7, 10, 2], [550, 719, 11, 5, 10, 4], [550, 770, 11, 5, 10, 4], [611, 3, 11, 7, 10, 2], [611, 54, 12, 7, 10, 2], [611, 108, 11, 3, 10, 5], [611, 157, 12, 6, 10, 3], [611, 205, 11, 11, 10, 0], [611, 259, 12, 5, 10, 3], [611, 310, 10, 6, 10, 3], [611, 363, 11, 4, 10, 5], [611, 414, 11, 4, 10, 5], [611, 468, 10, 1, 10, 8], [611, 511, 1, 1, 10, 1], [611, 562, 12, 9, 10, 0], [611, 613, 12, 9, 10, 0], [611, 664, 12, 9, 10, 0], [611, 717, 13, 7, 10, 2], [611, 770, 11, 5, 10, 4], [672, 6, 10, 1, 10, 5], [672, 57, 12, 1, 10, 5], [672, 105, 13, 3, 10, 2], [672, 156, 13, 3, 10, 2], [672, 207, 12, 3, 10, 2], [672, 258, 12, 3, 10, 2], [672, 310, 11, 5, 10, 3], [672, 361, 11, 5, 10, 3], [672, 411, 12, 9, 10, 2], [1, 1, 1, 1, 10, 1], [794, 768, 13, 7, 10, 2], [672, 564, 13, 7, 10, 2], [672, 615, 13, 7, 10, 2], [672, 666, 13, 7, 10, 2], [672, 717, 13, 7, 10, 2], [672, 768, 13, 7, 10, 2], [733, 3, 13, 7, 10, 2], [733, 54, 13, 7, 10, 2], [733, 105, 13, 7, 10, 2], [733, 156, 13, 7, 10, 2], [733, 207, 13, 7, 10, 2], [733, 258, 13, 7, 10, 2], [733, 309, 13, 7, 10, 2], [733, 360, 13, 7, 10, 2], [733, 411, 13, 7, 10, 2], [733, 462, 13, 7, 10, 2], [733, 513, 13, 7, 10, 2], [733, 564, 13, 7, 10, 2], [733, 615, 13, 7, 10, 2], [733, 666, 13, 7, 10, 2], [733, 717, 13, 7, 10, 2], [733, 768, 13, 7, 10, 2], [1, 1, 1, 1, 10, 1], [794, 54, 13, 7, 10, 2], [794, 105, 13, 7, 10, 2], [794, 156, 13, 7, 10, 2], [794, 207, 13, 7, 10, 2], [794, 258, 13, 7, 10, 2], [794, 309, 13, 7, 10, 2], [794, 360, 13, 7, 10, 2], [794, 411, 13, 7, 10, 2], [794, 462, 13, 7, 10, 2], [794, 513, 13, 7, 10, 2], [794, 564, 13, 7, 10, 2], [794, 615, 13, 7, 10, 2], [794, 666, 13, 7, 10, 2], [794, 717, 13, 7, 10, 2], [794, 768, 13, 7, 10, 2], [855, 3, 13, 7, 10, 2], [855, 54, 13, 7, 10, 2], [855, 105, 13, 7, 10, 2], [855, 156, 13, 7, 10, 2], [855, 207, 13, 7, 10, 2], [855, 258, 13, 7, 10, 2], [855, 309, 13, 7, 10, 2], [855, 360, 13, 7, 10, 2], [855, 411, 13, 7, 10, 2], [855, 462, 13, 7, 10, 2], [855, 513, 13, 7, 10, 2], [855, 564, 13, 7, 10, 2], [855, 615, 13, 7, 10, 2], [855, 666, 13, 7, 10, 2], [855, 717, 13, 7, 10, 2], [855, 768, 13, 7, 10, 2]], \"capHeight\": 10, \"widestlogicalchar\": 10, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 11, 6, 11, 4], [1, 54, 11, 9, 11, 2], [1, 105, 11, 8, 11, 2], [1, 156, 11, 8, 11, 2], [1, 206, 11, 11, 11, 1], [1, 258, 11, 9, 11, 2], [1, 309, 11, 9, 11, 2], [1, 360, 11, 8, 11, 2], [1, 411, 11, 9, 11, 2], [1, 462, 11, 9, 11, 2], [1, 513, 11, 8, 11, 2], [1, 565, 11, 7, 11, 3], [1, 617, 11, 9, 11, 4], [1, 668, 11, 6, 11, 4], [1, 719, 11, 7, 11, 4], [1, 768, 11, 10, 11, 2], [62, 3, 11, 9, 11, 2], [62, 54, 11, 9, 11, 2], [62, 105, 11, 9, 11, 2], [62, 156, 11, 9, 11, 2], [62, 207, 11, 9, 11, 2], [62, 258, 11, 9, 11, 2], [62, 309, 11, 9, 11, 2], [62, 360, 11, 9, 11, 2], [62, 411, 11, 9, 11, 2], [62, 462, 11, 9, 11, 2], [62, 515, 11, 7, 11, 4], [62, 566, 11, 9, 11, 4], [62, 616, 11, 7, 11, 3], [62, 668, 11, 6, 11, 4], [62, 718, 11, 7, 11, 3], [62, 768, 11, 9, 11, 2], [123, 3, 11, 9, 11, 2], [123, 54, 11, 9, 11, 2], [123, 105, 11, 9, 11, 2], [123, 156, 11, 9, 11, 2], [123, 207, 11, 9, 11, 2], [123, 258, 11, 9, 11, 2], [123, 309, 11, 9, 11, 2], [123, 360, 11, 9, 11, 2], [123, 411, 11, 9, 11, 2], [123, 462, 11, 9, 11, 2], [123, 513, 11, 9, 11, 2], [123, 564, 11, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 11, 9, 11, 2], [123, 717, 11, 9, 11, 2], [123, 768, 11, 9, 11, 2], [184, 3, 11, 9, 11, 2], [184, 54, 11, 10, 11, 2], [184, 105, 11, 9, 11, 2], [184, 156, 11, 9, 11, 2], [184, 207, 11, 9, 11, 2], [184, 258, 11, 9, 11, 2], [184, 309, 11, 9, 11, 2], [184, 360, 11, 9, 11, 2], [184, 411, 11, 9, 11, 2], [184, 462, 11, 9, 11, 2], [184, 513, 11, 9, 11, 2], [184, 564, 11, 9, 11, 2], [184, 615, 11, 10, 11, 2], [184, 666, 11, 9, 11, 2], [184, 717, 11, 8, 11, 2], [184, 770, 11, 7, 11, 4], [245, 3, 11, 8, 11, 2], [245, 56, 11, 7, 11, 4], [245, 105, 11, 9, 11, 2], [245, 158, 11, 7, 11, 4], [245, 207, 11, 9, 11, 2], [245, 260, 11, 7, 11, 4], [245, 309, 11, 9, 11, 2], [245, 362, 11, 9, 11, 4], [245, 411, 11, 9, 11, 2], [245, 462, 11, 9, 11, 2], [245, 513, 11, 11, 11, 2], [245, 564, 11, 9, 11, 2], [245, 615, 11, 9, 11, 2], [245, 668, 11, 7, 11, 4], [245, 719, 11, 7, 11, 4], [245, 770, 11, 7, 11, 4], [306, 5, 11, 9, 11, 4], [306, 56, 11, 9, 11, 4], [306, 107, 11, 7, 11, 4], [306, 158, 11, 7, 11, 4], [306, 207, 11, 9, 11, 2], [306, 260, 11, 7, 11, 4], [306, 311, 11, 7, 11, 4], [306, 362, 11, 7, 11, 4], [306, 413, 11, 7, 11, 4], [306, 464, 11, 9, 11, 4], [306, 515, 11, 7, 11, 4], [306, 563, 11, 11, 11, 1], [306, 614, 11, 11, 11, 1], [306, 665, 11, 11, 11, 1], [306, 717, 11, 8, 11, 2], [306, 770, 3, 6, 3, 4], [367, 1, 11, 11, 11, 0], [367, 52, 11, 11, 11, 0], [367, 105, 11, 9, 11, 2], [367, 154, 11, 11, 11, 0], [367, 205, 11, 11, 11, 0], [367, 256, 11, 11, 11, 0], [367, 307, 11, 11, 11, 0], [367, 359, 11, 10, 11, 1], [367, 410, 11, 10, 11, 1], [367, 461, 11, 10, 11, 1], [367, 513, 11, 9, 11, 2], [367, 563, 11, 10, 11, 1], [367, 614, 11, 10, 11, 1], [367, 668, 11, 9, 11, 4], [367, 716, 11, 10, 11, 1], [367, 767, 11, 10, 11, 1], [428, 2, 11, 10, 11, 1], [428, 54, 11, 9, 11, 2], [428, 104, 11, 10, 11, 1], [428, 155, 11, 10, 11, 1], [428, 206, 11, 10, 11, 1], [428, 258, 11, 9, 11, 2], [428, 308, 11, 10, 11, 1], [428, 359, 11, 10, 11, 1], [428, 410, 11, 10, 11, 1], [428, 461, 11, 10, 11, 1], [428, 513, 11, 9, 11, 2], [428, 563, 11, 10, 11, 1], [428, 614, 11, 10, 11, 1], [428, 665, 11, 10, 11, 1], [428, 716, 11, 10, 11, 1], [428, 768, 11, 9, 11, 2], [489, 3, 11, 8, 11, 2], [489, 53, 11, 9, 11, 1], [489, 106, 11, 9, 11, 3], [489, 155, 11, 10, 11, 1], [489, 205, 11, 12, 11, 0], [489, 259, 11, 7, 11, 3], [489, 308, 11, 10, 11, 1], [489, 359, 11, 11, 11, 1], [489, 411, 11, 8, 11, 2], [489, 462, 11, 9, 11, 2], [489, 513, 11, 8, 11, 2], [489, 564, 11, 8, 11, 2], [489, 615, 11, 8, 11, 2], [489, 667, 11, 7, 11, 3], [489, 717, 11, 9, 11, 2], [489, 768, 11, 9, 11, 2], [550, 5, 11, 6, 11, 4], [550, 55, 11, 8, 11, 3], [550, 105, 11, 9, 11, 2], [550, 156, 11, 9, 11, 2], [550, 207, 11, 9, 11, 2], [550, 260, 11, 9, 11, 4], [550, 309, 11, 9, 11, 2], [550, 360, 11, 9, 11, 2], [550, 411, 11, 9, 11, 2], [550, 464, 11, 7, 11, 4], [550, 511, 11, 13, 11, 0], [550, 564, 11, 8, 11, 2], [550, 615, 11, 8, 11, 2], [550, 666, 11, 9, 11, 2], [550, 719, 11, 7, 11, 4], [550, 770, 11, 7, 11, 4], [611, 3, 11, 9, 11, 2], [611, 54, 11, 9, 11, 2], [611, 107, 11, 6, 11, 4], [611, 157, 11, 8, 11, 3], [611, 205, 11, 13, 11, 0], [611, 259, 11, 7, 11, 3], [611, 310, 11, 8, 11, 3], [611, 362, 11, 7, 11, 4], [611, 413, 11, 7, 11, 4], [611, 464, 11, 7, 11, 4], [611, 515, 11, 6, 11, 4], [611, 562, 11, 11, 11, 0], [611, 613, 11, 11, 11, 0], [611, 664, 11, 11, 11, 0], [611, 717, 11, 9, 11, 2], [611, 770, 11, 7, 11, 4], [672, 5, 11, 6, 11, 4], [672, 56, 11, 6, 11, 4], [672, 105, 11, 8, 11, 2], [672, 156, 11, 8, 11, 2], [672, 207, 11, 8, 11, 2], [672, 258, 11, 8, 11, 2], [672, 310, 11, 7, 11, 3], [672, 361, 11, 7, 11, 3], [672, 411, 11, 11, 11, 2], [1, 5, 11, 6, 11, 4], [794, 768, 11, 9, 11, 2], [672, 564, 11, 9, 11, 2], [672, 615, 11, 9, 11, 2], [672, 666, 11, 9, 11, 2], [672, 717, 11, 9, 11, 2], [672, 768, 11, 9, 11, 2], [733, 3, 11, 9, 11, 2], [733, 54, 11, 9, 11, 2], [733, 105, 11, 9, 11, 2], [733, 156, 11, 9, 11, 2], [733, 207, 11, 9, 11, 2], [733, 258, 11, 9, 11, 2], [733, 309, 11, 9, 11, 2], [733, 360, 11, 9, 11, 2], [733, 411, 11, 9, 11, 2], [733, 462, 11, 9, 11, 2], [733, 513, 11, 9, 11, 2], [733, 564, 11, 9, 11, 2], [733, 615, 11, 9, 11, 2], [733, 666, 11, 9, 11, 2], [733, 717, 11, 9, 11, 2], [733, 768, 11, 9, 11, 2], [1, 5, 11, 6, 11, 4], [794, 54, 11, 9, 11, 2], [794, 105, 11, 9, 11, 2], [794, 156, 11, 9, 11, 2], [794, 207, 11, 9, 11, 2], [794, 258, 11, 9, 11, 2], [794, 309, 11, 9, 11, 2], [794, 360, 11, 9, 11, 2], [794, 411, 11, 9, 11, 2], [794, 462, 11, 9, 11, 2], [794, 513, 11, 9, 11, 2], [794, 564, 11, 9, 11, 2], [794, 615, 11, 9, 11, 2], [794, 666, 11, 9, 11, 2], [794, 717, 11, 9, 11, 2], [794, 768, 11, 9, 11, 2], [855, 3, 11, 9, 11, 2], [855, 54, 11, 9, 11, 2], [855, 105, 11, 9, 11, 2], [855, 156, 11, 9, 11, 2], [855, 207, 11, 9, 11, 2], [855, 258, 11, 9, 11, 2], [855, 309, 11, 9, 11, 2], [855, 360, 11, 9, 11, 2], [855, 411, 11, 9, 11, 2], [855, 462, 11, 9, 11, 2], [855, 513, 11, 9, 11, 2], [855, 564, 11, 9, 11, 2], [855, 615, 11, 9, 11, 2], [855, 666, 11, 9, 11, 2], [855, 717, 11, 9, 11, 2], [855, 768, 11, 9, 11, 2]], \"widestlogicalchar\": 11, \"widestglyph\": 11, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 55, 10, 7, 10, 3], [1, 106, 10, 7, 10, 3], [1, 157, 10, 7, 10, 3], [1, 207, 10, 9, 10, 2], [1, 259, 10, 7, 10, 3], [1, 310, 10, 7, 10, 3], [1, 361, 10, 7, 10, 3], [1, 412, 10, 7, 10, 3], [1, 463, 10, 7, 10, 3], [1, 514, 10, 7, 10, 3], [1, 566, 10, 6, 10, 4], [1, 617, 10, 8, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 6, 10, 4], [1, 769, 10, 8, 10, 3], [62, 4, 10, 7, 10, 3], [62, 55, 10, 7, 10, 3], [62, 106, 10, 7, 10, 3], [62, 157, 10, 7, 10, 3], [62, 208, 10, 7, 10, 3], [62, 259, 10, 7, 10, 3], [62, 310, 10, 7, 10, 3], [62, 361, 10, 7, 10, 3], [62, 412, 10, 7, 10, 3], [62, 463, 10, 7, 10, 3], [62, 515, 10, 6, 10, 4], [62, 566, 10, 8, 10, 4], [62, 617, 10, 6, 10, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 6, 10, 4], [62, 769, 10, 7, 10, 3], [123, 4, 10, 7, 10, 3], [123, 55, 10, 7, 10, 3], [123, 106, 10, 7, 10, 3], [123, 157, 10, 7, 10, 3], [123, 208, 10, 7, 10, 3], [123, 259, 10, 7, 10, 3], [123, 310, 10, 7, 10, 3], [123, 361, 10, 7, 10, 3], [123, 412, 10, 7, 10, 3], [123, 463, 10, 7, 10, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 10, 7, 10, 3], [123, 667, 10, 7, 10, 3], [123, 718, 10, 7, 10, 3], [123, 769, 10, 7, 10, 3], [184, 4, 10, 7, 10, 3], [184, 55, 10, 8, 10, 3], [184, 106, 10, 7, 10, 3], [184, 157, 10, 7, 10, 3], [184, 208, 10, 7, 10, 3], [184, 259, 10, 7, 10, 3], [184, 310, 10, 7, 10, 3], [184, 361, 10, 7, 10, 3], [184, 412, 10, 7, 10, 3], [184, 463, 10, 7, 10, 3], [184, 514, 10, 7, 10, 3], [184, 565, 10, 7, 10, 3], [184, 616, 10, 8, 10, 3], [184, 667, 10, 7, 10, 3], [184, 718, 10, 7, 10, 3], [184, 770, 10, 6, 10, 4], [245, 4, 10, 7, 10, 3], [245, 56, 10, 6, 10, 4], [245, 106, 10, 7, 10, 3], [245, 158, 10, 6, 10, 4], [245, 208, 10, 7, 10, 3], [245, 260, 10, 6, 10, 4], [245, 310, 10, 7, 10, 3], [245, 362, 10, 8, 10, 4], [245, 412, 10, 7, 10, 3], [245, 463, 10, 7, 10, 3], [245, 514, 10, 9, 10, 3], [245, 565, 10, 7, 10, 3], [245, 616, 10, 7, 10, 3], [245, 668, 10, 6, 10, 4], [245, 719, 10, 6, 10, 4], [245, 770, 10, 6, 10, 4], [306, 5, 10, 8, 10, 4], [306, 56, 10, 8, 10, 4], [306, 107, 10, 6, 10, 4], [306, 158, 10, 6, 10, 4], [306, 208, 10, 7, 10, 3], [306, 260, 10, 6, 10, 4], [306, 311, 10, 6, 10, 4], [306, 362, 10, 6, 10, 4], [306, 413, 10, 6, 10, 4], [306, 464, 10, 8, 10, 4], [306, 515, 10, 6, 10, 4], [306, 564, 10, 9, 10, 2], [306, 615, 10, 9, 10, 2], [306, 666, 10, 9, 10, 2], [306, 718, 10, 7, 10, 3], [306, 770, 3, 6, 3, 4], [367, 2, 10, 9, 10, 1], [367, 53, 10, 9, 10, 1], [367, 106, 10, 7, 10, 3], [367, 155, 10, 9, 10, 1], [367, 206, 10, 9, 10, 1], [367, 257, 10, 9, 10, 1], [367, 308, 10, 9, 10, 1], [367, 360, 10, 8, 10, 2], [367, 411, 10, 8, 10, 2], [367, 462, 10, 8, 10, 2], [367, 514, 10, 7, 10, 3], [367, 564, 10, 8, 10, 2], [367, 615, 10, 8, 10, 2], [367, 668, 10, 8, 10, 4], [367, 717, 10, 8, 10, 2], [367, 768, 10, 8, 10, 2], [428, 3, 10, 8, 10, 2], [428, 55, 10, 7, 10, 3], [428, 105, 10, 8, 10, 2], [428, 156, 10, 8, 10, 2], [428, 207, 10, 8, 10, 2], [428, 259, 10, 7, 10, 3], [428, 309, 10, 8, 10, 2], [428, 360, 10, 8, 10, 2], [428, 411, 10, 8, 10, 2], [428, 462, 10, 8, 10, 2], [428, 514, 10, 7, 10, 3], [428, 564, 10, 8, 10, 2], [428, 615, 10, 8, 10, 2], [428, 666, 10, 8, 10, 2], [428, 717, 10, 8, 10, 2], [428, 769, 10, 7, 10, 3], [489, 4, 10, 7, 10, 3], [489, 54, 10, 8, 10, 2], [489, 107, 10, 7, 10, 4], [489, 156, 10, 8, 10, 2], [489, 206, 10, 10, 10, 1], [489, 260, 10, 6, 10, 4], [489, 309, 10, 8, 10, 2], [489, 360, 10, 9, 10, 2], [489, 412, 10, 7, 10, 3], [489, 463, 10, 7, 10, 3], [489, 514, 10, 7, 10, 3], [489, 565, 10, 7, 10, 3], [489, 616, 10, 7, 10, 3], [489, 668, 10, 6, 10, 4], [489, 718, 10, 7, 10, 3], [489, 769, 10, 7, 10, 3], [550, 5, 10, 6, 10, 4], [550, 56, 10, 6, 10, 4], [550, 106, 10, 7, 10, 3], [550, 157, 10, 7, 10, 3], [550, 208, 10, 7, 10, 3], [550, 260, 10, 8, 10, 4], [550, 310, 10, 7, 10, 3], [550, 361, 10, 7, 10, 3], [550, 412, 10, 7, 10, 3], [550, 464, 10, 6, 10, 4], [550, 512, 10, 11, 10, 1], [550, 565, 10, 7, 10, 3], [550, 616, 10, 7, 10, 3], [550, 667, 10, 7, 10, 3], [550, 719, 10, 6, 10, 4], [550, 770, 10, 6, 10, 4], [611, 4, 10, 7, 10, 3], [611, 55, 10, 7, 10, 3], [611, 107, 10, 6, 10, 4], [611, 158, 10, 6, 10, 4], [611, 206, 10, 11, 10, 1], [611, 260, 10, 6, 10, 4], [611, 311, 10, 6, 10, 4], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 6, 10, 4], [611, 563, 10, 9, 10, 1], [611, 614, 10, 9, 10, 1], [611, 665, 10, 9, 10, 1], [611, 718, 10, 7, 10, 3], [611, 770, 10, 6, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 106, 10, 7, 10, 3], [672, 157, 10, 7, 10, 3], [672, 208, 10, 7, 10, 3], [672, 259, 10, 7, 10, 3], [672, 311, 10, 6, 10, 4], [672, 362, 10, 6, 10, 4], [672, 412, 10, 9, 10, 3], [1, 5, 10, 6, 10, 4], [794, 769, 10, 7, 10, 3], [672, 565, 10, 7, 10, 3], [672, 616, 10, 7, 10, 3], [672, 667, 10, 7, 10, 3], [672, 718, 10, 7, 10, 3], [672, 769, 10, 7, 10, 3], [733, 4, 10, 7, 10, 3], [733, 55, 10, 7, 10, 3], [733, 106, 10, 7, 10, 3], [733, 157, 10, 7, 10, 3], [733, 208, 10, 7, 10, 3], [733, 259, 10, 7, 10, 3], [733, 310, 10, 7, 10, 3], [733, 361, 10, 7, 10, 3], [733, 412, 10, 7, 10, 3], [733, 463, 10, 7, 10, 3], [733, 514, 10, 7, 10, 3], [733, 565, 10, 7, 10, 3], [733, 616, 10, 7, 10, 3], [733, 667, 10, 7, 10, 3], [733, 718, 10, 7, 10, 3], [733, 769, 10, 7, 10, 3], [1, 5, 10, 6, 10, 4], [794, 55, 10, 7, 10, 3], [794, 106, 10, 7, 10, 3], [794, 157, 10, 7, 10, 3], [794, 208, 10, 7, 10, 3], [794, 259, 10, 7, 10, 3], [794, 310, 10, 7, 10, 3], [794, 361, 10, 7, 10, 3], [794, 412, 10, 7, 10, 3], [794, 463, 10, 7, 10, 3], [794, 514, 10, 7, 10, 3], [794, 565, 10, 7, 10, 3], [794, 616, 10, 7, 10, 3], [794, 667, 10, 7, 10, 3], [794, 718, 10, 7, 10, 3], [794, 769, 10, 7, 10, 3], [855, 4, 10, 7, 10, 3], [855, 55, 10, 7, 10, 3], [855, 106, 10, 7, 10, 3], [855, 157, 10, 7, 10, 3], [855, 208, 10, 7, 10, 3], [855, 259, 10, 7, 10, 3], [855, 310, 10, 7, 10, 3], [855, 361, 10, 7, 10, 3], [855, 412, 10, 7, 10, 3], [855, 463, 10, 7, 10, 3], [855, 514, 10, 7, 10, 3], [855, 565, 10, 7, 10, 3], [855, 616, 10, 7, 10, 3], [855, 667, 10, 7, 10, 3], [855, 718, 10, 7, 10, 3], [855, 769, 10, 7, 10, 3]], \"widestlogicalchar\": 10, \"widestglyph\": 10, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 10, 1], [1, 54, 11, 9, 10, 2], [1, 105, 12, 4, 10, 2], [1, 156, 12, 7, 10, 2], [1, 206, 12, 11, 10, 1], [1, 258, 13, 9, 10, 2], [1, 309, 11, 9, 10, 2], [1, 360, 11, 4, 10, 2], [1, 411, 12, 9, 10, 2], [1, 462, 12, 9, 10, 2], [1, 513, 12, 7, 10, 2], [1, 565, 11, 7, 10, 3], [1, 621, 8, 5, 10, 8], [1, 669, 11, 3, 10, 5], [1, 723, 8, 3, 10, 8], [1, 768, 13, 10, 10, 2], [62, 3, 12, 9, 10, 2], [62, 54, 12, 9, 10, 2], [62, 105, 12, 9, 10, 2], [62, 156, 12, 9, 10, 2], [62, 207, 12, 9, 10, 2], [62, 258, 13, 9, 10, 2], [62, 309, 12, 9, 10, 2], [62, 360, 13, 9, 10, 2], [62, 411, 12, 9, 10, 2], [62, 462, 12, 9, 10, 2], [62, 515, 10, 7, 10, 4], [62, 566, 10, 9, 10, 4], [62, 616, 11, 7, 10, 3], [62, 668, 12, 5, 10, 4], [62, 718, 10, 7, 10, 3], [62, 768, 12, 9, 10, 2], [123, 3, 12, 9, 10, 2], [123, 54, 12, 9, 10, 2], [123, 105, 12, 9, 10, 2], [123, 156, 12, 9, 10, 2], [123, 207, 12, 9, 10, 2], [123, 258, 13, 9, 10, 2], [123, 309, 13, 9, 10, 2], [123, 360, 12, 9, 10, 2], [123, 411, 13, 9, 10, 2], [123, 462, 11, 9, 10, 2], [123, 513, 13, 9, 10, 2], [123, 564, 13, 9, 10, 2], [123, 615, 10, 9, 10, 2], [123, 666, 13, 9, 10, 2], [123, 717, 13, 9, 10, 2], [123, 768, 12, 9, 10, 2], [184, 3, 12, 9, 10, 2], [184, 54, 12, 10, 10, 2], [184, 105, 12, 9, 10, 2], [184, 156, 12, 9, 10, 2], [184, 207, 13, 9, 10, 2], [184, 258, 13, 9, 10, 2], [184, 309, 13, 9, 10, 2], [184, 360, 13, 9, 10, 2], [184, 411, 13, 9, 10, 2], [184, 462, 13, 9, 10, 2], [184, 513, 13, 9, 10, 2], [184, 564, 12, 9, 10, 2], [184, 615, 10, 10, 10, 2], [184, 666, 12, 9, 10, 2], [184, 717, 11, 4, 10, 2], [184, 774, 11, 3, 10, 8], [245, 3, 11, 4, 10, 2], [245, 56, 12, 7, 10, 4], [245, 105, 11, 9, 10, 2], [245, 158, 11, 7, 10, 4], [245, 207, 13, 9, 10, 2], [245, 260, 11, 7, 10, 4], [245, 309, 13, 9, 10, 2], [245, 362, 12, 9, 10, 4], [245, 411, 11, 9, 10, 2], [245, 462, 11, 9, 10, 2], [245, 513, 11, 11, 10, 2], [245, 564, 11, 9, 10, 2], [245, 615, 11, 9, 10, 2], [245, 668, 11, 7, 10, 4], [245, 719, 11, 7, 10, 4], [245, 770, 11, 7, 10, 4], [306, 5, 11, 9, 10, 4], [306, 56, 12, 9, 10, 4], [306, 107, 11, 7, 10, 4], [306, 158, 12, 7, 10, 4], [306, 207, 11, 9, 10, 2], [306, 260, 12, 7, 10, 4], [306, 311, 12, 7, 10, 4], [306, 362, 12, 7, 10, 4], [306, 413, 12, 7, 10, 4], [306, 464, 12, 9, 10, 4], [306, 515, 12, 7, 10, 4], [306, 563, 13, 11, 10, 1], [306, 614, 11, 11, 10, 1], [306, 665, 11, 11, 10, 1], [306, 717, 13, 4, 10, 2], [306, 766, 1, 1, 3, 1], [367, 1, 13, 11, 10, 0], [367, 52, 12, 11, 10, 0], [367, 105, 12, 9, 10, 2], [367, 154, 13, 11, 10, 0], [367, 205, 14, 11, 10, 0], [367, 256, 13, 11, 10, 0], [367, 307, 13, 11, 10, 0], [367, 359, 12, 10, 10, 1], [367, 410, 12, 10, 10, 1], [367, 461, 12, 10, 10, 1], [367, 513, 12, 9, 10, 2], [367, 563, 13, 10, 10, 1], [367, 614, 13, 10, 10, 1], [367, 668, 11, 9, 10, 4], [367, 716, 12, 10, 10, 1], [367, 767, 11, 10, 10, 1], [428, 2, 12, 10, 10, 1], [428, 54, 12, 9, 10, 2], [428, 104, 12, 10, 10, 1], [428, 155, 11, 10, 10, 1], [428, 206, 12, 10, 10, 1], [428, 258, 12, 9, 10, 2], [428, 308, 13, 10, 10, 1], [428, 359, 12, 10, 10, 1], [428, 410, 11, 10, 10, 1], [428, 461, 12, 10, 10, 1], [428, 513, 12, 9, 10, 2], [428, 563, 13, 10, 10, 1], [428, 614, 12, 10, 10, 1], [428, 665, 12, 10, 10, 1], [428, 716, 12, 10, 10, 1], [428, 768, 12, 9, 10, 2], [489, 3, 11, 7, 10, 2], [489, 53, 13, 6, 10, 1], [489, 106, 11, 9, 10, 3], [489, 155, 12, 10, 10, 1], [489, 205, 13, 12, 10, 0], [489, 259, 12, 7, 10, 3], [489, 308, 13, 10, 10, 1], [489, 359, 13, 11, 10, 1], [489, 411, 12, 8, 10, 2], [489, 462, 12, 9, 10, 2], [489, 513, 14, 5, 10, 2], [489, 564, 12, 4, 10, 2], [489, 615, 12, 3, 10, 2], [489, 667, 12, 7, 10, 3], [489, 717, 13, 9, 10, 2], [489, 768, 12, 9, 10, 2], [550, 5, 12, 5, 10, 4], [550, 55, 11, 8, 10, 3], [550, 105, 12, 9, 10, 2], [550, 156, 12, 9, 10, 2], [550, 207, 13, 9, 10, 2], [550, 260, 11, 9, 10, 4], [550, 309, 12, 9, 10, 2], [550, 360, 13, 9, 10, 2], [550, 411, 13, 9, 10, 2], [550, 464, 12, 7, 10, 4], [550, 511, 14, 13, 10, 0], [550, 564, 13, 8, 10, 2], [550, 615, 12, 8, 10, 2], [550, 666, 12, 9, 10, 2], [550, 719, 11, 7, 10, 4], [550, 770, 11, 7, 10, 4], [611, 3, 11, 9, 10, 2], [611, 54, 12, 9, 10, 2], [611, 108, 11, 5, 10, 5], [611, 157, 12, 8, 10, 3], [611, 205, 14, 13, 10, 0], [611, 259, 12, 7, 10, 3], [611, 310, 10, 8, 10, 3], [611, 363, 11, 6, 10, 5], [611, 414, 11, 6, 10, 5], [611, 468, 10, 3, 10, 8], [611, 511, 1, 1, 10, 1], [611, 562, 12, 11, 10, 0], [611, 613, 14, 11, 10, 0], [611, 664, 14, 11, 10, 0], [611, 717, 13, 9, 10, 2], [611, 770, 11, 7, 10, 4], [672, 6, 10, 3, 10, 5], [672, 57, 12, 3, 10, 5], [672, 105, 13, 5, 10, 2], [672, 156, 13, 5, 10, 2], [672, 207, 12, 5, 10, 2], [672, 258, 12, 5, 10, 2], [672, 310, 11, 7, 10, 3], [672, 361, 11, 7, 10, 3], [672, 411, 12, 11, 10, 2], [1, 1, 1, 1, 10, 1], [794, 768, 13, 9, 10, 2], [672, 564, 13, 9, 10, 2], [672, 615, 13, 9, 10, 2], [672, 666, 13, 9, 10, 2], [672, 717, 13, 9, 10, 2], [672, 768, 13, 9, 10, 2], [733, 3, 13, 9, 10, 2], [733, 54, 13, 9, 10, 2], [733, 105, 13, 9, 10, 2], [733, 156, 13, 9, 10, 2], [733, 207, 13, 9, 10, 2], [733, 258, 13, 9, 10, 2], [733, 309, 13, 9, 10, 2], [733, 360, 13, 9, 10, 2], [733, 411, 13, 9, 10, 2], [733, 462, 13, 9, 10, 2], [733, 513, 13, 9, 10, 2], [733, 564, 13, 9, 10, 2], [733, 615, 13, 9, 10, 2], [733, 666, 13, 9, 10, 2], [733, 717, 13, 9, 10, 2], [733, 768, 13, 9, 10, 2], [1, 1, 1, 1, 10, 1], [794, 54, 13, 9, 10, 2], [794, 105, 13, 9, 10, 2], [794, 156, 13, 9, 10, 2], [794, 207, 13, 9, 10, 2], [794, 258, 13, 9, 10, 2], [794, 309, 13, 9, 10, 2], [794, 360, 13, 9, 10, 2], [794, 411, 13, 9, 10, 2], [794, 462, 13, 9, 10, 2], [794, 513, 13, 9, 10, 2], [794, 564, 13, 9, 10, 2], [794, 615, 13, 9, 10, 2], [794, 666, 13, 9, 10, 2], [794, 717, 13, 9, 10, 2], [794, 768, 13, 9, 10, 2], [855, 3, 13, 9, 10, 2], [855, 54, 13, 9, 10, 2], [855, 105, 13, 9, 10, 2], [855, 156, 13, 9, 10, 2], [855, 207, 13, 9, 10, 2], [855, 258, 13, 9, 10, 2], [855, 309, 13, 9, 10, 2], [855, 360, 13, 9, 10, 2], [855, 411, 13, 9, 10, 2], [855, 462, 13, 9, 10, 2], [855, 513, 13, 9, 10, 2], [855, 564, 13, 9, 10, 2], [855, 615, 13, 9, 10, 2], [855, 666, 13, 9, 10, 2], [855, 717, 13, 9, 10, 2], [855, 768, 13, 9, 10, 2]], \"capHeight\": 10, \"widestlogicalchar\": 10, \"widestglyph\": 14, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 54, 10, 7, 9, 2], [1, 105, 11, 2, 9, 2], [1, 156, 11, 5, 9, 2], [1, 206, 11, 9, 9, 1], [1, 258, 12, 7, 9, 2], [1, 309, 10, 7, 9, 2], [1, 360, 10, 2, 9, 2], [1, 411, 11, 7, 9, 2], [1, 462, 11, 7, 9, 2], [1, 513, 11, 5, 9, 2], [1, 565, 10, 5, 9, 3], [1, 621, 7, 3, 9, 8], [1, 669, 10, 1, 9, 5], [1, 723, 7, 1, 9, 8], [1, 768, 12, 8, 9, 2], [62, 3, 11, 7, 9, 2], [62, 54, 11, 7, 9, 2], [62, 105, 11, 7, 9, 2], [62, 156, 11, 7, 9, 2], [62, 207, 11, 7, 9, 2], [62, 258, 12, 7, 9, 2], [62, 309, 11, 7, 9, 2], [62, 360, 12, 7, 9, 2], [62, 411, 11, 7, 9, 2], [62, 462, 11, 7, 9, 2], [62, 515, 9, 5, 9, 4], [62, 566, 9, 7, 9, 4], [62, 616, 10, 5, 9, 3], [62, 668, 11, 3, 9, 4], [62, 718, 9, 5, 9, 3], [62, 768, 11, 7, 9, 2], [123, 3, 11, 7, 9, 2], [123, 54, 11, 7, 9, 2], [123, 105, 11, 7, 9, 2], [123, 156, 11, 7, 9, 2], [123, 207, 11, 7, 9, 2], [123, 258, 12, 7, 9, 2], [123, 309, 12, 7, 9, 2], [123, 360, 11, 7, 9, 2], [123, 411, 12, 7, 9, 2], [123, 462, 10, 7, 9, 2], [123, 513, 12, 7, 9, 2], [123, 564, 12, 7, 9, 2], [123, 615, 9, 7, 9, 2], [123, 666, 12, 7, 9, 2], [123, 717, 12, 7, 9, 2], [123, 768, 11, 7, 9, 2], [184, 3, 11, 7, 9, 2], [184, 54, 11, 8, 9, 2], [184, 105, 11, 7, 9, 2], [184, 156, 11, 7, 9, 2], [184, 207, 12, 7, 9, 2], [184, 258, 12, 7, 9, 2], [184, 309, 12, 7, 9, 2], [184, 360, 12, 7, 9, 2], [184, 411, 12, 7, 9, 2], [184, 462, 12, 7, 9, 2], [184, 513, 12, 7, 9, 2], [184, 564, 11, 7, 9, 2], [184, 615, 9, 8, 9, 2], [184, 666, 11, 7, 9, 2], [184, 717, 10, 2, 9, 2], [184, 774, 10, 1, 9, 8], [245, 3, 10, 2, 9, 2], [245, 56, 11, 5, 9, 4], [245, 105, 10, 7, 9, 2], [245, 158, 10, 5, 9, 4], [245, 207, 12, 7, 9, 2], [245, 260, 10, 5, 9, 4], [245, 309, 12, 7, 9, 2], [245, 362, 11, 7, 9, 4], [245, 411, 10, 7, 9, 2], [245, 462, 10, 7, 9, 2], [245, 513, 10, 9, 9, 2], [245, 564, 10, 7, 9, 2], [245, 615, 10, 7, 9, 2], [245, 668, 10, 5, 9, 4], [245, 719, 10, 5, 9, 4], [245, 770, 10, 5, 9, 4], [306, 5, 10, 7, 9, 4], [306, 56, 11, 7, 9, 4], [306, 107, 10, 5, 9, 4], [306, 158, 11, 5, 9, 4], [306, 207, 10, 7, 9, 2], [306, 260, 11, 5, 9, 4], [306, 311, 11, 5, 9, 4], [306, 362, 11, 5, 9, 4], [306, 413, 11, 5, 9, 4], [306, 464, 11, 7, 9, 4], [306, 515, 11, 5, 9, 4], [306, 563, 12, 9, 9, 1], [306, 614, 10, 9, 9, 1], [306, 665, 10, 9, 9, 1], [306, 717, 12, 2, 9, 2], [306, 766, 1, 1, 3, 1], [367, 1, 11, 9, 9, 0], [367, 52, 11, 9, 9, 0], [367, 105, 11, 7, 9, 2], [367, 154, 12, 9, 9, 0], [367, 205, 12, 9, 9, 0], [367, 256, 11, 9, 9, 0], [367, 307, 12, 9, 9, 0], [367, 359, 11, 8, 9, 1], [367, 410, 11, 8, 9, 1], [367, 461, 11, 8, 9, 1], [367, 513, 11, 7, 9, 2], [367, 563, 12, 8, 9, 1], [367, 614, 12, 8, 9, 1], [367, 668, 10, 7, 9, 4], [367, 716, 11, 8, 9, 1], [367, 767, 10, 8, 9, 1], [428, 2, 11, 8, 9, 1], [428, 54, 11, 7, 9, 2], [428, 104, 11, 8, 9, 1], [428, 155, 10, 8, 9, 1], [428, 206, 11, 8, 9, 1], [428, 258, 11, 7, 9, 2], [428, 308, 12, 8, 9, 1], [428, 359, 11, 8, 9, 1], [428, 410, 10, 8, 9, 1], [428, 461, 11, 8, 9, 1], [428, 513, 11, 7, 9, 2], [428, 563, 12, 8, 9, 1], [428, 614, 11, 8, 9, 1], [428, 665, 11, 8, 9, 1], [428, 716, 11, 8, 9, 1], [428, 768, 11, 7, 9, 2], [489, 3, 10, 5, 9, 2], [489, 53, 12, 4, 9, 1], [489, 106, 10, 7, 9, 3], [489, 155, 11, 8, 9, 1], [489, 205, 12, 10, 9, 0], [489, 259, 11, 5, 9, 3], [489, 308, 12, 8, 9, 1], [489, 359, 12, 9, 9, 1], [489, 411, 11, 6, 9, 2], [489, 462, 11, 7, 9, 2], [489, 513, 13, 3, 9, 2], [489, 564, 11, 2, 9, 2], [489, 615, 11, 1, 9, 2], [489, 667, 11, 5, 9, 3], [489, 717, 12, 7, 9, 2], [489, 768, 11, 7, 9, 2], [550, 5, 11, 3, 9, 4], [550, 55, 10, 6, 9, 3], [550, 105, 11, 7, 9, 2], [550, 156, 11, 7, 9, 2], [550, 207, 12, 7, 9, 2], [550, 260, 10, 7, 9, 4], [550, 309, 11, 7, 9, 2], [550, 360, 12, 7, 9, 2], [550, 411, 12, 7, 9, 2], [550, 464, 11, 5, 9, 4], [550, 511, 10, 11, 9, 0], [550, 564, 12, 6, 9, 2], [550, 615, 11, 6, 9, 2], [550, 666, 11, 7, 9, 2], [550, 719, 10, 5, 9, 4], [550, 770, 10, 5, 9, 4], [611, 3, 10, 7, 9, 2], [611, 54, 11, 7, 9, 2], [611, 108, 10, 3, 9, 5], [611, 157, 11, 6, 9, 3], [611, 205, 10, 11, 9, 0], [611, 259, 11, 5, 9, 3], [611, 310, 9, 6, 9, 3], [611, 363, 10, 4, 9, 5], [611, 414, 10, 4, 9, 5], [611, 468, 9, 1, 9, 8], [611, 511, 1, 1, 9, 1], [611, 562, 11, 9, 9, 0], [611, 613, 11, 9, 9, 0], [611, 664, 11, 9, 9, 0], [611, 717, 12, 7, 9, 2], [611, 770, 10, 5, 9, 4], [672, 6, 9, 1, 9, 5], [672, 57, 11, 1, 9, 5], [672, 105, 12, 3, 9, 2], [672, 156, 12, 3, 9, 2], [672, 207, 11, 3, 9, 2], [672, 258, 11, 3, 9, 2], [672, 310, 10, 5, 9, 3], [672, 361, 10, 5, 9, 3], [672, 411, 11, 9, 9, 2], [1, 1, 1, 1, 9, 1], [794, 768, 12, 7, 9, 2], [672, 564, 12, 7, 9, 2], [672, 615, 12, 7, 9, 2], [672, 666, 12, 7, 9, 2], [672, 717, 12, 7, 9, 2], [672, 768, 12, 7, 9, 2], [733, 3, 12, 7, 9, 2], [733, 54, 12, 7, 9, 2], [733, 105, 12, 7, 9, 2], [733, 156, 12, 7, 9, 2], [733, 207, 12, 7, 9, 2], [733, 258, 12, 7, 9, 2], [733, 309, 12, 7, 9, 2], [733, 360, 12, 7, 9, 2], [733, 411, 12, 7, 9, 2], [733, 462, 12, 7, 9, 2], [733, 513, 12, 7, 9, 2], [733, 564, 12, 7, 9, 2], [733, 615, 12, 7, 9, 2], [733, 666, 12, 7, 9, 2], [733, 717, 12, 7, 9, 2], [733, 768, 12, 7, 9, 2], [1, 1, 1, 1, 9, 1], [794, 54, 12, 7, 9, 2], [794, 105, 12, 7, 9, 2], [794, 156, 12, 7, 9, 2], [794, 207, 12, 7, 9, 2], [794, 258, 12, 7, 9, 2], [794, 309, 12, 7, 9, 2], [794, 360, 12, 7, 9, 2], [794, 411, 12, 7, 9, 2], [794, 462, 12, 7, 9, 2], [794, 513, 12, 7, 9, 2], [794, 564, 12, 7, 9, 2], [794, 615, 12, 7, 9, 2], [794, 666, 12, 7, 9, 2], [794, 717, 12, 7, 9, 2], [794, 768, 12, 7, 9, 2], [855, 3, 12, 7, 9, 2], [855, 54, 12, 7, 9, 2], [855, 105, 12, 7, 9, 2], [855, 156, 12, 7, 9, 2], [855, 207, 12, 7, 9, 2], [855, 258, 12, 7, 9, 2], [855, 309, 12, 7, 9, 2], [855, 360, 12, 7, 9, 2], [855, 411, 12, 7, 9, 2], [855, 462, 12, 7, 9, 2], [855, 513, 12, 7, 9, 2], [855, 564, 12, 7, 9, 2], [855, 615, 12, 7, 9, 2], [855, 666, 12, 7, 9, 2], [855, 717, 12, 7, 9, 2], [855, 768, 12, 7, 9, 2]], \"capHeight\": 10, \"widestlogicalchar\": 9, \"widestglyph\": 13, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 10, 6, 10, 4], [1, 54, 10, 9, 10, 2], [1, 105, 10, 8, 10, 2], [1, 156, 10, 8, 10, 2], [1, 206, 10, 11, 10, 1], [1, 258, 10, 9, 10, 2], [1, 309, 10, 9, 10, 2], [1, 360, 10, 8, 10, 2], [1, 411, 10, 9, 10, 2], [1, 462, 10, 9, 10, 2], [1, 513, 10, 8, 10, 2], [1, 565, 10, 7, 10, 3], [1, 617, 10, 9, 10, 4], [1, 668, 10, 6, 10, 4], [1, 719, 10, 7, 10, 4], [1, 768, 10, 10, 10, 2], [62, 3, 10, 9, 10, 2], [62, 54, 10, 9, 10, 2], [62, 105, 10, 9, 10, 2], [62, 156, 10, 9, 10, 2], [62, 207, 10, 9, 10, 2], [62, 258, 10, 9, 10, 2], [62, 309, 10, 9, 10, 2], [62, 360, 10, 9, 10, 2], [62, 411, 10, 9, 10, 2], [62, 462, 10, 9, 10, 2], [62, 515, 10, 7, 10, 4], [62, 566, 10, 9, 10, 4], [62, 616, 10, 7, 10, 3], [62, 668, 10, 6, 10, 4], [62, 718, 10, 7, 10, 3], [62, 768, 10, 9, 10, 2], [123, 3, 10, 9, 10, 2], [123, 54, 10, 9, 10, 2], [123, 105, 10, 9, 10, 2], [123, 156, 10, 9, 10, 2], [123, 207, 10, 9, 10, 2], [123, 258, 10, 9, 10, 2], [123, 309, 10, 9, 10, 2], [123, 360, 10, 9, 10, 2], [123, 411, 10, 9, 10, 2], [123, 462, 10, 9, 10, 2], [123, 513, 10, 9, 10, 2], [123, 564, 10, 9, 10, 2], [123, 615, 10, 9, 10, 2], [123, 666, 10, 9, 10, 2], [123, 717, 10, 9, 10, 2], [123, 768, 10, 9, 10, 2], [184, 3, 10, 9, 10, 2], [184, 54, 10, 10, 10, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 10, 9, 10, 2], [184, 309, 10, 9, 10, 2], [184, 360, 10, 9, 10, 2], [184, 411, 10, 9, 10, 2], [184, 462, 10, 9, 10, 2], [184, 513, 10, 9, 10, 2], [184, 564, 10, 9, 10, 2], [184, 615, 10, 10, 10, 2], [184, 666, 10, 9, 10, 2], [184, 717, 10, 8, 10, 2], [184, 770, 10, 7, 10, 4], [245, 3, 10, 8, 10, 2], [245, 56, 10, 7, 10, 4], [245, 105, 10, 9, 10, 2], [245, 158, 10, 7, 10, 4], [245, 207, 10, 9, 10, 2], [245, 260, 10, 7, 10, 4], [245, 309, 10, 9, 10, 2], [245, 362, 10, 9, 10, 4], [245, 411, 10, 9, 10, 2], [245, 462, 10, 9, 10, 2], [245, 513, 10, 11, 10, 2], [245, 564, 10, 9, 10, 2], [245, 615, 10, 9, 10, 2], [245, 668, 10, 7, 10, 4], [245, 719, 10, 7, 10, 4], [245, 770, 10, 7, 10, 4], [306, 5, 10, 9, 10, 4], [306, 56, 10, 9, 10, 4], [306, 107, 10, 7, 10, 4], [306, 158, 10, 7, 10, 4], [306, 207, 10, 9, 10, 2], [306, 260, 10, 7, 10, 4], [306, 311, 10, 7, 10, 4], [306, 362, 10, 7, 10, 4], [306, 413, 10, 7, 10, 4], [306, 464, 10, 9, 10, 4], [306, 515, 10, 7, 10, 4], [306, 563, 10, 11, 10, 1], [306, 614, 10, 11, 10, 1], [306, 665, 10, 11, 10, 1], [306, 717, 10, 8, 10, 2], [306, 770, 3, 6, 3, 4], [367, 1, 10, 11, 10, 0], [367, 52, 10, 11, 10, 0], [367, 105, 10, 9, 10, 2], [367, 154, 10, 11, 10, 0], [367, 205, 10, 11, 10, 0], [367, 256, 10, 11, 10, 0], [367, 307, 10, 11, 10, 0], [367, 359, 10, 10, 10, 1], [367, 410, 10, 10, 10, 1], [367, 461, 10, 10, 10, 1], [367, 513, 10, 9, 10, 2], [367, 563, 10, 10, 10, 1], [367, 614, 10, 10, 10, 1], [367, 668, 10, 9, 10, 4], [367, 716, 10, 10, 10, 1], [367, 767, 10, 10, 10, 1], [428, 2, 10, 10, 10, 1], [428, 54, 10, 9, 10, 2], [428, 104, 10, 10, 10, 1], [428, 155, 10, 10, 10, 1], [428, 206, 10, 10, 10, 1], [428, 258, 10, 9, 10, 2], [428, 308, 10, 10, 10, 1], [428, 359, 10, 10, 10, 1], [428, 410, 10, 10, 10, 1], [428, 461, 10, 10, 10, 1], [428, 513, 10, 9, 10, 2], [428, 563, 10, 10, 10, 1], [428, 614, 10, 10, 10, 1], [428, 665, 10, 10, 10, 1], [428, 716, 10, 10, 10, 1], [428, 768, 10, 9, 10, 2], [489, 3, 10, 8, 10, 2], [489, 53, 10, 9, 10, 1], [489, 106, 10, 9, 10, 3], [489, 155, 10, 10, 10, 1], [489, 205, 10, 12, 10, 0], [489, 259, 10, 7, 10, 3], [489, 308, 10, 10, 10, 1], [489, 359, 10, 11, 10, 1], [489, 411, 10, 8, 10, 2], [489, 462, 10, 9, 10, 2], [489, 513, 10, 8, 10, 2], [489, 564, 10, 8, 10, 2], [489, 615, 10, 8, 10, 2], [489, 667, 10, 7, 10, 3], [489, 717, 10, 9, 10, 2], [489, 768, 10, 9, 10, 2], [550, 5, 10, 6, 10, 4], [550, 55, 10, 8, 10, 3], [550, 105, 10, 9, 10, 2], [550, 156, 10, 9, 10, 2], [550, 207, 10, 9, 10, 2], [550, 260, 10, 9, 10, 4], [550, 309, 10, 9, 10, 2], [550, 360, 10, 9, 10, 2], [550, 411, 10, 9, 10, 2], [550, 464, 10, 7, 10, 4], [550, 511, 10, 13, 10, 0], [550, 564, 10, 8, 10, 2], [550, 615, 10, 8, 10, 2], [550, 666, 10, 9, 10, 2], [550, 719, 10, 7, 10, 4], [550, 770, 10, 7, 10, 4], [611, 3, 10, 9, 10, 2], [611, 54, 10, 9, 10, 2], [611, 107, 10, 6, 10, 4], [611, 157, 10, 8, 10, 3], [611, 205, 10, 13, 10, 0], [611, 259, 10, 7, 10, 3], [611, 310, 10, 8, 10, 3], [611, 362, 10, 7, 10, 4], [611, 413, 10, 7, 10, 4], [611, 464, 10, 7, 10, 4], [611, 515, 10, 6, 10, 4], [611, 562, 10, 11, 10, 0], [611, 613, 10, 11, 10, 0], [611, 664, 10, 11, 10, 0], [611, 717, 10, 9, 10, 2], [611, 770, 10, 7, 10, 4], [672, 5, 10, 6, 10, 4], [672, 56, 10, 6, 10, 4], [672, 105, 10, 8, 10, 2], [672, 156, 10, 8, 10, 2], [672, 207, 10, 8, 10, 2], [672, 258, 10, 8, 10, 2], [672, 310, 10, 7, 10, 3], [672, 361, 10, 7, 10, 3], [672, 411, 10, 11, 10, 2], [1, 5, 10, 6, 10, 4], [794, 768, 10, 9, 10, 2], [672, 564, 10, 9, 10, 2], [672, 615, 10, 9, 10, 2], [672, 666, 10, 9, 10, 2], [672, 717, 10, 9, 10, 2], [672, 768, 10, 9, 10, 2], [733, 3, 10, 9, 10, 2], [733, 54, 10, 9, 10, 2], [733, 105, 10, 9, 10, 2], [733, 156, 10, 9, 10, 2], [733, 207, 10, 9, 10, 2], [733, 258, 10, 9, 10, 2], [733, 309, 10, 9, 10, 2], [733, 360, 10, 9, 10, 2], [733, 411, 10, 9, 10, 2], [733, 462, 10, 9, 10, 2], [733, 513, 10, 9, 10, 2], [733, 564, 10, 9, 10, 2], [733, 615, 10, 9, 10, 2], [733, 666, 10, 9, 10, 2], [733, 717, 10, 9, 10, 2], [733, 768, 10, 9, 10, 2], [1, 5, 10, 6, 10, 4], [794, 54, 10, 9, 10, 2], [794, 105, 10, 9, 10, 2], [794, 156, 10, 9, 10, 2], [794, 207, 10, 9, 10, 2], [794, 258, 10, 9, 10, 2], [794, 309, 10, 9, 10, 2], [794, 360, 10, 9, 10, 2], [794, 411, 10, 9, 10, 2], [794, 462, 10, 9, 10, 2], [794, 513, 10, 9, 10, 2], [794, 564, 10, 9, 10, 2], [794, 615, 10, 9, 10, 2], [794, 666, 10, 9, 10, 2], [794, 717, 10, 9, 10, 2], [794, 768, 10, 9, 10, 2], [855, 3, 10, 9, 10, 2], [855, 54, 10, 9, 10, 2], [855, 105, 10, 9, 10, 2], [855, 156, 10, 9, 10, 2], [855, 207, 10, 9, 10, 2], [855, 258, 10, 9, 10, 2], [855, 309, 10, 9, 10, 2], [855, 360, 10, 9, 10, 2], [855, 411, 10, 9, 10, 2], [855, 462, 10, 9, 10, 2], [855, 513, 10, 9, 10, 2], [855, 564, 10, 9, 10, 2], [855, 615, 10, 9, 10, 2], [855, 666, 10, 9, 10, 2], [855, 717, 10, 9, 10, 2], [855, 768, 10, 9, 10, 2]], \"widestlogicalchar\": 10, \"widestglyph\": 10, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/06_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 9, 6, 9, 4], [1, 55, 9, 7, 9, 3], [1, 106, 9, 7, 9, 3], [1, 157, 9, 7, 9, 3], [1, 207, 9, 9, 9, 2], [1, 259, 9, 7, 9, 3], [1, 310, 9, 7, 9, 3], [1, 361, 9, 7, 9, 3], [1, 412, 9, 7, 9, 3], [1, 463, 9, 7, 9, 3], [1, 514, 9, 7, 9, 3], [1, 566, 9, 6, 9, 4], [1, 617, 9, 8, 9, 4], [1, 668, 9, 6, 9, 4], [1, 719, 9, 6, 9, 4], [1, 769, 9, 8, 9, 3], [62, 4, 9, 7, 9, 3], [62, 55, 9, 7, 9, 3], [62, 106, 9, 7, 9, 3], [62, 157, 9, 7, 9, 3], [62, 208, 9, 7, 9, 3], [62, 259, 9, 7, 9, 3], [62, 310, 9, 7, 9, 3], [62, 361, 9, 7, 9, 3], [62, 412, 9, 7, 9, 3], [62, 463, 9, 7, 9, 3], [62, 515, 9, 6, 9, 4], [62, 566, 9, 8, 9, 4], [62, 617, 9, 6, 9, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 769, 9, 7, 9, 3], [123, 4, 9, 7, 9, 3], [123, 55, 9, 7, 9, 3], [123, 106, 9, 7, 9, 3], [123, 157, 9, 7, 9, 3], [123, 208, 9, 7, 9, 3], [123, 259, 9, 7, 9, 3], [123, 310, 9, 7, 9, 3], [123, 361, 9, 7, 9, 3], [123, 412, 9, 7, 9, 3], [123, 463, 9, 7, 9, 3], [123, 514, 9, 7, 9, 3], [123, 565, 9, 7, 9, 3], [123, 616, 9, 7, 9, 3], [123, 667, 9, 7, 9, 3], [123, 718, 9, 7, 9, 3], [123, 769, 9, 7, 9, 3], [184, 4, 9, 7, 9, 3], [184, 55, 9, 8, 9, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 9, 7, 9, 3], [184, 310, 9, 7, 9, 3], [184, 361, 9, 7, 9, 3], [184, 412, 9, 7, 9, 3], [184, 463, 9, 7, 9, 3], [184, 514, 9, 7, 9, 3], [184, 565, 9, 7, 9, 3], [184, 616, 9, 8, 9, 3], [184, 667, 9, 7, 9, 3], [184, 718, 9, 7, 9, 3], [184, 770, 9, 6, 9, 4], [245, 4, 9, 7, 9, 3], [245, 56, 9, 6, 9, 4], [245, 106, 9, 7, 9, 3], [245, 158, 9, 6, 9, 4], [245, 208, 9, 7, 9, 3], [245, 260, 9, 6, 9, 4], [245, 310, 9, 7, 9, 3], [245, 362, 9, 8, 9, 4], [245, 412, 9, 7, 9, 3], [245, 463, 9, 7, 9, 3], [245, 514, 9, 9, 9, 3], [245, 565, 9, 7, 9, 3], [245, 616, 9, 7, 9, 3], [245, 668, 9, 6, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 9, 6, 9, 4], [306, 5, 9, 8, 9, 4], [306, 56, 9, 8, 9, 4], [306, 107, 9, 6, 9, 4], [306, 158, 9, 6, 9, 4], [306, 208, 9, 7, 9, 3], [306, 260, 9, 6, 9, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 413, 9, 6, 9, 4], [306, 464, 9, 8, 9, 4], [306, 515, 9, 6, 9, 4], [306, 564, 9, 9, 9, 2], [306, 615, 9, 9, 9, 2], [306, 666, 9, 9, 9, 2], [306, 718, 9, 7, 9, 3], [306, 770, 3, 6, 3, 4], [367, 2, 9, 9, 9, 1], [367, 53, 9, 9, 9, 1], [367, 106, 9, 7, 9, 3], [367, 155, 9, 9, 9, 1], [367, 206, 9, 9, 9, 1], [367, 257, 9, 9, 9, 1], [367, 308, 9, 9, 9, 1], [367, 360, 9, 8, 9, 2], [367, 411, 9, 8, 9, 2], [367, 462, 9, 8, 9, 2], [367, 514, 9, 7, 9, 3], [367, 564, 9, 8, 9, 2], [367, 615, 9, 8, 9, 2], [367, 668, 9, 8, 9, 4], [367, 717, 9, 8, 9, 2], [367, 768, 9, 8, 9, 2], [428, 3, 9, 8, 9, 2], [428, 55, 9, 7, 9, 3], [428, 105, 9, 8, 9, 2], [428, 156, 9, 8, 9, 2], [428, 207, 9, 8, 9, 2], [428, 259, 9, 7, 9, 3], [428, 309, 9, 8, 9, 2], [428, 360, 9, 8, 9, 2], [428, 411, 9, 8, 9, 2], [428, 462, 9, 8, 9, 2], [428, 514, 9, 7, 9, 3], [428, 564, 9, 8, 9, 2], [428, 615, 9, 8, 9, 2], [428, 666, 9, 8, 9, 2], [428, 717, 9, 8, 9, 2], [428, 769, 9, 7, 9, 3], [489, 4, 9, 7, 9, 3], [489, 54, 9, 8, 9, 2], [489, 107, 9, 7, 9, 4], [489, 156, 9, 8, 9, 2], [489, 206, 9, 10, 9, 1], [489, 260, 9, 6, 9, 4], [489, 309, 9, 8, 9, 2], [489, 360, 9, 9, 9, 2], [489, 412, 9, 7, 9, 3], [489, 463, 9, 7, 9, 3], [489, 514, 9, 7, 9, 3], [489, 565, 9, 7, 9, 3], [489, 616, 9, 7, 9, 3], [489, 668, 9, 6, 9, 4], [489, 718, 9, 7, 9, 3], [489, 769, 9, 7, 9, 3], [550, 5, 9, 6, 9, 4], [550, 56, 9, 6, 9, 4], [550, 106, 9, 7, 9, 3], [550, 157, 9, 7, 9, 3], [550, 208, 9, 7, 9, 3], [550, 260, 9, 8, 9, 4], [550, 310, 9, 7, 9, 3], [550, 361, 9, 7, 9, 3], [550, 412, 9, 7, 9, 3], [550, 464, 9, 6, 9, 4], [550, 512, 9, 11, 9, 1], [550, 565, 9, 7, 9, 3], [550, 616, 9, 7, 9, 3], [550, 667, 9, 7, 9, 3], [550, 719, 9, 6, 9, 4], [550, 770, 9, 6, 9, 4], [611, 4, 9, 7, 9, 3], [611, 55, 9, 7, 9, 3], [611, 107, 9, 6, 9, 4], [611, 158, 9, 6, 9, 4], [611, 206, 9, 11, 9, 1], [611, 260, 9, 6, 9, 4], [611, 311, 9, 6, 9, 4], [611, 362, 9, 6, 9, 4], [611, 413, 9, 6, 9, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 6, 9, 4], [611, 563, 9, 9, 9, 1], [611, 614, 9, 9, 9, 1], [611, 665, 9, 9, 9, 1], [611, 718, 9, 7, 9, 3], [611, 770, 9, 6, 9, 4], [672, 5, 9, 6, 9, 4], [672, 56, 9, 6, 9, 4], [672, 106, 9, 7, 9, 3], [672, 157, 9, 7, 9, 3], [672, 208, 9, 7, 9, 3], [672, 259, 9, 7, 9, 3], [672, 311, 9, 6, 9, 4], [672, 362, 9, 6, 9, 4], [672, 412, 9, 9, 9, 3], [1, 5, 9, 6, 9, 4], [794, 769, 9, 7, 9, 3], [672, 565, 9, 7, 9, 3], [672, 616, 9, 7, 9, 3], [672, 667, 9, 7, 9, 3], [672, 718, 9, 7, 9, 3], [672, 769, 9, 7, 9, 3], [733, 4, 9, 7, 9, 3], [733, 55, 9, 7, 9, 3], [733, 106, 9, 7, 9, 3], [733, 157, 9, 7, 9, 3], [733, 208, 9, 7, 9, 3], [733, 259, 9, 7, 9, 3], [733, 310, 9, 7, 9, 3], [733, 361, 9, 7, 9, 3], [733, 412, 9, 7, 9, 3], [733, 463, 9, 7, 9, 3], [733, 514, 9, 7, 9, 3], [733, 565, 9, 7, 9, 3], [733, 616, 9, 7, 9, 3], [733, 667, 9, 7, 9, 3], [733, 718, 9, 7, 9, 3], [733, 769, 9, 7, 9, 3], [1, 5, 9, 6, 9, 4], [794, 55, 9, 7, 9, 3], [794, 106, 9, 7, 9, 3], [794, 157, 9, 7, 9, 3], [794, 208, 9, 7, 9, 3], [794, 259, 9, 7, 9, 3], [794, 310, 9, 7, 9, 3], [794, 361, 9, 7, 9, 3], [794, 412, 9, 7, 9, 3], [794, 463, 9, 7, 9, 3], [794, 514, 9, 7, 9, 3], [794, 565, 9, 7, 9, 3], [794, 616, 9, 7, 9, 3], [794, 667, 9, 7, 9, 3], [794, 718, 9, 7, 9, 3], [794, 769, 9, 7, 9, 3], [855, 4, 9, 7, 9, 3], [855, 55, 9, 7, 9, 3], [855, 106, 9, 7, 9, 3], [855, 157, 9, 7, 9, 3], [855, 208, 9, 7, 9, 3], [855, 259, 9, 7, 9, 3], [855, 310, 9, 7, 9, 3], [855, 361, 9, 7, 9, 3], [855, 412, 9, 7, 9, 3], [855, 463, 9, 7, 9, 3], [855, 514, 9, 7, 9, 3], [855, 565, 9, 7, 9, 3], [855, 616, 9, 7, 9, 3], [855, 667, 9, 7, 9, 3], [855, 718, 9, 7, 9, 3], [855, 769, 9, 7, 9, 3]], \"widestlogicalchar\": 9, \"widestglyph\": 9, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 11, 9, 7, 2], [1, 105, 16, 9, 11, 2], [1, 156, 13, 9, 9, 2], [1, 207, 14, 9, 10, 2], [1, 258, 15, 9, 12, 2], [1, 309, 13, 9, 11, 2], [1, 362, 11, 7, 9, 4], [1, 411, 12, 11, 8, 2], [1, 462, 11, 11, 8, 2], [1, 515, 12, 5, 9, 4], [1, 566, 12, 7, 10, 4], [1, 621, 8, 5, 6, 8], [1, 670, 12, 3, 10, 6], [1, 723, 8, 3, 6, 8], [1, 768, 12, 9, 7, 2], [62, 3, 12, 9, 9, 2], [62, 54, 12, 9, 9, 2], [62, 105, 12, 9, 9, 2], [62, 156, 12, 9, 9, 2], [62, 207, 13, 9, 9, 2], [62, 258, 13, 9, 9, 2], [62, 309, 13, 9, 9, 2], [62, 360, 13, 9, 9, 2], [62, 411, 12, 9, 9, 2], [62, 462, 12, 9, 9, 2], [62, 515, 10, 7, 6, 4], [62, 566, 10, 9, 6, 4], [62, 617, 14, 7, 11, 4], [62, 669, 12, 5, 10, 5], [62, 719, 13, 7, 10, 4], [62, 768, 13, 9, 9, 2], [123, 4, 13, 8, 10, 3], [123, 54, 13, 9, 12, 2], [123, 105, 13, 9, 10, 2], [123, 156, 16, 9, 12, 2], [123, 207, 13, 9, 11, 2], [123, 258, 14, 9, 10, 2], [123, 309, 14, 9, 12, 2], [123, 360, 14, 9, 10, 2], [123, 411, 16, 9, 12, 2], [123, 462, 12, 9, 7, 2], [123, 513, 13, 9, 11, 2], [123, 564, 15, 9, 11, 2], [123, 615, 13, 9, 11, 2], [123, 666, 18, 9, 14, 2], [123, 717, 16, 9, 12, 2], [123, 768, 14, 9, 11, 2], [184, 3, 16, 9, 12, 2], [184, 54, 14, 9, 11, 2], [184, 105, 13, 9, 10, 2], [184, 156, 14, 9, 10, 2], [184, 207, 14, 9, 10, 2], [184, 258, 16, 9, 12, 2], [184, 311, 12, 9, 9, 4], [184, 360, 15, 9, 13, 2], [184, 411, 14, 9, 11, 2], [184, 462, 18, 9, 13, 2], [184, 513, 14, 9, 10, 2], [184, 564, 11, 11, 7, 2], [184, 617, 12, 7, 11, 4], [184, 666, 12, 11, 7, 2], [184, 717, 13, 9, 11, 2], [184, 776, 10, 3, 9, 10], [245, 1, 14, 3, 9, 0], [245, 56, 13, 7, 11, 4], [245, 104, 13, 12, 9, 1], [245, 158, 13, 9, 10, 4], [245, 206, 13, 10, 9, 1], [245, 260, 11, 7, 9, 4], [245, 309, 12, 11, 10, 2], [245, 362, 13, 9, 10, 4], [245, 413, 13, 9, 10, 4], [245, 464, 10, 7, 8, 4], [245, 515, 12, 9, 10, 4], [245, 566, 13, 7, 10, 4], [245, 614, 12, 10, 10, 1], [245, 668, 12, 9, 10, 4], [245, 719, 13, 7, 10, 4], [245, 770, 11, 7, 9, 4], [306, 5, 13, 7, 10, 4], [306, 54, 12, 9, 9, 2], [306, 107, 11, 9, 9, 4], [306, 158, 13, 7, 10, 4], [306, 209, 12, 7, 9, 4], [306, 260, 12, 7, 10, 4], [306, 310, 15, 8, 12, 3], [306, 362, 14, 7, 12, 4], [306, 410, 13, 12, 9, 1], [306, 464, 15, 9, 11, 4], [306, 512, 13, 12, 9, 1], [306, 564, 13, 11, 9, 2], [306, 615, 10, 11, 6, 2], [306, 666, 11, 11, 9, 2], [306, 720, 12, 4, 10, 5], [306, 766, 1, 1, 3, 1], [367, 1, 1, 1, 3, 1], [367, 52, 1, 1, 3, 1], [367, 103, 1, 1, 3, 1], [367, 154, 1, 1, 3, 1], [367, 205, 1, 1, 3, 1], [367, 256, 1, 1, 3, 1], [367, 307, 1, 1, 3, 1], [367, 358, 1, 1, 3, 1], [367, 409, 1, 1, 3, 1], [367, 460, 1, 1, 3, 1], [367, 511, 1, 1, 3, 1], [367, 562, 1, 1, 3, 1], [367, 613, 1, 1, 3, 1], [367, 664, 1, 1, 3, 1], [367, 715, 1, 1, 3, 1], [367, 766, 1, 1, 3, 1], [428, 1, 1, 1, 3, 1], [428, 52, 1, 1, 3, 1], [428, 103, 1, 1, 3, 1], [428, 154, 1, 1, 3, 1], [428, 205, 1, 1, 3, 1], [428, 256, 1, 1, 3, 1], [428, 307, 1, 1, 3, 1], [428, 358, 1, 1, 3, 1], [428, 409, 1, 1, 3, 1], [428, 460, 1, 1, 3, 1], [428, 511, 1, 1, 3, 1], [428, 562, 1, 1, 3, 1], [428, 613, 1, 1, 3, 1], [428, 664, 1, 1, 3, 1], [428, 715, 1, 1, 3, 1], [428, 766, 1, 1, 3, 1], [489, 1, 1, 1, 3, 1], [489, 54, 15, 9, 11, 2], [489, 104, 12, 5, 7, 1], [489, 156, 14, 9, 10, 2], [489, 207, 12, 9, 7, 2], [489, 261, 14, 5, 11, 5], [489, 309, 14, 11, 9, 2], [489, 362, 13, 7, 11, 4], [489, 413, 13, 7, 11, 4], [489, 464, 14, 7, 11, 4], [489, 515, 13, 7, 11, 4], [489, 566, 17, 7, 14, 4], [489, 617, 17, 7, 14, 4], [489, 664, 14, 13, 10, 0], [489, 719, 17, 7, 14, 4], [489, 766, 13, 13, 10, 0], [550, 3, 12, 6, 8, 2], [550, 54, 13, 9, 10, 2], [550, 104, 13, 5, 8, 1], [550, 156, 13, 9, 10, 2], [550, 209, 13, 7, 10, 4], [550, 261, 13, 5, 11, 5], [550, 308, 13, 10, 9, 1], [550, 363, 11, 5, 9, 5], [550, 413, 12, 7, 10, 4], [550, 464, 12, 7, 10, 4], [550, 514, 13, 7, 10, 3], [550, 566, 13, 7, 10, 4], [550, 621, 14, 3, 13, 8], [550, 664, 13, 13, 10, 0], [550, 721, 17, 3, 14, 6], [550, 769, 14, 8, 11, 3], [611, 3, 15, 9, 12, 2], [611, 53, 15, 11, 11, 1], [611, 104, 16, 10, 12, 1], [611, 157, 15, 10, 13, 3], [611, 207, 15, 9, 12, 2], [611, 258, 15, 9, 12, 2], [611, 308, 16, 11, 12, 1], [611, 362, 14, 7, 12, 4], [611, 413, 15, 7, 12, 4], [611, 464, 14, 7, 11, 4], [611, 511, 1, 1, 11, 1], [611, 565, 15, 9, 11, 3], [611, 617, 15, 7, 11, 4], [611, 668, 15, 9, 11, 4], [611, 719, 14, 7, 11, 4], [611, 769, 14, 9, 11, 3], [672, 3, 16, 9, 12, 2], [672, 54, 15, 9, 11, 2], [672, 105, 15, 10, 12, 2], [672, 156, 15, 10, 12, 2], [672, 207, 17, 7, 14, 2], [672, 257, 17, 11, 13, 1], [672, 307, 15, 11, 10, 0], [672, 364, 9, 3, 7, 6], [672, 415, 13, 5, 11, 6], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 566, 17, 7, 15, 4], [672, 617, 16, 7, 14, 4], [672, 664, 14, 11, 10, 0], [672, 719, 17, 7, 14, 4], [672, 766, 14, 11, 10, 0], [733, 3, 14, 9, 11, 2], [733, 54, 12, 11, 7, 2], [733, 105, 15, 10, 12, 2], [733, 156, 15, 10, 12, 2], [733, 207, 16, 7, 13, 2], [733, 257, 15, 11, 11, 1], [733, 307, 13, 13, 8, 0], [733, 358, 12, 13, 8, 0], [733, 409, 12, 13, 8, 0], [733, 460, 13, 13, 8, 0], [733, 511, 12, 13, 8, 0], [733, 562, 12, 13, 8, 0], [733, 613, 14, 13, 9, 0], [733, 664, 13, 13, 9, 0], [733, 715, 13, 13, 9, 0], [733, 766, 13, 13, 9, 0], [1, 1, 1, 1, 7, 1], [794, 54, 10, 11, 7, 2], [794, 103, 12, 13, 7, 0], [794, 154, 16, 13, 11, 0], [794, 205, 14, 13, 11, 0], [794, 256, 14, 13, 11, 0], [794, 307, 11, 13, 8, 0], [794, 358, 13, 13, 8, 0], [794, 409, 13, 13, 8, 0], [794, 460, 13, 13, 8, 0], [794, 511, 13, 13, 8, 0], [794, 562, 13, 13, 8, 0], [794, 613, 12, 13, 9, 0], [794, 664, 13, 13, 9, 0], [794, 715, 13, 13, 9, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 18, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 10, 7, 6, 2], [1, 105, 15, 7, 10, 2], [1, 156, 12, 7, 8, 2], [1, 207, 13, 7, 9, 2], [1, 258, 14, 7, 11, 2], [1, 309, 12, 7, 10, 2], [1, 362, 10, 5, 8, 4], [1, 411, 11, 9, 7, 2], [1, 462, 10, 9, 7, 2], [1, 515, 11, 3, 8, 4], [1, 566, 11, 5, 9, 4], [1, 621, 7, 3, 5, 8], [1, 670, 11, 1, 9, 6], [1, 723, 7, 1, 5, 8], [1, 768, 11, 7, 6, 2], [62, 3, 11, 7, 8, 2], [62, 54, 11, 7, 8, 2], [62, 105, 11, 7, 8, 2], [62, 156, 11, 7, 8, 2], [62, 207, 12, 7, 8, 2], [62, 258, 12, 7, 8, 2], [62, 309, 12, 7, 8, 2], [62, 360, 12, 7, 8, 2], [62, 411, 11, 7, 8, 2], [62, 462, 11, 7, 8, 2], [62, 515, 9, 5, 5, 4], [62, 566, 9, 7, 5, 4], [62, 617, 13, 5, 10, 4], [62, 669, 11, 3, 9, 5], [62, 719, 12, 5, 9, 4], [62, 768, 12, 7, 8, 2], [123, 4, 12, 6, 9, 3], [123, 54, 12, 7, 11, 2], [123, 105, 12, 7, 9, 2], [123, 156, 15, 7, 11, 2], [123, 207, 12, 7, 10, 2], [123, 258, 13, 7, 9, 2], [123, 309, 13, 7, 11, 2], [123, 360, 13, 7, 9, 2], [123, 411, 15, 7, 11, 2], [123, 462, 11, 7, 6, 2], [123, 513, 12, 7, 10, 2], [123, 564, 14, 7, 10, 2], [123, 615, 12, 7, 10, 2], [123, 666, 17, 7, 13, 2], [123, 717, 15, 7, 11, 2], [123, 768, 13, 7, 10, 2], [184, 3, 15, 7, 11, 2], [184, 54, 13, 7, 10, 2], [184, 105, 12, 7, 9, 2], [184, 156, 13, 7, 9, 2], [184, 207, 13, 7, 9, 2], [184, 258, 15, 7, 11, 2], [184, 311, 11, 7, 8, 4], [184, 360, 14, 7, 12, 2], [184, 411, 13, 7, 10, 2], [184, 462, 17, 7, 12, 2], [184, 513, 13, 7, 9, 2], [184, 564, 10, 9, 6, 2], [184, 617, 11, 5, 10, 4], [184, 666, 11, 9, 6, 2], [184, 717, 12, 7, 10, 2], [184, 776, 9, 1, 8, 10], [245, 1, 1, 1, 8, 1], [245, 56, 12, 5, 10, 4], [245, 104, 12, 10, 8, 1], [245, 158, 12, 7, 9, 4], [245, 206, 12, 8, 8, 1], [245, 260, 10, 5, 8, 4], [245, 309, 11, 9, 9, 2], [245, 362, 12, 7, 9, 4], [245, 413, 12, 7, 9, 4], [245, 464, 9, 5, 7, 4], [245, 515, 11, 7, 9, 4], [245, 566, 12, 5, 9, 4], [245, 614, 11, 8, 9, 1], [245, 668, 11, 7, 9, 4], [245, 719, 12, 5, 9, 4], [245, 770, 10, 5, 8, 4], [306, 5, 12, 5, 9, 4], [306, 54, 11, 7, 8, 2], [306, 107, 10, 7, 8, 4], [306, 158, 12, 5, 9, 4], [306, 209, 11, 5, 8, 4], [306, 260, 11, 5, 9, 4], [306, 310, 14, 6, 11, 3], [306, 362, 13, 5, 11, 4], [306, 410, 12, 10, 8, 1], [306, 464, 14, 7, 10, 4], [306, 512, 12, 10, 8, 1], [306, 564, 12, 9, 8, 2], [306, 615, 9, 9, 5, 2], [306, 666, 10, 9, 8, 2], [306, 720, 11, 2, 9, 5], [306, 766, 1, 1, 3, 1], [367, 1, 1, 1, 3, 1], [367, 52, 1, 1, 3, 1], [367, 103, 1, 1, 3, 1], [367, 154, 1, 1, 3, 1], [367, 205, 1, 1, 3, 1], [367, 256, 1, 1, 3, 1], [367, 307, 1, 1, 3, 1], [367, 358, 1, 1, 3, 1], [367, 409, 1, 1, 3, 1], [367, 460, 1, 1, 3, 1], [367, 511, 1, 1, 3, 1], [367, 562, 1, 1, 3, 1], [367, 613, 1, 1, 3, 1], [367, 664, 1, 1, 3, 1], [367, 715, 1, 1, 3, 1], [367, 766, 1, 1, 3, 1], [428, 1, 1, 1, 3, 1], [428, 52, 1, 1, 3, 1], [428, 103, 1, 1, 3, 1], [428, 154, 1, 1, 3, 1], [428, 205, 1, 1, 3, 1], [428, 256, 1, 1, 3, 1], [428, 307, 1, 1, 3, 1], [428, 358, 1, 1, 3, 1], [428, 409, 1, 1, 3, 1], [428, 460, 1, 1, 3, 1], [428, 511, 1, 1, 3, 1], [428, 562, 1, 1, 3, 1], [428, 613, 1, 1, 3, 1], [428, 664, 1, 1, 3, 1], [428, 715, 1, 1, 3, 1], [428, 766, 1, 1, 3, 1], [489, 1, 1, 1, 3, 1], [489, 54, 14, 7, 10, 2], [489, 104, 11, 3, 6, 1], [489, 156, 13, 7, 9, 2], [489, 207, 11, 7, 6, 2], [489, 261, 13, 3, 10, 5], [489, 309, 13, 9, 8, 2], [489, 362, 12, 5, 10, 4], [489, 413, 12, 5, 10, 4], [489, 464, 13, 5, 10, 4], [489, 515, 12, 5, 10, 4], [489, 566, 16, 5, 13, 4], [489, 617, 16, 5, 13, 4], [489, 664, 13, 11, 9, 0], [489, 719, 16, 5, 13, 4], [489, 766, 11, 11, 9, 0], [550, 3, 11, 4, 7, 2], [550, 54, 12, 7, 9, 2], [550, 104, 12, 3, 7, 1], [550, 156, 12, 7, 9, 2], [550, 209, 12, 5, 9, 4], [550, 261, 12, 3, 10, 5], [550, 308, 12, 8, 8, 1], [550, 363, 10, 3, 8, 5], [550, 413, 11, 5, 9, 4], [550, 464, 11, 5, 9, 4], [550, 514, 12, 5, 9, 3], [550, 566, 12, 5, 9, 4], [550, 621, 13, 1, 12, 8], [550, 664, 11, 11, 9, 0], [550, 721, 16, 1, 13, 6], [550, 769, 13, 6, 10, 3], [611, 3, 14, 7, 11, 2], [611, 53, 14, 9, 10, 1], [611, 104, 15, 8, 11, 1], [611, 157, 14, 8, 12, 3], [611, 207, 14, 7, 11, 2], [611, 258, 14, 7, 11, 2], [611, 308, 15, 9, 11, 1], [611, 362, 13, 5, 11, 4], [611, 413, 14, 5, 11, 4], [611, 464, 13, 5, 10, 4], [611, 511, 1, 1, 10, 1], [611, 565, 14, 7, 10, 3], [611, 617, 14, 5, 10, 4], [611, 668, 14, 7, 10, 4], [611, 719, 13, 5, 10, 4], [611, 769, 13, 7, 10, 3], [672, 3, 15, 7, 11, 2], [672, 54, 14, 7, 10, 2], [672, 105, 14, 8, 11, 2], [672, 156, 14, 8, 11, 2], [672, 207, 16, 5, 13, 2], [672, 257, 16, 9, 12, 1], [672, 307, 14, 9, 9, 0], [672, 364, 8, 1, 6, 6], [672, 415, 12, 3, 10, 6], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 566, 16, 5, 14, 4], [672, 617, 15, 5, 13, 4], [672, 664, 13, 9, 9, 0], [672, 719, 16, 5, 13, 4], [672, 766, 12, 9, 9, 0], [733, 3, 13, 7, 10, 2], [733, 54, 11, 9, 6, 2], [733, 105, 14, 8, 11, 2], [733, 156, 14, 8, 11, 2], [733, 207, 15, 5, 12, 2], [733, 257, 14, 9, 10, 1], [733, 307, 11, 11, 7, 0], [733, 358, 10, 11, 7, 0], [733, 409, 10, 11, 7, 0], [733, 460, 10, 11, 7, 0], [733, 511, 10, 11, 7, 0], [733, 562, 10, 11, 7, 0], [733, 613, 11, 11, 8, 0], [733, 664, 11, 11, 8, 0], [733, 715, 11, 11, 8, 0], [733, 766, 11, 11, 8, 0], [1, 1, 1, 1, 6, 1], [794, 54, 9, 9, 6, 2], [794, 103, 10, 11, 6, 0], [794, 154, 15, 11, 10, 0], [794, 205, 12, 11, 10, 0], [794, 256, 12, 11, 10, 0], [794, 307, 10, 11, 7, 0], [794, 358, 11, 11, 7, 0], [794, 409, 11, 11, 7, 0], [794, 460, 11, 11, 7, 0], [794, 511, 11, 11, 7, 0], [794, 562, 11, 11, 7, 0], [794, 613, 11, 11, 8, 0], [794, 664, 11, 11, 8, 0], [794, 715, 11, 11, 8, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 17, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 1, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 7, 9, 7, 2], [1, 105, 11, 9, 11, 2], [1, 156, 9, 9, 9, 2], [1, 207, 10, 9, 10, 2], [1, 258, 12, 9, 12, 2], [1, 309, 11, 9, 11, 2], [1, 362, 9, 7, 9, 4], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 515, 9, 6, 9, 4], [1, 566, 10, 7, 10, 4], [1, 617, 6, 9, 6, 4], [1, 668, 10, 6, 10, 4], [1, 719, 6, 7, 6, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 6, 7, 6, 4], [62, 566, 6, 9, 6, 4], [62, 617, 11, 7, 11, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 7, 10, 4], [62, 768, 9, 9, 9, 2], [123, 4, 10, 8, 10, 3], [123, 54, 12, 9, 12, 2], [123, 105, 10, 9, 10, 2], [123, 156, 12, 9, 12, 2], [123, 207, 11, 9, 11, 2], [123, 258, 10, 9, 10, 2], [123, 309, 12, 9, 12, 2], [123, 360, 10, 9, 10, 2], [123, 411, 12, 9, 12, 2], [123, 462, 7, 9, 7, 2], [123, 513, 11, 9, 11, 2], [123, 564, 11, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 14, 9, 14, 2], [123, 717, 12, 9, 12, 2], [123, 768, 11, 9, 11, 2], [184, 3, 12, 9, 12, 2], [184, 54, 11, 9, 11, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 12, 9, 12, 2], [184, 311, 9, 9, 9, 4], [184, 360, 13, 9, 13, 2], [184, 411, 11, 9, 11, 2], [184, 462, 13, 9, 13, 2], [184, 513, 10, 9, 10, 2], [184, 564, 7, 11, 7, 2], [184, 617, 11, 7, 11, 4], [184, 666, 7, 11, 7, 2], [184, 717, 11, 9, 11, 2], [184, 770, 9, 9, 9, 4], [245, 1, 9, 10, 9, 0], [245, 56, 11, 7, 11, 4], [245, 104, 9, 12, 9, 1], [245, 158, 10, 9, 10, 4], [245, 206, 9, 10, 9, 1], [245, 260, 9, 7, 9, 4], [245, 309, 10, 11, 10, 2], [245, 362, 10, 9, 10, 4], [245, 413, 10, 9, 10, 4], [245, 464, 8, 7, 8, 4], [245, 515, 10, 9, 10, 4], [245, 566, 10, 7, 10, 4], [245, 614, 10, 10, 10, 1], [245, 668, 10, 9, 10, 4], [245, 719, 10, 7, 10, 4], [245, 770, 9, 7, 9, 4], [306, 5, 10, 7, 10, 4], [306, 54, 9, 9, 9, 2], [306, 107, 9, 9, 9, 4], [306, 158, 10, 7, 10, 4], [306, 209, 9, 7, 9, 4], [306, 260, 10, 7, 10, 4], [306, 310, 12, 8, 12, 3], [306, 362, 12, 7, 12, 4], [306, 410, 9, 12, 9, 1], [306, 464, 11, 9, 11, 4], [306, 512, 9, 12, 9, 1], [306, 564, 9, 11, 9, 2], [306, 615, 6, 11, 6, 2], [306, 666, 9, 11, 9, 2], [306, 719, 10, 6, 10, 4], [306, 770, 3, 6, 3, 4], [367, 5, 3, 6, 3, 4], [367, 56, 3, 6, 3, 4], [367, 107, 3, 6, 3, 4], [367, 158, 3, 6, 3, 4], [367, 209, 3, 6, 3, 4], [367, 260, 3, 6, 3, 4], [367, 311, 3, 6, 3, 4], [367, 362, 3, 6, 3, 4], [367, 413, 3, 6, 3, 4], [367, 464, 3, 6, 3, 4], [367, 515, 3, 6, 3, 4], [367, 566, 3, 6, 3, 4], [367, 617, 3, 6, 3, 4], [367, 668, 3, 6, 3, 4], [367, 719, 3, 6, 3, 4], [367, 770, 3, 6, 3, 4], [428, 5, 3, 6, 3, 4], [428, 56, 3, 6, 3, 4], [428, 107, 3, 6, 3, 4], [428, 158, 3, 6, 3, 4], [428, 209, 3, 6, 3, 4], [428, 260, 3, 6, 3, 4], [428, 311, 3, 6, 3, 4], [428, 362, 3, 6, 3, 4], [428, 413, 3, 6, 3, 4], [428, 464, 3, 6, 3, 4], [428, 515, 3, 6, 3, 4], [428, 566, 3, 6, 3, 4], [428, 617, 3, 6, 3, 4], [428, 668, 3, 6, 3, 4], [428, 719, 3, 6, 3, 4], [428, 770, 3, 6, 3, 4], [489, 5, 3, 6, 3, 4], [489, 54, 11, 9, 11, 2], [489, 104, 7, 9, 7, 1], [489, 156, 10, 9, 10, 2], [489, 207, 7, 9, 7, 2], [489, 260, 11, 6, 11, 4], [489, 309, 9, 11, 9, 2], [489, 362, 11, 7, 11, 4], [489, 413, 11, 7, 11, 4], [489, 464, 11, 7, 11, 4], [489, 515, 11, 7, 11, 4], [489, 566, 14, 7, 14, 4], [489, 617, 14, 7, 14, 4], [489, 664, 10, 13, 10, 0], [489, 719, 14, 7, 14, 4], [489, 766, 10, 13, 10, 0], [550, 3, 8, 8, 8, 2], [550, 54, 10, 9, 10, 2], [550, 104, 8, 9, 8, 1], [550, 156, 10, 9, 10, 2], [550, 209, 10, 7, 10, 4], [550, 260, 11, 6, 11, 4], [550, 308, 9, 10, 9, 1], [550, 362, 9, 6, 9, 4], [550, 413, 10, 7, 10, 4], [550, 464, 10, 7, 10, 4], [550, 514, 10, 7, 10, 3], [550, 566, 10, 7, 10, 4], [550, 617, 13, 7, 13, 4], [550, 664, 10, 13, 10, 0], [550, 719, 14, 6, 14, 4], [550, 769, 11, 8, 11, 3], [611, 3, 12, 9, 12, 2], [611, 53, 11, 11, 11, 1], [611, 104, 12, 10, 12, 1], [611, 157, 13, 10, 13, 3], [611, 207, 12, 9, 12, 2], [611, 258, 12, 9, 12, 2], [611, 308, 12, 11, 12, 1], [611, 362, 12, 7, 12, 4], [611, 413, 12, 7, 12, 4], [611, 464, 11, 7, 11, 4], [611, 515, 11, 9, 11, 4], [611, 565, 11, 9, 11, 3], [611, 617, 11, 7, 11, 4], [611, 668, 11, 9, 11, 4], [611, 719, 11, 7, 11, 4], [611, 769, 11, 9, 11, 3], [672, 3, 12, 9, 12, 2], [672, 54, 11, 9, 11, 2], [672, 105, 12, 10, 12, 2], [672, 156, 12, 10, 12, 2], [672, 207, 14, 8, 14, 2], [672, 257, 13, 11, 13, 1], [672, 307, 10, 11, 10, 0], [672, 362, 7, 6, 7, 4], [672, 413, 11, 7, 11, 4], [1, 5, 7, 6, 7, 4], [794, 770, 3, 6, 3, 4], [672, 566, 15, 7, 15, 4], [672, 617, 14, 7, 14, 4], [672, 664, 10, 11, 10, 0], [672, 719, 14, 7, 14, 4], [672, 766, 10, 11, 10, 0], [733, 3, 11, 9, 11, 2], [733, 54, 7, 11, 7, 2], [733, 105, 12, 10, 12, 2], [733, 156, 12, 10, 12, 2], [733, 207, 13, 8, 13, 2], [733, 257, 11, 11, 11, 1], [733, 307, 8, 13, 8, 0], [733, 358, 8, 13, 8, 0], [733, 409, 8, 13, 8, 0], [733, 460, 8, 13, 8, 0], [733, 511, 8, 13, 8, 0], [733, 562, 8, 13, 8, 0], [733, 613, 9, 13, 9, 0], [733, 664, 9, 13, 9, 0], [733, 715, 9, 13, 9, 0], [733, 766, 9, 13, 9, 0], [1, 5, 7, 6, 7, 4], [794, 54, 7, 11, 7, 2], [794, 103, 7, 13, 7, 0], [794, 154, 11, 13, 11, 0], [794, 205, 11, 13, 11, 0], [794, 256, 11, 13, 11, 0], [794, 307, 8, 13, 8, 0], [794, 358, 8, 13, 8, 0], [794, 409, 8, 13, 8, 0], [794, 460, 8, 13, 8, 0], [794, 511, 8, 13, 8, 0], [794, 562, 8, 13, 8, 0], [794, 613, 9, 13, 9, 0], [794, 664, 9, 13, 9, 0], [794, 715, 9, 13, 9, 0], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 10, 7, 10, 3], [1, 157, 8, 7, 8, 3], [1, 208, 9, 7, 9, 3], [1, 259, 11, 7, 11, 3], [1, 310, 10, 7, 10, 3], [1, 362, 8, 6, 8, 4], [1, 412, 7, 9, 7, 3], [1, 463, 7, 9, 7, 3], [1, 515, 8, 6, 8, 4], [1, 566, 9, 6, 9, 4], [1, 617, 5, 8, 5, 4], [1, 668, 9, 6, 9, 4], [1, 719, 5, 6, 5, 4], [1, 769, 6, 7, 6, 3], [62, 4, 8, 7, 8, 3], [62, 55, 8, 7, 8, 3], [62, 106, 8, 7, 8, 3], [62, 157, 8, 7, 8, 3], [62, 208, 8, 7, 8, 3], [62, 259, 8, 7, 8, 3], [62, 310, 8, 7, 8, 3], [62, 361, 8, 7, 8, 3], [62, 412, 8, 7, 8, 3], [62, 463, 8, 7, 8, 3], [62, 515, 5, 6, 5, 4], [62, 566, 5, 8, 5, 4], [62, 617, 10, 6, 10, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 769, 8, 7, 8, 3], [123, 5, 9, 6, 9, 4], [123, 55, 11, 7, 11, 3], [123, 106, 9, 7, 9, 3], [123, 157, 11, 7, 11, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 11, 7, 11, 3], [123, 361, 9, 7, 9, 3], [123, 412, 11, 7, 11, 3], [123, 463, 6, 7, 6, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 10, 7, 10, 3], [123, 667, 13, 7, 13, 3], [123, 718, 11, 7, 11, 3], [123, 769, 10, 7, 10, 3], [184, 4, 11, 7, 11, 3], [184, 55, 10, 7, 10, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 11, 7, 11, 3], [184, 311, 8, 8, 8, 4], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 12, 7, 12, 3], [184, 514, 9, 7, 9, 3], [184, 565, 6, 9, 6, 3], [184, 617, 10, 6, 10, 4], [184, 667, 6, 9, 6, 3], [184, 718, 10, 7, 10, 3], [184, 770, 8, 8, 8, 4], [245, 2, 8, 9, 8, 1], [245, 56, 10, 6, 10, 4], [245, 105, 8, 10, 8, 2], [245, 158, 9, 8, 9, 4], [245, 207, 8, 8, 8, 2], [245, 260, 8, 6, 8, 4], [245, 310, 9, 9, 9, 3], [245, 362, 9, 8, 9, 4], [245, 413, 9, 8, 9, 4], [245, 464, 7, 6, 7, 4], [245, 515, 9, 8, 9, 4], [245, 566, 9, 6, 9, 4], [245, 615, 9, 8, 9, 2], [245, 668, 9, 8, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 8, 6, 8, 4], [306, 5, 9, 6, 9, 4], [306, 55, 8, 7, 8, 3], [306, 107, 8, 8, 8, 4], [306, 158, 9, 6, 9, 4], [306, 209, 8, 6, 8, 4], [306, 260, 9, 6, 9, 4], [306, 311, 11, 6, 11, 4], [306, 362, 11, 6, 11, 4], [306, 411, 8, 10, 8, 2], [306, 464, 10, 8, 10, 4], [306, 513, 8, 10, 8, 2], [306, 565, 8, 9, 8, 3], [306, 616, 5, 9, 5, 3], [306, 667, 8, 9, 8, 3], [306, 719, 9, 6, 9, 4], [306, 770, 3, 6, 3, 4], [367, 5, 3, 6, 3, 4], [367, 56, 3, 6, 3, 4], [367, 107, 3, 6, 3, 4], [367, 158, 3, 6, 3, 4], [367, 209, 3, 6, 3, 4], [367, 260, 3, 6, 3, 4], [367, 311, 3, 6, 3, 4], [367, 362, 3, 6, 3, 4], [367, 413, 3, 6, 3, 4], [367, 464, 3, 6, 3, 4], [367, 515, 3, 6, 3, 4], [367, 566, 3, 6, 3, 4], [367, 617, 3, 6, 3, 4], [367, 668, 3, 6, 3, 4], [367, 719, 3, 6, 3, 4], [367, 770, 3, 6, 3, 4], [428, 5, 3, 6, 3, 4], [428, 56, 3, 6, 3, 4], [428, 107, 3, 6, 3, 4], [428, 158, 3, 6, 3, 4], [428, 209, 3, 6, 3, 4], [428, 260, 3, 6, 3, 4], [428, 311, 3, 6, 3, 4], [428, 362, 3, 6, 3, 4], [428, 413, 3, 6, 3, 4], [428, 464, 3, 6, 3, 4], [428, 515, 3, 6, 3, 4], [428, 566, 3, 6, 3, 4], [428, 617, 3, 6, 3, 4], [428, 668, 3, 6, 3, 4], [428, 719, 3, 6, 3, 4], [428, 770, 3, 6, 3, 4], [489, 5, 3, 6, 3, 4], [489, 55, 10, 7, 10, 3], [489, 105, 6, 8, 6, 2], [489, 157, 9, 7, 9, 3], [489, 208, 6, 7, 6, 3], [489, 260, 10, 6, 10, 4], [489, 310, 8, 9, 8, 3], [489, 362, 10, 6, 10, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 10, 6, 10, 4], [489, 566, 13, 6, 13, 4], [489, 617, 13, 6, 13, 4], [489, 665, 9, 11, 9, 1], [489, 719, 13, 6, 13, 4], [489, 767, 9, 11, 9, 1], [550, 4, 7, 7, 7, 3], [550, 55, 9, 7, 9, 3], [550, 105, 7, 8, 7, 2], [550, 157, 9, 7, 9, 3], [550, 209, 9, 6, 9, 4], [550, 260, 10, 6, 10, 4], [550, 309, 8, 8, 8, 2], [550, 362, 8, 6, 8, 4], [550, 413, 9, 6, 9, 4], [550, 464, 9, 6, 9, 4], [550, 515, 9, 6, 9, 4], [550, 566, 9, 6, 9, 4], [550, 617, 12, 6, 12, 4], [550, 665, 9, 11, 9, 1], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 4, 11, 7, 11, 3], [611, 54, 10, 9, 10, 2], [611, 105, 11, 8, 11, 2], [611, 158, 12, 8, 12, 4], [611, 208, 11, 7, 11, 3], [611, 259, 11, 7, 11, 3], [611, 309, 11, 9, 11, 2], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 8, 10, 4], [611, 566, 10, 7, 10, 4], [611, 617, 10, 6, 10, 4], [611, 668, 10, 8, 10, 4], [611, 719, 10, 6, 10, 4], [611, 770, 10, 7, 10, 4], [672, 4, 11, 7, 11, 3], [672, 55, 10, 7, 10, 3], [672, 106, 11, 8, 11, 3], [672, 157, 11, 8, 11, 3], [672, 208, 13, 7, 13, 3], [672, 258, 12, 9, 12, 2], [672, 308, 9, 9, 9, 1], [672, 362, 6, 6, 6, 4], [672, 413, 10, 6, 10, 4], [1, 5, 6, 6, 6, 4], [794, 770, 3, 6, 3, 4], [672, 566, 14, 6, 14, 4], [672, 617, 13, 6, 13, 4], [672, 665, 9, 9, 9, 1], [672, 719, 13, 6, 13, 4], [672, 767, 9, 9, 9, 1], [733, 4, 10, 7, 10, 3], [733, 55, 6, 9, 6, 3], [733, 106, 11, 8, 11, 3], [733, 157, 11, 8, 11, 3], [733, 208, 12, 7, 12, 3], [733, 258, 10, 9, 10, 2], [733, 308, 7, 11, 7, 1], [733, 359, 7, 11, 7, 1], [733, 410, 7, 11, 7, 1], [733, 461, 7, 11, 7, 1], [733, 512, 7, 11, 7, 1], [733, 563, 7, 11, 7, 1], [733, 614, 8, 11, 8, 1], [733, 665, 8, 11, 8, 1], [733, 716, 8, 11, 8, 1], [733, 767, 8, 11, 8, 1], [1, 5, 6, 6, 6, 4], [794, 55, 6, 9, 6, 3], [794, 104, 6, 11, 6, 1], [794, 155, 10, 11, 10, 1], [794, 206, 10, 11, 10, 1], [794, 257, 10, 11, 10, 1], [794, 308, 7, 11, 7, 1], [794, 359, 7, 11, 7, 1], [794, 410, 7, 11, 7, 1], [794, 461, 7, 11, 7, 1], [794, 512, 7, 11, 7, 1], [794, 563, 7, 11, 7, 1], [794, 614, 8, 11, 8, 1], [794, 665, 8, 11, 8, 1], [794, 716, 8, 11, 8, 1], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 10, 9, 7, 2], [1, 105, 15, 9, 11, 2], [1, 156, 12, 9, 9, 2], [1, 207, 13, 9, 10, 2], [1, 258, 14, 9, 12, 2], [1, 309, 12, 9, 11, 2], [1, 362, 10, 7, 9, 4], [1, 411, 11, 11, 8, 2], [1, 462, 10, 11, 8, 2], [1, 515, 11, 5, 9, 4], [1, 566, 11, 7, 10, 4], [1, 621, 7, 5, 6, 8], [1, 670, 11, 3, 10, 6], [1, 723, 7, 3, 6, 8], [1, 768, 11, 9, 7, 2], [62, 3, 11, 9, 9, 2], [62, 54, 11, 9, 9, 2], [62, 105, 11, 9, 9, 2], [62, 156, 11, 9, 9, 2], [62, 207, 12, 9, 9, 2], [62, 258, 12, 9, 9, 2], [62, 309, 12, 9, 9, 2], [62, 360, 12, 9, 9, 2], [62, 411, 11, 9, 9, 2], [62, 462, 11, 9, 9, 2], [62, 515, 9, 7, 6, 4], [62, 566, 9, 9, 6, 4], [62, 617, 13, 7, 11, 4], [62, 669, 11, 5, 10, 5], [62, 719, 12, 7, 10, 4], [62, 768, 12, 9, 9, 2], [123, 4, 12, 8, 10, 3], [123, 54, 12, 9, 12, 2], [123, 105, 12, 9, 10, 2], [123, 156, 15, 9, 12, 2], [123, 207, 12, 9, 11, 2], [123, 258, 13, 9, 10, 2], [123, 309, 13, 9, 12, 2], [123, 360, 13, 9, 10, 2], [123, 411, 15, 9, 12, 2], [123, 462, 11, 9, 7, 2], [123, 513, 12, 9, 11, 2], [123, 564, 14, 9, 11, 2], [123, 615, 12, 9, 11, 2], [123, 666, 17, 9, 14, 2], [123, 717, 15, 9, 12, 2], [123, 768, 13, 9, 11, 2], [184, 3, 15, 9, 12, 2], [184, 54, 13, 9, 11, 2], [184, 105, 12, 9, 10, 2], [184, 156, 13, 9, 10, 2], [184, 207, 13, 9, 10, 2], [184, 258, 15, 9, 12, 2], [184, 311, 11, 9, 9, 4], [184, 360, 14, 9, 13, 2], [184, 411, 13, 9, 11, 2], [184, 462, 17, 9, 13, 2], [184, 513, 13, 9, 10, 2], [184, 564, 10, 11, 7, 2], [184, 617, 11, 7, 11, 4], [184, 666, 11, 11, 7, 2], [184, 717, 12, 9, 11, 2], [184, 776, 9, 3, 9, 10], [245, 1, 13, 3, 9, 0], [245, 56, 12, 7, 11, 4], [245, 104, 12, 12, 9, 1], [245, 158, 12, 9, 10, 4], [245, 206, 12, 10, 9, 1], [245, 260, 10, 7, 9, 4], [245, 309, 11, 11, 10, 2], [245, 362, 12, 9, 10, 4], [245, 413, 12, 9, 10, 4], [245, 464, 9, 7, 8, 4], [245, 515, 11, 9, 10, 4], [245, 566, 12, 7, 10, 4], [245, 614, 11, 10, 10, 1], [245, 668, 11, 9, 10, 4], [245, 719, 12, 7, 10, 4], [245, 770, 10, 7, 9, 4], [306, 5, 12, 7, 10, 4], [306, 54, 11, 9, 9, 2], [306, 107, 10, 9, 9, 4], [306, 158, 12, 7, 10, 4], [306, 209, 11, 7, 9, 4], [306, 260, 11, 7, 10, 4], [306, 310, 14, 8, 12, 3], [306, 362, 13, 7, 12, 4], [306, 410, 12, 12, 9, 1], [306, 464, 14, 9, 11, 4], [306, 512, 12, 12, 9, 1], [306, 564, 12, 11, 9, 2], [306, 615, 9, 11, 6, 2], [306, 666, 10, 11, 9, 2], [306, 720, 11, 4, 10, 5], [306, 766, 1, 1, 3, 1], [367, 1, 1, 1, 3, 1], [367, 52, 1, 1, 3, 1], [367, 103, 1, 1, 3, 1], [367, 154, 1, 1, 3, 1], [367, 205, 1, 1, 3, 1], [367, 256, 1, 1, 3, 1], [367, 307, 1, 1, 3, 1], [367, 358, 1, 1, 3, 1], [367, 409, 1, 1, 3, 1], [367, 460, 1, 1, 3, 1], [367, 511, 1, 1, 3, 1], [367, 562, 1, 1, 3, 1], [367, 613, 1, 1, 3, 1], [367, 664, 1, 1, 3, 1], [367, 715, 1, 1, 3, 1], [367, 766, 1, 1, 3, 1], [428, 1, 1, 1, 3, 1], [428, 52, 1, 1, 3, 1], [428, 103, 1, 1, 3, 1], [428, 154, 1, 1, 3, 1], [428, 205, 1, 1, 3, 1], [428, 256, 1, 1, 3, 1], [428, 307, 1, 1, 3, 1], [428, 358, 1, 1, 3, 1], [428, 409, 1, 1, 3, 1], [428, 460, 1, 1, 3, 1], [428, 511, 1, 1, 3, 1], [428, 562, 1, 1, 3, 1], [428, 613, 1, 1, 3, 1], [428, 664, 1, 1, 3, 1], [428, 715, 1, 1, 3, 1], [428, 766, 1, 1, 3, 1], [489, 1, 1, 1, 3, 1], [489, 54, 14, 9, 11, 2], [489, 104, 11, 5, 7, 1], [489, 156, 13, 9, 10, 2], [489, 207, 11, 9, 7, 2], [489, 261, 13, 5, 11, 5], [489, 309, 13, 11, 9, 2], [489, 362, 12, 7, 11, 4], [489, 413, 12, 7, 11, 4], [489, 464, 13, 7, 11, 4], [489, 515, 12, 7, 11, 4], [489, 566, 16, 7, 14, 4], [489, 617, 16, 7, 14, 4], [489, 664, 13, 13, 10, 0], [489, 719, 16, 7, 14, 4], [489, 766, 12, 13, 10, 0], [550, 3, 11, 6, 8, 2], [550, 54, 12, 9, 10, 2], [550, 104, 12, 5, 8, 1], [550, 156, 12, 9, 10, 2], [550, 209, 12, 7, 10, 4], [550, 261, 12, 5, 11, 5], [550, 308, 12, 10, 9, 1], [550, 363, 10, 5, 9, 5], [550, 413, 11, 7, 10, 4], [550, 464, 11, 7, 10, 4], [550, 514, 12, 7, 10, 3], [550, 566, 12, 7, 10, 4], [550, 621, 13, 3, 13, 8], [550, 664, 12, 13, 10, 0], [550, 721, 16, 3, 14, 6], [550, 769, 13, 8, 11, 3], [611, 3, 14, 9, 12, 2], [611, 53, 14, 11, 11, 1], [611, 104, 15, 10, 12, 1], [611, 157, 14, 10, 13, 3], [611, 207, 14, 9, 12, 2], [611, 258, 14, 9, 12, 2], [611, 308, 15, 11, 12, 1], [611, 362, 13, 7, 12, 4], [611, 413, 14, 7, 12, 4], [611, 464, 13, 7, 11, 4], [611, 511, 1, 1, 11, 1], [611, 565, 14, 9, 11, 3], [611, 617, 14, 7, 11, 4], [611, 668, 14, 9, 11, 4], [611, 719, 13, 7, 11, 4], [611, 769, 13, 9, 11, 3], [672, 3, 15, 9, 12, 2], [672, 54, 14, 9, 11, 2], [672, 105, 14, 10, 12, 2], [672, 156, 14, 10, 12, 2], [672, 207, 16, 7, 14, 2], [672, 257, 16, 11, 13, 1], [672, 307, 14, 11, 10, 0], [672, 364, 8, 3, 7, 6], [672, 415, 12, 5, 11, 6], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 566, 16, 7, 15, 4], [672, 617, 15, 7, 14, 4], [672, 664, 13, 11, 10, 0], [672, 719, 16, 7, 14, 4], [672, 766, 13, 11, 10, 0], [733, 3, 13, 9, 11, 2], [733, 54, 11, 11, 7, 2], [733, 105, 14, 10, 12, 2], [733, 156, 14, 10, 12, 2], [733, 207, 15, 7, 13, 2], [733, 257, 14, 11, 11, 1], [733, 307, 12, 13, 8, 0], [733, 358, 11, 13, 8, 0], [733, 409, 11, 13, 8, 0], [733, 460, 12, 13, 8, 0], [733, 511, 11, 13, 8, 0], [733, 562, 11, 13, 8, 0], [733, 613, 13, 13, 9, 0], [733, 664, 12, 13, 9, 0], [733, 715, 12, 13, 9, 0], [733, 766, 12, 13, 9, 0], [1, 1, 1, 1, 7, 1], [794, 54, 9, 11, 7, 2], [794, 103, 11, 13, 7, 0], [794, 154, 15, 13, 11, 0], [794, 205, 13, 13, 11, 0], [794, 256, 13, 13, 11, 0], [794, 307, 10, 13, 8, 0], [794, 358, 12, 13, 8, 0], [794, 409, 12, 13, 8, 0], [794, 460, 12, 13, 8, 0], [794, 511, 12, 13, 8, 0], [794, 562, 12, 13, 8, 0], [794, 613, 11, 13, 9, 0], [794, 664, 12, 13, 9, 0], [794, 715, 12, 13, 9, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 15, \"widestglyph\": 17, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 54, 9, 7, 6, 2], [1, 105, 14, 7, 10, 2], [1, 156, 11, 7, 8, 2], [1, 207, 12, 7, 9, 2], [1, 258, 13, 7, 11, 2], [1, 309, 11, 7, 10, 2], [1, 362, 9, 5, 8, 4], [1, 411, 10, 9, 7, 2], [1, 462, 9, 9, 7, 2], [1, 515, 10, 3, 8, 4], [1, 566, 10, 5, 9, 4], [1, 621, 6, 3, 5, 8], [1, 670, 10, 1, 9, 6], [1, 723, 6, 1, 5, 8], [1, 768, 10, 7, 6, 2], [62, 3, 10, 7, 8, 2], [62, 54, 10, 7, 8, 2], [62, 105, 10, 7, 8, 2], [62, 156, 10, 7, 8, 2], [62, 207, 11, 7, 8, 2], [62, 258, 11, 7, 8, 2], [62, 309, 11, 7, 8, 2], [62, 360, 11, 7, 8, 2], [62, 411, 10, 7, 8, 2], [62, 462, 10, 7, 8, 2], [62, 515, 8, 5, 5, 4], [62, 566, 8, 7, 5, 4], [62, 617, 12, 5, 10, 4], [62, 669, 10, 3, 9, 5], [62, 719, 11, 5, 9, 4], [62, 768, 11, 7, 8, 2], [123, 4, 11, 6, 9, 3], [123, 54, 11, 7, 11, 2], [123, 105, 11, 7, 9, 2], [123, 156, 14, 7, 11, 2], [123, 207, 11, 7, 10, 2], [123, 258, 12, 7, 9, 2], [123, 309, 12, 7, 11, 2], [123, 360, 12, 7, 9, 2], [123, 411, 14, 7, 11, 2], [123, 462, 10, 7, 6, 2], [123, 513, 11, 7, 10, 2], [123, 564, 13, 7, 10, 2], [123, 615, 11, 7, 10, 2], [123, 666, 16, 7, 13, 2], [123, 717, 14, 7, 11, 2], [123, 768, 12, 7, 10, 2], [184, 3, 14, 7, 11, 2], [184, 54, 12, 7, 10, 2], [184, 105, 11, 7, 9, 2], [184, 156, 12, 7, 9, 2], [184, 207, 12, 7, 9, 2], [184, 258, 14, 7, 11, 2], [184, 311, 10, 7, 8, 4], [184, 360, 13, 7, 12, 2], [184, 411, 12, 7, 10, 2], [184, 462, 16, 7, 12, 2], [184, 513, 12, 7, 9, 2], [184, 564, 9, 9, 6, 2], [184, 617, 10, 5, 10, 4], [184, 666, 10, 9, 6, 2], [184, 717, 11, 7, 10, 2], [184, 776, 8, 1, 8, 10], [245, 1, 1, 1, 8, 1], [245, 56, 11, 5, 10, 4], [245, 104, 11, 10, 8, 1], [245, 158, 11, 7, 9, 4], [245, 206, 11, 8, 8, 1], [245, 260, 9, 5, 8, 4], [245, 309, 10, 9, 9, 2], [245, 362, 11, 7, 9, 4], [245, 413, 11, 7, 9, 4], [245, 464, 8, 5, 7, 4], [245, 515, 10, 7, 9, 4], [245, 566, 11, 5, 9, 4], [245, 614, 10, 8, 9, 1], [245, 668, 10, 7, 9, 4], [245, 719, 11, 5, 9, 4], [245, 770, 9, 5, 8, 4], [306, 5, 11, 5, 9, 4], [306, 54, 10, 7, 8, 2], [306, 107, 9, 7, 8, 4], [306, 158, 11, 5, 9, 4], [306, 209, 10, 5, 8, 4], [306, 260, 10, 5, 9, 4], [306, 310, 13, 6, 11, 3], [306, 362, 12, 5, 11, 4], [306, 410, 11, 10, 8, 1], [306, 464, 13, 7, 10, 4], [306, 512, 11, 10, 8, 1], [306, 564, 11, 9, 8, 2], [306, 615, 8, 9, 5, 2], [306, 666, 9, 9, 8, 2], [306, 720, 10, 2, 9, 5], [306, 766, 1, 1, 3, 1], [367, 1, 1, 1, 3, 1], [367, 52, 1, 1, 3, 1], [367, 103, 1, 1, 3, 1], [367, 154, 1, 1, 3, 1], [367, 205, 1, 1, 3, 1], [367, 256, 1, 1, 3, 1], [367, 307, 1, 1, 3, 1], [367, 358, 1, 1, 3, 1], [367, 409, 1, 1, 3, 1], [367, 460, 1, 1, 3, 1], [367, 511, 1, 1, 3, 1], [367, 562, 1, 1, 3, 1], [367, 613, 1, 1, 3, 1], [367, 664, 1, 1, 3, 1], [367, 715, 1, 1, 3, 1], [367, 766, 1, 1, 3, 1], [428, 1, 1, 1, 3, 1], [428, 52, 1, 1, 3, 1], [428, 103, 1, 1, 3, 1], [428, 154, 1, 1, 3, 1], [428, 205, 1, 1, 3, 1], [428, 256, 1, 1, 3, 1], [428, 307, 1, 1, 3, 1], [428, 358, 1, 1, 3, 1], [428, 409, 1, 1, 3, 1], [428, 460, 1, 1, 3, 1], [428, 511, 1, 1, 3, 1], [428, 562, 1, 1, 3, 1], [428, 613, 1, 1, 3, 1], [428, 664, 1, 1, 3, 1], [428, 715, 1, 1, 3, 1], [428, 766, 1, 1, 3, 1], [489, 1, 1, 1, 3, 1], [489, 54, 13, 7, 10, 2], [489, 104, 10, 3, 6, 1], [489, 156, 12, 7, 9, 2], [489, 207, 10, 7, 6, 2], [489, 261, 12, 3, 10, 5], [489, 309, 12, 9, 8, 2], [489, 362, 11, 5, 10, 4], [489, 413, 11, 5, 10, 4], [489, 464, 12, 5, 10, 4], [489, 515, 11, 5, 10, 4], [489, 566, 15, 5, 13, 4], [489, 617, 15, 5, 13, 4], [489, 664, 12, 11, 9, 0], [489, 719, 15, 5, 13, 4], [489, 766, 10, 11, 9, 0], [550, 3, 10, 4, 7, 2], [550, 54, 11, 7, 9, 2], [550, 104, 11, 3, 7, 1], [550, 156, 11, 7, 9, 2], [550, 209, 11, 5, 9, 4], [550, 261, 11, 3, 10, 5], [550, 308, 11, 8, 8, 1], [550, 363, 9, 3, 8, 5], [550, 413, 10, 5, 9, 4], [550, 464, 10, 5, 9, 4], [550, 514, 11, 5, 9, 3], [550, 566, 11, 5, 9, 4], [550, 621, 12, 1, 12, 8], [550, 664, 10, 11, 9, 0], [550, 721, 15, 1, 13, 6], [550, 769, 12, 6, 10, 3], [611, 3, 13, 7, 11, 2], [611, 53, 13, 9, 10, 1], [611, 104, 14, 8, 11, 1], [611, 157, 13, 8, 12, 3], [611, 207, 13, 7, 11, 2], [611, 258, 13, 7, 11, 2], [611, 308, 14, 9, 11, 1], [611, 362, 12, 5, 11, 4], [611, 413, 13, 5, 11, 4], [611, 464, 12, 5, 10, 4], [611, 511, 1, 1, 10, 1], [611, 565, 13, 7, 10, 3], [611, 617, 13, 5, 10, 4], [611, 668, 13, 7, 10, 4], [611, 719, 12, 5, 10, 4], [611, 769, 12, 7, 10, 3], [672, 3, 14, 7, 11, 2], [672, 54, 13, 7, 10, 2], [672, 105, 13, 8, 11, 2], [672, 156, 13, 8, 11, 2], [672, 207, 15, 5, 13, 2], [672, 257, 15, 9, 12, 1], [672, 308, 13, 8, 9, 1], [672, 364, 7, 1, 6, 6], [672, 415, 11, 3, 10, 6], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 566, 15, 5, 14, 4], [672, 617, 14, 5, 13, 4], [672, 664, 12, 9, 9, 0], [672, 719, 15, 5, 13, 4], [672, 766, 11, 9, 9, 0], [733, 3, 12, 7, 10, 2], [733, 54, 10, 9, 6, 2], [733, 105, 13, 8, 11, 2], [733, 156, 13, 8, 11, 2], [733, 207, 14, 5, 12, 2], [733, 257, 13, 9, 10, 1], [733, 308, 10, 10, 7, 1], [733, 358, 9, 11, 7, 0], [733, 409, 9, 11, 7, 0], [733, 460, 9, 11, 7, 0], [733, 511, 9, 11, 7, 0], [733, 562, 9, 11, 7, 0], [733, 613, 10, 11, 8, 0], [733, 664, 10, 11, 8, 0], [733, 715, 10, 11, 8, 0], [733, 766, 10, 11, 8, 0], [1, 1, 1, 1, 6, 1], [794, 54, 8, 9, 6, 2], [794, 104, 9, 10, 6, 1], [794, 154, 14, 11, 10, 0], [794, 205, 11, 11, 10, 0], [794, 256, 11, 11, 10, 0], [794, 307, 9, 11, 7, 0], [794, 358, 10, 11, 7, 0], [794, 409, 10, 11, 7, 0], [794, 460, 10, 11, 7, 0], [794, 511, 10, 11, 7, 0], [794, 562, 10, 11, 7, 0], [794, 613, 10, 11, 8, 0], [794, 664, 10, 11, 8, 0], [794, 715, 10, 11, 8, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 14, \"widestglyph\": 16, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 1, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 7, 6, 7, 4], [1, 54, 7, 9, 7, 2], [1, 105, 11, 9, 11, 2], [1, 156, 9, 9, 9, 2], [1, 207, 10, 9, 10, 2], [1, 258, 12, 9, 12, 2], [1, 309, 11, 9, 11, 2], [1, 362, 9, 7, 9, 4], [1, 411, 8, 11, 8, 2], [1, 462, 8, 11, 8, 2], [1, 515, 9, 6, 9, 4], [1, 566, 10, 7, 10, 4], [1, 617, 6, 9, 6, 4], [1, 668, 10, 6, 10, 4], [1, 719, 6, 7, 6, 4], [1, 768, 7, 9, 7, 2], [62, 3, 9, 9, 9, 2], [62, 54, 9, 9, 9, 2], [62, 105, 9, 9, 9, 2], [62, 156, 9, 9, 9, 2], [62, 207, 9, 9, 9, 2], [62, 258, 9, 9, 9, 2], [62, 309, 9, 9, 9, 2], [62, 360, 9, 9, 9, 2], [62, 411, 9, 9, 9, 2], [62, 462, 9, 9, 9, 2], [62, 515, 6, 7, 6, 4], [62, 566, 6, 9, 6, 4], [62, 617, 11, 7, 11, 4], [62, 668, 10, 6, 10, 4], [62, 719, 10, 7, 10, 4], [62, 768, 9, 9, 9, 2], [123, 4, 10, 8, 10, 3], [123, 54, 12, 9, 12, 2], [123, 105, 10, 9, 10, 2], [123, 156, 12, 9, 12, 2], [123, 207, 11, 9, 11, 2], [123, 258, 10, 9, 10, 2], [123, 309, 12, 9, 12, 2], [123, 360, 10, 9, 10, 2], [123, 411, 12, 9, 12, 2], [123, 462, 7, 9, 7, 2], [123, 513, 11, 9, 11, 2], [123, 564, 11, 9, 11, 2], [123, 615, 11, 9, 11, 2], [123, 666, 14, 9, 14, 2], [123, 717, 12, 9, 12, 2], [123, 768, 11, 9, 11, 2], [184, 3, 12, 9, 12, 2], [184, 54, 11, 9, 11, 2], [184, 105, 10, 9, 10, 2], [184, 156, 10, 9, 10, 2], [184, 207, 10, 9, 10, 2], [184, 258, 12, 9, 12, 2], [184, 311, 9, 9, 9, 4], [184, 360, 13, 9, 13, 2], [184, 411, 11, 9, 11, 2], [184, 462, 13, 9, 13, 2], [184, 513, 10, 9, 10, 2], [184, 564, 7, 11, 7, 2], [184, 617, 11, 7, 11, 4], [184, 666, 7, 11, 7, 2], [184, 717, 11, 9, 11, 2], [184, 770, 9, 9, 9, 4], [245, 1, 9, 10, 9, 0], [245, 56, 11, 7, 11, 4], [245, 104, 9, 12, 9, 1], [245, 158, 10, 9, 10, 4], [245, 206, 9, 10, 9, 1], [245, 260, 9, 7, 9, 4], [245, 309, 10, 11, 10, 2], [245, 362, 10, 9, 10, 4], [245, 413, 10, 9, 10, 4], [245, 464, 8, 7, 8, 4], [245, 515, 10, 9, 10, 4], [245, 566, 10, 7, 10, 4], [245, 614, 10, 10, 10, 1], [245, 668, 10, 9, 10, 4], [245, 719, 10, 7, 10, 4], [245, 770, 9, 7, 9, 4], [306, 5, 10, 7, 10, 4], [306, 54, 9, 9, 9, 2], [306, 107, 9, 9, 9, 4], [306, 158, 10, 7, 10, 4], [306, 209, 9, 7, 9, 4], [306, 260, 10, 7, 10, 4], [306, 310, 12, 8, 12, 3], [306, 362, 12, 7, 12, 4], [306, 410, 9, 12, 9, 1], [306, 464, 11, 9, 11, 4], [306, 512, 9, 12, 9, 1], [306, 564, 9, 11, 9, 2], [306, 615, 6, 11, 6, 2], [306, 666, 9, 11, 9, 2], [306, 719, 10, 6, 10, 4], [306, 770, 3, 6, 3, 4], [367, 5, 3, 6, 3, 4], [367, 56, 3, 6, 3, 4], [367, 107, 3, 6, 3, 4], [367, 158, 3, 6, 3, 4], [367, 209, 3, 6, 3, 4], [367, 260, 3, 6, 3, 4], [367, 311, 3, 6, 3, 4], [367, 362, 3, 6, 3, 4], [367, 413, 3, 6, 3, 4], [367, 464, 3, 6, 3, 4], [367, 515, 3, 6, 3, 4], [367, 566, 3, 6, 3, 4], [367, 617, 3, 6, 3, 4], [367, 668, 3, 6, 3, 4], [367, 719, 3, 6, 3, 4], [367, 770, 3, 6, 3, 4], [428, 5, 3, 6, 3, 4], [428, 56, 3, 6, 3, 4], [428, 107, 3, 6, 3, 4], [428, 158, 3, 6, 3, 4], [428, 209, 3, 6, 3, 4], [428, 260, 3, 6, 3, 4], [428, 311, 3, 6, 3, 4], [428, 362, 3, 6, 3, 4], [428, 413, 3, 6, 3, 4], [428, 464, 3, 6, 3, 4], [428, 515, 3, 6, 3, 4], [428, 566, 3, 6, 3, 4], [428, 617, 3, 6, 3, 4], [428, 668, 3, 6, 3, 4], [428, 719, 3, 6, 3, 4], [428, 770, 3, 6, 3, 4], [489, 5, 3, 6, 3, 4], [489, 54, 11, 9, 11, 2], [489, 104, 7, 9, 7, 1], [489, 156, 10, 9, 10, 2], [489, 207, 7, 9, 7, 2], [489, 260, 11, 6, 11, 4], [489, 309, 9, 11, 9, 2], [489, 362, 11, 7, 11, 4], [489, 413, 11, 7, 11, 4], [489, 464, 11, 7, 11, 4], [489, 515, 11, 7, 11, 4], [489, 566, 14, 7, 14, 4], [489, 617, 14, 7, 14, 4], [489, 664, 10, 13, 10, 0], [489, 719, 14, 7, 14, 4], [489, 766, 10, 13, 10, 0], [550, 3, 8, 8, 8, 2], [550, 54, 10, 9, 10, 2], [550, 104, 8, 9, 8, 1], [550, 156, 10, 9, 10, 2], [550, 209, 10, 7, 10, 4], [550, 260, 11, 6, 11, 4], [550, 308, 9, 10, 9, 1], [550, 362, 9, 6, 9, 4], [550, 413, 10, 7, 10, 4], [550, 464, 10, 7, 10, 4], [550, 514, 10, 7, 10, 3], [550, 566, 10, 7, 10, 4], [550, 617, 13, 7, 13, 4], [550, 664, 10, 13, 10, 0], [550, 719, 14, 6, 14, 4], [550, 769, 11, 8, 11, 3], [611, 3, 12, 9, 12, 2], [611, 53, 11, 11, 11, 1], [611, 104, 12, 10, 12, 1], [611, 157, 13, 10, 13, 3], [611, 207, 12, 9, 12, 2], [611, 258, 12, 9, 12, 2], [611, 308, 12, 11, 12, 1], [611, 362, 12, 7, 12, 4], [611, 413, 12, 7, 12, 4], [611, 464, 11, 7, 11, 4], [611, 515, 11, 9, 11, 4], [611, 565, 11, 9, 11, 3], [611, 617, 11, 7, 11, 4], [611, 668, 11, 9, 11, 4], [611, 719, 11, 7, 11, 4], [611, 769, 11, 9, 11, 3], [672, 3, 12, 9, 12, 2], [672, 54, 11, 9, 11, 2], [672, 105, 12, 10, 12, 2], [672, 156, 12, 10, 12, 2], [672, 207, 14, 8, 14, 2], [672, 257, 13, 11, 13, 1], [672, 307, 10, 11, 10, 0], [672, 362, 7, 6, 7, 4], [672, 413, 11, 7, 11, 4], [1, 5, 7, 6, 7, 4], [794, 770, 3, 6, 3, 4], [672, 566, 15, 7, 15, 4], [672, 617, 14, 7, 14, 4], [672, 664, 10, 11, 10, 0], [672, 719, 14, 7, 14, 4], [672, 766, 10, 11, 10, 0], [733, 3, 11, 9, 11, 2], [733, 54, 7, 11, 7, 2], [733, 105, 12, 10, 12, 2], [733, 156, 12, 10, 12, 2], [733, 207, 13, 8, 13, 2], [733, 257, 11, 11, 11, 1], [733, 307, 8, 13, 8, 0], [733, 358, 8, 13, 8, 0], [733, 409, 8, 13, 8, 0], [733, 460, 8, 13, 8, 0], [733, 511, 8, 13, 8, 0], [733, 562, 8, 13, 8, 0], [733, 613, 9, 13, 9, 0], [733, 664, 9, 13, 9, 0], [733, 715, 9, 13, 9, 0], [733, 766, 9, 13, 9, 0], [1, 5, 7, 6, 7, 4], [794, 54, 7, 11, 7, 2], [794, 103, 7, 13, 7, 0], [794, 154, 11, 13, 11, 0], [794, 205, 11, 13, 11, 0], [794, 256, 11, 13, 11, 0], [794, 307, 8, 13, 8, 0], [794, 358, 8, 13, 8, 0], [794, 409, 8, 13, 8, 0], [794, 460, 8, 13, 8, 0], [794, 511, 8, 13, 8, 0], [794, 562, 8, 13, 8, 0], [794, 613, 9, 13, 9, 0], [794, 664, 9, 13, 9, 0], [794, 715, 9, 13, 9, 0], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 15, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_10_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 11, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 55, 6, 7, 6, 3], [1, 106, 10, 7, 10, 3], [1, 157, 8, 7, 8, 3], [1, 208, 9, 7, 9, 3], [1, 259, 11, 7, 11, 3], [1, 310, 10, 7, 10, 3], [1, 362, 8, 6, 8, 4], [1, 412, 7, 9, 7, 3], [1, 463, 7, 9, 7, 3], [1, 515, 8, 6, 8, 4], [1, 566, 9, 6, 9, 4], [1, 617, 5, 8, 5, 4], [1, 668, 9, 6, 9, 4], [1, 719, 5, 6, 5, 4], [1, 769, 6, 7, 6, 3], [62, 4, 8, 7, 8, 3], [62, 55, 8, 7, 8, 3], [62, 106, 8, 7, 8, 3], [62, 157, 8, 7, 8, 3], [62, 208, 8, 7, 8, 3], [62, 259, 8, 7, 8, 3], [62, 310, 8, 7, 8, 3], [62, 361, 8, 7, 8, 3], [62, 412, 8, 7, 8, 3], [62, 463, 8, 7, 8, 3], [62, 515, 5, 6, 5, 4], [62, 566, 5, 8, 5, 4], [62, 617, 10, 6, 10, 4], [62, 668, 9, 6, 9, 4], [62, 719, 9, 6, 9, 4], [62, 769, 8, 7, 8, 3], [123, 5, 9, 6, 9, 4], [123, 55, 11, 7, 11, 3], [123, 106, 9, 7, 9, 3], [123, 157, 11, 7, 11, 3], [123, 208, 10, 7, 10, 3], [123, 259, 9, 7, 9, 3], [123, 310, 11, 7, 11, 3], [123, 361, 9, 7, 9, 3], [123, 412, 11, 7, 11, 3], [123, 463, 6, 7, 6, 3], [123, 514, 10, 7, 10, 3], [123, 565, 10, 7, 10, 3], [123, 616, 10, 7, 10, 3], [123, 667, 13, 7, 13, 3], [123, 718, 11, 7, 11, 3], [123, 769, 10, 7, 10, 3], [184, 4, 11, 7, 11, 3], [184, 55, 10, 7, 10, 3], [184, 106, 9, 7, 9, 3], [184, 157, 9, 7, 9, 3], [184, 208, 9, 7, 9, 3], [184, 259, 11, 7, 11, 3], [184, 311, 8, 8, 8, 4], [184, 361, 12, 7, 12, 3], [184, 412, 10, 7, 10, 3], [184, 463, 12, 7, 12, 3], [184, 514, 9, 7, 9, 3], [184, 565, 6, 9, 6, 3], [184, 617, 10, 6, 10, 4], [184, 667, 6, 9, 6, 3], [184, 718, 10, 7, 10, 3], [184, 770, 8, 8, 8, 4], [245, 2, 8, 9, 8, 1], [245, 56, 10, 6, 10, 4], [245, 105, 8, 10, 8, 2], [245, 158, 9, 8, 9, 4], [245, 207, 8, 8, 8, 2], [245, 260, 8, 6, 8, 4], [245, 310, 9, 9, 9, 3], [245, 362, 9, 8, 9, 4], [245, 413, 9, 8, 9, 4], [245, 464, 7, 6, 7, 4], [245, 515, 9, 8, 9, 4], [245, 566, 9, 6, 9, 4], [245, 615, 9, 8, 9, 2], [245, 668, 9, 8, 9, 4], [245, 719, 9, 6, 9, 4], [245, 770, 8, 6, 8, 4], [306, 5, 9, 6, 9, 4], [306, 55, 8, 7, 8, 3], [306, 107, 8, 8, 8, 4], [306, 158, 9, 6, 9, 4], [306, 209, 8, 6, 8, 4], [306, 260, 9, 6, 9, 4], [306, 311, 11, 6, 11, 4], [306, 362, 11, 6, 11, 4], [306, 411, 8, 10, 8, 2], [306, 464, 10, 8, 10, 4], [306, 513, 8, 10, 8, 2], [306, 565, 8, 9, 8, 3], [306, 616, 5, 9, 5, 3], [306, 667, 8, 9, 8, 3], [306, 719, 9, 6, 9, 4], [306, 770, 3, 6, 3, 4], [367, 5, 3, 6, 3, 4], [367, 56, 3, 6, 3, 4], [367, 107, 3, 6, 3, 4], [367, 158, 3, 6, 3, 4], [367, 209, 3, 6, 3, 4], [367, 260, 3, 6, 3, 4], [367, 311, 3, 6, 3, 4], [367, 362, 3, 6, 3, 4], [367, 413, 3, 6, 3, 4], [367, 464, 3, 6, 3, 4], [367, 515, 3, 6, 3, 4], [367, 566, 3, 6, 3, 4], [367, 617, 3, 6, 3, 4], [367, 668, 3, 6, 3, 4], [367, 719, 3, 6, 3, 4], [367, 770, 3, 6, 3, 4], [428, 5, 3, 6, 3, 4], [428, 56, 3, 6, 3, 4], [428, 107, 3, 6, 3, 4], [428, 158, 3, 6, 3, 4], [428, 209, 3, 6, 3, 4], [428, 260, 3, 6, 3, 4], [428, 311, 3, 6, 3, 4], [428, 362, 3, 6, 3, 4], [428, 413, 3, 6, 3, 4], [428, 464, 3, 6, 3, 4], [428, 515, 3, 6, 3, 4], [428, 566, 3, 6, 3, 4], [428, 617, 3, 6, 3, 4], [428, 668, 3, 6, 3, 4], [428, 719, 3, 6, 3, 4], [428, 770, 3, 6, 3, 4], [489, 5, 3, 6, 3, 4], [489, 55, 10, 7, 10, 3], [489, 105, 6, 8, 6, 2], [489, 157, 9, 7, 9, 3], [489, 208, 6, 7, 6, 3], [489, 260, 10, 6, 10, 4], [489, 310, 8, 9, 8, 3], [489, 362, 10, 6, 10, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 10, 6, 10, 4], [489, 566, 13, 6, 13, 4], [489, 617, 13, 6, 13, 4], [489, 665, 9, 11, 9, 1], [489, 719, 13, 6, 13, 4], [489, 767, 9, 11, 9, 1], [550, 4, 7, 7, 7, 3], [550, 55, 9, 7, 9, 3], [550, 105, 7, 8, 7, 2], [550, 157, 9, 7, 9, 3], [550, 209, 9, 6, 9, 4], [550, 260, 10, 6, 10, 4], [550, 309, 8, 8, 8, 2], [550, 362, 8, 6, 8, 4], [550, 413, 9, 6, 9, 4], [550, 464, 9, 6, 9, 4], [550, 515, 9, 6, 9, 4], [550, 566, 9, 6, 9, 4], [550, 617, 12, 6, 12, 4], [550, 665, 9, 11, 9, 1], [550, 719, 13, 6, 13, 4], [550, 770, 10, 6, 10, 4], [611, 4, 11, 7, 11, 3], [611, 54, 10, 9, 10, 2], [611, 105, 11, 8, 11, 2], [611, 158, 12, 8, 12, 4], [611, 208, 11, 7, 11, 3], [611, 259, 11, 7, 11, 3], [611, 309, 11, 9, 11, 2], [611, 362, 11, 6, 11, 4], [611, 413, 11, 6, 11, 4], [611, 464, 10, 6, 10, 4], [611, 515, 10, 8, 10, 4], [611, 566, 10, 7, 10, 4], [611, 617, 10, 6, 10, 4], [611, 668, 10, 8, 10, 4], [611, 719, 10, 6, 10, 4], [611, 770, 10, 7, 10, 4], [672, 4, 11, 7, 11, 3], [672, 55, 10, 7, 10, 3], [672, 106, 11, 8, 11, 3], [672, 157, 11, 8, 11, 3], [672, 208, 13, 7, 13, 3], [672, 258, 12, 9, 12, 2], [672, 308, 9, 9, 9, 1], [672, 362, 6, 6, 6, 4], [672, 413, 10, 6, 10, 4], [1, 5, 6, 6, 6, 4], [794, 770, 3, 6, 3, 4], [672, 566, 14, 6, 14, 4], [672, 617, 13, 6, 13, 4], [672, 665, 9, 9, 9, 1], [672, 719, 13, 6, 13, 4], [672, 767, 9, 9, 9, 1], [733, 4, 10, 7, 10, 3], [733, 55, 6, 9, 6, 3], [733, 106, 11, 8, 11, 3], [733, 157, 11, 8, 11, 3], [733, 208, 12, 7, 12, 3], [733, 258, 10, 9, 10, 2], [733, 308, 7, 11, 7, 1], [733, 359, 7, 11, 7, 1], [733, 410, 7, 11, 7, 1], [733, 461, 7, 11, 7, 1], [733, 512, 7, 11, 7, 1], [733, 563, 7, 11, 7, 1], [733, 614, 8, 11, 8, 1], [733, 665, 8, 11, 8, 1], [733, 716, 8, 11, 8, 1], [733, 767, 8, 11, 8, 1], [1, 5, 6, 6, 6, 4], [794, 55, 6, 9, 6, 3], [794, 104, 6, 11, 6, 1], [794, 155, 10, 11, 10, 1], [794, 206, 10, 11, 10, 1], [794, 257, 10, 11, 10, 1], [794, 308, 7, 11, 7, 1], [794, 359, 7, 11, 7, 1], [794, 410, 7, 11, 7, 1], [794, 461, 7, 11, 7, 1], [794, 512, 7, 11, 7, 1], [794, 563, 7, 11, 7, 1], [794, 614, 8, 11, 8, 1], [794, 665, 8, 11, 8, 1], [794, 716, 8, 11, 8, 1], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 14, \"widestglyph\": 14, \"tallestglyph\": 11}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 57, 13, 10, 8, 5], [1, 108, 18, 10, 13, 5], [1, 159, 14, 10, 10, 5], [1, 210, 16, 10, 11, 5], [1, 261, 18, 10, 14, 5], [1, 312, 16, 10, 13, 5], [1, 364, 13, 9, 9, 6], [1, 414, 13, 13, 8, 5], [1, 465, 12, 13, 8, 5], [1, 517, 14, 7, 10, 6], [1, 567, 16, 9, 11, 5], [1, 625, 10, 5, 8, 12], [1, 672, 15, 3, 11, 8], [1, 727, 9, 3, 8, 12], [1, 771, 12, 10, 7, 5], [62, 6, 15, 10, 10, 5], [62, 57, 13, 10, 10, 5], [62, 108, 15, 10, 10, 5], [62, 159, 15, 10, 10, 5], [62, 210, 15, 10, 10, 5], [62, 261, 15, 10, 10, 5], [62, 312, 14, 10, 10, 5], [62, 363, 15, 10, 10, 5], [62, 414, 15, 10, 10, 5], [62, 465, 15, 10, 10, 5], [62, 519, 11, 7, 7, 8], [62, 570, 11, 8, 7, 8], [62, 620, 15, 7, 11, 7], [62, 672, 15, 5, 11, 8], [62, 722, 14, 7, 11, 7], [62, 771, 15, 10, 10, 5], [123, 6, 16, 10, 11, 5], [123, 57, 16, 10, 13, 5], [123, 108, 17, 10, 12, 5], [123, 159, 18, 10, 13, 5], [123, 210, 14, 10, 12, 5], [123, 261, 17, 10, 12, 5], [123, 312, 17, 10, 13, 5], [123, 363, 16, 10, 11, 5], [123, 414, 18, 10, 13, 5], [123, 465, 13, 10, 8, 5], [123, 515, 16, 11, 12, 4], [123, 567, 17, 10, 13, 5], [123, 618, 14, 10, 12, 5], [123, 669, 20, 10, 15, 5], [123, 720, 18, 10, 13, 5], [123, 771, 17, 10, 13, 5], [184, 6, 18, 10, 13, 5], [184, 57, 17, 10, 13, 5], [184, 108, 16, 10, 11, 5], [184, 159, 17, 10, 12, 5], [184, 210, 17, 10, 12, 5], [184, 261, 17, 10, 12, 5], [184, 314, 13, 10, 9, 7], [184, 363, 17, 10, 13, 5], [184, 415, 17, 9, 12, 6], [184, 465, 19, 10, 14, 5], [184, 516, 17, 10, 12, 5], [184, 567, 13, 13, 8, 5], [184, 620, 16, 8, 14, 7], [184, 669, 13, 13, 8, 5], [184, 719, 15, 11, 12, 4], [184, 781, 11, 3, 10, 15], [245, 4, 16, 3, 9, 3], [245, 59, 15, 8, 12, 7], [245, 107, 16, 14, 11, 4], [245, 161, 15, 11, 11, 7], [245, 209, 15, 11, 10, 4], [245, 263, 13, 8, 9, 7], [245, 312, 14, 12, 10, 5], [245, 365, 14, 11, 9, 7], [245, 416, 15, 11, 11, 7], [245, 467, 11, 8, 8, 7], [245, 518, 15, 11, 11, 7], [245, 569, 15, 8, 11, 7], [245, 617, 14, 11, 11, 4], [245, 671, 14, 11, 11, 7], [245, 722, 15, 8, 10, 7], [245, 773, 15, 8, 11, 7], [306, 8, 15, 8, 11, 7], [306, 56, 16, 11, 11, 4], [306, 110, 15, 11, 11, 7], [306, 161, 15, 8, 11, 7], [306, 212, 14, 8, 9, 7], [306, 263, 15, 8, 11, 7], [306, 313, 18, 9, 13, 6], [306, 365, 16, 8, 12, 7], [306, 412, 14, 15, 10, 3], [306, 467, 16, 11, 12, 7], [306, 515, 15, 14, 10, 4], [306, 567, 15, 13, 10, 5], [306, 618, 11, 13, 6, 5], [306, 669, 14, 13, 10, 5], [306, 723, 15, 3, 11, 8], [306, 768, 12, 13, 5, 2], [367, 3, 12, 13, 5, 2], [367, 54, 12, 13, 5, 2], [367, 105, 12, 13, 5, 2], [367, 156, 12, 13, 5, 2], [367, 207, 12, 13, 5, 2], [367, 258, 12, 13, 5, 2], [367, 309, 12, 13, 5, 2], [367, 360, 12, 13, 5, 2], [367, 411, 12, 13, 5, 2], [367, 462, 12, 13, 5, 2], [367, 513, 12, 13, 5, 2], [367, 564, 12, 13, 5, 2], [367, 615, 12, 13, 5, 2], [367, 666, 12, 13, 5, 2], [367, 717, 12, 13, 5, 2], [367, 768, 12, 13, 5, 2], [428, 3, 12, 13, 5, 2], [428, 54, 12, 13, 5, 2], [428, 105, 12, 13, 5, 2], [428, 156, 12, 13, 5, 2], [428, 207, 12, 13, 5, 2], [428, 258, 12, 13, 5, 2], [428, 309, 12, 13, 5, 2], [428, 360, 12, 13, 5, 2], [428, 411, 12, 13, 5, 2], [428, 462, 12, 13, 5, 2], [428, 513, 12, 13, 5, 2], [428, 564, 12, 13, 5, 2], [428, 615, 12, 13, 5, 2], [428, 666, 12, 13, 5, 2], [428, 717, 12, 13, 5, 2], [428, 768, 12, 13, 5, 2], [489, 3, 12, 13, 5, 2], [489, 57, 16, 10, 11, 5], [489, 107, 14, 5, 7, 4], [489, 160, 16, 9, 11, 6], [489, 210, 12, 10, 6, 5], [489, 263, 17, 5, 13, 7], [489, 312, 14, 13, 10, 5], [489, 364, 16, 9, 13, 6], [489, 415, 16, 9, 13, 6], [489, 466, 17, 9, 13, 6], [489, 517, 16, 9, 13, 6], [489, 567, 21, 9, 17, 5], [489, 618, 20, 9, 16, 5], [489, 666, 17, 13, 11, 2], [489, 720, 20, 9, 16, 5], [489, 768, 16, 13, 11, 2], [550, 4, 15, 6, 9, 3], [550, 57, 16, 10, 11, 5], [550, 107, 16, 5, 9, 4], [550, 160, 15, 9, 11, 6], [550, 211, 17, 9, 11, 6], [550, 262, 18, 7, 13, 6], [550, 312, 15, 10, 10, 5], [550, 365, 14, 6, 10, 7], [550, 415, 15, 7, 11, 6], [550, 466, 15, 8, 11, 6], [550, 517, 16, 7, 11, 6], [550, 568, 16, 7, 11, 6], [550, 625, 17, 3, 16, 12], [550, 665, 16, 17, 11, 1], [550, 723, 20, 3, 16, 8], [550, 771, 17, 10, 12, 5], [611, 6, 18, 10, 14, 5], [611, 56, 18, 11, 12, 4], [611, 107, 19, 11, 14, 4], [611, 160, 19, 11, 16, 6], [611, 209, 19, 11, 14, 4], [611, 260, 19, 11, 14, 4], [611, 311, 20, 11, 14, 4], [611, 365, 16, 8, 13, 7], [611, 416, 17, 8, 13, 7], [611, 467, 16, 8, 13, 7], [611, 511, 1, 1, 13, 1], [611, 568, 17, 10, 13, 6], [611, 620, 17, 8, 13, 7], [611, 671, 17, 10, 13, 7], [611, 722, 16, 7, 13, 7], [611, 772, 16, 9, 13, 6], [672, 6, 18, 10, 13, 5], [672, 57, 18, 10, 13, 5], [672, 108, 17, 10, 13, 5], [672, 159, 17, 10, 13, 5], [672, 210, 20, 7, 15, 5], [672, 260, 20, 12, 14, 4], [672, 310, 18, 12, 11, 3], [672, 366, 13, 3, 11, 8], [672, 417, 17, 6, 13, 8], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 569, 20, 8, 17, 7], [672, 620, 20, 8, 16, 7], [672, 666, 17, 13, 11, 2], [672, 722, 19, 8, 16, 7], [672, 768, 17, 13, 11, 2], [733, 5, 14, 11, 10, 4], [733, 56, 14, 13, 8, 4], [733, 108, 17, 10, 13, 5], [733, 159, 17, 10, 13, 5], [733, 210, 18, 6, 13, 5], [733, 261, 18, 11, 13, 5], [733, 310, 15, 16, 9, 3], [733, 358, 14, 19, 9, 0], [733, 409, 14, 19, 9, 0], [733, 462, 16, 17, 9, 2], [733, 511, 14, 19, 9, 0], [733, 562, 14, 17, 9, 0], [733, 615, 17, 17, 10, 2], [733, 664, 16, 19, 10, 0], [733, 715, 16, 17, 10, 0], [733, 766, 16, 19, 10, 0], [1, 1, 1, 1, 7, 1], [794, 56, 12, 13, 8, 4], [794, 104, 15, 16, 8, 1], [794, 156, 19, 17, 12, 2], [794, 205, 18, 19, 12, 0], [794, 256, 18, 17, 12, 0], [794, 308, 14, 18, 9, 1], [794, 358, 16, 19, 9, 0], [794, 409, 16, 19, 9, 0], [794, 462, 16, 17, 9, 2], [794, 511, 16, 19, 9, 0], [794, 562, 16, 17, 9, 0], [794, 615, 14, 17, 10, 2], [794, 664, 16, 19, 10, 0], [794, 715, 16, 17, 10, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 14, \"widestlogicalchar\": 17, \"widestglyph\": 21, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 57, 12, 8, 7, 5], [1, 108, 17, 8, 12, 5], [1, 159, 13, 8, 9, 5], [1, 210, 15, 8, 10, 5], [1, 261, 17, 8, 13, 5], [1, 312, 15, 8, 12, 5], [1, 364, 12, 7, 8, 6], [1, 414, 12, 11, 7, 5], [1, 465, 11, 11, 7, 5], [1, 517, 13, 5, 9, 6], [1, 567, 15, 7, 10, 5], [1, 625, 9, 3, 7, 12], [1, 672, 14, 1, 10, 8], [1, 727, 8, 1, 7, 12], [1, 771, 11, 8, 6, 5], [62, 6, 14, 8, 9, 5], [62, 57, 12, 8, 9, 5], [62, 108, 14, 8, 9, 5], [62, 159, 14, 8, 9, 5], [62, 210, 14, 8, 9, 5], [62, 261, 14, 8, 9, 5], [62, 312, 13, 8, 9, 5], [62, 363, 14, 8, 9, 5], [62, 414, 14, 8, 9, 5], [62, 465, 14, 8, 9, 5], [62, 519, 10, 5, 6, 8], [62, 570, 10, 6, 6, 8], [62, 620, 14, 5, 10, 7], [62, 672, 14, 3, 10, 8], [62, 722, 13, 5, 10, 7], [62, 771, 14, 8, 9, 5], [123, 6, 15, 8, 10, 5], [123, 57, 15, 8, 12, 5], [123, 108, 16, 8, 11, 5], [123, 159, 17, 8, 12, 5], [123, 210, 13, 8, 11, 5], [123, 261, 16, 8, 11, 5], [123, 312, 16, 8, 12, 5], [123, 363, 15, 8, 10, 5], [123, 414, 17, 8, 12, 5], [123, 465, 12, 8, 7, 5], [123, 515, 15, 9, 11, 4], [123, 567, 16, 8, 12, 5], [123, 618, 13, 8, 11, 5], [123, 669, 19, 8, 14, 5], [123, 720, 17, 8, 12, 5], [123, 771, 16, 8, 12, 5], [184, 6, 17, 8, 12, 5], [184, 57, 16, 8, 12, 5], [184, 108, 15, 8, 10, 5], [184, 159, 16, 8, 11, 5], [184, 210, 16, 8, 11, 5], [184, 261, 16, 8, 11, 5], [184, 314, 12, 8, 8, 7], [184, 363, 16, 8, 12, 5], [184, 415, 16, 7, 11, 6], [184, 465, 18, 8, 13, 5], [184, 516, 16, 8, 11, 5], [184, 567, 12, 11, 7, 5], [184, 620, 15, 6, 13, 7], [184, 669, 12, 11, 7, 5], [184, 719, 14, 9, 11, 4], [184, 781, 10, 1, 9, 15], [245, 4, 15, 1, 8, 3], [245, 59, 14, 6, 11, 7], [245, 107, 15, 12, 10, 4], [245, 161, 14, 9, 10, 7], [245, 209, 14, 9, 9, 4], [245, 263, 12, 6, 8, 7], [245, 312, 13, 10, 9, 5], [245, 365, 13, 9, 8, 7], [245, 416, 14, 9, 10, 7], [245, 467, 10, 6, 7, 7], [245, 518, 14, 9, 10, 7], [245, 569, 14, 6, 10, 7], [245, 617, 13, 9, 10, 4], [245, 671, 13, 9, 10, 7], [245, 722, 14, 6, 9, 7], [245, 773, 14, 6, 10, 7], [306, 8, 14, 6, 10, 7], [306, 56, 15, 9, 10, 4], [306, 110, 14, 9, 10, 7], [306, 161, 14, 6, 10, 7], [306, 212, 13, 6, 8, 7], [306, 263, 14, 6, 10, 7], [306, 313, 17, 7, 12, 6], [306, 365, 15, 6, 11, 7], [306, 412, 13, 13, 9, 3], [306, 467, 15, 9, 11, 7], [306, 515, 14, 12, 9, 4], [306, 567, 14, 11, 9, 5], [306, 618, 10, 11, 5, 5], [306, 669, 13, 11, 9, 5], [306, 723, 14, 1, 10, 8], [306, 768, 11, 11, 4, 2], [367, 3, 11, 11, 4, 2], [367, 54, 11, 11, 4, 2], [367, 105, 11, 11, 4, 2], [367, 156, 11, 11, 4, 2], [367, 207, 11, 11, 4, 2], [367, 258, 11, 11, 4, 2], [367, 309, 11, 11, 4, 2], [367, 360, 11, 11, 4, 2], [367, 411, 11, 11, 4, 2], [367, 462, 11, 11, 4, 2], [367, 513, 11, 11, 4, 2], [367, 564, 11, 11, 4, 2], [367, 615, 11, 11, 4, 2], [367, 666, 11, 11, 4, 2], [367, 717, 11, 11, 4, 2], [367, 768, 11, 11, 4, 2], [428, 3, 11, 11, 4, 2], [428, 54, 11, 11, 4, 2], [428, 105, 11, 11, 4, 2], [428, 156, 11, 11, 4, 2], [428, 207, 11, 11, 4, 2], [428, 258, 11, 11, 4, 2], [428, 309, 11, 11, 4, 2], [428, 360, 11, 11, 4, 2], [428, 411, 11, 11, 4, 2], [428, 462, 11, 11, 4, 2], [428, 513, 11, 11, 4, 2], [428, 564, 11, 11, 4, 2], [428, 615, 11, 11, 4, 2], [428, 666, 11, 11, 4, 2], [428, 717, 11, 11, 4, 2], [428, 768, 11, 11, 4, 2], [489, 3, 11, 11, 4, 2], [489, 57, 15, 8, 10, 5], [489, 107, 13, 3, 6, 4], [489, 160, 15, 7, 10, 6], [489, 210, 11, 8, 5, 5], [489, 263, 16, 3, 12, 7], [489, 312, 13, 11, 9, 5], [489, 364, 15, 7, 12, 6], [489, 415, 15, 7, 12, 6], [489, 466, 16, 7, 12, 6], [489, 517, 15, 7, 12, 6], [489, 567, 20, 7, 16, 5], [489, 618, 19, 7, 15, 5], [489, 666, 16, 11, 10, 2], [489, 720, 19, 7, 15, 5], [489, 768, 15, 11, 10, 2], [550, 4, 14, 4, 8, 3], [550, 57, 15, 8, 10, 5], [550, 107, 15, 3, 8, 4], [550, 160, 14, 7, 10, 6], [550, 211, 16, 7, 10, 6], [550, 262, 17, 5, 12, 6], [550, 312, 14, 8, 9, 5], [550, 365, 13, 4, 9, 7], [550, 415, 14, 5, 10, 6], [550, 466, 14, 6, 10, 6], [550, 517, 15, 5, 10, 6], [550, 568, 15, 5, 10, 6], [550, 625, 16, 1, 15, 12], [550, 665, 15, 15, 10, 1], [550, 723, 19, 1, 15, 8], [550, 771, 16, 8, 11, 5], [611, 6, 17, 8, 13, 5], [611, 56, 17, 9, 11, 4], [611, 107, 18, 9, 13, 4], [611, 160, 18, 9, 15, 6], [611, 209, 18, 9, 13, 4], [611, 260, 18, 9, 13, 4], [611, 311, 19, 9, 13, 4], [611, 365, 15, 6, 12, 7], [611, 416, 16, 6, 12, 7], [611, 467, 15, 6, 12, 7], [611, 511, 1, 1, 12, 1], [611, 568, 16, 8, 12, 6], [611, 620, 16, 6, 12, 7], [611, 671, 16, 8, 12, 7], [611, 722, 15, 5, 12, 7], [611, 772, 15, 7, 12, 6], [672, 6, 17, 8, 12, 5], [672, 57, 17, 8, 12, 5], [672, 108, 16, 8, 12, 5], [672, 159, 16, 8, 12, 5], [672, 210, 19, 5, 14, 5], [672, 260, 19, 10, 13, 4], [672, 310, 17, 10, 10, 3], [672, 366, 12, 1, 10, 8], [672, 417, 16, 4, 12, 8], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 569, 19, 6, 16, 7], [672, 620, 19, 6, 15, 7], [672, 666, 16, 11, 10, 2], [672, 722, 18, 6, 15, 7], [672, 768, 16, 11, 10, 2], [733, 5, 13, 9, 9, 4], [733, 56, 13, 11, 7, 4], [733, 108, 16, 8, 12, 5], [733, 159, 16, 8, 12, 5], [733, 210, 17, 4, 12, 5], [733, 261, 17, 9, 12, 5], [733, 310, 14, 14, 8, 3], [733, 358, 12, 17, 8, 0], [733, 409, 12, 17, 8, 0], [733, 462, 15, 15, 8, 2], [733, 511, 12, 17, 8, 0], [733, 562, 12, 15, 8, 0], [733, 615, 16, 15, 9, 2], [733, 664, 14, 17, 9, 0], [733, 715, 14, 15, 9, 0], [733, 766, 14, 17, 9, 0], [1, 1, 1, 1, 6, 1], [794, 56, 11, 11, 7, 4], [794, 104, 14, 14, 7, 1], [794, 156, 18, 15, 11, 2], [794, 205, 16, 17, 11, 0], [794, 256, 16, 15, 11, 0], [794, 308, 13, 16, 8, 1], [794, 358, 15, 17, 8, 0], [794, 409, 15, 17, 8, 0], [794, 462, 15, 15, 8, 2], [794, 511, 15, 17, 8, 0], [794, 562, 15, 15, 8, 0], [794, 615, 13, 15, 9, 2], [794, 664, 14, 17, 9, 0], [794, 715, 14, 15, 9, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 13, \"widestlogicalchar\": 16, \"widestglyph\": 20, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 7, 6, 7, 8], [1, 57, 8, 10, 8, 5], [1, 108, 13, 10, 13, 5], [1, 159, 10, 10, 10, 5], [1, 210, 11, 10, 11, 5], [1, 261, 14, 10, 14, 5], [1, 312, 13, 10, 13, 5], [1, 364, 9, 9, 9, 6], [1, 414, 8, 13, 8, 5], [1, 465, 8, 13, 8, 5], [1, 517, 10, 8, 10, 6], [1, 567, 11, 9, 11, 5], [1, 621, 8, 9, 8, 8], [1, 672, 11, 6, 11, 8], [1, 723, 8, 7, 8, 8], [1, 771, 7, 10, 7, 5], [62, 6, 10, 10, 10, 5], [62, 57, 10, 10, 10, 5], [62, 108, 10, 10, 10, 5], [62, 159, 10, 10, 10, 5], [62, 210, 10, 10, 10, 5], [62, 261, 10, 10, 10, 5], [62, 312, 10, 10, 10, 5], [62, 363, 10, 10, 10, 5], [62, 414, 10, 10, 10, 5], [62, 465, 10, 10, 10, 5], [62, 519, 7, 7, 7, 8], [62, 570, 7, 8, 7, 8], [62, 620, 11, 7, 11, 7], [62, 672, 11, 6, 11, 8], [62, 722, 11, 7, 11, 7], [62, 771, 10, 10, 10, 5], [123, 6, 11, 10, 11, 5], [123, 57, 13, 10, 13, 5], [123, 108, 12, 10, 12, 5], [123, 159, 13, 10, 13, 5], [123, 210, 12, 10, 12, 5], [123, 261, 12, 10, 12, 5], [123, 312, 13, 10, 13, 5], [123, 363, 11, 10, 11, 5], [123, 414, 13, 10, 13, 5], [123, 465, 8, 10, 8, 5], [123, 515, 12, 11, 12, 4], [123, 567, 13, 10, 13, 5], [123, 618, 12, 10, 12, 5], [123, 669, 15, 10, 15, 5], [123, 720, 13, 10, 13, 5], [123, 771, 13, 10, 13, 5], [184, 6, 13, 10, 13, 5], [184, 57, 13, 10, 13, 5], [184, 108, 11, 10, 11, 5], [184, 159, 12, 10, 12, 5], [184, 210, 12, 10, 12, 5], [184, 261, 12, 10, 12, 5], [184, 314, 9, 10, 9, 7], [184, 363, 13, 10, 13, 5], [184, 415, 12, 9, 12, 6], [184, 465, 14, 10, 14, 5], [184, 516, 12, 10, 12, 5], [184, 567, 8, 13, 8, 5], [184, 620, 14, 8, 14, 7], [184, 669, 8, 13, 8, 5], [184, 719, 12, 11, 12, 4], [184, 774, 10, 10, 10, 8], [245, 4, 9, 11, 9, 3], [245, 59, 12, 8, 12, 7], [245, 107, 11, 14, 11, 4], [245, 161, 11, 11, 11, 7], [245, 209, 10, 11, 10, 4], [245, 263, 9, 8, 9, 7], [245, 312, 10, 12, 10, 5], [245, 365, 9, 11, 9, 7], [245, 416, 11, 11, 11, 7], [245, 467, 8, 8, 8, 7], [245, 518, 11, 11, 11, 7], [245, 569, 11, 8, 11, 7], [245, 617, 11, 11, 11, 4], [245, 671, 11, 11, 11, 7], [245, 722, 10, 8, 10, 7], [245, 773, 11, 8, 11, 7], [306, 8, 11, 8, 11, 7], [306, 56, 11, 11, 11, 4], [306, 110, 11, 11, 11, 7], [306, 161, 11, 8, 11, 7], [306, 212, 9, 8, 9, 7], [306, 263, 11, 8, 11, 7], [306, 313, 13, 9, 13, 6], [306, 365, 12, 8, 12, 7], [306, 412, 10, 15, 10, 3], [306, 467, 12, 11, 12, 7], [306, 515, 10, 14, 10, 4], [306, 567, 10, 13, 10, 5], [306, 618, 6, 13, 6, 5], [306, 669, 10, 13, 10, 5], [306, 723, 11, 6, 11, 8], [306, 768, 5, 13, 5, 2], [367, 3, 5, 13, 5, 2], [367, 54, 5, 13, 5, 2], [367, 105, 5, 13, 5, 2], [367, 156, 5, 13, 5, 2], [367, 207, 5, 13, 5, 2], [367, 258, 5, 13, 5, 2], [367, 309, 5, 13, 5, 2], [367, 360, 5, 13, 5, 2], [367, 411, 5, 13, 5, 2], [367, 462, 5, 13, 5, 2], [367, 513, 5, 13, 5, 2], [367, 564, 5, 13, 5, 2], [367, 615, 5, 13, 5, 2], [367, 666, 5, 13, 5, 2], [367, 717, 5, 13, 5, 2], [367, 768, 5, 13, 5, 2], [428, 3, 5, 13, 5, 2], [428, 54, 5, 13, 5, 2], [428, 105, 5, 13, 5, 2], [428, 156, 5, 13, 5, 2], [428, 207, 5, 13, 5, 2], [428, 258, 5, 13, 5, 2], [428, 309, 5, 13, 5, 2], [428, 360, 5, 13, 5, 2], [428, 411, 5, 13, 5, 2], [428, 462, 5, 13, 5, 2], [428, 513, 5, 13, 5, 2], [428, 564, 5, 13, 5, 2], [428, 615, 5, 13, 5, 2], [428, 666, 5, 13, 5, 2], [428, 717, 5, 13, 5, 2], [428, 768, 5, 13, 5, 2], [489, 3, 5, 13, 5, 2], [489, 57, 11, 10, 11, 5], [489, 107, 7, 10, 7, 4], [489, 160, 11, 9, 11, 6], [489, 210, 6, 10, 6, 5], [489, 263, 13, 7, 13, 7], [489, 312, 10, 13, 10, 5], [489, 364, 13, 9, 13, 6], [489, 415, 13, 9, 13, 6], [489, 466, 13, 9, 13, 6], [489, 517, 13, 9, 13, 6], [489, 567, 17, 9, 17, 5], [489, 618, 16, 9, 16, 5], [489, 666, 11, 13, 11, 2], [489, 720, 16, 9, 16, 5], [489, 768, 11, 13, 11, 2], [550, 4, 9, 11, 9, 3], [550, 57, 11, 10, 11, 5], [550, 107, 9, 10, 9, 4], [550, 160, 11, 9, 11, 6], [550, 211, 11, 9, 11, 6], [550, 262, 13, 8, 13, 6], [550, 312, 10, 10, 10, 5], [550, 365, 10, 7, 10, 7], [550, 415, 11, 8, 11, 6], [550, 466, 11, 8, 11, 6], [550, 517, 11, 8, 11, 6], [550, 568, 11, 8, 11, 6], [550, 621, 16, 7, 16, 8], [550, 665, 11, 17, 11, 1], [550, 723, 16, 6, 16, 8], [550, 771, 12, 10, 12, 5], [611, 6, 14, 10, 14, 5], [611, 56, 12, 11, 12, 4], [611, 107, 14, 11, 14, 4], [611, 160, 16, 11, 16, 6], [611, 209, 14, 11, 14, 4], [611, 260, 14, 11, 14, 4], [611, 311, 14, 11, 14, 4], [611, 365, 13, 8, 13, 7], [611, 416, 13, 8, 13, 7], [611, 467, 13, 8, 13, 7], [611, 518, 13, 10, 13, 7], [611, 568, 13, 10, 13, 6], [611, 620, 13, 8, 13, 7], [611, 671, 13, 10, 13, 7], [611, 722, 13, 7, 13, 7], [611, 772, 13, 9, 13, 6], [672, 6, 13, 10, 13, 5], [672, 57, 13, 10, 13, 5], [672, 108, 13, 10, 13, 5], [672, 159, 13, 10, 13, 5], [672, 210, 15, 9, 15, 5], [672, 260, 14, 12, 14, 4], [672, 310, 11, 12, 11, 3], [672, 366, 11, 6, 11, 8], [672, 417, 13, 6, 13, 8], [1, 9, 7, 6, 7, 8], [794, 774, 3, 6, 3, 8], [672, 569, 17, 8, 17, 7], [672, 620, 16, 8, 16, 7], [672, 666, 11, 13, 11, 2], [672, 722, 16, 8, 16, 7], [672, 768, 11, 13, 11, 2], [733, 5, 10, 11, 10, 4], [733, 56, 8, 13, 8, 4], [733, 108, 13, 10, 13, 5], [733, 159, 13, 10, 13, 5], [733, 210, 13, 9, 13, 5], [733, 261, 13, 11, 13, 5], [733, 310, 9, 16, 9, 3], [733, 358, 9, 19, 9, 0], [733, 409, 9, 19, 9, 0], [733, 462, 9, 17, 9, 2], [733, 511, 9, 19, 9, 0], [733, 562, 9, 17, 9, 0], [733, 615, 10, 17, 10, 2], [733, 664, 10, 19, 10, 0], [733, 715, 10, 17, 10, 0], [733, 766, 10, 19, 10, 0], [1, 9, 7, 6, 7, 8], [794, 56, 8, 13, 8, 4], [794, 104, 8, 16, 8, 1], [794, 156, 12, 17, 12, 2], [794, 205, 12, 19, 12, 0], [794, 256, 12, 17, 12, 0], [794, 308, 9, 18, 9, 1], [794, 358, 9, 19, 9, 0], [794, 409, 9, 19, 9, 0], [794, 462, 9, 17, 9, 2], [794, 511, 9, 19, 9, 0], [794, 562, 9, 17, 9, 0], [794, 615, 10, 17, 10, 2], [794, 664, 10, 19, 10, 0], [794, 715, 10, 17, 10, 0], [794, 774, 3, 6, 3, 8], [855, 9, 3, 6, 3, 8], [855, 60, 3, 6, 3, 8], [855, 111, 3, 6, 3, 8], [855, 162, 3, 6, 3, 8], [855, 213, 3, 6, 3, 8], [855, 264, 3, 6, 3, 8], [855, 315, 3, 6, 3, 8], [855, 366, 3, 6, 3, 8], [855, 417, 3, 6, 3, 8], [855, 468, 3, 6, 3, 8], [855, 519, 3, 6, 3, 8], [855, 570, 3, 6, 3, 8], [855, 621, 3, 6, 3, 8], [855, 672, 3, 6, 3, 8], [855, 723, 3, 6, 3, 8], [855, 774, 3, 6, 3, 8]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 6, 6, 6, 7], [1, 57, 7, 8, 7, 5], [1, 108, 12, 8, 12, 5], [1, 159, 9, 8, 9, 5], [1, 210, 10, 8, 10, 5], [1, 261, 13, 8, 13, 5], [1, 312, 12, 8, 12, 5], [1, 364, 8, 7, 8, 6], [1, 414, 7, 11, 7, 5], [1, 465, 7, 11, 7, 5], [1, 517, 9, 7, 9, 6], [1, 567, 10, 8, 10, 5], [1, 620, 7, 8, 7, 7], [1, 671, 10, 6, 10, 7], [1, 722, 7, 6, 7, 7], [1, 771, 6, 8, 6, 5], [62, 6, 9, 8, 9, 5], [62, 57, 9, 8, 9, 5], [62, 108, 9, 8, 9, 5], [62, 159, 9, 8, 9, 5], [62, 210, 9, 8, 9, 5], [62, 261, 9, 8, 9, 5], [62, 312, 9, 8, 9, 5], [62, 363, 9, 8, 9, 5], [62, 414, 9, 8, 9, 5], [62, 465, 9, 8, 9, 5], [62, 518, 6, 6, 6, 7], [62, 569, 6, 7, 6, 7], [62, 620, 10, 6, 10, 7], [62, 671, 10, 6, 10, 7], [62, 722, 10, 6, 10, 7], [62, 771, 9, 8, 9, 5], [123, 6, 10, 8, 10, 5], [123, 57, 12, 8, 12, 5], [123, 108, 11, 8, 11, 5], [123, 159, 12, 8, 12, 5], [123, 210, 11, 8, 11, 5], [123, 261, 11, 8, 11, 5], [123, 312, 12, 8, 12, 5], [123, 363, 10, 8, 10, 5], [123, 414, 12, 8, 12, 5], [123, 465, 7, 8, 7, 5], [123, 515, 11, 9, 11, 4], [123, 567, 12, 8, 12, 5], [123, 618, 11, 8, 11, 5], [123, 669, 14, 8, 14, 5], [123, 720, 12, 8, 12, 5], [123, 771, 12, 8, 12, 5], [184, 6, 12, 8, 12, 5], [184, 57, 12, 8, 12, 5], [184, 108, 10, 8, 10, 5], [184, 159, 11, 8, 11, 5], [184, 210, 11, 8, 11, 5], [184, 261, 11, 8, 11, 5], [184, 314, 8, 8, 8, 7], [184, 363, 12, 8, 12, 5], [184, 415, 11, 7, 11, 6], [184, 465, 13, 8, 13, 5], [184, 516, 11, 8, 11, 5], [184, 567, 7, 11, 7, 5], [184, 620, 13, 6, 13, 7], [184, 669, 7, 11, 7, 5], [184, 719, 11, 9, 11, 4], [184, 773, 9, 9, 9, 7], [245, 4, 8, 10, 8, 3], [245, 59, 11, 6, 11, 7], [245, 107, 10, 12, 10, 4], [245, 161, 10, 9, 10, 7], [245, 209, 9, 9, 9, 4], [245, 263, 8, 6, 8, 7], [245, 312, 9, 10, 9, 5], [245, 365, 8, 9, 8, 7], [245, 416, 10, 9, 10, 7], [245, 467, 7, 6, 7, 7], [245, 518, 10, 9, 10, 7], [245, 569, 10, 6, 10, 7], [245, 617, 10, 9, 10, 4], [245, 671, 10, 9, 10, 7], [245, 722, 9, 6, 9, 7], [245, 773, 10, 6, 10, 7], [306, 8, 10, 6, 10, 7], [306, 56, 10, 9, 10, 4], [306, 110, 10, 9, 10, 7], [306, 161, 10, 6, 10, 7], [306, 212, 8, 6, 8, 7], [306, 263, 10, 6, 10, 7], [306, 313, 12, 7, 12, 6], [306, 365, 11, 6, 11, 7], [306, 412, 9, 13, 9, 3], [306, 467, 11, 9, 11, 7], [306, 515, 9, 12, 9, 4], [306, 567, 9, 11, 9, 5], [306, 618, 5, 11, 5, 5], [306, 669, 9, 11, 9, 5], [306, 722, 10, 6, 10, 7], [306, 768, 4, 11, 4, 2], [367, 3, 4, 11, 4, 2], [367, 54, 4, 11, 4, 2], [367, 105, 4, 11, 4, 2], [367, 156, 4, 11, 4, 2], [367, 207, 4, 11, 4, 2], [367, 258, 4, 11, 4, 2], [367, 309, 4, 11, 4, 2], [367, 360, 4, 11, 4, 2], [367, 411, 4, 11, 4, 2], [367, 462, 4, 11, 4, 2], [367, 513, 4, 11, 4, 2], [367, 564, 4, 11, 4, 2], [367, 615, 4, 11, 4, 2], [367, 666, 4, 11, 4, 2], [367, 717, 4, 11, 4, 2], [367, 768, 4, 11, 4, 2], [428, 3, 4, 11, 4, 2], [428, 54, 4, 11, 4, 2], [428, 105, 4, 11, 4, 2], [428, 156, 4, 11, 4, 2], [428, 207, 4, 11, 4, 2], [428, 258, 4, 11, 4, 2], [428, 309, 4, 11, 4, 2], [428, 360, 4, 11, 4, 2], [428, 411, 4, 11, 4, 2], [428, 462, 4, 11, 4, 2], [428, 513, 4, 11, 4, 2], [428, 564, 4, 11, 4, 2], [428, 615, 4, 11, 4, 2], [428, 666, 4, 11, 4, 2], [428, 717, 4, 11, 4, 2], [428, 768, 4, 11, 4, 2], [489, 3, 4, 11, 4, 2], [489, 57, 10, 8, 10, 5], [489, 107, 6, 9, 6, 4], [489, 160, 10, 7, 10, 6], [489, 210, 5, 8, 5, 5], [489, 263, 12, 6, 12, 7], [489, 312, 9, 11, 9, 5], [489, 364, 12, 7, 12, 6], [489, 415, 12, 7, 12, 6], [489, 466, 12, 7, 12, 6], [489, 517, 12, 7, 12, 6], [489, 567, 16, 8, 16, 5], [489, 618, 15, 8, 15, 5], [489, 666, 10, 11, 10, 2], [489, 720, 15, 8, 15, 5], [489, 768, 10, 11, 10, 2], [550, 4, 8, 10, 8, 3], [550, 57, 10, 8, 10, 5], [550, 107, 8, 9, 8, 4], [550, 160, 10, 7, 10, 6], [550, 211, 10, 7, 10, 6], [550, 262, 12, 7, 12, 6], [550, 312, 9, 8, 9, 5], [550, 365, 9, 6, 9, 7], [550, 415, 10, 7, 10, 6], [550, 466, 10, 7, 10, 6], [550, 517, 10, 7, 10, 6], [550, 568, 10, 7, 10, 6], [550, 620, 15, 6, 15, 7], [550, 665, 10, 15, 10, 1], [550, 722, 15, 6, 15, 7], [550, 771, 11, 8, 11, 5], [611, 6, 13, 8, 13, 5], [611, 56, 11, 9, 11, 4], [611, 107, 13, 9, 13, 4], [611, 160, 15, 9, 15, 6], [611, 209, 13, 9, 13, 4], [611, 260, 13, 9, 13, 4], [611, 311, 13, 9, 13, 4], [611, 365, 12, 6, 12, 7], [611, 416, 12, 6, 12, 7], [611, 467, 12, 6, 12, 7], [611, 518, 12, 8, 12, 7], [611, 568, 12, 8, 12, 6], [611, 620, 12, 6, 12, 7], [611, 671, 12, 8, 12, 7], [611, 722, 12, 6, 12, 7], [611, 772, 12, 7, 12, 6], [672, 6, 12, 8, 12, 5], [672, 57, 12, 8, 12, 5], [672, 108, 12, 8, 12, 5], [672, 159, 12, 8, 12, 5], [672, 210, 14, 8, 14, 5], [672, 260, 13, 10, 13, 4], [672, 310, 10, 10, 10, 3], [672, 365, 10, 6, 10, 7], [672, 416, 12, 6, 12, 7], [1, 8, 6, 6, 6, 7], [794, 773, 3, 6, 3, 7], [672, 569, 16, 6, 16, 7], [672, 620, 15, 6, 15, 7], [672, 666, 10, 11, 10, 2], [672, 722, 15, 6, 15, 7], [672, 768, 10, 11, 10, 2], [733, 5, 9, 9, 9, 4], [733, 56, 7, 11, 7, 4], [733, 108, 12, 8, 12, 5], [733, 159, 12, 8, 12, 5], [733, 210, 12, 8, 12, 5], [733, 261, 12, 9, 12, 5], [733, 310, 8, 14, 8, 3], [733, 358, 8, 17, 8, 0], [733, 409, 8, 17, 8, 0], [733, 462, 8, 15, 8, 2], [733, 511, 8, 17, 8, 0], [733, 562, 8, 15, 8, 0], [733, 615, 9, 15, 9, 2], [733, 664, 9, 17, 9, 0], [733, 715, 9, 15, 9, 0], [733, 766, 9, 17, 9, 0], [1, 8, 6, 6, 6, 7], [794, 56, 7, 11, 7, 4], [794, 104, 7, 14, 7, 1], [794, 156, 11, 15, 11, 2], [794, 205, 11, 17, 11, 0], [794, 256, 11, 15, 11, 0], [794, 308, 8, 16, 8, 1], [794, 358, 8, 17, 8, 0], [794, 409, 8, 17, 8, 0], [794, 462, 8, 15, 8, 2], [794, 511, 8, 17, 8, 0], [794, 562, 8, 15, 8, 0], [794, 615, 9, 15, 9, 2], [794, 664, 9, 17, 9, 0], [794, 715, 9, 15, 9, 0], [794, 773, 3, 6, 3, 7], [855, 8, 3, 6, 3, 7], [855, 59, 3, 6, 3, 7], [855, 110, 3, 6, 3, 7], [855, 161, 3, 6, 3, 7], [855, 212, 3, 6, 3, 7], [855, 263, 3, 6, 3, 7], [855, 314, 3, 6, 3, 7], [855, 365, 3, 6, 3, 7], [855, 416, 3, 6, 3, 7], [855, 467, 3, 6, 3, 7], [855, 518, 3, 6, 3, 7], [855, 569, 3, 6, 3, 7], [855, 620, 3, 6, 3, 7], [855, 671, 3, 6, 3, 7], [855, 722, 3, 6, 3, 7], [855, 773, 3, 6, 3, 7]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 57, 12, 10, 8, 5], [1, 108, 17, 10, 13, 5], [1, 159, 13, 10, 10, 5], [1, 210, 15, 10, 11, 5], [1, 261, 17, 10, 14, 5], [1, 312, 15, 10, 13, 5], [1, 364, 12, 9, 9, 6], [1, 414, 12, 13, 8, 5], [1, 465, 11, 13, 8, 5], [1, 517, 13, 7, 10, 6], [1, 567, 15, 9, 11, 5], [1, 625, 9, 5, 8, 12], [1, 672, 14, 3, 11, 8], [1, 727, 8, 3, 8, 12], [1, 771, 11, 10, 7, 5], [62, 6, 14, 10, 10, 5], [62, 57, 12, 10, 10, 5], [62, 108, 14, 10, 10, 5], [62, 159, 14, 10, 10, 5], [62, 210, 14, 10, 10, 5], [62, 261, 14, 10, 10, 5], [62, 312, 13, 10, 10, 5], [62, 363, 14, 10, 10, 5], [62, 414, 14, 10, 10, 5], [62, 465, 14, 10, 10, 5], [62, 519, 10, 7, 7, 8], [62, 570, 10, 8, 7, 8], [62, 620, 14, 7, 11, 7], [62, 672, 14, 5, 11, 8], [62, 722, 13, 7, 11, 7], [62, 771, 14, 10, 10, 5], [123, 6, 15, 10, 11, 5], [123, 57, 15, 10, 13, 5], [123, 108, 16, 10, 12, 5], [123, 159, 17, 10, 13, 5], [123, 210, 13, 10, 12, 5], [123, 261, 16, 10, 12, 5], [123, 312, 16, 10, 13, 5], [123, 363, 15, 10, 11, 5], [123, 414, 17, 10, 13, 5], [123, 465, 12, 10, 8, 5], [123, 515, 15, 11, 12, 4], [123, 567, 16, 10, 13, 5], [123, 618, 13, 10, 12, 5], [123, 669, 19, 10, 15, 5], [123, 720, 17, 10, 13, 5], [123, 771, 16, 10, 13, 5], [184, 6, 17, 10, 13, 5], [184, 57, 16, 10, 13, 5], [184, 108, 15, 10, 11, 5], [184, 159, 16, 10, 12, 5], [184, 210, 16, 10, 12, 5], [184, 261, 16, 10, 12, 5], [184, 314, 12, 10, 9, 7], [184, 363, 16, 10, 13, 5], [184, 415, 16, 9, 12, 6], [184, 465, 18, 10, 14, 5], [184, 516, 16, 10, 12, 5], [184, 567, 12, 13, 8, 5], [184, 620, 15, 8, 14, 7], [184, 669, 12, 13, 8, 5], [184, 719, 14, 11, 12, 4], [184, 781, 10, 3, 10, 15], [245, 4, 15, 3, 9, 3], [245, 59, 14, 8, 12, 7], [245, 107, 15, 14, 11, 4], [245, 161, 14, 11, 11, 7], [245, 209, 14, 11, 10, 4], [245, 263, 12, 8, 9, 7], [245, 312, 13, 12, 10, 5], [245, 365, 13, 11, 9, 7], [245, 416, 14, 11, 11, 7], [245, 467, 10, 8, 8, 7], [245, 518, 14, 11, 11, 7], [245, 569, 14, 8, 11, 7], [245, 617, 13, 11, 11, 4], [245, 671, 13, 11, 11, 7], [245, 722, 14, 8, 10, 7], [245, 773, 14, 8, 11, 7], [306, 8, 14, 8, 11, 7], [306, 56, 15, 11, 11, 4], [306, 110, 14, 11, 11, 7], [306, 161, 14, 8, 11, 7], [306, 212, 13, 8, 9, 7], [306, 263, 14, 8, 11, 7], [306, 313, 17, 9, 13, 6], [306, 365, 15, 8, 12, 7], [306, 412, 13, 15, 10, 3], [306, 467, 15, 11, 12, 7], [306, 515, 14, 14, 10, 4], [306, 567, 14, 13, 10, 5], [306, 618, 10, 13, 6, 5], [306, 669, 13, 13, 10, 5], [306, 723, 14, 3, 11, 8], [306, 768, 11, 13, 5, 2], [367, 3, 11, 13, 5, 2], [367, 54, 11, 13, 5, 2], [367, 105, 11, 13, 5, 2], [367, 156, 11, 13, 5, 2], [367, 207, 11, 13, 5, 2], [367, 258, 11, 13, 5, 2], [367, 309, 11, 13, 5, 2], [367, 360, 11, 13, 5, 2], [367, 411, 11, 13, 5, 2], [367, 462, 11, 13, 5, 2], [367, 513, 11, 13, 5, 2], [367, 564, 11, 13, 5, 2], [367, 615, 11, 13, 5, 2], [367, 666, 11, 13, 5, 2], [367, 717, 11, 13, 5, 2], [367, 768, 11, 13, 5, 2], [428, 3, 11, 13, 5, 2], [428, 54, 11, 13, 5, 2], [428, 105, 11, 13, 5, 2], [428, 156, 11, 13, 5, 2], [428, 207, 11, 13, 5, 2], [428, 258, 11, 13, 5, 2], [428, 309, 11, 13, 5, 2], [428, 360, 11, 13, 5, 2], [428, 411, 11, 13, 5, 2], [428, 462, 11, 13, 5, 2], [428, 513, 11, 13, 5, 2], [428, 564, 11, 13, 5, 2], [428, 615, 11, 13, 5, 2], [428, 666, 11, 13, 5, 2], [428, 717, 11, 13, 5, 2], [428, 768, 11, 13, 5, 2], [489, 3, 11, 13, 5, 2], [489, 57, 15, 10, 11, 5], [489, 107, 13, 5, 7, 4], [489, 160, 15, 9, 11, 6], [489, 210, 11, 10, 6, 5], [489, 263, 16, 5, 13, 7], [489, 312, 13, 13, 10, 5], [489, 364, 15, 9, 13, 6], [489, 415, 15, 9, 13, 6], [489, 466, 16, 9, 13, 6], [489, 517, 15, 9, 13, 6], [489, 567, 20, 9, 17, 5], [489, 618, 19, 9, 16, 5], [489, 666, 16, 13, 11, 2], [489, 720, 19, 9, 16, 5], [489, 768, 15, 13, 11, 2], [550, 4, 14, 6, 9, 3], [550, 57, 15, 10, 11, 5], [550, 107, 15, 5, 9, 4], [550, 160, 14, 9, 11, 6], [550, 211, 16, 9, 11, 6], [550, 262, 17, 7, 13, 6], [550, 312, 14, 10, 10, 5], [550, 365, 13, 6, 10, 7], [550, 415, 14, 7, 11, 6], [550, 466, 14, 8, 11, 6], [550, 517, 15, 7, 11, 6], [550, 568, 15, 7, 11, 6], [550, 625, 16, 3, 16, 12], [550, 665, 15, 17, 11, 1], [550, 723, 19, 3, 16, 8], [550, 771, 16, 10, 12, 5], [611, 6, 17, 10, 14, 5], [611, 56, 17, 11, 12, 4], [611, 107, 18, 11, 14, 4], [611, 160, 18, 11, 16, 6], [611, 209, 18, 11, 14, 4], [611, 260, 18, 11, 14, 4], [611, 311, 19, 11, 14, 4], [611, 365, 15, 8, 13, 7], [611, 416, 16, 8, 13, 7], [611, 467, 15, 8, 13, 7], [611, 511, 1, 1, 13, 1], [611, 568, 16, 10, 13, 6], [611, 620, 16, 8, 13, 7], [611, 671, 16, 10, 13, 7], [611, 722, 15, 7, 13, 7], [611, 772, 15, 9, 13, 6], [672, 6, 17, 10, 13, 5], [672, 57, 17, 10, 13, 5], [672, 108, 16, 10, 13, 5], [672, 159, 16, 10, 13, 5], [672, 210, 19, 7, 15, 5], [672, 260, 19, 12, 14, 4], [672, 310, 17, 12, 11, 3], [672, 366, 12, 3, 11, 8], [672, 417, 16, 6, 13, 8], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 569, 19, 8, 17, 7], [672, 620, 19, 8, 16, 7], [672, 666, 16, 13, 11, 2], [672, 722, 18, 8, 16, 7], [672, 768, 16, 13, 11, 2], [733, 5, 13, 11, 10, 4], [733, 56, 13, 13, 8, 4], [733, 108, 16, 10, 13, 5], [733, 159, 16, 10, 13, 5], [733, 210, 17, 6, 13, 5], [733, 261, 17, 11, 13, 5], [733, 310, 14, 16, 9, 3], [733, 358, 13, 19, 9, 0], [733, 409, 13, 19, 9, 0], [733, 462, 15, 17, 9, 2], [733, 511, 13, 19, 9, 0], [733, 562, 13, 17, 9, 0], [733, 615, 16, 17, 10, 2], [733, 664, 15, 19, 10, 0], [733, 715, 15, 17, 10, 0], [733, 766, 15, 19, 10, 0], [1, 1, 1, 1, 7, 1], [794, 56, 11, 13, 8, 4], [794, 104, 14, 16, 8, 1], [794, 156, 18, 17, 12, 2], [794, 205, 17, 19, 12, 0], [794, 256, 17, 17, 12, 0], [794, 308, 13, 18, 9, 1], [794, 358, 15, 19, 9, 0], [794, 409, 15, 19, 9, 0], [794, 462, 15, 17, 9, 2], [794, 511, 15, 19, 9, 0], [794, 562, 15, 17, 9, 0], [794, 615, 13, 17, 10, 2], [794, 664, 15, 19, 10, 0], [794, 715, 15, 17, 10, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 14, \"widestlogicalchar\": 17, \"widestglyph\": 20, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 57, 11, 8, 7, 5], [1, 108, 16, 8, 12, 5], [1, 159, 12, 8, 9, 5], [1, 210, 14, 8, 10, 5], [1, 261, 16, 8, 13, 5], [1, 312, 14, 8, 12, 5], [1, 364, 11, 7, 8, 6], [1, 414, 11, 11, 7, 5], [1, 465, 10, 11, 7, 5], [1, 517, 12, 5, 9, 6], [1, 567, 14, 7, 10, 5], [1, 625, 8, 3, 7, 12], [1, 672, 13, 1, 10, 8], [1, 727, 7, 1, 7, 12], [1, 771, 10, 8, 6, 5], [62, 6, 13, 8, 9, 5], [62, 57, 11, 8, 9, 5], [62, 108, 13, 8, 9, 5], [62, 159, 13, 8, 9, 5], [62, 210, 13, 8, 9, 5], [62, 261, 13, 8, 9, 5], [62, 312, 12, 8, 9, 5], [62, 363, 13, 8, 9, 5], [62, 414, 13, 8, 9, 5], [62, 465, 13, 8, 9, 5], [62, 519, 9, 5, 6, 8], [62, 570, 9, 6, 6, 8], [62, 620, 13, 5, 10, 7], [62, 672, 13, 3, 10, 8], [62, 722, 12, 5, 10, 7], [62, 771, 13, 8, 9, 5], [123, 6, 14, 8, 10, 5], [123, 57, 14, 8, 12, 5], [123, 108, 15, 8, 11, 5], [123, 159, 16, 8, 12, 5], [123, 210, 12, 8, 11, 5], [123, 261, 15, 8, 11, 5], [123, 312, 15, 8, 12, 5], [123, 363, 14, 8, 10, 5], [123, 414, 16, 8, 12, 5], [123, 465, 11, 8, 7, 5], [123, 515, 14, 9, 11, 4], [123, 567, 15, 8, 12, 5], [123, 618, 12, 8, 11, 5], [123, 669, 18, 8, 14, 5], [123, 720, 16, 8, 12, 5], [123, 771, 15, 8, 12, 5], [184, 6, 16, 8, 12, 5], [184, 57, 15, 8, 12, 5], [184, 108, 14, 8, 10, 5], [184, 159, 15, 8, 11, 5], [184, 210, 15, 8, 11, 5], [184, 261, 15, 8, 11, 5], [184, 314, 11, 8, 8, 7], [184, 363, 15, 8, 12, 5], [184, 415, 15, 7, 11, 6], [184, 465, 17, 8, 13, 5], [184, 516, 15, 8, 11, 5], [184, 567, 11, 11, 7, 5], [184, 620, 14, 6, 13, 7], [184, 669, 11, 11, 7, 5], [184, 719, 13, 9, 11, 4], [184, 781, 9, 1, 9, 15], [245, 4, 14, 1, 8, 3], [245, 59, 13, 6, 11, 7], [245, 107, 14, 12, 10, 4], [245, 161, 13, 9, 10, 7], [245, 209, 13, 9, 9, 4], [245, 263, 11, 6, 8, 7], [245, 312, 12, 10, 9, 5], [245, 365, 12, 9, 8, 7], [245, 416, 13, 9, 10, 7], [245, 467, 9, 6, 7, 7], [245, 518, 13, 9, 10, 7], [245, 569, 13, 6, 10, 7], [245, 617, 12, 9, 10, 4], [245, 671, 12, 9, 10, 7], [245, 722, 13, 6, 9, 7], [245, 773, 13, 6, 10, 7], [306, 8, 13, 6, 10, 7], [306, 56, 14, 9, 10, 4], [306, 110, 13, 9, 10, 7], [306, 161, 13, 6, 10, 7], [306, 212, 12, 6, 8, 7], [306, 263, 13, 6, 10, 7], [306, 313, 16, 7, 12, 6], [306, 365, 14, 6, 11, 7], [306, 412, 12, 13, 9, 3], [306, 467, 14, 9, 11, 7], [306, 515, 13, 12, 9, 4], [306, 567, 13, 11, 9, 5], [306, 618, 9, 11, 5, 5], [306, 669, 12, 11, 9, 5], [306, 723, 13, 1, 10, 8], [306, 768, 10, 11, 4, 2], [367, 3, 10, 11, 4, 2], [367, 54, 10, 11, 4, 2], [367, 105, 10, 11, 4, 2], [367, 156, 10, 11, 4, 2], [367, 207, 10, 11, 4, 2], [367, 258, 10, 11, 4, 2], [367, 309, 10, 11, 4, 2], [367, 360, 10, 11, 4, 2], [367, 411, 10, 11, 4, 2], [367, 462, 10, 11, 4, 2], [367, 513, 10, 11, 4, 2], [367, 564, 10, 11, 4, 2], [367, 615, 10, 11, 4, 2], [367, 666, 10, 11, 4, 2], [367, 717, 10, 11, 4, 2], [367, 768, 10, 11, 4, 2], [428, 3, 10, 11, 4, 2], [428, 54, 10, 11, 4, 2], [428, 105, 10, 11, 4, 2], [428, 156, 10, 11, 4, 2], [428, 207, 10, 11, 4, 2], [428, 258, 10, 11, 4, 2], [428, 309, 10, 11, 4, 2], [428, 360, 10, 11, 4, 2], [428, 411, 10, 11, 4, 2], [428, 462, 10, 11, 4, 2], [428, 513, 10, 11, 4, 2], [428, 564, 10, 11, 4, 2], [428, 615, 10, 11, 4, 2], [428, 666, 10, 11, 4, 2], [428, 717, 10, 11, 4, 2], [428, 768, 10, 11, 4, 2], [489, 3, 10, 11, 4, 2], [489, 57, 14, 8, 10, 5], [489, 107, 12, 3, 6, 4], [489, 160, 14, 7, 10, 6], [489, 210, 10, 8, 5, 5], [489, 263, 15, 3, 12, 7], [489, 312, 12, 11, 9, 5], [489, 364, 14, 7, 12, 6], [489, 415, 14, 7, 12, 6], [489, 466, 15, 7, 12, 6], [489, 517, 14, 7, 12, 6], [489, 567, 19, 7, 16, 5], [489, 618, 18, 7, 15, 5], [489, 666, 15, 11, 10, 2], [489, 720, 18, 7, 15, 5], [489, 768, 14, 11, 10, 2], [550, 4, 13, 4, 8, 3], [550, 57, 14, 8, 10, 5], [550, 107, 14, 3, 8, 4], [550, 160, 13, 7, 10, 6], [550, 211, 15, 7, 10, 6], [550, 262, 16, 5, 12, 6], [550, 312, 13, 8, 9, 5], [550, 365, 12, 4, 9, 7], [550, 415, 13, 5, 10, 6], [550, 466, 13, 6, 10, 6], [550, 517, 14, 5, 10, 6], [550, 568, 14, 5, 10, 6], [550, 625, 15, 1, 15, 12], [550, 665, 14, 15, 10, 1], [550, 723, 18, 1, 15, 8], [550, 771, 15, 8, 11, 5], [611, 6, 16, 8, 13, 5], [611, 56, 16, 9, 11, 4], [611, 107, 17, 9, 13, 4], [611, 160, 17, 9, 15, 6], [611, 209, 17, 9, 13, 4], [611, 260, 17, 9, 13, 4], [611, 311, 18, 9, 13, 4], [611, 365, 14, 6, 12, 7], [611, 416, 15, 6, 12, 7], [611, 467, 14, 6, 12, 7], [611, 511, 1, 1, 12, 1], [611, 568, 15, 8, 12, 6], [611, 620, 15, 6, 12, 7], [611, 671, 15, 8, 12, 7], [611, 722, 14, 5, 12, 7], [611, 772, 14, 7, 12, 6], [672, 6, 16, 8, 12, 5], [672, 57, 16, 8, 12, 5], [672, 108, 15, 8, 12, 5], [672, 159, 15, 8, 12, 5], [672, 210, 18, 5, 14, 5], [672, 260, 18, 10, 13, 4], [672, 310, 16, 10, 10, 3], [672, 366, 11, 1, 10, 8], [672, 417, 15, 4, 12, 8], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 569, 18, 6, 16, 7], [672, 620, 18, 6, 15, 7], [672, 666, 15, 11, 10, 2], [672, 722, 17, 6, 15, 7], [672, 768, 15, 11, 10, 2], [733, 5, 12, 9, 9, 4], [733, 56, 12, 11, 7, 4], [733, 108, 15, 8, 12, 5], [733, 159, 15, 8, 12, 5], [733, 210, 16, 4, 12, 5], [733, 261, 16, 9, 12, 5], [733, 310, 13, 14, 8, 3], [733, 358, 11, 17, 8, 0], [733, 409, 11, 17, 8, 0], [733, 462, 14, 15, 8, 2], [733, 511, 11, 17, 8, 0], [733, 562, 11, 15, 8, 0], [733, 615, 15, 15, 9, 2], [733, 664, 13, 17, 9, 0], [733, 715, 13, 15, 9, 0], [733, 766, 13, 17, 9, 0], [1, 1, 1, 1, 6, 1], [794, 56, 10, 11, 7, 4], [794, 104, 13, 14, 7, 1], [794, 156, 17, 15, 11, 2], [794, 205, 15, 17, 11, 0], [794, 256, 15, 15, 11, 0], [794, 308, 12, 16, 8, 1], [794, 359, 14, 16, 8, 1], [794, 410, 14, 16, 8, 1], [794, 462, 14, 15, 8, 2], [794, 512, 14, 16, 8, 1], [794, 563, 14, 14, 8, 1], [794, 615, 12, 15, 9, 2], [794, 664, 13, 17, 9, 0], [794, 715, 13, 15, 9, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 13, \"widestlogicalchar\": 16, \"widestglyph\": 19, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 19, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 9, 7, 6, 7, 8], [1, 57, 8, 10, 8, 5], [1, 108, 13, 10, 13, 5], [1, 159, 10, 10, 10, 5], [1, 210, 11, 10, 11, 5], [1, 261, 14, 10, 14, 5], [1, 312, 13, 10, 13, 5], [1, 364, 9, 9, 9, 6], [1, 414, 8, 13, 8, 5], [1, 465, 8, 13, 8, 5], [1, 517, 10, 8, 10, 6], [1, 567, 11, 9, 11, 5], [1, 621, 8, 9, 8, 8], [1, 672, 11, 6, 11, 8], [1, 723, 8, 7, 8, 8], [1, 771, 7, 10, 7, 5], [62, 6, 10, 10, 10, 5], [62, 57, 10, 10, 10, 5], [62, 108, 10, 10, 10, 5], [62, 159, 10, 10, 10, 5], [62, 210, 10, 10, 10, 5], [62, 261, 10, 10, 10, 5], [62, 312, 10, 10, 10, 5], [62, 363, 10, 10, 10, 5], [62, 414, 10, 10, 10, 5], [62, 465, 10, 10, 10, 5], [62, 519, 7, 7, 7, 8], [62, 570, 7, 8, 7, 8], [62, 620, 11, 7, 11, 7], [62, 672, 11, 6, 11, 8], [62, 722, 11, 7, 11, 7], [62, 771, 10, 10, 10, 5], [123, 6, 11, 10, 11, 5], [123, 57, 13, 10, 13, 5], [123, 108, 12, 10, 12, 5], [123, 159, 13, 10, 13, 5], [123, 210, 12, 10, 12, 5], [123, 261, 12, 10, 12, 5], [123, 312, 13, 10, 13, 5], [123, 363, 11, 10, 11, 5], [123, 414, 13, 10, 13, 5], [123, 465, 8, 10, 8, 5], [123, 515, 12, 11, 12, 4], [123, 567, 13, 10, 13, 5], [123, 618, 12, 10, 12, 5], [123, 669, 15, 10, 15, 5], [123, 720, 13, 10, 13, 5], [123, 771, 13, 10, 13, 5], [184, 6, 13, 10, 13, 5], [184, 57, 13, 10, 13, 5], [184, 108, 11, 10, 11, 5], [184, 159, 12, 10, 12, 5], [184, 210, 12, 10, 12, 5], [184, 261, 12, 10, 12, 5], [184, 314, 9, 10, 9, 7], [184, 363, 13, 10, 13, 5], [184, 415, 12, 9, 12, 6], [184, 465, 14, 10, 14, 5], [184, 516, 12, 10, 12, 5], [184, 567, 8, 13, 8, 5], [184, 620, 14, 8, 14, 7], [184, 669, 8, 13, 8, 5], [184, 719, 12, 11, 12, 4], [184, 774, 10, 10, 10, 8], [245, 4, 9, 11, 9, 3], [245, 59, 12, 8, 12, 7], [245, 107, 11, 14, 11, 4], [245, 161, 11, 11, 11, 7], [245, 209, 10, 11, 10, 4], [245, 263, 9, 8, 9, 7], [245, 312, 10, 12, 10, 5], [245, 365, 9, 11, 9, 7], [245, 416, 11, 11, 11, 7], [245, 467, 8, 8, 8, 7], [245, 518, 11, 11, 11, 7], [245, 569, 11, 8, 11, 7], [245, 617, 11, 11, 11, 4], [245, 671, 11, 11, 11, 7], [245, 722, 10, 8, 10, 7], [245, 773, 11, 8, 11, 7], [306, 8, 11, 8, 11, 7], [306, 56, 11, 11, 11, 4], [306, 110, 11, 11, 11, 7], [306, 161, 11, 8, 11, 7], [306, 212, 9, 8, 9, 7], [306, 263, 11, 8, 11, 7], [306, 313, 13, 9, 13, 6], [306, 365, 12, 8, 12, 7], [306, 412, 10, 15, 10, 3], [306, 467, 12, 11, 12, 7], [306, 515, 10, 14, 10, 4], [306, 567, 10, 13, 10, 5], [306, 618, 6, 13, 6, 5], [306, 669, 10, 13, 10, 5], [306, 723, 11, 6, 11, 8], [306, 768, 5, 13, 5, 2], [367, 3, 5, 13, 5, 2], [367, 54, 5, 13, 5, 2], [367, 105, 5, 13, 5, 2], [367, 156, 5, 13, 5, 2], [367, 207, 5, 13, 5, 2], [367, 258, 5, 13, 5, 2], [367, 309, 5, 13, 5, 2], [367, 360, 5, 13, 5, 2], [367, 411, 5, 13, 5, 2], [367, 462, 5, 13, 5, 2], [367, 513, 5, 13, 5, 2], [367, 564, 5, 13, 5, 2], [367, 615, 5, 13, 5, 2], [367, 666, 5, 13, 5, 2], [367, 717, 5, 13, 5, 2], [367, 768, 5, 13, 5, 2], [428, 3, 5, 13, 5, 2], [428, 54, 5, 13, 5, 2], [428, 105, 5, 13, 5, 2], [428, 156, 5, 13, 5, 2], [428, 207, 5, 13, 5, 2], [428, 258, 5, 13, 5, 2], [428, 309, 5, 13, 5, 2], [428, 360, 5, 13, 5, 2], [428, 411, 5, 13, 5, 2], [428, 462, 5, 13, 5, 2], [428, 513, 5, 13, 5, 2], [428, 564, 5, 13, 5, 2], [428, 615, 5, 13, 5, 2], [428, 666, 5, 13, 5, 2], [428, 717, 5, 13, 5, 2], [428, 768, 5, 13, 5, 2], [489, 3, 5, 13, 5, 2], [489, 57, 11, 10, 11, 5], [489, 107, 7, 10, 7, 4], [489, 160, 11, 9, 11, 6], [489, 210, 6, 10, 6, 5], [489, 263, 13, 7, 13, 7], [489, 312, 10, 13, 10, 5], [489, 364, 13, 9, 13, 6], [489, 415, 13, 9, 13, 6], [489, 466, 13, 9, 13, 6], [489, 517, 13, 9, 13, 6], [489, 567, 17, 9, 17, 5], [489, 618, 16, 9, 16, 5], [489, 666, 11, 13, 11, 2], [489, 720, 16, 9, 16, 5], [489, 768, 11, 13, 11, 2], [550, 4, 9, 11, 9, 3], [550, 57, 11, 10, 11, 5], [550, 107, 9, 10, 9, 4], [550, 160, 11, 9, 11, 6], [550, 211, 11, 9, 11, 6], [550, 262, 13, 8, 13, 6], [550, 312, 10, 10, 10, 5], [550, 365, 10, 7, 10, 7], [550, 415, 11, 8, 11, 6], [550, 466, 11, 8, 11, 6], [550, 517, 11, 8, 11, 6], [550, 568, 11, 8, 11, 6], [550, 621, 16, 7, 16, 8], [550, 665, 11, 17, 11, 1], [550, 723, 16, 6, 16, 8], [550, 771, 12, 10, 12, 5], [611, 6, 14, 10, 14, 5], [611, 56, 12, 11, 12, 4], [611, 107, 14, 11, 14, 4], [611, 160, 16, 11, 16, 6], [611, 209, 14, 11, 14, 4], [611, 260, 14, 11, 14, 4], [611, 311, 14, 11, 14, 4], [611, 365, 13, 8, 13, 7], [611, 416, 13, 8, 13, 7], [611, 467, 13, 8, 13, 7], [611, 518, 13, 10, 13, 7], [611, 568, 13, 10, 13, 6], [611, 620, 13, 8, 13, 7], [611, 671, 13, 10, 13, 7], [611, 722, 13, 7, 13, 7], [611, 772, 13, 9, 13, 6], [672, 6, 13, 10, 13, 5], [672, 57, 13, 10, 13, 5], [672, 108, 13, 10, 13, 5], [672, 159, 13, 10, 13, 5], [672, 210, 15, 9, 15, 5], [672, 260, 14, 12, 14, 4], [672, 310, 11, 12, 11, 3], [672, 366, 11, 6, 11, 8], [672, 417, 13, 6, 13, 8], [1, 9, 7, 6, 7, 8], [794, 774, 3, 6, 3, 8], [672, 569, 17, 8, 17, 7], [672, 620, 16, 8, 16, 7], [672, 666, 11, 13, 11, 2], [672, 722, 16, 8, 16, 7], [672, 768, 11, 13, 11, 2], [733, 5, 10, 11, 10, 4], [733, 56, 8, 13, 8, 4], [733, 108, 13, 10, 13, 5], [733, 159, 13, 10, 13, 5], [733, 210, 13, 9, 13, 5], [733, 261, 13, 11, 13, 5], [733, 310, 9, 16, 9, 3], [733, 358, 9, 19, 9, 0], [733, 409, 9, 19, 9, 0], [733, 462, 9, 17, 9, 2], [733, 511, 9, 19, 9, 0], [733, 562, 9, 17, 9, 0], [733, 615, 10, 17, 10, 2], [733, 664, 10, 19, 10, 0], [733, 715, 10, 17, 10, 0], [733, 766, 10, 19, 10, 0], [1, 9, 7, 6, 7, 8], [794, 56, 8, 13, 8, 4], [794, 104, 8, 16, 8, 1], [794, 156, 12, 17, 12, 2], [794, 205, 12, 19, 12, 0], [794, 256, 12, 17, 12, 0], [794, 308, 9, 18, 9, 1], [794, 358, 9, 19, 9, 0], [794, 409, 9, 19, 9, 0], [794, 462, 9, 17, 9, 2], [794, 511, 9, 19, 9, 0], [794, 562, 9, 17, 9, 0], [794, 615, 10, 17, 10, 2], [794, 664, 10, 19, 10, 0], [794, 715, 10, 17, 10, 0], [794, 774, 3, 6, 3, 8], [855, 9, 3, 6, 3, 8], [855, 60, 3, 6, 3, 8], [855, 111, 3, 6, 3, 8], [855, 162, 3, 6, 3, 8], [855, 213, 3, 6, 3, 8], [855, 264, 3, 6, 3, 8], [855, 315, 3, 6, 3, 8], [855, 366, 3, 6, 3, 8], [855, 417, 3, 6, 3, 8], [855, 468, 3, 6, 3, 8], [855, 519, 3, 6, 3, 8], [855, 570, 3, 6, 3, 8], [855, 621, 3, 6, 3, 8], [855, 672, 3, 6, 3, 8], [855, 723, 3, 6, 3, 8], [855, 774, 3, 6, 3, 8]], \"widestlogicalchar\": 17, \"widestglyph\": 17, \"tallestglyph\": 19}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_12_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 6, 6, 6, 7], [1, 57, 7, 8, 7, 5], [1, 108, 12, 8, 12, 5], [1, 159, 9, 8, 9, 5], [1, 210, 10, 8, 10, 5], [1, 261, 13, 8, 13, 5], [1, 312, 12, 8, 12, 5], [1, 364, 8, 7, 8, 6], [1, 414, 7, 11, 7, 5], [1, 465, 7, 11, 7, 5], [1, 517, 9, 7, 9, 6], [1, 567, 10, 8, 10, 5], [1, 620, 7, 8, 7, 7], [1, 671, 10, 6, 10, 7], [1, 722, 7, 6, 7, 7], [1, 771, 6, 8, 6, 5], [62, 6, 9, 8, 9, 5], [62, 57, 9, 8, 9, 5], [62, 108, 9, 8, 9, 5], [62, 159, 9, 8, 9, 5], [62, 210, 9, 8, 9, 5], [62, 261, 9, 8, 9, 5], [62, 312, 9, 8, 9, 5], [62, 363, 9, 8, 9, 5], [62, 414, 9, 8, 9, 5], [62, 465, 9, 8, 9, 5], [62, 518, 6, 6, 6, 7], [62, 569, 6, 7, 6, 7], [62, 620, 10, 6, 10, 7], [62, 671, 10, 6, 10, 7], [62, 722, 10, 6, 10, 7], [62, 771, 9, 8, 9, 5], [123, 6, 10, 8, 10, 5], [123, 57, 12, 8, 12, 5], [123, 108, 11, 8, 11, 5], [123, 159, 12, 8, 12, 5], [123, 210, 11, 8, 11, 5], [123, 261, 11, 8, 11, 5], [123, 312, 12, 8, 12, 5], [123, 363, 10, 8, 10, 5], [123, 414, 12, 8, 12, 5], [123, 465, 7, 8, 7, 5], [123, 515, 11, 9, 11, 4], [123, 567, 12, 8, 12, 5], [123, 618, 11, 8, 11, 5], [123, 669, 14, 8, 14, 5], [123, 720, 12, 8, 12, 5], [123, 771, 12, 8, 12, 5], [184, 6, 12, 8, 12, 5], [184, 57, 12, 8, 12, 5], [184, 108, 10, 8, 10, 5], [184, 159, 11, 8, 11, 5], [184, 210, 11, 8, 11, 5], [184, 261, 11, 8, 11, 5], [184, 314, 8, 8, 8, 7], [184, 363, 12, 8, 12, 5], [184, 415, 11, 7, 11, 6], [184, 465, 13, 8, 13, 5], [184, 516, 11, 8, 11, 5], [184, 567, 7, 11, 7, 5], [184, 620, 13, 6, 13, 7], [184, 669, 7, 11, 7, 5], [184, 719, 11, 9, 11, 4], [184, 773, 9, 9, 9, 7], [245, 4, 8, 10, 8, 3], [245, 59, 11, 6, 11, 7], [245, 107, 10, 12, 10, 4], [245, 161, 10, 9, 10, 7], [245, 209, 9, 9, 9, 4], [245, 263, 8, 6, 8, 7], [245, 312, 9, 10, 9, 5], [245, 365, 8, 9, 8, 7], [245, 416, 10, 9, 10, 7], [245, 467, 7, 6, 7, 7], [245, 518, 10, 9, 10, 7], [245, 569, 10, 6, 10, 7], [245, 617, 10, 9, 10, 4], [245, 671, 10, 9, 10, 7], [245, 722, 9, 6, 9, 7], [245, 773, 10, 6, 10, 7], [306, 8, 10, 6, 10, 7], [306, 56, 10, 9, 10, 4], [306, 110, 10, 9, 10, 7], [306, 161, 10, 6, 10, 7], [306, 212, 8, 6, 8, 7], [306, 263, 10, 6, 10, 7], [306, 313, 12, 7, 12, 6], [306, 365, 11, 6, 11, 7], [306, 412, 9, 13, 9, 3], [306, 467, 11, 9, 11, 7], [306, 515, 9, 12, 9, 4], [306, 567, 9, 11, 9, 5], [306, 618, 5, 11, 5, 5], [306, 669, 9, 11, 9, 5], [306, 722, 10, 6, 10, 7], [306, 768, 4, 11, 4, 2], [367, 3, 4, 11, 4, 2], [367, 54, 4, 11, 4, 2], [367, 105, 4, 11, 4, 2], [367, 156, 4, 11, 4, 2], [367, 207, 4, 11, 4, 2], [367, 258, 4, 11, 4, 2], [367, 309, 4, 11, 4, 2], [367, 360, 4, 11, 4, 2], [367, 411, 4, 11, 4, 2], [367, 462, 4, 11, 4, 2], [367, 513, 4, 11, 4, 2], [367, 564, 4, 11, 4, 2], [367, 615, 4, 11, 4, 2], [367, 666, 4, 11, 4, 2], [367, 717, 4, 11, 4, 2], [367, 768, 4, 11, 4, 2], [428, 3, 4, 11, 4, 2], [428, 54, 4, 11, 4, 2], [428, 105, 4, 11, 4, 2], [428, 156, 4, 11, 4, 2], [428, 207, 4, 11, 4, 2], [428, 258, 4, 11, 4, 2], [428, 309, 4, 11, 4, 2], [428, 360, 4, 11, 4, 2], [428, 411, 4, 11, 4, 2], [428, 462, 4, 11, 4, 2], [428, 513, 4, 11, 4, 2], [428, 564, 4, 11, 4, 2], [428, 615, 4, 11, 4, 2], [428, 666, 4, 11, 4, 2], [428, 717, 4, 11, 4, 2], [428, 768, 4, 11, 4, 2], [489, 3, 4, 11, 4, 2], [489, 57, 10, 8, 10, 5], [489, 107, 6, 9, 6, 4], [489, 160, 10, 7, 10, 6], [489, 210, 5, 8, 5, 5], [489, 263, 12, 6, 12, 7], [489, 312, 9, 11, 9, 5], [489, 364, 12, 7, 12, 6], [489, 415, 12, 7, 12, 6], [489, 466, 12, 7, 12, 6], [489, 517, 12, 7, 12, 6], [489, 567, 16, 8, 16, 5], [489, 618, 15, 8, 15, 5], [489, 666, 10, 11, 10, 2], [489, 720, 15, 8, 15, 5], [489, 768, 10, 11, 10, 2], [550, 4, 8, 10, 8, 3], [550, 57, 10, 8, 10, 5], [550, 107, 8, 9, 8, 4], [550, 160, 10, 7, 10, 6], [550, 211, 10, 7, 10, 6], [550, 262, 12, 7, 12, 6], [550, 312, 9, 8, 9, 5], [550, 365, 9, 6, 9, 7], [550, 415, 10, 7, 10, 6], [550, 466, 10, 7, 10, 6], [550, 517, 10, 7, 10, 6], [550, 568, 10, 7, 10, 6], [550, 620, 15, 6, 15, 7], [550, 665, 10, 15, 10, 1], [550, 722, 15, 6, 15, 7], [550, 771, 11, 8, 11, 5], [611, 6, 13, 8, 13, 5], [611, 56, 11, 9, 11, 4], [611, 107, 13, 9, 13, 4], [611, 160, 15, 9, 15, 6], [611, 209, 13, 9, 13, 4], [611, 260, 13, 9, 13, 4], [611, 311, 13, 9, 13, 4], [611, 365, 12, 6, 12, 7], [611, 416, 12, 6, 12, 7], [611, 467, 12, 6, 12, 7], [611, 518, 12, 8, 12, 7], [611, 568, 12, 8, 12, 6], [611, 620, 12, 6, 12, 7], [611, 671, 12, 8, 12, 7], [611, 722, 12, 6, 12, 7], [611, 772, 12, 7, 12, 6], [672, 6, 12, 8, 12, 5], [672, 57, 12, 8, 12, 5], [672, 108, 12, 8, 12, 5], [672, 159, 12, 8, 12, 5], [672, 210, 14, 8, 14, 5], [672, 260, 13, 10, 13, 4], [672, 310, 10, 10, 10, 3], [672, 365, 10, 6, 10, 7], [672, 416, 12, 6, 12, 7], [1, 8, 6, 6, 6, 7], [794, 773, 3, 6, 3, 7], [672, 569, 16, 6, 16, 7], [672, 620, 15, 6, 15, 7], [672, 666, 10, 11, 10, 2], [672, 722, 15, 6, 15, 7], [672, 768, 10, 11, 10, 2], [733, 5, 9, 9, 9, 4], [733, 56, 7, 11, 7, 4], [733, 108, 12, 8, 12, 5], [733, 159, 12, 8, 12, 5], [733, 210, 12, 8, 12, 5], [733, 261, 12, 9, 12, 5], [733, 310, 8, 14, 8, 3], [733, 358, 8, 17, 8, 0], [733, 409, 8, 17, 8, 0], [733, 462, 8, 15, 8, 2], [733, 511, 8, 17, 8, 0], [733, 562, 8, 15, 8, 0], [733, 615, 9, 15, 9, 2], [733, 664, 9, 17, 9, 0], [733, 715, 9, 15, 9, 0], [733, 766, 9, 17, 9, 0], [1, 8, 6, 6, 6, 7], [794, 56, 7, 11, 7, 4], [794, 104, 7, 14, 7, 1], [794, 156, 11, 15, 11, 2], [794, 205, 11, 17, 11, 0], [794, 256, 11, 15, 11, 0], [794, 308, 8, 16, 8, 1], [794, 358, 8, 17, 8, 0], [794, 409, 8, 17, 8, 0], [794, 462, 8, 15, 8, 2], [794, 511, 8, 17, 8, 0], [794, 562, 8, 15, 8, 0], [794, 615, 9, 15, 9, 2], [794, 664, 9, 17, 9, 0], [794, 715, 9, 15, 9, 0], [794, 773, 3, 6, 3, 7], [855, 8, 3, 6, 3, 7], [855, 59, 3, 6, 3, 7], [855, 110, 3, 6, 3, 7], [855, 161, 3, 6, 3, 7], [855, 212, 3, 6, 3, 7], [855, 263, 3, 6, 3, 7], [855, 314, 3, 6, 3, 7], [855, 365, 3, 6, 3, 7], [855, 416, 3, 6, 3, 7], [855, 467, 3, 6, 3, 7], [855, 518, 3, 6, 3, 7], [855, 569, 3, 6, 3, 7], [855, 620, 3, 6, 3, 7], [855, 671, 3, 6, 3, 7], [855, 722, 3, 6, 3, 7], [855, 773, 3, 6, 3, 7]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 14, 12, 9, 2], [1, 105, 19, 12, 13, 2], [1, 156, 17, 12, 11, 2], [1, 207, 18, 12, 12, 2], [1, 258, 21, 12, 16, 2], [1, 309, 18, 12, 15, 2], [1, 363, 13, 9, 10, 5], [1, 411, 15, 15, 9, 2], [1, 462, 13, 15, 9, 2], [1, 515, 15, 8, 11, 4], [1, 567, 15, 9, 12, 5], [1, 623, 10, 6, 7, 10], [1, 672, 15, 3, 12, 8], [1, 725, 9, 4, 7, 10], [1, 768, 14, 12, 8, 2], [62, 3, 16, 12, 11, 2], [62, 54, 15, 12, 11, 2], [62, 105, 15, 12, 11, 2], [62, 156, 16, 12, 11, 2], [62, 207, 16, 12, 11, 2], [62, 258, 17, 12, 11, 2], [62, 309, 17, 12, 11, 2], [62, 360, 17, 12, 11, 2], [62, 411, 16, 12, 11, 2], [62, 462, 16, 12, 11, 2], [62, 516, 12, 9, 8, 5], [62, 567, 12, 11, 8, 5], [62, 618, 17, 9, 12, 5], [62, 671, 15, 5, 12, 7], [62, 720, 15, 9, 12, 5], [62, 768, 16, 12, 10, 2], [123, 6, 16, 9, 12, 5], [123, 54, 17, 12, 15, 2], [123, 105, 18, 12, 13, 2], [123, 156, 21, 12, 15, 2], [123, 207, 16, 12, 13, 2], [123, 258, 19, 12, 13, 2], [123, 309, 19, 12, 15, 2], [123, 360, 19, 12, 13, 2], [123, 411, 21, 12, 15, 2], [123, 462, 15, 12, 9, 2], [123, 513, 17, 12, 13, 2], [123, 564, 19, 12, 14, 2], [123, 615, 16, 12, 14, 2], [123, 666, 23, 12, 17, 2], [123, 717, 21, 12, 15, 2], [123, 768, 18, 12, 14, 2], [184, 3, 21, 12, 15, 2], [184, 54, 18, 12, 14, 2], [184, 105, 17, 12, 12, 2], [184, 156, 19, 12, 13, 2], [184, 207, 19, 12, 13, 2], [184, 258, 19, 12, 13, 2], [184, 312, 15, 12, 11, 5], [184, 360, 18, 12, 15, 2], [184, 411, 19, 12, 13, 2], [184, 462, 21, 12, 15, 2], [184, 513, 19, 12, 13, 2], [184, 564, 15, 15, 9, 2], [184, 618, 16, 9, 14, 5], [184, 666, 15, 15, 9, 2], [184, 717, 16, 12, 14, 2], [184, 780, 12, 3, 11, 14], [245, 1, 17, 3, 11, 0], [245, 57, 17, 9, 13, 5], [245, 104, 18, 16, 12, 1], [245, 159, 17, 12, 12, 5], [245, 206, 17, 13, 11, 1], [245, 261, 15, 9, 10, 5], [245, 309, 16, 15, 13, 2], [245, 363, 15, 12, 10, 5], [245, 414, 16, 12, 12, 5], [245, 465, 12, 9, 9, 5], [245, 516, 16, 12, 13, 5], [245, 567, 16, 9, 12, 5], [245, 615, 15, 12, 12, 2], [245, 669, 15, 11, 12, 5], [245, 720, 16, 9, 12, 5], [245, 771, 16, 9, 12, 5], [306, 6, 16, 9, 12, 5], [306, 54, 16, 12, 11, 2], [306, 108, 16, 12, 12, 5], [306, 159, 17, 9, 12, 5], [306, 210, 14, 9, 10, 5], [306, 261, 16, 9, 12, 5], [306, 311, 20, 10, 15, 4], [306, 363, 19, 9, 15, 5], [306, 409, 17, 17, 11, 0], [306, 465, 18, 12, 13, 5], [306, 512, 17, 16, 11, 1], [306, 564, 17, 15, 11, 2], [306, 615, 13, 15, 7, 2], [306, 666, 14, 15, 11, 2], [306, 722, 15, 4, 12, 7], [306, 768, 11, 12, 5, 2], [367, 3, 11, 12, 5, 2], [367, 54, 11, 12, 5, 2], [367, 105, 11, 12, 5, 2], [367, 156, 11, 12, 5, 2], [367, 207, 11, 12, 5, 2], [367, 258, 11, 12, 5, 2], [367, 309, 11, 12, 5, 2], [367, 360, 11, 12, 5, 2], [367, 411, 11, 12, 5, 2], [367, 462, 11, 12, 5, 2], [367, 513, 11, 12, 5, 2], [367, 564, 11, 12, 5, 2], [367, 615, 11, 12, 5, 2], [367, 666, 11, 12, 5, 2], [367, 717, 11, 12, 5, 2], [367, 768, 11, 12, 5, 2], [428, 3, 11, 12, 5, 2], [428, 54, 11, 12, 5, 2], [428, 105, 11, 12, 5, 2], [428, 156, 11, 12, 5, 2], [428, 207, 11, 12, 5, 2], [428, 258, 11, 12, 5, 2], [428, 309, 11, 12, 5, 2], [428, 360, 11, 12, 5, 2], [428, 411, 11, 12, 5, 2], [428, 462, 11, 12, 5, 2], [428, 513, 11, 12, 5, 2], [428, 564, 11, 12, 5, 2], [428, 615, 11, 12, 5, 2], [428, 666, 11, 12, 5, 2], [428, 717, 11, 12, 5, 2], [428, 768, 11, 12, 5, 2], [489, 3, 11, 12, 5, 2], [489, 54, 18, 12, 13, 2], [489, 105, 14, 5, 8, 2], [489, 157, 17, 11, 12, 3], [489, 207, 14, 12, 8, 2], [489, 262, 17, 6, 14, 6], [489, 309, 17, 15, 11, 2], [489, 363, 18, 9, 15, 5], [489, 414, 17, 9, 15, 5], [489, 465, 18, 9, 15, 5], [489, 516, 17, 9, 15, 5], [489, 567, 22, 9, 19, 5], [489, 618, 22, 9, 18, 5], [489, 664, 18, 17, 13, 0], [489, 720, 22, 9, 18, 5], [489, 766, 17, 17, 13, 0], [550, 3, 15, 6, 10, 2], [550, 55, 16, 11, 12, 3], [550, 105, 16, 5, 10, 2], [550, 157, 16, 11, 12, 3], [550, 210, 16, 9, 12, 5], [550, 262, 17, 6, 14, 6], [550, 308, 16, 13, 11, 1], [550, 364, 14, 7, 11, 6], [550, 414, 15, 9, 12, 5], [550, 465, 15, 9, 12, 5], [550, 517, 16, 7, 12, 6], [550, 567, 16, 7, 12, 5], [550, 623, 20, 4, 19, 10], [550, 664, 17, 17, 13, 0], [550, 723, 23, 3, 19, 8], [550, 769, 18, 11, 14, 3], [611, 3, 19, 12, 16, 2], [611, 53, 20, 14, 14, 1], [611, 104, 21, 13, 16, 1], [611, 157, 19, 14, 16, 3], [611, 208, 19, 11, 15, 3], [611, 259, 19, 11, 15, 3], [611, 308, 22, 13, 16, 1], [611, 363, 18, 9, 14, 5], [611, 414, 19, 9, 14, 5], [611, 465, 17, 9, 14, 5], [611, 511, 1, 1, 14, 1], [611, 566, 18, 11, 14, 4], [611, 618, 19, 9, 14, 5], [611, 669, 18, 11, 14, 5], [611, 720, 17, 9, 14, 5], [611, 770, 16, 11, 14, 4], [672, 3, 21, 12, 15, 2], [672, 53, 20, 13, 14, 1], [672, 105, 20, 12, 16, 2], [672, 156, 20, 12, 16, 2], [672, 207, 20, 8, 15, 2], [672, 257, 22, 14, 16, 1], [672, 307, 18, 14, 12, 0], [672, 365, 10, 4, 8, 7], [672, 416, 17, 7, 14, 7], [1, 1, 1, 1, 8, 1], [794, 766, 1, 1, 3, 1], [672, 567, 22, 9, 19, 5], [672, 618, 21, 9, 18, 5], [672, 664, 18, 14, 13, 0], [672, 720, 22, 9, 18, 5], [672, 766, 18, 14, 13, 0], [733, 2, 16, 13, 11, 1], [733, 52, 15, 17, 9, 0], [733, 105, 20, 12, 16, 2], [733, 156, 20, 12, 16, 2], [733, 207, 20, 8, 15, 2], [733, 257, 19, 14, 14, 1], [733, 307, 16, 17, 10, 0], [733, 358, 14, 17, 10, 0], [733, 409, 14, 17, 10, 0], [733, 460, 16, 17, 10, 0], [733, 511, 14, 17, 10, 0], [733, 562, 14, 17, 10, 0], [733, 613, 17, 17, 11, 0], [733, 664, 16, 17, 11, 0], [733, 715, 16, 17, 11, 0], [733, 766, 16, 17, 11, 0], [1, 1, 1, 1, 8, 1], [794, 52, 14, 17, 9, 0], [794, 103, 14, 15, 8, 0], [794, 154, 20, 17, 14, 0], [794, 205, 18, 17, 14, 0], [794, 256, 18, 17, 14, 0], [794, 307, 15, 17, 10, 0], [794, 358, 16, 17, 10, 0], [794, 409, 16, 17, 10, 0], [794, 460, 16, 17, 10, 0], [794, 511, 16, 17, 10, 0], [794, 562, 16, 17, 10, 0], [794, 613, 15, 17, 11, 0], [794, 664, 16, 17, 11, 0], [794, 715, 16, 17, 11, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 13, \"widestlogicalchar\": 19, \"widestglyph\": 23, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 13, 10, 8, 2], [1, 105, 18, 10, 12, 2], [1, 156, 16, 10, 10, 2], [1, 207, 17, 10, 11, 2], [1, 258, 20, 10, 15, 2], [1, 309, 17, 10, 14, 2], [1, 363, 12, 7, 9, 5], [1, 411, 14, 13, 8, 2], [1, 462, 12, 13, 8, 2], [1, 515, 14, 6, 10, 4], [1, 567, 14, 7, 11, 5], [1, 623, 9, 4, 6, 10], [1, 672, 14, 1, 11, 8], [1, 725, 8, 2, 6, 10], [1, 768, 13, 10, 7, 2], [62, 3, 15, 10, 10, 2], [62, 54, 14, 10, 10, 2], [62, 105, 14, 10, 10, 2], [62, 156, 15, 10, 10, 2], [62, 207, 15, 10, 10, 2], [62, 258, 16, 10, 10, 2], [62, 309, 16, 10, 10, 2], [62, 360, 16, 10, 10, 2], [62, 411, 15, 10, 10, 2], [62, 462, 15, 10, 10, 2], [62, 516, 11, 7, 7, 5], [62, 567, 11, 9, 7, 5], [62, 618, 16, 7, 11, 5], [62, 671, 14, 3, 11, 7], [62, 720, 14, 7, 11, 5], [62, 768, 15, 10, 9, 2], [123, 6, 15, 7, 11, 5], [123, 54, 16, 10, 14, 2], [123, 105, 17, 10, 12, 2], [123, 156, 20, 10, 14, 2], [123, 207, 15, 10, 12, 2], [123, 258, 18, 10, 12, 2], [123, 309, 18, 10, 14, 2], [123, 360, 18, 10, 12, 2], [123, 411, 20, 10, 14, 2], [123, 462, 14, 10, 8, 2], [123, 513, 16, 10, 12, 2], [123, 564, 18, 10, 13, 2], [123, 615, 15, 10, 13, 2], [123, 666, 22, 10, 16, 2], [123, 717, 20, 10, 14, 2], [123, 768, 17, 10, 13, 2], [184, 3, 20, 10, 14, 2], [184, 54, 17, 10, 13, 2], [184, 105, 16, 10, 11, 2], [184, 156, 18, 10, 12, 2], [184, 207, 18, 10, 12, 2], [184, 258, 18, 10, 12, 2], [184, 312, 14, 10, 10, 5], [184, 360, 17, 10, 14, 2], [184, 411, 18, 10, 12, 2], [184, 462, 20, 10, 14, 2], [184, 513, 18, 10, 12, 2], [184, 564, 14, 13, 8, 2], [184, 618, 15, 7, 13, 5], [184, 666, 14, 13, 8, 2], [184, 717, 15, 10, 13, 2], [184, 780, 11, 1, 10, 14], [245, 1, 1, 1, 10, 1], [245, 57, 16, 7, 12, 5], [245, 104, 17, 14, 11, 1], [245, 159, 16, 10, 11, 5], [245, 206, 16, 11, 10, 1], [245, 261, 14, 7, 9, 5], [245, 309, 15, 13, 12, 2], [245, 363, 14, 10, 9, 5], [245, 414, 15, 10, 11, 5], [245, 465, 11, 7, 8, 5], [245, 516, 15, 10, 12, 5], [245, 567, 15, 7, 11, 5], [245, 615, 14, 10, 11, 2], [245, 669, 14, 9, 11, 5], [245, 720, 15, 7, 11, 5], [245, 771, 15, 7, 11, 5], [306, 6, 15, 7, 11, 5], [306, 54, 15, 10, 10, 2], [306, 108, 15, 10, 11, 5], [306, 159, 16, 7, 11, 5], [306, 210, 13, 7, 9, 5], [306, 261, 15, 7, 11, 5], [306, 311, 19, 8, 14, 4], [306, 363, 18, 7, 14, 5], [306, 409, 16, 15, 10, 0], [306, 465, 17, 10, 12, 5], [306, 512, 16, 14, 10, 1], [306, 564, 16, 13, 10, 2], [306, 615, 12, 13, 6, 2], [306, 666, 13, 13, 10, 2], [306, 722, 14, 2, 11, 7], [306, 768, 10, 10, 4, 2], [367, 3, 10, 10, 4, 2], [367, 54, 10, 10, 4, 2], [367, 105, 10, 10, 4, 2], [367, 156, 10, 10, 4, 2], [367, 207, 10, 10, 4, 2], [367, 258, 10, 10, 4, 2], [367, 309, 10, 10, 4, 2], [367, 360, 10, 10, 4, 2], [367, 411, 10, 10, 4, 2], [367, 462, 10, 10, 4, 2], [367, 513, 10, 10, 4, 2], [367, 564, 10, 10, 4, 2], [367, 615, 10, 10, 4, 2], [367, 666, 10, 10, 4, 2], [367, 717, 10, 10, 4, 2], [367, 768, 10, 10, 4, 2], [428, 3, 10, 10, 4, 2], [428, 54, 10, 10, 4, 2], [428, 105, 10, 10, 4, 2], [428, 156, 10, 10, 4, 2], [428, 207, 10, 10, 4, 2], [428, 258, 10, 10, 4, 2], [428, 309, 10, 10, 4, 2], [428, 360, 10, 10, 4, 2], [428, 411, 10, 10, 4, 2], [428, 462, 10, 10, 4, 2], [428, 513, 10, 10, 4, 2], [428, 564, 10, 10, 4, 2], [428, 615, 10, 10, 4, 2], [428, 666, 10, 10, 4, 2], [428, 717, 10, 10, 4, 2], [428, 768, 10, 10, 4, 2], [489, 3, 10, 10, 4, 2], [489, 54, 17, 10, 12, 2], [489, 105, 13, 3, 7, 2], [489, 157, 16, 9, 11, 3], [489, 207, 13, 10, 7, 2], [489, 262, 16, 4, 13, 6], [489, 309, 16, 13, 10, 2], [489, 363, 17, 7, 14, 5], [489, 414, 16, 7, 14, 5], [489, 465, 17, 7, 14, 5], [489, 516, 16, 7, 14, 5], [489, 567, 21, 7, 18, 5], [489, 618, 21, 7, 17, 5], [489, 664, 17, 15, 12, 0], [489, 720, 21, 7, 17, 5], [489, 766, 15, 15, 12, 0], [550, 3, 14, 4, 9, 2], [550, 55, 15, 9, 11, 3], [550, 105, 15, 3, 9, 2], [550, 157, 15, 9, 11, 3], [550, 210, 15, 7, 11, 5], [550, 262, 16, 4, 13, 6], [550, 308, 15, 11, 10, 1], [550, 364, 13, 5, 10, 6], [550, 414, 14, 7, 11, 5], [550, 465, 14, 7, 11, 5], [550, 517, 15, 5, 11, 6], [550, 567, 15, 5, 11, 5], [550, 623, 19, 2, 18, 10], [550, 664, 15, 15, 12, 0], [550, 723, 22, 1, 18, 8], [550, 769, 17, 9, 13, 3], [611, 3, 18, 10, 15, 2], [611, 53, 19, 12, 13, 1], [611, 104, 20, 11, 15, 1], [611, 157, 18, 12, 15, 3], [611, 208, 18, 9, 14, 3], [611, 259, 18, 9, 14, 3], [611, 308, 21, 11, 15, 1], [611, 363, 17, 7, 13, 5], [611, 414, 18, 7, 13, 5], [611, 465, 16, 7, 13, 5], [611, 511, 1, 1, 13, 1], [611, 566, 17, 9, 13, 4], [611, 618, 18, 7, 13, 5], [611, 669, 17, 9, 13, 5], [611, 720, 16, 7, 13, 5], [611, 770, 15, 9, 13, 4], [672, 3, 20, 10, 14, 2], [672, 53, 19, 11, 13, 1], [672, 105, 19, 10, 15, 2], [672, 156, 19, 10, 15, 2], [672, 207, 19, 6, 14, 2], [672, 257, 21, 12, 15, 1], [672, 308, 17, 11, 11, 1], [672, 365, 9, 2, 7, 7], [672, 416, 16, 5, 13, 7], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 567, 21, 7, 18, 5], [672, 618, 20, 7, 17, 5], [672, 664, 17, 12, 12, 0], [672, 720, 21, 7, 17, 5], [672, 766, 16, 12, 12, 0], [733, 2, 15, 11, 10, 1], [733, 52, 13, 15, 8, 0], [733, 105, 19, 10, 15, 2], [733, 156, 19, 10, 15, 2], [733, 207, 19, 6, 14, 2], [733, 257, 18, 12, 13, 1], [733, 307, 14, 15, 9, 0], [733, 358, 12, 15, 9, 0], [733, 409, 12, 15, 9, 0], [733, 460, 12, 15, 9, 0], [733, 511, 12, 15, 9, 0], [733, 562, 12, 15, 9, 0], [733, 613, 15, 15, 10, 0], [733, 664, 14, 15, 10, 0], [733, 715, 14, 15, 10, 0], [733, 766, 14, 15, 10, 0], [1, 1, 1, 1, 7, 1], [794, 52, 13, 15, 8, 0], [794, 104, 13, 12, 7, 1], [794, 154, 19, 15, 13, 0], [794, 205, 16, 15, 13, 0], [794, 256, 16, 15, 13, 0], [794, 307, 14, 15, 9, 0], [794, 358, 15, 15, 9, 0], [794, 409, 15, 15, 9, 0], [794, 460, 15, 15, 9, 0], [794, 511, 15, 15, 9, 0], [794, 562, 15, 15, 9, 0], [794, 613, 14, 15, 10, 0], [794, 664, 14, 15, 10, 0], [794, 715, 14, 15, 10, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 12, \"widestlogicalchar\": 18, \"widestglyph\": 22, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 1, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 54, 9, 12, 9, 2], [1, 105, 13, 12, 13, 2], [1, 156, 11, 12, 11, 2], [1, 207, 12, 12, 12, 2], [1, 258, 16, 12, 16, 2], [1, 309, 15, 12, 15, 2], [1, 363, 10, 9, 10, 5], [1, 411, 9, 15, 9, 2], [1, 462, 9, 15, 9, 2], [1, 515, 11, 9, 11, 4], [1, 567, 12, 9, 12, 5], [1, 620, 7, 9, 7, 7], [1, 671, 12, 6, 12, 7], [1, 722, 7, 7, 7, 7], [1, 768, 8, 12, 8, 2], [62, 3, 11, 12, 11, 2], [62, 54, 11, 12, 11, 2], [62, 105, 11, 12, 11, 2], [62, 156, 11, 12, 11, 2], [62, 207, 11, 12, 11, 2], [62, 258, 11, 12, 11, 2], [62, 309, 11, 12, 11, 2], [62, 360, 11, 12, 11, 2], [62, 411, 11, 12, 11, 2], [62, 462, 11, 12, 11, 2], [62, 516, 8, 9, 8, 5], [62, 567, 8, 11, 8, 5], [62, 618, 12, 9, 12, 5], [62, 671, 12, 6, 12, 7], [62, 720, 12, 9, 12, 5], [62, 768, 10, 12, 10, 2], [123, 6, 12, 9, 12, 5], [123, 54, 15, 12, 15, 2], [123, 105, 13, 12, 13, 2], [123, 156, 15, 12, 15, 2], [123, 207, 13, 12, 13, 2], [123, 258, 13, 12, 13, 2], [123, 309, 15, 12, 15, 2], [123, 360, 13, 12, 13, 2], [123, 411, 15, 12, 15, 2], [123, 462, 9, 12, 9, 2], [123, 513, 13, 12, 13, 2], [123, 564, 14, 12, 14, 2], [123, 615, 14, 12, 14, 2], [123, 666, 17, 12, 17, 2], [123, 717, 15, 12, 15, 2], [123, 768, 14, 12, 14, 2], [184, 3, 15, 12, 15, 2], [184, 54, 14, 12, 14, 2], [184, 105, 12, 12, 12, 2], [184, 156, 13, 12, 13, 2], [184, 207, 13, 12, 13, 2], [184, 258, 13, 12, 13, 2], [184, 312, 11, 12, 11, 5], [184, 360, 15, 12, 15, 2], [184, 411, 13, 12, 13, 2], [184, 462, 15, 12, 15, 2], [184, 513, 13, 12, 13, 2], [184, 564, 9, 15, 9, 2], [184, 618, 14, 9, 14, 5], [184, 666, 9, 15, 9, 2], [184, 717, 14, 12, 14, 2], [184, 773, 11, 10, 11, 7], [245, 1, 11, 13, 11, 0], [245, 57, 13, 9, 13, 5], [245, 104, 12, 16, 12, 1], [245, 159, 12, 12, 12, 5], [245, 206, 11, 13, 11, 1], [245, 261, 10, 9, 10, 5], [245, 309, 13, 15, 13, 2], [245, 363, 10, 12, 10, 5], [245, 414, 12, 12, 12, 5], [245, 465, 9, 9, 9, 5], [245, 516, 13, 12, 13, 5], [245, 567, 12, 9, 12, 5], [245, 615, 12, 12, 12, 2], [245, 669, 12, 11, 12, 5], [245, 720, 12, 9, 12, 5], [245, 771, 12, 9, 12, 5], [306, 6, 12, 9, 12, 5], [306, 54, 11, 12, 11, 2], [306, 108, 12, 12, 12, 5], [306, 159, 12, 9, 12, 5], [306, 210, 10, 9, 10, 5], [306, 261, 12, 9, 12, 5], [306, 311, 15, 10, 15, 4], [306, 363, 15, 9, 15, 5], [306, 409, 11, 17, 11, 0], [306, 465, 13, 12, 13, 5], [306, 512, 11, 16, 11, 1], [306, 564, 11, 15, 11, 2], [306, 615, 7, 15, 7, 2], [306, 666, 11, 15, 11, 2], [306, 722, 12, 6, 12, 7], [306, 768, 5, 12, 5, 2], [367, 3, 5, 12, 5, 2], [367, 54, 5, 12, 5, 2], [367, 105, 5, 12, 5, 2], [367, 156, 5, 12, 5, 2], [367, 207, 5, 12, 5, 2], [367, 258, 5, 12, 5, 2], [367, 309, 5, 12, 5, 2], [367, 360, 5, 12, 5, 2], [367, 411, 5, 12, 5, 2], [367, 462, 5, 12, 5, 2], [367, 513, 5, 12, 5, 2], [367, 564, 5, 12, 5, 2], [367, 615, 5, 12, 5, 2], [367, 666, 5, 12, 5, 2], [367, 717, 5, 12, 5, 2], [367, 768, 5, 12, 5, 2], [428, 3, 5, 12, 5, 2], [428, 54, 5, 12, 5, 2], [428, 105, 5, 12, 5, 2], [428, 156, 5, 12, 5, 2], [428, 207, 5, 12, 5, 2], [428, 258, 5, 12, 5, 2], [428, 309, 5, 12, 5, 2], [428, 360, 5, 12, 5, 2], [428, 411, 5, 12, 5, 2], [428, 462, 5, 12, 5, 2], [428, 513, 5, 12, 5, 2], [428, 564, 5, 12, 5, 2], [428, 615, 5, 12, 5, 2], [428, 666, 5, 12, 5, 2], [428, 717, 5, 12, 5, 2], [428, 768, 5, 12, 5, 2], [489, 3, 5, 12, 5, 2], [489, 54, 13, 12, 13, 2], [489, 105, 8, 11, 8, 2], [489, 157, 12, 11, 12, 3], [489, 207, 8, 12, 8, 2], [489, 262, 14, 7, 14, 6], [489, 309, 11, 15, 11, 2], [489, 363, 15, 9, 15, 5], [489, 414, 15, 9, 15, 5], [489, 465, 15, 9, 15, 5], [489, 516, 15, 9, 15, 5], [489, 567, 19, 9, 19, 5], [489, 618, 18, 9, 18, 5], [489, 664, 13, 17, 13, 0], [489, 720, 18, 9, 18, 5], [489, 766, 13, 17, 13, 0], [550, 3, 10, 11, 10, 2], [550, 55, 12, 11, 12, 3], [550, 105, 10, 11, 10, 2], [550, 157, 12, 11, 12, 3], [550, 210, 12, 9, 12, 5], [550, 262, 14, 7, 14, 6], [550, 308, 11, 13, 11, 1], [550, 364, 11, 7, 11, 6], [550, 414, 12, 9, 12, 5], [550, 465, 12, 9, 12, 5], [550, 517, 12, 7, 12, 6], [550, 567, 12, 8, 12, 5], [550, 620, 19, 7, 19, 7], [550, 664, 13, 17, 13, 0], [550, 722, 19, 6, 19, 7], [550, 769, 14, 11, 14, 3], [611, 3, 16, 12, 16, 2], [611, 53, 14, 14, 14, 1], [611, 104, 16, 13, 16, 1], [611, 157, 16, 14, 16, 3], [611, 208, 15, 11, 15, 3], [611, 259, 15, 11, 15, 3], [611, 308, 16, 13, 16, 1], [611, 363, 14, 9, 14, 5], [611, 414, 14, 9, 14, 5], [611, 465, 14, 9, 14, 5], [611, 516, 14, 11, 14, 5], [611, 566, 14, 11, 14, 4], [611, 618, 14, 9, 14, 5], [611, 669, 14, 11, 14, 5], [611, 720, 14, 9, 14, 5], [611, 770, 14, 11, 14, 4], [672, 3, 15, 12, 15, 2], [672, 53, 14, 13, 14, 1], [672, 105, 16, 12, 16, 2], [672, 156, 16, 12, 16, 2], [672, 207, 15, 11, 15, 2], [672, 257, 16, 14, 16, 1], [672, 307, 12, 14, 12, 0], [672, 365, 8, 6, 8, 7], [672, 416, 14, 7, 14, 7], [1, 8, 8, 6, 8, 7], [794, 773, 3, 6, 3, 7], [672, 567, 19, 9, 19, 5], [672, 618, 18, 9, 18, 5], [672, 664, 13, 14, 13, 0], [672, 720, 18, 9, 18, 5], [672, 766, 13, 14, 13, 0], [733, 2, 11, 13, 11, 1], [733, 52, 9, 17, 9, 0], [733, 105, 16, 12, 16, 2], [733, 156, 16, 12, 16, 2], [733, 207, 15, 11, 15, 2], [733, 257, 14, 14, 14, 1], [733, 307, 10, 17, 10, 0], [733, 358, 10, 17, 10, 0], [733, 409, 10, 17, 10, 0], [733, 460, 10, 17, 10, 0], [733, 511, 10, 17, 10, 0], [733, 562, 10, 17, 10, 0], [733, 613, 11, 17, 11, 0], [733, 664, 11, 17, 11, 0], [733, 715, 11, 17, 11, 0], [733, 766, 11, 17, 11, 0], [1, 8, 8, 6, 8, 7], [794, 52, 9, 17, 9, 0], [794, 103, 8, 15, 8, 0], [794, 154, 14, 17, 14, 0], [794, 205, 14, 17, 14, 0], [794, 256, 14, 17, 14, 0], [794, 307, 10, 17, 10, 0], [794, 358, 10, 17, 10, 0], [794, 409, 10, 17, 10, 0], [794, 460, 10, 17, 10, 0], [794, 511, 10, 17, 10, 0], [794, 562, 10, 17, 10, 0], [794, 613, 11, 17, 11, 0], [794, 664, 11, 17, 11, 0], [794, 715, 11, 17, 11, 0], [794, 773, 3, 6, 3, 7], [855, 8, 3, 6, 3, 7], [855, 59, 3, 6, 3, 7], [855, 110, 3, 6, 3, 7], [855, 161, 3, 6, 3, 7], [855, 212, 3, 6, 3, 7], [855, 263, 3, 6, 3, 7], [855, 314, 3, 6, 3, 7], [855, 365, 3, 6, 3, 7], [855, 416, 3, 6, 3, 7], [855, 467, 3, 6, 3, 7], [855, 518, 3, 6, 3, 7], [855, 569, 3, 6, 3, 7], [855, 620, 3, 6, 3, 7], [855, 671, 3, 6, 3, 7], [855, 722, 3, 6, 3, 7], [855, 773, 3, 6, 3, 7]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 54, 8, 10, 8, 2], [1, 105, 12, 10, 12, 2], [1, 156, 10, 10, 10, 2], [1, 207, 11, 10, 11, 2], [1, 258, 15, 10, 15, 2], [1, 309, 14, 10, 14, 2], [1, 363, 9, 7, 9, 5], [1, 411, 8, 13, 8, 2], [1, 462, 8, 13, 8, 2], [1, 515, 10, 8, 10, 4], [1, 567, 11, 7, 11, 5], [1, 619, 6, 8, 6, 6], [1, 670, 11, 6, 11, 6], [1, 721, 6, 6, 6, 6], [1, 768, 7, 10, 7, 2], [62, 3, 10, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 10, 10, 10, 2], [62, 156, 10, 10, 10, 2], [62, 207, 10, 10, 10, 2], [62, 258, 10, 10, 10, 2], [62, 309, 10, 10, 10, 2], [62, 360, 10, 10, 10, 2], [62, 411, 10, 10, 10, 2], [62, 462, 10, 10, 10, 2], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 618, 11, 7, 11, 5], [62, 670, 11, 6, 11, 6], [62, 720, 11, 7, 11, 5], [62, 768, 9, 10, 9, 2], [123, 6, 11, 7, 11, 5], [123, 54, 14, 10, 14, 2], [123, 105, 12, 10, 12, 2], [123, 156, 14, 10, 14, 2], [123, 207, 12, 10, 12, 2], [123, 258, 12, 10, 12, 2], [123, 309, 14, 10, 14, 2], [123, 360, 12, 10, 12, 2], [123, 411, 14, 10, 14, 2], [123, 462, 8, 10, 8, 2], [123, 513, 12, 10, 12, 2], [123, 564, 13, 10, 13, 2], [123, 615, 13, 10, 13, 2], [123, 666, 16, 10, 16, 2], [123, 717, 14, 10, 14, 2], [123, 768, 13, 10, 13, 2], [184, 3, 14, 10, 14, 2], [184, 54, 13, 10, 13, 2], [184, 105, 11, 10, 11, 2], [184, 156, 12, 10, 12, 2], [184, 207, 12, 10, 12, 2], [184, 258, 12, 10, 12, 2], [184, 312, 10, 10, 10, 5], [184, 360, 14, 10, 14, 2], [184, 411, 12, 10, 12, 2], [184, 462, 14, 10, 14, 2], [184, 513, 12, 10, 12, 2], [184, 564, 8, 13, 8, 2], [184, 618, 13, 7, 13, 5], [184, 666, 8, 13, 8, 2], [184, 717, 13, 10, 13, 2], [184, 772, 10, 9, 10, 6], [245, 1, 10, 12, 10, 0], [245, 57, 12, 7, 12, 5], [245, 104, 11, 14, 11, 1], [245, 159, 11, 10, 11, 5], [245, 206, 10, 11, 10, 1], [245, 261, 9, 7, 9, 5], [245, 309, 12, 13, 12, 2], [245, 363, 9, 10, 9, 5], [245, 414, 11, 10, 11, 5], [245, 465, 8, 7, 8, 5], [245, 516, 12, 10, 12, 5], [245, 567, 11, 7, 11, 5], [245, 615, 11, 10, 11, 2], [245, 669, 11, 9, 11, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 7, 11, 5], [306, 54, 10, 10, 10, 2], [306, 108, 11, 10, 11, 5], [306, 159, 11, 7, 11, 5], [306, 210, 9, 7, 9, 5], [306, 261, 11, 7, 11, 5], [306, 311, 14, 8, 14, 4], [306, 363, 14, 7, 14, 5], [306, 409, 10, 15, 10, 0], [306, 465, 12, 10, 12, 5], [306, 512, 10, 14, 10, 1], [306, 564, 10, 13, 10, 2], [306, 615, 6, 13, 6, 2], [306, 666, 10, 13, 10, 2], [306, 721, 11, 6, 11, 6], [306, 768, 4, 10, 4, 2], [367, 3, 4, 10, 4, 2], [367, 54, 4, 10, 4, 2], [367, 105, 4, 10, 4, 2], [367, 156, 4, 10, 4, 2], [367, 207, 4, 10, 4, 2], [367, 258, 4, 10, 4, 2], [367, 309, 4, 10, 4, 2], [367, 360, 4, 10, 4, 2], [367, 411, 4, 10, 4, 2], [367, 462, 4, 10, 4, 2], [367, 513, 4, 10, 4, 2], [367, 564, 4, 10, 4, 2], [367, 615, 4, 10, 4, 2], [367, 666, 4, 10, 4, 2], [367, 717, 4, 10, 4, 2], [367, 768, 4, 10, 4, 2], [428, 3, 4, 10, 4, 2], [428, 54, 4, 10, 4, 2], [428, 105, 4, 10, 4, 2], [428, 156, 4, 10, 4, 2], [428, 207, 4, 10, 4, 2], [428, 258, 4, 10, 4, 2], [428, 309, 4, 10, 4, 2], [428, 360, 4, 10, 4, 2], [428, 411, 4, 10, 4, 2], [428, 462, 4, 10, 4, 2], [428, 513, 4, 10, 4, 2], [428, 564, 4, 10, 4, 2], [428, 615, 4, 10, 4, 2], [428, 666, 4, 10, 4, 2], [428, 717, 4, 10, 4, 2], [428, 768, 4, 10, 4, 2], [489, 3, 4, 10, 4, 2], [489, 54, 12, 10, 12, 2], [489, 105, 7, 10, 7, 2], [489, 157, 11, 9, 11, 3], [489, 207, 7, 10, 7, 2], [489, 262, 13, 6, 13, 6], [489, 309, 10, 13, 10, 2], [489, 363, 14, 7, 14, 5], [489, 414, 14, 7, 14, 5], [489, 465, 14, 7, 14, 5], [489, 516, 14, 7, 14, 5], [489, 567, 18, 7, 18, 5], [489, 618, 17, 7, 17, 5], [489, 664, 12, 15, 12, 0], [489, 720, 17, 7, 17, 5], [489, 766, 12, 15, 12, 0], [550, 3, 9, 10, 9, 2], [550, 55, 11, 9, 11, 3], [550, 105, 9, 10, 9, 2], [550, 157, 11, 9, 11, 3], [550, 210, 11, 7, 11, 5], [550, 262, 13, 6, 13, 6], [550, 308, 10, 11, 10, 1], [550, 364, 10, 6, 10, 6], [550, 414, 11, 7, 11, 5], [550, 465, 11, 7, 11, 5], [550, 517, 11, 6, 11, 6], [550, 567, 11, 7, 11, 5], [550, 619, 18, 6, 18, 6], [550, 664, 12, 15, 12, 0], [550, 721, 18, 6, 18, 6], [550, 769, 13, 9, 13, 3], [611, 3, 15, 10, 15, 2], [611, 53, 13, 12, 13, 1], [611, 104, 15, 11, 15, 1], [611, 157, 15, 12, 15, 3], [611, 208, 14, 9, 14, 3], [611, 259, 14, 9, 14, 3], [611, 308, 15, 11, 15, 1], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 465, 13, 7, 13, 5], [611, 516, 13, 9, 13, 5], [611, 566, 13, 9, 13, 4], [611, 618, 13, 7, 13, 5], [611, 669, 13, 9, 13, 5], [611, 720, 13, 7, 13, 5], [611, 770, 13, 9, 13, 4], [672, 3, 14, 10, 14, 2], [672, 53, 13, 11, 13, 1], [672, 105, 15, 10, 15, 2], [672, 156, 15, 10, 15, 2], [672, 207, 14, 10, 14, 2], [672, 257, 15, 12, 15, 1], [672, 307, 11, 12, 11, 0], [672, 364, 7, 6, 7, 6], [672, 415, 13, 6, 13, 6], [1, 7, 7, 6, 7, 6], [794, 772, 3, 6, 3, 6], [672, 567, 18, 7, 18, 5], [672, 618, 17, 7, 17, 5], [672, 664, 12, 12, 12, 0], [672, 720, 17, 7, 17, 5], [672, 766, 12, 12, 12, 0], [733, 2, 10, 11, 10, 1], [733, 52, 8, 15, 8, 0], [733, 105, 15, 10, 15, 2], [733, 156, 15, 10, 15, 2], [733, 207, 14, 10, 14, 2], [733, 257, 13, 12, 13, 1], [733, 307, 9, 15, 9, 0], [733, 358, 9, 15, 9, 0], [733, 409, 9, 15, 9, 0], [733, 460, 9, 15, 9, 0], [733, 511, 9, 15, 9, 0], [733, 562, 9, 15, 9, 0], [733, 613, 10, 15, 10, 0], [733, 664, 10, 15, 10, 0], [733, 715, 10, 15, 10, 0], [733, 766, 10, 15, 10, 0], [1, 7, 7, 6, 7, 6], [794, 52, 8, 15, 8, 0], [794, 103, 7, 13, 7, 0], [794, 154, 13, 15, 13, 0], [794, 205, 13, 15, 13, 0], [794, 256, 13, 15, 13, 0], [794, 307, 9, 15, 9, 0], [794, 358, 9, 15, 9, 0], [794, 409, 9, 15, 9, 0], [794, 460, 9, 15, 9, 0], [794, 511, 9, 15, 9, 0], [794, 562, 9, 15, 9, 0], [794, 613, 10, 15, 10, 0], [794, 664, 10, 15, 10, 0], [794, 715, 10, 15, 10, 0], [794, 772, 3, 6, 3, 6], [855, 7, 3, 6, 3, 6], [855, 58, 3, 6, 3, 6], [855, 109, 3, 6, 3, 6], [855, 160, 3, 6, 3, 6], [855, 211, 3, 6, 3, 6], [855, 262, 3, 6, 3, 6], [855, 313, 3, 6, 3, 6], [855, 364, 3, 6, 3, 6], [855, 415, 3, 6, 3, 6], [855, 466, 3, 6, 3, 6], [855, 517, 3, 6, 3, 6], [855, 568, 3, 6, 3, 6], [855, 619, 3, 6, 3, 6], [855, 670, 3, 6, 3, 6], [855, 721, 3, 6, 3, 6], [855, 772, 3, 6, 3, 6]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 54, 13, 12, 9, 2], [1, 105, 18, 12, 13, 2], [1, 156, 16, 12, 11, 2], [1, 207, 17, 12, 12, 2], [1, 258, 20, 12, 16, 2], [1, 309, 17, 12, 15, 2], [1, 363, 12, 9, 10, 5], [1, 411, 14, 15, 9, 2], [1, 462, 12, 15, 9, 2], [1, 515, 14, 8, 11, 4], [1, 567, 14, 9, 12, 5], [1, 623, 9, 6, 7, 10], [1, 672, 14, 3, 12, 8], [1, 725, 8, 4, 7, 10], [1, 768, 13, 12, 8, 2], [62, 3, 15, 12, 11, 2], [62, 54, 14, 12, 11, 2], [62, 105, 14, 12, 11, 2], [62, 156, 15, 12, 11, 2], [62, 207, 15, 12, 11, 2], [62, 258, 16, 12, 11, 2], [62, 309, 16, 12, 11, 2], [62, 360, 16, 12, 11, 2], [62, 411, 15, 12, 11, 2], [62, 462, 15, 12, 11, 2], [62, 516, 11, 9, 8, 5], [62, 567, 11, 11, 8, 5], [62, 618, 16, 9, 12, 5], [62, 671, 14, 5, 12, 7], [62, 720, 14, 9, 12, 5], [62, 768, 15, 12, 10, 2], [123, 6, 15, 9, 12, 5], [123, 54, 16, 12, 15, 2], [123, 105, 17, 12, 13, 2], [123, 156, 20, 12, 15, 2], [123, 207, 15, 12, 13, 2], [123, 258, 18, 12, 13, 2], [123, 309, 18, 12, 15, 2], [123, 360, 18, 12, 13, 2], [123, 411, 20, 12, 15, 2], [123, 462, 14, 12, 9, 2], [123, 513, 16, 12, 13, 2], [123, 564, 18, 12, 14, 2], [123, 615, 15, 12, 14, 2], [123, 666, 22, 12, 17, 2], [123, 717, 20, 12, 15, 2], [123, 768, 17, 12, 14, 2], [184, 3, 20, 12, 15, 2], [184, 54, 17, 12, 14, 2], [184, 105, 16, 12, 12, 2], [184, 156, 18, 12, 13, 2], [184, 207, 18, 12, 13, 2], [184, 258, 18, 12, 13, 2], [184, 312, 14, 12, 11, 5], [184, 360, 17, 12, 15, 2], [184, 411, 18, 12, 13, 2], [184, 462, 20, 12, 15, 2], [184, 513, 18, 12, 13, 2], [184, 564, 14, 15, 9, 2], [184, 618, 15, 9, 14, 5], [184, 666, 14, 15, 9, 2], [184, 717, 15, 12, 14, 2], [184, 780, 11, 3, 11, 14], [245, 1, 1, 1, 11, 1], [245, 57, 16, 9, 13, 5], [245, 104, 17, 16, 12, 1], [245, 159, 16, 12, 12, 5], [245, 206, 16, 13, 11, 1], [245, 261, 14, 9, 10, 5], [245, 309, 15, 15, 13, 2], [245, 363, 14, 12, 10, 5], [245, 414, 15, 12, 12, 5], [245, 465, 11, 9, 9, 5], [245, 516, 15, 12, 13, 5], [245, 567, 15, 9, 12, 5], [245, 615, 14, 12, 12, 2], [245, 669, 14, 11, 12, 5], [245, 720, 15, 9, 12, 5], [245, 771, 15, 9, 12, 5], [306, 6, 15, 9, 12, 5], [306, 54, 15, 12, 11, 2], [306, 108, 15, 12, 12, 5], [306, 159, 16, 9, 12, 5], [306, 210, 13, 9, 10, 5], [306, 261, 15, 9, 12, 5], [306, 311, 19, 10, 15, 4], [306, 363, 18, 9, 15, 5], [306, 409, 16, 17, 11, 0], [306, 465, 17, 12, 13, 5], [306, 512, 16, 16, 11, 1], [306, 564, 16, 15, 11, 2], [306, 615, 12, 15, 7, 2], [306, 666, 13, 15, 11, 2], [306, 722, 14, 4, 12, 7], [306, 768, 10, 12, 5, 2], [367, 3, 10, 12, 5, 2], [367, 54, 10, 12, 5, 2], [367, 105, 10, 12, 5, 2], [367, 156, 10, 12, 5, 2], [367, 207, 10, 12, 5, 2], [367, 258, 10, 12, 5, 2], [367, 309, 10, 12, 5, 2], [367, 360, 10, 12, 5, 2], [367, 411, 10, 12, 5, 2], [367, 462, 10, 12, 5, 2], [367, 513, 10, 12, 5, 2], [367, 564, 10, 12, 5, 2], [367, 615, 10, 12, 5, 2], [367, 666, 10, 12, 5, 2], [367, 717, 10, 12, 5, 2], [367, 768, 10, 12, 5, 2], [428, 3, 10, 12, 5, 2], [428, 54, 10, 12, 5, 2], [428, 105, 10, 12, 5, 2], [428, 156, 10, 12, 5, 2], [428, 207, 10, 12, 5, 2], [428, 258, 10, 12, 5, 2], [428, 309, 10, 12, 5, 2], [428, 360, 10, 12, 5, 2], [428, 411, 10, 12, 5, 2], [428, 462, 10, 12, 5, 2], [428, 513, 10, 12, 5, 2], [428, 564, 10, 12, 5, 2], [428, 615, 10, 12, 5, 2], [428, 666, 10, 12, 5, 2], [428, 717, 10, 12, 5, 2], [428, 768, 10, 12, 5, 2], [489, 3, 10, 12, 5, 2], [489, 54, 17, 12, 13, 2], [489, 105, 13, 5, 8, 2], [489, 157, 16, 11, 12, 3], [489, 207, 13, 12, 8, 2], [489, 262, 16, 6, 14, 6], [489, 309, 16, 15, 11, 2], [489, 363, 17, 9, 15, 5], [489, 414, 16, 9, 15, 5], [489, 465, 17, 9, 15, 5], [489, 516, 16, 9, 15, 5], [489, 567, 21, 9, 19, 5], [489, 618, 21, 9, 18, 5], [489, 664, 17, 17, 13, 0], [489, 720, 21, 9, 18, 5], [489, 766, 16, 17, 13, 0], [550, 3, 14, 6, 10, 2], [550, 55, 15, 11, 12, 3], [550, 105, 15, 5, 10, 2], [550, 157, 15, 11, 12, 3], [550, 210, 15, 9, 12, 5], [550, 262, 16, 6, 14, 6], [550, 308, 15, 13, 11, 1], [550, 364, 13, 7, 11, 6], [550, 414, 14, 9, 12, 5], [550, 465, 14, 9, 12, 5], [550, 517, 15, 7, 12, 6], [550, 567, 15, 7, 12, 5], [550, 623, 19, 4, 19, 10], [550, 664, 16, 17, 13, 0], [550, 723, 22, 3, 19, 8], [550, 769, 17, 11, 14, 3], [611, 3, 18, 12, 16, 2], [611, 53, 19, 14, 14, 1], [611, 104, 20, 13, 16, 1], [611, 157, 18, 14, 16, 3], [611, 208, 18, 11, 15, 3], [611, 259, 18, 11, 15, 3], [611, 308, 21, 13, 16, 1], [611, 363, 17, 9, 14, 5], [611, 414, 18, 9, 14, 5], [611, 465, 16, 9, 14, 5], [611, 511, 1, 1, 14, 1], [611, 566, 17, 11, 14, 4], [611, 618, 18, 9, 14, 5], [611, 669, 17, 11, 14, 5], [611, 720, 16, 9, 14, 5], [611, 770, 15, 11, 14, 4], [672, 3, 20, 12, 15, 2], [672, 53, 19, 13, 14, 1], [672, 105, 19, 12, 16, 2], [672, 156, 19, 12, 16, 2], [672, 207, 19, 8, 15, 2], [672, 257, 21, 14, 16, 1], [672, 307, 17, 14, 12, 0], [672, 365, 9, 4, 8, 7], [672, 416, 16, 7, 14, 7], [1, 1, 1, 1, 8, 1], [794, 766, 1, 1, 3, 1], [672, 567, 21, 9, 19, 5], [672, 618, 20, 9, 18, 5], [672, 664, 17, 14, 13, 0], [672, 720, 21, 9, 18, 5], [672, 766, 17, 14, 13, 0], [733, 2, 15, 13, 11, 1], [733, 52, 14, 17, 9, 0], [733, 105, 19, 12, 16, 2], [733, 156, 19, 12, 16, 2], [733, 207, 19, 8, 15, 2], [733, 257, 18, 14, 14, 1], [733, 307, 15, 17, 10, 0], [733, 358, 13, 17, 10, 0], [733, 409, 13, 17, 10, 0], [733, 460, 15, 17, 10, 0], [733, 511, 13, 17, 10, 0], [733, 562, 13, 17, 10, 0], [733, 613, 16, 17, 11, 0], [733, 664, 15, 17, 11, 0], [733, 715, 15, 17, 11, 0], [733, 766, 15, 17, 11, 0], [1, 1, 1, 1, 8, 1], [794, 52, 13, 17, 9, 0], [794, 103, 13, 15, 8, 0], [794, 154, 19, 17, 14, 0], [794, 205, 17, 17, 14, 0], [794, 256, 17, 17, 14, 0], [794, 307, 14, 17, 10, 0], [794, 358, 15, 17, 10, 0], [794, 409, 15, 17, 10, 0], [794, 460, 15, 17, 10, 0], [794, 511, 15, 17, 10, 0], [794, 562, 15, 17, 10, 0], [794, 613, 14, 17, 11, 0], [794, 664, 15, 17, 11, 0], [794, 715, 15, 17, 11, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 13, \"widestlogicalchar\": 19, \"widestglyph\": 22, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 54, 12, 10, 8, 2], [1, 105, 16, 10, 12, 2], [1, 156, 15, 10, 10, 2], [1, 207, 16, 10, 11, 2], [1, 258, 19, 10, 15, 2], [1, 309, 16, 10, 14, 2], [1, 363, 11, 7, 9, 5], [1, 411, 13, 13, 8, 2], [1, 462, 11, 13, 8, 2], [1, 515, 13, 6, 10, 4], [1, 567, 13, 7, 11, 5], [1, 623, 8, 4, 6, 10], [1, 672, 13, 1, 11, 8], [1, 725, 7, 2, 6, 10], [1, 769, 12, 9, 7, 3], [62, 3, 14, 10, 10, 2], [62, 54, 13, 10, 10, 2], [62, 105, 13, 10, 10, 2], [62, 156, 14, 10, 10, 2], [62, 207, 14, 10, 10, 2], [62, 258, 15, 10, 10, 2], [62, 309, 15, 10, 10, 2], [62, 360, 15, 10, 10, 2], [62, 411, 14, 10, 10, 2], [62, 462, 14, 10, 10, 2], [62, 516, 10, 7, 7, 5], [62, 567, 10, 9, 7, 5], [62, 618, 15, 7, 11, 5], [62, 671, 13, 3, 11, 7], [62, 720, 13, 7, 11, 5], [62, 768, 14, 10, 9, 2], [123, 6, 14, 7, 11, 5], [123, 54, 15, 10, 14, 2], [123, 105, 16, 10, 12, 2], [123, 156, 19, 10, 14, 2], [123, 207, 14, 10, 12, 2], [123, 258, 17, 10, 12, 2], [123, 309, 17, 10, 14, 2], [123, 360, 17, 10, 12, 2], [123, 411, 19, 10, 14, 2], [123, 462, 13, 10, 8, 2], [123, 513, 15, 10, 12, 2], [123, 564, 17, 10, 13, 2], [123, 615, 14, 10, 13, 2], [123, 666, 21, 10, 16, 2], [123, 717, 19, 10, 14, 2], [123, 768, 16, 10, 13, 2], [184, 3, 19, 10, 14, 2], [184, 54, 16, 10, 13, 2], [184, 105, 15, 10, 11, 2], [184, 156, 17, 10, 12, 2], [184, 207, 17, 10, 12, 2], [184, 258, 17, 10, 12, 2], [184, 312, 13, 10, 10, 5], [184, 360, 16, 10, 14, 2], [184, 411, 17, 10, 12, 2], [184, 462, 19, 10, 14, 2], [184, 513, 17, 10, 12, 2], [184, 564, 13, 13, 8, 2], [184, 618, 14, 7, 13, 5], [184, 666, 13, 13, 8, 2], [184, 717, 14, 10, 13, 2], [184, 780, 10, 1, 10, 14], [245, 1, 1, 1, 10, 1], [245, 57, 15, 7, 12, 5], [245, 104, 16, 14, 11, 1], [245, 159, 15, 10, 11, 5], [245, 206, 15, 11, 10, 1], [245, 261, 13, 7, 9, 5], [245, 309, 14, 13, 12, 2], [245, 363, 13, 10, 9, 5], [245, 414, 14, 10, 11, 5], [245, 465, 10, 7, 8, 5], [245, 516, 14, 10, 12, 5], [245, 567, 14, 7, 11, 5], [245, 615, 13, 10, 11, 2], [245, 669, 13, 9, 11, 5], [245, 720, 14, 7, 11, 5], [245, 771, 14, 7, 11, 5], [306, 6, 14, 7, 11, 5], [306, 54, 14, 10, 10, 2], [306, 108, 14, 10, 11, 5], [306, 159, 15, 7, 11, 5], [306, 210, 12, 7, 9, 5], [306, 261, 14, 7, 11, 5], [306, 311, 18, 8, 14, 4], [306, 363, 17, 7, 14, 5], [306, 409, 15, 15, 10, 0], [306, 465, 16, 10, 12, 5], [306, 512, 15, 14, 10, 1], [306, 564, 15, 13, 10, 2], [306, 615, 11, 13, 6, 2], [306, 666, 12, 13, 10, 2], [306, 722, 13, 2, 11, 7], [306, 768, 9, 10, 4, 2], [367, 3, 9, 10, 4, 2], [367, 54, 9, 10, 4, 2], [367, 105, 9, 10, 4, 2], [367, 156, 9, 10, 4, 2], [367, 207, 9, 10, 4, 2], [367, 258, 9, 10, 4, 2], [367, 309, 9, 10, 4, 2], [367, 360, 9, 10, 4, 2], [367, 411, 9, 10, 4, 2], [367, 462, 9, 10, 4, 2], [367, 513, 9, 10, 4, 2], [367, 564, 9, 10, 4, 2], [367, 615, 9, 10, 4, 2], [367, 666, 9, 10, 4, 2], [367, 717, 9, 10, 4, 2], [367, 768, 9, 10, 4, 2], [428, 3, 9, 10, 4, 2], [428, 54, 9, 10, 4, 2], [428, 105, 9, 10, 4, 2], [428, 156, 9, 10, 4, 2], [428, 207, 9, 10, 4, 2], [428, 258, 9, 10, 4, 2], [428, 309, 9, 10, 4, 2], [428, 360, 9, 10, 4, 2], [428, 411, 9, 10, 4, 2], [428, 462, 9, 10, 4, 2], [428, 513, 9, 10, 4, 2], [428, 564, 9, 10, 4, 2], [428, 615, 9, 10, 4, 2], [428, 666, 9, 10, 4, 2], [428, 717, 9, 10, 4, 2], [428, 768, 9, 10, 4, 2], [489, 3, 9, 10, 4, 2], [489, 54, 16, 10, 12, 2], [489, 105, 12, 3, 7, 2], [489, 157, 15, 9, 11, 3], [489, 208, 12, 9, 7, 3], [489, 262, 15, 4, 13, 6], [489, 309, 15, 13, 10, 2], [489, 363, 16, 7, 14, 5], [489, 414, 15, 7, 14, 5], [489, 465, 16, 7, 14, 5], [489, 516, 15, 7, 14, 5], [489, 567, 20, 7, 18, 5], [489, 618, 20, 7, 17, 5], [489, 664, 16, 15, 12, 0], [489, 720, 20, 7, 17, 5], [489, 766, 14, 15, 12, 0], [550, 3, 13, 4, 9, 2], [550, 55, 14, 9, 11, 3], [550, 105, 14, 3, 9, 2], [550, 157, 14, 9, 11, 3], [550, 210, 14, 7, 11, 5], [550, 262, 15, 4, 13, 6], [550, 308, 14, 11, 10, 1], [550, 364, 12, 5, 10, 6], [550, 414, 13, 7, 11, 5], [550, 465, 13, 7, 11, 5], [550, 517, 14, 5, 11, 6], [550, 567, 14, 5, 11, 5], [550, 623, 18, 2, 18, 10], [550, 664, 14, 15, 12, 0], [550, 723, 21, 1, 18, 8], [550, 769, 16, 9, 13, 3], [611, 3, 17, 10, 15, 2], [611, 53, 18, 12, 13, 1], [611, 104, 19, 11, 15, 1], [611, 157, 17, 12, 15, 3], [611, 208, 17, 9, 14, 3], [611, 259, 17, 9, 14, 3], [611, 308, 20, 11, 15, 1], [611, 363, 16, 7, 13, 5], [611, 414, 17, 7, 13, 5], [611, 465, 15, 7, 13, 5], [611, 511, 1, 1, 13, 1], [611, 566, 16, 9, 13, 4], [611, 618, 17, 7, 13, 5], [611, 669, 16, 9, 13, 5], [611, 720, 15, 7, 13, 5], [611, 770, 14, 9, 13, 4], [672, 3, 19, 10, 14, 2], [672, 53, 18, 11, 13, 1], [672, 105, 18, 10, 15, 2], [672, 156, 18, 10, 15, 2], [672, 207, 18, 6, 14, 2], [672, 257, 20, 12, 15, 1], [672, 310, 15, 9, 11, 3], [672, 365, 8, 2, 7, 7], [672, 416, 15, 5, 13, 7], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 567, 20, 7, 18, 5], [672, 618, 19, 7, 17, 5], [672, 664, 16, 12, 12, 0], [672, 720, 20, 7, 17, 5], [672, 766, 15, 12, 12, 0], [733, 2, 14, 11, 10, 1], [733, 53, 12, 14, 8, 1], [733, 105, 18, 10, 15, 2], [733, 156, 18, 10, 15, 2], [733, 207, 18, 6, 14, 2], [733, 257, 17, 12, 13, 1], [733, 308, 13, 14, 9, 1], [733, 358, 11, 15, 9, 0], [733, 409, 11, 15, 9, 0], [733, 460, 11, 15, 9, 0], [733, 511, 11, 15, 9, 0], [733, 562, 11, 15, 9, 0], [733, 614, 14, 14, 10, 1], [733, 664, 13, 15, 10, 0], [733, 715, 13, 15, 10, 0], [733, 766, 13, 15, 10, 0], [1, 1, 1, 1, 7, 1], [794, 52, 12, 15, 8, 0], [794, 104, 12, 12, 7, 1], [794, 154, 18, 15, 13, 0], [794, 205, 15, 15, 13, 0], [794, 256, 15, 15, 13, 0], [794, 307, 13, 15, 9, 0], [794, 359, 14, 14, 9, 1], [794, 410, 14, 14, 9, 1], [794, 460, 14, 15, 9, 0], [794, 512, 14, 14, 9, 1], [794, 563, 14, 14, 9, 1], [794, 613, 13, 15, 10, 0], [794, 664, 13, 15, 10, 0], [794, 715, 13, 15, 10, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 12, \"widestlogicalchar\": 18, \"widestglyph\": 21, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 1, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 8, 6, 8, 7], [1, 54, 9, 12, 9, 2], [1, 105, 13, 12, 13, 2], [1, 156, 11, 12, 11, 2], [1, 207, 12, 12, 12, 2], [1, 258, 16, 12, 16, 2], [1, 309, 15, 12, 15, 2], [1, 363, 10, 9, 10, 5], [1, 411, 9, 15, 9, 2], [1, 462, 9, 15, 9, 2], [1, 515, 11, 9, 11, 4], [1, 567, 12, 9, 12, 5], [1, 620, 7, 9, 7, 7], [1, 671, 12, 6, 12, 7], [1, 722, 7, 7, 7, 7], [1, 768, 8, 12, 8, 2], [62, 3, 11, 12, 11, 2], [62, 54, 11, 12, 11, 2], [62, 105, 11, 12, 11, 2], [62, 156, 11, 12, 11, 2], [62, 207, 11, 12, 11, 2], [62, 258, 11, 12, 11, 2], [62, 309, 11, 12, 11, 2], [62, 360, 11, 12, 11, 2], [62, 411, 11, 12, 11, 2], [62, 462, 11, 12, 11, 2], [62, 516, 8, 9, 8, 5], [62, 567, 8, 11, 8, 5], [62, 618, 12, 9, 12, 5], [62, 671, 12, 6, 12, 7], [62, 720, 12, 9, 12, 5], [62, 768, 10, 12, 10, 2], [123, 6, 12, 9, 12, 5], [123, 54, 15, 12, 15, 2], [123, 105, 13, 12, 13, 2], [123, 156, 15, 12, 15, 2], [123, 207, 13, 12, 13, 2], [123, 258, 13, 12, 13, 2], [123, 309, 15, 12, 15, 2], [123, 360, 13, 12, 13, 2], [123, 411, 15, 12, 15, 2], [123, 462, 9, 12, 9, 2], [123, 513, 13, 12, 13, 2], [123, 564, 14, 12, 14, 2], [123, 615, 14, 12, 14, 2], [123, 666, 17, 12, 17, 2], [123, 717, 15, 12, 15, 2], [123, 768, 14, 12, 14, 2], [184, 3, 15, 12, 15, 2], [184, 54, 14, 12, 14, 2], [184, 105, 12, 12, 12, 2], [184, 156, 13, 12, 13, 2], [184, 207, 13, 12, 13, 2], [184, 258, 13, 12, 13, 2], [184, 312, 11, 12, 11, 5], [184, 360, 15, 12, 15, 2], [184, 411, 13, 12, 13, 2], [184, 462, 15, 12, 15, 2], [184, 513, 13, 12, 13, 2], [184, 564, 9, 15, 9, 2], [184, 618, 14, 9, 14, 5], [184, 666, 9, 15, 9, 2], [184, 717, 14, 12, 14, 2], [184, 773, 11, 10, 11, 7], [245, 1, 11, 13, 11, 0], [245, 57, 13, 9, 13, 5], [245, 104, 12, 16, 12, 1], [245, 159, 12, 12, 12, 5], [245, 206, 11, 13, 11, 1], [245, 261, 10, 9, 10, 5], [245, 309, 13, 15, 13, 2], [245, 363, 10, 12, 10, 5], [245, 414, 12, 12, 12, 5], [245, 465, 9, 9, 9, 5], [245, 516, 13, 12, 13, 5], [245, 567, 12, 9, 12, 5], [245, 615, 12, 12, 12, 2], [245, 669, 12, 11, 12, 5], [245, 720, 12, 9, 12, 5], [245, 771, 12, 9, 12, 5], [306, 6, 12, 9, 12, 5], [306, 54, 11, 12, 11, 2], [306, 108, 12, 12, 12, 5], [306, 159, 12, 9, 12, 5], [306, 210, 10, 9, 10, 5], [306, 261, 12, 9, 12, 5], [306, 311, 15, 10, 15, 4], [306, 363, 15, 9, 15, 5], [306, 409, 11, 17, 11, 0], [306, 465, 13, 12, 13, 5], [306, 512, 11, 16, 11, 1], [306, 564, 11, 15, 11, 2], [306, 615, 7, 15, 7, 2], [306, 666, 11, 15, 11, 2], [306, 722, 12, 6, 12, 7], [306, 768, 5, 12, 5, 2], [367, 3, 5, 12, 5, 2], [367, 54, 5, 12, 5, 2], [367, 105, 5, 12, 5, 2], [367, 156, 5, 12, 5, 2], [367, 207, 5, 12, 5, 2], [367, 258, 5, 12, 5, 2], [367, 309, 5, 12, 5, 2], [367, 360, 5, 12, 5, 2], [367, 411, 5, 12, 5, 2], [367, 462, 5, 12, 5, 2], [367, 513, 5, 12, 5, 2], [367, 564, 5, 12, 5, 2], [367, 615, 5, 12, 5, 2], [367, 666, 5, 12, 5, 2], [367, 717, 5, 12, 5, 2], [367, 768, 5, 12, 5, 2], [428, 3, 5, 12, 5, 2], [428, 54, 5, 12, 5, 2], [428, 105, 5, 12, 5, 2], [428, 156, 5, 12, 5, 2], [428, 207, 5, 12, 5, 2], [428, 258, 5, 12, 5, 2], [428, 309, 5, 12, 5, 2], [428, 360, 5, 12, 5, 2], [428, 411, 5, 12, 5, 2], [428, 462, 5, 12, 5, 2], [428, 513, 5, 12, 5, 2], [428, 564, 5, 12, 5, 2], [428, 615, 5, 12, 5, 2], [428, 666, 5, 12, 5, 2], [428, 717, 5, 12, 5, 2], [428, 768, 5, 12, 5, 2], [489, 3, 5, 12, 5, 2], [489, 54, 13, 12, 13, 2], [489, 105, 8, 11, 8, 2], [489, 157, 12, 11, 12, 3], [489, 207, 8, 12, 8, 2], [489, 262, 14, 7, 14, 6], [489, 309, 11, 15, 11, 2], [489, 363, 15, 9, 15, 5], [489, 414, 15, 9, 15, 5], [489, 465, 15, 9, 15, 5], [489, 516, 15, 9, 15, 5], [489, 567, 19, 9, 19, 5], [489, 618, 18, 9, 18, 5], [489, 664, 13, 17, 13, 0], [489, 720, 18, 9, 18, 5], [489, 766, 13, 17, 13, 0], [550, 3, 10, 11, 10, 2], [550, 55, 12, 11, 12, 3], [550, 105, 10, 11, 10, 2], [550, 157, 12, 11, 12, 3], [550, 210, 12, 9, 12, 5], [550, 262, 14, 7, 14, 6], [550, 308, 11, 13, 11, 1], [550, 364, 11, 7, 11, 6], [550, 414, 12, 9, 12, 5], [550, 465, 12, 9, 12, 5], [550, 517, 12, 7, 12, 6], [550, 567, 12, 8, 12, 5], [550, 620, 19, 7, 19, 7], [550, 664, 13, 17, 13, 0], [550, 722, 19, 6, 19, 7], [550, 769, 14, 11, 14, 3], [611, 3, 16, 12, 16, 2], [611, 53, 14, 14, 14, 1], [611, 104, 16, 13, 16, 1], [611, 157, 16, 14, 16, 3], [611, 208, 15, 11, 15, 3], [611, 259, 15, 11, 15, 3], [611, 308, 16, 13, 16, 1], [611, 363, 14, 9, 14, 5], [611, 414, 14, 9, 14, 5], [611, 465, 14, 9, 14, 5], [611, 516, 14, 11, 14, 5], [611, 566, 14, 11, 14, 4], [611, 618, 14, 9, 14, 5], [611, 669, 14, 11, 14, 5], [611, 720, 14, 9, 14, 5], [611, 770, 14, 11, 14, 4], [672, 3, 15, 12, 15, 2], [672, 53, 14, 13, 14, 1], [672, 105, 16, 12, 16, 2], [672, 156, 16, 12, 16, 2], [672, 207, 15, 11, 15, 2], [672, 257, 16, 14, 16, 1], [672, 307, 12, 14, 12, 0], [672, 365, 8, 6, 8, 7], [672, 416, 14, 7, 14, 7], [1, 8, 8, 6, 8, 7], [794, 773, 3, 6, 3, 7], [672, 567, 19, 9, 19, 5], [672, 618, 18, 9, 18, 5], [672, 664, 13, 14, 13, 0], [672, 720, 18, 9, 18, 5], [672, 766, 13, 14, 13, 0], [733, 2, 11, 13, 11, 1], [733, 52, 9, 17, 9, 0], [733, 105, 16, 12, 16, 2], [733, 156, 16, 12, 16, 2], [733, 207, 15, 11, 15, 2], [733, 257, 14, 14, 14, 1], [733, 307, 10, 17, 10, 0], [733, 358, 10, 17, 10, 0], [733, 409, 10, 17, 10, 0], [733, 460, 10, 17, 10, 0], [733, 511, 10, 17, 10, 0], [733, 562, 10, 17, 10, 0], [733, 613, 11, 17, 11, 0], [733, 664, 11, 17, 11, 0], [733, 715, 11, 17, 11, 0], [733, 766, 11, 17, 11, 0], [1, 8, 8, 6, 8, 7], [794, 52, 9, 17, 9, 0], [794, 103, 8, 15, 8, 0], [794, 154, 14, 17, 14, 0], [794, 205, 14, 17, 14, 0], [794, 256, 14, 17, 14, 0], [794, 307, 10, 17, 10, 0], [794, 358, 10, 17, 10, 0], [794, 409, 10, 17, 10, 0], [794, 460, 10, 17, 10, 0], [794, 511, 10, 17, 10, 0], [794, 562, 10, 17, 10, 0], [794, 613, 11, 17, 11, 0], [794, 664, 11, 17, 11, 0], [794, 715, 11, 17, 11, 0], [794, 773, 3, 6, 3, 7], [855, 8, 3, 6, 3, 7], [855, 59, 3, 6, 3, 7], [855, 110, 3, 6, 3, 7], [855, 161, 3, 6, 3, 7], [855, 212, 3, 6, 3, 7], [855, 263, 3, 6, 3, 7], [855, 314, 3, 6, 3, 7], [855, 365, 3, 6, 3, 7], [855, 416, 3, 6, 3, 7], [855, 467, 3, 6, 3, 7], [855, 518, 3, 6, 3, 7], [855, 569, 3, 6, 3, 7], [855, 620, 3, 6, 3, 7], [855, 671, 3, 6, 3, 7], [855, 722, 3, 6, 3, 7], [855, 773, 3, 6, 3, 7]], \"widestlogicalchar\": 19, \"widestglyph\": 19, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_14_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 7, 7, 6, 7, 6], [1, 54, 8, 10, 8, 2], [1, 105, 12, 10, 12, 2], [1, 156, 10, 10, 10, 2], [1, 207, 11, 10, 11, 2], [1, 258, 15, 10, 15, 2], [1, 309, 14, 10, 14, 2], [1, 363, 9, 7, 9, 5], [1, 411, 8, 13, 8, 2], [1, 462, 8, 13, 8, 2], [1, 515, 10, 8, 10, 4], [1, 567, 11, 7, 11, 5], [1, 619, 6, 8, 6, 6], [1, 670, 11, 6, 11, 6], [1, 721, 6, 6, 6, 6], [1, 768, 7, 10, 7, 2], [62, 3, 10, 10, 10, 2], [62, 54, 10, 10, 10, 2], [62, 105, 10, 10, 10, 2], [62, 156, 10, 10, 10, 2], [62, 207, 10, 10, 10, 2], [62, 258, 10, 10, 10, 2], [62, 309, 10, 10, 10, 2], [62, 360, 10, 10, 10, 2], [62, 411, 10, 10, 10, 2], [62, 462, 10, 10, 10, 2], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 618, 11, 7, 11, 5], [62, 670, 11, 6, 11, 6], [62, 720, 11, 7, 11, 5], [62, 768, 9, 10, 9, 2], [123, 6, 11, 7, 11, 5], [123, 54, 14, 10, 14, 2], [123, 105, 12, 10, 12, 2], [123, 156, 14, 10, 14, 2], [123, 207, 12, 10, 12, 2], [123, 258, 12, 10, 12, 2], [123, 309, 14, 10, 14, 2], [123, 360, 12, 10, 12, 2], [123, 411, 14, 10, 14, 2], [123, 462, 8, 10, 8, 2], [123, 513, 12, 10, 12, 2], [123, 564, 13, 10, 13, 2], [123, 615, 13, 10, 13, 2], [123, 666, 16, 10, 16, 2], [123, 717, 14, 10, 14, 2], [123, 768, 13, 10, 13, 2], [184, 3, 14, 10, 14, 2], [184, 54, 13, 10, 13, 2], [184, 105, 11, 10, 11, 2], [184, 156, 12, 10, 12, 2], [184, 207, 12, 10, 12, 2], [184, 258, 12, 10, 12, 2], [184, 312, 10, 10, 10, 5], [184, 360, 14, 10, 14, 2], [184, 411, 12, 10, 12, 2], [184, 462, 14, 10, 14, 2], [184, 513, 12, 10, 12, 2], [184, 564, 8, 13, 8, 2], [184, 618, 13, 7, 13, 5], [184, 666, 8, 13, 8, 2], [184, 717, 13, 10, 13, 2], [184, 772, 10, 9, 10, 6], [245, 1, 10, 12, 10, 0], [245, 57, 12, 7, 12, 5], [245, 104, 11, 14, 11, 1], [245, 159, 11, 10, 11, 5], [245, 206, 10, 11, 10, 1], [245, 261, 9, 7, 9, 5], [245, 309, 12, 13, 12, 2], [245, 363, 9, 10, 9, 5], [245, 414, 11, 10, 11, 5], [245, 465, 8, 7, 8, 5], [245, 516, 12, 10, 12, 5], [245, 567, 11, 7, 11, 5], [245, 615, 11, 10, 11, 2], [245, 669, 11, 9, 11, 5], [245, 720, 11, 7, 11, 5], [245, 771, 11, 7, 11, 5], [306, 6, 11, 7, 11, 5], [306, 54, 10, 10, 10, 2], [306, 108, 11, 10, 11, 5], [306, 159, 11, 7, 11, 5], [306, 210, 9, 7, 9, 5], [306, 261, 11, 7, 11, 5], [306, 311, 14, 8, 14, 4], [306, 363, 14, 7, 14, 5], [306, 409, 10, 15, 10, 0], [306, 465, 12, 10, 12, 5], [306, 512, 10, 14, 10, 1], [306, 564, 10, 13, 10, 2], [306, 615, 6, 13, 6, 2], [306, 666, 10, 13, 10, 2], [306, 721, 11, 6, 11, 6], [306, 768, 4, 10, 4, 2], [367, 3, 4, 10, 4, 2], [367, 54, 4, 10, 4, 2], [367, 105, 4, 10, 4, 2], [367, 156, 4, 10, 4, 2], [367, 207, 4, 10, 4, 2], [367, 258, 4, 10, 4, 2], [367, 309, 4, 10, 4, 2], [367, 360, 4, 10, 4, 2], [367, 411, 4, 10, 4, 2], [367, 462, 4, 10, 4, 2], [367, 513, 4, 10, 4, 2], [367, 564, 4, 10, 4, 2], [367, 615, 4, 10, 4, 2], [367, 666, 4, 10, 4, 2], [367, 717, 4, 10, 4, 2], [367, 768, 4, 10, 4, 2], [428, 3, 4, 10, 4, 2], [428, 54, 4, 10, 4, 2], [428, 105, 4, 10, 4, 2], [428, 156, 4, 10, 4, 2], [428, 207, 4, 10, 4, 2], [428, 258, 4, 10, 4, 2], [428, 309, 4, 10, 4, 2], [428, 360, 4, 10, 4, 2], [428, 411, 4, 10, 4, 2], [428, 462, 4, 10, 4, 2], [428, 513, 4, 10, 4, 2], [428, 564, 4, 10, 4, 2], [428, 615, 4, 10, 4, 2], [428, 666, 4, 10, 4, 2], [428, 717, 4, 10, 4, 2], [428, 768, 4, 10, 4, 2], [489, 3, 4, 10, 4, 2], [489, 54, 12, 10, 12, 2], [489, 105, 7, 10, 7, 2], [489, 157, 11, 9, 11, 3], [489, 207, 7, 10, 7, 2], [489, 262, 13, 6, 13, 6], [489, 309, 10, 13, 10, 2], [489, 363, 14, 7, 14, 5], [489, 414, 14, 7, 14, 5], [489, 465, 14, 7, 14, 5], [489, 516, 14, 7, 14, 5], [489, 567, 18, 7, 18, 5], [489, 618, 17, 7, 17, 5], [489, 664, 12, 15, 12, 0], [489, 720, 17, 7, 17, 5], [489, 766, 12, 15, 12, 0], [550, 3, 9, 10, 9, 2], [550, 55, 11, 9, 11, 3], [550, 105, 9, 10, 9, 2], [550, 157, 11, 9, 11, 3], [550, 210, 11, 7, 11, 5], [550, 262, 13, 6, 13, 6], [550, 308, 10, 11, 10, 1], [550, 364, 10, 6, 10, 6], [550, 414, 11, 7, 11, 5], [550, 465, 11, 7, 11, 5], [550, 517, 11, 6, 11, 6], [550, 567, 11, 7, 11, 5], [550, 619, 18, 6, 18, 6], [550, 664, 12, 15, 12, 0], [550, 721, 18, 6, 18, 6], [550, 769, 13, 9, 13, 3], [611, 3, 15, 10, 15, 2], [611, 53, 13, 12, 13, 1], [611, 104, 15, 11, 15, 1], [611, 157, 15, 12, 15, 3], [611, 208, 14, 9, 14, 3], [611, 259, 14, 9, 14, 3], [611, 308, 15, 11, 15, 1], [611, 363, 13, 7, 13, 5], [611, 414, 13, 7, 13, 5], [611, 465, 13, 7, 13, 5], [611, 516, 13, 9, 13, 5], [611, 566, 13, 9, 13, 4], [611, 618, 13, 7, 13, 5], [611, 669, 13, 9, 13, 5], [611, 720, 13, 7, 13, 5], [611, 770, 13, 9, 13, 4], [672, 3, 14, 10, 14, 2], [672, 53, 13, 11, 13, 1], [672, 105, 15, 10, 15, 2], [672, 156, 15, 10, 15, 2], [672, 207, 14, 10, 14, 2], [672, 257, 15, 12, 15, 1], [672, 307, 11, 12, 11, 0], [672, 364, 7, 6, 7, 6], [672, 415, 13, 6, 13, 6], [1, 7, 7, 6, 7, 6], [794, 772, 3, 6, 3, 6], [672, 567, 18, 7, 18, 5], [672, 618, 17, 7, 17, 5], [672, 664, 12, 12, 12, 0], [672, 720, 17, 7, 17, 5], [672, 766, 12, 12, 12, 0], [733, 2, 10, 11, 10, 1], [733, 52, 8, 15, 8, 0], [733, 105, 15, 10, 15, 2], [733, 156, 15, 10, 15, 2], [733, 207, 14, 10, 14, 2], [733, 257, 13, 12, 13, 1], [733, 307, 9, 15, 9, 0], [733, 358, 9, 15, 9, 0], [733, 409, 9, 15, 9, 0], [733, 460, 9, 15, 9, 0], [733, 511, 9, 15, 9, 0], [733, 562, 9, 15, 9, 0], [733, 613, 10, 15, 10, 0], [733, 664, 10, 15, 10, 0], [733, 715, 10, 15, 10, 0], [733, 766, 10, 15, 10, 0], [1, 7, 7, 6, 7, 6], [794, 52, 8, 15, 8, 0], [794, 103, 7, 13, 7, 0], [794, 154, 13, 15, 13, 0], [794, 205, 13, 15, 13, 0], [794, 256, 13, 15, 13, 0], [794, 307, 9, 15, 9, 0], [794, 358, 9, 15, 9, 0], [794, 409, 9, 15, 9, 0], [794, 460, 9, 15, 9, 0], [794, 511, 9, 15, 9, 0], [794, 562, 9, 15, 9, 0], [794, 613, 10, 15, 10, 0], [794, 664, 10, 15, 10, 0], [794, 715, 10, 15, 10, 0], [794, 772, 3, 6, 3, 6], [855, 7, 3, 6, 3, 6], [855, 58, 3, 6, 3, 6], [855, 109, 3, 6, 3, 6], [855, 160, 3, 6, 3, 6], [855, 211, 3, 6, 3, 6], [855, 262, 3, 6, 3, 6], [855, 313, 3, 6, 3, 6], [855, 364, 3, 6, 3, 6], [855, 415, 3, 6, 3, 6], [855, 466, 3, 6, 3, 6], [855, 517, 3, 6, 3, 6], [855, 568, 3, 6, 3, 6], [855, 619, 3, 6, 3, 6], [855, 670, 3, 6, 3, 6], [855, 721, 3, 6, 3, 6], [855, 772, 3, 6, 3, 6]], \"widestlogicalchar\": 18, \"widestglyph\": 18, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_+b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 58, 17, 14, 10, 6], [1, 109, 25, 14, 17, 6], [1, 160, 20, 14, 13, 6], [1, 211, 22, 14, 14, 6], [1, 262, 25, 14, 19, 6], [1, 313, 24, 14, 18, 6], [1, 367, 17, 11, 12, 9], [1, 415, 18, 18, 10, 6], [1, 466, 16, 18, 10, 6], [1, 519, 20, 10, 13, 8], [1, 571, 19, 11, 14, 9], [1, 629, 12, 7, 10, 16], [1, 677, 19, 3, 14, 13], [1, 731, 12, 4, 10, 16], [1, 772, 17, 14, 9, 6], [62, 7, 20, 14, 13, 6], [62, 58, 18, 14, 13, 6], [62, 109, 20, 14, 13, 6], [62, 160, 20, 14, 13, 6], [62, 211, 20, 14, 13, 6], [62, 262, 21, 14, 13, 6], [62, 313, 20, 14, 13, 6], [62, 364, 21, 14, 13, 6], [62, 415, 21, 14, 13, 6], [62, 466, 20, 14, 13, 6], [62, 521, 14, 10, 9, 10], [62, 572, 15, 13, 9, 10], [62, 623, 19, 9, 14, 10], [62, 675, 20, 6, 14, 11], [62, 725, 19, 9, 14, 10], [62, 772, 20, 14, 12, 6], [123, 11, 20, 10, 14, 10], [123, 58, 20, 14, 17, 6], [123, 109, 23, 14, 16, 6], [123, 160, 24, 14, 17, 6], [123, 211, 19, 14, 15, 6], [123, 262, 23, 14, 16, 6], [123, 313, 24, 14, 18, 6], [123, 364, 23, 14, 15, 6], [123, 415, 25, 14, 18, 6], [123, 466, 18, 14, 10, 6], [123, 516, 23, 15, 15, 5], [123, 568, 25, 14, 17, 6], [123, 619, 20, 14, 17, 6], [123, 670, 29, 14, 21, 6], [123, 721, 27, 14, 18, 6], [123, 772, 24, 14, 18, 6], [184, 7, 26, 14, 18, 6], [184, 58, 24, 14, 18, 6], [184, 109, 22, 14, 14, 6], [184, 160, 23, 14, 15, 6], [184, 211, 23, 14, 15, 6], [184, 262, 24, 14, 17, 6], [184, 316, 19, 15, 12, 9], [184, 364, 25, 14, 18, 6], [184, 415, 24, 14, 16, 6], [184, 466, 26, 14, 19, 6], [184, 517, 24, 14, 16, 6], [184, 568, 18, 18, 10, 6], [184, 623, 21, 10, 20, 10], [184, 670, 17, 18, 10, 6], [184, 721, 19, 14, 16, 6], [184, 787, 15, 3, 13, 21], [245, 5, 23, 3, 14, 4], [245, 61, 22, 11, 16, 9], [245, 107, 21, 20, 14, 4], [245, 163, 20, 14, 14, 9], [245, 210, 21, 15, 13, 5], [245, 265, 18, 11, 12, 9], [245, 314, 19, 16, 14, 7], [245, 368, 18, 14, 12, 10], [245, 418, 20, 15, 15, 9], [245, 469, 15, 11, 10, 9], [245, 520, 21, 15, 15, 9], [245, 571, 21, 11, 14, 9], [245, 618, 18, 15, 14, 5], [245, 673, 20, 15, 15, 9], [245, 724, 20, 11, 14, 9], [245, 775, 20, 11, 15, 9], [306, 10, 20, 11, 14, 9], [306, 57, 21, 15, 14, 5], [306, 112, 20, 15, 14, 9], [306, 163, 22, 11, 15, 9], [306, 214, 19, 11, 12, 9], [306, 265, 20, 11, 15, 9], [306, 315, 24, 12, 17, 8], [306, 367, 21, 11, 16, 9], [306, 413, 20, 20, 13, 4], [306, 469, 23, 15, 16, 9], [306, 515, 22, 20, 13, 4], [306, 568, 20, 18, 13, 6], [306, 619, 15, 18, 8, 6], [306, 670, 18, 18, 13, 6], [306, 728, 18, 4, 14, 13], [306, 771, 14, 14, 5, 5], [367, 6, 14, 14, 5, 5], [367, 57, 14, 14, 5, 5], [367, 108, 14, 14, 5, 5], [367, 159, 14, 14, 5, 5], [367, 210, 14, 14, 5, 5], [367, 261, 14, 14, 5, 5], [367, 312, 14, 14, 5, 5], [367, 363, 14, 14, 5, 5], [367, 414, 14, 14, 5, 5], [367, 465, 14, 14, 5, 5], [367, 516, 14, 14, 5, 5], [367, 567, 14, 14, 5, 5], [367, 618, 14, 14, 5, 5], [367, 669, 14, 14, 5, 5], [367, 720, 14, 14, 5, 5], [367, 771, 14, 14, 5, 5], [428, 6, 14, 14, 5, 5], [428, 57, 14, 14, 5, 5], [428, 108, 14, 14, 5, 5], [428, 159, 14, 14, 5, 5], [428, 210, 14, 14, 5, 5], [428, 261, 14, 14, 5, 5], [428, 312, 14, 14, 5, 5], [428, 363, 14, 14, 5, 5], [428, 414, 14, 14, 5, 5], [428, 465, 14, 14, 5, 5], [428, 516, 14, 14, 5, 5], [428, 567, 14, 14, 5, 5], [428, 618, 14, 14, 5, 5], [428, 669, 14, 14, 5, 5], [428, 720, 14, 14, 5, 5], [428, 771, 14, 14, 5, 5], [489, 6, 14, 14, 5, 5], [489, 61, 20, 11, 14, 9], [489, 109, 17, 5, 9, 6], [489, 163, 20, 11, 14, 9], [489, 211, 15, 14, 7, 6], [489, 267, 22, 7, 17, 11], [489, 313, 21, 18, 13, 6], [489, 366, 23, 13, 18, 8], [489, 417, 22, 12, 18, 8], [489, 468, 24, 12, 18, 8], [489, 519, 22, 13, 18, 8], [489, 571, 28, 11, 23, 9], [489, 622, 28, 11, 22, 9], [489, 671, 20, 13, 14, 7], [489, 724, 26, 11, 22, 9], [489, 769, 20, 17, 14, 3], [550, 7, 18, 6, 12, 6], [550, 60, 19, 12, 14, 8], [550, 109, 19, 5, 12, 6], [550, 163, 19, 11, 14, 9], [550, 214, 21, 11, 14, 9], [550, 267, 22, 7, 17, 11], [550, 312, 19, 15, 12, 5], [550, 369, 16, 7, 12, 11], [550, 419, 19, 9, 14, 10], [550, 469, 21, 10, 14, 9], [550, 521, 20, 9, 14, 10], [550, 573, 20, 7, 14, 11], [550, 629, 24, 4, 22, 16], [550, 665, 21, 24, 14, 1], [550, 728, 28, 3, 22, 13], [550, 772, 24, 14, 16, 6], [611, 7, 25, 14, 19, 6], [611, 57, 24, 15, 17, 5], [611, 108, 26, 15, 18, 5], [611, 163, 27, 15, 22, 9], [611, 212, 23, 13, 18, 7], [611, 263, 23, 13, 18, 7], [611, 313, 26, 14, 19, 6], [611, 367, 23, 11, 18, 9], [611, 418, 25, 11, 18, 9], [611, 469, 22, 11, 17, 9], [611, 511, 1, 1, 17, 1], [611, 570, 24, 13, 17, 8], [611, 622, 24, 11, 17, 9], [611, 673, 24, 13, 17, 9], [611, 724, 22, 11, 17, 9], [611, 773, 22, 15, 17, 7], [672, 7, 26, 14, 18, 6], [672, 58, 25, 14, 17, 6], [672, 109, 24, 14, 18, 6], [672, 160, 24, 14, 18, 6], [672, 211, 28, 9, 20, 6], [672, 260, 27, 17, 19, 4], [672, 311, 23, 16, 14, 4], [672, 370, 16, 4, 14, 12], [672, 422, 21, 6, 17, 13], [1, 1, 1, 1, 9, 1], [794, 766, 1, 1, 3, 1], [672, 571, 28, 11, 23, 9], [672, 622, 28, 11, 22, 9], [672, 665, 24, 19, 15, 1], [672, 724, 27, 11, 22, 9], [672, 767, 24, 19, 15, 1], [733, 7, 19, 14, 13, 6], [733, 57, 19, 19, 10, 5], [733, 109, 24, 14, 18, 6], [733, 160, 24, 14, 18, 6], [733, 211, 26, 9, 18, 6], [733, 261, 25, 16, 17, 5], [733, 310, 20, 23, 11, 3], [733, 358, 18, 26, 11, 0], [733, 409, 18, 25, 11, 0], [733, 461, 20, 25, 11, 1], [733, 511, 17, 26, 11, 0], [733, 562, 17, 23, 11, 0], [733, 614, 22, 25, 13, 1], [733, 664, 20, 26, 13, 0], [733, 715, 20, 22, 13, 0], [733, 766, 20, 26, 13, 0], [1, 1, 1, 1, 9, 1], [794, 57, 15, 19, 10, 5], [794, 104, 18, 21, 9, 1], [794, 155, 25, 25, 16, 1], [794, 205, 23, 26, 16, 0], [794, 256, 23, 21, 16, 0], [794, 310, 17, 23, 11, 3], [794, 358, 20, 26, 11, 0], [794, 409, 20, 25, 11, 0], [794, 461, 20, 25, 11, 1], [794, 511, 20, 26, 11, 0], [794, 562, 20, 23, 11, 0], [794, 614, 19, 25, 13, 1], [794, 664, 20, 26, 13, 0], [794, 715, 20, 22, 13, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 19, \"widestlogicalchar\": 23, \"widestglyph\": 29, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_+b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 58, 16, 12, 9, 6], [1, 109, 24, 12, 16, 6], [1, 160, 19, 12, 12, 6], [1, 211, 21, 12, 13, 6], [1, 262, 24, 12, 18, 6], [1, 313, 23, 12, 17, 6], [1, 367, 16, 9, 11, 9], [1, 415, 17, 16, 9, 6], [1, 466, 15, 16, 9, 6], [1, 519, 19, 8, 12, 8], [1, 571, 18, 9, 13, 9], [1, 629, 11, 5, 9, 16], [1, 677, 18, 1, 13, 13], [1, 731, 11, 2, 9, 16], [1, 772, 16, 12, 8, 6], [62, 7, 19, 12, 12, 6], [62, 58, 17, 12, 12, 6], [62, 109, 19, 12, 12, 6], [62, 160, 19, 12, 12, 6], [62, 211, 19, 12, 12, 6], [62, 262, 20, 12, 12, 6], [62, 313, 19, 12, 12, 6], [62, 364, 20, 12, 12, 6], [62, 415, 20, 12, 12, 6], [62, 466, 19, 12, 12, 6], [62, 521, 13, 8, 8, 10], [62, 572, 14, 11, 8, 10], [62, 623, 18, 7, 13, 10], [62, 675, 19, 4, 13, 11], [62, 725, 18, 7, 13, 10], [62, 772, 19, 12, 11, 6], [123, 11, 19, 8, 13, 10], [123, 58, 19, 12, 16, 6], [123, 109, 22, 12, 15, 6], [123, 160, 23, 12, 16, 6], [123, 211, 18, 12, 14, 6], [123, 262, 22, 12, 15, 6], [123, 313, 23, 12, 17, 6], [123, 364, 22, 12, 14, 6], [123, 415, 24, 12, 17, 6], [123, 466, 17, 12, 9, 6], [123, 516, 22, 13, 14, 5], [123, 568, 24, 12, 16, 6], [123, 619, 19, 12, 16, 6], [123, 670, 28, 12, 20, 6], [123, 721, 26, 12, 17, 6], [123, 772, 23, 12, 17, 6], [184, 7, 25, 12, 17, 6], [184, 58, 23, 12, 17, 6], [184, 109, 21, 12, 13, 6], [184, 160, 22, 12, 14, 6], [184, 211, 22, 12, 14, 6], [184, 262, 23, 12, 16, 6], [184, 316, 18, 13, 11, 9], [184, 364, 24, 12, 17, 6], [184, 415, 23, 12, 15, 6], [184, 466, 25, 12, 18, 6], [184, 517, 23, 12, 15, 6], [184, 568, 17, 16, 9, 6], [184, 623, 20, 8, 19, 10], [184, 670, 16, 16, 9, 6], [184, 721, 18, 12, 15, 6], [184, 787, 14, 1, 12, 21], [245, 5, 22, 1, 13, 4], [245, 61, 21, 9, 15, 9], [245, 107, 20, 18, 13, 4], [245, 163, 19, 12, 13, 9], [245, 210, 20, 13, 12, 5], [245, 265, 17, 9, 11, 9], [245, 314, 18, 14, 13, 7], [245, 368, 17, 12, 11, 10], [245, 418, 19, 13, 14, 9], [245, 469, 14, 9, 9, 9], [245, 520, 20, 13, 14, 9], [245, 571, 20, 9, 13, 9], [245, 618, 17, 13, 13, 5], [245, 673, 19, 13, 14, 9], [245, 724, 19, 9, 13, 9], [245, 775, 19, 9, 14, 9], [306, 10, 19, 9, 13, 9], [306, 57, 20, 13, 13, 5], [306, 112, 19, 13, 13, 9], [306, 163, 21, 9, 14, 9], [306, 214, 18, 9, 11, 9], [306, 265, 19, 9, 14, 9], [306, 315, 23, 10, 16, 8], [306, 367, 20, 9, 15, 9], [306, 413, 19, 18, 12, 4], [306, 469, 22, 13, 15, 9], [306, 515, 21, 18, 12, 4], [306, 568, 19, 16, 12, 6], [306, 619, 14, 16, 7, 6], [306, 670, 17, 16, 12, 6], [306, 728, 17, 2, 13, 13], [306, 771, 13, 12, 4, 5], [367, 6, 13, 12, 4, 5], [367, 57, 13, 12, 4, 5], [367, 108, 13, 12, 4, 5], [367, 159, 13, 12, 4, 5], [367, 210, 13, 12, 4, 5], [367, 261, 13, 12, 4, 5], [367, 312, 13, 12, 4, 5], [367, 363, 13, 12, 4, 5], [367, 414, 13, 12, 4, 5], [367, 465, 13, 12, 4, 5], [367, 516, 13, 12, 4, 5], [367, 567, 13, 12, 4, 5], [367, 618, 13, 12, 4, 5], [367, 669, 13, 12, 4, 5], [367, 720, 13, 12, 4, 5], [367, 771, 13, 12, 4, 5], [428, 6, 13, 12, 4, 5], [428, 57, 13, 12, 4, 5], [428, 108, 13, 12, 4, 5], [428, 159, 13, 12, 4, 5], [428, 210, 13, 12, 4, 5], [428, 261, 13, 12, 4, 5], [428, 312, 13, 12, 4, 5], [428, 363, 13, 12, 4, 5], [428, 414, 13, 12, 4, 5], [428, 465, 13, 12, 4, 5], [428, 516, 13, 12, 4, 5], [428, 567, 13, 12, 4, 5], [428, 618, 13, 12, 4, 5], [428, 669, 13, 12, 4, 5], [428, 720, 13, 12, 4, 5], [428, 771, 13, 12, 4, 5], [489, 6, 13, 12, 4, 5], [489, 61, 19, 9, 13, 9], [489, 109, 16, 3, 8, 6], [489, 163, 19, 9, 13, 9], [489, 211, 14, 12, 6, 6], [489, 267, 21, 5, 16, 11], [489, 313, 20, 16, 12, 6], [489, 366, 22, 11, 17, 8], [489, 417, 21, 10, 17, 8], [489, 468, 23, 10, 17, 8], [489, 519, 21, 11, 17, 8], [489, 571, 27, 9, 22, 9], [489, 622, 27, 9, 21, 9], [489, 671, 19, 11, 13, 7], [489, 724, 25, 9, 21, 9], [489, 769, 19, 15, 13, 3], [550, 7, 17, 4, 11, 6], [550, 60, 18, 10, 13, 8], [550, 109, 18, 3, 11, 6], [550, 163, 18, 9, 13, 9], [550, 214, 20, 9, 13, 9], [550, 267, 21, 5, 16, 11], [550, 312, 18, 13, 11, 5], [550, 369, 15, 5, 11, 11], [550, 419, 18, 7, 13, 10], [550, 469, 20, 8, 13, 9], [550, 521, 19, 7, 13, 10], [550, 573, 19, 5, 13, 11], [550, 629, 23, 2, 21, 16], [550, 665, 20, 22, 13, 1], [550, 728, 27, 1, 21, 13], [550, 772, 23, 12, 15, 6], [611, 7, 24, 12, 18, 6], [611, 57, 23, 13, 16, 5], [611, 108, 25, 13, 17, 5], [611, 163, 26, 13, 21, 9], [611, 212, 22, 11, 17, 7], [611, 263, 22, 11, 17, 7], [611, 313, 25, 12, 18, 6], [611, 367, 22, 9, 17, 9], [611, 418, 24, 9, 17, 9], [611, 469, 21, 9, 16, 9], [611, 511, 1, 1, 16, 1], [611, 570, 23, 11, 16, 8], [611, 622, 23, 9, 16, 9], [611, 673, 23, 11, 16, 9], [611, 724, 21, 9, 16, 9], [611, 773, 21, 13, 16, 7], [672, 7, 25, 12, 17, 6], [672, 58, 24, 12, 16, 6], [672, 109, 23, 12, 17, 6], [672, 160, 23, 12, 17, 6], [672, 211, 27, 7, 19, 6], [672, 260, 26, 15, 18, 4], [672, 311, 22, 14, 13, 4], [672, 370, 15, 2, 13, 12], [672, 422, 20, 4, 16, 13], [1, 1, 1, 1, 8, 1], [794, 766, 1, 1, 3, 1], [672, 571, 27, 9, 22, 9], [672, 622, 27, 9, 21, 9], [672, 665, 23, 17, 14, 1], [672, 724, 26, 9, 21, 9], [672, 767, 23, 17, 14, 1], [733, 7, 18, 12, 12, 6], [733, 57, 18, 17, 9, 5], [733, 109, 23, 12, 17, 6], [733, 160, 23, 12, 17, 6], [733, 211, 25, 7, 17, 6], [733, 261, 24, 14, 16, 5], [733, 311, 19, 20, 10, 4], [733, 358, 17, 24, 10, 0], [733, 409, 17, 23, 10, 0], [733, 461, 19, 23, 10, 1], [733, 511, 16, 24, 10, 0], [733, 562, 16, 21, 10, 0], [733, 614, 21, 23, 12, 1], [733, 664, 19, 24, 12, 0], [733, 715, 19, 20, 12, 0], [733, 766, 19, 24, 12, 0], [1, 1, 1, 1, 8, 1], [794, 57, 14, 17, 9, 5], [794, 105, 17, 18, 8, 2], [794, 155, 24, 23, 15, 1], [794, 205, 22, 24, 15, 0], [794, 256, 22, 19, 15, 0], [794, 310, 16, 21, 10, 3], [794, 360, 19, 22, 10, 2], [794, 411, 19, 21, 10, 2], [794, 461, 19, 23, 10, 1], [794, 513, 19, 22, 10, 2], [794, 564, 19, 19, 10, 2], [794, 614, 18, 23, 12, 1], [794, 664, 19, 24, 12, 0], [794, 715, 19, 20, 12, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 18, \"widestlogicalchar\": 22, \"widestglyph\": 28, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 9, 6, 9, 13], [1, 58, 10, 14, 10, 6], [1, 109, 17, 14, 17, 6], [1, 160, 13, 14, 13, 6], [1, 211, 14, 14, 14, 6], [1, 262, 19, 14, 19, 6], [1, 313, 18, 14, 18, 6], [1, 367, 12, 11, 12, 9], [1, 415, 10, 18, 10, 6], [1, 466, 10, 18, 10, 6], [1, 519, 13, 11, 13, 8], [1, 571, 14, 11, 14, 9], [1, 626, 10, 10, 10, 13], [1, 677, 14, 6, 14, 13], [1, 728, 10, 7, 10, 13], [1, 772, 9, 14, 9, 6], [62, 7, 13, 14, 13, 6], [62, 58, 13, 14, 13, 6], [62, 109, 13, 14, 13, 6], [62, 160, 13, 14, 13, 6], [62, 211, 13, 14, 13, 6], [62, 262, 13, 14, 13, 6], [62, 313, 13, 14, 13, 6], [62, 364, 13, 14, 13, 6], [62, 415, 13, 14, 13, 6], [62, 466, 13, 14, 13, 6], [62, 521, 9, 10, 9, 10], [62, 572, 9, 13, 9, 10], [62, 623, 14, 9, 14, 10], [62, 675, 14, 8, 14, 11], [62, 725, 14, 9, 14, 10], [62, 772, 12, 14, 12, 6], [123, 11, 14, 10, 14, 10], [123, 58, 17, 14, 17, 6], [123, 109, 16, 14, 16, 6], [123, 160, 17, 14, 17, 6], [123, 211, 15, 14, 15, 6], [123, 262, 16, 14, 16, 6], [123, 313, 18, 14, 18, 6], [123, 364, 15, 14, 15, 6], [123, 415, 18, 14, 18, 6], [123, 466, 10, 14, 10, 6], [123, 516, 15, 15, 15, 5], [123, 568, 17, 14, 17, 6], [123, 619, 17, 14, 17, 6], [123, 670, 21, 14, 21, 6], [123, 721, 18, 14, 18, 6], [123, 772, 18, 14, 18, 6], [184, 7, 18, 14, 18, 6], [184, 58, 18, 14, 18, 6], [184, 109, 14, 14, 14, 6], [184, 160, 15, 14, 15, 6], [184, 211, 15, 14, 15, 6], [184, 262, 17, 14, 17, 6], [184, 316, 12, 15, 12, 9], [184, 364, 18, 14, 18, 6], [184, 415, 16, 14, 16, 6], [184, 466, 19, 14, 19, 6], [184, 517, 16, 14, 16, 6], [184, 568, 10, 18, 10, 6], [184, 623, 20, 10, 20, 10], [184, 670, 10, 18, 10, 6], [184, 721, 16, 14, 16, 6], [184, 779, 13, 11, 13, 13], [245, 5, 14, 15, 14, 4], [245, 61, 16, 11, 16, 9], [245, 107, 14, 20, 14, 4], [245, 163, 14, 14, 14, 9], [245, 210, 13, 15, 13, 5], [245, 265, 12, 11, 12, 9], [245, 314, 14, 16, 14, 7], [245, 368, 12, 14, 12, 10], [245, 418, 15, 15, 15, 9], [245, 469, 10, 11, 10, 9], [245, 520, 15, 15, 15, 9], [245, 571, 14, 11, 14, 9], [245, 618, 14, 15, 14, 5], [245, 673, 15, 15, 15, 9], [245, 724, 14, 11, 14, 9], [245, 775, 15, 11, 15, 9], [306, 10, 14, 11, 14, 9], [306, 57, 14, 15, 14, 5], [306, 112, 14, 15, 14, 9], [306, 163, 15, 11, 15, 9], [306, 214, 12, 11, 12, 9], [306, 265, 15, 11, 15, 9], [306, 315, 17, 12, 17, 8], [306, 367, 16, 11, 16, 9], [306, 413, 13, 20, 13, 4], [306, 469, 16, 15, 16, 9], [306, 515, 13, 20, 13, 4], [306, 568, 13, 18, 13, 6], [306, 619, 8, 18, 8, 6], [306, 670, 13, 18, 13, 6], [306, 728, 14, 6, 14, 13], [306, 771, 5, 14, 5, 5], [367, 6, 5, 14, 5, 5], [367, 57, 5, 14, 5, 5], [367, 108, 5, 14, 5, 5], [367, 159, 5, 14, 5, 5], [367, 210, 5, 14, 5, 5], [367, 261, 5, 14, 5, 5], [367, 312, 5, 14, 5, 5], [367, 363, 5, 14, 5, 5], [367, 414, 5, 14, 5, 5], [367, 465, 5, 14, 5, 5], [367, 516, 5, 14, 5, 5], [367, 567, 5, 14, 5, 5], [367, 618, 5, 14, 5, 5], [367, 669, 5, 14, 5, 5], [367, 720, 5, 14, 5, 5], [367, 771, 5, 14, 5, 5], [428, 6, 5, 14, 5, 5], [428, 57, 5, 14, 5, 5], [428, 108, 5, 14, 5, 5], [428, 159, 5, 14, 5, 5], [428, 210, 5, 14, 5, 5], [428, 261, 5, 14, 5, 5], [428, 312, 5, 14, 5, 5], [428, 363, 5, 14, 5, 5], [428, 414, 5, 14, 5, 5], [428, 465, 5, 14, 5, 5], [428, 516, 5, 14, 5, 5], [428, 567, 5, 14, 5, 5], [428, 618, 5, 14, 5, 5], [428, 669, 5, 14, 5, 5], [428, 720, 5, 14, 5, 5], [428, 771, 5, 14, 5, 5], [489, 6, 5, 14, 5, 5], [489, 61, 14, 11, 14, 9], [489, 109, 9, 13, 9, 6], [489, 163, 14, 11, 14, 9], [489, 211, 7, 14, 7, 6], [489, 267, 17, 8, 17, 11], [489, 313, 13, 18, 13, 6], [489, 366, 18, 13, 18, 8], [489, 417, 18, 12, 18, 8], [489, 468, 18, 12, 18, 8], [489, 519, 18, 13, 18, 8], [489, 571, 23, 11, 23, 9], [489, 622, 22, 11, 22, 9], [489, 671, 14, 13, 14, 7], [489, 724, 22, 11, 22, 9], [489, 769, 14, 17, 14, 3], [550, 7, 12, 13, 12, 6], [550, 60, 14, 12, 14, 8], [550, 109, 12, 13, 12, 6], [550, 163, 14, 11, 14, 9], [550, 214, 14, 11, 14, 9], [550, 267, 17, 8, 17, 11], [550, 312, 12, 15, 12, 5], [550, 369, 12, 8, 12, 11], [550, 419, 14, 9, 14, 10], [550, 469, 14, 10, 14, 9], [550, 521, 14, 9, 14, 10], [550, 573, 14, 8, 14, 11], [550, 626, 22, 7, 22, 13], [550, 665, 14, 24, 14, 1], [550, 728, 22, 6, 22, 13], [550, 772, 16, 14, 16, 6], [611, 7, 19, 14, 19, 6], [611, 57, 17, 15, 17, 5], [611, 108, 18, 15, 18, 5], [611, 163, 22, 15, 22, 9], [611, 212, 18, 13, 18, 7], [611, 263, 18, 13, 18, 7], [611, 313, 19, 14, 19, 6], [611, 367, 18, 11, 18, 9], [611, 418, 18, 11, 18, 9], [611, 469, 17, 11, 17, 9], [611, 520, 17, 13, 17, 9], [611, 570, 17, 13, 17, 8], [611, 622, 17, 11, 17, 9], [611, 673, 17, 13, 17, 9], [611, 724, 17, 11, 17, 9], [611, 773, 17, 15, 17, 7], [672, 7, 18, 14, 18, 6], [672, 58, 17, 14, 17, 6], [672, 109, 18, 14, 18, 6], [672, 160, 18, 14, 18, 6], [672, 211, 20, 13, 20, 6], [672, 260, 19, 17, 19, 4], [672, 311, 14, 16, 14, 4], [672, 370, 14, 7, 14, 12], [672, 422, 17, 6, 17, 13], [1, 14, 9, 6, 9, 13], [794, 779, 3, 6, 3, 13], [672, 571, 23, 11, 23, 9], [672, 622, 22, 11, 22, 9], [672, 665, 15, 19, 15, 1], [672, 724, 22, 11, 22, 9], [672, 767, 15, 19, 15, 1], [733, 7, 13, 14, 13, 6], [733, 57, 10, 19, 10, 5], [733, 109, 18, 14, 18, 6], [733, 160, 18, 14, 18, 6], [733, 211, 18, 13, 18, 6], [733, 261, 17, 16, 17, 5], [733, 310, 11, 23, 11, 3], [733, 358, 11, 26, 11, 0], [733, 409, 11, 25, 11, 0], [733, 461, 11, 25, 11, 1], [733, 511, 11, 26, 11, 0], [733, 562, 11, 23, 11, 0], [733, 614, 13, 25, 13, 1], [733, 664, 13, 26, 13, 0], [733, 715, 13, 22, 13, 0], [733, 766, 13, 26, 13, 0], [1, 14, 9, 6, 9, 13], [794, 57, 10, 19, 10, 5], [794, 104, 9, 21, 9, 1], [794, 155, 16, 25, 16, 1], [794, 205, 16, 26, 16, 0], [794, 256, 16, 21, 16, 0], [794, 310, 11, 23, 11, 3], [794, 358, 11, 26, 11, 0], [794, 409, 11, 25, 11, 0], [794, 461, 11, 25, 11, 1], [794, 511, 11, 26, 11, 0], [794, 562, 11, 23, 11, 0], [794, 614, 13, 25, 13, 1], [794, 664, 13, 26, 13, 0], [794, 715, 13, 22, 13, 0], [794, 779, 3, 6, 3, 13], [855, 14, 3, 6, 3, 13], [855, 65, 3, 6, 3, 13], [855, 116, 3, 6, 3, 13], [855, 167, 3, 6, 3, 13], [855, 218, 3, 6, 3, 13], [855, 269, 3, 6, 3, 13], [855, 320, 3, 6, 3, 13], [855, 371, 3, 6, 3, 13], [855, 422, 3, 6, 3, 13], [855, 473, 3, 6, 3, 13], [855, 524, 3, 6, 3, 13], [855, 575, 3, 6, 3, 13], [855, 626, 3, 6, 3, 13], [855, 677, 3, 6, 3, 13], [855, 728, 3, 6, 3, 13], [855, 779, 3, 6, 3, 13]], \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 8, 6, 8, 12], [1, 58, 9, 12, 9, 6], [1, 109, 16, 12, 16, 6], [1, 160, 12, 12, 12, 6], [1, 211, 13, 12, 13, 6], [1, 262, 18, 12, 18, 6], [1, 313, 17, 12, 17, 6], [1, 367, 11, 9, 11, 9], [1, 415, 9, 16, 9, 6], [1, 466, 9, 16, 9, 6], [1, 519, 12, 10, 12, 8], [1, 571, 13, 9, 13, 9], [1, 625, 9, 9, 9, 12], [1, 676, 13, 6, 13, 12], [1, 727, 9, 6, 9, 12], [1, 772, 8, 12, 8, 6], [62, 7, 12, 12, 12, 6], [62, 58, 12, 12, 12, 6], [62, 109, 12, 12, 12, 6], [62, 160, 12, 12, 12, 6], [62, 211, 12, 12, 12, 6], [62, 262, 12, 12, 12, 6], [62, 313, 12, 12, 12, 6], [62, 364, 12, 12, 12, 6], [62, 415, 12, 12, 12, 6], [62, 466, 12, 12, 12, 6], [62, 521, 8, 8, 8, 10], [62, 572, 8, 11, 8, 10], [62, 623, 13, 8, 13, 10], [62, 675, 13, 7, 13, 11], [62, 725, 13, 8, 13, 10], [62, 772, 11, 12, 11, 6], [123, 11, 13, 8, 13, 10], [123, 58, 16, 12, 16, 6], [123, 109, 15, 12, 15, 6], [123, 160, 16, 12, 16, 6], [123, 211, 14, 12, 14, 6], [123, 262, 15, 12, 15, 6], [123, 313, 17, 12, 17, 6], [123, 364, 14, 12, 14, 6], [123, 415, 17, 12, 17, 6], [123, 466, 9, 12, 9, 6], [123, 516, 14, 13, 14, 5], [123, 568, 16, 12, 16, 6], [123, 619, 16, 12, 16, 6], [123, 670, 20, 12, 20, 6], [123, 721, 17, 12, 17, 6], [123, 772, 17, 12, 17, 6], [184, 7, 17, 12, 17, 6], [184, 58, 17, 12, 17, 6], [184, 109, 13, 12, 13, 6], [184, 160, 14, 12, 14, 6], [184, 211, 14, 12, 14, 6], [184, 262, 16, 12, 16, 6], [184, 316, 11, 13, 11, 9], [184, 364, 17, 12, 17, 6], [184, 415, 15, 12, 15, 6], [184, 466, 18, 12, 18, 6], [184, 517, 15, 12, 15, 6], [184, 568, 9, 16, 9, 6], [184, 623, 19, 8, 19, 10], [184, 670, 9, 16, 9, 6], [184, 721, 15, 12, 15, 6], [184, 778, 12, 10, 12, 12], [245, 5, 13, 14, 13, 4], [245, 61, 15, 9, 15, 9], [245, 107, 13, 18, 13, 4], [245, 163, 13, 12, 13, 9], [245, 210, 12, 13, 12, 5], [245, 265, 11, 9, 11, 9], [245, 314, 13, 14, 13, 7], [245, 368, 11, 12, 11, 10], [245, 418, 14, 13, 14, 9], [245, 469, 9, 9, 9, 9], [245, 520, 14, 13, 14, 9], [245, 571, 13, 9, 13, 9], [245, 618, 13, 13, 13, 5], [245, 673, 14, 13, 14, 9], [245, 724, 13, 9, 13, 9], [245, 775, 14, 9, 14, 9], [306, 10, 13, 9, 13, 9], [306, 57, 13, 13, 13, 5], [306, 112, 13, 13, 13, 9], [306, 163, 14, 9, 14, 9], [306, 214, 11, 9, 11, 9], [306, 265, 14, 9, 14, 9], [306, 315, 16, 10, 16, 8], [306, 367, 15, 9, 15, 9], [306, 413, 12, 18, 12, 4], [306, 469, 15, 13, 15, 9], [306, 515, 12, 18, 12, 4], [306, 568, 12, 16, 12, 6], [306, 619, 7, 16, 7, 6], [306, 670, 12, 16, 12, 6], [306, 727, 13, 6, 13, 12], [306, 771, 4, 13, 4, 5], [367, 6, 4, 13, 4, 5], [367, 57, 4, 13, 4, 5], [367, 108, 4, 13, 4, 5], [367, 159, 4, 13, 4, 5], [367, 210, 4, 13, 4, 5], [367, 261, 4, 13, 4, 5], [367, 312, 4, 13, 4, 5], [367, 363, 4, 13, 4, 5], [367, 414, 4, 13, 4, 5], [367, 465, 4, 13, 4, 5], [367, 516, 4, 13, 4, 5], [367, 567, 4, 13, 4, 5], [367, 618, 4, 13, 4, 5], [367, 669, 4, 13, 4, 5], [367, 720, 4, 13, 4, 5], [367, 771, 4, 13, 4, 5], [428, 6, 4, 13, 4, 5], [428, 57, 4, 13, 4, 5], [428, 108, 4, 13, 4, 5], [428, 159, 4, 13, 4, 5], [428, 210, 4, 13, 4, 5], [428, 261, 4, 13, 4, 5], [428, 312, 4, 13, 4, 5], [428, 363, 4, 13, 4, 5], [428, 414, 4, 13, 4, 5], [428, 465, 4, 13, 4, 5], [428, 516, 4, 13, 4, 5], [428, 567, 4, 13, 4, 5], [428, 618, 4, 13, 4, 5], [428, 669, 4, 13, 4, 5], [428, 720, 4, 13, 4, 5], [428, 771, 4, 13, 4, 5], [489, 6, 4, 13, 4, 5], [489, 61, 13, 9, 13, 9], [489, 109, 8, 12, 8, 6], [489, 163, 13, 9, 13, 9], [489, 211, 6, 12, 6, 6], [489, 267, 16, 7, 16, 11], [489, 313, 12, 16, 12, 6], [489, 366, 17, 11, 17, 8], [489, 417, 17, 10, 17, 8], [489, 468, 17, 10, 17, 8], [489, 519, 17, 11, 17, 8], [489, 571, 22, 9, 22, 9], [489, 622, 21, 9, 21, 9], [489, 671, 13, 11, 13, 7], [489, 724, 21, 9, 21, 9], [489, 769, 13, 15, 13, 3], [550, 7, 11, 12, 11, 6], [550, 60, 13, 10, 13, 8], [550, 109, 11, 12, 11, 6], [550, 163, 13, 9, 13, 9], [550, 214, 13, 9, 13, 9], [550, 267, 16, 7, 16, 11], [550, 312, 11, 13, 11, 5], [550, 369, 11, 7, 11, 11], [550, 419, 13, 8, 13, 10], [550, 469, 13, 9, 13, 9], [550, 521, 13, 8, 13, 10], [550, 573, 13, 7, 13, 11], [550, 625, 21, 6, 21, 12], [550, 665, 13, 22, 13, 1], [550, 727, 21, 6, 21, 12], [550, 772, 15, 12, 15, 6], [611, 7, 18, 12, 18, 6], [611, 57, 16, 13, 16, 5], [611, 108, 17, 13, 17, 5], [611, 163, 21, 13, 21, 9], [611, 212, 17, 11, 17, 7], [611, 263, 17, 11, 17, 7], [611, 313, 18, 12, 18, 6], [611, 367, 17, 9, 17, 9], [611, 418, 17, 9, 17, 9], [611, 469, 16, 9, 16, 9], [611, 520, 16, 11, 16, 9], [611, 570, 16, 11, 16, 8], [611, 622, 16, 9, 16, 9], [611, 673, 16, 11, 16, 9], [611, 724, 16, 9, 16, 9], [611, 773, 16, 13, 16, 7], [672, 7, 17, 12, 17, 6], [672, 58, 16, 12, 16, 6], [672, 109, 17, 12, 17, 6], [672, 160, 17, 12, 17, 6], [672, 211, 19, 12, 19, 6], [672, 260, 18, 15, 18, 4], [672, 311, 13, 14, 13, 4], [672, 370, 13, 6, 13, 12], [672, 421, 16, 6, 16, 12], [1, 13, 8, 6, 8, 12], [794, 778, 3, 6, 3, 12], [672, 571, 22, 9, 22, 9], [672, 622, 21, 9, 21, 9], [672, 665, 14, 17, 14, 1], [672, 724, 21, 9, 21, 9], [672, 767, 14, 17, 14, 1], [733, 7, 12, 12, 12, 6], [733, 57, 9, 17, 9, 5], [733, 109, 17, 12, 17, 6], [733, 160, 17, 12, 17, 6], [733, 211, 17, 12, 17, 6], [733, 261, 16, 14, 16, 5], [733, 310, 10, 21, 10, 3], [733, 358, 10, 24, 10, 0], [733, 409, 10, 23, 10, 0], [733, 461, 10, 23, 10, 1], [733, 511, 10, 24, 10, 0], [733, 562, 10, 21, 10, 0], [733, 614, 12, 23, 12, 1], [733, 664, 12, 24, 12, 0], [733, 715, 12, 20, 12, 0], [733, 766, 12, 24, 12, 0], [1, 13, 8, 6, 8, 12], [794, 57, 9, 17, 9, 5], [794, 104, 8, 19, 8, 1], [794, 155, 15, 23, 15, 1], [794, 205, 15, 24, 15, 0], [794, 256, 15, 19, 15, 0], [794, 310, 10, 21, 10, 3], [794, 358, 10, 24, 10, 0], [794, 409, 10, 23, 10, 0], [794, 461, 10, 23, 10, 1], [794, 511, 10, 24, 10, 0], [794, 562, 10, 21, 10, 0], [794, 614, 12, 23, 12, 1], [794, 664, 12, 24, 12, 0], [794, 715, 12, 20, 12, 0], [794, 778, 3, 6, 3, 12], [855, 13, 3, 6, 3, 12], [855, 64, 3, 6, 3, 12], [855, 115, 3, 6, 3, 12], [855, 166, 3, 6, 3, 12], [855, 217, 3, 6, 3, 12], [855, 268, 3, 6, 3, 12], [855, 319, 3, 6, 3, 12], [855, 370, 3, 6, 3, 12], [855, 421, 3, 6, 3, 12], [855, 472, 3, 6, 3, 12], [855, 523, 3, 6, 3, 12], [855, 574, 3, 6, 3, 12], [855, 625, 3, 6, 3, 12], [855, 676, 3, 6, 3, 12], [855, 727, 3, 6, 3, 12], [855, 778, 3, 6, 3, 12]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_b+iu+osdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 58, 16, 14, 10, 6], [1, 109, 24, 14, 17, 6], [1, 160, 19, 14, 13, 6], [1, 211, 21, 14, 14, 6], [1, 262, 24, 14, 19, 6], [1, 313, 23, 14, 18, 6], [1, 367, 16, 11, 12, 9], [1, 415, 17, 18, 10, 6], [1, 466, 15, 18, 10, 6], [1, 519, 19, 10, 13, 8], [1, 571, 18, 11, 14, 9], [1, 629, 11, 7, 10, 16], [1, 677, 18, 3, 14, 13], [1, 731, 11, 4, 10, 16], [1, 772, 16, 14, 9, 6], [62, 7, 19, 14, 13, 6], [62, 58, 17, 14, 13, 6], [62, 109, 19, 14, 13, 6], [62, 160, 19, 14, 13, 6], [62, 211, 19, 14, 13, 6], [62, 262, 20, 14, 13, 6], [62, 313, 19, 14, 13, 6], [62, 364, 20, 14, 13, 6], [62, 415, 20, 14, 13, 6], [62, 466, 19, 14, 13, 6], [62, 521, 13, 10, 9, 10], [62, 572, 14, 13, 9, 10], [62, 623, 18, 9, 14, 10], [62, 675, 19, 6, 14, 11], [62, 725, 18, 9, 14, 10], [62, 772, 19, 14, 12, 6], [123, 11, 19, 10, 14, 10], [123, 58, 19, 14, 17, 6], [123, 109, 22, 14, 16, 6], [123, 160, 23, 14, 17, 6], [123, 211, 18, 14, 15, 6], [123, 262, 22, 14, 16, 6], [123, 313, 23, 14, 18, 6], [123, 364, 22, 14, 15, 6], [123, 415, 24, 14, 18, 6], [123, 466, 17, 14, 10, 6], [123, 516, 22, 15, 15, 5], [123, 568, 24, 14, 17, 6], [123, 619, 19, 14, 17, 6], [123, 670, 28, 14, 21, 6], [123, 721, 26, 14, 18, 6], [123, 772, 23, 14, 18, 6], [184, 7, 25, 14, 18, 6], [184, 58, 23, 14, 18, 6], [184, 109, 21, 14, 14, 6], [184, 160, 22, 14, 15, 6], [184, 211, 22, 14, 15, 6], [184, 262, 23, 14, 17, 6], [184, 316, 18, 15, 12, 9], [184, 364, 24, 14, 18, 6], [184, 415, 23, 14, 16, 6], [184, 466, 25, 14, 19, 6], [184, 517, 23, 14, 16, 6], [184, 568, 17, 18, 10, 6], [184, 623, 20, 10, 20, 10], [184, 670, 16, 18, 10, 6], [184, 721, 18, 14, 16, 6], [184, 787, 14, 3, 13, 21], [245, 5, 22, 3, 14, 4], [245, 61, 21, 11, 16, 9], [245, 107, 20, 20, 14, 4], [245, 163, 19, 14, 14, 9], [245, 210, 20, 15, 13, 5], [245, 265, 17, 11, 12, 9], [245, 314, 18, 16, 14, 7], [245, 368, 17, 14, 12, 10], [245, 418, 19, 15, 15, 9], [245, 469, 14, 11, 10, 9], [245, 520, 20, 15, 15, 9], [245, 571, 20, 11, 14, 9], [245, 618, 17, 15, 14, 5], [245, 673, 19, 15, 15, 9], [245, 724, 19, 11, 14, 9], [245, 775, 19, 11, 15, 9], [306, 10, 19, 11, 14, 9], [306, 57, 20, 15, 14, 5], [306, 112, 19, 15, 14, 9], [306, 163, 21, 11, 15, 9], [306, 214, 18, 11, 12, 9], [306, 265, 19, 11, 15, 9], [306, 315, 23, 12, 17, 8], [306, 367, 20, 11, 16, 9], [306, 413, 19, 20, 13, 4], [306, 469, 22, 15, 16, 9], [306, 515, 21, 20, 13, 4], [306, 568, 19, 18, 13, 6], [306, 619, 14, 18, 8, 6], [306, 670, 17, 18, 13, 6], [306, 728, 17, 4, 14, 13], [306, 771, 13, 14, 5, 5], [367, 6, 13, 14, 5, 5], [367, 57, 13, 14, 5, 5], [367, 108, 13, 14, 5, 5], [367, 159, 13, 14, 5, 5], [367, 210, 13, 14, 5, 5], [367, 261, 13, 14, 5, 5], [367, 312, 13, 14, 5, 5], [367, 363, 13, 14, 5, 5], [367, 414, 13, 14, 5, 5], [367, 465, 13, 14, 5, 5], [367, 516, 13, 14, 5, 5], [367, 567, 13, 14, 5, 5], [367, 618, 13, 14, 5, 5], [367, 669, 13, 14, 5, 5], [367, 720, 13, 14, 5, 5], [367, 771, 13, 14, 5, 5], [428, 6, 13, 14, 5, 5], [428, 57, 13, 14, 5, 5], [428, 108, 13, 14, 5, 5], [428, 159, 13, 14, 5, 5], [428, 210, 13, 14, 5, 5], [428, 261, 13, 14, 5, 5], [428, 312, 13, 14, 5, 5], [428, 363, 13, 14, 5, 5], [428, 414, 13, 14, 5, 5], [428, 465, 13, 14, 5, 5], [428, 516, 13, 14, 5, 5], [428, 567, 13, 14, 5, 5], [428, 618, 13, 14, 5, 5], [428, 669, 13, 14, 5, 5], [428, 720, 13, 14, 5, 5], [428, 771, 13, 14, 5, 5], [489, 6, 13, 14, 5, 5], [489, 61, 19, 11, 14, 9], [489, 109, 16, 5, 9, 6], [489, 163, 19, 11, 14, 9], [489, 211, 14, 14, 7, 6], [489, 267, 21, 7, 17, 11], [489, 313, 20, 18, 13, 6], [489, 366, 22, 13, 18, 8], [489, 417, 21, 12, 18, 8], [489, 468, 23, 12, 18, 8], [489, 519, 21, 13, 18, 8], [489, 571, 27, 11, 23, 9], [489, 622, 27, 11, 22, 9], [489, 671, 19, 13, 14, 7], [489, 724, 25, 11, 22, 9], [489, 769, 19, 17, 14, 3], [550, 7, 17, 6, 12, 6], [550, 60, 18, 12, 14, 8], [550, 109, 18, 5, 12, 6], [550, 163, 18, 11, 14, 9], [550, 214, 20, 11, 14, 9], [550, 267, 21, 7, 17, 11], [550, 312, 18, 15, 12, 5], [550, 369, 15, 7, 12, 11], [550, 419, 18, 9, 14, 10], [550, 469, 20, 10, 14, 9], [550, 521, 19, 9, 14, 10], [550, 573, 19, 7, 14, 11], [550, 629, 23, 4, 22, 16], [550, 665, 20, 24, 14, 1], [550, 728, 27, 3, 22, 13], [550, 772, 23, 14, 16, 6], [611, 7, 24, 14, 19, 6], [611, 57, 23, 15, 17, 5], [611, 108, 25, 15, 18, 5], [611, 163, 26, 15, 22, 9], [611, 212, 22, 13, 18, 7], [611, 263, 22, 13, 18, 7], [611, 313, 25, 14, 19, 6], [611, 367, 22, 11, 18, 9], [611, 418, 24, 11, 18, 9], [611, 469, 21, 11, 17, 9], [611, 511, 1, 1, 17, 1], [611, 570, 23, 13, 17, 8], [611, 622, 23, 11, 17, 9], [611, 673, 23, 13, 17, 9], [611, 724, 21, 11, 17, 9], [611, 773, 21, 15, 17, 7], [672, 7, 25, 14, 18, 6], [672, 58, 24, 14, 17, 6], [672, 109, 23, 14, 18, 6], [672, 160, 23, 14, 18, 6], [672, 211, 27, 9, 20, 6], [672, 260, 26, 17, 19, 4], [672, 311, 22, 16, 14, 4], [672, 370, 15, 4, 14, 12], [672, 422, 20, 6, 17, 13], [1, 1, 1, 1, 9, 1], [794, 766, 1, 1, 3, 1], [672, 571, 27, 11, 23, 9], [672, 622, 27, 11, 22, 9], [672, 665, 23, 19, 15, 1], [672, 724, 26, 11, 22, 9], [672, 767, 23, 19, 15, 1], [733, 7, 18, 14, 13, 6], [733, 57, 18, 19, 10, 5], [733, 109, 23, 14, 18, 6], [733, 160, 23, 14, 18, 6], [733, 211, 25, 9, 18, 6], [733, 261, 24, 16, 17, 5], [733, 310, 19, 23, 11, 3], [733, 358, 17, 26, 11, 0], [733, 409, 17, 25, 11, 0], [733, 461, 19, 25, 11, 1], [733, 511, 16, 26, 11, 0], [733, 562, 16, 23, 11, 0], [733, 614, 21, 25, 13, 1], [733, 664, 19, 26, 13, 0], [733, 715, 19, 22, 13, 0], [733, 766, 19, 26, 13, 0], [1, 1, 1, 1, 9, 1], [794, 57, 14, 19, 10, 5], [794, 104, 17, 21, 9, 1], [794, 155, 24, 25, 16, 1], [794, 205, 22, 26, 16, 0], [794, 256, 22, 21, 16, 0], [794, 310, 16, 23, 11, 3], [794, 358, 19, 26, 11, 0], [794, 409, 19, 25, 11, 0], [794, 461, 19, 25, 11, 1], [794, 511, 19, 26, 11, 0], [794, 562, 19, 23, 11, 0], [794, 614, 18, 25, 13, 1], [794, 664, 19, 26, 13, 0], [794, 715, 19, 22, 13, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 19, \"widestlogicalchar\": 23, \"widestglyph\": 28, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_b+iuosdce.json",
    "content": "{\"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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 8, 1], [1, 58, 15, 12, 9, 6], [1, 109, 23, 12, 16, 6], [1, 160, 18, 12, 12, 6], [1, 211, 20, 12, 13, 6], [1, 262, 23, 12, 18, 6], [1, 313, 22, 12, 17, 6], [1, 367, 15, 9, 11, 9], [1, 415, 16, 16, 9, 6], [1, 466, 14, 16, 9, 6], [1, 519, 18, 8, 12, 8], [1, 571, 17, 9, 13, 9], [1, 629, 10, 5, 9, 16], [1, 677, 17, 1, 13, 13], [1, 731, 10, 2, 9, 16], [1, 772, 15, 12, 8, 6], [62, 7, 18, 12, 12, 6], [62, 58, 16, 12, 12, 6], [62, 109, 18, 12, 12, 6], [62, 160, 18, 12, 12, 6], [62, 211, 18, 12, 12, 6], [62, 262, 19, 12, 12, 6], [62, 313, 18, 12, 12, 6], [62, 364, 19, 12, 12, 6], [62, 415, 19, 12, 12, 6], [62, 466, 18, 12, 12, 6], [62, 521, 12, 8, 8, 10], [62, 572, 13, 11, 8, 10], [62, 623, 17, 7, 13, 10], [62, 675, 18, 4, 13, 11], [62, 725, 17, 7, 13, 10], [62, 772, 18, 12, 11, 6], [123, 11, 18, 8, 13, 10], [123, 58, 18, 12, 16, 6], [123, 109, 21, 12, 15, 6], [123, 160, 22, 12, 16, 6], [123, 211, 17, 12, 14, 6], [123, 262, 21, 12, 15, 6], [123, 313, 22, 12, 17, 6], [123, 364, 21, 12, 14, 6], [123, 415, 23, 12, 17, 6], [123, 466, 16, 12, 9, 6], [123, 516, 21, 13, 14, 5], [123, 568, 23, 12, 16, 6], [123, 619, 18, 12, 16, 6], [123, 670, 27, 12, 20, 6], [123, 721, 25, 12, 17, 6], [123, 772, 22, 12, 17, 6], [184, 7, 24, 12, 17, 6], [184, 58, 22, 12, 17, 6], [184, 109, 20, 12, 13, 6], [184, 160, 21, 12, 14, 6], [184, 211, 21, 12, 14, 6], [184, 262, 22, 12, 16, 6], [184, 316, 17, 13, 11, 9], [184, 364, 23, 12, 17, 6], [184, 415, 22, 12, 15, 6], [184, 466, 24, 12, 18, 6], [184, 517, 22, 12, 15, 6], [184, 568, 16, 16, 9, 6], [184, 623, 19, 8, 19, 10], [184, 670, 15, 16, 9, 6], [184, 721, 17, 12, 15, 6], [184, 787, 13, 1, 12, 21], [245, 5, 21, 1, 13, 4], [245, 61, 20, 9, 15, 9], [245, 107, 19, 18, 13, 4], [245, 163, 18, 12, 13, 9], [245, 210, 19, 13, 12, 5], [245, 265, 16, 9, 11, 9], [245, 314, 17, 14, 13, 7], [245, 368, 16, 12, 11, 10], [245, 418, 18, 13, 14, 9], [245, 469, 13, 9, 9, 9], [245, 520, 19, 13, 14, 9], [245, 571, 19, 9, 13, 9], [245, 618, 16, 13, 13, 5], [245, 673, 18, 13, 14, 9], [245, 724, 18, 9, 13, 9], [245, 775, 18, 9, 14, 9], [306, 10, 18, 9, 13, 9], [306, 57, 19, 13, 13, 5], [306, 112, 18, 13, 13, 9], [306, 163, 20, 9, 14, 9], [306, 214, 17, 9, 11, 9], [306, 265, 18, 9, 14, 9], [306, 315, 22, 10, 16, 8], [306, 367, 19, 9, 15, 9], [306, 413, 18, 18, 12, 4], [306, 469, 21, 13, 15, 9], [306, 515, 20, 18, 12, 4], [306, 568, 18, 16, 12, 6], [306, 619, 13, 16, 7, 6], [306, 670, 16, 16, 12, 6], [306, 728, 16, 2, 13, 13], [306, 771, 12, 12, 4, 5], [367, 6, 12, 12, 4, 5], [367, 57, 12, 12, 4, 5], [367, 108, 12, 12, 4, 5], [367, 159, 12, 12, 4, 5], [367, 210, 12, 12, 4, 5], [367, 261, 12, 12, 4, 5], [367, 312, 12, 12, 4, 5], [367, 363, 12, 12, 4, 5], [367, 414, 12, 12, 4, 5], [367, 465, 12, 12, 4, 5], [367, 516, 12, 12, 4, 5], [367, 567, 12, 12, 4, 5], [367, 618, 12, 12, 4, 5], [367, 669, 12, 12, 4, 5], [367, 720, 12, 12, 4, 5], [367, 771, 12, 12, 4, 5], [428, 6, 12, 12, 4, 5], [428, 57, 12, 12, 4, 5], [428, 108, 12, 12, 4, 5], [428, 159, 12, 12, 4, 5], [428, 210, 12, 12, 4, 5], [428, 261, 12, 12, 4, 5], [428, 312, 12, 12, 4, 5], [428, 363, 12, 12, 4, 5], [428, 414, 12, 12, 4, 5], [428, 465, 12, 12, 4, 5], [428, 516, 12, 12, 4, 5], [428, 567, 12, 12, 4, 5], [428, 618, 12, 12, 4, 5], [428, 669, 12, 12, 4, 5], [428, 720, 12, 12, 4, 5], [428, 771, 12, 12, 4, 5], [489, 6, 12, 12, 4, 5], [489, 61, 18, 9, 13, 9], [489, 109, 15, 3, 8, 6], [489, 163, 18, 9, 13, 9], [489, 211, 13, 12, 6, 6], [489, 267, 20, 5, 16, 11], [489, 313, 19, 16, 12, 6], [489, 366, 21, 11, 17, 8], [489, 417, 20, 10, 17, 8], [489, 468, 22, 10, 17, 8], [489, 519, 20, 11, 17, 8], [489, 571, 26, 9, 22, 9], [489, 622, 26, 9, 21, 9], [489, 671, 18, 11, 13, 7], [489, 724, 24, 9, 21, 9], [489, 769, 18, 15, 13, 3], [550, 7, 16, 4, 11, 6], [550, 60, 17, 10, 13, 8], [550, 109, 17, 3, 11, 6], [550, 163, 17, 9, 13, 9], [550, 214, 19, 9, 13, 9], [550, 267, 20, 5, 16, 11], [550, 312, 17, 13, 11, 5], [550, 369, 14, 5, 11, 11], [550, 419, 17, 7, 13, 10], [550, 469, 19, 8, 13, 9], [550, 521, 18, 7, 13, 10], [550, 573, 18, 5, 13, 11], [550, 629, 22, 2, 21, 16], [550, 665, 19, 22, 13, 1], [550, 728, 26, 1, 21, 13], [550, 772, 22, 12, 15, 6], [611, 7, 23, 12, 18, 6], [611, 57, 22, 13, 16, 5], [611, 108, 24, 13, 17, 5], [611, 163, 25, 13, 21, 9], [611, 212, 21, 11, 17, 7], [611, 263, 21, 11, 17, 7], [611, 313, 24, 12, 18, 6], [611, 367, 21, 9, 17, 9], [611, 418, 23, 9, 17, 9], [611, 469, 20, 9, 16, 9], [611, 511, 1, 1, 16, 1], [611, 570, 22, 11, 16, 8], [611, 622, 22, 9, 16, 9], [611, 673, 22, 11, 16, 9], [611, 724, 20, 9, 16, 9], [611, 773, 20, 13, 16, 7], [672, 7, 24, 12, 17, 6], [672, 58, 23, 12, 16, 6], [672, 109, 22, 12, 17, 6], [672, 160, 22, 12, 17, 6], [672, 211, 26, 7, 19, 6], [672, 260, 25, 15, 18, 4], [672, 313, 20, 12, 13, 6], [672, 370, 14, 2, 13, 12], [672, 422, 19, 4, 16, 13], [1, 1, 1, 1, 8, 1], [794, 766, 1, 1, 3, 1], [672, 571, 26, 9, 22, 9], [672, 622, 26, 9, 21, 9], [672, 665, 22, 17, 14, 1], [672, 724, 25, 9, 21, 9], [672, 767, 22, 17, 14, 1], [733, 7, 17, 12, 12, 6], [733, 57, 17, 17, 9, 5], [733, 109, 22, 12, 17, 6], [733, 160, 22, 12, 17, 6], [733, 211, 24, 7, 17, 6], [733, 261, 23, 14, 16, 5], [733, 311, 18, 20, 10, 4], [733, 358, 16, 24, 10, 0], [733, 409, 16, 23, 10, 0], [733, 461, 18, 23, 10, 1], [733, 511, 15, 24, 10, 0], [733, 562, 15, 21, 10, 0], [733, 614, 20, 23, 12, 1], [733, 664, 18, 24, 12, 0], [733, 715, 18, 20, 12, 0], [733, 766, 18, 24, 12, 0], [1, 1, 1, 1, 8, 1], [794, 57, 13, 17, 9, 5], [794, 105, 16, 18, 8, 2], [794, 155, 23, 23, 15, 1], [794, 205, 21, 24, 15, 0], [794, 256, 21, 19, 15, 0], [794, 310, 15, 21, 10, 3], [794, 362, 18, 20, 10, 4], [794, 413, 18, 19, 10, 4], [794, 461, 18, 23, 10, 1], [794, 515, 18, 20, 10, 4], [794, 566, 18, 17, 10, 4], [794, 614, 17, 23, 12, 1], [794, 664, 18, 24, 12, 0], [794, 715, 18, 20, 12, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 18, \"widestlogicalchar\": 22, \"widestglyph\": 27, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 14, 9, 6, 9, 13], [1, 58, 10, 14, 10, 6], [1, 109, 17, 14, 17, 6], [1, 160, 13, 14, 13, 6], [1, 211, 14, 14, 14, 6], [1, 262, 19, 14, 19, 6], [1, 313, 18, 14, 18, 6], [1, 367, 12, 11, 12, 9], [1, 415, 10, 18, 10, 6], [1, 466, 10, 18, 10, 6], [1, 519, 13, 11, 13, 8], [1, 571, 14, 11, 14, 9], [1, 626, 10, 10, 10, 13], [1, 677, 14, 6, 14, 13], [1, 728, 10, 7, 10, 13], [1, 772, 9, 14, 9, 6], [62, 7, 13, 14, 13, 6], [62, 58, 13, 14, 13, 6], [62, 109, 13, 14, 13, 6], [62, 160, 13, 14, 13, 6], [62, 211, 13, 14, 13, 6], [62, 262, 13, 14, 13, 6], [62, 313, 13, 14, 13, 6], [62, 364, 13, 14, 13, 6], [62, 415, 13, 14, 13, 6], [62, 466, 13, 14, 13, 6], [62, 521, 9, 10, 9, 10], [62, 572, 9, 13, 9, 10], [62, 623, 14, 9, 14, 10], [62, 675, 14, 8, 14, 11], [62, 725, 14, 9, 14, 10], [62, 772, 12, 14, 12, 6], [123, 11, 14, 10, 14, 10], [123, 58, 17, 14, 17, 6], [123, 109, 16, 14, 16, 6], [123, 160, 17, 14, 17, 6], [123, 211, 15, 14, 15, 6], [123, 262, 16, 14, 16, 6], [123, 313, 18, 14, 18, 6], [123, 364, 15, 14, 15, 6], [123, 415, 18, 14, 18, 6], [123, 466, 10, 14, 10, 6], [123, 516, 15, 15, 15, 5], [123, 568, 17, 14, 17, 6], [123, 619, 17, 14, 17, 6], [123, 670, 21, 14, 21, 6], [123, 721, 18, 14, 18, 6], [123, 772, 18, 14, 18, 6], [184, 7, 18, 14, 18, 6], [184, 58, 18, 14, 18, 6], [184, 109, 14, 14, 14, 6], [184, 160, 15, 14, 15, 6], [184, 211, 15, 14, 15, 6], [184, 262, 17, 14, 17, 6], [184, 316, 12, 15, 12, 9], [184, 364, 18, 14, 18, 6], [184, 415, 16, 14, 16, 6], [184, 466, 19, 14, 19, 6], [184, 517, 16, 14, 16, 6], [184, 568, 10, 18, 10, 6], [184, 623, 20, 10, 20, 10], [184, 670, 10, 18, 10, 6], [184, 721, 16, 14, 16, 6], [184, 779, 13, 11, 13, 13], [245, 5, 14, 15, 14, 4], [245, 61, 16, 11, 16, 9], [245, 107, 14, 20, 14, 4], [245, 163, 14, 14, 14, 9], [245, 210, 13, 15, 13, 5], [245, 265, 12, 11, 12, 9], [245, 314, 14, 16, 14, 7], [245, 368, 12, 14, 12, 10], [245, 418, 15, 15, 15, 9], [245, 469, 10, 11, 10, 9], [245, 520, 15, 15, 15, 9], [245, 571, 14, 11, 14, 9], [245, 618, 14, 15, 14, 5], [245, 673, 15, 15, 15, 9], [245, 724, 14, 11, 14, 9], [245, 775, 15, 11, 15, 9], [306, 10, 14, 11, 14, 9], [306, 57, 14, 15, 14, 5], [306, 112, 14, 15, 14, 9], [306, 163, 15, 11, 15, 9], [306, 214, 12, 11, 12, 9], [306, 265, 15, 11, 15, 9], [306, 315, 17, 12, 17, 8], [306, 367, 16, 11, 16, 9], [306, 413, 13, 20, 13, 4], [306, 469, 16, 15, 16, 9], [306, 515, 13, 20, 13, 4], [306, 568, 13, 18, 13, 6], [306, 619, 8, 18, 8, 6], [306, 670, 13, 18, 13, 6], [306, 728, 14, 6, 14, 13], [306, 771, 5, 14, 5, 5], [367, 6, 5, 14, 5, 5], [367, 57, 5, 14, 5, 5], [367, 108, 5, 14, 5, 5], [367, 159, 5, 14, 5, 5], [367, 210, 5, 14, 5, 5], [367, 261, 5, 14, 5, 5], [367, 312, 5, 14, 5, 5], [367, 363, 5, 14, 5, 5], [367, 414, 5, 14, 5, 5], [367, 465, 5, 14, 5, 5], [367, 516, 5, 14, 5, 5], [367, 567, 5, 14, 5, 5], [367, 618, 5, 14, 5, 5], [367, 669, 5, 14, 5, 5], [367, 720, 5, 14, 5, 5], [367, 771, 5, 14, 5, 5], [428, 6, 5, 14, 5, 5], [428, 57, 5, 14, 5, 5], [428, 108, 5, 14, 5, 5], [428, 159, 5, 14, 5, 5], [428, 210, 5, 14, 5, 5], [428, 261, 5, 14, 5, 5], [428, 312, 5, 14, 5, 5], [428, 363, 5, 14, 5, 5], [428, 414, 5, 14, 5, 5], [428, 465, 5, 14, 5, 5], [428, 516, 5, 14, 5, 5], [428, 567, 5, 14, 5, 5], [428, 618, 5, 14, 5, 5], [428, 669, 5, 14, 5, 5], [428, 720, 5, 14, 5, 5], [428, 771, 5, 14, 5, 5], [489, 6, 5, 14, 5, 5], [489, 61, 14, 11, 14, 9], [489, 109, 9, 13, 9, 6], [489, 163, 14, 11, 14, 9], [489, 211, 7, 14, 7, 6], [489, 267, 17, 8, 17, 11], [489, 313, 13, 18, 13, 6], [489, 366, 18, 13, 18, 8], [489, 417, 18, 12, 18, 8], [489, 468, 18, 12, 18, 8], [489, 519, 18, 13, 18, 8], [489, 571, 23, 11, 23, 9], [489, 622, 22, 11, 22, 9], [489, 671, 14, 13, 14, 7], [489, 724, 22, 11, 22, 9], [489, 769, 14, 17, 14, 3], [550, 7, 12, 13, 12, 6], [550, 60, 14, 12, 14, 8], [550, 109, 12, 13, 12, 6], [550, 163, 14, 11, 14, 9], [550, 214, 14, 11, 14, 9], [550, 267, 17, 8, 17, 11], [550, 312, 12, 15, 12, 5], [550, 369, 12, 8, 12, 11], [550, 419, 14, 9, 14, 10], [550, 469, 14, 10, 14, 9], [550, 521, 14, 9, 14, 10], [550, 573, 14, 8, 14, 11], [550, 626, 22, 7, 22, 13], [550, 665, 14, 24, 14, 1], [550, 728, 22, 6, 22, 13], [550, 772, 16, 14, 16, 6], [611, 7, 19, 14, 19, 6], [611, 57, 17, 15, 17, 5], [611, 108, 18, 15, 18, 5], [611, 163, 22, 15, 22, 9], [611, 212, 18, 13, 18, 7], [611, 263, 18, 13, 18, 7], [611, 313, 19, 14, 19, 6], [611, 367, 18, 11, 18, 9], [611, 418, 18, 11, 18, 9], [611, 469, 17, 11, 17, 9], [611, 520, 17, 13, 17, 9], [611, 570, 17, 13, 17, 8], [611, 622, 17, 11, 17, 9], [611, 673, 17, 13, 17, 9], [611, 724, 17, 11, 17, 9], [611, 773, 17, 15, 17, 7], [672, 7, 18, 14, 18, 6], [672, 58, 17, 14, 17, 6], [672, 109, 18, 14, 18, 6], [672, 160, 18, 14, 18, 6], [672, 211, 20, 13, 20, 6], [672, 260, 19, 17, 19, 4], [672, 311, 14, 16, 14, 4], [672, 370, 14, 7, 14, 12], [672, 422, 17, 6, 17, 13], [1, 14, 9, 6, 9, 13], [794, 779, 3, 6, 3, 13], [672, 571, 23, 11, 23, 9], [672, 622, 22, 11, 22, 9], [672, 665, 15, 19, 15, 1], [672, 724, 22, 11, 22, 9], [672, 767, 15, 19, 15, 1], [733, 7, 13, 14, 13, 6], [733, 57, 10, 19, 10, 5], [733, 109, 18, 14, 18, 6], [733, 160, 18, 14, 18, 6], [733, 211, 18, 13, 18, 6], [733, 261, 17, 16, 17, 5], [733, 310, 11, 23, 11, 3], [733, 358, 11, 26, 11, 0], [733, 409, 11, 25, 11, 0], [733, 461, 11, 25, 11, 1], [733, 511, 11, 26, 11, 0], [733, 562, 11, 23, 11, 0], [733, 614, 13, 25, 13, 1], [733, 664, 13, 26, 13, 0], [733, 715, 13, 22, 13, 0], [733, 766, 13, 26, 13, 0], [1, 14, 9, 6, 9, 13], [794, 57, 10, 19, 10, 5], [794, 104, 9, 21, 9, 1], [794, 155, 16, 25, 16, 1], [794, 205, 16, 26, 16, 0], [794, 256, 16, 21, 16, 0], [794, 310, 11, 23, 11, 3], [794, 358, 11, 26, 11, 0], [794, 409, 11, 25, 11, 0], [794, 461, 11, 25, 11, 1], [794, 511, 11, 26, 11, 0], [794, 562, 11, 23, 11, 0], [794, 614, 13, 25, 13, 1], [794, 664, 13, 26, 13, 0], [794, 715, 13, 22, 13, 0], [794, 779, 3, 6, 3, 13], [855, 14, 3, 6, 3, 13], [855, 65, 3, 6, 3, 13], [855, 116, 3, 6, 3, 13], [855, 167, 3, 6, 3, 13], [855, 218, 3, 6, 3, 13], [855, 269, 3, 6, 3, 13], [855, 320, 3, 6, 3, 13], [855, 371, 3, 6, 3, 13], [855, 422, 3, 6, 3, 13], [855, 473, 3, 6, 3, 13], [855, 524, 3, 6, 3, 13], [855, 575, 3, 6, 3, 13], [855, 626, 3, 6, 3, 13], [855, 677, 3, 6, 3, 13], [855, 728, 3, 6, 3, 13], [855, 779, 3, 6, 3, 13]], \"widestlogicalchar\": 23, \"widestglyph\": 23, \"tallestglyph\": 26}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_18_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 13, 8, 6, 8, 12], [1, 58, 9, 12, 9, 6], [1, 109, 16, 12, 16, 6], [1, 160, 12, 12, 12, 6], [1, 211, 13, 12, 13, 6], [1, 262, 18, 12, 18, 6], [1, 313, 17, 12, 17, 6], [1, 367, 11, 9, 11, 9], [1, 415, 9, 16, 9, 6], [1, 466, 9, 16, 9, 6], [1, 519, 12, 10, 12, 8], [1, 571, 13, 9, 13, 9], [1, 625, 9, 9, 9, 12], [1, 676, 13, 6, 13, 12], [1, 727, 9, 6, 9, 12], [1, 772, 8, 12, 8, 6], [62, 7, 12, 12, 12, 6], [62, 58, 12, 12, 12, 6], [62, 109, 12, 12, 12, 6], [62, 160, 12, 12, 12, 6], [62, 211, 12, 12, 12, 6], [62, 262, 12, 12, 12, 6], [62, 313, 12, 12, 12, 6], [62, 364, 12, 12, 12, 6], [62, 415, 12, 12, 12, 6], [62, 466, 12, 12, 12, 6], [62, 521, 8, 8, 8, 10], [62, 572, 8, 11, 8, 10], [62, 623, 13, 8, 13, 10], [62, 675, 13, 7, 13, 11], [62, 725, 13, 8, 13, 10], [62, 772, 11, 12, 11, 6], [123, 11, 13, 8, 13, 10], [123, 58, 16, 12, 16, 6], [123, 109, 15, 12, 15, 6], [123, 160, 16, 12, 16, 6], [123, 211, 14, 12, 14, 6], [123, 262, 15, 12, 15, 6], [123, 313, 17, 12, 17, 6], [123, 364, 14, 12, 14, 6], [123, 415, 17, 12, 17, 6], [123, 466, 9, 12, 9, 6], [123, 516, 14, 13, 14, 5], [123, 568, 16, 12, 16, 6], [123, 619, 16, 12, 16, 6], [123, 670, 20, 12, 20, 6], [123, 721, 17, 12, 17, 6], [123, 772, 17, 12, 17, 6], [184, 7, 17, 12, 17, 6], [184, 58, 17, 12, 17, 6], [184, 109, 13, 12, 13, 6], [184, 160, 14, 12, 14, 6], [184, 211, 14, 12, 14, 6], [184, 262, 16, 12, 16, 6], [184, 316, 11, 13, 11, 9], [184, 364, 17, 12, 17, 6], [184, 415, 15, 12, 15, 6], [184, 466, 18, 12, 18, 6], [184, 517, 15, 12, 15, 6], [184, 568, 9, 16, 9, 6], [184, 623, 19, 8, 19, 10], [184, 670, 9, 16, 9, 6], [184, 721, 15, 12, 15, 6], [184, 778, 12, 10, 12, 12], [245, 5, 13, 14, 13, 4], [245, 61, 15, 9, 15, 9], [245, 107, 13, 18, 13, 4], [245, 163, 13, 12, 13, 9], [245, 210, 12, 13, 12, 5], [245, 265, 11, 9, 11, 9], [245, 314, 13, 14, 13, 7], [245, 368, 11, 12, 11, 10], [245, 418, 14, 13, 14, 9], [245, 469, 9, 9, 9, 9], [245, 520, 14, 13, 14, 9], [245, 571, 13, 9, 13, 9], [245, 618, 13, 13, 13, 5], [245, 673, 14, 13, 14, 9], [245, 724, 13, 9, 13, 9], [245, 775, 14, 9, 14, 9], [306, 10, 13, 9, 13, 9], [306, 57, 13, 13, 13, 5], [306, 112, 13, 13, 13, 9], [306, 163, 14, 9, 14, 9], [306, 214, 11, 9, 11, 9], [306, 265, 14, 9, 14, 9], [306, 315, 16, 10, 16, 8], [306, 367, 15, 9, 15, 9], [306, 413, 12, 18, 12, 4], [306, 469, 15, 13, 15, 9], [306, 515, 12, 18, 12, 4], [306, 568, 12, 16, 12, 6], [306, 619, 7, 16, 7, 6], [306, 670, 12, 16, 12, 6], [306, 727, 13, 6, 13, 12], [306, 771, 4, 13, 4, 5], [367, 6, 4, 13, 4, 5], [367, 57, 4, 13, 4, 5], [367, 108, 4, 13, 4, 5], [367, 159, 4, 13, 4, 5], [367, 210, 4, 13, 4, 5], [367, 261, 4, 13, 4, 5], [367, 312, 4, 13, 4, 5], [367, 363, 4, 13, 4, 5], [367, 414, 4, 13, 4, 5], [367, 465, 4, 13, 4, 5], [367, 516, 4, 13, 4, 5], [367, 567, 4, 13, 4, 5], [367, 618, 4, 13, 4, 5], [367, 669, 4, 13, 4, 5], [367, 720, 4, 13, 4, 5], [367, 771, 4, 13, 4, 5], [428, 6, 4, 13, 4, 5], [428, 57, 4, 13, 4, 5], [428, 108, 4, 13, 4, 5], [428, 159, 4, 13, 4, 5], [428, 210, 4, 13, 4, 5], [428, 261, 4, 13, 4, 5], [428, 312, 4, 13, 4, 5], [428, 363, 4, 13, 4, 5], [428, 414, 4, 13, 4, 5], [428, 465, 4, 13, 4, 5], [428, 516, 4, 13, 4, 5], [428, 567, 4, 13, 4, 5], [428, 618, 4, 13, 4, 5], [428, 669, 4, 13, 4, 5], [428, 720, 4, 13, 4, 5], [428, 771, 4, 13, 4, 5], [489, 6, 4, 13, 4, 5], [489, 61, 13, 9, 13, 9], [489, 109, 8, 12, 8, 6], [489, 163, 13, 9, 13, 9], [489, 211, 6, 12, 6, 6], [489, 267, 16, 7, 16, 11], [489, 313, 12, 16, 12, 6], [489, 366, 17, 11, 17, 8], [489, 417, 17, 10, 17, 8], [489, 468, 17, 10, 17, 8], [489, 519, 17, 11, 17, 8], [489, 571, 22, 9, 22, 9], [489, 622, 21, 9, 21, 9], [489, 671, 13, 11, 13, 7], [489, 724, 21, 9, 21, 9], [489, 769, 13, 15, 13, 3], [550, 7, 11, 12, 11, 6], [550, 60, 13, 10, 13, 8], [550, 109, 11, 12, 11, 6], [550, 163, 13, 9, 13, 9], [550, 214, 13, 9, 13, 9], [550, 267, 16, 7, 16, 11], [550, 312, 11, 13, 11, 5], [550, 369, 11, 7, 11, 11], [550, 419, 13, 8, 13, 10], [550, 469, 13, 9, 13, 9], [550, 521, 13, 8, 13, 10], [550, 573, 13, 7, 13, 11], [550, 625, 21, 6, 21, 12], [550, 665, 13, 22, 13, 1], [550, 727, 21, 6, 21, 12], [550, 772, 15, 12, 15, 6], [611, 7, 18, 12, 18, 6], [611, 57, 16, 13, 16, 5], [611, 108, 17, 13, 17, 5], [611, 163, 21, 13, 21, 9], [611, 212, 17, 11, 17, 7], [611, 263, 17, 11, 17, 7], [611, 313, 18, 12, 18, 6], [611, 367, 17, 9, 17, 9], [611, 418, 17, 9, 17, 9], [611, 469, 16, 9, 16, 9], [611, 520, 16, 11, 16, 9], [611, 570, 16, 11, 16, 8], [611, 622, 16, 9, 16, 9], [611, 673, 16, 11, 16, 9], [611, 724, 16, 9, 16, 9], [611, 773, 16, 13, 16, 7], [672, 7, 17, 12, 17, 6], [672, 58, 16, 12, 16, 6], [672, 109, 17, 12, 17, 6], [672, 160, 17, 12, 17, 6], [672, 211, 19, 12, 19, 6], [672, 260, 18, 15, 18, 4], [672, 311, 13, 14, 13, 4], [672, 370, 13, 6, 13, 12], [672, 421, 16, 6, 16, 12], [1, 13, 8, 6, 8, 12], [794, 778, 3, 6, 3, 12], [672, 571, 22, 9, 22, 9], [672, 622, 21, 9, 21, 9], [672, 665, 14, 17, 14, 1], [672, 724, 21, 9, 21, 9], [672, 767, 14, 17, 14, 1], [733, 7, 12, 12, 12, 6], [733, 57, 9, 17, 9, 5], [733, 109, 17, 12, 17, 6], [733, 160, 17, 12, 17, 6], [733, 211, 17, 12, 17, 6], [733, 261, 16, 14, 16, 5], [733, 310, 10, 21, 10, 3], [733, 358, 10, 24, 10, 0], [733, 409, 10, 23, 10, 0], [733, 461, 10, 23, 10, 1], [733, 511, 10, 24, 10, 0], [733, 562, 10, 21, 10, 0], [733, 614, 12, 23, 12, 1], [733, 664, 12, 24, 12, 0], [733, 715, 12, 20, 12, 0], [733, 766, 12, 24, 12, 0], [1, 13, 8, 6, 8, 12], [794, 57, 9, 17, 9, 5], [794, 104, 8, 19, 8, 1], [794, 155, 15, 23, 15, 1], [794, 205, 15, 24, 15, 0], [794, 256, 15, 19, 15, 0], [794, 310, 10, 21, 10, 3], [794, 358, 10, 24, 10, 0], [794, 409, 10, 23, 10, 0], [794, 461, 10, 23, 10, 1], [794, 511, 10, 24, 10, 0], [794, 562, 10, 21, 10, 0], [794, 614, 12, 23, 12, 1], [794, 664, 12, 24, 12, 0], [794, 715, 12, 20, 12, 0], [794, 778, 3, 6, 3, 12], [855, 13, 3, 6, 3, 12], [855, 64, 3, 6, 3, 12], [855, 115, 3, 6, 3, 12], [855, 166, 3, 6, 3, 12], [855, 217, 3, 6, 3, 12], [855, 268, 3, 6, 3, 12], [855, 319, 3, 6, 3, 12], [855, 370, 3, 6, 3, 12], [855, 421, 3, 6, 3, 12], [855, 472, 3, 6, 3, 12], [855, 523, 3, 6, 3, 12], [855, 574, 3, 6, 3, 12], [855, 625, 3, 6, 3, 12], [855, 676, 3, 6, 3, 12], [855, 727, 3, 6, 3, 12], [855, 778, 3, 6, 3, 12]], \"widestlogicalchar\": 22, \"widestglyph\": 22, \"tallestglyph\": 24}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_1_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 2, \"leftmost\": 3, \"capHeight\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 8, 6, 6, 6, 7], [1, 57, 7, 8, 7, 5], [1, 108, 12, 8, 12, 5], [1, 159, 9, 8, 9, 5], [1, 210, 10, 8, 10, 5], [1, 261, 13, 8, 13, 5], [1, 312, 12, 8, 12, 5], [1, 364, 8, 7, 8, 6], [1, 414, 7, 11, 7, 5], [1, 465, 7, 11, 7, 5], [1, 517, 9, 7, 9, 6], [1, 567, 10, 8, 10, 5], [1, 620, 7, 8, 7, 7], [1, 671, 10, 6, 10, 7], [1, 722, 7, 6, 7, 7], [1, 771, 6, 8, 6, 5], [62, 6, 9, 8, 9, 5], [62, 57, 9, 8, 9, 5], [62, 108, 9, 8, 9, 5], [62, 159, 9, 8, 9, 5], [62, 210, 9, 8, 9, 5], [62, 261, 9, 8, 9, 5], [62, 312, 9, 8, 9, 5], [62, 363, 9, 8, 9, 5], [62, 414, 9, 8, 9, 5], [62, 465, 9, 8, 9, 5], [62, 518, 6, 6, 6, 7], [62, 569, 6, 7, 6, 7], [62, 620, 10, 6, 10, 7], [62, 671, 10, 6, 10, 7], [62, 722, 10, 6, 10, 7], [62, 771, 9, 8, 9, 5], [123, 6, 10, 8, 10, 5], [123, 57, 12, 8, 12, 5], [123, 108, 11, 8, 11, 5], [123, 159, 12, 8, 12, 5], [123, 210, 11, 8, 11, 5], [123, 261, 11, 8, 11, 5], [123, 312, 12, 8, 12, 5], [123, 363, 10, 8, 10, 5], [123, 414, 12, 8, 12, 5], [123, 465, 7, 8, 7, 5], [123, 515, 11, 9, 11, 4], [123, 567, 12, 8, 12, 5], [123, 618, 11, 8, 11, 5], [123, 669, 14, 8, 14, 5], [123, 720, 12, 8, 12, 5], [123, 771, 12, 8, 12, 5], [184, 6, 12, 8, 12, 5], [184, 57, 12, 8, 12, 5], [184, 108, 10, 8, 10, 5], [184, 159, 11, 8, 11, 5], [184, 210, 11, 8, 11, 5], [184, 261, 11, 8, 11, 5], [184, 314, 8, 8, 8, 7], [184, 363, 12, 8, 12, 5], [184, 415, 11, 7, 11, 6], [184, 465, 13, 8, 13, 5], [184, 516, 11, 8, 11, 5], [184, 567, 7, 11, 7, 5], [184, 620, 13, 6, 13, 7], [184, 669, 7, 11, 7, 5], [184, 719, 11, 9, 11, 4], [184, 773, 9, 9, 9, 7], [245, 4, 8, 10, 8, 3], [245, 59, 11, 6, 11, 7], [245, 107, 10, 12, 10, 4], [245, 161, 10, 9, 10, 7], [245, 209, 9, 9, 9, 4], [245, 263, 8, 6, 8, 7], [245, 312, 9, 10, 9, 5], [245, 365, 8, 9, 8, 7], [245, 416, 10, 9, 10, 7], [245, 467, 7, 6, 7, 7], [245, 518, 10, 9, 10, 7], [245, 569, 10, 6, 10, 7], [245, 617, 10, 9, 10, 4], [245, 671, 10, 9, 10, 7], [245, 722, 9, 6, 9, 7], [245, 773, 10, 6, 10, 7], [306, 8, 10, 6, 10, 7], [306, 56, 10, 9, 10, 4], [306, 110, 10, 9, 10, 7], [306, 161, 10, 6, 10, 7], [306, 212, 8, 6, 8, 7], [306, 263, 10, 6, 10, 7], [306, 313, 12, 7, 12, 6], [306, 365, 11, 6, 11, 7], [306, 412, 9, 13, 9, 3], [306, 467, 11, 9, 11, 7], [306, 515, 9, 12, 9, 4], [306, 567, 9, 11, 9, 5], [306, 618, 5, 11, 5, 5], [306, 669, 9, 11, 9, 5], [306, 722, 10, 6, 10, 7], [306, 768, 4, 11, 4, 2], [367, 3, 4, 11, 4, 2], [367, 54, 4, 11, 4, 2], [367, 105, 4, 11, 4, 2], [367, 156, 4, 11, 4, 2], [367, 207, 4, 11, 4, 2], [367, 258, 4, 11, 4, 2], [367, 309, 4, 11, 4, 2], [367, 360, 4, 11, 4, 2], [367, 411, 4, 11, 4, 2], [367, 462, 4, 11, 4, 2], [367, 513, 4, 11, 4, 2], [367, 564, 4, 11, 4, 2], [367, 615, 4, 11, 4, 2], [367, 666, 4, 11, 4, 2], [367, 717, 4, 11, 4, 2], [367, 768, 4, 11, 4, 2], [428, 3, 4, 11, 4, 2], [428, 54, 4, 11, 4, 2], [428, 105, 4, 11, 4, 2], [428, 156, 4, 11, 4, 2], [428, 207, 4, 11, 4, 2], [428, 258, 4, 11, 4, 2], [428, 309, 4, 11, 4, 2], [428, 360, 4, 11, 4, 2], [428, 411, 4, 11, 4, 2], [428, 462, 4, 11, 4, 2], [428, 513, 4, 11, 4, 2], [428, 564, 4, 11, 4, 2], [428, 615, 4, 11, 4, 2], [428, 666, 4, 11, 4, 2], [428, 717, 4, 11, 4, 2], [428, 768, 4, 11, 4, 2], [489, 3, 4, 11, 4, 2], [489, 57, 10, 8, 10, 5], [489, 107, 6, 9, 6, 4], [489, 160, 10, 7, 10, 6], [489, 210, 5, 8, 5, 5], [489, 263, 12, 6, 12, 7], [489, 312, 9, 11, 9, 5], [489, 364, 12, 7, 12, 6], [489, 415, 12, 7, 12, 6], [489, 466, 12, 7, 12, 6], [489, 517, 12, 7, 12, 6], [489, 567, 16, 8, 16, 5], [489, 618, 15, 8, 15, 5], [489, 666, 10, 11, 10, 2], [489, 720, 15, 8, 15, 5], [489, 768, 10, 11, 10, 2], [550, 4, 8, 10, 8, 3], [550, 57, 10, 8, 10, 5], [550, 107, 8, 9, 8, 4], [550, 160, 10, 7, 10, 6], [550, 211, 10, 7, 10, 6], [550, 262, 12, 7, 12, 6], [550, 312, 9, 8, 9, 5], [550, 365, 9, 6, 9, 7], [550, 415, 10, 7, 10, 6], [550, 466, 10, 7, 10, 6], [550, 517, 10, 7, 10, 6], [550, 568, 10, 7, 10, 6], [550, 620, 15, 6, 15, 7], [550, 665, 10, 15, 10, 1], [550, 722, 15, 6, 15, 7], [550, 771, 11, 8, 11, 5], [611, 6, 13, 8, 13, 5], [611, 56, 11, 9, 11, 4], [611, 107, 13, 9, 13, 4], [611, 160, 15, 9, 15, 6], [611, 209, 13, 9, 13, 4], [611, 260, 13, 9, 13, 4], [611, 311, 13, 9, 13, 4], [611, 365, 12, 6, 12, 7], [611, 416, 12, 6, 12, 7], [611, 467, 12, 6, 12, 7], [611, 518, 12, 8, 12, 7], [611, 568, 12, 8, 12, 6], [611, 620, 12, 6, 12, 7], [611, 671, 12, 8, 12, 7], [611, 722, 12, 6, 12, 7], [611, 772, 12, 7, 12, 6], [672, 6, 12, 8, 12, 5], [672, 57, 12, 8, 12, 5], [672, 108, 12, 8, 12, 5], [672, 159, 12, 8, 12, 5], [672, 210, 14, 8, 14, 5], [672, 260, 13, 10, 13, 4], [672, 310, 10, 10, 10, 3], [672, 365, 10, 6, 10, 7], [672, 416, 12, 6, 12, 7], [1, 8, 6, 6, 6, 7], [794, 773, 3, 6, 3, 7], [672, 569, 16, 6, 16, 7], [672, 620, 15, 6, 15, 7], [672, 666, 10, 11, 10, 2], [672, 722, 15, 6, 15, 7], [672, 768, 10, 11, 10, 2], [733, 5, 9, 9, 9, 4], [733, 56, 7, 11, 7, 4], [733, 108, 12, 8, 12, 5], [733, 159, 12, 8, 12, 5], [733, 210, 12, 8, 12, 5], [733, 261, 12, 9, 12, 5], [733, 310, 8, 14, 8, 3], [733, 358, 8, 17, 8, 0], [733, 409, 8, 17, 8, 0], [733, 462, 8, 15, 8, 2], [733, 511, 8, 17, 8, 0], [733, 562, 8, 15, 8, 0], [733, 615, 9, 15, 9, 2], [733, 664, 9, 17, 9, 0], [733, 715, 9, 15, 9, 0], [733, 766, 9, 17, 9, 0], [1, 8, 6, 6, 6, 7], [794, 56, 7, 11, 7, 4], [794, 104, 7, 14, 7, 1], [794, 156, 11, 15, 11, 2], [794, 205, 11, 17, 11, 0], [794, 256, 11, 15, 11, 0], [794, 308, 8, 16, 8, 1], [794, 358, 8, 17, 8, 0], [794, 409, 8, 17, 8, 0], [794, 462, 8, 15, 8, 2], [794, 511, 8, 17, 8, 0], [794, 562, 8, 15, 8, 0], [794, 615, 9, 15, 9, 2], [794, 664, 9, 17, 9, 0], [794, 715, 9, 15, 9, 0], [794, 773, 3, 6, 3, 7], [855, 8, 3, 6, 3, 7], [855, 59, 3, 6, 3, 7], [855, 110, 3, 6, 3, 7], [855, 161, 3, 6, 3, 7], [855, 212, 3, 6, 3, 7], [855, 263, 3, 6, 3, 7], [855, 314, 3, 6, 3, 7], [855, 365, 3, 6, 3, 7], [855, 416, 3, 6, 3, 7], [855, 467, 3, 6, 3, 7], [855, 518, 3, 6, 3, 7], [855, 569, 3, 6, 3, 7], [855, 620, 3, 6, 3, 7], [855, 671, 3, 6, 3, 7], [855, 722, 3, 6, 3, 7], [855, 773, 3, 6, 3, 7]], \"widestlogicalchar\": 16, \"widestglyph\": 16, \"tallestglyph\": 17}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 33, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 59, 22, 18, 13, 7], [1, 110, 32, 18, 22, 7], [1, 161, 25, 18, 17, 7], [1, 212, 28, 18, 18, 7], [1, 262, 34, 19, 25, 6], [1, 314, 31, 18, 24, 7], [1, 368, 23, 15, 16, 10], [1, 416, 23, 23, 13, 7], [1, 467, 20, 23, 13, 7], [1, 521, 23, 12, 17, 10], [1, 573, 24, 13, 18, 11], [1, 634, 14, 7, 13, 21], [1, 680, 24, 3, 18, 16], [1, 736, 14, 4, 13, 21], [1, 773, 22, 18, 12, 7], [62, 8, 25, 18, 17, 7], [62, 59, 23, 18, 17, 7], [62, 110, 24, 18, 17, 7], [62, 161, 24, 18, 17, 7], [62, 212, 25, 18, 17, 7], [62, 263, 27, 18, 17, 7], [62, 314, 26, 18, 17, 7], [62, 365, 27, 18, 17, 7], [62, 416, 25, 18, 17, 7], [62, 467, 26, 18, 17, 7], [62, 521, 19, 15, 12, 10], [62, 572, 19, 18, 12, 10], [62, 624, 26, 13, 18, 11], [62, 678, 25, 7, 18, 14], [62, 726, 24, 13, 18, 11], [62, 773, 24, 18, 16, 7], [123, 11, 26, 15, 18, 10], [123, 59, 26, 18, 22, 7], [123, 110, 28, 18, 21, 7], [123, 161, 31, 18, 22, 7], [123, 212, 24, 18, 20, 7], [123, 263, 30, 18, 21, 7], [123, 314, 30, 18, 23, 7], [123, 365, 28, 18, 19, 7], [123, 416, 33, 18, 23, 7], [123, 467, 23, 18, 13, 7], [123, 517, 28, 19, 20, 6], [123, 569, 32, 18, 22, 7], [123, 620, 25, 18, 21, 7], [123, 671, 37, 18, 27, 7], [123, 722, 33, 18, 23, 7], [123, 773, 30, 18, 23, 7], [184, 8, 33, 18, 24, 7], [184, 59, 30, 18, 23, 7], [184, 110, 28, 18, 19, 7], [184, 161, 29, 18, 20, 7], [184, 212, 30, 18, 20, 7], [184, 263, 32, 18, 22, 7], [184, 318, 24, 19, 16, 11], [184, 365, 30, 18, 24, 7], [184, 416, 31, 18, 21, 7], [184, 467, 33, 18, 24, 7], [184, 518, 31, 18, 21, 7], [184, 569, 22, 23, 13, 7], [184, 626, 25, 12, 26, 13], [184, 671, 22, 23, 13, 7], [184, 722, 24, 18, 21, 7], [184, 793, 18, 3, 17, 27], [245, 6, 28, 3, 17, 5], [245, 62, 28, 15, 20, 10], [245, 108, 26, 25, 18, 5], [245, 164, 26, 20, 18, 10], [245, 210, 27, 20, 17, 5], [245, 266, 24, 15, 16, 10], [245, 313, 25, 24, 18, 6], [245, 368, 25, 20, 15, 10], [245, 419, 26, 20, 20, 10], [245, 470, 19, 15, 13, 10], [245, 521, 27, 21, 19, 10], [245, 572, 26, 15, 18, 10], [245, 618, 23, 20, 18, 5], [245, 674, 24, 21, 19, 10], [245, 725, 26, 15, 18, 10], [245, 776, 25, 15, 18, 10], [306, 11, 27, 15, 18, 10], [306, 58, 26, 19, 18, 6], [306, 113, 25, 20, 18, 10], [306, 164, 28, 15, 20, 10], [306, 215, 24, 15, 15, 10], [306, 266, 25, 15, 19, 10], [306, 316, 31, 16, 22, 9], [306, 368, 29, 15, 22, 10], [306, 413, 24, 26, 17, 4], [306, 470, 30, 20, 22, 10], [306, 516, 25, 25, 17, 5], [306, 569, 24, 23, 17, 7], [306, 620, 19, 23, 10, 7], [306, 671, 22, 23, 17, 7], [306, 730, 24, 5, 18, 15], [306, 773, 17, 17, 6, 7], [367, 8, 17, 17, 6, 7], [367, 59, 17, 17, 6, 7], [367, 110, 17, 17, 6, 7], [367, 161, 17, 17, 6, 7], [367, 212, 17, 17, 6, 7], [367, 263, 17, 17, 6, 7], [367, 314, 17, 17, 6, 7], [367, 365, 17, 17, 6, 7], [367, 416, 17, 17, 6, 7], [367, 467, 17, 17, 6, 7], [367, 518, 17, 17, 6, 7], [367, 569, 17, 17, 6, 7], [367, 620, 17, 17, 6, 7], [367, 671, 17, 17, 6, 7], [367, 722, 17, 17, 6, 7], [367, 773, 17, 17, 6, 7], [428, 8, 17, 17, 6, 7], [428, 59, 17, 17, 6, 7], [428, 110, 17, 17, 6, 7], [428, 161, 17, 17, 6, 7], [428, 212, 17, 17, 6, 7], [428, 263, 17, 17, 6, 7], [428, 314, 17, 17, 6, 7], [428, 365, 17, 17, 6, 7], [428, 416, 17, 17, 6, 7], [428, 467, 17, 17, 6, 7], [428, 518, 17, 17, 6, 7], [428, 569, 17, 17, 6, 7], [428, 620, 17, 17, 6, 7], [428, 671, 17, 17, 6, 7], [428, 722, 17, 17, 6, 7], [428, 773, 17, 17, 6, 7], [489, 8, 17, 17, 6, 7], [489, 58, 29, 19, 20, 6], [489, 109, 21, 6, 11, 6], [489, 166, 26, 13, 18, 12], [489, 212, 20, 18, 10, 7], [489, 269, 29, 9, 23, 13], [489, 314, 27, 23, 17, 7], [489, 368, 28, 15, 23, 10], [489, 419, 26, 15, 23, 10], [489, 470, 29, 15, 23, 10], [489, 521, 27, 15, 23, 10], [489, 574, 36, 11, 31, 12], [489, 625, 36, 11, 29, 12], [489, 670, 25, 23, 19, 6], [489, 727, 31, 11, 29, 12], [489, 771, 23, 20, 19, 5], [550, 7, 24, 9, 15, 6], [550, 60, 26, 17, 19, 8], [550, 109, 24, 6, 15, 6], [550, 166, 23, 13, 18, 12], [550, 215, 28, 15, 18, 10], [550, 270, 29, 9, 22, 14], [550, 314, 24, 18, 17, 7], [550, 368, 24, 12, 17, 10], [550, 421, 24, 11, 18, 12], [550, 472, 25, 11, 19, 12], [550, 524, 25, 9, 18, 13], [550, 575, 25, 9, 18, 13], [550, 634, 29, 4, 29, 21], [550, 667, 24, 28, 19, 3], [550, 731, 36, 3, 29, 16], [550, 774, 30, 17, 21, 8], [611, 9, 31, 17, 25, 8], [611, 57, 31, 21, 22, 5], [611, 108, 33, 20, 25, 5], [611, 164, 34, 20, 29, 10], [611, 212, 31, 18, 24, 7], [611, 263, 31, 18, 24, 7], [611, 313, 35, 19, 25, 6], [611, 368, 29, 15, 23, 10], [611, 419, 32, 15, 23, 10], [611, 470, 29, 15, 22, 10], [611, 511, 1, 1, 22, 1], [611, 571, 31, 17, 22, 9], [611, 623, 31, 15, 22, 10], [611, 674, 31, 18, 22, 10], [611, 725, 29, 15, 22, 10], [611, 775, 29, 17, 22, 9], [672, 8, 33, 18, 23, 7], [672, 59, 32, 18, 22, 7], [672, 110, 31, 18, 24, 7], [672, 161, 31, 18, 24, 7], [672, 212, 36, 11, 27, 7], [672, 261, 35, 23, 25, 5], [672, 312, 29, 20, 18, 5], [672, 373, 19, 4, 18, 15], [672, 425, 29, 9, 23, 16], [1, 1, 1, 1, 11, 1], [794, 766, 1, 1, 3, 1], [672, 572, 36, 15, 31, 10], [672, 623, 36, 15, 29, 10], [672, 665, 30, 24, 20, 1], [672, 725, 35, 15, 29, 10], [672, 767, 30, 24, 20, 1], [733, 8, 23, 18, 17, 7], [733, 59, 23, 25, 13, 7], [733, 110, 31, 18, 24, 7], [733, 161, 31, 18, 23, 7], [733, 212, 33, 11, 24, 7], [733, 262, 33, 22, 22, 6], [733, 308, 25, 32, 14, 1], [733, 358, 23, 33, 14, 0], [733, 409, 23, 32, 14, 0], [733, 461, 25, 32, 14, 1], [733, 511, 21, 33, 14, 0], [733, 562, 21, 27, 14, 0], [733, 614, 28, 32, 17, 1], [733, 664, 26, 33, 17, 0], [733, 715, 26, 27, 17, 0], [733, 766, 26, 33, 17, 0], [1, 1, 1, 1, 11, 1], [794, 59, 18, 25, 13, 7], [794, 104, 23, 26, 12, 1], [794, 155, 32, 32, 21, 1], [794, 205, 29, 33, 21, 0], [794, 256, 29, 26, 21, 0], [794, 308, 22, 32, 14, 1], [794, 358, 25, 33, 14, 0], [794, 409, 25, 32, 14, 0], [794, 461, 25, 32, 14, 1], [794, 511, 25, 33, 14, 0], [794, 562, 25, 27, 14, 0], [794, 614, 24, 32, 17, 1], [794, 664, 26, 33, 17, 0], [794, 715, 26, 27, 17, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 24, \"widestlogicalchar\": 31, \"widestglyph\": 37, \"tallestglyph\": 33}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 59, 21, 16, 11, 7], [1, 110, 31, 16, 20, 7], [1, 161, 24, 16, 15, 7], [1, 212, 27, 16, 16, 7], [1, 262, 33, 17, 23, 6], [1, 314, 30, 16, 22, 7], [1, 368, 22, 13, 14, 10], [1, 416, 22, 21, 11, 7], [1, 467, 19, 21, 11, 7], [1, 521, 22, 10, 15, 10], [1, 573, 23, 11, 16, 11], [1, 634, 13, 5, 11, 21], [1, 680, 23, 1, 16, 16], [1, 736, 13, 2, 11, 21], [1, 773, 21, 16, 10, 7], [62, 8, 24, 16, 15, 7], [62, 59, 22, 16, 15, 7], [62, 110, 23, 16, 15, 7], [62, 161, 23, 16, 15, 7], [62, 212, 24, 16, 15, 7], [62, 263, 26, 16, 15, 7], [62, 314, 25, 16, 15, 7], [62, 365, 26, 16, 15, 7], [62, 416, 24, 16, 15, 7], [62, 467, 25, 16, 15, 7], [62, 521, 18, 13, 10, 10], [62, 572, 18, 16, 10, 10], [62, 624, 25, 11, 16, 11], [62, 678, 24, 5, 16, 14], [62, 726, 23, 11, 16, 11], [62, 773, 23, 16, 14, 7], [123, 11, 25, 13, 16, 10], [123, 59, 25, 16, 20, 7], [123, 110, 27, 16, 19, 7], [123, 161, 30, 16, 20, 7], [123, 212, 23, 16, 18, 7], [123, 263, 29, 16, 19, 7], [123, 314, 29, 16, 21, 7], [123, 365, 27, 16, 17, 7], [123, 416, 32, 16, 21, 7], [123, 467, 22, 16, 11, 7], [123, 517, 27, 17, 18, 6], [123, 569, 31, 16, 20, 7], [123, 620, 24, 16, 19, 7], [123, 671, 36, 16, 25, 7], [123, 722, 32, 16, 21, 7], [123, 773, 29, 16, 21, 7], [184, 8, 32, 16, 22, 7], [184, 59, 29, 16, 21, 7], [184, 110, 27, 16, 17, 7], [184, 161, 28, 16, 18, 7], [184, 212, 29, 16, 18, 7], [184, 263, 31, 16, 20, 7], [184, 318, 23, 17, 14, 11], [184, 365, 29, 16, 22, 7], [184, 416, 30, 16, 19, 7], [184, 467, 32, 16, 22, 7], [184, 518, 30, 16, 19, 7], [184, 569, 21, 21, 11, 7], [184, 626, 24, 10, 24, 13], [184, 671, 21, 21, 11, 7], [184, 722, 23, 16, 19, 7], [184, 793, 17, 1, 15, 27], [245, 6, 27, 1, 15, 5], [245, 62, 27, 13, 18, 10], [245, 108, 25, 23, 16, 5], [245, 164, 25, 18, 16, 10], [245, 210, 26, 18, 15, 5], [245, 266, 23, 13, 14, 10], [245, 313, 24, 22, 16, 6], [245, 368, 24, 18, 13, 10], [245, 419, 25, 18, 18, 10], [245, 470, 18, 13, 11, 10], [245, 521, 26, 19, 17, 10], [245, 572, 25, 13, 16, 10], [245, 618, 22, 18, 16, 5], [245, 674, 23, 19, 17, 10], [245, 725, 25, 13, 16, 10], [245, 776, 24, 13, 16, 10], [306, 11, 26, 13, 16, 10], [306, 58, 25, 17, 16, 6], [306, 113, 24, 18, 16, 10], [306, 164, 27, 13, 18, 10], [306, 215, 23, 13, 13, 10], [306, 266, 24, 13, 17, 10], [306, 316, 30, 14, 20, 9], [306, 368, 28, 13, 20, 10], [306, 413, 23, 24, 15, 4], [306, 470, 29, 18, 20, 10], [306, 516, 24, 23, 15, 5], [306, 569, 23, 21, 15, 7], [306, 620, 18, 21, 8, 7], [306, 671, 21, 21, 15, 7], [306, 730, 23, 3, 16, 15], [306, 773, 16, 15, 4, 7], [367, 8, 16, 15, 4, 7], [367, 59, 16, 15, 4, 7], [367, 110, 16, 15, 4, 7], [367, 161, 16, 15, 4, 7], [367, 212, 16, 15, 4, 7], [367, 263, 16, 15, 4, 7], [367, 314, 16, 15, 4, 7], [367, 365, 16, 15, 4, 7], [367, 416, 16, 15, 4, 7], [367, 467, 16, 15, 4, 7], [367, 518, 16, 15, 4, 7], [367, 569, 16, 15, 4, 7], [367, 620, 16, 15, 4, 7], [367, 671, 16, 15, 4, 7], [367, 722, 16, 15, 4, 7], [367, 773, 16, 15, 4, 7], [428, 8, 16, 15, 4, 7], [428, 59, 16, 15, 4, 7], [428, 110, 16, 15, 4, 7], [428, 161, 16, 15, 4, 7], [428, 212, 16, 15, 4, 7], [428, 263, 16, 15, 4, 7], [428, 314, 16, 15, 4, 7], [428, 365, 16, 15, 4, 7], [428, 416, 16, 15, 4, 7], [428, 467, 16, 15, 4, 7], [428, 518, 16, 15, 4, 7], [428, 569, 16, 15, 4, 7], [428, 620, 16, 15, 4, 7], [428, 671, 16, 15, 4, 7], [428, 722, 16, 15, 4, 7], [428, 773, 16, 15, 4, 7], [489, 8, 16, 15, 4, 7], [489, 58, 28, 17, 18, 6], [489, 109, 20, 4, 9, 6], [489, 166, 25, 11, 16, 12], [489, 212, 19, 16, 8, 7], [489, 269, 28, 7, 21, 13], [489, 314, 26, 21, 15, 7], [489, 368, 27, 13, 21, 10], [489, 419, 25, 13, 21, 10], [489, 470, 28, 13, 21, 10], [489, 521, 26, 13, 21, 10], [489, 574, 35, 9, 29, 12], [489, 625, 35, 9, 27, 12], [489, 670, 24, 21, 17, 6], [489, 727, 30, 9, 27, 12], [489, 771, 22, 18, 17, 5], [550, 7, 23, 7, 13, 6], [550, 60, 25, 15, 17, 8], [550, 109, 23, 4, 13, 6], [550, 166, 22, 11, 16, 12], [550, 215, 27, 13, 16, 10], [550, 270, 28, 7, 20, 14], [550, 314, 23, 16, 15, 7], [550, 368, 23, 10, 15, 10], [550, 421, 23, 9, 16, 12], [550, 472, 24, 9, 17, 12], [550, 524, 24, 7, 16, 13], [550, 575, 24, 7, 16, 13], [550, 634, 28, 2, 27, 21], [550, 667, 23, 26, 17, 3], [550, 731, 35, 1, 27, 16], [550, 774, 29, 15, 19, 8], [611, 9, 30, 15, 23, 8], [611, 57, 30, 19, 20, 5], [611, 108, 32, 18, 23, 5], [611, 164, 33, 18, 27, 10], [611, 212, 30, 16, 22, 7], [611, 263, 30, 16, 22, 7], [611, 313, 34, 17, 23, 6], [611, 368, 28, 13, 21, 10], [611, 419, 31, 13, 21, 10], [611, 470, 28, 13, 20, 10], [611, 511, 1, 1, 20, 1], [611, 571, 30, 15, 20, 9], [611, 623, 30, 13, 20, 10], [611, 674, 30, 16, 20, 10], [611, 725, 28, 13, 20, 10], [611, 775, 28, 15, 20, 9], [672, 8, 32, 16, 21, 7], [672, 59, 31, 16, 20, 7], [672, 110, 30, 16, 22, 7], [672, 161, 30, 16, 22, 7], [672, 212, 35, 9, 25, 7], [672, 261, 34, 21, 23, 5], [672, 312, 28, 18, 16, 5], [672, 373, 18, 2, 16, 15], [672, 425, 28, 7, 21, 16], [1, 1, 1, 1, 9, 1], [794, 766, 1, 1, 3, 1], [672, 572, 35, 13, 29, 10], [672, 623, 35, 13, 27, 10], [672, 665, 29, 22, 18, 1], [672, 725, 34, 13, 27, 10], [672, 767, 29, 22, 18, 1], [733, 8, 22, 16, 15, 7], [733, 59, 22, 23, 11, 7], [733, 110, 30, 16, 22, 7], [733, 161, 30, 16, 21, 7], [733, 212, 32, 9, 22, 7], [733, 262, 32, 20, 20, 6], [733, 310, 24, 28, 12, 3], [733, 358, 21, 31, 12, 0], [733, 409, 21, 30, 12, 0], [733, 461, 24, 30, 12, 1], [733, 511, 19, 31, 12, 0], [733, 562, 19, 25, 12, 0], [733, 614, 27, 30, 15, 1], [733, 664, 24, 31, 15, 0], [733, 715, 24, 25, 15, 0], [733, 766, 24, 31, 15, 0], [1, 1, 1, 1, 9, 1], [794, 59, 17, 23, 11, 7], [794, 104, 22, 24, 10, 1], [794, 155, 31, 30, 19, 1], [794, 205, 27, 31, 19, 0], [794, 256, 27, 24, 19, 0], [794, 308, 21, 30, 12, 1], [794, 361, 24, 28, 12, 3], [794, 412, 24, 27, 12, 3], [794, 461, 24, 30, 12, 1], [794, 514, 24, 28, 12, 3], [794, 565, 24, 22, 12, 3], [794, 614, 23, 30, 15, 1], [794, 664, 24, 31, 15, 0], [794, 715, 24, 25, 15, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 23, \"widestlogicalchar\": 29, \"widestglyph\": 36, \"tallestglyph\": 31}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 33, \"leftmost\": 2, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 11, 6, 11, 18], [1, 59, 13, 18, 13, 7], [1, 110, 22, 18, 22, 7], [1, 161, 17, 18, 17, 7], [1, 212, 18, 18, 18, 7], [1, 262, 25, 19, 25, 6], [1, 314, 24, 18, 24, 7], [1, 368, 16, 15, 16, 10], [1, 416, 13, 23, 13, 7], [1, 467, 13, 23, 13, 7], [1, 521, 17, 14, 17, 10], [1, 573, 18, 13, 18, 11], [1, 631, 13, 10, 13, 18], [1, 680, 18, 8, 18, 16], [1, 733, 13, 7, 13, 18], [1, 773, 12, 18, 12, 7], [62, 8, 17, 18, 17, 7], [62, 59, 17, 18, 17, 7], [62, 110, 17, 18, 17, 7], [62, 161, 17, 18, 17, 7], [62, 212, 17, 18, 17, 7], [62, 263, 17, 18, 17, 7], [62, 314, 17, 18, 17, 7], [62, 365, 17, 18, 17, 7], [62, 416, 17, 18, 17, 7], [62, 467, 17, 18, 17, 7], [62, 521, 12, 15, 12, 10], [62, 572, 12, 18, 12, 10], [62, 624, 18, 13, 18, 11], [62, 678, 18, 10, 18, 14], [62, 726, 18, 13, 18, 11], [62, 773, 16, 18, 16, 7], [123, 11, 18, 15, 18, 10], [123, 59, 22, 18, 22, 7], [123, 110, 21, 18, 21, 7], [123, 161, 22, 18, 22, 7], [123, 212, 20, 18, 20, 7], [123, 263, 21, 18, 21, 7], [123, 314, 23, 18, 23, 7], [123, 365, 19, 18, 19, 7], [123, 416, 23, 18, 23, 7], [123, 467, 13, 18, 13, 7], [123, 517, 20, 19, 20, 6], [123, 569, 22, 18, 22, 7], [123, 620, 21, 18, 21, 7], [123, 671, 27, 18, 27, 7], [123, 722, 23, 18, 23, 7], [123, 773, 23, 18, 23, 7], [184, 8, 24, 18, 24, 7], [184, 59, 23, 18, 23, 7], [184, 110, 19, 18, 19, 7], [184, 161, 20, 18, 20, 7], [184, 212, 20, 18, 20, 7], [184, 263, 22, 18, 22, 7], [184, 318, 16, 19, 16, 11], [184, 365, 24, 18, 24, 7], [184, 416, 21, 18, 21, 7], [184, 467, 24, 18, 24, 7], [184, 518, 21, 18, 21, 7], [184, 569, 13, 23, 13, 7], [184, 626, 26, 12, 26, 13], [184, 671, 13, 23, 13, 7], [184, 722, 21, 18, 21, 7], [184, 784, 17, 12, 17, 18], [245, 6, 17, 19, 17, 5], [245, 62, 20, 15, 20, 10], [245, 108, 18, 25, 18, 5], [245, 164, 18, 20, 18, 10], [245, 210, 17, 20, 17, 5], [245, 266, 16, 15, 16, 10], [245, 313, 18, 24, 18, 6], [245, 368, 15, 20, 15, 10], [245, 419, 20, 20, 20, 10], [245, 470, 13, 15, 13, 10], [245, 521, 19, 21, 19, 10], [245, 572, 18, 15, 18, 10], [245, 618, 18, 20, 18, 5], [245, 674, 19, 21, 19, 10], [245, 725, 18, 15, 18, 10], [245, 776, 18, 15, 18, 10], [306, 11, 18, 15, 18, 10], [306, 58, 18, 19, 18, 6], [306, 113, 18, 20, 18, 10], [306, 164, 20, 15, 20, 10], [306, 215, 15, 15, 15, 10], [306, 266, 19, 15, 19, 10], [306, 316, 22, 16, 22, 9], [306, 368, 22, 15, 22, 10], [306, 413, 17, 26, 17, 4], [306, 470, 22, 20, 22, 10], [306, 516, 17, 25, 17, 5], [306, 569, 17, 23, 17, 7], [306, 620, 10, 23, 10, 7], [306, 671, 17, 23, 17, 7], [306, 730, 18, 9, 18, 15], [306, 773, 6, 17, 6, 7], [367, 8, 6, 17, 6, 7], [367, 59, 6, 17, 6, 7], [367, 110, 6, 17, 6, 7], [367, 161, 6, 17, 6, 7], [367, 212, 6, 17, 6, 7], [367, 263, 6, 17, 6, 7], [367, 314, 6, 17, 6, 7], [367, 365, 6, 17, 6, 7], [367, 416, 6, 17, 6, 7], [367, 467, 6, 17, 6, 7], [367, 518, 6, 17, 6, 7], [367, 569, 6, 17, 6, 7], [367, 620, 6, 17, 6, 7], [367, 671, 6, 17, 6, 7], [367, 722, 6, 17, 6, 7], [367, 773, 6, 17, 6, 7], [428, 8, 6, 17, 6, 7], [428, 59, 6, 17, 6, 7], [428, 110, 6, 17, 6, 7], [428, 161, 6, 17, 6, 7], [428, 212, 6, 17, 6, 7], [428, 263, 6, 17, 6, 7], [428, 314, 6, 17, 6, 7], [428, 365, 6, 17, 6, 7], [428, 416, 6, 17, 6, 7], [428, 467, 6, 17, 6, 7], [428, 518, 6, 17, 6, 7], [428, 569, 6, 17, 6, 7], [428, 620, 6, 17, 6, 7], [428, 671, 6, 17, 6, 7], [428, 722, 6, 17, 6, 7], [428, 773, 6, 17, 6, 7], [489, 8, 6, 17, 6, 7], [489, 58, 20, 19, 20, 6], [489, 109, 11, 18, 11, 6], [489, 166, 18, 13, 18, 12], [489, 212, 10, 18, 10, 7], [489, 269, 23, 11, 23, 13], [489, 314, 17, 23, 17, 7], [489, 368, 23, 15, 23, 10], [489, 419, 23, 15, 23, 10], [489, 470, 23, 15, 23, 10], [489, 521, 23, 15, 23, 10], [489, 574, 31, 12, 31, 12], [489, 625, 29, 12, 29, 12], [489, 670, 19, 23, 19, 6], [489, 727, 29, 12, 29, 12], [489, 771, 19, 20, 19, 5], [550, 7, 15, 18, 15, 6], [550, 60, 19, 17, 19, 8], [550, 109, 15, 18, 15, 6], [550, 166, 18, 13, 18, 12], [550, 215, 18, 15, 18, 10], [550, 270, 22, 10, 22, 14], [550, 314, 17, 18, 17, 7], [550, 368, 17, 14, 17, 10], [550, 421, 18, 12, 18, 12], [550, 472, 19, 12, 19, 12], [550, 524, 18, 11, 18, 13], [550, 575, 18, 11, 18, 13], [550, 631, 29, 7, 29, 18], [550, 667, 19, 28, 19, 3], [550, 731, 29, 8, 29, 16], [550, 774, 21, 17, 21, 8], [611, 9, 25, 17, 25, 8], [611, 57, 22, 21, 22, 5], [611, 108, 25, 20, 25, 5], [611, 164, 29, 20, 29, 10], [611, 212, 24, 18, 24, 7], [611, 263, 24, 18, 24, 7], [611, 313, 25, 19, 25, 6], [611, 368, 23, 15, 23, 10], [611, 419, 23, 15, 23, 10], [611, 470, 22, 15, 22, 10], [611, 521, 22, 18, 22, 10], [611, 571, 22, 17, 22, 9], [611, 623, 22, 15, 22, 10], [611, 674, 22, 18, 22, 10], [611, 725, 22, 15, 22, 10], [611, 775, 22, 17, 22, 9], [672, 8, 23, 18, 23, 7], [672, 59, 22, 18, 22, 7], [672, 110, 24, 18, 24, 7], [672, 161, 24, 18, 24, 7], [672, 212, 27, 17, 27, 7], [672, 261, 25, 23, 25, 5], [672, 312, 18, 20, 18, 5], [672, 373, 18, 9, 18, 15], [672, 425, 23, 9, 23, 16], [1, 19, 11, 6, 11, 18], [794, 784, 3, 6, 3, 18], [672, 572, 31, 15, 31, 10], [672, 623, 29, 15, 29, 10], [672, 665, 20, 24, 20, 1], [672, 725, 29, 15, 29, 10], [672, 767, 20, 24, 20, 1], [733, 8, 17, 18, 17, 7], [733, 59, 13, 25, 13, 7], [733, 110, 24, 18, 24, 7], [733, 161, 23, 18, 23, 7], [733, 212, 24, 17, 24, 7], [733, 262, 22, 22, 22, 6], [733, 308, 14, 32, 14, 1], [733, 358, 14, 33, 14, 0], [733, 409, 14, 32, 14, 0], [733, 461, 14, 32, 14, 1], [733, 511, 14, 33, 14, 0], [733, 562, 14, 27, 14, 0], [733, 614, 17, 32, 17, 1], [733, 664, 17, 33, 17, 0], [733, 715, 17, 27, 17, 0], [733, 766, 17, 33, 17, 0], [1, 19, 11, 6, 11, 18], [794, 59, 13, 25, 13, 7], [794, 104, 12, 26, 12, 1], [794, 155, 21, 32, 21, 1], [794, 205, 21, 33, 21, 0], [794, 256, 21, 26, 21, 0], [794, 308, 14, 32, 14, 1], [794, 358, 14, 33, 14, 0], [794, 409, 14, 32, 14, 0], [794, 461, 14, 32, 14, 1], [794, 511, 14, 33, 14, 0], [794, 562, 14, 27, 14, 0], [794, 614, 17, 32, 17, 1], [794, 664, 17, 33, 17, 0], [794, 715, 17, 27, 17, 0], [794, 784, 3, 6, 3, 18], [855, 19, 3, 6, 3, 18], [855, 70, 3, 6, 3, 18], [855, 121, 3, 6, 3, 18], [855, 172, 3, 6, 3, 18], [855, 223, 3, 6, 3, 18], [855, 274, 3, 6, 3, 18], [855, 325, 3, 6, 3, 18], [855, 376, 3, 6, 3, 18], [855, 427, 3, 6, 3, 18], [855, 478, 3, 6, 3, 18], [855, 529, 3, 6, 3, 18], [855, 580, 3, 6, 3, 18], [855, 631, 3, 6, 3, 18], [855, 682, 3, 6, 3, 18], [855, 733, 3, 6, 3, 18], [855, 784, 3, 6, 3, 18]], \"widestlogicalchar\": 31, \"widestglyph\": 31, \"tallestglyph\": 33}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"capHeight\": 23, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 18, 9, 6, 9, 17], [1, 59, 11, 16, 11, 7], [1, 110, 20, 16, 20, 7], [1, 161, 15, 16, 15, 7], [1, 212, 16, 16, 16, 7], [1, 262, 23, 17, 23, 6], [1, 314, 22, 16, 22, 7], [1, 368, 14, 13, 14, 10], [1, 416, 11, 21, 11, 7], [1, 467, 11, 21, 11, 7], [1, 521, 15, 13, 15, 10], [1, 573, 16, 12, 16, 11], [1, 630, 11, 9, 11, 17], [1, 680, 16, 7, 16, 16], [1, 732, 11, 6, 11, 17], [1, 773, 10, 16, 10, 7], [62, 8, 15, 16, 15, 7], [62, 59, 15, 16, 15, 7], [62, 110, 15, 16, 15, 7], [62, 161, 15, 16, 15, 7], [62, 212, 15, 16, 15, 7], [62, 263, 15, 16, 15, 7], [62, 314, 15, 16, 15, 7], [62, 365, 15, 16, 15, 7], [62, 416, 15, 16, 15, 7], [62, 467, 15, 16, 15, 7], [62, 521, 10, 13, 10, 10], [62, 572, 10, 16, 10, 10], [62, 624, 16, 12, 16, 11], [62, 678, 16, 9, 16, 14], [62, 726, 16, 12, 16, 11], [62, 773, 14, 16, 14, 7], [123, 11, 16, 13, 16, 10], [123, 59, 20, 16, 20, 7], [123, 110, 19, 16, 19, 7], [123, 161, 20, 16, 20, 7], [123, 212, 18, 16, 18, 7], [123, 263, 19, 16, 19, 7], [123, 314, 21, 16, 21, 7], [123, 365, 17, 16, 17, 7], [123, 416, 21, 16, 21, 7], [123, 467, 11, 16, 11, 7], [123, 517, 18, 17, 18, 6], [123, 569, 20, 16, 20, 7], [123, 620, 19, 16, 19, 7], [123, 671, 25, 16, 25, 7], [123, 722, 21, 16, 21, 7], [123, 773, 21, 16, 21, 7], [184, 8, 22, 16, 22, 7], [184, 59, 21, 16, 21, 7], [184, 110, 17, 16, 17, 7], [184, 161, 18, 16, 18, 7], [184, 212, 18, 16, 18, 7], [184, 263, 20, 16, 20, 7], [184, 318, 14, 17, 14, 11], [184, 365, 22, 16, 22, 7], [184, 416, 19, 16, 19, 7], [184, 467, 22, 16, 22, 7], [184, 518, 19, 16, 19, 7], [184, 569, 11, 21, 11, 7], [184, 626, 24, 10, 24, 13], [184, 671, 11, 21, 11, 7], [184, 722, 19, 16, 19, 7], [184, 783, 15, 11, 15, 17], [245, 6, 15, 18, 15, 5], [245, 62, 18, 13, 18, 10], [245, 108, 16, 23, 16, 5], [245, 164, 16, 18, 16, 10], [245, 210, 15, 18, 15, 5], [245, 266, 14, 13, 14, 10], [245, 313, 16, 22, 16, 6], [245, 368, 13, 18, 13, 10], [245, 419, 18, 18, 18, 10], [245, 470, 11, 13, 11, 10], [245, 521, 17, 19, 17, 10], [245, 572, 16, 13, 16, 10], [245, 618, 16, 18, 16, 5], [245, 674, 17, 19, 17, 10], [245, 725, 16, 13, 16, 10], [245, 776, 16, 13, 16, 10], [306, 11, 16, 13, 16, 10], [306, 58, 16, 17, 16, 6], [306, 113, 16, 18, 16, 10], [306, 164, 18, 13, 18, 10], [306, 215, 13, 13, 13, 10], [306, 266, 17, 13, 17, 10], [306, 316, 20, 14, 20, 9], [306, 368, 20, 13, 20, 10], [306, 413, 15, 24, 15, 4], [306, 470, 20, 18, 20, 10], [306, 516, 15, 23, 15, 5], [306, 569, 15, 21, 15, 7], [306, 620, 8, 21, 8, 7], [306, 671, 15, 21, 15, 7], [306, 730, 16, 8, 16, 15], [306, 773, 4, 16, 4, 7], [367, 8, 4, 16, 4, 7], [367, 59, 4, 16, 4, 7], [367, 110, 4, 16, 4, 7], [367, 161, 4, 16, 4, 7], [367, 212, 4, 16, 4, 7], [367, 263, 4, 16, 4, 7], [367, 314, 4, 16, 4, 7], [367, 365, 4, 16, 4, 7], [367, 416, 4, 16, 4, 7], [367, 467, 4, 16, 4, 7], [367, 518, 4, 16, 4, 7], [367, 569, 4, 16, 4, 7], [367, 620, 4, 16, 4, 7], [367, 671, 4, 16, 4, 7], [367, 722, 4, 16, 4, 7], [367, 773, 4, 16, 4, 7], [428, 8, 4, 16, 4, 7], [428, 59, 4, 16, 4, 7], [428, 110, 4, 16, 4, 7], [428, 161, 4, 16, 4, 7], [428, 212, 4, 16, 4, 7], [428, 263, 4, 16, 4, 7], [428, 314, 4, 16, 4, 7], [428, 365, 4, 16, 4, 7], [428, 416, 4, 16, 4, 7], [428, 467, 4, 16, 4, 7], [428, 518, 4, 16, 4, 7], [428, 569, 4, 16, 4, 7], [428, 620, 4, 16, 4, 7], [428, 671, 4, 16, 4, 7], [428, 722, 4, 16, 4, 7], [428, 773, 4, 16, 4, 7], [489, 8, 4, 16, 4, 7], [489, 58, 18, 17, 18, 6], [489, 109, 9, 17, 9, 6], [489, 166, 16, 11, 16, 12], [489, 212, 8, 16, 8, 7], [489, 269, 21, 10, 21, 13], [489, 314, 15, 21, 15, 7], [489, 368, 21, 13, 21, 10], [489, 419, 21, 13, 21, 10], [489, 470, 21, 13, 21, 10], [489, 521, 21, 13, 21, 10], [489, 574, 29, 11, 29, 12], [489, 625, 27, 11, 27, 12], [489, 670, 17, 21, 17, 6], [489, 727, 27, 11, 27, 12], [489, 771, 17, 18, 17, 5], [550, 7, 13, 17, 13, 6], [550, 60, 17, 15, 17, 8], [550, 109, 13, 17, 13, 6], [550, 166, 16, 11, 16, 12], [550, 215, 16, 13, 16, 10], [550, 270, 20, 9, 20, 14], [550, 314, 15, 16, 15, 7], [550, 368, 15, 13, 15, 10], [550, 421, 16, 11, 16, 12], [550, 472, 17, 11, 17, 12], [550, 524, 16, 10, 16, 13], [550, 575, 16, 10, 16, 13], [550, 630, 27, 6, 27, 17], [550, 667, 17, 26, 17, 3], [550, 731, 27, 7, 27, 16], [550, 774, 19, 15, 19, 8], [611, 9, 23, 15, 23, 8], [611, 57, 20, 19, 20, 5], [611, 108, 23, 18, 23, 5], [611, 164, 27, 18, 27, 10], [611, 212, 22, 16, 22, 7], [611, 263, 22, 16, 22, 7], [611, 313, 23, 17, 23, 6], [611, 368, 21, 13, 21, 10], [611, 419, 21, 13, 21, 10], [611, 470, 20, 13, 20, 10], [611, 521, 20, 16, 20, 10], [611, 571, 20, 15, 20, 9], [611, 623, 20, 13, 20, 10], [611, 674, 20, 16, 20, 10], [611, 725, 20, 13, 20, 10], [611, 775, 20, 15, 20, 9], [672, 8, 21, 16, 21, 7], [672, 59, 20, 16, 20, 7], [672, 110, 22, 16, 22, 7], [672, 161, 22, 16, 22, 7], [672, 212, 25, 16, 25, 7], [672, 261, 23, 21, 23, 5], [672, 312, 16, 18, 16, 5], [672, 373, 16, 8, 16, 15], [672, 425, 21, 7, 21, 16], [1, 18, 9, 6, 9, 17], [794, 783, 3, 6, 3, 17], [672, 572, 29, 13, 29, 10], [672, 623, 27, 13, 27, 10], [672, 665, 18, 22, 18, 1], [672, 725, 27, 13, 27, 10], [672, 767, 18, 22, 18, 1], [733, 8, 15, 16, 15, 7], [733, 59, 11, 23, 11, 7], [733, 110, 22, 16, 22, 7], [733, 161, 21, 16, 21, 7], [733, 212, 22, 16, 22, 7], [733, 262, 20, 20, 20, 6], [733, 308, 12, 30, 12, 1], [733, 358, 12, 31, 12, 0], [733, 409, 12, 30, 12, 0], [733, 461, 12, 30, 12, 1], [733, 511, 12, 31, 12, 0], [733, 562, 12, 25, 12, 0], [733, 614, 15, 30, 15, 1], [733, 664, 15, 31, 15, 0], [733, 715, 15, 25, 15, 0], [733, 766, 15, 31, 15, 0], [1, 18, 9, 6, 9, 17], [794, 59, 11, 23, 11, 7], [794, 104, 10, 24, 10, 1], [794, 155, 19, 30, 19, 1], [794, 205, 19, 31, 19, 0], [794, 256, 19, 24, 19, 0], [794, 308, 12, 30, 12, 1], [794, 358, 12, 31, 12, 0], [794, 409, 12, 30, 12, 0], [794, 461, 12, 30, 12, 1], [794, 511, 12, 31, 12, 0], [794, 562, 12, 25, 12, 0], [794, 614, 15, 30, 15, 1], [794, 664, 15, 31, 15, 0], [794, 715, 15, 25, 15, 0], [794, 783, 3, 6, 3, 17], [855, 18, 3, 6, 3, 17], [855, 69, 3, 6, 3, 17], [855, 120, 3, 6, 3, 17], [855, 171, 3, 6, 3, 17], [855, 222, 3, 6, 3, 17], [855, 273, 3, 6, 3, 17], [855, 324, 3, 6, 3, 17], [855, 375, 3, 6, 3, 17], [855, 426, 3, 6, 3, 17], [855, 477, 3, 6, 3, 17], [855, 528, 3, 6, 3, 17], [855, 579, 3, 6, 3, 17], [855, 630, 3, 6, 3, 17], [855, 681, 3, 6, 3, 17], [855, 732, 3, 6, 3, 17], [855, 783, 3, 6, 3, 17]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 31}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 33, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 11, 1], [1, 59, 21, 18, 13, 7], [1, 110, 31, 18, 22, 7], [1, 161, 24, 18, 17, 7], [1, 212, 27, 18, 18, 7], [1, 262, 33, 19, 25, 6], [1, 314, 30, 18, 24, 7], [1, 368, 22, 15, 16, 10], [1, 416, 22, 23, 13, 7], [1, 467, 19, 23, 13, 7], [1, 521, 22, 12, 17, 10], [1, 573, 23, 13, 18, 11], [1, 634, 13, 7, 13, 21], [1, 680, 23, 3, 18, 16], [1, 736, 13, 4, 13, 21], [1, 773, 21, 18, 12, 7], [62, 8, 24, 18, 17, 7], [62, 59, 22, 18, 17, 7], [62, 110, 23, 18, 17, 7], [62, 161, 23, 18, 17, 7], [62, 212, 24, 18, 17, 7], [62, 263, 26, 18, 17, 7], [62, 314, 25, 18, 17, 7], [62, 365, 26, 18, 17, 7], [62, 416, 24, 18, 17, 7], [62, 467, 25, 18, 17, 7], [62, 521, 18, 15, 12, 10], [62, 572, 18, 18, 12, 10], [62, 624, 25, 13, 18, 11], [62, 678, 24, 7, 18, 14], [62, 726, 23, 13, 18, 11], [62, 773, 23, 18, 16, 7], [123, 11, 25, 15, 18, 10], [123, 59, 25, 18, 22, 7], [123, 110, 27, 18, 21, 7], [123, 161, 30, 18, 22, 7], [123, 212, 23, 18, 20, 7], [123, 263, 29, 18, 21, 7], [123, 314, 29, 18, 23, 7], [123, 365, 27, 18, 19, 7], [123, 416, 32, 18, 23, 7], [123, 467, 22, 18, 13, 7], [123, 517, 27, 19, 20, 6], [123, 569, 31, 18, 22, 7], [123, 620, 24, 18, 21, 7], [123, 671, 36, 18, 27, 7], [123, 722, 32, 18, 23, 7], [123, 773, 29, 18, 23, 7], [184, 8, 32, 18, 24, 7], [184, 59, 29, 18, 23, 7], [184, 110, 27, 18, 19, 7], [184, 161, 28, 18, 20, 7], [184, 212, 29, 18, 20, 7], [184, 263, 31, 18, 22, 7], [184, 318, 23, 19, 16, 11], [184, 365, 29, 18, 24, 7], [184, 416, 30, 18, 21, 7], [184, 467, 32, 18, 24, 7], [184, 518, 30, 18, 21, 7], [184, 569, 21, 23, 13, 7], [184, 626, 24, 12, 26, 13], [184, 671, 21, 23, 13, 7], [184, 722, 23, 18, 21, 7], [184, 793, 17, 3, 17, 27], [245, 6, 27, 3, 17, 5], [245, 62, 27, 15, 20, 10], [245, 108, 25, 25, 18, 5], [245, 164, 25, 20, 18, 10], [245, 210, 26, 20, 17, 5], [245, 266, 23, 15, 16, 10], [245, 313, 24, 24, 18, 6], [245, 368, 24, 20, 15, 10], [245, 419, 25, 20, 20, 10], [245, 470, 18, 15, 13, 10], [245, 521, 26, 21, 19, 10], [245, 572, 25, 15, 18, 10], [245, 618, 22, 20, 18, 5], [245, 674, 23, 21, 19, 10], [245, 725, 25, 15, 18, 10], [245, 776, 24, 15, 18, 10], [306, 11, 26, 15, 18, 10], [306, 58, 25, 19, 18, 6], [306, 113, 24, 20, 18, 10], [306, 164, 27, 15, 20, 10], [306, 215, 23, 15, 15, 10], [306, 266, 24, 15, 19, 10], [306, 316, 30, 16, 22, 9], [306, 368, 28, 15, 22, 10], [306, 413, 23, 26, 17, 4], [306, 470, 29, 20, 22, 10], [306, 516, 24, 25, 17, 5], [306, 569, 23, 23, 17, 7], [306, 620, 18, 23, 10, 7], [306, 671, 21, 23, 17, 7], [306, 730, 23, 5, 18, 15], [306, 773, 16, 17, 6, 7], [367, 8, 16, 17, 6, 7], [367, 59, 16, 17, 6, 7], [367, 110, 16, 17, 6, 7], [367, 161, 16, 17, 6, 7], [367, 212, 16, 17, 6, 7], [367, 263, 16, 17, 6, 7], [367, 314, 16, 17, 6, 7], [367, 365, 16, 17, 6, 7], [367, 416, 16, 17, 6, 7], [367, 467, 16, 17, 6, 7], [367, 518, 16, 17, 6, 7], [367, 569, 16, 17, 6, 7], [367, 620, 16, 17, 6, 7], [367, 671, 16, 17, 6, 7], [367, 722, 16, 17, 6, 7], [367, 773, 16, 17, 6, 7], [428, 8, 16, 17, 6, 7], [428, 59, 16, 17, 6, 7], [428, 110, 16, 17, 6, 7], [428, 161, 16, 17, 6, 7], [428, 212, 16, 17, 6, 7], [428, 263, 16, 17, 6, 7], [428, 314, 16, 17, 6, 7], [428, 365, 16, 17, 6, 7], [428, 416, 16, 17, 6, 7], [428, 467, 16, 17, 6, 7], [428, 518, 16, 17, 6, 7], [428, 569, 16, 17, 6, 7], [428, 620, 16, 17, 6, 7], [428, 671, 16, 17, 6, 7], [428, 722, 16, 17, 6, 7], [428, 773, 16, 17, 6, 7], [489, 8, 16, 17, 6, 7], [489, 58, 28, 19, 20, 6], [489, 109, 20, 6, 11, 6], [489, 166, 25, 13, 18, 12], [489, 212, 19, 18, 10, 7], [489, 269, 28, 9, 23, 13], [489, 314, 26, 23, 17, 7], [489, 368, 27, 15, 23, 10], [489, 419, 25, 15, 23, 10], [489, 470, 28, 15, 23, 10], [489, 521, 26, 15, 23, 10], [489, 574, 35, 11, 31, 12], [489, 625, 35, 11, 29, 12], [489, 670, 24, 23, 19, 6], [489, 727, 30, 11, 29, 12], [489, 771, 22, 20, 19, 5], [550, 7, 23, 9, 15, 6], [550, 60, 25, 17, 19, 8], [550, 109, 23, 6, 15, 6], [550, 166, 22, 13, 18, 12], [550, 215, 27, 15, 18, 10], [550, 270, 28, 9, 22, 14], [550, 314, 23, 18, 17, 7], [550, 368, 23, 12, 17, 10], [550, 421, 23, 11, 18, 12], [550, 472, 24, 11, 19, 12], [550, 524, 24, 9, 18, 13], [550, 575, 24, 9, 18, 13], [550, 634, 28, 4, 29, 21], [550, 667, 23, 28, 19, 3], [550, 731, 35, 3, 29, 16], [550, 774, 29, 17, 21, 8], [611, 9, 30, 17, 25, 8], [611, 57, 30, 21, 22, 5], [611, 108, 32, 20, 25, 5], [611, 164, 33, 20, 29, 10], [611, 212, 30, 18, 24, 7], [611, 263, 30, 18, 24, 7], [611, 313, 34, 19, 25, 6], [611, 368, 28, 15, 23, 10], [611, 419, 31, 15, 23, 10], [611, 470, 28, 15, 22, 10], [611, 511, 1, 1, 22, 1], [611, 571, 30, 17, 22, 9], [611, 623, 30, 15, 22, 10], [611, 674, 30, 18, 22, 10], [611, 725, 28, 15, 22, 10], [611, 775, 28, 17, 22, 9], [672, 8, 32, 18, 23, 7], [672, 59, 31, 18, 22, 7], [672, 110, 30, 18, 24, 7], [672, 161, 30, 18, 24, 7], [672, 212, 35, 11, 27, 7], [672, 261, 34, 23, 25, 5], [672, 312, 28, 20, 18, 5], [672, 373, 18, 4, 18, 15], [672, 425, 28, 9, 23, 16], [1, 1, 1, 1, 11, 1], [794, 766, 1, 1, 3, 1], [672, 572, 35, 15, 31, 10], [672, 623, 35, 15, 29, 10], [672, 665, 29, 24, 20, 1], [672, 725, 34, 15, 29, 10], [672, 767, 29, 24, 20, 1], [733, 8, 22, 18, 17, 7], [733, 59, 22, 25, 13, 7], [733, 110, 30, 18, 24, 7], [733, 161, 30, 18, 23, 7], [733, 212, 32, 11, 24, 7], [733, 262, 32, 22, 22, 6], [733, 309, 24, 31, 14, 2], [733, 358, 22, 33, 14, 0], [733, 409, 22, 32, 14, 0], [733, 461, 24, 32, 14, 1], [733, 511, 20, 33, 14, 0], [733, 562, 20, 27, 14, 0], [733, 614, 27, 32, 17, 1], [733, 664, 25, 33, 17, 0], [733, 715, 25, 27, 17, 0], [733, 766, 25, 33, 17, 0], [1, 1, 1, 1, 11, 1], [794, 59, 17, 25, 13, 7], [794, 104, 22, 26, 12, 1], [794, 155, 31, 32, 21, 1], [794, 205, 28, 33, 21, 0], [794, 256, 28, 26, 21, 0], [794, 308, 21, 32, 14, 1], [794, 359, 24, 32, 14, 1], [794, 410, 24, 31, 14, 1], [794, 461, 24, 32, 14, 1], [794, 512, 24, 32, 14, 1], [794, 563, 24, 26, 14, 1], [794, 614, 23, 32, 17, 1], [794, 664, 25, 33, 17, 0], [794, 715, 25, 27, 17, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 24, \"widestlogicalchar\": 31, \"widestglyph\": 36, \"tallestglyph\": 33}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 9, 1], [1, 59, 20, 16, 11, 7], [1, 110, 30, 16, 20, 7], [1, 161, 23, 16, 15, 7], [1, 212, 26, 16, 16, 7], [1, 262, 32, 17, 23, 6], [1, 314, 29, 16, 22, 7], [1, 368, 21, 13, 14, 10], [1, 416, 21, 21, 11, 7], [1, 467, 18, 21, 11, 7], [1, 521, 21, 10, 15, 10], [1, 573, 22, 11, 16, 11], [1, 634, 12, 5, 11, 21], [1, 680, 22, 1, 16, 16], [1, 736, 12, 2, 11, 21], [1, 773, 20, 16, 10, 7], [62, 8, 23, 16, 15, 7], [62, 59, 21, 16, 15, 7], [62, 110, 22, 16, 15, 7], [62, 161, 22, 16, 15, 7], [62, 212, 23, 16, 15, 7], [62, 263, 25, 16, 15, 7], [62, 314, 24, 16, 15, 7], [62, 365, 25, 16, 15, 7], [62, 416, 23, 16, 15, 7], [62, 467, 24, 16, 15, 7], [62, 521, 17, 13, 10, 10], [62, 572, 17, 16, 10, 10], [62, 624, 24, 11, 16, 11], [62, 678, 23, 5, 16, 14], [62, 726, 22, 11, 16, 11], [62, 773, 22, 16, 14, 7], [123, 11, 24, 13, 16, 10], [123, 59, 24, 16, 20, 7], [123, 110, 26, 16, 19, 7], [123, 161, 29, 16, 20, 7], [123, 212, 22, 16, 18, 7], [123, 263, 28, 16, 19, 7], [123, 314, 28, 16, 21, 7], [123, 365, 26, 16, 17, 7], [123, 416, 31, 16, 21, 7], [123, 467, 21, 16, 11, 7], [123, 517, 26, 17, 18, 6], [123, 569, 30, 16, 20, 7], [123, 620, 23, 16, 19, 7], [123, 671, 35, 16, 25, 7], [123, 722, 31, 16, 21, 7], [123, 773, 28, 16, 21, 7], [184, 8, 31, 16, 22, 7], [184, 59, 28, 16, 21, 7], [184, 110, 26, 16, 17, 7], [184, 161, 27, 16, 18, 7], [184, 212, 28, 16, 18, 7], [184, 263, 30, 16, 20, 7], [184, 318, 22, 17, 14, 11], [184, 365, 28, 16, 22, 7], [184, 416, 29, 16, 19, 7], [184, 467, 31, 16, 22, 7], [184, 518, 29, 16, 19, 7], [184, 569, 20, 21, 11, 7], [184, 626, 23, 10, 24, 13], [184, 671, 20, 21, 11, 7], [184, 722, 22, 16, 19, 7], [184, 793, 16, 1, 15, 27], [245, 6, 26, 1, 15, 5], [245, 62, 26, 13, 18, 10], [245, 108, 24, 23, 16, 5], [245, 164, 24, 18, 16, 10], [245, 210, 25, 18, 15, 5], [245, 266, 22, 13, 14, 10], [245, 313, 23, 22, 16, 6], [245, 368, 23, 18, 13, 10], [245, 419, 24, 18, 18, 10], [245, 470, 17, 13, 11, 10], [245, 521, 25, 19, 17, 10], [245, 572, 24, 13, 16, 10], [245, 618, 21, 18, 16, 5], [245, 674, 22, 19, 17, 10], [245, 725, 24, 13, 16, 10], [245, 776, 23, 13, 16, 10], [306, 11, 25, 13, 16, 10], [306, 58, 24, 17, 16, 6], [306, 113, 23, 18, 16, 10], [306, 164, 26, 13, 18, 10], [306, 215, 22, 13, 13, 10], [306, 266, 23, 13, 17, 10], [306, 316, 29, 14, 20, 9], [306, 368, 27, 13, 20, 10], [306, 413, 22, 24, 15, 4], [306, 470, 28, 18, 20, 10], [306, 516, 23, 23, 15, 5], [306, 569, 22, 21, 15, 7], [306, 620, 17, 21, 8, 7], [306, 671, 20, 21, 15, 7], [306, 730, 22, 3, 16, 15], [306, 773, 15, 15, 4, 7], [367, 8, 15, 15, 4, 7], [367, 59, 15, 15, 4, 7], [367, 110, 15, 15, 4, 7], [367, 161, 15, 15, 4, 7], [367, 212, 15, 15, 4, 7], [367, 263, 15, 15, 4, 7], [367, 314, 15, 15, 4, 7], [367, 365, 15, 15, 4, 7], [367, 416, 15, 15, 4, 7], [367, 467, 15, 15, 4, 7], [367, 518, 15, 15, 4, 7], [367, 569, 15, 15, 4, 7], [367, 620, 15, 15, 4, 7], [367, 671, 15, 15, 4, 7], [367, 722, 15, 15, 4, 7], [367, 773, 15, 15, 4, 7], [428, 8, 15, 15, 4, 7], [428, 59, 15, 15, 4, 7], [428, 110, 15, 15, 4, 7], [428, 161, 15, 15, 4, 7], [428, 212, 15, 15, 4, 7], [428, 263, 15, 15, 4, 7], [428, 314, 15, 15, 4, 7], [428, 365, 15, 15, 4, 7], [428, 416, 15, 15, 4, 7], [428, 467, 15, 15, 4, 7], [428, 518, 15, 15, 4, 7], [428, 569, 15, 15, 4, 7], [428, 620, 15, 15, 4, 7], [428, 671, 15, 15, 4, 7], [428, 722, 15, 15, 4, 7], [428, 773, 15, 15, 4, 7], [489, 8, 15, 15, 4, 7], [489, 58, 27, 17, 18, 6], [489, 109, 19, 4, 9, 6], [489, 166, 24, 11, 16, 12], [489, 212, 18, 16, 8, 7], [489, 269, 27, 7, 21, 13], [489, 314, 25, 21, 15, 7], [489, 368, 26, 13, 21, 10], [489, 419, 24, 13, 21, 10], [489, 470, 27, 13, 21, 10], [489, 521, 25, 13, 21, 10], [489, 574, 34, 9, 29, 12], [489, 625, 34, 9, 27, 12], [489, 670, 23, 21, 17, 6], [489, 727, 29, 9, 27, 12], [489, 771, 21, 18, 17, 5], [550, 7, 22, 7, 13, 6], [550, 60, 24, 15, 17, 8], [550, 109, 22, 4, 13, 6], [550, 166, 21, 11, 16, 12], [550, 215, 26, 13, 16, 10], [550, 270, 27, 7, 20, 14], [550, 314, 22, 16, 15, 7], [550, 368, 22, 10, 15, 10], [550, 421, 22, 9, 16, 12], [550, 472, 23, 9, 17, 12], [550, 524, 23, 7, 16, 13], [550, 575, 23, 7, 16, 13], [550, 634, 27, 2, 27, 21], [550, 667, 22, 26, 17, 3], [550, 731, 34, 1, 27, 16], [550, 774, 28, 15, 19, 8], [611, 9, 29, 15, 23, 8], [611, 57, 29, 19, 20, 5], [611, 108, 31, 18, 23, 5], [611, 164, 32, 18, 27, 10], [611, 212, 29, 16, 22, 7], [611, 263, 29, 16, 22, 7], [611, 313, 33, 17, 23, 6], [611, 368, 27, 13, 21, 10], [611, 419, 30, 13, 21, 10], [611, 470, 27, 13, 20, 10], [611, 511, 1, 1, 20, 1], [611, 571, 29, 15, 20, 9], [611, 623, 29, 13, 20, 10], [611, 674, 29, 16, 20, 10], [611, 725, 27, 13, 20, 10], [611, 775, 27, 15, 20, 9], [672, 8, 31, 16, 21, 7], [672, 59, 30, 16, 20, 7], [672, 110, 29, 16, 22, 7], [672, 161, 29, 16, 22, 7], [672, 212, 34, 9, 25, 7], [672, 261, 33, 21, 23, 5], [672, 314, 26, 16, 16, 7], [672, 373, 17, 2, 16, 15], [672, 425, 27, 7, 21, 16], [1, 1, 1, 1, 9, 1], [794, 766, 1, 1, 3, 1], [672, 572, 34, 13, 29, 10], [672, 623, 34, 13, 27, 10], [672, 665, 28, 22, 18, 1], [672, 725, 33, 13, 27, 10], [672, 767, 28, 22, 18, 1], [733, 8, 21, 16, 15, 7], [733, 59, 21, 23, 11, 7], [733, 110, 29, 16, 22, 7], [733, 161, 29, 16, 21, 7], [733, 212, 31, 9, 22, 7], [733, 262, 31, 20, 20, 6], [733, 310, 23, 28, 12, 3], [733, 358, 20, 31, 12, 0], [733, 409, 20, 30, 12, 0], [733, 461, 23, 30, 12, 1], [733, 511, 18, 31, 12, 0], [733, 562, 18, 25, 12, 0], [733, 614, 26, 30, 15, 1], [733, 664, 23, 31, 15, 0], [733, 715, 23, 25, 15, 0], [733, 766, 23, 31, 15, 0], [1, 1, 1, 1, 9, 1], [794, 59, 16, 23, 11, 7], [794, 105, 21, 23, 10, 2], [794, 156, 30, 29, 19, 2], [794, 205, 26, 31, 19, 0], [794, 256, 26, 24, 19, 0], [794, 308, 20, 30, 12, 1], [794, 363, 23, 26, 12, 5], [794, 414, 23, 25, 12, 5], [794, 461, 23, 30, 12, 1], [794, 516, 23, 26, 12, 5], [794, 567, 23, 20, 12, 5], [794, 614, 22, 30, 15, 1], [794, 664, 23, 31, 15, 0], [794, 715, 23, 25, 15, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 23, \"widestlogicalchar\": 29, \"widestglyph\": 35, \"tallestglyph\": 31}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 33, \"leftmost\": 2, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 19, 11, 6, 11, 18], [1, 59, 13, 18, 13, 7], [1, 110, 22, 18, 22, 7], [1, 161, 17, 18, 17, 7], [1, 212, 18, 18, 18, 7], [1, 262, 25, 19, 25, 6], [1, 314, 24, 18, 24, 7], [1, 368, 16, 15, 16, 10], [1, 416, 13, 23, 13, 7], [1, 467, 13, 23, 13, 7], [1, 521, 17, 14, 17, 10], [1, 573, 18, 13, 18, 11], [1, 631, 13, 10, 13, 18], [1, 680, 18, 8, 18, 16], [1, 733, 13, 7, 13, 18], [1, 773, 12, 18, 12, 7], [62, 8, 17, 18, 17, 7], [62, 59, 17, 18, 17, 7], [62, 110, 17, 18, 17, 7], [62, 161, 17, 18, 17, 7], [62, 212, 17, 18, 17, 7], [62, 263, 17, 18, 17, 7], [62, 314, 17, 18, 17, 7], [62, 365, 17, 18, 17, 7], [62, 416, 17, 18, 17, 7], [62, 467, 17, 18, 17, 7], [62, 521, 12, 15, 12, 10], [62, 572, 12, 18, 12, 10], [62, 624, 18, 13, 18, 11], [62, 678, 18, 10, 18, 14], [62, 726, 18, 13, 18, 11], [62, 773, 16, 18, 16, 7], [123, 11, 18, 15, 18, 10], [123, 59, 22, 18, 22, 7], [123, 110, 21, 18, 21, 7], [123, 161, 22, 18, 22, 7], [123, 212, 20, 18, 20, 7], [123, 263, 21, 18, 21, 7], [123, 314, 23, 18, 23, 7], [123, 365, 19, 18, 19, 7], [123, 416, 23, 18, 23, 7], [123, 467, 13, 18, 13, 7], [123, 517, 20, 19, 20, 6], [123, 569, 22, 18, 22, 7], [123, 620, 21, 18, 21, 7], [123, 671, 27, 18, 27, 7], [123, 722, 23, 18, 23, 7], [123, 773, 23, 18, 23, 7], [184, 8, 24, 18, 24, 7], [184, 59, 23, 18, 23, 7], [184, 110, 19, 18, 19, 7], [184, 161, 20, 18, 20, 7], [184, 212, 20, 18, 20, 7], [184, 263, 22, 18, 22, 7], [184, 318, 16, 19, 16, 11], [184, 365, 24, 18, 24, 7], [184, 416, 21, 18, 21, 7], [184, 467, 24, 18, 24, 7], [184, 518, 21, 18, 21, 7], [184, 569, 13, 23, 13, 7], [184, 626, 26, 12, 26, 13], [184, 671, 13, 23, 13, 7], [184, 722, 21, 18, 21, 7], [184, 784, 17, 12, 17, 18], [245, 6, 17, 19, 17, 5], [245, 62, 20, 15, 20, 10], [245, 108, 18, 25, 18, 5], [245, 164, 18, 20, 18, 10], [245, 210, 17, 20, 17, 5], [245, 266, 16, 15, 16, 10], [245, 313, 18, 24, 18, 6], [245, 368, 15, 20, 15, 10], [245, 419, 20, 20, 20, 10], [245, 470, 13, 15, 13, 10], [245, 521, 19, 21, 19, 10], [245, 572, 18, 15, 18, 10], [245, 618, 18, 20, 18, 5], [245, 674, 19, 21, 19, 10], [245, 725, 18, 15, 18, 10], [245, 776, 18, 15, 18, 10], [306, 11, 18, 15, 18, 10], [306, 58, 18, 19, 18, 6], [306, 113, 18, 20, 18, 10], [306, 164, 20, 15, 20, 10], [306, 215, 15, 15, 15, 10], [306, 266, 19, 15, 19, 10], [306, 316, 22, 16, 22, 9], [306, 368, 22, 15, 22, 10], [306, 413, 17, 26, 17, 4], [306, 470, 22, 20, 22, 10], [306, 516, 17, 25, 17, 5], [306, 569, 17, 23, 17, 7], [306, 620, 10, 23, 10, 7], [306, 671, 17, 23, 17, 7], [306, 730, 18, 9, 18, 15], [306, 773, 6, 17, 6, 7], [367, 8, 6, 17, 6, 7], [367, 59, 6, 17, 6, 7], [367, 110, 6, 17, 6, 7], [367, 161, 6, 17, 6, 7], [367, 212, 6, 17, 6, 7], [367, 263, 6, 17, 6, 7], [367, 314, 6, 17, 6, 7], [367, 365, 6, 17, 6, 7], [367, 416, 6, 17, 6, 7], [367, 467, 6, 17, 6, 7], [367, 518, 6, 17, 6, 7], [367, 569, 6, 17, 6, 7], [367, 620, 6, 17, 6, 7], [367, 671, 6, 17, 6, 7], [367, 722, 6, 17, 6, 7], [367, 773, 6, 17, 6, 7], [428, 8, 6, 17, 6, 7], [428, 59, 6, 17, 6, 7], [428, 110, 6, 17, 6, 7], [428, 161, 6, 17, 6, 7], [428, 212, 6, 17, 6, 7], [428, 263, 6, 17, 6, 7], [428, 314, 6, 17, 6, 7], [428, 365, 6, 17, 6, 7], [428, 416, 6, 17, 6, 7], [428, 467, 6, 17, 6, 7], [428, 518, 6, 17, 6, 7], [428, 569, 6, 17, 6, 7], [428, 620, 6, 17, 6, 7], [428, 671, 6, 17, 6, 7], [428, 722, 6, 17, 6, 7], [428, 773, 6, 17, 6, 7], [489, 8, 6, 17, 6, 7], [489, 58, 20, 19, 20, 6], [489, 109, 11, 18, 11, 6], [489, 166, 18, 13, 18, 12], [489, 212, 10, 18, 10, 7], [489, 269, 23, 11, 23, 13], [489, 314, 17, 23, 17, 7], [489, 368, 23, 15, 23, 10], [489, 419, 23, 15, 23, 10], [489, 470, 23, 15, 23, 10], [489, 521, 23, 15, 23, 10], [489, 574, 31, 12, 31, 12], [489, 625, 29, 12, 29, 12], [489, 670, 19, 23, 19, 6], [489, 727, 29, 12, 29, 12], [489, 771, 19, 20, 19, 5], [550, 7, 15, 18, 15, 6], [550, 60, 19, 17, 19, 8], [550, 109, 15, 18, 15, 6], [550, 166, 18, 13, 18, 12], [550, 215, 18, 15, 18, 10], [550, 270, 22, 10, 22, 14], [550, 314, 17, 18, 17, 7], [550, 368, 17, 14, 17, 10], [550, 421, 18, 12, 18, 12], [550, 472, 19, 12, 19, 12], [550, 524, 18, 11, 18, 13], [550, 575, 18, 11, 18, 13], [550, 631, 29, 7, 29, 18], [550, 667, 19, 28, 19, 3], [550, 731, 29, 8, 29, 16], [550, 774, 21, 17, 21, 8], [611, 9, 25, 17, 25, 8], [611, 57, 22, 21, 22, 5], [611, 108, 25, 20, 25, 5], [611, 164, 29, 20, 29, 10], [611, 212, 24, 18, 24, 7], [611, 263, 24, 18, 24, 7], [611, 313, 25, 19, 25, 6], [611, 368, 23, 15, 23, 10], [611, 419, 23, 15, 23, 10], [611, 470, 22, 15, 22, 10], [611, 521, 22, 18, 22, 10], [611, 571, 22, 17, 22, 9], [611, 623, 22, 15, 22, 10], [611, 674, 22, 18, 22, 10], [611, 725, 22, 15, 22, 10], [611, 775, 22, 17, 22, 9], [672, 8, 23, 18, 23, 7], [672, 59, 22, 18, 22, 7], [672, 110, 24, 18, 24, 7], [672, 161, 24, 18, 24, 7], [672, 212, 27, 17, 27, 7], [672, 261, 25, 23, 25, 5], [672, 312, 18, 20, 18, 5], [672, 373, 18, 9, 18, 15], [672, 425, 23, 9, 23, 16], [1, 19, 11, 6, 11, 18], [794, 784, 3, 6, 3, 18], [672, 572, 31, 15, 31, 10], [672, 623, 29, 15, 29, 10], [672, 665, 20, 24, 20, 1], [672, 725, 29, 15, 29, 10], [672, 767, 20, 24, 20, 1], [733, 8, 17, 18, 17, 7], [733, 59, 13, 25, 13, 7], [733, 110, 24, 18, 24, 7], [733, 161, 23, 18, 23, 7], [733, 212, 24, 17, 24, 7], [733, 262, 22, 22, 22, 6], [733, 308, 14, 32, 14, 1], [733, 358, 14, 33, 14, 0], [733, 409, 14, 32, 14, 0], [733, 461, 14, 32, 14, 1], [733, 511, 14, 33, 14, 0], [733, 562, 14, 27, 14, 0], [733, 614, 17, 32, 17, 1], [733, 664, 17, 33, 17, 0], [733, 715, 17, 27, 17, 0], [733, 766, 17, 33, 17, 0], [1, 19, 11, 6, 11, 18], [794, 59, 13, 25, 13, 7], [794, 104, 12, 26, 12, 1], [794, 155, 21, 32, 21, 1], [794, 205, 21, 33, 21, 0], [794, 256, 21, 26, 21, 0], [794, 308, 14, 32, 14, 1], [794, 358, 14, 33, 14, 0], [794, 409, 14, 32, 14, 0], [794, 461, 14, 32, 14, 1], [794, 511, 14, 33, 14, 0], [794, 562, 14, 27, 14, 0], [794, 614, 17, 32, 17, 1], [794, 664, 17, 33, 17, 0], [794, 715, 17, 27, 17, 0], [794, 784, 3, 6, 3, 18], [855, 19, 3, 6, 3, 18], [855, 70, 3, 6, 3, 18], [855, 121, 3, 6, 3, 18], [855, 172, 3, 6, 3, 18], [855, 223, 3, 6, 3, 18], [855, 274, 3, 6, 3, 18], [855, 325, 3, 6, 3, 18], [855, 376, 3, 6, 3, 18], [855, 427, 3, 6, 3, 18], [855, 478, 3, 6, 3, 18], [855, 529, 3, 6, 3, 18], [855, 580, 3, 6, 3, 18], [855, 631, 3, 6, 3, 18], [855, 682, 3, 6, 3, 18], [855, 733, 3, 6, 3, 18], [855, 784, 3, 6, 3, 18]], \"widestlogicalchar\": 31, \"widestglyph\": 31, \"tallestglyph\": 33}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_24_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 31, \"leftmost\": 3, \"capHeight\": 23, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 18, 9, 6, 9, 17], [1, 59, 11, 16, 11, 7], [1, 110, 20, 16, 20, 7], [1, 161, 15, 16, 15, 7], [1, 212, 16, 16, 16, 7], [1, 262, 23, 17, 23, 6], [1, 314, 22, 16, 22, 7], [1, 368, 14, 13, 14, 10], [1, 416, 11, 21, 11, 7], [1, 467, 11, 21, 11, 7], [1, 521, 15, 13, 15, 10], [1, 573, 16, 12, 16, 11], [1, 630, 11, 9, 11, 17], [1, 680, 16, 7, 16, 16], [1, 732, 11, 6, 11, 17], [1, 773, 10, 16, 10, 7], [62, 8, 15, 16, 15, 7], [62, 59, 15, 16, 15, 7], [62, 110, 15, 16, 15, 7], [62, 161, 15, 16, 15, 7], [62, 212, 15, 16, 15, 7], [62, 263, 15, 16, 15, 7], [62, 314, 15, 16, 15, 7], [62, 365, 15, 16, 15, 7], [62, 416, 15, 16, 15, 7], [62, 467, 15, 16, 15, 7], [62, 521, 10, 13, 10, 10], [62, 572, 10, 16, 10, 10], [62, 624, 16, 12, 16, 11], [62, 678, 16, 9, 16, 14], [62, 726, 16, 12, 16, 11], [62, 773, 14, 16, 14, 7], [123, 11, 16, 13, 16, 10], [123, 59, 20, 16, 20, 7], [123, 110, 19, 16, 19, 7], [123, 161, 20, 16, 20, 7], [123, 212, 18, 16, 18, 7], [123, 263, 19, 16, 19, 7], [123, 314, 21, 16, 21, 7], [123, 365, 17, 16, 17, 7], [123, 416, 21, 16, 21, 7], [123, 467, 11, 16, 11, 7], [123, 517, 18, 17, 18, 6], [123, 569, 20, 16, 20, 7], [123, 620, 19, 16, 19, 7], [123, 671, 25, 16, 25, 7], [123, 722, 21, 16, 21, 7], [123, 773, 21, 16, 21, 7], [184, 8, 22, 16, 22, 7], [184, 59, 21, 16, 21, 7], [184, 110, 17, 16, 17, 7], [184, 161, 18, 16, 18, 7], [184, 212, 18, 16, 18, 7], [184, 263, 20, 16, 20, 7], [184, 318, 14, 17, 14, 11], [184, 365, 22, 16, 22, 7], [184, 416, 19, 16, 19, 7], [184, 467, 22, 16, 22, 7], [184, 518, 19, 16, 19, 7], [184, 569, 11, 21, 11, 7], [184, 626, 24, 10, 24, 13], [184, 671, 11, 21, 11, 7], [184, 722, 19, 16, 19, 7], [184, 783, 15, 11, 15, 17], [245, 6, 15, 18, 15, 5], [245, 62, 18, 13, 18, 10], [245, 108, 16, 23, 16, 5], [245, 164, 16, 18, 16, 10], [245, 210, 15, 18, 15, 5], [245, 266, 14, 13, 14, 10], [245, 313, 16, 22, 16, 6], [245, 368, 13, 18, 13, 10], [245, 419, 18, 18, 18, 10], [245, 470, 11, 13, 11, 10], [245, 521, 17, 19, 17, 10], [245, 572, 16, 13, 16, 10], [245, 618, 16, 18, 16, 5], [245, 674, 17, 19, 17, 10], [245, 725, 16, 13, 16, 10], [245, 776, 16, 13, 16, 10], [306, 11, 16, 13, 16, 10], [306, 58, 16, 17, 16, 6], [306, 113, 16, 18, 16, 10], [306, 164, 18, 13, 18, 10], [306, 215, 13, 13, 13, 10], [306, 266, 17, 13, 17, 10], [306, 316, 20, 14, 20, 9], [306, 368, 20, 13, 20, 10], [306, 413, 15, 24, 15, 4], [306, 470, 20, 18, 20, 10], [306, 516, 15, 23, 15, 5], [306, 569, 15, 21, 15, 7], [306, 620, 8, 21, 8, 7], [306, 671, 15, 21, 15, 7], [306, 730, 16, 8, 16, 15], [306, 773, 4, 16, 4, 7], [367, 8, 4, 16, 4, 7], [367, 59, 4, 16, 4, 7], [367, 110, 4, 16, 4, 7], [367, 161, 4, 16, 4, 7], [367, 212, 4, 16, 4, 7], [367, 263, 4, 16, 4, 7], [367, 314, 4, 16, 4, 7], [367, 365, 4, 16, 4, 7], [367, 416, 4, 16, 4, 7], [367, 467, 4, 16, 4, 7], [367, 518, 4, 16, 4, 7], [367, 569, 4, 16, 4, 7], [367, 620, 4, 16, 4, 7], [367, 671, 4, 16, 4, 7], [367, 722, 4, 16, 4, 7], [367, 773, 4, 16, 4, 7], [428, 8, 4, 16, 4, 7], [428, 59, 4, 16, 4, 7], [428, 110, 4, 16, 4, 7], [428, 161, 4, 16, 4, 7], [428, 212, 4, 16, 4, 7], [428, 263, 4, 16, 4, 7], [428, 314, 4, 16, 4, 7], [428, 365, 4, 16, 4, 7], [428, 416, 4, 16, 4, 7], [428, 467, 4, 16, 4, 7], [428, 518, 4, 16, 4, 7], [428, 569, 4, 16, 4, 7], [428, 620, 4, 16, 4, 7], [428, 671, 4, 16, 4, 7], [428, 722, 4, 16, 4, 7], [428, 773, 4, 16, 4, 7], [489, 8, 4, 16, 4, 7], [489, 58, 18, 17, 18, 6], [489, 109, 9, 17, 9, 6], [489, 166, 16, 11, 16, 12], [489, 212, 8, 16, 8, 7], [489, 269, 21, 10, 21, 13], [489, 314, 15, 21, 15, 7], [489, 368, 21, 13, 21, 10], [489, 419, 21, 13, 21, 10], [489, 470, 21, 13, 21, 10], [489, 521, 21, 13, 21, 10], [489, 574, 29, 11, 29, 12], [489, 625, 27, 11, 27, 12], [489, 670, 17, 21, 17, 6], [489, 727, 27, 11, 27, 12], [489, 771, 17, 18, 17, 5], [550, 7, 13, 17, 13, 6], [550, 60, 17, 15, 17, 8], [550, 109, 13, 17, 13, 6], [550, 166, 16, 11, 16, 12], [550, 215, 16, 13, 16, 10], [550, 270, 20, 9, 20, 14], [550, 314, 15, 16, 15, 7], [550, 368, 15, 13, 15, 10], [550, 421, 16, 11, 16, 12], [550, 472, 17, 11, 17, 12], [550, 524, 16, 10, 16, 13], [550, 575, 16, 10, 16, 13], [550, 630, 27, 6, 27, 17], [550, 667, 17, 26, 17, 3], [550, 731, 27, 7, 27, 16], [550, 774, 19, 15, 19, 8], [611, 9, 23, 15, 23, 8], [611, 57, 20, 19, 20, 5], [611, 108, 23, 18, 23, 5], [611, 164, 27, 18, 27, 10], [611, 212, 22, 16, 22, 7], [611, 263, 22, 16, 22, 7], [611, 313, 23, 17, 23, 6], [611, 368, 21, 13, 21, 10], [611, 419, 21, 13, 21, 10], [611, 470, 20, 13, 20, 10], [611, 521, 20, 16, 20, 10], [611, 571, 20, 15, 20, 9], [611, 623, 20, 13, 20, 10], [611, 674, 20, 16, 20, 10], [611, 725, 20, 13, 20, 10], [611, 775, 20, 15, 20, 9], [672, 8, 21, 16, 21, 7], [672, 59, 20, 16, 20, 7], [672, 110, 22, 16, 22, 7], [672, 161, 22, 16, 22, 7], [672, 212, 25, 16, 25, 7], [672, 261, 23, 21, 23, 5], [672, 312, 16, 18, 16, 5], [672, 373, 16, 8, 16, 15], [672, 425, 21, 7, 21, 16], [1, 18, 9, 6, 9, 17], [794, 783, 3, 6, 3, 17], [672, 572, 29, 13, 29, 10], [672, 623, 27, 13, 27, 10], [672, 665, 18, 22, 18, 1], [672, 725, 27, 13, 27, 10], [672, 767, 18, 22, 18, 1], [733, 8, 15, 16, 15, 7], [733, 59, 11, 23, 11, 7], [733, 110, 22, 16, 22, 7], [733, 161, 21, 16, 21, 7], [733, 212, 22, 16, 22, 7], [733, 262, 20, 20, 20, 6], [733, 308, 12, 30, 12, 1], [733, 358, 12, 31, 12, 0], [733, 409, 12, 30, 12, 0], [733, 461, 12, 30, 12, 1], [733, 511, 12, 31, 12, 0], [733, 562, 12, 25, 12, 0], [733, 614, 15, 30, 15, 1], [733, 664, 15, 31, 15, 0], [733, 715, 15, 25, 15, 0], [733, 766, 15, 31, 15, 0], [1, 18, 9, 6, 9, 17], [794, 59, 11, 23, 11, 7], [794, 104, 10, 24, 10, 1], [794, 155, 19, 30, 19, 1], [794, 205, 19, 31, 19, 0], [794, 256, 19, 24, 19, 0], [794, 308, 12, 30, 12, 1], [794, 358, 12, 31, 12, 0], [794, 409, 12, 30, 12, 0], [794, 461, 12, 30, 12, 1], [794, 511, 12, 31, 12, 0], [794, 562, 12, 25, 12, 0], [794, 614, 15, 30, 15, 1], [794, 664, 15, 31, 15, 0], [794, 715, 15, 25, 15, 0], [794, 783, 3, 6, 3, 17], [855, 18, 3, 6, 3, 17], [855, 69, 3, 6, 3, 17], [855, 120, 3, 6, 3, 17], [855, 171, 3, 6, 3, 17], [855, 222, 3, 6, 3, 17], [855, 273, 3, 6, 3, 17], [855, 324, 3, 6, 3, 17], [855, 375, 3, 6, 3, 17], [855, 426, 3, 6, 3, 17], [855, 477, 3, 6, 3, 17], [855, 528, 3, 6, 3, 17], [855, 579, 3, 6, 3, 17], [855, 630, 3, 6, 3, 17], [855, 681, 3, 6, 3, 17], [855, 732, 3, 6, 3, 17], [855, 783, 3, 6, 3, 17]], \"widestlogicalchar\": 29, \"widestglyph\": 29, \"tallestglyph\": 31}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_+b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 56, 11, 8, 7, 4], [1, 107, 15, 8, 11, 4], [1, 158, 13, 8, 9, 4], [1, 209, 13, 8, 9, 4], [1, 260, 15, 8, 11, 4], [1, 311, 13, 8, 11, 4], [1, 363, 11, 7, 8, 5], [1, 413, 11, 10, 7, 4], [1, 464, 10, 10, 7, 4], [1, 515, 12, 6, 9, 4], [1, 567, 12, 7, 9, 5], [1, 622, 8, 5, 7, 9], [1, 671, 11, 3, 9, 7], [1, 724, 8, 3, 7, 9], [1, 770, 11, 8, 7, 4], [62, 5, 12, 8, 9, 4], [62, 56, 12, 8, 9, 4], [62, 107, 12, 8, 9, 4], [62, 158, 12, 8, 9, 4], [62, 209, 12, 8, 9, 4], [62, 260, 13, 8, 9, 4], [62, 311, 12, 8, 9, 4], [62, 362, 13, 8, 9, 4], [62, 413, 12, 8, 9, 4], [62, 464, 12, 8, 9, 4], [62, 517, 10, 6, 7, 6], [62, 568, 10, 8, 7, 6], [62, 618, 12, 7, 9, 5], [62, 670, 12, 5, 9, 6], [62, 720, 11, 7, 9, 5], [62, 770, 11, 8, 8, 4], [123, 5, 13, 8, 9, 4], [123, 56, 13, 8, 11, 4], [123, 107, 13, 8, 10, 4], [123, 158, 14, 8, 10, 4], [123, 209, 12, 8, 10, 4], [123, 260, 14, 8, 10, 4], [123, 311, 14, 8, 11, 4], [123, 362, 14, 8, 10, 4], [123, 413, 16, 8, 11, 4], [123, 464, 12, 8, 7, 4], [123, 515, 13, 8, 10, 4], [123, 566, 15, 8, 11, 4], [123, 617, 12, 8, 10, 4], [123, 668, 16, 8, 12, 4], [123, 719, 16, 8, 11, 4], [123, 770, 14, 8, 11, 4], [184, 5, 15, 8, 11, 4], [184, 56, 14, 8, 11, 4], [184, 107, 12, 8, 9, 4], [184, 158, 13, 8, 9, 4], [184, 209, 14, 8, 10, 4], [184, 260, 14, 8, 10, 4], [184, 312, 11, 9, 8, 5], [184, 362, 14, 8, 11, 4], [184, 413, 14, 8, 10, 4], [184, 464, 16, 8, 11, 4], [184, 515, 14, 8, 10, 4], [184, 566, 11, 10, 7, 4], [184, 619, 12, 6, 12, 6], [184, 668, 11, 10, 7, 4], [184, 719, 12, 8, 10, 4], [184, 777, 10, 3, 9, 11], [245, 3, 13, 3, 8, 2], [245, 58, 13, 6, 10, 6], [245, 107, 12, 9, 9, 4], [245, 160, 13, 8, 9, 6], [245, 208, 12, 9, 9, 3], [245, 261, 11, 7, 8, 5], [245, 310, 13, 11, 9, 3], [245, 364, 12, 8, 8, 6], [245, 415, 12, 8, 10, 6], [245, 465, 10, 7, 7, 5], [245, 516, 13, 9, 10, 5], [245, 568, 12, 6, 9, 6], [245, 617, 11, 8, 9, 4], [245, 670, 12, 8, 9, 6], [245, 721, 12, 6, 9, 6], [245, 772, 11, 6, 9, 6], [306, 7, 13, 6, 9, 6], [306, 56, 12, 8, 9, 4], [306, 109, 11, 8, 9, 6], [306, 160, 13, 6, 9, 6], [306, 210, 11, 7, 8, 5], [306, 262, 12, 6, 9, 6], [306, 312, 14, 7, 10, 5], [306, 363, 13, 7, 10, 5], [306, 412, 13, 11, 9, 3], [306, 465, 13, 9, 10, 5], [306, 514, 13, 11, 9, 3], [306, 565, 12, 11, 8, 3], [306, 616, 10, 11, 6, 3], [306, 667, 11, 11, 8, 3], [306, 721, 12, 4, 9, 6], [306, 766, 1, 1, 3, 1], [367, 2, 10, 11, 5, 1], [367, 53, 10, 11, 5, 1], [367, 104, 10, 11, 5, 1], [367, 155, 10, 11, 5, 1], [367, 206, 10, 11, 5, 1], [367, 257, 10, 11, 5, 1], [367, 308, 10, 11, 5, 1], [367, 359, 10, 11, 5, 1], [367, 410, 10, 11, 5, 1], [367, 461, 10, 11, 5, 1], [367, 512, 10, 11, 5, 1], [367, 563, 10, 11, 5, 1], [367, 614, 10, 11, 5, 1], [367, 665, 10, 11, 5, 1], [367, 716, 10, 11, 5, 1], [367, 767, 10, 11, 5, 1], [428, 2, 10, 11, 5, 1], [428, 53, 10, 11, 5, 1], [428, 104, 10, 11, 5, 1], [428, 155, 10, 11, 5, 1], [428, 206, 10, 11, 5, 1], [428, 257, 10, 11, 5, 1], [428, 308, 10, 11, 5, 1], [428, 359, 10, 11, 5, 1], [428, 410, 10, 11, 5, 1], [428, 461, 10, 11, 5, 1], [428, 512, 10, 11, 5, 1], [428, 563, 10, 11, 5, 1], [428, 614, 10, 11, 5, 1], [428, 665, 10, 11, 5, 1], [428, 716, 10, 11, 5, 1], [428, 767, 10, 11, 5, 1], [489, 2, 10, 11, 5, 1], [489, 56, 14, 8, 10, 4], [489, 107, 11, 4, 6, 4], [489, 158, 13, 8, 9, 4], [489, 209, 10, 8, 6, 4], [489, 262, 13, 5, 10, 6], [489, 311, 13, 10, 9, 4], [489, 363, 13, 7, 11, 5], [489, 414, 13, 7, 11, 5], [489, 465, 14, 7, 11, 5], [489, 516, 13, 7, 11, 5], [489, 568, 15, 7, 13, 6], [489, 619, 15, 7, 13, 6], [489, 666, 14, 11, 10, 2], [489, 721, 15, 7, 13, 6], [489, 768, 13, 10, 10, 2], [550, 5, 12, 5, 8, 4], [550, 56, 13, 8, 9, 4], [550, 107, 13, 4, 8, 4], [550, 158, 12, 8, 9, 4], [550, 210, 13, 7, 9, 5], [550, 262, 13, 5, 10, 6], [550, 311, 12, 8, 9, 4], [550, 364, 11, 5, 8, 6], [550, 414, 12, 7, 9, 5], [550, 465, 12, 7, 9, 5], [550, 516, 12, 7, 9, 5], [550, 567, 12, 7, 9, 5], [550, 622, 14, 3, 13, 9], [550, 664, 14, 15, 10, 0], [550, 723, 15, 3, 12, 8], [550, 769, 14, 9, 10, 3], [611, 5, 15, 8, 11, 4], [611, 55, 14, 9, 10, 3], [611, 106, 15, 9, 11, 3], [611, 158, 16, 10, 13, 4], [611, 210, 14, 7, 11, 5], [611, 261, 14, 7, 11, 5], [611, 311, 14, 8, 11, 4], [611, 363, 14, 7, 11, 5], [611, 414, 14, 7, 11, 5], [611, 465, 13, 7, 10, 5], [611, 511, 1, 1, 10, 1], [611, 566, 14, 9, 10, 4], [611, 618, 13, 7, 10, 5], [611, 669, 13, 9, 10, 5], [611, 720, 13, 7, 10, 5], [611, 770, 14, 9, 10, 4], [672, 5, 15, 8, 11, 4], [672, 56, 14, 8, 10, 4], [672, 107, 14, 8, 11, 4], [672, 158, 14, 8, 11, 4], [672, 209, 15, 5, 12, 4], [672, 259, 16, 10, 12, 3], [672, 309, 14, 10, 9, 2], [672, 365, 10, 3, 9, 7], [672, 416, 12, 4, 10, 7], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 567, 15, 7, 13, 5], [672, 618, 16, 7, 13, 5], [672, 666, 14, 11, 9, 2], [672, 720, 15, 7, 13, 5], [672, 767, 14, 11, 9, 1], [733, 5, 11, 8, 8, 4], [733, 55, 12, 11, 8, 3], [733, 107, 14, 8, 11, 4], [733, 158, 14, 8, 11, 4], [733, 209, 15, 5, 11, 4], [733, 260, 14, 9, 10, 4], [733, 308, 13, 14, 8, 1], [733, 358, 12, 15, 8, 0], [733, 409, 12, 15, 8, 0], [733, 461, 13, 14, 8, 1], [733, 511, 12, 15, 8, 0], [733, 562, 12, 14, 8, 0], [733, 614, 13, 14, 8, 1], [733, 664, 13, 15, 8, 0], [733, 715, 13, 14, 8, 0], [733, 766, 13, 15, 8, 0], [1, 1, 1, 1, 7, 1], [794, 55, 10, 11, 8, 3], [794, 105, 11, 13, 6, 2], [794, 156, 15, 13, 10, 2], [794, 205, 15, 15, 10, 0], [794, 256, 15, 14, 10, 0], [794, 308, 12, 14, 7, 1], [794, 358, 12, 15, 7, 0], [794, 409, 12, 15, 7, 0], [794, 461, 12, 14, 7, 1], [794, 511, 12, 15, 7, 0], [794, 562, 12, 14, 7, 0], [794, 614, 13, 14, 8, 1], [794, 664, 13, 15, 8, 0], [794, 715, 13, 14, 8, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 11, \"widestlogicalchar\": 13, \"widestglyph\": 16, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_+b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 56, 10, 6, 6, 4], [1, 107, 14, 6, 10, 4], [1, 158, 12, 6, 8, 4], [1, 209, 12, 6, 8, 4], [1, 260, 14, 6, 10, 4], [1, 311, 12, 6, 10, 4], [1, 363, 10, 5, 7, 5], [1, 413, 10, 8, 6, 4], [1, 464, 9, 8, 6, 4], [1, 515, 11, 4, 8, 4], [1, 567, 11, 5, 8, 5], [1, 622, 7, 3, 6, 9], [1, 671, 10, 1, 8, 7], [1, 724, 7, 1, 6, 9], [1, 770, 10, 6, 6, 4], [62, 5, 11, 6, 8, 4], [62, 56, 11, 6, 8, 4], [62, 107, 11, 6, 8, 4], [62, 158, 11, 6, 8, 4], [62, 209, 11, 6, 8, 4], [62, 260, 12, 6, 8, 4], [62, 311, 11, 6, 8, 4], [62, 362, 12, 6, 8, 4], [62, 413, 11, 6, 8, 4], [62, 464, 11, 6, 8, 4], [62, 517, 9, 4, 6, 6], [62, 568, 9, 6, 6, 6], [62, 618, 11, 5, 8, 5], [62, 670, 11, 3, 8, 6], [62, 720, 10, 5, 8, 5], [62, 770, 10, 6, 7, 4], [123, 5, 12, 6, 8, 4], [123, 56, 12, 6, 10, 4], [123, 107, 12, 6, 9, 4], [123, 158, 13, 6, 9, 4], [123, 209, 11, 6, 9, 4], [123, 260, 13, 6, 9, 4], [123, 311, 13, 6, 10, 4], [123, 362, 13, 6, 9, 4], [123, 413, 15, 6, 10, 4], [123, 464, 11, 6, 6, 4], [123, 515, 12, 6, 9, 4], [123, 566, 14, 6, 10, 4], [123, 617, 11, 6, 9, 4], [123, 668, 15, 6, 11, 4], [123, 719, 15, 6, 10, 4], [123, 770, 13, 6, 10, 4], [184, 5, 14, 6, 10, 4], [184, 56, 13, 6, 10, 4], [184, 107, 11, 6, 8, 4], [184, 158, 12, 6, 8, 4], [184, 209, 13, 6, 9, 4], [184, 260, 13, 6, 9, 4], [184, 312, 10, 7, 7, 5], [184, 362, 13, 6, 10, 4], [184, 413, 13, 6, 9, 4], [184, 464, 15, 6, 10, 4], [184, 515, 13, 6, 9, 4], [184, 566, 10, 8, 6, 4], [184, 619, 11, 4, 11, 6], [184, 668, 10, 8, 6, 4], [184, 719, 11, 6, 9, 4], [184, 777, 9, 1, 8, 11], [245, 3, 12, 1, 7, 2], [245, 58, 12, 4, 9, 6], [245, 107, 11, 7, 8, 4], [245, 160, 12, 6, 8, 6], [245, 208, 11, 7, 8, 3], [245, 261, 10, 5, 7, 5], [245, 310, 12, 9, 8, 3], [245, 364, 11, 6, 7, 6], [245, 415, 11, 6, 9, 6], [245, 465, 9, 5, 6, 5], [245, 516, 12, 7, 9, 5], [245, 568, 11, 4, 8, 6], [245, 617, 10, 6, 8, 4], [245, 670, 11, 6, 8, 6], [245, 721, 11, 4, 8, 6], [245, 772, 10, 4, 8, 6], [306, 7, 12, 4, 8, 6], [306, 56, 11, 6, 8, 4], [306, 109, 10, 6, 8, 6], [306, 160, 12, 4, 8, 6], [306, 210, 10, 5, 7, 5], [306, 262, 11, 4, 8, 6], [306, 312, 13, 5, 9, 5], [306, 363, 12, 5, 9, 5], [306, 412, 12, 9, 8, 3], [306, 465, 12, 7, 9, 5], [306, 514, 12, 9, 8, 3], [306, 565, 11, 9, 7, 3], [306, 616, 9, 9, 5, 3], [306, 667, 10, 9, 7, 3], [306, 721, 11, 2, 8, 6], [306, 766, 1, 1, 3, 1], [367, 2, 9, 9, 4, 1], [367, 53, 9, 9, 4, 1], [367, 104, 9, 9, 4, 1], [367, 155, 9, 9, 4, 1], [367, 206, 9, 9, 4, 1], [367, 257, 9, 9, 4, 1], [367, 308, 9, 9, 4, 1], [367, 359, 9, 9, 4, 1], [367, 410, 9, 9, 4, 1], [367, 461, 9, 9, 4, 1], [367, 512, 9, 9, 4, 1], [367, 563, 9, 9, 4, 1], [367, 614, 9, 9, 4, 1], [367, 665, 9, 9, 4, 1], [367, 716, 9, 9, 4, 1], [367, 767, 9, 9, 4, 1], [428, 2, 9, 9, 4, 1], [428, 53, 9, 9, 4, 1], [428, 104, 9, 9, 4, 1], [428, 155, 9, 9, 4, 1], [428, 206, 9, 9, 4, 1], [428, 257, 9, 9, 4, 1], [428, 308, 9, 9, 4, 1], [428, 359, 9, 9, 4, 1], [428, 410, 9, 9, 4, 1], [428, 461, 9, 9, 4, 1], [428, 512, 9, 9, 4, 1], [428, 563, 9, 9, 4, 1], [428, 614, 9, 9, 4, 1], [428, 665, 9, 9, 4, 1], [428, 716, 9, 9, 4, 1], [428, 767, 9, 9, 4, 1], [489, 2, 9, 9, 4, 1], [489, 56, 13, 6, 9, 4], [489, 107, 10, 2, 5, 4], [489, 158, 12, 6, 8, 4], [489, 209, 9, 6, 5, 4], [489, 262, 12, 3, 9, 6], [489, 311, 12, 8, 8, 4], [489, 363, 12, 5, 10, 5], [489, 414, 12, 5, 10, 5], [489, 465, 13, 5, 10, 5], [489, 516, 12, 5, 10, 5], [489, 568, 14, 5, 12, 6], [489, 619, 14, 5, 12, 6], [489, 666, 13, 9, 9, 2], [489, 721, 14, 5, 12, 6], [489, 768, 12, 8, 9, 2], [550, 5, 11, 3, 7, 4], [550, 56, 12, 6, 8, 4], [550, 107, 12, 2, 7, 4], [550, 158, 11, 6, 8, 4], [550, 210, 12, 5, 8, 5], [550, 262, 12, 3, 9, 6], [550, 311, 11, 6, 8, 4], [550, 364, 10, 3, 7, 6], [550, 414, 11, 5, 8, 5], [550, 465, 11, 5, 8, 5], [550, 516, 11, 5, 8, 5], [550, 567, 11, 5, 8, 5], [550, 622, 13, 1, 12, 9], [550, 664, 12, 13, 9, 0], [550, 723, 14, 1, 11, 8], [550, 769, 13, 7, 9, 3], [611, 5, 14, 6, 10, 4], [611, 55, 13, 7, 9, 3], [611, 106, 14, 7, 10, 3], [611, 158, 15, 8, 12, 4], [611, 210, 13, 5, 10, 5], [611, 261, 13, 5, 10, 5], [611, 311, 13, 6, 10, 4], [611, 363, 13, 5, 10, 5], [611, 414, 13, 5, 10, 5], [611, 465, 12, 5, 9, 5], [611, 511, 1, 1, 9, 1], [611, 566, 13, 7, 9, 4], [611, 618, 12, 5, 9, 5], [611, 669, 12, 7, 9, 5], [611, 720, 12, 5, 9, 5], [611, 770, 13, 7, 9, 4], [672, 5, 14, 6, 10, 4], [672, 56, 13, 6, 9, 4], [672, 107, 13, 6, 10, 4], [672, 158, 13, 6, 10, 4], [672, 209, 14, 3, 11, 4], [672, 259, 15, 8, 11, 3], [672, 309, 13, 8, 8, 2], [672, 365, 9, 1, 8, 7], [672, 416, 11, 2, 9, 7], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 567, 14, 5, 12, 5], [672, 618, 15, 5, 12, 5], [672, 666, 13, 9, 8, 2], [672, 720, 14, 5, 12, 5], [672, 767, 13, 9, 8, 1], [733, 5, 10, 6, 7, 4], [733, 55, 11, 9, 7, 3], [733, 107, 13, 6, 10, 4], [733, 158, 13, 6, 10, 4], [733, 209, 14, 3, 10, 4], [733, 260, 13, 7, 9, 4], [733, 308, 12, 12, 7, 1], [733, 358, 10, 13, 7, 0], [733, 409, 10, 13, 7, 0], [733, 461, 12, 12, 7, 1], [733, 511, 10, 13, 7, 0], [733, 562, 10, 12, 7, 0], [733, 614, 12, 12, 7, 1], [733, 664, 11, 13, 7, 0], [733, 715, 11, 12, 7, 0], [733, 766, 12, 13, 7, 0], [1, 1, 1, 1, 6, 1], [794, 55, 9, 9, 7, 3], [794, 105, 10, 11, 5, 2], [794, 156, 14, 11, 9, 2], [794, 205, 13, 13, 9, 0], [794, 256, 13, 12, 9, 0], [794, 308, 11, 12, 6, 1], [794, 359, 11, 12, 6, 1], [794, 410, 11, 12, 6, 1], [794, 461, 11, 12, 6, 1], [794, 512, 11, 12, 6, 1], [794, 563, 11, 11, 6, 1], [794, 614, 12, 12, 7, 1], [794, 664, 12, 13, 7, 0], [794, 715, 12, 12, 7, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 15, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_+biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 56, 7, 8, 7, 4], [1, 107, 11, 8, 11, 4], [1, 158, 9, 8, 9, 4], [1, 209, 9, 8, 9, 4], [1, 260, 11, 8, 11, 4], [1, 311, 11, 8, 11, 4], [1, 363, 8, 7, 8, 5], [1, 413, 7, 10, 7, 4], [1, 464, 7, 10, 7, 4], [1, 515, 9, 7, 9, 4], [1, 567, 9, 7, 9, 5], [1, 618, 7, 9, 7, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 7, 7, 5], [1, 770, 7, 8, 7, 4], [62, 5, 9, 8, 9, 4], [62, 56, 9, 8, 9, 4], [62, 107, 9, 8, 9, 4], [62, 158, 9, 8, 9, 4], [62, 209, 9, 8, 9, 4], [62, 260, 9, 8, 9, 4], [62, 311, 9, 8, 9, 4], [62, 362, 9, 8, 9, 4], [62, 413, 9, 8, 9, 4], [62, 464, 9, 8, 9, 4], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 618, 9, 7, 9, 5], [62, 669, 9, 6, 9, 5], [62, 720, 9, 7, 9, 5], [62, 770, 8, 8, 8, 4], [123, 5, 9, 8, 9, 4], [123, 56, 11, 8, 11, 4], [123, 107, 10, 8, 10, 4], [123, 158, 10, 8, 10, 4], [123, 209, 10, 8, 10, 4], [123, 260, 10, 8, 10, 4], [123, 311, 11, 8, 11, 4], [123, 362, 10, 8, 10, 4], [123, 413, 11, 8, 11, 4], [123, 464, 7, 8, 7, 4], [123, 515, 10, 8, 10, 4], [123, 566, 11, 8, 11, 4], [123, 617, 10, 8, 10, 4], [123, 668, 12, 8, 12, 4], [123, 719, 11, 8, 11, 4], [123, 770, 11, 8, 11, 4], [184, 5, 11, 8, 11, 4], [184, 56, 11, 8, 11, 4], [184, 107, 9, 8, 9, 4], [184, 158, 9, 8, 9, 4], [184, 209, 10, 8, 10, 4], [184, 260, 10, 8, 10, 4], [184, 312, 8, 9, 8, 5], [184, 362, 11, 8, 11, 4], [184, 413, 10, 8, 10, 4], [184, 464, 11, 8, 11, 4], [184, 515, 10, 8, 10, 4], [184, 566, 7, 10, 7, 4], [184, 618, 12, 7, 12, 5], [184, 668, 7, 10, 7, 4], [184, 719, 10, 8, 10, 4], [184, 771, 9, 9, 9, 5], [245, 3, 8, 9, 8, 2], [245, 57, 10, 7, 10, 5], [245, 107, 9, 9, 9, 4], [245, 159, 9, 9, 9, 5], [245, 208, 9, 9, 9, 3], [245, 261, 8, 7, 8, 5], [245, 310, 9, 11, 9, 3], [245, 363, 8, 9, 8, 5], [245, 414, 10, 9, 10, 5], [245, 465, 7, 7, 7, 5], [245, 516, 10, 9, 10, 5], [245, 567, 9, 7, 9, 5], [245, 617, 9, 8, 9, 4], [245, 669, 9, 9, 9, 5], [245, 720, 9, 7, 9, 5], [245, 771, 9, 7, 9, 5], [306, 6, 9, 7, 9, 5], [306, 56, 9, 8, 9, 4], [306, 108, 9, 9, 9, 5], [306, 159, 9, 7, 9, 5], [306, 210, 8, 7, 8, 5], [306, 261, 9, 7, 9, 5], [306, 312, 10, 7, 10, 5], [306, 363, 10, 7, 10, 5], [306, 412, 9, 11, 9, 3], [306, 465, 10, 9, 10, 5], [306, 514, 9, 11, 9, 3], [306, 565, 8, 11, 8, 3], [306, 616, 6, 11, 6, 3], [306, 667, 8, 11, 8, 3], [306, 720, 9, 6, 9, 5], [306, 771, 3, 6, 3, 5], [367, 2, 5, 11, 5, 1], [367, 53, 5, 11, 5, 1], [367, 104, 5, 11, 5, 1], [367, 155, 5, 11, 5, 1], [367, 206, 5, 11, 5, 1], [367, 257, 5, 11, 5, 1], [367, 308, 5, 11, 5, 1], [367, 359, 5, 11, 5, 1], [367, 410, 5, 11, 5, 1], [367, 461, 5, 11, 5, 1], [367, 512, 5, 11, 5, 1], [367, 563, 5, 11, 5, 1], [367, 614, 5, 11, 5, 1], [367, 665, 5, 11, 5, 1], [367, 716, 5, 11, 5, 1], [367, 767, 5, 11, 5, 1], [428, 2, 5, 11, 5, 1], [428, 53, 5, 11, 5, 1], [428, 104, 5, 11, 5, 1], [428, 155, 5, 11, 5, 1], [428, 206, 5, 11, 5, 1], [428, 257, 5, 11, 5, 1], [428, 308, 5, 11, 5, 1], [428, 359, 5, 11, 5, 1], [428, 410, 5, 11, 5, 1], [428, 461, 5, 11, 5, 1], [428, 512, 5, 11, 5, 1], [428, 563, 5, 11, 5, 1], [428, 614, 5, 11, 5, 1], [428, 665, 5, 11, 5, 1], [428, 716, 5, 11, 5, 1], [428, 767, 5, 11, 5, 1], [489, 2, 5, 11, 5, 1], [489, 56, 10, 8, 10, 4], [489, 107, 6, 7, 6, 4], [489, 158, 9, 8, 9, 4], [489, 209, 6, 8, 6, 4], [489, 261, 10, 6, 10, 5], [489, 311, 9, 10, 9, 4], [489, 363, 11, 7, 11, 5], [489, 414, 11, 7, 11, 5], [489, 465, 11, 7, 11, 5], [489, 516, 11, 7, 11, 5], [489, 567, 13, 8, 13, 5], [489, 618, 13, 8, 13, 5], [489, 666, 10, 11, 10, 2], [489, 720, 13, 8, 13, 5], [489, 768, 10, 10, 10, 2], [550, 5, 8, 7, 8, 4], [550, 56, 9, 8, 9, 4], [550, 107, 8, 7, 8, 4], [550, 158, 9, 8, 9, 4], [550, 210, 9, 7, 9, 5], [550, 261, 10, 6, 10, 5], [550, 311, 9, 8, 9, 4], [550, 363, 8, 6, 8, 5], [550, 414, 9, 7, 9, 5], [550, 465, 9, 7, 9, 5], [550, 516, 9, 7, 9, 5], [550, 567, 9, 7, 9, 5], [550, 618, 13, 7, 13, 5], [550, 664, 10, 15, 10, 0], [550, 720, 12, 6, 12, 5], [550, 769, 10, 9, 10, 3], [611, 5, 11, 8, 11, 4], [611, 55, 10, 9, 10, 3], [611, 106, 11, 9, 11, 3], [611, 158, 13, 10, 13, 4], [611, 210, 11, 7, 11, 5], [611, 261, 11, 7, 11, 5], [611, 311, 11, 8, 11, 4], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 10, 7, 10, 5], [611, 516, 10, 9, 10, 5], [611, 566, 10, 9, 10, 4], [611, 618, 10, 7, 10, 5], [611, 669, 10, 9, 10, 5], [611, 720, 10, 7, 10, 5], [611, 770, 10, 9, 10, 4], [672, 5, 11, 8, 11, 4], [672, 56, 10, 8, 10, 4], [672, 107, 11, 8, 11, 4], [672, 158, 11, 8, 11, 4], [672, 209, 12, 7, 12, 4], [672, 259, 12, 10, 12, 3], [672, 309, 9, 10, 9, 2], [672, 363, 9, 6, 9, 5], [672, 414, 10, 6, 10, 5], [1, 6, 7, 6, 7, 5], [794, 771, 3, 6, 3, 5], [672, 567, 13, 7, 13, 5], [672, 618, 13, 7, 13, 5], [672, 666, 9, 11, 9, 2], [672, 720, 13, 7, 13, 5], [672, 767, 9, 11, 9, 1], [733, 5, 8, 8, 8, 4], [733, 55, 8, 11, 8, 3], [733, 107, 11, 8, 11, 4], [733, 158, 11, 8, 11, 4], [733, 209, 11, 7, 11, 4], [733, 260, 10, 9, 10, 4], [733, 308, 8, 14, 8, 1], [733, 358, 8, 15, 8, 0], [733, 409, 8, 15, 8, 0], [733, 461, 8, 14, 8, 1], [733, 511, 8, 15, 8, 0], [733, 562, 8, 14, 8, 0], [733, 614, 8, 14, 8, 1], [733, 664, 8, 15, 8, 0], [733, 715, 8, 14, 8, 0], [733, 766, 8, 15, 8, 0], [1, 6, 7, 6, 7, 5], [794, 55, 8, 11, 8, 3], [794, 105, 6, 13, 6, 2], [794, 156, 10, 13, 10, 2], [794, 205, 10, 15, 10, 0], [794, 256, 10, 14, 10, 0], [794, 308, 7, 14, 7, 1], [794, 358, 7, 15, 7, 0], [794, 409, 7, 15, 7, 0], [794, 461, 7, 14, 7, 1], [794, 511, 7, 15, 7, 0], [794, 562, 7, 14, 7, 0], [794, 614, 8, 14, 8, 1], [794, 664, 8, 15, 8, 0], [794, 715, 8, 14, 8, 0], [794, 771, 3, 6, 3, 5], [855, 6, 3, 6, 3, 5], [855, 57, 3, 6, 3, 5], [855, 108, 3, 6, 3, 5], [855, 159, 3, 6, 3, 5], [855, 210, 3, 6, 3, 5], [855, 261, 3, 6, 3, 5], [855, 312, 3, 6, 3, 5], [855, 363, 3, 6, 3, 5], [855, 414, 3, 6, 3, 5], [855, 465, 3, 6, 3, 5], [855, 516, 3, 6, 3, 5], [855, 567, 3, 6, 3, 5], [855, 618, 3, 6, 3, 5], [855, 669, 3, 6, 3, 5], [855, 720, 3, 6, 3, 5], [855, 771, 3, 6, 3, 5]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_+biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 56, 6, 6, 6, 4], [1, 107, 10, 6, 10, 4], [1, 158, 8, 6, 8, 4], [1, 209, 8, 6, 8, 4], [1, 260, 10, 6, 10, 4], [1, 311, 10, 6, 10, 4], [1, 362, 7, 6, 7, 4], [1, 413, 6, 8, 6, 4], [1, 464, 6, 8, 6, 4], [1, 515, 8, 6, 8, 4], [1, 566, 8, 6, 8, 4], [1, 617, 6, 8, 6, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 770, 6, 6, 6, 4], [62, 5, 8, 6, 8, 4], [62, 56, 8, 6, 8, 4], [62, 107, 8, 6, 8, 4], [62, 158, 8, 6, 8, 4], [62, 209, 8, 6, 8, 4], [62, 260, 8, 6, 8, 4], [62, 311, 8, 6, 8, 4], [62, 362, 8, 6, 8, 4], [62, 413, 8, 6, 8, 4], [62, 464, 8, 6, 8, 4], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 8, 6, 8, 4], [62, 668, 8, 6, 8, 4], [62, 719, 8, 6, 8, 4], [62, 770, 7, 6, 7, 4], [123, 5, 8, 6, 8, 4], [123, 56, 10, 6, 10, 4], [123, 107, 9, 6, 9, 4], [123, 158, 9, 6, 9, 4], [123, 209, 9, 6, 9, 4], [123, 260, 9, 6, 9, 4], [123, 311, 10, 6, 10, 4], [123, 362, 9, 6, 9, 4], [123, 413, 10, 6, 10, 4], [123, 464, 6, 6, 6, 4], [123, 515, 9, 6, 9, 4], [123, 566, 10, 6, 10, 4], [123, 617, 9, 6, 9, 4], [123, 668, 11, 6, 11, 4], [123, 719, 10, 6, 10, 4], [123, 770, 10, 6, 10, 4], [184, 5, 10, 6, 10, 4], [184, 56, 10, 6, 10, 4], [184, 107, 8, 6, 8, 4], [184, 158, 8, 6, 8, 4], [184, 209, 9, 6, 9, 4], [184, 260, 9, 6, 9, 4], [184, 311, 7, 8, 7, 4], [184, 362, 10, 6, 10, 4], [184, 413, 9, 6, 9, 4], [184, 464, 10, 6, 10, 4], [184, 515, 9, 6, 9, 4], [184, 566, 6, 8, 6, 4], [184, 617, 11, 6, 11, 4], [184, 668, 6, 8, 6, 4], [184, 719, 9, 6, 9, 4], [184, 770, 8, 8, 8, 4], [245, 3, 7, 8, 7, 2], [245, 56, 9, 6, 9, 4], [245, 107, 8, 7, 8, 4], [245, 158, 8, 8, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 7, 6, 7, 4], [245, 310, 8, 9, 8, 3], [245, 362, 7, 8, 7, 4], [245, 413, 9, 8, 9, 4], [245, 464, 6, 6, 6, 4], [245, 515, 9, 8, 9, 4], [245, 566, 8, 6, 8, 4], [245, 617, 8, 6, 8, 4], [245, 668, 8, 8, 8, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 6, 8, 4], [306, 56, 8, 6, 8, 4], [306, 107, 8, 8, 8, 4], [306, 158, 8, 6, 8, 4], [306, 209, 7, 6, 7, 4], [306, 260, 8, 6, 8, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 412, 8, 9, 8, 3], [306, 464, 9, 8, 9, 4], [306, 514, 8, 9, 8, 3], [306, 565, 7, 9, 7, 3], [306, 616, 5, 9, 5, 3], [306, 667, 7, 9, 7, 3], [306, 719, 8, 6, 8, 4], [306, 770, 3, 6, 3, 4], [367, 2, 4, 9, 4, 1], [367, 53, 4, 9, 4, 1], [367, 104, 4, 9, 4, 1], [367, 155, 4, 9, 4, 1], [367, 206, 4, 9, 4, 1], [367, 257, 4, 9, 4, 1], [367, 308, 4, 9, 4, 1], [367, 359, 4, 9, 4, 1], [367, 410, 4, 9, 4, 1], [367, 461, 4, 9, 4, 1], [367, 512, 4, 9, 4, 1], [367, 563, 4, 9, 4, 1], [367, 614, 4, 9, 4, 1], [367, 665, 4, 9, 4, 1], [367, 716, 4, 9, 4, 1], [367, 767, 4, 9, 4, 1], [428, 2, 4, 9, 4, 1], [428, 53, 4, 9, 4, 1], [428, 104, 4, 9, 4, 1], [428, 155, 4, 9, 4, 1], [428, 206, 4, 9, 4, 1], [428, 257, 4, 9, 4, 1], [428, 308, 4, 9, 4, 1], [428, 359, 4, 9, 4, 1], [428, 410, 4, 9, 4, 1], [428, 461, 4, 9, 4, 1], [428, 512, 4, 9, 4, 1], [428, 563, 4, 9, 4, 1], [428, 614, 4, 9, 4, 1], [428, 665, 4, 9, 4, 1], [428, 716, 4, 9, 4, 1], [428, 767, 4, 9, 4, 1], [489, 2, 4, 9, 4, 1], [489, 56, 9, 6, 9, 4], [489, 107, 5, 6, 5, 4], [489, 158, 8, 6, 8, 4], [489, 209, 5, 6, 5, 4], [489, 260, 9, 6, 9, 4], [489, 311, 8, 8, 8, 4], [489, 362, 10, 6, 10, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 10, 6, 10, 4], [489, 566, 12, 7, 12, 4], [489, 617, 12, 7, 12, 4], [489, 666, 9, 9, 9, 2], [489, 719, 12, 7, 12, 4], [489, 768, 9, 8, 9, 2], [550, 5, 7, 6, 7, 4], [550, 56, 8, 6, 8, 4], [550, 107, 7, 6, 7, 4], [550, 158, 8, 6, 8, 4], [550, 209, 8, 6, 8, 4], [550, 260, 9, 6, 9, 4], [550, 311, 8, 6, 8, 4], [550, 362, 7, 6, 7, 4], [550, 413, 8, 6, 8, 4], [550, 464, 8, 6, 8, 4], [550, 515, 8, 6, 8, 4], [550, 566, 8, 6, 8, 4], [550, 617, 12, 6, 12, 4], [550, 664, 9, 13, 9, 0], [550, 719, 11, 6, 11, 4], [550, 769, 9, 7, 9, 3], [611, 5, 10, 6, 10, 4], [611, 55, 9, 7, 9, 3], [611, 106, 10, 7, 10, 3], [611, 158, 12, 8, 12, 4], [611, 209, 10, 6, 10, 4], [611, 260, 10, 6, 10, 4], [611, 311, 10, 6, 10, 4], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 8, 9, 4], [611, 566, 9, 7, 9, 4], [611, 617, 9, 6, 9, 4], [611, 668, 9, 8, 9, 4], [611, 719, 9, 6, 9, 4], [611, 770, 9, 7, 9, 4], [672, 5, 10, 6, 10, 4], [672, 56, 9, 6, 9, 4], [672, 107, 10, 6, 10, 4], [672, 158, 10, 6, 10, 4], [672, 209, 11, 6, 11, 4], [672, 259, 11, 8, 11, 3], [672, 309, 8, 8, 8, 2], [672, 362, 8, 6, 8, 4], [672, 413, 9, 6, 9, 4], [1, 5, 6, 6, 6, 4], [794, 770, 3, 6, 3, 4], [672, 566, 12, 6, 12, 4], [672, 617, 12, 6, 12, 4], [672, 666, 8, 9, 8, 2], [672, 719, 12, 6, 12, 4], [672, 767, 8, 9, 8, 1], [733, 5, 7, 6, 7, 4], [733, 55, 7, 9, 7, 3], [733, 107, 10, 6, 10, 4], [733, 158, 10, 6, 10, 4], [733, 209, 10, 6, 10, 4], [733, 260, 9, 7, 9, 4], [733, 308, 7, 12, 7, 1], [733, 358, 7, 13, 7, 0], [733, 409, 7, 13, 7, 0], [733, 461, 7, 12, 7, 1], [733, 511, 7, 13, 7, 0], [733, 562, 7, 12, 7, 0], [733, 614, 7, 12, 7, 1], [733, 664, 7, 13, 7, 0], [733, 715, 7, 12, 7, 0], [733, 766, 7, 13, 7, 0], [1, 5, 6, 6, 6, 4], [794, 55, 7, 9, 7, 3], [794, 105, 5, 11, 5, 2], [794, 156, 9, 11, 9, 2], [794, 205, 9, 13, 9, 0], [794, 256, 9, 12, 9, 0], [794, 308, 6, 12, 6, 1], [794, 358, 6, 13, 6, 0], [794, 409, 6, 13, 6, 0], [794, 461, 6, 12, 6, 1], [794, 511, 6, 13, 6, 0], [794, 562, 6, 12, 6, 0], [794, 614, 7, 12, 7, 1], [794, 664, 7, 13, 7, 0], [794, 715, 7, 12, 7, 0], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_b+iu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 1, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 7, 1], [1, 56, 10, 8, 7, 4], [1, 107, 14, 8, 11, 4], [1, 158, 12, 8, 9, 4], [1, 209, 12, 8, 9, 4], [1, 260, 14, 8, 11, 4], [1, 311, 12, 8, 11, 4], [1, 363, 10, 7, 8, 5], [1, 413, 10, 10, 7, 4], [1, 464, 9, 10, 7, 4], [1, 515, 11, 6, 9, 4], [1, 567, 11, 7, 9, 5], [1, 622, 7, 5, 7, 9], [1, 671, 10, 3, 9, 7], [1, 724, 7, 3, 7, 9], [1, 770, 10, 8, 7, 4], [62, 5, 11, 8, 9, 4], [62, 56, 11, 8, 9, 4], [62, 107, 11, 8, 9, 4], [62, 158, 11, 8, 9, 4], [62, 209, 11, 8, 9, 4], [62, 260, 12, 8, 9, 4], [62, 311, 11, 8, 9, 4], [62, 362, 12, 8, 9, 4], [62, 413, 11, 8, 9, 4], [62, 464, 11, 8, 9, 4], [62, 517, 9, 6, 7, 6], [62, 568, 9, 8, 7, 6], [62, 618, 11, 7, 9, 5], [62, 670, 11, 5, 9, 6], [62, 720, 10, 7, 9, 5], [62, 770, 10, 8, 8, 4], [123, 5, 12, 8, 9, 4], [123, 56, 12, 8, 11, 4], [123, 107, 12, 8, 10, 4], [123, 158, 13, 8, 10, 4], [123, 209, 11, 8, 10, 4], [123, 260, 13, 8, 10, 4], [123, 311, 13, 8, 11, 4], [123, 362, 13, 8, 10, 4], [123, 413, 15, 8, 11, 4], [123, 464, 11, 8, 7, 4], [123, 515, 12, 8, 10, 4], [123, 566, 14, 8, 11, 4], [123, 617, 11, 8, 10, 4], [123, 668, 15, 8, 12, 4], [123, 719, 15, 8, 11, 4], [123, 770, 13, 8, 11, 4], [184, 5, 14, 8, 11, 4], [184, 56, 13, 8, 11, 4], [184, 107, 11, 8, 9, 4], [184, 158, 12, 8, 9, 4], [184, 209, 13, 8, 10, 4], [184, 260, 13, 8, 10, 4], [184, 312, 10, 9, 8, 5], [184, 362, 13, 8, 11, 4], [184, 413, 13, 8, 10, 4], [184, 464, 15, 8, 11, 4], [184, 515, 13, 8, 10, 4], [184, 566, 10, 10, 7, 4], [184, 619, 11, 6, 12, 6], [184, 668, 10, 10, 7, 4], [184, 719, 11, 8, 10, 4], [184, 777, 9, 3, 9, 11], [245, 3, 12, 3, 8, 2], [245, 58, 12, 6, 10, 6], [245, 107, 11, 9, 9, 4], [245, 160, 12, 8, 9, 6], [245, 208, 11, 9, 9, 3], [245, 261, 10, 7, 8, 5], [245, 310, 12, 11, 9, 3], [245, 364, 11, 8, 8, 6], [245, 415, 11, 8, 10, 6], [245, 465, 9, 7, 7, 5], [245, 516, 12, 9, 10, 5], [245, 568, 11, 6, 9, 6], [245, 617, 10, 8, 9, 4], [245, 670, 11, 8, 9, 6], [245, 721, 11, 6, 9, 6], [245, 772, 10, 6, 9, 6], [306, 7, 12, 6, 9, 6], [306, 56, 11, 8, 9, 4], [306, 109, 10, 8, 9, 6], [306, 160, 12, 6, 9, 6], [306, 210, 10, 7, 8, 5], [306, 262, 11, 6, 9, 6], [306, 312, 13, 7, 10, 5], [306, 363, 12, 7, 10, 5], [306, 412, 12, 11, 9, 3], [306, 465, 12, 9, 10, 5], [306, 514, 12, 11, 9, 3], [306, 565, 11, 11, 8, 3], [306, 616, 9, 11, 6, 3], [306, 667, 10, 11, 8, 3], [306, 721, 11, 4, 9, 6], [306, 766, 1, 1, 3, 1], [367, 2, 9, 11, 5, 1], [367, 53, 9, 11, 5, 1], [367, 104, 9, 11, 5, 1], [367, 155, 9, 11, 5, 1], [367, 206, 9, 11, 5, 1], [367, 257, 9, 11, 5, 1], [367, 308, 9, 11, 5, 1], [367, 359, 9, 11, 5, 1], [367, 410, 9, 11, 5, 1], [367, 461, 9, 11, 5, 1], [367, 512, 9, 11, 5, 1], [367, 563, 9, 11, 5, 1], [367, 614, 9, 11, 5, 1], [367, 665, 9, 11, 5, 1], [367, 716, 9, 11, 5, 1], [367, 767, 9, 11, 5, 1], [428, 2, 9, 11, 5, 1], [428, 53, 9, 11, 5, 1], [428, 104, 9, 11, 5, 1], [428, 155, 9, 11, 5, 1], [428, 206, 9, 11, 5, 1], [428, 257, 9, 11, 5, 1], [428, 308, 9, 11, 5, 1], [428, 359, 9, 11, 5, 1], [428, 410, 9, 11, 5, 1], [428, 461, 9, 11, 5, 1], [428, 512, 9, 11, 5, 1], [428, 563, 9, 11, 5, 1], [428, 614, 9, 11, 5, 1], [428, 665, 9, 11, 5, 1], [428, 716, 9, 11, 5, 1], [428, 767, 9, 11, 5, 1], [489, 2, 9, 11, 5, 1], [489, 56, 13, 8, 10, 4], [489, 107, 10, 4, 6, 4], [489, 158, 12, 8, 9, 4], [489, 209, 9, 8, 6, 4], [489, 262, 12, 5, 10, 6], [489, 311, 12, 10, 9, 4], [489, 363, 12, 7, 11, 5], [489, 414, 12, 7, 11, 5], [489, 465, 13, 7, 11, 5], [489, 516, 12, 7, 11, 5], [489, 568, 14, 7, 13, 6], [489, 619, 14, 7, 13, 6], [489, 666, 13, 11, 10, 2], [489, 721, 14, 7, 13, 6], [489, 768, 12, 10, 10, 2], [550, 5, 11, 5, 8, 4], [550, 56, 12, 8, 9, 4], [550, 107, 12, 4, 8, 4], [550, 158, 11, 8, 9, 4], [550, 210, 12, 7, 9, 5], [550, 262, 12, 5, 10, 6], [550, 311, 11, 8, 9, 4], [550, 364, 10, 5, 8, 6], [550, 414, 11, 7, 9, 5], [550, 465, 11, 7, 9, 5], [550, 516, 11, 7, 9, 5], [550, 567, 11, 7, 9, 5], [550, 622, 13, 3, 13, 9], [550, 664, 13, 15, 10, 0], [550, 723, 14, 3, 12, 8], [550, 769, 13, 9, 10, 3], [611, 5, 14, 8, 11, 4], [611, 55, 13, 9, 10, 3], [611, 106, 14, 9, 11, 3], [611, 158, 15, 10, 13, 4], [611, 210, 13, 7, 11, 5], [611, 261, 13, 7, 11, 5], [611, 311, 13, 8, 11, 4], [611, 363, 13, 7, 11, 5], [611, 414, 13, 7, 11, 5], [611, 465, 12, 7, 10, 5], [611, 511, 1, 1, 10, 1], [611, 566, 13, 9, 10, 4], [611, 618, 12, 7, 10, 5], [611, 669, 12, 9, 10, 5], [611, 720, 12, 7, 10, 5], [611, 770, 13, 9, 10, 4], [672, 5, 14, 8, 11, 4], [672, 56, 13, 8, 10, 4], [672, 107, 13, 8, 11, 4], [672, 158, 13, 8, 11, 4], [672, 209, 14, 5, 12, 4], [672, 259, 15, 10, 12, 3], [672, 309, 13, 10, 9, 2], [672, 365, 9, 3, 9, 7], [672, 416, 11, 4, 10, 7], [1, 1, 1, 1, 7, 1], [794, 766, 1, 1, 3, 1], [672, 567, 14, 7, 13, 5], [672, 618, 15, 7, 13, 5], [672, 666, 13, 11, 9, 2], [672, 720, 14, 7, 13, 5], [672, 767, 13, 11, 9, 1], [733, 5, 10, 8, 8, 4], [733, 55, 11, 11, 8, 3], [733, 107, 13, 8, 11, 4], [733, 158, 13, 8, 11, 4], [733, 209, 14, 5, 11, 4], [733, 260, 13, 9, 10, 4], [733, 308, 12, 14, 8, 1], [733, 358, 11, 15, 8, 0], [733, 409, 11, 15, 8, 0], [733, 461, 12, 14, 8, 1], [733, 511, 11, 15, 8, 0], [733, 562, 11, 14, 8, 0], [733, 614, 12, 14, 8, 1], [733, 664, 12, 15, 8, 0], [733, 715, 12, 14, 8, 0], [733, 766, 12, 15, 8, 0], [1, 1, 1, 1, 7, 1], [794, 55, 9, 11, 8, 3], [794, 105, 10, 13, 6, 2], [794, 156, 14, 13, 10, 2], [794, 205, 14, 15, 10, 0], [794, 256, 14, 14, 10, 0], [794, 308, 11, 14, 7, 1], [794, 358, 11, 15, 7, 0], [794, 409, 11, 15, 7, 0], [794, 461, 11, 14, 7, 1], [794, 511, 11, 15, 7, 0], [794, 562, 11, 14, 7, 0], [794, 614, 12, 14, 8, 1], [794, 664, 12, 15, 8, 0], [794, 715, 12, 14, 8, 0], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 11, \"widestlogicalchar\": 13, \"widestglyph\": 15, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_b+iuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 1, 1, 1, 6, 1], [1, 56, 9, 6, 6, 4], [1, 107, 13, 6, 10, 4], [1, 158, 11, 6, 8, 4], [1, 209, 11, 6, 8, 4], [1, 260, 13, 6, 10, 4], [1, 311, 11, 6, 10, 4], [1, 363, 9, 5, 7, 5], [1, 413, 9, 8, 6, 4], [1, 464, 8, 8, 6, 4], [1, 515, 10, 4, 8, 4], [1, 567, 10, 5, 8, 5], [1, 622, 6, 3, 6, 9], [1, 671, 9, 1, 8, 7], [1, 724, 6, 1, 6, 9], [1, 770, 9, 6, 6, 4], [62, 5, 10, 6, 8, 4], [62, 56, 10, 6, 8, 4], [62, 107, 10, 6, 8, 4], [62, 158, 10, 6, 8, 4], [62, 209, 10, 6, 8, 4], [62, 260, 11, 6, 8, 4], [62, 311, 10, 6, 8, 4], [62, 362, 11, 6, 8, 4], [62, 413, 10, 6, 8, 4], [62, 464, 10, 6, 8, 4], [62, 517, 8, 4, 6, 6], [62, 568, 8, 6, 6, 6], [62, 618, 10, 5, 8, 5], [62, 670, 10, 3, 8, 6], [62, 720, 9, 5, 8, 5], [62, 770, 9, 6, 7, 4], [123, 5, 11, 6, 8, 4], [123, 56, 11, 6, 10, 4], [123, 107, 11, 6, 9, 4], [123, 158, 12, 6, 9, 4], [123, 209, 10, 6, 9, 4], [123, 260, 12, 6, 9, 4], [123, 311, 12, 6, 10, 4], [123, 362, 12, 6, 9, 4], [123, 413, 14, 6, 10, 4], [123, 464, 10, 6, 6, 4], [123, 515, 11, 6, 9, 4], [123, 566, 13, 6, 10, 4], [123, 617, 10, 6, 9, 4], [123, 668, 14, 6, 11, 4], [123, 719, 14, 6, 10, 4], [123, 770, 12, 6, 10, 4], [184, 5, 13, 6, 10, 4], [184, 56, 12, 6, 10, 4], [184, 107, 10, 6, 8, 4], [184, 158, 11, 6, 8, 4], [184, 209, 12, 6, 9, 4], [184, 260, 12, 6, 9, 4], [184, 312, 9, 7, 7, 5], [184, 362, 12, 6, 10, 4], [184, 413, 12, 6, 9, 4], [184, 464, 14, 6, 10, 4], [184, 515, 12, 6, 9, 4], [184, 566, 9, 8, 6, 4], [184, 619, 10, 4, 11, 6], [184, 668, 9, 8, 6, 4], [184, 719, 10, 6, 9, 4], [184, 777, 8, 1, 8, 11], [245, 3, 11, 1, 7, 2], [245, 58, 11, 4, 9, 6], [245, 107, 10, 7, 8, 4], [245, 160, 11, 6, 8, 6], [245, 208, 10, 7, 8, 3], [245, 261, 9, 5, 7, 5], [245, 310, 11, 9, 8, 3], [245, 364, 10, 6, 7, 6], [245, 415, 10, 6, 9, 6], [245, 465, 8, 5, 6, 5], [245, 516, 11, 7, 9, 5], [245, 568, 10, 4, 8, 6], [245, 617, 9, 6, 8, 4], [245, 670, 10, 6, 8, 6], [245, 721, 10, 4, 8, 6], [245, 772, 9, 4, 8, 6], [306, 7, 11, 4, 8, 6], [306, 56, 10, 6, 8, 4], [306, 109, 9, 6, 8, 6], [306, 160, 11, 4, 8, 6], [306, 210, 9, 5, 7, 5], [306, 262, 10, 4, 8, 6], [306, 312, 12, 5, 9, 5], [306, 363, 11, 5, 9, 5], [306, 412, 11, 9, 8, 3], [306, 465, 11, 7, 9, 5], [306, 514, 11, 9, 8, 3], [306, 565, 10, 9, 7, 3], [306, 616, 8, 9, 5, 3], [306, 667, 9, 9, 7, 3], [306, 721, 10, 2, 8, 6], [306, 766, 1, 1, 3, 1], [367, 2, 8, 9, 4, 1], [367, 53, 8, 9, 4, 1], [367, 104, 8, 9, 4, 1], [367, 155, 8, 9, 4, 1], [367, 206, 8, 9, 4, 1], [367, 257, 8, 9, 4, 1], [367, 308, 8, 9, 4, 1], [367, 359, 8, 9, 4, 1], [367, 410, 8, 9, 4, 1], [367, 461, 8, 9, 4, 1], [367, 512, 8, 9, 4, 1], [367, 563, 8, 9, 4, 1], [367, 614, 8, 9, 4, 1], [367, 665, 8, 9, 4, 1], [367, 716, 8, 9, 4, 1], [367, 767, 8, 9, 4, 1], [428, 2, 8, 9, 4, 1], [428, 53, 8, 9, 4, 1], [428, 104, 8, 9, 4, 1], [428, 155, 8, 9, 4, 1], [428, 206, 8, 9, 4, 1], [428, 257, 8, 9, 4, 1], [428, 308, 8, 9, 4, 1], [428, 359, 8, 9, 4, 1], [428, 410, 8, 9, 4, 1], [428, 461, 8, 9, 4, 1], [428, 512, 8, 9, 4, 1], [428, 563, 8, 9, 4, 1], [428, 614, 8, 9, 4, 1], [428, 665, 8, 9, 4, 1], [428, 716, 8, 9, 4, 1], [428, 767, 8, 9, 4, 1], [489, 2, 8, 9, 4, 1], [489, 56, 12, 6, 9, 4], [489, 107, 9, 2, 5, 4], [489, 158, 11, 6, 8, 4], [489, 209, 8, 6, 5, 4], [489, 262, 11, 3, 9, 6], [489, 311, 11, 8, 8, 4], [489, 363, 11, 5, 10, 5], [489, 414, 11, 5, 10, 5], [489, 465, 12, 5, 10, 5], [489, 516, 11, 5, 10, 5], [489, 568, 13, 5, 12, 6], [489, 619, 13, 5, 12, 6], [489, 666, 12, 9, 9, 2], [489, 721, 13, 5, 12, 6], [489, 768, 11, 8, 9, 2], [550, 5, 10, 3, 7, 4], [550, 56, 11, 6, 8, 4], [550, 107, 11, 2, 7, 4], [550, 158, 10, 6, 8, 4], [550, 210, 11, 5, 8, 5], [550, 262, 11, 3, 9, 6], [550, 311, 10, 6, 8, 4], [550, 364, 9, 3, 7, 6], [550, 414, 10, 5, 8, 5], [550, 465, 10, 5, 8, 5], [550, 516, 10, 5, 8, 5], [550, 567, 10, 5, 8, 5], [550, 622, 12, 1, 12, 9], [550, 664, 11, 13, 9, 0], [550, 723, 13, 1, 11, 8], [550, 769, 12, 7, 9, 3], [611, 5, 13, 6, 10, 4], [611, 55, 12, 7, 9, 3], [611, 106, 13, 7, 10, 3], [611, 158, 14, 8, 12, 4], [611, 210, 12, 5, 10, 5], [611, 261, 12, 5, 10, 5], [611, 311, 12, 6, 10, 4], [611, 363, 12, 5, 10, 5], [611, 414, 12, 5, 10, 5], [611, 465, 11, 5, 9, 5], [611, 511, 1, 1, 9, 1], [611, 566, 12, 7, 9, 4], [611, 618, 11, 5, 9, 5], [611, 669, 11, 7, 9, 5], [611, 720, 11, 5, 9, 5], [611, 770, 12, 7, 9, 4], [672, 5, 13, 6, 10, 4], [672, 56, 12, 6, 9, 4], [672, 107, 12, 6, 10, 4], [672, 158, 12, 6, 10, 4], [672, 209, 13, 3, 11, 4], [672, 259, 14, 8, 11, 3], [672, 310, 12, 7, 8, 3], [672, 365, 8, 1, 8, 7], [672, 416, 10, 2, 9, 7], [1, 1, 1, 1, 6, 1], [794, 766, 1, 1, 3, 1], [672, 567, 13, 5, 12, 5], [672, 618, 14, 5, 12, 5], [672, 666, 12, 9, 8, 2], [672, 720, 13, 5, 12, 5], [672, 767, 12, 9, 8, 1], [733, 5, 9, 6, 7, 4], [733, 55, 10, 9, 7, 3], [733, 107, 12, 6, 10, 4], [733, 158, 12, 6, 10, 4], [733, 209, 13, 3, 10, 4], [733, 260, 12, 7, 9, 4], [733, 308, 11, 12, 7, 1], [733, 358, 9, 13, 7, 0], [733, 409, 9, 13, 7, 0], [733, 461, 11, 12, 7, 1], [733, 511, 9, 13, 7, 0], [733, 562, 9, 12, 7, 0], [733, 614, 11, 12, 7, 1], [733, 664, 10, 13, 7, 0], [733, 715, 10, 12, 7, 0], [733, 767, 11, 12, 7, 1], [1, 1, 1, 1, 6, 1], [794, 55, 8, 9, 7, 3], [794, 106, 8, 10, 5, 3], [794, 157, 12, 10, 9, 3], [794, 205, 12, 13, 9, 0], [794, 256, 12, 12, 9, 0], [794, 308, 10, 12, 6, 1], [794, 361, 10, 10, 6, 3], [794, 412, 10, 10, 6, 3], [794, 461, 10, 12, 6, 1], [794, 514, 10, 10, 6, 3], [794, 565, 10, 9, 6, 3], [794, 614, 11, 12, 7, 1], [794, 665, 11, 12, 7, 1], [794, 716, 11, 11, 7, 1], [794, 766, 1, 1, 3, 1], [855, 1, 1, 1, 3, 1], [855, 52, 1, 1, 3, 1], [855, 103, 1, 1, 3, 1], [855, 154, 1, 1, 3, 1], [855, 205, 1, 1, 3, 1], [855, 256, 1, 1, 3, 1], [855, 307, 1, 1, 3, 1], [855, 358, 1, 1, 3, 1], [855, 409, 1, 1, 3, 1], [855, 460, 1, 1, 3, 1], [855, 511, 1, 1, 3, 1], [855, 562, 1, 1, 3, 1], [855, 613, 1, 1, 3, 1], [855, 664, 1, 1, 3, 1], [855, 715, 1, 1, 3, 1], [855, 766, 1, 1, 3, 1]], \"capHeight\": 10, \"widestlogicalchar\": 12, \"widestglyph\": 14, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_biu+osdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 6, 7, 6, 7, 5], [1, 56, 7, 8, 7, 4], [1, 107, 11, 8, 11, 4], [1, 158, 9, 8, 9, 4], [1, 209, 9, 8, 9, 4], [1, 260, 11, 8, 11, 4], [1, 311, 11, 8, 11, 4], [1, 363, 8, 7, 8, 5], [1, 413, 7, 10, 7, 4], [1, 464, 7, 10, 7, 4], [1, 515, 9, 7, 9, 4], [1, 567, 9, 7, 9, 5], [1, 618, 7, 9, 7, 5], [1, 669, 9, 6, 9, 5], [1, 720, 7, 7, 7, 5], [1, 770, 7, 8, 7, 4], [62, 5, 9, 8, 9, 4], [62, 56, 9, 8, 9, 4], [62, 107, 9, 8, 9, 4], [62, 158, 9, 8, 9, 4], [62, 209, 9, 8, 9, 4], [62, 260, 9, 8, 9, 4], [62, 311, 9, 8, 9, 4], [62, 362, 9, 8, 9, 4], [62, 413, 9, 8, 9, 4], [62, 464, 9, 8, 9, 4], [62, 516, 7, 7, 7, 5], [62, 567, 7, 9, 7, 5], [62, 618, 9, 7, 9, 5], [62, 669, 9, 6, 9, 5], [62, 720, 9, 7, 9, 5], [62, 770, 8, 8, 8, 4], [123, 5, 9, 8, 9, 4], [123, 56, 11, 8, 11, 4], [123, 107, 10, 8, 10, 4], [123, 158, 10, 8, 10, 4], [123, 209, 10, 8, 10, 4], [123, 260, 10, 8, 10, 4], [123, 311, 11, 8, 11, 4], [123, 362, 10, 8, 10, 4], [123, 413, 11, 8, 11, 4], [123, 464, 7, 8, 7, 4], [123, 515, 10, 8, 10, 4], [123, 566, 11, 8, 11, 4], [123, 617, 10, 8, 10, 4], [123, 668, 12, 8, 12, 4], [123, 719, 11, 8, 11, 4], [123, 770, 11, 8, 11, 4], [184, 5, 11, 8, 11, 4], [184, 56, 11, 8, 11, 4], [184, 107, 9, 8, 9, 4], [184, 158, 9, 8, 9, 4], [184, 209, 10, 8, 10, 4], [184, 260, 10, 8, 10, 4], [184, 312, 8, 9, 8, 5], [184, 362, 11, 8, 11, 4], [184, 413, 10, 8, 10, 4], [184, 464, 11, 8, 11, 4], [184, 515, 10, 8, 10, 4], [184, 566, 7, 10, 7, 4], [184, 618, 12, 7, 12, 5], [184, 668, 7, 10, 7, 4], [184, 719, 10, 8, 10, 4], [184, 771, 9, 9, 9, 5], [245, 3, 8, 9, 8, 2], [245, 57, 10, 7, 10, 5], [245, 107, 9, 9, 9, 4], [245, 159, 9, 9, 9, 5], [245, 208, 9, 9, 9, 3], [245, 261, 8, 7, 8, 5], [245, 310, 9, 11, 9, 3], [245, 363, 8, 9, 8, 5], [245, 414, 10, 9, 10, 5], [245, 465, 7, 7, 7, 5], [245, 516, 10, 9, 10, 5], [245, 567, 9, 7, 9, 5], [245, 617, 9, 8, 9, 4], [245, 669, 9, 9, 9, 5], [245, 720, 9, 7, 9, 5], [245, 771, 9, 7, 9, 5], [306, 6, 9, 7, 9, 5], [306, 56, 9, 8, 9, 4], [306, 108, 9, 9, 9, 5], [306, 159, 9, 7, 9, 5], [306, 210, 8, 7, 8, 5], [306, 261, 9, 7, 9, 5], [306, 312, 10, 7, 10, 5], [306, 363, 10, 7, 10, 5], [306, 412, 9, 11, 9, 3], [306, 465, 10, 9, 10, 5], [306, 514, 9, 11, 9, 3], [306, 565, 8, 11, 8, 3], [306, 616, 6, 11, 6, 3], [306, 667, 8, 11, 8, 3], [306, 720, 9, 6, 9, 5], [306, 771, 3, 6, 3, 5], [367, 2, 5, 11, 5, 1], [367, 53, 5, 11, 5, 1], [367, 104, 5, 11, 5, 1], [367, 155, 5, 11, 5, 1], [367, 206, 5, 11, 5, 1], [367, 257, 5, 11, 5, 1], [367, 308, 5, 11, 5, 1], [367, 359, 5, 11, 5, 1], [367, 410, 5, 11, 5, 1], [367, 461, 5, 11, 5, 1], [367, 512, 5, 11, 5, 1], [367, 563, 5, 11, 5, 1], [367, 614, 5, 11, 5, 1], [367, 665, 5, 11, 5, 1], [367, 716, 5, 11, 5, 1], [367, 767, 5, 11, 5, 1], [428, 2, 5, 11, 5, 1], [428, 53, 5, 11, 5, 1], [428, 104, 5, 11, 5, 1], [428, 155, 5, 11, 5, 1], [428, 206, 5, 11, 5, 1], [428, 257, 5, 11, 5, 1], [428, 308, 5, 11, 5, 1], [428, 359, 5, 11, 5, 1], [428, 410, 5, 11, 5, 1], [428, 461, 5, 11, 5, 1], [428, 512, 5, 11, 5, 1], [428, 563, 5, 11, 5, 1], [428, 614, 5, 11, 5, 1], [428, 665, 5, 11, 5, 1], [428, 716, 5, 11, 5, 1], [428, 767, 5, 11, 5, 1], [489, 2, 5, 11, 5, 1], [489, 56, 10, 8, 10, 4], [489, 107, 6, 7, 6, 4], [489, 158, 9, 8, 9, 4], [489, 209, 6, 8, 6, 4], [489, 261, 10, 6, 10, 5], [489, 311, 9, 10, 9, 4], [489, 363, 11, 7, 11, 5], [489, 414, 11, 7, 11, 5], [489, 465, 11, 7, 11, 5], [489, 516, 11, 7, 11, 5], [489, 567, 13, 8, 13, 5], [489, 618, 13, 8, 13, 5], [489, 666, 10, 11, 10, 2], [489, 720, 13, 8, 13, 5], [489, 768, 10, 10, 10, 2], [550, 5, 8, 7, 8, 4], [550, 56, 9, 8, 9, 4], [550, 107, 8, 7, 8, 4], [550, 158, 9, 8, 9, 4], [550, 210, 9, 7, 9, 5], [550, 261, 10, 6, 10, 5], [550, 311, 9, 8, 9, 4], [550, 363, 8, 6, 8, 5], [550, 414, 9, 7, 9, 5], [550, 465, 9, 7, 9, 5], [550, 516, 9, 7, 9, 5], [550, 567, 9, 7, 9, 5], [550, 618, 13, 7, 13, 5], [550, 664, 10, 15, 10, 0], [550, 720, 12, 6, 12, 5], [550, 769, 10, 9, 10, 3], [611, 5, 11, 8, 11, 4], [611, 55, 10, 9, 10, 3], [611, 106, 11, 9, 11, 3], [611, 158, 13, 10, 13, 4], [611, 210, 11, 7, 11, 5], [611, 261, 11, 7, 11, 5], [611, 311, 11, 8, 11, 4], [611, 363, 11, 7, 11, 5], [611, 414, 11, 7, 11, 5], [611, 465, 10, 7, 10, 5], [611, 516, 10, 9, 10, 5], [611, 566, 10, 9, 10, 4], [611, 618, 10, 7, 10, 5], [611, 669, 10, 9, 10, 5], [611, 720, 10, 7, 10, 5], [611, 770, 10, 9, 10, 4], [672, 5, 11, 8, 11, 4], [672, 56, 10, 8, 10, 4], [672, 107, 11, 8, 11, 4], [672, 158, 11, 8, 11, 4], [672, 209, 12, 7, 12, 4], [672, 259, 12, 10, 12, 3], [672, 309, 9, 10, 9, 2], [672, 363, 9, 6, 9, 5], [672, 414, 10, 6, 10, 5], [1, 6, 7, 6, 7, 5], [794, 771, 3, 6, 3, 5], [672, 567, 13, 7, 13, 5], [672, 618, 13, 7, 13, 5], [672, 666, 9, 11, 9, 2], [672, 720, 13, 7, 13, 5], [672, 767, 9, 11, 9, 1], [733, 5, 8, 8, 8, 4], [733, 55, 8, 11, 8, 3], [733, 107, 11, 8, 11, 4], [733, 158, 11, 8, 11, 4], [733, 209, 11, 7, 11, 4], [733, 260, 10, 9, 10, 4], [733, 308, 8, 14, 8, 1], [733, 358, 8, 15, 8, 0], [733, 409, 8, 15, 8, 0], [733, 461, 8, 14, 8, 1], [733, 511, 8, 15, 8, 0], [733, 562, 8, 14, 8, 0], [733, 614, 8, 14, 8, 1], [733, 664, 8, 15, 8, 0], [733, 715, 8, 14, 8, 0], [733, 766, 8, 15, 8, 0], [1, 6, 7, 6, 7, 5], [794, 55, 8, 11, 8, 3], [794, 105, 6, 13, 6, 2], [794, 156, 10, 13, 10, 2], [794, 205, 10, 15, 10, 0], [794, 256, 10, 14, 10, 0], [794, 308, 7, 14, 7, 1], [794, 358, 7, 15, 7, 0], [794, 409, 7, 15, 7, 0], [794, 461, 7, 14, 7, 1], [794, 511, 7, 15, 7, 0], [794, 562, 7, 14, 7, 0], [794, 614, 8, 14, 8, 1], [794, 664, 8, 15, 8, 0], [794, 715, 8, 14, 8, 0], [794, 771, 3, 6, 3, 5], [855, 6, 3, 6, 3, 5], [855, 57, 3, 6, 3, 5], [855, 108, 3, 6, 3, 5], [855, 159, 3, 6, 3, 5], [855, 210, 3, 6, 3, 5], [855, 261, 3, 6, 3, 5], [855, 312, 3, 6, 3, 5], [855, 363, 3, 6, 3, 5], [855, 414, 3, 6, 3, 5], [855, 465, 3, 6, 3, 5], [855, 516, 3, 6, 3, 5], [855, 567, 3, 6, 3, 5], [855, 618, 3, 6, 3, 5], [855, 669, 3, 6, 3, 5], [855, 720, 3, 6, 3, 5], [855, 771, 3, 6, 3, 5]], \"widestlogicalchar\": 13, \"widestglyph\": 13, \"tallestglyph\": 15}"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/07_9_biuosdce.json",
    "content": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [1, 5, 6, 6, 6, 4], [1, 56, 6, 6, 6, 4], [1, 107, 10, 6, 10, 4], [1, 158, 8, 6, 8, 4], [1, 209, 8, 6, 8, 4], [1, 260, 10, 6, 10, 4], [1, 311, 10, 6, 10, 4], [1, 362, 7, 6, 7, 4], [1, 413, 6, 8, 6, 4], [1, 464, 6, 8, 6, 4], [1, 515, 8, 6, 8, 4], [1, 566, 8, 6, 8, 4], [1, 617, 6, 8, 6, 4], [1, 668, 8, 6, 8, 4], [1, 719, 6, 6, 6, 4], [1, 770, 6, 6, 6, 4], [62, 5, 8, 6, 8, 4], [62, 56, 8, 6, 8, 4], [62, 107, 8, 6, 8, 4], [62, 158, 8, 6, 8, 4], [62, 209, 8, 6, 8, 4], [62, 260, 8, 6, 8, 4], [62, 311, 8, 6, 8, 4], [62, 362, 8, 6, 8, 4], [62, 413, 8, 6, 8, 4], [62, 464, 8, 6, 8, 4], [62, 515, 6, 6, 6, 4], [62, 566, 6, 8, 6, 4], [62, 617, 8, 6, 8, 4], [62, 668, 8, 6, 8, 4], [62, 719, 8, 6, 8, 4], [62, 770, 7, 6, 7, 4], [123, 5, 8, 6, 8, 4], [123, 56, 10, 6, 10, 4], [123, 107, 9, 6, 9, 4], [123, 158, 9, 6, 9, 4], [123, 209, 9, 6, 9, 4], [123, 260, 9, 6, 9, 4], [123, 311, 10, 6, 10, 4], [123, 362, 9, 6, 9, 4], [123, 413, 10, 6, 10, 4], [123, 464, 6, 6, 6, 4], [123, 515, 9, 6, 9, 4], [123, 566, 10, 6, 10, 4], [123, 617, 9, 6, 9, 4], [123, 668, 11, 6, 11, 4], [123, 719, 10, 6, 10, 4], [123, 770, 10, 6, 10, 4], [184, 5, 10, 6, 10, 4], [184, 56, 10, 6, 10, 4], [184, 107, 8, 6, 8, 4], [184, 158, 8, 6, 8, 4], [184, 209, 9, 6, 9, 4], [184, 260, 9, 6, 9, 4], [184, 311, 7, 8, 7, 4], [184, 362, 10, 6, 10, 4], [184, 413, 9, 6, 9, 4], [184, 464, 10, 6, 10, 4], [184, 515, 9, 6, 9, 4], [184, 566, 6, 8, 6, 4], [184, 617, 11, 6, 11, 4], [184, 668, 6, 8, 6, 4], [184, 719, 9, 6, 9, 4], [184, 770, 8, 8, 8, 4], [245, 3, 7, 8, 7, 2], [245, 56, 9, 6, 9, 4], [245, 107, 8, 7, 8, 4], [245, 158, 8, 8, 8, 4], [245, 208, 8, 7, 8, 3], [245, 260, 7, 6, 7, 4], [245, 310, 8, 9, 8, 3], [245, 362, 7, 8, 7, 4], [245, 413, 9, 8, 9, 4], [245, 464, 6, 6, 6, 4], [245, 515, 9, 8, 9, 4], [245, 566, 8, 6, 8, 4], [245, 617, 8, 6, 8, 4], [245, 668, 8, 8, 8, 4], [245, 719, 8, 6, 8, 4], [245, 770, 8, 6, 8, 4], [306, 5, 8, 6, 8, 4], [306, 56, 8, 6, 8, 4], [306, 107, 8, 8, 8, 4], [306, 158, 8, 6, 8, 4], [306, 209, 7, 6, 7, 4], [306, 260, 8, 6, 8, 4], [306, 311, 9, 6, 9, 4], [306, 362, 9, 6, 9, 4], [306, 412, 8, 9, 8, 3], [306, 464, 9, 8, 9, 4], [306, 514, 8, 9, 8, 3], [306, 565, 7, 9, 7, 3], [306, 616, 5, 9, 5, 3], [306, 667, 7, 9, 7, 3], [306, 719, 8, 6, 8, 4], [306, 770, 3, 6, 3, 4], [367, 2, 4, 9, 4, 1], [367, 53, 4, 9, 4, 1], [367, 104, 4, 9, 4, 1], [367, 155, 4, 9, 4, 1], [367, 206, 4, 9, 4, 1], [367, 257, 4, 9, 4, 1], [367, 308, 4, 9, 4, 1], [367, 359, 4, 9, 4, 1], [367, 410, 4, 9, 4, 1], [367, 461, 4, 9, 4, 1], [367, 512, 4, 9, 4, 1], [367, 563, 4, 9, 4, 1], [367, 614, 4, 9, 4, 1], [367, 665, 4, 9, 4, 1], [367, 716, 4, 9, 4, 1], [367, 767, 4, 9, 4, 1], [428, 2, 4, 9, 4, 1], [428, 53, 4, 9, 4, 1], [428, 104, 4, 9, 4, 1], [428, 155, 4, 9, 4, 1], [428, 206, 4, 9, 4, 1], [428, 257, 4, 9, 4, 1], [428, 308, 4, 9, 4, 1], [428, 359, 4, 9, 4, 1], [428, 410, 4, 9, 4, 1], [428, 461, 4, 9, 4, 1], [428, 512, 4, 9, 4, 1], [428, 563, 4, 9, 4, 1], [428, 614, 4, 9, 4, 1], [428, 665, 4, 9, 4, 1], [428, 716, 4, 9, 4, 1], [428, 767, 4, 9, 4, 1], [489, 2, 4, 9, 4, 1], [489, 56, 9, 6, 9, 4], [489, 107, 5, 6, 5, 4], [489, 158, 8, 6, 8, 4], [489, 209, 5, 6, 5, 4], [489, 260, 9, 6, 9, 4], [489, 311, 8, 8, 8, 4], [489, 362, 10, 6, 10, 4], [489, 413, 10, 6, 10, 4], [489, 464, 10, 6, 10, 4], [489, 515, 10, 6, 10, 4], [489, 566, 12, 7, 12, 4], [489, 617, 12, 7, 12, 4], [489, 666, 9, 9, 9, 2], [489, 719, 12, 7, 12, 4], [489, 768, 9, 8, 9, 2], [550, 5, 7, 6, 7, 4], [550, 56, 8, 6, 8, 4], [550, 107, 7, 6, 7, 4], [550, 158, 8, 6, 8, 4], [550, 209, 8, 6, 8, 4], [550, 260, 9, 6, 9, 4], [550, 311, 8, 6, 8, 4], [550, 362, 7, 6, 7, 4], [550, 413, 8, 6, 8, 4], [550, 464, 8, 6, 8, 4], [550, 515, 8, 6, 8, 4], [550, 566, 8, 6, 8, 4], [550, 617, 12, 6, 12, 4], [550, 664, 9, 13, 9, 0], [550, 719, 11, 6, 11, 4], [550, 769, 9, 7, 9, 3], [611, 5, 10, 6, 10, 4], [611, 55, 9, 7, 9, 3], [611, 106, 10, 7, 10, 3], [611, 158, 12, 8, 12, 4], [611, 209, 10, 6, 10, 4], [611, 260, 10, 6, 10, 4], [611, 311, 10, 6, 10, 4], [611, 362, 10, 6, 10, 4], [611, 413, 10, 6, 10, 4], [611, 464, 9, 6, 9, 4], [611, 515, 9, 8, 9, 4], [611, 566, 9, 7, 9, 4], [611, 617, 9, 6, 9, 4], [611, 668, 9, 8, 9, 4], [611, 719, 9, 6, 9, 4], [611, 770, 9, 7, 9, 4], [672, 5, 10, 6, 10, 4], [672, 56, 9, 6, 9, 4], [672, 107, 10, 6, 10, 4], [672, 158, 10, 6, 10, 4], [672, 209, 11, 6, 11, 4], [672, 259, 11, 8, 11, 3], [672, 309, 8, 8, 8, 2], [672, 362, 8, 6, 8, 4], [672, 413, 9, 6, 9, 4], [1, 5, 6, 6, 6, 4], [794, 770, 3, 6, 3, 4], [672, 566, 12, 6, 12, 4], [672, 617, 12, 6, 12, 4], [672, 666, 8, 9, 8, 2], [672, 719, 12, 6, 12, 4], [672, 767, 8, 9, 8, 1], [733, 5, 7, 6, 7, 4], [733, 55, 7, 9, 7, 3], [733, 107, 10, 6, 10, 4], [733, 158, 10, 6, 10, 4], [733, 209, 10, 6, 10, 4], [733, 260, 9, 7, 9, 4], [733, 308, 7, 12, 7, 1], [733, 358, 7, 13, 7, 0], [733, 409, 7, 13, 7, 0], [733, 461, 7, 12, 7, 1], [733, 511, 7, 13, 7, 0], [733, 562, 7, 12, 7, 0], [733, 614, 7, 12, 7, 1], [733, 664, 7, 13, 7, 0], [733, 715, 7, 12, 7, 0], [733, 766, 7, 13, 7, 0], [1, 5, 6, 6, 6, 4], [794, 55, 7, 9, 7, 3], [794, 105, 5, 11, 5, 2], [794, 156, 9, 11, 9, 2], [794, 205, 9, 13, 9, 0], [794, 256, 9, 12, 9, 0], [794, 308, 6, 12, 6, 1], [794, 358, 6, 13, 6, 0], [794, 409, 6, 13, 6, 0], [794, 461, 6, 12, 6, 1], [794, 511, 6, 13, 6, 0], [794, 562, 6, 12, 6, 0], [794, 614, 7, 12, 7, 1], [794, 664, 7, 13, 7, 0], [794, 715, 7, 12, 7, 0], [794, 770, 3, 6, 3, 4], [855, 5, 3, 6, 3, 4], [855, 56, 3, 6, 3, 4], [855, 107, 3, 6, 3, 4], [855, 158, 3, 6, 3, 4], [855, 209, 3, 6, 3, 4], [855, 260, 3, 6, 3, 4], [855, 311, 3, 6, 3, 4], [855, 362, 3, 6, 3, 4], [855, 413, 3, 6, 3, 4], [855, 464, 3, 6, 3, 4], [855, 515, 3, 6, 3, 4], [855, 566, 3, 6, 3, 4], [855, 617, 3, 6, 3, 4], [855, 668, 3, 6, 3, 4], [855, 719, 3, 6, 3, 4], [855, 770, 3, 6, 3, 4]], \"widestlogicalchar\": 12, \"widestglyph\": 12, \"tallestglyph\": 13}"
  },
  {
    "path": "vipercard/vipercard/resources03a/intro/introjs.js",
    "content": "\nfunction cerror(s) {\n    if (console && console.error) {\n        console.error(s)\n    }\n}\n\nfunction newBrowserDetect() {\n    var s = window.navigator.userAgent;\n    var obj = bowser.parse(s);\n    var rawPlatform = obj && obj.platform && obj.platform.type;\n    if (rawPlatform == 'mobile') {\n        return 'mobile'\n    } else {\n        var rawBrowser = obj && obj.browser && obj.browser.name\n        if (rawBrowser == bowser.BROWSER_MAP.ie || rawBrowser == bowser.BROWSER_MAP.edge) {\n            return 'notstart'\n        } else {\n            return 'canstart'\n        }\n    }\n}\n\nfunction oldBrowserDetect() {\n    function looksLikeFirefox() {\n        return window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n    }\n\n    function looksLikeSafari() {\n        return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n    }\n\n    function looksLikeMSIE() {\n        if (/MSIE 10/i.test(navigator.userAgent)) {\n            /* internet explorer 10 */\n            return true\n        }\n\n        if (/MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) {\n            /* internet explorer 9 or 11 */\n            return true\n        }\n        \n        return false\n    }\n\n    function looksLikeMSEdge() {\n        if (/Edge\\/\\d./i.test(navigator.userAgent)) {\n            /* Microsoft Edge */\n            return true\n        }\n        \n        return false\n    }\n\n    function looksLikeDesktopChrome() {\n        var isChromium = window.chrome,\n            winNav = window.navigator,\n            vendorName = winNav.vendor,\n            isOpera = winNav.userAgent.indexOf(\"OPR\") > -1,\n            isIEedge = winNav.userAgent.indexOf(\"Edge\") > -1,\n            isIOSChrome = winNav.userAgent.match(\"CriOS\");\n\n        if (isIOSChrome) {\n            return false;\n        } else if (\n            isChromium !== null &&\n            typeof isChromium !== \"undefined\" &&\n            vendorName.indexOf(\"Google\") > -1 &&\n            isOpera === false &&\n            isIEedge === false\n        ) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    function looksMobile() {\n        return /Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent);\n    }\n\n    if (looksMobile()) {\n        return 'mobile'\n    } else if (looksLikeMSEdge() || looksLikeMSIE()) {\n        return 'notstart'\n    } else {\n        return 'canstart'\n    }\n}\n\nfunction goImpl() {\n    var typ = undefined\n    try {\n        typ = newBrowserDetect()\n    } catch (e) {\n        cerror(e.toString());\n    }\n\n    if (typ == undefined) {\n        try {\n            typ = oldBrowserDetect()\n        } catch (e) {\n            cerror(e.toString());\n        }\n    }\n\n    if (typ == 'mobile') {\n        document.getElementById(\"spempty\").style.display = \"none\";\n        document.getElementById(\"spcouldnotstart\").style.display = \"none\";\n        document.getElementById(\"spcouldstart\").style.display = \"none\";\n        document.getElementById(\"spcouldnotstartmobile\").style.display = \"block\";\n    } else if (typ == 'notstart') {\n        document.getElementById(\"spempty\").style.display = \"none\";\n        document.getElementById(\"spcouldnotstart\").style.display = \"block\";\n        document.getElementById(\"spcouldstart\").style.display = \"none\";\n        document.getElementById(\"spcouldnotstartmobile\").style.display = \"none\";\n    } else {\n        document.getElementById(\"spempty\").style.display = \"none\";\n        document.getElementById(\"spcouldnotstart\").style.display = \"none\";\n        document.getElementById(\"spcouldstart\").style.display = \"block\";\n        document.getElementById(\"spcouldnotstartmobile\").style.display = \"none\";\n    }\n    \n    goCanonicalUrl()\n}\n\nfunction goCanonicalUrl() {\n    /* don't send it into an infinite loop, though. */\n    if (window.location.href.indexOf('vipercard') != -1 && (window.location.href.indexOf('https') == -1 || window.location.href.indexOf('www') == -1 || window.location.href.indexOf('index') != -1)) {\n        location.href = 'https://www.vipercard.net'\n    }\n}\n\nfunction go() {\n    try {\n        goImpl()\n    } catch (e) {\n        cerror(e.toString());\n    }  \n}\n\ngo()\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/intro/script_reference/github-markdown.css",
    "content": "@font-face {\n  font-family: octicons-link;\n  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');\n}\n\n.markdown-body {\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n  line-height: 1.5;\n  color: #24292e;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 16px;\n  line-height: 1.5;\n  word-wrap: break-word;\n}\n\n.markdown-body .pl-c {\n  color: #6a737d;\n}\n\n.markdown-body .pl-c1,\n.markdown-body .pl-s .pl-v {\n  color: #005cc5;\n}\n\n.markdown-body .pl-e,\n.markdown-body .pl-en {\n  color: #6f42c1;\n}\n\n.markdown-body .pl-smi,\n.markdown-body .pl-s .pl-s1 {\n  color: #24292e;\n}\n\n.markdown-body .pl-ent {\n  color: #22863a;\n}\n\n.markdown-body .pl-k {\n  color: #d73a49;\n}\n\n.markdown-body .pl-s,\n.markdown-body .pl-pds,\n.markdown-body .pl-s .pl-pse .pl-s1,\n.markdown-body .pl-sr,\n.markdown-body .pl-sr .pl-cce,\n.markdown-body .pl-sr .pl-sre,\n.markdown-body .pl-sr .pl-sra {\n  color: #032f62;\n}\n\n.markdown-body .pl-v,\n.markdown-body .pl-smw {\n  color: #e36209;\n}\n\n.markdown-body .pl-bu {\n  color: #b31d28;\n}\n\n.markdown-body .pl-ii {\n  color: #fafbfc;\n  background-color: #b31d28;\n}\n\n.markdown-body .pl-c2 {\n  color: #fafbfc;\n  background-color: #d73a49;\n}\n\n.markdown-body .pl-c2::before {\n  content: \"^M\";\n}\n\n.markdown-body .pl-sr .pl-cce {\n  font-weight: bold;\n  color: #22863a;\n}\n\n.markdown-body .pl-ml {\n  color: #735c0f;\n}\n\n.markdown-body .pl-mh,\n.markdown-body .pl-mh .pl-en,\n.markdown-body .pl-ms {\n  font-weight: bold;\n  color: #005cc5;\n}\n\n.markdown-body .pl-mi {\n  font-style: italic;\n  color: #24292e;\n}\n\n.markdown-body .pl-mb {\n  font-weight: bold;\n  color: #24292e;\n}\n\n.markdown-body .pl-md {\n  color: #b31d28;\n  background-color: #ffeef0;\n}\n\n.markdown-body .pl-mi1 {\n  color: #22863a;\n  background-color: #f0fff4;\n}\n\n.markdown-body .pl-mc {\n  color: #e36209;\n  background-color: #ffebda;\n}\n\n.markdown-body .pl-mi2 {\n  color: #f6f8fa;\n  background-color: #005cc5;\n}\n\n.markdown-body .pl-mdr {\n  font-weight: bold;\n  color: #6f42c1;\n}\n\n.markdown-body .pl-ba {\n  color: #586069;\n}\n\n.markdown-body .pl-sg {\n  color: #959da5;\n}\n\n.markdown-body .pl-corl {\n  text-decoration: underline;\n  color: #032f62;\n}\n\n.markdown-body .octicon {\n  display: inline-block;\n  vertical-align: text-top;\n  fill: currentColor;\n}\n\n.markdown-body a {\n  background-color: transparent;\n}\n\n.markdown-body a:active,\n.markdown-body a:hover {\n  outline-width: 0;\n}\n\n.markdown-body strong {\n  font-weight: inherit;\n}\n\n.markdown-body strong {\n  font-weight: bolder;\n}\n\n.markdown-body h1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n.markdown-body img {\n  border-style: none;\n}\n\n.markdown-body code,\n.markdown-body kbd,\n.markdown-body pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n.markdown-body hr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\n.markdown-body input {\n  font: inherit;\n  margin: 0;\n}\n\n.markdown-body input {\n  overflow: visible;\n}\n\n.markdown-body [type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\n.markdown-body * {\n  box-sizing: border-box;\n}\n\n.markdown-body input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n.markdown-body a {\n  color: #0366d6;\n  text-decoration: none;\n}\n\n.markdown-body a:hover {\n  text-decoration: underline;\n}\n\n.markdown-body strong {\n  font-weight: 600;\n}\n\n.markdown-body hr {\n  height: 0;\n  margin: 15px 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: 1px solid #dfe2e5;\n}\n\n.markdown-body hr::before {\n  display: table;\n  content: \"\";\n}\n\n.markdown-body hr::after {\n  display: table;\n  clear: both;\n  content: \"\";\n}\n\n.markdown-body table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n\n.markdown-body td,\n.markdown-body th {\n  padding: 0;\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body h1 {\n  font-size: 32px;\n  font-weight: 600;\n}\n\n.markdown-body h2 {\n  font-size: 24px;\n  font-weight: 600;\n}\n\n.markdown-body h3 {\n  font-size: 20px;\n  font-weight: 600;\n}\n\n.markdown-body h4 {\n  font-size: 16px;\n  font-weight: 600;\n}\n\n.markdown-body h5 {\n  font-size: 14px;\n  font-weight: 600;\n}\n\n.markdown-body h6 {\n  font-size: 12px;\n  font-weight: 600;\n}\n\n.markdown-body p {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\n.markdown-body blockquote {\n  margin: 0;\n}\n\n.markdown-body ul,\n.markdown-body ol {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body ol ol,\n.markdown-body ul ol {\n  list-style-type: lower-roman;\n}\n\n.markdown-body ul ul ol,\n.markdown-body ul ol ol,\n.markdown-body ol ul ol,\n.markdown-body ol ol ol {\n  list-style-type: lower-alpha;\n}\n\n.markdown-body dd {\n  margin-left: 0;\n}\n\n.markdown-body code {\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  font-size: 12px;\n}\n\n.markdown-body pre {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  font-size: 12px;\n}\n\n.markdown-body .octicon {\n  vertical-align: text-bottom;\n}\n\n.markdown-body .pl-0 {\n  padding-left: 0 !important;\n}\n\n.markdown-body .pl-1 {\n  padding-left: 4px !important;\n}\n\n.markdown-body .pl-2 {\n  padding-left: 8px !important;\n}\n\n.markdown-body .pl-3 {\n  padding-left: 16px !important;\n}\n\n.markdown-body .pl-4 {\n  padding-left: 24px !important;\n}\n\n.markdown-body .pl-5 {\n  padding-left: 32px !important;\n}\n\n.markdown-body .pl-6 {\n  padding-left: 40px !important;\n}\n\n.markdown-body::before {\n  display: table;\n  content: \"\";\n}\n\n.markdown-body::after {\n  display: table;\n  clear: both;\n  content: \"\";\n}\n\n.markdown-body>*:first-child {\n  margin-top: 0 !important;\n}\n\n.markdown-body>*:last-child {\n  margin-bottom: 0 !important;\n}\n\n.markdown-body a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n\n.markdown-body .anchor {\n  float: left;\n  padding-right: 4px;\n  margin-left: -20px;\n  line-height: 1;\n}\n\n.markdown-body .anchor:focus {\n  outline: none;\n}\n\n.markdown-body p,\n.markdown-body blockquote,\n.markdown-body ul,\n.markdown-body ol,\n.markdown-body dl,\n.markdown-body table,\n.markdown-body pre {\n  margin-top: 0;\n  margin-bottom: 16px;\n}\n\n.markdown-body hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 24px 0;\n  background-color: #e1e4e8;\n  border: 0;\n}\n\n.markdown-body blockquote {\n  padding: 0 1em;\n  color: #6a737d;\n  border-left: 0.25em solid #dfe2e5;\n}\n\n.markdown-body blockquote>:first-child {\n  margin-top: 0;\n}\n\n.markdown-body blockquote>:last-child {\n  margin-bottom: 0;\n}\n\n.markdown-body kbd {\n  display: inline-block;\n  padding: 3px 5px;\n  font-size: 11px;\n  line-height: 10px;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: #fafbfc;\n  border: solid 1px #c6cbd1;\n  border-bottom-color: #959da5;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 #959da5;\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n  margin-top: 24px;\n  margin-bottom: 16px;\n  font-weight: 600;\n  line-height: 1.25;\n}\n\n.markdown-body h1 .octicon-link,\n.markdown-body h2 .octicon-link,\n.markdown-body h3 .octicon-link,\n.markdown-body h4 .octicon-link,\n.markdown-body h5 .octicon-link,\n.markdown-body h6 .octicon-link {\n  color: #1b1f23;\n  vertical-align: middle;\n  visibility: hidden;\n}\n\n.markdown-body h1:hover .anchor,\n.markdown-body h2:hover .anchor,\n.markdown-body h3:hover .anchor,\n.markdown-body h4:hover .anchor,\n.markdown-body h5:hover .anchor,\n.markdown-body h6:hover .anchor {\n  text-decoration: none;\n}\n\n.markdown-body h1:hover .anchor .octicon-link,\n.markdown-body h2:hover .anchor .octicon-link,\n.markdown-body h3:hover .anchor .octicon-link,\n.markdown-body h4:hover .anchor .octicon-link,\n.markdown-body h5:hover .anchor .octicon-link,\n.markdown-body h6:hover .anchor .octicon-link {\n  visibility: visible;\n}\n\n.markdown-body h1 {\n  padding-bottom: 0.3em;\n  font-size: 2em;\n  border-bottom: 1px solid #eaecef;\n}\n\n.markdown-body h2 {\n  padding-bottom: 0.3em;\n  font-size: 1.5em;\n  border-bottom: 1px solid #eaecef;\n}\n\n.markdown-body h3 {\n  font-size: 1.25em;\n}\n\n.markdown-body h4 {\n  font-size: 1em;\n}\n\n.markdown-body h5 {\n  font-size: 0.875em;\n}\n\n.markdown-body h6 {\n  font-size: 0.85em;\n  color: #6a737d;\n}\n\n.markdown-body ul,\n.markdown-body ol {\n  padding-left: 2em;\n}\n\n.markdown-body ul ul,\n.markdown-body ul ol,\n.markdown-body ol ol,\n.markdown-body ol ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body li {\n  word-wrap: break-all;\n}\n\n.markdown-body li>p {\n  margin-top: 16px;\n}\n\n.markdown-body li+li {\n  margin-top: 0.25em;\n}\n\n.markdown-body dl {\n  padding: 0;\n}\n\n.markdown-body dl dt {\n  padding: 0;\n  margin-top: 16px;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n\n.markdown-body dl dd {\n  padding: 0 16px;\n  margin-bottom: 16px;\n}\n\n.markdown-body table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n\n.markdown-body table th {\n  font-weight: 600;\n}\n\n.markdown-body table th,\n.markdown-body table td {\n  padding: 6px 13px;\n  border: 1px solid #dfe2e5;\n}\n\n.markdown-body table tr {\n  background-color: #fff;\n  border-top: 1px solid #c6cbd1;\n}\n\n.markdown-body table tr:nth-child(2n) {\n  background-color: #f6f8fa;\n}\n\n.markdown-body img {\n  max-width: 100%;\n  box-sizing: content-box;\n  background-color: #fff;\n}\n\n.markdown-body img[align=right] {\n  padding-left: 20px;\n}\n\n.markdown-body img[align=left] {\n  padding-right: 20px;\n}\n\n.markdown-body code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: rgba(27,31,35,0.05);\n  border-radius: 3px;\n}\n\n.markdown-body pre {\n  word-wrap: normal;\n}\n\n.markdown-body pre>code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n\n.markdown-body .highlight {\n  margin-bottom: 16px;\n}\n\n.markdown-body .highlight pre {\n  margin-bottom: 0;\n  word-break: normal;\n}\n\n.markdown-body .highlight pre,\n.markdown-body pre {\n  padding: 16px;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: #f6f8fa;\n  border-radius: 3px;\n}\n\n.markdown-body pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: transparent;\n  border: 0;\n}\n\n.markdown-body .full-commit .btn-outline:not(:disabled):hover {\n  color: #005cc5;\n  border-color: #005cc5;\n}\n\n.markdown-body kbd {\n  display: inline-block;\n  padding: 3px 5px;\n  font: 11px \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  line-height: 10px;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: #fafbfc;\n  border: solid 1px #d1d5da;\n  border-bottom-color: #c6cbd1;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 #c6cbd1;\n}\n\n.markdown-body :checked+.radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: #0366d6;\n}\n\n.markdown-body .task-list-item {\n  list-style-type: none;\n}\n\n.markdown-body .task-list-item+.task-list-item {\n  margin-top: 3px;\n}\n\n.markdown-body .task-list-item input {\n  margin: 0 0.2em 0.25em -1.6em;\n  vertical-align: middle;\n}\n\n.markdown-body hr {\n  border-bottom-color: #eee;\n}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/intro/style.css",
    "content": "\nul.mainnav {\n  list-style-type: none;\n}\n\nbody {\n  margin-left:1.5em;\n}\n\n\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/demo_anim.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":2,\"fileformatminor\":0,\"buildnumber\":\"10002000\",\"uuid\":\"c1d32ea6-8f02-467a-b032-7b6ab15bd41a\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforid\":1022,\"increasingnumberforelemname\":40,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|MTIzNQ|demo\"}},{\"type\":6,\"id\":\"1002\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䔳!䕏୚ঈ݉䯒⦒勉Ⰰ斐ǌ⭒լோ氅浶◈歭禞帣䩍⍦▌氍㮝唈䄽ᮑ儈稵⽴ଋ㮍佣劍⫵楿怍᭣ᑕ嘼◃瑏匿䓝惪㪹޽䓲㾠❓ᣎ嗏ᬃ䠮㮺䓵၊塻⟫匌㦈昻䶈㥽囓➃帏᫛㮄㫻᠋ஞㅿ㝝廿㸲ྦྷ⧴燸垣爌佘瀫㨕夻ื畕㧚嗗ᷥ⟟滪䏱牱Ὧ⋙熘ᗋ⌕瓋⠏抵甙摿堑夘耒砗纵缟⩫㴠湠ɠ剦Ϡ䉩ˀ屣΀庅簰婯ΰ摬˰倴䍐䐽䊐琷䐐尸⊨戺䵨沊䉈恥⏈羫⌈澠挸瞬扸枦揸箩拘殡䎘䔂∤䴴Ꭴ紺ዤ匱ፄ欽ኄ䜷ᐄ眲沴檶叴䚹勔皳厔庿刬憴㎬䦺㋬禱㍌喽㊌涷㐌䎸犼玲獼宾牜枵珜侻猜羰ଢ偼੢桶௢䑹ૂ瑳ஂ屿ਲ扴䮲䩺䫲穱䭒噽䪒湷䰒䅸⪪煲⭪奾⩊敵⯊䵻⬊絰欺卼橺歶毺䝹櫚睳殚彿樦惴ᮦ䣺᫦磱ᭆ哽᪆泷ᰆ䋸媶狲孶嫾婖曵寖任嬖绰㬮凼㩮槶㯮䗹㫎痳㮎巿㨾援箾䯺竾篱筞埽窞濷簞䁘ڡ灒ݡ塞ف摕߁䱛܁籐䜱剘㢠  \"}},{\"type\":4,\"id\":\"1009\",\"parent_id\":\"1003\",\"attrs\":{\"x\":8,\"y\":224,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":291,\"selend\":291,\"scroll\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00021\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\"}},{\"type\":5,\"id\":\"1004\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶Ḡ̦嫎哵倮嗍䑕䍱咏䄭怹忎䔕ᡕ厍歍ᢥ嚎㮕官ϋ㨽⢧庍窝彠ㄧ竝䝿嘻橃⡐㈾篣㽳岉᭕ᤌ㴎♰佷墸Փ瑔㊽㬳瓳䄺᛫狯宸ᛃ猕䕻∓櫣㭸᧍஁㢤㚻㰥㻁᩠掁ㅿ㟛ᩏ㝃㰓佢㉝ຸ爐䤻أ定㧌堋㨓ౚ煇䃠美⽋玑㗜࠷㨻㢟潃◱㚝䡏ቌ筙ώࠋ㋸習⠗纵缟⩠̠牣屠䙬Ϡ䉩ˀ屣΀揅簰副ΰ摪䋰硦͐琴䊐䇇䐐嗈⊨稲⍨嘾≈桭䏈夶ⴈ焰挸紿㱸䑡䏸瞩拘枣掘箫∤息掤䮪ዤ䦅⍄弽ኄ悷ᐄ殡ኴ涭䵴䚹勔皳厔庿刬憴㎬䦺㋬禱㍌喽㊌涷㐌䎸犼玲獼宾牜枵珜侻猜羰ଢ偼੢桶௢䑹ૂ瑳ஂ屿ਲ扴䮲䩺䫲穱䭒噽䪒湷䰒䅸⪪煲⭪奾⩊敵⯊䵻⬊絰欺卼橺歶毺䝹櫚睳殚彿樦惴ᮦ䣺᫦磱ᭆ哽᪆泷ᰆ䋸媶狲孶嫾婖曵寖任嬖绰㬮凼㩮槶㯮䗹㫎痳㮎巿㨾援箾䯺竾篱筞埽窞濷簞䁘ڡ灒ݡ塞ف摕߁䱛܁籐䜱剜䙱䔤  \"}},{\"type\":4,\"id\":\"1013\",\"parent_id\":\"1004\",\"attrs\":{\"x\":8,\"y\":221,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":209,\"selend\":209,\"scroll\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00022\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\"}},{\"type\":5,\"id\":\"1005\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懞〠ᥭ㍨ẉ糭殅弖᭠箈ᎉ婶杻弧ᮍ᡻嘋ഽᡟ倸㫑ᾉ偔孝ㄟ嘺䈍䄁ᨿ䙺㤐ʹ❳ဲ㦸有䔝⚸柳䝶㡼猳ዮ⁻♃儊ㅺ猓䲼㔹䙰竰壻䗻摚㓌皢挙㑚䚓ᶟ㼆皛凱儍嘼椋㦼⾀廬眧ຬ殌箎ྜྷ㘚๻樃嘔瓜༗緾Ǜ䦫洍絝㙧朅給徤搉紻忟朄猝ჿ✥緓࠲ʫᨅ帟့᳸⿇崿 И‴䌲਺䐂∁䏲㨽䊂⸷䋂ĸ≂ㄲ⋢᤾≢ᘵ∲┻⌢㴰搜ጼ掜⬶揜ܹ捜㜳扇Ἷ捼₴Ꮌࢺጼ㢱ᐌᒽᎌⲷᏌʸ卌㏂叴䚹勔皳厔庿刬憴㎬䦺㋬禱㍌喽㊌涷㐌䎸犼玲獼宾牜枵珜侻猜羰ଢ偼੢桶௢䑹ૂ瑳ஂ屿ਲ扴䮲䩺䫲穱䭒噽䪒湷䰒䅸⪪煲⭪奾⩊敵⯊䵻⬊絰欺卼橺歶毺䝹櫚睳殚彿樦惴ᮦ䣺᫦磱ᭆ哽᪆泷ᰆ䋸媶狲孶嫾婖曵寖任嬖绰㬮凼㩮槶㯮䗹㫎痳㮎巿㨾援箾䯺竾篱筞埽窞濷簞䁘ڡ灒ݡ塞ف摕߁䱛܁籐䜱剜䙱橒₠  \"}},{\"type\":4,\"id\":\"1015\",\"parent_id\":\"1005\",\"attrs\":{\"x\":7,\"y\":224,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":208,\"scroll\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00023\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\"}},{\"type\":5,\"id\":\"1006\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懞〠ᥭ㍱味ᫍ獥偶寍孽徉嬽峓匍㯒瞉娋㯝彮⸉稣Ⲱ㚨篮ヴ᲍枴㊒ك⡙岿㰳䶼㌢染壤ᆻ䲍哯喾݀ᣮ㼨ᛦଐ୽國၅㞾㟱ⓠ潼㘻㤋㗸友ۇ㽺᠝㋽ၝᑋዸ璥皹ਈ㞠㘥׼⏺♗ጃ㵍⾢㧺ೞ⮗ཉ㍛♳淾廿㣍复瓼溇徑犄圯䯽统ṣ倓嚁皻㜀̏࠼Ჟਢ縄ᰁ絏7˛ᐎͰ␺ᅫẈϰ瞀簽ሴ⁰眡ඳᦈ䎐紭㵨牯䉈䡥⏈偫⌈䁠挸徬扸侦揸垮⋘瑩掘丏琤弴Ꭴ摯拤玡ፄ掭ኄ綯㘄劼剴檶叴䚹勔皳厔庿刬憴㎬䦺㋬禱㍌喽㊌涷㐌䎸犼玲獼宾牜枵珜侻猜羰ଢ偼੢桶௢䑹ૂ瑳ஂ屿ਲ扴䮲䩺䫲穱䭒噽䪒湷䰒䅸⪪煲⭪奾⩊敵⯊䵻⬊絰欺卼橺歶毺䝹櫚睳殚彿樦惴ᮦ䣺᫦磱ᭆ哽᪆泷ᰆ䋸媶狲孶嫾婖曵寖任嬖绰㬮凼㩮槶㯮䗹㫎痳㮎巿㨾援箾䯺竾篱筞埽窞濷簞䁘ڡ灒ݡ塞ف摕߁䱛܁籐䜱攤  \"}},{\"type\":4,\"id\":\"1017\",\"parent_id\":\"1006\",\"attrs\":{\"x\":7,\"y\":222,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":207,\"scroll\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00024\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\"}},{\"type\":5,\"id\":\"1008\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懞〠ᥭ㍱味ᫍ獥偶寍孽徉嬽峓匍㯒瞉娋㯝彮⸉稣Ⲱ㈽ࠝ烦☺䟲ᤌ㪷䘳撲㲼⒣捺㊵⛓㢮㮹䘓˴⑾ᙂ勹㘰坋Ⴆ㍽䗋笀⣺㠜ᜋ㰇㙛漷㷼礋㻵㤼ྋ懨琵矧ᝄ畚㢇姣佘⼌Ȓ砂⻷欦秜姗ḙ䟟潬䏱粁Ὧ䍝冞序寽羘㼿⠓猝㻿矧稚翟‏砟縠怴Π䠺ˠ砱̀吽ʀ氷Ѐ䈸䊰爲䍰娾䉐昵䏐主䌐縰⌨儼≨椶⏨䔹⋈申⎈崿∸挴掸䬺拸笱捘圽折漷搘䂸ኤ炲፤墾ቄ撵Ꮔ䲻ጄ粰匴劼剴檶叴䚹勔皳厔庿刬憴㎬䦺㋬禱㍌喽㊌涷㐌䎸犼玲獼宾牜枵珜侻猜羰ଢ偼੢桶௢䑹ૂ瑳ஂ屿ਲ扴䮲䩺䫲穱䭒噽䪒湷䰒䅸⪪煲⭪忤  \"}},{\"type\":4,\"id\":\"1019\",\"parent_id\":\"1008\",\"attrs\":{\"x\":8,\"y\":223,\"w\":465,\"h\":111,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":208,\"selend\":207,\"scroll\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 6\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002You can make an animation by drawing pictures on a series of \\\"cards\\\".\\nTo go to the next card, click on the arrow pointing right, in the lower \\nbox near the top right of the screen.\\nYou are currently on card \\u0002geneva_12_+biuosdce\\u00025\\u0002geneva_12_biuosdce\\u0002.\\nTo view and save the animation as a .gif, click the movie icon (the one \\nthat is just below the spraypaint can).\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/demo_game.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":2,\"fileformatminor\":0,\"buildnumber\":\"00002002\",\"uuid\":\"e39fc80b-e84d-4b8b-bede-87a68c75949e\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforelemname\":40,\"increasingnumberforid\":1759,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|MTIzNg|demo\"}},{\"type\":6,\"id\":\"1002\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"on afterkeydown\\n\\tif keyrepeated() then\\n\\t\\texit afterkeydown\\n\\tend if\\n\\tput the left of cd btn \\\"mr_fish\\\" into x\\n\\tput the top of cd btn \\\"mr_fish\\\" into y\\n\\tif keychar() is \\\"ArrowLeft\\\" then\\n\\t\\tsubtract 10 from x\\n\\telse if keychar() is \\\"ArrowRight\\\" then\\n\\t\\tadd 10 to x\\n\\telse if keychar() is \\\"ArrowUp\\\" then\\n\\t\\tsubtract 10 from y\\n\\telse if keychar() is \\\"ArrowDown\\\" then\\n\\t\\tadd 10 to y\\n\\telse\\n\\t\\texit afterkeydown\\n\\tend if\\n\\t\\n\\tset the left of cd btn \\\"mr_fish\\\" to x\\n\\tset the top of cd btn \\\"mr_fish\\\" to y\\n\\tif isWithinPlanet(the loc of cd btn \\\"mr_fish\\\") then\\n\\t\\tshow cd fld \\\"win\\\"\\n\\telse\\n\\t\\thide cd fld \\\"win\\\"\\n\\tend if\\nend afterkeydown\\n\\nfunction isWithinPlanet coords\\n\\t-- returns true if the fish is at the planet\\n\\tput item 1 of coords into centerx\\n\\tput item 2 of coords into centery\\n\\treturn centerx > the left of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcenterx < the right of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcentery > the top of cd btn \\\"planet\\\" and \\\\\\n\\t\\tcentery < the bottom of cd btn \\\"planet\\\"\\nend isWithinPlanet\\n\\n\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"1004\",\"parent_id\":\"1003\",\"attrs\":{\"x\":363,\"y\":163,\"w\":64,\"h\":63,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":true,\"style\":4,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\t\\nend mouseUp\",\"name\":\"planet\"}},{\"type\":3,\"id\":\"1009\",\"parent_id\":\"1003\",\"attrs\":{\"x\":141,\"y\":167,\"w\":45,\"h\":48,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":22,\"showlabel\":true,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\t\\nend mouseUp\",\"name\":\"mr_fish\"}},{\"type\":4,\"id\":\"1017\",\"parent_id\":\"1003\",\"attrs\":{\"x\":198,\"y\":212,\"w\":305,\"h\":39,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":8,\"selend\":8,\"scroll\":0,\"style\":4,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"win\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":24,\"defaulttextstyle\":8,\"ftxt\":\"\\u0002geneva_24_biu+osdce\\u0002Victory!\"}},{\"type\":4,\"id\":\"1020\",\"parent_id\":\"1003\",\"attrs\":{\"x\":8,\"y\":4,\"w\":465,\"h\":94,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":51,\"selend\":51,\"scroll\":0,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 17\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_18_biuosdce\\u0002Click the Browse tool (looks like a hand)\\nthen type arrow keys (up down left right)\\nto move Mr. Fish so that he can return to\\nhis home planet.\"}},{\"type\":4,\"id\":\"1022\",\"parent_id\":\"1003\",\"attrs\":{\"x\":5,\"y\":286,\"w\":353,\"h\":58,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":31,\"selend\":31,\"scroll\":1,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 19\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002See and change the source code:\\nFrom Objects menu, click Card Info...\\nThen click the Script button in the lower right corner.\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/demo_glider.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":2,\"fileformatminor\":0,\"buildnumber\":\"00002002\",\"uuid\":\"4b79262b-98c6-4844-9fe5-a8b7da8778e4\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"-- Glider, ported from Glider4 by Ben Fisher, https://github.com/downpoured/glider_4\\n-- script of stack:\\n\\nfunction rectIntersect x0, x1, y0, y1, boxx0, boxx1, boxy0, boxy1\\n    if (x0 >= boxx1 or y0 >= boxy1)  then\\n        -- it's way outside on the right or bottom\\n        return 0 -- no overlap\\n     else if (x1 < boxx0 or y1 < boxy0)  then\\n        -- it's way outside on the left or top\\n        return 0 -- no overlap\\n     else if (x0 >= boxx0 and x1 <= boxx1 and y0 >= boxy0 and y1 <= boxy1)  then\\n        return 1 -- CompletelyCovers;\\n     else if (boxx0 >= x0 and boxx1 <= x1 and boxy0 >= y0 and boxy1 <= y1)  then\\n        return 2 -- CompletelyWithin;\\n     else\\n        return 3 -- PartialOverlap;\\n    end if\\nend rectIntersect\\n\\nfunction getCollideResult objtypename, isOn, amount, extra\\n    put \\\"\\\" into resultpt1\\n    put \\\"\\\" into resultpt2\\n    put \\\"/\\\" & objtypename & \\\"/\\\" into objtypenametest\\n    if objtypenametest is in \\\"/table/shelf/books/cabnet/obsRct/drip/toastr/ball/fshBwl/basket/macTsh/\\\" then\\n        put \\\"crashIt\\\" into resultpt1\\n        return resultpt1 & \\\"|\\\" & resultpt2\\n    end if\\n            \\n    if objtypename == \\\"extRct\\\" then\\n        put \\\"moveIt\\\" into resultpt1\\n        put amount into resultpt2\\n    else if objtypename == \\\"flrVnt\\\" then\\n        put \\\"liftIt\\\" into resultpt1\\n    else if objtypename == \\\"celVnt\\\" then\\n        put \\\"dropIt\\\" into resultpt1\\n    else if objtypename == \\\"celDct\\\" then\\n        if isOn is 1 then\\n            put \\\"dropIt\\\" into resultpt1\\n        else\\n            put \\\"moveIt\\\" into resultpt1\\n            put extra into resultpt2\\n        end if\\n    else if objtypename == \\\"candle\\\" then\\n        put \\\"burnIt\\\" into resultpt1\\n    else if objtypename == \\\"lftFan\\\" then\\n        if isOn is 1 then\\n            put \\\"turnItLeft\\\" into resultpt1\\n        else\\n            put \\\"ignoreIt\\\" into resultpt1\\n        end if\\n    else if objtypename == \\\"ritFan\\\" then\\n        if isOn is 1 then\\n            put \\\"turnItRight\\\" into resultpt1\\n        else\\n            put \\\"ignoreIt\\\" into resultpt1\\n        end if\\n    else if objtypename == \\\"clock\\\" then\\n        if isOn is 1 then\\n            play \\\"glider_1_Clock\\\"\\n            put \\\"getitem_awardIt\\\" into resultpt1\\n            put amount into resultpt2\\n        end if\\n    else if objtypename == \\\"paper\\\" then\\n        if isOn is 1 then\\n            play \\\"glider_1_Extra\\\"\\n            put \\\"getitem_extraIt\\\" into resultpt1\\n            put amount into resultpt2\\n        end if\\n    else if objtypename == \\\"grease\\\" then\\n        if isOn is 1 then\\n            put \\\"spillIt\\\" into resultpt1\\n        else\\n            put \\\"slideIt\\\" into resultpt1\\n        end if\\n    else if objtypename == \\\"bnsRct\\\" then\\n        if isOn is 1 then\\n            put \\\"trickIt\\\" into resultpt1\\n            put amount into resultpt2\\n        end if\\n    else if objtypename == \\\"battry\\\" then\\n        if isOn is 1 then\\n            play \\\"glider_1_Energize\\\"\\n            put \\\"getitem_energizeIt\\\" into resultpt1\\n            put amount into resultpt2\\n        end if\\n    else if objtypename == \\\"rbrBnd\\\" then\\n        if isOn is 1 then\\n            play \\\"glider_1_GetBand\\\"\\n            put \\\"getitem_bandIt\\\" into resultpt1\\n            put amount into resultpt2\\n        end if\\n    else if objtypename == \\\"litSwt\\\" then\\n        put \\\"lightIt\\\" into resultpt1\\n    else if objtypename == \\\"outlet\\\" then\\n        play \\\"glider_1_Zap\\\"\\n        put \\\"zapIt\\\" into resultpt1\\n    else if objtypename == \\\"thermo\\\" then\\n        put \\\"airOnIt\\\" into resultpt1\\n    else if objtypename == \\\"shredr\\\" then\\n        if isOn is 1 then\\n            put \\\"shredIt\\\" into resultpt1\\n        else\\n            put \\\"ignoreIt\\\" into resultpt1\\n        end if\\n    else if objtypename == \\\"pwrSwt\\\" then\\n        put \\\"toggleIt\\\" into resultpt1\\n        put amount into resultpt2 -- \\t{object# linked to}\\n    else if objtypename == \\\"guitar\\\" then\\n        play \\\"glider_1_Guitar\\\" \\n        put \\\"playIt\\\" into resultpt1\\n        put \\\"0\\\" into resultpt2\\n    else if objtypename == \\\"upStar\\\" then\\n        put \\\"ascendIt\\\" into resultpt1\\n        put amount into resultpt2 -- {room # linked to}\\n    else if objtypename == \\\"dnStar\\\" then\\n        put \\\"descendIt\\\" into resultpt1\\n        put amount into resultpt2 -- {room # linked to}\\n    else\\n        put \\\"ignoreIt\\\" into resultpt1\\n    end if\\n    return resultpt1 & \\\"|\\\" & resultpt2\\nend getCollideResult\\n\\non initSpriteConstantsAndLoadGameData\\n    global sprites_ventpatternx, sprites_ventpatterny\\n    put 73 into sprites_ventpatternx -- not ready yet\\n    put 72 into sprites_ventpatterny\\n\\n    global sprites_shadoRght, sprites_shadoLft, sprites_right_forward, sprites_right_tipped, sprites_left_forward, sprites_left_tipped\\n    global sprites_turn_endpoint, sprites_right_forward2, sprites_right_tipped2, sprites_left_forward2, sprites_left_tipped2, sprites_turn_endpoint2\\n    global sprites_burnrght1, sprites_burnrght2, sprites_burnlft1, sprites_burnlft2, sprites_alldeadrght, sprites_alldeadlft\\n    global sprites_celVnt, sprites_celDct, sprites_flrVnt, sprites_paper, sprites_toastr, sprites_toast1\\n    global sprites_toast2, sprites_toast3, sprites_toast4, sprites_toast5, sprites_toast6, sprites_teaKtl\\n    global sprites_lftFan, sprites_ritFan, sprites_table, sprites_shredr, sprites_books, sprites_clock\\n    global sprites_candle, sprites_rbrBnd, sprites_ball, sprites_fshBwl, sprites_fish1, sprites_fish2\\n    global sprites_fish3, sprites_fish4, sprites_grease, sprites_greasefall1, sprites_greasefall2, sprites_litSwt\\n    global sprites_thermo, sprites_outlet, sprites_outletspark1, sprites_outletspark2, sprites_pwrSwt, sprites_guitar\\n    global sprites_drip, sprites_shelf, sprites_basket, sprites_paintg, sprites_battry, sprites_macTsh\\n    global sprites_upStar, sprites_dnStar, sprites_candleflame1, sprites_candleflame2, sprites_candleflame3, sprites_drop1\\n    global sprites_drop2, sprites_drop3, sprites_drop4, sprites_drop5\\n    put 2 into sprites_shadoRght\\n    put 3 into sprites_shadoLft\\n    put 4 into sprites_right_forward\\n    put 5 into sprites_right_tipped\\n    put 6 into sprites_left_forward\\n    put 7 into sprites_left_tipped\\n    put 8 into sprites_turn_endpoint\\n    put 9 into sprites_right_forward2\\n    put 10 into sprites_right_tipped2\\n    put 11 into sprites_left_forward2\\n    put 12 into sprites_left_tipped2\\n    put 13 into sprites_turn_endpoint2\\n    put 14 into sprites_burnrght1\\n    put 15 into sprites_burnrght2\\n    put 16 into sprites_burnlft1\\n    put 17 into sprites_burnlft2\\n    put 18 into sprites_alldeadrght\\n    put 19 into sprites_alldeadlft\\n    put 20 into sprites_celVnt\\n    put 21 into sprites_celDct\\n    put 22 into sprites_flrVnt\\n    put 23 into sprites_paper\\n    put 24 into sprites_toastr\\n    put 25 into sprites_toast1\\n    put 26 into sprites_toast2\\n    put 27 into sprites_toast3\\n    put 28 into sprites_toast4\\n    put 29 into sprites_toast5\\n    put 30 into sprites_toast6\\n    put 31 into sprites_teaKtl\\n    put 32 into sprites_lftFan\\n    put 33 into sprites_ritFan\\n    put 34 into sprites_table\\n    put 35 into sprites_shredr\\n    put 36 into sprites_books\\n    put 37 into sprites_clock\\n    put 38 into sprites_candle\\n    put 39 into sprites_rbrBnd\\n    put 40 into sprites_ball\\n    put 41 into sprites_fshBwl\\n    put 42 into sprites_fish1\\n    put 43 into sprites_fish2\\n    put 44 into sprites_fish3\\n    put 45 into sprites_fish4\\n    put 46 into sprites_grease\\n    put 47 into sprites_greasefall1\\n    put 48 into sprites_greasefall2\\n    put 49 into sprites_litSwt\\n    put 50 into sprites_thermo\\n    put 51 into sprites_outlet\\n    put 52 into sprites_outletspark1\\n    put 53 into sprites_outletspark2\\n    put 54 into sprites_pwrSwt\\n    put 55 into sprites_guitar\\n    put 56 into sprites_drip\\n    put 57 into sprites_shelf\\n    put 58 into sprites_basket\\n    put 59 into sprites_paintg\\n    put 60 into sprites_battry\\n    put 61 into sprites_macTsh\\n    put 62 into sprites_upStar\\n    put 63 into sprites_dnStar\\n    put 64 into sprites_candleflame1\\n    put 65 into sprites_candleflame2\\n    put 66 into sprites_candleflame3\\n    put 67 into sprites_drop1\\n    put 68 into sprites_drop2\\n    put 69 into sprites_drop3\\n    put 70 into sprites_drop4\\n    put 71 into sprites_drop5\\n\\n    \\n    global lvlData, lvlObjects\\n    put \\\"Welcome...|5|0|1|0|0|0|0\\\" into line 1 of lvlData\\n    put \\\"Top of the reading list|7|1|1|0|0|0|0\\\" into line 2 of lvlData\\n    put \\\"Under Me!|5|1|1|0|0|0|0\\\" into line 3 of lvlData\\n    put \\\"Looking at you...|6|1|1|0|0|0|0\\\" into line 4 of lvlData\\n    put \\\"You're invited...|6|1|1|2|1|1|0\\\" into line 5 of lvlData\\n    put \\\"Jane be nimble...|5|1|1|1|1|1|0\\\" into line 6 of lvlData\\n    put \\\"Hmm... a tall cabinet|7|1|1|0|0|0|0\\\" into line 7 of lvlData\\n    put \\\"Timing is the key...|9|1|1|0|0|0|0\\\" into line 8 of lvlData\\n    put \\\"More enemies...|8|1|1|0|1|2|0\\\" into line 9 of lvlData\\n    put \\\"Up a Down Staircase|4|1|1|1|1|1|0\\\" into line 10 of lvlData\\n    put \\\"Still on this floor...|9|1|1|0|0|0|2\\\" into line 11 of lvlData\\n    put \\\"Deeper still...|3|1|0|1|2|0|0\\\" into line 12 of lvlData\\n    put \\\"What, a bombshelter?|11|0|1|0|0|0|0\\\" into line 13 of lvlData\\n    put \\\"Power station...|7|1|1|1|1|0|2\\\" into line 14 of lvlData\\n    put \\\"This is the basement|6|1|1|0|0|0|0\\\" into line 15 of lvlData\\n    put \\\"Nothing here...|4|1|1|0|0|0|2\\\" into line 16 of lvlData\\n    put \\\"The Looking Glass|3|1|0|0|0|0|0\\\" into line 17 of lvlData\\n    put \\\"Welcome, 2nd Floor|7|0|1|0|0|0|0\\\" into line 18 of lvlData\\n    put \\\"Zis Room|11|1|1|0|0|0|0\\\" into line 19 of lvlData\\n    put \\\"This Old House...|6|1|1|0|0|0|0\\\" into line 20 of lvlData\\n    put \\\"The North Room|9|1|1|0|0|0|0\\\" into line 21 of lvlData\\n    put \\\"Windtunnels|8|1|1|0|0|0|0\\\" into line 22 of lvlData\\n    put \\\"Noisy Kids!|5|1|1|0|0|0|0\\\" into line 23 of lvlData\\n    put \\\"LeadFish|8|1|1|0|0|0|0\\\" into line 24 of lvlData\\n    put \\\"Air Steps|7|1|1|0|0|0|0\\\" into line 25 of lvlData\\n    put \\\"Fan Fun!|9|1|1|0|0|0|0\\\" into line 26 of lvlData\\n    put \\\"Stormy Weather...|10|1|1|0|0|0|2\\\" into line 27 of lvlData\\n    put \\\"Slippery when greasy...|7|1|1|0|0|0|0\\\" into line 28 of lvlData\\n    put \\\"Turn me on...|6|1|1|0|0|0|1\\\" into line 29 of lvlData\\n    put \\\"Finally!!!|6|1|1|0|0|0|0\\\" into line 30 of lvlData\\n    put \\\"Tempted...|7|1|1|0|0|0|0\\\" into line 31 of lvlData\\n    put \\\"Look Familiar?|6|1|0|0|0|0|0\\\" into line 32 of lvlData\\n    put \\\"You found me!|7|0|1|0|0|0|0\\\" into line 33 of lvlData\\n    put \\\"Welcome to Floor 3|6|1|1|1|2|1|0\\\" into line 34 of lvlData\\n    put \\\"A toaster?  Here?|8|1|1|0|0|0|0\\\" into line 35 of lvlData\\n    put \\\"The galley...|6|1|1|0|1|0|0\\\" into line 36 of lvlData\\n    put \\\"Wow - High Shelf!|10|1|1|0|0|0|0\\\" into line 37 of lvlData\\n    put \\\"Love these Candles...|10|1|1|0|0|0|0\\\" into line 38 of lvlData\\n    put \\\"Windy Room...|10|1|1|2|2|0|0\\\" into line 39 of lvlData\\n    put \\\"Monty Hall|11|1|0|0|0|0|0\\\" into line 40 of lvlData\\n    put \\\"\\\" into line 1 of lvlObjects\\n    put \\\"flrVnt|8|69|325|117|338|44|0|0|table|1|186|223|356|232|0|0|0|flrVnt|8|421|325|469|338|44|0|0|macTsh|\\\" after line 1 of lvlObjects\\n    put \\\"43|186|165|231|223|0|0|0|clock|16|322|194|354|223|500|0|0\\\" after line 1 of lvlObjects\\n    put \\\"\\\" into line 2 of lvlObjects\\n    put \\\"flrVnt|8|60|325|108|338|44|0|0|shelf|2|181|112|368|119|0|0|0|books|3|183|58|247|113|0|0|0|flrVnt|8|3\\\" after line 2 of lvlObjects\\n    put \\\"94|325|442|338|44|0|0|clock|16|336|84|368|113|600|0|0|books|3|245|58|309|113|0|0|0|paintg|40|45|80|1\\\" after line 2 of lvlObjects\\n    put \\\"47|173|0|0|0\\\" after line 2 of lvlObjects\\n    put \\\"\\\" into line 3 of lvlObjects\\n    put \\\"flrVnt|8|53|325|101|338|44|0|0|table|1|209|178|408|187|0|0|0|flrVnt|8|345|325|393|338|208|0|0|flrVnt\\\" after line 3 of lvlObjects\\n    put \\\"|8|453|325|501|338|44|0|0|clock|16|211|149|243|178|700|0|0\\\" after line 3 of lvlObjects\\n    put \\\"\\\" into line 4 of lvlObjects\\n    put \\\"flrVnt|8|47|325|95|338|44|0|0|cabnet|4|121|220|312|318|0|0|0|flrVnt|8|337|325|385|338|44|0|0|shelf|2\\\" after line 4 of lvlObjects\\n    put \\\"|206|87|306|94|0|0|0|battry|20|291|63|309|89|50|0|0|mirror|41|13|61|182|207|0|0|0\\\" after line 4 of lvlObjects\\n    put \\\"\\\" into line 5 of lvlObjects\\n    put \\\"flrVnt|8|45|325|93|338|44|0|0|table|1|159|218|325|227|0|0|0|flrVnt|8|423|325|471|338|44|0|0|clock|16\\\" after line 5 of lvlObjects\\n    put \\\"|157|189|189|218|800|0|0|cabnet|4|260|37|383|103|0|0|0|window|37|20|73|141|224|0|0|0\\\" after line 5 of lvlObjects\\n    put \\\"\\\" into line 6 of lvlObjects\\n    put \\\"flrVnt|8|38|325|86|338|44|0|0|table|1|104|224|384|233|0|0|0|candle|11|215|203|247|224|57|0|0|flrVnt|\\\" after line 6 of lvlObjects\\n    put \\\"8|434|325|482|338|44|0|0|books|3|264|170|328|225|0|0|0\\\" after line 6 of lvlObjects\\n    put \\\"\\\" into line 7 of lvlObjects\\n    put \\\"flrVnt|8|58|325|106|338|44|0|0|celDct|10|37|24|85|37|57|7|0|celDct|10|388|24|436|37|109|7|1|cabnet|4\\\" after line 7 of lvlObjects\\n    put \\\"|167|120|357|318|0|0|0|flrVnt|8|446|325|494|338|44|0|0|paper|17|291|99|339|120|1500|0|0|bnsRct|19|25\\\" after line 7 of lvlObjects\\n    put \\\"6|88|288|120|1500|0|0\\\" after line 7 of lvlObjects\\n    put \\\"\\\" into line 8 of lvlObjects\\n    put \\\"table|1|154|237|284|246|0|0|0|shelf|2|268|144|418|151|0|0|0|clock|16|270|116|302|145|1000|0|0|outlet\\\" after line 8 of lvlObjects\\n    put \\\"|25|255|191|287|216|300|0|0|flrVnt|8|84|325|132|338|44|0|0|flrVnt|8|446|325|494|338|44|0|0|books|3|3\\\" after line 8 of lvlObjects\\n    put \\\"52|91|416|146|0|0|0|guitar|29|296|153|360|323|0|0|0|bnsRct|19|353|57|417|89|1000|0|0\\\" after line 8 of lvlObjects\\n    put \\\"\\\" into line 9 of lvlObjects\\n    put \\\"celVnt|9|191|24|239|36|193|0|0|flrVnt|8|56|325|104|338|44|0|0|flrVnt|8|382|325|430|338|44|0|0|books|\\\" after line 9 of lvlObjects\\n    put \\\"3|111|141|175|196|0|0|0|cabnet|4|251|263|351|323|0|0|0|cabnet|4|114|194|250|325|0|0|0|bnsRct|19|376|\\\" after line 9 of lvlObjects\\n    put \\\"35|440|67|1000|0|0|clock|16|219|165|251|194|1000|0|0\\\" after line 9 of lvlObjects\\n    put \\\"\\\" into line 10 of lvlObjects\\n    put \\\"upStar|44|224|54|385|308|18|0|0|flrVnt|8|31|325|79|338|44|0|0|flrVnt|8|275|325|323|338|44|0|0|table|\\\" after line 10 of lvlObjects\\n    put \\\"1|108|228|219|237|0|0|0\\\" after line 10 of lvlObjects\\n    put \\\"\\\" into line 11 of lvlObjects\\n    put \\\"shelf|2|93|140|195|147|0|0|0|shelf|2|303|129|488|136|0|0|0|books|3|333|76|397|131|0|0|0|flrVnt|8|20|\\\" after line 11 of lvlObjects\\n    put \\\"325|68|338|44|0|0|flrVnt|8|412|325|460|338|161|0|0|clock|16|206|149|238|178|2000|0|0|table|1|138|221\\\" after line 11 of lvlObjects\\n    put \\\"|267|230|0|0|0|litSwt|24|119|97|137|123|0|0|0|paper|17|439|109|487|130|2000|0|0\\\" after line 11 of lvlObjects\\n    put \\\"\\\" into line 12 of lvlObjects\\n    put \\\"dnStar|45|149|54|310|308|15|0|0|flrVnt|8|24|325|72|338|44|0|0|paintg|40|26|69|128|162|0|0|0\\\" after line 12 of lvlObjects\\n    put \\\"\\\" into line 13 of lvlObjects\\n    put \\\"cabnet|4|34|216|96|325|0|0|0|ritFan|13|51|163|86|217|157|0|1|flrVnt|8|127|325|175|338|44|0|0|cabnet|\\\" after line 13 of lvlObjects\\n    put \\\"4|174|264|481|328|0|0|0|grease|18|171|236|203|265|478|0|1|clock|16|431|236|463|265|3000|0|0|paper|17\\\" after line 13 of lvlObjects\\n    put \\\"|381|244|429|265|2000|0|0|battry|20|359|240|377|266|80|0|0|rbrBnd|21|321|242|353|265|4|0|0|clock|16|\\\" after line 13 of lvlObjects\\n    put \\\"289|236|321|265|1000|0|0|battry|20|271|240|289|266|40|0|0\\\" after line 13 of lvlObjects\\n    put \\\"\\\" into line 14 of lvlObjects\\n    put \\\"outlet|25|220|139|252|164|80|0|0|litSwt|24|293|139|311|165|0|0|0|flrVnt|8|50|325|98|338|44|0|0|outle\\\" after line 14 of lvlObjects\\n    put \\\"t|25|352|141|384|166|120|0|0|celDct|10|46|24|94|37|98|14|0|flrVnt|8|435|325|483|338|44|0|0|celDct|10\\\" after line 14 of lvlObjects\\n    put \\\"|398|24|446|37|141|14|1\\\" after line 14 of lvlObjects\\n    put \\\"\\\" into line 15 of lvlObjects\\n    put \\\"upStar|44|155|54|316|308|12|0|0|table|1|25|263|150|272|0|0|0|candle|11|111|243|143|264|44|0|0|flrVnt\\\" after line 15 of lvlObjects\\n    put \\\"|8|421|325|469|338|44|0|0|shelf|2|332|167|413|174|0|0|0|lftFan|12|371|113|406|168|140|0|1\\\" after line 15 of lvlObjects\\n    put \\\"\\\" into line 16 of lvlObjects\\n    put \\\"litSwt|24|172|205|190|231|0|0|0|drip|32|237|192|253|205|320|120|0|table|1|13|230|113|239|0|0|0|ritFa\\\" after line 16 of lvlObjects\\n    put \\\"n|13|12|177|47|231|512|0|1\\\" after line 16 of lvlObjects\\n    put \\\"\\\" into line 17 of lvlObjects\\n    put \\\"flrVnt|8|31|325|79|338|44|0|0|extRct|5|382|111|430|246|24|0|0|mirror|41|359|84|451|270|0|0|0\\\" after line 17 of lvlObjects\\n    put \\\"\\\" into line 18 of lvlObjects\\n    put \\\"dnStar|45|187|54|348|308|10|0|0|flrVnt|8|248|325|296|338|44|0|0|basket|42|97|247|160|318|0|0|0|table\\\" after line 18 of lvlObjects\\n    put \\\"|1|358|230|458|239|0|0|0|clock|16|426|202|458|231|1000|0|0|bnsRct|19|377|240|441|272|1000|0|0|paintg\\\" after line 18 of lvlObjects\\n    put \\\"|40|384|66|486|159|0|0|0\\\" after line 18 of lvlObjects\\n    put \\\"\\\" into line 19 of lvlObjects\\n    put \\\"flrVnt|8|11|325|59|338|44|0|0|celDct|10|67|24|115|37|305|19|1|shelf|2|155|151|255|158|0|0|0|shelf|2|\\\" after line 19 of lvlObjects\\n    put \\\"326|161|388|168|0|0|0|books|3|325|107|389|162|0|0|0|table|1|262|223|391|232|0|0|0|flrVnt|8|257|325|3\\\" after line 19 of lvlObjects\\n    put \\\"05|338|255|0|0|flrVnt|8|405|325|453|338|44|0|0|bnsRct|19|324|171|356|203|5000|0|0|paper|17|208|131|2\\\" after line 19 of lvlObjects\\n    put \\\"56|152|1000|0|0|bnsRct|19|258|142|322|174|1000|0|0\\\" after line 19 of lvlObjects\\n    put \\\"\\\" into line 20 of lvlObjects\\n    put \\\"flrVnt|8|38|325|86|338|44|0|0|celDct|10|37|24|85|37|57|19|0|cabnet|4|162|199|275|323|0|0|0|clock|16|\\\" after line 20 of lvlObjects\\n    put \\\"155|171|187|200|1000|0|0|flrVnt|8|277|325|325|338|44|0|0|drip|32|386|38|402|51|318|120|0\\\" after line 20 of lvlObjects\\n    put \\\"\\\" into line 21 of lvlObjects\\n    put \\\"flrVnt|8|60|325|108|338|44|0|0|shelf|2|200|96|361|103|0|0|0|pwrSwt|28|158|197|176|223|5|0|0|shelf|2|\\\" after line 21 of lvlObjects\\n    put \\\"157|185|257|192|0|0|0|shredr|27|260|184|324|208|0|0|1|rbrBnd|21|198|73|230|96|3|0|0|cabnet|4|376|75|\\\" after line 21 of lvlObjects\\n    put \\\"480|183|0|0|0|flrVnt|8|363|325|411|338|210|0|0|bnsRct|19|213|193|245|225|1000|0|0\\\" after line 21 of lvlObjects\\n    put \\\"\\\" into line 22 of lvlObjects\\n    put \\\"flrVnt|8|63|325|111|338|44|0|0|shelf|2|173|115|422|122|0|0|0|ritFan|13|182|189|217|243|512|0|1|lftFa\\\" after line 22 of lvlObjects\\n    put \\\"n|12|388|60|423|115|227|0|1|paper|17|345|94|393|115|1000|0|0|flrVnt|8|443|325|491|338|44|0|0|pwrSwt|\\\" after line 22 of lvlObjects\\n    put \\\"28|410|126|428|152|4|0|0|cabnet|4|172|242|363|327|0|0|0\\\" after line 22 of lvlObjects\\n    put \\\"\\\" into line 23 of lvlObjects\\n    put \\\"flrVnt|8|42|325|90|338|44|0|0|table|1|146|222|270|231|0|0|0|ball|34|207|190|239|222|44|0|0|ball|34|2\\\" after line 23 of lvlObjects\\n    put \\\"90|293|322|325|44|0|0|flrVnt|8|375|325|423|338|44|0|0\\\" after line 23 of lvlObjects\\n    put \\\"\\\" into line 24 of lvlObjects\\n    put \\\"flrVnt|8|58|325|106|338|44|0|0|cabnet|4|110|161|221|321|0|0|0|table|1|226|226|326|235|0|0|0|flrVnt|8\\\" after line 24 of lvlObjects\\n    put \\\"|420|325|468|338|44|0|0|rbrBnd|21|294|204|326|227|4|0|0|fshBwl|35|226|198|258|227|44|120|0|paper|17|\\\" after line 24 of lvlObjects\\n    put \\\"177|141|225|162|1000|0|0|books|3|113|107|177|162|0|0|0\\\" after line 24 of lvlObjects\\n    put \\\"\\\" into line 25 of lvlObjects\\n    put \\\"flrVnt|8|41|325|89|338|215|0|0|table|1|57|188|227|197|0|0|0|clock|16|181|161|213|190|1000|0|0|flrVnt\\\" after line 25 of lvlObjects\\n    put \\\"|8|241|325|289|338|128|0|0|table|1|302|231|412|240|0|0|0|drip|32|215|38|231|51|324|120|0|flrVnt|8|45\\\" after line 25 of lvlObjects\\n    put \\\"9|325|507|338|44|0|0\\\" after line 25 of lvlObjects\\n    put \\\"\\\" into line 26 of lvlObjects\\n    put \\\"shelf|2|32|186|294|193|0|0|0|ritFan|13|42|133|77|187|341|0|0|flrVnt|8|373|325|421|338|154|0|0|pwrSwt\\\" after line 26 of lvlObjects\\n    put \\\"|28|120|99|138|125|2|0|0|lftFan|12|458|202|493|257|88|0|0|shelf|2|431|256|511|263|0|0|0|pwrSwt|28|48\\\" after line 26 of lvlObjects\\n    put \\\"6|156|504|182|5|0|0|paper|17|65|307|113|328|1000|0|0|paper|17|112|307|160|328|1000|0|0\\\" after line 26 of lvlObjects\\n    put \\\"\\\" into line 27 of lvlObjects\\n    put \\\"flrVnt|8|13|325|61|338|44|0|0|flrVnt|8|227|325|275|338|44|0|0|cabnet|4|86|198|215|321|0|0|0|clock|16\\\" after line 27 of lvlObjects\\n    put \\\"|92|170|124|199|1000|0|0|litSwt|24|385|162|403|188|0|0|0|books|3|438|157|502|212|0|0|0|flrVnt|8|372|\\\" after line 27 of lvlObjects\\n    put \\\"325|420|338|217|0|0|table|1|375|210|509|219|0|0|0|celVnt|9|277|24|325|36|305|0|0|window|37|224|84|35\\\" after line 27 of lvlObjects\\n    put \\\"4|236|0|0|0\\\" after line 27 of lvlObjects\\n    put \\\"\\\" into line 28 of lvlObjects\\n    put \\\"flrVnt|8|24|325|72|338|44|0|0|cabnet|4|84|188|393|321|0|0|0|grease|18|82|159|114|188|392|0|1|ball|34\\\" after line 28 of lvlObjects\\n    put \\\"|202|157|234|189|96|0|0|clock|16|397|170|429|199|1000|0|0|flrVnt|8|424|325|472|338|44|0|0|paintg|40|\\\" after line 28 of lvlObjects\\n    put \\\"259|62|361|155|0|0|0\\\" after line 28 of lvlObjects\\n    put \\\"\\\" into line 29 of lvlObjects\\n    put \\\"guitar|29|131|151|195|321|0|0|0|thermo|26|215|170|233|197|0|0|0|flrVnt|8|41|325|89|338|44|0|0|flrVnt\\\" after line 29 of lvlObjects\\n    put \\\"|8|269|325|317|338|44|0|0|shelf|2|354|84|419|91|0|0|0|rbrBnd|21|357|62|389|85|2|0|0\\\" after line 29 of lvlObjects\\n    put \\\"\\\" into line 30 of lvlObjects\\n    put \\\"fshBwl|35|168|171|200|200|44|80|0|cabnet|4|279|62|486|141|0|0|0|flrVnt|8|327|325|375|338|162|0|0|flr\\\" after line 30 of lvlObjects\\n    put \\\"Vnt|8|19|325|67|338|44|0|0|outlet|25|244|159|276|184|80|0|0|mirror|41|88|58|179|160|0|0|0\\\" after line 30 of lvlObjects\\n    put \\\"\\\" into line 31 of lvlObjects\\n    put \\\"upStar|44|60|54|221|308|34|0|0|cabnet|4|237|71|361|325|0|0|0|table|1|417|221|511|230|0|0|0|flrVnt|8|\\\" after line 31 of lvlObjects\\n    put \\\"365|325|413|338|44|0|0|paper|17|416|201|464|222|1000|0|0|rbrBnd|21|480|199|512|222|5|0|0|flrVnt|8|10\\\" after line 31 of lvlObjects\\n    put \\\"5|325|153|338|44|0|0\\\" after line 31 of lvlObjects\\n    put \\\"\\\" into line 32 of lvlObjects\\n    put \\\"upStar|44|30|54|191|308|35|0|0|flrVnt|8|91|325|139|338|44|0|0|cabnet|4|217|219|426|320|0|0|0|candle|\\\" after line 32 of lvlObjects\\n    put \\\"11|222|199|254|220|74|0|0|battry|20|408|195|426|221|40|0|0|flrVnt|8|426|325|474|338|44|0|0\\\" after line 32 of lvlObjects\\n    put \\\"\\\" into line 33 of lvlObjects\\n    put \\\"flrVnt|8|59|325|107|338|44|0|0|celDct|10|56|24|104|37|305|34|0|flrVnt|8|438|325|486|338|44|0|0|cabne\\\" after line 33 of lvlObjects\\n    put \\\"t|4|321|137|431|324|0|0|0|table|1|202|238|316|247|0|0|0|clock|16|319|109|351|138|1000|0|0|paper|17|2\\\" after line 33 of lvlObjects\\n    put \\\"04|218|252|239|1000|0|0\\\" after line 33 of lvlObjects\\n    put \\\"\\\" into line 34 of lvlObjects\\n    put \\\"dnStar|45|139|54|300|308|31|0|0|flrVnt|8|209|325|257|338|44|0|0|celDct|10|65|24|113|37|305|34|1|shel\\\" after line 34 of lvlObjects\\n    put \\\"f|2|321|188|421|195|0|0|0|clock|16|390|160|422|189|1000|0|0|flrVnt|8|447|325|495|338|44|0|0\\\" after line 34 of lvlObjects\\n    put \\\"\\\" into line 35 of lvlObjects\\n    put \\\"dnStar|45|5|54|166|308|32|0|0|flrVnt|8|182|325|230|338|44|0|0|toastr|33|379|304|417|331|114|120|0|sh\\\" after line 35 of lvlObjects\\n    put \\\"elf|2|332|105|490|112|0|0|0|clock|16|410|173|442|202|1000|0|0|flrVnt|8|460|325|508|338|201|0|0|table\\\" after line 35 of lvlObjects\\n    put \\\"|1|410|201|510|210|0|0|0|books|3|343|52|407|107|0|0|0\\\" after line 35 of lvlObjects\\n    put \\\"\\\" into line 36 of lvlObjects\\n    put \\\"flrVnt|8|54|325|102|338|44|0|0|outlet|25|128|175|160|200|120|0|0|flrVnt|8|354|325|402|338|146|0|0|ca\\\" after line 36 of lvlObjects\\n    put \\\"bnet|4|335|25|457|115|0|0|0|teaKtl|36|436|172|477|202|120|0|0|cabnet|4|148|25|209|81|0|0|0\\\" after line 36 of lvlObjects\\n    put \\\"\\\" into line 37 of lvlObjects\\n    put \\\"shelf|2|132|95|448|102|0|0|0|flrVnt|8|73|325|121|338|76|0|0|grease|18|134|67|166|96|448|0|1|celDct|1\\\" after line 37 of lvlObjects\\n    put \\\"0|256|24|304|37|73|37|1|paper|17|321|75|369|96|1000|0|0|clock|16|368|67|400|96|1000|0|0|rbrBnd|21|39\\\" after line 37 of lvlObjects\\n    put \\\"9|73|431|96|5|0|0|flrVnt|8|326|325|374|338|96|0|0|battry|20|302|70|320|96|40|0|0|books|3|177|42|241|\\\" after line 37 of lvlObjects\\n    put \\\"97|0|0|0\\\" after line 37 of lvlObjects\\n    put \\\"\\\" into line 38 of lvlObjects\\n    put \\\"flrVnt|8|53|325|101|338|44|0|0|flrVnt|8|305|325|353|338|115|0|0|table|1|136|169|281|178|0|0|0|shelf|\\\" after line 38 of lvlObjects\\n    put \\\"2|136|90|469|97|0|0|0|books|3|141|115|205|170|0|0|0|table|1|359|225|493|234|0|0|0|candle|11|393|204|\\\" after line 38 of lvlObjects\\n    put \\\"425|225|116|0|0|clock|16|248|141|280|170|1000|0|0|books|3|180|37|244|92|0|0|0|paper|17|423|70|471|91\\\" after line 38 of lvlObjects\\n    put \\\"|1000|0|0\\\" after line 38 of lvlObjects\\n    put \\\"\\\" into line 39 of lvlObjects\\n    put \\\"flrVnt|8|11|325|59|338|44|0|0|flrVnt|8|446|325|494|338|44|0|0|flrVnt|8|243|325|291|338|44|0|0|celVnt\\\" after line 39 of lvlObjects\\n    put \\\"|9|103|24|151|36|325|0|0|celVnt|9|150|24|198|36|325|0|0|celVnt|9|197|24|245|36|325|0|0|celVnt|9|287|\\\" after line 39 of lvlObjects\\n    put \\\"24|335|36|325|0|0|celVnt|9|335|24|383|36|325|0|0|celVnt|9|383|24|431|36|325|0|0|paintg|40|212|68|314\\\" after line 39 of lvlObjects\\n    put \\\"|161|0|0|0\\\" after line 39 of lvlObjects\\n    put \\\"\\\" into line 40 of lvlObjects\\n    put \\\"celDct|10|35|24|83|37|305|31|1|celDct|10|127|24|175|37|66|36|0|celDct|10|221|24|269|37|67|37|0|celDc\\\" after line 40 of lvlObjects\\n    put \\\"t|10|313|24|361|37|64|41|0|celDct|10|398|24|446|37|57|40|0|flrVnt|8|126|325|174|338|44|0|0|flrVnt|8|\\\" after line 40 of lvlObjects\\n    put \\\"218|325|266|338|44|0|0|flrVnt|8|311|325|359|338|44|0|0|flrVnt|8|396|325|444|338|44|0|0|cabnet|4|11|2\\\" after line 40 of lvlObjects\\n    put \\\"13|76|324|0|0|0|paper|17|29|193|77|214|1000|0|0\\\" after line 40 of lvlObjects\\nend initSpriteConstantsAndLoadGameData\\n\",\"name\":\"\",\"increasingnumberforelemname\":31,\"increasingnumberforid\":1032,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|MTIzNw|demo\"}},{\"type\":6,\"id\":\"1000\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1001\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"-- Glider, ported from Glider4 by Ben Fisher, https://github.com/downpoured/glider_4\\n-- script of cd \\\"cdglider\\\":\\n\\n-- -- level data:\\n-- 1|roomname\\n-- 2|numberOObjects\\n-- 3|leftOpen\\n-- 4|rightOpen\\n-- 5|animateKind\\n-- 6|animateNumber\\n-- 7|animateDelay\\n-- 8|conditionCode\\n-- -- level objects:\\n-- 1|typename\\n-- 2|typynumber\\n-- 3|c1\\n-- 4|c2\\n-- 5|c3\\n-- 6|c4\\n-- 7|amount\\n-- 8|extra\\n-- 9|isOn\\n\\nfunction intersectRoomObject myrect1, myrect2, myrect3, myrect4\\n    global curlevel, lvlObjects, propsperobj, gcurlvldata, gcurlvlObjects\\n    put item 2 of gcurlvldata into numobjects\\n    put \\\"\\\" into ret\\n    put left of cd btn \\\"glider_spritesme\\\" into x0\\n    put top of cd btn \\\"glider_spritesme\\\" into y0\\n    put right of cd btn \\\"glider_spritesme\\\" into x1\\n    put bottom of cd btn \\\"glider_spritesme\\\" into y1\\n    repeat with i = 1 to numobjects\\n        put (propsperobj * (i-1)) into j\\n        put  item (j+1) of gcurlvlObjects into objtypename\\n        if objtypename is \\\"outlet\\\" then\\n            mainloopgame_periodic i\\n        end if\\n        put the left of cd btn (\\\"glider_sprites\\\" & i) into boxx0\\n        put the top of cd btn (\\\"glider_sprites\\\" & i) into boxy0\\n        put the right of cd btn (\\\"glider_sprites\\\" & i) into boxx1\\n        put the bottom of cd btn (\\\"glider_sprites\\\" & i) into boxy1\\n        if (x0 >= boxx1 or y0 >= boxy1)  then\\n        -- it's way outside on the right or bottom\\n        else if (x1 < boxx0 or y1 < boxy0)  then\\n        -- it's way outside on the left or top\\n        else\\n            put \\\"|\\\" & i after ret\\n        end if\\n    end repeat\\n    return ret\\nend intersectRoomObject\\n\\n\\non mainloopgame_motion\\n    global curlevel, propsperobj, dx, dy, gcurlvldata, gcurlvlObjects,lastdirpressed\\n    global dx, dy\\n    if dy is \\\"\\\" then\\n        put 0 into dy\\n    end if\\n    if lastdirpressed is \\\"-1\\\" then\\n        add -22 to dx\\n    else if lastdirpressed is \\\"1\\\" then\\n        add 22 to dx\\n    end if\\n    put \\\"\\\" into lastdirpressed\\n    set the topleft of cd btn \\\"glider_spritesme\\\" to (the left of cd btn \\\"glider_spritesme\\\" + dx), (the top of cd btn \\\"glider_spritesme\\\" + dy)\\n    set the topleft of cd btn \\\"glider_spritesshadow\\\" to (the left of cd btn \\\"glider_spritesme\\\"), 320\\nend mainloopgame_motion\\n\\non mainloopgame_checkbounds\\n    global curlevel, propsperobj, dx, dy, gcurlvldata, gcurlvlObjects\\n    put (item 3 of gcurlvldata is 1) into leftopen\\n    put (item 4 of gcurlvldata is 1) into rghtopen\\n    if the bottom of cd btn \\\"glider_spritesme\\\" > 328 then\\n        begindeath\\n        set the bottom of cd btn \\\"glider_spritesme\\\" to 328\\n    else if the top of cd btn \\\"glider_spritesme\\\" < 30 then\\n        set the top of cd btn \\\"glider_spritesme\\\" to 30\\n    end if\\n    \\n    if the left of cd btn \\\"glider_spritesme\\\" <= 0 then\\n        if leftopen then\\n            beginloadlevel curlevel - 1\\n            set the left of cd btn \\\"glider_spritesme\\\" to 450\\n        else\\n            set the left of cd btn \\\"glider_spritesme\\\" to 0\\n        end if\\n    else if the right of cd btn \\\"glider_spritesme\\\" >= 511 then\\n        if rghtopen then\\n            beginloadlevel curlevel + 1\\n            set the left of cd btn \\\"glider_spritesme\\\" to 20\\n        else\\n            set the right of cd btn \\\"glider_spritesme\\\" to 511\\n        end if\\n    end if\\nend mainloopgame_checkbounds\\n\\non newlevelbonus\\n    global levelsseen, curlevel\\n    if line curlevel of levelsseen is \\\"\\\" then\\n        put \\\"1\\\" into line (curlevel) of levelsseen\\n        add 200 to cd fld \\\"score\\\"\\n    end if\\nend newlevelbonus\\n\\non mainloopgame_collisions\\n    global curlevel, propsperobj, dx, dy, gcurlvldata, gcurlvlObjects\\n    global sprites_burnrght1, sprites_outletspark1\\n    \\n    put intersectRoomObject(gcurlvldata, gcurlvlObjects, the left of cd btn \\\"glider_spritesme\\\", the top of cd btn \\\"glider_spritesme\\\", the right of cd btn \\\"glider_spritesme\\\", the bottom of cd btn \\\"glider_spritesme\\\") into intersects\\n    put the number of items in intersects into numintersects\\n    put false into isdead\\n    \\n    put 0 into dx \\n    put 6 into dy -- by default, we fall\\n    repeat with numintersect = 2 to numintersects -- ignore the first\\n        put item numintersect of intersects into i\\n        put item ((i-1)*propsperobj+1) of gcurlvlObjects into objtypename\\n        put item ((i-1)*propsperobj+7) of gcurlvlObjects into amount\\n        put item ((i-1)*propsperobj+8) of gcurlvlObjects into extra\\n        put item ((i-1)*propsperobj+9) of gcurlvlObjects into isOn\\n        \\n        put getCollideResult(objtypename, isOn, amount, extra) into clr\\n        put item 1 of clr into collideType\\n        put item 2 of clr into collideAmt\\n        \\n        if collideType is \\\"crashIt\\\" then\\n            begindeath\\n        else if collideType is \\\"moveIt\\\" then\\n            -- not yet supported\\n        else if collideType is \\\"liftIt\\\" then\\n            put -6 into dy\\n        else if collideType is \\\"dropIt\\\" then\\n            put 12 into dy\\n        else if collideType is \\\"burnIt\\\" then\\n            if the bottom of cd btn \\\"glider_spritesme\\\" >= (the bottom of cd btn (\\\"glider_sprites\\\" & i)-30) then\\n                begindeath\\n                set the icon of cd btn \\\"glider_spritesme\\\" to sprites_burnrght1\\n            else\\n                put -6 into dy\\n            end if\\n        else if collideType is \\\"turnItLeft\\\" then\\n            put -20 into dx\\n        else if collideType is \\\"turnItRight\\\" then\\n            put 20 into dx\\n        else if collideType is \\\"lightIt\\\" then\\n            -- not yet supported\\n        else if collideType is \\\"zapIt\\\" then\\n            if the icon of cd btn (\\\"glider_sprites\\\" & i) is sprites_outletspark1 then\\n                begindeath\\n                set the icon of cd btn \\\"glider_spritesme\\\" to sprites_burnrght1\\n            end if\\n        else if collideType is \\\"airOnIt\\\" then\\n            -- not yet supported\\n        else if collideType is \\\"shredIt\\\" then\\n            begindeath\\n        else if collideType is \\\"descendIt\\\" then\\n            beginloadlevel collideAmt\\n            set the top of cd btn \\\"glider_spritesme\\\" to 20\\n            set the left of cd btn \\\"glider_spritesme\\\" to 20\\n        else if collideType is \\\"ascendIt\\\" then\\n            beginloadlevel collideAmt\\n            set the top of cd btn \\\"glider_spritesme\\\" to 20\\n            set the left of cd btn \\\"glider_spritesme\\\" to 20\\n        else if collideType is \\\"getitem_extraIt\\\" then\\n            add 1 to cd fld \\\"lives\\\"\\n        else if collideType is \\\"getitem_awardIt\\\" then\\n            add 50 to cd fld \\\"score\\\"\\n        else if collideType is \\\"getitem_energizeIt\\\" then\\n            add 100 to cd fld \\\"score\\\"\\n        else if collideType is \\\"getitem_bandIt\\\" then\\n            add 150 to cd fld \\\"score\\\"\\n        end if\\n        \\n        if \\\"getitem_\\\" is in collideType then\\n            -- hide it since it is gone\\n            modifyObjectState (((i-1)*propsperobj)+(9)), 0\\n            hide cd btn (\\\"glider_sprites\\\" & i)\\n        end if\\n    end repeat\\nend mainloopgame_collisions\\n\\n\\non mainloopgame_periodic i\\n    global clockcount, propsperobj, sprites_outlet, sprites_outletspark1, gcurlvldata, gcurlvlObjects\\n    add 1 to clockcount\\n    if clockcount mod 20 is 1 then\\n        put (propsperobj * (i-1)) into j\\n        put item (j+1) of gcurlvlObjects into objtypename\\n        if objtypename is \\\"outlet\\\" then\\n            if the icon of cd btn (\\\"glider_sprites\\\" & i) is sprites_outletspark1 then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_outlet\\n            else\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_outletspark1\\n            end if\\n        end if\\n    end if\\nend mainloopgame_periodic\\n\\non mainloopdying\\n    global deathcount, state, curlevel, sprites_right_forward\\n    if deathcount < 30 then\\n        put deathcount+1 into deathcount\\n    else\\n        subtract 1 from cd fld \\\"lives\\\"\\n        if cd fld \\\"lives\\\" < 0 then\\n            put \\\"nogame\\\" into state\\n            put -3 into curlevel\\n            refreshOnLevelChange\\n        else\\n            set the topleft of cd btn \\\"glider_spritesme\\\" to 20,20\\n            set the icon of cd btn \\\"glider_spritesme\\\" to sprites_right_forward\\n            put \\\"playing\\\" into state\\n            play \\\"glider_1_BeamIn\\\"\\n        end if\\n    end if\\nend mainloopdying\\n\\non mainlooploadinglevel\\n    global loadlevelcount, state, curlevel\\n    if loadlevelcount < 3 then\\n        put loadlevelcount+1 into loadlevelcount\\n        put \\\".\\\" after cd fld \\\"roomname\\\"\\n    else\\n        refreshOnLevelChange\\n        put \\\"playing\\\" into state\\n    end if\\nend mainlooploadinglevel\\n\\non beginloadlevel nextlevel\\n    global loadlevelcount, state, curlevel\\n    if nextlevel > curlevel then\\n        put 1 into incr\\n    else\\n        put -1 into incr\\n    end if\\n    put nextlevel into curlevel\\n    newlevelbonus\\n    if curlevel < 1 then\\n            put 1 into curlevel --sanity check\\n    else if curlevel > 40 then\\n            put 40 into curlevel --sanity check\\n    end if\\n    -- skipped levels we don't yet support\\n    if curlevel is 7 then\\n        put curlevel+incr into curlevel\\n    end if\\n    if curlevel is 13 then\\n        put curlevel+incr into curlevel\\n    end if\\n    if curlevel is 28 then\\n        put curlevel+incr into curlevel\\n    end if\\n    if curlevel is 29 then\\n        put curlevel+incr into curlevel\\n    end if\\n    if curlevel is 37 then\\n        put curlevel+incr into curlevel\\n    end if\\n    \\n    if curlevel is 26 then\\n        -- victory!\\n        put -3 into curlevel\\n        put \\\"nogame\\\" into state\\n        refreshOnLevelChange\\n    else\\n        put 0 into loadlevelcount\\n        put \\\"Loading\\\" into cd fld \\\"roomname\\\"\\n        put \\\"loadinglevel\\\" into state\\n    end if\\nend beginloadlevel\\n\\non idle\\n    global state, curlevel\\n    if there is a cd btn \\\"stopall\\\" then\\n        answer \\\"stopping all\\\"\\n        global curlevel, state\\n        put \\\"needreset\\\" into curlevel\\n        put \\\"nogame\\\" into state\\n        refreshOnLevelChange\\n        show cd btn \\\"btn_continue\\\"\\n        set the label of cd btn \\\"btn_continue\\\" to \\\"Start Over\\\"\\n    end if\\n    if state is \\\"playing\\\" then\\n        global curlevel, lvlData, lvlObjects, dx, dy, gcurlvldata, gcurlvlObjects\\n        -- warning: be careful that we don't warp through a solid object.\\n        -- for example, if you are moving at 12 pixels per update, and your height is 5 pixels, it's possible to completely slip through\\n        -- a solid object that is only 6 pixels wide\\n        put 0 into dx\\n        put 0 into dy\\n        mainloopgame_collisions\\n        mainloopgame_checkbounds\\n        mainloopgame_motion\\n    else if state is \\\"dying\\\" then\\n        mainloopdying\\n    else if state is \\\"loadinglevel\\\" then\\n        mainlooploadinglevel\\n    end if\\nend idle\\n\\non afterkeydown\\n    global lastdirpressed, cheat_invincible\\n    if keychar() is \\\"ArrowLeft\\\" then\\n        put \\\"-1\\\" into lastdirpressed\\n    else if keychar() is \\\"ArrowRight\\\" then\\n        put \\\"1\\\" into lastdirpressed\\n    else if keyChar() is \\\"I\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"toggle cheatcode:invincible\\\"\\n        if cheat_invincible is true then\\n            put false into cheat_invincible\\n        else\\n            put true into cheat_invincible\\n        end if\\n    else if keyChar() is \\\"L\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"cheatcode:new life\\\"\\n        add 1 to cd fld \\\"lives\\\"\\n    else if keyChar() is \\\"N\\\" and shiftKey() and not keyrepeated() then\\n        global curlevel, state\\n        put \\\"needreset\\\" into curlevel\\n        put \\\"nogame\\\" into state\\n        refreshOnLevelChange\\n        show cd btn \\\"btn_continue\\\"\\n        set the label of cd btn \\\"btn_continue\\\" to \\\"Start Over\\\"\\n    end if\\nend afterkeydown\\n\\non modifyObjectState itemnumber, newvalue\\n    global curlevel, gcurlvldata, gcurlvlObjects, lvlData, lvlObjects\\n    -- modify cached for this level\\n    put newvalue into item (itemnumber) of gcurlvlObjects\\n    -- modify global state\\n    put gcurlvlObjects into line (curlevel) of lvlObjects\\nend modifyObjectState\\n\\non begindeath\\n    global state, deathcount, sprites_alldeadrght, cheat_invincible\\n    if cheat_invincible is not true then\\n        put \\\"dying\\\" into state\\n        put 0 into deathcount\\n        set the icon of cd btn \\\"glider_spritesme\\\" to sprites_alldeadrght\\n    end if\\nend begindeath\\n\\non refreshOnLevelChange\\n    global curlevel, gcurlvldata, gcurlvlObjects, lvlData, lvlObjects\\n    \\n    repeat with x=1 to 16\\n        hide cd btn (\\\"glider_sprites\\\" & x)\\n    end repeat\\n    hide cd btn \\\"glider_spritesme\\\"\\n    hide cd btn \\\"glider_spritesshadow\\\"\\n    \\n    global lastdirpressed, propsperobj\\n    put \\\"\\\" into lastdirpressed\\n    put 9 into propsperobj\\n    set the itemdelimiter to \\\"|\\\"\\n    show cd btn \\\"glider_bg0\\\"\\n    hide cd fld \\\"roomname\\\"\\n    hide cd fld \\\"score\\\"\\n    hide cd fld \\\"lives\\\"\\n    hide cd fld \\\"behindlives\\\"\\n    hide cd btn \\\"glider_spriteslivesicon\\\"\\n    hide cd fld \\\"gameover\\\"\\n    \\n    show cd btn \\\"btn_continue\\\"\\n    set the idlerate to \\\"default\\\"\\n    if curlevel is \\\"needreset\\\" then\\n        exit refreshOnLevelChange\\n    else if curlevel is \\\"\\\" or curlevel is -1 then\\n        put -1 into curlevel\\n        set the icon of cd btn \\\"glider_bg0\\\" to 1\\n        set the rect of cd btn \\\"btn_continue\\\" to 367,22,487,96\\n        set the label of cd btn \\\"btn_continue\\\" to \\\"New Game\\\"\\n    else if curlevel is -2 then\\n        set the icon of cd btn \\\"glider_bg0\\\" to 2\\n        set the rect of cd btn \\\"btn_continue\\\" to 126,300,126+254,300+36\\n        set the label of cd btn \\\"btn_continue\\\" to \\\"Start\\\"\\n    else if curlevel is -3 then\\n        set the icon of cd btn \\\"glider_bg0\\\" to 3\\n        set the rect of cd btn \\\"btn_continue\\\" to 126,300,126+254,300+36\\n        set the label of cd btn \\\"btn_continue\\\" to \\\"Home\\\"\\n        if cd fld \\\"lives\\\" > 0 then\\n            hide cd fld \\\"gameover\\\"\\n        else\\n            show cd fld \\\"gameover\\\"\\n            put (newline & newline & \\\"Game Over...\\\" & newline & newline & \\\"Your score was \\\" & (cd fld \\\"score\\\") & \\\".\\\") into cd fld \\\"gameover\\\"\\n        end if\\n    else\\n        set the idlerate to \\\"faster\\\"\\n        global sprites_shadoRght, sprites_shadoLft, sprites_right_forward, sprites_right_tipped, sprites_left_forward, sprites_left_tipped\\n        global sprites_turn_endpoint, sprites_right_forward2, sprites_right_tipped2, sprites_left_forward2, sprites_left_tipped2, sprites_turn_endpoint2\\n        global sprites_burnrght1, sprites_burnrght2, sprites_burnlft1, sprites_burnlft2, sprites_alldeadrght, sprites_alldeadlft\\n        global sprites_celVnt, sprites_celDct, sprites_flrVnt, sprites_paper, sprites_toastr, sprites_toast1\\n        global sprites_toast2, sprites_toast3, sprites_toast4, sprites_toast5, sprites_toast6, sprites_teaKtl\\n        global sprites_lftFan, sprites_ritFan, sprites_table, sprites_shredr, sprites_books, sprites_clock\\n        global sprites_candle, sprites_rbrBnd, sprites_ball, sprites_fshBwl, sprites_fish1, sprites_fish2\\n        global sprites_fish3, sprites_fish4, sprites_grease, sprites_greasefall1, sprites_greasefall2, sprites_litSwt\\n        global sprites_thermo, sprites_outlet, sprites_outletspark1, sprites_outletspark2, sprites_pwrSwt, sprites_guitar\\n        global sprites_drip, sprites_shelf, sprites_basket, sprites_paintg, sprites_battry, sprites_macTsh\\n        global sprites_upStar, sprites_dnStar, sprites_candleflame1, sprites_candleflame2, sprites_candleflame3, sprites_drop1\\n        global sprites_drop2, sprites_drop3, sprites_drop4, sprites_drop5\\n        show cd btn \\\"glider_spritesme\\\"\\n        show cd btn \\\"glider_spritesshadow\\\"\\n        show cd fld \\\"roomname\\\"\\n        show cd fld \\\"score\\\"\\n        show cd fld \\\"lives\\\"\\n        show cd fld \\\"behindlives\\\"\\n        show cd btn \\\"glider_spriteslivesicon\\\"\\n        set the icon of cd btn \\\"glider_bg0\\\" to 3+curlevel\\n        hide cd btn \\\"btn_continue\\\"\\n        global sprites_ventpatterny\\n        \\n        put 24 into kCeilingVert\\n\\t\\tput 325 into kFloorVert\\n        \\n        put 2 into q -- need to tweak the rect of everything larger, to make the sprite show up\\n        \\n        -- actually load the room\\n        global curlevel, lvlData, lvlObjects, dx, dy, propsperobj\\n        put line curlevel of lvlData into curlvldata\\n        put item 1 of curlvldata into cd fld \\\"roomname\\\"\\n        if cd fld \\\"roomname\\\" is \\\"Welcome...\\\" then\\n            put \\\"Across the room...\\\" into cd fld \\\"roomname\\\"\\n        end if\\n        \\n        -- actually load the room's objects\\n        put line (curlevel) of lvlObjects into curlvlObjects\\n        put item 2 of curlvldata into numobjects\\n        repeat with i = 1 to numobjects\\n            put (propsperobj * (i-1))  into j\\n            put item (j+3) of curlvlObjects into spritex0\\n            put item (j+4) of curlvlObjects into spritey0\\n            put item (j+5) of curlvlObjects into spritex1\\n            put item (j+6) of curlvlObjects into spritey1\\n            if spritex0 is \\\"\\\" then\\n                answer (i && j && curlvlObjects)\\n            end if\\n            set the rect of cd btn (\\\"glider_sprites\\\" & i) to spritex0, spritey0, max(1,spritex1), max(1,spritey1)\\n            set the icon of cd btn (\\\"glider_sprites\\\" & i) to 0 -- invisible by default\\n            put item (j+1) of curlvlObjects into objtypename\\n            put item (j+7) of curlvlObjects into amount\\n            put item (j+9) of curlvlObjects into isOn\\n            if isOn is 1 then\\n                show cd btn (\\\"glider_sprites\\\" & i)\\n--~                 set the style of cd btn (\\\"glider_sprites\\\" & i) to \\\"rectangle\\\"\\n            else\\n                hide cd btn (\\\"glider_sprites\\\" & i)\\n            end if\\n            \\n            if objtypename is \\\"flrVnt\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_ventpatterny\\n                -- the event rect is different than the sprite rect. see tempInt := (boundRect.right + boundRect.left) div 2;\\n                put round((spritex0 + spritex1)/2) into tempInt\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to tempInt - 8, amount, tempInt + 8, kFloorVert\\n            else if objtypename is \\\"celVnt\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_ventpatterny\\n                put round((spritex0 + spritex1)/2) into tempInt\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to tempInt - 8, kCeilingVert, tempInt + 8, amount\\n            else if objtypename is \\\"celDct\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_ventpatterny\\n                put round((spritex0 + spritex1)/2) into tempInt\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to tempInt - 8, kCeilingVert, tempInt + 8, amount\\n            else if objtypename is \\\"lftFan\\\" then\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to amount, spritey0 + 10, spritex0, spritey0 + 30\\n            else if objtypename is \\\"ritFan\\\" then\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to spritex1, spritey0 + 10, amount, spritey0 + 30\\n            else if objtypename is \\\"guitar\\\" then\\n--~                 set the rect of cd btn (\\\"glider_sprites\\\" & i) to spritex0+36, spritey0 + 24, spritex0+38, spritey1 -56\\n            else if objtypename is \\\"upStar\\\" then\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to spritex0 + 32, spritey0, spritex1 - 32, spritey0 + 8\\n                set the height of cd btn  (\\\"glider_sprites\\\" & i) to 70+the height of cd btn  (\\\"glider_sprites\\\" & i)\\n                set the top of cd btn  (\\\"glider_sprites\\\" & i) to -30+the top of cd btn  (\\\"glider_sprites\\\" & i)\\n            else if objtypename is \\\"dnStar\\\" then\\n                set the rect of cd btn (\\\"glider_sprites\\\" & i) to spritex0 + 32, spritey1 - 8, spritex1 - 32, spritey1\\n                set the height of cd btn  (\\\"glider_sprites\\\" & i) to 60+the height of cd btn  (\\\"glider_sprites\\\" & i)\\n                set the top of cd btn  (\\\"glider_sprites\\\" & i) to -30+the top of cd btn  (\\\"glider_sprites\\\" & i)\\n            else if objtypename is \\\"candle\\\" then\\n                put round((spritex0 + spritex1)/2) into tempInt\\n\\t\\t\\t\\tset the rect of cd btn (\\\"glider_sprites\\\" & i) to tempInt - 12, amount, tempInt + 4, spritey0\\n                \\n            else if objtypename is \\\"outlet\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_outlet\\n            else if objtypename is \\\"clock\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_clock\\n            else if objtypename is \\\"battry\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_battry\\n            else if objtypename is \\\"paper\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_paper\\n            \\n            -- bnsRct is a bonus rectangle\\n            else if objtypename is \\\"litSwt\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_litSwt\\n            else if objtypename is \\\"grease\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_grease\\n            else if objtypename is \\\"rbrBnd\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_rbrBnd\\n            else if objtypename is \\\"drip\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_drip\\n            else if objtypename is \\\"shredr\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_shredr\\n            else if objtypename is \\\"ball\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_ball\\n            else if objtypename is \\\"fshBwl\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_fshBwl\\n            else if objtypename is \\\"pwrSwt\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_pwrSwt\\n            else if objtypename is \\\"thermo\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_thermo\\n            else if objtypename is \\\"toastr\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_toastr\\n            else if objtypename is \\\"teaKtl\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_teaKtl\\n            else if objtypename is \\\"macTsh\\\" then\\n                set the icon of cd btn (\\\"glider_sprites\\\" & i) to sprites_macTsh\\n            end if\\n            \\n            set the width of cd btn (\\\"glider_sprites\\\" & i) to q + the width of cd btn (\\\"glider_sprites\\\" & i)\\n            set the height of cd btn (\\\"glider_sprites\\\" & i) to q + the height of cd btn (\\\"glider_sprites\\\" & i)\\n        end repeat\\n    end if\\n    \\n    if curlevel is not \\\"needreset\\\" and curlevel >= 1 then\\n        put line curlevel of lvlData into gcurlvldata\\n        put line curlevel of lvlObjects into gcurlvlObjects\\n    end if\\nend refreshOnLevelChange\\n\",\"name\":\"cdglider\",\"paint\":\"\"}},{\"type\":3,\"id\":\"1002\",\"parent_id\":\"1001\",\"attrs\":{\"x\":-3,\"y\":-1,\"w\":518,\"h\":346,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"glider_bg0\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"glider_bg0\"}},{\"type\":3,\"id\":\"1004\",\"parent_id\":\"1001\",\"attrs\":{\"x\":63,\"y\":44,\"w\":18,\"h\":283,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":72,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites1\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites1\"}},{\"type\":3,\"id\":\"1005\",\"parent_id\":\"1001\",\"attrs\":{\"x\":121,\"y\":220,\"w\":193,\"h\":100,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites2\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites2\"}},{\"type\":3,\"id\":\"1006\",\"parent_id\":\"1001\",\"attrs\":{\"x\":353,\"y\":44,\"w\":18,\"h\":283,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":72,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites3\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites3\"}},{\"type\":3,\"id\":\"1007\",\"parent_id\":\"1001\",\"attrs\":{\"x\":206,\"y\":87,\"w\":102,\"h\":9,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites4\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites4\"}},{\"type\":3,\"id\":\"1008\",\"parent_id\":\"1001\",\"attrs\":{\"x\":291,\"y\":63,\"w\":20,\"h\":28,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":60,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites5\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites5\"}},{\"type\":3,\"id\":\"1009\",\"parent_id\":\"1001\",\"attrs\":{\"x\":13,\"y\":61,\"w\":171,\"h\":148,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites6\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites6\"}},{\"type\":3,\"id\":\"1010\",\"parent_id\":\"1001\",\"attrs\":{\"x\":45,\"y\":80,\"w\":104,\"h\":95,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites7\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites7\"}},{\"type\":3,\"id\":\"1011\",\"parent_id\":\"1001\",\"attrs\":{\"x\":296,\"y\":153,\"w\":66,\"h\":172,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites8\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites8\"}},{\"type\":3,\"id\":\"1012\",\"parent_id\":\"1001\",\"attrs\":{\"x\":353,\"y\":57,\"w\":66,\"h\":34,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites9\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites9\"}},{\"type\":3,\"id\":\"1013\",\"parent_id\":\"1001\",\"attrs\":{\"x\":208,\"y\":131,\"w\":50,\"h\":23,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites10\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites10\"}},{\"type\":3,\"id\":\"1014\",\"parent_id\":\"1001\",\"attrs\":{\"x\":258,\"y\":142,\"w\":66,\"h\":34,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites11\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites11\"}},{\"type\":3,\"id\":\"1015\",\"parent_id\":\"1001\",\"attrs\":{\"x\":116,\"y\":66,\"w\":100,\"h\":58,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites12\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites12\"}},{\"type\":3,\"id\":\"1016\",\"parent_id\":\"1001\",\"attrs\":{\"x\":113,\"y\":63,\"w\":100,\"h\":58,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites13\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites13\"}},{\"type\":3,\"id\":\"1017\",\"parent_id\":\"1001\",\"attrs\":{\"x\":89,\"y\":39,\"w\":100,\"h\":58,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites14\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites14\"}},{\"type\":3,\"id\":\"1018\",\"parent_id\":\"1001\",\"attrs\":{\"x\":100,\"y\":50,\"w\":100,\"h\":58,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites15\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites15\"}},{\"type\":3,\"id\":\"1019\",\"parent_id\":\"1001\",\"attrs\":{\"x\":117,\"y\":67,\"w\":100,\"h\":58,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"glider_sprites16\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_sprites16\"}},{\"type\":4,\"id\":\"1020\",\"parent_id\":\"1001\",\"attrs\":{\"x\":2,\"y\":2,\"w\":175,\"h\":20,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"roomname\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u0002Looking at you...\"}},{\"type\":4,\"id\":\"1021\",\"parent_id\":\"1001\",\"attrs\":{\"x\":219,\"y\":2,\"w\":78,\"h\":20,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"score\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u0002800\"}},{\"type\":4,\"id\":\"1022\",\"parent_id\":\"1001\",\"attrs\":{\"x\":302,\"y\":2,\"w\":207,\"h\":20,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"behindlives\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":4,\"id\":\"1023\",\"parent_id\":\"1001\",\"attrs\":{\"x\":369,\"y\":5,\"w\":22,\"h\":17,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":false,\"script\":\"\",\"textalign\":\"left\",\"name\":\"lives\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002chicago_12_biuosdce\\u0002-1\"}},{\"type\":3,\"id\":\"1024\",\"parent_id\":\"1001\",\"attrs\":{\"x\":393,\"y\":0,\"w\":42,\"h\":22,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":4,\"showlabel\":false,\"style\":2,\"label\":\"glider_spriteslivesicon\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"glider_spriteslivesicon\"}},{\"type\":4,\"id\":\"1025\",\"parent_id\":\"1001\",\"attrs\":{\"x\":23,\"y\":23,\"w\":451,\"h\":236,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":5,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"gameover\",\"defaulttextfont\":\"times\",\"defaulttextsize\":18,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002times_18_biuosdce\\u0002\\n\\nGame Over...\\n\\nYour score was 800.\"}},{\"type\":3,\"id\":\"1026\",\"parent_id\":\"1001\",\"attrs\":{\"x\":174,\"y\":320,\"w\":49,\"h\":21,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":2,\"showlabel\":false,\"style\":2,\"label\":\"glider_spritesshadow\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_spritesshadow\"}},{\"type\":3,\"id\":\"1027\",\"parent_id\":\"1001\",\"attrs\":{\"x\":174,\"y\":72,\"w\":49,\"h\":21,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":18,\"showlabel\":false,\"style\":2,\"label\":\"glider_spritesme\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"glider_spritesme\"}},{\"type\":3,\"id\":\"1028\",\"parent_id\":\"1001\",\"attrs\":{\"x\":367,\"y\":22,\"w\":120,\"h\":74,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":9,\"label\":\"New Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"-- Glider, ported from Glider4 by Ben Fisher, https://github.com/downpoured/glider_4\\n-- script of cd btn \\\"btn_continue\\\":\\n\\n-- cd btn \\\"glider_bg0\\\"\\n-- cd btn \\\"glider_sprites1-16\\\"\\n-- cd btn \\\"glider_spritesme\\\"\\n-- cd btn \\\"glider_spritesshadow\\\"\\n-- cd btn \\\"btn_continue\\\"\\n-- cd fld \\\"roomname\\\"\\n-- cd fld \\\"score\\\"\\n-- cd fld \\\"lives\\\"\\n-- cd fld \\\"behindlives\\\"\\n-- cd fld \\\"gameover\\\"\\n-- cd btn \\\"glider_spriteslivesicon\\\"\\n\\non mouseup\\n    global curlevel, state\\n    if curlevel is \\\"needreset\\\" then\\n        initSpriteConstantsAndLoadGameData\\n        initui\\n        put \\\"nogame\\\" into state\\n        put -1 into curlevel\\n        refreshOnLevelChange\\n    else if curlevel is \\\"\\\" or curlevel is -1 then\\n        initSpriteConstantsAndLoadGameData\\n        initui\\n        put \\\"nogame\\\" into state\\n        put -2 into curlevel\\n        refreshOnLevelChange\\n    else if curlevel is -2 then\\n        startnewgame\\n        refreshOnLevelChange\\n    else if curlevel is -3 then\\n        put \\\"nogame\\\" into state\\n        put -1 into curlevel\\n        refreshOnLevelChange\\n    end if\\nend mouseup\\n\\non startnewgame\\n    global cheat_invincible, state, curlevel, sprites_right_forward, sprites_shadoRght, clockcount\\n    global lastdirpressed, dy, propsperobj\\n    global levelsseen\\n    initSpriteConstantsAndLoadGameData\\n    put false into cheat_invincible\\n    put \\\"playing\\\" into state\\n    put \\\"\\\" into cd fld \\\"behindlives\\\"\\n    put 3 into cd fld \\\"lives\\\"\\n    put 0 into cd fld \\\"score\\\"\\n    put 1 into curlevel\\n    set the icon of cd btn \\\"glider_spritesme\\\" to sprites_right_forward\\n    set the icon of cd btn \\\"glider_spritesshadow\\\" to sprites_shadoRght\\n    set the topleft of cd btn \\\"glider_spritesme\\\" to 20, 20\\n    set the topleft of cd btn \\\"glider_spritesshadow\\\" to -400, -400\\n    put \\\"\\\" into lastdirpressed\\n    put \\\"\\\" into levelsseen\\n    put 1 into line 1 of levelsseen\\n    put 0 into dy\\n    put 0 into clockcount\\n    set the itemdelimiter to \\\"|\\\"    \\n    put 9 into propsperobj\\n    \\n    global lvlData, lvlObjects\\n    -- turn on all objects in all levels...change this later.\\n    repeat with lv = 1 to 40\\n        put line lv of lvlData into curlvlData\\n        put line lv of lvlObjects into curlvlObjects\\n        put item 2 of curlvlData into numobjects\\n        repeat with i = 1 to numobjects\\n            put (propsperobj * (i-1))  into j\\n            put line lv of lvlObjects into tmp\\n            put 1 into item (j+9) of tmp\\n            put tmp into line lv of lvlObjects\\n        end repeat\\n    end repeat\\nend startnewgame\\n\\non initui\\n    global curlevel, sprites_right_forward\\n    set the style of cd btn \\\"glider_bg0\\\" to \\\"transparent\\\"\\n    set the showlabel of cd btn \\\"glider_bg0\\\" to false\\n    set the autohilite of cd btn \\\"glider_bg0\\\" to false\\n    set the style of cd fld \\\"roomname\\\" to \\\"shadow\\\"\\n    set the style of cd fld \\\"score\\\" to \\\"shadow\\\"\\n    set the style of cd fld \\\"behindlives\\\" to \\\"shadow\\\"\\n    set the style of cd fld \\\"lives\\\" to \\\"transparent\\\"\\n    set the style of cd btn \\\"glider_spriteslivesicon\\\" to \\\"transparent\\\"\\n    set the style of cd fld \\\"gameover\\\" to \\\"shadow\\\"\\n    set the defaulttextfont of cd fld \\\"gameover\\\" to \\\"times\\\"\\n    set the defaulttextsize of cd fld \\\"gameover\\\" to \\\"18\\\"\\n    set the textalign of cd fld \\\"gameover\\\" to \\\"center\\\"\\n    \\n    put 1 into q -- need to tweak the rect of everything larger, to make the sprite show up\\n    \\n    set the style of cd btn \\\"glider_bg0\\\" to \\\"transparent\\\"\\n    set the style of cd btn \\\"glider_spritesme\\\" to \\\"transparent\\\"\\n    set the style of cd btn \\\"glider_spritesshadow\\\" to \\\"transparent\\\"\\n    set the showlabel of cd btn \\\"glider_bg0\\\" to false\\n    set the showlabel of cd btn \\\"glider_spritesme\\\" to false\\n    set the showlabel of cd btn \\\"glider_spritesshadow\\\" to false\\n    set the rect of cd btn \\\"glider_bg0\\\" to -3, -1, 515, 345\\n    set the rect of cd btn \\\"glider_spritesme\\\" to 0,0,48+q,20+q\\n    set the rect of cd btn \\\"glider_spritesshadow\\\" to 0,0,48+q,20+q\\n    \\n    put 20 into basey\\n    put 22 into h\\n    set the rect of cd fld \\\"roomname\\\" to 28-26, basey-18, 177, h\\n    set the rect of cd fld \\\"score\\\" to 245-26, basey-18, (245-26)+78, h\\n    set the rect of cd fld \\\"behindlives\\\" to 328-26, basey-18, (328-26)+207, h\\n    set the rect of cd fld \\\"lives\\\" to (395-26), basey+3-18, (395-26)+22, h\\n    set the rect of cd btn \\\"glider_spriteslivesicon\\\" to 419-26, (basey-18)-2, (419-26)+42, h\\n    set the rect of cd fld \\\"gameover\\\" to 23,23,23+451,23+236\\n    set the icon of cd btn \\\"glider_spriteslivesicon\\\" to sprites_right_forward\\n    set the showlabel of cd btn \\\"glider_spriteslivesicon\\\" to false\\n    \\n    play \\\"glider_1_Aww\\\" load\\n    play \\\"glider_1_BeamIn\\\" load\\n    play \\\"glider_1_Clock\\\" load\\n    play \\\"glider_1_Energize\\\" load\\n    play \\\"glider_1_Extra\\\" load\\n    play \\\"glider_1_GetBand\\\" load\\n    play \\\"glider_1_Guitar\\\" load\\n    play \\\"glider_1_Zap\\\" load\\n    \\n    set the defaulttextfont of cd fld \\\"roomname\\\" to \\\"chicago\\\" \\n    set the defaulttextfont of cd fld \\\"score\\\" to \\\"chicago\\\" \\n    set the defaulttextfont of cd fld \\\"lives\\\" to \\\"chicago\\\" \\n    set the locktext of cd fld \\\"roomname\\\" to true \\n    set the locktext of cd fld \\\"score\\\" to true \\n    set the locktext of cd fld \\\"lives\\\" to true \\n    set the locktext of cd fld \\\"behindlives\\\" to true \\n    set the locktext of cd fld \\\"gameover\\\" to true \\n    \\n    repeat with x=1 to 16\\n        hide cd btn (\\\"glider_sprites\\\" & x)\\n        set the style of cd btn (\\\"glider_sprites\\\" & x) to \\\"transparent\\\"\\n        set the showlabel of cd btn (\\\"glider_sprites\\\" & x)  to false\\n        set the autohilite of cd btn (\\\"glider_sprites\\\" & x)  to false\\n        set the icon of cd btn (\\\"glider_sprites\\\" & x) to 0\\n    end repeat\\n    \\n    set the style of cd btn \\\"btn_continue\\\" to \\\"osdefault\\\"\\n    put -1 into curlevel\\n    refreshOnLevelChange\\nend initui\\n\\n\",\"name\":\"btn_continue\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/demo_graphics.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":2,\"fileformatminor\":0,\"buildnumber\":\"10002000\",\"uuid\":\"f883a96e-33db-4c81-9128-cf855fe0c203\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"increasingnumberforid\":2187,\"increasingnumberforelemname\":40,\"stacklineage\":\"YWRtaW5mZWF0dXJlZA|MTIzNA|demo\"}},{\"type\":6,\"id\":\"1002\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1003\",\"parent_id\":\"1002\",\"attrs\":{\"script\":\"\\n\\non mousewithin\\n\\tif the mouse() is \\\"down\\\" then\\n\\t\\tglobal chargeAmount\\n\\t\\tif chargeAmount is \\\"\\\" then\\n\\t\\t\\tput 0 into chargeAmount\\n\\t\\tend if\\n\\t\\tadd 1 to chargeAmount\\n\\t\\tshow cd fld \\\"charging\\\"\\n\\t\\tif chargeAmount >= 15 then\\n\\t\\t\\tput \\\"max charge!\\\" into howMuch\\n\\t\\telse\\n\\t\\t\\tput (1 + round(chargeAmount/3)) into howMuch\\n\\t\\tend if\\n\\t\\tput \\\"Charging... \\\" & newline & howMuch \\\\\\n\\t\\t\\tinto cd fld \\\"charging\\\"\\n\\telse\\n\\t\\tglobal chargeAmount\\n\\t\\tput 0 into chargeAmount\\n\\t\\thide cd fld \\\"charging\\\"\\n\\tend if\\nend mousewithin\\n\\non mouseup\\n\\tglobal chargeAmount\\n\\t\\n\\tput min(15, chargeAmount) into c\\n\\tput round(c/3) into c\\n\\tput 5 + c*c into c\\n\\t\\n\\tchoose \\\"oval\\\" tool\\n\\tput mouseh() into mx\\n\\tput mousev() into my\\n\\tput 4+random(10) into radius\\n\\tput 2+random(5)+round(c/2) into howmany\\n\\trepeat with i = 1 to howmany\\n\\t\\trepeat with j = 1 to howmany\\n\\t\\t\\tput mx + (i - round(howmany/2)) * c into x\\n\\t\\t\\tput my + (j - round(howmany/2)) * c into y\\n\\t\\t\\tdrag from x-radius, y-radius to x+radius, \\\\\\n\\t\\t\\t\\ty+radius\\n\\t\\tend repeat\\n\\tend repeat\\n\\tput 0 into chargeAmount\\n\\thide cd fld \\\"charging\\\"\\nend mouseup\\n\\n\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懈湔䷆姜棖⵶痆淕渖䏑檗ᵎ母澔㶾埛樖綞翀ᰭϡ䢔ᬯ䌱撊Ậ揑岞ᡮ፩犅ᵭ吉䚓᫯㍙溏Ῥ஥冘奎䮅禂峍⯵䶖寏欭掉庌寍宝夎㭽瞇帍簝䄐㨿݃椌㼼➳唚㦾枓紁㱽៫䬕㭿圻朋㻼矛弟㡞ཧ爄絝倇䘒竟⽗渎翜ᾯ吙禞徏簃紝㿿倗簟缠〪Ǡ␭ƀ㰨䆰⨮䅐㘫䈐ℬⅨ㤩⇈⴯ℸ㌪懸✭憘㼨ᆤ⢮ᅄ㒫ሄ⊬兴㪩凔⺯儬ㆪ㇬▭ㆌ㶨熼⮮煜㞫爜⁬ॢ㡩ূⱯल㉪䧲♭䦒㹨⦪⫂  \"}},{\"type\":4,\"id\":\"1004\",\"parent_id\":\"1003\",\"attrs\":{\"x\":6,\"y\":286,\"w\":455,\"h\":76,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":125,\"selend\":125,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 1\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002See and change the source code:\\nFrom Objects menu, click Card Info...\\nThen click the Script button in the lower right corner.\"}},{\"type\":4,\"id\":\"1006\",\"parent_id\":\"1003\",\"attrs\":{\"x\":7,\"y\":8,\"w\":403,\"h\":58,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":79,\"selend\":79,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 1\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":18,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_18_biuosdce\\u0002Click the Browse tool (looks like a hand)\\nthen click/hold somewhere over here!\"}},{\"type\":4,\"id\":\"1016\",\"parent_id\":\"1003\",\"attrs\":{\"x\":144,\"y\":213,\"w\":171,\"h\":41,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":2,\"visible\":false,\"script\":\"\",\"textalign\":\"center\",\"name\":\"charging\",\"defaulttextfont\":\"chicago\",\"defaulttextsize\":14,\"defaulttextstyle\":8,\"ftxt\":\"\\u0002chicago_14_biu+osdce\\u0002Charging... \\n1\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/demo_spacegame.json",
    "content": "﻿{\"product\":\"vpc\",\"fileformatmajor\":2,\"fileformatminor\":0,\"buildnumber\":\"00002002\",\"uuid\":\"ab71640b-61e2-45f2-a4b2-b417661bbde9\",\"elements\":[{\"type\":7,\"id\":\"901\",\"parent_id\":\"900\",\"attrs\":{\"script\":\"\\non startNewGameState\\n    global curlevel, numlives, maxgridx, maxgridy, curscore\\n    put 40 into maxgridx -- not 30\\n    put 40 into maxgridy -- not 22\\n    put 1 into curlevel\\n    put 3 into numlives\\n    put 0 into curscore\\n    repeat with lvl = 1 to 6\\n        put (lvl-1)+2975 into idyou\\n        set the showlabel of cd btn id idyou to false\\n        set the autohilite of cd btn id idyou to false\\n        set the style of cd btn id idyou to \\\"transparent\\\"\\n        set the name of cd btn id idyou to \\\"spacegame_sprites_n_you\\\"\\n        set the rect of cd btn id idyou to 1,1,18,18\\n        \\n        put (lvl-1)+3005 into idoxygenfull\\n        set the showlabel of cd btn id idoxygenfull to false\\n        set the autohilite of cd btn id idoxygenfull to false\\n        set the style of cd btn id idoxygenfull to \\\"rectangle\\\"\\n        set the rect of cd btn id idoxygenfull to 5, 47, 5+83, 47+10\\n        \\n        put (lvl-1)+3011 into idoxygencurrent\\n        set the showlabel of cd btn id idoxygencurrent to false\\n        set the autohilite of cd btn id idoxygencurrent to false\\n        set the style of cd btn id idoxygencurrent to \\\"rectangle\\\"\\n        set the rect of cd btn id idoxygencurrent to 5, 47, 5+83, 47+10\\n        set the hilite of cd btn id idoxygencurrent to true\\n        \\n        set the rect of cd btn id idyou to 1,1,18,18\\n        put (lvl-1)+2981 into idstatus\\n        set the style of cd fld id idstatus to \\\"transparent\\\"\\n        set the top of cd fld id idstatus to 5\\n        set the left of cd fld id idstatus to 5\\n        set the locktext of cd fld id idstatus to true\\n        put \\\"\\\" into cd fld id idstatus\\n        put (lvl-1)+2992 into idstartpos\\n        hide cd btn id idstartpos\\n        put (lvl-1)+2998 into idnewgame\\n        set the rect of cd btn id idnewgame to 5, 65, 5+83, 65+33\\n        set the name of cd btn id idnewgame to \\\"startnewgame\\\"\\n        set the label of cd btn id idnewgame to \\\"Exit Game\\\"\\n        show cd btn id idnewgame\\n    end repeat\\n    \\n    global c_key, c_pltf, c_pts, c_ramp, c_tank, c_doortop, c_doorbtm, c_chute\\n    put 13 into  c_key\\n    put 1 into     c_pltf\\n    put 7 into     c_pts\\n    put 5 into     c_ramp\\n    put 6 into     c_tank\\n    put 14 into     c_doortop\\n    put 15 into     c_doorbtm\\n    put 8 into     c_chute\\n    play \\\"pheta_1_airlock\\\" load\\n    play \\\"pheta_1_bonus\\\" load\\n    play \\\"pheta_1_boot\\\" load\\n    play \\\"pheta_1_cannon\\\" load\\n    play \\\"pheta_1_chute\\\" load\\n    play \\\"pheta_1_extra\\\" load\\n    play \\\"pheta_1_fry\\\" load\\n    play \\\"pheta_1_jump\\\" load\\n    play \\\"pheta_1_materialize\\\" load\\n    play \\\"pheta_1_nooxy\\\" load\\n    play \\\"pheta_1_scream\\\" load\\n    play \\\"pheta_1_splat\\\" load\\n    play \\\"pheta_1_spring\\\" load\\n    play \\\"pheta_1_walk\\\" load\\nend startNewGameState\\n\\non updateScoreStatus\\n    global curlevel, curscore, numlives, curoxy\\n    if curlevel is \\\"\\\" then\\n        exit updateScoreStatus\\n    end if\\n    put (curlevel-1)+2981 into idstatus\\n    put \\\"Score: \\\" & curscore & \\\" Lives: \\\" & numlives into cd fld id idstatus\\n    put (curlevel-1)+3005 into idoxygenfull\\n    put (curlevel-1)+3011 into idoxygencurrent\\n    set the width of cd btn id idoxygenfull to 100\\n    set the width of cd btn id idoxygencurrent to round(max(1, curoxy/(300/100)))\\nend updateScoreStatus\\n\\non loadLevel\\n    global curlevel, numlives, curoxy, curgrid,  maxgridx, maxgridy, me_gridx, me_gridy, hasKey\\n    global c_key, c_pltf, c_pts, c_ramp, c_tank, c_doortop, c_doorbtm, c_chute\\n    global keysneeded, doorsneeded\\n    global itemlookups\\n    put \\\"\\\" into curgrid\\n    set the itemDelimiter to \\\",\\\"\\n    put 0 into hasKey\\n    \\n    put 300 into curoxy\\n    \\n    put 0 into keysneeded\\n    put 0 into doorsneeded\\n    \\n    put \\\"\\\" into templateline\\n    repeat with y = 1 to maxgridx\\n        put 0 into item y of templateline\\n    end repeat\\n    repeat with x = 1 to maxgridy\\n        put templateline into line x of curgrid\\n    end repeat\\n    \\n    put 1928+172*(curlevel-1) into basisid\\n    put \\\"\\\" into itemlookups\\n    repeat with x = basisid to basisid + 172-3\\n        if the icon of cd btn id x is not 0 then\\n            show cd btn id x\\n            put trunc((the left of cd btn id x)/14) into gridx\\n            put trunc((the top of cd btn id x)/14) into gridy\\n            put the icon of cd btn id x into whatType\\n            \\n            put line gridx of curgrid into curline\\n            put whatType into item gridy of curline\\n            put curline into line gridx of curgrid\\n            \\n            if whatType is c_key or whatType is c_pts or whatType is c_tank or whatType is c_doorbtm then\\n                put \\\"\\\" into itemlookup\\n                put whatType into item 1 of itemlookup\\n                put \\\"1\\\" into item 2 of itemlookup\\n                put x into item 3 of itemlookup\\n                put gridx into item 4 of itemlookup\\n                put gridy into item 5 of itemlookup\\n                put itemlookup & cr after itemlookups\\n            end if\\n            if whatType is c_key then\\n                add 1 to keysneeded\\n            end if\\n            if whatType is c_doorbtm then\\n                add 1 to doorsneeded\\n            end if\\n        end if\\n    end repeat\\n    \\n    put (curlevel-1)+2992 into idstartpos\\n    put trunc((the left of cd btn id idstartpos)/14) into me_gridx\\n    put trunc((the top of cd btn id idstartpos)/14) into me_gridy\\n    \\n    put (curlevel-1)+2975 into idyou\\n    set the icon of cd btn id idyou to 40+1\\n    set the left of cd btn id idyou to me_gridx*14\\n    set the top of cd btn id idyou to me_gridy*14\\n    updateScoreStatus\\nend loadLevel\\n\\non moveyou dir\\n    global curlevel, numlives, curoxy, curgrid, maxgridx, maxgridy, me_gridx, me_gridy, hasKey, cheat_float, justbeatlevel\\n    global c_key, c_pltf, c_pts, c_ramp, c_tank, c_doortop, c_doorbtm, c_chute\\n    if curlevel is \\\"\\\" then\\n        exit moveyou\\n    end if\\n    global itemlookups\\n    put (curlevel-1)+2975 into idyou\\n    put 1 into cansurvivefall\\n    if cheat_float is not \\\"\\\" then\\n        if dir is 1 then\\n            add 1 to me_gridx\\n        else if dir is -1 then\\n            subtract 1 from me_gridx\\n        else if dir is 10 then\\n            subtract 1 from me_gridy\\n        else if dir is -10 then\\n            add 1 to me_gridy\\n        end if\\n        put item me_gridy of (line me_gridx of curgrid) into isThere\\n        set the topleft of cd btn id idyou to me_gridx*14, me_gridy*14\\n        put 0 into justbeatlevel\\n        checkItemGet isThere\\n        if justbeatlevel is 1 then\\n            onBeatLevel\\n            exit moveyou\\n        end if\\n        updateScoreStatus\\n        exit moveyou\\n    end if\\n    \\n    if dir is 1 or dir is -1 then\\n        subtract 1 from curoxy\\n        put me_gridx+dir into destx\\n        put me_gridy into desty\\n        put item (desty) of (line destx of curgrid) into isThere\\n        if isThere is c_pltf then\\n            -- can't walk into a platform\\n            exit moveyou\\n        end if\\n        -- do animation\\n        if dir is 1 then\\n            set the icon of cd btn id idyou to 30+1\\n            set the left of cd btn id idyou to me_gridx*14 + 7\\n            wait 50 ms\\n            set the icon of cd btn id idyou to 40+1\\n            set the left of cd btn id idyou to destx\\n        else\\n            set the icon of cd btn id idyou to 31+1\\n            set the left of cd btn id idyou to me_gridx*14 - 7\\n            wait 50 ms\\n            set the icon of cd btn id idyou to 41+1\\n            set the left of cd btn id idyou to destx\\n        end if\\n        put destx into me_gridx\\n        put desty into me_gridy\\n    else if dir is 100 then\\n        subtract 3.75 from curoxy\\n        -- hop one up and two across\\n        if (the icon of cd btn id idyou) mod 2 is 0 then\\n            put -1 into jumpdir\\n        else\\n            put 1 into jumpdir\\n        end if\\n        put me_gridx into tempdestx\\n        put me_gridy - 1 into tempdesty\\n        put item tempdesty of (line tempdestx of curgrid) into isThere\\n        if isThere is c_pltf then\\n            exit moveyou\\n        end if\\n        \\n        put me_gridx + 1*jumpdir into tempdestx\\n        put me_gridy - 1 into tempdesty\\n        put item tempdesty of (line tempdestx of curgrid) into isThere\\n        if isThere is c_pltf or isThere is c_ramp then\\n            exit moveyou\\n        end if\\n        \\n        put me_gridx + 2*jumpdir into tempdestx\\n        put me_gridy - 1 into tempdesty\\n        put item tempdesty of (line tempdestx of curgrid) into isThere\\n        put false into minijump\\n        if isThere is c_pltf or isThere is c_ramp then\\n            -- we can still do it, we'll just do a minijump\\n            put true into minijump\\n        end if\\n        -- play animation\\n        play \\\"pheta_1_jump\\\"\\n        put me_gridx into tempdestx\\n        put me_gridy - 1 into tempdesty\\n        set the topleft of cd btn id idyou to tempdestx*14, tempdesty*14\\n        wait 50 ms\\n        put me_gridx + 1*jumpdir into tempdestx\\n        put me_gridy - 1 into tempdesty\\n        set the topleft of cd btn id idyou to tempdestx*14, tempdesty*14\\n        if not minijump then\\n            wait 50 ms\\n            put me_gridx + 2*jumpdir into tempdestx\\n            put me_gridy - 1 into tempdesty\\n            set the topleft of cd btn id idyou to tempdestx*14, tempdesty*14\\n        end if\\n        put 3 into cansurvivefall\\n        put tempdestx into me_gridx\\n        put tempdesty into me_gridy\\n    else if dir is 10 then\\n        subtract 1 from curoxy\\n        put item me_gridy of (line me_gridx of curgrid) into isThere\\n        -- if you are stuck inside a platform presumably you are coming up from a ramp\\n        if isThere is c_ramp or isThere is c_pltf  then\\n            put me_gridy-1 into me_gridy\\n            set the topleft of cd btn id idyou to me_gridx*14, me_gridy*14\\n        else\\n            exit moveyou\\n        end if\\n    else if dir is -10 then\\n        subtract 1 from curoxy\\n        put item (me_gridy+1) of (line me_gridx of curgrid) into isThere1\\n        put item (me_gridy+2) of (line me_gridx of curgrid) into isThere2\\n        if isThere1 is c_ramp or isThere2 is c_ramp then\\n            put me_gridy+1 into me_gridy\\n            set the topleft of cd btn id idyou to me_gridx*14, me_gridy*14\\n        else\\n            exit moveyou\\n        end if\\n    end if\\n    \\n    put item me_gridy of (line me_gridx of curgrid) into isThere\\n    put 0 into justbeatlevel\\n    checkItemGet isThere\\n    if justbeatlevel is 1 then\\n        onBeatLevel\\n        exit moveyou\\n    end if\\n    if isThere is c_chute then\\n        put 100 into cansurvivefall\\n    end if\\n        \\n    repeat\\n        -- did you end up on solid ground?\\n        put item (me_gridy+1) of (line me_gridx of curgrid) into isThereBeneath\\n        if isThereBeneath is c_pltf or isThereBeneath is c_ramp then\\n            --put me_gridy+1 into me_gridy\\n            exit repeat\\n        else if isThereBeneath is c_chute then\\n            put 100 into cansurvivefall\\n        end if\\n        if me_gridy >= maxgridy then\\n            exit repeat\\n        end if\\n        -- keep falling\\n        put me_gridy+1 into me_gridy\\n        subtract 1 from cansurvivefall\\n        set the topleft of cd btn id idyou to me_gridx*14, me_gridy*14\\n        wait 50 ms\\n    end repeat\\n    set the topleft of cd btn id idyou to me_gridx*14, me_gridy*14\\n    \\n    if cansurvivefall < 0 then\\n        play \\\"pheta_1_splat\\\"\\n        set the icon of cd btn id idyou to 65+1\\n        beginDeath\\n    else if me_gridy >= (maxgridy-3) then\\n        play \\\"pheta_1_scream\\\"\\n        beginDeath\\n    else if curoxy <= 0 then\\n        play \\\"pheta_1_nooxy\\\"\\n        wait 400 ms\\n        beginDeath\\n    end if\\n    updateScoreStatus\\nend moveyou\\n\\non beginDeath\\n    global curlevel, numlives, curoxy, curgrid, maxgridx, maxgridy, me_gridx, me_gridy, hasKey, curscore\\n    wait 50 ms\\n    subtract 1 from numlives\\n    if numlives <= 0 then\\n        put \\\"\\\" into curlevel\\n        answer (\\\"Game Over\\\" & cr & cr & \\\"Score: \\\" & curscore)\\n        go to cd 1\\n    else\\n        loadlevel\\n        updateScoreStatus\\n    end if\\nend beginDeath\\n\\non onBeatLevel\\n    global curlevel, numlives, curoxy, curgrid, maxgridx, maxgridy, me_gridx, me_gridy, hasKey, curscore\\n    put curlevel + 1 into curlevel\\n    if curlevel > 6 then\\n        answer (\\\"You beat the game! Score \\\" & curscore)\\n        put \\\"\\\" into curlevel\\n        go to cd 1\\n        exit onBeatLevel\\n    end if\\n    go to cd (curlevel + 1)\\n    loadlevel\\n    add 200 to curscore\\n    updateScoreStatus\\nend onBeatLevel\\n\\non checkItemGet isThere\\n    global curlevel, numlives, curoxy, curgrid, maxgridx, maxgridy, me_gridx, me_gridy, hasKey, curscore, justbeatlevel\\n    global c_key, c_pltf, c_pts, c_ramp, c_tank, c_doortop, c_doorbtm, c_chute\\n    global keysneeded, doorsneeded\\n    \\n    global itemlookups\\n    repeat with x = 1 to the number of lines in itemlookups\\n        put line x of itemlookups into theline\\n        put item 4 of (theline) into gridx\\n        put item 5 of (theline) into gridy\\n        if gridx is me_gridx and gridy is me_gridy and (item 2 of theline is \\\"1\\\") then\\n            -- we found an item!\\n            put true into gettingIt\\n            put item 1 of theline into whatType \\n            if whatType is c_key then\\n                play \\\"pheta_1_chute\\\"\\n                add 1 to hasKey\\n            else if whatType is c_pts then\\n                play \\\"pheta_1_extra\\\"\\n                add 100 to curscore\\n            else if whatType is c_tank then\\n                play \\\"pheta_1_extra\\\"\\n                add 50 to curscore\\n                add 75 to curoxy\\n                put min(300, curoxy) into curoxy\\n            else if whatType is c_doorbtm then\\n                if hasKey <= 0 then\\n                    put false into gettingIt\\n                    answer \\\"key needed.\\\"\\n                else\\n                    subtract 1 from hasKey\\n                    subtract 1 from doorsneeded\\n                    if doorsneeded <= 0 then\\n                        play \\\"pheta_1_bonus\\\"\\n                        put 1 into justbeatlevel\\n                    else\\n                        play \\\"pheta_1_airlock\\\"\\n                    end if\\n                end if\\n            end if\\n            -- delete the item since it's not there anymore\\n            if gettingIt then\\n                put \\\"0\\\" into item 2 of theline\\n                put theline into line x of itemlookups\\n                hide cd btn id (item 3 of theline)\\n            end if\\n        end if\\n    end repeat\\nend checkItemGet\\n\\non afterkeydown\\n    global curlevel, lastdirpressed, cheat_invincible, numlives, cheat_float\\n    if keyrepeated() then\\n        exit afterkeydown\\n    end if\\n    if curlevel is \\\"\\\" then\\n        exit afterkeydown\\n    end if\\n    \\n    if keychar() is \\\"ArrowLeft\\\" then\\n        moveYou -1\\n    else if keychar() is \\\"ArrowRight\\\" then\\n        moveYou 1\\n    else if keychar() is \\\"ArrowUp\\\" then\\n        moveYou 10\\n    else if keychar() is \\\"ArrowDown\\\" then\\n        moveYou -10\\n    else if keychar() is \\\" \\\" then\\n        moveYou 100\\n    else if keyChar() is \\\"T\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"cheatcode:float\\\"\\n        if cheat_float is not \\\"\\\" then\\n            put \\\"\\\" into cheat_float\\n        else\\n            put \\\"1\\\" into cheat_float\\n        end if\\n    else if keyChar() is \\\"X\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"going to next level\\\"\\n        onBeatLevel\\n    else if keyChar() is \\\"L\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"cheatcode:new life\\\"\\n        add 1 to numlives\\n\\n    else if keyChar() is \\\"I\\\" and shiftKey() and not keyrepeated() then\\n        answer \\\"toggle cheatcode:invincible\\\"\\n        if cheat_invincible is true then\\n            put false into cheat_invincible\\n        else\\n            put true into cheat_invincible\\n        end if\\n    end if\\n    updateScoreStatus\\nend afterkeydown\\n\\non mouseup\\n    if \\\"startnewgame\\\" is in the short name of the target then\\n        go to cd 1\\n    end if\\nend mouseup\\n\\n\",\"name\":\"\",\"increasingnumberforelemname\":70,\"increasingnumberforid\":3018,\"stacklineage\":\"null|SU0XwHNo6Y0ee1GC8Xw1qSg|untitled\"}},{\"type\":6,\"id\":\"1000\",\"parent_id\":\"901\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1001\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"intro1\",\"paint\":\"\"}},{\"type\":4,\"id\":\"1003\",\"parent_id\":\"1001\",\"attrs\":{\"x\":130,\"y\":192,\"w\":248,\"h\":107,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":49,\"selend\":49,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"center\",\"name\":\"my field 2\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002A ViperCard re-creation of the \\nfirst 5 levels of\\n1989's Spacestation Pheta 1.5,\\nhttps://www.tandtsoftware.com/ \\nre-created in ViperCard.\\n\\n\\n\\n\\n\"}},{\"type\":3,\"id\":\"1005\",\"parent_id\":\"1001\",\"attrs\":{\"x\":60,\"y\":50,\"w\":385,\"h\":136,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":71,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_spritestitle\"}},{\"type\":3,\"id\":\"1006\",\"parent_id\":\"1001\",\"attrs\":{\"x\":108,\"y\":289,\"w\":112,\"h\":46,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Level Editor\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer (\\\"To edit any level, choose the button tool. Then, press the right arrow key to move to the first level. You can now click a platform or item to select and move it. To play the level, choose the browse tool, and click \\\" & cr & \\\"Exit Game.\\\")\\n\\t\\nend mouseUp\\n\\n\",\"name\":\"my button 5\"}},{\"type\":3,\"id\":\"1007\",\"parent_id\":\"1001\",\"attrs\":{\"x\":276,\"y\":290,\"w\":118,\"h\":46,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"New Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tgo to cd 8\\nend mouseUp\\n-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"my button 5\"}},{\"type\":3,\"id\":\"2964\",\"parent_id\":\"1001\",\"attrs\":{\"x\":124,\"y\":10,\"w\":259,\"h\":33,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":73,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_spritestitle\"}},{\"type\":5,\"id\":\"1927\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"2098\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2097\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2096\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2095\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2094\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2093\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2092\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2091\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2090\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2089\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2088\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2087\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2086\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2085\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2084\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2083\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2082\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2081\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2080\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2079\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2078\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2077\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2076\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2075\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2074\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2073\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2072\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2071\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2070\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2069\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2068\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2067\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2066\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2065\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2064\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2063\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2062\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2061\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2060\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2059\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2058\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2057\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2056\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2055\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2054\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2053\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2052\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2051\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2050\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2049\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2048\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2047\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2046\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2045\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2044\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2043\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2042\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2041\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2040\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2039\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2038\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2037\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2036\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2035\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2034\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2033\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2032\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2031\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2030\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2029\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2028\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2027\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2026\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2025\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2024\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2023\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2022\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2021\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2020\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2019\",\"parent_id\":\"1927\",\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2018\",\"parent_id\":\"1927\",\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2017\",\"parent_id\":\"1927\",\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2016\",\"parent_id\":\"1927\",\"attrs\":{\"x\":476,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2015\",\"parent_id\":\"1927\",\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2014\",\"parent_id\":\"1927\",\"attrs\":{\"x\":448,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2013\",\"parent_id\":\"1927\",\"attrs\":{\"x\":448,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2012\",\"parent_id\":\"1927\",\"attrs\":{\"x\":434,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2011\",\"parent_id\":\"1927\",\"attrs\":{\"x\":434,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2010\",\"parent_id\":\"1927\",\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2009\",\"parent_id\":\"1927\",\"attrs\":{\"x\":420,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2008\",\"parent_id\":\"1927\",\"attrs\":{\"x\":420,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2007\",\"parent_id\":\"1927\",\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2006\",\"parent_id\":\"1927\",\"attrs\":{\"x\":406,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2005\",\"parent_id\":\"1927\",\"attrs\":{\"x\":406,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2004\",\"parent_id\":\"1927\",\"attrs\":{\"x\":406,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2003\",\"parent_id\":\"1927\",\"attrs\":{\"x\":392,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2002\",\"parent_id\":\"1927\",\"attrs\":{\"x\":392,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2001\",\"parent_id\":\"1927\",\"attrs\":{\"x\":392,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2000\",\"parent_id\":\"1927\",\"attrs\":{\"x\":378,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1999\",\"parent_id\":\"1927\",\"attrs\":{\"x\":378,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1998\",\"parent_id\":\"1927\",\"attrs\":{\"x\":364,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1997\",\"parent_id\":\"1927\",\"attrs\":{\"x\":364,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1996\",\"parent_id\":\"1927\",\"attrs\":{\"x\":364,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1995\",\"parent_id\":\"1927\",\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1994\",\"parent_id\":\"1927\",\"attrs\":{\"x\":364,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1993\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1992\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1991\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1990\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1989\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1988\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1987\",\"parent_id\":\"1927\",\"attrs\":{\"x\":350,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1986\",\"parent_id\":\"1927\",\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1985\",\"parent_id\":\"1927\",\"attrs\":{\"x\":336,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1984\",\"parent_id\":\"1927\",\"attrs\":{\"x\":322,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1983\",\"parent_id\":\"1927\",\"attrs\":{\"x\":322,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1982\",\"parent_id\":\"1927\",\"attrs\":{\"x\":322,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1981\",\"parent_id\":\"1927\",\"attrs\":{\"x\":308,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1980\",\"parent_id\":\"1927\",\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1979\",\"parent_id\":\"1927\",\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1978\",\"parent_id\":\"1927\",\"attrs\":{\"x\":294,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1977\",\"parent_id\":\"1927\",\"attrs\":{\"x\":294,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1976\",\"parent_id\":\"1927\",\"attrs\":{\"x\":294,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1975\",\"parent_id\":\"1927\",\"attrs\":{\"x\":280,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1974\",\"parent_id\":\"1927\",\"attrs\":{\"x\":280,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1973\",\"parent_id\":\"1927\",\"attrs\":{\"x\":280,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1972\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1971\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1970\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1969\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1968\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1967\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1966\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1965\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1964\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1963\",\"parent_id\":\"1927\",\"attrs\":{\"x\":266,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1962\",\"parent_id\":\"1927\",\"attrs\":{\"x\":252,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1961\",\"parent_id\":\"1927\",\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1960\",\"parent_id\":\"1927\",\"attrs\":{\"x\":238,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1959\",\"parent_id\":\"1927\",\"attrs\":{\"x\":224,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1958\",\"parent_id\":\"1927\",\"attrs\":{\"x\":210,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1957\",\"parent_id\":\"1927\",\"attrs\":{\"x\":196,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1956\",\"parent_id\":\"1927\",\"attrs\":{\"x\":196,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1955\",\"parent_id\":\"1927\",\"attrs\":{\"x\":196,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1954\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1953\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1952\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1951\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1950\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1949\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1948\",\"parent_id\":\"1927\",\"attrs\":{\"x\":182,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1947\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1946\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1945\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1944\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1943\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1942\",\"parent_id\":\"1927\",\"attrs\":{\"x\":168,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1941\",\"parent_id\":\"1927\",\"attrs\":{\"x\":154,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1940\",\"parent_id\":\"1927\",\"attrs\":{\"x\":154,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1939\",\"parent_id\":\"1927\",\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1938\",\"parent_id\":\"1927\",\"attrs\":{\"x\":140,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1937\",\"parent_id\":\"1927\",\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1936\",\"parent_id\":\"1927\",\"attrs\":{\"x\":140,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1935\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1934\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1933\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1932\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1931\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1930\",\"parent_id\":\"1927\",\"attrs\":{\"x\":112,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1929\",\"parent_id\":\"1927\",\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"1928\",\"parent_id\":\"1927\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2975\",\"parent_id\":\"1927\",\"attrs\":{\"x\":126,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2981\",\"parent_id\":\"1927\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":17,\"selend\":17,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 35\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002Score: 0 Lives: 3\"}},{\"type\":3,\"id\":\"2992\",\"parent_id\":\"1927\",\"attrs\":{\"x\":138,\"y\":274,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"2998\",\"parent_id\":\"1927\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3005\",\"parent_id\":\"1927\",\"attrs\":{\"x\":5,\"y\":47,\"w\":100,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"my button 58\"}},{\"type\":3,\"id\":\"3011\",\"parent_id\":\"1927\",\"attrs\":{\"x\":5,\"y\":47,\"w\":100,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 64\"}},{\"type\":5,\"id\":\"2099\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懈湔䷆姜棖⵶痆淕渖䏑檗ᵎ母澔㶾埛樖綞翀ᰭϡ䢔ᬯ䌱撊Ậ揑岞ᡮ፩犅ᵭ吉䚓᫯㍙溏Ῥ஥冘奎䮅禂峍⯵䶖寏欭掉庌寍宝夎㭽瞇帍簝䄐㨿݃椌㼼➳唚㦾枓紁㱽៫䬕㭿圻朋㻼矛弟㡞ཧ爄絝倇䘒竟⽗渎翜ᾯ吙禞徏簃紝㿿倗簟缠〪Ǡ␭ƀ㰨䆰⨮䅐㘫䈐ℬⅨ㤩⇈⴯ℸ㌪懸✭憘㼨ᆤ⢮ᅄ㒫ሄ⊬兴㪩凔⺯儬ㆪ㇬▭ㆌ㶨熼⮮煜㞫爜⁬ॢ㡩ূⱯल㉪䧲♭䦒㹨⦪⫂  \"}},{\"type\":3,\"id\":\"2270\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2269\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2268\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2267\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2266\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2265\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2264\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2263\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2262\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2261\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2260\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2259\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2258\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2257\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2256\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2255\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2254\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2253\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2252\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2251\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2250\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2249\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2248\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2247\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2246\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2245\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2244\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2243\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2242\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2241\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2240\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2239\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2238\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2237\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2236\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2235\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2234\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2233\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2232\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2231\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2230\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2229\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2228\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2227\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2226\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2225\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2224\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2223\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2222\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2221\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2220\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2219\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2218\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2217\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2216\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2215\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2214\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2213\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2212\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2211\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2210\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2209\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2208\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2207\",\"parent_id\":\"2099\",\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2206\",\"parent_id\":\"2099\",\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2205\",\"parent_id\":\"2099\",\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2204\",\"parent_id\":\"2099\",\"attrs\":{\"x\":476,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2203\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2202\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2201\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2200\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2199\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2198\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2197\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2196\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2195\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2194\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2193\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2192\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2191\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2190\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2189\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2188\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2187\",\"parent_id\":\"2099\",\"attrs\":{\"x\":462,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2186\",\"parent_id\":\"2099\",\"attrs\":{\"x\":448,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2185\",\"parent_id\":\"2099\",\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2184\",\"parent_id\":\"2099\",\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2183\",\"parent_id\":\"2099\",\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2182\",\"parent_id\":\"2099\",\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2181\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2180\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2179\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2178\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2177\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2176\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2175\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2174\",\"parent_id\":\"2099\",\"attrs\":{\"x\":392,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2173\",\"parent_id\":\"2099\",\"attrs\":{\"x\":378,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2172\",\"parent_id\":\"2099\",\"attrs\":{\"x\":378,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2171\",\"parent_id\":\"2099\",\"attrs\":{\"x\":378,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2170\",\"parent_id\":\"2099\",\"attrs\":{\"x\":364,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2169\",\"parent_id\":\"2099\",\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2168\",\"parent_id\":\"2099\",\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2167\",\"parent_id\":\"2099\",\"attrs\":{\"x\":364,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2166\",\"parent_id\":\"2099\",\"attrs\":{\"x\":350,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2165\",\"parent_id\":\"2099\",\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2164\",\"parent_id\":\"2099\",\"attrs\":{\"x\":350,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2163\",\"parent_id\":\"2099\",\"attrs\":{\"x\":350,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2162\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2161\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2160\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2159\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2158\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2157\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2156\",\"parent_id\":\"2099\",\"attrs\":{\"x\":336,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2155\",\"parent_id\":\"2099\",\"attrs\":{\"x\":322,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2154\",\"parent_id\":\"2099\",\"attrs\":{\"x\":322,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2153\",\"parent_id\":\"2099\",\"attrs\":{\"x\":322,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2152\",\"parent_id\":\"2099\",\"attrs\":{\"x\":322,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2151\",\"parent_id\":\"2099\",\"attrs\":{\"x\":308,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2150\",\"parent_id\":\"2099\",\"attrs\":{\"x\":308,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2149\",\"parent_id\":\"2099\",\"attrs\":{\"x\":308,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2148\",\"parent_id\":\"2099\",\"attrs\":{\"x\":308,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2147\",\"parent_id\":\"2099\",\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2146\",\"parent_id\":\"2099\",\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2145\",\"parent_id\":\"2099\",\"attrs\":{\"x\":294,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2144\",\"parent_id\":\"2099\",\"attrs\":{\"x\":294,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2143\",\"parent_id\":\"2099\",\"attrs\":{\"x\":280,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2142\",\"parent_id\":\"2099\",\"attrs\":{\"x\":280,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2141\",\"parent_id\":\"2099\",\"attrs\":{\"x\":280,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2140\",\"parent_id\":\"2099\",\"attrs\":{\"x\":280,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2139\",\"parent_id\":\"2099\",\"attrs\":{\"x\":266,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2138\",\"parent_id\":\"2099\",\"attrs\":{\"x\":266,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2137\",\"parent_id\":\"2099\",\"attrs\":{\"x\":266,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2136\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2135\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2134\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2133\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2132\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2131\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2130\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2129\",\"parent_id\":\"2099\",\"attrs\":{\"x\":252,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2128\",\"parent_id\":\"2099\",\"attrs\":{\"x\":238,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2127\",\"parent_id\":\"2099\",\"attrs\":{\"x\":238,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2126\",\"parent_id\":\"2099\",\"attrs\":{\"x\":238,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2125\",\"parent_id\":\"2099\",\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2124\",\"parent_id\":\"2099\",\"attrs\":{\"x\":224,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2123\",\"parent_id\":\"2099\",\"attrs\":{\"x\":224,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2122\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2121\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2120\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2119\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2118\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2117\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2116\",\"parent_id\":\"2099\",\"attrs\":{\"x\":210,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2115\",\"parent_id\":\"2099\",\"attrs\":{\"x\":196,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2114\",\"parent_id\":\"2099\",\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2113\",\"parent_id\":\"2099\",\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2112\",\"parent_id\":\"2099\",\"attrs\":{\"x\":182,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2111\",\"parent_id\":\"2099\",\"attrs\":{\"x\":168,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2110\",\"parent_id\":\"2099\",\"attrs\":{\"x\":168,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2109\",\"parent_id\":\"2099\",\"attrs\":{\"x\":154,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2108\",\"parent_id\":\"2099\",\"attrs\":{\"x\":154,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2107\",\"parent_id\":\"2099\",\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2106\",\"parent_id\":\"2099\",\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2105\",\"parent_id\":\"2099\",\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2104\",\"parent_id\":\"2099\",\"attrs\":{\"x\":126,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2103\",\"parent_id\":\"2099\",\"attrs\":{\"x\":126,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2102\",\"parent_id\":\"2099\",\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2101\",\"parent_id\":\"2099\",\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2100\",\"parent_id\":\"2099\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2976\",\"parent_id\":\"2099\",\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2982\",\"parent_id\":\"2099\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 36\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":3,\"id\":\"2993\",\"parent_id\":\"2099\",\"attrs\":{\"x\":136,\"y\":203,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"2999\",\"parent_id\":\"2099\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3006\",\"parent_id\":\"2099\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 59\"}},{\"type\":3,\"id\":\"3012\",\"parent_id\":\"2099\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 65\"}},{\"type\":5,\"id\":\"2271\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"2442\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2441\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2440\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2439\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2438\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2437\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2436\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2435\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2434\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2433\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2432\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2431\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2430\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2429\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2428\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2427\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2426\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2425\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2424\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2423\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2422\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2421\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2420\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2419\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2418\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2417\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2416\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2415\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2414\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2413\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2412\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2411\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2410\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2409\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2408\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2407\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2406\",\"parent_id\":\"2271\",\"attrs\":{\"x\":490,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2405\",\"parent_id\":\"2271\",\"attrs\":{\"x\":476,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2404\",\"parent_id\":\"2271\",\"attrs\":{\"x\":476,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2403\",\"parent_id\":\"2271\",\"attrs\":{\"x\":476,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2402\",\"parent_id\":\"2271\",\"attrs\":{\"x\":476,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2401\",\"parent_id\":\"2271\",\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2400\",\"parent_id\":\"2271\",\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2399\",\"parent_id\":\"2271\",\"attrs\":{\"x\":462,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2398\",\"parent_id\":\"2271\",\"attrs\":{\"x\":462,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2397\",\"parent_id\":\"2271\",\"attrs\":{\"x\":448,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2396\",\"parent_id\":\"2271\",\"attrs\":{\"x\":448,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2395\",\"parent_id\":\"2271\",\"attrs\":{\"x\":448,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2394\",\"parent_id\":\"2271\",\"attrs\":{\"x\":448,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2393\",\"parent_id\":\"2271\",\"attrs\":{\"x\":448,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2392\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2391\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2390\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2389\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2388\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2387\",\"parent_id\":\"2271\",\"attrs\":{\"x\":434,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2386\",\"parent_id\":\"2271\",\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2385\",\"parent_id\":\"2271\",\"attrs\":{\"x\":420,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2384\",\"parent_id\":\"2271\",\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2383\",\"parent_id\":\"2271\",\"attrs\":{\"x\":406,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2382\",\"parent_id\":\"2271\",\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2381\",\"parent_id\":\"2271\",\"attrs\":{\"x\":406,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2380\",\"parent_id\":\"2271\",\"attrs\":{\"x\":406,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2379\",\"parent_id\":\"2271\",\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2378\",\"parent_id\":\"2271\",\"attrs\":{\"x\":392,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2377\",\"parent_id\":\"2271\",\"attrs\":{\"x\":392,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2376\",\"parent_id\":\"2271\",\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2375\",\"parent_id\":\"2271\",\"attrs\":{\"x\":378,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2374\",\"parent_id\":\"2271\",\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2373\",\"parent_id\":\"2271\",\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2372\",\"parent_id\":\"2271\",\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2371\",\"parent_id\":\"2271\",\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2370\",\"parent_id\":\"2271\",\"attrs\":{\"x\":364,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2369\",\"parent_id\":\"2271\",\"attrs\":{\"x\":350,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2368\",\"parent_id\":\"2271\",\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2367\",\"parent_id\":\"2271\",\"attrs\":{\"x\":350,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2366\",\"parent_id\":\"2271\",\"attrs\":{\"x\":350,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2365\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2364\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2363\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2362\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2361\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2360\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2359\",\"parent_id\":\"2271\",\"attrs\":{\"x\":336,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2358\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2357\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2356\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2355\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2354\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2353\",\"parent_id\":\"2271\",\"attrs\":{\"x\":322,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2352\",\"parent_id\":\"2271\",\"attrs\":{\"x\":308,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2351\",\"parent_id\":\"2271\",\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2350\",\"parent_id\":\"2271\",\"attrs\":{\"x\":308,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2349\",\"parent_id\":\"2271\",\"attrs\":{\"x\":308,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2348\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2347\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2346\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2345\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2344\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2343\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2342\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2341\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2340\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2339\",\"parent_id\":\"2271\",\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2338\",\"parent_id\":\"2271\",\"attrs\":{\"x\":280,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2337\",\"parent_id\":\"2271\",\"attrs\":{\"x\":280,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2336\",\"parent_id\":\"2271\",\"attrs\":{\"x\":280,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2335\",\"parent_id\":\"2271\",\"attrs\":{\"x\":266,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2334\",\"parent_id\":\"2271\",\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2333\",\"parent_id\":\"2271\",\"attrs\":{\"x\":266,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2332\",\"parent_id\":\"2271\",\"attrs\":{\"x\":252,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2331\",\"parent_id\":\"2271\",\"attrs\":{\"x\":252,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2330\",\"parent_id\":\"2271\",\"attrs\":{\"x\":252,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2329\",\"parent_id\":\"2271\",\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2328\",\"parent_id\":\"2271\",\"attrs\":{\"x\":252,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2327\",\"parent_id\":\"2271\",\"attrs\":{\"x\":238,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2326\",\"parent_id\":\"2271\",\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2325\",\"parent_id\":\"2271\",\"attrs\":{\"x\":238,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2324\",\"parent_id\":\"2271\",\"attrs\":{\"x\":238,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2323\",\"parent_id\":\"2271\",\"attrs\":{\"x\":224,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2322\",\"parent_id\":\"2271\",\"attrs\":{\"x\":224,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2321\",\"parent_id\":\"2271\",\"attrs\":{\"x\":224,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2320\",\"parent_id\":\"2271\",\"attrs\":{\"x\":224,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2319\",\"parent_id\":\"2271\",\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2318\",\"parent_id\":\"2271\",\"attrs\":{\"x\":210,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2317\",\"parent_id\":\"2271\",\"attrs\":{\"x\":210,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2316\",\"parent_id\":\"2271\",\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2315\",\"parent_id\":\"2271\",\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2314\",\"parent_id\":\"2271\",\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2313\",\"parent_id\":\"2271\",\"attrs\":{\"x\":196,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2312\",\"parent_id\":\"2271\",\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2311\",\"parent_id\":\"2271\",\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2310\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2309\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2308\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2307\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2306\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2305\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2304\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2303\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2302\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2301\",\"parent_id\":\"2271\",\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2300\",\"parent_id\":\"2271\",\"attrs\":{\"x\":168,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2299\",\"parent_id\":\"2271\",\"attrs\":{\"x\":168,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2298\",\"parent_id\":\"2271\",\"attrs\":{\"x\":168,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2297\",\"parent_id\":\"2271\",\"attrs\":{\"x\":168,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2296\",\"parent_id\":\"2271\",\"attrs\":{\"x\":154,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2295\",\"parent_id\":\"2271\",\"attrs\":{\"x\":154,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2294\",\"parent_id\":\"2271\",\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2293\",\"parent_id\":\"2271\",\"attrs\":{\"x\":154,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2292\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2291\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2290\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2289\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2288\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2287\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2286\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2285\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2284\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2283\",\"parent_id\":\"2271\",\"attrs\":{\"x\":140,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2282\",\"parent_id\":\"2271\",\"attrs\":{\"x\":126,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2281\",\"parent_id\":\"2271\",\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2280\",\"parent_id\":\"2271\",\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2279\",\"parent_id\":\"2271\",\"attrs\":{\"x\":126,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2278\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2277\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2276\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2275\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2274\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2273\",\"parent_id\":\"2271\",\"attrs\":{\"x\":112,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2272\",\"parent_id\":\"2271\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2977\",\"parent_id\":\"2271\",\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2983\",\"parent_id\":\"2271\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 37\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":3,\"id\":\"2994\",\"parent_id\":\"2271\",\"attrs\":{\"x\":131,\"y\":288,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"3000\",\"parent_id\":\"2271\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3007\",\"parent_id\":\"2271\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 60\"}},{\"type\":3,\"id\":\"3013\",\"parent_id\":\"2271\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 66\"}},{\"type\":5,\"id\":\"2443\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"2614\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2613\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2612\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2611\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2610\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2609\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2608\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2607\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2606\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2605\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2604\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2603\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2602\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2601\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2600\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2599\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2598\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2597\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2596\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2595\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2594\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2593\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2592\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2591\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2590\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2589\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2588\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2587\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2586\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2585\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2584\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2583\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2582\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2581\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2580\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2579\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2578\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2577\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2576\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2575\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2574\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2573\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2572\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2571\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2570\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2569\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2568\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2567\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2566\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2565\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2564\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2563\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2562\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2561\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2560\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2559\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2558\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2557\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2556\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2555\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2554\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2553\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2552\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2551\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2550\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2549\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2548\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2547\",\"parent_id\":\"2443\",\"attrs\":{\"x\":490,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2546\",\"parent_id\":\"2443\",\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2545\",\"parent_id\":\"2443\",\"attrs\":{\"x\":476,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2544\",\"parent_id\":\"2443\",\"attrs\":{\"x\":476,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2543\",\"parent_id\":\"2443\",\"attrs\":{\"x\":462,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2542\",\"parent_id\":\"2443\",\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2541\",\"parent_id\":\"2443\",\"attrs\":{\"x\":462,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2540\",\"parent_id\":\"2443\",\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2539\",\"parent_id\":\"2443\",\"attrs\":{\"x\":462,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2538\",\"parent_id\":\"2443\",\"attrs\":{\"x\":448,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2537\",\"parent_id\":\"2443\",\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2536\",\"parent_id\":\"2443\",\"attrs\":{\"x\":448,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2535\",\"parent_id\":\"2443\",\"attrs\":{\"x\":434,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2534\",\"parent_id\":\"2443\",\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2533\",\"parent_id\":\"2443\",\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2532\",\"parent_id\":\"2443\",\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2531\",\"parent_id\":\"2443\",\"attrs\":{\"x\":420,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2530\",\"parent_id\":\"2443\",\"attrs\":{\"x\":406,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2529\",\"parent_id\":\"2443\",\"attrs\":{\"x\":406,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2528\",\"parent_id\":\"2443\",\"attrs\":{\"x\":406,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2527\",\"parent_id\":\"2443\",\"attrs\":{\"x\":392,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2526\",\"parent_id\":\"2443\",\"attrs\":{\"x\":392,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2525\",\"parent_id\":\"2443\",\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2524\",\"parent_id\":\"2443\",\"attrs\":{\"x\":378,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2523\",\"parent_id\":\"2443\",\"attrs\":{\"x\":378,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2522\",\"parent_id\":\"2443\",\"attrs\":{\"x\":378,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2521\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2520\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2519\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2518\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2517\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2516\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2515\",\"parent_id\":\"2443\",\"attrs\":{\"x\":364,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2514\",\"parent_id\":\"2443\",\"attrs\":{\"x\":350,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2513\",\"parent_id\":\"2443\",\"attrs\":{\"x\":350,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2512\",\"parent_id\":\"2443\",\"attrs\":{\"x\":350,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2511\",\"parent_id\":\"2443\",\"attrs\":{\"x\":336,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2510\",\"parent_id\":\"2443\",\"attrs\":{\"x\":336,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2509\",\"parent_id\":\"2443\",\"attrs\":{\"x\":336,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2508\",\"parent_id\":\"2443\",\"attrs\":{\"x\":336,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2507\",\"parent_id\":\"2443\",\"attrs\":{\"x\":322,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2506\",\"parent_id\":\"2443\",\"attrs\":{\"x\":322,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2505\",\"parent_id\":\"2443\",\"attrs\":{\"x\":322,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2504\",\"parent_id\":\"2443\",\"attrs\":{\"x\":308,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2503\",\"parent_id\":\"2443\",\"attrs\":{\"x\":294,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2502\",\"parent_id\":\"2443\",\"attrs\":{\"x\":294,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2501\",\"parent_id\":\"2443\",\"attrs\":{\"x\":294,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2500\",\"parent_id\":\"2443\",\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2499\",\"parent_id\":\"2443\",\"attrs\":{\"x\":280,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2498\",\"parent_id\":\"2443\",\"attrs\":{\"x\":280,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2497\",\"parent_id\":\"2443\",\"attrs\":{\"x\":280,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2496\",\"parent_id\":\"2443\",\"attrs\":{\"x\":266,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2495\",\"parent_id\":\"2443\",\"attrs\":{\"x\":266,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2494\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2493\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2492\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2491\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2490\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2489\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2488\",\"parent_id\":\"2443\",\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2487\",\"parent_id\":\"2443\",\"attrs\":{\"x\":238,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2486\",\"parent_id\":\"2443\",\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2485\",\"parent_id\":\"2443\",\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2484\",\"parent_id\":\"2443\",\"attrs\":{\"x\":224,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2483\",\"parent_id\":\"2443\",\"attrs\":{\"x\":224,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2482\",\"parent_id\":\"2443\",\"attrs\":{\"x\":224,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2481\",\"parent_id\":\"2443\",\"attrs\":{\"x\":210,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2480\",\"parent_id\":\"2443\",\"attrs\":{\"x\":210,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2479\",\"parent_id\":\"2443\",\"attrs\":{\"x\":210,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2478\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2477\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2476\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2475\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2474\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2473\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2472\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2471\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2470\",\"parent_id\":\"2443\",\"attrs\":{\"x\":196,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2469\",\"parent_id\":\"2443\",\"attrs\":{\"x\":182,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2468\",\"parent_id\":\"2443\",\"attrs\":{\"x\":182,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2467\",\"parent_id\":\"2443\",\"attrs\":{\"x\":168,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2466\",\"parent_id\":\"2443\",\"attrs\":{\"x\":168,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2465\",\"parent_id\":\"2443\",\"attrs\":{\"x\":154,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2464\",\"parent_id\":\"2443\",\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2463\",\"parent_id\":\"2443\",\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2462\",\"parent_id\":\"2443\",\"attrs\":{\"x\":154,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2461\",\"parent_id\":\"2443\",\"attrs\":{\"x\":154,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2460\",\"parent_id\":\"2443\",\"attrs\":{\"x\":140,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2459\",\"parent_id\":\"2443\",\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2458\",\"parent_id\":\"2443\",\"attrs\":{\"x\":140,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2457\",\"parent_id\":\"2443\",\"attrs\":{\"x\":140,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2456\",\"parent_id\":\"2443\",\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2455\",\"parent_id\":\"2443\",\"attrs\":{\"x\":126,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2454\",\"parent_id\":\"2443\",\"attrs\":{\"x\":126,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2453\",\"parent_id\":\"2443\",\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2452\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2451\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2450\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2449\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2448\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2447\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2446\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2445\",\"parent_id\":\"2443\",\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2444\",\"parent_id\":\"2443\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2978\",\"parent_id\":\"2443\",\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2984\",\"parent_id\":\"2443\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 38\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":3,\"id\":\"2995\",\"parent_id\":\"2443\",\"attrs\":{\"x\":441,\"y\":257,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"3001\",\"parent_id\":\"2443\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3008\",\"parent_id\":\"2443\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 61\"}},{\"type\":3,\"id\":\"3014\",\"parent_id\":\"2443\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 67\"}},{\"type\":5,\"id\":\"2615\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":3,\"id\":\"2786\",\"parent_id\":\"2615\",\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2785\",\"parent_id\":\"2615\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2784\",\"parent_id\":\"2615\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2783\",\"parent_id\":\"2615\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2782\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2781\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2780\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2779\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2778\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2777\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2776\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2775\",\"parent_id\":\"2615\",\"attrs\":{\"x\":490,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2774\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2773\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2772\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2771\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2770\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2769\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2768\",\"parent_id\":\"2615\",\"attrs\":{\"x\":476,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2767\",\"parent_id\":\"2615\",\"attrs\":{\"x\":462,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2766\",\"parent_id\":\"2615\",\"attrs\":{\"x\":462,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2765\",\"parent_id\":\"2615\",\"attrs\":{\"x\":462,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2764\",\"parent_id\":\"2615\",\"attrs\":{\"x\":462,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2763\",\"parent_id\":\"2615\",\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2762\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2761\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2760\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2759\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2758\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2757\",\"parent_id\":\"2615\",\"attrs\":{\"x\":448,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2756\",\"parent_id\":\"2615\",\"attrs\":{\"x\":434,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2755\",\"parent_id\":\"2615\",\"attrs\":{\"x\":434,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2754\",\"parent_id\":\"2615\",\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2753\",\"parent_id\":\"2615\",\"attrs\":{\"x\":434,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2752\",\"parent_id\":\"2615\",\"attrs\":{\"x\":434,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2751\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2750\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2749\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2748\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2747\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2746\",\"parent_id\":\"2615\",\"attrs\":{\"x\":420,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2745\",\"parent_id\":\"2615\",\"attrs\":{\"x\":406,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2744\",\"parent_id\":\"2615\",\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2743\",\"parent_id\":\"2615\",\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2742\",\"parent_id\":\"2615\",\"attrs\":{\"x\":406,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2741\",\"parent_id\":\"2615\",\"attrs\":{\"x\":406,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2740\",\"parent_id\":\"2615\",\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2739\",\"parent_id\":\"2615\",\"attrs\":{\"x\":392,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2738\",\"parent_id\":\"2615\",\"attrs\":{\"x\":378,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2737\",\"parent_id\":\"2615\",\"attrs\":{\"x\":378,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2736\",\"parent_id\":\"2615\",\"attrs\":{\"x\":378,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2735\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2734\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2733\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2732\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2731\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2730\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2729\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2728\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2727\",\"parent_id\":\"2615\",\"attrs\":{\"x\":364,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2726\",\"parent_id\":\"2615\",\"attrs\":{\"x\":350,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2725\",\"parent_id\":\"2615\",\"attrs\":{\"x\":350,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2724\",\"parent_id\":\"2615\",\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2723\",\"parent_id\":\"2615\",\"attrs\":{\"x\":336,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2722\",\"parent_id\":\"2615\",\"attrs\":{\"x\":336,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2721\",\"parent_id\":\"2615\",\"attrs\":{\"x\":336,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2720\",\"parent_id\":\"2615\",\"attrs\":{\"x\":322,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2719\",\"parent_id\":\"2615\",\"attrs\":{\"x\":322,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2718\",\"parent_id\":\"2615\",\"attrs\":{\"x\":322,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2717\",\"parent_id\":\"2615\",\"attrs\":{\"x\":322,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2716\",\"parent_id\":\"2615\",\"attrs\":{\"x\":322,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2715\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2714\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2713\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2712\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2711\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2710\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2709\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2708\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2707\",\"parent_id\":\"2615\",\"attrs\":{\"x\":308,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2706\",\"parent_id\":\"2615\",\"attrs\":{\"x\":294,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2705\",\"parent_id\":\"2615\",\"attrs\":{\"x\":294,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2704\",\"parent_id\":\"2615\",\"attrs\":{\"x\":294,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2703\",\"parent_id\":\"2615\",\"attrs\":{\"x\":280,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2702\",\"parent_id\":\"2615\",\"attrs\":{\"x\":280,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2701\",\"parent_id\":\"2615\",\"attrs\":{\"x\":280,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2700\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2699\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2698\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2697\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2696\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2695\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2694\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2693\",\"parent_id\":\"2615\",\"attrs\":{\"x\":266,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2692\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2691\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2690\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2689\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2688\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2687\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2686\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2685\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2684\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2683\",\"parent_id\":\"2615\",\"attrs\":{\"x\":252,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2682\",\"parent_id\":\"2615\",\"attrs\":{\"x\":238,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2681\",\"parent_id\":\"2615\",\"attrs\":{\"x\":238,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2680\",\"parent_id\":\"2615\",\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2679\",\"parent_id\":\"2615\",\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2678\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2677\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2676\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2675\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2674\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2673\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2672\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2671\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2670\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2669\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2668\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2667\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2666\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2665\",\"parent_id\":\"2615\",\"attrs\":{\"x\":224,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2664\",\"parent_id\":\"2615\",\"attrs\":{\"x\":210,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2663\",\"parent_id\":\"2615\",\"attrs\":{\"x\":210,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2662\",\"parent_id\":\"2615\",\"attrs\":{\"x\":210,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2661\",\"parent_id\":\"2615\",\"attrs\":{\"x\":210,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2660\",\"parent_id\":\"2615\",\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2659\",\"parent_id\":\"2615\",\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2658\",\"parent_id\":\"2615\",\"attrs\":{\"x\":196,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2657\",\"parent_id\":\"2615\",\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2656\",\"parent_id\":\"2615\",\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2655\",\"parent_id\":\"2615\",\"attrs\":{\"x\":196,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2654\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2653\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2652\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2651\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2650\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2649\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2648\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2647\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2646\",\"parent_id\":\"2615\",\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2645\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2644\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2643\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2642\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2641\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2640\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2639\",\"parent_id\":\"2615\",\"attrs\":{\"x\":168,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2638\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2637\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2636\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2635\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2634\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2633\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2632\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2631\",\"parent_id\":\"2615\",\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2630\",\"parent_id\":\"2615\",\"attrs\":{\"x\":140,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2629\",\"parent_id\":\"2615\",\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2628\",\"parent_id\":\"2615\",\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2627\",\"parent_id\":\"2615\",\"attrs\":{\"x\":140,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2626\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2625\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2624\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2623\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2622\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2621\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2620\",\"parent_id\":\"2615\",\"attrs\":{\"x\":126,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2619\",\"parent_id\":\"2615\",\"attrs\":{\"x\":112,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2618\",\"parent_id\":\"2615\",\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2617\",\"parent_id\":\"2615\",\"attrs\":{\"x\":112,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2616\",\"parent_id\":\"2615\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2979\",\"parent_id\":\"2615\",\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2985\",\"parent_id\":\"2615\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 39\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":3,\"id\":\"2996\",\"parent_id\":\"2615\",\"attrs\":{\"x\":124,\"y\":36,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"3002\",\"parent_id\":\"2615\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3009\",\"parent_id\":\"2615\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 62\"}},{\"type\":3,\"id\":\"3015\",\"parent_id\":\"2615\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 68\"}},{\"type\":5,\"id\":\"2787\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"ᆦ弹⺽忣઒⵻椆廯㰞ش㢳▾⋪坳㛛瑘樆⻖綯ᶝ柾耐ᡈ㡨棑焳዇⓭䮿ბ⦒䫵㘊᭕㞉混忀烱熳厇晎⵾姛㞞戃吇៎濼㺚缓簏翠えᰲഫޤ⍂凱᣸岜⅑ᒼ䥭◇剓᥹沼湾㽀塴⹉ᚵ䯪ᖵ⬊䶍⻞僸檎㓖嫻洽从睯㟏忰᰺༬䝦搃৩唔暖㝟᡼ⵏᙷ⮋疭曶箇㯗忸ḽྮ⟇㐓䘅欚玛㯟属ế住埗篧琋縓縛耜Ơ偘द䆀硂ಥ⇰䱖஧愨扉๤凈婝ࣦㅸ癇෥爘䅐䩇ॄ楌佄⦴啚䧆榔絁䲅᧬䭕䮇夼杋伄秜彟䠶բ烄ⴵ䘂䓒⪷╒泎⾴ᖪ務⥶喊竃⳵㗺仗⯷甦懈湔䷆姜棖⵶痆淕渖䏑檗ᵎ母澔㶾埛樖綞翀ᰭϡ䢔ᬯ䌱撊Ậ揑岞ᡮ፩犅ᵭ吉䚓᫯㍙溏Ῥ஥冘奎䮅禂峍⯵䶖寏欭掉庌寍宝夎㭽瞇帍簝䄐㨿݃椌㼼➳唚㦾枓紁㱽៫䬕㭿圻朋㻼矛弟㡞ཧ爄絝倇䘒竟⽗渎翜ᾯ吙禞徏簃紝㿿倗簟缠〪Ǡ␭ƀ㰨䆰⨮䅐㘫䈐ℬⅨ㤩⇈⴯ℸ㌪懸✭憘㼨ᆤ⢮ᅄ㒫ሄ⊬兴㪩凔⺯儬ㆪ㇬▭ㆌ㶨熼⮮煜㞫爜⁬ॢ㡩ূⱯल㉪䧲♭䦒㹨⦪⫂  \"}},{\"type\":3,\"id\":\"2958\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2957\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2956\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2955\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2954\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2953\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2952\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2951\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2950\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2949\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2948\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2947\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2946\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2945\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2944\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2943\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2942\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2941\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2940\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2939\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2938\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2937\",\"parent_id\":\"2787\",\"attrs\":{\"x\":490,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2936\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2935\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2934\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2933\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2932\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2931\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2930\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2929\",\"parent_id\":\"2787\",\"attrs\":{\"x\":476,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2928\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2927\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2926\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2925\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2924\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2923\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2922\",\"parent_id\":\"2787\",\"attrs\":{\"x\":462,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2921\",\"parent_id\":\"2787\",\"attrs\":{\"x\":448,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2920\",\"parent_id\":\"2787\",\"attrs\":{\"x\":448,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2919\",\"parent_id\":\"2787\",\"attrs\":{\"x\":434,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2918\",\"parent_id\":\"2787\",\"attrs\":{\"x\":434,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2917\",\"parent_id\":\"2787\",\"attrs\":{\"x\":434,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2916\",\"parent_id\":\"2787\",\"attrs\":{\"x\":434,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2915\",\"parent_id\":\"2787\",\"attrs\":{\"x\":434,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2914\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2913\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2912\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2911\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2910\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2909\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":224,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2908\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2907\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2906\",\"parent_id\":\"2787\",\"attrs\":{\"x\":420,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2905\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2904\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2903\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2902\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2901\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2900\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2899\",\"parent_id\":\"2787\",\"attrs\":{\"x\":406,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2898\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2897\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2896\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2895\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2894\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2893\",\"parent_id\":\"2787\",\"attrs\":{\"x\":392,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2892\",\"parent_id\":\"2787\",\"attrs\":{\"x\":378,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2891\",\"parent_id\":\"2787\",\"attrs\":{\"x\":378,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2890\",\"parent_id\":\"2787\",\"attrs\":{\"x\":378,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2889\",\"parent_id\":\"2787\",\"attrs\":{\"x\":364,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2888\",\"parent_id\":\"2787\",\"attrs\":{\"x\":364,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2887\",\"parent_id\":\"2787\",\"attrs\":{\"x\":364,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2886\",\"parent_id\":\"2787\",\"attrs\":{\"x\":364,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2885\",\"parent_id\":\"2787\",\"attrs\":{\"x\":364,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2884\",\"parent_id\":\"2787\",\"attrs\":{\"x\":350,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2883\",\"parent_id\":\"2787\",\"attrs\":{\"x\":350,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2882\",\"parent_id\":\"2787\",\"attrs\":{\"x\":350,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2881\",\"parent_id\":\"2787\",\"attrs\":{\"x\":336,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2880\",\"parent_id\":\"2787\",\"attrs\":{\"x\":336,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2879\",\"parent_id\":\"2787\",\"attrs\":{\"x\":336,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2878\",\"parent_id\":\"2787\",\"attrs\":{\"x\":322,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2877\",\"parent_id\":\"2787\",\"attrs\":{\"x\":322,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2876\",\"parent_id\":\"2787\",\"attrs\":{\"x\":322,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2875\",\"parent_id\":\"2787\",\"attrs\":{\"x\":308,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2874\",\"parent_id\":\"2787\",\"attrs\":{\"x\":308,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2873\",\"parent_id\":\"2787\",\"attrs\":{\"x\":308,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2872\",\"parent_id\":\"2787\",\"attrs\":{\"x\":294,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2871\",\"parent_id\":\"2787\",\"attrs\":{\"x\":294,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2870\",\"parent_id\":\"2787\",\"attrs\":{\"x\":294,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2869\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2868\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2867\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2866\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2865\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2864\",\"parent_id\":\"2787\",\"attrs\":{\"x\":280,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2863\",\"parent_id\":\"2787\",\"attrs\":{\"x\":266,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2862\",\"parent_id\":\"2787\",\"attrs\":{\"x\":266,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2861\",\"parent_id\":\"2787\",\"attrs\":{\"x\":252,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2860\",\"parent_id\":\"2787\",\"attrs\":{\"x\":252,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2859\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2858\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2857\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2856\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2855\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":182,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2854\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2853\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2852\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2851\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2850\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2849\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2848\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2847\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2846\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2845\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":5,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2844\",\"parent_id\":\"2787\",\"attrs\":{\"x\":238,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2843\",\"parent_id\":\"2787\",\"attrs\":{\"x\":224,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2842\",\"parent_id\":\"2787\",\"attrs\":{\"x\":224,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2841\",\"parent_id\":\"2787\",\"attrs\":{\"x\":210,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2840\",\"parent_id\":\"2787\",\"attrs\":{\"x\":210,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":7,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2839\",\"parent_id\":\"2787\",\"attrs\":{\"x\":210,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2838\",\"parent_id\":\"2787\",\"attrs\":{\"x\":210,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2837\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2836\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2835\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2834\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2833\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2832\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2831\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2830\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":56,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2829\",\"parent_id\":\"2787\",\"attrs\":{\"x\":196,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2828\",\"parent_id\":\"2787\",\"attrs\":{\"x\":182,\"y\":294,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2827\",\"parent_id\":\"2787\",\"attrs\":{\"x\":182,\"y\":210,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2826\",\"parent_id\":\"2787\",\"attrs\":{\"x\":182,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2825\",\"parent_id\":\"2787\",\"attrs\":{\"x\":182,\"y\":42,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2824\",\"parent_id\":\"2787\",\"attrs\":{\"x\":168,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2823\",\"parent_id\":\"2787\",\"attrs\":{\"x\":168,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2822\",\"parent_id\":\"2787\",\"attrs\":{\"x\":168,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":15,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2821\",\"parent_id\":\"2787\",\"attrs\":{\"x\":168,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":14,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2820\",\"parent_id\":\"2787\",\"attrs\":{\"x\":168,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2819\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":280,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2818\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":238,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2817\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2816\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2815\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2814\",\"parent_id\":\"2787\",\"attrs\":{\"x\":154,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2813\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":266,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2812\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2811\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2810\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2809\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2808\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2807\",\"parent_id\":\"2787\",\"attrs\":{\"x\":140,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":13,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2806\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2805\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2804\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2803\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2802\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2801\",\"parent_id\":\"2787\",\"attrs\":{\"x\":126,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2800\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":252,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2799\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":196,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2798\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":168,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2797\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":154,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2796\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":140,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2795\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":126,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2794\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":112,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2793\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":98,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2792\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":84,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2791\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":70,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":8,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2790\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":28,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":1,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2789\",\"parent_id\":\"2787\",\"attrs\":{\"x\":112,\"y\":14,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":6,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2788\",\"parent_id\":\"2787\",\"attrs\":{\"x\":0,\"y\":0,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":2,\"label\":\"\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"\",\"name\":\"spacegame_sprites_n0\"}},{\"type\":3,\"id\":\"2980\",\"parent_id\":\"2787\",\"attrs\":{\"x\":1,\"y\":1,\"w\":17,\"h\":17,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":41,\"showlabel\":false,\"style\":2,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"spacegame_sprites_n_you\"}},{\"type\":4,\"id\":\"2986\",\"parent_id\":\"2787\",\"attrs\":{\"x\":5,\"y\":5,\"w\":100,\"h\":100,\"dontwrap\":false,\"enabled\":true,\"locktext\":true,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 40\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0,\"ftxt\":\"\"}},{\"type\":3,\"id\":\"2997\",\"parent_id\":\"2787\",\"attrs\":{\"x\":136,\"y\":62,\"w\":66,\"h\":24,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"startpos\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":false,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 46\"}},{\"type\":3,\"id\":\"3003\",\"parent_id\":\"2787\",\"attrs\":{\"x\":5,\"y\":65,\"w\":83,\"h\":33,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Exit Game\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"startnewgame\"}},{\"type\":3,\"id\":\"3010\",\"parent_id\":\"2787\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 63\"}},{\"type\":3,\"id\":\"3016\",\"parent_id\":\"2787\",\"attrs\":{\"x\":5,\"y\":47,\"w\":83,\"h\":10,\"autohilite\":false,\"enabled\":true,\"hilite\":true,\"checkmark\":false,\"icon\":0,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 69\"}},{\"type\":5,\"id\":\"2966\",\"parent_id\":\"1000\",\"attrs\":{\"script\":\"\",\"name\":\"intro2\",\"paint\":\"\"}},{\"type\":3,\"id\":\"2967\",\"parent_id\":\"2966\",\"attrs\":{\"x\":4,\"y\":65,\"w\":442,\"h\":287,\"autohilite\":false,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":72,\"showlabel\":false,\"style\":4,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"spacegame_spritestitle\"}},{\"type\":3,\"id\":\"2968\",\"parent_id\":\"2966\",\"attrs\":{\"x\":8,\"y\":27,\"w\":30,\"h\":26,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":61,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\"}},{\"type\":3,\"id\":\"2969\",\"parent_id\":\"2966\",\"attrs\":{\"x\":165,\"y\":27,\"w\":30,\"h\":26,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":62,\"showlabel\":false,\"style\":3,\"label\":\"New Button\",\"textalign\":\"center\",\"textfont\":\"geneva\",\"textsize\":9,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\"}},{\"type\":3,\"id\":\"2970\",\"parent_id\":\"2966\",\"attrs\":{\"x\":335,\"y\":27,\"w\":73,\"h\":26,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":3,\"label\":\"spacebar\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"my button 22\"}},{\"type\":3,\"id\":\"2971\",\"parent_id\":\"2966\",\"attrs\":{\"x\":357,\"y\":230,\"w\":140,\"h\":100,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"Begin\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tstartNewGameState\\n\\tgo to cd 2\\n\\tloadLevel\\nend mouseUp\\n-- looking for the game code?\\n-- it's in the Stack Script.\\n-- choose Stack info from the objects menu and click Script\",\"name\":\"my button 25\"}},{\"type\":4,\"id\":\"2972\",\"parent_id\":\"2966\",\"attrs\":{\"x\":38,\"y\":24,\"w\":126,\"h\":38,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":8,\"selend\":8,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002ARROWKEY LEFT TO MOVE LEFT\"}},{\"type\":4,\"id\":\"2973\",\"parent_id\":\"2966\",\"attrs\":{\"x\":199,\"y\":23,\"w\":137,\"h\":38,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":28,\"selend\":28,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002ARROWKEY RIGHT TO MOVE RIGHT\"}},{\"type\":4,\"id\":\"2974\",\"parent_id\":\"2966\",\"attrs\":{\"x\":415,\"y\":25,\"w\":126,\"h\":38,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":13,\"selend\":13,\"scroll\":0,\"style\":3,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 26\",\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":1,\"ftxt\":\"\\u0002geneva_12_+biuosdce\\u0002SPACE TO\\nJUMP\"}}]}"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/ref_commands.json",
    "content": "{\"name\": \"Commands\", \"entries\": [{\"title\": \"add\", \"body\": \"\\u0002times_24_biuosdce\\u0002add {number} to [chunk of] {container}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Adds the value of number to the number in a container.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput 2 into x\\nadd 3 to x\\nanswer x -- will display \\\"5\\\"\\n\\nput \\\"1,2,3\\\" into x\\nadd 3 to item 2 of x\\nanswer x -- will display \\\"1,5,3\\\"\"}, {\"title\": \"answer\", \"body\": \"\\u0002times_24_biuosdce\\u0002answer {text}\\nanswer {text} with {option1} or {option2} [or {option3}]\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Displays a dialog box.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer \\\"abc\\\" -- will display \\\"abc\\\"\\n\\nanswer \\\"are you sure?\\\" with \\\"OK\\\" or \\\"cancel\\\" \\n-- user can choose OK or cancel\\nput it into whichChosen\\nif whichChosen is 1 then\\n    answer \\\"clicked OK\\\"\\nelse if whichChosen is 2 then\\n    answer \\\"clicked cancel\\\"\\nend if\"}, {\"title\": \"ask\", \"body\": \"\\u0002times_24_biuosdce\\u0002ask {text}\\nask {text} with {defaulttext}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Displays a dialog box allowing the user to type in a response.\\nIf the user clicks Cancel, the result will be an empty string \\\"\\\".\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nask \\\"what is your favorite color?\\\" with \\\"blue\\\"\\nput it into favColor\\nanswer (\\\"you chose\\\" && favColor)\"}, {\"title\": \"beep\", \"body\": \"\\u0002times_24_biuosdce\\u0002beep\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Play the system beep sound.\"}, {\"title\": \"choose\", \"body\": \"\\u0002times_24_biuosdce\\u0002choose {toolname} tool\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use the choose command for programmatically drawing pictures.\\nSee the example.\\nDoesn't set the actual tool, which is always Browse when scripts \\nare running.\\nSee also: click, drag.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nchoose \\\"pencil\\\" tool\\nclick at 10,20\\n-- this draws a black pixel at the coordinates x=10, y=20\\n\\n-- Currently supported tools include:\\nbrush\\nbucket\\npencil\\nline\\nrect\\noval\\nroundrect\\ncurve\\nspray\"}, {\"title\": \"click\", \"body\": \"\\u0002times_24_biuosdce\\u0002click at {x}, {y}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use the click command for programmatically drawing pictures.\\nRemember to first use the choose command to indicate what to \\ndraw.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nchoose \\\"pencil\\\" tool\\nclick at 10,20\\n-- this draws a pixel at the coordinates x=10, y=20\"}, {\"title\": \"create\", \"body\": \"\\u0002times_24_biuosdce\\u0002create btn|fld\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}, {\"title\": \"delete\", \"body\": \"\\u0002times_24_biuosdce\\u0002delete char {i} of {container}\\ndelete char {i} to {j} of {container}\\ndelete btn|fld\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"abcde\\\" into x\\ndelete char 2 of x\\nanswer x -- shows \\\"acde\\\"\\n\\nput \\\"abcde\\\" into x\\ndelete char 2 to 4 of x\\nanswer x -- shows \\\"ae\\\"\\n\\nAs far as deleting a button or field, this feature will arrive in a \\nfuture version...\"}, {\"title\": \"disable\", \"body\": \"\\u0002times_24_biuosdce\\u0002disable {button}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Disables a button (sets the \\\"enabled\\\" property to true, so that the\\nbutton no longer responds to clicks).\"}, {\"title\": \"divide\", \"body\": \"\\u0002times_24_biuosdce\\u0002divide [chunk of] {container} by {number}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Divides the number in a container by a number.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput 12 into x\\ndivide x by 3\\nanswer x -- will display \\\"4\\\"\\n\\nput \\\"1,12,3\\\" into x\\ndivide item 2 of x by 3\\nanswer x -- will display \\\"1,4,3\\\"\"}, {\"title\": \"drag\", \"body\": \"\\u0002times_24_biuosdce\\u0002drag from {x1}, {y1} to {x2}, {y2}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use the drag command for programmatically drawing pictures.\\nRemember to first use the choose command to indicate what to \\ndraw.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nchoose \\\"line\\\" tool\\ndrag from 10,20 to 30,40\\n-- this draws a line starting at the coordinates (10,20) \\n-- ending at (30,40)\"}, {\"title\": \"enable\", \"body\": \"\\u0002times_24_biuosdce\\u0002enable {button}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Enables a button (sets the \\\"enabled\\\" property to false, so that the\\nbutton is no longer disabled).\"}, {\"title\": \"exit\", \"body\": \"\\u0002times_24_biuosdce\\u0002exit\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Exits the current function, skipping over any subsequent lines \\nof code. Similar to return, but does not return a value.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mouseUp\\n    put cd fld \\\"fld1\\\" into x\\n    if x is not a number then\\n        answer \\\"you did not type a number\\\"\\n        exit mouseUp\\n    end if\\n    put x * 2 into cd fld \\\"fld1\\\"\\nend mouseUp\"}, {\"title\": \"exit repeat\", \"body\": \"\\u0002times_24_biuosdce\\u0002exit repeat\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Exit the current loop.\\nEquivalent to \\\"break\\\" in C.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nrepeat with x = 1 to 3\\n    if x == 2 then\\n        break\\n    end if\\n    answer x\\nend repeat\\n-- displays 1\\n-- and does not display 2 or 3\"}, {\"title\": \"get\", \"body\": \"\\u0002times_24_biuosdce\\u0002get {expression}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Evaluates any expression and saves the result to the variable \\\"it\\\".\\n\\nNot very useful compared with the 'put' command, but it is here\\nfor tradition's sake.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nget 2+3\\nput it into x\\nanswer x -- shows 5\\n\\nget the width of cd btn \\\"myBtn\\\"\\nput it into x\\nanswer x -- shows the width of the specified button\"}, {\"title\": \"global\", \"body\": \"\\u0002times_24_biuosdce\\u0002global {variableName}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Indicates that a variable is a global.\\n1) it can be accessed from any other script\\n2) the contents are saved even after the function is complete.\\nThe contents are lost when the stack is exited, however, and are not saved to disk.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nglobal currentData1, currentData2\\nput \\\"stored 1\\\" into currentData1\\nput \\\"stored 2\\\" into currentData2\"}, {\"title\": \"go\", \"body\": \"\\u0002times_24_biuosdce\\u0002go {number}\\ngo {ordinal}\\ngo {relativePosition}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Go to a different card.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\ngo to card 1 -- goes to first card\\ngo first -- goes to first card\\ngo last -- goes to last card\\ngo next -- goes to the next card\\ngo prev -- goes to the previous card\\n\\nThe following are supported:\\nlast\\nmiddle\\nany\\nfirst\\nsecond\\nthird\\nfourth\\nfifth\\nsixth\\nseventh\\neigth\\nninth\\ntenth\\nnext\\nprevious\\nthis\\nmid\\nprev\"}, {\"title\": \"hide\", \"body\": \"\\u0002times_24_biuosdce\\u0002hide {button|field}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Hides a button or field.\"}, {\"title\": \"if/then\", \"body\": \"\\u0002times_24_biuosdce\\u0002if/then\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Like in C, if a branch can be taken, all other else branches\\nwill be skipped, as in the third example below.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif x > 0 then\\n    answer \\\"x is greater than 0\\\"\\nend if\\n\\nif x > 0 then\\n    answer \\\"x is greater than 0\\\"\\nelse\\n    answer \\\"x is not greater than 0\\\"\\nend if\\n\\nif 3+3 is 6 then\\n    answer \\\"yes\\\"\\nelse if 2+2 is 4 then\\n    answer \\\"not run, even though it is true\\\"\\nend if\\n\\nif x > 50 then\\n    answer \\\"x is greater than 50\\\"\\nelse if x > 40 then\\n    answer \\\"x is greater than 40\\\"\\nelse\\n    answer \\\"x is not greater than 40\\\"\\nend if\"}, {\"title\": \"lock screen\", \"body\": \"\\u0002times_24_biuosdce\\u0002lock screen\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}, {\"title\": \"multiply\", \"body\": \"\\u0002times_24_biuosdce\\u0002multiply [chunk of] {container} by {number}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Multiplies the number in a container by a number.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput 12 into x\\nmultiply x by 3\\nanswer x -- will display \\\"36\\\"\\n\\nput \\\"1,12,3\\\" into x\\nmultiply item 2 of x by 3\\nanswer x -- will display \\\"1,36,3\\\"\"}, {\"title\": \"next repeat\", \"body\": \"\\u0002times_24_biuosdce\\u0002next repeat\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Inside a loop, go back to the top of the loop, skipping the next \\nline(s) of code. Equivalent to \\\"continue\\\" in C.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nrepeat with x = 1 to 3\\n    if x == 2 then\\n        next repeat\\n    end if\\n    answer x\\nend repeat\\n-- displays 1\\n-- displays 3\\n-- and does not display 2\"}, {\"title\": \"pass\", \"body\": \"\\u0002times_24_biuosdce\\u0002pass\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Exits the current function and calls a function higher in the\\nmessage hierarchy. For example, if a button has the script\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"button handling the event\\\"\\nend mouseUp\\nand the current card has the script\\non mouseUp\\n    answer \\\"card handling the event\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\nand the button is clicked,\\nonly the button's code will be run.\\n\\nIf you want both to be run, you can use the pass command.\\nIf a button has the script\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"button handling the event\\\"\\n    pass mouseUp\\n    -- any code here will be skipped\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\nand the current card has the script\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"card handling the event\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\nand the button is clicked,\\nboth will be run.\"}, {\"title\": \"put\", \"body\": \"\\u0002times_24_biuosdce\\u0002put {expression} into {container}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Evaluates any expression and saves the result to a variable or \\ncontainer.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"hello\\\" into cd fld \\\"message\\\"\\n\\nput 2+3 into x\\nanswer x -- shows 5\\n\\nput \\\"aa,bb,cc\\\" into x\\nput \\\"11\\\" into item 2 of x\\nanswer x -- shows \\\"aa,11,cc\\\"\\n\\nput \\\"abc\\\" into x\\nput \\\"q\\\" into char 2 of x\\nanswer x -- shows \\\"aqc\\\"\\n\\nput \\\"appended text\\\" after x\\nput \\\"prepended text\\\" before x\"}, {\"title\": \"repeat\", \"body\": \"\\u0002times_24_biuosdce\\u0002repeat\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use to create a loop.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nrepeat with x = 1 to 5\\n    answer (\\\"x is now\\\" & x)\\nend repeat\\n\\nrepeat with x = 5 down to 1\\n    answer (\\\"x is now\\\" & x)\\nend repeat\\n\\nrepeat 3 times\\n    answer \\\"hi\\\"\\nend repeat\\n\\nrepeat forever\\n    answer \\\"this is an infinite loop\\\"\\nend repeat\\n\\nput 0 into counter\\nrepeat forever\\n    answer \\\"but not this\\\"\\n    add 1 to counter\\n    if counter > 3 then\\n        exit repeat\\n    end if\\nend repeat\\n\\nput 0 into counter\\nrepeat until counter > 3\\n    add 1 to counter\\nend repeat\\n\\nput 0 into counter\\nrepeat while counter <= 3\\n    add 1 to counter\\nend repeat\"}, {\"title\": \"return\", \"body\": \"\\u0002times_24_biuosdce\\u0002return {expression}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002return a value from the current function.\\nNote: no lines of code after the return statement will be run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nfunction myAddition p1, p2\\n    return p1 + p2\\n    answer \\\"this line will never be reached\\\"\\nend myAddition\\non mouseUp\\n    put myAddition(1,2) into x\\nend mouseUp\"}, {\"title\": \"set\", \"body\": \"\\u0002times_24_biuosdce\\u0002set the {property} of {button|field} to {value}\\nset the {property} to {value}\\nset the {chunkproperty} of {chunk} of {field} to {value}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use the set command to change a property.\\n\\nSome example properties:\\n\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn \\\"myButton\\\" to 100\\nset the topLeft of cd btn \\\"myButton\\\" to 24, 25\\nput the long name of btn \\\"myButton\\\" into x\\nset the textsize of char 2 to 4 of cd fld \\\"myFld\\\" to 18 \\nset the itemdelimiter to \\\"|\\\"\\u0002times_12_biuosdce\\u0002\\n\\nSee the \\\"Properties\\\" section of documentation for more.\"}, {\"title\": \"show\", \"body\": \"\\u0002times_24_biuosdce\\u0002show {button|field}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Shows a button or field.\"}, {\"title\": \"sort\", \"body\": \"\\u0002times_24_biuosdce\\u0002sort [lines|items|chars] of {container}\\nsort descending [lines|items|chars] of {container}\\nsort [lines|items|chars] of {container} [numeric|text|international]\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Sort styles:\\nFor text sorting (default), compares text, not case sensitive.\\nFor numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\\nFor international sorting, compares text using current locale.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput \\\"aa,cc,bb\\\" into x\\nsort items of x\\nanswer x -- displays \\\"aa,bb,cc\\\"\"}, {\"title\": \"subtract\", \"body\": \"\\u0002times_24_biuosdce\\u0002subtract [chunk of] {container} from {number}\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Subtracts a number from the number in a container.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput 12 into x\\nsubtract 3 from x\\nanswer x -- will display \\\"9\\\"\\n\\nput \\\"1,12,3\\\" into x\\nsubtract 3 from item 2 of x\\nanswer x -- will display \\\"1,9,3\\\"\"}, {\"title\": \"unlock screen\", \"body\": \"\\u0002times_24_biuosdce\\u0002unlock screen\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}, {\"title\": \"wait\", \"body\": \"\\u0002times_24_biuosdce\\u0002wait {number} [seconds|milliseconds|ms|ticks]\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Pauses the script.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nwait 500 ms -- pauses for half a second.\\n\\n(A paused script can be terminated by clicking the Stop icon in the\\nnavigation palette, or by changing to the button or field tool.)\"}]}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/ref_event_handlers.json",
    "content": "{\"name\": \"Event_handlers\", \"entries\": [{\"title\": \"on afterKeyDown\", \"body\": \"\\u0002times_24_biuosdce\\u0002on afterKeyDown\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Called when a key is pressed.\\nYou can use the functions \\u0002monaco_9_biuosdce\\u0002keyChar()\\u0002times_12_biuosdce\\u0002,  \\u0002monaco_9_biuosdce\\u0002shiftKey()\\u0002times_12_biuosdce\\u0002,  \\u0002monaco_9_biuosdce\\u0002optionKey()\\u0002times_12_biuosdce\\u0002, \\nand \\u0002monaco_9_biuosdce\\u0002commandKey()\\u0002times_12_biuosdce\\u0002, to determine which key(s) where pressed.\\n\\n\\u0002monaco_9_biuosdce\\u0002keyRepeated()\\u0002times_12_biuosdce\\u0002 can be used to see if the key event comes from\\nthe key having been held down.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non afterKeyDown\\n    if keyChar() is \\\"i\\\" and not shiftKey() and \\\\\\n            optionKey() and not commandKey() then\\n        answer \\\"you pressed option-i\\\"\\n    else if keyChar() is \\\"U\\\" and shiftKey() and \\\\\\n            not optionKey() and not commandKey() then\\n        answer \\\"you pressed shift-u\\\"\\n    end if\\nend afterKeyDown\"}, {\"title\": \"on afterKeyUp\", \"body\": \"\\u0002times_24_biuosdce\\u0002on afterKeyUp\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Called when a key is pressed and released.\\nYou can use the functions keyChar(), shiftKey(), optionKey(), and\\ncommandKey(), to determine which key(s) where pressed.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non afterKeyUp\\n    if keyChar() is \\\"i\\\" and not shiftKey() and \\\\\\n            optionKey() and not commandKey() then\\n        answer \\\"you pressed option-i\\\"\\n    else if keyChar() is \\\"U\\\" and shiftKey() and \\\\\\n            not optionKey() and not commandKey() then\\n        answer \\\"you pressed shift-u\\\"\\n    end if\\nend afterKeyUp\"}, {\"title\": \"on closeCard\", \"body\": \"\\u0002times_24_biuosdce\\u0002on closeCard\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}, {\"title\": \"on idle\", \"body\": \"\\u0002times_24_biuosdce\\u0002on idle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Sent repeatedly to the current card. Can be used for a game loop.\\n\\n(Note that to terminate a script that is being called repeatedly, \\nyou can change to the button or field tool.)\\n\\nTo get faster idle calls, at the expense of heavier cpu usage,\\nuse\\n\\u0002monaco_9_biuosdce\\u0002set the idlerate to \\\"faster\\\"\\u0002times_12_biuosdce\\u0002\"}, {\"title\": \"on mouseDoubleClick\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseDoubleClick\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Remember that scripts are only run when you're in the Browse\\ntool (hand-shape). Create a button and type the example below.\\nNow when you choose the browse tool and double-click the\\nbutton, your code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mouseDoubleClick\\n    answer \\\"you double-clicked this button.\\\"\\nend mouseDoubleClick\"}, {\"title\": \"on mouseDown\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseDown\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Remember that scripts are only run when you're in the\\nBrowse tool (hand-shape). Called whenever the mouse is \\npressed down onto the object. Create a button and type the \\nexample below. Now when you choose the browse tool and \\nclick the button, your code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mouseDown\\n    answer \\\"code is running.\\\"\\nend mouseDown\"}, {\"title\": \"on mouseEnter\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseEnter\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Remember that scripts are only run when you're in the Browse tool\\n(hand-shape). Called whenever the mouse enters the object.\"}, {\"title\": \"on mouseLeave\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseLeave\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Remember that scripts are only run when you're in the Browse tool\\n(hand-shape). Called whenever the mouse leaves the object.\"}, {\"title\": \"on mouseUp\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseUp\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Remember that scripts are only run when you're in the Browse tool\\n(hand-shape). Called whenever the mouse is clicked. To be precise,\\nwhen the mouse is pressed down onto the object, and released on\\nthe same object. Create a button and type the example below. \\nNow when you choose the browse tool and click the button, \\nyour code will run.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mouseUp\\n    answer \\\"code is running.\\\"\\nend mouseUp\"}, {\"title\": \"on mouseWithin\", \"body\": \"\\u0002times_24_biuosdce\\u0002on mouseWithin\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Called repeatedly when the cursor is inside the object.\\nYou can use the mouseloc() function to get the position of the \\ncursor. This can be used to create drag/drop effects.\\n\\n(Note that to terminate a script that is being called repeatedly, \\nyou can change to the button or field tool.)\"}, {\"title\": \"on openCard\", \"body\": \"\\u0002times_24_biuosdce\\u0002on openCard\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}, {\"title\": \"on openStack\", \"body\": \"\\u0002times_24_biuosdce\\u0002on openStack\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002This feature will arrive in a future version...\"}]}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/ref_functions.json",
    "content": "{\"name\": \"Functions\", \"entries\": [{\"title\": \"abs\", \"body\": \"\\u0002times_24_biuosdce\\u0002abs(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Absolute value.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput abs(-0.5) into x\\nput abs(0.5) into x\"}, {\"title\": \"atan\", \"body\": \"\\u0002times_24_biuosdce\\u0002atan(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Arctangent, in radians.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput atan(0.5) into x\"}, {\"title\": \"charToNum\", \"body\": \"\\u0002times_24_biuosdce\\u0002charToNum(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002From ascii-like number to a character.\\nNote that characters in a field are displayed in Mac OS Roman\\nencoding.\\n\\nNote that the newline character is always \\\\n (10).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput charToNum(97) into x\"}, {\"title\": \"clickh\", \"body\": \"\\u0002times_24_biuosdce\\u0002clickh()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In a mousedown or mouseup handler, get click x coordinate.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput clickh() into x\"}, {\"title\": \"clickloc\", \"body\": \"\\u0002times_24_biuosdce\\u0002clickloc()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In a mousedown or mouseup handler, get click coordinates.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput clickloc() into x\"}, {\"title\": \"clickv\", \"body\": \"\\u0002times_24_biuosdce\\u0002clickv()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In a mousedown or mouseup handler, get click y coordinate.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput clickv() into x\"}, {\"title\": \"commandKey\", \"body\": \"\\u0002times_24_biuosdce\\u0002commandKey()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In an afterkeydown or afterkeyup handler, check if this modifier \\nkey is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput commandKey() into x\\n\\nput cmdkey() into x -- same as above.\"}, {\"title\": \"contains\", \"body\": \"\\u0002times_24_biuosdce\\u0002contains\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif \\\"abc\\\" contains \\\"b\\\" then\\n    answer \\\"yes\\\"\\nend if\"}, {\"title\": \"cos\", \"body\": \"\\u0002times_24_biuosdce\\u0002cos(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput cos(0.5) into x\"}, {\"title\": \"diskSpace\", \"body\": \"\\u0002times_24_biuosdce\\u0002diskSpace()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput diskSpace() into x\"}, {\"title\": \"exp\", \"body\": \"\\u0002times_24_biuosdce\\u0002exp(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002e to the power of x.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput exp(0.5) into x\"}, {\"title\": \"exp1\", \"body\": \"\\u0002times_24_biuosdce\\u0002exp1(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(e to the power of x) minus 1.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput exp1(0.5) into x\"}, {\"title\": \"exp2\", \"body\": \"\\u0002times_24_biuosdce\\u0002exp2(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u00022 to the power of x.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput exp2(0.5) into x\"}, {\"title\": \"heapSpace\", \"body\": \"\\u0002times_24_biuosdce\\u0002heapSpace()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput heapSpace() into x\"}, {\"title\": \"is a\", \"body\": \"\\u0002times_24_biuosdce\\u0002is a\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Check the type of an expression.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif x is a number then\\n    answer \\\"a\\\"\\nend if\\nif x is a integer then\\n    answer \\\"b\\\"\\nend if\\nif x is a logical then\\n    answer \\\"c\\\"\\nend if\\nif x is a point then\\n    answer \\\"d\\\"\\nend if\\nif x is a rect then\\n    answer \\\"e\\\"\\nend if\"}, {\"title\": \"is in\", \"body\": \"\\u0002times_24_biuosdce\\u0002is in\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif \\\"b\\\" is in \\\"abc\\\" then\\n    answer \\\"yes\\\"\\nend if\"}, {\"title\": \"is within\", \"body\": \"\\u0002times_24_biuosdce\\u0002is within\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Same as \\\"is in\\\".\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif \\\"b\\\" is in \\\"abc\\\" then\\n    answer \\\"yes\\\"\\nend if\"}, {\"title\": \"keyChar\", \"body\": \"\\u0002times_24_biuosdce\\u0002keyChar()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In an afterkeydown or afterkeyup handler, check the character.\\nIs affected by shift.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput keyChar() into x\\non afterKeyDown\\n    if keyChar() is \\\"i\\\" and not shiftKey() and \\\\\\n            optionKey() and not commandKey() then\\n        answer \\\"you pressed option-i\\\"\\n    else if keyChar() is \\\"U\\\" and shiftKey() and \\\\\\n            not optionKey() and not commandKey() then\\n        answer \\\"you pressed shift-u\\\"\\n    end if\\nend afterKeyDown\"}, {\"title\": \"keyRepeated\", \"body\": \"\\u0002times_24_biuosdce\\u0002keyRepeated()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In an afterkeydown handler, did this event come from the user holding the key down?\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif not keyRepeated() then\\n    add 1 to uniqueKeyPresses\\nend if\"}, {\"title\": \"length\", \"body\": \"\\u0002times_24_biuosdce\\u0002length(s)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Returns the length of a string, in characters.\\nAlso supports alternate syntax 'the length of \\\"abc\\\"'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer length(\\\"abc\\\") -- displays 3\\nanswer (the length of \\\"\\\") -- displays 0\\nanswer (the length of \\\"abc\\\") -- displays 3\"}, {\"title\": \"ln\", \"body\": \"\\u0002times_24_biuosdce\\u0002ln(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput ln(0.5) into x\"}, {\"title\": \"ln1\", \"body\": \"\\u0002times_24_biuosdce\\u0002ln1(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Natural logarithm of (x + 1)\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput ln1(0.5) into x\"}, {\"title\": \"log2\", \"body\": \"\\u0002times_24_biuosdce\\u0002log2(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput log2(0.5) into x\"}, {\"title\": \"max\", \"body\": \"\\u0002times_24_biuosdce\\u0002max(...)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Supports any number of arguments.\\nYou can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput max(1,2,3) into x\\nput max(\\\"45,49,40\\\") into x -- returns 49\"}, {\"title\": \"me\", \"body\": \"\\u0002times_24_biuosdce\\u0002me\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Refers to the object that owns the current script.\\n\\nSimilar to, but distinct from 'target'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the id of me into theTarget\\n\\nset the width of me to 100\"}, {\"title\": \"min\", \"body\": \"\\u0002times_24_biuosdce\\u0002min()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Supports any number of arguments.\\nYou can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput min(1,2,3) into x\\nput min(\\\"45,49,40\\\") into x -- returns 40\"}, {\"title\": \"mouse\", \"body\": \"\\u0002times_24_biuosdce\\u0002mouse()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Is the mouse button currently down.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput mouse() into x\"}, {\"title\": \"mouseclick\", \"body\": \"\\u0002times_24_biuosdce\\u0002mouseclick()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Are we currently handling a mousedown or mouseup event.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput mouseclick() into x\"}, {\"title\": \"mouseh\", \"body\": \"\\u0002times_24_biuosdce\\u0002mouseh()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The x coordinate of mouse location.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput mouseh() into x\"}, {\"title\": \"mouseloc\", \"body\": \"\\u0002times_24_biuosdce\\u0002mouseloc()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The coordinates of mouse location.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput mouseloc() into x\"}, {\"title\": \"mousev\", \"body\": \"\\u0002times_24_biuosdce\\u0002mousev()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The y coordinate of mouse location.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput mousev() into x\"}, {\"title\": \"numToChar\", \"body\": \"\\u0002times_24_biuosdce\\u0002numToChar(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002From a character to an ascii-like number.\\nNote that characters in a field are displayed in Mac OS Roman\\nencoding.\\n\\nNote that the newline character is always \\\\n (10).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput numToChar(\\\"a\\\") into x\"}, {\"title\": \"number\", \"body\": \"\\u0002times_24_biuosdce\\u0002number\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Can be used to either count number of objects, or to count\\nlines/items in a string.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nanswer (the number of chars in \\\"1,2,3\\\")\\nanswer (the number of items in \\\"1,2,3\\\")\\nanswer (the number of words in \\\"1,2,3\\\")\\nanswer (the number of lines in \\\"1,2,3\\\")\\nanswer (the number of cards)\\nanswer (the number of card buttons)\\nanswer (the number of card fields)\"}, {\"title\": \"numberToStr\", \"body\": \"\\u0002times_24_biuosdce\\u0002numberToStr(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Convert number to string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput numberToStr(0.5) into x\"}, {\"title\": \"offset\", \"body\": \"\\u0002times_24_biuosdce\\u0002offset(needle, haystack)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Note: one-based indexing.\\nIf needle is not found, returns 0.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput offset(\\\"b\\\", \\\"abc\\\") into x\"}, {\"title\": \"optionKey\", \"body\": \"\\u0002times_24_biuosdce\\u0002optionKey()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In an afterkeydown or afterkeyup handler, check if this modifier \\nkey is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput optionKey() into x\"}, {\"title\": \"param\", \"body\": \"\\u0002times_24_biuosdce\\u0002param(n)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Get the nth value passed into the current procedure. Can be used\\nto build a function that takes any number of arguments, \\nsee example.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mySumOfNumbers\\n    put 0 into total\\n    repeat with x = 1 to paramCount()\\n        put total + param(x) into total\\n    end repeat\\n    answer (\\\"total is\\\" && total)\\nend mySumOfNumbers\\n\\non mouseUp\\n    mySumOfNumbers 1, 2, 3\\nend mouseUp\"}, {\"title\": \"paramCount\", \"body\": \"\\u0002times_24_biuosdce\\u0002paramCount()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Get the number of values passed into the current procedure.\\nCan be used to build a function that takes any number of \\narguments, see example.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non mySumOfNumbers\\n    put 0 into total\\n    repeat with x = 1 to paramCount()\\n        put total + param(x) into total\\n    end repeat\\n    answer (\\\"total is\\\" && total)\\nend mySumOfNumbers\\n\\non mouseUp\\n    mySumOfNumbers 1, 2, 3\\nend mouseUp\"}, {\"title\": \"params\", \"body\": \"\\u0002times_24_biuosdce\\u0002params()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Get all of the values passed into the current procedure.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput params() into x\"}, {\"title\": \"random\", \"body\": \"\\u0002times_24_biuosdce\\u0002random(n)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002n must be an integer.\\nReturns random value between 1 and n.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput random(20) into roll\"}, {\"title\": \"result\", \"body\": \"\\u0002times_24_biuosdce\\u0002result()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The return value of the last called function or procedure.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\non myProc\\n    return \\\"a\\\"\\nend myProc\\non mouseUp\\n    myProc\\n    answer (result())\\nend mouseUp\"}, {\"title\": \"round\", \"body\": \"\\u0002times_24_biuosdce\\u0002round(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Returns integer nearest to number. Odd integers plus 0.5 \\nround up, even integers plus 0.5 round down.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput round(1.7) into x\"}, {\"title\": \"screenRect\", \"body\": \"\\u0002times_24_biuosdce\\u0002screenRect()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput screenRect() into x\"}, {\"title\": \"seconds\", \"body\": \"\\u0002times_24_biuosdce\\u0002seconds()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Seconds since January 1, 1904.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput seconds() into x\"}, {\"title\": \"selectedChunk\", \"body\": \"\\u0002times_24_biuosdce\\u0002selectedChunk()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Current selection, looks something like 'char 2 to 4 of cd fld id \\n1234'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput selectedChunk() into x\"}, {\"title\": \"selectedField\", \"body\": \"\\u0002times_24_biuosdce\\u0002selectedField()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The field that contains current selected text, looks something \\nlike 'cd fld id 1234'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput selectedField() into x\"}, {\"title\": \"selectedLine\", \"body\": \"\\u0002times_24_biuosdce\\u0002selectedLine()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The number of the line of the current selected text.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput selectedLine() into x\"}, {\"title\": \"selectedText\", \"body\": \"\\u0002times_24_biuosdce\\u0002selectedText()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The value of the current selected text.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput selectedText() into x\"}, {\"title\": \"shiftKey\", \"body\": \"\\u0002times_24_biuosdce\\u0002shiftKey()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002In an afterkeydown or afterkeyup handler, check if this modifier \\nkey is pressed.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput shiftKey() into x\"}, {\"title\": \"sin\", \"body\": \"\\u0002times_24_biuosdce\\u0002sin(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput sin(0.5) into x\"}, {\"title\": \"sqrt\", \"body\": \"\\u0002times_24_biuosdce\\u0002sqrt(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput sqrt(0.5) into x\"}, {\"title\": \"stackSpace\", \"body\": \"\\u0002times_24_biuosdce\\u0002stackSpace()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded).\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput stackSpace() into x\"}, {\"title\": \"strToNumber\", \"body\": \"\\u0002times_24_biuosdce\\u0002strToNumber(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Parse string to number.\\nSupports scientific notation.\\nIf cannot be parsed, returns \\\"false\\\"\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput strToNumber(\\\"12\\\") into x\\nput strToNumber(\\\"-12\\\") into x\\nput strToNumber(\\\"1e6\\\") into x\"}, {\"title\": \"sum\", \"body\": \"\\u0002times_24_biuosdce\\u0002sum()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Supports any number of arguments.\\nYou can also provide a comma-delimited string.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput sum(1,2,3) into x\\nput sum(\\\"1,2,3\\\") into x -- returns 6\"}, {\"title\": \"systemVersion\", \"body\": \"\\u0002times_24_biuosdce\\u0002systemVersion()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded).\\nTo get the current software version, use\\nput the version into x\\nor\\nput the long version into x\\ninstead.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput systemVersion() into x\"}, {\"title\": \"tan\", \"body\": \"\\u0002times_24_biuosdce\\u0002tan(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput tan(0.5) into x\"}, {\"title\": \"target\", \"body\": \"\\u0002times_24_biuosdce\\u0002target\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Refers to the object that was most recently acted on.\\nHere's one reason why this can be useful:\\nIf you have many buttons that all basically perform the same \\naction, you could have an 'on mouseup' handler in the card script\\ninstead of a separate script within each button. This script in the\\ncard could check the target to see which, if any, of the buttons\\nwere clicked.\\n\\nSimilar to, but distinct from 'me'.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the id of target into theTarget\\n\\nset the width of the target to 100\"}, {\"title\": \"there is a\", \"body\": \"\\u0002times_24_biuosdce\\u0002there is a\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Check for the existence of an object\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nif there is a cd btn id 12345 then\\n    answer \\\"found\\\"\\nend if\"}, {\"title\": \"ticks\", \"body\": \"\\u0002times_24_biuosdce\\u0002ticks()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Ticks (60th of a second) since January 1, 1904.\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput ticks() into x\"}, {\"title\": \"tool\", \"body\": \"\\u0002times_24_biuosdce\\u0002tool()\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002The tool to be used when programmatically drawing shapes.\\n(Not the actual tool, which would always be Browse)\\n\\nSee also: the click, drag commands.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nchoose \\\"pencil\\\" tool\\nclick at 10,20\\n-- this draws a black pixel at the coordinates x=10, y=20\\nput tool() into x\"}, {\"title\": \"trunc\", \"body\": \"\\u0002times_24_biuosdce\\u0002trunc(x)\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Get integer part of a number.\\ni.e. for positive numbers, always round down to the nearest \\ninteger.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput trunc(0.5) into x\"}]}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/ref_fundamentals.json",
    "content": "{\"name\": \"Fundamentals\", \"entries\": [{\"title\": \"Introduction\", \"body\": \"\\u0002times_24_biuosdce\\u0002Introduction\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002If you are new, please see the Tutorial Screenshots first!\\n(From the Help menu, select Tutorial Screenshots...)\\n\\n\\nThe documentation here is technical and unpolished;\\nit will be improved over time.\"}, {\"title\": \"Fundamentals\", \"body\": \"\\u0002times_24_biuosdce\\u0002Fundamentals\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002All objects, including all buttons, fields, and cards, have an associated set of code called a \\\"script.\\\"\\n\\nHere is an example script:\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    answer \\\"hello, world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nIf this script is placed in a button, and the Browse tool is chosen\\n(looks like a hand), the code will be run when the button is clicked.\\n\\nA line of code beginning with -- is ignored.\\nThis is often used to write explanatory comments.\\nIt can also be used to temporarily \\\"disable\\\" some code.\\nYou can press Ctrl-Q in the script editor to quickly\\ncomment-out or uncomment a line.\\n\\n\\u0002monaco_9_biuosdce\\u0002on mouseUp\\n    -- this line is a comment\\n    answer \\\"hello, world\\\"\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\n\\nIndentation is not mandatory, but it is recommended for clarity.\\nThe code editor will automatically add indentation\\nwhenever you press Enter.\\n\\nStatements must appear on separate lines.\\n\\nThe language is not case sensitive. \\\"on mouseup\\\" and \\n\\\"on mouseUp\\\" are equivalent.\\n\\nA long line of code can be continued with a backslash, e.g.\\n\\n\\u0002monaco_9_biuosdce\\u0002answer (\\\"here is how to continue\\\" & \\\\\\n    \\\"code across two lines\\\")\\u0002times_12_biuosdce\\u0002\\n\\nA common data type is a string (a sequence of text).\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abc\\\" into x\\u0002times_12_biuosdce\\u0002\\n\\nDouble-quotes (\\\"), not single-quotes ('), must be used.\\nA string with length 0, \\\"\\\", is perfectly valid and used often to \\nrepresent a missing value. You may see this referred to as \\nan 'empty string'. You can easily test for an empty string \\nwith code like:\\n\\u0002monaco_9_biuosdce\\u0002if x is \\\"\\\" then\\n    answer \\\"empty string\\\"\\nend if\\u0002times_12_biuosdce\\u0002\\n\\nTo include a double-quote character in a string, use the quote constant,\\n\\n\\u0002monaco_9_biuosdce\\u0002answer (quote & \\\"a\\\" & quote) -- displays \\\"a\\\"\\u0002times_12_biuosdce\\u0002\\n\\nValid numbers include 123, 123.456, and scientific notation like \\n1.23e6 which means 1.23 multiplied by (10 to the 6th power).\\nNumbers can be in the range [-1e18, 1e18], if a number is \\ntaken outside this range a runtime error will be thrown.\\nDivision by zero, logarithm of a negative, and so on will also \\ncause a runtime error.\\n\\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\u0002times_12_biuosdce\\u0002 is a function call meaning to take the square root \\nof 0.5. \\u0002monaco_9_biuosdce\\u0002sqrt\\u0002times_12_biuosdce\\u0002 is a built-in function, but we can also write a \\nuser-defined function. \\u0002monaco_9_biuosdce\\u0002sum(1, 2)\\u0002times_12_biuosdce\\u0002 is a function call that \\nadds 1 and 2 and returns 3. A comma separates the \\nvalues sent. Function calls can be nested, for example,\\n\\u0002monaco_9_biuosdce\\u0002sum(1, sum(2, 3))\\u0002times_12_biuosdce\\u0002.\\n\\nButtons and fields are referred to as \\\"objects\\\".\\nCards are also a type of object.\\nAnd, the entire project, referred to as a \\\"stack\\\", is an object.\\n\\nA script can set properties of an object with syntax like:\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn \\\"myBtn\\\" to 450\\u0002times_12_biuosdce\\u0002\\nOne can also refer to an object by id:\\n\\u0002monaco_9_biuosdce\\u0002set the width of cd btn id 1234 to 450\\u0002times_12_biuosdce\\u0002\\n\\nSee the \\\"set\\\" command documentation for a list of properties \\nthat can be set.\\n\\nWhen you are in the Browse tool and you interact with the page \\nby clicking on buttons or pressing keystrokes, this causes \\nmessages to be fired.\\n\\nIf you click a button, and if that button has a script that happens\\nto have a function called \\\"on mouseUp\\\" defined, then the code in\\nthat function will be run.\"}, {\"title\": \"Expressions\", \"body\": \"\\u0002times_24_biuosdce\\u0002Expressions\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002A set of computations such as \\u0002monaco_9_biuosdce\\u00021+2+3+4\\u0002times_12_biuosdce\\u0002 or \\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5) + sqrt(0.6)\\u0002times_12_biuosdce\\u0002 is an expression. Expressions can contain\\nany level of nested sub-expressions, for example,\\n\\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\nsqrt(0.5 + sqrt(0.6))\\nsqrt(0.5 + sqrt(0.6 + sqrt(0.7)))\\u0002times_12_biuosdce\\u0002\\nare all valid.\\n\\nParentheses are used to dictate the order of operations, since\\n\\u0002monaco_9_biuosdce\\u00023*(4+5)\\u0002times_12_biuosdce\\u0002\\ngives a different answer than\\n\\u0002monaco_9_biuosdce\\u0002(3*4)+5\\u0002times_12_biuosdce\\u0002\\n\\nParentheses are also used for grouping an expression.\\nfor example, we needed to get the (n + 1)th line of a \\nvariable, we would type \\u0002monaco_9_biuosdce\\u0002answer (line (n + 1) of x)\\u0002times_12_biuosdce\\u0002\\n\\nDo not type something like\\n\\u0002monaco_9_biuosdce\\u0002answer (line n + 1 of x) -- this is hard to read.\\u0002times_12_biuosdce\\u0002\\nthis is unclear, and will often cause syntax errors.\\n\\nIn the expression \\u0002monaco_9_biuosdce\\u00022+3\\u0002times_12_biuosdce\\u0002, the \\u0002monaco_9_biuosdce\\u0002+\\u0002times_12_biuosdce\\u0002 is called an operator.\\n\\nHere are the operators that can be used.\\n\\u0002monaco_9_biuosdce\\u00022 * 3\\u0002times_12_biuosdce\\u0002\\n\\tmultiplication\\n\\u0002monaco_9_biuosdce\\u00022 / 3\\u0002times_12_biuosdce\\u0002\\n\\tdivision\\n\\u0002monaco_9_biuosdce\\u00022 ^ 3\\u0002times_12_biuosdce\\u0002\\n\\traise to the third power\\n\\u0002monaco_9_biuosdce\\u00027 div 5\\u0002times_12_biuosdce\\u0002\\n\\ttruncated division\\n\\u0002monaco_9_biuosdce\\u00027 mod 5\\u0002times_12_biuosdce\\u0002\\n\\tmodulo\\n\\u0002monaco_9_biuosdce\\u00022 > 3\\u0002times_12_biuosdce\\u0002\\n\\tgreater than\\n\\u0002monaco_9_biuosdce\\u00022 < 3\\u0002times_12_biuosdce\\u0002\\n\\tless than\\n\\u0002monaco_9_biuosdce\\u00022 >= 3\\u0002times_12_biuosdce\\u0002\\n\\tgreater than or equal to\\n\\u0002monaco_9_biuosdce\\u00022 <= 3\\u0002times_12_biuosdce\\u0002\\n\\tless than or equal to\\n\\u0002monaco_9_biuosdce\\u00022  ==  3\\u0002times_12_biuosdce\\u0002\\n\\tequal to\\n\\u0002monaco_9_biuosdce\\u00022  !=  3\\u0002times_12_biuosdce\\u0002\\n\\tnot equal to\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is \\\"def\\\"\\u0002times_12_biuosdce\\u0002\\n\\tequal to\\n\\u0002monaco_9_biuosdce\\u0002\\\"abc\\\" is not \\\"def\\\"\\u0002times_12_biuosdce\\u0002\\n\\tnot equal to\\n\\u0002monaco_9_biuosdce\\u00022 + 3\\u0002times_12_biuosdce\\u0002\\n\\taddition\\n\\u0002monaco_9_biuosdce\\u00022 - 3\\u0002times_12_biuosdce\\u0002\\n\\tsubtraction\\n\\n\\u0002monaco_9_biuosdce\\u0002&\\u0002times_12_biuosdce\\u0002 and \\u0002monaco_9_biuosdce\\u0002&&\\u0002times_12_biuosdce\\u0002 combine two strings (concatenation).\\n\\u0002monaco_9_biuosdce\\u0002put \\\"a\\\" & \\\"b\\\" into x\\nanswer x -- displays \\\"ab\\\"\\nput \\\"a\\\" && \\\"b\\\" into x\\nanswer x -- displays \\\"a b\\\"\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002times_12_+biuosdce\\u0002Logical operators\\u0002times_12_biuosdce\\u0002\\nthe constants 'true' and 'false' are used often.\\ninternally there is no distinct boolean type, but the strings \\n\\\"true\\\" and \\\"false\\\" are interpreted as true and false respectively.\\n\\u0002monaco_9_biuosdce\\u0002true and false\\u0002times_12_biuosdce\\u0002\\n    logical and\\n\\u0002monaco_9_biuosdce\\u0002true or false\\u0002times_12_biuosdce\\u0002\\n    logical or\\n\\u0002monaco_9_biuosdce\\u0002not true\\u0002times_12_biuosdce\\u0002\\n    logical not\\n\\nlogical operations are not guaranteed to be short-circuiting.\\nin other words,\\n\\u0002monaco_9_biuosdce\\u0002put (true or myfunction()) into x\\u0002times_12_biuosdce\\u0002\\nstill will call \\u0002monaco_9_biuosdce\\u0002myfunction\\u0002times_12_biuosdce\\u0002, when it hypothetically could have \\nbeen skipped.\"}, {\"title\": \"Variables\", \"body\": \"\\u0002times_24_biuosdce\\u0002Variables\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002To introduce a variable, use the \\\"put\\\" command to place contents \\ninto it. Running \\u0002monaco_9_biuosdce\\u0002put 3 into x\\u0002times_12_biuosdce\\u0002 is valid even if x has never been\\nused before.\\n\\nIf you try to read from a variable before it has been introduced, \\na runtime error will occur.\\n\\nVariable names and function names are case insensitive.\\n\\nVariable names cannot begin with a numeral, and can contain \\nunderscores but no other punctuation. Certain words cannot be \\nused as variable names because they are already keywords \\nor built-in functions. For example, you cannot have a variable \\nnamed \\\"line\\\" because this is a keyword. You cannot have a \\nvariable named \\\"result\\\" because this is a built-in function.\\n\\nUse \\\"global\\\" to declare a variable as a global.\\n1) it can be accessed from any other script\\n2) its contents are saved even after the function is complete.\\n\\nA runtime error can be thrown if a variable has the wrong \\ntype, e.g.\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abc\\\" into x\\nput 4 into y\\nput x + y into z\\u0002times_12_biuosdce\\u0002\\nThe addition operator requires numbers, and so creates a \\nruntime error when getting the string \\u0002monaco_9_biuosdce\\u0002\\\"abc\\\"\\u0002times_12_biuosdce\\u0002.\\n\\nThe functions\\n\\u0002monaco_9_biuosdce\\u0002strToNumber\\u0002times_12_biuosdce\\u0002\\nand\\n\\u0002monaco_9_biuosdce\\u0002numberToStr\\u0002times_12_biuosdce\\u0002\\ncan be used to move back and forth.\\n\\nLogical types must be either true or false.\\n\\u0002monaco_9_biuosdce\\u0002put (true and false) into x -- valid\\nput (true and 1) into x -- runtime error, expected true or false\\u0002times_12_biuosdce\\u0002\\n\\nNumeric comparison understands equivalent representations, \\nfor example:\\n\\u0002monaco_9_biuosdce\\u0002put (456 is \\\"456.00\\\") into x -- true\\nput (456 is \\\"00456.00\\\") into x -- true\\u0002times_12_biuosdce\\u0002\\n\\nA \\\"point\\\" data type is two numbers separated by a comma. \\nThis can save typing.\\n\\u0002monaco_9_biuosdce\\u0002set the left of cd btn \\\"myBtn\\\" to 10\\nset the top of cd btn \\\"myBtn\\\" to 20\\u0002times_12_biuosdce\\u0002\\nis equivalent to\\n\\u0002monaco_9_biuosdce\\u0002set the topleft of cd btn \\\"myBtn\\\" to \\\"10, 20\\\"\\u0002times_12_biuosdce\\u0002\"}, {\"title\": \"Structure\", \"body\": \"\\u0002times_24_biuosdce\\u0002Structure\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002\\u0002times_12_+biuosdce\\u0002Scripts\\u0002times_12_biuosdce\\u0002\\nA script contains zero or more functions.\\nNo code or declarations can exist outside of a function.\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Functions\\u0002times_12_biuosdce\\u0002\\nFunctions look like this\\n    \\u0002monaco_9_biuosdce\\u0002on mouseup \\n        answer \\\"hello world\\\"\\n    end mouseup\\u0002times_12_biuosdce\\u0002\\nor this\\n    \\u0002monaco_9_biuosdce\\u0002function myAddition p1, p2\\n        return p1 + p2\\n    end myAddition\\u0002times_12_biuosdce\\u0002\\n\\nNested functions are not currently supported.\\n\\n\\u0002times_12_+biuosdce\\u0002Loops\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002repeat with x = 1 to 3\\n    ...other code here...\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\nRefer to \\u0002monaco_9_biuosdce\\u0002repeat\\u0002times_12_biuosdce\\u0002 under \\\"commands\\\" for more information.\\n\\n\\u0002times_12_+biuosdce\\u0002If conditions\\u0002times_12_biuosdce\\u0002\\n\\u0002monaco_9_biuosdce\\u0002if x > 1 then\\n    ...other code here...\\nelse\\n    ...other code here...\\nend if\\u0002times_12_biuosdce\\u0002\\nRefer to \\u0002monaco_9_biuosdce\\u0002if\\u0002times_12_biuosdce\\u0002 under \\\"commands\\\" for more information.\\n\\n\\n\\u0002times_12_+biuosdce\\u0002Statements\\u0002times_12_biuosdce\\u0002\\nEvery statement has exactly one command.\\nFor example, \\n    \\u0002monaco_9_biuosdce\\u0002put sqrt(0.5) into x\\u0002times_12_biuosdce\\u0002\\nis a valid statement.\\nYou cannot have a line that is just\\n    \\u0002monaco_9_biuosdce\\u0002sqrt(0.5)\\u0002times_12_biuosdce\\u0002\\nwith no command, this is a syntax error.\\n    \\nStatements occur on separate lines, there's no way to cram \\nmore than one statement onto a line.\\n    \\n\\u0002times_12_+biuosdce\\u0002Expressions\\u0002times_12_biuosdce\\u0002\\nA set of computations such as \\u0002monaco_9_biuosdce\\u00021+2+3+4\\u0002times_12_biuosdce\\u0002 or \\n\\u0002monaco_9_biuosdce\\u0002sqrt(0.5) + sqrt(0.6)\\u0002times_12_biuosdce\\u0002 is an expression. Most places that \\nhave a value can be given an expression, for example,\\n\\u0002monaco_9_biuosdce\\u0002go card 2\\ngo card (x + 1)\\n\\nput \\\"abc\\\" into cd fld \\\"myFld\\\"\\nput \\\"abc\\\" into cd fld (nameOfMyField & \\\"Fld\\\")\\n\\nput \\\"a\\\" into line 4 of myList\\nput \\\"a\\\" into line (x+1) of myList\\n\\nset the left of cd btn \\\"myBtn\\\" to x\\nset the left of cd btn (nameOfBtn) to (45 + 50 * cos(theta))\\n\\u0002times_12_biuosdce\\u0002\"}, {\"title\": \"Lists/arrays\", \"body\": \"\\u0002times_24_biuosdce\\u0002Lists/arrays\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Here's a common way to create a list:\\n\\n\\u0002monaco_9_biuosdce\\u0002put \\\"\\\" into myList\\nrepeat with x = 1 to 5\\n    put 0 into line x of myList\\nend repeat\\u0002times_12_biuosdce\\u0002\\n\\nHow to append a number to the list:\\n\\n\\u0002monaco_9_biuosdce\\u0002put newline & 20 after myList\\u0002times_12_biuosdce\\u0002\\n\\nHow to add 10 to each element of the list:\\n\\n\\u0002monaco_9_biuosdce\\u0002repeat with x = 1 to the number of lines in myList\\n    put (line x of myList) + 10 into line x of myList\\nend repeat\\n\\u0002times_12_biuosdce\\u0002\\n\\n\\u0002monaco_9_biuosdce\\u0002myList\\u0002times_12_biuosdce\\u0002 is a normal variable, it can be passed as an \\nargument and so on.\"}, {\"title\": \"Custom funcs\", \"body\": \"\\u0002times_24_biuosdce\\u0002Custom funcs\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Here is an example of how to define and call a custom function.\\n\\u0002monaco_9_biuosdce\\u0002function myAddition p1, p2\\n    return p1 + p2\\nend myAddition\\non mouseUp\\n    put myAddition(1,2) into x\\nend mouseUp\\u0002times_12_biuosdce\\u0002\\n\\nA current limitation is that custom functions can only be called \\nfrom the \\\"put\\\" command or the \\\"return\\\" command.\\nFor example, if there is a custom function myAddition,\\n    \\u0002monaco_9_biuosdce\\u0002put myAddition(4,5) into x\\u0002times_12_biuosdce\\u0002\\nis supported,\\n    \\u0002monaco_9_biuosdce\\u0002return myAddition(4,5)\\u0002times_12_biuosdce\\u0002\\nis supported,\\nbut\\n    \\u0002monaco_9_biuosdce\\u0002set the width of cd btn \\\"btn1\\\" to myAddition(4,5)\\u0002times_12_biuosdce\\u0002\\nis not yet supported.\\n\\nRecursion is supported.\\n\\nYou can define variadic functions (that accept any number of \\nvalues), see the documentation for the paramCount() function.\\n\\nNo error is thrown if the incorrect number of arguments is given. \\nMissing arguments are given the empty string (\\\"\\\").\\n\\u0002monaco_9_biuosdce\\u0002myAddition(7, 8, 9) -- the extra argument 9 is ignored\\nmyAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8\\nmyAddition(7) -- p1 is assigned 7, p2 is assigned \\\"\\\"\\nmyAddition() -- p1 is assigned \\\"\\\", p2 is assigned \\\"\\\"\\u0002times_12_biuosdce\\u0002\\n\\nThe message hierarchy:\\nMessages bubble upwards from an object, to the parent card, \\nto the stack, until they are handled.\\nIf you click on a button:\\n    A mouseUp message is created\\n    Script of the button is examined. \\n    If there is an 'on mouseUp' handler,\\n        Run the code in the mouseUp handler.\\n        If the handler completes, stop running code, we're done.\\n        If the handler calls 'pass mouseUp', continue:\\n    Script of the current card is examined.\\n    If there is an 'on mouseUp' handler,\\n        Run the code in the mouseUp handler.\\n        If the handler completes, stop running code, we're done.\\n        If the handler calls 'pass mouseUp', continue:\\n    Script of the current stack is examined.\\n    If there is an 'on mouseUp' handler,\\n        Run the code in the mouseUp handler.\\n\\nSimilarly, if you are typing text in a field, and type the letter 'a':\\n    A afterKeyUp message is created\\n    Script of the current field is examined.\\n    If there is an 'on afterKeyUp' handler,\\n        Run the code in the afterKeyUp handler.\\n        If the handler completes, stop running code, we're done.\\n        If the handler calls 'pass afterKeyUp', continue:\\n    Script of the current card is examined.\\n    If there is an 'on afterKeyUp' handler,\\n        Run the code in the afterKeyUp handler.\\n        If the handler completes, stop running code, we're done.\\n        If the handler calls 'pass afterKeyUp', continue:\\n    Script of the current stack is examined.\\n    If there is an 'on afterKeyUp' handler,\\n        Run the code in the mouseUp handler.\\n\\nSee documentation of the 'pass' command for an example.\\n\\nCalls to custom commands and procedures also bubble upwards \\nin the same way. A function in the stack's script can be called \\nfrom any handler on a card, field, or button. A function in the \\ncard's script can be called from any handler in a field or button.\\nSo, it is useful to put commonly used utility code in a stack \\nscript so that it can be called from anywhere.\"}, {\"title\": \"Chunks\", \"body\": \"\\u0002times_24_biuosdce\\u0002Chunks\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002We call a reference to a part of a container a \\\"chunk\\\". These \\nexamples demonstrate what can be done with chunk expressions:\\n\\n\\u0002monaco_9_biuosdce\\u0002answer (char 2 of \\\"abcd\\\") -- displays \\\"b\\\"\\nanswer (char 2 to 3 of \\\"abcd\\\") -- displays \\\"bc\\\"\\nanswer (item 2 of \\\"a,b,c,d\\\") -- displays \\\"b\\\"\\nanswer (item 2 to 3 of \\\"a,b,c,d\\\") -- displays \\\"b,c\\\"\\nanswer (word 2 of \\\"a b c d\\\") -- displays \\\"b\\\"\\nanswer (word 2 to 3 of \\\"a b c d\\\") -- displays \\\"b c\\\"\\nput \\\"a\\\" & newline & \\\"b\\\" & newline & \\\"c\\\" & newline into lines\\nanswer (line 2 of lines) -- displays \\\"b\\\"\\nanswer (line 2 to 3 of lines) -- displays \\\"b\\\" & newline & \\\"c\\\"\\n\\nanswer (first char of \\\"abcd\\\") -- displays \\\"a\\\"\\nanswer (second char of \\\"abcd\\\") -- displays \\\"b\\\"\\nanswer (any char of \\\"abcd\\\") -- displays a random choice\\nanswer (middle char of \\\"abcd\\\") \\nanswer (last char of \\\"abcd\\\") \\n\\nput \\\"x\\\" into char 2 of \\\"abcd\\\"\\nput \\\"x\\\" into char 2 to 3 of \\\"abcd\\\"\\nput \\\"x\\\" into item 2 of \\\"a,b,c,d\\\"\\nput \\\"x\\\" into item 2 to 3 of \\\"a,b,c,d\\\"\\nput \\\"x\\\" into word 2 of \\\"a b c d\\\"\\nput \\\"x\\\" into word 2 to 3 of \\\"a b c d\\\"\\u0002times_12_biuosdce\\u0002\\n\\nchunks can be nested arbitrarily, as in\\n\\u0002monaco_9_biuosdce\\u0002(char 2 of (char 2 to 3 of \\\"abcd\\\"))\\u0002times_12_biuosdce\\u0002\\nor\\n\\u0002monaco_9_biuosdce\\u0002(char (line 4 of myList) of \\\"abcd\\\")\\u0002times_12_biuosdce\\u0002\\n\\nthe itemdelimeter is \\\",\\\" by default but can be changed.\\nthis can be helpful for simple parsing.\\n\\u0002monaco_9_biuosdce\\u0002put \\\"abc|def|ghi\\\" into x\\nset the itemdelimiter to \\\"|\\\"\\nanswer (item 2 of x) -- displays \\\"def\\\"\\u0002times_12_biuosdce\\u0002\"}, {\"title\": \"Constants\", \"body\": \"\\u0002times_24_biuosdce\\u0002Constants\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Use \\u0002monaco_9_biuosdce\\u0002newline\\u0002times_12_biuosdce\\u0002 to refer to a new line character.\\nLet's say you wanted two lines of text in a field, you would use \\nthe following:\\n\\u0002monaco_9_biuosdce\\u0002put \\\"first line\\\" & newline & \\\"second line\\\" into cd fld \\\"myFld\\\"\\u0002times_12_biuosdce\\u0002\\n\\n(You shouldn't have to be concerned with newline platform \\ndifferences: the constants return, cr, linefeed are present for \\nbackwards compatibility, but they are are all mapped to \\\\n ascii \\n10 internally. If you are running windows, when you copy text \\nwe'll automatically convert to \\\\r\\\\n newlines so if you paste \\ninto notepad, it looks right.)\\n\\nThe following constants are defined:\\n\\u0002monaco_9_biuosdce\\u0002\\npi\\nnewline\\ntab\\nempty\\nquote\\none\\ntwo\\nthree\\nfour\\nfive\\nsix\\nseven\\neight\\nnine\\nten\\ncolon\\ncomma\\ntrue\\nfalse\\nup\\ndown\\nspace\\nreturn\\ncr\\nformfeed\\nlinefeed\\u0002times_12_biuosdce\\u0002\"}]}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/prevVersionStacks/ref_properties.json",
    "content": "{\"name\": \"Properties\", \"entries\": [{\"title\": \"btn: abbrev id\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev id of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: abbrev name\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev name of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: autohilite\", \"body\": \"\\u0002times_24_biuosdce\\u0002autohilite\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the autohilite of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: botright\", \"body\": \"\\u0002times_24_biuosdce\\u0002botright\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the botright of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: bottom\", \"body\": \"\\u0002times_24_biuosdce\\u0002bottom\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the bottom of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: bottomright\", \"body\": \"\\u0002times_24_biuosdce\\u0002bottomright\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the bottomright of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: checkmark\", \"body\": \"\\u0002times_24_biuosdce\\u0002checkmark\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the checkmark of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: enabled\", \"body\": \"\\u0002times_24_biuosdce\\u0002enabled\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the enabled of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: height\", \"body\": \"\\u0002times_24_biuosdce\\u0002height\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the height of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: hilite\", \"body\": \"\\u0002times_24_biuosdce\\u0002hilite\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the hilite of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: icon\", \"body\": \"\\u0002times_24_biuosdce\\u0002icon\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the icon of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: id\", \"body\": \"\\u0002times_24_biuosdce\\u0002id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the id of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: label\", \"body\": \"\\u0002times_24_biuosdce\\u0002label\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the label of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: left\", \"body\": \"\\u0002times_24_biuosdce\\u0002left\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the left of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: loc\", \"body\": \"\\u0002times_24_biuosdce\\u0002loc\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the loc of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: location\", \"body\": \"\\u0002times_24_biuosdce\\u0002location\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the location of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: long id\", \"body\": \"\\u0002times_24_biuosdce\\u0002long id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long id of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: long name\", \"body\": \"\\u0002times_24_biuosdce\\u0002long name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long name of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: name\", \"body\": \"\\u0002times_24_biuosdce\\u0002name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the name of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: rect\", \"body\": \"\\u0002times_24_biuosdce\\u0002rect\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the rect of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: rectangle\", \"body\": \"\\u0002times_24_biuosdce\\u0002rectangle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the rectangle of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: right\", \"body\": \"\\u0002times_24_biuosdce\\u0002right\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the right of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: script\", \"body\": \"\\u0002times_24_biuosdce\\u0002script\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the script of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: short id\", \"body\": \"\\u0002times_24_biuosdce\\u0002short id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short id of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: short name\", \"body\": \"\\u0002times_24_biuosdce\\u0002short name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short name of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: showlabel\", \"body\": \"\\u0002times_24_biuosdce\\u0002showlabel\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the showlabel of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: style\", \"body\": \"\\u0002times_24_biuosdce\\u0002style\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the style of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: textalign\", \"body\": \"\\u0002times_24_biuosdce\\u0002textalign\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the textalign of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: textfont\", \"body\": \"\\u0002times_24_biuosdce\\u0002textfont\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the textfont of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: textsize\", \"body\": \"\\u0002times_24_biuosdce\\u0002textsize\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the textsize of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: textstyle\", \"body\": \"\\u0002times_24_biuosdce\\u0002textstyle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the textstyle of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: top\", \"body\": \"\\u0002times_24_biuosdce\\u0002top\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the top of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: topleft\", \"body\": \"\\u0002times_24_biuosdce\\u0002topleft\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the topleft of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: visible\", \"body\": \"\\u0002times_24_biuosdce\\u0002visible\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the visible of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"btn: width\", \"body\": \"\\u0002times_24_biuosdce\\u0002width\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the width of cd btn \\\"myBtn\\\" into z\"}, {\"title\": \"card: abbrev id\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev id of card id 1011 into z\"}, {\"title\": \"card: abbrev name\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev name of card id 1011 into z\"}, {\"title\": \"card: id\", \"body\": \"\\u0002times_24_biuosdce\\u0002id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the id of card id 1011 into z\"}, {\"title\": \"card: long id\", \"body\": \"\\u0002times_24_biuosdce\\u0002long id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long id of card id 1011 into z\"}, {\"title\": \"card: long name\", \"body\": \"\\u0002times_24_biuosdce\\u0002long name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long name of card id 1011 into z\"}, {\"title\": \"card: name\", \"body\": \"\\u0002times_24_biuosdce\\u0002name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the name of card id 1011 into z\"}, {\"title\": \"card: short id\", \"body\": \"\\u0002times_24_biuosdce\\u0002short id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short id of card id 1011 into z\"}, {\"title\": \"card: short name\", \"body\": \"\\u0002times_24_biuosdce\\u0002short name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short name of card id 1011 into z\"}, {\"title\": \"fld: abbrev id\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev id of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: abbrev name\", \"body\": \"\\u0002times_24_biuosdce\\u0002abbrev name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the abbrev name of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: alltext\", \"body\": \"\\u0002times_24_biuosdce\\u0002alltext\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the alltext of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: botright\", \"body\": \"\\u0002times_24_biuosdce\\u0002botright\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the botright of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: bottom\", \"body\": \"\\u0002times_24_biuosdce\\u0002bottom\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the bottom of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: bottomright\", \"body\": \"\\u0002times_24_biuosdce\\u0002bottomright\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the bottomright of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: defaulttextfont\", \"body\": \"\\u0002times_24_biuosdce\\u0002defaulttextfont\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002If the user deletes all text in a field and then types a letter, the font of this letter will be determined by the defaulttextfont.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the defaulttextfont of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: defaulttextsize\", \"body\": \"\\u0002times_24_biuosdce\\u0002defaulttextsize\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002If the user deletes all text in a field and then types a letter, the size of this letter will be determined by the defaulttextsize.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the defaulttextsize of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: defaulttextstyle\", \"body\": \"\\u0002times_24_biuosdce\\u0002defaulttextstyle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002If the user deletes all text in a field and then types a letter, the style of this letter will be determined by the defaulttextstyle.\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the defaulttextstyle of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: dontwrap\", \"body\": \"\\u0002times_24_biuosdce\\u0002dontwrap\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the dontwrap of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: enabled\", \"body\": \"\\u0002times_24_biuosdce\\u0002enabled\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the enabled of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: height\", \"body\": \"\\u0002times_24_biuosdce\\u0002height\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the height of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: id\", \"body\": \"\\u0002times_24_biuosdce\\u0002id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the id of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: left\", \"body\": \"\\u0002times_24_biuosdce\\u0002left\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the left of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: loc\", \"body\": \"\\u0002times_24_biuosdce\\u0002loc\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the loc of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: location\", \"body\": \"\\u0002times_24_biuosdce\\u0002location\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the location of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: locktext\", \"body\": \"\\u0002times_24_biuosdce\\u0002locktext\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the locktext of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: long id\", \"body\": \"\\u0002times_24_biuosdce\\u0002long id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long id of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: long name\", \"body\": \"\\u0002times_24_biuosdce\\u0002long name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long name of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: name\", \"body\": \"\\u0002times_24_biuosdce\\u0002name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the name of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: rect\", \"body\": \"\\u0002times_24_biuosdce\\u0002rect\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the rect of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: rectangle\", \"body\": \"\\u0002times_24_biuosdce\\u0002rectangle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the rectangle of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: right\", \"body\": \"\\u0002times_24_biuosdce\\u0002right\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the right of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: scroll\", \"body\": \"\\u0002times_24_biuosdce\\u0002scroll\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the scroll of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: short id\", \"body\": \"\\u0002times_24_biuosdce\\u0002short id\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short id of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: short name\", \"body\": \"\\u0002times_24_biuosdce\\u0002short name\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the short name of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: singleline\", \"body\": \"\\u0002times_24_biuosdce\\u0002singleline\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the singleline of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: style\", \"body\": \"\\u0002times_24_biuosdce\\u0002style\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the style of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: textalign\", \"body\": \"\\u0002times_24_biuosdce\\u0002textalign\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the textalign of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: textfont\", \"body\": \"\\u0002times_24_biuosdce\\u0002textfont\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002By default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textfont of cd fld \\\"myFld\\\" to \\\"chicago\\\"\\nput the textfont of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textfont of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"geneva\\\"\\nput the textfont of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values,\\nreturns the string \\\"mixed\\\".\"}, {\"title\": \"fld: textsize\", \"body\": \"\\u0002times_24_biuosdce\\u0002textsize\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002By default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textsize of cd fld \\\"myFld\\\" to \\\"chicago\\\"\\nput the textsize of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textsize of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"geneva\\\"\\nput the textsize of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values,\\nreturns the string \\\"mixed\\\".\"}, {\"title\": \"fld: textstyle\", \"body\": \"\\u0002times_24_biuosdce\\u0002textstyle\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002By default, applies the property to the entire field.\\n\\u0002monaco_9_biuosdce\\u0002set the textstyle of cd fld \\\"myFld\\\" to \\\"bold\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"bold,italic\\\"\\nset the textstyle of cd fld \\\"myFld\\\" to \\\"plain\\\"\\nput the textstyle of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWe now support getting and setting by chunk!\\n\\u0002monaco_9_biuosdce\\u0002set the textstyle of char 3 to 4 of cd fld \\\"myFld\\\" to \\\"bold\\\"\\nput the textstyle of char 3 to 4 of cd fld \\\"myFld\\\" into z\\u0002times_12_biuosdce\\u0002\\n\\nWhen querying for a property and there are multiple values,\\nreturns the string \\\"mixed\\\".\"}, {\"title\": \"fld: top\", \"body\": \"\\u0002times_24_biuosdce\\u0002top\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the top of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: topleft\", \"body\": \"\\u0002times_24_biuosdce\\u0002topleft\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the topleft of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: visible\", \"body\": \"\\u0002times_24_biuosdce\\u0002visible\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the visible of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"fld: width\", \"body\": \"\\u0002times_24_biuosdce\\u0002width\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the width of cd fld \\\"myFld\\\" into z\"}, {\"title\": \"global: environment\", \"body\": \"\\u0002times_24_biuosdce\\u0002environment\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the environment into z\"}, {\"title\": \"global: freesize\", \"body\": \"\\u0002times_24_biuosdce\\u0002freesize\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the freesize into z\"}, {\"title\": \"global: idlerate\", \"body\": \"\\u0002times_24_biuosdce\\u0002idlerate\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nset the idlerate to \\\"default\\\"\\nset the idlerate to \\\"faster\\\"\"}, {\"title\": \"global: itemdelimiter\", \"body\": \"\\u0002times_24_biuosdce\\u0002itemdelimiter\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the itemdelimiter into z\"}, {\"title\": \"global: long version\", \"body\": \"\\u0002times_24_biuosdce\\u0002long version\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the long version into z\"}, {\"title\": \"global: size\", \"body\": \"\\u0002times_24_biuosdce\\u0002size\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the size into z\"}, {\"title\": \"global: stacksinuse\", \"body\": \"\\u0002times_24_biuosdce\\u0002stacksinuse\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the stacksinuse into z\"}, {\"title\": \"global: suspended\", \"body\": \"\\u0002times_24_biuosdce\\u0002suspended\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002(Deprecated and hard-coded, for backwards compatibility only)\\n\\nExamples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the suspended into z\"}, {\"title\": \"global: version\", \"body\": \"\\u0002times_24_biuosdce\\u0002version\\n\\n\\u0002times_12_biuosdce\\u0002\\u0002times_12_biuosdce\\u0002Examples:\\n\\u0002monaco_9_biuosdce\\u0002\\nput the version into z\"}]}\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/testScriptExtensiveConditionalsCollateral.txt",
    "content": "repeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else doOperation \"g\"\n        else if condition(11) then \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            doOperation \"c\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then doOperation \"h\"\n            else if condition(13) then \n            end if\n        else if condition(14) then \n            if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n        else \n            if condition(4) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            end if\n        else if condition(13) then \n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n            else \n                doOperation \"f\"\n            end if\n        else \n            if condition(14) then \n                doOperation \"g\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n    else if condition(2) then \n        doOperation \"a\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(5) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n        else \n            if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n    else if condition(2) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else if condition(13) then doOperation \"e\"\n        else if condition(14) then \n            if condition(15) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(6) then \n            else doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else doOperation \"d\"\n        else doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(9) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else doOperation \"d\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"e\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(8) then doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n            end if\n        else \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n    else if condition(2) then doOperation \"a\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then doOperation \"i\"\n            else if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else \n            if condition(9) then doOperation \"g\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n        end if\n    else if condition(12) then \n        if condition(13) then \n            if condition(14) then \n                doOperation \"e\"\n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then doOperation \"d\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n            else if condition(15) then doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n    else doOperation \"a\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else \n        if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then doOperation \"g\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            doOperation \"b\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(12) then \n            else if condition(13) then doOperation \"h\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            else if condition(10) then doOperation \"e\"\n        else \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else if condition(5) then doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then doOperation \"d\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n            end if\n        else \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n                doOperation \"i\"\n            else if condition(13) then \n                doOperation \"j\"\n            else \n                doOperation \"k\"\n            end if\n        else if condition(14) then \n            if condition(15) then doOperation \"l\"\n            else if condition(16) then \n                doOperation \"m\"\n            else \n                doOperation \"n\"\n            end if\n        else if condition(17) then \n            if condition(18) then \n                doOperation \"o\"\n            else if condition(19) then \n                doOperation \"p\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n        else \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            else \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else \n            end if\n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            end if\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(11) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(13) then \n            doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else \n            if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            doOperation \"e\"\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(10) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"a\"\n            else if condition(8) then doOperation \"b\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"c\"\n            else if condition(12) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"a\"\n        else \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n            end if\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(6) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(13) then \n            if condition(14) then doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then doOperation \"d\"\n        else \n            if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else \n            if condition(4) then doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n            else \n                doOperation \"g\"\n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else doOperation \"a\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n            else if condition(12) then doOperation \"f\"\n        end if\n    else \n        if condition(13) then \n            if condition(14) then doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            else doOperation \"i\"\n        else \n            if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else \n        if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then doOperation \"g\"\n        else \n            if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then doOperation \"i\"\n            else if condition(17) then doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else \n            if condition(9) then \n            else \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then doOperation \"g\"\n        else \n            if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n        end if\n    else doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n        doOperation \"a\"\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(10) then \n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else if condition(6) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(11) then \n        doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then doOperation \"f\"\n        else if condition(14) then \n            if condition(15) then doOperation \"g\"\n            else if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then doOperation \"a\"\n    else doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else doOperation \"b\"\n    else \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(11) then \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then doOperation \"d\"\n        else if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        else if condition(8) then \n        end if\n    else doOperation \"f\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then doOperation \"g\"\n            else if condition(14) then \n                doOperation \"h\"\n            else if condition(15) then \n                doOperation \"i\"\n            end if\n        else if condition(16) then \n            if condition(17) then \n                doOperation \"j\"\n            else \n                doOperation \"k\"\n            end if\n        else if condition(18) then \n            doOperation \"l\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then doOperation \"c\"\n        else \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n            end if\n        else \n            if condition(9) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"d\"\n        else \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"b\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"c\"\n            else if condition(13) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        doOperation \"a\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else \n            doOperation \"b\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            doOperation \"c\"\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"e\"\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(5) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"f\"\n            else if condition(13) then doOperation \"g\"\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else \n                doOperation \"g\"\n            end if\n        else if condition(14) then \n            if condition(15) then doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        else \n            if condition(16) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n    else \n        if condition(4) then \n        else doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else \n        end if\n    else \n        if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else if condition(4) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n        else \n        end if\n    else if condition(5) then \n        if condition(6) then doOperation \"a\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(11) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n        doOperation \"a\"\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(11) then doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n    else if condition(5) then \n        if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            doOperation \"a\"\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"c\"\n        else \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(6) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else \n            if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then doOperation \"d\"\n            else if condition(6) then \n            else if condition(7) then doOperation \"e\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else \n            end if\n        else \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else \n            if condition(10) then \n            else if condition(11) then \n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n        else if condition(8) then \n        else \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n            else if condition(11) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(10) then doOperation \"f\"\n        else \n            if condition(11) then doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n            end if\n        else doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"a\"\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else \n            if condition(6) then \n            else doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then doOperation \"b\"\n        else \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(11) then \n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        else \n            if condition(8) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        else \n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else doOperation \"b\"\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"c\"\n        else if condition(8) then doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n            doOperation \"b\"\n        else \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"a\"\n            else if condition(9) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(10) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    else doOperation \"d\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else if condition(5) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else if condition(11) then \n            end if\n        end if\n    else \n        if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else \n            if condition(9) then doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"b\"\n        else \n            if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(8) then \n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        end if\n    else if condition(5) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(8) then \n            else \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            end if\n        else \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            end if\n        else if condition(12) then doOperation \"e\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            else \n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n        else if condition(6) then \n        end if\n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else doOperation \"e\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"c\"\n        else \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n            end if\n        else \n            doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"f\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        else \n            if condition(15) then \n                doOperation \"g\"\n            else if condition(16) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n            else if condition(7) then \n                doOperation \"f\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n            else doOperation \"g\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then doOperation \"h\"\n            else doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        end if\n    else \n        if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else \n            if condition(10) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n        else if condition(10) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then doOperation \"b\"\n            else if condition(10) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n            else if condition(16) then \n                doOperation \"i\"\n            else doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then doOperation \"b\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"e\"\n            else if condition(15) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else \n            end if\n        else if condition(10) then \n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"e\"\n            else if condition(15) then \n                doOperation \"f\"\n            end if\n        else if condition(16) then \n            if condition(17) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else doOperation \"b\"\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"f\"\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"h\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            doOperation \"b\"\n        end if\n    else if condition(3) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            doOperation \"b\"\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n        else if condition(9) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n                doOperation \"h\"\n            end if\n        else if condition(15) then \n        else \n            if condition(16) then \n            else if condition(17) then \n                doOperation \"i\"\n            else if condition(18) then \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"b\"\n            else if condition(10) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(14) then \n            if condition(15) then \n            else if condition(16) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(13) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"h\"\n            else if condition(15) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else if condition(9) then doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n        end if\n    else \n        if condition(3) then \n        else if condition(4) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else doOperation \"c\"\n        else \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then doOperation \"g\"\n            else if condition(14) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else doOperation \"c\"\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"f\"\n            else \n            end if\n        else \n            if condition(12) then doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else doOperation \"d\"\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(10) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"c\"\n            else if condition(12) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(11) then \n            if condition(12) then doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then doOperation \"a\"\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n        end if\n    else \n        if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    else if condition(12) then \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"g\"\n            end if\n        else if condition(15) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(11) then \n        doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else \n            end if\n        else \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then doOperation \"g\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then doOperation \"d\"\n        else if condition(10) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n        end if\n    else doOperation \"f\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n                doOperation \"e\"\n            else \n            end if\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then doOperation \"e\"\n        else if condition(9) then doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"a\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n            end if\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"f\"\n            else if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(5) then \n            else doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(12) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"g\"\n        else if condition(10) then \n        else if condition(11) then \n            if condition(12) then doOperation \"h\"\n            else if condition(13) then \n                doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 52433 into current\n    if current >= 2097152 then put current - 2097152 into current\n    prepConditions current, 21\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        else if condition(16) then \n            if condition(17) then \n            else if condition(18) then \n            end if\n        else \n            if condition(19) then doOperation \"i\"\n            else if condition(20) then \n                doOperation \"j\"\n            else if condition(21) then \n                doOperation \"k\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"e\"\n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"b\"\n            else if condition(11) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            doOperation \"b\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n        else \n            if condition(12) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n            else doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n            else \n            end if\n        else \n            if condition(13) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then doOperation \"d\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n            else if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n                doOperation \"e\"\n            end if\n        else if condition(7) then \n            doOperation \"f\"\n        else if condition(8) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"b\"\n            else if condition(10) then \n            else if condition(11) then doOperation \"c\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"d\"\n            else if condition(15) then \n            end if\n        else if condition(16) then \n            if condition(17) then \n                doOperation \"e\"\n            else if condition(18) then doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then \n            else if condition(11) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(12) then \n        if condition(13) then \n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    else \n        if condition(5) then \n            doOperation \"e\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(9) then doOperation \"g\"\n            else if condition(10) then \n                doOperation \"h\"\n            else if condition(11) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else if condition(5) then doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else \n        end if\n    else \n        if condition(5) then \n            doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        else if condition(10) then doOperation \"e\"\n        else \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        else if condition(7) then \n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"f\"\n            else if condition(15) then \n            else if condition(16) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(17) then doOperation \"h\"\n            else if condition(18) then doOperation \"i\"\n            else doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        else if condition(11) then \n            if condition(12) then doOperation \"i\"\n            else if condition(13) then doOperation \"j\"\n            else if condition(14) then \n            end if\n        else \n            doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else if condition(9) then doOperation \"e\"\n        else \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"e\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then doOperation \"c\"\n    else if condition(8) then \n        if condition(9) then doOperation \"d\"\n        else \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        end if\n    else \n        if condition(9) then \n            doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(12) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        end if\n    else doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n            else doOperation \"f\"\n        else \n            if condition(14) then \n            else if condition(15) then \n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else \n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then doOperation \"a\"\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"b\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"c\"\n            else if condition(12) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n        else \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then doOperation \"c\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n        else \n        end if\n    else if condition(5) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else \n            end if\n        end if\n    else \n        if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else \n            if condition(15) then \n                doOperation \"i\"\n            else if condition(16) then \n            else if condition(17) then doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n        else if condition(6) then doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then doOperation \"c\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        else \n            if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else \n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then doOperation \"d\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"e\"\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(6) then doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else doOperation \"b\"\n    else \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n        else \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n            else if condition(12) then \n            end if\n        else \n            if condition(13) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            end if\n        else \n            if condition(11) then \n            else if condition(12) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n            else if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n        else \n            if condition(4) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else if condition(10) then \n        doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else \n            end if\n        end if\n    else \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then doOperation \"f\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n        else if condition(11) then \n            if condition(12) then \n            else doOperation \"g\"\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            doOperation \"e\"\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        else \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else doOperation \"d\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"e\"\n            else if condition(15) then \n                doOperation \"f\"\n            end if\n        else if condition(16) then \n            if condition(17) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else \n            if condition(4) then \n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then \n        doOperation \"a\"\n    else doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(9) then \n        end if\n    else if condition(10) then \n        if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then doOperation \"d\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"f\"\n            else if condition(15) then \n            end if\n        else \n            if condition(16) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else doOperation \"a\"\n        else \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then doOperation \"g\"\n            else if condition(15) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else doOperation \"f\"\n        else \n            if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else if condition(14) then doOperation \"h\"\n        else if condition(15) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else \n            if condition(7) then doOperation \"a\"\n            else if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else doOperation \"b\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        else if condition(6) then \n            if condition(7) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    else if condition(8) then doOperation \"g\"\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n        else \n            if condition(12) then \n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n        end if\n    else \n        if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"c\"\n            else doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n            else if condition(7) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then doOperation \"d\"\n    else if condition(7) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n            end if\n        end if\n    else \n        doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n            end if\n        end if\n    else \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n        else \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        else \n            doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        else if condition(11) then \n            doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        else \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            doOperation \"e\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            else \n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(12) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            else if condition(13) then doOperation \"f\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        else if condition(9) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n        end if\n    else \n        if condition(12) then \n        else if condition(13) then \n            if condition(14) then \n                doOperation \"f\"\n            else if condition(15) then \n            else \n                doOperation \"g\"\n            end if\n        else \n            if condition(16) then \n            else if condition(17) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    else if condition(13) then \n        if condition(14) then \n            doOperation \"f\"\n        else if condition(15) then \n            if condition(16) then \n            else if condition(17) then \n            else if condition(18) then \n                doOperation \"g\"\n            end if\n        else if condition(19) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        else if condition(14) then doOperation \"f\"\n        else \n            if condition(15) then \n            else if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            else if condition(13) then \n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then doOperation \"b\"\n        else \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"a\"\n            else if condition(10) then \n                doOperation \"b\"\n            else if condition(11) then doOperation \"c\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            end if\n        else if condition(14) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(13) then \n            else if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else \n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"f\"\n            else if condition(16) then \n            else if condition(17) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n    else \n        if condition(2) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(6) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        else \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            else if condition(9) then doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n            end if\n        else if condition(14) then \n            if condition(15) then doOperation \"d\"\n            else if condition(16) then \n            else if condition(17) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(11) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"f\"\n        else if condition(9) then \n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            end if\n        end if\n    else \n        if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"i\"\n            else doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"e\"\n            else if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else \n            end if\n        else if condition(14) then \n            if condition(15) then doOperation \"f\"\n            else doOperation \"g\"\n        else \n            if condition(16) then \n            else if condition(17) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n            else if condition(11) then doOperation \"h\"\n        end if\n    else if condition(12) then \n        if condition(13) then \n            if condition(14) then \n            end if\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"i\"\n            else if condition(17) then doOperation \"j\"\n        else if condition(18) then \n            if condition(19) then \n                doOperation \"k\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n        else \n            if condition(10) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"b\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n            else \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else \n            end if\n        else if condition(14) then \n            if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then doOperation \"b\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            else \n            end if\n        else if condition(11) then doOperation \"c\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else \n            end if\n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    else doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else \n        end if\n    else \n        if condition(6) then \n            doOperation \"b\"\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n            else if condition(10) then \n            end if\n        else \n            if condition(11) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then doOperation \"b\"\n        else \n            if condition(7) then doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        else \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        else \n            if condition(16) then \n            else if condition(17) then \n                doOperation \"j\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else \n            if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then doOperation \"i\"\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"j\"\n            else if condition(17) then \n            else doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(4) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else doOperation \"a\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(11) then \n            doOperation \"f\"\n        else doOperation \"g\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    else if condition(5) then doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            end if\n        else \n            if condition(14) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n            else \n            end if\n        else \n            if condition(16) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(11) then \n            doOperation \"f\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then doOperation \"h\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            end if\n        else \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"g\"\n            else doOperation \"h\"\n        else \n            if condition(15) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then doOperation \"b\"\n        else if condition(3) then \n            doOperation \"c\"\n        else if condition(4) then \n            if condition(5) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(4) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n        else \n            if condition(8) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else \n            if condition(4) then \n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then doOperation \"b\"\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then doOperation \"b\"\n        else doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then doOperation \"c\"\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"a\"\n            else if condition(9) then \n                doOperation \"b\"\n            end if\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then doOperation \"g\"\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            doOperation \"f\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then \n            else if condition(17) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"i\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then doOperation \"c\"\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            else \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(12) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        else \n        end if\n    else \n        if condition(9) then \n            doOperation \"f\"\n        else \n            if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        else \n            if condition(13) then doOperation \"h\"\n            else doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        else \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"f\"\n            else if condition(9) then \n                doOperation \"g\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n                doOperation \"h\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then doOperation \"i\"\n        else \n            if condition(16) then \n            else \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        else if condition(5) then \n            doOperation \"b\"\n        else doOperation \"c\"\n    else if condition(6) then \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            else \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else if condition(12) then \n            else if condition(13) then \n            end if\n        else if condition(14) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n        else if condition(10) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then doOperation \"d\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(10) then \n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            else \n            end if\n        else if condition(14) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n        else \n            doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else \n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else \n            if condition(6) then \n            else if condition(7) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n            end if\n        else if condition(13) then doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"c\"\n            else \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            else doOperation \"f\"\n        else \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then doOperation \"e\"\n            else \n            end if\n        else \n            if condition(14) then \n                doOperation \"f\"\n            else if condition(15) then \n                doOperation \"g\"\n            else if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    else \n        if condition(5) then doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            doOperation \"a\"\n        else if condition(6) then \n            doOperation \"b\"\n        else \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            doOperation \"e\"\n        else \n            if condition(10) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        else if condition(12) then \n            doOperation \"h\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then doOperation \"a\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(12) then \n            doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(7) then \n        else \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n        else if condition(7) then \n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n            end if\n        else \n            if condition(12) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        else if condition(15) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then doOperation \"d\"\n        else \n            if condition(9) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else \n            end if\n        end if\n    else if condition(11) then doOperation \"g\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else \n            if condition(7) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n            else \n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"e\"\n            else if condition(16) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then doOperation \"d\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            end if\n        else if condition(10) then \n        else \n            if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n            if condition(4) then doOperation \"b\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        end if\n    else doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n        end if\n    else \n        if condition(8) then \n            doOperation \"d\"\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(12) then doOperation \"g\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then doOperation \"d\"\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"a\"\n            end if\n        else if condition(8) then doOperation \"b\"\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n            else if condition(12) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        else \n            if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else if condition(8) then \n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        else if condition(11) then \n            doOperation \"f\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"g\"\n            else if condition(11) then \n                doOperation \"h\"\n            else \n            end if\n        else \n            if condition(12) then \n                doOperation \"i\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            else if condition(11) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n            end if\n        else \n            if condition(9) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        if condition(10) then \n            doOperation \"f\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(13) then doOperation \"h\"\n            else doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        else if condition(13) then \n            doOperation \"j\"\n        else \n            if condition(14) then \n                doOperation \"k\"\n            else if condition(15) then \n                doOperation \"l\"\n            else \n                doOperation \"m\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            doOperation \"a\"\n        else \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"c\"\n        else \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then doOperation \"d\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then doOperation \"g\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n            else doOperation \"b\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else doOperation \"c\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            doOperation \"e\"\n        else \n            if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else doOperation \"d\"\n        end if\n    else doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else \n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"f\"\n            else if condition(15) then \n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else if condition(6) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n            else doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"d\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"e\"\n            else if condition(15) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"f\"\n        else if condition(9) then \n        else if condition(10) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        else doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(9) then \n            doOperation \"d\"\n        else if condition(10) then doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"d\"\n        else if condition(7) then \n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n        end if\n    else \n        doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then doOperation \"e\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"c\"\n            else if condition(15) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n            else if condition(11) then doOperation \"h\"\n        end if\n    else if condition(12) then \n        if condition(13) then \n        else if condition(14) then \n            if condition(15) then \n                doOperation \"i\"\n            else if condition(16) then \n                doOperation \"j\"\n            else if condition(17) then doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"f\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then \n            end if\n        else if condition(17) then \n            if condition(18) then \n                doOperation \"i\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"e\"\n            else if condition(8) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"g\"\n            else if condition(11) then \n                doOperation \"h\"\n            else \n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"d\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    else \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then doOperation \"g\"\n            else if condition(14) then \n            end if\n        else \n            if condition(15) then doOperation \"h\"\n            else if condition(16) then doOperation \"i\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n        end if\n    else \n        if condition(10) then \n        else \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else doOperation \"b\"\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n            else doOperation \"b\"\n        end if\n    else if condition(6) then doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    else \n        if condition(13) then \n            doOperation \"h\"\n        else if condition(14) then \n            if condition(15) then doOperation \"i\"\n            else if condition(16) then doOperation \"j\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else \n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else doOperation \"c\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then doOperation \"d\"\n            else if condition(13) then doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"g\"\n            else if condition(16) then \n            end if\n        else if condition(17) then \n            if condition(18) then \n                doOperation \"h\"\n            else if condition(19) then doOperation \"i\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"a\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            else \n            end if\n        else \n            if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            else if condition(9) then doOperation \"e\"\n        else \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    else \n        if condition(13) then \n        else if condition(14) then \n            if condition(15) then \n                doOperation \"h\"\n            else if condition(16) then \n                doOperation \"i\"\n            else \n            end if\n        else \n            if condition(17) then \n            else if condition(18) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then doOperation \"e\"\n            else doOperation \"f\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            else if condition(11) then doOperation \"f\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n        end if\n    else if condition(8) then \n        if condition(9) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n            else if condition(7) then doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then doOperation \"b\"\n    else if condition(6) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        else if condition(12) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then \n            doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n            else if condition(15) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(16) then \n                doOperation \"h\"\n            else if condition(17) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then doOperation \"b\"\n        else if condition(8) then \n            if condition(9) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        else \n            doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"d\"\n        else if condition(8) then \n        else doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else if condition(9) then doOperation \"f\"\n        else \n            if condition(10) then doOperation \"g\"\n            else if condition(11) then doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then doOperation \"e\"\n        else \n            if condition(8) then \n                doOperation \"f\"\n            else if condition(9) then doOperation \"g\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n        end if\n    else doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n        else \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        else \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"e\"\n            else if condition(14) then \n            end if\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n            else if condition(16) then \n                doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else \n            if condition(6) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n        else if condition(6) then doOperation \"a\"\n    else if condition(7) then \n        if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then doOperation \"f\"\n        else \n            if condition(11) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n        else if condition(14) then \n            if condition(15) then doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then doOperation \"c\"\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            end if\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n            if condition(10) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then doOperation \"d\"\n        else \n            if condition(9) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n        else \n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then \n            else if condition(11) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"a\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then doOperation \"b\"\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"e\"\n            else if condition(15) then \n                doOperation \"f\"\n            end if\n        else if condition(16) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else if condition(8) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"f\"\n            else if condition(15) then doOperation \"g\"\n            else if condition(16) then doOperation \"h\"\n        else \n            if condition(17) then \n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then doOperation \"d\"\n        else \n            if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"g\"\n            else \n            end if\n        else \n            if condition(12) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"h\"\n            else if condition(14) then doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        else doOperation \"k\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then \n        else \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"f\"\n            else if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"f\"\n            else if condition(9) then \n                doOperation \"g\"\n            else if condition(10) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n        else \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"b\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else \n            end if\n        else \n            if condition(12) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            end if\n        else \n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"f\"\n        else if condition(12) then \n        else \n            if condition(13) then \n            else if condition(14) then \n            else if condition(15) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            else \n                doOperation \"g\"\n            end if\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"h\"\n            else if condition(17) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            doOperation \"e\"\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(12) then \n        if condition(13) then \n            if condition(14) then \n            end if\n        else if condition(15) then \n            if condition(16) then \n            else if condition(17) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(18) then \n            if condition(19) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then \n        else if condition(3) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"e\"\n            else \n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"d\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            doOperation \"e\"\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else \n            if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n            else if condition(10) then doOperation \"e\"\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n            end if\n        else \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    else doOperation \"c\"\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"f\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else doOperation \"b\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"c\"\n        else if condition(11) then \n            doOperation \"d\"\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n        else doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then doOperation \"d\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            end if\n        else \n            if condition(14) then \n                doOperation \"i\"\n            else if condition(15) then \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"e\"\n            else if condition(7) then doOperation \"f\"\n        else if condition(8) then \n            if condition(9) then doOperation \"g\"\n            else if condition(10) then doOperation \"h\"\n            else if condition(11) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    else if condition(4) then doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            else if condition(14) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else \n            end if\n        else \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else doOperation \"a\"\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else \n            if condition(8) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"i\"\n            else doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            end if\n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else doOperation \"g\"\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then doOperation \"d\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else doOperation \"b\"\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else \n            if condition(11) then doOperation \"h\"\n            else if condition(12) then \n                doOperation \"i\"\n            else if condition(13) then doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else if condition(7) then doOperation \"d\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"d\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else \n            end if\n        else if condition(12) then \n            doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else \n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"h\"\n            else if condition(12) then \n                doOperation \"i\"\n            else if condition(13) then doOperation \"j\"\n        else if condition(14) then \n            if condition(15) then \n                doOperation \"k\"\n            else if condition(16) then \n                doOperation \"l\"\n            else if condition(17) then \n                doOperation \"m\"\n            end if\n        else doOperation \"n\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then \n                doOperation \"f\"\n            end if\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (2-1)\n    prepConditions x, 1\n    if condition(1) then doOperation \"a\"\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        else if condition(8) then doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else \n        if condition(4) then \n            doOperation \"a\"\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n        else if condition(11) then \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n        else \n            if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(7) then doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then doOperation \"e\"\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else doOperation \"e\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 26227 into current\n    if current >= 1048576 then put current - 1048576 into current\n    prepConditions current, 20\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n            else if condition(15) then doOperation \"f\"\n        else if condition(16) then \n            if condition(17) then \n            else if condition(18) then \n            end if\n        else if condition(19) then \n            if condition(20) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else \n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then doOperation \"f\"\n            else doOperation \"g\"\n        else \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            else doOperation \"d\"\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    else if condition(11) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else \n            if condition(9) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"b\"\n            else if condition(11) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        end if\n    else \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    else if condition(8) then \n        if condition(9) then doOperation \"g\"\n        else \n            if condition(10) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            doOperation \"d\"\n        else \n            if condition(6) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            end if\n        else \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else if condition(9) then \n            if condition(10) then \n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"a\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n        else \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else \n        if condition(7) then \n        else \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n        else \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"e\"\n            else if condition(8) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"g\"\n            else \n            end if\n        else if condition(12) then \n            if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n            end if\n        else \n            if condition(9) then doOperation \"d\"\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"e\"\n            else if condition(14) then doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then doOperation \"e\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else \n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            doOperation \"g\"\n        else \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n            end if\n        else if condition(8) then \n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"c\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"f\"\n            else if condition(15) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else \n                doOperation \"g\"\n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"h\"\n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            doOperation \"f\"\n        else \n            if condition(8) then \n                doOperation \"g\"\n            else if condition(9) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            end if\n        else doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n        end if\n    else if condition(11) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else doOperation \"a\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13109 into current\n    if current >= 524288 then put current - 524288 into current\n    prepConditions current, 19\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n            else \n            end if\n        else \n            if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then doOperation \"f\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then doOperation \"h\"\n        else if condition(16) then \n            if condition(17) then \n                doOperation \"i\"\n            else if condition(18) then doOperation \"j\"\n            else if condition(19) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else if condition(8) then \n        if condition(9) then doOperation \"e\"\n        else \n            if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n            end if\n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    else doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n            doOperation \"c\"\n        end if\n    else if condition(6) then doOperation \"d\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(12) then doOperation \"g\"\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n            else if condition(7) then \n            else \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        else \n            if condition(11) then \n                doOperation \"g\"\n            else if condition(12) then \n                doOperation \"h\"\n            else if condition(13) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"g\"\n            else if condition(11) then \n            else if condition(12) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else if condition(12) then doOperation \"d\"\n        else if condition(13) then \n            if condition(14) then doOperation \"e\"\n            else if condition(15) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"e\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        end if\n    else doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n        else if condition(11) then \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n                doOperation \"f\"\n            end if\n        else doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else if condition(7) then doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then doOperation \"f\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else if condition(7) then doOperation \"d\"\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        end if\n    else \n        doOperation \"g\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"a\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            doOperation \"c\"\n        else \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n                doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(6) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else \n        doOperation \"g\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"e\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else \n        if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then doOperation \"c\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"d\"\n            else if condition(13) then doOperation \"e\"\n            else \n            end if\n        else \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        else \n            if condition(14) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else \n            doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then doOperation \"c\"\n        else \n            if condition(5) then \n            else doOperation \"d\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        else if condition(12) then doOperation \"h\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            doOperation \"c\"\n        else if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then doOperation \"d\"\n    else \n        if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n            end if\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        else \n        end if\n    else if condition(4) then \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(10) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(10) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        else doOperation \"c\"\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then doOperation \"g\"\n            else if condition(12) then doOperation \"h\"\n            else doOperation \"i\"\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"j\"\n            else if condition(15) then \n            else doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            else doOperation \"f\"\n        else \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then doOperation \"f\"\n        else \n            if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"f\"\n            else \n            end if\n        else if condition(14) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n        end if\n    else if condition(8) then \n        if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then doOperation \"d\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then \n            else \n            end if\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(11) then doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else if condition(6) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else if condition(4) then doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"a\"\n        end if\n    else \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else \n            doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else if condition(10) then \n            end if\n        else if condition(11) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            end if\n        else if condition(14) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n        else \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n        else \n            if condition(5) then \n            else if condition(6) then \n            else doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then doOperation \"f\"\n        else \n            if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else \n            end if\n        else if condition(7) then \n        else \n            if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        if condition(5) then \n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        else \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n        else \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then doOperation \"e\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else \n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            else doOperation \"d\"\n        else \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(9) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else if condition(4) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        end if\n    else doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then doOperation \"f\"\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n                doOperation \"h\"\n            else if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            doOperation \"c\"\n        else if condition(9) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            end if\n        end if\n    else if condition(12) then doOperation \"e\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then doOperation \"g\"\n            else if condition(11) then \n                doOperation \"h\"\n            end if\n        else if condition(12) then doOperation \"i\"\n        else \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"j\"\n            else if condition(15) then \n                doOperation \"k\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n            else if condition(10) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            else \n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n            else doOperation \"d\"\n        else if condition(11) then \n        else \n            if condition(12) then \n                doOperation \"e\"\n            else if condition(13) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n            end if\n        else \n            if condition(6) then \n            else doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        else if condition(11) then \n            doOperation \"c\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(10) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then \n            else if condition(13) then \n            end if\n        else if condition(14) then \n            if condition(15) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else doOperation \"g\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n        else \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n            end if\n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(12) then doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n                doOperation \"a\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else if condition(13) then doOperation \"e\"\n            else if condition(14) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then doOperation \"f\"\n            else \n            end if\n        end if\n    else \n        if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"h\"\n            else if condition(15) then \n                doOperation \"i\"\n            end if\n        else if condition(16) then \n            if condition(17) then doOperation \"j\"\n            else \n                doOperation \"k\"\n            end if\n        else doOperation \"l\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"c\"\n        else \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        end if\n    else \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else doOperation \"d\"\n        else \n            if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else doOperation \"g\"\n        else if condition(13) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            doOperation \"c\"\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n            if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n        else \n            doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then doOperation \"e\"\n            else if condition(8) then doOperation \"f\"\n        else if condition(9) then \n        end if\n    else \n        if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then \n            else if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n            end if\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else if condition(12) then \n            else \n            end if\n        else if condition(13) then \n        else \n            if condition(14) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then doOperation \"e\"\n        else \n            if condition(10) then \n            else if condition(11) then \n                doOperation \"f\"\n            else if condition(12) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else \n            end if\n        else if condition(5) then doOperation \"a\"\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n            else if condition(13) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(8) then \n            doOperation \"d\"\n        end if\n    else if condition(9) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then \n            end if\n        else if condition(11) then \n            doOperation \"d\"\n        else if condition(12) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"c\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(13) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"b\"\n            else if condition(11) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n    else \n        if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else \n        if condition(9) then \n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else doOperation \"a\"\n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            else \n            end if\n        else \n            if condition(13) then \n                doOperation \"g\"\n            else if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else \n            end if\n        else if condition(13) then \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    else if condition(10) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else if condition(7) then doOperation \"e\"\n        else \n            if condition(8) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n            end if\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"e\"\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            doOperation \"f\"\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        else \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n            else if condition(14) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else doOperation \"c\"\n        else \n        end if\n    else if condition(7) then \n        if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(11) then doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        else if condition(9) then \n            doOperation \"a\"\n        else \n            if condition(10) then doOperation \"b\"\n            else if condition(11) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"e\"\n        else if condition(11) then \n            if condition(12) then doOperation \"f\"\n            else if condition(13) then doOperation \"g\"\n        else \n            if condition(14) then \n                doOperation \"h\"\n            else if condition(15) then doOperation \"i\"\n            else if condition(16) then \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n            else \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(13) then \n        else \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then doOperation \"e\"\n        else if condition(10) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else \n            end if\n        else if condition(7) then \n        else \n            if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then doOperation \"b\"\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else \n            if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            end if\n        end if\n    else if condition(12) then \n        if condition(13) then \n            if condition(14) then \n            else doOperation \"f\"\n        else \n            doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else if condition(5) then \n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        else if condition(8) then doOperation \"b\"\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else if condition(10) then \n            end if\n        end if\n    else \n        if condition(11) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(7) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(10) then doOperation \"d\"\n        else \n            if condition(11) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        else \n            if condition(4) then \n            else doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        end if\n    else doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n            if condition(13) then doOperation \"g\"\n            else if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n            doOperation \"c\"\n        else \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            end if\n        else if condition(10) then \n            doOperation \"b\"\n        else \n            if condition(11) then \n                doOperation \"c\"\n            else if condition(12) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n        else \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else doOperation \"b\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            doOperation \"a\"\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"d\"\n            else if condition(14) then doOperation \"e\"\n        else if condition(15) then \n            doOperation \"f\"\n        else \n            if condition(16) then doOperation \"g\"\n            else if condition(17) then \n            else if condition(18) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else if condition(12) then \n                doOperation \"e\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        else \n            if condition(15) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"f\"\n            else if condition(9) then \n            else if condition(10) then doOperation \"g\"\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n                doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        else doOperation \"b\"\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            doOperation \"d\"\n        else \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(8) then \n            doOperation \"d\"\n        else \n            if condition(9) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then \n            else \n            end if\n        else \n            if condition(13) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else doOperation \"b\"\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        else \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"e\"\n        else if condition(10) then \n            doOperation \"f\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"g\"\n            else if condition(13) then \n                doOperation \"h\"\n            else if condition(14) then \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n            doOperation \"e\"\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then doOperation \"c\"\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then \n            else \n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n        else doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else if condition(8) then \n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n            else doOperation \"d\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(14) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            else \n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            else \n            end if\n        else \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            else \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else doOperation \"c\"\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else if condition(9) then \n            doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else doOperation \"a\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else if condition(6) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then doOperation \"b\"\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n        end if\n    else if condition(9) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"a\"\n            else if condition(6) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"c\"\n            else if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(7) then \n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n        else \n            doOperation \"a\"\n        end if\n    else if condition(3) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n            else \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        else \n            doOperation \"e\"\n        end if\n    else if condition(8) then doOperation \"f\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n            else doOperation \"d\"\n        end if\n    else \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        else if condition(12) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else doOperation \"b\"\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"c\"\n        else if condition(5) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            end if\n        else doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    else \n        if condition(12) then \n            doOperation \"i\"\n        else if condition(13) then \n        else if condition(14) then \n            if condition(15) then \n                doOperation \"j\"\n            else if condition(16) then doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            else doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(5) then \n            doOperation \"d\"\n        else \n            if condition(6) then doOperation \"e\"\n            else \n            end if\n        end if\n    else \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            end if\n        else \n        end if\n    else \n        if condition(8) then \n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(12) then \n            if condition(13) then doOperation \"f\"\n            else if condition(14) then doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n            else \n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(7) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else doOperation \"b\"\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then doOperation \"d\"\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(5) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        else \n            doOperation \"b\"\n        end if\n    else \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        else \n            if condition(7) then doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n            else doOperation \"e\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"f\"\n            else if condition(9) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n        else \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then doOperation \"c\"\n            else if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else doOperation \"c\"\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n            else if condition(12) then \n            end if\n        else \n            if condition(13) then doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        end if\n    else \n        if condition(3) then \n            if condition(4) then \n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            if condition(5) then \n            else doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else \n            if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n            end if\n        else \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(11) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            if condition(7) then \n            else if condition(8) then \n            else if condition(9) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n            end if\n        else if condition(7) then \n        else \n            if condition(8) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            doOperation \"c\"\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n        else if condition(6) then doOperation \"c\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else doOperation \"e\"\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            else if condition(15) then \n                doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n            end if\n        end if\n    else \n        if condition(5) then \n            doOperation \"c\"\n        else if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        end if\n    else if condition(7) then \n        if condition(8) then doOperation \"d\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then doOperation \"a\"\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"b\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n        else if condition(12) then \n            if condition(13) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            doOperation \"b\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 52433 into current\n    if current >= 2097152 then put current - 2097152 into current\n    prepConditions current, 21\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n            else doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"h\"\n            else if condition(15) then \n                doOperation \"i\"\n            end if\n        else if condition(16) then \n            if condition(17) then \n            else if condition(18) then \n                doOperation \"j\"\n            else doOperation \"k\"\n        else if condition(19) then \n            if condition(20) then \n                doOperation \"l\"\n            else if condition(21) then \n                doOperation \"m\"\n            else \n                doOperation \"n\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else doOperation \"b\"\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n            end if\n        else if condition(10) then \n            doOperation \"d\"\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n            end if\n        else if condition(9) then doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n            doOperation \"f\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (8-1)\n    prepConditions x, 3\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else \n            if condition(3) then doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else \n            if condition(3) then \n                doOperation \"c\"\n            else if condition(4) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else if condition(4) then doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else if condition(5) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(6) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            end if\n        else if condition(9) then doOperation \"d\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        else if condition(11) then \n            if condition(12) then \n                doOperation \"f\"\n            else if condition(13) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            else if condition(6) then \n            end if\n        end if\n    else \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            end if\n        else if condition(10) then \n            if condition(11) then doOperation \"b\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n            else if condition(8) then doOperation \"b\"\n        else if condition(9) then \n            doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(6) then \n            doOperation \"e\"\n        else \n            if condition(7) then \n            else if condition(8) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else \n            if condition(7) then \n            else \n            end if\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            end if\n        else if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            doOperation \"e\"\n        else doOperation \"f\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n        end if\n    else \n        if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n        end if\n    else if condition(8) then \n        if condition(9) then doOperation \"c\"\n        else if condition(10) then \n            if condition(11) then doOperation \"d\"\n            else if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        else if condition(14) then \n            if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        end if\n    else doOperation \"d\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            doOperation \"d\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(10) then doOperation \"g\"\n            else if condition(11) then doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else \n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"b\"\n        else \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else \n        end if\n    else if condition(5) then \n        doOperation \"a\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n        else \n            if condition(9) then \n                doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            else \n            end if\n        end if\n    else \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then doOperation \"c\"\n        else if condition(8) then \n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            else if condition(11) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        end if\n    else if condition(12) then \n        if condition(13) then \n            if condition(14) then \n            else \n                doOperation \"h\"\n            end if\n        else if condition(15) then \n            if condition(16) then \n            else if condition(17) then doOperation \"i\"\n            else \n                doOperation \"j\"\n            end if\n        else \n            if condition(18) then \n                doOperation \"k\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            end if\n        else if condition(14) then doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            else \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else doOperation \"d\"\n        end if\n    else if condition(8) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"e\"\n            else if condition(8) then doOperation \"f\"\n            else if condition(9) then doOperation \"g\"\n        else \n            if condition(10) then \n                doOperation \"h\"\n            else if condition(11) then \n                doOperation \"i\"\n            else if condition(12) then doOperation \"j\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (4-1)\n    prepConditions x, 2\n    if condition(1) then \n        if condition(2) then \n        end if\n    else doOperation \"a\"\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            doOperation \"b\"\n        else if condition(3) then doOperation \"c\"\n        else \n            if condition(4) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n        end if\n    else \n        if condition(7) then \n            if condition(8) then doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then \n            else \n            end if\n        else \n            if condition(13) then \n                doOperation \"f\"\n            else if condition(14) then \n                doOperation \"g\"\n            else if condition(15) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            else if condition(7) then \n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"c\"\n            else \n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            else if condition(12) then \n            else if condition(13) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else \n            doOperation \"b\"\n        end if\n    else \n        if condition(4) then \n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(9) then \n        else if condition(10) then \n            if condition(11) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(12) then \n            else if condition(13) then \n            else if condition(14) then doOperation \"g\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(5) then doOperation \"d\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"e\"\n            else if condition(9) then \n            else \n            end if\n        else if condition(10) then \n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n        else if condition(4) then \n            if condition(5) then doOperation \"a\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else doOperation \"b\"\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"c\"\n            else if condition(6) then \n            else if condition(7) then doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            else \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n                doOperation \"e\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            end if\n        else \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n    else \n        if condition(4) then \n            if condition(5) then \n            end if\n        else if condition(6) then \n        else \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        end if\n    else doOperation \"e\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then doOperation \"d\"\n        else \n            if condition(7) then doOperation \"e\"\n            else \n                doOperation \"f\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"g\"\n            else if condition(10) then \n                doOperation \"h\"\n            else if condition(11) then \n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"i\"\n        else \n            if condition(15) then \n            else if condition(16) then \n                doOperation \"j\"\n            else doOperation \"k\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        else if condition(6) then \n            if condition(7) then \n            else doOperation \"c\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n        end if\n    else if condition(8) then \n        if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then doOperation \"c\"\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n            else \n            end if\n        end if\n    else if condition(11) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else \n            if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n            end if\n        else \n            if condition(5) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else doOperation \"d\"\n        else if condition(9) then \n            if condition(10) then \n            else if condition(11) then \n            else \n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            else \n                doOperation \"d\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        else if condition(11) then \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n            end if\n        else \n            doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n        else if condition(5) then \n            doOperation \"b\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n        end if\n    else if condition(3) then \n        if condition(4) then \n            if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n            doOperation \"b\"\n        else \n            if condition(6) then doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        else \n            if condition(5) then \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n        if condition(7) then \n            doOperation \"e\"\n        else if condition(8) then \n            doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else doOperation \"b\"\n    else if condition(5) then \n        doOperation \"c\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n            end if\n        else \n        end if\n    else \n        if condition(6) then \n            doOperation \"a\"\n        else if condition(7) then \n        else if condition(8) then doOperation \"b\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else doOperation \"d\"\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            doOperation \"d\"\n        else if condition(7) then \n            if condition(8) then doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n            end if\n        else \n            if condition(9) then \n                doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            end if\n        end if\n    else \n        if condition(12) then \n            doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 1657 into current\n    if current >= 65536 then put current - 65536 into current\n    prepConditions current, 16\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n            if condition(10) then doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then \n            end if\n        else \n            if condition(15) then \n            else if condition(16) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then doOperation \"d\"\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then \n            if condition(9) then \n            else if condition(10) then \n                doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            doOperation \"b\"\n        else \n            if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            else if condition(7) then \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else \n        if condition(5) then \n            doOperation \"d\"\n        else if condition(6) then \n            if condition(7) then doOperation \"e\"\n        else if condition(8) then \n            if condition(9) then doOperation \"f\"\n            else if condition(10) then \n                doOperation \"g\"\n            else if condition(11) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"d\"\n            else if condition(11) then \n                doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n            end if\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then doOperation \"c\"\n            else if condition(10) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then doOperation \"b\"\n    else if condition(4) then \n        if condition(5) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            else if condition(5) then \n                doOperation \"b\"\n            else if condition(6) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(7) then doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            else \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(8) then \n        if condition(9) then \n        else doOperation \"e\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n            else if condition(8) then \n            end if\n        else \n            if condition(9) then doOperation \"d\"\n            else if condition(10) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 6553 into current\n    if current >= 262144 then put current - 262144 into current\n    prepConditions current, 18\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"b\"\n            else if condition(8) then doOperation \"c\"\n        else \n            if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n            else if condition(14) then doOperation \"e\"\n        else if condition(15) then \n            if condition(16) then \n                doOperation \"f\"\n            end if\n        else if condition(17) then \n            if condition(18) then doOperation \"g\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then \n            else if condition(5) then \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        else if condition(9) then \n            if condition(10) then doOperation \"e\"\n            else if condition(11) then \n                doOperation \"f\"\n            else \n                doOperation \"g\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 821 into current\n    if current >= 32768 then put current - 32768 into current\n    prepConditions current, 15\n    if condition(1) then \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            else if condition(10) then \n            end if\n        end if\n    else if condition(11) then \n        if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then \n            end if\n        else \n            if condition(15) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        end if\n    else \n        if condition(3) then \n            if condition(4) then doOperation \"a\"\n            else if condition(5) then \n            end if\n        else if condition(6) then \n            doOperation \"b\"\n        else \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then \n                doOperation \"b\"\n            end if\n        else if condition(6) then \n            doOperation \"c\"\n        else if condition(7) then \n            doOperation \"d\"\n        end if\n    else \n        if condition(8) then \n            if condition(9) then \n            else if condition(10) then doOperation \"e\"\n            else if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n        else doOperation \"a\"\n    else if condition(3) then \n        if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n            else doOperation \"c\"\n        else if condition(7) then \n            if condition(8) then \n            else \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(7) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n            else \n                doOperation \"b\"\n            end if\n        else \n            doOperation \"c\"\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else \n            if condition(10) then \n                doOperation \"g\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n        end if\n    else \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then doOperation \"e\"\n            else if condition(9) then \n                doOperation \"f\"\n            end if\n        else if condition(10) then \n            doOperation \"g\"\n        else if condition(11) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then doOperation \"d\"\n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n        else \n            doOperation \"c\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            end if\n        else if condition(9) then \n        else \n            if condition(10) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 3299 into current\n    if current >= 131072 then put current - 131072 into current\n    prepConditions current, 17\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        else if condition(5) then \n        else if condition(6) then \n        end if\n    else if condition(7) then \n        if condition(8) then \n            if condition(9) then \n                doOperation \"b\"\n            else if condition(10) then \n                doOperation \"c\"\n            else if condition(11) then \n                doOperation \"d\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"e\"\n            else if condition(14) then doOperation \"f\"\n            else if condition(15) then doOperation \"g\"\n        else \n            if condition(16) then \n                doOperation \"h\"\n            else if condition(17) then \n                doOperation \"i\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"d\"\n            end if\n        else if condition(8) then \n            if condition(9) then \n                doOperation \"e\"\n            else \n            end if\n        else \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else if condition(4) then \n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"a\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then \n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        end if\n    else \n        if condition(10) then \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n            end if\n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then \n                doOperation \"a\"\n            end if\n        else if condition(6) then \n            if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"c\"\n            else if condition(12) then \n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n            end if\n        else if condition(5) then \n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then doOperation \"c\"\n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n            end if\n        else if condition(12) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then \n                doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n        else if condition(9) then \n            doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then doOperation \"d\"\n        end if\n    else if condition(8) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            if condition(5) then doOperation \"b\"\n            else doOperation \"c\"\n        end if\n    else if condition(6) then \n        if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        else if condition(9) then \n            if condition(10) then \n                doOperation \"f\"\n            else if condition(11) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        else if condition(12) then \n            if condition(13) then \n            else if condition(14) then \n            else \n                doOperation \"i\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else if condition(4) then doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(6) then \n            else if condition(7) then \n                doOperation \"d\"\n            else if condition(8) then \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(9) then \n        if condition(10) then \n            if condition(11) then doOperation \"f\"\n        else if condition(12) then \n            if condition(13) then \n                doOperation \"g\"\n            else \n                doOperation \"h\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(5) then \n        else \n            if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then doOperation \"a\"\n    else \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n            else if condition(7) then doOperation \"d\"\n        else if condition(8) then \n            if condition(9) then doOperation \"e\"\n            else if condition(10) then \n                doOperation \"f\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else doOperation \"d\"\n        end if\n    else \n        doOperation \"e\"\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n                doOperation \"c\"\n            else \n                doOperation \"d\"\n            end if\n        end if\n    else if condition(6) then \n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 53 into current\n    if current >= 2048 then put current - 2048 into current\n    prepConditions current, 11\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n            else if condition(5) then doOperation \"a\"\n        end if\n    else \n        if condition(6) then \n        else if condition(7) then \n            if condition(8) then \n                doOperation \"b\"\n            else if condition(9) then \n                doOperation \"c\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n        end if\n    else doOperation \"c\"\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 211 into current\n    if current >= 8192 then put current - 8192 into current\n    prepConditions current, 13\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n                doOperation \"a\"\n            end if\n        else if condition(4) then \n            if condition(5) then \n            else if condition(6) then \n                doOperation \"b\"\n            else if condition(7) then \n                doOperation \"c\"\n            end if\n        else if condition(8) then \n            if condition(9) then doOperation \"d\"\n        end if\n    else if condition(10) then \n        if condition(11) then \n            if condition(12) then doOperation \"e\"\n            else if condition(13) then \n            end if\n        else \n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n            end if\n        else if condition(4) then \n            doOperation \"b\"\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    else if condition(8) then \n        doOperation \"f\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else if condition(4) then \n                doOperation \"a\"\n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n                doOperation \"d\"\n            else \n            end if\n        else if condition(9) then \n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            doOperation \"b\"\n        else if condition(4) then \n        end if\n    else if condition(5) then \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then \n            else if condition(9) then \n                doOperation \"d\"\n            end if\n        else if condition(10) then \n            if condition(11) then \n                doOperation \"e\"\n            else if condition(12) then doOperation \"f\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 103 into current\n    if current >= 4096 then put current - 4096 into current\n    prepConditions current, 12\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else \n            if condition(3) then \n                doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n        else if condition(6) then \n            if condition(7) then \n            else if condition(8) then \n                doOperation \"d\"\n            else if condition(9) then \n                doOperation \"e\"\n            end if\n        else \n            if condition(10) then \n            else if condition(11) then doOperation \"f\"\n            else if condition(12) then \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else \n        if condition(2) then \n        else if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else if condition(5) then \n            if condition(6) then \n                doOperation \"d\"\n            else \n                doOperation \"e\"\n            end if\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 13 into current\n    if current >= 512 then put current - 512 into current\n    prepConditions current, 9\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else \n            if condition(4) then \n            end if\n        end if\n    else \n        if condition(5) then \n            if condition(6) then \n                doOperation \"a\"\n            else if condition(7) then \n                doOperation \"b\"\n            else if condition(8) then \n                doOperation \"c\"\n            end if\n        else \n            if condition(9) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then \n            end if\n        else \n            if condition(6) then \n                doOperation \"c\"\n            else if condition(7) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (64-1)\n    prepConditions x, 6\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then doOperation \"b\"\n            else \n                doOperation \"c\"\n            end if\n        else \n            if condition(5) then \n                doOperation \"d\"\n            else if condition(6) then \n                doOperation \"e\"\n            else doOperation \"f\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (16-1)\n    prepConditions x, 4\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else \n                doOperation \"b\"\n            end if\n        end if\n    else if condition(4) then \n    end if\nend repeat\n@\nrepeat with x = 0 to (128-1)\n    prepConditions x, 7\n    if condition(1) then \n        doOperation \"a\"\n    else if condition(2) then \n        if condition(3) then \n            if condition(4) then \n                doOperation \"b\"\n            else if condition(5) then doOperation \"c\"\n            else if condition(6) then \n                doOperation \"d\"\n            end if\n        else \n            if condition(7) then doOperation \"e\"\n            else \n            end if\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (32-1)\n    prepConditions x, 5\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n                doOperation \"a\"\n            else if condition(4) then \n                doOperation \"b\"\n            else doOperation \"c\"\n        else \n            doOperation \"d\"\n        end if\n    else \n        if condition(5) then \n            doOperation \"e\"\n        end if\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 409 into current\n    if current >= 16384 then put current - 16384 into current\n    prepConditions current, 14\n    if condition(1) then \n        if condition(2) then \n            doOperation \"a\"\n        else if condition(3) then \n            if condition(4) then \n            end if\n        else \n            if condition(5) then doOperation \"b\"\n            else \n            end if\n        end if\n    else \n        if condition(6) then \n            if condition(7) then doOperation \"c\"\n            else if condition(8) then doOperation \"d\"\n            else if condition(9) then doOperation \"e\"\n        else if condition(10) then \n            if condition(11) then \n            else if condition(12) then \n                doOperation \"f\"\n            end if\n        else if condition(13) then \n            if condition(14) then doOperation \"g\"\n            else doOperation \"h\"\n        end if\n    end if\nend repeat\n@\nrepeat with x = 0 to (256-1)\n    prepConditions x, 8\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then \n            else \n            end if\n        else \n            if condition(4) then \n                doOperation \"a\"\n            else if condition(5) then doOperation \"b\"\n            else if condition(6) then doOperation \"c\"\n        end if\n    else \n        if condition(7) then \n        else if condition(8) then doOperation \"d\"\n    end if\nend repeat\n@\nput 0 into current\nrepeat with x = 0 to (256-1)\n    put current + 29 into current\n    if current >= 1024 then put current - 1024 into current\n    prepConditions current, 10\n    if condition(1) then \n        if condition(2) then \n            if condition(3) then doOperation \"a\"\n            else \n            end if\n        end if\n    else if condition(4) then \n        if condition(5) then \n            if condition(6) then \n                doOperation \"b\"\n            end if\n        else if condition(7) then \n            if condition(8) then \n            else if condition(9) then doOperation \"c\"\n        else \n            if condition(10) then \n                doOperation \"d\"\n            end if\n        end if\n    end if\nend repeat\n"
  },
  {
    "path": "vipercard/vipercard/resources03a/test/testScriptExtensiveConditionalsExpected.txt",
    "content": "1:1210297\n2:4848235\n3:4987834\n4:4871373\n5:5145413\n6:14659103\n7:4439111\ncompileErr\ncompileErr\n10:8760123\n11:3343068\n12:2294683\n13:1092224\n14:11617935\n15:6271110\n16:3326436\n17:5861575\n18:14211959\n19:16546735\n20:2733616\n21:841981\n22:13555120\ncompileErr\n24:898211\n25:9387633\n26:14261870\n27:12487979\n28:8702330\n29:11119721\n30:11080657\n31:341445\n32:15529895\n33:8597181\ncompileErr\n35:14149743\n36:2916621\n37:13650541\n38:5997953\ncompileErr\n40:4820349\n41:3849533\n42:7373101\n43:6203018\n44:5230081\n45:13819456\ncompileErr\n47:10222005\n48:15414372\n49:14351157\n50:398357\n51:12591993\n52:7385199\n53:14940026\n54:14261870\n55:3676257\n56:2193975\n57:8033733\ncompileErr\n59:7186010\ncompileErr\n61:2970817\n62:9932446\ncompileErr\n64:8884232\n65:2392333\n66:6062812\n67:80777\n68:8199073\n69:12566621\n70:12622568\ncompileErr\n72:1126129\ncompileErr\n74:5073189\n75:11245703\n76:11449141\n77:12734193\n78:6964659\n79:16455235\ncompileErr\n81:15122887\n82:11140934\n83:417665\ncompileErr\n85:3343899\n86:5694349\n87:14649877\n88:12599049\n89:4875461\n90:13596171\ncompileErr\n92:15015621\ncompileErr\n94:8882417\n95:6764445\n96:1521697\n97:16271483\ncompileErr\n99:2294683\n100:13372841\ncompileErr\ncompileErr\n103:1070829\n104:539669\n105:1774157\n106:4454640\n107:7065303\n108:13794173\n109:12009293\n110:9714468\n111:1521697\n112:14081225\n113:10710054\n114:6573617\ncompileErr\n116:10654623\n117:690387\n118:14892329\n119:8236602\ncompileErr\ncompileErr\n122:5466111\n123:4053505\n124:15253851\ncompileErr\n126:3252563\n127:6347907\n128:8882696\n129:11540851\ncompileErr\n131:9483549\ncompileErr\n133:10603757\n134:12508659\n135:11734945\n136:2852228\ncompileErr\n138:2079362\ncompileErr\n140:8098015\n141:10718044\ncompileErr\n143:7968170\ncompileErr\ncompileErr\n146:5254125\n147:5171290\ncompileErr\n149:10525371\n150:16301342\n151:3288317\n152:1921984\ncompileErr\ncompileErr\n155:4715485\n156:10469372\ncompileErr\n158:14084620\n159:6135549\n160:14181933\n161:9432897\n162:14380469\n163:13735712\n164:3882853\n165:7000257\n166:415693\n167:11953189\n168:9708741\n169:11540851\n170:8727125\n171:3360286\ncompileErr\ncompileErr\n174:12006101\n175:10075897\n176:16010542\n177:6796353\n178:14149213\n179:4050521\ncompileErr\n181:9931285\n182:8882417\n183:15112397\ncompileErr\n185:6814405\n186:2612384\n187:9929374\ncompileErr\n189:3464213\ncompileErr\n191:15425021\ncompileErr\n193:1825107\n194:13697391\n195:910907\n196:15245044\n197:7968170\n198:6978920\ncompileErr\n200:9251886\n201:1262169\n202:6519560\n203:12410469\n204:16546735\n205:16404427\n206:4547077\n207:4646197\n208:855277\n209:10537722\n210:15572917\n211:6519560\n212:11005085\n213:16331843\ncompileErr\n215:2131021\n216:12547438\n217:6352397\n218:1521697\n219:13150726\ncompileErr\n221:10029677\ncompileErr\n223:10514437\n224:3772853\n225:11422455\ncompileErr\n227:7311846\n228:4813505\ncompileErr\n230:8313041\n231:2698133\n232:6814541\n233:4445509\n234:8172621\n235:4398393\n236:9722057\n237:13254475\ncompileErr\ncompileErr\n240:15290649\n241:15862525\n242:9361965\n243:15702729\n244:15156709\n245:2783013\n246:10868495\n247:9454468\n248:11923965\n249:7384182\n250:6831316\n251:12643308\n252:3303727\n253:8152257\n254:13393705\n255:14915261\n256:3312945\n257:12166525\n258:6975499\n259:12072573\n260:547410\n261:4784707\n262:14415505\n263:2065607\n264:3719165\ncompileErr\n266:944933\n267:16246001\n268:3339124\n269:2093393\n270:11666477\ncompileErr\n272:15415623\n273:10794129\n274:8236518\n275:7294593\n276:4062089\n277:8736739\n278:12112937\n279:2878213\n280:6250945\n281:12500525\n282:12227865\n283:913829\n284:3303727\n285:6486349\n286:15686937\n287:2799583\n288:3567269\ncompileErr\n290:7385199\n291:14308693\n292:9049013\ncompileErr\n294:3201917\n295:9631283\n296:7420689\n297:1542517\n298:4879256\n299:5126202\n300:883875\n301:3538649\n302:2629485\ncompileErr\n304:13593087\n305:6710414\ncompileErr\n307:4127717\n308:6925944\n309:10725639\ncompileErr\n311:16281884\n312:2067317\n313:3719165\n314:5351333\ncompileErr\n316:6878698\n317:6582831\n318:9891669\n319:8716982\n320:673771\n321:15015621\n322:8882417\n323:3574629\ncompileErr\n325:15807641\n326:10563487\n327:4748447\n328:9539192\n329:8884232\n330:12987275\n331:4263709\n332:8767093\n333:4355287\n334:10953333\n335:11586186\n336:15794128\ncompileErr\n338:10937924\n339:5668722\n340:9389739\n341:9020381\n342:14837962\n343:2286087\n344:7264290\n345:5612971\n346:12807503\n347:15191565\n348:2794987\ncompileErr\n350:10372052\ncompileErr\n352:2713993\n353:671828\n354:2430154\ncompileErr\n356:3257093\n357:1612096\n358:4388541\n359:6462776\n360:15672802\n361:12260135\n362:5309329\n363:4157485\ncompileErr\n365:13207997\n366:802047\n367:11545469\n368:2297121\n369:12743864\ncompileErr\n371:4715485\ncompileErr\n373:7966013\n374:13407243\n375:10727713\ncompileErr\n377:13964258\n378:1789333\n379:10044418\n380:3303727\ncompileErr\ncompileErr\n383:16147246\n384:7256141\n385:4728981\n386:12143161\n387:11661275\n388:14966463\n389:3896597\n390:5680547\n391:10694877\ncompileErr\n393:6091109\n394:5678179\n395:11223069\n396:10525204\n397:5725178\n398:8805833\n399:1188017\n400:494258\n401:5575600\n402:7628485\ncompileErr\n404:14394705\n405:1404086\ncompileErr\n407:2102661\n408:8882696\n409:11125897\n410:12710121\n411:239972\n412:4757924\n413:6610953\n414:15911431\n415:5246751\n416:3023261\n417:10337361\n418:9839967\n419:6519560\n420:3655637\n421:9970075\n422:8908893\n423:1230179\n424:12241301\ncompileErr\ncompileErr\n427:16668328\n428:9213466\n429:1024188\n430:15088637\n431:6275134\n432:3038035\n433:2588391\ncompileErr\n435:10645375\n436:13181736\n437:11959957\n438:1521697\n439:3343899\n440:7889185\n441:7635173\ncompileErr\ncompileErr\n444:5903541\n445:3210124\n446:13583303\n447:9707439\ncompileErr\ncompileErr\n450:10217894\n451:6266985\n452:11354271\n453:7249155\n454:3918981\n455:5426261\n456:10002529\n457:15596278\n458:8745845\n459:13872900\n460:8882417\n461:15227409\n462:9322076\n463:14615174\n464:5574885\n465:6017371\n466:2318763\n467:15170055\n468:57698\ncompileErr\n470:13308096\n471:8175725\n472:15501253\n473:13872900\ncompileErr\n475:5605626\n476:7883378\n477:10654623\ncompileErr\ncompileErr\n480:3376493\n481:11787921\ncompileErr\n483:13261591\n484:14698629\n485:2392288\n486:1967999\n487:646252\n488:3598813\n489:16515499\ncompileErr\ncompileErr\ncompileErr\ncompileErr\n494:1860501\n495:2577293\n496:15163703\n497:10644132\n498:11553706\n499:15916205\n500:10875498\n501:5196653\n502:4738365\n503:7973465\n504:5668722\n505:2263461\ncompileErr\n507:4411046\n508:3511180\n509:7889185\n510:2405275\n511:14936297\n512:12313826\n513:9615227\ncompileErr\n515:4003113\n516:2168834\n517:6969788\n518:9262497\n519:855333\n520:13159248\n521:1941046\ncompileErr\n523:1382385\n524:11174779\n525:15181297\n526:13859873\n527:825187\ncompileErr\ncompileErr\n530:1484629\n531:15767107\n532:2035928\ncompileErr\n534:2155853\ncompileErr\n536:4130324\n537:2918597\n538:12617759\n539:11534993\n540:2496396\n541:7852921\n542:3448558\ncompileErr\ncompileErr\n545:16776281\n546:4787613\n547:1976612\n548:16049029\n549:2405275\ncompileErr\ncompileErr\n552:14078342\n553:1233845\n554:14612129\n555:12896328\ncompileErr\n557:8004473\n558:6095621\n559:7855205\n560:14618055\n561:9331360\n562:12272597\n563:5195857\ncompileErr\ncompileErr\n566:8534367\n567:2612384\n568:6605869\n569:1860437\n570:3094943\n571:6132357\ncompileErr\n573:8683421\ncompileErr\ncompileErr\n576:6016071\n577:15549369\n578:11701535\n579:11562887\n580:8993213\n581:6964541\ncompileErr\n583:1898337\n584:12793416\n585:7110869\n586:4321181\n587:9846113\n588:15068771\n589:3951493\ncompileErr\n591:715813\n592:1939331\n593:424173\ncompileErr\n595:16176038\n596:10599589\n597:10242221\n598:7331221\n599:13627925\n600:3829953\n601:5382209\ncompileErr\n603:7968170\n604:82319\n605:8085429\n606:9970560\ncompileErr\n608:13876005\n609:8519870\n610:4787359\ncompileErr\n612:14176045\n613:5043805\n614:11611068\ncompileErr\n616:10067765\ncompileErr\n618:15604469\n619:4213457\ncompileErr\n621:263127\n622:7813677\n623:16049029\n624:7409138\n625:9788253\n626:8004222\ncompileErr\n628:2631598\n629:6420757\n630:84617\n631:937269\n632:6229581\n633:2908605\n634:9110181\n635:3822725\ncompileErr\ncompileErr\ncompileErr\n639:9702069\n640:3656812\n641:4615061\n642:16711121\n643:5066081\ncompileErr\ncompileErr\n646:1211981\n647:1126401\n648:1855537\n649:11923328\ncompileErr\n651:15677981\n652:15227065\n653:14261870\n654:3681826\n655:11085717\ncompileErr\n657:9642769\n658:2286087\n659:12710121\n660:7581403\n661:10174049\n662:549919\n663:16203745\ncompileErr\n665:13232117\n666:1505181\ncompileErr\n668:6404885\n669:4428341\ncompileErr\n671:14360375\n672:5879373\n673:7186010\n674:6875847\n675:3695814\n676:59317\n677:16644829\n678:11539500\n679:14359235\n680:3837439\ncompileErr\n682:12387783\n683:14964881\ncompileErr\n685:15101797\n686:814938\n687:10310785\n688:3603521\n689:15699239\n690:8882417\n691:11283547\n692:6930047\n693:11883909\ncompileErr\ncompileErr\n696:9993537\n697:8805100\n698:13650541\n699:14919109\n700:3021048\n701:5808761\n702:9554545\n703:574337\ncompileErr\ncompileErr\n706:8774440\n707:2546853\n708:16154158\n709:16325373\ncompileErr\n711:8882417\n712:10557131\n713:12310598\ncompileErr\n715:4523123\n716:16705879\ncompileErr\ncompileErr\n719:858906\n720:2783261\n721:15211822\n722:12336965\ncompileErr\n724:7040622\n725:2508907\n726:910907\ncompileErr\n728:2529980\ncompileErr\n730:13574966\n731:3572335\ncompileErr\n733:8634524\n734:6502515\n735:7385199\n736:8443319\n737:3083685\n738:12915492\ncompileErr\n740:6062812\n741:5871517\n742:3345594\n743:12697022\ncompileErr\ncompileErr\n746:15914461\n747:7200549\n748:13303437\n749:12580005\ncompileErr\n751:14149743\n752:16376689\n753:2528341\n754:7385199\n755:15303393\n756:16032041\n757:16171620\n758:2027236\ncompileErr\n760:11661275\n761:3544545\ncompileErr\ncompileErr\ncompileErr\n765:1143827\ncompileErr\n767:2515975\n768:6041971\n769:13568722\n770:9878455\n771:15144956\n772:8622298\n773:9258102\n774:13851388\n775:13819157\n776:11210018\n777:11002051\n778:4472142\n779:6704220\ncompileErr\ncompileErr\n782:8741238\n783:16242910\n784:886629\n785:2427375\ncompileErr\n787:1688682\n788:8655628\n789:5685792\n790:16220105\n791:662109\n792:1521697\n793:5342243\n794:16226653\ncompileErr\ncompileErr\n797:13731193\n798:705957\n799:6033325\n800:13852763\ncompileErr\n802:15837942\n803:780889\n804:13872900\ncompileErr\n806:11739655\n807:15154977\n808:8832797\n809:4125349\n810:13747985\n811:11176885\ncompileErr\n813:10995293\n814:13099013\n815:7558872\n816:762692\n817:16318914\n818:6062812\ncompileErr\ncompileErr\ncompileErr\n822:12453370\n823:11586501\n824:277790\n825:6111599\n826:13807715\n827:6944369\n828:8807711\ncompileErr\n830:9569245\n831:9544709\n832:2913660\n833:5655281\ncompileErr\n835:13963451\n836:4157485\n837:12061545\n838:9709869\n839:2095157\n840:3893817\n841:3380387\ncompileErr\n843:12370728\n844:4036599\n845:7840353\n846:15515141\ncompileErr\n848:4274557\n849:10798087\ncompileErr\n851:2750589\n852:840909\ncompileErr\n854:8235097\ncompileErr\n856:417883\n857:7788485\n858:12164197\ncompileErr\n860:16514471\n861:16689955\n862:5499961\n863:3212458\n864:10687319\n865:11490285\ncompileErr\n867:1268353\n868:3292285\n869:3704592\n870:504432\n871:2646809\n872:4521301\n873:9520165\ncompileErr\n875:7336757\n876:930485\n877:13695869\n878:6989104\n879:6371150\n880:15367283\n881:953633\n882:5245333\ncompileErr\ncompileErr\ncompileErr\n886:9020189\n887:16575051\n888:14325166\n889:8736739\n890:4673801\n891:638327\n892:13997429\n893:4115761\n894:10188179\n895:3441\n896:12387783\n897:5350991\ncompileErr\n899:1044646\n900:15591883\n901:6821567\ncompileErr\n903:5067317\n904:13707317\n905:10603611\n906:8817213\n907:5271177\n908:6007461\n909:14966537\n910:14121477\ncompileErr\ncompileErr\n913:8506797\n914:13013725\n915:1672175\n916:1794964\n917:3556967\n918:7800779\n919:7037133\n920:15579887\n921:11973157\n922:994005\n923:12392013\ncompileErr\n925:3126762\n926:6745833\n927:14675709\n928:10252583\n929:3056497\n930:11394333\n931:5563657\ncompileErr\n933:8241216\n934:13331099\n935:610903\n936:14705325\n937:15170055\n938:14118389\n939:7978897\n940:11304021\ncompileErr\n942:8617308\n943:14337909\n944:16592013\n945:8681725\n946:16653047\n947:15455765\n948:12898674\ncompileErr\n950:1867549\ncompileErr\n952:1898501\ncompileErr\n954:1038769\ncompileErr\n956:12747210\n957:9097244\ncompileErr\n959:1211151\n960:4593896\n961:8305797\ncompileErr\ncompileErr\n964:8149825\n965:6836292\ncompileErr\n967:11558921\n968:117957\ncompileErr\n970:1546497\n971:8529833\ncompileErr\n973:12294314\n974:2525507\n975:12283579\n976:11904534\n977:2591135\n978:14144646\n979:684600\n980:757829\n981:2588391\n982:11140810\ncompileErr\n984:6922876\n985:3502175\n986:12184422\n987:7966013\n988:2628865\n989:6903489\n990:6474385\n991:10197219\n992:4684547\n993:3861409\n994:7878764\n995:13375121\ncompileErr\n997:7767357\n998:14997107\n999:6258845\n1000:9025557\n1001:13821978\n1002:7391223\n1003:461673\n1004:10596483\n1005:1607245\n1006:2306589\ncompileErr\n1008:2404535\n1009:5528767\ncompileErr\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeBase64Js.ts",
    "content": "\n/* [base64js](https://github.com/beatgammit/base64-js)\nthis library is bundled into externalmanualbundle.js and exists on globalThis */\n\nexport declare namespace base64js {\n    /* Type definitions for base64-js 1.2\n    Project: https://github.com/beatgammit/base64-js\n    Definitions by: Peter Safranek <https://github.com/pe8ter>\n    Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped */\n\n    function byteLength(encoded: string): number;\n    function toByteArray(encoded: string): Uint8Array;\n    function fromByteArray(bytes: Uint8Array): string;\n}\n\nexport const bridgedBase64Js = base64js;\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeBrowserInfo.ts",
    "content": "\nimport type { Bowser } from '../../external/bowser-2.9/bowser';\ndeclare const bowser: typeof Bowser;\n\n/* [Bowser](https://github.com/lancedikson/bowser) */\n/* is bundled into externalmanualbundle.js and exists on globalThis */\n\n/* https://github.com/lancedikson/bowser/blob/master/src/constants.js */\nexport enum BowserBrowsers {\n    __isUI512Enum = 1,\n    unknown,\n    amazon_silk,\n    android,\n    bada,\n    blackberry,\n    chrome,\n    chromium,\n    electron,\n    epiphany,\n    firefox,\n    focus,\n    generic,\n    googlebot,\n    google_search,\n    ie,\n    k_meleon,\n    maxthon,\n    edge,\n    mz,\n    naver,\n    opera,\n    opera_coast,\n    phantomjs,\n    puffin,\n    qupzilla,\n    qq,\n    qqlite,\n    safari,\n    sailfish,\n    samsung_internet,\n    seamonkey,\n    sleipnir,\n    swing,\n    tizen,\n    uc,\n    vivaldi,\n    webos,\n    wechat,\n    yandex\n}\n\nexport enum BowserOS {\n    __isUI512Enum = 1,\n    unknown,\n    windowsphone,\n    windows,\n    macos,\n    ios,\n    android,\n    webos,\n    blackberry,\n    bada,\n    tizen,\n    linux,\n    chromeos,\n    playstation4,\n    roku\n}\n\nexport enum BowserPlatform {\n    __isUI512Enum = 1,\n    unknown,\n    tablet,\n    mobile,\n    desktop,\n    tv\n}\n\nfunction mapToBowserBrowsers(s: string): BowserBrowsers {\n    let map = Object.create(null);\n    let assign = (k: string, v: string) => {\n        k = k.toLowerCase();\n        v = v.toLowerCase();\n        if (!BowserBrowsers[v]) {\n            console.error('get the latest bowser?', k, v);\n        } else {\n            map[k] = BowserBrowsers[v];\n        }\n    };\n\n    for (let key in bowser.BROWSER_MAP) {\n        if (typeof key === 'string' && typeof bowser.BROWSER_MAP[key] === 'string') {\n            assign(key, key);\n            assign(bowser.BROWSER_MAP[key], key);\n        }\n    }\n\n    let ret = map[s.toLowerCase()];\n    return ret ?? BowserBrowsers.unknown;\n}\n\nfunction mapToBowserOs(s: string): BowserOS {\n    let map = Object.create(null);\n    let assign = (k: string, v: string) => {\n        k = k.toLowerCase();\n        v = v.toLowerCase();\n        if (!BowserOS[v]) {\n            console.error('get the latest bowser?', k, v);\n        } else {\n            map[k] = BowserOS[v];\n        }\n    };\n\n    for (let key in bowser.OS_MAP) {\n        if (typeof key === 'string' && typeof bowser.OS_MAP[key] === 'string') {\n            assign(key, key);\n            assign(bowser.OS_MAP[key], key);\n        }\n    }\n\n    let ret = map[s.toLowerCase()];\n    return ret ?? BowserOS.unknown;\n}\n\nfunction mapToBowserPlatform(s: string): BowserPlatform {\n    let map = Object.create(null);\n    let assign = (k: string, v: string) => {\n        k = k.toLowerCase();\n        v = v.toLowerCase();\n        if (!BowserPlatform[v]) {\n            console.error('get the latest bowser?', k, v);\n        } else {\n            map[k] = BowserPlatform[v];\n        }\n    };\n\n    for (let key in bowser.PLATFORMS_MAP) {\n        if (typeof key === 'string' && typeof bowser.PLATFORMS_MAP[key] === 'string') {\n            assign(key, key);\n            assign(bowser.PLATFORMS_MAP[key], key);\n        }\n    }\n\n    let ret = map[s.toLowerCase()];\n    return ret ?? BowserPlatform.unknown;\n}\n\nexport function bridgedGetAllBrowserInfo(\n    s: string\n): [BowserBrowsers, BowserOS, BowserPlatform] {\n    let rBowserBrowsers = BowserBrowsers.unknown;\n    let rBowserOS = BowserOS.unknown;\n    let rBowserPlatform = BowserPlatform.unknown;\n    let obj = bowser.parse(s);\n\n    let rawBrowsername = obj?.browser?.name;\n    if (rawBrowsername) {\n        rBowserBrowsers = mapToBowserBrowsers(rawBrowsername);\n    }\n\n    let rawOsName = obj?.os?.name;\n    if (rawOsName) {\n        rBowserOS = mapToBowserOs(rawOsName);\n    }\n\n    let rawPlatform = obj?.platform?.type;\n    if (rawPlatform) {\n        rBowserPlatform = mapToBowserPlatform(rawPlatform);\n    }\n\n    return [rBowserBrowsers, rBowserOS, rBowserPlatform];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeChevrotain.ts",
    "content": "\n/* [chevrotain](https://github.com/SAP/chevrotain)\nit seems like the best way to use the chevrotain typings,\nwhen potentially building as es6 modules,\nis to add a reference in the \"types\" section of tsconfig.json.\ndoesn't need any modifications to the .d.ts\nso I don't need a bridge file here, code can reference\n`chevrotain.createToken` and it magically works.\n\nthis library is bundled into externalmanualbundle.js and exists on globalThis\n\nin the past I had to have a custom chevrotain build because\nI made a change to avoid a call to new Function(); this has since been fixed. */\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeFileSaver.ts",
    "content": "\nimport type { FileSaver } from '../../external/FileSaver.js-2.0.2/FileSaver';\n\n/* [filesaver.js](https://github.com/eligrey/FileSaver.js)\nthis library is bundled into externalmanualbundle.js and exists on globalThis */\ndeclare let saveAs: FileSaver;\nexport function bridgedSaveAs() {\n    return saveAs;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeJsGif.ts",
    "content": "\n/* [JSGIF](https://github.com/antimatter15/jsgif)\njsgif bare-bones typing\nby Ben Fisher\nthis library is loaded dynamically */\n\nexport declare class GIFEncoderInterface {\n    public setRepeat(n: number): void;\n    public setDelay(n: number): void;\n    public start(): void;\n    public finish(): void;\n    public addFrame(context: CanvasRenderingContext2D): void;\n\n    /* method exposed by Ben Fisher */\n    public getUint8Array(): Uint8Array;\n}\n\nexport function getGIFEncoderInst() {\n    let inst = GIFEncoder();\n    return (inst as any) as GIFEncoderInterface;\n}\n\ndeclare const GIFEncoder: VoidFunction;\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeJsLru.ts",
    "content": "\nimport type { LRUMap } from '../../external/js-lru/js-lru';\n\n/* [js-lru](https://github.com/rsms/js-lru)\nthis library is bundled into externalmanualbundle.js and exists on globalThis\n\nnote: vscode sometimes warns about this saying \"LRUMap\" cannot be used as a value\nbecause it was imported using import type.\nthe actual build is clean, and it works at runtime which is what is most important. */\n\nexport type BridgedLRUMap<K, V> = LRUMap<K, V>;\nexport function BridgedLRUMap() {\n    return LRUMap;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeLzString.ts",
    "content": "\n/* [lz-string](https://github.com/pieroxy/lz-string)\nthis library is bundled into externalmanualbundle.js and exists on globalThis */\n\nimport type { NsLZString } from '../../external/lz-string-1.4.4/lzstring';\n\ndeclare let LZString: NsLZString.LZStringStatic;\nexport function BridgedLZString() {\n    return LZString;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgePbkdf2.ts",
    "content": "\n/* auto */ import { assertTrue, checkThrow512 } from './../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq } from './../ui512/utils/util512';\n/* auto */ import { ExpTextEncoder } from './bridgeTextEncoding';\n\n/**\n * pbkdf2, gist by Chris Veness\n * takes a user-typed password, and uses a salt to generate a ArrayBuffer key.\n *\n * returns tuple [iterations, key, keyBase64, saltBase64]\n * note: since this computation is on the client, a malicious user could bypass this function\n * and use their choice of password. however, I don't see any dangerous consequence\n * if a user can change the client JS to make an account with a weak password.\n */\nexport async function pbkdf2(\n    password: string,\n    iterations?: number,\n    saltB64?: string\n): Promise<[number, ArrayBuffer, string, string]> {\n    if (location.protocol !== 'https:' && location.href.includes('vipercard')) {\n        throw new Error('Requires https, not http connection');\n    }\n\n    if (!iterations) {\n        iterations = 1e6;\n    }\n\n    assertTrue(iterations >= 1e6, 'Jr|not enough iterations');\n    let saltUint8 = new Uint8Array(16);\n    if (saltB64) {\n        let decoded = atob(saltB64);\n        assertEq(saltUint8.length, decoded.length, 'Jq|');\n        for (let i = 0; i < saltUint8.length; i++) {\n            saltUint8[i] = decoded.charCodeAt(i);\n        }\n    } else {\n        /* get random salt */\n        let saltOrNull = crypto.getRandomValues(new Uint8Array(16));\n        checkThrow512(saltOrNull, 'Jp|getRandomValues returned null');\n        saltUint8 = saltOrNull;\n    }\n\n    /* encode pw as UTF-8 */\n    const pwUtf8 = new ExpTextEncoder('utf-8').encode(password);\n\n    /* create pw key */\n    const pwKey = await window.crypto.subtle.importKey('raw', pwUtf8, 'PBKDF2', false, [\n        'deriveBits'\n    ]);\n\n    /* pbkdf2 params */\n    const params = {\n        name: 'PBKDF2',\n        hash: 'SHA-256',\n        salt: saltUint8,\n        iterations: iterations\n    };\n\n    /* derive key */\n    const keyBuffer = await window.crypto.subtle.deriveBits(params, pwKey, 256);\n    const keyBufferAr = new Uint8Array(keyBuffer);\n    return [\n        iterations,\n        keyBuffer,\n        Util512.arrayToBase64(keyBufferAr),\n        Util512.arrayToBase64(saltUint8)\n    ];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgePizzicato.ts",
    "content": "\n/* https://github.com/alemangui/pizzicato\npizzicato bare-bones typing\nby Ben Fisher\nthis library is loaded dynamically */\n\nexport declare namespace Pz {\n    class Sound {\n        public constructor(...args: any[]);\n        public play(): void;\n    }\n}\n\nexport declare namespace Pizzicato {\n    let context: any;\n    let Util: any;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/bridge/bridgeTextEncoding.ts",
    "content": "\n/*\n    Type definitions for text-encoding\n    https://www.npmjs.com/package/@types/text-encoding\n    released under the MIT license\n*/\n\ndeclare class TextEncoder {\n    constructor(label?: string, options?: TextEncoding.TextEncoderOptions);\n    encoding: string;\n    encode(input?: string, options?: TextEncoding.TextEncodeOptions): Uint8Array;\n}\n\ndeclare class TextDecoder {\n    constructor(utfLabel?: string, options?: TextEncoding.TextDecoderOptions);\n    encoding: string;\n    fatal: boolean;\n    ignoreBOM: boolean;\n    decode(input?: ArrayBufferView, options?: TextEncoding.TextDecodeOptions): string;\n}\n\ndeclare namespace TextEncoding {\n    interface TextDecoderOptions {\n        fatal?: boolean;\n        ignoreBOM?: boolean;\n    }\n\n    interface TextDecodeOptions {\n        stream?: boolean;\n    }\n\n    interface TextEncoderOptions {\n        NONSTANDARD_allowLegacyEncoding?: boolean;\n    }\n\n    interface TextEncodeOptions {\n        stream?: boolean;\n    }\n\n    interface TextEncodingStatic {\n        TextDecoder: typeof TextDecoder;\n        TextEncoder: typeof TextEncoder;\n    }\n}\n\ndeclare let TextEncoding: TextEncoding.TextEncodingStatic;\nexport const ExpTextEncoder = TextEncoder;\nexport type ExpTextEncoder = TextEncoder;\n\nexport const ExpTextDecoder = TextDecoder;\nexport type ExpTextDecoder = TextDecoder;\n"
  },
  {
    "path": "vipercard/vipercard/src/internaldocs.md",
    "content": "\n\n\n## Code Compilation + Execution\n\nA description of how ViperCard compiles and executes scripts.\n```\nDone on a per-script basis.\nPart 1: processing\n    Run lexer, getting a list of tokens\n    SplitIntoLinesAndMakeLowercase yields one line at a time\n    We'll then process these lines.\n    We do pre-processing before handing to the parser,\n    one reason being that the ViperCard language has dozens\n    of unquoted terms, and it would be unwieldly if they were\n    all different tokens, so it's best to transform in software,\n    for example to add quotes or to add 'syntax markers'\n    that tell the parser that this term isn't just a variable,\n    it's part of the syntax.\n\n    processing steps include:\n    making tokens lower-case, since the language is case insensitive,\n\n    SyntaxRewriter rewrites syntax for some lines:\n    1) To minimize number of tokens needed in the lexer (for faster lexing)\n        for example:\n        ask line 2 of x with \"defaultText\"\n        we could make 'with' a token so that it wouldn't get lumped into the expression\n            line 2 of x.\n        but we want to minimze number of tokens.\n        so instead, during codepreparse, if the command is ask, replace any tokens\n            that are exactly 'with'.\n        ask line 2 of x $syntaxmarker$ \"defaultText\"\n        a $syntaxmarker$ is never part of an expression, and so the parser has no difficulty.\n    2) Transform \"repeat with x=1 to 5\" into a \"repeat while\" loop with same functionality\n    3) To simplify parsing for a few commands\n    4) To expand custom function calls in an expression\n        We don't want a custom function call inside an expression, because the custom\n        fn call could take an arbitrarily long time to run, and we can't pause\n        execution halfway through evaling an expression. We also want evalling an\n        expression to be a pure function with no side effects (which we\n        enforce by providing it with an interface that has readonly methods).\n        So, if a function call occurs inside an expression, we pull it outside:\n\n        put 2 * mycustomfunc(5 + mycustomfunc(7 + sin(x))) into x\n            -->\n        mycustomfunc(7 + sin(x))\n        put the result into tmp001\n        put 2 * mycustomfunc(5 + tmp001) into x\n            -->\n        mycustomfunc(7 + sin(x))\n        put the result into tmp001\n        mycustomfunc(5 + tmp001)\n        put the result into tmp002\n        put 2 * tmp002 into x\n\n    Next, DetermineCategory determines if a line is a syntax element like \"end repeat\"\n    If the syntax element has an expression to evaluate, put the expression into the\n    line's excerptToParse. Otherwise, we can skip running the parser entirely on the line,\n    for better perf.\n    Run BranchProcessing so that syntax elements like \"end repeat\" see where to jump\n        to the corresponding \"repeat\"\n    Run BranchProcessing to confirm hierarchical structure: an \"else\" must appear in\n        a valid \"if\", \"end myHandler\" must follow \"on myHandler\"\n\n    Finally everything gets put into a list of CodeLines.\n    Each line has an offset, and loops work by the if statement containing a list\n    of offsets where it can tell the interpreter to jump to.\n    The list of code is put in a VpcCodeCollection, and then cached.\n\nPart 2: execution\n    when you say, click on a button, the message is added to a queue.\n    code execution will then see the message in the queue and create a\n    framestack for it. each frame stores local variables and the current line offset,\n    so it can move from line to line. when calling a function, a frame is\n    pushed onto the stack. when returning from a function, the frame\n    is popped from the stack, so that we'll continue running the caller's code.\n    when the last frame is popped, we know we're done.\n\n    Code execution walks line-by-line through the list, running one line at a time\n    It checks the type of the line:\n        If there is no expression to be parsed, run the line and continue (such as\n            onMouseUp or end repeat)\n        Else if there is an expression to be parsed, see if it is in the\n            cache of parsed lines, and use that if possible, otherwise run the parser.\n        Take the CST (tree of parsed data) and pass it to the Visitor to evaluate it.\n            for expressions, visiting evaluates and returns a single VpcVal value\n            for commands, visiting creates a IntermedMapOfIntermedVals object\n                which code execution can easily see the results of.\n    We don't run the script continuously, we frequently let other events/ui drawing\n        occur. this also saves us if the user writes an infinite loop.\n        the scheduler will call into us again in a few milliseconds.\n    If the stack of execution frames is empty, we've completed the script.\n```\n## Call-method-by-name\n\n```\nI often use enums to call into a method on a class. For example, in\nthe class VelResolveReference I have methods goBtn() goFld() goCard()\nand so on, but searching for the string goBtn(), the method doesn't\nseem to ever be called.\n\nI use callAsMethodOnClass, which turns VpcElType.Btn to the string\n\"Btn\", forms the string \"goBtn\", finds a method of that name on\nthe class, and calls it. That way I don't need any switch statement,\nif-thens, or table of function pointers, it saves space and effort!\n\n```\n## Source code layers\n\n* We make sure that every `.ts` file is strictly ordered into a layer. Code in lower layers cannot call directly call code in a higher layer.\n* This prevents circular dependencies and encourages good non-monolithic design.\n* It also ensures that test code can be cleanly cut away from product code; by making test code live above product code, the product code is unable to have any dependencies on it.\n* Layers are specified in `layers.cfg` and enforced by the `super-auto-import` python script.\n* For cases where lower code needs to call into higher code, it can do so indirectly with so-called \"dependency inversion\". This can be a simple callback function, or for more structured callbacks, an interface.\n* For example: when a script executes code, it makes sense for this to be a low-level module depending only on the parser. Certain commands, though, need to interact with the UI and cause changes to it. If script execution were above the UI, though, this wouldn't really be right, because UI actions need to cause script execution to run.\n    * We can solve this situation elegantly by creating an interface called `OutsideWorld`. \n    * First, the interface is defined. The interface can be defined at a very low level, since it has no implementation. The methods on the interface are all semantically meaningful, instead of exposing data structures they provide actions like `WriteToMessageBox()`, `GetCurrentTool()`, and `CountElements()`.\n    * Then, script execution is written to act on an instance that implements the interface. As a side benefit, test code can verify script execution by providing a controlled and monitored implementation of the interface. The interface can even be split into read-only methods and read-write methods, since parts of script execution like expression evaluation should be essentially idempotent.\n    * Finally, in the higher UI layer, there is a `VpcOutsideImpl` class that fully implements the interface. In effect, the lower-level script execution code is calling up into higher UI code, but in a controlled and organized way.\n* This type of organization is also useful for maintaining re-usability of lower layers. For example, it's easier to keep the `util512` layer free of ViperCard-specific functionality, and thus more re-usable for other projects, because it is kept lower than application code. \n\n## Rendering\n\n* A Model-View-Presenter pattern is used\n* From a thousand-foot perspective:\n    * The models (for example ui512ElementButton) are basically inert buckets of data\n        * The only logic they have is that when a property is changed, it sets a global flag that we need to draw something.\n    * The view classes have methods that take a model and draw it to a canvas.\n    * The presenter manages events and routes them to the correct action, which might cause changes to a model. It uses the view classes to draw the model onto the canvas.\n* ViperCard elements aka Vels are built on top of UI512 elements aka Els. \n* The pattern is used twice - Vel models cause changes to UI512 models \n* Example - what happens when you click down onto a button:\n    * mouse event is sent to a Presenter\n    * the Presenter routes the event to mousedown handling\n    * mousedown handling in vipercard sets the hilite on the Vel model to true\n    * listeners on the Vel model record that \"the hilite changed\" and that we need a redraw\n    * a very short time later, a drawframe tick occurs\n    * the Presenter sees that the redraw flag is set, and goes through the changes. It calls vpcmodelrender, which maps the \"hilite\" property on the vel model to the \"hilite\" property on a  corresponding ui512 model, and sets it to true.\n    * listeners on the UI512 model record that we need a full-redraw\n    * a very short time later, a drawframe tick occurs\n    * we notice that the need-full-redraw flag is set, so we draw everything again onto the canvas.\n\n## Background objects\n\nBackground objects are tricky. For say bg fld when sharedtext is off, state (position) is shared, some state (contents) are unique per-card.\n\nConfirmed in emulator that every bg field has shared fallback text for when sharedtext is set to true. Note that when the sharedtext is true, you can only edit the field contents when you go edit->background. When you transition from \nsharedtext on and off, it also preserves the per-card content. So each field must maintain both per-card and shared text. And the same for scrollposition.\n\nWe used to internally store things like this:\n\n```\nstack\n    bg\n        bg1\n            bgparts\n                bgfldA\n                    contents#cardid1\n                    contents#cardid2\n                bgfldB\n                    contents#cardid1\n                    contents#cardid2\n            cards\n                cd1\n                    cardparts\n                        cdfldC\n                            contents\n                cd2\n                    cardparts\n                        cdfldD\n                            contents\n```\n* PROS:\n    * conceptually, there is only one bgflda, so makes sense to have only one field instance\n    * no chance of diverged state where updating another object fails, no need to replicate changes. copy/paste card and duplicate card are simple.\n    * faster, no replication\n* CONS:\n    * need to run maintenance and cleanup #card3 when card3 is deleted\n    * need to remember to pass in the correct card context, which 99% of the time is the current card but sometimes isn't, which likely would lead to bugs.\n    * would want to change vel api so that myFld.set('text', newText) cannot be accessed without providing a card id - and need to prevent it at compile time. requires wide code change.\n    * eventually realized that this means nearly all object references need to be a (object, currentcard) tuple -- because depending on which card is the context, the state is different!\n\n```\nthe final straw was this test: \n-- script of bg fld 1\non dofoo\n  answer word 1 of me\nend dofoo\n-- and run these\nsend dofoo to bg fld 1 of cd 1\nsend dofoo to bg fld 1 of cd 2\n-- they will get different results based on the accessed card...\n-- so this means the script mechanism also needs to worry about \n```\n\nNew design:\n```\nstack\n    bg\n        bg1\n            cards\n                cd1\n                    cardparts\n                        bgfldA (linked to all other idbgfldA)\n                        bgfldB (linked to all other idbgfldB)\n                        cdfldC\n                cd2\n                    cardparts\n                        bgfldA (linked to all other idbgfldA)\n                        bgfldB (linked to all other idbgfldB)\n                        cdfldD\n\n(there are now many bgfldA instances)\n```\n\n* PROS:\n    * don't need to pass a tuple of (object, cardid) everywhere.\n    * having prop##cardid was inelegant anyways.\n    * does need to change the .set() api, but it can be done easily (changes are mechanical, not thoughtful)\n    * might simplify rendering code, since it won't need to listen to both cd and bg vel changes\n        * also only the set() calls need to be changed, not the get() calls\n* CONS:\n    * more memory, slower because changes need to be replicated\n    * when the user asks for the \"id\" of one of these, they won't get its true id.\n    * copy/paste/duplicate card is more interesting\n\n* note that in original product, a bg item can call script in current card,\n* leading more support to my design where \"bg\" items do in a sense live on the current card\n* in my \"ownerOf\" function, though, I'll still say that bg items belong to the bg because that's more useful.\n\n## Pseudo-functions that refer to objects\n\n* The original product has subtly complex behavior for these pseudo-functions.\n* consider this:\n    * make a field\n    * type abc into the field\n    * edit script of the fld, `on f answer the target end f`\n    * on card 1, in msg box type `send f to cd fld 1`\n    * the result is a string like `card field \"myFld\"`\n    * edit script of the fld, `on f answer target end f`\n    * on card 1, in msg box type `send f to cd fld 1`\n    * the result is now `abc`, it's getting the contents\n    * In my terminology, `the target` returns a string, but `target` returns a true object reference.\n* consider this (even subtler):\n    * make a background checkmark button across two cards\n    * set the sharedhilite of the button to false\n    * set the autohilite of the button to true\n    * edit script of the button, `on f answer the hilite of the target end f`\n    * on card 2 make the button checked\n    * on card 1, in msg box type `send f to bg btn 1 of cd 2`\n    * the result is `true`, it's reading as a true object\n    * edit script of the button, `on f answer the hilite of (the target) end f`\n    * on card 1, in msg box type `send f to bg btn 1 of cd 2`\n    * the result is `false` - in this context, the parens cause `(the target)` to be treated as a function call that returns a string, and evaluating that string as an object leads to different results because the current card is still card 1!\n* As far as I can tell, this is the behavior:\n    * `me` returns a true object reference. (`answer me` gets fld contents.)\n    * `target` returns a true object reference. (`answer target` gets fld contents.)\n    * when setting/getting a property, `of the target` returns a true object reference. (`the hilite of the target` refers to the correct object.)\n    * in all other instances, `the target` returns a string. (`answer the target` shows the name of the object. `the hilite of (the target)` disrupts the special case and is the same as saying `put the target into x; get hilite of x`, in which case `x` holds a normal string the same as any other string.)\n    * `the owner of` returns a string. (`answer the owner of this cd` shows the name.)\n* How we implement it:\n    * It's mostly laid out in `bgrammar_01.ccc`\n    * The catch is: how do we know when `the target` should not be a string?\n    * the places I know of where it shouldn't be a string:\n        * prop `get the {propname} of the target`\n        * prop `set the {propname} of the target`\n        * chunk prop `get the textstyle of char 3 of the target`\n        * chunk prop `set the textstyle of char 3 of the target to bold`\n    * implementation:\n        * handle the first two cases in string-rewriting, `vpcRewritesGlobal.ts` to turn `the target` into `target`\n        * handle the second two cases in parsing, see the `RuleHUnaryPropertyGet` visitor and `goSet()` in `execStatement.ts` \n        * possible alternate approach: special-case `the target` everywhere, so it's not a normal function call like it is now.\n\n\n## Tools\n\n* Describing the tools in `./vipercard/tools`:\n* `add-assert-markers`\n    * Adds unique markers to asserts\n    * So, if a user sees an assert saying for example `q6i` we can grep the codebase and pinpoint the location\n    * Markers are also shown for script errors, in the details\n* `genparse`\n    * Creates a chevrotain parser out of a bnf-style input file\n    * Can also auto-create some visitor-methods\n    * Can also generate a list of tokens, an interface, and more\n* `set_tsconfig_flavor`\n    * We use a different tsconfig file for development and prod, this script selects the right one.\n* `prettier-except-long-imports`\n    * Runs `prettier` on all code\n    * Leaves long import lines at the top of a file intact.\n    * Runs several other checks that test for long comments/strings, unsafe null coalesce, unreferenced tests, loose-typed arrays, non-regex replace, and more.\n    * Can automatically insert `longstr()` to help breaking up long strings.\n    * You can specify a subset of the files to have longer line lengths\n    * How to run it: `npm run prettierexceptlongimports` or Ctrl-Shift-B in vscode\n* `typescript-super-auto-import`\n    * Automatically add `import()` statements for exported symbols.\n    * Can auto-insert copyright header.\n    * Checks for duplicate exports.\n    * Ensures correct layering order (files mustn't directly call code from a higher module) based on `layers.cfg`\n    * How to run it: `npm run autoimportmodules` or Ctrl-Shift-B in vscode\n\n\n## Exception handling\n\n```\nWe don't want any exception to be accidentally swallowed silently.\nIt's not enough to just put an alert in assertTrue,\nbecause this won't cover base javascript errors like null-dereference.\nIt's important to show errors visibly so not to silently fall into\na bad state, and also we can log into local storage.\nSo, EVERY TOP OF THE CALL STACK must catch errors and send them to respondUI512Error\nThis includes:\n         events from the browser (e.g. via golly)\n             make sure they are wrapped in trycatch\n         onload callbacks\n             for images, json, server requests, dynamic script loading\n             look for \"addEventListener\" and \"onload\"\n             make sure they are wrapped in showMsgIfExceptionThrown\n         setinterval and settimeout. use eslint ban / ban to stop them.\n             use syncToAsyncAfterPause instead\n         all async code\n             use syncToAsyncTransition\n         placeCallbackInQueue\n             already ok because it's under the drawframe event.\n```\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "vipercard/vipercard/src/layers.cfg",
    "content": "// describes dependency layers,\n// a module can only import from code lower on the list.\n\n\n/ui512/root/\nrootStartCanvas.ts\nrootUI512.ts\n\n/test/testUtils/\ntestTop.ts\n\n/test/vpc03/cmds/\ntest03go.ts\n\n/test/vpc03/props/\ntest03chunk.ts\ntest03computed.ts\n\n/test/vpc03/fns/\ntest03standalone.ts\n\n/test/vpc03/\ntest03exprPseudoObjects.ts\ntest03objectRenderName.ts\ntest03exprObjectRef.ts\ntest03chunkAdditional.ts\ntest03chunkBasic.ts\ntest03lexer.ts\n\n/test/vpc/\nvpcuiTestIntroProvider.ts\nvpcuiTestMsgBox.ts\nvpcuiTestServer.ts\nvpcTestElements.ts\nvpcTestChunkResolution.ts\nvpcTestScriptExtensiveIf.ts\nvpcTestScriptExtensiveChunk.ts\nvpcTestScriptEval.ts\nvpcTestScriptExprLvl.ts\nvpcTestScriptParseExpr.ts\nvpcTestScriptParseCmd.ts\nvpcTestScriptRunCmd.ts\nvpcTestScriptRunCustomFns.ts\nvpcTestScriptRunSyntax.ts\nvpcTestScriptRunBase.ts\nvpcTestScriptRewrites.ts\nvpcTestVpcVal.ts\n\n/test/ui512demo/\nuiDemoBasic.ts\nuiDemoButtons.ts\nuiDemoComposites.ts\nuiDemoMenus.ts\nuiDemoPaint.ts\nuiDemoText.ts\nuiDemoTextEdit.ts\n\n/test/util512ui/\ntestUI512CodeEditor.ts\ntestUI512Composites.ts\ntestUI512DrawText.ts\ntestUI512Elements.ts\ntestUI512ElementsViewButtons.ts\ntestUI512FormattedText.ts\ntestUI512MenuRender.ts\ntestUI512Paint.ts\ntestUI512PaintFlood.ts\ntestUI512TextSelectEvents.ts\ntestUI512TextEdit.ts\ntestUI512TextEditInteractions.ts\ntestUI512TextModify.ts\n\n/test/util512/\ntestUtilsCanvasWrapper.ts\ntestUtilsDraw.ts\ntestUtil512Higher.ts\ntestUtil512Class.ts\ntestUtil512.ts\ntestUtil512Assert.ts\ntestExternalLibs.ts\n\n/test/testUtils/\ntestUtilsCanvas.ts\ntestUtils.ts\n\n/ui512/root/\nrootSetupHelpers.ts\n\n/vpcui/intro/\nvpcIntro.ts\nvpcIntroPageFirst.ts\nvpcIntroPageOpen.ts\nvpcIntroPageLoading.ts\nvpcIntroPagePickFile.ts\nvpcIntroInterface.ts\nvpcIntroProvider.ts\nvpcIntroPageBase.ts\nvpcInterfaceImpl.ts\n\n/vpcui/presentation/\nvpcPresenter.ts\nvpcPresenterInit.ts\nvpcPresenterEvents.ts\nvpcInternalDirectiveImpl.ts\nvpcSave.ts\nvpcPresenterInterface.ts\n\n/vpcui/menu/\nvpcAppMenuActions.ts\nvpcAboutDialog.ts\nvpcMenu.ts\nvpcMenuStructure.ts\n\n/vpcui/nonmodaldialogs/\nvpcFormLogin.ts\nvpcFormNewUser.ts\nvpcReplMessageBox.ts\nvpcFormSendReport.ts\nvpcDocViewer.ts\nvpcLyrNonModalHolder.ts\n\n/vpcui/tools/\nvpcToolBrowse.ts\nvpcToolEdit.ts\nvpcToolLasso.ts\nvpcToolSelect.ts\nvpcToolSelectBase.ts\nvpcToolCurve.ts\nvpcToolShape.ts\nvpcToolSmear.ts\nvpcToolStamp.ts\nvpcToolBucket.ts\nvpcToolBase.ts\n\n/vpcui/panels/\nvpcLyrPanels.ts\nvpcLyrNotification.ts\nvpcLyrDragHandles.ts\nvpcLyrToolbox.ts\nvpcEditPanelsStack.ts\nvpcEditPanelsCard.ts\nvpcEditPanelsBtn.ts\nvpcEditPanelsFld.ts\nvpcEditPanelsEmpty.ts\nvpcEditPanelsBase.ts\nvpcScriptEditor.ts\nvpcPanelsInterface.ts\nvpcToolboxMain.ts\nvpcToolboxNav.ts\nvpcToolboxPatterns.ts\n\n/vpcui/modelrender/\nvpcModelRender.ts\nvpcPaintRender.ts\nvpcGifExport.ts\n\n/vpcui/state/\nvpcState.ts\nvpcOutsideImpl.ts\nvpcUndo.ts\nvpcStateSerialize.ts\nvpcCreateOrDelVel.ts\nvpcInterface.ts\n\n/vpc/request/\nvpcRequest.ts\nvpcSigned.ts\nvpcRequestBase.ts\n\n/vpc/codeexec/\nvpcScriptExecTop.ts\nvpcScriptExecFrameStack.ts\nvpcScriptExecFrame.ts\nvpcScriptExecStatement.ts\nvpcScriptExecStatementHelpers.ts\nvpcScriptExecInternalDirective.ts\nvpcScriptExecAsync.ts\nvpcScriptCaches.ts\n\n/vpc/codepreparse/\nvpcTopPreparse.ts\nvpcProcessBranchAndLoops.ts\nvpcLineToCodeObj.ts\nvpcRewritesCommands.ts\nvpcRewritesConditions.ts\nvpcRewritesCustomFunctions.ts\nvpcRewritesLoops.ts\nvpcRewritesGlobal.ts\nvpcCheckReserved.ts\nvpcBuiltinFunctions.ts\nvpcBuiltinFunctionsUtils.ts\nvpcPreparseCommon.ts\n\n/vpc/codeparse/\nvpcVisitor.ts\nvpcVisitorMixin.ts\nvpcVisitorInterface.ts\nvpcParser.ts\nvpcTokens.ts\n\n/vpc/vel/\nvelRenderName.ts\nvelResolveReference.ts\nvelFieldChangeFont.ts\nvelResolveContainer.ts\nvelOutsideInterfaces.ts\nvelStackOrderHelpers.ts\nvelModelTop.ts\nvelProductOpts.ts\nvelStack.ts\nvelBg.ts\nvelCard.ts\nvelButton.ts\nvelField.ts\nvelSerialization.ts\nvelBase.ts\n\n/vpc/vpcutils/\nvpcRequestedReference.ts\nvpcInitIcons.ts\nvpcAudio.ts\nvpcChunkResolutionSort.ts\nvpcChunkResolution.ts\nvpcChunkResolutionUtils.ts\nvpcTables.ts\nvpcVarCollection.ts\nvpcValEval.ts\nvpcVal.ts\nvpcStandardLibDoMenu.ts\nvpcStandardLibScript.ts\nvpcUtils.ts\nvpcEnums.ts\n\n/ui512/composites/\nui512CodeEditor.ts\nui512CodeEditorAutoIndent.ts\nui512ModalDialog.ts\nui512Toolbox.ts\nui512ButtonGroup.ts\nui512Composites.ts\n\n/ui512/presentation/\nui512Presenter.ts\nui512PresenterBase.ts\n\n/ui512/textedit/\nui512TextEvents.ts\nui512BasicHandlers.ts\nui512TextSelModify.ts\nui512TextSelModifyImpl.ts\nui512Scrollbar.ts\nui512ClipManager.ts\nui512GenericField.ts\nui512TextLines.ts\n\n/ui512/menu/\nui512MenuListeners.ts\nui512MenuAnimation.ts\nui512MenuPositioning.ts\nui512SuspendEvents.ts\nui512PresenterWithMenu.ts\nui512Events.ts\n\n/ui512/elements/\nui512ElementView.ts\nui512ElementMenu.ts\nui512ElementCanvasPiece.ts\nui512ElementTextField.ts\nui512ElementButton.ts\nui512ElementLabel.ts\nui512ElementApp.ts\nui512ElementGroup.ts\nui512Element.ts\nui512ElementGettable.ts\n\n/ui512/utils/\nutilsCursors.ts\n\n/ui512/draw/\nui512ImageDissolve.ts\nui512ImageSerialization.ts\nui512DrawBorders.ts\nui512DrawIconManager.ts\nui512DrawIconClasses.ts\nui512DrawPaintDispatch.ts\nui512DrawPainter.ts\nui512DrawPainterClasses.ts\nui512DrawPatterns.ts\nui512ImageCollection.ts\nui512Interfaces.ts\n\n/ui512/drawtext/\nui512DrawText.ts\nui512DrawTextChar.ts\nui512DrawTextCharGrayed.ts\nui512DrawTextArgs.ts\nui512ComplexFontChanges.ts\nui512FormattedText.ts\nui512DrawTextFontRequest.ts\nui512DrawTextClasses.ts\nui512TranslateCharset.ts\n\n\n/bridge/\nbridgePbkdf2.ts\n\n/ui512/lang/\nlangBase.ts\n\n/ui512/utils/\nutilsCanvasDraw.ts\nutilsDrawConstants.ts\nutilsKeypressHelpers.ts\nutil512Serialize.ts\nutil512Higher.ts\nutil512.ts\nutil512Assert.ts\nutil512Base.ts\n\n/bridge/\nbridgeBase64Js.ts\nbridgeBrowserInfo.ts\nbridgeChevrotain.ts\nbridgeFileSaver.ts\nbridgeJsGif.ts\nbridgeJsLru.ts\nbridgeLzString.ts\nbridgePizzicato.ts\nbridgeTextEncoding.ts\n"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/card1.script",
    "content": "\n-- use scite-with-python's nsert numbered sequence\n-- or another such script to turn @ into unique numbers\n-- so we can see where the assert originated\n\non openCard\n\tglobal logCardEvts\n\tput \",opencd card1 cur=\" & (the short name of this cd) after logCardEvts\nend openCard\n\non closeCard\n\tglobal logCardEvts\n\tput \",closecd card1 cur=\" & (the short name of this cd) after logCardEvts\nend closeCard\n\non mouseUp\n\tif the short name of the target is \"testDlgs\" then\n\t\trunTestDlgs\n\telse if the short name of the target is \"testMisc\" then\n\t\trunTestMisc\n\telse if the short name of the target is \"testValOps\" then\n\t\trunTestValOps\n\telse if the short name of the target is \"testDraw\" then\n\t\trunTestDraw\n\telse if the short name of the target is \"testGoCard\" then\n\t\trunTestGoCardAndOpenCard\n\tend if\nend mouseUp\n\non assertEq marker, expected, got\n\tput \"expected '\"&expected&\"' but got '\"&got&\"'\"  into tmsg\n\tassertTrue marker, (expected==got), tmsg\nend assertEq\n\non assertTrue marker, b, tmsg\n\tif not b then\n\t\tput tmsg && \"(\" & marker & \")\" into tmsg\n\t\tlog (\"assertion failed \" & tmsg)\n\t\tanswer (\"assertion failed \" & tmsg)\n\t\tintentionallyStopScript\n\tend if\nend assertTrue\n\non runTestDlgs\n\tput \"\" into cd fld \"log\"\n\t\n\tanswer \"we'll show many dialogs where the caption is 'true'.\"\n\tanswer true or false with \"c\" or \"b\" or \"a\"\n\tanswer true or false\n\tanswer 3 > 2\n\tanswer 2 == 2\n\tanswer 2 is a number\n\tanswer 2 is 2\n\tanswer \"b\" is in \"abc\"\n\tanswer \"tr\" & \"ue\"\n\tanswer not false\n\t\n\tanswer \"we'll show many dialogs where the caption is '2'.\"\n\tanswer 1+1\n\tanswer 1*2\n\tanswer 6 div 3\n\tanswer (8/8 + 1)\n\tanswer the number of chars in \"ab\"\n\tput 2 into x\n\tanswer x\n\t\n\tanswer \"this is an answer dialog with btn 'Ok'\" & cr & \"line 2\"\n\tput it into res\n\tassertEq @, 1, res\n\tanswer \"dialog with btn 'opt1'\" \\\n\t\twith \"opt1\"\n\tput it into res\n\tassertEq @, 1, res\n\tanswer \"please click 'opt1'\" \\\n\t\twith \"opt1\" or \"opt2\" or \"opt3\"\n\tput it into res\n\tassertEq @, 1, res\n\tanswer \"please click 'opt2'\" \\\n\t\twith \"opt1\" or \"opt2\" or \"opt3\"\n\tput it into res\n\tassertEq @, 2, res\n\tanswer \"please click 'opt3'\" \\\n\t\twith \"opt1\" or \"opt2\" or \"opt3\"\n\tput it into res\n\tassertEq @, 3, res\n\task \"sample ask dialog\"\n\task \"sample ask dialog, text should say 'example'\" \\\n\t\twith \"example\"\n\task \"please click OK\" \\\n\t\twith \"example\"\n\tput it into res\n\tassertEq @, \"example\", res\n\task \"please click cancel\" \\\n\t\twith \"example\"\n\tput it into res\n\tassertEq @, \"\", res\n\task \"please type test1 and click OK\" \\\n\t\twith \"example\"\n\tput it into res\n\tassertEq @, \"test1\", res\n\trepeat\n\t\tanswer (\"let's see if we can exit an infinite \"&\\\n\t\t\t\"loop. click the stop icon (black \"&\\\n\t\t\t\"rectangle) to exit this loop\")\n\t\tlog \".\"\n\tend repeat\n\tanswer \"should not see this.\"\n\tassertTrue @, false, \"notreached\"\nend runTestDlgs\n\non runTestValOps\n\tput \"3\" into cd fld \"fldTest\"\n\tmultiply cd fld \"fldTest\" by 4\n\tassertEq @, 12, cd fld \"fldTest\"\n\tmultiply cd fld \"fldTest\" by 5\n\tassertEq @, 60, cd fld \"fldTest\"\n\tdivide cd fld \"fldTest\" by 3\n\tassertEq @, 20, cd fld \"fldTest\"\n\tdivide cd fld \"fldTest\" by 2\n\tassertEq @, 10, cd fld \"fldTest\"\n\tadd 4 to cd fld \"fldTest\"\n\tassertEq @, 14, cd fld \"fldTest\"\n\tadd 6 to cd fld \"fldTest\"\n\tassertEq @, 20, cd fld \"fldTest\"\n\tsubtract 15 from cd fld \"fldTest\"\n\tassertEq @, 5, cd fld \"fldTest\"\n\tsubtract 6 from cd fld \"fldTest\"\n\tassertEq @, -1, cd fld \"fldTest\"\n\tput \"aa,cc\" into cd fld \"fldTest\"\n\tdelete char 2 of cd fld \"fldTest\"\n\tassertEq @, \"a,cc\", cd fld \"fldTest\"\n\tdelete char 2 to 3 of cd fld \"fldTest\"\n\tassertEq @, \"ac\", cd fld \"fldTest\"\n\tput \"\" into cd fld \"fldTest\"\n\t\n\tput \"ddd,aaa,fff\" into x\n\tassertEq @, \"ddd,aaa,fff\", x\n\tsort items of x\n\tassertEq @, \"aaa,ddd,fff\", x\n\tsort  items of x ascending\n\tassertEq @, \"aaa,ddd,fff\", x\n\tsort  items of x descending\n\tassertEq @, \"fff,ddd,aaa\", x\n\tdisable cd btn \"btnTest1\"\n\tanswer \"btnTest1 should be disabled.\"\n\tenable cd btn \"btnTest1\"\n\tanswer \"btnTest1 should be enabled.\"\n\thide cd btn \"btnTest1\"\n\tanswer \"btnTest1 should be hidden.\"\n\tshow cd btn \"btnTest1\"\n\tanswer \"btnTest1 should be visible.\"\n\t\n\tput \"abcdefabcdefabcdefabcdef\" into cd fld \"fldTest\"\n\tset the visible of cd fld \"fldTest\" to false\n\tanswer \"testfld should be hidden\"\n\tset the visible of cd fld \"fldTest\" to true\n\tanswer \"testfld should be visible\"\n\tset the textalign of cd fld \"fldTest\" to \"center\"\n\tanswer \"testfld should be centered\"\n\tset the textalign of cd fld \"fldTest\" to \"left\"\n\tanswer \"testfld should be alignleft\"\n\tset the dontwrap of cd fld \"fldTest\" to true\n\tanswer \"testfld should be wrapping off\"\n\tset the dontwrap of cd fld \"fldTest\" to false\n\tanswer \"testfld should be wrapping on\"\n\tset the textsize of cd fld \"fldTest\" to 24\n\tanswer \"testfld should be big text\"\n\tset the textsize of cd fld \"fldTest\" to 12\n\tanswer \"testfld should be normal text\"\n\tset the textsize of char 2 to 4 of \\\n\t\tcd fld \"fldTest\" to 24\n\tanswer \"testfld 'bcd' should be big\"\n\tset the textsize of char 2 to 4 of \\\n\t\tcd fld \"fldTest\" to 12\n\tanswer \"testfld 'bcd' should be normal\"\n\tput \"\" into cd fld \"fldTest\"\n\t\n\tset the left of cd btn \"btnTest1\" to (the left of cd btn \"btnTest1\"+45)\n\tset the top of cd btn \"btnTest1\" to (the top of cd btn \"btnTest1\"+45)\n\tset the width of cd btn \"btnTest1\" to (the width of cd btn \"btnTest1\"+45)\n\tset the height of cd btn \"btnTest1\" to (the height of cd btn \"btnTest1\"+45)\n\tanswer \"btnTest1 should be shifted down/right and bigger\"\n\tset the icon of cd btn \"btnTest1\" to 4\n\tanswer \"btnTest1 should have icon\"\n\tset the icon of cd btn \"btnTest1\" to 0\n\tanswer \"btnTest1 should have no icon\"\n\tset the left of cd btn \"btnTest1\" to (the left of cd btn \"btnTest1\"-45)\n\tset the top of cd btn \"btnTest1\" to (the top of cd btn \"btnTest1\"-45)\n\tset the width of cd btn \"btnTest1\" to (the width of cd btn \"btnTest1\"-45)\n\tset the height of cd btn \"btnTest1\" to (the height of cd btn \"btnTest1\"-45)\n\tanswer \"btnTest1 should be normal size\"\n\tset the enabled of cd btn \"btnTest1\" to false\n\tanswer \"btnTest1 should be disabled\"\n\tset the enabled of cd btn \"btnTest1\" to true\n\tanswer \"btnTest1 should be enabled\"\n\tset the label of cd btn \"btnTest1\" to \"changedlabel\"\n\tanswer \"btnTest1 should say 'changedlabel'\"\n\tset the style of cd btn \"btnTest1\" to roundrect\n\tanswer \"btnTest1 should have style changed\"\n\tset the style of cd btn \"btnTest1\" to rectangle\n\tanswer \"btnTest1 should be back to rectangle\"\n\tset the label of cd btn \"btnTest1\" to \"(test)\"\n\tanswer \"btnTest1 back to 'btnTest1'\"\n\tset the showlabel of cd btn \"btnTest1\" to false\n\tanswer \"btnTest1 should not show label\"\n\tset the showlabel of cd btn \"btnTest1\" to true\n\tanswer \"btnTest1 should show label\"\n\tset the visible of cd btn \"btnTest1\" to false\n\tanswer \"btnTest1 should be hidden\"\n\tset the visible of cd btn \"btnTest1\" to true\n\tanswer \"btnTest1 should be visible\"\n\tset the textstyle of cd btn \"btnTest1\" to \"bold,italic\"\n\tanswer \"btnTest1 should be bold,italic\"\n\tset the textstyle of cd btn \"btnTest1\" to \"plain\"\n\tanswer \"btnTest1 should not be bold,italic\"\n\tanswer \"test complete.\"\nend runTestValOps\n\non runTestMisc\n\tanswer \"about to play dial audio\"\n\tdial \"0123456789\"\n\tanswer \"done playing dial audio. about to play beep\"\n\tbeep\n\tgo next\n\tput \"\" into cd fld \"fldTest\"\n\tanswer \"on card 2\"\n\tput \"hello\" into cd fld \"fldTest\"\n\tanswer \"said 'hello'\"\n\tgo prev\n\tanswer \"back to first card\"\n\tput \"slow count 2s\" into cd fld \"log\"\n\trepeat with x=1 to 5\n\t\tlog x\n\t\twait 2 second\n\tend repeat\n\twait 2 seconds\n\tput \"faster count 60ticks\" into cd fld \"log\"\n\trepeat with x=1 to 5\n\t\tlog x\n\t\twait 60 ticks\n\tend repeat\n\twait 2 seconds\n\tput \"fast count 200ms\" into cd fld \"log\"\n\trepeat with x=1 to 5\n\t\tlog x\n\t\twait 200 ms\n\tend repeat\n\twait 2 seconds\n\tput \"tests complete\" into cd fld \"log\"\nend runTestMisc\n\non runTestDraw\n\tchoose brush tool\n\tput 0 into x\n\tclick at 15+x, 15\n\tdrag from 20+x, 5 to 20+x, 15\n\t\n\tadd 15 to x\n\tchoose pencil tool\n\tclick at 15+x, 15\n\tdrag from 20+x, 5 to 20+x, 15\n\t\n\tadd 15 to x\n\tchoose spray tool\n\tclick at 15+x, 15\n\tdrag from 20+x, 5 to 20+x, 15\n\t\n\tadd 15 to x\n\tchoose rect tool\n\tdrag from 20+x, 5 to 30+x, 15\n\t\n\tadd 15 to x\n\tchoose oval tool\n\tdrag from 20+x, 5 to 30+x, 15\n\t\n\tadd 15 to x\n\tchoose line tool\n\tdrag from 20+x, 5 to 30+x, 15\n\t\n\tanswer (\"we'll now draw a lot of random pixels,\" & \\\n\t\t\"hit Stop (black rectangle) to stop.\")\n\t\n\tchoose pencil tool\n\tput 30 into minpos\n\tput 120 into maxpos\n\tput maxpos - minpos into span\n\trepeat with i = 1 to 99999\n\t\tput random(span) + minpos into x\n\t\tput random(span) + minpos into y\n\t\tclick at x,y\n\tend repeat\nend runTestDraw\n\non runTestGoCardAndOpenCard\n\tglobal openStackWasCalled\n\tglobal openBgWasCalled\n\tassertTrue @, openStackWasCalled, \"failed: openStack Was not Called\"\n\tassertTrue @, openBgWasCalled, \"failed: openBg Was not Called\"\n\t\n\tglobal logCardEvts\n\tput \"\" into logCardEvts\n\t\n\t-- go to nonexistent card, should fail silently\n\tgo to card 999\n\tassertEq @, \"No such card\", the result\n\tassertEq @, \"\", logCardEvts\n\tgo to this card\n\tassertEq @, \"\", the result\n\tgo next\n\tassertEq @, \"\", the result\n\t\n\t-- go by relative, by ordinal\n\tgo first\n\tgo next\n\tassertEq @, the short id of card 2, the short id of this card\n\tgo prev\n\tassertEq @, the short id of card 1, the short id of this card\n\tgo second\n\tassertEq @, the short id of card 2, the short id of this card\n\tgo first\n\tassertEq @, the short id of card 1, the short id of this card\n\t\n\t-- test back and forth\n\trepeat 3 times\n\t\tgo first\n\t\tassertEq @, the short id of card 1, the short id of this card\n\t\tgo next\n\t\tassertEq @, the short id of card 2, the short id of this card\n\t\tgo next\n\t\tassertEq @, the short id of card 3, the short id of this card\n\t\tgo back\n\t\tassertEq @, the short id of card 2, the short id of this card\n\t\tgo back\n\t\tassertEq @, the short id of card 1, the short id of this card\n\t\tgo forth\n\t\tassertEq @, the short id of card 2, the short id of this card\n\t\tgo forth\n\t\tassertEq @, the short id of card 3, the short id of this card\n\tend repeat\n\t\n\t-- going to the same card already on, shouldn't call anything\n\tgo first\n\tassertEq @, the short id of card 1, the short id of this card\n\tput \"\" into logCardEvts\n\tgo first\n\tassertEq @, the short id of card 1, the short id of this card\n\tassertEq @, \"\", logCardEvts\n\t\n\t-- test going to different cards\n\tgo first\n\tput \"\" into logCardEvts\n\tgo to card id (the short id of card 2)\n\tassertEq @, the short id of card 2, the short id of this card\n\tgo to card id (the short id of card 3)\n\tassertEq @, the short id of card 3, the short id of this card\n\tgo to card \"card1\"\n\tassertEq @, the short id of card 1, the short id of this card\n\tput \",closecd card1 cur=card1,opencd card2 cur=card2,closecd card2 cur=card2,opencd card3 cur=card3,closecd card3 cur=card3,opencd card1 cur=card1\" into expected\n\tassertEq @, expected, logCardEvts\n\t\n\tanswer \"test complete.\"\nend runTestGoCardAndOpenCard\n\n\n\n"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/card4.script",
    "content": "\non afterkeydown\n\tput \"keydn \" into s\n\tif the shiftkey is down then\n\t\tput \"shft+\" after s\n\tend if\n\tif the optionkey is down then\n\t\tput \"opt+\" after s\n\tend if\n\tif the cmdkey is down then\n\t\tput \"cmd+\" after s\n\tend if\n\tput the keychar after s\n\tlog s\nend afterkeydown\n\non afterkeyup\n\tput \"keyup \" into s\n\tif the shiftkey is down then\n\t\tput \"shft+\" after s\n\tend if\n\tif the optionkey is down then\n\t\tput \"opt+\" after s\n\tend if\n\tif the cmdkey is down then\n\t\tput \"cmd+\" after s\n\tend if\n\tput the keychar after s\n\tlog s\nend afterkeyup\n\non idle\n\tput the mouseh into mx\n\tput the mousev into my\n\tif mx > the left of cd btn \"testOnIdle\" and \\\n\t\tmx < the right of cd btn \"testOnIdle\" and \\\n\t\t\tmy > the top of cd btn \"testOnIdle\" and \\\n\t\t\tmy < the bottom of cd btn \"testOnIdle\" then\n\tput \".\" after cd fld \"log\"\t\n\tend if\nend idle\n\n"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/card4btn.script",
    "content": "\non mousedoubleclick\n\tlog \"mousedoubleclick\"\nend mousedoubleclick\n\non mousedown\n\tlog \"mousedown\"\nend mousedown\n\non mouseenter\n\tlog \"mouseenter\"\nend mouseenter\n\non mouseleave\n\tlog \"mouseleave\"\nend mouseleave\n\non mouseup\n\tlog \"mouseup\"\nend mouseup\n\non mousewithin\n\tlog \"mousewithin\"\nend mousewithin\n\n"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/inapptest.json",
    "content": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":\"1b912dab-e4e7-4235-a6ea-aa539898ebf4\",\"elements\":[{\"type\":7,\"id\":\"921\",\"parent_id\":\"920\",\"insertIndex\":0,\"attrs\":{\"script\":\"on log s\\n\\tput cr & s after cd fld \\\"log\\\"\\nend log\\n\\non openStack\\n\\tglobal openStackWasCalled\\n\\tput true into openStackWasCalled\\nend openStack\\n\\non openBackground\\n\\tglobal openBgWasCalled\\n\\tput true into openBgWasCalled\\nend openBackground\\n\",\"name\":\"\",\"increasingnumberforelemname\":25,\"increasingnumberforid\":1030,\"stacklineage\":\"null|SU2IFzAbBOojt3XdVUh3ppg|untitled\"}},{\"type\":6,\"id\":\"1000\",\"parent_id\":\"921\",\"insertIndex\":1,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\"}},{\"type\":5,\"id\":\"1001\",\"parent_id\":\"1000\",\"insertIndex\":2,\"attrs\":{\"script\":\"\\n-- use scite-with-python's nsert numbered sequence\\n-- or another such script to turn 300 into unique numbers\\n-- so we can see where the assert originated\\n\\non openCard\\n\\tglobal logCardEvts\\n\\tput \\\",opencd card1 cur=\\\" & (the short name of this cd) after logCardEvts\\nend openCard\\n\\non closeCard\\n\\tglobal logCardEvts\\n\\tput \\\",closecd card1 cur=\\\" & (the short name of this cd) after logCardEvts\\nend closeCard\\n\\non mouseUp\\n\\tif the short name of the target is \\\"testDlgs\\\" then\\n\\t\\trunTestDlgs\\n\\telse if the short name of the target is \\\"testMisc\\\" then\\n\\t\\trunTestMisc\\n\\telse if the short name of the target is \\\"testValOps\\\" then\\n\\t\\trunTestValOps\\n\\telse if the short name of the target is \\\"testDraw\\\" then\\n\\t\\trunTestDraw\\n\\telse if the short name of the target is \\\"testGoCard\\\" then\\n\\t\\trunTestGoCardAndOpenCard\\n\\tend if\\nend mouseUp\\n\\non assertEq marker, expected, got\\n\\tput \\\"expected '\\\"&expected&\\\"' but got '\\\"&got&\\\"'\\\"  into tmsg\\n\\tassertTrue marker, (expected==got), tmsg\\nend assertEq\\n\\non assertTrue marker, b, tmsg\\n\\tif not b then\\n\\t\\tput tmsg && \\\"(\\\" & marker & \\\")\\\" into tmsg\\n\\t\\tlog (\\\"assertion failed \\\" & tmsg)\\n\\t\\tanswer (\\\"assertion failed \\\" & tmsg)\\n\\t\\tintentionallyStopScript\\n\\tend if\\nend assertTrue\\n\\non runTestDlgs\\n\\tput \\\"\\\" into cd fld \\\"log\\\"\\n\\t\\n\\tanswer \\\"we'll show many dialogs where the caption is 'true'.\\\"\\n\\tanswer true or false with \\\"c\\\" or \\\"b\\\" or \\\"a\\\"\\n\\tanswer true or false\\n\\tanswer 3 > 2\\n\\tanswer 2 == 2\\n\\tanswer 2 is a number\\n\\tanswer 2 is 2\\n\\tanswer \\\"b\\\" is in \\\"abc\\\"\\n\\tanswer \\\"tr\\\" & \\\"ue\\\"\\n\\tanswer not false\\n\\t\\n\\tanswer \\\"we'll show many dialogs where the caption is '2'.\\\"\\n\\tanswer 1+1\\n\\tanswer 1*2\\n\\tanswer 6 div 3\\n\\tanswer (8/8 + 1)\\n\\tanswer the number of chars in \\\"ab\\\"\\n\\tput 2 into x\\n\\tanswer x\\n\\t\\n\\tanswer \\\"this is an answer dialog with btn 'Ok'\\\" & cr & \\\"line 2\\\"\\n\\tput it into res\\n\\tassertEq 301, 1, res\\n\\tanswer \\\"dialog with btn 'opt1'\\\" \\\\\\n\\t\\twith \\\"opt1\\\"\\n\\tput it into res\\n\\tassertEq 302, 1, res\\n\\tanswer \\\"please click 'opt1'\\\" \\\\\\n\\t\\twith \\\"opt1\\\" or \\\"opt2\\\" or \\\"opt3\\\"\\n\\tput it into res\\n\\tassertEq 303, 1, res\\n\\tanswer \\\"please click 'opt2'\\\" \\\\\\n\\t\\twith \\\"opt1\\\" or \\\"opt2\\\" or \\\"opt3\\\"\\n\\tput it into res\\n\\tassertEq 304, 2, res\\n\\tanswer \\\"please click 'opt3'\\\" \\\\\\n\\t\\twith \\\"opt1\\\" or \\\"opt2\\\" or \\\"opt3\\\"\\n\\tput it into res\\n\\tassertEq 305, 3, res\\n\\task \\\"sample ask dialog\\\"\\n\\task \\\"sample ask dialog, text should say 'example'\\\" \\\\\\n\\t\\twith \\\"example\\\"\\n\\task \\\"please click OK\\\" \\\\\\n\\t\\twith \\\"example\\\"\\n\\tput it into res\\n\\tassertEq 306, \\\"example\\\", res\\n\\task \\\"please click cancel\\\" \\\\\\n\\t\\twith \\\"example\\\"\\n\\tput it into res\\n\\tassertEq 307, \\\"\\\", res\\n\\task \\\"please type test1 and click OK\\\" \\\\\\n\\t\\twith \\\"example\\\"\\n\\tput it into res\\n\\tassertEq 308, \\\"test1\\\", res\\n\\trepeat\\n\\t\\tanswer (\\\"let's see if we can exit an infinite \\\"&\\\\\\n\\t\\t\\t\\\"loop. click the stop icon (black \\\"&\\\\\\n\\t\\t\\t\\\"rectangle) to exit this loop\\\")\\n\\t\\tlog \\\".\\\"\\n\\tend repeat\\n\\tanswer \\\"should not see this.\\\"\\n\\tassertTrue 309, false, \\\"notreached\\\"\\nend runTestDlgs\\n\\non runTestValOps\\n\\tput \\\"3\\\" into cd fld \\\"fldTest\\\"\\n\\tmultiply cd fld \\\"fldTest\\\" by 4\\n\\tassertEq 310, 12, cd fld \\\"fldTest\\\"\\n\\tmultiply cd fld \\\"fldTest\\\" by 5\\n\\tassertEq 311, 60, cd fld \\\"fldTest\\\"\\n\\tdivide cd fld \\\"fldTest\\\" by 3\\n\\tassertEq 312, 20, cd fld \\\"fldTest\\\"\\n\\tdivide cd fld \\\"fldTest\\\" by 2\\n\\tassertEq 313, 10, cd fld \\\"fldTest\\\"\\n\\tadd 4 to cd fld \\\"fldTest\\\"\\n\\tassertEq 314, 14, cd fld \\\"fldTest\\\"\\n\\tadd 6 to cd fld \\\"fldTest\\\"\\n\\tassertEq 315, 20, cd fld \\\"fldTest\\\"\\n\\tsubtract 15 from cd fld \\\"fldTest\\\"\\n\\tassertEq 316, 5, cd fld \\\"fldTest\\\"\\n\\tsubtract 6 from cd fld \\\"fldTest\\\"\\n\\tassertEq 317, -1, cd fld \\\"fldTest\\\"\\n\\tput \\\"aa,cc\\\" into cd fld \\\"fldTest\\\"\\n\\tdelete char 2 of cd fld \\\"fldTest\\\"\\n\\tassertEq 318, \\\"a,cc\\\", cd fld \\\"fldTest\\\"\\n\\tdelete char 2 to 3 of cd fld \\\"fldTest\\\"\\n\\tassertEq 319, \\\"ac\\\", cd fld \\\"fldTest\\\"\\n\\tput \\\"\\\" into cd fld \\\"fldTest\\\"\\n\\t\\n\\tput \\\"ddd,aaa,fff\\\" into x\\n\\tassertEq 320, \\\"ddd,aaa,fff\\\", x\\n\\tsort items of x\\n\\tassertEq 321, \\\"aaa,ddd,fff\\\", x\\n\\tsort  items of x ascending\\n\\tassertEq 322, \\\"aaa,ddd,fff\\\", x\\n\\tsort  items of x descending\\n\\tassertEq 323, \\\"fff,ddd,aaa\\\", x\\n\\tdisable cd btn \\\"btnTest1\\\"\\n\\tanswer \\\"btnTest1 should be disabled.\\\"\\n\\tenable cd btn \\\"btnTest1\\\"\\n\\tanswer \\\"btnTest1 should be enabled.\\\"\\n\\thide cd btn \\\"btnTest1\\\"\\n\\tanswer \\\"btnTest1 should be hidden.\\\"\\n\\tshow cd btn \\\"btnTest1\\\"\\n\\tanswer \\\"btnTest1 should be visible.\\\"\\n\\t\\n\\tput \\\"abcdefabcdefabcdefabcdef\\\" into cd fld \\\"fldTest\\\"\\n\\tset the visible of cd fld \\\"fldTest\\\" to false\\n\\tanswer \\\"testfld should be hidden\\\"\\n\\tset the visible of cd fld \\\"fldTest\\\" to true\\n\\tanswer \\\"testfld should be visible\\\"\\n\\tset the textalign of cd fld \\\"fldTest\\\" to \\\"center\\\"\\n\\tanswer \\\"testfld should be centered\\\"\\n\\tset the textalign of cd fld \\\"fldTest\\\" to \\\"left\\\"\\n\\tanswer \\\"testfld should be alignleft\\\"\\n\\tset the dontwrap of cd fld \\\"fldTest\\\" to true\\n\\tanswer \\\"testfld should be wrapping off\\\"\\n\\tset the dontwrap of cd fld \\\"fldTest\\\" to false\\n\\tanswer \\\"testfld should be wrapping on\\\"\\n\\tset the textsize of cd fld \\\"fldTest\\\" to 24\\n\\tanswer \\\"testfld should be big text\\\"\\n\\tset the textsize of cd fld \\\"fldTest\\\" to 12\\n\\tanswer \\\"testfld should be normal text\\\"\\n\\tset the textsize of char 2 to 4 of \\\\\\n\\t\\tcd fld \\\"fldTest\\\" to 24\\n\\tanswer \\\"testfld 'bcd' should be big\\\"\\n\\tset the textsize of char 2 to 4 of \\\\\\n\\t\\tcd fld \\\"fldTest\\\" to 12\\n\\tanswer \\\"testfld 'bcd' should be normal\\\"\\n\\tput \\\"\\\" into cd fld \\\"fldTest\\\"\\n\\t\\n\\tset the left of cd btn \\\"btnTest1\\\" to (the left of cd btn \\\"btnTest1\\\"+45)\\n\\tset the top of cd btn \\\"btnTest1\\\" to (the top of cd btn \\\"btnTest1\\\"+45)\\n\\tset the width of cd btn \\\"btnTest1\\\" to (the width of cd btn \\\"btnTest1\\\"+45)\\n\\tset the height of cd btn \\\"btnTest1\\\" to (the height of cd btn \\\"btnTest1\\\"+45)\\n\\tanswer \\\"btnTest1 should be shifted down/right and bigger\\\"\\n\\tset the icon of cd btn \\\"btnTest1\\\" to 4\\n\\tanswer \\\"btnTest1 should have icon\\\"\\n\\tset the icon of cd btn \\\"btnTest1\\\" to 0\\n\\tanswer \\\"btnTest1 should have no icon\\\"\\n\\tset the left of cd btn \\\"btnTest1\\\" to (the left of cd btn \\\"btnTest1\\\"-45)\\n\\tset the top of cd btn \\\"btnTest1\\\" to (the top of cd btn \\\"btnTest1\\\"-45)\\n\\tset the width of cd btn \\\"btnTest1\\\" to (the width of cd btn \\\"btnTest1\\\"-45)\\n\\tset the height of cd btn \\\"btnTest1\\\" to (the height of cd btn \\\"btnTest1\\\"-45)\\n\\tanswer \\\"btnTest1 should be normal size\\\"\\n\\tset the enabled of cd btn \\\"btnTest1\\\" to false\\n\\tanswer \\\"btnTest1 should be disabled\\\"\\n\\tset the enabled of cd btn \\\"btnTest1\\\" to true\\n\\tanswer \\\"btnTest1 should be enabled\\\"\\n\\tset the label of cd btn \\\"btnTest1\\\" to \\\"changedlabel\\\"\\n\\tanswer \\\"btnTest1 should say 'changedlabel'\\\"\\n\\tset the style of cd btn \\\"btnTest1\\\" to roundrect\\n\\tanswer \\\"btnTest1 should have style changed\\\"\\n\\tset the style of cd btn \\\"btnTest1\\\" to rectangle\\n\\tanswer \\\"btnTest1 should be back to rectangle\\\"\\n\\tset the label of cd btn \\\"btnTest1\\\" to \\\"(test)\\\"\\n\\tanswer \\\"btnTest1 back to 'btnTest1'\\\"\\n\\tset the showlabel of cd btn \\\"btnTest1\\\" to false\\n\\tanswer \\\"btnTest1 should not show label\\\"\\n\\tset the showlabel of cd btn \\\"btnTest1\\\" to true\\n\\tanswer \\\"btnTest1 should show label\\\"\\n\\tset the visible of cd btn \\\"btnTest1\\\" to false\\n\\tanswer \\\"btnTest1 should be hidden\\\"\\n\\tset the visible of cd btn \\\"btnTest1\\\" to true\\n\\tanswer \\\"btnTest1 should be visible\\\"\\n\\tset the textstyle of cd btn \\\"btnTest1\\\" to \\\"bold,italic\\\"\\n\\tanswer \\\"btnTest1 should be bold,italic\\\"\\n\\tset the textstyle of cd btn \\\"btnTest1\\\" to \\\"plain\\\"\\n\\tanswer \\\"btnTest1 should not be bold,italic\\\"\\n\\tanswer \\\"test complete.\\\"\\nend runTestValOps\\n\\non runTestMisc\\n\\tanswer \\\"about to play dial audio\\\"\\n\\tdial \\\"0123456789\\\"\\n\\tanswer \\\"done playing dial audio. about to play beep\\\"\\n\\tbeep\\n\\tgo next\\n\\tput \\\"\\\" into cd fld \\\"fldTest\\\"\\n\\tanswer \\\"on card 2\\\"\\n\\tput \\\"hello\\\" into cd fld \\\"fldTest\\\"\\n\\tanswer \\\"said 'hello'\\\"\\n\\tgo prev\\n\\tanswer \\\"back to first card\\\"\\n\\tput \\\"slow count 2s\\\" into cd fld \\\"log\\\"\\n\\trepeat with x=1 to 5\\n\\t\\tlog x\\n\\t\\twait 2 second\\n\\tend repeat\\n\\twait 2 seconds\\n\\tput \\\"faster count 60ticks\\\" into cd fld \\\"log\\\"\\n\\trepeat with x=1 to 5\\n\\t\\tlog x\\n\\t\\twait 60 ticks\\n\\tend repeat\\n\\twait 2 seconds\\n\\tput \\\"fast count 200ms\\\" into cd fld \\\"log\\\"\\n\\trepeat with x=1 to 5\\n\\t\\tlog x\\n\\t\\twait 200 ms\\n\\tend repeat\\n\\twait 2 seconds\\n\\tput \\\"tests complete\\\" into cd fld \\\"log\\\"\\nend runTestMisc\\n\\non runTestDraw\\n\\tchoose brush tool\\n\\tput 0 into x\\n\\tclick at 15+x, 15\\n\\tdrag from 20+x, 5 to 20+x, 15\\n\\t\\n\\tadd 15 to x\\n\\tchoose pencil tool\\n\\tclick at 15+x, 15\\n\\tdrag from 20+x, 5 to 20+x, 15\\n\\t\\n\\tadd 15 to x\\n\\tchoose spray tool\\n\\tclick at 15+x, 15\\n\\tdrag from 20+x, 5 to 20+x, 15\\n\\t\\n\\tadd 15 to x\\n\\tchoose rect tool\\n\\tdrag from 20+x, 5 to 30+x, 15\\n\\t\\n\\tadd 15 to x\\n\\tchoose oval tool\\n\\tdrag from 20+x, 5 to 30+x, 15\\n\\t\\n\\tadd 15 to x\\n\\tchoose line tool\\n\\tdrag from 20+x, 5 to 30+x, 15\\n\\t\\n\\tanswer (\\\"we'll now draw a lot of random pixels,\\\" & \\\\\\n\\t\\t\\\"hit Stop (black rectangle) to stop.\\\")\\n\\t\\n\\tchoose pencil tool\\n\\tput 30 into minpos\\n\\tput 120 into maxpos\\n\\tput maxpos - minpos into span\\n\\trepeat with i = 1 to 99999\\n\\t\\tput random(span) + minpos into x\\n\\t\\tput random(span) + minpos into y\\n\\t\\tclick at x,y\\n\\tend repeat\\nend runTestDraw\\n\\non runTestGoCardAndOpenCard\\n\\tglobal openStackWasCalled\\n\\tglobal openBgWasCalled\\n\\tassertTrue 324, openStackWasCalled, \\\"failed: openStack Was not Called\\\"\\n\\tassertTrue 325, openBgWasCalled, \\\"failed: openBg Was not Called\\\"\\n\\t\\n\\tglobal logCardEvts\\n\\tput \\\"\\\" into logCardEvts\\n\\t\\n\\t-- go to nonexistent card, should fail silently\\n\\tgo to card 999\\n\\tassertEq 326, \\\"No such card\\\", the result\\n\\tassertEq 327, \\\"\\\", logCardEvts\\n\\tgo to this card\\n\\tassertEq 328, \\\"\\\", the result\\n\\tgo next\\n\\tassertEq 329, \\\"\\\", the result\\n\\t\\n\\t-- go by relative, by ordinal\\n\\tgo first\\n\\tgo next\\n\\tassertEq 330, the short id of card 2, the short id of this card\\n\\tgo prev\\n\\tassertEq 331, the short id of card 1, the short id of this card\\n\\tgo second\\n\\tassertEq 332, the short id of card 2, the short id of this card\\n\\tgo first\\n\\tassertEq 333, the short id of card 1, the short id of this card\\n\\t\\n\\t-- test back and forth\\n\\trepeat 3 times\\n\\t\\tgo first\\n\\t\\tassertEq 334, the short id of card 1, the short id of this card\\n\\t\\tgo next\\n\\t\\tassertEq 335, the short id of card 2, the short id of this card\\n\\t\\tgo next\\n\\t\\tassertEq 336, the short id of card 3, the short id of this card\\n\\t\\tgo back\\n\\t\\tassertEq 337, the short id of card 2, the short id of this card\\n\\t\\tgo back\\n\\t\\tassertEq 338, the short id of card 1, the short id of this card\\n\\t\\tgo forth\\n\\t\\tassertEq 339, the short id of card 2, the short id of this card\\n\\t\\tgo forth\\n\\t\\tassertEq 340, the short id of card 3, the short id of this card\\n\\tend repeat\\n\\t\\n\\t-- going to the same card already on, shouldn't call anything\\n\\tgo first\\n\\tassertEq 341, the short id of card 1, the short id of this card\\n\\tput \\\"\\\" into logCardEvts\\n\\tgo first\\n\\tassertEq 342, the short id of card 1, the short id of this card\\n\\tassertEq 343, \\\"\\\", logCardEvts\\n\\t\\n\\t-- test going to different cards\\n\\tgo first\\n\\tput \\\"\\\" into logCardEvts\\n\\tgo to card id (the short id of card 2)\\n\\tassertEq 344, the short id of card 2, the short id of this card\\n\\tgo to card id (the short id of card 3)\\n\\tassertEq 345, the short id of card 3, the short id of this card\\n\\tgo to card \\\"card1\\\"\\n\\tassertEq 346, the short id of card 1, the short id of this card\\n\\tput \\\",closecd card1 cur=card1,opencd card2 cur=card2,closecd card2 cur=card2,opencd card3 cur=card3,closecd card3 cur=card3,opencd card1 cur=card1\\\" into expected\\n\\tassertEq 347, expected, logCardEvts\\n\\t\\n\\tanswer \\\"test complete.\\\"\\nend runTestGoCardAndOpenCard\\n\\n\\n\",\"name\":\"card1\",\"paint\":\"b64``phE5X70u41+SCnstBmnvXh48NAazOL4l6iJzV9s2WHQGatYur32dHf5nEIBIGGg40WgzcccS7SS/S9EQkin1Sgo2VRuJN/dtwF/xcLNxh1NOZn4t21meNwNiB1TOF/xvmj4Tfw984H9IMDIcKw2kB0Ij8VH4GJxcUSG8FG1JxyVTUnkZvGx+bkA/dFhJLrUW6ku1FQorjU3eLvhQjmrWNPtaPW3OTm93zzfwXzocLA9mRwNk6QkUVZZmXzd8GE8tdxaLK6119maHe9c7+F89Hq4PxycTNAVGGmubc987Xly/Hk9P11fnewt0E34bfhyAoAFYUCYJgEFCeKUM8CFWTKcLKGFJYmQOyFFdWuYIeDFHduUNGHJQQUdKRAlMaURPtClaVcZJlGlBfYVM7BlVS4dLPFlLZwRP3HlfXzZIYgXEcDUtAkbSRLcqUiXObLQvqhXZUnYpilXDevUs+jXXTvcrJnXIYVRuxk3cWdZodi3GddVtFm7RQ5dqTh3Na5Rvvj3bVxZqnn3Afy0c4QOUSC8bMUOKZKwe0WOeXG4YaROFcm0dCVSTRu8aWTOPbuwfpQuYUU5ZhUuCec1c9SuWTc9bLWuJY4xezVudWw5ZfTuHdw1eHXwQQT86QwcMaTw/sycaVb45k2cBfX086xcVS387O1cLZ/w+23cfX144Zw8Ecl19B1ASRt96Vy8Obtx/rx8ZVJ55j18DfB19/z8XUB98IH8qMOABLSSAASg8sEEuKlBBKzYQQiwhaCEpOcghLy04ISoz+GEtJ5hhKD+kEa4oRBGrNAQSrCJ0Uak61FGvLixRqjHsMa0ljDGoPbxxritccas3HHJsIGIJaTjCCW8sMglqMvJJbSaSSWg+qinCKiAAIAA=\",\"marked\":false}},{\"type\":3,\"id\":\"1002\",\"parent_id\":\"1001\",\"insertIndex\":3,\"attrs\":{\"x\":407,\"y\":70,\"w\":100,\"h\":58,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testDlgs\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"testDlgs\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1003\",\"parent_id\":\"1001\",\"insertIndex\":4,\"attrs\":{\"x\":409,\"y\":189,\"w\":98,\"h\":32,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testMisc\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"testMisc\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1004\",\"parent_id\":\"1001\",\"insertIndex\":5,\"attrs\":{\"x\":409,\"y\":137,\"w\":99,\"h\":46,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testValOps\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"testValOps\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1005\",\"parent_id\":\"1001\",\"insertIndex\":6,\"attrs\":{\"x\":407,\"y\":15,\"w\":99,\"h\":48,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testDraw\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"testDraw\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"1006\",\"parent_id\":\"1001\",\"insertIndex\":7,\"attrs\":{\"x\":203,\"y\":146,\"w\":145,\"h\":184,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"log\",\"scroll\":0,\"ftxt\":\"\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":4,\"id\":\"1007\",\"parent_id\":\"1001\",\"insertIndex\":8,\"attrs\":{\"x\":22,\"y\":227,\"w\":86,\"h\":102,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"fldTest\",\"scroll\":0,\"ftxt\":\"\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":3,\"id\":\"1008\",\"parent_id\":\"1001\",\"insertIndex\":9,\"attrs\":{\"x\":21,\"y\":156,\"w\":100,\"h\":58,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":3,\"label\":\"(test)\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"btnTest1\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1017\",\"parent_id\":\"1001\",\"insertIndex\":10,\"attrs\":{\"x\":203,\"y\":113,\"w\":146,\"h\":26,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"clear\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tput \\\"\\\" into cd fld \\\"log\\\"\\nend mouseUp\",\"name\":\"clear\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1021\",\"parent_id\":\"1001\",\"insertIndex\":11,\"attrs\":{\"x\":410,\"y\":226,\"w\":98,\"h\":32,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testGoCard\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\",\"name\":\"testGoCard\",\"sharedhilite\":true}},{\"type\":5,\"id\":\"1009\",\"parent_id\":\"1000\",\"insertIndex\":12,\"attrs\":{\"script\":\"on openCard\\n\\tglobal logCardEvts\\n\\tput \\\",opencd card2 cur=\\\" & (the short name of this cd) after logCardEvts\\nend openCard\\n\\non closeCard\\n\\tglobal logCardEvts\\n\\tput \\\",closecd card2 cur=\\\" & (the short name of this cd) after logCardEvts\\nend closeCard\\n\",\"name\":\"card2\",\"paint\":\"\",\"marked\":false}},{\"type\":4,\"id\":\"1010\",\"parent_id\":\"1009\",\"insertIndex\":13,\"attrs\":{\"x\":12,\"y\":10,\"w\":115,\"h\":25,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":8,\"selend\":8,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 8\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002this is card #2\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":4,\"id\":\"1012\",\"parent_id\":\"1009\",\"insertIndex\":14,\"attrs\":{\"x\":167,\"y\":153,\"w\":86,\"h\":102,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"fldTest\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002hello\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":5,\"id\":\"1023\",\"parent_id\":\"1000\",\"insertIndex\":15,\"attrs\":{\"script\":\"on openCard\\n\\tglobal logCardEvts\\n\\tput \\\",opencd card3 cur=\\\" & (the short name of this cd) after logCardEvts\\nend openCard\\n\\non closeCard\\n\\tglobal logCardEvts\\n\\tput \\\",closecd card3 cur=\\\" & (the short name of this cd) after logCardEvts\\nend closeCard\\n\",\"name\":\"card3\",\"paint\":\"\",\"marked\":false}},{\"type\":4,\"id\":\"1024\",\"parent_id\":\"1023\",\"insertIndex\":16,\"attrs\":{\"x\":14,\"y\":9,\"w\":115,\"h\":25,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":15,\"selend\":15,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 8\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002this is card #3\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":5,\"id\":\"1013\",\"parent_id\":\"1000\",\"insertIndex\":17,\"attrs\":{\"script\":\"\\non afterkeydown\\n\\tput \\\"keydn \\\" into s\\n\\tif the shiftkey is down then\\n\\t\\tput \\\"shft+\\\" after s\\n\\tend if\\n\\tif the optionkey is down then\\n\\t\\tput \\\"opt+\\\" after s\\n\\tend if\\n\\tif the cmdkey is down then\\n\\t\\tput \\\"cmd+\\\" after s\\n\\tend if\\n\\tput the keychar after s\\n\\tlog s\\nend afterkeydown\\n\\non afterkeyup\\n\\tput \\\"keyup \\\" into s\\n\\tif the shiftkey is down then\\n\\t\\tput \\\"shft+\\\" after s\\n\\tend if\\n\\tif the optionkey is down then\\n\\t\\tput \\\"opt+\\\" after s\\n\\tend if\\n\\tif the cmdkey is down then\\n\\t\\tput \\\"cmd+\\\" after s\\n\\tend if\\n\\tput the keychar after s\\n\\tlog s\\nend afterkeyup\\n\\non idle\\n\\tput the mouseh into mx\\n\\tput the mousev into my\\n\\tif mx > the left of cd btn \\\"testOnIdle\\\" and \\\\\\n\\t\\tmx < the right of cd btn \\\"testOnIdle\\\" and \\\\\\n\\t\\t\\tmy > the top of cd btn \\\"testOnIdle\\\" and \\\\\\n\\t\\t\\tmy < the bottom of cd btn \\\"testOnIdle\\\" then\\n\\t\\tput \\\".\\\" after cd fld \\\"log\\\"\\t\\n\\tend if\\n\\t\\nend idle\\n\",\"name\":\"card4\",\"paint\":\"\",\"marked\":false}},{\"type\":4,\"id\":\"1014\",\"parent_id\":\"1013\",\"insertIndex\":18,\"attrs\":{\"x\":14,\"y\":147,\"w\":145,\"h\":184,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":200,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"log\",\"scroll\":0,\"ftxt\":\"\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":3,\"id\":\"1015\",\"parent_id\":\"1013\",\"insertIndex\":19,\"attrs\":{\"x\":388,\"y\":14,\"w\":103,\"h\":47,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"trackevents\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"\\non mousedoubleclick\\n\\tlog \\\"mousedoubleclick\\\"\\nend mousedoubleclick\\n\\non mousedown\\n\\tlog \\\"mousedown\\\"\\nend mousedown\\n\\non mouseenter\\n\\tlog \\\"mouseenter\\\"\\nend mouseenter\\n\\non mouseleave\\n\\tlog \\\"mouseleave\\\"\\nend mouseleave\\n\\non mouseup\\n\\tlog \\\"mouseup\\\"\\nend mouseup\\n\\non mousewithin\\n\\tlog \\\"mousewithin\\\"\\nend mousewithin\\n\",\"name\":\"trackevents\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1016\",\"parent_id\":\"1013\",\"insertIndex\":20,\"attrs\":{\"x\":17,\"y\":104,\"w\":105,\"h\":36,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"clear\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tput \\\"\\\" into cd fld \\\"log\\\"\\nend mouseUp\",\"name\":\"clear\",\"sharedhilite\":true}},{\"type\":3,\"id\":\"1019\",\"parent_id\":\"1013\",\"insertIndex\":21,\"attrs\":{\"x\":249,\"y\":248,\"w\":228,\"h\":58,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"testOnIdle, when cursor within\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tanswer \\\"the button was clicked.\\\"\\nend mouseUp\",\"name\":\"testOnIdle\",\"sharedhilite\":true}},{\"type\":4,\"id\":\"1022\",\"parent_id\":\"1013\",\"insertIndex\":22,\"attrs\":{\"x\":12,\"y\":9,\"w\":204,\"h\":46,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":15,\"selend\":15,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 8\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002this is card #4\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":5,\"id\":\"1025\",\"parent_id\":\"1000\",\"insertIndex\":23,\"attrs\":{\"script\":\"\",\"name\":\"\",\"paint\":\"\",\"marked\":false}},{\"type\":4,\"id\":\"1026\",\"parent_id\":\"1025\",\"insertIndex\":24,\"attrs\":{\"x\":15,\"y\":12,\"w\":204,\"h\":46,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":49,\"selend\":49,\"style\":2,\"visible\":true,\"script\":\"\",\"textalign\":\"left\",\"name\":\"my field 8\",\"scroll\":0,\"ftxt\":\"\\u0002geneva_12_biuosdce\\u0002this is card #5, testing openField and closeField\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":4,\"id\":\"1027\",\"parent_id\":\"1025\",\"insertIndex\":25,\"attrs\":{\"x\":129,\"y\":119,\"w\":106,\"h\":184,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":11,\"selend\":11,\"style\":200,\"visible\":true,\"script\":\"on openfield\\n\\tput cr & \\\"enter left\\\" after cd fld id 1027\\nend openfield\\n\\non closefield\\n\\tput cr & \\\"close left\\\" after cd fld id 1027\\nend closefield\\n\\non exitfield\\n\\tput cr & \\\"exit left\\\" after cd fld id 1027\\nend exitfield\\n\",\"textalign\":\"left\",\"name\":\"my field 22\",\"scroll\":0,\"ftxt\":\"\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":4,\"id\":\"1028\",\"parent_id\":\"1025\",\"insertIndex\":26,\"attrs\":{\"x\":243,\"y\":119,\"w\":98,\"h\":184,\"dontwrap\":false,\"enabled\":true,\"locktext\":false,\"singleline\":false,\"selcaret\":0,\"selend\":0,\"style\":200,\"visible\":true,\"script\":\"on openfield\\n\\tput cr & \\\"enter right\\\" after cd fld id 1028\\nend openfield\\n\\non closefield\\n\\tput cr & \\\"close right\\\" after cd fld id 1028\\nend closefield\\n\\non exitfield\\n\\tput cr & \\\"exit right\\\" after cd fld id 1028\\nend exitfield\\n\",\"textalign\":\"left\",\"name\":\"my field 23\",\"scroll\":0,\"ftxt\":\"\",\"sharedtext\":true,\"defaulttextfont\":\"geneva\",\"defaulttextsize\":12,\"defaulttextstyle\":0}},{\"type\":3,\"id\":\"1029\",\"parent_id\":\"1025\",\"insertIndex\":27,\"attrs\":{\"x\":192,\"y\":88,\"w\":102,\"h\":23,\"autohilite\":true,\"enabled\":true,\"hilite\":false,\"checkmark\":false,\"icon\":0,\"showlabel\":true,\"style\":5,\"label\":\"clear\",\"textalign\":\"center\",\"textfont\":\"chicago\",\"textsize\":12,\"textstyle\":0,\"visible\":true,\"script\":\"on mouseUp\\n\\tput \\\"\\\" into cd fld id 1027\\n\\tput \\\"\\\" into cd fld id 1028\\nend mouseUp\",\"name\":\"clear\",\"sharedhilite\":true}}]}"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/stackscript.script",
    "content": "\non log s\n\tput cr & s after cd fld \"log\" of cd 1\nend log\n\non openStack\n\tglobal openStackWasCalled\n\tput true into openStackWasCalled\nend openStack\n\non openBackground\n\tglobal openBgWasCalled\n\tput true into openBgWasCalled\nend openBackground\n\n"
  },
  {
    "path": "vipercard/vipercard/src/test/in-app-tests/undotest.script",
    "content": "\n\ntest manually:\n---------------------\n\tcopy/paste\n\tclicking on scrollbar to go up/down, in text area, click+hold\n\tclick/drag to select text in field\n\tmenu interactions\n\tpaint tools\n\npencil tool\ndraw with pencil\ndraw with pencil\nbutton tool\nmake new button\nchange type to shadow\nline tool\ndraw a line\nbutton tool\nselect button\ntype 2 in icon (icon won't change until you hit enter or click)\nhit ctrl z\nfield should go back to 0\ntype 2 in icon field and hit Enter\n(icon should show)\nuncheck enabled\nhit ctrl z, should go back\nuncheck enabled\ngo to button label field, type New Button3 and hit enter\ngo to button label field, type New Button345 and hit ctrl z\n(should go back to New Button3)\npencil tool\ndraw with pencil\nbutton tool\nselect button\nclick Script\ntype answer \"the button was clicked2.\"\nhit ctrl z, should go back to answer \"the button was clicked.\"\ntype answer \"the button was clicked2.\" hit save script\ntype answer \"the button was clicked23.\"\nhit ctrl z, should go back to answer \"the button was clicked2.\"\ntype answer \"the button was clicked2.\"<enter>answer \"a\"<enter>answer \"b\"\nhit ctrl z, should go back to answer \"the button was clicked2.\"<enter>answer \"a\"\n\n\nundo back through everything.\nmake sure icon is unset.\n\n\n\n"
  },
  {
    "path": "vipercard/vipercard/src/test/testUtils/testTop.ts",
    "content": "\n/* auto */ import { testCollectionvpcuiMsgBox } from './../vpc/vpcuiTestMsgBox';\n/* auto */ import { testCollectionvpcuiIntroProvider } from './../vpc/vpcuiTestIntroProvider';\n/* auto */ import { testCollectionvpcVpcVal } from './../vpc/vpcTestVpcVal';\n/* auto */ import { testCollectionvpcScriptRunSyntax } from './../vpc/vpcTestScriptRunSyntax';\n/* auto */ import { testCollectionScriptRunCustomFns } from './../vpc/vpcTestScriptRunCustomFns';\n/* auto */ import { testCollectionScriptRunCmd } from './../vpc/vpcTestScriptRunCmd';\n/* auto */ import { ScriptTestBatch } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { testCollectionScriptRewrites } from './../vpc/vpcTestScriptRewrites';\n/* auto */ import { testCollectionvpcScriptParseExpr } from './../vpc/vpcTestScriptParseExpr';\n/* auto */ import { testCollectionvpcScriptParseCmd } from './../vpc/vpcTestScriptParseCmd';\n/* auto */ import { testCollectionScriptExtensiveChunk } from './../vpc/vpcTestScriptExtensiveChunk';\n/* auto */ import { testCollectionScriptExprLvl } from './../vpc/vpcTestScriptExprLvl';\n/* auto */ import { testCollectionvpcScriptEval } from './../vpc/vpcTestScriptEval';\n/* auto */ import { testCollectionvpcElements } from './../vpc/vpcTestElements';\n/* auto */ import { testCollectionvpcChunkResolution } from './../vpc/vpcTestChunkResolution';\n/* auto */ import { VpcIntroProvider } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { AsyncFn, VoidFn } from './../../ui512/utils/util512Higher';\n/* auto */ import { UI512ErrorHandling, assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, Util512, ValHolder } from './../../ui512/utils/util512';\n/* auto */ import { testCollectionUtilsDraw } from './../util512/testUtilsDraw';\n/* auto */ import { testCollectionUtilsCanvasWrapper } from './../util512/testUtilsCanvasWrapper';\n/* auto */ import { SimpleUtil512TestCollection, notifyUserIfDebuggerIsSetToAllExceptions } from './testUtils';\n/* auto */ import { testCollectionUtil512Higher } from './../util512/testUtil512Higher';\n/* auto */ import { testCollectionUtil512Class } from './../util512/testUtil512Class';\n/* auto */ import { testCollectionUtil512Assert } from './../util512/testUtil512Assert';\n/* auto */ import { testCollectionUtil512 } from './../util512/testUtil512';\n/* auto */ import { testCollectionUI512TextSelectEvents } from './../util512ui/testUI512TextSelectEvents';\n/* auto */ import { testCollectionUI512TextModify } from './../util512ui/testUI512TextModify';\n/* auto */ import { testCollectionUI512TextEdit } from './../util512ui/testUI512TextEdit';\n/* auto */ import { testCollectionUI512Paint } from './../util512ui/testUI512Paint';\n/* auto */ import { testCollectionUI512MenuRender } from './../util512ui/testUI512MenuRender';\n/* auto */ import { testCollectionUI512FormattedText } from './../util512ui/testUI512FormattedText';\n/* auto */ import { testCollectionUI512ElementsViewButtons } from './../util512ui/testUI512ElementsViewButtons';\n/* auto */ import { testCollectionUI512Elements } from './../util512ui/testUI512Elements';\n/* auto */ import { testCollectionUI512DrawText } from './../util512ui/testUI512DrawText';\n/* auto */ import { testCollectionUI512Composites } from './../util512ui/testUI512Composites';\n/* auto */ import { testCollectionUI512CodeEditor } from './../util512ui/testUI512CodeEditor';\n/* auto */ import { testCollectionExternalLibs } from './../util512/testExternalLibs';\n/* auto */ import { testCollection03fnsStandalone } from './../vpc03/fns/test03standalone';\n/* auto */ import { testCollection03objectRenderName } from './../vpc03/test03objectRenderName';\n/* auto */ import { testCollection03lexer } from './../vpc03/test03lexer';\n/* auto */ import { testCollection03exprPseudoObjects } from './../vpc03/test03exprPseudoObjects';\n/* auto */ import { testCollection03exprObjectRef } from './../vpc03/test03exprObjectRef';\n/* auto */ import { testCollection03propsComputed } from './../vpc03/props/test03computed';\n/* auto */ import { testCollection03chunkBasic } from './../vpc03/test03chunkBasic';\n/* auto */ import { testCollection03chunkAdditional } from './../vpc03/test03chunkAdditional';\n/* auto */ import { testCollection03propsChunk } from './../vpc03/props/test03chunk';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * a very simple testing framework.\n */\nexport const SimpleUtil512Tests = /* static class */ {\n    async runTests(includeSlow: boolean) {\n        if (UI512ErrorHandling.runningTests) {\n            console.log('Apparently already running tests...');\n            return;\n        }\n\n        UI512ErrorHandling.runningTests = true;\n        console.log('Running tests...');\n\n        /* order tests from high to low */\n        let colls: SimpleUtil512TestCollection[] = [\n            /* testCollectionvpcuiServer, */\n            /* testCollectionScriptExtensiveIf */\n            testCollection03exprPseudoObjects,\n            testCollection03objectRenderName,\n            testCollection03exprObjectRef,\n            testCollection03fnsStandalone,\n            testCollection03propsChunk,\n            testCollection03propsComputed,\n            testCollection03chunkAdditional,\n            testCollection03chunkBasic,\n            testCollection03lexer,\n            testCollectionScriptExtensiveChunk,\n            testCollectionScriptRewrites,\n            testCollectionScriptRunCustomFns,\n            testCollectionScriptRunCmd,\n            testCollectionvpcScriptEval,\n            testCollectionvpcScriptRunSyntax,\n            testCollectionScriptExprLvl,\n            testCollectionvpcScriptParseCmd,\n            testCollectionvpcScriptParseExpr,\n            testCollectionvpcChunkResolution,\n            testCollectionvpcElements,\n            testCollectionvpcuiMsgBox,\n            testCollectionvpcuiIntroProvider,\n            testCollectionvpcVpcVal,\n            testCollectionUI512CodeEditor,\n            testCollectionUI512Composites,\n            testCollectionUI512DrawText,\n            testCollectionUI512Elements,\n            testCollectionUI512ElementsViewButtons,\n            testCollectionUI512FormattedText,\n            testCollectionUI512MenuRender,\n            testCollectionUI512Paint,\n            testCollectionUI512TextEdit,\n            testCollectionUI512TextModify,\n            testCollectionUI512TextSelectEvents,\n            testCollectionUtilsCanvasWrapper,\n            testCollectionUtilsDraw,\n            testCollectionUtil512Higher,\n            testCollectionUtil512Class,\n            testCollectionUtil512,\n            testCollectionUtil512Assert,\n            testCollectionExternalLibs\n        ];\n\n        if (!colls || !colls.length) {\n            console.log('no tests have been included.');\n            return;\n        }\n\n        /* run tests from low level to high level */\n        colls.reverse();\n        let colNamesSeen = new MapKeyToObjectCanSet<boolean>();\n        let mapSeen = new MapKeyToObjectCanSet<boolean>();\n\n        /* put slow tests after fast tests */\n        let slowTests = colls.filter(item => item.slow);\n        let fastTests = colls.filter(item => !item.slow);\n        colls = fastTests.concat(slowTests);\n        let countTotal = colls\n            .filter(item => includeSlow || !item.slow)\n            .map(item => item.tests.length)\n            .reduce(Util512.add);\n        countTotal += colls\n            .filter(item => includeSlow || !item.slow)\n            .map(item => item.atests.length)\n            .reduce(Util512.add);\n        let counter = new ValHolder(1);\n        await VpcIntroProvider.waitForDelayLoadedJs(undefined);\n        for (let coll of colls) {\n            if (colNamesSeen.exists(coll.name.toLowerCase())) {\n                assertTrue(false, 'O.|duplicate collection name', coll.name);\n            }\n\n            colNamesSeen.set(coll.name.toLowerCase(), true);\n            console.log(`Collection: ${coll.name}`);\n            if (includeSlow || !coll.slow) {\n                await this.runCollection(coll, countTotal, counter, mapSeen);\n            } else {\n                console.log('(Skipped)');\n            }\n        }\n\n        ScriptTestBatch.checkPending();\n        UI512ErrorHandling.runningTests = false;\n        if (UI512ErrorHandling.silenceWarnings) {\n            console.log(`A test may have failed, warning occurred.`);\n        } else {\n            console.log(`All tests complete.`);\n        }\n    },\n\n    /**\n     * run a collection of tests\n     */\n    async runCollection(\n        coll: SimpleUtil512TestCollection,\n        countTotal: number,\n        counter: ValHolder<number>,\n        mapSeen: MapKeyToObjectCanSet<boolean>\n    ) {\n        notifyUserIfDebuggerIsSetToAllExceptions();\n        assertWarn(\n            coll.tests.length > 0 || coll.atests.length > 0,\n            'O-|no tests in collection'\n        );\n\n        /* note that some tests require async tests to be done first. */\n        let tests: [string, VoidFn | AsyncFn][] = coll.atests;\n        tests = tests.concat(coll.tests);\n        for (let i = 0; i < tests.length; i++) {\n            let [tstname, tstfn] = tests[i];\n            if (mapSeen.exists(tstname.toLowerCase())) {\n                assertWarn(false, 'Or|duplicate test name', tstname);\n            }\n\n            /* it's totally fine to await on a synchronous fn. */\n            mapSeen.set(tstname.toLowerCase(), true);\n            console.log(`Test ${counter.val}/${countTotal}: ${tstname}`);\n            await tstfn();\n            counter.val += 1;\n        }\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/test/testUtils/testUtils.ts",
    "content": "\n/* auto */ import { AsyncFn, VoidFn } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512ErrorHandling, assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, util512Sort } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * assert that an exception is thrown, with a certain message\n */\nexport async function assertThrowsAsync<T>(\n    msgWithMark: string,\n    expectedErr: string,\n    fn: () => Promise<T>\n) {\n    let msg: O<string>;\n    try {\n        await fn();\n    } catch (e) {\n        msg = e.message ? e.message : '';\n    }\n\n    assertTrue(msg !== undefined, `JC|did not throw ${msgWithMark}`);\n    assertTrue(\n        msg !== undefined && msg.includes(expectedErr),\n        `JB|message \"${msg}\" did not contain \"${expectedErr}\" ${msgWithMark}`\n    );\n}\n\n/**\n * assert that an exception is thrown, with a certain message\n */\nexport function assertThrows(msgWithMark: string, expectedErr: string, fn: VoidFn) {\n    let msg: O<string>;\n\n    try {\n        fn();\n    } catch (e) {\n        msg = e.message ?? '';\n    }\n\n    assertTrue(msg !== undefined, `O?|did not throw`, msgWithMark);\n    assertTrue(\n        msg !== undefined && msg.includes(expectedErr),\n        `O>|message \"${msg}\" did not contain \"${expectedErr}\"`,\n        msgWithMark\n    );\n}\n\n/**\n * assert that an assertion is thrown\n */\nexport function assertAsserts(msgWithMark: string, expectedErr: string, fn: VoidFn) {\n    let msg: O<string>;\n    let svd = UI512ErrorHandling.silenceAssertMsgs;\n    UI512ErrorHandling.silenceAssertMsgs = true;\n    try {\n        fn();\n    } catch (e) {\n        msg = e.message ?? '';\n    } finally {\n        UI512ErrorHandling.silenceAssertMsgs = svd;\n    }\n\n    assertTrue(msg !== undefined, `3{|did not throw`, msgWithMark);\n    assertTrue(\n        msg.toLowerCase().includes('assert:'),\n        `O=|not an assertion exception`,\n        msgWithMark\n    );\n    assertTrue(\n        msg !== undefined && msg.includes(expectedErr),\n        `9d|message \"${msg}\" did not contain \"${expectedErr}\"`,\n        msgWithMark\n    );\n}\n\n/**\n * test-only code, since this is inefficient\n */\nexport function sorted(ar: any[]) {\n    let arCopy = ar.slice();\n    arCopy.sort(util512Sort);\n    return arCopy;\n}\n\n/**\n * test-only code, to avoid type casts\n */\nexport function YetToBeDefinedTestHelper<T>(): T {\n    return (undefined as any) as T;\n}\n\n/**\n * if the debugger is set to All Exceptions,\n * you will see a lot of false positives\n */\nexport function notifyUserIfDebuggerIsSetToAllExceptions() {\n    assertThrows('L||', 'intentionally throw', () => {\n        throw new Error(\n            `1!|It looks like the debugger is set to break\n            on 'All Exceptions'... you probably want to turn this off because\n            many tests intentionally throw exceptions.`\n        );\n    });\n}\n\n/**\n * a collection of tests\n */\nexport class SimpleUtil512TestCollection {\n    constructor(public name: string, public slow = false) {}\n    tests: [string, VoidFn][] = [];\n    atests: [string, AsyncFn][] = [];\n    _context = '';\n\n    /**\n     * add a non-async test to the collection\n     */\n    public test(s: string, fn: VoidFn) {\n        this.tests.push([s, fn]);\n        return this;\n    }\n\n    /**\n     * add an async test to the collection\n     */\n    public atest(s: string, fn: AsyncFn) {\n        this.atests.push([s, fn]);\n        return this;\n    }\n\n    /**\n     * writes a string to the console,\n     * often used to indicate that a test is divided into subtests.\n     */\n    public say(context: string) {\n        this._context = context;\n        console.log(Util512.repeat(25, ' ').join('') + this._context);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/testUtils/testUtilsCanvas.ts",
    "content": "\n/* auto */ import { CanvasWrapper, DrawableImage } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { clrThreshold } from './../../ui512/draw/ui512DrawPainter';\n/* auto */ import { bridgedSaveAs } from './../../bridge/bridgeFileSaver';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tools for testing code that draws to a canvas\n */\nexport class TestUtilsCanvas {\n    /**\n     * compare an image to a known-good expected image.\n     * uses a temporary in-memory canvas to read pixels of the image\n     * optionally highlight the different pixels in red.\n     */\n    static compareCanvas(\n        imageExpected: DrawableImage,\n        imageGot: CanvasWrapper,\n        width: number,\n        height: number,\n        drawRed: boolean\n    ) {\n        let cvExpected = CanvasWrapper.createMemoryCanvas(width, height);\n        cvExpected.drawFromImage(\n            imageExpected,\n            0,\n            0,\n            width,\n            height,\n            0,\n            0,\n            0,\n            0,\n            width,\n            height\n        );\n        let dataExpected = cvExpected.context.getImageData(0, 0, width, height);\n        let dataGot = imageGot.context.getImageData(0, 0, width, height);\n        assertEq(dataExpected.data.length, dataGot.data.length, '3w|');\n        assertEq(dataExpected.data.length, 4 * width * height, '3v|');\n        let countDifferences = TestUtilsCanvas.drawDifferencesInRed(\n            dataExpected,\n            dataGot,\n            drawRed\n        );\n        if (drawRed) {\n            imageGot.context.putImageData(dataGot, 0, 0);\n        }\n\n        return countDifferences;\n    }\n\n    /**\n     * draw different pixels in red.\n     */\n    private static drawDifferencesInRed(\n        dataExpected: ImageData,\n        dataGot: ImageData,\n        drawRed: boolean\n    ) {\n        let countDifferences = 0;\n        for (let i = 0; i < dataExpected.data.length; i += 4) {\n            let expected = TestUtilsCanvas.getColorFromCanvasData(dataExpected.data, i);\n            let got = TestUtilsCanvas.getColorFromCanvasData(dataGot.data, i);\n\n            /* for these tests, white and transparent compare equal */\n            expected = expected === 't' ? 'w' : expected;\n            got = got === 't' ? 'w' : got;\n            if (expected !== got) {\n                if (drawRed && expected === 'w') {\n                    /* draw red if it should have been white */\n                    dataGot.data[i] = 255;\n                    dataGot.data[i + 1] = 0;\n                    dataGot.data[i + 2] = 0;\n                    dataGot.data[i + 3] = 255;\n                } else if (drawRed) {\n                    /* draw blue if it should have been black */\n                    dataGot.data[i] = 0;\n                    dataGot.data[i + 1] = 0;\n                    dataGot.data[i + 2] = 255;\n                    dataGot.data[i + 3] = 255;\n                }\n\n                countDifferences++;\n            }\n        }\n\n        return countDifferences;\n    }\n\n    /**\n     * run the callback repeatedly until both imExpected loads and\n     * imGot's RenderComplete is done.\n     */\n    private static async callDrawUntilRenderComplete(\n        p: CanvasTestParams,\n        imExpected: HTMLImageElement\n    ) {\n        let imGot = CanvasWrapper.createMemoryCanvas(p.width, p.height);\n        let finished = false;\n        for (let i = 0; i < p.maxCalls; i++) {\n            if (imExpected.complete) {\n                let complete = new RenderComplete();\n                let ret = p.draw(imGot, complete);\n                assertTrue(\n                    ret === undefined || ret === null,\n                    \"3u|please don't return anything from fnDraw\"\n                );\n                if (complete.complete) {\n                    finished = true;\n                    break;\n                }\n            }\n\n            imGot.clear();\n            await Util512Higher.sleep(100);\n        }\n\n        if (!finished) {\n            alert('timed out waiting for images to load...');\n            assertTrue(false, '3t|test failed, timed out');\n            throw new Error('test failed, timed out');\n        }\n\n        return imGot;\n    }\n\n    /**\n     * render image an compare it with expected\n     * if different, offer to download an image showing differences in red\n     */\n    private static async RenderAndCompareImage(\n        download: boolean,\n        fnGetDrawParams: GetDrawParams\n    ) {\n        let p = fnGetDrawParams();\n        let imExpected = new Image();\n        Util512Higher.beginLoadImage(p.urlImgExpected, imExpected, () => {});\n        let imGot = await TestUtilsCanvas.callDrawUntilRenderComplete(p, imExpected);\n\n        if (download) {\n            console.log('Image sent to download, test complete.');\n            imGot.canvas.toBlob((blob: any) => {\n                bridgedSaveAs()(blob, 'test' + p.testName + '.png');\n            });\n        } else {\n            let countDifferences = TestUtilsCanvas.compareCanvas(\n                imExpected,\n                imGot,\n                p.width,\n                p.height,\n                true\n            );\n            if (countDifferences === p.expectDifferentPixels) {\n                console.log(`\\t\\ttest ${p.testName} passed`);\n            } else {\n                let ratioWrong = countDifferences / (p.width * p.height);\n                console.log(\n                    `${p.testName} failed, ${countDifferences} pixels ${\n                        100 * ratioWrong\n                    }% do not match.`\n                );\n\n                console.log('Delta image sent to download, failures marked in red.');\n                imGot.canvas.toBlob((blob: any) => {\n                    bridgedSaveAs()(blob, `failed${p.testName}.png`);\n                });\n\n                assertTrue(false, '3r|test failed');\n            }\n        }\n    }\n\n    /**\n     * run RenderAndCompareImage on an array\n     * we can do tests in parallel, faster than waiting for each individually\n     */\n    static async RenderAndCompareImages(\n        download: boolean,\n        fnGetDrawParams: GetDrawParams | GetDrawParams[]\n    ) {\n        if (fnGetDrawParams instanceof Array) {\n            let promises = fnGetDrawParams.map(f =>\n                TestUtilsCanvas.RenderAndCompareImage(download, f)\n            );\n            return Promise.all(promises);\n        } else {\n            return TestUtilsCanvas.RenderAndCompareImage(download, fnGetDrawParams);\n        }\n    }\n\n    /**\n     * get black, white, or transparent. other colors return rgba tuple.\n     */\n    private static getColorFromCanvasData(data: Uint8ClampedArray, i: number) {\n        assertTrue(data[i] !== undefined, '3!|point not defined');\n        const clrLarge = 256 - clrThreshold;\n        if (data[i + 3] < clrThreshold) {\n            return 't';\n        } else if (\n            data[i] > clrLarge &&\n            data[i + 1] > clrLarge &&\n            data[i + 2] > clrLarge\n        ) {\n            return 'w';\n        } else if (\n            data[i] < clrThreshold &&\n            data[i + 1] < clrThreshold &&\n            data[i + 2] < clrThreshold\n        ) {\n            return 'b';\n        } else {\n            return `other(${data[i]},${data[i + 1]},${data[i + 2]},${data[i + 3]})`;\n        }\n    }\n}\n\n/**\n * a test that compares the results with a known-good png\n */\nexport class CanvasTestParams {\n    constructor(\n        public testName: string,\n        public urlImgExpected: string,\n        /* we'll run the callback repeatedly until complete flag returns true */\n        public draw: (canvas: CanvasWrapper, complete: RenderComplete) => void,\n        public width: number,\n        public height: number,\n        /* is this a unit test, or did user start the test explicitly\n        by clicking on a button? */\n        public uiContext: boolean,\n        /* used for testing the test infrastructure */\n        public expectDifferentPixels = 0\n    ) {}\n\n    readonly maxCalls = 500;\n}\n\n/**\n * a function that returns a CanvasTestParams\n */\nexport type GetDrawParams = () => CanvasTestParams;\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoBasic.ts",
    "content": "\n/* auto */ import { getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { RepeatingTimer } from './../../ui512/utils/util512Higher';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { IdleEventDetails, MouseEnterDetails, MouseLeaveDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoBasic\n *\n * A \"demo\" project showing how to use UI512\n */\nexport class UI512DemoBasic extends UI512Presenter {\n    timer = new RepeatingTimer(2000);\n    counter = 0;\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n\n        let clientRect = getUI512WindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        let grp = new UI512ElGroup('grpmain');\n        this.app.addGroup(grp);\n        this.inited = true;\n\n        let btn1 = new UI512ElButton('btn1');\n        grp.addElement(this.app, btn1);\n        btn1.set('labeltext', 'abc\\n12345678\\nFile');\n        btn1.setDimensions(300, 80, 90, 90);\n\n        let btn2 = new UI512ElButton('btn2');\n        grp.addElement(this.app, btn2);\n        btn2.set('labeltext', 'pulsating');\n        btn2.setDimensions(100, 90, 90, 90);\n\n        this.invalidateAll();\n\n        this.listenEvent(UI512EventType.MouseEnter, (_: object, d: MouseEnterDetails) => {\n            if (d.el && d.el.id === 'btn1') {\n                UI512CursorAccess.setCursor(UI512Cursors.hand);\n            }\n        });\n\n        this.listenEvent(UI512EventType.MouseLeave, (_: object, d: MouseLeaveDetails) => {\n            if (d.el && d.el.id === 'btn1') {\n                UI512CursorAccess.setCursor(UI512Cursors.arrow);\n            }\n        });\n\n        this.listenEvent(UI512EventType.Idle, (_: object, d: IdleEventDetails) => {\n            this.timer.update(d.milliseconds);\n            if (this.timer.isDue()) {\n                this.timer.reset();\n                let getbtn2 = cast(UI512ElButton, this.app.getEl('btn2'));\n                getbtn2.set(\n                    'labeltext',\n                    getbtn2.getS('labeltext') === 'pulsating'\n                        ? 'pulsating...'\n                        : 'pulsating'\n                );\n            }\n        });\n\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoBasic.respondMouseUp);\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMouseUp(pr: UI512DemoBasic, d: MouseUpEventDetails) {\n        if (d.button !== 0) {\n            return;\n        }\n\n        if (d.elClick) {\n            console.log('hello from ' + d.elClick.id);\n            if (d.elClick.id === 'btn1') {\n                pr.counter += 1;\n\n                let btn1 = cast(UI512ElButton, d.elClick);\n                btn1.set('labeltext', 'counter: ' + pr.counter.toString());\n                btn1.setDimensions(btn1.x + 10, btn1.y + 10, btn1.w, btn1.h);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoButtons.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { KeyDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { TestDrawUI512Buttons } from './../util512ui/testUI512ElementsViewButtons';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoButtons\n *\n * A \"demo\" project showing several buttons with different properties and\n * icons. There are vertical lines in the background to verify transparency.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ to confirm that manually\n * interacting with the buttons has the expected behavior\n */\nexport class UI512DemoButtons extends UI512Presenter {\n    counter = 0;\n    isCurrentlyResizingButton = false;\n    btnstyleindex = 0;\n    drawEnabledStyle = true;\n    testrunner: TestDrawUI512Buttons;\n\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        let grp = new UI512ElGroup('grpmain');\n        this.app.addGroup(grp);\n        this.inited = true;\n\n        this.testrunner = new TestDrawUI512Buttons();\n        this.testrunner.uiContext = true;\n        let list: UI512ElButton[] = [];\n        this.testrunner.addBackgroundButtons(\n            this.app,\n            grp,\n            list,\n            clientRect[0],\n            clientRect[1]\n        );\n        this.testrunner.addButtons(\n            this.app,\n            grp,\n            list,\n            clientRect[0],\n            clientRect[1],\n            false,\n            false,\n            'btns'\n        );\n\n        let testBtns = ['DldImage', 'RunTest', 'Disable'];\n        let layoutTestBtns = new GridLayout(710, 378, 65, 15, testBtns, [1], 5, 5);\n        layoutTestBtns.createElems(\n            this.app,\n            grp,\n            'btn',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        this.invalidateAll();\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoButtons.respondMouseUp);\n        this.listenEvent(UI512EventType.MouseMove, UI512DemoButtons.respondMouseMove);\n        this.listenEvent(UI512EventType.KeyUp, UI512DemoButtons.respondKeyUp);\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMouseUp(pr: UI512DemoButtons, d: MouseUpEventDetails) {\n        if (d.button !== 0) {\n            return;\n        }\n        if (!d.elClick) {\n            return;\n        }\n\n        console.log('clicked on ' + d.elClick.id);\n        if (d.elClick.id === 'btnDldImage') {\n            Util512Higher.syncToAsyncTransition(\n                TestUtilsCanvas.RenderAndCompareImages(true, () =>\n                    pr.testrunner.testDrawButtons()\n                ),\n                'demobuttons',\n                RespondToErr.Alert\n            );\n        } else if (d.elClick.id === 'btnRunTest') {\n            Util512Higher.syncToAsyncTransition(\n                TestUtilsCanvas.RenderAndCompareImages(false, () =>\n                    pr.testrunner.testDrawButtons()\n                ),\n                'demobuttons',\n                RespondToErr.Alert\n            );\n        } else if (d.elClick.id === 'btnDisable') {\n            pr.drawEnabledStyle = !pr.drawEnabledStyle;\n            let grp = pr.app.getGroup('grpmain');\n            for (let el of grp.iterEls()) {\n                if (el.id.startsWith('btnnumber')) {\n                    cast(UI512ElButton, el).set('enabled', pr.drawEnabledStyle);\n                    cast(UI512ElButton, el).set('enabledstyle', pr.drawEnabledStyle);\n                }\n            }\n        }\n    }\n\n    protected static respondKeyUp(pr: UI512DemoButtons, d: KeyDownEventDetails) {\n        if (d.keyChar === 'k' && d.mods === ModifierKeys.Cmd) {\n            pr.isCurrentlyResizingButton = !pr.isCurrentlyResizingButton;\n            console.log('Resizing is ' + (pr.isCurrentlyResizingButton ? 'on' : 'off'));\n        }\n    }\n\n    protected static respondMouseMove(pr: UI512DemoButtons, d: MouseMoveEventDetails) {\n        if (pr.isCurrentlyResizingButton) {\n            let clientRect = getUI512WindowBounds();\n            let newW = d.mouseX - clientRect[0];\n            let newH = d.mouseY - clientRect[1];\n            newW = Math.max(1, newW);\n            newH = Math.max(1, newH);\n\n            let grp = pr.app.getGroup('grpmain');\n            for (let el of grp.iterEls()) {\n                if (el.id.startsWith('btntest')) {\n                    el.setDimensions(el.x, el.y, newW, newH);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoComposites.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { UI512CompStdDialogType } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { TestDrawUI512Composites, UI512TestCompositesPresenter } from './../util512ui/testUI512Composites';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoComposites\n *\n * A \"demo\" project showing several composites. (A composite is a\n * group of ui512 elements that are closely related, like a dialog box).\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ to confirm that manually\n * interacting with the buttons has the expected behavior\n */\nexport class UI512DemoComposites extends UI512TestCompositesPresenter {\n    test = new TestDrawUI512Composites();\n\n    init() {\n        super.init();\n\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        this.inited = true;\n        this.test.addElements(this, clientRect);\n        this.test.uiContext = true;\n        let grp = this.app.getGroup('grp');\n\n        let testBtns = ['WhichChecked', 'RunTest', 'DldImage', 'Dlg1', 'Dlg2', 'DlgAsk'];\n        let layoutTestBtns = new GridLayout(\n            clientRect[0] + 10,\n            clientRect[1] + 330,\n            100,\n            15,\n            testBtns,\n            [1],\n            5,\n            5\n        );\n        layoutTestBtns.createElems(\n            this.app,\n            grp,\n            'btn',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        this.invalidateAll();\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoComposites.respondMouseUp);\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMouseUp(pr: UI512DemoComposites, d: MouseUpEventDetails) {\n        if (d.elClick && d.button === 0) {\n            if (d.elClick.id === 'btnDldImage') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(true, () =>\n                        pr.test.testDrawComposites()\n                    ),\n                    'democomposite',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnRunTest') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n                        pr.test.testDrawComposites()\n                    ),\n                    'democomposite',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnWhichChecked') {\n                console.log('Fruit: ' + pr.testRadioBtns.getWhichChecked(pr.app));\n                console.log('Food: ' + pr.testCheckBtns.getWhichChecked(pr.app));\n                console.log('Tool: ' + pr.testToolbox.getWhich());\n            } else if (d.elClick.id === 'btnDlg1') {\n                pr.testModalDlg.dlgType = UI512CompStdDialogType.Answer;\n                pr.testModalDlg.btnLabels = ['', '', ''];\n                pr.testModalDlg.create(pr, pr.app);\n                pr.testModalDlg.showStandardModalDialog(pr, pr.app, n =>\n                    pr.gotFromDlg(n)\n                );\n            } else if (d.elClick.id === 'btnDlg2') {\n                pr.testModalDlg.dlgType = UI512CompStdDialogType.Answer;\n                pr.testModalDlg.btnLabels = ['Ch A', 'Ch B', 'Ch C'];\n                pr.testModalDlg.create(pr, pr.app);\n                pr.testModalDlg.showStandardModalDialog(pr, pr.app, n =>\n                    pr.gotFromDlg(n)\n                );\n            } else if (d.elClick.id === 'btnDlgAsk') {\n                pr.testModalDlg.dlgType = UI512CompStdDialogType.Ask;\n                pr.testModalDlg.btnLabels = ['OK', 'Cancel'];\n                pr.testModalDlg.create(pr, pr.app);\n                pr.testModalDlg.showStandardModalDialog(pr, pr.app, n =>\n                    pr.gotFromDlg(n)\n                );\n            }\n\n            pr.testCheckBtns.respondMouseUp(pr.app, d);\n            pr.testRadioBtns.respondMouseUp(pr.app, d);\n            pr.testToolbox.respondMouseUp(pr.app, d);\n        }\n    }\n\n    gotFromDlg(n: number) {\n        console.log(`you clicked on choice \"${this.testModalDlg.btnLabels[n]}\".`);\n        if (this.testModalDlg.resultText) {\n            console.log(`you typed ${this.testModalDlg.resultText}`);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoMenus.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { MenuPositioning } from './../../ui512/menu/ui512MenuPositioning';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { MenuItemClickedDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { TestDrawUI512Menus } from './../util512ui/testUI512MenuRender';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoMenus\n *\n * A \"demo\" project showing a menubar.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ to confirm that manually\n * interacting with the menus has the expected behavior\n */\nexport class UI512DemoMenus extends UI512Presenter {\n    test = new TestDrawUI512Menus();\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        this.inited = true;\n        this.test.addElements(this, '(background)', clientRect);\n        this.test.uiContext = true;\n\n        let grp = this.app.getGroup('grp');\n        let btn1 = new UI512ElButton('btn1');\n        grp.addElement(this.app, btn1);\n        btn1.set('labeltext', 'abc');\n        btn1.setDimensions(300, 300, 90, 25);\n\n        let btnDldImage = new UI512ElButton('btnDldImage');\n        grp.addElement(this.app, btnDldImage);\n        btnDldImage.set('labeltext', 'dld test');\n        btnDldImage.setDimensions(clientRect[0] + 20, clientRect[1] + 100, 65, 15);\n\n        let btnRunTest = new UI512ElButton('btnRunTest');\n        grp.addElement(this.app, btnRunTest);\n        btnRunTest.set('labeltext', 'run test');\n        btnRunTest.setDimensions(clientRect[0] + 20, clientRect[1] + 150, 65, 15);\n\n        this.invalidateAll();\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoMenus.respondMouseUp);\n        this.listenEvent(\n            UI512EventType.MenuItemClicked,\n            UI512DemoMenus.respondMenuItemClick\n        );\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMenuItemClick(pr: UI512DemoMenus, d: MenuItemClickedDetails) {\n        console.log('clicked on menuitem ' + d.id);\n        let idsInList = 'mnuOptFirst|mnuOptSecond|mnuOptThird'.split('|');\n        let grpItems = MenuPositioning.getMenuGroups(pr.app)[1];\n        if (idsInList.indexOf(d.id) !== -1) {\n            for (let idInList of idsInList) {\n                let item = grpItems.getEl(idInList);\n                item.set('checkmark', d.id === item.id);\n            }\n        }\n    }\n\n    protected static respondMouseUp(pr: UI512DemoMenus, d: MouseUpEventDetails) {\n        if (d.elClick && d.button === 0) {\n            if (d.elClick.id === 'btn1') {\n                let btn1 = cast(UI512ElButton, d.elClick);\n                btn1.set('labeltext', 'changed');\n            } else if (d.elClick.id === 'btnDldImage') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(true, () =>\n                        pr.test.testDrawMenus()\n                    ),\n                    'demomenus',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnRunTest') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n                        pr.test.testDrawMenus()\n                    ),\n                    'demomenus',\n                    RespondToErr.Alert\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoPaint.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertEq, cast } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { IdleEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { FloodFillTest } from './../util512ui/testUI512PaintFlood';\n/* auto */ import { TestDrawUI512Paint, UI512TestPaintPresenter } from './../util512ui/testUI512Paint';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoPaint\n *\n * A \"demo\" project showing several painted shapes.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_, and test drag/drop,\n * and click Download Image to update the test\n */\nexport class UI512DemoPaint extends UI512TestPaintPresenter {\n    test = new TestDrawUI512Paint();\n    fltest = new FloodFillTest();\n    mouseDragDropOffset: [number, number] = [0, 0];\n\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        this.inited = true;\n        this.test.addElements(this, clientRect);\n        this.test.uiContext = true;\n\n        let grp = this.app.getGroup('grp');\n\n        let testBtns = ['RunTest', 'DldImage', 'RunTestFill', 'DldImageFill', 'TestDrag'];\n        let layoutTestBtns = new GridLayout(\n            clientRect[0] + 10,\n            clientRect[1] + 330,\n            100,\n            15,\n            testBtns,\n            [1],\n            5,\n            5\n        );\n        layoutTestBtns.createElems(\n            this.app,\n            grp,\n            'btn',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        let elfloodtest = new UI512ElCanvasPiece('elfloodtest');\n        grp.addElement(this.app, elfloodtest);\n        elfloodtest.setCanvas(this.fltest.start());\n        elfloodtest.setDimensions(\n            700,\n            50,\n            elfloodtest.getCvWidth(),\n            elfloodtest.getCvHeight()\n        );\n\n        this.invalidateAll();\n        this.listenEvent(UI512EventType.MouseDown, UI512DemoPaint.respondMouseDown);\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoPaint.respondMouseUp);\n        this.listenEvent(UI512EventType.MouseMove, UI512DemoPaint.respondMouseMove);\n        this.listenEvent(UI512EventType.Idle, UI512DemoPaint.respondOnIdle);\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMouseDown(pr: UI512DemoPaint, d: MouseDownEventDetails) {\n        if (d.el && d.button === 0) {\n            if (d.el.id === 'btnTestDrag') {\n                assertEq('btnTestDrag', pr.trackClickedIds[0], '1U|');\n                pr.beginDragDrop(d.mouseX, d.mouseY, d.el);\n            }\n        }\n    }\n\n    protected static respondMouseUp(pr: UI512DemoPaint, d: MouseUpEventDetails) {\n        pr.isDragging = false;\n        if (d.elClick && d.button === 0) {\n            if (d.elClick.id === 'btnDldImage') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(true, () =>\n                        pr.test.testDrawShape()\n                    ),\n                    'demopaint',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnRunTest') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n                        pr.test.testDrawShape()\n                    ),\n                    'demopaint',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnDldImageFill') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(true, () =>\n                        pr.test.testDrawFloodFill()\n                    ),\n                    'demopaint',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnRunTestFill') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n                        pr.test.testDrawFloodFill()\n                    ),\n                    'demopaint',\n                    RespondToErr.Alert\n                );\n            }\n        }\n\n        pr.mouseDragDropOffset = [0, 0];\n    }\n\n    protected static respondOnIdle(pr: UI512DemoPaint, d: IdleEventDetails) {\n        if (!pr.fltest.isDone) {\n            let grp = pr.app.getGroup('grp');\n            let elfloodtest = cast(UI512ElCanvasPiece, grp.getEl('elfloodtest'));\n            pr.fltest.floodFillTest(elfloodtest.getCanvasForWrite());\n        }\n    }\n\n    isDragging = false;\n    beginDragDrop(x: number, y: number, el: UI512Element) {\n        this.mouseDragDropOffset = [x - el.x, y - el.y];\n        this.isDragging = true;\n    }\n\n    static respondMouseMove(pr: UI512DemoPaint, d: MouseMoveEventDetails) {\n        if (pr.isDragging && pr.trackPressedBtns[0]) {\n            let el = pr.app.findEl(pr.trackClickedIds[0]);\n            if (el) {\n                let newX = d.mouseX - pr.mouseDragDropOffset[0];\n                let newY = d.mouseY - pr.mouseDragDropOffset[1];\n                el.setDimensions(newX, newY, el.w, el.h);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoText.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { Util512, cast, castVerifyIsNum, longstr } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontStyling, stringToTextFontStyling, textFontStylingToString } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { TestDrawUI512Text } from './../util512ui/testUI512DrawText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoText\n *\n * A \"demo\" project showing text drawn in many fonts and alignments\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ to test combinations\n * of styles and fonts, by clicking the buttons like Bold and Italic\n */\nexport class UI512DemoText extends UI512Presenter {\n    typeface = 'geneva';\n    style: TextFontStyling = TextFontStyling.Default;\n    demoText =\n        'File Edit Tools\\n123 This is really good, it looks right to me! :) ^^ ### mniv';\n    mixSizes = false;\n    testrunner: TestDrawUI512Text;\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n        this.testrunner = new TestDrawUI512Text();\n        this.testrunner.uiContext = true;\n\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        let grp = new UI512ElGroup('grpmain');\n        this.app.addGroup(grp);\n        this.inited = true;\n\n        /* choose a font */\n        let fonts = 'chicago,courier,geneva,new york,times,helvetica,monaco,symbol'.split(\n            /,/\n        );\n        let layout = new GridLayout(65, 70, 70, 15, fonts, [1], 5, 5);\n        layout.createElems(\n            this.app,\n            grp,\n            'btnSetFont:',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        /* choose a style */\n        let styles = 'biuosdce'.split('');\n        let layoutv = new GridLayout(70, 90, 40, 15, [1], styles, 5, 5);\n        layoutv.createElems(\n            this.app,\n            grp,\n            'btnSetStyle:',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        /* choose alteration */\n        let attributes = longstr(\n            `narrow,valign,halign,wrap,mixsizes,\n            testdld1,testdld2,testdld3,testdld4,testdld5,testdld6`,\n            ''\n        ).split(/,/);\n        layoutv = new GridLayout(130, 90, 65, 15, [1], attributes, 5, 5);\n        layoutv.createElems(\n            this.app,\n            grp,\n            'btnSetAttr:',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        /* caption: */\n        let caption = new UI512ElButton('caption');\n        grp.addElement(this.app, caption);\n        caption.set('style', UI512BtnStyle.Opaque);\n        caption.setDimensions(54, 350, 220, 18);\n\n        let sayrightclick = new UI512ElButton('sayrightclick');\n        grp.addElement(this.app, sayrightclick);\n        sayrightclick.set('style', UI512BtnStyle.Opaque);\n        sayrightclick.set('labeltext', 'right-click testdldx to run test');\n        sayrightclick.setDimensions(54, 370, 220, 18);\n\n        let mainfield = new UI512ElButton('mainfield');\n        grp.addElement(this.app, mainfield);\n        mainfield.setDimensions(300, 120, 400, 250);\n        this.drawTextDemo();\n        this.invalidateAll();\n\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoText.respondMouseUp);\n        this.rebuildFieldScrollbars();\n    }\n\n    drawTextDemo() {\n        let s = this.typeface + ' ';\n        s += textFontStylingToString(this.style);\n\n        let demo = '';\n        let listSizes = '10,12,14,18,24'.split(/,/g);\n        let delim = '\\n';\n        if (this.mixSizes) {\n            listSizes = '10,18,14,12,24'.split(/,/g);\n            delim = '';\n        }\n\n        if (\n            this.style === TextFontStyling.Default &&\n            (this.typeface.toLowerCase() === 'chicago' ||\n                this.typeface.toLowerCase() === 'geneva' ||\n                this.typeface.toLowerCase() === 'monaco')\n        ) {\n            listSizes.splice(0, 0, '9');\n        }\n\n        for (let size of listSizes) {\n            let font =\n                this.typeface + '_' + size + '_' + textFontStylingToString(this.style);\n            demo += UI512DrawText.setFont(this.demoText, font);\n            demo += delim;\n        }\n\n        let caption = cast(UI512ElButton, this.app.getEl('caption'));\n        caption.set('labeltext', s);\n\n        let mainfield = cast(UI512ElButton, this.app.getEl('mainfield'));\n        mainfield.set('labeltext', demo);\n    }\n\n    protected static respondMouseUp(pr: UI512DemoText, d: MouseUpEventDetails) {\n        /* if you rightclick we'll run the test, not just dld the image*/\n        let dldOnly = d.button === 0;\n        if (!d.elClick) {\n            return;\n        }\n\n        let mainfield = cast(UI512ElButton, pr.app.getEl('mainfield'));\n        if (d.elClick.id.startsWith('btnSetFont:')) {\n            pr.typeface = d.elClick.id.split(':')[1];\n        } else if (d.elClick.id.startsWith('btnSetStyle:')) {\n            let styleletter = d.elClick.id.split(':')[1];\n            let curStyle = textFontStylingToString(pr.style);\n            if (curStyle.includes('+' + styleletter)) {\n                curStyle = curStyle.replace(new RegExp('\\\\+' + styleletter), styleletter);\n            } else {\n                curStyle = curStyle.replace(new RegExp(styleletter), '+' + styleletter);\n            }\n            pr.style = stringToTextFontStyling(curStyle);\n        } else if (d.elClick.id.startsWith('btnSetAttr:')) {\n            let attr = d.elClick.id.split(':')[1];\n            if (attr === 'mixsizes') {\n                pr.mixSizes = !pr.mixSizes;\n            } else if (attr === 'wrap') {\n                mainfield.set('labelwrap', !mainfield.getB('labelwrap'));\n            } else if (attr === 'halign') {\n                mainfield.set('labelhalign', !mainfield.getB('labelhalign'));\n            } else if (attr === 'valign') {\n                mainfield.set('labelvalign', !mainfield.getB('labelvalign'));\n            } else if (attr === 'narrow') {\n                let newwidth = mainfield.w === 400 ? 100 : 400;\n                mainfield.setDimensions(mainfield.x, mainfield.y, newwidth, mainfield.h);\n            } else if (attr.startsWith('test')) {\n                Util512Higher.syncToAsyncTransition(\n                    pr.runTest(attr, dldOnly),\n                    'demotext',\n                    RespondToErr.Alert\n                );\n            }\n        }\n\n        pr.drawTextDemo();\n    }\n\n    async runTest(params: string, dldOnly: boolean) {\n        let demoTextTests = [\n            () => this.testrunner.draw1(),\n            () => this.testrunner.draw2(),\n            () => this.testrunner.draw3(),\n            () => this.testrunner.draw4()\n        ];\n\n        if (params === 'testdld5') {\n            return UI512DemoText.dldTest5(dldOnly);\n        } else if (params === 'testdld6') {\n            return UI512DemoText.dldTest6(dldOnly);\n        } else if (params.startsWith('testdld')) {\n            let testNumber = castVerifyIsNum(\n                Util512.parseInt(params.substr('testdld'.length))\n            );\n            return TestUtilsCanvas.RenderAndCompareImages(\n                dldOnly,\n                demoTextTests[testNumber - 1]\n            );\n        }\n    }\n\n    protected static async dldTest5(dldOnly: boolean) {\n        let testids = prompt(\n            longstr(`Please type in some test ids, separated by\n             commas, in the form (fontid)_(size). Or 'all'.`),\n            'symbol_9'\n        );\n        if (testids === 'all') {\n            /* runs them all in parallel */\n            let fns = new TestDrawUI512Text().drawTest5DrawAll();\n            await TestUtilsCanvas.RenderAndCompareImages(false /* dld */, fns);\n        } else if (testids) {\n            for (let pt of testids.split(',')) {\n                pt = pt.trim();\n                let pts = pt.split('_');\n                if (pts.length !== 2 || !pts[0] || !pts[1]) {\n                    alert('expected in the form chicago_12.');\n                } else {\n                    let [font, size] = pts;\n                    let params = new TestDrawUI512Text().drawTest5DrawOne(font, size);\n                    await TestUtilsCanvas.RenderAndCompareImages(dldOnly, () => params);\n                }\n            }\n        }\n    }\n\n    protected static async dldTest6(dldOnly: boolean) {\n        let testid = prompt(\n            \"Please type a test id or 'all'.\",\n            'underline__chicago_12+14'\n        );\n        if (testid === 'all') {\n            /* runs them all in parallel */\n            let fns = new TestDrawUI512Text().drawTest6DrawAll();\n            await TestUtilsCanvas.RenderAndCompareImages(false /* dld */, fns);\n        } else if (testid) {\n            let pts = testid.split('_');\n            if (pts.length !== 4) {\n                alert('unknown drawTest6 test');\n            } else {\n                let grayed = pts[1];\n                let font = pts[2];\n                let sizes = pts[3];\n                let params = new TestDrawUI512Text().drawTest6DrawOne(\n                    font,\n                    sizes,\n                    grayed\n                );\n                return TestUtilsCanvas.RenderAndCompareImages(dldOnly, () => params);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/ui512demo/uiDemoTextEdit.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { cast, longstr } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { KeyDownEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { TestDrawUI512TextEdit } from './../util512ui/testUI512TextEdit';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI512DemoTextEdit\n *\n * A \"demo\" project showing several text fields with different properties,\n * and containing different amounts of content.\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ to confirm that manually\n * interacting with the text fields has the expected behavior\n */\nexport class UI512DemoTextEdit extends UI512Presenter {\n    test = new TestDrawUI512TextEdit();\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n\n        let clientRect = this.getStandardWindowBounds();\n        this.app = new UI512Application(clientRect, this);\n        this.inited = true;\n        this.test.addElements(this, clientRect, true);\n        this.test.uiContext = true;\n\n        let grp = this.app.getGroup('grp');\n\n        /* run this after hitting toggle scroll a couple times\n        to make sure we're not leaking elements\n        i.e. if this number is continually increasing we\n        are leaking elements somewhere */\n        let testBtns = [\n            'DldWrap',\n            'DldNoWrap',\n            'ToggleScroll',\n            'Count Elems',\n            'WhichChoice'\n        ];\n        let layoutTestBtns = new GridLayout(\n            clientRect[0] + 10,\n            clientRect[1] + 330,\n            85,\n            15,\n            testBtns,\n            [1],\n            5,\n            5\n        );\n        layoutTestBtns.createElems(\n            this.app,\n            grp,\n            'btn',\n            UI512ElButton,\n            () => {},\n            true,\n            true\n        );\n\n        let testSelByLines = new UI512ElTextField('testSelByLines');\n        grp.addElement(this.app, testSelByLines);\n        testSelByLines.setDimensions(485, 270, 170, 80);\n        let choices = longstr(`choice 0,choice 1,choice\n        2 (another),choice 3,choice 4,choice 5,choice 6,choice 7`).split(',');\n        UI512ElTextField.setListChoices(testSelByLines, choices);\n\n        testSelByLines.set('scrollbar', true);\n        testSelByLines.set('selectbylines', true);\n        testSelByLines.set('multiline', true);\n        testSelByLines.set('canselecttext', true);\n        testSelByLines.set('canedit', false);\n        testSelByLines.set('labelwrap', false);\n\n        /* by setting selcaret to equal selend, this is making the initial choice blank */\n        testSelByLines.set('selcaret', 0);\n        testSelByLines.set('selend', 0);\n\n        this.invalidateAll();\n        this.listenEvent(UI512EventType.MouseUp, UI512DemoTextEdit.respondMouseUp);\n        this.listenEvent(UI512EventType.KeyDown, UI512DemoTextEdit.respondKeyDown);\n        this.rebuildFieldScrollbars();\n    }\n\n    protected static respondMouseUp(pr: UI512DemoTextEdit, d: MouseUpEventDetails) {\n        /* right-click to run the test */\n        let isDld = d.button === 0;\n        if (d.elClick) {\n            if (d.elClick.id === 'btnDldWrap') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(isDld, () =>\n                        pr.test.testDrawTextEdit(true)\n                    ),\n                    'demotextedit',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnDldNoWrap') {\n                Util512Higher.syncToAsyncTransition(\n                    TestUtilsCanvas.RenderAndCompareImages(isDld, () =>\n                        pr.test.testDrawTextEdit(false)\n                    ),\n                    'demotextedit',\n                    RespondToErr.Alert\n                );\n            } else if (d.elClick.id === 'btnToggleScroll') {\n                pr.test.toggleScroll(pr);\n            } else if (d.elClick.id === 'btnCount Elems') {\n                console.log(`# of elements === ${pr.app.getGroup('grp').countElems()}`);\n            } else if (d.elClick.id === 'btnWhichChoice') {\n                let grp = pr.app.getGroup('grp');\n                let el = cast(UI512ElTextField, grp.getEl('testSelByLines'));\n                let gel = new UI512ElTextFieldAsGeneric(el);\n                let whichLine = TextSelModify.selectByLinesWhichLine(gel);\n                console.log(`the chosen line is: ${whichLine} `);\n            }\n        }\n    }\n\n    protected static respondKeyDown(pr: UI512DemoTextEdit, d: KeyDownEventDetails) {\n        let el = TextSelModify.getSelectedField(pr);\n        if (el && el.getB('selectbylines')) {\n            return;\n        } else if (el && d.readableShortcut === 'Tab') {\n            pr.onTabKeyDown(el, d, false);\n        } else if (el && d.readableShortcut === 'Shift+Tab') {\n            pr.onTabKeyDown(el, d, true);\n        }\n    }\n\n    onTabKeyDown(el: O<UI512ElTextField>, d: KeyDownEventDetails, hasShift: boolean) {\n        if (el && el.getB('multiline') && el.getN('selcaret') === el.getN('selend')) {\n            /* simply insert a \\t */\n            if (!hasShift) {\n                let gel = new UI512ElTextFieldAsGeneric(el);\n                TextSelModify.changeTextInsert(gel, '\\t');\n            }\n        } else if (el && el.getB('multiline')) {\n            /* indent or dedent */\n            let gel = new UI512ElTextFieldAsGeneric(el);\n            TextSelModify.changeTextIndentation(gel, hasShift);\n        }\n\n        d.setHandled();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testExternalLibs.ts",
    "content": "\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { BridgedLRUMap } from './../../bridge/bridgeJsLru';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionExternalLibs');\nexport let testCollectionExternalLibs = t;\n\nt.test('JsLru', () => {\n    let testmap = new (BridgedLRUMap())<string, number>(3);\n    testmap.set('a', 1);\n    testmap.set('b', 2);\n    testmap.set('c', 3);\n    assertTrue(testmap.has('a'), '2B|');\n    assertTrue(testmap.has('b'), '2A|');\n    assertTrue(testmap.has('c'), '29|');\n    testmap.set('d', 4);\n    assertTrue(testmap.has('b'), '27|');\n    assertTrue(testmap.has('c'), '26|');\n    assertTrue(testmap.has('d'), '25|');\n    assertTrue(!testmap.has('a'), '28|');\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtil512.ts",
    "content": "\n/* auto */ import { checkThrowEq } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, OrderedHash, Util512, ValHolder, arLast, assertEq, cast, findStrToEnum, fitIntoInclusive, getEnumToStrOrFallback, getStrToEnum, longstr, slength, util512Sort } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows, sorted } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUtil512');\nexport let testCollectionUtil512 = t;\n\nt.test('ValHolder.param', () => {\n    function increment(vv: ValHolder<number>) {\n        vv.val += 1;\n    }\n\n    let v = new ValHolder(0);\n    increment(v);\n    assertEq(1, v.val, 'NR|');\n});\nt.test('ValHolder.closure', () => {\n    function increment() {\n        v.val += 1;\n    }\n\n    let v = new ValHolder(0);\n    increment();\n    assertEq(1, v.val, 'NQ|');\n});\nt.test('findStrToEnum.FoundPrimary', () => {\n    assertEq(TestEnum.First, findStrToEnum(TestEnum, 'First'), 'Dz|');\n    assertEq(TestEnum.Second, findStrToEnum(TestEnum, 'Second'), 'Dy|');\n    assertEq(TestEnum.Third, findStrToEnum(TestEnum, 'Third'), 'Dx|');\n});\nt.test('findStrToEnum.NotFound', () => {\n    assertEq(undefined, findStrToEnum(TestEnum, ''), 'Dw|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'F'), 'Dv|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'Firstf'), 'Du|');\n});\nt.test('findStrToEnum.YouShouldNotBeAbleToAccessFlags', () => {\n    assertEq(undefined, findStrToEnum(TestEnum, '__isUI512Enum'), 'Dt|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__UI512EnumCapitalize'), 'Ds|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__foo'), 'Dr|');\n});\nt.test('findStrToEnum.YouShouldNotBeAbleToDirectlyAccessAlts', () => {\n    assertEq(undefined, findStrToEnum(TestEnum, 'AlternateFormTheFirst'), 'NP|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'AlternateFormScnd'), 'NO|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'AlternateFormFoo'), 'NN|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateFormTheFirst'), 'NM|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateFormScnd'), 'NL|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateFormFoo'), 'NK|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateForm__TheFirst'), 'NJ|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateForm__Scnd'), 'Dp|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateForm__Foo'), 'Do|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'AlternateForm'), 'NI|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateForm'), 'NH|');\n    assertEq(undefined, findStrToEnum(TestEnum, '__AlternateForm__'), 'Dq|');\n});\nt.test('findStrToEnum.FirstLetterCaseInsensitive', () => {\n    assertEq(TestEnum.First, findStrToEnum(TestEnum, 'First'), 'Dn|');\n    assertEq(TestEnum.First, findStrToEnum(TestEnum, 'first'), 'Dm|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'firsT'), 'Dl|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'FirsT'), 'Dk|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'First '), 'Dj|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'Firstf'), 'Di|');\n    assertEq(undefined, findStrToEnum(TestEnum, 'Firs'), 'Dh|');\n});\nt.test('findStrToEnum.UseAlts', () => {\n    assertEq(TestEnum.First, findStrToEnum(TestEnum, 'First'), 'Dg|');\n    assertEq(TestEnum.First, findStrToEnum(TestEnum, 'TheFirst'), 'Df|');\n    assertEq(TestEnum.Second, findStrToEnum(TestEnum, 'Scnd'), 'De|');\n    assertEq(TestEnum.Third, findStrToEnum(TestEnum, 'Thd'), 'Dd|');\n});\nt.test('getEnumToStr.FoundPrimary', () => {\n    assertEq('first', getEnumToStrOrFallback(TestEnum, TestEnum.First), 'Dc|');\n    assertEq('second', getEnumToStrOrFallback(TestEnum, TestEnum.Second), 'Db|');\n    assertEq('third', getEnumToStrOrFallback(TestEnum, TestEnum.Third), 'Da|');\n});\nt.test('getEnumToStr.AlternatesHaveSameVal', () => {\n    assertEq(\n        'first',\n        getEnumToStrOrFallback(TestEnum, TestEnum.__AlternateForm__TheFirst),\n        'DZ|'\n    );\n    assertEq(\n        'second',\n        getEnumToStrOrFallback(TestEnum, TestEnum.__AlternateForm__Scnd),\n        'DY|'\n    );\n    assertEq(\n        'third',\n        getEnumToStrOrFallback(TestEnum, TestEnum.__AlternateForm__Thd),\n        'DX|'\n    );\n});\nt.test('getEnumToStr.NotFound', () => {\n    assertEq('Unknown', getEnumToStrOrFallback(TestEnum, -1), 'DW|');\n    assertEq('Unknown', getEnumToStrOrFallback(TestEnum, 999), 'DV|');\n});\nt.test('getEnumToStr.ShouldNotBeAbleToAccessFlags', () => {\n    assertEq('Unknown', getEnumToStrOrFallback(TestEnum, TestEnum.__isUI512Enum), 'DU|');\n    assertEq(\n        'Unknown',\n        getEnumToStrOrFallback(TestEnum, TestEnum.__UI512EnumCapitalize),\n        'DT|'\n    );\n});\nt.test('getStrToEnum.HasExpectedReturnType', () => {\n    /* check that the return value is the correct type.\n    unfortunately this seems to require manually entering the type\n    as a parameter, in the redundant form getStrToEnum<TestEnum>(TestEnum) */\n    function takesEnumVal(__unused_v: TestEnum) {}\n    let r = getStrToEnum<TestEnum>(TestEnum, 'TestEnum', 'First');\n    takesEnumVal(r);\n});\nt.test('getStrToEnum.FoundPrimary', () => {\n    assertEq(TestEnum.First, getStrToEnum(TestEnum, 'TestEnum', 'First'), 'DS|');\n    assertEq(TestEnum.Second, getStrToEnum(TestEnum, 'TestEnum', 'Second'), 'DR|');\n    assertEq(TestEnum.Third, getStrToEnum(TestEnum, 'TestEnum', 'Third'), 'DQ|');\n});\nt.test('getStrToEnum.ShowValuesInExceptionMsg', () => {\n    let excMessage = '';\n    try {\n        getStrToEnum(TestEnum, 'TestEnum', 'Firstf');\n    } catch (e) {\n        excMessage = e.toString();\n    }\n\n    let pts = excMessage.split(',');\n    pts.sort(util512Sort);\n    assertEq(` first`, pts[0], 'DP|');\n    assertEq(` second`, pts[1], 'DO|');\n    assertEq(` third (4E)`, pts[2], 'DN|');\n    assertTrue(pts[3].endsWith(`Not a valid choice of TestEnum. try one of`), 'DM|');\n});\nt.test('slength', () => {\n    assertEq(0, slength(null), 'NG|');\n    assertEq(0, slength(undefined), 'NF|');\n    assertEq(0, slength(''), 'NE|');\n    assertEq(3, slength('abc'), 'ND|');\n});\nt.test('cast', () => {\n    class Parent {\n        public a() {\n            return 'parent';\n        }\n    }\n    class Child extends Parent {\n        public a() {\n            return 'child';\n        }\n    }\n    class Other {\n        public a() {\n            return 'other';\n        }\n    }\n\n    let o1: unknown = new Parent();\n    assertEq('parent', cast(Parent, o1).a(), 'NC|');\n    o1 = new Child();\n    assertEq('child', cast(Parent, o1).a(), 'NB|');\n    o1 = new Other();\n    assertThrows('NA|', 'type cast exception', () => {\n        cast(Parent, o1);\n    });\n});\nt.test('isString', () => {\n    assertTrue(typeof '' === 'string', 'N9|');\n    assertTrue(typeof 'abc' === 'string', 'N8|');\n    assertTrue(typeof String('abc') === 'string', 'N7|');\n    assertTrue(typeof 123 !== 'string', 'N5|');\n    assertTrue(typeof null !== 'string', 'N4|');\n    assertTrue(typeof undefined !== 'string', 'N3|');\n    assertTrue(typeof ['a'] !== 'string', 'N2|');\n    /* ok to disable the warning, intentionally making a Object-style-string.\n    we now assume that these will never occur, so it's ok that\n    they aren't identified as strings. */\n    /* eslint-disable-next-line no-new-wrappers */\n    assertTrue(typeof new String('abc') !== 'string', 'N6|');\n});\nt.test('fitIntoInclusive.AlreadyWithin', () => {\n    assertEq(1, fitIntoInclusive(1, 1, 1), 'DL|');\n    assertEq(1, fitIntoInclusive(1, 1, 3), 'DK|');\n    assertEq(2, fitIntoInclusive(2, 1, 3), 'DJ|');\n    assertEq(3, fitIntoInclusive(3, 1, 3), 'DI|');\n});\nt.test('fitIntoInclusive.NeedToTruncate', () => {\n    assertEq(1, fitIntoInclusive(0, 1, 1), 'DH|');\n    assertEq(1, fitIntoInclusive(2, 1, 1), 'DG|');\n    assertEq(1, fitIntoInclusive(0, 1, 3), 'DF|');\n    assertEq(3, fitIntoInclusive(4, 1, 3), 'DE|');\n});\nt.test('util512Sort.String', () => {\n    assertEq(0, util512Sort('', ''), '1M|');\n    assertEq(0, util512Sort('a', 'a'), '1L|');\n    assertEq(1, util512Sort('abc', 'abb'), '1K|');\n    assertEq(-1, util512Sort('abb', 'abc'), '1J|');\n    assertEq(1, util512Sort('abcd', 'abc'), '1I|');\n    assertEq(-1, util512Sort('abc', 'abcd'), '1H|');\n});\nt.test('util512Sort.StringWithNonAscii', () => {\n    assertEq(0, util512Sort('aunicode\\u2666char', 'aunicode\\u2666char'), '1G|');\n    assertEq(1, util512Sort('aunicode\\u2667char', 'aunicode\\u2666char'), '1F|');\n    assertEq(-1, util512Sort('aunicode\\u2666char', 'aunicode\\u2667char'), '1E|');\n    assertEq(0, util512Sort('accented\\u00e9letter', 'accented\\u00e9letter'), '1D|');\n    assertEq(1, util512Sort('accented\\u00e9letter', 'accented\\u0065\\u0301letter'), '1C|');\n    assertEq(\n        -1,\n        util512Sort('accented\\u0065\\u0301letter', 'accented\\u00e9letter'),\n        '1B|'\n    );\n});\nt.test('util512Sort.Bool', () => {\n    assertEq(0, util512Sort(false, false), '1A|');\n    assertEq(0, util512Sort(true, true), '19|');\n    assertEq(1, util512Sort(true, false), '18|');\n    assertEq(-1, util512Sort(false, true), '17|');\n});\nt.test('util512Sort.Number', () => {\n    assertEq(0, util512Sort(0, 0), '16|');\n    assertEq(0, util512Sort(1, 1), '15|');\n    assertEq(0, util512Sort(12345, 12345), '14|');\n    assertEq(0, util512Sort(-11.15, -11.15), '13|');\n    assertEq(-1, util512Sort(0, 1), '12|');\n    assertEq(1, util512Sort(1, 0), '11|');\n    assertEq(1, util512Sort(1.4, 1.3), '10|');\n    assertEq(1, util512Sort(0, -1), '0~|');\n    assertEq(1, util512Sort(Number.POSITIVE_INFINITY, 12345), '0}|');\n    assertEq(-1, util512Sort(Number.NEGATIVE_INFINITY, -12345), '0||');\n});\nt.test('util512Sort.Nullish', () => {\n    assertEq(0, util512Sort(undefined, undefined), 'N1|');\n    assertEq(0, util512Sort(null, null), 'N0|');\n    assertThrows('M~|', 'not compare', () => util512Sort(null, undefined));\n    assertThrows('M}|', 'not compare', () => util512Sort(undefined, null));\n});\nt.test('util512Sort.DiffTypesShouldThrow', () => {\n    assertThrows('Le|', 'not compare', () => util512Sort('a', 1));\n    assertThrows('Ld|', 'not compare', () => util512Sort('a', true));\n    assertThrows('Lc|', 'not compare', () => util512Sort('a', undefined));\n    assertThrows('Lb|', 'not compare', () => util512Sort('a', []));\n    assertThrows('La|', 'not compare', () => util512Sort(1, 'a'));\n    assertThrows('LZ|', 'not compare', () => util512Sort(1, true));\n    assertThrows('LY|', 'not compare', () => util512Sort(1, undefined));\n    assertThrows('LX|', 'not compare', () => util512Sort(1, []));\n    assertThrows('LW|', 'not compare', () => util512Sort(true, 'a'));\n    assertThrows('LV|', 'not compare', () => util512Sort(true, 1));\n    assertThrows('LU|', 'not compare', () => util512Sort(true, undefined));\n    assertThrows('LT|', 'not compare', () => util512Sort(true, []));\n    assertThrows('LS|', 'not compare', () => util512Sort(undefined, 'a'));\n    assertThrows('LR|', 'not compare', () => util512Sort(undefined, 1));\n    assertThrows('LQ|', 'not compare', () => util512Sort(undefined, true));\n    assertThrows('LP|', 'not compare', () => util512Sort(undefined, []));\n    assertThrows('LO|', 'not compare', () => util512Sort([], 'a'));\n    assertThrows('LN|', 'not compare', () => util512Sort([], 1));\n    assertThrows('LM|', 'not compare', () => util512Sort([], true));\n    assertThrows('LL|', 'not compare', () => util512Sort([], undefined));\n});\nt.test('util512Sort.DiffTypesInArrayShouldThrow', () => {\n    assertThrows('LK|', 'not compare', () => util512Sort(['a', 'a'], ['a', 1]));\n    assertThrows('LJ|', 'not compare', () => util512Sort(['a', 'a'], ['a', true]));\n    assertThrows('LI|', 'not compare', () => util512Sort(['a', 'a'], ['a', undefined]));\n    assertThrows('LH|', 'not compare', () => util512Sort(['a', 'a'], ['a', []]));\n    assertThrows('LG|', 'not compare', () => util512Sort(['a', 1], ['a', 'a']));\n    assertThrows('LF|', 'not compare', () => util512Sort(['a', 1], ['a', true]));\n    assertThrows('LE|', 'not compare', () => util512Sort(['a', 1], ['a', undefined]));\n    assertThrows('LD|', 'not compare', () => util512Sort(['a', 1], ['a', []]));\n    assertThrows('LC|', 'not compare', () => util512Sort(['a', true], ['a', 'a']));\n    assertThrows('LB|', 'not compare', () => util512Sort(['a', true], ['a', 1]));\n    assertThrows('LA|', 'not compare', () => util512Sort(['a', true], ['a', undefined]));\n    assertThrows('L9|', 'not compare', () => util512Sort(['a', true], ['a', []]));\n    assertThrows('L8|', 'not compare', () => util512Sort(['a', undefined], ['a', 'a']));\n    assertThrows('L7|', 'not compare', () => util512Sort(['a', undefined], ['a', 1]));\n    assertThrows('L6|', 'not compare', () => util512Sort(['a', undefined], ['a', true]));\n    assertThrows('L5|', 'not compare', () => util512Sort(['a', undefined], ['a', []]));\n    assertThrows('L4|', 'not compare', () => util512Sort(['a', []], ['a', 'a']));\n    assertThrows('L3|', 'not compare', () => util512Sort(['a', []], ['a', 1]));\n    assertThrows('L2|', 'not compare', () => util512Sort(['a', []], ['a', true]));\n    assertThrows('L1|', 'not compare', () => util512Sort(['a', []], ['a', undefined]));\n});\nt.test('util512Sort.ArrayThreeElements', () => {\n    assertEq(0, util512Sort([5, 'a', 'abcdef'], [5, 'a', 'abcdef']), '0@|');\n    assertEq(1, util512Sort([5, 'a', 'abc'], [5, 'a', 'abb']), '0?|');\n    assertEq(-1, util512Sort([5, 'a', 'abb'], [5, 'a', 'abc']), '0>|');\n});\nt.test('util512Sort.ArraySameLength', () => {\n    assertEq(0, util512Sort([], []), '0{|');\n    assertEq(0, util512Sort([5, 'a'], [5, 'a']), '0`|');\n    assertEq(1, util512Sort([5, 'a', 7], [5, 'a', 6]), '0_|');\n    assertEq(-1, util512Sort([5, 'a', 6], [5, 'a', 7]), '0^|');\n    assertEq(1, util512Sort([5, 7, 'a'], [5, 6, 'a']), '0]|');\n    assertEq(1, util512Sort([5, 7, 'a', 600], [5, 6, 'a', 700]), '0[|');\n});\nt.test('util512Sort.ArrayDifferentLength', () => {\n    assertEq(1, util512Sort([1], []), '0=|');\n    assertEq(-1, util512Sort([], [1]), '0<|');\n    assertEq(1, util512Sort([10, 20], [10]), '0;|');\n    assertEq(-1, util512Sort([10], [10, 20]), '0:|');\n});\nt.test('util512Sort.ArrayNested', () => {\n    assertEq(0, util512Sort([[]], [[]]), '0/|');\n    assertEq(0, util512Sort([[], []], [[], []]), '0.|');\n    assertEq(0, util512Sort([[1, 2], []], [[1, 2], []]), '0-|');\n    assertEq(0, util512Sort([[10, 20], [30]], [[10, 20], [30]]), '0,|');\n    assertEq(1, util512Sort([[10, 20], [30]], [[10, 20], [-30]]), '0+|');\n    assertEq(-1, util512Sort([[10, 20], [-30]], [[10, 20], [30]]), '0*|');\n    assertEq(\n        1,\n        util512Sort(\n            [\n                [10, 20],\n                [1, 30]\n            ],\n            [\n                [10, 20],\n                [1, -30]\n            ]\n        ),\n        '0)|'\n    );\n    assertEq(\n        -1,\n        util512Sort(\n            [\n                [10, 20],\n                [1, -30]\n            ],\n            [\n                [10, 20],\n                [1, 30]\n            ]\n        ),\n        '0(|'\n    );\n    assertEq(\n        1,\n        util512Sort(\n            [\n                [10, 20],\n                [30, 31]\n            ],\n            [[10, 20], [30]]\n        ),\n        '0&|'\n    );\n    assertEq(\n        -1,\n        util512Sort(\n            [[10, 20], [30]],\n            [\n                [10, 20],\n                [30, 31]\n            ]\n        ),\n        '0%|'\n    );\n    assertEq(0, util512Sort([[10, 20], 50, [30]], [[10, 20], 50, [30]]), '0$|');\n    assertEq(1, util512Sort([[10, 20], 60, [30]], [[10, 20], 50, [30]]), '0#|');\n    assertEq(-1, util512Sort([[10, 20], 50, [30]], [[10, 20], 60, [30]]), '0!|');\n});\nt.test('forOf', () => {\n    let ar = [11, 22, 33];\n    let result: number[] = [];\n    for (let item of ar) {\n        result.push(item);\n    }\n\n    assertEq([11, 22, 33], result, '0t|');\n});\nt.test('forOfEmpty', () => {\n    let ar: number[] = [];\n    let result: number[] = [];\n    for (let item of ar) {\n        result.push(item);\n    }\n\n    assertEq([], result, 'DD|');\n});\nt.test('forOfGenerator', () => {\n    function* myGenerator() {\n        yield 10;\n        yield 20;\n        yield 30;\n        yield 40;\n    }\n\n    let result: number[] = [];\n    for (let item of myGenerator()) {\n        result.push(item);\n    }\n\n    assertEq([10, 20, 30, 40], result, '0s|');\n});\nt.test('OrderedHash.IterKeys', () => {\n    let h = new OrderedHash<number>();\n    h.insertNew('ccc', 30);\n    h.insertNew('ccb', 29);\n    h.insertNew('cca', 28);\n    let result: string[] = [];\n    for (let item of h.iterKeys()) {\n        result.push(item);\n    }\n\n    assertEq(['ccc', 'ccb', 'cca'], result, '0q|');\n});\nt.test('OrderedHash.IterVals', () => {\n    let h = new OrderedHash<number>();\n    h.insertNew('ccc', 30);\n    h.insertNew('ccb', 29);\n    h.insertNew('cca', 28);\n    let result: number[] = [];\n    for (let item of h.iter()) {\n        result.push(item);\n    }\n\n    assertEq([30, 29, 28], result, '0p|');\n});\nt.test('OrderedHash.IterReversed', () => {\n    let h = new OrderedHash<number>();\n    h.insertNew('ccc', 30);\n    h.insertNew('ccb', 29);\n    h.insertNew('cca', 28);\n    let result: number[] = [];\n    for (let item of h.iterReversed()) {\n        result.push(item);\n    }\n\n    assertEq([28, 29, 30], result, '0o|');\n});\nt.test('MapKeyToObjectCanSet', () => {\n    let o = new MapKeyToObjectCanSet<number>();\n    o.add('five', 5);\n    o.add('six', 6);\n    t.say(/*——————————*/ 'exists');\n    assertTrue(o.exists('five'), 'M||');\n    assertTrue(o.exists('six'), 'M{|');\n    assertTrue(!o.exists('seven'), 'M_|');\n    assertTrue(!o.exists(''), 'M^|');\n    t.say(/*——————————*/ 'get');\n    assertEq(5, o.get('five'), 'M]|');\n    assertEq(6, o.get('six'), 'M[|');\n    assertThrows('M@|', 'not found', () => {\n        o.get('seven');\n    });\n    assertThrows('M?|', 'not found', () => {\n        o.get('');\n    });\n    t.say(/*——————————*/ 'find');\n    assertEq(5, o.find('five'), 'M>|');\n    assertEq(6, o.find('six'), 'M=|');\n    assertEq(undefined, o.find('seven'), 'M<|');\n    assertEq(undefined, o.find(''), 'M;|');\n    t.say(/*——————————*/ 'getKeys');\n    assertEq(['five', 'six'], sorted(o.getKeys()), 'M:|');\n    assertEq([5, 6], sorted(o.getVals()), 'M/|');\n    t.say(/*——————————*/ 'remove');\n    o.remove('five');\n    assertEq(undefined, o.find('five'), 'M.|');\n});\nt.test('checkThrowEq', () => {\n    checkThrowEq(1, 1, 'M-|');\n    checkThrowEq('abc', 'abc', 'M,|');\n    assertThrows('M+|', 'but got', () => {\n        checkThrowEq(1, 2, 'M*|');\n    });\n    assertThrows('M)|', 'but got', () => {\n        checkThrowEq('abc', 'ABC', 'M(|');\n    });\n});\nt.test('last', () => {\n    assertEq(3, arLast([1, 2, 3]), 'M&|');\n    assertEq(1, arLast([1]), 'M%|');\n});\nt.test('bool', () => {\n    assertEq(true, bool(true), 'M#|');\n    assertEq(true, bool(['abc']), 'M!|');\n    assertEq(true, bool('abc'), 'M |');\n    assertEq(true, bool(123), 'Mz|');\n    assertEq(false, bool(false), 'My|');\n    assertEq(false, bool(''), 'Mx|');\n    assertEq(false, bool(0), 'Mw|');\n    assertEq(true, bool([]), 'Mv|');\n    assertEq(false, bool(null), 'Mu|');\n    assertEq(false, bool(undefined), 'Mt|');\n    assertEq(false, bool(NaN), 'Ms|');\n});\nt.test('longstr', () => {\n    let s = longstr(`a long\n        string across\n        a few lines`);\n    assertEq('a long string across a few lines', s, 'Mr|');\n    s = `a long\n    string across\n    a few lines`;\n    let sUnix = Util512.normalizeNewlines(s);\n    assertEq('a long string across a few lines', longstr(sUnix), 'Mq|');\n    let sWindows = Util512.normalizeNewlines(s).replace(/\\n/g, '\\r\\n');\n    assertEq('a long string across a few lines', longstr(sWindows), 'Mp|');\n});\n\n/**\n * test-only enum\n */\nenum TestEnum {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    First,\n    Second,\n    Third,\n    __AlternateForm__TheFirst = First,\n    __AlternateForm__Scnd = Second,\n    __AlternateForm__Thd = Third\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtil512Assert.ts",
    "content": "\n/* auto */ import { checkThrow, checkThrowEq, checkThrowInternal, checkThrowNotifyMsg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { RingBuffer, UI512Compress, tostring } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn, checkThrow512, ensureDefined, joinIntoMessage, make512Error } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, assertWarnEq, checkThrowEq512 } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts, assertThrows } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUtil512Assert');\nexport let testCollectionUtil512Assert = t;\n\nt.test('AssertThrows', () => {\n    t.say(/*——————————*/ 'Get Message From Custom Error');\n    assertThrows('L0|', 'mymessage', () => {\n        throw make512Error('1N|1 mymessage 2').clsAsErr();\n    });\n    t.say(/*——————————*/ 'Get Message From Plain Error');\n    assertThrows('K~|', 'xyz', () => {\n        throw new Error('1 xyz 2');\n    });\n});\nt.test('CheckThrow', () => {\n    t.say(/*——————————*/ 'Should Not Throw');\n    checkThrow512(1, 'K<|should not throw');\n    checkThrow512(true, 'K;|should not throw');\n    t.say(/*——————————*/ 'False Should Throw');\n    assertThrows('K}|', 'mymessage\\ns1, s2', () => {\n        checkThrow512(false, 'K:|mymessage', 's1', 's2');\n    });\n    t.say(/*——————————*/ 'Null Should Throw');\n    assertThrows('K||', 'mymessage\\ns1, s2', () => {\n        checkThrow512(null, 'K/|mymessage', 's1', 's2');\n    });\n    t.say(/*——————————*/ 'Undefined Should Throw');\n    assertThrows('K{|', 'mymessage\\ns1, s2', () => {\n        checkThrow512(undefined, 'K.|mymessage', 's1', 's2');\n    });\n});\nt.test('AssertAsserts', () => {\n    assertTrue(1, 'PQ|');\n    assertWarn(1, 'PP|');\n    assertEq(2, 1 + 1, 'PO|');\n    assertWarnEq(2, 1 + 1, 'PN|');\n    assertAsserts('PM|', 'a message', () => {\n        assertTrue(0, 'PL|a message');\n    });\n    assertAsserts('PK|', 'a message', () => {\n        assertWarn(0, 'PJ|a message');\n    });\n    assertAsserts('PI|', 'a message', () => {\n        assertEq(3, 1 + 1, 'PH|a message');\n    });\n    assertAsserts('PG|', 'a message', () => {\n        assertWarnEq(3, 1 + 1, 'PF|a message');\n    });\n});\nt.test('GetAssertMessages', () => {\n    checkThrow512(1, 'PE|');\n    checkThrowEq512('a', 'a', 'PD|');\n    checkThrow(1, 'PC|');\n    checkThrowEq('a', 'a', 'PB|');\n    checkThrowInternal(1, 'PA|');\n    checkThrowNotifyMsg(1, 'P9|');\n    assertThrows('P8|', 'ui512: a (;0)', () => {\n        checkThrow512(false, ';0|a');\n    });\n    assertThrows('P7|', 'ui512: a\\nb (;1)', () => {\n        checkThrow512(false, ';1|a', 'b');\n    });\n    assertThrows('P6|', 'ui512: a\\nb, c (;2)', () => {\n        checkThrow512(false, ';2|a', 'b', 'c');\n    });\n    assertThrows('P5|', \"ui512: a expected 'a' but got 'b'. (;3)\", () => {\n        checkThrowEq512('a', 'b', ';3|a');\n    });\n    assertThrows('P4|', \"ui512: a expected 'a' but got 'b'.\\nc1 (;4)\", () => {\n        checkThrowEq512('a', 'b', ';4|a', 'c1');\n    });\n    assertThrows('P3|', \"ui512: a expected 'a' but got 'b'.\\nc1, c2 (;5)\", () => {\n        checkThrowEq512('a', 'b', ';5|a', 'c1', 'c2');\n    });\n    assertThrows('P2|', 'vpc: a (;6)', () => {\n        checkThrow(false, ';6|a');\n    });\n    assertThrows('P1|', 'vpc: a\\nb (;7)', () => {\n        checkThrow(false, ';7|a', 'b');\n    });\n    assertThrows('P0|', 'vpc: a\\nb, c (;8)', () => {\n        checkThrow(false, ';8|a', 'b', 'c');\n    });\n    assertThrows('O~|', \"vpc: a expected 'a' but got 'b'. (;9)\", () => {\n        checkThrowEq('a', 'b', ';9|a');\n    });\n    assertThrows('O}|', \"vpc: a expected 'a' but got 'b'.\\nc1 (;a)\", () => {\n        checkThrowEq('a', 'b', ';a|a', 'c1');\n    });\n    assertThrows('O||', \"vpc: a expected 'a' but got 'b'.\\nc1, c2 (;b)\", () => {\n        checkThrowEq('a', 'b', ';b|a', 'c1', 'c2');\n    });\n    assertThrows('O{|', 'vpcinternal: a (;c)', () => {\n        checkThrowInternal(false, ';c|a');\n    });\n    assertThrows('O_|', 'vpcinternal: a\\nb (;d)', () => {\n        checkThrowInternal(false, ';d|a', 'b');\n    });\n    assertThrows('O^|', 'vpcinternal: a\\nb, c (;e)', () => {\n        checkThrowInternal(false, ';e|a', 'b', 'c');\n    });\n    assertThrows('O]|', 'vpcmessage: a (;f)', () => {\n        checkThrowNotifyMsg(false, ';f|a');\n    });\n    assertThrows('O[|', 'vpcmessage: a\\nb (;g)', () => {\n        checkThrowNotifyMsg(false, ';g|a', 'b');\n    });\n    assertThrows('O@|', 'vpcmessage: a\\nb, c (;h)', () => {\n        checkThrowNotifyMsg(false, ';h|a', 'b', 'c');\n    });\n});\nt.test('ThrowIfUndefined', () => {\n    t.say(/*——————————*/ 'Truthy Should Not Throw');\n    let n1 = ensureDefined(1, 'Cq|should not throw');\n    assertEq(1, n1, 'Cp|');\n\n    let s1 = ensureDefined('abc', 'Co|should not throw');\n    assertEq('abc', s1, 'Cn|');\n\n    let b1 = ensureDefined(true, 'Cm|should not throw');\n    assertEq(b1, true, 'Cl|');\n\n    t.say(/*——————————*/ 'Falsy Should Not Throw');\n    let n0 = ensureDefined(0, 'Ck|should not throw');\n    assertEq(0, n0, 'Cj|');\n\n    let s0 = ensureDefined('', 'Ci|should not throw');\n    assertEq('', s0, 'Ch|');\n\n    let b0 = ensureDefined(false, 'Cg|should not throw');\n    assertEq(false, b0, 'Cf|');\n\n    t.say(/*——————————*/ 'NullAndUndefinedShouldThrow');\n    assertThrows('K`|', 'mymessage, s1, s2', () => {\n        ensureDefined(null, 'Ce|mymessage', 's1', 's2');\n    });\n    assertThrows('K_|', 'mymessage, s1, s2', () => {\n        ensureDefined(undefined, 'Cd|mymessage', 's1', 's2');\n    });\n});\nt.test('JoinIntoMessage', () => {\n    t.say(/*——————————*/ 'WithoutMarks');\n    let got = joinIntoMessage('without|marks', 'prefix:');\n    assertEq('prefix:: without|marks', got, 'Cc|');\n\n    t.say(/*——————————*/ 'ShouldMoveMarksToTheEnd');\n    got = joinIntoMessage('ab|', 'prefix:', 'c', 'd', 'e');\n    assertEq('prefix:: \\nc, d, e (ab)', got, 'Cb|');\n    got = joinIntoMessage('ab|the message', 'prefix:');\n    assertEq('prefix:: the message (ab)', got, 'Ca|');\n    got = joinIntoMessage('the message', 'prefix:', 'ab|c');\n    assertEq('prefix:: the message\\nc (ab)', got, 'CZ|');\n});\nt.test('CompressString', () => {\n    assertEq('\\u2020 ', UI512Compress.compressString(''), 'CY|');\n    assertEq('\\u10E8 ', UI512Compress.compressString('a'), 'CX|');\n    assertEq(\n        '\\u10E6\\u4866\\u4AEA  ',\n        UI512Compress.compressString('aaaaaaaabbbbbbbb'),\n        'CW|'\n    );\n    assertEq(\n        '\\u10E6\\u4866\\u4AE8\\u31B0 ',\n        UI512Compress.compressString('aaaaaaaabbbbbbbbc'),\n        'CV|'\n    );\n    assertEq(\n        '\\u10E6\\u7070\\u0256\\u4CF0 ',\n        UI512Compress.compressString('aaaaaaa\\nbbbbbbbbb'),\n        'CU|'\n    );\n});\nt.test('DecompressString', () => {\n    assertEq('', UI512Compress.decompressString('\\u2020 '), 'CT|');\n    assertEq('a', UI512Compress.decompressString('\\u10E8 '), 'CS|');\n    assertEq(\n        'aaaaaaaabbbbbbbb',\n        UI512Compress.decompressString('\\u10E6\\u4866\\u4AEA  '),\n        'CR|'\n    );\n    assertEq(\n        'aaaaaaaabbbbbbbbc',\n        UI512Compress.decompressString('\\u10E6\\u4866\\u4AE8\\u31B0 '),\n        'CQ|'\n    );\n    assertEq(\n        'aaaaaaa\\nbbbbbbbbb',\n        UI512Compress.decompressString('\\u10E6\\u7070\\u0256\\u4CF0 '),\n        'CP|'\n    );\n});\nt.test('RingBufferSizeRemainsConstant', () => {\n    let buf = new RingBufferArray(4);\n    buf.append('a');\n    buf.append('b');\n    buf.append('c');\n    buf.append('d');\n    buf.append('e');\n    buf.append('f');\n    assertEq(['f'], buf.retrieve(1), 'CO|');\n    assertEq(['f', 'e'], buf.retrieve(2), 'CN|');\n    assertEq(['f', 'e', 'd'], buf.retrieve(3), 'CM|');\n    assertEq('d', buf.getAt(0), 'CL|');\n    assertEq('e', buf.getAt(1), 'CK|');\n    assertEq('f', buf.getAt(2), 'CJ|');\n    assertEq('c', buf.getAt(3), 'CI|');\n    assertEq('', buf.getAt(5), 'CH|');\n});\nt.test('RingBuffer.CorrectlyWrapsAroundWhenNegative', () => {\n    let buf = new RingBufferArray(4);\n    assertEq(['', ''], buf.retrieve(2), 'CG|');\n    buf.append('a');\n    assertEq(['a', ''], buf.retrieve(2), 'CF|');\n    buf.append('b');\n    assertEq(['b', 'a'], buf.retrieve(2), 'CE|');\n    buf.append('c');\n    assertEq(['c', 'b'], buf.retrieve(2), 'CD|');\n    buf.append('d');\n    assertEq(['d', 'c'], buf.retrieve(2), 'CC|');\n    buf.append('e');\n    assertEq(['e', 'd'], buf.retrieve(2), 'CB|');\n    buf.append('f');\n    assertEq(['f', 'e'], buf.retrieve(2), 'CA|');\n    buf.append('g');\n    assertEq(['g', 'f'], buf.retrieve(2), 'C9|');\n});\nt.test('built-in includes', () => {\n    t.say(/*——————————*/ 'typical usage');\n    assertTrue('a test string'.includes('e'), 'Nh|');\n    assertTrue('a test string'.includes('test'), 'Ng|');\n    assertTrue('a test string'.includes('a test'), 'Nf|');\n    assertTrue('a test string'.includes('a test string'), 'Ne|');\n    assertTrue(!'a test string'.includes('a test string '), 'Nd|');\n    assertTrue(!'a test string'.includes('x'), 'Nc|');\n    t.say(/*——————————*/ 'edge cases');\n    assertTrue('test'.includes('test'), 'Nb|');\n    assertTrue('test'.includes(''), 'Na|');\n    assertTrue(!''.includes('test'), 'NZ|');\n    assertTrue(''.includes(''), 'NY|');\n});\nt.test('unknownToString', () => {\n    class CustomToString {\n        public toString() {\n            return 'abc';\n        }\n    }\n\n    let a: unknown = new CustomToString();\n    let b: unknown = 'a string';\n    let c: unknown = 123;\n    let d: unknown = undefined;\n    let e: unknown = null;\n    let f: unknown = false;\n    assertEq('abc', tostring(a), 'NX|');\n    assertEq('a string', tostring(b), 'NW|');\n    assertEq('123', tostring(c), 'NV|');\n    assertEq('undefined', tostring(d), 'NU|');\n    assertEq('null', tostring(e), 'NT|');\n    assertEq('false', tostring(f), 'NS|');\n});\n\n/**\n * implementation of RingBuffer backed by a simple array\n */\nclass RingBufferArray extends RingBuffer {\n    arr: string[] = [];\n    ptrLatest = 0;\n    getAt(index: number): string {\n        return this.arr[index] ?? '';\n    }\n\n    setAt(index: number, s: string) {\n        this.arr[index] = s;\n    }\n\n    getLatestIndex() {\n        return this.ptrLatest;\n    }\n\n    setLatestIndex(index: number) {\n        this.ptrLatest = index;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtil512Class.ts",
    "content": "\n/* auto */ import { BrowserInfo, BrowserOSInfo } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows, sorted } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUtil512Class');\nexport let testCollectionUtil512Class = t;\n\nt.test('isValidNumber', () => {\n    assertTrue(Util512.isValidNumber(123), 'O9|');\n    assertTrue(Util512.isValidNumber(0), 'O8|');\n    assertTrue(!Util512.isValidNumber(null), 'O7|');\n    assertTrue(!Util512.isValidNumber(undefined), 'O6|');\n    assertTrue(!Util512.isValidNumber(NaN), 'O5|');\n    assertTrue(!Util512.isValidNumber(Infinity), 'O4|');\n    assertTrue(!Util512.isValidNumber(Number.POSITIVE_INFINITY), 'O3|');\n    assertTrue(!Util512.isValidNumber(Number.NEGATIVE_INFINITY), 'O2|');\n    assertTrue(!Util512.isValidNumber('12'), 'O1|');\n    assertTrue(!Util512.isValidNumber(''), 'O0|');\n});\nt.test('Range.Upwards', () => {\n    assertEq([0], Util512.range(0, 1), 'E`|');\n    assertEq([1], Util512.range(1, 2), 'E_|');\n    assertEq([0, 1, 2, 3], Util512.range(0, 4), 'E^|');\n    assertEq([2, 3, 4], Util512.range(2, 5), 'E]|');\n    assertEq([2, 5], Util512.range(2, 8, 3), 'E[|');\n    assertEq([2, 5, 8], Util512.range(2, 9, 3), 'E@|');\n    assertEq([2, 5, 8], Util512.range(2, 10, 3), 'E?|');\n});\nt.test('Range.Downwards', () => {\n    assertEq([1], Util512.range(1, 0, -1), 'E>|');\n    assertEq([2], Util512.range(2, 1, -1), 'E=|');\n    assertEq([5, 4, 3], Util512.range(5, 2, -1), 'E<|');\n    assertEq([10, 7, 4], Util512.range(10, 2, -3), 'E;|');\n    assertEq([9, 6, 3], Util512.range(9, 2, -3), 'E:|');\n    assertEq([8, 5], Util512.range(8, 2, -3), 'E/|');\n});\nt.test('Range.None', () => {\n    assertEq([], Util512.range(5, 2), 'E.|');\n    assertEq([], Util512.range(2, 2), 'E-|');\n    assertEq([], Util512.range(2, 5, -1), 'E,|');\n    assertEq([], Util512.range(2, 2, -1), 'E+|');\n});\nt.test('Repeat', () => {\n    t.say(/*——————————*/ 'strings');\n    assertEq(['a', 'a', 'a'], Util512.repeat(3, 'a'), 'F4|');\n    assertEq(['a'], Util512.repeat(1, 'a'), 'F3|');\n    assertEq([], Util512.repeat(0, 'a'), 'F2|');\n    t.say(/*——————————*/ 'numbers');\n    assertEq([4, 4, 4], Util512.repeat(3, 4), 'F1|');\n    assertEq([4], Util512.repeat(1, 4), 'F0|');\n    assertEq([], Util512.repeat(0, 4), 'E~|');\n});\nt.test('setarr', () => {\n    let ar1: number[] = [];\n    Util512.setarr(ar1, 0, 12, 0);\n    assertEq([12], ar1, 'N~|');\n    let ar2: number[] = [];\n    Util512.setarr(ar2, 1, 12, 0);\n    assertEq([0, 12], ar2, 'N}|');\n    let ar3: number[] = [];\n    Util512.setarr(ar3, 3, 12, 0);\n    assertEq([0, 0, 0, 12], ar3, 'N||');\n    let ar: number[] = [1, 2];\n    Util512.setarr(ar, 0, 12, 0);\n    assertEq([12, 2], ar, 'N{|');\n    ar = [1, 2];\n    Util512.setarr(ar, 2, 12, 0);\n    assertEq([1, 2, 12], ar, 'N_|');\n    ar = [1, 2];\n    Util512.setarr(ar, 3, 12, 0);\n    assertEq([1, 2, 0, 12], ar, 'N^|');\n});\nt.test('extendArray', () => {\n    t.say(/*——————————*/ 'AppendNothing');\n    let ar = [1, 2, 3];\n    Util512.extendArray(ar, []);\n    assertEq([1, 2, 3], ar, 'E}|');\n    t.say(/*——————————*/ 'AppendOneElem');\n    ar = [1, 2, 3];\n    Util512.extendArray(ar, [4]);\n    assertEq([1, 2, 3, 4], ar, 'E||');\n    t.say(/*——————————*/ 'AppendThreeElems');\n    ar = [1, 2, 3];\n    Util512.extendArray(ar, [4, 5, 6]);\n    assertEq([1, 2, 3, 4, 5, 6], ar, 'E{|');\n});\nt.test('parseIntStrict', () => {\n    assertEq(0, Util512.parseIntStrict('0'), 'N]|');\n    assertEq(9, Util512.parseIntStrict('9'), 'N[|');\n    assertEq(12, Util512.parseIntStrict('12'), 'N@|');\n    assertEq(12, Util512.parseIntStrict(' 12'), 'N?|');\n    assertEq(12, Util512.parseIntStrict('12 '), 'N>|');\n    assertEq(12, Util512.parseIntStrict(' 12 '), 'N=|');\n    assertEq(undefined, Util512.parseIntStrict(''), 'N<|');\n    assertEq(undefined, Util512.parseIntStrict(undefined), 'N;|');\n    assertEq(undefined, Util512.parseIntStrict('1more'), 'N:|');\n    assertEq(undefined, Util512.parseIntStrict('1 more'), 'N/|');\n    assertEq(undefined, Util512.parseIntStrict('1.1'), 'N.|');\n    assertEq(undefined, Util512.parseIntStrict('12a'), 'N-|');\n    assertEq(undefined, Util512.parseIntStrict('a12'), 'N,|');\n    assertEq(undefined, Util512.parseIntStrict('abc'), 'N+|');\n    assertEq(12, Util512.parseIntStrict('012'), 'N*|');\n    assertEq(12, Util512.parseIntStrict('0012'), 'N)|');\n});\nt.test('truncateWithEllipsis', () => {\n    assertEq('', Util512.truncateWithEllipsis('', 2), 'Ub|');\n    assertEq('a', Util512.truncateWithEllipsis('a', 2), 'Ua|');\n    assertEq('ab', Util512.truncateWithEllipsis('ab', 2), 'UZ|');\n    assertEq('ab', Util512.truncateWithEllipsis('abc', 2), 'UY|');\n    assertEq('ab', Util512.truncateWithEllipsis('abcd', 2), 'UX|');\n    assertEq('', Util512.truncateWithEllipsis('', 4), 'UW|');\n    assertEq('a', Util512.truncateWithEllipsis('a', 4), 'UV|');\n    assertEq('ab', Util512.truncateWithEllipsis('ab', 4), 'UU|');\n    assertEq('abcd', Util512.truncateWithEllipsis('abcd', 4), 'UT|');\n    assertEq('a...', Util512.truncateWithEllipsis('abcde', 4), 'US|');\n    assertEq('a...', Util512.truncateWithEllipsis('abcdef', 4), 'UR|');\n});\nt.test('add', () => {\n    assertEq(0, Util512.add(0, 0), 'N(|');\n    assertEq(9, Util512.add(4, 5), 'N&|');\n    assertEq(6, [1, 2, 3].reduce(Util512.add), 'N%|');\n    assertEq(9, [1, 2, 3].reduce(Util512.add, 3), 'N#|');\n    assertEq(0, [].reduce(Util512.add, 0), 'N!|');\n});\nt.test('getBrowserOS', () => {\n    let s = longstr(`Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)\n        AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5370a\n        Safari/604.1`);\n    assertEq(BrowserOSInfo.Mac, new BrowserInfo(s).os, 'N |');\n    s = longstr(`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\n        (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246`);\n    assertEq(BrowserOSInfo.Windows, new BrowserInfo(s).os, 'Nz|');\n    s = longstr(`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9\n        (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9`);\n    assertEq(BrowserOSInfo.Mac, new BrowserInfo(s).os, 'Ny|');\n    s = longstr(`Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,\n        like Gecko) Chrome/47.0.2526.111 Safari/537.36`);\n    assertEq(BrowserOSInfo.Windows, new BrowserInfo(s).os, 'Nx|');\n    s = longstr(`Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101\n        Firefox/15.0.1`);\n    assertEq(BrowserOSInfo.Linux, new BrowserInfo(s).os, 'Nw|');\n    /* previously:\n    Windows\n    iPhone|iPad|iPod,Mac OS X,MacPPC|MacIntel|Mac_PowerPC|Macintosh\n    Linux|X11|UNIX\n    */\n});\nt.test('isMapEmpty.PlainObject', () => {\n    let obj0 = {};\n    let obj1 = { a: true };\n    let obj2 = { abc: 'abc', def: 'def' };\n    assertTrue(Util512.isMapEmpty(obj0), 'EM|');\n    assertTrue(!Util512.isMapEmpty(obj1), 'EL|');\n    assertTrue(!Util512.isMapEmpty(obj2), 'EK|');\n});\nt.test('isMapEmpty.Class', () => {\n    let o0 = new TestClsEmpty();\n    let o1 = new TestClsOne();\n    let o2 = new TestClsOne();\n    (o2 as any).aSingleAdded = 1;\n    assertTrue(Util512.isMapEmpty(o0 as any), 'EJ|');\n    assertTrue(!Util512.isMapEmpty(o1 as any), 'EI|');\n    assertTrue(!Util512.isMapEmpty(o2 as any), 'EH|');\n});\nt.test('getMapShallowClone.PlainObject', () => {\n    let obj0 = {};\n    let obj1 = { a: true };\n    let obj2 = { abc: 'abc', def: '_def' };\n    let clone0 = Util512.shallowClone(obj0);\n    let clone1 = Util512.shallowClone(obj1);\n    let clone2 = Util512.shallowClone(obj2);\n    assertEq([], sorted(Util512.getMapKeys(clone0)), 'D~|');\n    assertEq(['a'], sorted(Util512.getMapKeys(clone1)), 'D}|');\n    assertEq(['abc', 'def'], sorted(Util512.getMapKeys(clone2)), 'D||');\n});\nt.test('getMapShallowClone.Class', () => {\n    let cls0 = new TestClsEmpty();\n    let cls1 = new TestClsOne();\n    let cls2 = new TestClsOne();\n    (cls2 as any).aSingleAdded = 1;\n    let clone0 = Util512.shallowClone(cls0);\n    let clone1 = Util512.shallowClone(cls1);\n    let clone2 = Util512.shallowClone(cls2);\n    assertEq([], sorted(Util512.getMapKeys(clone0)), 'D{|');\n    assertEq(['aSingleProp'], sorted(Util512.getMapKeys(clone1)), 'D`|');\n    assertEq(['aSingleAdded', 'aSingleProp'], sorted(Util512.getMapKeys(clone2)), 'D_|');\n});\nt.test('freezeProperty.PlainObject', () => {\n    let obj1 = { a: true, b: true };\n    Util512.freezeProperty(obj1, 'a');\n    obj1.b = false;\n    assertThrows('Lt|', '', () => {\n        obj1.a = false;\n    });\n});\nt.test('freezeProperty.Class', () => {\n    let cls1 = new TestClsOne();\n    Util512.freezeProperty(cls1, 'aSingleProp');\n    assertThrows('Ls|', '', () => {\n        cls1.aSingleProp = false;\n    });\n});\nt.test('freezeRecurse.PlainObject', () => {\n    let obj = { a: true, b: true };\n    assertTrue(!Object.isFrozen(obj), 'EG|');\n    Util512.freezeRecurse(obj);\n    assertThrows('Lr|', '', () => {\n        obj.a = false;\n    });\n});\nt.test('freezeRecurse.Class', () => {\n    let cls1 = new TestClsOne();\n    let cls2 = new TestClsOne();\n    let cls3 = new TestClsOne();\n    (cls1 as any).child = cls2;\n    (cls2 as any).child = cls3;\n    (cls3 as any).nullchild = undefined;\n    assertTrue(!Object.isFrozen(cls1), 'EF|');\n    Util512.freezeRecurse(cls1);\n    assertTrue(Object.isFrozen(cls1), 'EE|');\n    assertTrue(Object.isFrozen(cls2), 'ED|');\n    assertTrue(Object.isFrozen(cls3), 'EC|');\n    assertThrows('Lq|', '', () => {\n        cls1.aSingleProp = false;\n    });\n\n    assertThrows('Lp|', '', () => {\n        (cls1 as any).newProp = true;\n    });\n});\nt.test('EscapeForRegex.NoEscapeNeeded', () => {\n    assertEq('', Util512.escapeForRegex(''), 'Ew|');\n    assertEq('abc', Util512.escapeForRegex('abc'), 'Ev|');\n    assertEq('a 1 \"', Util512.escapeForRegex('a 1 \"'), 'Eu|');\n});\nt.test('EscapeForRegex.EscapeNeeded', () => {\n    assertEq('\\\\\\\\', Util512.escapeForRegex('\\\\'), 'Et|');\n    assertEq('a\\\\?b\\\\?', Util512.escapeForRegex('a?b?'), 'Es|');\n    assertEq('\\\\/', Util512.escapeForRegex('/'), 'Er|');\n    assertEq('a\\\\/b', Util512.escapeForRegex('a/b'), 'Eq|');\n    assertEq('\\\\+', Util512.escapeForRegex('+'), 'Ep|');\n    assertEq('a\\\\+b', Util512.escapeForRegex('a+b'), 'Eo|');\n    assertEq('\\\\+\\\\+', Util512.escapeForRegex('++'), 'En|');\n    assertEq('a\\\\+\\\\+b', Util512.escapeForRegex('a++b'), 'Em|');\n});\nt.test('EscapeForRegex.Consecutive', () => {\n    assertEq('', Util512.escapeForRegex(''), 'El|');\n    assertEq('abc', Util512.escapeForRegex('abc'), 'Ek|');\n    assertEq('\\\\[abc\\\\]', Util512.escapeForRegex('[abc]'), 'Ej|');\n    assertEq('123\\\\[abc\\\\]456', Util512.escapeForRegex('123[abc]456'), 'Ei|');\n    assertEq('\\\\.\\\\.', Util512.escapeForRegex('..'), 'Eh|');\n    assertEq('\\\\|\\\\|', Util512.escapeForRegex('||'), '');\n    assertEq('\\\\[\\\\[', Util512.escapeForRegex('[['), 'Eg|');\n    assertEq('\\\\]\\\\]', Util512.escapeForRegex(']]'), 'Ef|');\n    assertEq('\\\\(\\\\(', Util512.escapeForRegex('(('), 'Ee|');\n    assertEq('\\\\)\\\\)', Util512.escapeForRegex('))'), 'Ed|');\n    assertEq('\\\\/\\\\/', Util512.escapeForRegex('//'), 'Ec|');\n    assertEq('\\\\\\\\\\\\\\\\', Util512.escapeForRegex('\\\\\\\\'), 'Eb|');\n});\nt.test('capitalizeFirst.NonAlphabet', () => {\n    assertEq('', Util512.capitalizeFirst(''), 'E*|');\n    assertEq('1', Util512.capitalizeFirst('1'), 'E)|');\n    assertEq('0123', Util512.capitalizeFirst('0123'), 'E(|');\n    assertEq('\\t1', Util512.capitalizeFirst('\\t1'), 'E&|');\n    assertEq(' 1', Util512.capitalizeFirst(' 1'), 'E%|');\n    assertEq('!@#1', Util512.capitalizeFirst('!@#1'), 'E$|');\n});\nt.test('capitalizeFirst.Alphabet', () => {\n    assertEq('A', Util512.capitalizeFirst('a'), 'E#|');\n    assertEq('Abc', Util512.capitalizeFirst('abc'), 'E!|');\n    assertEq('Def ghi', Util512.capitalizeFirst('def ghi'), 'E |');\n    assertEq('A', Util512.capitalizeFirst('A'), 'Ez|');\n    assertEq('ABC', Util512.capitalizeFirst('ABC'), 'Ey|');\n    assertEq('DEF ghi', Util512.capitalizeFirst('DEF ghi'), 'Ex|');\n});\nt.test('callAsMethod.BadCharInMethodName', () => {\n    let o = new TestClsWithMethods();\n    assertThrows('Lo|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '', [true, 1], true)\n    );\n\n    assertThrows('Ln|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, 'a b', [true, 1], true)\n    );\n\n    assertThrows('Lm|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, 'a', [true, 1], true)\n    );\n\n    assertThrows('Ll|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '?', [true, 1], true)\n    );\n\n    assertThrows('Lk|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '1a', [true, 1], true)\n    );\n\n    assertThrows('Lj|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '_c', [true, 1], true)\n    );\n\n    assertThrows('Li|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '__c', [true, 1], true)\n    );\n\n    assertThrows('Lh|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, '.', [true, 1], true)\n    );\n\n    assertThrows('Lg|', 'requires alphanumeric', () =>\n        Util512.callAsMethodOnClass(TestClsWithMethods.name, o, 'a.b', [true, 1], true)\n    );\n});\nt.test('callAsMethod.MissingMethodWhenAllowed', () => {\n    let o = new TestClsWithMethods();\n    Util512.callAsMethodOnClass(TestClsWithMethods.name, o, 'notExist', [true, 1], true);\n});\nt.test('callAsMethod.MissingMethodWhenDisAllowed', () => {\n    let o = new TestClsWithMethods();\n    assertThrows('Lf|', 'could not find', () =>\n        Util512.callAsMethodOnClass(\n            TestClsWithMethods.name,\n            o,\n            'notExist',\n            [true, 1],\n            false\n        )\n    );\n});\nt.test('callAsMethod.ValidMethod', () => {\n    let o1 = new TestClsWithMethods();\n    Util512.callAsMethodOnClass(TestClsWithMethods.name, o1, 'goAbc', [true, 1], false);\n    assertEq(true, o1.calledAbc, 'D^|');\n    assertEq(false, o1.calledZ, 'D]|');\n    let o2 = new TestClsWithMethods();\n    Util512.callAsMethodOnClass(TestClsWithMethods.name, o2, 'goZ', [true, 1], false);\n    assertEq(false, o2.calledAbc, 'D[|');\n    assertEq(true, o2.calledZ, 'D@|');\n});\nt.test('isMethodOnClass', () => {\n    let o1 = new TestClsWithMethods();\n    assertTrue(Util512.isMethodOnClass(o1, 'goAbc'), 'D?|');\n    assertTrue(Util512.isMethodOnClass(o1, 'goZ'), 'D>|');\n    assertTrue(!Util512.isMethodOnClass(o1, 'goAbcd'), 'D=|');\n    assertTrue(!Util512.isMethodOnClass(o1, 'calledAbc'), 'D<|');\n    assertTrue(!Util512.isMethodOnClass(o1, 'notPresent'), 'D;|');\n    assertTrue(!Util512.isMethodOnClass(o1, ''), 'D:|');\n});\nt.test('getMapKeys.PlainObject', () => {\n    let obj0 = {};\n    let obj1 = { a: true };\n    let obj2 = { abc: 'abc', def: '_def' };\n    assertEq([], sorted(Util512.getMapKeys(obj0)), 'EB|');\n    assertEq(['a'], sorted(Util512.getMapKeys(obj1)), 'EA|');\n    assertEq(['abc', 'def'], sorted(Util512.getMapKeys(obj2)), 'E9|');\n});\nt.test('getMapKeys.Class', () => {\n    let cls0 = new TestClsEmpty();\n    let cls1 = new TestClsOne();\n    let cls2 = new TestClsOne();\n    (cls2 as any).aSingleAdded = 1;\n    assertEq([], sorted(Util512.getMapKeys(cls0 as any)), 'E8|');\n    assertEq(['aSingleProp'], sorted(Util512.getMapKeys(cls1 as any)), 'E7|');\n    assertEq(\n        ['aSingleAdded', 'aSingleProp'],\n        sorted(Util512.getMapKeys(cls2 as any)),\n        'E6|'\n    );\n});\nt.test('getMapVals.PlainObject', () => {\n    let obj0 = {};\n    let obj1 = { a: true };\n    let obj2 = { abc: 'abc', def: '_def' };\n    assertEq([], sorted(Util512.getMapVals(obj0)), 'E5|');\n    assertEq([true], sorted(Util512.getMapVals(obj1)), 'E4|');\n    assertEq(['_def', 'abc'], sorted(Util512.getMapVals(obj2)), 'E3|');\n});\nt.test('getMapVals.Class', () => {\n    let cls0 = new TestClsEmpty();\n    let cls1 = new TestClsOne();\n    let cls2 = new TestClsOne();\n    (cls2 as any).aSingleAdded = false;\n    assertEq([], sorted(Util512.getMapVals(cls0 as any)), 'E2|');\n    assertEq([true], sorted(Util512.getMapVals(cls1 as any)), 'E1|');\n    assertEq([false, true], sorted(Util512.getMapVals(cls2 as any)), 'E0|');\n});\nt.test('padStart', () => {\n    assertEq('123', Util512.padStart(123, 2, '0'), 'D/|');\n    assertEq('123', Util512.padStart(123, 3, '0'), 'D.|');\n    assertEq('0123', Util512.padStart(123, 4, '0'), 'D-|');\n    assertEq('00123', Util512.padStart(123, 5, '0'), 'D,|');\n});\nt.test('arrayToBase64.arrayOfNumbers', () => {\n    let nums: any = Array.prototype.map.call('hello', (x: string) => x.charCodeAt(0));\n    assertEq('aGVsbG8=', Util512.arrayToBase64(nums), 'D+|');\n});\nt.test('arrayToBase64.Uint8Array', () => {\n    let nums: any = Array.prototype.map.call('hello', (x: string) => x.charCodeAt(0));\n    let uint8 = new Uint8Array(nums);\n    assertEq('aGVsbG8=', Util512.arrayToBase64(uint8), 'D*|');\n});\nt.test('arrayToBase64.ArrayBuffer', () => {\n    let nums: any = Array.prototype.map.call('hello', (x: string) => x.charCodeAt(0));\n    let buffer = new ArrayBuffer(nums.length);\n    let view = new Uint8Array(buffer);\n    for (let i = 0; i < nums.length; i++) {\n        view[i] = nums[i];\n    }\n\n    assertEq('aGVsbG8=', Util512.arrayToBase64(view), 'D)|');\n});\nt.test('Base64UrlSafe.StripsAndReAddEqualsSign', () => {\n    let roundTrip = (a: string, b: string) => {\n        assertEq(Util512.toBase64UrlSafe(a), b, 'EQ|');\n        assertEq(Util512.fromBase64UrlSafe(b), a, 'EP|');\n    };\n\n    roundTrip('abc', 'YWJj');\n    roundTrip('abcd', 'YWJjZA');\n    roundTrip('abcde', 'YWJjZGU');\n    roundTrip('abcdef', 'YWJjZGVm');\n    roundTrip('abcdefg', 'YWJjZGVmZw');\n});\nt.test('Base64UrlSafe.ReplacesWithUnderscoreAndDash', () => {\n    let roundTrip = (a: string, b: string) => {\n        assertEq(Util512.toBase64UrlSafe(a), b, 'EO|');\n        assertEq(Util512.fromBase64UrlSafe(b), a, 'EN|');\n    };\n\n    roundTrip('\\x01\\x05\\xf8\\xff', 'AQX4_w');\n    roundTrip('\\x01\\x05\\xf8\\xffX', 'AQX4_1g');\n    roundTrip('\\x01\\x05\\xf8\\xffXY', 'AQX4_1hZ');\n    roundTrip('\\x01\\x05\\xf8\\xffXYZ', 'AQX4_1hZWg');\n    roundTrip('\\x01\\x05\\xf8\\xffXYZ<', 'AQX4_1hZWjw');\n    roundTrip('\\x01\\x05\\xf8\\xffXYZ<>', 'AQX4_1hZWjw-');\n});\nt.test('stringToCharArray', () => {\n    assertEq([], Util512.stringToCharArray(''), 'Nv|');\n    assertEq(['a'], Util512.stringToCharArray('a'), 'Nu|');\n    assertEq(['a', 'b', ' ', 'c', 'd'], Util512.stringToCharArray('ab cd'), 'Nt|');\n});\nt.test('stringToByteArray', () => {\n    assertEq([], Util512.stringToByteArray(''), 'Ns|');\n    assertEq([97], Util512.stringToByteArray('a'), 'Nr|');\n    assertEq([97, 98, 32, 99, 100], Util512.stringToByteArray('ab cd'), 'Nq|');\n});\nt.test('sortDecorated', () => {\n    class MyClass {\n        constructor(public a: string) {}\n    }\n\n    t.say(/*——————————*/ 'typical usage');\n    let input: string[] = ['abc', 'dba', 'aab', 'ffd'];\n    let ret = Util512.sortDecorated(input, s => s.charAt(2));\n    assertEq('dba;aab;abc;ffd', ret.join(';'), 'Np|');\n    t.say(/*——————————*/ 'with class');\n    let inputCl = [new MyClass('bb'), new MyClass('aa'), new MyClass('cc')];\n    let retCl = Util512.sortDecorated(inputCl, o => o.a);\n    assertEq('aa;bb;cc', retCl.map(o => o.a).join(';'), 'O+|');\n    t.say(/*——————————*/ 'with class and ties');\n    inputCl = [new MyClass('bb'), new MyClass('aa'), new MyClass('bb')];\n    retCl = Util512.sortDecorated(inputCl, o => o.a);\n    assertEq('aa;bb;bb', retCl.map(o => o.a).join(';'), 'O*|');\n});\nt.test('normalizeNewlines', () => {\n    assertEq('ab', Util512.normalizeNewlines('ab'), 'Nn|');\n    assertEq('a\\nb\\n', Util512.normalizeNewlines('a\\nb\\n'), 'Nm|');\n    assertEq('a\\nb\\n', Util512.normalizeNewlines('a\\r\\nb\\r\\n'), 'Nl|');\n    assertEq('a\\nb\\n', Util512.normalizeNewlines('a\\rb\\r'), 'Nk|');\n    assertEq('a\\nb\\n', Util512.normalizeNewlines('a\\rb\\r\\n'), 'Nj|');\n    assertEq('a\\nb\\n', Util512.normalizeNewlines('a\\r\\nb\\n'), 'Ni|');\n});\n\n/**\n * test-only code. class with no members\n */\nclass TestClsEmpty {}\n\n/**\n * test-only code. class with 1 member\n */\nclass TestClsOne {\n    aSingleProp = true;\n}\n\n/**\n * test-only code. class with methods\n */\nclass TestClsWithMethods {\n    calledAbc = false;\n    calledZ = false;\n    goAbc(p1: boolean, p2: number) {\n        assertEq(true, p1, 'D$|');\n        assertEq(1, p2, 'D#|');\n        this.calledAbc = true;\n    }\n\n    goZ(p1: boolean, p2: number) {\n        assertEq(true, p1, 'D!|');\n        assertEq(1, p2, 'D |');\n        this.calledZ = true;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtil512Higher.ts",
    "content": "\n/* auto */ import { IsUtil512Serializable, Util512SerializableHelpers } from './../../ui512/utils/util512Serialize';\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows, assertThrowsAsync, sorted } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUtil512Higher');\nexport let testCollectionUtil512Higher = t;\n\nt.test('WeakUuid', () => {\n    let uid1 = Util512Higher.weakUuid();\n    let uid2 = Util512Higher.weakUuid();\n    assertTrue(uid1 !== uid2, 'Ea|');\n\n    let uid = Util512Higher.weakUuid();\n    assertEq(36, uid.length, 'EZ|');\n    for (let i = 0; i < uid.length; i++) {\n        let c = uid.charAt(i);\n        if (i === 23 || i === 18 || i === 13 || i === 8) {\n            assertEq('-', c, 'EY|');\n        } else {\n            assertTrue('0123456789abcdef'.includes(c), 'EX|');\n        }\n    }\n});\nt.test('getRandIntInclusiveWeak.OKIfBoundsEqual', () => {\n    assertEq(1, Util512Higher.getRandIntInclusiveWeak(1, 1), 'EW|');\n    assertEq(2, Util512Higher.getRandIntInclusiveWeak(2, 2), 'EV|');\n    assertEq(3, Util512Higher.getRandIntInclusiveWeak(3, 3), 'EU|');\n});\nt.test('getRandIntInclusiveWeak', () => {\n    let got = Util512Higher.getRandIntInclusiveWeak(1, 3);\n    assertTrue(got >= 1 && got <= 3, 'ET|');\n    got = Util512Higher.getRandIntInclusiveWeak(4, 6);\n    assertTrue(got >= 4 && got <= 6, 'ES|');\n    got = Util512Higher.getRandIntInclusiveWeak(7, 9);\n    assertTrue(got >= 7 && got <= 9, 'ER|');\n});\nt.test('generateUniqueBase64UrlSafe', () => {\n    let generated1 = Util512Higher.generateUniqueBase64UrlSafe(8, '!');\n    let generated2 = Util512Higher.generateUniqueBase64UrlSafe(8, '!');\n    assertTrue(generated1 !== generated2, 'D(|');\n    assertEq('!', Util512.fromBase64UrlSafe(generated1)[0], 'D&|');\n    assertEq('!', Util512.fromBase64UrlSafe(generated2)[0], 'D%|');\n});\n\n/**\n * example for testing serializable.\n * field names begining in optional_ can be skipped.\n */\nclass DemoSerializable implements IsUtil512Serializable {\n    __isUtil512Serializable = true;\n    __private = 'not serialized';\n    fld1 = 'fld 1';\n    fld2 = 'fld 2 and text';\n    optional_f1: O<string> = 'an optional field';\n    optional_f2: O<string> = 'also optional';\n}\n\nt.test('serialize: expected', () => {\n    t.say(/*——————————*/ 'typical usage');\n    let o = new DemoSerializable();\n    let s = Util512SerializableHelpers.serializeToJson(o);\n    let got = JSON.parse(s);\n    let ks = sorted(Util512.getMapKeys(got)).join(',');\n    assertEq('f1,f2,fld1,fld2', ks, 'Q6|');\n    assertEq('fld 1', got.fld1, 'Q5|');\n    assertEq('fld 2 and text', got.fld2, 'Q4|');\n    assertEq('an optional field', got.f1, 'Q3|');\n    assertEq('also optional', got.f2, 'Q2|');\n    assertTrue(undefined === got.__private, 'Q1|');\n    t.say(/*——————————*/ 'round trip');\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,optional_f1,optional_f2',\n        ks,\n        'Q0|'\n    );\n    assertEq('fld 1', oGot.fld1, 'P~|');\n    assertEq('fld 2 and text', oGot.fld2, 'P}|');\n    assertEq('an optional field', oGot.optional_f1, 'P||');\n    assertEq('also optional', oGot.optional_f2, 'P{|');\n    assertEq('not serialized', oGot.__private, 'P_|');\n});\nt.test('serialize: private values not sent', () => {\n    t.say(/*——————————*/ 'typical usage');\n    let o = new DemoSerializable();\n    o.__private += '~';\n    o.fld1 += '~';\n    o.fld2 += '~';\n    o.optional_f1 += '~';\n    o.optional_f2 += '~';\n    let s = Util512SerializableHelpers.serializeToJson(o);\n    t.say(/*——————————*/ 'round trip');\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    let ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,optional_f1,optional_f2',\n        ks,\n        'P^|'\n    );\n    assertEq('fld 1~', oGot.fld1, 'P]|');\n    assertEq('fld 2 and text~', oGot.fld2, 'P[|');\n    assertEq('an optional field~', oGot.optional_f1, 'P@|');\n    assertEq('also optional~', oGot.optional_f2, 'P?|');\n    assertEq('not serialized', oGot.__private, 'P>|');\n});\nt.test('serialize: missing an optional is fine', () => {\n    let okIncoming = { fld1: 'a', fld2: 'b', f2: 'c' };\n    let s = JSON.stringify(okIncoming);\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    let ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,optional_f1,optional_f2',\n        ks,\n        'P=|'\n    );\n    assertEq('a', oGot.fld1, 'P<|');\n    assertEq('b', oGot.fld2, 'P;|');\n    assertTrue(undefined === oGot.optional_f1, 'P:|');\n    assertEq('c', oGot.optional_f2, 'P/|');\n    assertEq('not serialized', oGot.__private, 'P.|');\n});\nt.test('serialize: getting extra data is fine', () => {\n    let okIncoming = { fld1: 'a', fld2: 'b', f1: 'c', f2: 'd', somethingelse: 'e' };\n    let s = JSON.stringify(okIncoming);\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    let ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,optional_f1,optional_f2',\n        ks,\n        'Ug|'\n    );\n    assertEq('a', oGot.fld1, 'Uf|');\n    assertEq('b', oGot.fld2, 'Ue|');\n    assertEq('c', oGot.optional_f1, 'Ud|');\n    assertEq('d', oGot.optional_f2, 'Uc|');\n    assertEq('not serialized', oGot.__private, 'P(|');\n    t.say(/*——————————*/ 'test loose');\n    oGot = Util512SerializableHelpers.deserializeObjLoose(\n        DemoSerializable,\n        JSON.parse(s)\n    );\n    ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq('__isUtil512Serializable,f1,f2,fld1,fld2,somethingelse', ks, 'P-|');\n    assertEq('a', oGot.fld1, 'P,|');\n    assertEq('b', oGot.fld2, 'P+|');\n    assertEq('c', oGot['f1'], 'P*|');\n    assertEq('d', oGot['f2'], 'P)|');\n});\nt.test('serialize: throw on missing field ', () => {\n    let badIncoming = { fld1: 'fld 1', f1: 'an optional field', f2: 'also optional' };\n    let s = JSON.stringify(badIncoming);\n    assertThrows('P&|', 'required', () =>\n        Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s)\n    );\n});\nt.test('serialize: throw on unsupported type 1', () => {\n    let badIncoming = {\n        fld1: 'fld 1',\n        fld2: 1234,\n        f1: 'an optional field',\n        f2: 'also optional'\n    };\n    let s = JSON.stringify(badIncoming);\n    assertThrows('P%|', 'support', () =>\n        Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s)\n    );\n});\nt.test('serialize: throw on unsupported type 2', () => {\n    let badIncoming = { fld1: 'fld 1', fld2: 'b', f1: 1234, f2: 'also optional' };\n    let s = JSON.stringify(badIncoming);\n    assertThrows('P#|', 'not a string', () =>\n        Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s)\n    );\n});\nt.test('serialize: invalid send, undefined', () => {\n    let badOutgoing = {\n        __isUtil512Serializable: true,\n        fld1: 'fld 1',\n        fld2: undefined,\n        optional_f1: 'b',\n        optional_f2: 'also optional'\n    };\n    assertThrows('P!|', 'support', () =>\n        Util512SerializableHelpers.serializeToJson(badOutgoing)\n    );\n});\nt.test('serialize: invalid send, not string', () => {\n    let badOutgoing = {\n        __isUtil512Serializable: true,\n        fld1: 'fld 1',\n        fld2: 1234,\n        optional_f1: 'b',\n        optional_f2: 'also optional'\n    };\n    assertThrows('P |', 'support', () =>\n        Util512SerializableHelpers.serializeToJson(badOutgoing)\n    );\n});\nt.test('serialize: invalid send, not string opt', () => {\n    let badOutgoing = {\n        __isUtil512Serializable: true,\n        fld1: 'fld 1',\n        fld2: 'a',\n        optional_f1: [123],\n        optional_f2: 'also optional'\n    };\n    assertThrows('Pz|', 'support', () =>\n        Util512SerializableHelpers.serializeToJson(badOutgoing)\n    );\n});\nt.test('serialize: invalid send, not marked', () => {\n    let badOutgoing = {\n        __isUtil512Serializable: true,\n        fld1: 'fld 1',\n        fld2: 1234,\n        optional_f1: 'b',\n        optional_f2: 'also optional'\n    };\n    badOutgoing.__isUtil512Serializable = undefined as any;\n    assertThrows('Py|', 'must be', () =>\n        Util512SerializableHelpers.serializeToJson(badOutgoing)\n    );\n});\nt.test('serialize: invalid recieve, not marked', () => {\n    let o = new DemoSerializable();\n    let s = Util512SerializableHelpers.serializeToJson(o);\n    class NotMarked {\n        __private = 'not serialized';\n        fld1 = 'fld 1';\n        fld2 = 'fld 2 and text';\n        optional_f1: O<string> = 'an optional field';\n        optional_f2: O<string> = 'also optional';\n    }\n    assertThrows('Px|', 'must be', () =>\n        Util512SerializableHelpers.deserializeFromJson(NotMarked as any, s)\n    );\n});\nt.test('serialize: ok to send an undefined if optional', () => {\n    t.say(/*——————————*/ 'send');\n    let o = new DemoSerializable();\n    o.__private += '~';\n    o.fld1 += '~';\n    o.fld2 += '~';\n    o.optional_f1 = undefined;\n    o.optional_f2 += '~';\n    let s = Util512SerializableHelpers.serializeToJson(o);\n    let ks = sorted(Util512.getMapKeys(JSON.parse(s))).join(',');\n    assertEq('f2,fld1,fld2', ks, 'Pw|');\n    t.say(/*——————————*/ 'round trip');\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,optional_f1,optional_f2',\n        ks,\n        'Pv|'\n    );\n    assertEq('fld 1~', oGot.fld1, 'Pu|');\n    assertEq('fld 2 and text~', oGot.fld2, 'Pt|');\n    assertTrue(undefined === oGot.optional_f1, 'Ps|');\n    assertEq('also optional~', oGot.optional_f2, 'Pr|');\n    assertEq('not serialized', oGot.__private, 'Pq|');\n});\nt.test('serialize: incoming nulls map to undefined ', () => {\n    let okIncoming = { fld1: 'a', fld2: 'b', f1: 'c', f2: null };\n    let s = JSON.stringify(okIncoming);\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    assertTrue(undefined === oGot.optional_f2, 'Pp|');\n    assertTrue('a' === oGot.fld1, 'Po|');\n});\nt.test(\"serialize: we don't read private incoming\", () => {\n    let okIncoming = { fld1: 'a', fld2: 'b', f1: 'c', f2: 'd', __private: 'e' };\n    let s = JSON.stringify(okIncoming);\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoSerializable, s);\n    assertTrue('not serialized' === oGot.__private, 'Pn|');\n    assertTrue('d' === oGot.optional_f2, 'Pm|');\n    assertTrue('c' === oGot.optional_f1, 'Pl|');\n    assertTrue('b' === oGot.fld2, 'Pk|');\n});\nt.test('serialize: inheritance works, methods skipped', () => {\n    class DemoChild extends DemoSerializable {\n        other = 'other';\n        method1 = () => {\n            return 1;\n        };\n    }\n    let o = new DemoChild();\n    o.__private += '~';\n    o.fld1 += '~';\n    o.fld2 += '~';\n    o.optional_f1 += '~';\n    o.optional_f2 += '~';\n    (o as any).method2 = () => {\n        return 2;\n    };\n    let s = Util512SerializableHelpers.serializeToJson(o);\n    let got = JSON.parse(s);\n    let ks = sorted(Util512.getMapKeys(got)).join(',');\n    assertEq('f1,f2,fld1,fld2,other', ks, 'Pj|');\n    let oGot = Util512SerializableHelpers.deserializeFromJson(DemoChild, s);\n    ks = sorted(Util512.getMapKeys(oGot)).join(',');\n    assertEq(\n        '__isUtil512Serializable,__private,fld1,fld2,method1,optional_f1,optional_f2,other',\n        ks,\n        'Pi|'\n    );\n    ks = sorted(IsUtil512Serializable.getKeys(oGot)).join(',');\n    assertEq('fld1,fld2,optional_f1,optional_f2,other', ks, 'Ph|');\n    assertEq('fld 1~', oGot.fld1, 'Pg|');\n    assertEq('fld 2 and text~', oGot.fld2, 'Pf|');\n    assertEq('an optional field~', oGot.optional_f1, 'Pe|');\n    assertEq('also optional~', oGot.optional_f2, 'Pd|');\n    assertEq('not serialized', oGot.__private, 'Pc|');\n    assertEq('other', oGot.other, 'Pb|');\n    assertEq(1, oGot.method1(), 'Pa|');\n    assertTrue(undefined === oGot['method2'], 'PZ|');\n});\n\n/* ok to disable warning, we're intentionally only synchronous here */\n/* eslint-disable-next-line @typescript-eslint/require-await */\nt.atest('canDoSimpleSynchronousActions', async () => {\n    t.say(/*——————————*/ 'adding numbers');\n    assertEq(4, 2 + 2, 'OA|');\n});\nt.atest('canAwaitACall', async () => {\n    t.say(/*——————————*/ '0...');\n    await exampleAsyncFn();\n    t.say(/*——————————*/ '3');\n});\n/* note that we're intentionally returning a promise */\nt.atest('canChainACall', async () => {\n    return exampleAsyncFn();\n});\n\n/* an example async function */\nasync function exampleAsyncFn() {\n    t.say(/*——————————*/ '1...');\n    await Util512Higher.sleep(100);\n    t.say(/*——————————*/ '2...');\n}\nt.atest('minimumTimeSlowsDown', async () => {\n    let shortFn = async () => {\n        await Util512Higher.sleep(100);\n        return 123;\n    };\n    let start = performance.now();\n    let result = await Util512Higher.runAsyncWithMinimumTime(shortFn(), 500);\n    assertEq(123, result, 'PY|');\n    assertTrue(performance.now() - start > 400, 'PX|too fast');\n});\nt.atest('minimumTimeStaysSame', async () => {\n    let longFn = async () => {\n        await Util512Higher.sleep(500);\n        return 123;\n    };\n    let start = performance.now();\n    let result = await Util512Higher.runAsyncWithMinimumTime(longFn(), 100);\n    assertEq(123, result, 'PW|');\n    assertTrue(performance.now() - start > 400, 'PV|too fast');\n});\nt.atest('doesNotTimeOut', async () => {\n    let shortFn = async () => {\n        await Util512Higher.sleep(200);\n        return 123;\n    };\n    let start = performance.now();\n    let result = await Util512Higher.runAsyncWithTimeout(shortFn(), 800);\n    assertEq(123, result, 'PU|');\n    assertTrue(performance.now() - start < 600, 'PT|too slow');\n});\nt.atest('timesOut', async () => {\n    let longFn = async () => {\n        await Util512Higher.sleep(800);\n        return 123;\n    };\n    let start = performance.now();\n    let cb = async () => {\n        return Util512Higher.runAsyncWithTimeout(longFn(), 200);\n    };\n    await assertThrowsAsync('PS|', 'Timed out', () => cb());\n    assertTrue(performance.now() - start < 600, 'PR|too slow');\n});\n\n/**\n * test some less useful classes\n */\nt.test('LockableArr', () => {\n    t.say(/*——————————*/ 'standard use');\n    let ar = new Util512.LockableArr<number>();\n    ar.set(0, 55);\n    ar.set(1, 56);\n    assertEq(55, ar.at(0), 'OS|');\n    assertEq(56, ar.at(1), 'OR|');\n    assertEq(2, ar.len(), 'OQ|');\n    ar.lock();\n    assertThrows('OP|', 'locked', () => {\n        ar.set(1, 57);\n    });\n    t.say(/*——————————*/ \"changing the copy won't change original\");\n    let copy = ar.getUnlockedCopy();\n    assertEq(55, copy.at(0), 'OO|');\n    assertEq(56, copy.at(1), 'ON|');\n    assertEq(2, copy.len(), 'OM|');\n    copy.set(1, 57);\n    assertEq(57, copy.at(1), 'OL|');\n    assertEq(56, ar.at(1), 'OK|');\n});\nt.test('keepOnlyUnique', () => {\n    assertEq([], Util512.keepOnlyUnique([]), 'OJ|');\n    assertEq(['1'], Util512.keepOnlyUnique(['1']), 'OI|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '3']), 'OH|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '2', '3']), 'OG|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '3', '3']), 'OF|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '2', '3', '2']), 'OE|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '2', '3', '3']), 'OD|');\n    assertEq(['1', '2', '3'], Util512.keepOnlyUnique(['1', '2', '3', '2', '3']), 'OC|');\n    assertEq(\n        ['11', '12', '13', '14', '15'],\n        Util512.keepOnlyUnique(['11', '12', '13', '14', '15', '15']),\n        'OB|'\n    );\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtilsCanvasWrapper.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * testing fillRect, getColorFromCanvasData, and\n * TestUtilsCanvas.RenderAndCompareImages itself\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUtilsCanvasWrapper');\nexport let testCollectionUtilsCanvasWrapper = t;\n\nt.atest('Simple Draw Rectangles', async () => {\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n    };\n\n    let getParams = () => {\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('Simple Draw Rectangles including no-op drawing', async () => {\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        /* draw with width zero, should have no effect */\n        canvas.fillRect(250, 15, 0, 405, 0, 0, imWidth, imHeight, 'black');\n        /* draw with height zero, should have no effect */\n        canvas.fillRect(100, 5, 40, 0, 0, 0, imWidth, imHeight, 'black');\n        /* draw black over black, should have no effect */\n        canvas.fillRect(3 + 1, 5 + 1, 30 - 1, 50 - 1, 0, 0, imWidth, imHeight, 'black');\n        /* draw white over transparent, should have no effect as far as our testing. */\n        canvas.fillRect(245, 3, 0, 15, 0, 0, imWidth, imHeight, 'white');\n    };\n\n    let getParams = () => {\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('Should fail with 85 differences if shifted', async () => {\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3 + 1, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 85;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('1 different pixel', async () => {\n    t.say('Should fail with 1 different pixel if black pixel turned white');\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(3 + 2, 5 + 2, 1, 1, 0, 0, imWidth, imHeight, 'white');\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 1;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('2 different pxls (NW)', async () => {\n    t.say('Should fail with 2 different pxls if white pxl turned black (NW)');\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(0, 0, 1, 1, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(1, 1, 1, 1, 0, 0, imWidth, imHeight, 'black');\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 2;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('2 different pxls (NE)', async () => {\n    t.say('Should fail with 2 different pxls if white pxl turned black (NE)');\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(imWidth - 1, 0, 1, 1, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(imWidth - 1, 1, 1, 1, 0, 0, imWidth, imHeight, 'black');\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 2;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('2 different pixels (SW)', async () => {\n    t.say('Should fail with 2 different pixels if white pixel turned black (SW)');\n    let draw = (canvas: CanvasWrapper) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(0, imHeight - 1, 1, 1, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(1, imHeight - 1, 1, 1, 0, 0, imWidth, imHeight, 'black');\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 2;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('2 different pixels (SE)', async () => {\n    t.say('Should fail with 2 different pixels if white pixel turned black (SE)');\n    let draw = (canvas: CanvasWrapper, _unused_complete: RenderComplete) => {\n        canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        canvas.fillRect(\n            imWidth - 1,\n            imHeight - 1,\n            1,\n            1,\n            0,\n            0,\n            imWidth,\n            imHeight,\n            'black'\n        );\n        canvas.fillRect(\n            imWidth - 2,\n            imHeight - 2,\n            1,\n            1,\n            0,\n            0,\n            imWidth,\n            imHeight,\n            'black'\n        );\n    };\n\n    let getParams = () => {\n        let expectedDifferences = 2;\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false,\n            expectedDifferences\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\nt.atest('continue looping until renderComplete', async () => {\n    t.say(\n        longstr(`Should continue looping until renderComplete,\n            even if the first renders are wrong`)\n    );\n    let countRenderAttempt = 0;\n    let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n        if (countRenderAttempt === 0) {\n            canvas.fillRect(1, 1, 500, 500, 0, 0, imWidth, imHeight, 'black');\n        } else if (countRenderAttempt === 1) {\n            canvas.fillRect(1, 1, 100, 100, 0, 0, imWidth, imHeight, 'white');\n        } else if (countRenderAttempt === 2) {\n            canvas.fillRect(3, 5, 30, 50, 0, 0, imWidth, imHeight, 'black');\n            canvas.fillRect(22, 40, 40, 400, 0, 0, imWidth, imHeight, 'black');\n            canvas.fillRect(280, 15, 1, 405, 0, 0, imWidth, imHeight, 'black');\n        }\n        complete.complete = countRenderAttempt === 2;\n        countRenderAttempt++;\n    };\n\n    let getParams = () => {\n        return new CanvasTestParams(\n            'simpledrawrect',\n            '/resources03a/test/drawsimplerects.png',\n            draw,\n            imWidth,\n            imHeight,\n            false\n        );\n    };\n\n    return TestUtilsCanvas.RenderAndCompareImages(false, getParams);\n});\n\nconst imWidth = 300;\nconst imHeight = 556;\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512/testUtilsDraw.ts",
    "content": "\n/* auto */ import { ModifierKeys, toShortcutString, ui512TranslateModifiers } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { RectUtils } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { BrowserOSInfo } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * testing functions from utilsDraw\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUtilsDraw');\nexport let testCollectionUtilsDraw = t;\n\nt.test('GetRectClipped.FullyContained', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, y0, w, h];\n    assertEq(expected, got, '0S|');\n});\nt.test('GetRectClipped.SidesAreTheSame', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = boxX0;\n    w = boxW;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, y0, w, h];\n    assertEq(expected, got, '0R|');\n});\nt.test('GetRectClipped.TopsAreTheSame', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = boxY0;\n    h = boxH;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, y0, w, h];\n    assertEq(expected, got, '0Q|');\n});\nt.test('GetRectClipped.ProtrudesLeft', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = 6;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [10, y0, 30 - (10 - 6), h];\n    assertEq(expected, got, '0P|');\n});\nt.test('GetRectClipped.ProtrudesTop', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = 50;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, 60, w, 22 - (60 - 50)];\n    assertEq(expected, got, '0O|');\n});\nt.test('GetRectClipped.ProtrudesRight', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    w = 300;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, y0, 200 + 10 - 15, h];\n    assertEq(expected, got, '0N|');\n});\nt.test('GetRectClipped.ProtrudesBottom', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    h = 400;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, y0, w, 130 + 60 - 65];\n    assertEq(expected, got, '0M|');\n});\nt.test('GetRectClipped.CompletelyCovers', () => {\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    let x0 = boxX0 - 5;\n    let y0 = boxY0 - 7;\n    let w = boxW + 24;\n    let h = boxH + 31;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, boxY0, boxW, boxH];\n    assertEq(expected, got, '0L|');\n});\nt.test('GetRectClipped.OutsideLeft', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = 3;\n    w = 6;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, boxY0, 0, 0];\n    assertEq(expected, got, '0K|');\n});\nt.test('GetRectClipped.OutsideLeftTouches', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = 3;\n    w = 7;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, y0, 0, h];\n    assertEq(expected, got, '0J|');\n});\nt.test('GetRectClipped.BarelyInsideLeft', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = 3;\n    w = 8;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, y0, 1, h];\n    assertEq(expected, got, '0I|');\n});\nt.test('GetRectClipped.OutsideTop', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = 55;\n    h = 4;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, boxY0, 0, 0];\n    assertEq(expected, got, '0H|');\n});\nt.test('GetRectClipped.OutsideTopTouches', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = 55;\n    h = 5;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, boxY0, w, 0];\n    assertEq(expected, got, '0G|');\n});\nt.test('GetRectClipped.BarelyInsideTop', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = 55;\n    h = 6;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [x0, boxY0, w, 1];\n    assertEq(expected, got, '0F|');\n});\nt.test('GetRectClipped.OutsideRight', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    x0 = boxX0 + boxW;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, boxY0, 0, 0];\n    assertEq(expected, got, '0E|');\n});\nt.test('GetRectClipped.OutsideBottom', () => {\n    let x0 = 15;\n    let y0 = 65;\n    let w = 30;\n    let h = 22;\n    let boxX0 = 10;\n    let boxY0 = 60;\n    let boxW = 200;\n    let boxH = 130;\n    y0 = boxY0 + boxH;\n    let got = RectUtils.getRectClipped(x0, y0, w, h, boxX0, boxY0, boxW, boxH);\n    let expected = [boxX0, boxY0, 0, 0];\n    assertEq(expected, got, '0D|');\n});\nt.test('GetSubRectRaw.EnoughSpace', () => {\n    assertEq(\n        [105, 206, 290, 388],\n        RectUtils.getSubRectRaw(100, 200, 300, 400, 5, 6),\n        'DC|'\n    );\n    assertEq(\n        [110, 211, 280, 378],\n        RectUtils.getSubRectRaw(100, 200, 300, 400, 10, 11),\n        'DB|'\n    );\n    assertEq(\n        [249, 211, 2, 378],\n        RectUtils.getSubRectRaw(100, 200, 300, 400, 149, 11),\n        'DA|'\n    );\n    assertEq(\n        [249, 399, 2, 2],\n        RectUtils.getSubRectRaw(100, 200, 300, 400, 149, 199),\n        'D9|'\n    );\n});\nt.test('GetSubRectRaw.NotEnoughSpace', () => {\n    assertEq(undefined, RectUtils.getSubRectRaw(100, 200, 300, 400, 150, 11), 'D8|');\n    assertEq(undefined, RectUtils.getSubRectRaw(100, 200, 300, 400, 10, 200), 'D7|');\n    assertEq(undefined, RectUtils.getSubRectRaw(100, 200, 300, 400, 150, 200), 'D6|');\n});\nt.test('TranslateModifiers', () => {\n    let shift: number = ModifierKeys.Shift;\n    let cmd: number = ModifierKeys.Cmd;\n    let opt: number = ModifierKeys.Opt;\n    assertEq(\n        0,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, false, false, false, false),\n        'D5|'\n    );\n    assertEq(\n        shift,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, false, true, false, false),\n        'D4|'\n    );\n    assertEq(\n        shift + opt,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, false, true, true, false),\n        'D3|'\n    );\n    assertEq(\n        shift + cmd + opt,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, true, true, true, false),\n        'D2|'\n    );\n    assertEq(\n        cmd + opt,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, true, false, true, false),\n        'D1|'\n    );\n    assertEq(\n        opt,\n        ui512TranslateModifiers(BrowserOSInfo.Unknown, false, false, true, false),\n        'D0|'\n    );\n});\nt.test('ToShortcutString.TypicalShortcut', () => {\n    let shift: number = ModifierKeys.Shift;\n    let cmd: number = ModifierKeys.Cmd;\n    let opt: number = ModifierKeys.Opt;\n    assertEq('a', toShortcutString(ModifierKeys.None, 'a'), 'C~|');\n    assertEq('Shift+a', toShortcutString(shift, 'a'), 'C}|');\n    assertEq('Opt+Shift+a', toShortcutString(shift + opt, 'a'), 'C||');\n    assertEq('Cmd+Opt+Shift+a', toShortcutString(shift + cmd + opt, 'a'), 'C{|');\n    assertEq('Cmd+Opt+a', toShortcutString(cmd + opt, 'a'), 'C`|');\n    assertEq('Opt+a', toShortcutString(opt, 'a'), 'C_|');\n});\nt.test('ToShortcutString.TruncateKey', () => {\n    let cmd: number = ModifierKeys.Cmd;\n    assertEq('Cmd+A', toShortcutString(cmd, 'KeyA'), 'C^|');\n    assertEq('Cmd+Keya', toShortcutString(cmd, 'Keya'), 'C]|');\n    assertEq('Cmd+A', toShortcutString(cmd, 'keyA'), 'C[|');\n    assertEq('Cmd+keya', toShortcutString(cmd, 'keya'), 'C@|');\n    assertEq('Cmd+Z', toShortcutString(cmd, 'keyZ'), 'C?|');\n    assertEq('Cmd+keyz', toShortcutString(cmd, 'keyz'), 'C>|');\n    assertEq('Cmd+Key ', toShortcutString(cmd, 'Key '), 'C=|');\n    assertEq('Cmd+Key@', toShortcutString(cmd, 'Key@'), 'C<|');\n    assertEq('Cmd+Key', toShortcutString(cmd, 'Key'), 'C;|');\n    assertEq('Cmd+KeyAA', toShortcutString(cmd, 'KeyAA'), 'C:|');\n});\nt.test('ToShortcutString.TruncateDigit', () => {\n    let cmd: number = ModifierKeys.Cmd;\n    assertEq('Cmd+1', toShortcutString(cmd, 'Digit1'), 'C/|');\n    assertEq('Cmd+1', toShortcutString(cmd, 'digit1'), 'C.|');\n    assertEq('Cmd+9', toShortcutString(cmd, 'digit9'), 'C-|');\n    assertEq('Cmd+9', toShortcutString(cmd, 'digit9'), 'C,|');\n    assertEq('Cmd+Digit ', toShortcutString(cmd, 'Digit '), 'C+|');\n    assertEq('Cmd+Digit@', toShortcutString(cmd, 'Digit@'), 'C*|');\n    assertEq('Cmd+Digit', toShortcutString(cmd, 'Digit'), 'C)|');\n    assertEq('Cmd+Digit11', toShortcutString(cmd, 'Digit11'), 'C(|');\n});\nt.test('TranslateModifiers.Windows', () => {\n    assertEq(\n        ModifierKeys.None,\n        ui512TranslateModifiers(BrowserOSInfo.Windows, false, false, false, false),\n        'C&|'\n    );\n    assertEq(\n        ModifierKeys.Shift,\n        ui512TranslateModifiers(BrowserOSInfo.Windows, false, true, false, false),\n        'C%|'\n    );\n    assertEq(\n        ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Windows, false, false, true, false),\n        'C$|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Cmd | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Windows, true, true, true, true),\n        'C#|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Windows, false, true, true, true),\n        'C!|'\n    );\n});\nt.test('TranslateModifiers.Linux', () => {\n    assertEq(\n        ModifierKeys.None,\n        ui512TranslateModifiers(BrowserOSInfo.Linux, false, false, false, false),\n        'C |'\n    );\n    assertEq(\n        ModifierKeys.Shift,\n        ui512TranslateModifiers(BrowserOSInfo.Linux, false, true, false, false),\n        'Cz|'\n    );\n    assertEq(\n        ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Linux, false, false, true, false),\n        'Cy|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Cmd | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Linux, true, true, true, true),\n        'Cx|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Linux, false, true, true, true),\n        'Cw|'\n    );\n});\nt.test('TranslateModifiers.Mac', () => {\n    assertEq(\n        ModifierKeys.None,\n        ui512TranslateModifiers(BrowserOSInfo.Mac, false, false, false, false),\n        'Cv|'\n    );\n    assertEq(\n        ModifierKeys.Shift,\n        ui512TranslateModifiers(BrowserOSInfo.Mac, false, true, false, false),\n        'Cu|'\n    );\n    assertEq(\n        ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Mac, false, false, true, false),\n        'Ct|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Cmd | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Mac, true, true, true, true),\n        'Cs|'\n    );\n    assertEq(\n        ModifierKeys.Shift | ModifierKeys.Cmd | ModifierKeys.Opt,\n        ui512TranslateModifiers(BrowserOSInfo.Mac, false, true, true, true),\n        'Cr|'\n    );\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512CodeEditor.ts",
    "content": "\n/* auto */ import { VpcPanelScriptEditor } from './../../vpcui/panels/vpcScriptEditor';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { KeyDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { ElementObserverNoOp } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512CompCodeEditor } from './../../ui512/composites/ui512CodeEditor';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * testing the code editor's auto-formatting and\n * autoinsertion features\n *\n * the ^ symbol refers to the caret position,\n * for example if the input is `on mouseUp^`\n * we simulate the user pressing Enter, and the expected output is\n * `on mouseUp\n *      ^\n *  end mouseUp`\n * since we both automatically add indentation and automattically\n * add the closing block.\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUI512CodeEditor');\nexport let testCollectionUI512CodeEditor = t;\n\nlet ed = YetToBeDefinedTestHelper<VpcPanelScriptEditor>();\nt.test('CodeEditorFeatures.Init', () => {\n    ed = createFakeEd();\n});\nt.test('CodeEditorFeatures.Auto Close A Block', () => {\n    testAutoFormat(\n        ed,\n        `on z\nrepeat while true^`,\n        `on z\n    repeat while true\n        ^\n    end repeat`\n    );\n    testAutoFormat(\n        ed,\n        `repeat while true^`,\n        `repeat while true\n    ^\nend repeat`\n    );\n    testAutoFormat(\n        ed,\n        `on z^`,\n        `on z\n    ^\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z other^`,\n        `on z other\n    ^\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then^`,\n        `if 2 > 1 then\n    ^\nend if`\n    );\n});\nt.test('CodeEditorConfirmThatFailureAsserts', () => {\n    testAutoFormat(ed, `on z^`, `on z\\n    ^\\nend z`);\n    /* getting the wrong text should assert */\n    assertAsserts('QA|', 'assert:', () => {\n        testAutoFormat(ed, `on z^`, `On z\\n    ^\\nend z`);\n    });\n    /* missing caret should assert */\n    assertAsserts('Q9|', 'assert:', () => {\n        testAutoFormat(ed, `on z^`, `On z\\n    \\nend z`);\n    });\n    /* two should assert */\n    assertAsserts('Q8|', 'assert:', () => {\n        testAutoFormat(ed, `on z^`, `On z\\n    ^\\n^end z`);\n    });\n    /* getting the wrong caret loc should assert */\n    assertAsserts('Q7|', 'assert:', () => {\n        testAutoFormat(ed, `on z^`, `on z\\n    \\n^end z`);\n    });\n});\nt.test('CodeEditorFeatures.Correctly Close A Block', () => {\n    testAutoFormat(\n        ed,\n        `on z\nb\nend z^`,\n        `on z\n    b\nend z\n^`\n    );\n    testAutoFormat(\n        ed,\n        `repeat while true\nb\nend repeat^`,\n        `repeat while true\n    b\nend repeat\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\nb\nend if^`,\n        `if 2 > 1 then\n    b\nend if\n^`\n    );\n});\nt.test('CodeEditorFeatures.Incorrectly Close A Block', () => {\n    testAutoFormat(\n        ed,\n        `on z\nb\nend y^`,\n        `on z\n    b\n    end y\n    ^`\n    );\n    testAutoFormat(\n        ed,\n        `repeat while true\nb\nend repeaX^`,\n        `repeat while true\n    b\n    end repeaX\n    ^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\nb\nend if^`,\n        `if 2 > 1 then\n    b\nend if\n^`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Maintain At Level Zero', () => {\n    /* currently, if Enter pressed in middle of text, the caret is sent to end of line. */\n    testAutoFormat(ed, '^', '\\n^');\n    testAutoFormat(ed, 'text^', 'text\\n^');\n    testAutoFormat(ed, 'text\\n^', 'text\\n\\n^');\n    testAutoFormat(ed, 'text^\\ntext', 'text\\n^\\ntext');\n    testAutoFormat(ed, 'text^text', 'text\\ntext^');\n    testAutoFormat(ed, 'text1^text2\\ntext3', 'text1\\ntext2^\\ntext3');\n});\nt.test('CodeEditorFeatures.SetIndentation.Maintain At Level One', () => {\n    testAutoFormat(\n        ed,\n        `on z\n    ^\nend z`,\n        `on z\n    \\n    ^\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\n    test^\nend z`,\n        `on z\n    test\n    ^\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\n    test^test\nend z`,\n        `on z\n    test\n    test^\nend z`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Maintain At Level Two', () => {\n    testAutoFormat(\n        ed,\n        `on z\n    on y\n        ^\n    end y\nend z`,\n        `on z\n    on y\n        \\n        ^\n    end y\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\n    on y\n        test^\n    end y\nend z`,\n        `on z\n    on y\n        test\n        ^\n    end y\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\n    on y\n        test^test\n    end y\nend z`,\n        `on z\n    on y\n        test\n        test^\n    end y\nend z`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Introduce One Tab', () => {\n    testAutoFormat(\n        ed,\n        `on z^\nend z`,\n        `on z\n    ^\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z^\nfoo\nend z`,\n        `on z\n    ^\n    foo\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on y\nfoo\nend y\non z\nfoo^\nend z`,\n        `on y\n    foo\nend y\non z\n    foo\n    ^\nend z`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Introduce Two Tabs', () => {\n    testAutoFormat(\n        ed,\n        `on z\n    on y\n        test^test\n    end y\nend z`,\n        `on z\n    on y\n        test\n        test^\n    end y\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\non y^\nend y\nend z`,\n        `on z\n    on y\n        ^\n    end y\nend z`\n    );\n    testAutoFormat(\n        ed,\n        `on z\non y\nf\nend y\nend z\non z\non y\nf\nend y^\nend z`,\n        `on z\n    on y\n        f\n    end y\nend z\non z\n    on y\n        f\n    end y\n    ^\nend z`\n    );\n});\nt.test('SetIndentation.AddElse', () => {\n    t.say(\n        longstr(\n            `testCodeEditorFeatures.SetIndentation.Add\n                Correct Indentation For Else Clauses`\n        )\n    );\n\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nelse\\nend if\\na^`,\n        `if 2 > 1 then\nelse\nend if\na\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nx\\nelse\\ny\\nend if\\na^`,\n        `if 2 > 1 then\n    x\nelse\n    y\nend if\na\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nelseX^`,\n        `if 2 > 1 then\n    elseX\n    ^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nelse^`,\n        `if 2 > 1 then\nelse\n    ^\nend if`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nz\\nelse^`,\n        `if 2 > 1 then\n    z\nelse\n    ^\nend if`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nelse^\\nend if`,\n        `if 2 > 1 then\nelse\n    ^\nend if`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nz\\nelse^\\nend if`,\n        `if 2 > 1 then\n    z\nelse\n    ^\nend if`\n    );\n    testAutoFormat(\n        ed,\n        `if x then\\nelse if y then\\nelse\\nend if^`,\n        `if x then\nelse if y then\nelse\nend if\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if x then\\nx\\nelse if y then\\ny\\nelse\\nz\\nend if^`,\n        `if x then\n    x\nelse if y then\n    y\nelse\n    z\nend if\n^`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Nested Blocks', () => {\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nrepeat 2 times\\nend repeat\\nelse\\nrepeat\\nend repeat^`,\n        `if 2 > 1 then\n    repeat 2 times\n    end repeat\nelse\n    repeat\n    end repeat\n    ^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nrepeat 2 times\\ny\\nend repeat\\nelse\\nrepeat\\nz\\nend repeat^`,\n        `if 2 > 1 then\n    repeat 2 times\n        y\n    end repeat\nelse\n    repeat\n        z\n    end repeat\n    ^`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Too Many End Blocks', () => {\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nx\\nend if\\nend if^`,\n        `if 2 > 1 then\n    x\nend if\nend if\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nx\\nend repeat\\nend if^`,\n        `if 2 > 1 then\n    x\n    end repeat\nend if\n^`\n    );\n});\nt.test('CodeEditorFeatures.An Else Cannot Stand Alone.', () => {\n    testAutoFormat(\n        ed,\n        `else^`,\n        `else\n^`\n    );\n    testAutoFormat(\n        ed,\n        `else\\nx^`,\n        `else\nx\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nx\\nend if\\nx\\nelse^`,\n        `if 2 > 1 then\n    x\nend if\nx\nelse\n^`\n    );\n    testAutoFormat(\n        ed,\n        `if 2 > 1 then\\nx\\nend if\\nx\\nelse\\ny^`,\n        `if 2 > 1 then\n    x\nend if\nx\nelse\ny\n^`\n    );\n});\nt.test('CodeEditorFeatures.SetIndentation.Continued Lines', () => {\n    assertEq(2, ed.autoIndent.lineContinuation.length, '9o|');\n    for (let c of ed.autoIndent.lineContinuation) {\n        testAutoFormat(ed, `put 2 into x^`, `put 2 into x\\n^`);\n        testAutoFormat(ed, `put 2 into \"${c}\"^`, `put 2 into \"${c}\"\\n^`);\n        testAutoFormat(ed, `put 2 ${c}^`, `put 2 ${c}\\n\\t^`);\n        testAutoFormat(ed, `put 2 ${c}\\ninto x^`, `put 2 ${c}\\n\\tinto x\\n^`);\n        testAutoFormat(ed, `put ${c}\\n2 ${c}^`, `put ${c}\\n\\t2 ${c}\\n\\t^`);\n        testAutoFormat(\n            ed,\n            `put ${c}\\n2 ${c}\\ninto x^`,\n            `put ${c}\\n\\t2 ${c}\\n\\tinto x\\n^`\n        );\n    }\n});\n\n/**\n * make a fake editor object,\n * without making a presenter or using any real UI\n */\nfunction createFakeEd() {\n    let bounds = getUI512WindowBounds();\n    let fakeApp = new UI512Application(bounds, new ElementObserverNoOp());\n    let fakePr = { rebuildFieldScrollbars: () => {} } as any; /* test code */\n    let ed = new VpcPanelScriptEditor('vpcPanelScriptEditor');\n    ed.logicalWidth = 1000;\n    ed.logicalHeight = 1000;\n    ed.refreshFromModel = a => {};\n    ed.saveChangesToModel = (a, b) => {};\n    ed.cbGetAndValidateSelectedVel = s => undefined;\n    ed.vci = { UI512App: () => {} } as any; /* test code */\n    ed.create(fakePr, fakeApp);\n    return ed;\n}\n\n/**\n * mimic hitting Enter at the current caret location\n */\nfunction testAutoFormat(ed: UI512CompCodeEditor, initial: string, expected: string) {\n    initial = initial.replace(/\\r\\n/g, '\\n').replace(/ {4}/g, '\\t');\n    expected = expected.replace(/\\r\\n/g, '\\n').replace(/ {4}/g, '\\t');\n\n    assertTrue(!initial.includes('#'), \"9n|don't need to mark selend\");\n    assertTrue(!expected.includes('#'), \"9m|don't need to mark selend\");\n    assertEq(2, initial.split('^').length, '9l|require precisely one ^');\n    assertEq(2, expected.split('^').length, '9k|require precisely one ^');\n    let caretInit = initial.indexOf('^');\n    let initialtext = initial.replace(/\\^/g, '');\n    ed.el.setFmTxt(FormattedText.newFromUnformatted(initialtext));\n    ed.el.set('selcaret', caretInit);\n    ed.el.set('selend', caretInit);\n    let d = new KeyDownEventDetails(0, 'Enter', '\\n', false, ModifierKeys.None);\n    ed.respondKeydown(d);\n    let textGot = ed.el.getFmTxt().toUnformatted();\n    let caretGot = ed.el.getN('selcaret');\n    assertEq(ed.el.getN('selcaret'), ed.el.getN('selend'), '9j|');\n    let caretExpected = expected.indexOf('^');\n    let textExpected = expected.replace(/\\^/g, '');\n    assertEq(textExpected, textGot, '9i|');\n    assertEq(caretExpected, caretGot, '9h|');\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512Composites.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompToolbox } from './../../ui512/composites/ui512Toolbox';\n/* auto */ import { UI512TextEvents, addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512CompModalDialog } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { KeyDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512CompCodeEditor } from './../../ui512/composites/ui512CodeEditor';\n/* auto */ import { ClipManager } from './../../ui512/textedit/ui512ClipManager';\n/* auto */ import { UI512CompButtonGroup } from './../../ui512/composites/ui512ButtonGroup';\n/* auto */ import { BasicHandlers } from './../../ui512/textedit/ui512BasicHandlers';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512Composites\n *\n * A \"demo\" project showing several composites. (A composite is a\n * group of ui512 elements that are closely related, like a dialog box).\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_\n * (uncomment the line referencing _UI512DemoComposites_) to confirm that manually\n * interacting with the buttons has the expected behavior\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512Composites');\nexport let testCollectionUI512Composites = t;\n\nt.atest('Test Drawing Composites', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512Composites().testDrawComposites()\n    )\n);\n\n/**\n * an example layout with 'composites'\n * can be used interactively if you add the line\n * this.presenter = new UI512DemoComposites();\n * to rootUI512.ts, and it's also part of our test suite\n */\nexport class TestDrawUI512Composites {\n    uiContext = false;\n    addElements(pr: UI512TestCompositesPresenter, bounds: number[]) {\n        let grp = new UI512ElGroup('grp');\n        pr.app.addGroup(grp);\n        pr.testModalDlg.labelText = 'aa';\n        pr.testModalDlg.providedText = 'sample input';\n\n        /* add bg */\n        let bg = new UI512ElButton('bg');\n        grp.addElement(pr.app, bg);\n        bg.set('style', UI512BtnStyle.Opaque);\n        bg.setDimensions(bounds[0], bounds[1], bounds[2], bounds[3]);\n        bg.set('autohighlight', false);\n\n        /* add choice groups */\n        this.addElementsChoiceGroups(pr);\n\n        /* add toolbox */\n        this.addElementsToolbox(pr);\n\n        /* add code editor */\n        this.addElementsCodeEditor(pr);\n    }\n\n    protected addElementsCodeEditor(pr: UI512TestCompositesPresenter) {\n        pr.testEditor.x = 200;\n        pr.testEditor.y = pr.testRadioBtns.y;\n        pr.testEditor.logicalWidth = 200;\n        pr.testEditor.logicalHeight = 200;\n        pr.testEditor.autoIndent.caseSensitive = false;\n        pr.testEditor.autoIndent.lineContinuation = [\n            '\\\\',\n            '\\xC2' /* roman logical not */\n        ];\n        pr.testEditor.lineCommentPrefix = '--~ ';\n        pr.testEditor.create(pr, pr.app);\n        pr.testEditor.setCaption(pr.app, 'Script \"New Button\"');\n        pr.testEditor.setContent(\n            `abc\nstart1\nstart b2\non custom\nend other\n123 \\\\\n456 \\\\\n789\nend custom\nend b2\nstart b22\nstart\nend1`.replace(/\\r\\n/g, '\\n')\n        );\n    }\n\n    protected addElementsToolbox(pr: UI512TestCompositesPresenter) {\n        const iconW = 20;\n        pr.testToolbox.iconGroupId = '001';\n        pr.testToolbox.x = 50;\n        pr.testToolbox.y = 300;\n        pr.testToolbox.iconH = 22;\n        pr.testToolbox.widthOfIcon = (id: string) => {\n            return iconW;\n        };\n        pr.testToolbox.logicalWidth = 3 * iconW - 2;\n        pr.testToolbox.logicalHeight = 1;\n        pr.testToolbox.items = [\n            ['rectangle', 9],\n            ['roundrect', 10],\n            ['bucket', 11],\n            ['cirle', 12],\n            ['heart', 13],\n            ['letter', 14]\n        ];\n        pr.testToolbox.create(pr, pr.app);\n    }\n\n    protected addElementsChoiceGroups(pr: UI512TestCompositesPresenter) {\n        pr.testRadioBtns.items = [\n            ['apple', 'lngApple'],\n            ['cherry', 'lngCherry'],\n            ['strawberry', 'lngStrawberry']\n        ];\n        pr.testRadioBtns.isExclusive = true;\n        pr.testRadioBtns.logicalWidth = 100;\n        pr.testRadioBtns.logicalHeight = 1;\n        pr.testRadioBtns.x = 50;\n        pr.testRadioBtns.y = 50;\n        pr.testRadioBtns.create(pr, pr.app);\n        pr.testCheckBtns.items = [\n            ['fries', 'lngFries'],\n            ['hamburger', 'lngHamburger'],\n            ['soda', 'lngSoda'],\n            ['hot dog', 'lngHot Dog']\n        ];\n        pr.testCheckBtns.isExclusive = false;\n        pr.testCheckBtns.logicalWidth = 100;\n        pr.testCheckBtns.logicalHeight = 1;\n        pr.testCheckBtns.x = 50;\n        pr.testCheckBtns.y = 130;\n        pr.testCheckBtns.create(pr, pr.app);\n    }\n\n    drawTestCase(\n        testNumber: number,\n        tmpCanvas: CanvasWrapper,\n        w: number,\n        h: number,\n        complete: RenderComplete\n    ) {\n        tmpCanvas.clear();\n        let testPr = new UI512TestCompositesPresenter();\n        testPr.init();\n        testPr.inited = true;\n        testPr.app = new UI512Application([0, 0, w, h], testPr);\n        this.addElements(testPr, testPr.app.bounds);\n        testPr.rebuildFieldScrollbars();\n\n        /* first pass rendering adds the scrollbars */\n        /* don't show any borders */\n        testPr.view.renderBorders = () => {};\n        testPr.needRedraw = true;\n        testPr.render(tmpCanvas, 1, complete);\n        tmpCanvas.clear();\n\n        if (!complete.complete) {\n            /* the fonts aren't loaded yet, let's wait until later */\n            return;\n        }\n\n        if (testNumber === 0) {\n            this.drawTestCaseComposites1(testPr);\n        } else {\n            this.drawTestCaseComposites2(testPr);\n        }\n\n        /* second pass rendering */\n        testPr.view.renderBorders = () => {};\n        testPr.needRedraw = true;\n        testPr.render(tmpCanvas, 1, complete);\n    }\n\n    drawTestCaseComposites1(pr: UI512TestCompositesPresenter) {\n        pr.testRadioBtns.setWhichChecked(pr.app, ['apple']);\n        pr.testCheckBtns.setWhichChecked(pr.app, ['fries', 'hamburger', 'soda']);\n        pr.setCurrentFocus(pr.testEditor.el.id);\n        this.simulateKey(pr, 'Home', '', false, true);\n        this.simulateKey(pr, 'Enter', '', false, false);\n        this.simulateKey(pr, 'ArrowRight', '', true, false);\n\n        pr.useOSClipboard = false;\n        let clipManager = pr.clipManager;\n        assertTrue(clipManager instanceof ClipManager, '9p|');\n        clipManager.simClipboard = '';\n        this.simulateKey(pr, 'C', 'c', false, true);\n        assertEq('\\n', clipManager.simClipboard, '1R|');\n    }\n\n    drawTestCaseComposites2(pr: UI512TestCompositesPresenter) {\n        pr.testRadioBtns.setWhichChecked(pr.app, ['apple']);\n        pr.testRadioBtns.setWhichChecked(pr.app, ['cherry']);\n        pr.testCheckBtns.setWhichChecked(pr.app, ['fries', 'hamburger', 'soda']);\n        pr.testCheckBtns.setWhichChecked(pr.app, ['hot dog']);\n        pr.testToolbox.setWhich(pr.app, 'letter');\n        pr.setCurrentFocus(pr.testEditor.el.id);\n        this.simulateKey(pr, 'Home', '', false, true);\n        this.simulateKey(pr, 'A', 'a', false, true);\n        this.simulateKey(pr, 'Backspace', '', false, false);\n        this.simulateText(pr, 'on a');\n        this.simulateKey(pr, 'Enter', '', false, false);\n        this.simulateText(pr, 'on b');\n        this.simulateKey(pr, 'Enter', '', false, false);\n        this.simulateKey(pr, 'ArrowLeft', '', false, false);\n        this.simulateKey(pr, 'ArrowLeft', '', false, false);\n        this.simulateKey(pr, 'ArrowLeft', '', false, false);\n        this.simulateKey(pr, 'Enter', '', false, false);\n        this.simulateText(pr, 'end bb');\n        this.simulateKey(pr, 'Enter', '', false, false);\n        this.simulateKey(pr, 'ArrowRight', '', true, false);\n    }\n\n    testDrawComposites() {\n        const w = 928;\n        const h = 360;\n        const screensToDraw = 2;\n        assertEq(w, ScreenConsts.ScreenWidth, '1Q|');\n        let tmpCanvasDom = window.document.createElement('canvas');\n        tmpCanvasDom.width = w;\n        tmpCanvasDom.height = h;\n        let tmpCanvas = new CanvasWrapper(tmpCanvasDom);\n\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = true;\n            for (let i = 0; i < screensToDraw; i++) {\n                this.drawTestCase(i, tmpCanvas, w, h, complete);\n                let dest = [0, i * h, w, h];\n                canvas.drawFromImage(\n                    tmpCanvas.canvas,\n                    0,\n                    0,\n                    w,\n                    h,\n                    dest[0],\n                    dest[1],\n                    dest[0],\n                    dest[1],\n                    dest[2],\n                    dest[3]\n                );\n            }\n        };\n\n        const totalH = h * screensToDraw;\n        return new CanvasTestParams(\n            'drawComposites',\n            '/resources03a/test/drawcompositesexpected.png',\n            draw,\n            w,\n            totalH,\n            this.uiContext\n        );\n    }\n\n    simulateKey(\n        pr: UI512TestCompositesPresenter,\n        keyCode: string,\n        keyChar: string,\n        isShift: boolean,\n        isCmd = false\n    ) {\n        let mods = isShift ? ModifierKeys.Shift : ModifierKeys.None;\n        mods |= isCmd ? ModifierKeys.Cmd : ModifierKeys.None;\n        let d = new KeyDownEventDetails(0, keyCode, keyChar, false, mods);\n        pr.rawEventCanThrow(d);\n    }\n\n    simulateText(pr: UI512TestCompositesPresenter, s: string) {\n        assertTrue(s.match(/^(\\w| )*$/), '1P|expected only words/spaces');\n        for (let chr of s) {\n            this.simulateKey(pr, chr, chr, false, false);\n        }\n    }\n}\n\n/**\n * presenter that will be driven by tests to take a screenshot of rendered elements\n */\nexport class UI512TestCompositesPresenter extends UI512Presenter {\n    testRadioBtns = new UI512CompButtonGroup('testRadioBtns');\n    testCheckBtns = new UI512CompButtonGroup('testCheckBtns');\n    testToolbox = new UI512CompToolbox('testToolbox');\n    testEditor = new UI512CompCodeEditor('testCodeEditor');\n    testModalDlg = new UI512CompModalDialog('testModalDlg');\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n        let editTextBehavior = new UI512TextEvents();\n        this.listeners[UI512EventType.KeyDown] = [\n            BasicHandlers.basicKeyShortcuts,\n            UI512TestCompositesPresenter.respondKeyDown,\n            /* inserted before editTextBehavior so that we\n            can recieve the \"Enter\" keystroke */ editTextBehavior.onKeyDown.bind(\n                editTextBehavior\n            )\n        ];\n    }\n\n    protected static respondKeyDown(\n        pr: UI512TestCompositesPresenter,\n        d: KeyDownEventDetails\n    ) {\n        let focus = pr.getCurrentFocus();\n        if (\n            pr.testEditor.children.length &&\n            focus &&\n            pr.testEditor.el &&\n            focus === pr.testEditor.el.id\n        ) {\n            pr.testEditor.respondKeydown(d);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512DrawText.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { TextFontStyling, textFontStylingToString, typefacenameToTypefaceIdFull } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { DrawTextArgs } from './../../ui512/drawtext/ui512DrawTextArgs';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { CanvasTestParams, GetDrawParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512Text\n *\n * A \"demo\" project showing text drawn in many fonts and alignments\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ (uncomment the\n * line referencing _UI512DemoText_) to test combinations\n * of styles and fonts, by clicking the buttons like Bold and Italic\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512DrawText', true);\nexport let testCollectionUI512DrawText = t;\n\nt.atest('Text Core Fonts', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () => new TestDrawUI512Text().draw1())\n);\nt.atest('Text All 0.2 Fonts', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () => new TestDrawUI512Text().draw2())\n);\nt.atest('Text Wrap, align, underlign', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () => new TestDrawUI512Text().draw3())\n);\nt.atest('Text corner cases', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () => new TestDrawUI512Text().draw4())\n);\nt.atest('Text All 0.3 fonts', () =>\n    TestUtilsCanvas.RenderAndCompareImages(\n        false,\n        new TestDrawUI512Text().drawTest5DrawAll()\n    )\n);\nt.atest('Text underline, condense, grayed', () =>\n    TestUtilsCanvas.RenderAndCompareImages(\n        false,\n        new TestDrawUI512Text().drawTest6DrawAll()\n    )\n);\n\n/**\n * A demo project showing text drawn in many fonts and alignments\n */\nexport class TestDrawUI512Text {\n    uiContext = false;\n    readonly margin = 1;\n    readonly demoText1 = 'File Edit Tools #123 Draw! :) ^^ {omnivore}';\n    readonly demoText2 = longstr(`a quick brown fox jumps over the lazy dog\n        QUICKBROWNFOXJUMPSVRTHELAZYDG,.:)0123456789!@#$%^&*(?/|\\\\_-=`);\n\n    addFonts(listFonts: string[], sFaces: string, sSizes: string, sStyles: string) {\n        let faces = sFaces.split(',');\n        let sizes = sSizes.split(',');\n        let styles = sStyles.split(',');\n        for (let fnt of faces) {\n            for (let style of styles) {\n                for (let sz of sizes) {\n                    listFonts.push(`${fnt}_${sz}_${style}`);\n                }\n            }\n        }\n    }\n\n    getFormattedText(list: string[], addNewlines: boolean, demo: string) {\n        demo += addNewlines ? '\\n' : '';\n        let demoTextFormatted = '';\n        for (let i = 0; i < list.length; i++) {\n            demoTextFormatted += UI512DrawText.setFont(demo, list[i]);\n        }\n\n        return demoTextFormatted;\n    }\n\n    draw1() {\n        /* these we have confirmed in an emulator as pixel-perfect */\n        const imWidth = 504;\n        const imHeight = 556;\n        let list: string[] = [];\n        this.addFonts(\n            list,\n            'chicago,courier,geneva',\n            '10,12,14,18,24',\n            'biuosdce,+biuosdce'\n        );\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = bool(\n                drawText.drawStringIntoBox(\n                    this.getFormattedText(list, true, this.demoText1),\n                    canvas,\n                    new DrawTextArgs(this.margin, this.margin, imWidth - 5, imHeight - 5)\n                )\n            );\n        };\n\n        return new CanvasTestParams(\n            'drawtext1',\n            '/resources03a/test/drawtextexpected1.png',\n            draw,\n            imWidth,\n            imHeight,\n            this.uiContext\n        );\n    }\n\n    draw2() {\n        /* not yet confirmed as pixel-perfect */\n        const imWidth = 540;\n        const imHeight = 2450;\n        let list: string[] = [];\n        this.addFonts(\n            list,\n            'chicago,courier,geneva',\n            '10,12,14,18,24',\n            'b+iuosdce,biu+osdce,+b+iuosdce,b+iu+osdce'\n        );\n        this.addFonts(\n            list,\n            'new york,times',\n            '10,12,14,18,24',\n            'biuosdce,+biuosdce,b+iuosdce,biu+osdce,+b+iuosdce,b+iu+osdce'\n        );\n\n        this.addFonts(list, 'helvetica', '12', 'biuosdce');\n        this.addFonts(list, 'monaco', '9,12', 'biuosdce');\n        this.addFonts(list, 'symbol', '12', 'biuosdce');\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = bool(\n                drawText.drawStringIntoBox(\n                    this.getFormattedText(list, true, this.demoText1),\n                    canvas,\n                    new DrawTextArgs(this.margin, this.margin, imWidth - 5, imHeight - 5)\n                )\n            );\n        };\n\n        return new CanvasTestParams(\n            'drawtext2',\n            '/resources03a/test/drawtextexpected2.png',\n            draw,\n            imWidth,\n            imHeight,\n            this.uiContext\n        );\n    }\n\n    draw3() {\n        /* test wrap, halign, valign, mixsize, underline and condense+extend */\n        const imWidth = 300;\n        const imHeight = 556;\n        let list: string[] = [];\n        this.addFonts(\n            list,\n            'geneva',\n            '10,24,12',\n            'biuosdce,b+i+uosdce,biuosd+ce,bi+uosdc+e'\n        );\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = bool(\n                drawText.drawStringIntoBox(\n                    this.getFormattedText(list, false, this.demoText1),\n                    canvas,\n                    new DrawTextArgs(\n                        this.margin,\n                        this.margin,\n                        imWidth - 5,\n                        imHeight - 5,\n                        true,\n                        true,\n                        true\n                    )\n                )\n            );\n        };\n\n        return new CanvasTestParams(\n            'drawtext3',\n            '/resources03a/test/drawtextexpected3.png',\n            draw,\n            imWidth,\n            imHeight,\n            this.uiContext\n        );\n    }\n\n    draw4() {\n        /* test corner cases */\n        const imWidth = 700;\n        const imHeight = 200;\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            let draws = (s: string, args: DrawTextArgs) => {\n                canvas.fillRect(\n                    args.boxX,\n                    args.boxY,\n                    args.boxW,\n                    args.boxH,\n                    0,\n                    0,\n                    imWidth,\n                    imHeight,\n                    '#dddddd'\n                );\n                complete.andB(bool(drawText.drawStringIntoBox(s, canvas, args)));\n            };\n\n            let margin = 10;\n            for (let i = 0; i < 6; i++) {\n                let args = new DrawTextArgs(\n                    margin + i * (margin + 100),\n                    margin,\n                    100,\n                    200,\n                    false,\n                    false,\n                    true\n                );\n                let s = '';\n                if (i === 0) {\n                    /* consecutive newlines */\n                    s = '\\n\\na\\n\\n\\n';\n                    args.hAlign = true;\n                } else if (i === 1) {\n                    /* all newlines */\n                    s = '\\n\\n\\n';\n                } else if (i === 2) {\n                    /* very narrow, wrap enabled */\n                    /* todo: putting abc\\ndef into a very narrow field of\n                    width 1px, wrapping enabled */\n                    /* currently adds an extra vertical space between the\n                    c and the d */\n                    /* doesn't look that bad, but maybe something to revisit */\n                    s = UI512DrawText.setFont(\n                        'abcd\\nef\\n\\n\\ngh',\n                        `geneva_18_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n\n                    args.boxW = 3;\n                    args.wrap = true;\n                } else if (i === 3) {\n                    /* very narrow, wrap disabled */\n                    s = UI512DrawText.setFont(\n                        'abcd\\nef\\n\\n\\ngh',\n                        `geneva_18_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n\n                    args.boxW = 3;\n                    args.wrap = false;\n                } else if (i === 4) {\n                    /* test drawing interesting characters */\n                    s = 'a\\x01b\\x01\\x01\\x01\\x01'; /* 1-pixel spaces */\n                    s += '|';\n                    s += String.fromCharCode('u'.charCodeAt(0) + 3 * 16); /* black dot */\n                    s += String.fromCharCode('t'.charCodeAt(0) + 5 * 16); /* script f */\n                    s += '\\n{\\x06}{\\x1d}'; /* non-printable should become ? */\n                    s += '\\n{\\xfa}{\\xfb}'; /* upper-ascii should become ? */\n                    s +=\n                        '\\n{' +\n                        String.fromCharCode('m'.charCodeAt(0) + 7 * 16) +\n                        '}'; /* in bounds, become a rectangle */\n                    s +=\n                        '\\n{' +\n                        String.fromCharCode('m'.charCodeAt(0) + 8 * 16) +\n                        '}'; /* in bounds, become a rectangle */\n                    s = UI512DrawText.setFont(\n                        s,\n                        `geneva_18_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                } else if (i === 5) {\n                    /* unsupported typefaces should go back to the default font */\n                    let available = UI512DrawText.setFont(\n                        'abc',\n                        `geneva_18_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                    s = available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `geneva_123_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `geneva_19_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `chicago_0_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `genevaextra_12_${textFontStylingToString(\n                            TextFontStyling.Default\n                        )}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `notavailable_12_${textFontStylingToString(\n                            TextFontStyling.Default\n                        )}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'abc',\n                        `Courier12_12_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                    s += available;\n                    s += UI512DrawText.setFont(\n                        'serif',\n                        `cOurIer_14_${textFontStylingToString(TextFontStyling.Default)}`\n                    );\n                } else {\n                    assertTrue(false, '1l|unsupported');\n                }\n\n                draws(s, args);\n            }\n        };\n\n        return new CanvasTestParams(\n            'drawtext4',\n            '/resources03a/test/drawtextexpected4.png',\n            draw,\n            imWidth,\n            imHeight,\n            this.uiContext\n        );\n    }\n\n    drawTest5DrawAll() {\n        let allfonts = 'chicago,courier,geneva,new york,times,helvetica,monaco,symbol'.split(\n            ','\n        );\n        let allsizes = '24,18,14,12,10,9'.split(',');\n        let ret: GetDrawParams[] = [];\n        for (let font of allfonts) {\n            for (let size of allsizes) {\n                ret.push(() => this.drawTest5DrawOne(font, size));\n            }\n        }\n\n        return ret;\n    }\n\n    drawTest5DrawOne(font: string, size: string) {\n        let allstyles = longstr(\n            `biuosdce\n        |+biuosdce\n        |b+iuosdce\n        |biu+osdce\n        |+b+iuosdce\n        |b+iu+osdce\n        |+biu+osdce\n        |+b+iu+osdce`,\n            ''\n        ).split('|');\n        let list: string[] = [];\n        this.addFonts(list, font, size, allstyles.join(','));\n        let txt = this.getFormattedText(list, true, this.demoText2);\n\n        let maxWidths = {\n            '24': 1280,\n            '18': 1280,\n            '14': 1076,\n            '12': 960,\n            '10': 870,\n            '9': 750\n        };\n        let maxHeights = {\n            '24': 300,\n            '18': 256,\n            '14': 180,\n            '12': 150,\n            '10': 150,\n            '9': 140\n        };\n        let w = maxWidths[size];\n        let h = maxHeights[size];\n        assertTrue(w, 'Ui|could not find in maxWidths');\n        assertTrue(h, 'Uh|could not find in maxHeights');\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = bool(\n                drawText.drawStringIntoBox(\n                    txt,\n                    canvas,\n                    new DrawTextArgs(3, 1, w - 4, h - 1, false, false, false)\n                )\n            );\n        };\n\n        let fontid = typefacenameToTypefaceIdFull(`${font}_12_biuosdce`).split('_')[0];\n        return new CanvasTestParams(\n            `drawtext5_${fontid}_${size}`,\n            `/resources03a/test/verifyfonts/${fontid}_${size}.png`,\n            draw,\n            w,\n            h,\n            this.uiContext\n        );\n    }\n\n    drawTest6DrawOne(font: string, sizes: string, grayed: string) {\n        const w = 1076;\n        const h = 180;\n        let d = grayed ? '+d' : 'd';\n        let listFonts: string[] = [];\n        let arSizes = sizes.split('+');\n        for (let i = 0; i < arSizes.length; i++) {\n            let style = `biuos${d}ce`;\n            listFonts.push(`${font}_${arSizes[i]}_${style}`);\n            style = `bi+uos${d}ce`;\n            listFonts.push(`${font}_${arSizes[i]}_${style}`);\n            style = `biuos${d}+ce`;\n            listFonts.push(`${font}_${arSizes[i]}_${style}`);\n            style = `biuos${d}c+e`;\n            listFonts.push(`${font}_${arSizes[i]}_${style}`);\n        }\n        let txt = this.getFormattedText(listFonts, true, this.demoText2);\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = bool(\n                drawText.drawStringIntoBox(\n                    txt,\n                    canvas,\n                    new DrawTextArgs(3, 1, w, h, false, false, false)\n                )\n            );\n        };\n\n        let fontid = typefacenameToTypefaceIdFull(`${font}_12_biuosdce`).split('_')[0];\n        let filename = `${grayed}_${fontid}_${sizes}`;\n        return new CanvasTestParams(\n            `drawtext6_${filename}`,\n            `/resources03a/test/verifyfonts/underline_${filename}.png`,\n            draw,\n            w,\n            h,\n            this.uiContext\n        );\n    }\n\n    drawTest6DrawAll() {\n        let allfonts = 'chicago,geneva,monaco'.split(',');\n        let allsizes = ['12+14'];\n        let allgrayed = ['', 'grayed'];\n        let ret: GetDrawParams[] = [];\n        for (let font of allfonts) {\n            for (let size of allsizes) {\n                for (let grayed of allgrayed) {\n                    ret.push(() => this.drawTest6DrawOne(font, size, grayed));\n                }\n            }\n        }\n\n        return ret;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512Elements.ts",
    "content": "\n/* auto */ import { VpcElField, VpcTextFieldAsGeneric } from './../../vpc/vel/velField';\n/* auto */ import { VpcElBase, VpcHandleLinkedVels } from './../../vpc/vel/velBase';\n/* auto */ import { getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { Util512, assertEq } from './../../ui512/utils/util512';\n/* auto */ import { UI512Lines } from './../../ui512/textedit/ui512TextLines';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { ElementObserverNoOp, ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { largeArea, specialCharFontChange } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * testing UI512Elements\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUI512Elements');\nexport let testCollectionUI512Elements = t;\n\nt.test('UI512ElGroupIterEls', () => {\n    let grp = makeFakeGroup()[1];\n\n    /* iterate through elements in a group */\n    let s = '';\n    for (let el of grp.iterEls()) {\n        s += el.id + ',';\n    }\n\n    assertEq('btn1,btn2,btn3,', s, 'Ah|');\n\n    /* iterate through elements in a group, in reverse order */\n    s = '';\n    for (let el of grp.iterElsReversed()) {\n        s += el.id + ',';\n    }\n\n    assertEq('btn3,btn2,btn1,', s, 'Ag|');\n});\nt.test('UI512ElGroupRemoveAllEls', () => {\n    let grp = makeFakeGroup()[1];\n    assertEq('btn1,btn2,btn3,', listElems(grp), 'Af|');\n\n    /* remove all elements */\n    grp.removeAllEls();\n    assertEq('', listElems(grp), 'Ae|');\n});\nt.test('UI512ElGroupCountElems', () => {\n    let grp = makeFakeGroup()[1];\n\n    /* count all elements */\n    assertEq(3, grp.countElems(), 'Ad|');\n});\nt.test('AddElementAfter', () => {\n    let [app, grp] = makeFakeGroup();\n    assertEq('btn1,btn2,btn3,', listElems(grp), 'Ac|');\n\n    /* disallow adding duplicates */\n    let btn3dupe = new UI512ElButton('btn3');\n    assertThrows('K^|', 'found in grp', () => grp.addElement(app, btn3dupe));\n    assertEq('btn1,btn2,btn3,', listElems(grp), 'Ab|');\n\n    /* add after everything */\n    let btn4 = new UI512ElButton('btn4');\n    grp.addElementAfter(app, btn4, 'btn3');\n    assertEq('btn1,btn2,btn3,btn4,', listElems(grp), 'Aa|');\n\n    /* add with special suffix 1 */\n    let btn2_start = new UI512ElButton('btn2##start');\n    grp.addElementAfter(app, btn2_start, 'btn2');\n    assertEq('btn1,btn2,btn2##start,btn3,btn4,', listElems(grp), 'AZ|');\n\n    /* add with special suffix 2 */\n    let btn2_next = new UI512ElButton('btn2##next');\n    grp.addElementAfter(app, btn2_next, 'btn2');\n    assertEq('btn1,btn2,btn2##start,btn2##next,btn3,btn4,', listElems(grp), 'AY|');\n\n    /* add with special suffix 3 */\n    let btn2_third = new UI512ElButton('btn2##3');\n    grp.addElementAfter(app, btn2_third, 'btn2');\n    assertEq(\n        'btn1,btn2,btn2##start,btn2##next,btn2##3,btn3,btn4,',\n        listElems(grp),\n        'AX|'\n    );\n});\nt.test('GroupFindById', () => {\n    let grp = makeFakeGroup()[1];\n\n    /* find existing */\n    let el = grp.findEl('btn1');\n    assertEq('btn1', el?.id, 'AW|');\n\n    /* find not existing */\n    el = grp.findEl('btn9');\n    assertEq(undefined, el, 'AV|');\n\n    /* get existing */\n    el = grp.getEl('btn1');\n    assertEq('btn1', el.id, 'AU|');\n\n    /* get not existing */\n    assertThrows('K]|', 'not find', () => grp.getEl('btn9'));\n});\nt.test('AppFindById', () => {\n    let app = makeFakeGroup()[0];\n    let fakeGrp2 = new UI512ElGroup('fakegrp2');\n    app.addGroup(fakeGrp2);\n    let btn4 = new UI512ElButton('btn4');\n    fakeGrp2.addElement(app, btn4);\n    let btn5 = new UI512ElButton('btn5');\n    fakeGrp2.addElement(app, btn5);\n    btn4.set('labeltext', 'fromnewgroup');\n    btn5.set('labeltext', 'fromnewgroup');\n\n    /* find existing */\n    let el = app.findEl('btn1');\n    assertEq('btn1', el?.id, 'AT|');\n    assertEq('', el?.getS('labeltext'), 'AS|');\n\n    /* find not existing */\n    el = app.findEl('btn9');\n    assertEq(undefined, el, 'AR|');\n\n    /* get existing */\n    el = app.getEl('btn1');\n    assertEq('btn1', el.id, 'AQ|');\n    assertEq('', el.getS('labeltext'), 'AP|');\n\n    /* get not existing */\n    assertThrows('K[|', 'not found', () => app.getEl('btn9'));\n\n    /* from other group */\n    el = app.getEl('btn4');\n    assertEq('btn4', el.id, 'AO|');\n    assertEq('fromnewgroup', el.getS('labeltext'), 'AN|');\n});\nt.test('CoordsToElement', () => {\n    let [app, grp] = makeFakeGroup();\n    grp.getEl('btn1').setDimensionsX1Y1(10, 20, 100, 200);\n    grp.getEl('btn2').setDimensionsX1Y1(20, 30, 110, 210);\n\n    /* where no element is */\n    let el = app.coordsToElement(5, 15);\n    assertEq(undefined, el, 'AM|');\n\n    /* where only first element is */\n    el = app.coordsToElement(15, 25);\n    assertEq('btn1', el?.id, 'AL|');\n\n    /* where both elements are (highest gets priority) */\n    el = app.coordsToElement(70, 80);\n    assertEq('btn2', el?.id, 'AK|');\n\n    /* where only second element is */\n    el = app.coordsToElement(105, 205);\n    assertEq('btn2', el?.id, 'AJ|');\n\n    /* where no element is */\n    el = app.coordsToElement(115, 215);\n    assertEq(undefined, el, 'AI|');\n});\nt.test('UpdateBoundsBasedOnChildren', () => {\n    let grp = makeFakeGroup()[1];\n    assertEq([0, 0, largeArea, largeArea], grp.mouseInteractionBounds, 'AH|');\n\n    /* width and height are 0 for an empty group */\n    grp.updateBoundsBasedOnChildren();\n    assertEq([0, 0, 0, 0], grp.mouseInteractionBounds, 'AG|');\n\n    /* find total width and height when all children have the same size */\n    grp.getEl('btn1').setDimensions(15, 30, 40, 50);\n    grp.getEl('btn2').setDimensions(15, 30, 40, 50);\n    grp.getEl('btn3').setDimensions(15, 30, 40, 50);\n    grp.updateBoundsBasedOnChildren();\n    assertEq([15, 30, 40, 50], grp.mouseInteractionBounds, 'AF|');\n\n    /* find total width and height when all children have different sizes */\n    grp.getEl('btn1').setDimensions(15, 30, 40, 50);\n    grp.getEl('btn2').setDimensions(20, 30, 40, 60);\n    grp.getEl('btn3').setDimensions(25, 30, 400, 49);\n    grp.updateBoundsBasedOnChildren();\n    assertEq([15, 30, 410, 60], grp.mouseInteractionBounds, 'AE|');\n});\nt.test('UI512ElTextFieldAsGeneric', () => {\n    let el = new UI512ElTextField('fld1');\n    el.observer = new ElementObserverNoOp();\n    el.set('h', 123);\n    let gel = new UI512ElTextFieldAsGeneric(el);\n\n    /* test setFmtTxt */\n    let txt = FormattedText.newFromUnformatted('abc');\n    gel.setFmtTxt(txt, ChangeContext.Default);\n    let got = gel.getFmtTxt();\n    assertEq('abc', got.toUnformatted(), 'AD|');\n\n    /* test setSel */\n    gel.setSel(4, 7);\n    assertEq([4, 7], gel.getSel(), 'AC|');\n\n    /* test others */\n    assertEq(true, gel.canEdit(), 'AB|');\n    assertEq(true, gel.canSelectText(), 'AA|');\n    assertEq(true, gel.isMultiline(), 'A9|');\n    assertEq('fld1', gel['el'].id, 'A8|');\n    assertEq(123, gel.getHeight(), 'A7|');\n    assertEq('chicago_12_biuosdce', gel.getDefaultFont(), 'A6|');\n    assertEq(el.id, gel.getReadOnlyUI512().id, 'A5|');\n\n    /* test scroll amount */\n    el.set('scrollamt', 456);\n    assertEq(456, gel.getScrollAmt(), 'A4|');\n    gel.setScrollAmt(undefined);\n    assertEq(456, gel.getScrollAmt(), 'A3|');\n    gel.setScrollAmt(500);\n    assertEq(500, gel.getScrollAmt(), 'A2|');\n});\nt.test('VpcTextFieldAsGeneric', () => {\n    let el = new UI512ElTextField('fld1');\n    el.observer = new ElementObserverNoOp();\n    let higher = new HigherNoReplication_TestOnly();\n\n    let vel = new VpcElField('12', '34');\n    vel.observer = new ElementObserverNoOp();\n    vel.setOnVel('h', 123, higher);\n    let gel = new VpcTextFieldAsGeneric(el, vel, higher);\n\n    /* test setFmtTxt */\n    let txt = FormattedText.newFromUnformatted('abc');\n    gel.setFmtTxt(txt, ChangeContext.Default);\n    let got = gel.getFmtTxt();\n    assertEq('abc', got.toUnformatted(), 'A1|');\n\n    /* test setSel */\n    gel.setSel(4, 7);\n    assertEq([4, 7], gel.getSel(), 'A0|');\n\n    /* test others */\n    assertEq(true, gel.canEdit(), '9~|');\n    assertEq(true, gel.canSelectText(), '9}|');\n    assertEq(true, gel.isMultiline(), '9||');\n    assertEq('12', gel['impl'].idInternal, '9{|');\n    assertEq(123, gel.getHeight(), '9`|');\n    assertEq('geneva_12_biuosdce', gel.getDefaultFont(), '9_|');\n    assertEq(el.id, gel.getReadOnlyUI512().id, '9^|');\n\n    /* test scroll amount */\n    vel.setOnVel('scroll', 456, higher);\n    assertEq(456, gel.getScrollAmt(), '9]|');\n    gel.setScrollAmt(undefined);\n    assertEq(456, gel.getScrollAmt(), '9[|');\n    gel.setScrollAmt(500);\n    assertEq(500, gel.getScrollAmt(), '9@|');\n});\nt.test('UI512Lines.flatten', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n    let flattened = lines.flatten();\n    assertEq(txt.toSerialized(), flattened.toSerialized(), '9?|');\n});\nt.test('UI512Lines.indexToLineNumber', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n\n    let got = Util512.range(0, 10).map(n => lines.indexToLineNumber(n));\n    assertEq('0,0,0,0,1,1,1,2,2,2', got.join(','), '9>|');\n    assertEq(2, lines.indexToLineNumber(1000), '9=|');\n});\nt.test('UI512Lines.lineNumberToIndex', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n\n    let got = Util512.range(0, 10).map(n => lines.lineNumberToIndex(n));\n    assertEq('0,4,7,7,7,7,7,7,7,7', got.join(','), '9<|');\n    got = Util512.range(0, 10).map(n => UI512Lines.fastLineNumberToIndex(txt, n));\n    assertEq('0,4,7,7,7,7,7,7,7,7', got.join(','), '9;|');\n});\nt.test('UI512Lines.lineNumberToLineEndIndex', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n\n    let got = Util512.range(0, 10).map(n => lines.lineNumberToLineEndIndex(n));\n    assertEq('3,6,10,10,10,10,10,10,10,10', got.join(','), '9:|');\n    let fastGot = Util512.range(0, 10).map(n =>\n        UI512Lines.fastLineNumberAndEndToIndex(txt, n).join('-')\n    );\n    assertEq('0-4,4-7,7-11,7-11,7-11,7-11,7-11,7-11,7-11,7-11', fastGot.join(','), '9/|');\n});\nt.test('UI512Lines.length', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n    assertEq(txt.len(), lines.length(), '9.|');\n    assertEq(txt.toUnformatted().length, lines.length(), '9-|');\n});\nt.test('UI512Lines.getLineUnformatted', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n    let lines = new UI512Lines(txt);\n\n    assertEq('abc\\n', lines.getLineUnformatted(0), '9,|');\n    assertEq('de\\n', lines.getLineUnformatted(1), '9+|');\n    assertEq('fgh', lines.getLineUnformatted(2), '9*|');\n});\nt.test('UI512Lines.alterSelectedLines', () => {\n    let c = specialCharFontChange;\n    let txt = FormattedText.newFromSerialized(\n        `${c}f1${c}abc\\n${c}f2${c}de\\n${c}f1${c}fgh`\n    );\n\n    let [fl, selc, selend] = UI512Lines.alterSelectedLines(txt, 1, 5, t => {\n        let newTxt = FormattedText.newFromUnformatted('--');\n        newTxt.append(t);\n        t.deleteAll();\n        t.append(newTxt);\n    });\n\n    assertEq('--abc\\n--de\\nfgh', fl.toUnformatted(), '9)|');\n    assertEq(0, selc, '9(|');\n    assertEq(10, selend, '9&|');\n});\nt.test('UI512Lines.getNonSpaceStartOfLine', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(0, UI512Lines.getNonSpaceStartOfLine(txt, true), '9%|');\n    assertEq(0, UI512Lines.getNonSpaceStartOfLine(txt, false), '9$|');\n    txt = FormattedText.newFromUnformatted(' abc');\n    assertEq(1, UI512Lines.getNonSpaceStartOfLine(txt, true), '9#|');\n    assertEq(1, UI512Lines.getNonSpaceStartOfLine(txt, false), '9!|');\n    txt = FormattedText.newFromUnformatted('    abc   ');\n    assertEq(4, UI512Lines.getNonSpaceStartOfLine(txt, true), '9 |');\n    assertEq(4, UI512Lines.getNonSpaceStartOfLine(txt, false), '9z|');\n    txt = FormattedText.newFromUnformatted('   ');\n    assertEq(3, UI512Lines.getNonSpaceStartOfLine(txt, true), '9y|');\n    assertEq(2, UI512Lines.getNonSpaceStartOfLine(txt, false), '9x|');\n});\nt.test('UI512Lines.getIndentLevel', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(0, UI512Lines.getIndentLevel(txt), '9w|');\n    txt = FormattedText.newFromUnformatted('   abc');\n    assertEq(0, UI512Lines.getIndentLevel(txt), '9v|');\n    txt = FormattedText.newFromUnformatted('    abc');\n    assertEq(1, UI512Lines.getIndentLevel(txt), '9u|');\n    txt = FormattedText.newFromUnformatted('     abc');\n    assertEq(1, UI512Lines.getIndentLevel(txt), '9t|');\n    txt = FormattedText.newFromUnformatted('            abc');\n    assertEq(3, UI512Lines.getIndentLevel(txt), '9s|');\n    txt = FormattedText.newFromUnformatted('            ');\n    assertEq(3, UI512Lines.getIndentLevel(txt), '9r|');\n});\nt.test('GridLayout', () => {\n    let grid = new GridLayout(100, 200, 30, 40, [1, 2, 3], [4, 5, 6], 7, 8);\n    let results: number[][] = [];\n    grid.combinations((n, a, b, bnds) => {\n        results.push([n, a, b, bnds[0], bnds[1], bnds[2], bnds[3]]);\n    });\n\n    assertEq(\n        [\n            [0, 1, 4, 100, 200, 30, 40],\n            [1, 2, 4, 137, 200, 30, 40],\n            [2, 3, 4, 174, 200, 30, 40],\n            [3, 1, 5, 100, 248, 30, 40],\n            [4, 2, 5, 137, 248, 30, 40],\n            [5, 3, 5, 174, 248, 30, 40],\n            [6, 1, 6, 100, 296, 30, 40],\n            [7, 2, 6, 137, 296, 30, 40],\n            [8, 3, 6, 174, 296, 30, 40]\n        ],\n        results,\n        '9q|'\n    );\n});\n\n/**\n * make an 'application' and 'group' that stand alone,\n * not needing a presenter\n */\nfunction makeFakeGroup(): [UI512Application, UI512ElGroup] {\n    let bounds = getUI512WindowBounds();\n    let fakeApp = new UI512Application(bounds, new ElementObserverNoOp());\n    let fakeGrp = new UI512ElGroup('fakeGrp');\n    fakeApp.addGroup(fakeGrp);\n    let btn1 = new UI512ElButton('btn1');\n    fakeGrp.addElement(fakeApp, btn1);\n    let btn2 = new UI512ElButton('btn2');\n    fakeGrp.addElement(fakeApp, btn2);\n    let btn3 = new UI512ElButton('btn3');\n    fakeGrp.addElement(fakeApp, btn3);\n    return [fakeApp, fakeGrp];\n}\n\n/**\n * list the elements in a group\n */\nfunction listElems(grp: UI512ElGroup) {\n    let s = '';\n    for (let el of grp.iterEls()) {\n        s += el.id + ',';\n    }\n\n    return s;\n}\n\n/**\n * test-only implementation, doesn't support any replication to other elements\n */\nexport class HigherNoReplication_TestOnly implements VpcHandleLinkedVels {\n    setOnVelLinked(\n        me: VpcElBase,\n        s: string,\n        newVal: ElementObserverVal,\n        cb: (s: string, newVal: ElementObserverVal, ctx: ChangeContext) => void\n    ): void {\n        cb.apply(me, [s, newVal, ChangeContext.Default]);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512ElementsViewButtons.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { UI512ViewDraw } from './../../ui512/elements/ui512ElementView';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { elementObserverNoOp } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512Buttons\n *\n * A \"demo\" project showing several buttons with different properties and\n * icons. There are vertical lines in the background to verify transparency.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ (uncomment the line\n * referencing _UI512DemoButtons_) to confirm that manually\n * interacting with the buttons has the expected behavior\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512ElementsViewButtons');\nexport let testCollectionUI512ElementsViewButtons = t;\n\nt.atest('Test Drawing Buttons', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512Buttons().testDrawButtons()\n    )\n);\n\n/**\n * an example layout showing many buttons with different styles\n * and properties\n */\nexport class TestDrawUI512Buttons {\n    uiContext = false;\n    readonly stylesToTest: number[] = [\n        UI512BtnStyle.Rectangle,\n        UI512BtnStyle.Transparent,\n        UI512BtnStyle.Opaque,\n        UI512BtnStyle.Plain,\n        UI512BtnStyle.Shadow,\n        UI512BtnStyle.OSStandard,\n        UI512BtnStyle.OSDefault,\n        UI512BtnStyle.Radio,\n        UI512BtnStyle.Checkbox\n    ];\n\n    setBtnStyle(btn: UI512ElButton, props: BtnPropsToTest, style: UI512BtnStyle) {\n        btn.set('style', style);\n        btn.set(\n            'labelhalign',\n            !(style === UI512BtnStyle.Radio || style === UI512BtnStyle.Checkbox)\n        );\n        btn.set('labelvalign', true);\n\n        switch (props) {\n            case BtnPropsToTest.IconAndNoLabel:\n                btn.set('icongroupid', '001');\n                btn.set('iconnumber', 11);\n                break;\n            case BtnPropsToTest.IconAndLabelAndChecked:\n                btn.set('icongroupid', '002');\n                btn.set('iconnumber', 71 + 21);\n                btn.set('labeltext', 'label text');\n                btn.set('checkmark', true);\n                break;\n            case BtnPropsToTest.IconAndLabelMultiline:\n                /* intentionally show a truncated icon */\n                btn.set('icongroupid', '001');\n                btn.set('iconnumber', 12);\n                btn.set('iconadjustx', 6);\n                btn.set('iconadjusty', 2);\n                btn.set('iconadjustwidth', 10);\n                btn.set('iconadjustheight', -6);\n                btn.set('labeltext', 'given \\nnew line');\n                break;\n            case BtnPropsToTest.NoIconAndLabelNotCenteredDisabled:\n                btn.set('labeltext', 'label not centered');\n                btn.set('labelvalign', false);\n                btn.set('labelhalign', false);\n                break;\n            case BtnPropsToTest.NoIconAndLabelCentered:\n                btn.set(\n                    'labeltext',\n                    \"label centered and it's a pretty long string to show\"\n                );\n                btn.set('labelvalign', true);\n                btn.set('labelhalign', true);\n                break;\n            case BtnPropsToTest.NoIconNoLabel:\n                break;\n            default:\n                assertTrue(false, '1O|unknown button type');\n        }\n\n        return btn;\n    }\n\n    addBackgroundButtons(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        list: UI512ElButton[],\n        clientX0: number,\n        clientY0: number\n    ) {\n        const numberOfBgButtons = 60;\n        for (let x = 0; x < numberOfBgButtons; x++) {\n            let id = 'btnnumber,bg,' + x.toString();\n            let button = new UI512ElButton(id);\n            grp.addElement(app, button);\n            button.setDimensions(clientX0 + x * 50, 0, 25, 4096);\n            list.push(button);\n        }\n    }\n\n    addButtons(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        list: UI512ElButton[],\n        clientX0: number,\n        clientY0: number,\n        drawBlank: boolean,\n        areHighlighted: boolean,\n        idPrefix: string,\n        dims = [90, 65],\n        onlyFirst: O<number> = undefined\n    ) {\n        let nRows = drawBlank\n            ? BtnPropsToTest.BtnPropsToTestMax\n            : BtnPropsToTest.NoIconNoLabel;\n        if (onlyFirst !== undefined) {\n            nRows = Math.min(onlyFirst, nRows);\n        }\n\n        let rows = Util512.range(0, nRows);\n        let layout = new GridLayout(\n            clientX0 + 3,\n            clientY0 + 3,\n            dims[0],\n            dims[1],\n            this.stylesToTest,\n            rows,\n            3,\n            3\n        );\n        layout.createElems(\n            app,\n            grp,\n            'btntest' + idPrefix + '_',\n            UI512ElButton,\n            (a, b, el) => {\n                this.setBtnStyle(el, b, a);\n                el.set('highlightactive', areHighlighted);\n                list.push(el);\n            }\n        );\n    }\n\n    /* these we have confirmed in an emulator as pixel-perfect */\n    testDrawButtons() {\n        const imWidth = 950;\n        const imHeight = 2400;\n        let list: UI512ElButton[] = [];\n        let view = new UI512ViewDraw();\n        let fakeApp = new UI512Application([0, 0, 1, 1], elementObserverNoOp);\n        let fakeGrp = new UI512ElGroup('fakeGrp', elementObserverNoOp);\n\n        /* draw background buttons */\n        this.addBackgroundButtons(fakeApp, fakeGrp, list, 1, 1);\n\n        /* draw not-highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 1, 1, true, false, '1');\n\n        /* draw highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 1, 450, true, true, '2');\n\n        /* drawing very small buttons might look a bit different, but shouldn't throw errors */\n        this.addButtons(fakeApp, fakeGrp, list, 1, 900, true, false, '3', [2, 2]);\n\n        /* drawing very small highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 128, 900, true, true, '4', [2, 2]);\n\n        /* drawing small buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 1, 1000, true, false, '5', [5, 5]);\n\n        /* drawing small highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 128, 1000, true, true, '6', [5, 5]);\n\n        /* drawing short and wide buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 200, 860, true, false, '7', [100, 35], 3);\n\n        /* drawing short and wide highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 200, 975, true, true, '8', [100, 35], 3);\n\n        /* drawing tall buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 1, 1100, true, false, '9', [40, 200]);\n\n        /* drawing tall highlighted buttons */\n        this.addButtons(fakeApp, fakeGrp, list, 500, 1100, true, true, '10', [40, 200]);\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            for (let btn of list) {\n                view.renderElement(canvas, btn, false, complete);\n            }\n        };\n\n        return new CanvasTestParams(\n            'drawButtons',\n            '/resources03a/test/drawbuttonsexpected.png',\n            draw,\n            imWidth,\n            imHeight,\n            this.uiContext\n        );\n    }\n}\n\nenum BtnPropsToTest {\n    /* note: must begin with 0. */\n    IconAndNoLabel = 0,\n    IconAndLabelAndChecked,\n    IconAndLabelMultiline,\n    NoIconAndLabelNotCenteredDisabled,\n    NoIconAndLabelCentered,\n    NoIconNoLabel,\n    BtnPropsToTestMax\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512FormattedText.ts",
    "content": "\n/* auto */ import { BrowserOSInfo } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512FontRequest } from './../../ui512/drawtext/ui512DrawTextFontRequest';\n/* auto */ import { TextFontSpec, TextFontStyling, largeArea, specialCharFontChange } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { DrawTextArgs } from './../../ui512/drawtext/ui512DrawTextArgs';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on FormattedText\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUI512FormattedText');\nexport let testCollectionUI512FormattedText = t;\n\nt.test('FormattedText.CharAt', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq('abc'.charCodeAt(0), txt.charAt(0), 'By|');\n    assertEq('abc'.charCodeAt(1), txt.charAt(1), 'Bx|');\n    assertEq('abc'.charCodeAt(2), txt.charAt(2), 'Bw|');\n    assertEq(undefined, txt.charAt(3), 'Bv|');\n});\nt.test('FormattedText.FontAt', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(0), 'Bu|');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(1), 'Bt|');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(2), 'Bs|');\n    assertEq(undefined, txt.fontAt(3), 'Br|');\n});\nt.test('FormattedText.SetCharAt', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    txt.setCharAt(1, 'y'.charCodeAt(0));\n    txt.setCharAt(2, 'z'.charCodeAt(0));\n    assertEq('ayz'.charCodeAt(0), txt.charAt(0), 'Bq|');\n    assertEq('ayz'.charCodeAt(1), txt.charAt(1), 'Bp|');\n    assertEq('ayz'.charCodeAt(2), txt.charAt(2), 'Bo|');\n});\nt.test('FormattedText.SetFontAt', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    txt.setFontAt(1, 'otherfont1');\n    txt.setFontAt(2, 'otherfont2');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(0), 'Bn|');\n    assertEq('otherfont1', txt.fontAt(1), 'Bm|');\n    assertEq('otherfont2', txt.fontAt(2), 'Bl|');\n});\nt.test('FormattedText.Len', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(3, txt.len(), 'Bk|');\n    assertEq(0, FormattedText.newFromUnformatted('').len(), 'Bj|');\n});\nt.test('FormattedText.indexOf', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(1, txt.indexOf('b'.charCodeAt(0)), 'Bi|');\n    assertEq(2, txt.indexOf('c'.charCodeAt(0)), 'Bh|');\n    assertEq(-1, txt.indexOf('?'.charCodeAt(0)), 'Bg|');\n});\nt.test('FormattedText.setFontEverywhere', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    txt.setFontEverywhere('changedfont');\n    assertEq('changedfont', txt.fontAt(0), 'Bf|');\n    assertEq('changedfont', txt.fontAt(1), 'Be|');\n    assertEq('changedfont', txt.fontAt(2), 'Bd|');\n    assertEq('abc', txt.toUnformatted(), 'Bc|');\n});\nt.test('FormattedText.toUnformatted', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq('abc', txt.toUnformatted(), 'Bb|');\n    assertEq('a', txt.toUnformattedSubstr(0, 1), 'Ba|');\n    assertEq('ab', txt.toUnformattedSubstr(0, 2), 'BZ|');\n    assertEq('b', txt.toUnformattedSubstr(1, 1), 'BY|');\n    assertEq('bc', txt.toUnformattedSubstr(1, 2), 'BX|');\n});\nt.test('FormattedTextNewFromUnformatted.EmptyStringIsOK', () => {\n    let txt = FormattedText.newFromUnformatted('');\n    assertEq('', txt.toUnformatted(), 'BW|');\n    assertEq(0, txt.len(), 'BV|');\n    assertEq(undefined, txt.charAt(0), 'BU|');\n    assertEq(undefined, txt.fontAt(0), 'BT|');\n});\nt.test('FormattedTextNewFromUnformatted.ShouldStripSpecialCharFontChange', () => {\n    assertThrows('Uj|', 'cannot include', () =>\n        FormattedText.newFromUnformatted(\n            `${specialCharFontChange}a${specialCharFontChange}`\n        )\n    );\n});\nt.test('FormattedTextNewFromSerialized.Complex', () => {\n    let ser = longstr(\n        `${specialCharFontChange}font1${specialCharFontChange}\n        a${specialCharFontChange}font2${specialCharFontChange}bc\n        ${specialCharFontChange}font3${specialCharFontChange}d`,\n        ''\n    );\n    let txt = FormattedText.newFromSerialized(ser);\n    assertEq(4, txt.len(), 'BO|');\n    assertEq('font1', txt.fontAt(0), 'BN|');\n    assertEq('font2', txt.fontAt(1), 'BM|');\n    assertEq('font2', txt.fontAt(2), 'BL|');\n    assertEq('font3', txt.fontAt(3), 'BK|');\n    assertEq('abcd'.charCodeAt(0), txt.charAt(0), 'BJ|');\n    assertEq('abcd'.charCodeAt(1), txt.charAt(1), 'BI|');\n    assertEq('abcd'.charCodeAt(2), txt.charAt(2), 'BH|');\n    assertEq('abcd'.charCodeAt(3), txt.charAt(3), 'BG|');\n\n    let roundTripped = txt.toSerialized();\n    assertEq(ser, roundTripped, 'BF|');\n});\nt.test('FormattedTextNewFromSerialized and more', () => {\n    t.say(\n        longstr(`FormattedTextNewFromSerialized.ImplicitDefaultFont,\n            CoalesceNeighboringFontChanges,OKToEndWithFontChange`)\n    );\n    let ser = longstr(\n        `a${specialCharFontChange}font1${specialCharFontChange}\n            ${specialCharFontChange}font2${specialCharFontChange}bcd\n            ${specialCharFontChange}font3${specialCharFontChange}`,\n        ''\n    );\n    let txt = FormattedText.newFromSerialized(ser);\n    assertEq(4, txt.len(), 'BE|');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(0), 'BD|');\n    assertEq('font2', txt.fontAt(1), 'BC|');\n    assertEq('font2', txt.fontAt(2), 'BB|');\n    assertEq('font2', txt.fontAt(3), 'BA|');\n    assertEq('abcd'.charCodeAt(0), txt.charAt(0), 'B9|');\n    assertEq('abcd'.charCodeAt(1), txt.charAt(1), 'B8|');\n    assertEq('abcd'.charCodeAt(2), txt.charAt(2), 'B7|');\n    assertEq('abcd'.charCodeAt(3), txt.charAt(3), 'B6|');\n\n    let expected = longstr(\n        `${specialCharFontChange}${UI512FontRequest.defaultFont}\n            ${specialCharFontChange}a${specialCharFontChange}font2${specialCharFontChange}bcd`,\n        ''\n    );\n    assertEq(expected, txt.toSerialized(), 'B5|');\n});\nt.test('FormattedText.Push', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    txt.push('d'.charCodeAt(0), 'font2');\n    assertEq(4, txt.len(), 'B4|');\n    assertEq('abcd'.charCodeAt(2), txt.charAt(2), 'B3|');\n    assertEq('abcd'.charCodeAt(3), txt.charAt(3), 'B2|');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(2), 'B1|');\n    assertEq('font2', txt.fontAt(3), 'B0|');\n});\nt.test('FormattedText.Append', () => {\n    let txt1 = FormattedText.newFromUnformatted('ab');\n    txt1.setFontEverywhere('font1');\n    let txt2 = FormattedText.newFromUnformatted('cd');\n    txt2.setFontEverywhere('font2');\n    txt1.append(txt2);\n    assertEq(4, txt1.len(), 'A~|');\n    assertEq('abcd'.charCodeAt(0), txt1.charAt(0), 'A}|');\n    assertEq('abcd'.charCodeAt(1), txt1.charAt(1), 'A||');\n    assertEq('abcd'.charCodeAt(2), txt1.charAt(2), 'A{|');\n    assertEq('abcd'.charCodeAt(3), txt1.charAt(3), 'A`|');\n    assertEq('font1', txt1.fontAt(0), 'A_|');\n    assertEq('font1', txt1.fontAt(1), 'A^|');\n    assertEq('font2', txt1.fontAt(2), 'A]|');\n    assertEq('font2', txt1.fontAt(3), 'A[|');\n});\nt.test('FormattedText.AppendEmptyString', () => {\n    let txt1 = FormattedText.newFromUnformatted('ab');\n    let txt2 = FormattedText.newFromUnformatted('');\n    txt1.append(txt2);\n    assertEq(2, txt1.len(), 'A@|');\n    assertEq('ab'.charCodeAt(0), txt1.charAt(0), 'A?|');\n    assertEq('ab'.charCodeAt(1), txt1.charAt(1), 'A>|');\n});\nt.test('FormattedText.AppendSubstring', () => {\n    let txt1 = FormattedText.newFromUnformatted('ab');\n    let txt2 = FormattedText.newFromUnformatted('cdefg');\n    txt1.appendSubstring(txt2, 1, 3);\n    assertEq('abde', txt1.toUnformatted(), 'A=|');\n});\nt.test('FormattedText.SpliceDeletesTwoCharacters', () => {\n    let ser = longstr(\n        `a${specialCharFontChange}font2\n        ${specialCharFontChange}bc${specialCharFontChange}\n        font3${specialCharFontChange}d`,\n        ''\n    );\n    let txt = FormattedText.newFromSerialized(ser);\n    assertEq(4, txt.len(), 'A<|');\n    txt.splice(1, 2);\n    assertEq(2, txt.len(), 'A;|');\n    assertEq('ad'.charCodeAt(0), txt.charAt(0), 'A:|');\n    assertEq('ad'.charCodeAt(1), txt.charAt(1), 'A/|');\n    assertEq(UI512FontRequest.defaultFont, txt.fontAt(0), 'A.|');\n    assertEq('font3', txt.fontAt(1), 'A-|');\n});\nt.test('FormattedText.SpliceDeletesNoCharacters', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    assertEq(3, txt.len(), 'A,|');\n    txt.splice(1, 0);\n    assertEq(3, txt.len(), 'A+|');\n});\nt.test('FormattedText.ByInsertion, from 2 chars -> 0 chars', () => {\n    let txt1 = FormattedText.newFromUnformatted('abcde');\n    txt1.setFontEverywhere('f1');\n    let txt2 = FormattedText.byInsertion(txt1, 2, 2, '', 'f2');\n    let expected = `${specialCharFontChange}f1${specialCharFontChange}abe`;\n    assertEq(3, txt2.len(), 'A*|');\n    assertEq(expected, txt2.toSerialized(), 'A)|');\n});\nt.test('FormattedText.ByInsertion, from 2 chars -> 1 char', () => {\n    let txt1 = FormattedText.newFromUnformatted('abcde');\n    txt1.setFontEverywhere('f1');\n    let txt2 = FormattedText.byInsertion(txt1, 2, 2, 'x', 'f2');\n    let expected = longstr(\n        `${specialCharFontChange}\n        f1${specialCharFontChange}ab${specialCharFontChange}f2\n        ${specialCharFontChange}x${specialCharFontChange}f1\n        ${specialCharFontChange}e`,\n        ''\n    );\n    assertEq(4, txt2.len(), 'A(|');\n    assertEq(expected, txt2.toSerialized(), 'A&|');\n});\nt.test('FormattedText.ByInsertion, from 2 chars -> 2 chars', () => {\n    let txt1 = FormattedText.newFromUnformatted('abcde');\n    txt1.setFontEverywhere('f1');\n    let txt2 = FormattedText.byInsertion(txt1, 2, 2, 'xy', 'f2');\n    let expected = longstr(\n        `${specialCharFontChange}f1\n        ${specialCharFontChange}ab${specialCharFontChange}f2\n        ${specialCharFontChange}xy${specialCharFontChange}f1\n        ${specialCharFontChange}e`,\n        ''\n    );\n    assertEq(5, txt2.len(), 'A%|');\n    assertEq(expected, txt2.toSerialized(), 'A$|');\n});\nt.test('FormattedText.ByInsertion, from 2 chars -> 3 chars', () => {\n    let txt1 = FormattedText.newFromUnformatted('abcde');\n    txt1.setFontEverywhere('f1');\n    let txt2 = FormattedText.byInsertion(txt1, 2, 2, 'xyz', 'f2');\n    let expected = longstr(\n        `${specialCharFontChange}f1\n        ${specialCharFontChange}ab${specialCharFontChange}\n        f2${specialCharFontChange}xyz${specialCharFontChange}\n        f1${specialCharFontChange}e`,\n        ''\n    );\n    assertEq(6, txt2.len(), 'A#|');\n    assertEq(expected, txt2.toSerialized(), 'A!|');\n});\nt.test('FormattedTextFilterAndConvertNewlines.Filter', () => {\n    assertEq('', FormattedText.filterAndConvertNewlines(''), 'A |');\n    assertEq('abc def', FormattedText.filterAndConvertNewlines('abc def'), 'Az|');\n    assertEq(\n        'abc def',\n        FormattedText.filterAndConvertNewlines('\\x00abc\\x00 def\\x00'),\n        'Ay|'\n    );\n    assertEq('', FormattedText.filterAndConvertNewlines('\\x00\\x00'), 'Ax|');\n});\nt.test('FormattedTextFilterAndConvertNewlines.RemoveInternalUseBytes', () => {\n    assertEq(\n        'abc def',\n        FormattedText.filterAndConvertNewlines(\n            `${specialCharFontChange}abc${specialCharFontChange} def${specialCharFontChange}`\n        ),\n        'Aw|'\n    );\n    assertEq(\n        '',\n        FormattedText.filterAndConvertNewlines(\n            `${specialCharFontChange}${specialCharFontChange}`\n        ),\n        'Av|'\n    );\n});\nt.test('FormattedTextFilterAndConvertNewlines.ConvertNewlines', () => {\n    assertEq(\n        '\\nabc\\n123\\n',\n        FormattedText.filterAndConvertNewlines('\\nabc\\n123\\n'),\n        'Au|'\n    );\n    assertEq(\n        '\\nabc\\n123\\n',\n        FormattedText.filterAndConvertNewlines('\\r\\nabc\\r\\n123\\r\\n'),\n        'At|'\n    );\n    assertEq(\n        '\\nabc\\n123\\n',\n        FormattedText.filterAndConvertNewlines('\\rabc\\r123\\r'),\n        'As|'\n    );\n});\nt.test('FormattedTextFilterAndConvertNewlines.ConvertEveryNewlineCombination', () => {\n    let expected = '\\n\\n\\n1\\n\\n\\n2\\n\\n3\\n\\n\\n4\\n\\n5\\n\\n6\\n\\n7\\n\\n\\n8';\n    let input = '\\n\\n\\n1\\n\\n\\r2\\n\\r\\n3\\n\\r\\r4\\r\\n\\n5\\r\\n\\r6\\r\\r\\n7\\r\\r\\r8';\n    assertEq(expected, FormattedText.filterAndConvertNewlines(input), 'Ar|');\n});\nt.test('FormattedText.FromExternalCharset', () => {\n    let fromHost = (s: string) =>\n        FormattedText.fromExternalCharset(s, BrowserOSInfo.Unknown);\n\n    /* control chars are not accepted */\n    assertEq('ab?cd?', fromHost('ab\\x03cd\\x03'), '1i|');\n\n    /* more control chars are not accepted */\n    assertEq('ab?cd????', fromHost('ab\\x01cd\\x06\\x0f\\x15\\x1a'), '1h|');\n\n    /* tabs are accepted */\n    assertEq('ab\\tcd?', fromHost('ab\\tcd\\x03'), '1g|');\n\n    /* symbols are translated */\n    assertEq(\n        'ab' + String.fromCharCode(166, 32, 165, 32, 161),\n        fromHost('ab\\u00B6 \\u2022 \\u00B0'),\n        '1d|'\n    );\n\n    /* unknown lower letters are not accepted (1/4, superscript 1, capital thorn) */\n    assertEq('ab???cd', fromHost('ab\\u00BC\\u00B9\\u00DEcd'), '1c|');\n\n    /* unknown higher letters are not accepted */\n    assertEq('12???34', fromHost('12\\u05E7\\u3042\\uB9D034'), '1b|');\n\n    /* different fallback */\n    assertEq(\n        'ab!cd!',\n        FormattedText.fromExternalCharset('ab\\x03cd\\x03', BrowserOSInfo.Unknown, '!'),\n        '1a|'\n    );\n\n    /* into charset, control chars are not accepted */\n    assertEq(\n        'ab?cd?',\n        FormattedText.toExternalCharset('ab\\x05cd\\x05', BrowserOSInfo.Unknown),\n        '1Z|'\n    );\n\n    /* into charset, different fallback */\n    assertEq(\n        'ab!cd!',\n        FormattedText.toExternalCharset('ab\\x05cd\\x05', BrowserOSInfo.Unknown, '!'),\n        '1Y|'\n    );\n\n    /* into charset, tabs are accepted */\n    assertEq(\n        'AB\\nCD\\tEF',\n        FormattedText.toExternalCharset('AB\\nCD\\tEF', BrowserOSInfo.Unknown),\n        '1X|'\n    );\n});\nt.test('FormattedText.FromExternalCharset.UsingFromCharCode', () => {\n    let fromHost = (s: string) =>\n        FormattedText.fromExternalCharset(s, BrowserOSInfo.Unknown);\n\n    /* accented letters are translated */\n    assertEq(\n        'ab' +\n            String.fromCharCode(\n                135,\n                32,\n                136,\n                32,\n                146,\n                32,\n                147,\n                32,\n                148,\n                32,\n                153,\n                32,\n                155\n            ),\n        fromHost('ab\\u00e1 \\u00e0 \\u00ed \\u00ec \\u00ee \\u00f4 \\u00f5'),\n        '1f|'\n    );\n\n    /* greek letters are translated */\n    assertEq(\n        'ab' +\n            String.fromCharCode(\n                185,\n                32,\n                184,\n                32,\n                183,\n                32,\n                181,\n                32,\n                190,\n                32,\n                174,\n                32,\n                207\n            ),\n        fromHost('ab\\u03C0 \\u220F \\u2211 \\u00B5 \\u00E6 \\u00C6 \\u0153'),\n        '1e|'\n    );\n\n    /* into charset, greek letters are translated */\n    assertEq(\n        'ab\\u03C0 \\u220F \\u2211 \\u00B5 \\u00E6 \\u00C6 \\u0153',\n        FormattedText.toExternalCharset(\n            'ab' +\n                String.fromCharCode(\n                    185,\n                    32,\n                    184,\n                    32,\n                    183,\n                    32,\n                    181,\n                    32,\n                    190,\n                    32,\n                    174,\n                    32,\n                    207\n                ),\n            BrowserOSInfo.Unknown\n        ),\n        '1W|'\n    );\n\n    /* into charset, unknown letters are not accepted */\n    assertEq(\n        '12???34',\n        FormattedText.toExternalCharset('12\\u001f\\u0100\\u221134', BrowserOSInfo.Unknown),\n        '1V|'\n    );\n});\nt.test('FormattedTextAsteriskOnly.ZeroLength', () => {\n    let args = new DrawTextArgs(0, 0, largeArea, largeArea);\n    args.asteriskOnly = true;\n    let textin = FormattedText.newFromUnformatted('');\n    let modded = UI512DrawText.makeAsteriskOnlyIfApplicable(textin, args);\n    assertEq(0, modded.len(), 'Aq|');\n    assertTrue(modded.isLocked(), 'Ap|');\n});\nt.test('FormattedTextAsteriskOnly.NoFormattingChanges', () => {\n    let args = new DrawTextArgs(0, 0, largeArea, largeArea);\n    args.asteriskOnly = true;\n    let textin = FormattedText.newFromUnformatted('abcd');\n    let modded = UI512DrawText.makeAsteriskOnlyIfApplicable(textin, args);\n    assertEq('abcd', textin.toUnformatted(), 'Ao|');\n    assertEq('\\xA5\\xA5\\xA5\\xA5', modded.toUnformatted(), 'An|');\n    assertEq(4, modded.len(), 'Am|');\n});\nt.test('FormattedTextAsteriskOnly.FormattingIsPreserved', () => {\n    let args = new DrawTextArgs(0, 0, largeArea, largeArea);\n    args.asteriskOnly = true;\n    let font1 = new TextFontSpec('geneva', TextFontStyling.Default, 12).toSpecString();\n    let font2 = new TextFontSpec('times', TextFontStyling.Bold, 14).toSpecString();\n    let s = UI512DrawText.setFont('abc', font1) + UI512DrawText.setFont('def', font2);\n    let expected =\n        UI512DrawText.setFont('\\xA5\\xA5\\xA5', font1) +\n        UI512DrawText.setFont('\\xA5\\xA5\\xA5', font2);\n    let textin = FormattedText.newFromSerialized(s);\n    let modded = UI512DrawText.makeAsteriskOnlyIfApplicable(textin, args);\n    assertEq('abcdef', textin.toUnformatted(), 'Al|');\n    assertEq('\\xA5\\xA5\\xA5\\xA5\\xA5\\xA5', modded.toUnformatted(), 'Ak|');\n    assertEq(6, modded.len(), 'Aj|');\n    assertEq(expected, modded.toSerialized(), 'Ai|');\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512MenuRender.ts",
    "content": "\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { MenuPositioning, UI512MenuDefn } from './../../ui512/menu/ui512MenuPositioning';\n/* auto */ import { MenuListeners } from './../../ui512/menu/ui512MenuListeners';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512Menus\n *\n * A \"demo\" project showing a menubar.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ (uncomment the\n * line referencing _UI512DemoMenus_) to confirm that manually\n * interacting with the menus has the expected behavior\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512MenuRender');\nexport let testCollectionUI512MenuRender = t;\n\nt.atest('Test Drawing Menus', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512Menus().testDrawMenus()\n    )\n);\n\n/**\n * a test layout showing menus\n */\nexport class TestDrawUI512Menus {\n    uiContext = false;\n\n    getDefn(): UI512MenuDefn[] {\n        return [\n            ['mnuHeaderOS|icon:001:80:26', ['|lngPlaceholder|']],\n            ['mnuHeaderFile|lngFile', ['|lngPlaceholder|']],\n            [\n                'mnuHeaderEdit|lngEdit',\n                [\n                    '|lngUndo|\\xBD Z',\n                    '|---|',\n                    'mnuCut1|lngCut|\\xBD X',\n                    'mnuCopy1|lngCopy|\\xBD C',\n                    '|lngPaste Text|\\xBD V',\n                    'mnuClear1|lngClear|',\n                    '|---|',\n                    '|lngNew Card|\\xBD N',\n                    '|lngDelete Card|',\n                    '|lngCut Card|',\n                    '|lngCopy Card|',\n                    '|---|',\n                    'mnuTextStyle1|lngText Style...|\\xBD T',\n                    '|lngBackground|\\xBD B',\n                    '|lngIcon...|\\xBD I'\n                ]\n            ],\n            [\n                'mnuHeaderGo|lngGo',\n                [\n                    '|lngUndo 2|\\xBD Z',\n                    '|---|',\n                    'mnuCut2|lngCut 2|\\xBD X',\n                    'mnuCopy2|lngCopy 2|\\xBD C',\n                    '|lngPaste Longer Text 2|\\xBD V',\n                    'mnuClear2|lngClear 2|',\n                    '|---|',\n                    '|lngNew Card 2|\\xBD N',\n                    '|lngDelete Card 2|',\n                    '|lngCut Card 2|',\n                    '|lngCopy Card 2|',\n                    '|---|',\n                    'mnuTextStyle2|lngText Style 2...|\\xBD T',\n                    '|lngBackground 2|\\xBD B',\n                    '|lngIcon 2...|\\xBD I'\n                ]\n            ],\n            ['mnuHeaderTools|lngTools', ['|lngPlaceholder|']],\n            ['mnuHeaderPaint|lngPaint', ['|lngPlaceholder|']],\n            [\n                'mnuHeaderOptions|lngOptions',\n                [\n                    'mnuOptFirst|lngFirst|',\n                    'mnuOptSecond|lngSecond|',\n                    'mnuOptThird|lngThird|'\n                ]\n            ],\n            ['mnuHeaderPatterns|lngPatterns', ['|lngPlaceholder|']],\n            ['topClock|lng12/28/18', 790, ['|lngPlaceholder|']],\n            ['mnuHeaderHelpIcon|icon:001:75:27', 864, ['|lngA longer text...|']],\n            [\n                'mnuHeaderAppIcon|icon:001:78:27',\n                891,\n                ['|lngHide This Program|', '|lngHide Others|', 'mnuShowAll|lngShow All|']\n            ]\n        ];\n    }\n\n    addElements(pr: UI512Presenter, bgtext: string, bounds: number[]) {\n        let grp = new UI512ElGroup('grp');\n        pr.app.addGroup(grp);\n\n        /* add bg */\n        let bg = new UI512ElButton('bg');\n        grp.addElement(pr.app, bg);\n        bg.set('labeltext', bgtext);\n        bg.set('style', UI512BtnStyle.Opaque);\n        bg.setDimensions(bounds[0], bounds[1], bounds[2], bounds[3]);\n        bg.set('enabled', false);\n        bg.set('enabledstyle', false);\n\n        /* add a horizontal line, the dropdowns should cover it */\n        let testTransparency = new UI512ElButton('testTransparency1');\n        grp.addElement(pr.app, testTransparency);\n        testTransparency.setDimensions(bounds[0] + 100, bounds[1] + 100, 5, 1);\n\n        /* add the menu */\n        let grpItems = MenuPositioning.getMenuGroups(pr.app)[1];\n        MenuPositioning.buildFromArray(pr, this.getDefn());\n        grpItems.getEl('mnuOptSecond').set('checkmark', true);\n        let toDisable = ['mnuCut', 'mnuCopy', 'mnuClear', 'mnuTextStyle'];\n        for (let shortId of toDisable) {\n            for (let number of ['1', '2']) {\n                grpItems.getEl(shortId + number).set('enabled', false);\n                grpItems.getEl(shortId + number).set('enabledstyle', false);\n            }\n        }\n    }\n\n    drawTestCase(\n        whichMnuExpanded: number,\n        whichItemSeled: number,\n        tmpCanvas: CanvasWrapper,\n        w: number,\n        h: number,\n        i: number,\n        complete: RenderComplete\n    ) {\n        tmpCanvas.clear();\n        let testPr = new UI512TestMenusPresenter();\n        testPr.inited = true;\n        testPr.app = new UI512Application([0, 0, w, h], testPr);\n        this.addElements(testPr, '(background)', testPr.app.bounds);\n\n        /* mimic the user clicking on a menu */\n        if (whichMnuExpanded !== -1) {\n            let menuRoot = MenuPositioning.getMenuRoot(testPr.app);\n            let dropDowns = menuRoot.getchildren(testPr.app);\n            MenuListeners.setActiveMenu(testPr, dropDowns[whichMnuExpanded].id);\n            menuRoot.setDirty(true);\n\n            if (whichItemSeled !== -1) {\n                let items = dropDowns[whichMnuExpanded].getChildren(testPr.app);\n                items[whichItemSeled].set('highlightactive', true);\n            }\n        }\n\n        /* test different clock times */\n        if (i < 2) {\n            let grpBar = MenuPositioning.getMenuGroups(testPr.app)[0];\n            grpBar.getEl('topClock').set('labeltext', i === 0 ? '1/1/17' : '1/18/18');\n        }\n\n        /* don't show any borders */\n        testPr.view.renderBorders = () => {};\n        testPr.render(tmpCanvas, 1, complete);\n    }\n\n    testDrawMenus() {\n        const w = 928;\n        const h = 300;\n        assertEq(w, ScreenConsts.ScreenWidth, '1S|');\n        let tmpCanvasDom = window.document.createElement('canvas');\n        tmpCanvasDom.width = w;\n        tmpCanvasDom.height = h;\n        let tmpCanvas = new CanvasWrapper(tmpCanvasDom);\n\n        /* [which menu is open, which item is selected]  */\n        const drawMenuTestCases = [\n            [-1, -1],\n            [0, -1],\n            [2, -1],\n            [3, -1],\n            [6, -1],\n            [9, -1],\n            [10, -1],\n            [2, 0],\n            [2, 4],\n            [6, 0],\n            [6, 1]\n        ];\n\n        /* draw the menubar many times, each time with a different menu open\n        or a different item selected */\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = true;\n            for (let i = 0; i < drawMenuTestCases.length; i++) {\n                let [whichMnuExpanded, whichItemSeled] = drawMenuTestCases[i];\n                this.drawTestCase(\n                    whichMnuExpanded,\n                    whichItemSeled,\n                    tmpCanvas,\n                    w,\n                    h,\n                    i,\n                    complete\n                );\n                let dest = [0, i * h, w, h];\n                canvas.drawFromImage(\n                    tmpCanvas.canvas,\n                    0,\n                    0,\n                    w,\n                    h,\n                    dest[0],\n                    dest[1],\n                    dest[0],\n                    dest[1],\n                    dest[2],\n                    dest[3]\n                );\n            }\n        };\n\n        const totalH = h * drawMenuTestCases.length;\n        return new CanvasTestParams(\n            'drawMenus',\n            '/resources03a/test/drawmenusexpected.png',\n            draw,\n            w,\n            totalH,\n            this.uiContext\n        );\n    }\n}\n\n/**\n * presenter, driven by tests to take a screenshot of rendered elements\n */\nexport class UI512TestMenusPresenter extends UI512Presenter {}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512Paint.ts",
    "content": "\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512ImageSerialization } from './../../ui512/draw/ui512ImageSerialization';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { clrBlack, clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvCanvas, UI512PainterCvData, UI512PainterCvDataAndPatterns } from './../../ui512/draw/ui512DrawPainter';\n/* auto */ import { UI512PaintDispatch, UI512PaintDispatchShapes } from './../../ui512/draw/ui512DrawPaintDispatch';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { FloodFillTest } from './testUI512PaintFlood';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512Paint\n *\n * A \"demo\" project showing several painted shapes.\n *\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_\n * (uncomment the line referencing _UI512DemoPaint_), and test drag/drop,\n * and click Download Image to update the test\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512Paint');\nexport let testCollectionUI512Paint = t;\n\nt.atest('Test Shape', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512Paint().testDrawShape()\n    )\n);\nt.atest('Test Flood Fill', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512Paint().testDrawFloodFill()\n    )\n);\n\n/**\n * a test layout showing drawing features\n */\nexport class TestDrawUI512Paint {\n    uiContext = false;\n\n    protected testSetPixelAndSerialize(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        mainPaint: CanvasWrapper,\n        mainPainter: UI512Painter\n    ) {\n        const w = 80;\n        const h = 60;\n        let testFillRect = CanvasWrapper.createMemoryCanvas(w, h);\n        let testSetPixel = CanvasWrapper.createMemoryCanvas(w, h);\n        let testSetPixelSupportingPattern = CanvasWrapper.createMemoryCanvas(w, h);\n        let testDeserialize = CanvasWrapper.createMemoryCanvas(w, h);\n        let canvases = [\n            testFillRect,\n            testSetPixel,\n            testSetPixelSupportingPattern,\n            testDeserialize\n        ];\n\n        /* test 1: uses fillRect, probably faster than setpixel */\n        let painter: UI512Painter = new UI512PainterCvCanvas(testFillRect, w, h);\n        this.drawShapes(painter, w, h);\n\n        /* test 2: uses low-level setpixel */\n        let arr1 = testSetPixel.context.createImageData(w, h);\n        painter = new UI512PainterCvData(arr1.data, w, h);\n        this.drawShapes(painter, w, h);\n        testSetPixel.context.putImageData(arr1, 0, 0);\n\n        /* test 3: uses low-level setpixel, supporting patterns */\n        let arr2 = testSetPixelSupportingPattern.context.createImageData(w, h);\n        painter = new UI512PainterCvDataAndPatterns(arr2.data, w, h);\n        this.drawShapes(painter, w, h);\n        testSetPixelSupportingPattern.context.putImageData(arr2, 0, 0);\n\n        /* test 4: serialize image to a string and round trip it */\n        let serialized = UI512ImageSerialization.writeToString(testFillRect);\n        assertTrue(serialized.length < w * h, 'Bz|');\n        UI512ImageSerialization.loadFromString(testDeserialize, serialized);\n\n        /* show these on the screen */\n        let layout = new GridLayout(610, 50, w, h, [0], canvases, 5, 5);\n        layout.combinations((n, unused, whichCanvas, bnds) => {\n            let el = new UI512ElCanvasPiece(`setPixelAndSerialize${n}`);\n            grp.addElement(app, el);\n            el.setDimensions(bnds[0], bnds[1], bnds[2], bnds[3]);\n            el.setCanvas(whichCanvas);\n        });\n    }\n\n    protected testIrregularPoly(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        mainPaint: CanvasWrapper,\n        mainPainter: UI512Painter\n    ) {\n        let [polygonX, polygonY] = this.getIrregularPolygon(610, 310, 80, 60);\n        let pnt = new UI512PaintDispatch(\n            UI512PaintDispatchShapes.IrregularPolygon,\n            polygonX,\n            polygonY,\n            clrBlack,\n            clrBlack,\n            true\n        );\n\n        UI512PaintDispatch.go(pnt, mainPainter);\n    }\n\n    protected drawBlackRectangle(\n        mainPaint: CanvasWrapper,\n        mainPainter: UI512Painter,\n        x: number,\n        y: number,\n        w: number,\n        h: number\n    ) {\n        let pnt = new UI512PaintDispatch(\n            UI512PaintDispatchShapes.ShapeRectangle,\n            [x, x + w],\n            [y, y + h],\n            clrBlack,\n            clrBlack,\n            true\n        );\n\n        UI512PaintDispatch.go(pnt, mainPainter);\n    }\n\n    protected testSmears(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        mainPaint: CanvasWrapper,\n        mainPainter: UI512Painter\n    ) {\n        let colors = [clrWhite, clrBlack];\n        let types = [\n            UI512PaintDispatchShapes.SmearPencil,\n            UI512PaintDispatchShapes.SmearRectangle,\n            UI512PaintDispatchShapes.SmearSmallBrush,\n            UI512PaintDispatchShapes.SmearSpraycan\n        ];\n\n        let layout = new GridLayout(50, 50, 90, 70, colors, types, 5, 5);\n        layout.combinations((n, color, type, bnds) => {\n            if (color === clrWhite) {\n                this.drawBlackRectangle(\n                    mainPaint,\n                    mainPainter,\n                    bnds[0],\n                    bnds[1],\n                    bnds[2],\n                    bnds[3]\n                );\n            }\n\n            /* draw a smear */\n            let [polygonX, polygonY] = this.getIrregularPolygon(\n                bnds[0],\n                bnds[1],\n                bnds[2],\n                bnds[3]\n            );\n            let pnt = new UI512PaintDispatch(type, polygonX, polygonY, color, 0);\n            UI512PaintDispatch.go(pnt, mainPainter);\n\n            /* drawing a smear with 0 points should be a no-op */\n            pnt = new UI512PaintDispatch(type, [], [], color, 0);\n            UI512PaintDispatch.go(pnt, mainPainter);\n\n            /* drawing a smear with 1 point should still appear */\n            pnt = new UI512PaintDispatch(\n                type,\n                [bnds[0] + bnds[2] - 5],\n                [bnds[1] + bnds[3] - 5],\n                color,\n                0\n            );\n            UI512PaintDispatch.go(pnt, mainPainter);\n        });\n    }\n\n    protected drawShapes(painter: UI512Painter, w: number, h: number) {\n        painter.publicPlotEllipse(0, 0, w - 5, h - 5, clrBlack, undefined, 1);\n        painter.publicRoundRect(0, 0, w / 2, h / 2, clrBlack, clrWhite, 1);\n        painter.publicRectangle(\n            w / 2,\n            h / 2,\n            w / 2 + w / 2,\n            h / 2 + h / 2,\n            clrBlack,\n            undefined,\n            1\n        );\n    }\n\n    protected testShapes(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        mainPaint: CanvasWrapper,\n        mainPainter: UI512Painter\n    ) {\n        let lineColors = [clrWhite, clrBlack, clrBlack, clrBlack];\n        let fillColors: O<number>[] = [clrBlack, clrBlack, undefined, clrWhite];\n        let lineSizes = [1, 1, 1, 5];\n\n        let types = [\n            UI512PaintDispatchShapes.ShapeLine,\n            UI512PaintDispatchShapes.ShapeRectangle,\n            UI512PaintDispatchShapes.ShapeEllipse,\n            UI512PaintDispatchShapes.ShapeRoundRect,\n            UI512PaintDispatchShapes.ShapeCurve\n        ];\n\n        let layout = new GridLayout(\n            270,\n            50,\n            80,\n            60,\n            Util512.range(0, lineColors.length),\n            types,\n            5,\n            5\n        );\n        layout.combinations((n, column: any, type, bnds) => {\n            let lineColor = lineColors[column];\n            let fillColor = fillColors[column];\n            let lineSize = lineSizes[column];\n            if (lineColor === clrWhite) {\n                this.drawBlackRectangle(\n                    mainPaint,\n                    mainPainter,\n                    bnds[0] - 5,\n                    bnds[1] - 5,\n                    bnds[2] + 10,\n                    bnds[3] + 10\n                );\n            }\n\n            let pnt = new UI512PaintDispatch(\n                type,\n                [],\n                [],\n                lineColor,\n                fillColor !== undefined ? fillColor : 0,\n                fillColor !== undefined,\n                lineSize\n            );\n            if (type === UI512PaintDispatchShapes.ShapeCurve) {\n                pnt.xPts = [\n                    bnds[0],\n                    bnds[0] + Math.floor(bnds[2] / 2),\n                    bnds[0] + bnds[2]\n                ];\n                pnt.yPts = [\n                    bnds[1],\n                    bnds[1] + Math.floor(bnds[3] / 8),\n                    bnds[1] + bnds[3]\n                ];\n            } else {\n                pnt.xPts = [bnds[0], bnds[0] + bnds[2]];\n                pnt.yPts = [bnds[1], bnds[1] + bnds[3]];\n            }\n\n            UI512PaintDispatch.go(pnt, mainPainter);\n        });\n    }\n\n    protected getIrregularPolygon(x: number, y: number, w: number, h: number) {\n        let xPts = [x, x + w, x, x, x + Math.floor(w / 2)];\n        let yPts = [\n            y,\n            y + Math.floor(h / 2),\n            y + h,\n            y + Math.floor(h / 2),\n            y + Math.floor(h / 2)\n        ];\n        return [xPts, yPts];\n    }\n\n    addElements(pr: UI512Presenter, bounds: number[]) {\n        let grp = new UI512ElGroup('grp');\n        pr.app.addGroup(grp);\n\n        /* draw bg */\n        let layoutPatternBg = new GridLayout(\n            0,\n            0,\n            68,\n            68,\n            Util512.range(0, 20),\n            Util512.range(0, 20),\n            30,\n            30\n        );\n        let bg = new UI512ElButton('bg');\n        grp.addElement(pr.app, bg);\n        bg.set('style', UI512BtnStyle.Opaque);\n        bg.setDimensions(bounds[0], bounds[1], bounds[2], bounds[3]);\n        bg.set('autohighlight', false);\n        layoutPatternBg.createElems(pr.app, grp, 'bgGrid', UI512ElButton, () => {});\n\n        /* draw a 'canvaspiece' element that shows a piece of the canvas */\n        let canvasMainPaint = new UI512ElCanvasPiece('canvasMainPaint');\n        grp.addElement(pr.app, canvasMainPaint);\n        let cvmain = CanvasWrapper.createMemoryCanvas(bounds[2], bounds[3]);\n        canvasMainPaint.setCanvas(cvmain);\n        canvasMainPaint.setDimensions(0, 0, bounds[2], bounds[3]);\n        cvmain.clear();\n        let canvasMainPainter = new UI512PainterCvCanvas(\n            cvmain,\n            cvmain.canvas.width,\n            cvmain.canvas.height\n        );\n\n        /* run tests; drawing shapes onto the canvas */\n        this.testSmears(pr.app, grp, cvmain, canvasMainPainter);\n        this.testShapes(pr.app, grp, cvmain, canvasMainPainter);\n        this.testSetPixelAndSerialize(pr.app, grp, cvmain, canvasMainPainter);\n        this.testIrregularPoly(pr.app, grp, cvmain, canvasMainPainter);\n        pr.rebuildFieldScrollbars();\n    }\n\n    drawTestCase(\n        testNumber: number,\n        tmpCanvas: CanvasWrapper,\n        w: number,\n        h: number,\n        i: number,\n        complete: RenderComplete\n    ) {\n        tmpCanvas.clear();\n        let testPr = new UI512TestPaintPresenter();\n        testPr.init();\n        testPr.inited = true;\n        testPr.app = new UI512Application([0, 0, w, h], testPr);\n        this.addElements(testPr, testPr.app.bounds);\n        tmpCanvas.clear();\n\n        if (!complete.complete) {\n            /* we're not loaded yet, let's wait until later */\n            return;\n        }\n\n        testPr.needRedraw = true;\n        testPr.render(tmpCanvas, 1, complete);\n    }\n\n    testDrawShape() {\n        const w = 928;\n        const h = 400;\n        const screensToDraw = 1;\n        assertEq(w, ScreenConsts.ScreenWidth, '1T|');\n        let tmpCanvasDom = window.document.createElement('canvas');\n        tmpCanvasDom.width = w;\n        tmpCanvasDom.height = h;\n        let tmpCanvas = new CanvasWrapper(tmpCanvasDom);\n\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = true;\n            for (let i = 0; i < screensToDraw; i++) {\n                this.drawTestCase(i, tmpCanvas, w, h, i, complete);\n                let dest = [0, i * h, w, h];\n                canvas.drawFromImage(\n                    tmpCanvas.canvas,\n                    0,\n                    0,\n                    w,\n                    h,\n                    dest[0],\n                    dest[1],\n                    dest[0],\n                    dest[1],\n                    dest[2],\n                    dest[3]\n                );\n            }\n        };\n\n        const totalH = h * screensToDraw;\n        return new CanvasTestParams(\n            'drawpaintshape',\n            '/resources03a/test/drawpaintshapeexpected.png',\n            draw,\n            w,\n            totalH,\n            this.uiContext\n        );\n    }\n\n    testDrawFloodFill() {\n        let floodfilltest = new FloodFillTest();\n        floodfilltest.start();\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            floodfilltest.floodFillTest(canvas);\n            complete.complete = floodfilltest.isDone;\n        };\n\n        return new CanvasTestParams(\n            'drawpaintflood',\n            '/resources03a/test/drawpaintfloodexpected.png',\n            draw,\n            floodfilltest.layout.getTotalWidth(),\n            floodfilltest.layout.getTotalHeight(),\n            this.uiContext\n        );\n    }\n}\n\n/**\n * nearly-empty presenter, driven by tests to take a screenshot of rendered elements\n */\nexport class UI512TestPaintPresenter extends UI512Presenter {\n    testFillRect: CanvasWrapper;\n    testSetPixel: CanvasWrapper;\n    testSetPixelSupportingPattern: CanvasWrapper;\n    testDeserialize: CanvasWrapper;\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512PaintFlood.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { GridLayout } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { clrBlack, clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { UI512PainterCvDataAndPatterns } from './../../ui512/draw/ui512DrawPainter';\n/* auto */ import { UI512IconManager } from './../../ui512/draw/ui512DrawIconManager';\n/* auto */ import { IconInfo } from './../../ui512/draw/ui512DrawIconClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * no test cases here, used by testUI512paint\n *\n * Test flood fill (paint bucket)\n *\n * We'll draw some 32x32 icons onto the screen,\n * run floodfill for solid black solid white and pattern,\n * and then compare the results with expected results.\n */\nexport class FloodFillTest {\n    readonly columns = [true, true, true, true, true];\n    readonly iconNumbers = [33, 85, 170];\n    readonly layout = new GridLayout(0, 0, 32, 32, this.columns, this.iconNumbers, 5, 5);\n    isDone = false;\n\n    protected runFloodfill(painter: UI512PainterCvDataAndPatterns, spaceX: number) {\n        /* floodfill black onto black */\n        painter.floodFill(2, 18, clrBlack);\n        painter.floodFill(16, 53, clrBlack);\n        painter.floodFill(20, 96, clrBlack);\n\n        /* floodfill white onto white */\n        painter.floodFill(56, 9, clrWhite);\n        painter.floodFill(52, 45, clrWhite);\n        painter.floodFill(52, 90, clrWhite);\n\n        /* floodfill black onto white */\n        painter.floodFill(56 + spaceX, 9, clrBlack);\n        painter.floodFill(52 + spaceX, 45, clrBlack);\n        painter.floodFill(52 + spaceX, 90, clrBlack);\n\n        /* floodfill white onto black */\n        painter.floodFill(2 + 3 * spaceX, 18, clrWhite);\n        painter.floodFill(16 + 3 * spaceX, 53, clrWhite);\n        painter.floodFill(20 + 3 * spaceX, 96, clrWhite);\n\n        /* floodfill with pattern */\n        painter.floodFill(166, 14, 108);\n        painter.floodFill(163, 53, 108);\n        painter.floodFill(163, 91, 108);\n    }\n\n    start() {\n        return CanvasWrapper.createMemoryCanvas(\n            this.layout.getTotalWidth(),\n            this.layout.getTotalHeight()\n        );\n    }\n\n    floodFillTest(canvas: CanvasWrapper) {\n        let iconManager = cast(UI512IconManager, getRoot().getDrawIcon());\n        let readyToLoad = true;\n\n        /* draw a grid of icons onto the canvas */\n        this.layout.combinations((n, _, iconnumber, bnds) => {\n            let info = new IconInfo('002', iconnumber);\n            let icon = iconManager.findIcon(info.iconGroup, info.iconNumber);\n            if (!icon) {\n                readyToLoad = false;\n                return;\n            }\n\n            icon.drawIntoBox(canvas, info, bnds[0], bnds[1], bnds[2], bnds[3]);\n        });\n\n        /* the icons haven't been loaded yet */\n        if (!readyToLoad) {\n            return;\n        }\n\n        let imData = canvas.context.getImageData(\n            0,\n            0,\n            canvas.canvas.width,\n            canvas.canvas.height\n        );\n        let painter = new UI512PainterCvDataAndPatterns(\n            imData.data,\n            canvas.canvas.width,\n            canvas.canvas.height\n        );\n        const spaceX = this.layout.getColWidth();\n        this.runFloodfill(painter, spaceX);\n\n        canvas.context.putImageData(imData, 0, 0);\n        this.isDone = true;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512TextEdit.ts",
    "content": "\n/* auto */ import { ScreenConsts, ScrollConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontSpec, TextFontStyling, specialCharFontChange, specialCharNonBreakingSpace, textFontStylingToString } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { CanvasTestParams, TestUtilsCanvas } from './../testUtils/testUtilsCanvas';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { TestTextEventInteractions } from './testUI512TextEditInteractions';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * TestDrawUI512TextEdit\n *\n * A \"demo\" project showing several text fields with different properties,\n * and containing different amounts of content.\n * 1) tests use this project to compare against a known good screenshot,\n * to make sure rendering has not changed\n * 2) you can start this project in _rootUI512.ts_ (uncomment the line\n * referencing _UI512DemoTextEdit_) to confirm that manually\n * interacting with the text fields has the expected behavior\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionUI512TextEdit');\nexport let testCollectionUI512TextEdit = t;\n\nt.atest('Test Drawing Text Edits', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512TextEdit().testDrawTextEdit(true)\n    )\n);\nt.atest('Test Drawing Text Edits, No Word Wrap', () =>\n    TestUtilsCanvas.RenderAndCompareImages(false, () =>\n        new TestDrawUI512TextEdit().testDrawTextEdit(false)\n    )\n);\n\n/**\n * an example layout showing editable text.\n */\nexport class TestDrawUI512TextEdit {\n    uiContext = false;\n    constructor() {}\n\n    addElements(pr: UI512Presenter, bounds: number[], wordWrap: boolean) {\n        const b0 = 45;\n        const b1 = 45;\n        let grp = new UI512ElGroup('grp');\n        pr.app.addGroup(grp);\n\n        /* add an opaque bg */\n        let bg = new UI512ElButton('bg');\n        grp.addElement(pr.app, bg);\n        bg.set('style', UI512BtnStyle.Opaque);\n        bg.setDimensions(bounds[0], bounds[1], bounds[2], bounds[3]);\n        bg.set('autohighlight', false);\n\n        /* test different styles in upper left */\n        this.addElementsUpperLeft(grp, pr, b0, b1);\n\n        /* test large scrolling fields in left */\n        this.addElementsLeft(b0, pr, grp, wordWrap);\n\n        /* test field properties on the right */\n        this.addElementsRight(pr, grp);\n\n        /* required, tell the presenter to add build scrollbar parts */\n        pr.rebuildFieldScrollbars();\n    }\n\n    getTextWithFonts() {\n        let s = '';\n        let c = specialCharFontChange;\n        s +=\n            c +\n            'geneva_18_' +\n            textFontStylingToString(TextFontStyling.Outline) +\n            c +\n            'ab';\n        s +=\n            c +\n            'geneva_12_' +\n            textFontStylingToString(TextFontStyling.Outline) +\n            c +\n            'ab';\n        s += c + 'geneva_18_' + textFontStylingToString(TextFontStyling.Bold) + c + 'ab';\n        s += c + 'geneva_12_' + textFontStylingToString(TextFontStyling.Bold) + c + 'ab';\n        s +=\n            c +\n            'chicago_18_' +\n            textFontStylingToString(TextFontStyling.Underline) +\n            c +\n            'ab';\n        s +=\n            c +\n            'chicago_12_' +\n            textFontStylingToString(TextFontStyling.Underline) +\n            c +\n            'ab';\n        return FormattedText.newFromSerialized(s);\n    }\n\n    protected addElementsRight(pr: UI512Presenter, grp: UI512ElGroup) {\n        /* test field properties */\n        let cases = [\n            'halign+scr',\n            'halign',\n            'oneline',\n            'rdonly',\n            'noselct',\n            'nowrap',\n            'fnts',\n            'ignorevalgn',\n            'vspace',\n            'small'\n        ];\n\n        let layoutLbl = new GridLayout(\n            485,\n            80,\n            80,\n            20,\n            Util512.range(0, 5),\n            Util512.range(0, 2),\n            10,\n            100 - 20\n        );\n        layoutLbl.createElems(pr.app, grp, 'caseLbl', UI512ElLabel, (a, b, el) => {\n            let whichCase = cases[a + b * 5];\n            el.set('labeltext', whichCase);\n        });\n\n        let layoutCases = new GridLayout(\n            485,\n            100,\n            80,\n            60,\n            Util512.range(0, 5),\n            Util512.range(0, 2),\n            10,\n            40\n        );\n        layoutCases.createElems(\n            pr.app,\n            grp,\n            'testCases',\n            UI512ElTextField,\n            (a, b, el) => {\n                let whichCase = cases[a + b * 5];\n                this.geneva(el, '1234123412345\\nabc');\n                switch (whichCase) {\n                    case 'halign+scr':\n                        el.set('labelhalign', true);\n                        el.set('scrollbar', true);\n                        break;\n                    case 'halign':\n                        el.set('labelhalign', true);\n                        break;\n                    case 'oneline':\n                        el.set('multiline', false);\n                        this.geneva(el, 'abc');\n                        break;\n                    case 'rdonly':\n                        el.set('canedit', false);\n                        break;\n                    case 'noselct':\n                        el.set('canselecttext', false);\n                        break;\n                    case 'nowrap':\n                        el.set('labelwrap', false);\n                        break;\n                    case 'fnts':\n                        el.setFmTxt(this.getTextWithFonts());\n                        el.set(\n                            'defaultFont',\n                            'geneva_18_' +\n                                textFontStylingToString(TextFontStyling.Outline)\n                        );\n                        break;\n                    case 'ignorevalgn':\n                        el.set('labelvalign', true);\n                        break;\n                    case 'vspace':\n                        el.set('addvspacing', 8);\n                        break;\n                    case 'small':\n                        el.setDimensions(el.x, el.y, el.w, ScrollConsts.BoxHeight * 2);\n                        el.set('scrollbar', true);\n                        this.geneva(el, 'scrll hidden bc of size');\n                        break;\n                    default:\n                        assertTrue(false, '1u|not reached');\n                        break;\n                }\n            }\n        );\n    }\n\n    protected addElementsLeft(\n        b0: number,\n        pr: UI512Presenter,\n        grp: UI512ElGroup,\n        wordWrap: boolean\n    ) {\n        /* test large fields with varying amounts of text */\n        /* why use NonBreakingSpace? this test was written before we\n        had actual word wrapping, */\n        /* instead of rewriting the test just use NonBreakingSpace\n        so that it matches what was rendered before. */\n        let shortSampleText = loremText.substr(0, 70);\n        let longSampleText = loremText.substr(0, 700);\n\n        if (!wordWrap) {\n            /* uses the results from back before we had\n            word-wrapping. */\n            shortSampleText = shortSampleText.replace(/ /g, specialCharNonBreakingSpace);\n            longSampleText = longSampleText.replace(/ /g, specialCharNonBreakingSpace);\n        }\n\n        let rowsTextContent = [shortSampleText, longSampleText];\n        let cols = [\n            [true, true],\n            [true, false],\n            [false, true],\n            [false, false]\n        ];\n        let layoutGrid = new GridLayout(\n            b0 + 10,\n            100,\n            130,\n            130,\n            cols,\n            rowsTextContent,\n            10,\n            10\n        );\n        layoutGrid.createElems(\n            pr.app,\n            grp,\n            'testGrid',\n            UI512ElTextField,\n            (a, content, el) => {\n                let [isWide, isScroll] = a;\n                this.geneva(el, content);\n                el.set('scrollbar', isScroll);\n                if (!isWide) {\n                    el.setDimensions(el.x, el.y, el.w / 2, el.h);\n                    if (el.id === 'testGrid_3' || el.id === 'testGrid_7') {\n                        el.setDimensions(el.x - el.w, el.y, el.w, el.h);\n                    }\n                }\n            }\n        );\n    }\n\n    protected addElementsUpperLeft(\n        grp: UI512ElGroup,\n        pr: UI512Presenter,\n        b0: number,\n        b1: number\n    ) {\n        /* add horizontal lines, for testing opacity */\n        let testTransparency1 = new UI512ElButton('bgTransparency1');\n        grp.addElement(pr.app, testTransparency1);\n        testTransparency1.setDimensions(b0 + 2, b1 + 24, 300, 2);\n        let testTransparency2 = new UI512ElButton('bgTransparency2');\n        grp.addElement(pr.app, testTransparency2);\n        testTransparency2.setDimensions(b0 + 2, b1 + 30, 300, 2);\n\n        /* test different styles */\n        let styles: number[] = [\n            UI512FldStyle.Opaque,\n            UI512FldStyle.Transparent,\n            UI512FldStyle.Rectangle,\n            UI512FldStyle.Shadow\n        ];\n\n        let layoutStyles = new GridLayout(b0 + 10, b1 + 5, 60, 45, styles, [1], 10, 10);\n        layoutStyles.createElems(\n            pr.app,\n            grp,\n            'testStyles',\n            UI512ElTextField,\n            (a, b, el) => {\n                el.set('style', a);\n                el.setFmTxt(FormattedText.newFromSerialized('text\\ntext'));\n            }\n        );\n    }\n\n    toggleScroll(pr: UI512Presenter) {\n        let grp = pr.app.getGroup('grp');\n        for (let el of grp.iterEls()) {\n            if (el instanceof UI512ElTextField) {\n                el.set('scrollbar', !el.getB('scrollbar'));\n            }\n        }\n\n        pr.rebuildFieldScrollbars();\n    }\n\n    drawTestCase(\n        testNumber: number,\n        tmpCanvas: CanvasWrapper,\n        w: number,\n        h: number,\n        i: number,\n        wordWrap: boolean,\n        complete: RenderComplete\n    ) {\n        tmpCanvas.clear();\n        let pr = new UI512TestTextEditPresenter();\n        pr.init();\n        pr.inited = true;\n        pr.app = new UI512Application([0, 0, w, h], pr);\n        this.addElements(pr, pr.app.bounds, wordWrap);\n\n        /* first pass rendering adds the scrollbars */\n        /* don't show any borders */\n        pr.view.renderBorders = () => {};\n        pr.needRedraw = true;\n        pr.render(tmpCanvas, 1, complete);\n        tmpCanvas.clear();\n\n        if (!complete.complete) {\n            /* the fonts aren't loaded yet, let's wait until later */\n            return;\n        }\n\n        if (testNumber === 1) {\n            let interact = new TestTextEventInteractions();\n            interact.drawTestCaseSelection(pr);\n        } else if (testNumber === 2) {\n            let interact = new TestTextEventInteractions();\n            interact.drawTestCaseScrolling(pr);\n        }\n\n        /* second pass rendering */\n        pr.view.allowMultipleFocus = true;\n        pr.view.renderBorders = () => {};\n        pr.needRedraw = true;\n        pr.render(tmpCanvas, 1, complete);\n    }\n\n    testDrawTextEdit(wordWrap: boolean) {\n        const w = 928;\n        const h = 400;\n        const screensToDraw = 3;\n        assertEq(w, ScreenConsts.ScreenWidth, '1t|');\n        let tmpCanvasDom = window.document.createElement('canvas');\n        tmpCanvasDom.width = w;\n        tmpCanvasDom.height = h;\n        let tmpCanvas = new CanvasWrapper(tmpCanvasDom);\n\n        let draw = (canvas: CanvasWrapper, complete: RenderComplete) => {\n            complete.complete = true;\n            for (let i = 0; i < screensToDraw; i++) {\n                this.drawTestCase(i, tmpCanvas, w, h, i, wordWrap, complete);\n                let dest = [0, i * h, w, h];\n                canvas.drawFromImage(\n                    tmpCanvas.canvas,\n                    0,\n                    0,\n                    w,\n                    h,\n                    dest[0],\n                    dest[1],\n                    dest[0],\n                    dest[1],\n                    dest[2],\n                    dest[3]\n                );\n            }\n        };\n\n        const totalH = h * screensToDraw;\n        let hasWrap = wordWrap ? '' : 'no';\n        return new CanvasTestParams(\n            'drawTextEdit',\n            `/resources03a/test/drawtextedit${hasWrap}wrapexpected.png`,\n            draw,\n            w,\n            totalH,\n            this.uiContext\n        );\n    }\n\n    geneva(el: UI512ElTextField, s: string) {\n        let spec = new TextFontSpec('geneva', TextFontStyling.Default, 10);\n        el.set('defaultFont', spec.toSpecString());\n        let t = FormattedText.newFromSerialized(\n            UI512DrawText.setFont(s, spec.toSpecString())\n        );\n        el.setFmTxt(t);\n    }\n}\n\n/**\n * nearly-empty presenter, driven by tests to take a screenshot of rendered elements\n */\nexport class UI512TestTextEditPresenter extends UI512Presenter {\n    init() {\n        super.init();\n        addDefaultListeners(this.listeners);\n    }\n}\n\n/**\n * lorem ipsum filler text\n */\nconst loremText = longstr(`Lorem ipsum dolor sit amet, dolore pericula ne mel,\nerat feugait placerat ut sit, id vel persecuti constituam. Nibh probo et pro,\nei quo case deterruisset. Nibh impetus per at. Oporteat scripserit has te,\nsea te nostrud pertinacia. Per deleniti deseruisse an, et usu singulis\nnecessitatibus. Antiopam efficiendi an mei.{{NEWLINE}}Cum cu ignota timeam consequat,\nsalutandi contentiones nam an, ut apeirian deserunt conclusionemque eum. Eu\nsingulis deterruisset vix, sed in sumo suas facete. Qui reprimique dissentiunt\nte, nam ne habeo officiis argumentum, cu pri homero democritum. No illum\nmoderatius sea, vim no equidem nusquam complectitur.{{NEWLINE}}Autem dolor principes\nea duo. In sea suas tation regione, cum ei maiorum volumus reformidans.\nEi mei noluisse oportere iudicabit, ex ius summo officiis, feugait blandit\nnominavi id vel. Purto accusamus eu ius, an posse probatus similique\nqui.{{NEWLINE}}Ut nibh maiestatis ius, sea dolorum facilisi ei. Cu cum tritani quaeque\npertinacia, causae delectus delicata pro te, graeco scribentur\nreprehendunt pri eu. Corpora iracundia adolescens sit ei, in duo\ncommune reprimique. In aliquam graecis eum, fugit utamur et sea.\nIn molestie platonem conceptam mel. Ea hinc sensibus eam, aeque\nexpetendis reprimique et vim.{{NEWLINE}}Sumo saepe sit ne. Ex facilisi pericula\nconstituam pri, et pro habemus definiebas, aliquam electram ex nam.\nMagna nostro moderatius ei sea, cu quo nostro theophrastus. Tation\nblandit ei per, odio dolorem has at. At brute alterum vituperatoribus\nnec, ad vix idque vocent. An porro ullum euripidis his, an graecis\nnostrum eligendi nec. Eos saepe aeterno accommodare ei.`);\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512TextEditInteractions.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { KeyDownEventDetails, MouseDownDoubleEventDetails, MouseDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * no test cases need to be here, it's used by testUI512TextEdit\n *\n * send simulated events,\n * and we'll then compare a screenshot of the current state\n * with a known-good screenshot to see if we rendered what was expected\n */\nexport class TestTextEventInteractions {\n    drawTestCaseScrolling(pr: UI512Presenter) {\n        /* confirm that a scrollbar is enabled when text gets too long */\n        /* click in the padding area after '12345' in fld 'halign+scr' and enter lots of text */\n        this.simulateClick(pr, 539, 118, false, false);\n        for (let i = 0; i < 16; i++) {\n            this.simulateTypeLetter(pr, 'Q');\n            this.simulateTypeLetter(pr, 'W');\n            this.simulateTypeLetter(pr, 'E');\n        }\n\n        /* confirm that scrollbar disabled when text short enough */\n        /* the scrollbar should now be disabled because the text is short, and scrolled to top */\n        /* click on fld 7 and hit Ctrl+End */\n        this.simulateClick(pr, 360, 296, false, false);\n        this.simulateKey(pr, 'End', '', false, true);\n        /* hit Ctrl+Backspace 120 times */\n        for (let i = 0; i < 120; i++) {\n            this.simulateKey(pr, 'Backspace', '', false, true);\n        }\n\n        /* try scrolling up/down with the arrows */\n        /* insert some text at the beginning of fld 3 */\n        this.simulateClick(pr, 340, 110, false, false);\n        for (let i = 1; i <= 8; i++) {\n            this.simulateTypeLetter(pr, i.toString());\n            this.simulateKey(pr, 'Enter', '', false);\n        }\n        /* hit the scroll down arrow 5x */\n        for (let i = 0; i < 5; i++) {\n            this.simulateClick(pr, 390, 222, false, false);\n        }\n        /* hit the scroll up arrow 2x */\n        for (let i = 0; i < 2; i++) {\n            this.simulateClick(pr, 390, 111, false, false);\n        }\n\n        /* try scrolling up/down by clicking on the background */\n        /* click the lower bg of fld 5, 5x */\n        for (let i = 0; i < 2; i++) {\n            this.simulateClick(pr, 180, 345, false, false);\n        }\n        /* hit the upper bg 2x */\n        for (let i = 0; i < 2; i++) {\n            this.simulateClick(pr, 178, 266, false, false);\n        }\n\n        /* clicking the arrows should have no effect if scrollbar is disabled */\n        /* click on the up/down arrows of fld 1 */\n        for (let i = 0; i < 2; i++) {\n            this.simulateClick(pr, 177, 110, false, false);\n        }\n        for (let i = 0; i < 5; i++) {\n            this.simulateClick(pr, 177, 224, false, false);\n        }\n\n        /* make it big enough to have a scrollbar */\n        let smallFld = cast(UI512ElTextField, pr.app.getEl('testCases_9'));\n        smallFld.setDimensions(smallFld.x, smallFld.y, smallFld.w, 120);\n        smallFld.setFmTxt(FormattedText.newFromSerialized('now ok'));\n    }\n\n    drawTestCaseSelection(pr: UI512Presenter) {\n        /* part 1: set selections ------------------------------------------ */\n        /* in the 1st field double-click at 105, 105 to select \"ipsum\" */\n        this.simulateClick(pr, 105, 105, true);\n\n        /* in the 2nd field click at 216, 106 to click on lorem */\n        /* shift click at 282, 109 to move the selection to middle of \"dolor\" */\n        this.simulateClick(pr, 216, 106);\n        this.simulateClick(pr, 282, 109, false, true);\n\n        /* in the 3rd field click at 351,108 to select part of lorem */\n        /* hit shift-page down to select down to \"pla\" */\n        this.simulateClick(pr, 351, 108);\n        this.simulateKey(pr, 'PageDown', '', true);\n\n        /* in the 4th field click at 430, 133 to select part of amet */\n        /* shift click at 460, 160 to select down to erat */\n        this.simulateClick(pr, 430, 133);\n        this.simulateClick(pr, 460, 160, false, true);\n\n        /* in the 5th field click at 115, 246 to select part of ipsum */\n        /* hit shift-page down to select down to \"sea te\" */\n        this.simulateClick(pr, 115, 246);\n        this.simulateKey(pr, 'PageDown', '', true);\n\n        /* in the 6th field click at 263, 271 to select part of feugait */\n        /* hit shift-up 5x (the rest are unneeded) to select up to \"dolor\" */\n        this.simulateClick(pr, 263, 271);\n        for (let i = 0; i < 5; i++) {\n            this.simulateKey(pr, 'ArrowUp', '', true);\n        }\n\n        /* in 7th fld click at 360, 260 to select part of psum */\n        /* hit shift-pagedown 5x to select down to apeirian */\n        this.simulateClick(pr, 360, 260);\n        for (let i = 0; i < 5; i++) {\n            this.simulateKey(pr, 'PageDown', '', true);\n        }\n\n        /* in 8th fld click at 444,288 to select part of pericula */\n        /* hit shift-down 6x to select down to \"uam N\". */\n        /* if this were a scrolling field it would should shift\n        scroll slightly down, */\n        /* but we've decided that for perf, a field with no\n        scrollbar doesn't need to scroll down. */\n        this.simulateClick(pr, 444, 288);\n        for (let i = 0; i < 6; i++) {\n            this.simulateKey(pr, 'ArrowDown', '', true);\n        }\n\n        /* click to set focus left of the 12345 in fld 'halign+scr' */\n        /* hit shift-left 4x */\n        this.simulateClick(pr, 500, 118);\n        for (let i = 0; i < 4; i++) {\n            this.simulateKey(pr, 'ArrowLeft', '', true);\n        }\n\n        /* click to set focus left of the text in fld 'rdonly' */\n        /* hit shift-left 5x */\n        this.simulateClick(pr, 759, 135);\n        for (let i = 0; i < 5; i++) {\n            this.simulateKey(pr, 'ArrowLeft', '', true);\n        }\n\n        /* part 2: cases with few characters ------------------------------------------ */\n        /* zero chars */\n        this.simulateClick(pr, 78, 63);\n        this.simulateKey(pr, 'A', 'a', false, true);\n        this.simulateKey(pr, 'Delete', '', false, false);\n\n        /* 1 char, caret after */\n        this.simulateClick(pr, 143, 60);\n        this.simulateKey(pr, 'A', 'a', false, true);\n        this.simulateTypeLetter(pr, '1');\n\n        /* 1 char, selected */\n        this.simulateClick(pr, 218, 60);\n        this.simulateKey(pr, 'A', 'a', false, true);\n        this.simulateTypeLetter(pr, '1');\n        this.simulateKey(pr, 'ArrowLeft', '', true, false);\n\n        /* 1 char, caret before */\n        this.simulateClick(pr, 291, 60);\n        this.simulateKey(pr, 'A', 'a', false, true);\n        this.simulateTypeLetter(pr, '1');\n        this.simulateKey(pr, 'ArrowLeft', '', false, false);\n\n        /* part 3: set selections & input text ------------------------------------------ */\n\n        /* click at 598, 212 to set focus to the right of the ab font typeface tests */\n        /* type z to insert a z */\n        this.simulateClick(pr, 618, 218);\n        this.simulateTypeLetter(pr, 'Z');\n        this.simulateKey(pr, 'ArrowRight', '', true);\n\n        /* click to set focus to the right of the 345 in fld 'halign' */\n        /* type a to insert an a */\n        this.simulateClick(pr, 638, 121);\n        this.simulateTypeLetter(pr, 'A');\n        this.simulateKey(pr, 'ArrowRight', '', true, true);\n\n        /* test rendering with right font after all chars deleted */\n        /* click, hit Backspace 13 times, hit Delete 4 times */\n        /* type Y */\n        this.simulateClick(pr, 697, 219);\n        for (let i = 0; i < 13; i++) {\n            this.simulateKey(pr, 'Backspace', '', false);\n        }\n        for (let i = 0; i < 4; i++) {\n            this.simulateKey(pr, 'Delete', '', false);\n        }\n\n        this.simulateTypeLetter(pr, 'Y');\n        this.simulateTypeLetter(pr, 'A');\n        this.simulateTypeLetter(pr, 'B');\n\n        /* test rendering \\n\\n */\n        /* click, hit Backspace 13 times, hit Delete 4 times */\n        /* type Enter */\n        /* type Enter */\n        /* type shift-left */\n        /* type shift left */\n        this.simulateClick(pr, 812, 231);\n        for (let i = 0; i < 13; i++) {\n            this.simulateKey(pr, 'Backspace', '', false);\n        }\n\n        for (let i = 0; i < 4; i++) {\n            this.simulateKey(pr, 'Delete', '', false);\n        }\n\n        this.simulateKey(pr, 'Enter', '', false);\n        this.simulateKey(pr, 'Enter', '', false);\n        this.simulateKey(pr, 'ArrowLeft', '', true);\n        this.simulateKey(pr, 'ArrowLeft', '', true);\n\n        /* for fld \"small\" */\n        /* type & to insert text before any text in the field */\n        this.simulateClick(pr, 847, 205);\n        this.simulateKey(pr, '', '&', false);\n        this.simulateKey(pr, 'ArrowDown', '', true);\n    }\n\n    simulateClick(\n        pr: UI512Presenter,\n        x: number,\n        y: number,\n        doubleclick = false,\n        isShift = false\n    ) {\n        let mods = isShift ? ModifierKeys.Shift : ModifierKeys.None;\n        if (doubleclick) {\n            pr.rawEventCanThrow(new MouseDownEventDetails(0, x, y, 0, mods));\n            pr.rawEventCanThrow(new MouseDownEventDetails(1, x, y, 0, mods));\n            pr.rawEventCanThrow(new MouseDownDoubleEventDetails(2, x, y, 0, mods));\n        } else {\n            pr.rawEventCanThrow(new MouseDownEventDetails(0, x, y, 0, mods));\n        }\n    }\n\n    simulateTypeLetter(pr: UI512Presenter, letter: string) {\n        let isShift = letter === letter.toUpperCase();\n        this.simulateKey(pr, letter, letter.toLowerCase(), isShift);\n    }\n\n    simulateKey(\n        pr: UI512Presenter,\n        keyCode: string,\n        keyChar: string,\n        isShift: boolean,\n        isCmd = false\n    ) {\n        let mods = isShift ? ModifierKeys.Shift : ModifierKeys.None;\n        mods |= isCmd ? ModifierKeys.Cmd : ModifierKeys.None;\n        let d = new KeyDownEventDetails(0, keyCode, keyChar, false, mods);\n        pr.rawEventCanThrow(d);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512TextModify.ts",
    "content": "\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModifyImpl } from './../../ui512/textedit/ui512TextSelModifyImpl';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { TextFontStyling, specialCharFontChange, textFontStylingToString } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on TextSelModifyImpl that modify the text\n *\n * To make the tests easier to read, we use the symbol\n * ^ to mean the selcaret (start of selection)\n * # to mean the selend (end of selection)\n * and\n * | to mean a newline character\n *\n *\n * For example, to say that the second word should be selected, we can write\n * \"abc ^def# ghi\"\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUI512TextModify');\nexport let testCollectionUI512TextModify = t;\n\nconst dup = TextSelModifyImpl.changeTextDuplicate;\nconst ind = TextSelModifyImpl.changeTextIndentation;\nconst prfx = TextSelModifyImpl.changeTextToggleLinePrefix;\n\nt.test('changeTextDuplicate', () => {\n    runT('^#', '^#', dup);\n    runT('^#a|a', '^#a', dup);\n    runT('a^#|a', 'a^#', dup);\n    runT('abcd^#|abcd', 'abcd^#', dup);\n    runT('a^#bcd|abcd', 'a^#bcd', dup);\n    runT('^#abcd|abcd', '^#abcd', dup);\n    runT('a^#bcd|abcd', 'a^bc#d', dup);\n    runT('12|abcd^#|abcd', '12|abcd^#', dup);\n    runT('12|a^#bcd|abcd', '12|a^#bcd', dup);\n    runT('12|^#abcd|abcd', '12|^#abcd', dup);\n    runT('12|a^#bcd|abcd', '12|a^bc#d', dup);\n    runT('12|abcd^#|abcd|34', '12|abcd^#|34', dup);\n    runT('12|a^#bcd|abcd|34', '12|a^#bcd|34', dup);\n    runT('12|^#abcd|abcd|34', '12|^#abcd|34', dup);\n    runT('12|a^#bcd|abcd|34', '12|a^bc#d|34', dup);\n    runT('abcd^#|abcd|34', 'abcd^#|34', dup);\n    runT('a^#bcd|abcd|34', 'a^#bcd|34', dup);\n    runT('^#abcd|abcd|34', '^#abcd|34', dup);\n    runT('a^#bcd|abcd|34', 'a^bc#d|34', dup);\n});\nt.test('modifyConfirmThatFailureAsserts', () => {\n    runT('abcd^#|abcd', 'abcd^#', dup);\n    /* getting the wrong text should assert */\n    assertAsserts('QG|', 'wrong text', () => {\n        runT('abcd^#|Abcd', 'abcd^#', dup);\n    });\n    /* missing caret should assert */\n    assertAsserts('QF|', 'assert:', () => {\n        runT('abcd#|abcd', 'abcd^#', dup);\n    });\n    /* missing end should assert */\n    assertAsserts('QE|', 'assert:', () => {\n        runT('abcd^|abcd', 'abcd^#', dup);\n    });\n    /* getting the wrong caret should assert */\n    assertAsserts('QD|', 'incorrect caret', () => {\n        runT('abc^d#|abcd', 'abcd^#', dup);\n    });\n    /* getting the wrong end should assert */\n    assertAsserts('QC|', 'incorrect select-end', () => {\n        runT('abcd^|#abcd', 'abcd^#', dup);\n    });\n});\nt.test('changeTextIndentation.Decrease,OneLine', () => {\n    runT('^#', '^#', ind, true, defFont);\n    runT('^abc#', 'abc^#', ind, true, defFont);\n    runT('^a\\tbc#', 'a\\tbc^#', ind, true, defFont);\n    runT('^abc#', '\\ta^b#c', ind, true, defFont);\n    runT('^abc#', '\\tabc^#', ind, true, defFont);\n    runT('^\\tabc#', '\\t\\tabc^#', ind, true, defFont);\n    runT('^\\t\\tabc#', '\\t\\t\\tabc^#', ind, true, defFont);\n    runT('^abc\\tdef#', '\\tabc\\tdef^#', ind, true, defFont);\n    runT('^abc#', '    abc^#', ind, true, defFont);\n    runT('^\\tabc#', '        abc^#', ind, true, defFont);\n    runT('^\\tabc#', '    \\tabc^#', ind, true, defFont);\n});\nt.test('changeTextIndentation.Increase,OneLine', () => {\n    runT('^#', '^#', ind, false, defFont);\n    runT('^\\tabc#', 'abc^#', ind, false, defFont);\n    runT('^\\ta\\tbc#', 'a\\tbc^#', ind, false, defFont);\n    runT('^\\t\\tabc#', '\\ta^b#c', ind, false, defFont);\n    runT('^\\t\\tabc#', '\\tabc^#', ind, false, defFont);\n    runT('^\\t\\t\\tabc#', '\\t\\tabc^#', ind, false, defFont);\n    runT('^\\t\\t\\t\\tabc#', '\\t\\t\\tabc^#', ind, false, defFont);\n    runT('^\\t\\ta\\tdef#', '\\ta\\tdef^#', ind, false, defFont);\n    runT('^\\t\\tabc#', '    abc^#', ind, false, defFont);\n    runT('^\\t\\t\\tabc#', '        abc^#', ind, false, defFont);\n    runT('^\\t\\t\\tabc#', '    \\tabc^#', ind, false, defFont);\n});\nt.test('changeTextIndentation.Decrease,ManyLines', () => {\n    runT('^\\tabc|ABC|def#|\\tDEF', '^\\t\\tabc|\\tABC|def#|\\tDEF', ind, true, defFont);\n    runT('^\\tabc|ABC|def#|\\tDEF', '\\t\\tab^c|\\tABC|d#ef|\\tDEF', ind, true, defFont);\n    runT('\\t\\tabc|^ABC|def#|\\tDEF', '\\t\\tabc|^\\tABC|def#|\\tDEF', ind, true, defFont);\n    runT('\\t\\tabc|^ABC|def#|\\tDEF', '\\t\\tabc|\\tABC^|#def|\\tDEF', ind, true, defFont);\n});\nt.test('changeTextIndentation.Increase,ManyLines', () => {\n    runT(\n        '^\\t\\t\\tabc|\\t\\tABC|\\tdef#|\\tDEF',\n        '^\\t\\tabc|\\tABC|def#|\\tDEF',\n        ind,\n        false,\n        defFont\n    );\n    runT(\n        '^\\t\\t\\tabc|\\t\\tABC|\\tdef#|\\tDEF',\n        '\\t\\tab^c|\\tABC|d#ef|\\tDEF',\n        ind,\n        false,\n        defFont\n    );\n    runT(\n        '\\t\\tabc|^\\t\\tABC|\\tdef#|\\tDEF',\n        '\\t\\tabc|^\\tABC|def#|\\tDEF',\n        ind,\n        false,\n        defFont\n    );\n    runT(\n        '\\t\\tabc|^\\t\\tABC|\\tdef#|\\tDEF',\n        '\\t\\tabc|\\tABC^|#def|\\tDEF',\n        ind,\n        false,\n        defFont\n    );\n});\nt.test('changeTextToggleLinePrefix.AddPrefixOnOneLine', () => {\n    runT('^#', '^#', prfx, 'PRE', defFont);\n    runT('^PREabc#', 'abc^#', prfx, 'PRE', defFont);\n    runT('^PREabc#', '^#abc', prfx, 'PRE', defFont);\n    runT('^PREPRabc#', 'PRabc^#', prfx, 'PRE', defFont);\n    runT('^PREaPREbc#', '^#aPREbc', prfx, 'PRE', defFont);\n    runT('^\\tPREaPREbc#', '^#\\taPREbc', prfx, 'PRE', defFont);\n});\nt.test('changeTextToggleLinePrefix.RemovePrefixOnOneLine', () => {\n    runT('^abc#', 'PREabc^#', prfx, 'PRE', defFont);\n    runT('^abc#', '^#PREabc', prfx, 'PRE', defFont);\n    runT('^PRabc#', 'PREPRabc^#', prfx, 'PRE', defFont);\n    runT('^aPREbc#', '^#PREaPREbc', prfx, 'PRE', defFont);\n    runT('^PREabc#', '^#PREPREabc', prfx, 'PRE', defFont);\n    runT('^\\tPREabc#', '^#\\tPREPREabc', prfx, 'PRE', defFont);\n});\nt.test('changeTextToggleLinePrefix.AddPrefixOnManyLines', () => {\n    let c = specialCharFontChange;\n    runT('^PREab|PREcd#|ef', '^ab|cd#|ef', prfx, 'PRE', defFont);\n    runT('^PREab|PREcd#|ef', 'ab^|#cd|ef', prfx, 'PRE', defFont);\n    runT(`ab|^PREcd|${c}${defFont}${c}PRE#`, 'ab|cd#|^', prfx, 'PRE', defFont);\n    runT(`ab|cd|${c}${defFont}${c}^PRE#`, 'ab|cd|^#', prfx, 'PRE', defFont);\n});\nt.test('changeTextToggleLinePrefix.RemovePrefixOnManyLines', () => {\n    let c = specialCharFontChange;\n    runT('^ab|cd#|PREef', '^PREab|PREcd#|PREef', prfx, 'PRE', defFont);\n    runT('^ab|cd#|PREef', 'PREab^|#PREcd|PREef', prfx, 'PRE', defFont);\n    runT(`PREab|^cd|${c}${defFont}${c}PRE#`, 'PREab|PREcd#|^', prfx, 'PRE', defFont);\n    runT(`PREab|PREcd|^${c}${defFont}${c}PRE#`, 'PREab|PREcd|^#', prfx, 'PRE', defFont);\n});\nt.test('changeTextDeleteLine', () => {\n    runT('^#', '^#', TextSelModifyImpl.changeTextDeleteLine);\n    runT('^#', 'abc^#', TextSelModifyImpl.changeTextDeleteLine);\n    runT('^#', 'a^b#c', TextSelModifyImpl.changeTextDeleteLine);\n    runT('^#cd|ef', 'ab^#|cd|ef', TextSelModifyImpl.changeTextDeleteLine);\n    runT('^#cd|ef', '^ab#|cd|ef', TextSelModifyImpl.changeTextDeleteLine);\n    runT('^#cd|ef', 'ab^|cd#|ef', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|^#ef', 'ab|cd^#|ef', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|^#ef', 'ab|^cd#|ef', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|^#ef', 'ab|cd^|ef#', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|cd|^#', 'ab|cd|ef^#', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|cd|^#', 'ab|cd|^ef#', TextSelModifyImpl.changeTextDeleteLine);\n    runT('ab|cd|^#', 'ab|cd#|ef^', TextSelModifyImpl.changeTextDeleteLine);\n});\nt.test('changeTextBackspace.DeleteToTheLeft', () => {\n    runT('^#abc', '^#abc', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('^#bc', 'a^#bc', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('a^#c', 'ab^#c', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('ab^#', 'abc^#', TextSelModifyImpl.changeTextBackspace, true, false);\n});\nt.test('changeTextBackspace.DeleteToTheRight', () => {\n    runT('^#bc', '^#abc', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('a^#c', 'a^#bc', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('ab^#', 'ab^#c', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('abc^#', 'abc^#', TextSelModifyImpl.changeTextBackspace, false, false);\n});\nt.test('changeTextBackspace.DeleteSelectionWithBackspaceKey', () => {\n    runT('a^#d', 'a^bc#d', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('a^#d', 'a#bc^d', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('^#d', '^abc#d', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('a^#', 'a^bcd#', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('^#', '^abcd#', TextSelModifyImpl.changeTextBackspace, true, false);\n    runT('^#', '^#', TextSelModifyImpl.changeTextBackspace, true, false);\n});\nt.test('changeTextBackspace.DeleteSelectionWithDeleteKey', () => {\n    runT('a^#d', 'a^bc#d', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('a^#d', 'a#bc^d', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('^#d', '^abc#d', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('a^#', 'a^bcd#', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('^#', '^abcd#', TextSelModifyImpl.changeTextBackspace, false, false);\n    runT('^#', '^#', TextSelModifyImpl.changeTextBackspace, false, false);\n});\nt.test('changeTextInsert.TypeCharacters', () => {\n    runT('1^#abc', '^#abc', TextSelModifyImpl.changeTextInsert, '1', defFont);\n    runT('123^#abc', '^#abc', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('a123^#bc', 'a^#bc', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('ab123^#c', 'ab^#c', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('abc123^#', 'abc^#', TextSelModifyImpl.changeTextInsert, '123', defFont);\n});\nt.test('changeTextInsert.TypeCharactersAndReplaceExisting', () => {\n    runT('a123^#d', 'a^bc#d', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('a123^#d', 'a#bc^d', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('123^#d', '^abc#d', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('a123^#', 'a^bcd#', TextSelModifyImpl.changeTextInsert, '123', defFont);\n    runT('123^#', '^abcd#', TextSelModifyImpl.changeTextInsert, '123', defFont);\n});\nt.test('changeTextInsert.TypeCharactersShouldUseDefaultFontIfAnEmptyField', () => {\n    let c = specialCharFontChange;\n    runT(\n        `${c}${defFont}${c}123^#`,\n        '^#',\n        TextSelModifyImpl.changeTextInsert,\n        '123',\n        defFont\n    );\n});\nt.test('changeTextInsert.TypedCharactersShouldMatchAdjacentFont', () => {\n    let style = textFontStylingToString(TextFontStyling.Default);\n    let c = specialCharFontChange;\n    runT(\n        `${c}courier_1_${style}${c}ABC^#a${c}courier_2_${style}${c}b${c}courier_3_${style}${c}c`,\n        `^#${c}courier_1_${style}${c}a${c}courier_2_${style}${c}b${c}courier_3_${style}${c}c`,\n        TextSelModifyImpl.changeTextInsert,\n        'ABC',\n        defFont\n    );\n    runT(\n        `${c}courier_1_${style}${c}aABC^#${c}courier_2_${style}${c}b${c}courier_3_${style}${c}c`,\n        `${c}courier_1_${style}${c}a${c}courier_2_${style}${c}^#b${c}courier_3_${style}${c}c`,\n        TextSelModifyImpl.changeTextInsert,\n        'ABC',\n        defFont\n    );\n    runT(\n        `${c}courier_1_${style}${c}a${c}courier_2_${style}${c}bABC^#${c}courier_3_${style}${c}c`,\n        `${c}courier_1_${style}${c}a${c}courier_2_${style}${c}b${c}courier_3_${style}${c}^#c`,\n        TextSelModifyImpl.changeTextInsert,\n        'ABC',\n        defFont\n    );\n    runT(\n        `${c}courier_1_${style}${c}a${c}courier_2_${style}${c}b${c}courier_3_${style}${c}cABC^#`,\n        `${c}courier_1_${style}${c}a${c}courier_2_${style}${c}b${c}courier_3_${style}${c}c^#`,\n        TextSelModifyImpl.changeTextInsert,\n        'ABC',\n        defFont\n    );\n});\n\n/* returns the tuple  expectedTxt, expectedCaret, expectedEnd */\ntype FnChangesSelection = (...args: unknown[]) => [FormattedText, number, number];\n\n/**\n * run fromPlainText to get the selcaret and selend markers,\n * then run the callback with the provided args,\n * then compare expected and received results\n */\nfunction runT(\n    expected: string,\n    input: string,\n    fn: FnChangesSelection,\n    ...moreargs: unknown[]\n) {\n    expected = expected.replace(/\\|/g, '\\n');\n    input = input.replace(/\\|/g, '\\n');\n    let [t, selcaret, selend] = FormattedTextFromPlainText.fromPlainText(input);\n    let args = [t, selcaret, selend, ...moreargs];\n    assertTrue(args.length < 100, 'QB|too many args passed to testChangeText');\n    let [gotTxt, gotSelCaret, gotSelEnd] = fn(...args);\n    let [\n        expectedTxt,\n        expectedCaret,\n        expectedEnd\n    ] = FormattedTextFromPlainText.fromPlainText(expected);\n    assertEq(expectedTxt.toSerialized(), gotTxt.toSerialized(), '1p|wrong text');\n    assertEq(expectedCaret, gotSelCaret, '1o|incorrect caret position');\n    assertEq(expectedEnd, gotSelEnd, '1n|incorrect select-end position');\n}\n\n/**\n * make the test code easier to read by putting markers like ^\n * to indicate the selection\n */\nexport class FormattedTextFromPlainText {\n    /**\n     * From one string with ^ and # markers,\n     * to [FormattedText, selcaret, selend]\n     *\n     * To make the tests easier to read, we use the symbol\n     * ^ to mean the selcaret (start of selection)\n     * # to mean the selend (end of selection)\n     */\n    static fromPlainText(s: string): [FormattedText, number, number] {\n        /* step 1) get a string without the font changes */\n        let tToGetUnformatted = FormattedText.newFromSerialized(s);\n        let sUnformatted = tToGetUnformatted.toUnformatted();\n        assertTrue(\n            sUnformatted.includes('^') && sUnformatted.includes('#'),\n            `1m|string \"${sUnformatted}\" needs ^ and #`\n        );\n\n        /* step 2) get caret positions */\n        let selCaret;\n        let selEnd;\n        if (sUnformatted.indexOf('^') < sUnformatted.indexOf('#')) {\n            selCaret = sUnformatted.indexOf('^');\n            sUnformatted = sUnformatted.replace(/\\^/g, '');\n            selEnd = sUnformatted.indexOf('#');\n            sUnformatted = sUnformatted.replace(/#/g, '');\n        } else {\n            selEnd = sUnformatted.indexOf('#');\n            sUnformatted = sUnformatted.replace(/#/g, '');\n            selCaret = sUnformatted.indexOf('^');\n            sUnformatted = sUnformatted.replace(/\\^/g, '');\n        }\n\n        /* step 3) create formatted text */\n        let t = FormattedText.newFromSerialized(s.replace(/#/g, '').replace(/\\^/g, ''));\n        return [t, selCaret, selEnd];\n    }\n}\n\n/**\n * used in tests only, not visible from product code\n */\nlet defFont = 'geneva_18_' + textFontStylingToString(TextFontStyling.Default);\n"
  },
  {
    "path": "vipercard/vipercard/src/test/util512ui/testUI512TextSelectEvents.ts",
    "content": "\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModifyImpl } from './../../ui512/textedit/ui512TextSelModifyImpl';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { ElementObserverNoOp } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts } from './../testUtils/testUtils';\n/* auto */ import { FormattedTextFromPlainText } from './testUI512TextModify';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on TextSelModifyImpl\n *\n * To make the tests easier to read, we use the symbol\n * ^ to mean the selcaret (start of selection)\n * # to mean the selend (end of selection)\n * and\n * | to mean a newline character\n *\n *\n * For example, to say that the second word should be selected, we can write\n * \"abc ^def# ghi\"\n */\nlet t = new SimpleUtil512TestCollection('testCollectionUI512TextSelectEvents');\nexport let testCollectionUI512TextSelectEvents = t;\n\nt.test('ChangeSelSelectAll', () => {\n    /* no current selection */\n    testChangeSel('^abc#', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^abc#', 'a^#bc', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^abc#', 'abc^#', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^a#', 'a^#', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^\\n#', '\\n^#', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^\\n#', '^#\\n', TextSelModifyImpl.changeSelSelectAll);\n\n    /* with current selection */\n    testChangeSel('^abc#', '^abc#', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^abc#', '#abc^', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^abc#', 'a^b#c', TextSelModifyImpl.changeSelSelectAll);\n    testChangeSel('^ab\\nc#', 'a^#b\\nc', TextSelModifyImpl.changeSelSelectAll);\n});\nt.test('ConfirmThatFailureAsserts', () => {\n    testChangeSel('^abc#', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    /* getting the wrong text should assert */\n    assertAsserts('QL|', 'wrong text', () => {\n        testChangeSel('^abd#', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    });\n    /* missing caret should assert */\n    assertAsserts('QK|', 'assert:', () => {\n        testChangeSel('abd#', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    });\n    /* missing end should assert */\n    assertAsserts('QJ|', 'assert:', () => {\n        testChangeSel('^abd', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    });\n    /* getting the wrong caret should assert */\n    assertAsserts('QI|', 'incorrect caret', () => {\n        testChangeSel('a^bc#', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    });\n    /* getting the wrong end should assert */\n    assertAsserts('QH|', 'incorrect select-end', () => {\n        testChangeSel('^ab#c', '^#abc', TextSelModifyImpl.changeSelSelectAll);\n    });\n});\nt.test('ChangeSelGoDocHomeEnd', () => {\n    /* go to start, no extend */\n    testChangeSel('^#abc', '^#abc', TextSelModifyImpl.changeSelGoDocHomeEnd, true, false);\n    testChangeSel('^#abc', 'a^#bc', TextSelModifyImpl.changeSelGoDocHomeEnd, true, false);\n    testChangeSel('^#abc', 'a^b#c', TextSelModifyImpl.changeSelGoDocHomeEnd, true, false);\n    testChangeSel('^#abc', 'a#b^c', TextSelModifyImpl.changeSelGoDocHomeEnd, true, false);\n    testChangeSel('^#abc', 'abc^#', TextSelModifyImpl.changeSelGoDocHomeEnd, true, false);\n\n    /* go to start, extend */\n    testChangeSel('^#abc', '^#abc', TextSelModifyImpl.changeSelGoDocHomeEnd, true, true);\n    testChangeSel('^a#bc', 'a^#bc', TextSelModifyImpl.changeSelGoDocHomeEnd, true, true);\n    testChangeSel('^ab#c', 'a^b#c', TextSelModifyImpl.changeSelGoDocHomeEnd, true, true);\n    testChangeSel('^a#bc', 'a#b^c', TextSelModifyImpl.changeSelGoDocHomeEnd, true, true);\n    testChangeSel('^abc#', 'abc^#', TextSelModifyImpl.changeSelGoDocHomeEnd, true, true);\n\n    /* go to end, no extend */\n    testChangeSel(\n        'abc#^',\n        '^#abc',\n        TextSelModifyImpl.changeSelGoDocHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a^#bc',\n        TextSelModifyImpl.changeSelGoDocHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a^b#c',\n        TextSelModifyImpl.changeSelGoDocHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a#b^c',\n        TextSelModifyImpl.changeSelGoDocHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'abc^#',\n        TextSelModifyImpl.changeSelGoDocHomeEnd,\n        false,\n        false\n    );\n\n    /* go to end, extend */\n    testChangeSel('#abc^', '^#abc', TextSelModifyImpl.changeSelGoDocHomeEnd, false, true);\n    testChangeSel('a#bc^', 'a^#bc', TextSelModifyImpl.changeSelGoDocHomeEnd, false, true);\n    testChangeSel('ab#c^', 'a^b#c', TextSelModifyImpl.changeSelGoDocHomeEnd, false, true);\n    testChangeSel('a#bc^', 'a#b^c', TextSelModifyImpl.changeSelGoDocHomeEnd, false, true);\n    testChangeSel('abc#^', 'abc^#', TextSelModifyImpl.changeSelGoDocHomeEnd, false, true);\n});\nt.test('ChangeSelLeftRight', () => {\n    /* move left, no extend */\n    testChangeSel(\n        '^#abcd',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        false\n    );\n    testChangeSel(\n        '^#abcd',\n        'a^#bcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        false\n    );\n    testChangeSel(\n        'a^#bcd',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        false\n    );\n    testChangeSel(\n        'ab^#cd',\n        'abc^#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc^#d',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        false\n    );\n\n    /* move left, extend */\n    testChangeSel(\n        '^#abcd',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        '^a#bcd',\n        'a^#bcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        'a^b#cd',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        'ab^c#d',\n        'abc^#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        'abc^d#',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        '^abc#d',\n        '^abc#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        '^abc#d',\n        'a^bc#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        '#ab^cd',\n        '#abc^d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n    testChangeSel(\n        'a#b^cd',\n        'a#bc^d',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        true,\n        false\n    );\n\n    /* move right, no extend */\n    testChangeSel(\n        'a^#bcd',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        false\n    );\n    testChangeSel(\n        'ab^#cd',\n        'a^#bcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc^#d',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        false\n    );\n    testChangeSel(\n        'abcd^#',\n        'abc^#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        false\n    );\n    testChangeSel(\n        'abcd^#',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        false\n    );\n\n    /* move right, extend */\n    testChangeSel(\n        '#a^bcd',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'a#b^cd',\n        'a^#bcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'ab#c^d',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'abc#d^',\n        'abc^#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'abcd#^',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'a^bc#d',\n        '^abc#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'ab^c#d',\n        'a^bc#d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        '#abcd^',\n        '#abc^d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n    testChangeSel(\n        'a#bcd^',\n        'a#bc^d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        true,\n        false\n    );\n});\nt.test('ChangeSelGoLineHomeEnd', () => {\n    /* middle line, go to start, no extend */\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|^#abc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|a^#bc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|a^b#c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|a#b^c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|abc^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n\n    /* middle line, go to start, extend */\n    testChangeSel(\n        'qr|^#abc|st',\n        'qr|^#abc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        'qr|^a#bc|st',\n        'qr|a^#bc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        'qr|^ab#c|st',\n        'qr|a^b#c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        'qr|^a#bc|st',\n        'qr|a#b^c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        'qr|^abc#|st',\n        'qr|abc^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n\n    /* middle line, go to end, no extend */\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|^#abc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|a^#bc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|a^b#c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|a#b^c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|abc^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n\n    /* middle line, go to end, extend */\n    testChangeSel(\n        'qr|#abc^|st',\n        'qr|^#abc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|a#bc^|st',\n        'qr|a^#bc|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|ab#c^|st',\n        'qr|a^b#c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|a#bc^|st',\n        'qr|a#b^c|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|abc#^|st',\n        'qr|abc^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n\n    /* one line, go to start, no extend */\n    testChangeSel(\n        '^#abc',\n        '^#abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#abc',\n        'a^#bc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#abc',\n        'a^b#c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#abc',\n        'a#b^c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#abc',\n        'abc^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n\n    /* one line, go to start, extend */\n    testChangeSel('^#abc', '^#abc', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^a#bc', 'a^#bc', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^ab#c', 'a^b#c', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^a#bc', 'a#b^c', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^abc#', 'abc^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n\n    /* one line, go to end, no extend */\n    testChangeSel(\n        'abc#^',\n        '^#abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a^#bc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a^b#c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'a#b^c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n    testChangeSel(\n        'abc#^',\n        'abc^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n\n    /* one line, go to end, extend */\n    testChangeSel(\n        '#abc^',\n        '^#abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'a#bc^',\n        'a^#bc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'ab#c^',\n        'a^b#c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'a#bc^',\n        'a#b^c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'abc#^',\n        'abc^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n\n    /* empty line in middle */\n    testChangeSel(\n        'qr|#^|st',\n        'qr|^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        'qr|#^|st',\n        'qr|^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|#^|st',\n        'qr|^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|#^|st',\n        'qr|^#|st',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n\n    /* empty line at end */\n    testChangeSel('qr|#^', 'qr|^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel(\n        'qr|#^',\n        'qr|^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        'qr|#^',\n        'qr|^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        true\n    );\n    testChangeSel(\n        'qr|#^',\n        'qr|^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        false,\n        false\n    );\n\n    /* go to whitespace start, no extend */\n    testChangeSel(\n        '   ^#abc',\n        '   abc^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '   ^#abc   def',\n        '   abc   def^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '\\t^#abc\\tdef',\n        '\\tabc\\tdef^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '   ^#abc',\n        '   ab^#c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '   ^#abc',\n        '   a^#bc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   abc',\n        '   ^#abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   abc',\n        '  ^# abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   abc',\n        ' ^#  abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   abc',\n        '^#   abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   ',\n        '   ^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel(\n        '^#   ',\n        '  ^# ',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel('^# ', ' ^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, false);\n    testChangeSel(\n        '^#\\t\\t\\t',\n        '\\t\\t\\t^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        false\n    );\n    testChangeSel('^#\\t', '\\t^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, false);\n    let expected = '\\t\\t\\t^#abc\\t\\t\\tdef';\n    let input = '\\t\\t\\tabc\\t\\t\\tdef^#';\n    testChangeSel(expected, input, TextSelModifyImpl.changeSelGoLineHomeEnd, true, false);\n\n    /* go to whitespace start, extend */\n    testChangeSel(\n        '   ^abc#',\n        '   abc^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '   ^abc   def#',\n        '   abc   def^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '\\t^abc\\tdef#',\n        '\\tabc\\tdef^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '   ^ab#c',\n        '   ab^#c',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '   ^a#bc',\n        '   a^#bc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '^   #abc',\n        '   ^#abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '^  # abc',\n        '  ^# abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '^ #  abc',\n        ' ^#  abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel(\n        '^#   abc',\n        '^#   abc',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel('^   #', '   ^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^  # ', '  ^# ', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel('^ #', ' ^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    testChangeSel(\n        '^\\t\\t\\t#',\n        '\\t\\t\\t^#',\n        TextSelModifyImpl.changeSelGoLineHomeEnd,\n        true,\n        true\n    );\n    testChangeSel('^\\t#', '\\t^#', TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n    expected = '\\t\\t\\t^abc\\t\\t\\tdef#';\n    input = '\\t\\t\\tabc\\t\\t\\tdef^#';\n    testChangeSel(expected, input, TextSelModifyImpl.changeSelGoLineHomeEnd, true, true);\n});\nt.test('ChangeSelLeftRightUntilWord', () => {\n    /* move left by words */\n    testChangeSel(\n        '#^abcd',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '#^abcd',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '#^abcd',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '#^abcd ',\n        'abcd ^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '#^abcd  ',\n        'abcd  ^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '#^abcd\\t',\n        'abcd\\t^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#d',\n        'abcd d^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#de',\n        'abcd de^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#\\n',\n        'abcd \\n^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd \\n^#d',\n        'abcd \\nd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abc ^#123 abc',\n        'abc 123^# abc',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        '^#abc 123 abc',\n        'abc^# 123 abc',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abc.123.^#abc',\n        'abc.123.abc^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n    testChangeSel(\n        'abc.123^#.abc',\n        'abc.123.^#abc',\n        TextSelModifyImpl.changeSelLeftRight,\n        true,\n        false,\n        true\n    );\n\n    /* move right by words */\n    testChangeSel(\n        'abcd^#',\n        '^#abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd^#',\n        'ab^#cd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd^#',\n        'abcd^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd #^',\n        'abcd ^#',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        ' #^abcd',\n        '^# abcd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd  #^',\n        '^#abcd  ',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd\\t#^',\n        '^#abcd\\t',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#d',\n        '^#abcd d',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#de',\n        '^#abcd de',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#\\n',\n        '^#abcd \\n',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n    testChangeSel(\n        'abcd ^#\\nd',\n        '^#abcd \\nd',\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n\n    /* move right by words, longer input strings */\n    let expected = 'abc 123 ^#abc';\n    let input = 'abc ^#123 abc';\n    testChangeSel(\n        expected,\n        input,\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n\n    expected = 'abc 123 abc^#';\n    input = 'abc 123 ^#abc';\n    testChangeSel(\n        expected,\n        input,\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n\n    expected = 'abc^#.123.abc';\n    input = '^#abc.123.abc';\n    testChangeSel(\n        expected,\n        input,\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n\n    expected = 'abc.^#123.abc';\n    input = 'abc^#.123.abc';\n    testChangeSel(\n        expected,\n        input,\n        TextSelModifyImpl.changeSelLeftRight,\n        false,\n        false,\n        true\n    );\n});\nt.test('ChangeSelCurrentWord', () => {\n    testChangeSel('^#', '^#', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('^a#', '^#a', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('^abc#', '^#abc', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel(' ^abc#', ' ^#abc', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('^abc# ', '^#abc ', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel(\n        'test1 test2^ #test3',\n        'test1 test2^# test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel(\n        'test1 ^test2# test3',\n        'test1 test^#2 test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel(\n        'test1 ^test2# test3',\n        'test1 tes^#t2 test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel(\n        'test1 ^test2# test3',\n        'test1 te^#st2 test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel(\n        'test1 ^test2# test3',\n        'test1 ^#test2 test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel(\n        'test1^ #test2 test3',\n        'test1^# test2 test3',\n        TextSelModifyImpl.changeSelCurrentWord\n    );\n    testChangeSel('.^a#.', '.^#a.', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('.a^.#', '.a^#.', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('.^abc#.', '.ab^#c.', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 ^a# 2', '1 ^#a 2', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 ^abc# 2', '1 ab^#c 2', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 abc ^2#', '1 abc ^#2', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 abc^ #2', '1 abc^# 2', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 abc^  #2', '1 abc^#  2', TextSelModifyImpl.changeSelCurrentWord);\n    testChangeSel('1 abc^  #2', '1 abc ^# 2', TextSelModifyImpl.changeSelCurrentWord);\n});\nt.test('SelectLineInField,selectByLinesWhichLine.EmptyField', () => {\n    let el = new UI512ElTextField('test', new ElementObserverNoOp());\n    let gel = new UI512ElTextFieldAsGeneric(el);\n    el.setFmTxt(FormattedText.newFromUnformatted(''));\n    TextSelModify.selectLineInField(gel, 0);\n    assertEq(0, el.getN('selcaret'), 'C8|');\n    assertEq(0, el.getN('selend'), 'C7|');\n    assertEq(undefined, TextSelModify.selectByLinesWhichLine(gel), 'C6|');\n    TextSelModify.selectLineInField(gel, 2);\n    assertEq(0, el.getN('selcaret'), 'C5|');\n    assertEq(0, el.getN('selend'), 'C4|');\n    assertEq(undefined, TextSelModify.selectByLinesWhichLine(gel), 'C3|');\n});\nt.test('SelectLineInField,selectByLinesWhichLine.FieldWithNoEmptyLines', () => {\n    let el = new UI512ElTextField('test', new ElementObserverNoOp());\n    let gel = new UI512ElTextFieldAsGeneric(el);\n    el.setFmTxt(FormattedText.newFromUnformatted('abc\\ndef\\nghi'));\n    TextSelModify.selectLineInField(gel, 0);\n    assertEq(0, el.getN('selcaret'), 'C2|');\n    assertEq(4, el.getN('selend'), 'C1|');\n    assertEq(0, TextSelModify.selectByLinesWhichLine(gel), 'C0|');\n\n    TextSelModify.selectLineInField(gel, 1);\n    assertEq(4, el.getN('selcaret'), 'B~|');\n    assertEq(8, el.getN('selend'), 'B}|');\n    assertEq(1, TextSelModify.selectByLinesWhichLine(gel), 'B||');\n\n    TextSelModify.selectLineInField(gel, 2);\n    assertEq(8, el.getN('selcaret'), 'B{|');\n    assertEq(11, el.getN('selend'), 'B`|');\n    assertEq(2, TextSelModify.selectByLinesWhichLine(gel), 'B_|');\n\n    TextSelModify.selectLineInField(gel, 3);\n    assertEq(8, el.getN('selcaret'), 'B^|');\n    assertEq(11, el.getN('selend'), 'B]|');\n    assertEq(2, TextSelModify.selectByLinesWhichLine(gel), 'B[|');\n\n    TextSelModify.selectLineInField(gel, 4);\n    assertEq(8, el.getN('selcaret'), 'B@|');\n    assertEq(11, el.getN('selend'), 'B?|');\n    assertEq(2, TextSelModify.selectByLinesWhichLine(gel), 'B>|');\n});\nt.test('SelectLineInField,selectByLinesWhichLine.FieldWithSomeEmptyLines', () => {\n    let el = new UI512ElTextField('test', new ElementObserverNoOp());\n    let gel = new UI512ElTextFieldAsGeneric(el);\n    el.setFmTxt(FormattedText.newFromUnformatted('\\nabc\\n\\ndef\\n'));\n    TextSelModify.selectLineInField(gel, 0);\n    assertEq(0, el.getN('selcaret'), 'B=|');\n    assertEq(1, el.getN('selend'), 'B<|');\n    assertEq(0, TextSelModify.selectByLinesWhichLine(gel), 'B;|');\n    TextSelModify.selectLineInField(gel, 1);\n    assertEq(1, el.getN('selcaret'), 'B:|');\n    assertEq(5, el.getN('selend'), 'B/|');\n    assertEq(1, TextSelModify.selectByLinesWhichLine(gel), 'B.|');\n    TextSelModify.selectLineInField(gel, 2);\n    assertEq(5, el.getN('selcaret'), 'B-|');\n    assertEq(6, el.getN('selend'), 'B,|');\n    assertEq(2, TextSelModify.selectByLinesWhichLine(gel), 'B+|');\n    TextSelModify.selectLineInField(gel, 3);\n    assertEq(6, el.getN('selcaret'), 'B*|');\n    assertEq(10, el.getN('selend'), 'B)|');\n    assertEq(3, TextSelModify.selectByLinesWhichLine(gel), 'B(|');\n    TextSelModify.selectLineInField(gel, 4);\n    assertEq(10, el.getN('selcaret'), 'B&|');\n    assertEq(10, el.getN('selend'), 'B%|');\n    assertEq(undefined, TextSelModify.selectByLinesWhichLine(gel), 'B$|');\n    TextSelModify.selectLineInField(gel, 5);\n    assertEq(10, el.getN('selcaret'), 'B#|');\n    assertEq(10, el.getN('selend'), 'B!|');\n    assertEq(undefined, TextSelModify.selectByLinesWhichLine(gel), 'B |');\n});\n\n/**\n * run fromPlainText to get the selcaret and selend markers,\n * then run the callback with the provided args,\n * then compare expected and received results\n */\nfunction testChangeSel(\n    expected: string,\n    input: string,\n    fn: (...args: unknown[]) => [number, number],\n    ...moreargs: any[]\n) {\n    expected = expected.replace(/\\|/g, '\\n');\n    input = input.replace(/\\|/g, '\\n');\n    let [t, selcaret, selend] = FormattedTextFromPlainText.fromPlainText(input);\n    let args = [t, selcaret, selend, ...moreargs];\n    let [gotSelCaret, gotSelEnd] = fn(...args);\n    let [\n        expectedTxt,\n        expectedCaret,\n        expectedEnd\n    ] = FormattedTextFromPlainText.fromPlainText(expected);\n    assertEq(expectedTxt.toSerialized(), t.toSerialized(), '1s|wrong text');\n    assertEq(expectedCaret, gotSelCaret, '1r|incorrect caret position');\n    assertEq(expectedEnd, gotSelEnd, '1q|incorrect select-end position');\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestChunkResolution.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { VpcChunkPreposition, VpcGranularity } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../../vpc/vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { ChunkResolution } from './../../vpc/vpcutils/vpcChunkResolution';\n/* auto */ import { RWContainerVar } from './../../vpc/vel/velResolveContainer';\n/* auto */ import { OutsideWorldReadWrite } from './../../vpc/vel/velOutsideInterfaces';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on chunk resolution\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcChunkResolution');\nexport let testCollectionvpcChunkResolution = t;\n\nt.test('ChunkGetChar', () => {\n    testGetChunk('', 'abc', VpcGranularity.Chars, 0, undefined);\n    testGetChunk('a', 'abc', VpcGranularity.Chars, 1, undefined);\n    testGetChunk('b', 'abc', VpcGranularity.Chars, 2, undefined);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 4, undefined);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 5, undefined);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 0, 0);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 0, 2);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 0, 4);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 0, 5);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 1, 0);\n    testGetChunk('a', 'abc', VpcGranularity.Chars, 1, 1);\n    testGetChunk('ab', 'abc', VpcGranularity.Chars, 1, 2);\n    testGetChunk('abc', 'abc', VpcGranularity.Chars, 1, 3);\n    testGetChunk('abc', 'abc', VpcGranularity.Chars, 1, 4);\n    testGetChunk('abc', 'abc', VpcGranularity.Chars, 1, 5);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 2, 1);\n    testGetChunk('b', 'abc', VpcGranularity.Chars, 2, 2);\n    testGetChunk('bc', 'abc', VpcGranularity.Chars, 2, 3);\n    testGetChunk('bc', 'abc', VpcGranularity.Chars, 2, 4);\n    testGetChunk('bc', 'abc', VpcGranularity.Chars, 2, 5);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 3, 1);\n    testGetChunk('c', 'abc', VpcGranularity.Chars, 3, 3);\n    testGetChunk('c', 'abc', VpcGranularity.Chars, 3, 5);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 4, 4);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 4, 5);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 4, 6);\n    testGetChunk('', 'abc', VpcGranularity.Chars, 5, 5);\n});\nt.test('ChunkGetCharConfirmExpectedFailure', () => {\n    testGetChunk('ab', 'abc', VpcGranularity.Chars, 1, 2);\n    assertAsserts('QP|', 'assert:', () => {\n        testGetChunk('ac', 'abc', VpcGranularity.Chars, 1, 2);\n    });\n    assertAsserts('QO|', 'assert:', () => {\n        testGetChunk('abcd', 'abc', VpcGranularity.Chars, 1, 2);\n    });\n    testSetChunk('123', 'abc', VpcGranularity.Chars, 1, 3);\n    assertAsserts('QN|', 'assert:', () => {\n        testSetChunk('124', 'abc', VpcGranularity.Chars, 1, 3);\n    });\n    assertAsserts('QM|', 'assert:', () => {\n        testSetChunk('1234', 'abc', VpcGranularity.Chars, 1, 3);\n    });\n});\nt.test('ChunkGetItem1', () => {\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 0, undefined);\n    testGetChunk('a', 'a,b,c', VpcGranularity.Items, 1, undefined);\n    testGetChunk('b', 'a,b,c', VpcGranularity.Items, 2, undefined);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 4, undefined);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 5, undefined);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 0, 0);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 0, 2);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 0, 4);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 0, 5);\n    testGetChunk('a', 'a,b,c', VpcGranularity.Items, 1, 0);\n    testGetChunk('a', 'a,b,c', VpcGranularity.Items, 1, 1);\n    testGetChunk('a,b', 'a,b,c', VpcGranularity.Items, 1, 2);\n    testGetChunk('a,b,c', 'a,b,c', VpcGranularity.Items, 1, 3);\n    testGetChunk('a,b,c', 'a,b,c', VpcGranularity.Items, 1, 4);\n    testGetChunk('a,b,c', 'a,b,c', VpcGranularity.Items, 1, 5);\n    testGetChunk('b', 'a,b,c', VpcGranularity.Items, 2, 1);\n    testGetChunk('b', 'a,b,c', VpcGranularity.Items, 2, 2);\n    testGetChunk('b,c', 'a,b,c', VpcGranularity.Items, 2, 3);\n    testGetChunk('b,c', 'a,b,c', VpcGranularity.Items, 2, 4);\n    testGetChunk('b,c', 'a,b,c', VpcGranularity.Items, 2, 5);\n    testGetChunk('c', 'a,b,c', VpcGranularity.Items, 3, 1);\n    testGetChunk('c', 'a,b,c', VpcGranularity.Items, 3, 3);\n    testGetChunk('c', 'a,b,c', VpcGranularity.Items, 3, 5);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 4, 4);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 4, 5);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 4, 6);\n    testGetChunk('', 'a,b,c', VpcGranularity.Items, 5, 5);\n});\nt.test('ChunkGetItem2', () => {\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 0, undefined);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 1, undefined);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 2, undefined);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 4, undefined);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 5, undefined);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 0, 0);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 0, 2);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 0, 4);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 0, 5);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 1, 0);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 1, 1);\n    testGetChunk(',', ',,cd,', VpcGranularity.Items, 1, 2);\n    testGetChunk(',,cd', ',,cd,', VpcGranularity.Items, 1, 3);\n    testGetChunk(',,cd,', ',,cd,', VpcGranularity.Items, 1, 4);\n    testGetChunk(',,cd,', ',,cd,', VpcGranularity.Items, 1, 5);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 2, 1);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 2, 2);\n    testGetChunk(',cd', ',,cd,', VpcGranularity.Items, 2, 3);\n    testGetChunk(',cd,', ',,cd,', VpcGranularity.Items, 2, 4);\n    testGetChunk(',cd,', ',,cd,', VpcGranularity.Items, 2, 5);\n    testGetChunk('cd', ',,cd,', VpcGranularity.Items, 3, 1);\n    testGetChunk('cd', ',,cd,', VpcGranularity.Items, 3, 3);\n    testGetChunk('cd,', ',,cd,', VpcGranularity.Items, 3, 5);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 4, 4);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 4, 5);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 4, 6);\n    testGetChunk('', ',,cd,', VpcGranularity.Items, 5, 5);\n});\nt.test('ChunkGetWord1', () => {\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 0, undefined);\n    testGetChunk('abc', '  abc  .def gh.i   ', VpcGranularity.Words, 1, undefined);\n    testGetChunk('.def', '  abc  .def gh.i   ', VpcGranularity.Words, 2, undefined);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 4, undefined);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 5, undefined);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 0, 0);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 0, 2);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 0, 4);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 0, 5);\n    testGetChunk('abc', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 0);\n    testGetChunk('abc', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 1);\n    testGetChunk('abc  .def', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 2);\n    testGetChunk('abc  .def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 3);\n    testGetChunk('abc  .def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 4);\n    testGetChunk('abc  .def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 5);\n    testGetChunk('.def', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 1);\n    testGetChunk('.def', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 2);\n    testGetChunk('.def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 3);\n    testGetChunk('.def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 4);\n    testGetChunk('.def gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 5);\n    testGetChunk('gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 1);\n    testGetChunk('gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 3);\n    testGetChunk('gh.i', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 5);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 4, 4);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 4, 5);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 4, 6);\n    testGetChunk('', '  abc  .def gh.i   ', VpcGranularity.Words, 5, 5);\n});\nt.test('ChunkGetWord2', () => {\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 0, undefined);\n    testGetChunk('ABC', 'ABC   DEF  GHI', VpcGranularity.Words, 1, undefined);\n    testGetChunk('DEF', 'ABC   DEF  GHI', VpcGranularity.Words, 2, undefined);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 4, undefined);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 5, undefined);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 0);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 2);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 4);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 5);\n    testGetChunk('ABC', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 0);\n    testGetChunk('ABC', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 1);\n    testGetChunk('ABC   DEF', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 2);\n    testGetChunk('ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 3);\n    testGetChunk('ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 4);\n    testGetChunk('ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 5);\n    testGetChunk('DEF', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 1);\n    testGetChunk('DEF', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 2);\n    testGetChunk('DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 3);\n    testGetChunk('DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 4);\n    testGetChunk('DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 5);\n    testGetChunk('GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 1);\n    testGetChunk('GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 3);\n    testGetChunk('GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 5);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 4);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 5);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 6);\n    testGetChunk('', 'ABC   DEF  GHI', VpcGranularity.Words, 5, 5);\n});\nt.test('ChunkSetChar', () => {\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 0, undefined);\n    testSetChunk('123bc', 'abc', VpcGranularity.Chars, 1, undefined);\n    testSetChunk('a123c', 'abc', VpcGranularity.Chars, 2, undefined);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 4, undefined);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 5, undefined);\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 0, 0);\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 0, 2);\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 0, 4);\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 0, 5);\n    testSetChunk('123abc', 'abc', VpcGranularity.Chars, 1, 0);\n    testSetChunk('123bc', 'abc', VpcGranularity.Chars, 1, 1);\n    testSetChunk('123c', 'abc', VpcGranularity.Chars, 1, 2);\n    testSetChunk('123', 'abc', VpcGranularity.Chars, 1, 3);\n    testSetChunk('123', 'abc', VpcGranularity.Chars, 1, 4);\n    testSetChunk('123', 'abc', VpcGranularity.Chars, 1, 5);\n    testSetChunk('a123bc', 'abc', VpcGranularity.Chars, 2, 1);\n    testSetChunk('a123c', 'abc', VpcGranularity.Chars, 2, 2);\n    testSetChunk('a123', 'abc', VpcGranularity.Chars, 2, 3);\n    testSetChunk('a123', 'abc', VpcGranularity.Chars, 2, 4);\n    testSetChunk('a123', 'abc', VpcGranularity.Chars, 2, 5);\n    testSetChunk('ab123c', 'abc', VpcGranularity.Chars, 3, 1);\n    testSetChunk('ab123', 'abc', VpcGranularity.Chars, 3, 3);\n    testSetChunk('ab123', 'abc', VpcGranularity.Chars, 3, 5);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 4, 4);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 4, 5);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 4, 6);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 5, 5);\n});\nt.test('ChunkSetItem1', () => {\n    testSetChunk('123a,b,c', 'a,b,c', VpcGranularity.Items, 0, undefined);\n    testSetChunk('123,b,c', 'a,b,c', VpcGranularity.Items, 1, undefined);\n    testSetChunk('a,123,c', 'a,b,c', VpcGranularity.Items, 2, undefined);\n    testSetChunk('a,b,c,123', 'a,b,c', VpcGranularity.Items, 4, undefined);\n    testSetChunk('a,b,c,,123', 'a,b,c', VpcGranularity.Items, 5, undefined);\n    testSetChunk('123a,b,c', 'a,b,c', VpcGranularity.Items, 0, 0);\n    testSetChunk('123a,b,c', 'a,b,c', VpcGranularity.Items, 0, 2);\n    testSetChunk('123a,b,c', 'a,b,c', VpcGranularity.Items, 0, 4);\n    testSetChunk('123a,b,c', 'a,b,c', VpcGranularity.Items, 0, 5);\n    testSetChunk('123,b,c', 'a,b,c', VpcGranularity.Items, 1, 0);\n    testSetChunk('123,b,c', 'a,b,c', VpcGranularity.Items, 1, 1);\n    testSetChunk('123,c', 'a,b,c', VpcGranularity.Items, 1, 2);\n    testSetChunk('123', 'a,b,c', VpcGranularity.Items, 1, 3);\n    testSetChunk('123', 'a,b,c', VpcGranularity.Items, 1, 4);\n    testSetChunk('123', 'a,b,c', VpcGranularity.Items, 1, 5);\n    testSetChunk('a,123,c', 'a,b,c', VpcGranularity.Items, 2, 1);\n    testSetChunk('a,123,c', 'a,b,c', VpcGranularity.Items, 2, 2);\n    testSetChunk('a,123', 'a,b,c', VpcGranularity.Items, 2, 3);\n    testSetChunk('a,123', 'a,b,c', VpcGranularity.Items, 2, 4);\n    testSetChunk('a,123', 'a,b,c', VpcGranularity.Items, 2, 5);\n    testSetChunk('a,b,123', 'a,b,c', VpcGranularity.Items, 3, 1);\n    testSetChunk('a,b,123', 'a,b,c', VpcGranularity.Items, 3, 3);\n    testSetChunk('a,b,123', 'a,b,c', VpcGranularity.Items, 3, 5);\n    testSetChunk('a,b,c,123', 'a,b,c', VpcGranularity.Items, 4, 4);\n    testSetChunk('a,b,c,123', 'a,b,c', VpcGranularity.Items, 4, 5);\n    testSetChunk('a,b,c,123', 'a,b,c', VpcGranularity.Items, 4, 6);\n    testSetChunk('a,b,c,,123', 'a,b,c', VpcGranularity.Items, 5, 5);\n});\nt.test('ChunkSetItem2', () => {\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 0, undefined);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 1, undefined);\n    testSetChunk(',123,cd,', ',,cd,', VpcGranularity.Items, 2, undefined);\n    testSetChunk(',,cd,123', ',,cd,', VpcGranularity.Items, 4, undefined);\n    testSetChunk(',,cd,,123', ',,cd,', VpcGranularity.Items, 5, undefined);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 0, 0);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 0, 2);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 0, 4);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 0, 5);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 1, 0);\n    testSetChunk('123,,cd,', ',,cd,', VpcGranularity.Items, 1, 1);\n    testSetChunk('123,cd,', ',,cd,', VpcGranularity.Items, 1, 2);\n    testSetChunk('123,', ',,cd,', VpcGranularity.Items, 1, 3);\n    testSetChunk('123', ',,cd,', VpcGranularity.Items, 1, 4);\n    testSetChunk('123', ',,cd,', VpcGranularity.Items, 1, 5);\n    testSetChunk(',123,cd,', ',,cd,', VpcGranularity.Items, 2, 1);\n    testSetChunk(',123,cd,', ',,cd,', VpcGranularity.Items, 2, 2);\n    testSetChunk(',123,', ',,cd,', VpcGranularity.Items, 2, 3);\n    testSetChunk(',123', ',,cd,', VpcGranularity.Items, 2, 4);\n    testSetChunk(',123', ',,cd,', VpcGranularity.Items, 2, 5);\n    testSetChunk(',,123,', ',,cd,', VpcGranularity.Items, 3, 1);\n    testSetChunk(',,123,', ',,cd,', VpcGranularity.Items, 3, 3);\n    testSetChunk(',,123', ',,cd,', VpcGranularity.Items, 3, 5);\n    testSetChunk(',,cd,123', ',,cd,', VpcGranularity.Items, 4, 4);\n    testSetChunk(',,cd,123', ',,cd,', VpcGranularity.Items, 4, 5);\n    testSetChunk(',,cd,123', ',,cd,', VpcGranularity.Items, 4, 6);\n    testSetChunk(',,cd,,123', ',,cd,', VpcGranularity.Items, 5, 5);\n});\nt.test('ChunkSetWord1', () => {\n    testSetChunk(\n        '123  abc  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        0,\n        undefined\n    );\n    testSetChunk(\n        '  123  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        1,\n        undefined\n    );\n    testSetChunk(\n        '  abc  123 gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        2,\n        undefined\n    );\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        4,\n        undefined\n    );\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        5,\n        undefined\n    );\n    testSetChunk(\n        '123  abc  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        0,\n        0\n    );\n    testSetChunk(\n        '123  abc  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        0,\n        2\n    );\n    testSetChunk(\n        '123  abc  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        0,\n        4\n    );\n    testSetChunk(\n        '123  abc  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        0,\n        5\n    );\n    testSetChunk(\n        '  123  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        1,\n        0\n    );\n    testSetChunk(\n        '  123  .def gh.i   ',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        1,\n        1\n    );\n    testSetChunk('  123 gh.i   ', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 2);\n    testSetChunk('  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 3);\n    testSetChunk('  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 4);\n    testSetChunk('  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 1, 5);\n    testSetChunk('  abc  123 gh.i   ', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 1);\n    testSetChunk('  abc  123 gh.i   ', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 2);\n    testSetChunk('  abc  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 3);\n    testSetChunk('  abc  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 4);\n    testSetChunk('  abc  123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 2, 5);\n    testSetChunk('  abc  .def 123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 1);\n    testSetChunk('  abc  .def 123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 3);\n    testSetChunk('  abc  .def 123   ', '  abc  .def gh.i   ', VpcGranularity.Words, 3, 5);\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        4,\n        4\n    );\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        4,\n        5\n    );\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        4,\n        6\n    );\n    testSetChunk(\n        '  abc  .def gh.i   123',\n        '  abc  .def gh.i   ',\n        VpcGranularity.Words,\n        5,\n        5\n    );\n});\nt.test('ChunkSetWord2', () => {\n    testSetChunk(\n        '123ABC   DEF  GHI',\n        'ABC   DEF  GHI',\n        VpcGranularity.Words,\n        0,\n        undefined\n    );\n    testSetChunk('123   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, undefined);\n    testSetChunk('ABC   123  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, undefined);\n    testSetChunk(\n        'ABC   DEF  GHI123',\n        'ABC   DEF  GHI',\n        VpcGranularity.Words,\n        4,\n        undefined\n    );\n    testSetChunk(\n        'ABC   DEF  GHI123',\n        'ABC   DEF  GHI',\n        VpcGranularity.Words,\n        5,\n        undefined\n    );\n    testSetChunk('123ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 0);\n    testSetChunk('123ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 2);\n    testSetChunk('123ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 4);\n    testSetChunk('123ABC   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 0, 5);\n    testSetChunk('123   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 0);\n    testSetChunk('123   DEF  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 1);\n    testSetChunk('123  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 2);\n    testSetChunk('123', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 3);\n    testSetChunk('123', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 4);\n    testSetChunk('123', 'ABC   DEF  GHI', VpcGranularity.Words, 1, 5);\n    testSetChunk('ABC   123  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 1);\n    testSetChunk('ABC   123  GHI', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 2);\n    testSetChunk('ABC   123', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 3);\n    testSetChunk('ABC   123', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 4);\n    testSetChunk('ABC   123', 'ABC   DEF  GHI', VpcGranularity.Words, 2, 5);\n    testSetChunk('ABC   DEF  123', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 1);\n    testSetChunk('ABC   DEF  123', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 3);\n    testSetChunk('ABC   DEF  123', 'ABC   DEF  GHI', VpcGranularity.Words, 3, 5);\n    testSetChunk('ABC   DEF  GHI123', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 4);\n    testSetChunk('ABC   DEF  GHI123', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 5);\n    testSetChunk('ABC   DEF  GHI123', 'ABC   DEF  GHI', VpcGranularity.Words, 4, 6);\n    testSetChunk('ABC   DEF  GHI123', 'ABC   DEF  GHI', VpcGranularity.Words, 5, 5);\n});\nt.test('cornercases', () => {\n    testGetChunk('', '', VpcGranularity.Chars, 0, 0);\n    testGetChunk('', '', VpcGranularity.Chars, 0, 2);\n    testGetChunk('', '', VpcGranularity.Chars, 1, 1);\n    testGetChunk('', '', VpcGranularity.Chars, 1, 3);\n    testGetChunk('', '', VpcGranularity.Items, 0, 0);\n    testGetChunk('', '', VpcGranularity.Items, 0, 2);\n    testGetChunk('', '', VpcGranularity.Items, 1, 1);\n    testGetChunk('', '', VpcGranularity.Items, 1, 3);\n    testGetChunk('', '', VpcGranularity.Words, 0, 0);\n    testGetChunk('', '', VpcGranularity.Words, 0, 2);\n    testGetChunk('', '', VpcGranularity.Words, 1, 1);\n    testGetChunk('', '', VpcGranularity.Words, 1, 3);\n    testSetChunk('123', '', VpcGranularity.Chars, 0, 0);\n    testSetChunk('123', '', VpcGranularity.Chars, 0, 2);\n    testSetChunk('123', '', VpcGranularity.Chars, 1, 1);\n    testSetChunk('123', '', VpcGranularity.Chars, 1, 3);\n    testSetChunk('123', '', VpcGranularity.Chars, 5, 5);\n    testSetChunk('123', '', VpcGranularity.Chars, 5, 7);\n    testSetChunk('123', '', VpcGranularity.Items, 0, 0);\n    testSetChunk('123', '', VpcGranularity.Items, 0, 2);\n    testSetChunk('123', '', VpcGranularity.Items, 1, 1);\n    testSetChunk('123', '', VpcGranularity.Items, 1, 3);\n    testSetChunk(',,,,123', '', VpcGranularity.Items, 5, 5);\n    testSetChunk(',,,,123', '', VpcGranularity.Items, 5, 7);\n    testSetChunk('123', '', VpcGranularity.Words, 0, 0);\n    testSetChunk('123', '', VpcGranularity.Words, 0, 2);\n    testSetChunk('123', '', VpcGranularity.Words, 1, 1);\n    testSetChunk('123', '', VpcGranularity.Words, 1, 3);\n    testSetChunk('123', '', VpcGranularity.Words, 5, 5);\n    testSetChunk('123', '', VpcGranularity.Words, 5, 7);\n    testSetChunk('abc123', 'abc', VpcGranularity.Chars, 5, 7);\n    testSetChunk('a,b,c,,123', 'a,b,c', VpcGranularity.Items, 5, 7);\n    testSetChunk(',,cd,,123', ',,cd,', VpcGranularity.Items, 5, 7);\n});\n\n/**\n * assert that sExpected === get {VpcGranularity} {first} to {last} of s\n */\nfunction testGetChunk(\n    sExpected: string,\n    s: string,\n    type: VpcGranularity,\n    first: number,\n    last: number | undefined\n) {\n    const itemDel = ',';\n    let world = new MockOutsideWorld();\n    let reader = new RWContainerVar(world.getMock(), 'varName');\n    world.result = s;\n    let ch = new RequestedChunk(first);\n    ch.last = last;\n    ch.granularity = type;\n    let got = ChunkResolution.applyReadToString(reader, ch, itemDel);\n    assertEq(s, world.result, '2l|');\n    assertEq(sExpected, got, '2k|');\n}\n\n/**\n * assert that sExpected === set {VpcGranularity} {first} to {last} of s to \"123\"\n */\nfunction testSetChunk(\n    sExpected: string,\n    s: string,\n    type: VpcGranularity,\n    first: number,\n    last: number | undefined\n) {\n    const itemDel = ',';\n    let world = new MockOutsideWorld();\n    let writer = new RWContainerVar(world.getMock(), 'varName');\n    world.result = s;\n    const sReplace = '123';\n    let ch = new RequestedChunk(first);\n    ch.last = last;\n    ch.granularity = type;\n    ChunkResolution.applyPut(\n        writer,\n        ch,\n        itemDel,\n        sReplace,\n        VpcChunkPreposition.Into,\n        true /* compatibility mode */\n    );\n    assertEq(sExpected, world.result, '2j|');\n}\n\n/**\n * provide stub implementation of OutsideWorldReadWrite\n */\nexport class MockOutsideWorld {\n    result = '_';\n    SetVarContents(varName: string, v: VpcVal) {\n        assertEq('varName', varName, 'F6|');\n        this.result = v.readAsString();\n    }\n\n    ReadVarContents(varName: string): VpcVal {\n        assertEq('varName', varName, 'F5|');\n        return VpcValS(this.result);\n    }\n\n    getMock(): OutsideWorldReadWrite {\n        return (this as any) as OutsideWorldReadWrite; /* test code */\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestElements.ts",
    "content": "\n/* auto */ import { VpcValBool } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { MockOutsideWorld } from './vpcTestChunkResolution';\n/* auto */ import { VpcElStack, VpcElStackLineageEntry } from './../../vpc/vel/velStack';\n/* auto */ import { VpcGettableSerialization } from './../../vpc/vel/velSerialization';\n/* auto */ import { RWContainerVar } from './../../vpc/vel/velResolveContainer';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { ElementObserverNoOp } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { specialCharFontChange } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { SimpleUtil512TestCollection, assertThrows } from './../testUtils/testUtils';\n/* auto */ import { HigherNoReplication_TestOnly } from './../util512ui/testUI512Elements';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on FormattedText\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcElements');\nexport let testCollectionvpcElements = t;\nlet higher = new HigherNoReplication_TestOnly();\n\nt.test('ChangeToSingleLine.Should Preserve Text That Is Already One Line', () => {\n    let vel = new VpcElField('id1', 'parentid1');\n    vel.observer = new ElementObserverNoOp();\n    vel.setFmTxt(FormattedText.newFromUnformatted('abc'), higher);\n    vel.setProp('singleline', VpcValBool(false), higher);\n    assertEq('abc', vel.getFmTxt().toUnformatted(), 'F+|');\n    vel.setProp('singleline', VpcValBool(true), higher);\n    assertEq('abc', vel.getFmTxt().toUnformatted(), 'F*|');\n});\nt.test('ChangeToSingleLine.making it single line should kill the other line', () => {\n    let vel = new VpcElField('id1', 'parentid1');\n    vel.observer = new ElementObserverNoOp();\n    vel.setFmTxt(FormattedText.newFromUnformatted('abcd\\ndef'), higher);\n    vel.setProp('singleline', VpcValBool(false), higher);\n    assertEq('abcd\\ndef', vel.getFmTxt().toUnformatted(), 'F)|');\n    vel.setProp('singleline', VpcValBool(true), higher);\n    assertEq('abcd', vel.getFmTxt().toUnformatted(), 'F(|');\n});\nt.test('ChangeToSingleLine1', () => {\n    t.say(\n        longstr(`ChangeToSingleLine.making\n        it single line should kill all the other lines`)\n    );\n    let vel = new VpcElField('id1', 'parentid1');\n    vel.observer = new ElementObserverNoOp();\n    vel.setFmTxt(FormattedText.newFromUnformatted('a\\nb\\nc\\nd'), higher);\n    vel.setProp('singleline', VpcValBool(false), higher);\n    assertEq('a\\nb\\nc\\nd', vel.getFmTxt().toUnformatted(), 'F&|');\n    vel.setProp('singleline', VpcValBool(true), higher);\n    assertEq('a', vel.getFmTxt().toUnformatted(), 'F%|');\n});\nt.test('VpcElButton.should translate style names for script', () => {\n    let vel = new VpcElButton('id1', 'parentid1');\n    vel.observer = new ElementObserverNoOp();\n    vel.setOnVel('style', UI512BtnStyle.Rectangle, higher);\n    assertEq('rectangle', vel.getProp('style').readAsString(), 'F$|');\n    vel.setOnVel('style', UI512BtnStyle.Checkbox, higher);\n    assertEq('checkbox', vel.getProp('style').readAsString(), 'F#|');\n    vel.setOnVel('style', UI512BtnStyle.OSStandard, higher);\n    assertEq('standard', vel.getProp('style').readAsString(), 'F!|');\n    vel.setOnVel('style', UI512BtnStyle.OSDefault, higher);\n    assertEq('default', vel.getProp('style').readAsString(), 'F |');\n});\nt.test('WritableContainerVar.setAll', () => {\n    let world = new MockOutsideWorld();\n    let writer = new RWContainerVar(world.getMock(), 'varName');\n    writer.setAll('abc');\n    assertEq('abc', writer.getRawString(), 'Fz|');\n    assertEq('abc', world.result, 'Fy|');\n    writer.setAll('def');\n    assertEq('def', writer.getRawString(), 'Fx|');\n    assertEq('def', world.result, 'Fw|');\n});\nt.test('WritableContainerVar.splice', () => {\n    let world = new MockOutsideWorld();\n    let writer = new RWContainerVar(world.getMock(), 'varName');\n\n    /* 2 chars -> 0 chars */\n    writer.setAll('abcde');\n    writer.splice(1, 2, '');\n    assertEq('ade', writer.getRawString(), 'Fv|');\n\n    /* 2 chars -> 1 char */\n    writer.setAll('abcde');\n    writer.splice(1, 2, 'x');\n    assertEq('axde', writer.getRawString(), 'Fu|');\n\n    /* 2 chars -> 2 chars */\n    writer.setAll('abcde');\n    writer.splice(1, 2, 'xy');\n    assertEq('axyde', writer.getRawString(), 'Ft|');\n\n    /* 2 chars -> 3 chars */\n    writer.setAll('abcde');\n    writer.splice(1, 2, 'xyz');\n    assertEq('axyzde', writer.getRawString(), 'Fs|');\n\n    /* add 3 chars */\n    writer.setAll('abcde');\n    writer.splice(1, 0, 'xyz');\n    assertEq('axyzbcde', writer.getRawString(), 'Fr|');\n});\nt.test('VpcElStackLineageEntry.Construct', () => {\n    assertThrows(\n        'L(|',\n        'empty',\n        () => new VpcElStackLineageEntry(undefined as any, 'stackGuid', 'stackName')\n    );\n    assertThrows(\n        'L&|',\n        'empty',\n        () => new VpcElStackLineageEntry('', 'stackGuid', 'stackName')\n    );\n    assertThrows(\n        'L%|',\n        'empty',\n        () => new VpcElStackLineageEntry('owner', undefined as any, 'stackName')\n    );\n    assertThrows(\n        'L$|',\n        'empty',\n        () => new VpcElStackLineageEntry('owner', '', 'stackName')\n    );\n    assertThrows(\n        'L#|',\n        'empty',\n        () => new VpcElStackLineageEntry('owner', 'stackGuid', undefined as any)\n    );\n    assertThrows(\n        'L!|',\n        'empty',\n        () => new VpcElStackLineageEntry('owner', 'stackGuid', '')\n    );\n    assertThrows(\n        'L |',\n        'contain',\n        () => new VpcElStackLineageEntry('owner|', 'stackGuid', 'stackName')\n    );\n    assertThrows(\n        'Lz|',\n        'contain',\n        () => new VpcElStackLineageEntry('owner', 'stackGuid|', 'stackName')\n    );\n    assertThrows(\n        'Ly|',\n        'contain',\n        () => new VpcElStackLineageEntry('owner', 'stackGuid', 'stackName|')\n    );\n});\nt.test('VpcElStackLineageEntry.Serialize', () => {\n    let entry = new VpcElStackLineageEntry('owner', 'guid', 'name');\n    let got = entry.serialize();\n    assertEq('owner|guid|name', got, 'Fq|');\n});\nt.test('VpcElStackLineageEntry.Deserialize', () => {\n    let restored = VpcElStackLineageEntry.fromSerialized('owner|guid|name');\n    assertEq('owner', restored.stackOwner, 'Fp|');\n    assertEq('guid', restored.stackGuid, 'Fo|');\n    assertEq('name', restored.stackName, 'Fn|');\n    assertThrows('Lx|', 'invalid', () => VpcElStackLineageEntry.fromSerialized(''));\n    assertThrows('Lw|', 'invalid', () =>\n        VpcElStackLineageEntry.fromSerialized('owner|guid')\n    );\n    assertThrows('Lv|', 'invalid', () =>\n        VpcElStackLineageEntry.fromSerialized('1|2|3|4')\n    );\n});\nt.test('VpcElStackLineage', () => {\n    let vel = new VpcElStack('12', '34');\n    vel.observer = new ElementObserverNoOp();\n    assertThrows('Lu|', 'be empty', () => vel.getLatestStackLineage());\n    assertEq('', vel.getS('stacklineage'), 'Fm|');\n\n    let entry = new VpcElStackLineageEntry('own1', 'gid1', 'nm1');\n    vel.appendToStackLineage(entry, higher);\n    assertEq('own1|gid1|nm1', vel.getLatestStackLineage().serialize(), 'Fl|');\n    assertEq('own1|gid1|nm1', vel.getS('stacklineage'), 'Fk|');\n\n    entry = new VpcElStackLineageEntry('own2', 'gid2', 'nm2');\n    vel.appendToStackLineage(entry, higher);\n    assertEq('own2|gid2|nm2', vel.getLatestStackLineage().serialize(), 'K,|');\n    assertEq('own1|gid1|nm1||own2|gid2|nm2', vel.getS('stacklineage'), 'Fj|');\n\n    entry = new VpcElStackLineageEntry('own3', 'gid3', 'nm3');\n    vel.appendToStackLineage(entry, higher);\n    assertEq('own3|gid3|nm3', vel.getLatestStackLineage().serialize(), 'K+|');\n    assertEq(\n        'own1|gid1|nm1||own2|gid2|nm2||own3|gid3|nm3',\n        vel.getS('stacklineage'),\n        'K*|'\n    );\n});\nt.test('SerializeGettable1', () => {\n    t.say(longstr(`SerializeGettable1`));\n    for (let b of [true, false]) {\n        let vel = new VpcElField('id1', 'parentid1');\n        vel.observer = new ElementObserverNoOp();\n\n        vel.setFmTxt(FormattedText.newFromUnformatted('abc'), higher);\n        vel.setOnVel('dontwrap', b, higher);\n        vel.setOnVel('enabled', !b, higher);\n        vel.setOnVel('locktext', b, higher);\n        vel.setOnVel('singleline', !b, higher);\n        vel.setOnVel('visible', b, higher);\n        vel.setOnVel('selcaret', b ? 100 : 200, higher);\n        vel.setOnVel('selend', !b ? 100 : 200, higher);\n        vel.setOnVel('scroll', b ? 100 : 200, higher);\n        vel.setOnVel('style', !b ? 100 : 200, higher);\n        vel.setOnVel('script', 'def', higher);\n        vel.setOnVel('textalign', 'ghi', higher);\n        vel.setOnVel('name', 'jkl', higher);\n\n        let serialized = VpcGettableSerialization.serializeGettable(vel);\n        let restored = new VpcElField('id1', 'parentid1');\n        restored.observer = new ElementObserverNoOp();\n        let s = JSON.stringify(serialized);\n        let restoredJson = JSON.parse(s);\n        VpcGettableSerialization.deserializeSettable(restored, restoredJson, higher);\n\n        assertEq('abc', restored.getFmTxt().toUnformatted(), 'Fi|');\n        assertEq(b, restored.getB('dontwrap'), 'Fh|');\n        assertEq(!b, restored.getB('enabled'), 'Fg|');\n        assertEq(b, restored.getB('locktext'), 'Ff|');\n        assertEq(!b, restored.getB('singleline'), 'Fe|');\n        assertEq(b, restored.getB('visible'), 'Fd|');\n        assertEq(b ? 100 : 200, restored.getN('selcaret'), 'Fc|');\n        assertEq(!b ? 100 : 200, restored.getN('selend'), 'Fb|');\n        assertEq(b ? 100 : 200, restored.getN('scroll'), 'Fa|');\n        assertEq(!b ? 100 : 200, restored.getN('style'), 'FZ|');\n        assertEq('def', restored.getS('script'), 'FY|');\n        assertEq('ghi', restored.getS('textalign'), 'FX|');\n        assertEq('jkl', restored.getS('name'), 'FW|');\n    }\n});\nt.test('serializePlain with nonascii characters', () => {\n    let txt = FormattedText.newFromUnformatted('abc');\n    txt.setFontEverywhere('f1');\n    let sAllAscii = 'abc';\n    let sWithTab = 'abc\\t';\n    let sWithGreater = 'abc\\u3667';\n    let sWithSmaller = 'abc\\x00';\n    let sWithNewline = 'abc\\n';\n    let sWithSerialized = txt.toSerialized();\n    assertTrue(sWithSerialized.includes(specialCharFontChange), 'FV|');\n    let sAllAsciiSer = VpcGettableSerialization.serializePlain(sAllAscii);\n    let sWithTabSer = VpcGettableSerialization.serializePlain(sWithTab);\n    let sWithGreaterSer = VpcGettableSerialization.serializePlain(sWithGreater);\n    let sWithSmallerSer = VpcGettableSerialization.serializePlain(sWithSmaller);\n    let sWithNewlineSer = VpcGettableSerialization.serializePlain(sWithNewline);\n    let sWithSerializedSer = VpcGettableSerialization.serializePlain(sWithSerialized);\n    assertTrue(!sAllAsciiSer.toString().includes('b64'), 'FU|');\n    assertTrue(!sWithTabSer.toString().includes('b64'), 'FT|');\n    assertTrue(sWithGreaterSer.toString().includes('b64'), 'FS|');\n    assertTrue(sWithSmallerSer.toString().includes('b64'), 'FR|');\n    assertTrue(!sWithNewlineSer.toString().includes('b64'), 'FQ|');\n    assertTrue(!sWithSerializedSer.toString().includes('b64'), 'FP|');\n    assertEq(sAllAscii, VpcGettableSerialization.deserializePlain(sAllAsciiSer), 'FO|');\n    assertEq(sWithTab, VpcGettableSerialization.deserializePlain(sWithTabSer), 'FN|');\n    assertEq(\n        sWithGreater,\n        VpcGettableSerialization.deserializePlain(sWithGreaterSer),\n        'FM|'\n    );\n    assertEq(\n        sWithSmaller,\n        VpcGettableSerialization.deserializePlain(sWithSmallerSer),\n        'FL|'\n    );\n    assertEq(\n        sWithNewline,\n        VpcGettableSerialization.deserializePlain(sWithNewlineSer),\n        'FK|'\n    );\n    assertEq(\n        sWithSerialized,\n        VpcGettableSerialization.deserializePlain(sWithSerializedSer),\n        'FJ|'\n    );\n});\nt.test('SerializeGettable with nonascii characters', () => {\n    let vel = new VpcElField('id1', 'parentid1');\n    vel.observer = new ElementObserverNoOp();\n    let sBinX01 = 'def\\x01binary';\n    let sBinXbb = 'ghi\\xbbnonascii';\n    let sBinMany =\n        'u\\u2667c\\u3667c\\u4667c\\u5667c\\ud667c\\ue667c\\uf667c\\u0301d\\u00e9e\\u0065';\n    vel.setOnVel('script', sBinX01, higher);\n    vel.setOnVel('textalign', sBinXbb, higher);\n    vel.setOnVel('name', sBinMany, higher);\n    assertTrue(vel.getS('script').includes('\\x01'), 'FI|');\n    assertTrue(vel.getS('textalign').includes('\\xbb'), 'FH|');\n    let serialized = VpcGettableSerialization.serializeGettable(vel);\n    assertTrue(serialized['script'].toString().includes('b64'), 'FG|');\n    assertTrue(serialized['textalign'].toString().includes('b64'), 'FF|');\n    assertTrue(!serialized['script'].toString().includes('\\x01'), 'FE|');\n    assertTrue(!serialized['textalign'].toString().includes('\\xbb'), 'FD|');\n    let s = JSON.stringify(serialized);\n    assertTrue(!s.includes('\\x01'), 'FC|');\n    assertTrue(!s.includes('\\xbb'), 'FB|');\n\n    let restoredJson = JSON.parse(s);\n    let restored = new VpcElField('id1', 'parentid1');\n    restored.observer = new ElementObserverNoOp();\n    VpcGettableSerialization.deserializeSettable(restored, restoredJson, higher);\n    assertEq(sBinX01, restored.getS('script'), 'FA|');\n    assertEq(sBinXbb, restored.getS('textalign'), 'F9|');\n    assertEq(sBinMany, restored.getS('name'), 'F8|');\n});\nt.test('vars starting with _', () => {\n    t.say(\n        longstr(`VpcElements.Properties for\n        serialization should include all member vars starting with _`)\n    );\n    return;\n    /* perhaps add a test, we want assert to fire if an important property on a button is missing */\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptEval.ts",
    "content": "\n/* auto */ import { BatchType, ScriptTestBatch, TestMultiplier, TestMultiplierInvert, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { O, cAltProductName, cProductName, vpcVersion } from './../../ui512/utils/util512Base';\n/* auto */ import { assertEq, assertWarnEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { TextFontSpec, TextFontStyling, specialCharFontChange } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n/* auto */ import { HigherNoReplication_TestOnly } from './../util512ui/testUI512Elements';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test running ViperCard scripts that evaluate expressions.\n *\n * the syntax for a \"test batch\" is a tuple\n * [{script expression}, {expected result}]\n * for example, the following test passes:\n * ['1 + 1', '2']\n *\n * if you are testing a more complex expression or\n * command, you can write multiple lines, and use \\\\\n * at the end of the string to indicate what should be compared,\n * for example,\n *  ['put 1 + 1 into x\\\\x', '2']\n *\n *  or even\n *  ['put 1 into a \\n put a + 1 into x\\\\x', '2']\n * the \\\\x means to evaluate x and compare it with 2.\n *\n *\n * use testBatchEvalInvertAndCommute to comfirm all four permutations,\n * since if a == b, we also confirm that\n * b == a, a != b, and b != a\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionvpcScriptEval');\nexport let testCollectionvpcScriptEval = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBase>();\nlet higher = new HigherNoReplication_TestOnly();\n\nt.atest('--init--vpcTestScriptExprLvl', async () => {\n    h = new TestVpcScriptRunBase(t);\n    return h.initEnvironment();\n});\n\nt.test('getProp', () => {\n    let b = new ScriptTestBatch();\n\n    /* object resolution */\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    /* invalid */\n    b.t(`the short id of xyz`, `ERR:no variable`);\n    b.t(`the short id of the xyz`, `ERR:no such function`);\n\n    /* target, me, productOpts have different behavior\n        confirmed these in emulator */\n    b.t(`the short id of the target`, `${h.ids.go}`);\n    b.t(`the short id of target`, `${h.ids.go}`);\n    b.t(`put 1 into target\\\\0`, `ERR:only read/write`);\n    b.t(`the short id of target()`, `ERR:parse err`);\n    b.t(`the short id of (target())`, `ERR:no such function`);\n    /* tries to pull its contents */\n    b.t(`the short id of (target)`, `ERR:only read/write text`);\n    b.t(`the short id of the me`, `ERR:parse err`);\n    b.t(`the short id of me()`, `ERR:parse err`);\n    b.t(`the short id of (me)`, `ERR:parse err`);\n    b.t(`the short id of me`, `${h.ids.go}`);\n    b.t(`the short id of ${cProductName}`, `WILD`);\n    b.t(`the short id of ${cAltProductName}`, `WILD`);\n\n    /* stack */\n    b.t(`the short id of this stack`, `921`);\n    b.t(`the short id of previous stack`, `ERR:could not find`);\n    b.t(`the short id of next stack`, `ERR:could not find`);\n    b.t(`the short id of stack 1`, `921`);\n    b.t(`the short id of stack 6`, 'ERR:could not find');\n    b.t(`the short id of stack \"teststack\"`, `921`);\n    b.t(`the short id of stack \"other\"`, `ERR:could not find`);\n    b.t(`the short id of stack id 921`, `921`);\n    b.t(`the short id of stack id 600`, `ERR:could not find`);\n    b.t(`the short id of stack id ${h.ids.bgA}`, `ERR:could not find`);\n\n    /* bg absolute */\n    b.t(`the short id of bg id ${h.ids.bgA}`, `${h.ids.bgA}`);\n    b.t(`the short id of bg id ${h.ids.bgC}`, `${h.ids.bgC}`);\n    b.t(`the short id of bg id (${h.ids.bgC})`, `${h.ids.bgC}`);\n    b.t(`the short id of bg id 99`, `ERR:could not find`);\n    b.t(`the short id of bg \"a\"`, `${h.ids.bgA}`);\n    b.t(`the short id of bg \"c\"`, `${h.ids.bgC}`);\n    b.t(`the short id of bg (\"c\")`, `${h.ids.bgC}`);\n    b.t(`the short id of bg \"\"`, `ERR:could not find`);\n    b.t(`the short id of bg \"notfound\"`, `ERR:could not find`);\n    b.t(`the short id of bg 1`, `${h.ids.bgA}`);\n    b.t(`the short id of bg 3`, `${h.ids.bgC}`);\n    b.t(`the short id of bg (3)`, `${h.ids.bgC}`);\n    b.t(`the short id of bg -1`, `ERR:could not find`);\n    b.t(`the short id of bg 5`, `ERR:could not find`);\n\n    /* bg relative */\n    b.t(`the short id of this bg`, `${h.ids.bgB}`);\n    b.t(`the short id of next bg`, `${h.ids.bgC}`);\n    b.t(`the short id of first bg`, `${h.ids.bgA}`);\n    b.t(`the short id of last bg`, `${h.ids.bgC}`);\n    b.t(`the short id of the first bg`, `${h.ids.bgA}`);\n    b.t(`the short id of the second bg`, `${h.ids.bgB}`);\n    b.t(`the short id of the next bg`, `${h.ids.bgC}`);\n    b.t(`the short id of xyz bg`, `ERR:parse error`);\n    b.t(`the short id of the xyz bg`, `ERR:parse error`);\n\n    /* bg with parent */\n    b.t(`the short id of bg id ${h.ids.bgA} of this stack`, `${h.ids.bgA}`);\n    b.t(`the short id of bg 1 of this stack`, `${h.ids.bgA}`);\n    b.t(`the short id of bg \"a\" of this stack`, `${h.ids.bgA}`);\n    b.t(`the short id of this bg of this stack`, `${h.ids.bgB}`);\n\n    /* card absolute */\n    b.t(`the short id of card id ${h.ids.cdA}`, `${h.ids.cdA}`);\n    b.t(`the short id of card id ${h.ids.cdCD}`, `${h.ids.cdCD}`);\n    b.t(`the short id of card id (${h.ids.cdCD})`, `${h.ids.cdCD}`);\n    b.t(`the short id of card id 99`, `ERR:could not find`);\n    b.t(`the short id of card \"a\"`, `${h.ids.cdA}`);\n    b.t(`the short id of card \"d\"`, `${h.ids.cdBD}`);\n    b.t(`the short id of card (\"d\")`, `${h.ids.cdBD}`);\n    b.t(`the short id of card \"\"`, `ERR:could not find`);\n    b.t(`the short id of card \"notfound\"`, `ERR:could not find`);\n    b.t(`the short id of card 1`, `${h.ids.cdA}`);\n    b.t(`the short id of card 3`, `${h.ids.cdBC}`);\n    b.t(`the short id of card (3)`, `${h.ids.cdBC}`);\n    b.t(`the short id of card -1`, `ERR:could not find`);\n    b.t(`the short id of card 99`, `ERR:could not find`);\n\n    /* card relative */\n    b.t(`the short id of this card`, `${h.ids.cdBC}`);\n    b.t(`the short id of next card`, `${h.ids.cdBD}`);\n    b.t(`the short id of first card`, `${h.ids.cdA}`);\n    b.t(`the short id of last card`, `${h.ids.cdCD}`);\n    b.t(`the short id of the first card`, `${h.ids.cdA}`);\n    b.t(`the short id of the second card`, `${h.ids.cdBB}`);\n    b.t(`the short id of the next card`, `${h.ids.cdBD}`);\n    b.t(`the short id of xyz card`, `ERR:parse err`);\n    b.t(`the short id of the xyz card`, `ERR:parse err`);\n\n    /* card with parent */\n    b.t(`the short id of card \"d\" of this bg`, `${h.ids.cdBD}`);\n    b.t(`the short id of card \"d\" of bg \"c\"`, `${h.ids.cdCD}`);\n    b.t(`the short id of card \"d\" of bg 3`, `${h.ids.cdCD}`);\n    b.t(`the short id of card 1 of this bg`, `${h.ids.cdBB}`);\n    b.t(`the short id of card 1 of bg 2`, `${h.ids.cdBB}`);\n    b.t(`the short id of card 1 of bg 3`, `${h.ids.cdCD}`);\n    b.t(`the short id of card 2 of bg 2`, `${h.ids.cdBC}`);\n    b.t(`the short id of card 2 of bg 1`, `ERR:could not find`);\n    b.t(`the short id of card \"d\" of this bg of this stack`, `${h.ids.cdBD}`);\n\n    /* field */\n    b.t(`the short id of cd fld id ${h.ids.fBC1}`, `${h.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h.ids.fCD1}`, `${h.ids.fCD1}`);\n    b.t(`the short id of cd fld id (${h.ids.fCD1})`, `${h.ids.fCD1}`);\n    b.t(`the short id of cd fld id 99`, `ERR:could not find`);\n    b.t(`the short id of cd fld \"p1\"`, `${h.ids.fBC1}`);\n    b.t(`the short id of cd fld \"p2\"`, `${h.ids.fBC2}`);\n    b.t(`the short id of cd fld (\"p2\")`, `${h.ids.fBC2}`);\n    b.t(`the short id of cd fld \"notfound\"`, `ERR:could not find`);\n    b.t(`the short id of cd fld 1`, `${h.ids.fBC1}`);\n\n    /* field with parent */\n    b.t(`the short id of cd fld id ${h.ids.fBC1} of this cd`, `${h.ids.fBC1}`);\n    /* can't find even though it exists, wrong card parent */\n    b.t(`the short id of cd fld id ${h.ids.fCD1} of this cd`, `ERR:could not find`);\n    b.t(`the short id of cd fld \"p1\" of cd 1`, `ERR:could not find`);\n    b.t(`the short id of cd fld \"p1\" of this cd`, `${h.ids.fBC1}`);\n    b.t(`the short id of cd fld \"p1\" of fifth cd`, `${h.ids.fCD1}`);\n    b.t(`the short id of cd fld \"p1\" of cd 4`, `${h.ids.fBD1}`);\n    b.t(`the short id of cd fld \"p1\" of cd \"d\"`, `${h.ids.fBD1}`);\n    b.t(`the short id of cd fld \"p1\" of cd \"d\" of bg 3`, `${h.ids.fCD1}`);\n    b.t(`the short id of cd fld \"p1\" of cd \"d\" of bg 3 of this stack`, `${h.ids.fCD1}`);\n\n    /* button */\n    b.t(`the short id of cd btn id ${h.ids.bBC1}`, `${h.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h.ids.bCD1}`, `${h.ids.bCD1}`);\n    b.t(`the short id of cd btn id (${h.ids.bCD1})`, `${h.ids.bCD1}`);\n    b.t(`the short id of cd btn id 99`, `ERR:could not find`);\n    b.t(`the short id of cd btn \"p1\"`, `${h.ids.bBC1}`);\n    b.t(`the short id of cd btn \"p2\"`, `${h.ids.bBC2}`);\n    b.t(`the short id of cd btn (\"p2\")`, `${h.ids.bBC2}`);\n    b.t(`the short id of cd btn \"notfound\"`, `ERR:could not find`);\n    b.t(`the short id of cd btn 1`, `${h.ids.bBC1}`);\n\n    /* button with parent */\n    b.t(`the short id of cd btn id ${h.ids.bBC1} of this cd`, `${h.ids.bBC1}`);\n    /* can't find even though it exists, wrong card parent */\n    b.t(`the short id of cd btn id ${h.ids.bCD1} of this cd`, `ERR:could not find`);\n    b.t(`the short id of cd btn \"p1\" of cd 1`, `ERR:could not find`);\n    b.t(`the short id of cd btn \"p1\" of this cd`, `${h.ids.bBC1}`);\n    b.t(`the short id of cd btn \"p1\" of fifth cd`, `${h.ids.bCD1}`);\n    b.t(`the short id of cd btn \"p1\" of cd 4`, `${h.ids.bBD1}`);\n    b.t(`the short id of cd btn \"p1\" of cd \"d\"`, `${h.ids.bBD1}`);\n    b.t(`the short id of cd btn \"p1\" of cd \"d\" of bg 3`, `${h.ids.bCD1}`);\n    b.t(`the short id of cd btn \"p1\" of cd \"d\" of bg 3 of this stack`, `${h.ids.bCD1}`);\n    b.batchEvaluate(h);\n});\nt.test('vpcProperties', () => {\n    let b = new ScriptTestBatch();\n\n    /* basic type checking */\n    b.t('set the scroll of cd fld \"p1\" to \"\"\\\\0', 'ERR:expected an integer');\n    b.t('set the scroll of cd fld \"p1\" to \"10a\"\\\\0', 'ERR:expected an integer');\n    b.t('set the scroll of cd fld \"p1\" to \"a10\"\\\\0', 'ERR:expected an integer');\n    b.t('set the scroll of cd fld \"p1\" to \"10.1\"\\\\0', 'ERR:expected an integer');\n    b.t('set the dontwrap of cd fld \"p1\" to \"\"\\\\0', 'ERR:expected true or false');\n    b.t('set the dontwrap of cd fld \"p1\" to \"true a\"\\\\0', 'ERR:expected true or false');\n    b.t('set the dontwrap of cd fld \"p1\" to \"truea\"\\\\0', 'ERR:expected true or false');\n    b.t('set the dontwrap of cd fld \"p1\" to \"tru\"\\\\0', 'ERR:expected true or false');\n\n    /* get nonexistent props */\n    b.t('the notexist of cd fld \"p1\"', 'ERR:no such');\n    b.t('the scrolla of cd fld \"p1\"', 'ERR:no such');\n    b.t('the scrol of cd fld \"p1\"', 'ERR:no such');\n    b.t('the style of cd 1', 'ERR:unknown property');\n    b.t('the selcaret of cd btn \"p1\"', 'ERR:');\n    b.t('the autohilite of cd fld \"p1\"', 'ERR:unknown property');\n    b.t('the autohilite of cd btn \"p1\"', 'true');\n    b.t('the abbr autohilite of cd btn \"p1\"', 'ERR:does not take an adjective');\n    b.t('the short autohilite of cd btn \"p1\"', 'ERR:does not take an adjective');\n    b.t('the long autohilite of cd btn \"p1\"', 'ERR:does not take an adjective');\n    b.t('the abbr textsize of cd fld \"p1\"', 'ERR:does not take an adjective');\n    b.t('the short textsize of cd fld \"p1\"', 'ERR:does not take an adjective');\n    b.t('the long textsize of cd fld \"p1\"', 'ERR:does not take an adjective');\n    b.t('the abbr cursor', 'ERR:does not take an adjective');\n    b.t('the short cursor', 'ERR:does not take an adjective');\n    b.t('the long cursor', 'ERR:does not take an adjective');\n\n    /* set nonexistent props */\n    b.t('set the notexist of cd fld \"p1\" to \"abc\"\\\\0', 'ERR:unknown property');\n    b.t('set the scrolla of cd fld \"p1\" to 10\\\\0', 'ERR:unknown property');\n    b.t('set the scrol of cd fld \"p1\" to 10\\\\0', 'ERR:unknown property');\n    b.t('set the style of cd 1 to \"opaque\"\\\\0', 'ERR:unknown property');\n    b.t('set the selcaret of cd btn \"p1\" to 100\\\\0', 'ERR:');\n    b.t('set the autohilite of cd fld \"p1\" to true\\\\0', 'ERR:unknown property');\n\n    /* nonsettable props */\n    b.t('set the id of cd fld \"p1\" to 100\\\\0', 'ERR:unknown property');\n    b.t('set the hilite of cd fld \"p1\" to true\\\\0', 'ERR:unknown property');\n    b.t('set the number of cd fld \"p1\" to 6\\\\0', 'ERR:unknown property');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* product opts get */\n    b.t('the xyz', 'ERR:no such function');\n    b.t('the long xyz', 'ERR:no such function');\n    b.t('the short xyz', 'ERR:no such function');\n    b.t('the environment', 'development');\n    b.t('the freesize of this stack', '0');\n    b.t('the size of this stack', '0');\n    b.t('size of this stack', '0');\n    b.t('the stacksinuse', '');\n    b.t('the suspended', 'false');\n    b.t('the long version', `${vpcVersion}`);\n    b.t('the version', `${vpcVersion[4]}.${vpcVersion[6]}`);\n\n    /* product opts set */\n    b.t('set the itemdelimiter to \"|\" \\\\ the itemdelimiter', '|');\n    b.t('item 2 of \"a|b|c\"', 'b');\n    b.t('set the itemdelimiter to \",\" \\\\ the itemdelimiter', ',');\n    b.t('set the itemdelimiter to \"\" \\\\ 0', 'ERR:length of itemDel must be 1');\n    b.t('set the itemdelimiter to \",,\" \\\\ 0', 'ERR:length of itemDel must be 1');\n    b.t('set the cursor to \"plus\" \\\\ the cursor', 'plus');\n    b.t('set the cursor to \"arrow\" \\\\ the cursor', 'arrow');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    h.setScript(h.ids.stack, 'on stackscript\\nend stackscript');\n    h.setScript(h.vcstate.model.stack.bgs[1].idInternal, 'on bgscript\\nend bgscript');\n    h.setScript(\n        h.vcstate.model.stack.bgs[1].cards[1].idInternal,\n        'on cdscript\\nend cdscript'\n    );\n\n    /* stack get and set */\n    b.t('length(the script of this stack) > 1', `true`);\n    b.t('the script of this stack', `${h.vcstate.model.stack.getS('script')}`);\n    b.t(\n        'set the name of this stack to \"newname\" \\\\ the short name of this stack',\n        'newname'\n    );\n    b.t(\n        'set the name of this stack to \"teststack\" \\\\ the short name of this stack',\n        'teststack'\n    );\n\n    /* bg get and set */\n    b.t('length(the script of bg 1) == 0', `true`);\n    b.t('the script of bg 1', ``);\n    b.t('length(the script of bg 2) > 1', `true`);\n    b.t('the script of bg 2', `${h.vcstate.model.stack.bgs[1].getS('script')}`);\n    b.t('the short name of bg 2', 'b');\n    b.t('set the name of bg 2 to \"newname\" \\\\ the short name of bg 2', 'newname');\n    b.t('set the name of bg 2 to \"b\" \\\\ the short name of bg 2', 'b');\n\n    /* card get and set */\n    b.t('length(the script of cd 1) == 0', `true`);\n    b.t('the script of cd 1', ``);\n    b.t('length(the script of cd 3) > 1', `true`);\n    b.t('the script of cd 3', `${h.vcstate.model.stack.bgs[1].cards[1].getS('script')}`);\n    b.t('the short name of cd 3', 'c');\n    b.t('set the name of cd 3 to \"newname\" \\\\ the short name of cd 3', 'newname');\n    b.t('set the name of cd 3 to \"c\" \\\\ the short name of cd 3', 'c');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    /* size properties */\n    b.t('set the rect of cd btn \"p1\" to 0,0,0,0\\\\0', '0');\n    b.t('the left of cd btn \"p1\"', '0');\n    b.t('the top of cd btn \"p1\"', '0');\n    b.t('the width of cd btn \"p1\"', '0');\n    b.t('the height of cd btn \"p1\"', '0');\n    b.t('set the rect of cd btn \"p1\" to 10,20,40,60\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '10,20,40,60');\n    b.t('the left of cd btn \"p1\"', '10');\n    b.t('the top of cd btn \"p1\"', '20');\n    b.t('the width of cd btn \"p1\"', '30');\n    b.t('the height of cd btn \"p1\"', '40');\n    b.t('the right of cd btn \"p1\"', '40');\n    b.t('the bottom of cd btn \"p1\"', '60');\n    b.t('the topleft of cd btn \"p1\"', '10,20');\n    b.t('the botright of cd btn \"p1\"', '40,60');\n    b.t('the loc of cd btn \"p1\"', '25,40');\n\n    /* plain dimensions */\n    b.t('set the left of cd btn \"p1\" to 100\\\\0', '0');\n    b.t('set the top of cd btn \"p1\" to 200\\\\0', '0');\n    b.t('set the width of cd btn \"p1\" to 300\\\\0', '0');\n    b.t('set the height of cd btn \"p1\" to 400\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '100,200,400,600');\n    b.t('the loc of cd btn \"p1\"', '250,400');\n    b.t('set the right of cd btn \"p1\" to 401\\\\0', '0');\n    b.t('set the bottom of cd btn \"p1\" to 601\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '101,201,401,601');\n    b.t('set the topleft of cd btn \"p1\" to 10,20\\\\0', '0');\n    b.t('set the botright of cd btn \"p1\" to 40,60\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '10,20,40,60');\n\n    /* test loc with even widths */\n    b.t('set the rect of cd btn \"p1\" to 10,20,40,60\\\\0', '0');\n    b.t('the loc of cd btn \"p1\"', '25,40');\n    b.t('set the loc of cd btn \"p1\" to 26,41\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '11,21,41,61');\n\n    /* test loc with odd widths */\n    b.t('set the rect of cd btn \"p1\" to 10,20,41,61\\\\0', '0');\n    b.t('the loc of cd btn \"p1\"', '25,40');\n    b.t('set the loc of cd btn \"p1\" to 26,41\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '11,21,42,62');\n\n    /* test loc with even widths */\n    b.t('set the rect of cd btn \"p1\" to 10,20,42,62\\\\0', '0');\n    b.t('the loc of cd btn \"p1\"', '26,41');\n    b.t('set the loc of cd btn \"p1\" to 26,41\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '10,20,42,62');\n\n    /* set name */\n    b.t(`the short name of cd btn id ${h.ids.bBC1}`, 'p1');\n    b.t(\n        longstr(\n            `set the name of cd btn id ${h.ids.bBC1} to\n                \"newname\" \\\\ the short name of cd btn id ${h.ids.bBC1}`\n        ),\n        'newname'\n    );\n    b.t(\n        longstr(\n            `set the name of cd btn id ${h.ids.bBC1} to\n                \"p1\" \\\\ the short name of cd btn id ${h.ids.bBC1}`\n        ),\n        'p1'\n    );\n\n    /* type checking, coords */\n    b.t('set the rect of cd btn \"p1\" to \"10,20,30,40\"\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '10,20,30,40');\n    b.t('set the rect of cd btn \"p1\" to \" 10 , 20 , 30 , 40 \"\\\\0', '0');\n    b.t('the rect of cd btn \"p1\"', '10,20,30,40');\n    b.t(\n        'set the rect of cd btn \"p1\" to \" 10 , 20.0000000001 , 29.99999999999 , 40 \"\\\\0',\n        '0'\n    );\n    b.t('the rect of cd btn \"p1\"', '10,20,30,40');\n    b.t('set the rect of cd btn \"p1\" to 10\\\\0', 'ERR:Not a list of integers');\n    b.t('set the rect of cd btn \"p1\" to 10,20\\\\0', 'ERR:expected 4 numbers but got 2');\n    b.t('set the rect of cd btn \"p1\" to 10,20,30\\\\0', 'ERR:expected 4 numbers but got 3');\n    b.t('set the rect of cd btn \"p1\" to \"10\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the rect of cd btn \"p1\" to \"10,20\"\\\\0', 'ERR:expected 4 numbers but got 2');\n    b.t(\n        'set the rect of cd btn \"p1\" to \"10,20,30\"\\\\0',\n        'ERR:expected 4 numbers but got 3'\n    );\n    b.t('set the rect of cd btn \"p1\" to \"10,20,30,40a\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the rect of cd btn \"p1\" to \"10,20,30a,40\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the rect of cd btn \"p1\" to \"10,20a,30,40\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the rect of cd btn \"p1\" to \"10a,20,30,40\"\\\\0', 'ERR:Not a list of integers');\n    b.t(\n        'set the rect of cd btn \"p1\" to \"10,20,30,40.1\"\\\\0',\n        'ERR:Not a list of integers'\n    );\n    b.t(\n        'set the rect of cd btn \"p1\" to \"10,20,30.1,40\"\\\\0',\n        'ERR:Not a list of integers'\n    );\n    b.t(\n        'set the rect of cd btn \"p1\" to \"10,20.1,30,40\"\\\\0',\n        'ERR:Not a list of integers'\n    );\n    b.t(\n        'set the rect of cd btn \"p1\" to \"10.1,20,30,40\"\\\\0',\n        'ERR:Not a list of integers'\n    );\n    b.t('set the topleft of cd btn \"p1\" to \"10\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the topleft of cd btn \"p1\" to \"10,20a\"\\\\0', 'ERR:Not a list of integers');\n    b.t('set the topleft of cd btn \"p1\" to \"10a,20\"\\\\0', 'ERR:Not a list of integers');\n\n    /* type checking, single values */\n    b.t('set the left of cd btn \"p1\" to \"-30\"\\\\0', '0');\n    b.t('the left of cd btn \"p1\"', '-30');\n    b.t('set the left of cd btn \"p1\" to \" 10 \"\\\\0', '0');\n    b.t('the left of cd btn \"p1\"', '10');\n    b.t('set the left of cd btn \"p1\" to \"4,5\"\\\\0', 'ERR:expected an integer');\n    b.t('set the left of cd btn \"p1\" to \"\"\\\\0', 'ERR:expected an integer');\n    b.t('set the left of cd btn \"p1\" to \"10a\"\\\\0', 'ERR:expected an integer');\n    b.t('set the left of cd btn \"p1\" to \"a10\"\\\\0', 'ERR:expected an integer');\n    b.t('set the left of cd btn \"p1\" to \"10.1\"\\\\0', 'ERR:expected an integer');\n\n    /* run the tests again with fld instead of btn */\n    class UseFldInsteadOfBtn extends TestMultiplier {\n        secondTransformation(code: string, expected: string): O<[string, string]> {\n            code = code\n                .replace(/ cd btn /g, ' cd fld ')\n                .replace(new RegExp(`${h.ids.bBC1}`, 'g'), `${h.ids.fBC1}`);\n            return [code, expected];\n        }\n    }\n\n    b.batchEvaluate(h, [UseFldInsteadOfBtn]);\n    b = new ScriptTestBatch();\n\n    /* btn simple get/set */\n    b.t('the autohilite of cd btn \"p1\"', 'true');\n    b.t(\n        'set the autohilite of cd btn \"p1\" to false\\\\the autohilite of cd btn \"p1\"',\n        'false'\n    );\n    b.t('the enabled of cd btn \"p1\"', 'true');\n    b.t('set the enabled of cd btn \"p1\" to false\\\\the enabled of cd btn \"p1\"', 'false');\n    b.t('the hilite of cd btn \"p1\"', 'false');\n    b.t('set the hilite of cd btn \"p1\" to true\\\\the hilite of cd btn \"p1\"', 'true');\n    b.t('the icon of cd btn \"p1\"', '0');\n    b.t('set the icon of cd btn \"p1\" to 1\\\\the icon of cd btn \"p1\"', '1');\n    b.t('the label of cd btn \"p1\"', 'New Button');\n    b.t(\n        'set the label of cd btn \"p1\" to \"newlabel\"\\\\the label of cd btn \"p1\"',\n        'newlabel'\n    );\n    b.t('the showlabel of cd btn \"p1\"', 'true');\n    b.t(\n        'set the showlabel of cd btn \"p1\" to false\\\\the showlabel of cd btn \"p1\"',\n        'false'\n    );\n    b.t('the visible of cd btn \"p1\"', 'true');\n    b.t('set the visible of cd btn \"p1\" to false\\\\the visible of cd btn \"p1\"', 'false');\n    b.t('the textfont of cd btn \"p1\"', 'chicago');\n    b.t(\n        'set the textfont of cd btn \"p1\" to \"helvetica\"\\\\the textfont of cd btn \"p1\"',\n        'helvetica'\n    );\n    b.t('the textsize of cd btn \"p1\"', '12');\n    b.t('set the textsize of cd btn \"p1\" to 16\\\\the textsize of cd btn \"p1\"', '16');\n\n    /* btn validated get/set */\n    b.t('the style of cd btn \"p1\"', 'roundrect');\n    b.t('set the style of cd btn \"p1\" to \"xyz\"\\\\0', 'ERR:Button style');\n    b.t('set the style of cd btn \"p1\" to \"radio\"\\\\the style of cd btn \"p1\"', 'radio');\n    b.t('set the style of cd btn \"p1\" to shadow\\\\the style of cd btn \"p1\"', 'shadow');\n    b.t('the textstyle of cd btn \"p1\"', 'plain');\n    b.t('set the textstyle of cd btn \"p1\" to \"xyz\"\\\\0', 'ERR:unrecognized text style');\n    b.t(\n        'set the textstyle of cd btn \"p1\" to \"bold,xyz\"\\\\0',\n        'ERR:unrecognized text style'\n    );\n    b.t(\n        longstr(\n            `set the textstyle of cd btn \"p1\" to\n                \"bold,italic,underline,outline,shadow,condense,extend\"\\\\the\n                textstyle of cd btn \"p1\"`\n        ),\n        'bold,italic,underline,outline,shadow,condense,extend'\n    );\n    b.t(\n        longstr(\n            `set the textstyle of cd btn \"p1\" to\n                bold,italic,underline,outline,shadow,condense,extend\\\\the\n                textstyle of cd btn \"p1\"`\n        ),\n        'bold,italic,underline,outline,shadow,condense,extend'\n    );\n    b.t(\n        longstr(\n            `set the textstyle of cd btn \"p1\" to\n                \" Underline , Italic , Bold \"\\\\the textstyle of cd btn \"p1\"`\n        ),\n        'bold,italic,underline'\n    );\n    b.t('the textalign of cd btn \"p1\"', 'center');\n    b.t(\n        'set the textalign of cd btn \"p1\" to \"xyz\"\\\\0',\n        'ERR:support setting text align to'\n    );\n    b.t(\n        'set the textalign of cd btn \"p1\" to \"left\"\\\\the textalign of cd btn \"p1\"',\n        'left'\n    );\n    b.t(\n        'set the textalign of cd btn \"p1\" to center\\\\the textalign of cd btn \"p1\"',\n        'center'\n    );\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* field simple get/set */\n    b.t('the dontwrap of cd fld \"p1\"', 'false');\n    b.t('set the dontwrap of cd fld \"p1\" to true\\\\the dontwrap of cd fld \"p1\"', 'true');\n    b.t('the enabled of cd fld \"p1\"', 'true');\n    b.t('set the enabled of cd fld \"p1\" to false\\\\the enabled of cd fld \"p1\"', 'false');\n    b.t('the locktext of cd fld \"p1\"', 'false');\n    b.t('set the locktext of cd fld \"p1\" to true\\\\the locktext of cd fld \"p1\"', 'true');\n    b.t('the singleline of cd fld \"p1\"', 'false');\n    b.t(\n        'set the singleline of cd fld \"p1\" to true\\\\the singleline of cd fld \"p1\"',\n        'true'\n    );\n    b.t('the scroll of cd fld \"p1\"', '0');\n    b.t('set the scroll of cd fld \"p1\" to 1\\\\the scroll of cd fld \"p1\"', '1');\n    b.t('set the scroll of cd fld \"p1\" to 0\\\\the scroll of cd fld \"p1\"', '0');\n    b.t('the defaulttextsize of cd fld \"p1\"', '12');\n    b.t(\n        'set the defaulttextsize of cd fld \"p1\" to 14\\\\the defaulttextsize of cd fld \"p1\"',\n        '14'\n    );\n    b.t('the defaulttextfont of cd fld \"p1\"', 'geneva');\n    b.t(\n        'set the defaulttextfont of cd fld \"p1\" to helvetica\\\\0',\n        'ERR:no variable found'\n    );\n    b.t(\n        longstr(\n            `set the defaulttextfont of cd fld \"p1\" to\n                \"helvetica\"\\\\the defaulttextfont of cd fld \"p1\"`\n        ),\n        'helvetica'\n    );\n\n    /* validated get/set */\n    b.t('the defaulttextstyle of cd fld \"p1\"', 'plain');\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to\n                \"outline\"\\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'outline'\n    );\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to\n                \" bold , shadow , italic \"\\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'bold,italic,shadow'\n    );\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to\n                \" italic , outline, extend, bold \"\\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'bold,italic,outline,extend'\n    );\n\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to bold,\n                 shadow, italic \\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'bold,italic,shadow'\n    );\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to italic ,\n                 outline, extend, bold \\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'bold,italic,outline,extend'\n    );\n    b.t(\n        longstr(\n            `set the defaulttextstyle of cd fld \"p1\" to\n                 \"plain\"\\\\the defaulttextstyle of cd fld \"p1\"`\n        ),\n        'plain'\n    );\n    b.t(\n        'set the defaulttextstyle of cd fld \"p1\" to \"\"\\\\0',\n        'ERR:unrecognized text style'\n    );\n    b.t(\n        'set the defaulttextstyle of cd fld \"p1\" to \"bold,\"\\\\0',\n        'ERR:unrecognized text style'\n    );\n    b.t(\n        'set the defaulttextstyle of cd fld \"p1\" to \"xyz\"\\\\0',\n        'ERR:unrecognized text style'\n    );\n    b.t('set the defaulttextstyle of cd fld \"p1\" to xyz\\\\0', 'ERR:no variable found');\n    b.t(\n        'set the defaulttextstyle of cd fld \"p1\" to \"bold, xyz\"\\\\0',\n        'ERR:unrecognized text style'\n    );\n    b.t(\n        'set the defaulttextstyle of cd fld \"p1\" to bold, xyz\\\\0',\n        'ERR:no variable found'\n    );\n    b.t('the textalign of cd fld \"p1\"', 'left');\n    b.t(\n        'set the textalign of cd fld \"p1\" to \"center\"\\\\the textalign of cd fld \"p1\"',\n        'center'\n    );\n    b.t('set the textalign of cd fld \"p1\" to left\\\\the textalign of cd fld \"p1\"', 'left');\n    b.t(\n        'set the textalign of cd fld \"p1\" to \"right\"\\\\0',\n        'ERR:currently support setting text align'\n    );\n    b.t(\n        'set the textalign of cd fld \"p1\" to \"xyz\"\\\\0',\n        'ERR:currently support setting text align'\n    );\n    b.t('set the textalign of cd fld \"p1\" to xyz\\\\0', 'ERR:no variable found');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* setting style */\n    const fld = h.vcstate.model.getById(VpcElField, h.ids.fBC1);\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        fld.setOnVel('style', UI512FldStyle.Rectangle, h.vcstate.model)\n    );\n    assertEq(UI512FldStyle.Rectangle, fld.getN('style'), '1 |');\n    b.t('the style of cd fld \"p1\"', 'rectangle');\n    b.t('set the style of cd fld \"p1\" to \"xyz\"\\\\0', 'ERR:Field style or');\n    b.t('set the style of cd fld \"p1\" to \"opaque\"\\\\the style of cd fld \"p1\"', 'opaque');\n    b.t(\n        'set the style of cd fld \"p1\" to \"scrolling\"\\\\the style of cd fld \"p1\"',\n        'scrolling'\n    );\n    b.t(\n        'set the style of cd fld \"p1\" to \"transparent\"\\\\the style of cd fld \"p1\"',\n        'transparent'\n    );\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    assertEq(UI512FldStyle.Transparent, fld.getN('style'), '1z|');\n\n    /* reading per-character formatting */\n    /* here's what we'll set it to: Courier/Bold/24\"ab\"\n        Courier/ItalicShadow/18\"cd\"Times/Plain/18ef */\n    const fldPerChar = h.vcstate.model.getById(VpcElField, h.ids.fBC2);\n    let sfmt = '';\n    sfmt += UI512DrawText.setFont(\n        'ab',\n        new TextFontSpec('Courier', TextFontStyling.Bold, 24).toSpecString()\n    );\n    sfmt += UI512DrawText.setFont(\n        'cd',\n        new TextFontSpec(\n            'Courier',\n            TextFontStyling.Italic | TextFontStyling.Shadow,\n            18\n        ).toSpecString()\n    );\n    sfmt += UI512DrawText.setFont(\n        'ef',\n        new TextFontSpec('Times', TextFontStyling.Default, 18).toSpecString()\n    );\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        fldPerChar.setFmTxt(FormattedText.newFromSerialized(sfmt), higher)\n    );\n\n    /* non per-character properties */\n    b.t('the defaulttextfont of cd fld \"p2\"', 'geneva');\n    b.t('the defaulttextstyle of cd fld \"p2\"', 'plain');\n    b.t('the defaulttextsize of cd fld \"p2\"', '12');\n    b.t('the textfont of cd fld \"p2\"', 'geneva');\n    b.t('the textstyle of cd fld \"p2\"', 'plain');\n    b.t('the textsize of cd fld \"p2\"', '12');\n    b.t('the alltext of cd fld \"p2\"', 'abcdef');\n    b.t('cd fld \"p2\"', 'abcdef');\n\n    /* read per-character! */\n    b.t('the textfont of char 1 to 4 of cd fld \"p2\"', 'Courier');\n    b.t('the textfont of char 3 to 4 of cd fld \"p2\"', 'Courier');\n    b.t('the textfont of char 3 to 5 of cd fld \"p2\"', 'mixed');\n    b.t('the textstyle of char 1 to 2 of cd fld \"p2\"', 'bold');\n    b.t('the textstyle of char 1 to 3 of cd fld \"p2\"', 'mixed');\n    b.t('the textstyle of char 3 to 4 of cd fld \"p2\"', 'italic,shadow');\n    b.t('the textsize of char 3 to 4 of cd fld \"p2\"', '18');\n    b.t('the textsize of char 3 to 6 of cd fld \"p2\"', '18');\n    b.t('the textsize of char 2 to 6 of cd fld \"p2\"', 'mixed');\n\n    /* getting most properties aren't supported for per-character */\n    b.t('the textfont of char 1 to 2 of cd btn \"p2\"', 'ERR:NoViableAltException');\n    b.t('the textfont of char 1 to 2 of cd 1', 'ERR:NoViableAltException');\n    b.t('the textfont of char 1 to 2 of bg 1', 'ERR:NoViableAltException');\n    b.t('the dontwrap of char 1 to 2 of cd fld \"p2\"', 'ERR:for textstyle, textfont');\n    b.t('the style of char 1 to 2 of cd fld \"p2\"', 'ERR:for textstyle, textfont');\n    b.t('the xyz of char 1 to 2 of cd fld \"p2\"', 'ERR:no such function');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* formatting should have been preserved */\n    let contents = fldPerChar.getFmTxt().toSerialized();\n    assertWarnEq(sfmt, contents, '1y|');\n\n    /* setting per-character formatting */\n    b.t(\n        longstr(\n            `set the textfont of char 2 to 3 of cd fld \"p2\" to\n                 \"geneva\"\\\\the textfont of char 2 to 3 of cd fld \"p2\"`\n        ),\n        'geneva'\n    );\n    b.t(\n        longstr(\n            `set the textstyle of char 4 to 5 of cd fld \"p2\" to\n                 \"underline\"\\\\the textstyle of char 4 to 5 of cd fld \"p2\"`\n        ),\n        'underline'\n    );\n    b.t(\n        longstr(\n            `set the textsize of char 6 to 6 of cd fld \"p2\" to\n                 \"14\"\\\\the textsize of char 6 to 6 of cd fld \"p2\"`\n        ),\n        '14'\n    );\n\n    /* confirm what was set */\n    b.t('the textfont of char 1 to 1 of cd fld \"p2\"', 'Courier');\n    b.t('the textfont of char 2 to 2 of cd fld \"p2\"', 'geneva');\n    b.t('the textfont of char 3 to 3 of cd fld \"p2\"', 'geneva');\n    b.t('the textfont of char 4 to 4 of cd fld \"p2\"', 'Courier');\n    b.t('the textfont of char 5 to 5 of cd fld \"p2\"', 'Times');\n    b.t('the textfont of char 6 to 6 of cd fld \"p2\"', 'Times');\n    b.t('the textstyle of char 1 to 1 of cd fld \"p2\"', 'bold');\n    b.t('the textstyle of char 2 to 2 of cd fld \"p2\"', 'bold');\n    b.t('the textstyle of char 3 to 3 of cd fld \"p2\"', 'italic,shadow');\n    b.t('the textstyle of char 4 to 4 of cd fld \"p2\"', 'underline');\n    b.t('the textstyle of char 5 to 5 of cd fld \"p2\"', 'underline');\n    b.t('the textstyle of char 6 to 6 of cd fld \"p2\"', 'plain');\n    b.t('the textsize of char 1 to 1 of cd fld \"p2\"', '24');\n    b.t('the textsize of char 2 to 2 of cd fld \"p2\"', '24');\n    b.t('the textsize of char 3 to 3 of cd fld \"p2\"', '18');\n    b.t('the textsize of char 4 to 4 of cd fld \"p2\"', '18');\n    b.t('the textsize of char 5 to 5 of cd fld \"p2\"', '18');\n    b.t('the textsize of char 6 to 6 of cd fld \"p2\"', '14');\n\n    /* setting most properties aren't supported for per-character */\n    b.t(\n        'set the textfont of char 1 to 2 of cd btn \"p2\" to \"Geneva\"\\\\0',\n        'ERR:NoViableAltException'\n    );\n    b.t(\n        'set the textfont of char 1 to 2 of cd 1 to \"Geneva\"\\\\0',\n        'ERR:NoViableAltException'\n    );\n    b.t(\n        'set the textfont of char 1 to 2 of bg 1 to \"Geneva\"\\\\0',\n        'ERR:NoViableAltException'\n    );\n    b.t(\n        'set the dontwrap of char 1 to 2 of cd fld \"p2\" to \"false\"\\\\0',\n        'ERR:can only say'\n    );\n    b.t('set the style of char 1 to 2 of cd fld \"p2\" to \"opaque\"\\\\0', 'ERR:can only say');\n    b.t('set the xyz of char 1 to 2 of cd fld \"p2\" to \"Geneva\"\\\\0', 'ERR:can only say');\n    b.batchEvaluate(h);\n\n    /* confirm formatting */\n    contents = fldPerChar.getFmTxt().toSerialized();\n    assertWarnEq(\n        longstr(\n            `|Courier_24_+biuosdce|a|geneva_24_+biuosdce|b|geneva_18_b+iuo+sdce|\n            c|Courier_18_bi+uosdce|d|Times_18_bi+uosdce|e|Times_14_biuosdce|f`,\n            ''\n        ),\n        contents.replace(new RegExp(specialCharFontChange, 'g'), '|'),\n        '1x|'\n    );\n\n    /* all of these actions nuke formatting */\n    let actions: [string, TextFontSpec][] = [\n        ['put \"abcdef\" into cd fld \"p2\"', new TextFontSpec('geneva', 0, 12)],\n        ['set the alltext of cd fld \"p2\" to \"abcdef\"', new TextFontSpec('geneva', 0, 12)],\n        [\n            'set the textstyle of cd fld \"p2\" to \"bold\"',\n            new TextFontSpec('geneva', TextFontStyling.Bold, 12)\n        ],\n        [\n            'set the textfont of cd fld \"p2\" to \"helvetica\"',\n            new TextFontSpec('helvetica', 0, 12)\n        ],\n        ['set the textsize of cd fld \"p2\" to \"9\"', new TextFontSpec('geneva', 0, 9)],\n        [\n            'set the textfont of char 1 to 400 of cd fld \"p2\" to \"times\"\\n' +\n                'set the textstyle of char 1 to 400 of cd fld \"p2\" to \"underline,outline\"\\n' +\n                'set the textsize of char 1 to 400 of cd fld \"p2\" to \"28\"\\n',\n            new TextFontSpec(\n                'times',\n                TextFontStyling.Outline | TextFontStyling.Underline,\n                28\n            )\n        ]\n    ];\n\n    for (let [action, expectedFont] of actions) {\n        b = new ScriptTestBatch();\n        h.vcstate.vci.doWithoutAbilityToUndo(() =>\n            fldPerChar.setFmTxt(FormattedText.newFromSerialized(sfmt), higher)\n        );\n        assertEq(sfmt, fldPerChar.getFmTxt().toSerialized(), '1w|');\n        b.t('set the defaulttextfont of cd fld \"p2\" to \"geneva\"\\\\0', '0');\n        b.t('set the defaulttextstyle of cd fld \"p2\" to \"plain\"\\\\0', '0');\n        b.t('set the defaulttextsize of cd fld \"p2\" to \"12\"\\\\0', '0');\n        b.t(`${action}\\\\0`, '0');\n        b.batchEvaluate(h);\n\n        /* formatting should have been lost */\n        contents = fldPerChar.getFmTxt().toSerialized();\n        let expected = UI512DrawText.setFont('abcdef', expectedFont.toSpecString());\n        assertEq(expected, contents, '1v|');\n    }\n\n    b = new ScriptTestBatch();\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    /* productopts */\n    b.t(`the name of ${cProductName}`, `${cProductName}`);\n    b.t(`the abbr name of ${cProductName}`, `${cProductName}`);\n    b.t(`the short name of ${cProductName}`, `${cProductName}`);\n    b.t(`the long name of ${cProductName}`, `Hard Drive:${cProductName}`);\n    b.t(`the id of ${cProductName}`, `WILD`);\n    b.t(`the abbr id of ${cProductName}`, `WILD`);\n    b.t(`the short id of ${cProductName}`, `WILD`);\n    b.t(`the long id of ${cProductName}`, `WILD`);\n\n    /* stack */\n    b.t('set the name of stack 1 to \"teststack\"\\\\1', '1');\n    b.t('the name of this stack', 'stack \"teststack\"');\n    b.t('the abbr name of this stack', 'stack \"teststack\"');\n    b.t('the short name of this stack', 'teststack');\n    b.t('the long name of this stack', 'stack \"Hard Drive:teststack\"');\n    b.t('the id of this stack', '921');\n    b.t('the abbr id of this stack', '921');\n    b.t('the short id of this stack', '921');\n    b.t('the long id of stack \"teststack\"', 'stack id 921');\n\n    /* bkgnd with a name */\n    b.t('the name of bg 2', 'bkgnd \"b\"');\n    b.t('the abbr name of bg 2', 'bkgnd \"b\"');\n    b.t('the short name of bg 2', 'b');\n    b.t('the long name of bg 2', 'bkgnd \"b\" of stack \"teststack\"');\n    b.t('the id of bg 2', `${h.ids.bgB}`);\n    b.t('the abbr id of bg 2', `${h.ids.bgB}`);\n    b.t('the short id of bg 2', `${h.ids.bgB}`);\n    b.t('the long id of bg 2', `bkgnd id ${h.ids.bgB}`);\n\n    /* bkgnd with no name */\n    b.t('set the name of bg 2 to \"\"\\\\0', '0');\n    b.t('the name of bg 2', `bkgnd id ${h.ids.bgB}`);\n    b.t('the abbr name of bg 2', `bkgnd id ${h.ids.bgB}`);\n    b.t('the short name of bg 2', `bkgnd id ${h.ids.bgB}`);\n    b.t('the long name of bg 2', `bkgnd id ${h.ids.bgB} of stack \"teststack\"`);\n    b.t('the id of bg 2', `${h.ids.bgB}`);\n    b.t('the abbr id of bg 2', `${h.ids.bgB}`);\n    b.t('the short id of bg 2', `${h.ids.bgB}`);\n    b.t('the long id of bg 2', `bkgnd id ${h.ids.bgB}`);\n    b.t('set the name of bg 2 to \"b\"\\\\0', '0');\n\n    /* card with a name */\n    b.t('the name of cd 4', 'card \"d\"');\n    b.t('the abbr name of cd 4', 'card \"d\"');\n    b.t('the short name of cd 4', 'd');\n    b.t('the long name of cd 4', 'card \"d\" of stack \"teststack\"');\n    b.t('the id of cd 4', `${h.ids.cdBD}`);\n    b.t('the abbr id of cd 4', `${h.ids.cdBD}`);\n    b.t('the short id of cd 4', `${h.ids.cdBD}`);\n    b.t('the long id of cd 4', `card id ${h.ids.cdBD}`);\n\n    /* card with no name */\n    b.t('set the name of cd 4 to \"\"\\\\0', '0');\n    b.t('the name of cd 4', `card id ${h.ids.cdBD}`);\n    b.t('the abbr name of cd 4', `card id ${h.ids.cdBD}`);\n    b.t('the short name of cd 4', `card id ${h.ids.cdBD}`);\n    b.t('the long name of cd 4', `card id ${h.ids.cdBD} of stack \"teststack\"`);\n    b.t('the id of cd 4', `${h.ids.cdBD}`);\n    b.t('the abbr id of cd 4', `${h.ids.cdBD}`);\n    b.t('the short id of cd 4', `${h.ids.cdBD}`);\n    b.t('the long id of cd 4', `card id ${h.ids.cdBD}`);\n    b.t('set the name of cd 4 to \"d\"\\\\0', '0');\n\n    /* button with a name */\n    b.t('the name of cd btn \"p1\"', 'card button \"p1\"');\n    b.t('the abbr name of cd btn \"p1\"', 'card button \"p1\"');\n    b.t('the short name of cd btn \"p1\"', 'p1');\n    b.t(\n        'the long name of cd btn \"p1\"',\n        'card button \"p1\" of card \"c\" of stack \"teststack\"'\n    );\n    b.t('the id of cd btn \"p1\"', `${h.ids.bBC1}`);\n    b.t('the abbr id of cd btn \"p1\"', `${h.ids.bBC1}`);\n    b.t('the short id of cd btn \"p1\"', `${h.ids.bBC1}`);\n    b.t('the long id of cd btn \"p1\"', `card button id ${h.ids.bBC1}`);\n\n    /* button with no name */\n    b.t(`set the name of cd btn id ${h.ids.bBC1} to \"\"\\\\0`, '0');\n    b.t(`the name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(`the abbr name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(`the short name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(\n        `the long name of cd btn id ${h.ids.bBC1}`,\n        `card button id ${h.ids.bBC1} of card \"c\" of stack \"teststack\"`\n    );\n    b.t(`the id of cd btn id ${h.ids.bBC1}`, `${h.ids.bBC1}`);\n    b.t(`the abbr id of cd btn id ${h.ids.bBC1}`, `${h.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h.ids.bBC1}`, `${h.ids.bBC1}`);\n    b.t(`the long id of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(`set the name of cd btn id ${h.ids.bBC1} to \"p1\"\\\\0`, `0`);\n\n    /* field with a name */\n    b.t('the name of cd fld \"p1\"', 'card field \"p1\"');\n    b.t('the abbr name of cd fld \"p1\"', 'card field \"p1\"');\n    b.t('the short name of cd fld \"p1\"', 'p1');\n    b.t(\n        'the long name of cd fld \"p1\"',\n        'card field \"p1\" of card \"c\" of stack \"teststack\"'\n    );\n    b.t('the id of cd fld \"p1\"', `${h.ids.fBC1}`);\n    b.t('the abbr id of cd fld \"p1\"', `${h.ids.fBC1}`);\n    b.t('the short id of cd fld \"p1\"', `${h.ids.fBC1}`);\n    b.t('the long id of cd fld \"p1\"', `card field id ${h.ids.fBC1}`);\n\n    /* field with no name */\n    b.t(`set the name of cd fld id ${h.ids.fBC1} to \"\"\\\\0`, '0');\n    b.t(`the name of cd fld id ${h.ids.fBC1}`, `card field id ${h.ids.fBC1}`);\n    b.t(`the abbr name of cd fld id ${h.ids.fBC1}`, `card field id ${h.ids.fBC1}`);\n    b.t(`the short name of cd fld id ${h.ids.fBC1}`, `card field id ${h.ids.fBC1}`);\n    b.t(\n        `the long name of cd fld id ${h.ids.fBC1}`,\n        `card field id ${h.ids.fBC1} of card \"c\" of stack \"teststack\"`\n    );\n    b.t(`the id of cd fld id ${h.ids.fBC1}`, `${h.ids.fBC1}`);\n    b.t(`the abbr id of cd fld id ${h.ids.fBC1}`, `${h.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h.ids.fBC1}`, `${h.ids.fBC1}`);\n    b.t(`the long id of cd fld id ${h.ids.fBC1}`, `card field id ${h.ids.fBC1}`);\n    b.t(`set the name of cd fld id ${h.ids.fBC1} to \"p1\"\\\\0`, `0`);\n\n    /* when nothing has names, we get different output */\n    b.t('set the name of stack 1 to \"\"\\\\0', '0');\n    b.t('set the name of this bg to \"\"\\\\0', '0');\n    b.t('set the name of this card to \"\"\\\\0', '0');\n    b.t(`set the name of cd btn id ${h.ids.bBC1} to \"\"\\\\0`, `0`);\n    b.t(`the name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(`the abbr name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(`the short name of cd btn id ${h.ids.bBC1}`, `card button id ${h.ids.bBC1}`);\n    b.t(\n        `the long name of cd btn id ${h.ids.bBC1}`,\n        `card button id ${h.ids.bBC1} of card id ${h.ids.cdBC} of stack \"\"`\n    );\n    b.t('set the name of stack 1 to \"\"\\\\0', '0');\n    b.t('set the name of this bg to \"b\"\\\\0', '0');\n    b.t('set the name of this card to \"c\"\\\\0', '0');\n    b.t(`set the name of cd btn id ${h.ids.bBC1} to \"p1\"\\\\0`, `0`);\n\n    /* the target */\n    b.t(`the target`, `card button id ${h.ids.go}`);\n    b.t(`the abbr target`, `card button id ${h.ids.go}`);\n    b.t(`the short target`, `${h.ids.go}`);\n    b.t(`the long target`, `card button id ${h.ids.go}`);\n    b.t(`set the compatibilitymode of this stack to true\\\\1`, `1`);\n    b.t(`the short target`, `go`);\n    b.t(`set the compatibilitymode of this stack to false\\\\1`, `1`);\n\n    /* owner */\n    b.t('the owner of vipercard', 'ERR:get owner');\n    b.t('the owner of stack \"\"', 'ERR:get owner');\n    b.t('the owner of this stack', 'ERR:get owner');\n    b.t('the owner of bg 1', 'stack id 921');\n    b.t('the owner of cd fld \"p1\"', `card id ${h.ids.cdBC}`);\n    b.t('the owner of cd btn \"p1\"', `card id ${h.ids.cdBC}`);\n    b.t('the owner of cd btn \"xyz\"', 'ERR:could not find');\n    b.t('the owner of cd fld \"xyz\"', 'ERR:could not find');\n    b.t('the owner of cd 1', `bkgnd id ${h.ids.bgA}`);\n    b.t('the owner of second cd', `bkgnd id ${h.ids.bgB}`);\n    b.t('the owner of fifth cd', `bkgnd id ${h.ids.bgC}`);\n    b.t('the owner of cd \"d\" of bg 3', `bkgnd id ${h.ids.bgC}`);\n\n    b.batchEvaluate(h);\n});\nt.test('setting a property can use variety of expression levels', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    let b = new ScriptTestBatch();\n    b.t('set hilite of cd btn \"p1\" to 2 == 3\\\\hilite of cd btn \"p1\"', 'false');\n    b.t('set hilite of cd btn \"p1\" to 3 > 2\\\\hilite of cd btn \"p1\"', 'true');\n    b.t('set hilite of cd btn \"p1\" to 3 is a number\\\\hilite of cd btn \"p1\"', 'true');\n    b.t('set hilite of cd btn \"p1\" to 3 is \"3\"\\\\hilite of cd btn \"p1\"', 'true');\n    b.t('set hilite of cd btn \"p1\" to \"c\" is in \"abc\"\\\\hilite of cd btn \"p1\"', 'true');\n    b.t('set label of cd btn \"p1\" to \"a\" & \"b\"\\\\label of cd btn \"p1\"', 'ab');\n    b.t('set label of cd btn \"p1\" to 1+1\\\\label of cd btn \"p1\"', '2');\n    b.t('set label of cd btn \"p1\" to 2*2\\\\label of cd btn \"p1\"', '4');\n    b.t(\n        'set label of cd btn \"p1\" to -(the number of chars in \"ab\")\\\\label of cd btn \"p1\"',\n        '-2'\n    );\n    b.t('set hilite of cd btn \"p1\" to (2 == 3)\\\\hilite of cd btn \"p1\"', 'false');\n    b.t('set hilite of cd btn \"p1\" to (3 > 2)\\\\hilite of cd btn \"p1\"', 'true');\n    b.batchEvaluate(h);\n});\nt.test('builtinFunctions', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    let b = new ScriptTestBatch();\n\n    /* RuleExprSource and RuleHSimpleContainer */\n    b.t('12', '12');\n    b.t('\"abc\"', 'abc');\n    b.t('put \"qwerty\" into cd fld \"p3\"\\\\cd fld \"p3\"', 'qwerty');\n    b.t('put \"\" into cd fld \"p3\"\\\\cd fld \"p3\"', '');\n    b.t('cd fld \"p4\"', 'ERR:element not found');\n    b.t('cd btn \"p1\"', 'ERR:we do not allow placing text');\n    b.t('cd btn \"p4\"', 'ERR:we do not allow placing text');\n\n    /* casing */\n    b.t('PUT 5 Into myVar\\\\myVar', '5');\n    b.t('3 * MYVAR', '15');\n    b.t('SUM(MYVAR, Myvar, myvar)', '15');\n\n    /* constants */\n    b.t('one', '1');\n    b.t('up', 'up');\n    b.t('cr', '\\n');\n    b.t('return', '\\n');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    /* length */\n    b.t('the length of \"\"', '0');\n    b.t('the length of \"abc\"', '3');\n    b.t('the length of (\"abc\" & cr & cr & cr)', '6');\n    b.t('the length of 12', '2');\n    b.t('the length of true', '4');\n    b.t('length(\"\")', '0');\n    b.t('length(\"abc\")', '3');\n    b.t('length(\"abc\" & cr & cr & cr)', '6');\n    b.t('length(12)', '2');\n    b.t('length(true)', '4');\n\n    /* counting chunks */\n    b.t('the number of chars in \"\"', '0');\n    b.t('the number of chars in \"  \"', '2');\n    b.t('the number of chars in \"abc\"', '3');\n    b.t('the number of chars in 12', '2');\n    b.t('the number of chars in true', '4');\n    b.t('the number of items in \"\"', '0');\n    b.t('the number of items in \"  \"', '0');\n    b.t('the number of items in \"a\"', '1');\n    b.t('the number of items in \"a,b,c\"', '3');\n    b.t('the number of lines in \"\"', '0');\n    b.t('the number of lines in \"  \"', '1');\n    b.t('the number of lines in \"a\"', '1');\n    b.t('the number of lines in (\"a\" & cr & \"b\" & cr & \"c\")', '3');\n    b.t('the number of words in \"\"', '0');\n    b.t('the number of words in \"  \"', '0');\n    b.t('the number of words in \"a\"', '1');\n    b.t('the number of words in \"a b c\"', '3');\n\n    /* counting objects */\n    b.t('the number of bgs', '3');\n    b.t('the number of bgs of this stack', '3');\n    b.t('the number of bgs of next stack', 'ERR:find this object');\n    b.t('the number of bgs of second stack', 'ERR:find this object');\n    b.t('the number of cds', '5');\n    b.t('the number of cds of this stack', '5');\n    b.t('the number of cds of this bg', '3');\n    b.t('the number of cds of bg 1', '1');\n    b.t('the number of cd btns', '2');\n    b.t('the number of cd flds', '3');\n    b.t('the number of cards', '5');\n    b.t('the number of cards of this stack', '5');\n    b.t('the number of cards of bg 1 of this stack', '1');\n    b.t('the number of cards of bg 1', '1');\n    b.t('the number of cards of bg 2', '3');\n    b.t('the number of cards of bg 3', '1');\n\n    /* ordinal and too-large ordinal */\n    b.t('the short id of first card', `${h.ids.cdA}`);\n    b.t('the short id of third card', `${h.ids.cdBC}`);\n    b.t('the short id of tenth card', `ERR:find that object`);\n\n    /* confirmed in emulator that it should throw */\n    b.t('the number of cards of bg 4', 'ERR:find this object');\n    b.t('the number of bgs', '3');\n    b.t('the number of bgs of this stack', '3');\n    b.t('selectedtext()', '');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* existence of objects */\n    b.t(`there _is_ a ${cProductName}`, 'true');\n    b.t(`there _is_ a the target`, 'true');\n    b.t(`there _is_ a me`, 'true');\n    b.t(`there _is_ a xyz`, 'ERR:variable found');\n    b.t(`there _is_ a this stack`, 'true');\n    b.t(`there _is_ a next stack`, 'false');\n    b.t(`there _is_ a second stack`, 'false');\n    b.t(`there _is_ a xyz stack`, 'ERR:parse err');\n\n    /* bg */\n    b.t(`there _is_ a bg 1`, 'true');\n    b.t(`there _is_ a bg 2`, 'true');\n    b.t(`there _is_ a bg 4`, 'false');\n    b.t(`there _is_ a bg id ${h.ids.bgB}`, 'true');\n    b.t(`there _is_ a bg id 99`, 'false');\n    b.t(`there _is_ a bg \"a\"`, 'true');\n    b.t(`there _is_ a bg \"notexist\"`, 'false');\n    b.t(`there _is_ a this bg`, 'true');\n    b.t(`there _is_ a next bg`, 'true');\n    b.t(`there _is_ a first bg`, 'true');\n    b.t(`there _is_ a tenth bg`, 'false');\n\n    /* card */\n    b.t(`there _is_ a card 1`, 'true');\n    b.t(`there _is_ a card 4`, 'true');\n    b.t(`there _is_ a card 8`, 'false');\n    b.t(`there _is_ a card id ${h.ids.cdBD}`, 'true');\n    b.t(`there _is_ a card id 99`, 'false');\n    b.t(`there _is_ a card \"a\"`, 'true');\n    b.t(`there _is_ a card \"notexist\"`, 'false');\n    b.t(`there _is_ a this card`, 'true');\n    b.t(`there _is_ a next card`, 'true');\n    b.t(`there _is_ a first card`, 'true');\n    b.t(`there _is_ a last card`, 'true');\n    b.t(`there _is_ a card 2 of this bg`, 'true');\n    b.t(`there _is_ a card 2 of bg 2`, 'true');\n    b.t(`there _is_ a card 2 of bg 1`, 'false');\n    b.t(`there _is_ a card \"d\" of bg 1`, 'false');\n    b.t(`there _is_ a card \"d\" of bg 2`, 'true');\n    b.t(`there _is_ a card \"d\" of bg 3`, 'true');\n\n    /* btn */\n    b.t(`there _is_ a cd btn 1`, 'true');\n    b.t(`there _is_ a cd btn 70`, 'false');\n    b.t(`there _is_ a cd btn \"p1\"`, 'true');\n    b.t(`there _is_ a cd btn \"p\"`, 'false');\n    b.t(`there _is_ a cd btn id ${h.ids.bBC1}`, 'true');\n    b.t(`there _is_ a cd btn id ${h.ids.bBD1}`, 'true');\n    b.t(`there _is_ a cd btn id 99`, 'false');\n    b.t(`there _is_ a cd btn \"p1\" of this cd`, 'true');\n    b.t(`there _is_ a cd btn \"p1\" of cd 2`, 'false');\n    b.t(`there _is_ a cd btn \"p1\" of next cd`, 'true');\n    b.t(`there _is_ a cd btn \"p1\" of cd \"d\" of bg 1`, 'false');\n    b.t(`there _is_ a cd btn \"p1\" of cd \"d\" of bg 2`, 'true');\n    b.t(`there _is_ a cd btn \"p1\" of cd \"d\" of bg 3`, 'true');\n\n    /* fld */\n    b.t(`there _is_ a cd fld 1`, 'true');\n    b.t(`there _is_ a cd fld 70`, 'false');\n    b.t(`there _is_ a cd fld \"p1\"`, 'true');\n    b.t(`there _is_ a cd fld \"p\"`, 'false');\n    b.t(`there _is_ a cd fld id ${h.ids.fBC1}`, 'true');\n    b.t(`there _is_ a cd fld id ${h.ids.fBD2}`, 'true');\n    b.t(`there _is_ a cd fld id 99`, 'false');\n    b.t(`there _is_ a cd fld \"p1\" of this cd`, 'true');\n    b.t(`there _is_ a cd fld \"p1\" of cd 2`, 'false');\n    b.t(`there _is_ a cd fld \"p1\" of next cd`, 'true');\n    b.t(`there _is_ a cd fld \"p2\" of cd \"d\" of bg 1`, 'false');\n    b.t(`there _is_ a cd fld \"p2\" of cd \"d\" of bg 2`, 'true');\n    b.t(`there _is_ a cd fld \"p2\" of cd \"d\" of bg 3`, 'false');\n    b.batchEvaluate(h, [TestMultiplierInvert]);\n    b = new ScriptTestBatch();\n\n    /* fn calls without parens */\n    b.t('the paramcount', '0');\n    b.t('the ParamCount', '0');\n    b.t('the params', '');\n    b.t('the result', '');\n\n    /* we now accept fn calls without parens. */\n    b.t('the screenrect', '0,0,928,416');\n    b.t('the sin', 'ERR:arg expected');\n    b.t('the offset', 'ERR:args expected');\n    b.t('the random', 'ERR:args expected');\n    b.t('round(100 * the sin of 2)', '91');\n    b.t('the xyz', 'ERR:no such function');\n    b.t('sin of 2', 'ERR:parse err');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* isolated */\n    b.t('diskspace()', `${100 * 1024 * 1024}`);\n    b.t('heapspace()', `${100 * 1024 * 1024}`);\n    b.t('stackspace()', `${100 * 1024 * 1024}`);\n    b.t('round(systemversion() * 100)', `755`);\n    b.t('random(1)', `1`);\n    b.t('random(2) is in \"12\"', `true`);\n    b.t('random(3) is in \"123\"', `true`);\n    b.t('random(0)', `ERR:value must be >= 1`);\n    b.t('random(-1)', `ERR:value must be >= 1`);\n    b.t('screenrect()', `0,0,${ScreenConsts.ScreenWidth},${ScreenConsts.ScreenHeight}`);\n    b.t('chartonum(\"\")', `0`);\n    b.t('chartonum(\"a\")', `97`);\n    b.t('chartonum(\"abc\")', `97`);\n    b.t('chartonum(numtochar(4567))', `4567`);\n    b.t('numtochar(0)', `ERR:numToChar must be`);\n    b.t('numtochar(3)', `\\x03`);\n    b.t('numtochar(97)', `a`);\n    b.t('numtochar(98)', `b`);\n    b.t('numtochar(4567)', `\\u11d7`);\n    b.t('offset(\"a\", \"abc\")', `1`);\n    b.t('offset(\"c\", \"abc\")', `3`);\n    b.t('offset(\"\", \"abc\")', `1`);\n    b.t('offset(\"x\", \"abc\")', `0`);\n    b.t('offset(\"abcd\", \"abc\")', `0`);\n    b.t('offset(\"abd\", \"abc\")', `0`);\n    b.t('offset(\"bcd\", \"abc\")', `0`);\n\n    /* math variadic */\n    b.t('max()', 'ERR:requires at least one');\n    b.t('min()', 'ERR:requires at least one');\n    b.t('sum()', 'ERR:requires at least one');\n    b.t('max(4,5,6)', '6');\n    b.t('max(6,5,4)', '6');\n    b.t('min(4,5,6)', '4');\n    b.t('min(6,5,4)', '4');\n    b.t('sum(4,5,6)', '15');\n    b.t('sum(1,2,3)', '6');\n    b.t('min(\"1,2,3\")', '1');\n    b.t('min(\"1,2,3,\")', '1'); /* confirmed in emulator */\n    b.t('min(\",1,2,3\")', '0');\n    b.t('min(\",1,2,3,\")', '0');\n    b.t('min(\"1,2,3,,\")', '0');\n    b.t('sum(\"\")', 'ERR:Wrong arguments'); /* confirmed in emulator */\n    b.t('sum(1)', '1');\n    b.t('sum(\"1\")', '1');\n    b.t('sum(\" 1 \")', '1');\n    b.t('sum(1,2)', '3');\n    b.t('sum(\"1,2\")', '3');\n    b.t('sum(1,\" 2 \")', '3');\n    b.t('sum(\" 1 \",2)', '3');\n    b.t('sum(\" 1 \",\" 2 \")', '3');\n    b.t('sum(\" 1 , 2 \")', '3');\n    b.t('sum(\"1a\")', 'ERR:wanted numbers');\n    b.t('sum(\"1 a\")', 'ERR:wanted numbers');\n    b.t('sum(\"1 , 2a\")', 'ERR:wanted numbers');\n    b.t('sum(\"1 , 2 a\")', 'ERR:wanted numbers');\n    b.t('sum(\"1,2\")', '3');\n    b.t('sum(\"1,2,\")', '3');\n    b.t('sum(\"1,2, \")', '3');\n    b.t('sum(\",1,2\")', '3');\n    b.t('sum(\"1,2,,\")', '3');\n    b.t('sum(\" ,1,2,,\")', '3');\n    b.t('sum(\" , 1 , 2 , , \")', '3');\n\n    /* with \"the\" */\n    b.t('the diskspace()', `ERR:parse err`);\n    b.t('the diskspace', `${100 * 1024 * 1024}`);\n    b.t('the abs(123)', 'ERR:parse err');\n    b.t('abs(123)', '123');\n    b.t('offset(\"c\", \"abc\")', '3');\n\n    /* reading the time */\n    b.t('ticks() - ticks() >= 0', 'true');\n    b.t('the ticks - the ticks >= 0', 'true');\n    b.t('seconds() - seconds() >= 0', 'true');\n    b.t('the seconds - the seconds >= 0', 'true');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* isolated, math */\n    /* abs */\n    b.t('abs(0)', '0');\n    b.t('abs(-123)', '123');\n    b.t('abs(123)', '123');\n\n    /* round */\n    b.t('round(3.9)', '4');\n    b.t('round(4)', '4');\n    b.t('round(4.4)', '4');\n    b.t('round(4.49)', '4');\n    b.t('round(4.51)', '5');\n    b.t('round(4.6)', '5');\n    b.t('round(4.5)', '4');\n    b.t('round(5.5)', '6');\n    b.t('round(6.5)', '6');\n    b.t('round(7.5)', '8');\n    b.t('round(-0.5)', '0');\n    b.t('round(-1.5)', '-2');\n    b.t('round(-2.5)', '-2');\n    b.t('round(-3.5)', '-4');\n\n    /* trunc */\n    b.t('trunc(4.5)', '4');\n    b.t('trunc(4.6)', '4');\n    b.t('trunc(4.4)', '4');\n    b.t('trunc(4)', '4');\n    b.t('trunc(3.9)', '3');\n    b.t('trunc(-0)', '0');\n    b.t('trunc(-0.3)', '0');\n    b.t('trunc(-1.7)', '-1');\n\n    /* unlike the original product, we throw errors */\n    b.t('4/0', 'ERR:> 1e18');\n    b.t('0/0', 'ERR:> 1e18');\n    b.t('\"1.0\"/\"0.0\"', 'ERR:> 1e18');\n    b.t('sqrt(-3)', 'ERR:> 1e18');\n    b.t('ln(-400)', 'ERR:> 1e18');\n    b.t('ln1(-400)', 'ERR:> 1e18');\n    b.t('log2(-400)', 'ERR:> 1e18');\n\n    /* isolated, needs floating point compare */\n    b.t('atan(5)', '1.373400766945016');\n    b.t('atan(6)', '1.4056476493802699');\n    b.t('sin(5)', '-0.9589242746631385');\n    b.t('sin(6)', '-0.27941549819892586');\n    b.t('cos(5)', '0.28366218546322625');\n    b.t('cos(6)', '0.9601702866503661');\n    b.t('tan(5)', '-3.380515006246586');\n    b.t('tan(6)', '-0.29100619138474915');\n    b.t('ln(5)', '1.6094379124341003');\n    b.t('ln(6)', '1.791759469228055');\n    b.t('ln1(5)', '1.791759469228055');\n    b.t('ln1(6)', '1.9459101490553132');\n    b.t('log2(5)', '2.321928094887362');\n    b.t('log2(6)', '2.584962500721156');\n    b.t('exp(5)', '148.4131591025766');\n    b.t('exp(6)', '403.4287934927351');\n    b.t('exp1(5)', '147.4131591025766');\n    b.t('exp1(6)', '402.4287934927351');\n    b.t('exp2(5)', '32');\n    b.t('exp2(6)', '64');\n    b.t('sqrt(5)', '2.23606797749979');\n    b.t('sqrt(6)', '2.449489742783178');\n\n    /* round trip */\n    b.t('ln(6)', '1.791759469228055');\n    b.t('exp(1.791759469228055)', '6');\n    b.t('ln1(6)', '1.9459101490553132');\n    b.t('exp1(1.9459101490553132)', '6');\n    b.t('log2(5)', '2.321928094887362');\n    b.t('exp2(2.321928094887362)', '5');\n\n    b.batchEvaluate(h, [], BatchType.floatingPoint);\n    b = new ScriptTestBatch();\n\n    /* unknown */\n    b.t('xyz()', 'ERR:no handler');\n    b.t('xyz(1)', 'ERR:no handler');\n    b.t('xyz(1,2)', 'ERR:no handler');\n\n    /* uses outside world */\n    b.t('cmdkey()', 'up');\n    b.t('commandkey()', 'up');\n    b.t('optionkey()', 'up');\n    b.t('shiftkey()', 'up');\n    b.t('mouse()', `up`);\n    b.t('mouseclick()', `false`);\n    b.t('param(0)', ``);\n    b.t('param(1)', ``);\n    b.t('param(2)', ``);\n    b.t('paramcount()', `0`);\n    b.t('params()', ``);\n    b.t('result()', ``);\n    b.t('tool()', `browse`);\n\n    /* compatibility with old code/tutorial code */\n    b.t('put the clickH() into x\\\\1', `1`);\n    b.t('put the clickV() into y\\\\1', `1`);\n    b.t('put the clickLoc() into xy\\\\1', `1`);\n\n    /* casing */\n    b.t('SHIFTKEY()', `up`);\n    b.t('ShIfTkEy()', `up`);\n    b.t('sHiFtKeY()', `up`);\n    b.batchEvaluate(h);\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptExprLvl.ts",
    "content": "\n/* auto */ import { VpcValN } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { BatchType, ScriptTestBatch, TestMultiplierCommutative, TestMultiplierInvert, TestMultiplierInvertLeaveUnderscores, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { VpcStateSerialize } from './../../vpcui/state/vpcStateSerialize';\n/* auto */ import { VpcState } from './../../vpcui/state/vpcState';\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './../../vpc/vel/velStack';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { cProductName, vpcVersion } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { specialCharFontChange } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper, assertAsserts, assertThrows } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test running ViperCard scripts that evaluate simple computation expressions.\n *\n * the syntax for a \"test batch\" is a tuple\n * [{script expression}, {expected result}]\n * for example, the following test passes:\n * ['1 + 1', '2']\n *\n * if you are testing a more complex expression or\n * command, you can write multiple lines, and use \\\\\n * at the end of the string to indicate what should be compared,\n * for example,\n *  ['put 1 + 1 into x\\\\x', '2']\n *\n *  or even\n *  ['put 1 into a \\n put a + 1 into x\\\\x', '2']\n * the \\\\x means to evaluate x and compare it with 2.\n *\n *\n * use testBatchEvalInvertAndCommute to comfirm all four permutations,\n * since if a == b, we also confirm that\n * b == a, a != b, and b != a\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionScriptExprLvl');\nexport let testCollectionScriptExprLvl = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBaseForScriptExpr>();\n\nt.atest('--init--testScriptExprLvl', async () => {\n    h = new TestVpcScriptRunBaseForScriptExpr(t);\n    return h.initEnvironment();\n});\n\nt.test('evalRuleExpr,RuleLvl1', () => {\n    let b = new ScriptTestBatch();\n\n    /* basic tests */\n    b.t('123', '123');\n    b.t('1 + 2', '3');\n    b.t('\"abc\"', 'abc');\n    b.t('1 + xyz', 'ERR:no variable found with this name');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* RuleExpr and/or with data types */\n    b.t('true _and_ \"true\"', 'true');\n    b.t('true _and_ \"true \"', 'true');\n    b.t('true _and_ \"true    \"', 'true');\n    b.t('true _and_ \" true\"', 'ERR:expected true or false');\n    b.t('true _and_ 1', 'ERR:expected true or false');\n    b.t('1 _and_ true', 'ERR:expected true or false');\n    b.t('1 _and_ 1', 'ERR:expected true or false');\n\n    /* RuleExpr and /or */\n    b.t('true _and_ true', 'true');\n    b.t('true _and_ false', 'false');\n    b.t('false _and_ false', 'false');\n    b.t('true _or_ true', 'true');\n    b.t('true _or_ false', 'true');\n    b.t('false _or_ false', 'false');\n\n    b.batchEvaluate(h, [TestMultiplierCommutative]);\n    b = new ScriptTestBatch();\n\n    /* Lvl1Expression greater less, strings */\n    b.t('\"abc\" _>=_ \"abc\"', 'true');\n    b.t('\"abc\" _>=_ \"abb\"', 'true');\n    b.t('\"abc\" _>=_ \"abd\"', 'false');\n    b.t('\"abc\" _>=_ \"ab\"', 'true');\n    b.t('\"abc\" _>=_ \"ab \"', 'true');\n    b.t('\"abc\" _>=_ \"abcd\"', 'false');\n    b.t('\"abc\" _>=_ \"abc \"', 'false');\n    b.t('\"abc\" _>=_ \" abc\"', 'true');\n    b.t('\"abc\" _>_ \"abc\"', 'false');\n    b.t('\"abc\" _>_ \"abb\"', 'true');\n    b.t('\"abc\" _>_ \"abd\"', 'false');\n    b.t('\"abc\" _>_ \"ab\"', 'true');\n    b.t('\"abc\" _>_ \"ab \"', 'true');\n    b.t('\"abc\" _>_ \"abcd\"', 'false');\n    b.t('\"abc\" _>_ \"abc \"', 'false');\n    b.t('\"abc\" _>_ \" abc\"', 'true');\n\n    /* Lvl1Expression eq, strings */\n    b.t('\"abc\" _=_ \"abc\"', 'true');\n    b.t('\"abc\" _=_ \"abb\"', 'false');\n    b.t('\"abc\" _=_ \"abc \"', 'false');\n    b.t('\"abc\" _==_ \"abc\"', 'true');\n    b.t('\"abc\" _==_ \"abb\"', 'false');\n    b.t('\"abc\" _==_ \"abc \"', 'false');\n    b.t('\"abc\" _is_ \"abc\"', 'true');\n    b.t('\"abc\" _is_ \"abb\"', 'false');\n    b.t('\"abc\" _is_ \"abc \"', 'false');\n\n    b.batchEvaluate(h, [TestMultiplierInvertLeaveUnderscores, TestMultiplierCommutative]);\n    b = new ScriptTestBatch();\n\n    /* Lvl1Expression string/number differences */\n    b.t('\"z11\" _>_ \"z2\"', 'false');\n    b.t('\"z11\" _>_ \"z2 \"', 'false');\n    b.t('\"z 11\" _>_ \"z 2\"', 'false');\n    b.t('\"11 a\" _>_ \"2 a\"', 'false');\n    b.t('\"11e\" _>_ \"2e\"', 'false');\n    b.t('\"11:\" _>_ \"2:\"', 'false');\n    b.t('11 _>_ 2', 'true');\n    b.t('\"11\" _>_ \"2\"', 'true');\n    b.t('\"11\" _>_ \"2 \"', 'true');\n    b.t('\"11 \" _>_ \"2 \"', 'true');\n    b.t('\" 11 \" _>_ \" 2 \"', 'true');\n    b.t('\"z11\" _>=_ \"z2\"', 'false');\n    b.t('\"z11\" _>=_ \"z2 \"', 'false');\n    b.t('\"z 11\" _>=_ \"z 2\"', 'false');\n    b.t('\"11 a\" _>=_ \"2 a\"', 'false');\n    b.t('\"11e\" _>=_ \"2e\"', 'false');\n    b.t('\"11:\" _>=_ \"2:\"', 'false');\n    b.t('11 _>=_ 2', 'true');\n    b.t('\"11\" _>=_ \"2\"', 'true');\n    b.t('\"11\" _>=_ \"2 \"', 'true');\n    b.t('\"11 \" _>=_ \"2 \"', 'true');\n    b.t('\" 11 \" _>=_ \" 2 \"', 'true');\n\n    /* Lvl1Expression greater less, numbers */\n    b.t('4 _>=_ 4', 'true');\n    b.t('4.1 _>=_ 4', 'true');\n    b.t('3.9 _>=_ 4', 'false');\n    b.t('\"4.000\" _>=_ 4', 'true');\n    b.t('\"00004\" _>=_ 4', 'true');\n    b.t('4 _>=_ -4', 'true');\n    b.t('-4 _>=_ -4', 'true');\n    b.t('-4 _>=_ \"-4\"', 'true');\n    b.t('-4 _>=_ \" -0004.000 \"', 'true');\n    b.t('4 _>_ 4', 'false');\n    b.t('4.1 _>_ 4', 'true');\n    b.t('3.9 _>_ 4', 'false');\n    b.t('\"4.000\" _>_ 4', 'false');\n    b.t('\"00004\" _>_ 4', 'false');\n    b.t('4 _>_ -4', 'true');\n    b.t('-4 _>_ -4', 'false');\n    b.t('-4 _>_ \"-4\"', 'false');\n    b.t('-4 _>_ \" -0004.000 \"', 'false');\n\n    /* Lvl1Expression equality and inequality, see also vpcutils test of VpcEvalHelpers */\n    b.t('456 _=_ 456', 'true');\n    b.t('456 _=_ \" 456 \"', 'true');\n    b.t('456 _=_ \" 456\"', 'true');\n    b.t('456 _=_ \"456 \"', 'true');\n    b.t('456 _=_ 457', 'false');\n    b.t('456 _=_ \" 457 \"', 'false');\n    b.t('456 _=_ 00456.000', 'true');\n    b.t('456 _=_ \"00456.000\"', 'true');\n    b.t('456 _=_ \" 00456.000 \"', 'true');\n    b.t('456 _=_ \" 00456..000 \"', 'false');\n    b.t('456 _=_ \" 00456.0.00 \"', 'false');\n    b.t('456 _=_ \" 00456.000. \"', 'false');\n    b.t('456 _=_ \"  456.0000000001 \"', 'true');\n    b.t('456 _=_ \"  455.9999999999 \"', 'true');\n\n    /* prefix, suffix */\n    b.t('123 _=_ 123', 'true');\n    b.t('123 _=_ 1234', 'false');\n    b.t('123 _=_ 12', 'false');\n    b.t('123 _=_ -123', 'false');\n\n    /* different tokens with same meaning */\n    b.t('123 _=_ 123', 'true');\n    b.t('123 _=_ 124', 'false');\n    b.t('123 _=_ \" 123 \"', 'true');\n    b.t('123 _=_ 0', 'false');\n    b.t('123 _==_ 123', 'true');\n    b.t('123 _==_ 124', 'false');\n    b.t('123 _==_ \" 123 \"', 'true');\n    b.t('123 _==_ 0', 'false');\n    b.t('123 _is_ 123', 'true');\n    b.t('123 _is_ 124', 'false');\n    b.t('123 _is_ \" 123 \"', 'true');\n    b.t('123 _is_ 0', 'false');\n\n    b.batchEvaluate(h, [TestMultiplierInvertLeaveUnderscores, TestMultiplierCommutative]);\n    b = new ScriptTestBatch();\n\n    /* test chaining or any other that can't easily be unverted */\n    b.t('true and true and true', 'true');\n    b.t('true and true and true and true', 'true');\n    b.t('true and true and false', 'false');\n\n    /* Lvl1Expression contains, strings */\n    b.t('\"abc\" contains \"abc\"', 'true');\n    b.t('\"abc\" contains \"abd\"', 'false');\n    b.t('\"abc\" contains \"ab\"', 'true');\n    b.t('\"abc\" contains \"c\"', 'true');\n    b.t('\"abc\" contains \"d\"', 'false');\n    b.t('\"abc\" contains \"\"', 'true');\n    b.t('\"ab\" contains \"abc\"', 'false');\n    b.t('\"c\" contains \"abc\"', 'false');\n    b.t('\"d\" contains \"abc\"', 'false');\n    b.t('\"\" contains \"abc\"', 'false');\n\n    /* can be chained, visitor code is more elegant if this is allowed */\n    b.t('12 == 13 == 14', 'false');\n    b.t('12 == 12 == true', 'true');\n    b.t('12 == 12 == \"true\"', 'true');\n    b.t('12 == 13 == true', 'false');\n    b.t('12 == 12 == false', 'false');\n\n    b.batchEvaluate(h);\n});\nt.test('evalExprConfirmFailure', () => {\n    /* succeeds */\n    let b = new ScriptTestBatch();\n    b.t('true and true', 'true');\n    b.t('true and false', 'false');\n    b.t('1 is a integer', 'true');\n    b.t('1 is a integer1', 'ERR:needs one of');\n    b.batchEvaluate(h);\n\n    /* fails, wrong result */\n    assertAsserts('Un|', 'DIFF RESULT', () => {\n        b = new ScriptTestBatch();\n        b.t('true and false', 'true');\n        b.batchEvaluate(h);\n    });\n    /* fails, runtime err */\n    assertAsserts('Um|', 'needs one of', () => {\n        b = new ScriptTestBatch();\n        b.t('1 is a integer1', 'true');\n        b.batchEvaluate(h);\n    });\n    /* fails, runtime err with wrong message */\n    assertAsserts('Ul|', 'wrong err message', () => {\n        b = new ScriptTestBatch();\n        b.t('1 is a integer1', 'ERR:(incorrectmessage)');\n        b.batchEvaluate(h);\n    });\n    /* runtime err expected but not got */\n    assertAsserts('Uk|', 'error not seen', () => {\n        b = new ScriptTestBatch();\n        b.t('true and false', 'ERR:(incorrectmessage)');\n        b.batchEvaluate(h);\n    });\n    /* fails, wrong result, lower */\n    assertAsserts('Q)|', 'DIFF RESULT', () => {\n        b = new ScriptTestBatch();\n        b.t('true and true', 'true');\n        b.t('true and false', 'true');\n        b.batchEvaluate(h);\n    });\n    /* fails, runtime err, lower */\n    assertAsserts('Q(|', 'needs one of', () => {\n        b = new ScriptTestBatch();\n        b.t('true and true', 'true');\n        b.t('1 is a integer1', 'true');\n        b.batchEvaluate(h);\n    });\n    /* fails, runtime err with wrong message, lower */\n    assertAsserts('Q&|', 'wrong err message', () => {\n        b = new ScriptTestBatch();\n        b.t('true and true', 'true');\n        b.t('1 is a integer1', 'ERR:(incorrectmessage)');\n        b.batchEvaluate(h);\n    });\n    /* runtime err expected but not got, lower */\n    assertAsserts('Q%|', 'error not seen', () => {\n        b = new ScriptTestBatch();\n        b.t('true and true', 'true');\n        b.t('true and false', 'ERR:(incorrectmessage)');\n        b.batchEvaluate(h);\n    });\n});\nt.test('evalRuleLvl2', () => {\n    let b = new ScriptTestBatch();\n\n    /* Lvl2Expression, type check, invalid keywords */\n    b.t('1 is a number1', 'ERR:needs one of {number|');\n    b.t('1 is a numbe', 'ERR:needs one of {number|');\n    b.t('1 is a abcdef', 'ERR:needs one of {number|');\n    b.t('1 is a n', 'ERR:needs one of {number|');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* Lvl2Expression, type check */\n    b.t('12 _is_ a number', 'true');\n    b.t('12.0 _is_ a number', 'true');\n    b.t('12.01 _is_ a number', 'true');\n    b.t('\" 12 \" _is_ a number', 'true');\n    b.t('\" 0012.00 \" _is_ a number', 'true');\n    b.t('\" 0012.01 \" _is_ a number', 'true');\n    b.t('\" 12a \" _is_ a number', 'false');\n    b.t('\" 12 a \" _is_ a number', 'false');\n    b.t('\" a12 \" _is_ a number', 'false');\n    b.t('\" a 12 \" _is_ a number', 'false');\n    b.t('12 _is_ a integer', 'true');\n    b.t('12.0 _is_ a integer', 'true');\n    b.t('12.01 _is_ a integer', 'false');\n    b.t('\" 12 \" _is_ a integer', 'true');\n    b.t('\" 0012.00 \" _is_ a integer', 'true');\n    b.t('\" 0012.01 \" _is_ a integer', 'false');\n    b.t('\" 12a \" _is_ a integer', 'false');\n    b.t('\" 12 a \" _is_ a integer', 'false');\n    b.t('\" a12 \" _is_ a integer', 'false');\n    b.t('\" a 12 \" _is_ a integer', 'false');\n    b.t('true _is_ a logical', 'true');\n    b.t('false _is_ a logical', 'true');\n    b.t('\"true\" _is_ a logical', 'true');\n    b.t('\"false\" _is_ a logical', 'true');\n    b.t('\" true\" _is_ a logical', 'false');\n\n    /* a bit weird, but confirmed in original product */\n    b.t('\"true \" _is_ a logical', 'true');\n    b.t('(\"true\" & cr) _is_ a logical', 'true');\n    b.t('(\"true\" & tab) _is_ a logical', 'true');\n    b.t('(\"true   \" & cr & cr & cr & tab & tab & tab) _is_ a logical', 'true');\n    b.t('\"truea\" _is_ a logical', 'false');\n    b.t('\"true a\" _is_ a logical', 'false');\n    b.t('\"true true\" _is_ a logical', 'false');\n    b.t('\"atrue\" _is_ a logical', 'false');\n    b.t('\"a true\" _is_ a logical', 'false');\n    b.t('\"trub\" _is_ a logical', 'false');\n    b.t('\"tru\" _is_ a logical', 'false');\n    b.t('\" false\" _is_ a logical', 'false');\n    b.t('\"false \" _is_ a logical', 'true');\n    b.t('\"\" _is_ a point', 'false');\n    b.t('\"12\" _is_ a point', 'false');\n    b.t('\"12,12\" _is_ a point', 'true');\n    b.t('\"12,a12\" _is_ a point', 'false');\n    b.t('\"12,12a\" _is_ a point', 'false');\n    b.t('\"a12,12\" _is_ a point', 'false');\n    b.t('\"12a,12\" _is_ a point', 'false');\n    b.t('\"12.0, 12.0\" _is_ a point', 'true');\n    b.t('\"12.01, 12\" _is_ a point', 'false');\n    b.t('\" 12 , 12 \" _is_ a point', 'true');\n    b.t('\" 12 , 0012.00 \" _is_ a point', 'true');\n    b.t('\" 12 , 0012.01 \" _is_ a point', 'false');\n    b.t('\" 0012.00, 12  \" _is_ a point', 'true');\n    b.t('\" 0012.01, 12  \" _is_ a point', 'false');\n    b.t('\" 12,12,12 \" _is_ a point', 'false');\n    b.t('\" 12,12,12,12 \" _is_ a point', 'false');\n    b.t('\" 12,12 a \" _is_ a point', 'false');\n    b.t('\" a 12,12 \" _is_ a point', 'false');\n    b.t('\" , 12,12 \" _is_ a point', 'false');\n    b.t('\" 12,12 , \" _is_ a point', 'false');\n    b.t('\"\" _is_ a rect', 'false');\n    b.t('\"12\" _is_ a rect', 'false');\n    b.t('\"12,12\" _is_ a rect', 'false');\n    b.t('\"12,12,12\" _is_ a rect', 'false');\n    b.t('\"12,12,12,12\" _is_ a rect', 'true');\n    b.t('\"12,12,12,12,12\" _is_ a rect', 'false');\n    b.t('\"12a,12,12,12\" _is_ a rect', 'false');\n    b.t('\"12,12a,12,12\" _is_ a rect', 'false');\n    b.t('\"12,12,12a,12\" _is_ a rect', 'false');\n    b.t('\"12,12,12,12a\" _is_ a rect', 'false');\n    b.t('\"12.0, 13.0, 14.0, 15.0\" _is_ a rect', 'true');\n    b.t('\"12.0, 13., 14, 15\" _is_ a rect', 'true');\n    b.t('\"12.01, 13, 14, 15\" _is_ a rect', 'false');\n    b.t('\" 12 , 13 , 14 , 15 \" _is_ a rect', 'true');\n    b.t('\" 12 , 0013.00 , 14, 15\" _is_ a rect', 'true');\n    b.t('\" 12 , 0013.01 , 14, 15\" _is_ a rect', 'false');\n    b.t('\" 0012.00, 13 , 14, 15\" _is_ a rect', 'true');\n    b.t('\" 0012.01, 13 , 14, 15\" _is_ a rect', 'false');\n    b.t('(cr & \"12,13,14,15\" & cr) _is_ a rect', 'true');\n    b.t('\" 12,13,14,15 a \" _is_ a rect', 'false');\n    b.t('\" a 12,13,14,15 \" _is_ a rect', 'false');\n    b.t('\" , 12,13,14,15 \" _is_ a rect', 'false');\n    b.t('\" 12,13,14,15 , \" _is_ a rect', 'false');\n\n    b.batchEvaluate(h, [TestMultiplierInvert]);\n    b = new ScriptTestBatch();\n\n    /* Lvl2Expression, is within */\n    b.t('\"\" _is_ in \"abc\"', 'true');\n    b.t('\"a\" _is_ in \"abc\"', 'true');\n    b.t('\"c\" _is_ in \"abc\"', 'true');\n    b.t('\"bc\" _is_ in \"abc\"', 'true');\n    b.t('\"bc \" _is_ in \"abc\"', 'false');\n    b.t('\" bc\" _is_ in \"abc\"', 'false');\n    b.t('\"x\" _is_ in \"abc\"', 'false');\n    b.t('\"abc\" _is_ in \"abc\"', 'true');\n    b.t('\"abd\" _is_ in \"abc\"', 'false');\n    b.t('\"abcd\" _is_ in \"abc\"', 'false');\n    b.t('\"abdd\" _is_ in \"abc\"', 'false');\n    b.t('\"\" _is_ within \"abc\"', 'true');\n    b.t('\"a\" _is_ within \"abc\"', 'true');\n    b.t('\"c\" _is_ within \"abc\"', 'true');\n    b.t('\"bc\" _is_ within \"abc\"', 'true');\n    b.t('\"bc \" _is_ within \"abc\"', 'false');\n    b.t('\" bc\" _is_ within \"abc\"', 'false');\n    b.t('\"x\" _is_ within \"abc\"', 'false');\n    b.t('\"abc\" _is_ within \"abc\"', 'true');\n    b.t('\"abd\" _is_ within \"abc\"', 'false');\n    b.t('\"abcd\" _is_ within \"abc\"', 'false');\n    b.t('\"abdd\" _is_ within \"abc\"', 'false');\n\n    b.batchEvaluate(h, [TestMultiplierInvert]);\n});\nt.test('evalRuleLvl3', () => {\n    /* lvl3 expressions */\n    let b = new ScriptTestBatch();\n    b.t('\"\" & \"\"', '');\n    b.t('\"\" & \"abc\"', 'abc');\n    b.t('\"abc\" & \"\"', 'abc');\n    b.t('\"abc\" & \"def\"', 'abcdef');\n    b.t('1 & 2', '12');\n    b.t('1 & \"abc\"', '1abc');\n    b.t('\"abc\" & 1', 'abc1');\n    b.t('1 & true', '1true');\n    b.t('true & 1', 'true1');\n    b.t('\"\" && \"\"', ' ');\n    b.t('\"\" && \"abc\"', ' abc');\n    b.t('\"abc\" && \"\"', 'abc ');\n    b.t('\"abc\" && \"def\"', 'abc def');\n    b.t('1 && 2', '1 2');\n    b.t('1 && \"abc\"', '1 abc');\n    b.t('\"abc\" && 1', 'abc 1');\n    b.t('1 && true', '1 true');\n    b.t('true && 1', 'true 1');\n\n    /* chained */\n    b.t('\"a\" & \"b\" & \"c\" & \"d\"', 'abcd');\n    b.t('\"a\" & \"b\" && \"c\" & \"d\"', 'ab cd');\n    b.t('\"a\" && \"b\" && \"c\" && \"d\"', 'a b c d');\n    b.t('\"a\" && \"b\" && \"c\"', 'a b c');\n\n    b.batchEvaluate(h);\n});\nt.test('evalArithmetic', () => {\n    /* the communitative ones, integer */\n    let b = new ScriptTestBatch();\n    b.t('12 _+_ 34', '46');\n    b.t('12 _+_ \" 34 \"', '46');\n    b.t('12 _+_ \" 0034.00 \"', '46');\n    b.t('1 _+_ 200000', '200001');\n    b.t('1 _+_ 2', '3');\n    b.t('1 _+_ -1', '0');\n    b.t('123 _+_ 0', '123');\n    b.t('123 _+_ -0', '123');\n    b.t('12 _*_ 34', '408');\n    b.t('12 _*_ \" 34 \"', '408');\n    b.t('12 _*_ \" 0034.00 \"', '408');\n    b.t('2 _*_ 200000', '400000');\n    b.t('2 _*_ 2', '4');\n    b.t('1 _*_ -1', '-1');\n    b.t('123 _*_ 0', '0');\n    b.t('123 _*_ -0', '0');\n\n    b.batchEvaluate(h, [TestMultiplierCommutative]);\n    b = new ScriptTestBatch();\n\n    /* the communitative ones, floating point */\n    b.t('12 _+_ 34.1', '46.1');\n    b.t('12 _+_ \" 34.1 \"', '46.1');\n    b.t('12.7 _+_ \" 0034.00 \"', '46.7');\n    b.t('1.7 _+_ 200000', '200001.7');\n    b.t('1.1 _+_ 2.2', '3.3');\n    b.t('1.1 _+_ -1.1', '0');\n    b.t('123.9 _+_ 0', '123.9');\n    b.t('123.9 _+_ -0', '123.9');\n    b.t('12 _*_ 34.1', '409.2');\n    b.t('12 _*_ \" 34.1 \"', '409.2');\n    b.t('12 _*_ \" 0034.01 \"', '408.12');\n    b.t('2 _*_ 200000.1', '400000.2');\n    b.t('2.2 _*_ 2.4', '5.28');\n    b.t('1.1 _*_ -1', '-1.1');\n    b.t('123.9 _*_ 0', '0');\n    b.t('123.9 _*_ -0', '0');\n    b.batchEvaluate(h, [TestMultiplierCommutative], BatchType.floatingPoint);\n    b = new ScriptTestBatch();\n\n    /* the non-commutive ones integer */\n    b.t('12 - 34', '-22');\n    b.t('12 - \" 34 \"', '-22');\n    b.t('12 - \" 0034.00 \"', '-22');\n    b.t('1 - 200000', '-199999');\n    b.t('1 - 2', '-1');\n    b.t('1 - -1', '2');\n    b.t('123 - 0', '123');\n    b.t('123 - -0', '123');\n    b.t('12 ^ 3', '1728');\n    b.t('12 ^ \" 3 \"', '1728');\n    b.t('12 ^ \" 003.00 \"', '1728');\n    b.t('2 ^ 5', '32');\n    b.t('2 ^ 2', '4');\n    b.t('1 ^ -1', '1');\n    b.t('123 ^ 0', '1');\n    b.t('123 ^ -0', '1');\n    b.t('34 div 5', '6');\n    b.t('34 div 12', '2');\n    b.t('34 div \" 12 \"', '2');\n    b.t('34 div \" 0012.00 \"', '2');\n    b.t('2 div 200000', '0');\n    b.t('2 div 2', '1');\n    b.t('1 div -1', '-1');\n    b.t('123 div 0', 'ERR:> 1e18');\n    b.t('123 div -0', 'ERR:> 1e18');\n    b.t('34 mod 5', '4');\n    b.t('34 mod 12', '10');\n    b.t('34 mod \" 12 \"', '10');\n    b.t('34 mod \" 0012.00 \"', '10');\n    b.t('2 mod 200000', '2');\n    b.t('2 mod 2', '0');\n    b.t('1 mod -1', '0');\n    b.t('123 mod 0', 'ERR:> 1e18');\n    b.t('123 mod -0', 'ERR:> 1e18');\n\n    /* negative numbers */\n    b.t('34 div 5', '6');\n    b.t('34 div -5', '-6');\n    b.t('-34 div 5', '-6');\n    b.t('-34 div -5', '6');\n    b.t('34 mod 5', '4');\n    b.t('34 mod -5', '4');\n    b.t('-34 mod 5', '-4');\n    b.t('-34 mod -5', '-4');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* the non-commutive ones floating point */\n    b.t('12.1 - 3.4', '8.7');\n    b.t('12.1 - 34', '-21.9');\n    b.t('12.1 - \" 34 \"', '-21.9');\n    b.t('12.1 - \" 0034.00 \"', '-21.9');\n    b.t('1.9 - 200000', '-199998.1');\n    b.t('1.9 - 2', '-0.100000');\n    b.t('1.9 - -1', '2.9');\n    b.t('123.4 - 0', '123.4');\n    b.t('123.4 - -0', '123.4');\n\n    /* the non-commutive ones exponent */\n    b.t('12 ^ 13', '106993205379072');\n    b.t('12 ^ \" 13 \"', '106993205379072');\n    b.t('12 ^ \" 0013.00 \"', '106993205379072');\n    b.t('12 ^ 34', 'ERR:> 1e18');\n    b.t('12.1 ^ 3.4', '4802.531908907492');\n    b.t('12.1 ^ \" 3.4 \"', '4802.531908907492');\n    b.t('12.1 ^ \" 003.400 \"', '4802.531908907492');\n    b.t('2.1 ^ 7', '180.10885410000003');\n    b.t('2.1 ^ 2', '4.41');\n    b.t('1.9 ^ -1', '0.5263157894736842');\n    b.t('123.4 ^ 0', '1');\n    b.t('123.4 ^ -0', '1');\n    b.t('34.5 / 5', '6.9');\n    b.t('34.5 / 12', '2.875');\n    b.t('34.5 / \" 12 \"', '2.875');\n    b.t('34.5 / \" 0012.00 \"', '2.875');\n    b.t('2.1 / 200000', '0.000010500');\n    b.t('2.1 / 2', '1.05');\n    b.t('1.9 / -1', '-1.9');\n    b.t('123.4 / 0', 'ERR:> 1e18');\n    b.t('123.4 / -0', 'ERR:> 1e18');\n    b.t('12 div 2.3', '5');\n    b.t('12 mod 2.3', '0.5');\n\n    b.batchEvaluate(h, [], BatchType.floatingPoint);\n    b = new ScriptTestBatch();\n\n    /* old-style functions should not eat too much.\n    confirmed these in the emulator */\n    b.t('length (\"abc\") > 1', 'true');\n    b.t('the length of \"abc\" > 1', 'true');\n    b.t('the length of \"a\" is a number', 'true');\n    b.t('the length of 10 + 1', '3');\n    b.t('the length of \"ab\" / 2', '1');\n    b.t('the length of - 12', '3');\n    b.t('the length of not true', '5');\n    b.t('the length of (10 + 1)', '2');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* test chained */\n    b.t('12 + 34 + 56 + 78', '180');\n    b.t('12 + 34 + 56', '102');\n    b.t('12 + 34 - 56 + 78', '68');\n    b.t('12 - 34 - 56 - 78', '-156');\n    b.t('12 * 34 * 56 * 78', '1782144');\n    b.t('12 * 34 * 56', '22848');\n    b.t('12 * 34 / 56 * 78', '568.285714285714285');\n    b.t('12 / 34 / 56 / 78', '0.00008080155');\n\n    b.batchEvaluate(h, [], BatchType.floatingPoint);\n    b = new ScriptTestBatch();\n\n    /* test wrong types given (commutative works) */\n    b.t('12 _+_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _+_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _+_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _-_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _-_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _-_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _*_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _*_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _*_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _/_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _/_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _/_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _^_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _^_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _^_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _div_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _div_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _div_ \"12.3.\"', 'ERR:expected a number');\n    b.t('12 _mod_ \"12a\"', 'ERR:expected a number');\n    b.t('12 _mod_ \"12 a\"', 'ERR:expected a number');\n    b.t('12 _mod_ \"12.3.\"', 'ERR:expected a number');\n\n    b.batchEvaluate(h, [TestMultiplierCommutative]);\n});\nt.test('evalRuleLvl6', () => {\n    let b = new ScriptTestBatch();\n\n    /* parens */\n    b.t('12', '12');\n    b.t('(12)', '12');\n    b.t('((12))', '12');\n    b.t('((12.123))', '12.123');\n\n    /* negative */\n    b.t('-12', '-12');\n    b.t('-(-12)', '12');\n    b.t('-(-(-12))', '-12');\n    b.t('-0', '0');\n    b.t('-0.0', '0');\n    b.t('- \"12\"', '-12');\n    b.t('- \" 12 \"', '-12');\n    b.t('- \" 12a \"', 'ERR:expected a number');\n    b.t('- \" a12 \"', 'ERR:expected a number');\n\n    /* positive (intentionally disabled) */\n    b.t('+12', 'ERR:\"+\" in the wrong place');\n    b.t('+(+12)', 'ERR:\"+\" in the wrong place');\n    b.t('+(+(+12))', 'ERR:\"+\" in the wrong place');\n    b.t('+0', 'ERR:\"+\" in the wrong place');\n    b.t('+0.0', 'ERR:\"+\" in the wrong place');\n    b.t('+ \"12\"', 'ERR:\"+\" in the wrong place');\n    b.t('+ \" 12 \"', 'ERR:\"+\" in the wrong place');\n    b.t('+ \" 12a \"', 'ERR:\"+\" in the wrong place');\n    b.t('+ \" a12 \"', 'ERR:\"+\" in the wrong place');\n\n    /* logical not */\n    b.t('not true', 'false');\n    b.t('not (not true)', 'true');\n    b.t('not (not (not true))', 'false');\n    b.t('not false', 'true');\n    b.t('not (1 is 2)', 'true');\n    b.t('not \"true\"', 'false');\n    b.t('not \"true \"', 'false');\n    b.t('not \"tru\"', 'ERR:expected true or false');\n    b.t('not \" true\"', 'ERR:expected true or false');\n    b.t('not \"truea\"', 'ERR:expected true or false');\n    b.t('not \"atrue\"', 'ERR:expected true or false');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* chunk */\n    b.t('set the itemdelimiter to \",\" \\\\ \"abc\"', 'abc');\n    b.t('char 1 of \"abc\"', 'a');\n    b.t('char 3 of \"abc\"', 'c');\n    b.t('char 1 to 3 of \"abcd\"', 'abc');\n    b.t('char 2 to 4 of \"abcd\"', 'bcd');\n    b.t('item 1 of \"a,b,c\"', 'a');\n    b.t('item 3 of \"a,b,c\"', 'c');\n    b.t('item 1 to 3 of \"a,b,c,d\"', 'a,b,c');\n    b.t('item 2 to 4 of \"a,b,c,d\"', 'b,c,d');\n    b.t('line 1 of \"a\" & cr & \"b\" & cr & \"c\"', 'a\\nb\\nc');\n    b.t('line 1 of (\"a\" & cr & \"b\" & cr & \"c\")', 'a');\n    b.t('line 3 of (\"a\" & cr & \"b\" & cr & \"c\")', 'c');\n    b.t('line 1 to 3 of (\"a\" & cr & \"b\" & cr & \"c\")', 'a\\nb\\nc');\n    b.t('line 2 to 4 of (\"a\" & cr & \"b\" & cr & \"c\")', 'b\\nc');\n    b.t('word 1 of \"a b c\"', 'a');\n    b.t('word 3 of \"a b c\"', 'c');\n    b.t('word 1 to 3 of \"a b c d\"', 'a b c');\n    b.t('word 2 to 4 of \"a b c d\"', 'b c d');\n\n    /* chunk on non strings */\n    b.t('char 1 of true', 't');\n    b.t('char 3 of true', 'u');\n    b.t('char 1 of 1234', '1');\n    b.t('char 3 of 1234', '3');\n\n    /* everything */\n    b.t('not word 2 of \"a true b\"', 'false');\n    b.t('not word 2 of (\"a true b\")', 'false');\n    b.t('not (word 2 of (\"a true b\"))', 'false');\n    b.t('- word 2 of \"a 3 b\"', '-3');\n    b.t('- word 2 of (\"a 3 b\")', '-3');\n    b.t('- (word 2 of (\"a 3 b\"))', '-3');\n    b.t('- char 2 to 3 of \"1234\"', '-23');\n    b.t('- char 2 to 3 of (\"1234\")', '-23');\n    b.t('- (char 2 to 3 of (\"1234\"))', '-23');\n\n    /* composite chunks, currently needs parens */\n    b.t('char 2 of (item 2 of \"abc,def,ghi\")', 'e');\n    b.t('char 2 of (word 2 of (item 2 of \"abc,d1 e2 f3,ghi\"))', '2');\n    b.t(\n        longstr(\n            `char 2 of (word 2 of (item 2 of (line 2\n                    of (\"abc def\" & newline & \"abc,d1 e2 f3,ghi\"))))`\n        ),\n        '2'\n    );\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* different chunk types */\n    b.t('char 1 to 3 of \"abcd\"', 'abc');\n    b.t('first char of \"abcd\"', 'a');\n    b.t('the first char of \"abcd\"', 'a');\n    b.t('second char of \"abcd\"', 'b');\n    b.t('the second char of \"abcd\"', 'b');\n    b.t('(\"|\" & any char of \"abcd\" & \"|\") is in \"|a|b|c|d|\"', 'true');\n\n    /* all OrdinalOrPosition on short */\n    b.t('first char of \"abcd\"', 'a');\n    b.t('second char of \"abcd\"', 'b');\n    b.t('third char of \"abcd\"', 'c');\n    b.t('fourth char of \"abcd\"', 'd');\n    b.t('fifth char of \"abcd\"', '');\n    b.t('sixth char of \"abcd\"', '');\n    b.t('seventh char of \"abcd\"', '');\n    b.t('eighth char of \"abcd\"', '');\n    b.t('ninth char of \"abcd\"', '');\n    b.t('tenth char of \"abcd\"', '');\n    b.t('middle char of \"abcd\"', 'c');\n    b.t('last char of \"abcd\"', 'd');\n\n    /* all OrdinalOrPosition on long */\n    b.t('first char of \"abcdefghijk\"', 'a');\n    b.t('second char of \"abcdefghijk\"', 'b');\n    b.t('third char of \"abcdefghijk\"', 'c');\n    b.t('fourth char of \"abcdefghijk\"', 'd');\n    b.t('fifth char of \"abcdefghijk\"', 'e');\n    b.t('sixth char of \"abcdefghijk\"', 'f');\n    b.t('seventh char of \"abcdefghijk\"', 'g');\n    b.t('eighth char of \"abcdefghijk\"', 'h');\n    b.t('ninth char of \"abcdefghijk\"', 'i');\n    b.t('tenth char of \"abcdefghijk\"', 'j');\n    b.t('middle char of \"abcdefghijk\"', 'f');\n    b.t('last char of \"abcdefghijk\"', 'k');\n\n    /* item and word OrdinalOrPosition */\n    b.t('first item of \"ab,cd,ef,gh\"', 'ab');\n    b.t('second item of \"ab,cd,ef,gh\"', 'cd');\n    b.t('middle item of \"ab,cd,ef,gh\"', 'ef');\n    b.t('last item of \"ab,cd,ef,gh\"', 'gh');\n    b.t('first word of \"ab cd ef gh\"', 'ab');\n    b.t('second word of \"ab cd ef gh\"', 'cd');\n    b.t('middle word of \"ab cd ef gh\"', 'ef');\n    b.t('last word of \"ab cd ef gh\"', 'gh');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* chunk expressions */\n    b.t('put 2 into x\\\\char x of \"abcd\"', 'b');\n    b.t('put 2 into x\\nput 3 into y\\\\char x to y of \"abcd\"', 'bc');\n    b.t('put 2 into x\\\\char (x) of \"abcd\"', 'b');\n    b.t('put 2 into x\\nput 3 into y\\\\char (x) to (y) of \"abcd\"', 'bc');\n    b.t('put 2 into x\\\\char (x+1) of \"abcd\"', 'c');\n    b.t('put 2 into x\\nput 3 into y\\\\char (x+1) to (y+1) of \"abcd\"', 'cd');\n    b.t('put 2 into x\\\\char 2 of \"abcd\"', 'b');\n    b.t('put 2 into x\\nput 3 into y\\\\char 2 to y of \"abcd\"', 'bc');\n    b.t('put 2 into x\\\\char (x+(1*2)) of \"abcd\"', 'd');\n    b.t('put 2 into x\\\\char x + 1 of \"abcd\"', 'ERR:5:NoViableAlt');\n    b.t('put 2 into x\\nput 3 into y\\\\char x to y + 1 of \"abcd\"', 'ERR:6:NoViableAlt');\n    b.t('put 2 into x\\\\char -x of \"abcd\"', 'ERR:5:NoViableAlt');\n    b.t('put 2 into x\\nput 3 into y\\\\char x to -y of \"abcd\"', 'ERR:6:NoViableAlt');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    /* order of operations */\n    b.t('2 * 3 + 4', '10');\n    b.t('2 + 3 * 4', '14');\n    b.t('2 * (3 + 4)', '14');\n    b.t('(2 + 3) * 4', '20');\n    b.t('2 * 3 & 4', '64');\n    b.t('2 & 3 * 4', '212');\n    b.t('2 * (3 & 4)', '68');\n    b.t('(2 & 3) * 4', '92');\n    b.t('2 == 3 is a logical', 'false');\n    b.t('(2 == 3) is a logical', 'true');\n    b.t('2 == (3 is a logical)', 'false');\n    b.t('false and true is within \"false\"', 'false');\n    b.t('(false and true) is within \"false\"', 'true');\n    b.t('false and (true is within \"false\")', 'false');\n\n    /* cycling through all expression levels */\n    b.t('false and false and false', 'false');\n    b.t('false and false and (false)', 'false');\n    b.t('false and (false and (false and (false)))', 'false');\n    b.t('false or (false or (false or (true)))', 'true');\n\n    /* no short-circuit evaluation */\n    b.t('the autohilite of cd btn \"p1\"', 'true');\n    b.t('the autohilite of cd btn \"notexist\"', 'ERR:could not find');\n    b.t(\n        '(the autohilite of cd btn \"p1\") or (the autohilite of cd btn \"notexist\")',\n        'ERR:could not find'\n    );\n    b.t('the locktext of cd fld \"p1\"', 'false');\n    b.t('the locktext of cd fld \"notexist\"', 'ERR:could not find');\n    b.t(\n        '(the locktext of cd fld \"p1\") and (the locktext of cd fld \"notexist\")',\n        'ERR:could not find'\n    );\n\n    b.t(\n        `put counting() into cfirst\nget true or char 1 of counting() is \"z\"\\\\counting() - cfirst`,\n        '2'\n    );\n    b.t(\n        `put counting() into cfirst\nget false and char 1 of counting() is \"z\"\\\\counting() - cfirst`,\n        '2'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('vpcvalnumbers', () => {\n    assertThrows('L`|', '> 1e18', () => VpcValN(Infinity));\n    assertThrows('L_|', '> 1e18', () => VpcValN(Number.POSITIVE_INFINITY));\n    assertThrows('L^|', '> 1e18', () => VpcValN(-Infinity));\n    assertThrows('L]|', '> 1e18', () => VpcValN(Number.NEGATIVE_INFINITY));\n    assertThrows('L[|', '> 1e18', () => VpcValN(NaN));\n    assertThrows('L@|', '> 1e18', () => VpcValN(1 / 0));\n    assertThrows('L?|', '> 1e18', () => VpcValN(0 / 0));\n    assertThrows('L>|', '> 1e18', () => VpcValN(3 % 0));\n    let b = new ScriptTestBatch();\n\n    /* scientific notation applied for num literals */\n    b.t('12', '12');\n    b.t('12.', '12');\n    b.t('12.e0', '12');\n    b.t('12.0e0', '12');\n    b.t('12.0e+0', '12');\n    b.t('12.0e-0', '12');\n    b.t('12.0e+1', '120');\n    b.t('12.0e1', '120');\n    b.t('12.0e-1', '1.2');\n    b.t('12.0e+2', '1200');\n    b.t('12.0e2', '1200');\n    b.t('12.0e-2', '0.12');\n\n    /* arithmetic can't be done with large numbers */\n    /* because most JS engines kick out to scientific notation */\n    /* for large numbers and I don't really want to support those as valid numbers. */\n    b.t('2e10', '20000000000');\n    b.t('2e17', '200000000000000000');\n    b.t('2e18', 'ERR:> 1e18');\n    b.t('2e20', 'ERR:> 1e18');\n    b.t('2^80', 'ERR:> 1e18');\n    b.t('2e15 * 2e15', 'ERR:> 1e18');\n    b.t('-2e10', '-20000000000');\n    b.t('-2e17', '-200000000000000000');\n    b.t('-2e18', 'ERR:> 1e18');\n    b.t('-2e20', 'ERR:> 1e18');\n    b.t('-(2^80)', 'ERR:> 1e18');\n    b.t('2e15 * -2e15', 'ERR:> 1e18');\n    b.t('(2e20 + 3e10)/(4e17)', 'ERR:> 1e18');\n    b.t('(2^80 - 5^35)/(2e22)', 'ERR:> 1e18');\n\n    b.batchEvaluate(h, [], BatchType.floatingPoint);\n    b = new ScriptTestBatch();\n\n    /* scientific notation not applied for strings */\n    b.t('\"12.e0\"', '12.e0');\n    b.t('\"12.0e0\"', '12.0e0');\n    b.t('\"12.0e+1\"', '12.0e+1');\n    b.t('\"12.0e-1\"', '12.0e-1');\n\n    /* number way too large */\n    b.t('\"3e99\" is a number', 'false');\n    b.t('3e99 is a number', 'ERR:> 1e18');\n    b.t('\"3e99\" is a integer', 'false');\n    b.t('3e99 is a integer', 'ERR:> 1e18');\n    b.t('3e99', 'ERR:> 1e18');\n    b.t('1 + \"3e99\"', 'ERR:expected a number');\n    b.t('1 + 3e99', 'ERR:expected a number');\n    b.t('strToNumber(\"3e99\")', 'false');\n    b.t('set the left of cd btn \"p1\" to 3e99\\\\0', 'ERR:> 1e18');\n\n    /* number possible w most js engines, but we disallow to be conservative */\n    b.t('\"2e19\" is a number', 'false');\n    b.t('2e19 is a number', 'ERR:> 1e18');\n    b.t('\"2e19\" is a integer', 'false');\n    b.t('2e19 is a integer', 'ERR:> 1e18');\n    b.t('2e19', 'ERR:> 1e18');\n    b.t('1 + \"2e19\"', 'ERR:expected a number');\n    b.t('1 + 2e19', 'ERR:expected a number');\n    b.t('strToNumber(\"2e19\")', 'false');\n    b.t('set the left of cd btn \"p1\" to 2e19\\\\0', 'ERR:> 1e18');\n\n    /* number possible w most js engines, but we disallow to be conservative */\n    b.t('\"20000000000000000000\" is a number', 'false');\n    b.t('20000000000000000000 is a number', 'ERR:> 1e18');\n    b.t('\"20000000000000000000\" is a integer', 'false');\n    b.t('20000000000000000000 is a integer', 'ERR:> 1e18');\n    b.t('20000000000000000000', 'ERR:> 1e18');\n    b.t('1 + \"20000000000000000000\"', 'ERR:expected a number');\n    b.t('1 + 20000000000000000000', 'ERR:expected a number');\n    b.t('strToNumber(\"20000000000000000000\")', 'false');\n    b.t('set the left of cd btn \"p1\" to 20000000000000000000\\\\0', 'ERR:> 1e18');\n\n    /* number that we support as numeric, but not as an integer */\n    b.t('\"200000000000000000\" is a number', 'true');\n    b.t('200000000000000000 is a number', 'true');\n    b.t('\"200000000000000000\" is a integer', 'false');\n    b.t('200000000000000000 is a integer', 'false');\n    b.t('200000000000000000', '200000000000000000');\n    b.t(\n        '1 + \"200000000000000000\"',\n        '200000000000000000'\n    ); /* that's why it's not an int lol */\n    b.t(\n        '1 + 200000000000000000',\n        '200000000000000000'\n    ); /* that's why it's not an int lol */\n    b.t('strToNumber(\"200000000000000000\")', '200000000000000000');\n    b.t(\n        'set the left of cd btn \"p1\" to 200000000000000000\\\\0',\n        'ERR:expected an integer'\n    );\n\n    /* number that we support as numeric, but not as an integer */\n    b.t('\"2e17\" is a number', 'false');\n    b.t('2e17 is a number', 'true');\n    b.t('\"2e17\" is a integer', 'false');\n    b.t('2e17 is a integer', 'false');\n    b.t('2e17', '200000000000000000');\n    b.t('1 + \"2e17\"', 'ERR:expected a number');\n    b.t('1 + 2e17', '200000000000000000'); /* that's why it's not an int lol */\n    b.t('strToNumber(\"2e17\")', '200000000000000000');\n    b.t('set the left of cd btn \"p1\" to 2e17\\\\0', 'ERR:expected an integer');\n\n    /* number that we support as numeric, but not as an integer */\n    b.t('\"2147483649\" is a number', 'true');\n    b.t('2147483649 is a number', 'true');\n    b.t('\"2147483649\" is a integer', 'false');\n    b.t('2147483649 is a integer', 'false');\n    b.t('2147483649', '2147483649');\n    b.t('1 + \"2147483649\"', '2147483650');\n    b.t('1 + 2147483649', '2147483650');\n    b.t('strToNumber(\"2147483649\")', '2147483649');\n    b.t('set the left of cd btn \"p1\" to 2147483649\\\\0', 'ERR:expected an integer');\n\n    /* number that we support as an integer */\n    b.t('\"2147483640\" is a number', 'true');\n    b.t('2147483640 is a number', 'true');\n    b.t('\"2147483640\" is a integer', 'true');\n    b.t('2147483640 is a integer', 'true');\n    b.t('1 + \"2147483640\"', '2147483641');\n    b.t('1 + 2147483640', '2147483641');\n    b.t('strToNumber(\"2147483640\")', '2147483640');\n    b.t('set the left of cd btn \"p1\" to 2147483640\\\\0', '0');\n\n    /* number that we support as an integer */\n    b.t('\"3.3e2\" is a number', 'false');\n    b.t('3.3e2 is a number', 'true');\n    b.t('\"3.3e2\" is a integer', 'false');\n    b.t('3.3e2 is a integer', 'true');\n    b.t('1 + \"3.3e2\"', 'ERR:expected a number');\n    b.t('1 + 3.3e2', '331');\n    b.t('strToNumber(\"3.3e2\")', '330');\n    b.t('set the left of cd btn \"p1\" to 3.3e2\\\\0', '0');\n\n    /* small scientitific notation */\n    b.t('\"3.3e2\" = \"330\"', 'false');\n    b.t('3.3e2 = \"330\"', 'true');\n    b.t('\"334.56\" = \"3.3456e2\"', 'false');\n    b.t('\"334.56\" = 3.3456e2', 'true');\n    b.t('3.3456e2 is a integer', 'false');\n    b.t('3.3456e2 is a number', 'true');\n    b.t('strToNumber(\"3.3456e2\") = \"334.56\"', 'true');\n    b.t('strToNumber(\"3.3456e2\") = 334.56', 'true');\n    b.t('strToNumber(3.3456e2) = \"334.56\"', 'true');\n    b.t('strToNumber(3.3456e2) = 334.56', 'true');\n\n    b.batchEvaluate(h, [], BatchType.default);\n});\nt.test('ModelGetById.should throw if not found', () => {\n    assertEq(undefined, h.vcstate.model.findByIdUntyped('111'), 'HM|');\n    assertEq(h.ids.cdA, h.vcstate.model.findByIdUntyped(h.ids.cdA)?.idInternal, 'HL|');\n    assertEq(\n        h.ids.stack,\n        h.vcstate.model.findByIdUntyped(h.ids.stack)?.idInternal,\n        'HK|'\n    );\n    assertThrows('L=|', 'not found', () => h.vcstate.model.getByIdUntyped('111'));\n    assertEq(h.ids.cdA, h.vcstate.model.getByIdUntyped(h.ids.cdA).idInternal, 'HJ|');\n    assertEq(h.ids.stack, h.vcstate.model.getByIdUntyped(h.ids.stack).idInternal, 'HI|');\n});\nt.test('ModelFindById.when exists and given correct type', () => {\n    assertEq(\n        VpcElType.Stack,\n        h.vcstate.model.findById(VpcElStack, h.ids.stack)?.getType(),\n        'HH|'\n    );\n    assertEq(\n        VpcElType.Card,\n        h.vcstate.model.findById(VpcElCard, h.ids.cdA)?.getType(),\n        'HG|'\n    );\n    assertEq(\n        VpcElType.Btn,\n        h.vcstate.model.findById(VpcElButton, h.ids.bBC1)?.getType(),\n        'HF|'\n    );\n    assertEq(\n        VpcElType.Stack,\n        h.vcstate.model.getById(VpcElStack, h.ids.stack).getType(),\n        'HE|'\n    );\n    assertEq(VpcElType.Card, h.vcstate.model.getCardById(h.ids.cdA).getType(), 'HD|');\n    assertEq(\n        VpcElType.Btn,\n        h.vcstate.model.getById(VpcElButton, h.ids.bBC1).getType(),\n        'HC|'\n    );\n});\nt.test('ModelFindById.when exists and given incorrect type', () => {\n    assertThrows('L<|', 'cast exception', () =>\n        h.vcstate.model.findById(VpcElCard, h.ids.stack)\n    );\n    assertThrows('L;|', 'cast exception', () =>\n        h.vcstate.model.findById(VpcElButton, h.ids.cdA)\n    );\n    assertThrows('L:|', 'cast exception', () =>\n        h.vcstate.model.findById(VpcElStack, h.ids.bBC1)\n    );\n    assertThrows('L/|', 'cast exception', () => h.vcstate.model.getCardById(h.ids.stack));\n    assertThrows('L.|', 'cast exception', () =>\n        h.vcstate.model.getById(VpcElButton, h.ids.cdA)\n    );\n    assertThrows('L-|', 'cast exception', () =>\n        h.vcstate.model.getById(VpcElStack, h.ids.bBC1)\n    );\n});\nt.test('ModelFindById.when not exists', () => {\n    assertEq(undefined, h.vcstate.model.findById(VpcElCard, '111'), 'HB|');\n    assertEq(undefined, h.vcstate.model.findById(VpcElStack, '111'), 'HA|');\n    assertEq(undefined, h.vcstate.model.findById(VpcElCard, ''), 'H9|');\n    assertEq(undefined, h.vcstate.model.findById(VpcElStack, ''), 'H8|');\n    assertThrows('L,|', 'not found', () => h.vcstate.model.getCardById('111'));\n    assertThrows('L+|', 'not found', () => h.vcstate.model.getById(VpcElStack, '111'));\n    assertThrows('L*|', 'not found', () => h.vcstate.model.getCardById(''));\n    assertThrows('L)|', 'not found', () => h.vcstate.model.getById(VpcElStack, ''));\n});\nt.atest('testVpcStateSerialize', async () => {\n    let txt = FormattedText.newFromUnformatted('');\n    h.vcstate.vci.doWithoutAbilityToUndo(() => {\n        txt = h.modifyVcState();\n    });\n\n    /* serialize */\n    let serializedJson = VpcStateSerialize.serializeAll(h.vcstate.vci);\n    let s = JSON.stringify(serializedJson);\n    let restoredJson = JSON.parse(s);\n\n    /* test raw json */\n    assertEq('vpc', restoredJson.product, 'H7|');\n    assertEq(3, restoredJson.fileformatmajor, 'H6|');\n    assertEq(0, restoredJson.fileformatminor, 'H5|');\n    assertEq(vpcVersion, restoredJson.buildnumber, 'H4|');\n    assertEq(h.vcstate.vci.getModel().uuid, restoredJson.uuid, 'H3|');\n\n    /* do the full restore, as if opening from disk */\n    let newProv = new VpcIntroProvider(s, 'docName', VpcDocumentLocation.FromJsonFile);\n    let newStateBoth = await newProv.loadDocumentTop();\n    assertTrue(newStateBoth[0], 'Q#|');\n    assertTrue(newStateBoth[1], 'Q!|');\n    let newState = newStateBoth[1];\n\n    /* test that it has everything */\n    h.testModelHasItAll(newState);\n    h.testModelBgPartProps(newState);\n\n    /* check productOpts (should not be persisted) */\n    assertTrue(newState.model.productOpts.getN('optPaintLineColor') !== 1234, 'H2|');\n    assertEq(true, newState.model.productOpts.getB('optUseHostClipboard'), 'Q |');\n    assertEq(cProductName, newState.model.productOpts.getS('name'), 'H0|');\n    assertEq(h.ids.cdA, newState.model.productOpts.getS('currentCardId'), 'G~|');\n\n    /* check stack */\n    assertEq(`on t1\\nend t1`, newState.model.stack.getS('script'), 'G}|');\n    assertEq(`stackname`, newState.model.stack.getS('name'), 'G||');\n\n    /* check bg */\n    let newBg = newState.model.getById(VpcElBg, h.ids.bgB);\n    assertEq(`on t2\\nend t2`, newBg.getS('script'), 'G{|');\n    assertEq(`paint2`, newBg.getS('paint'), 'G`|');\n\n    /* check card */\n    let newCard = newState.model.getCardById(h.ids.cdBC);\n    assertEq(`on t3\\nend t3`, newCard.getS('script'), 'G_|');\n    assertEq(`paint3`, newCard.getS('paint'), 'G^|');\n\n    /* check button */\n    let newBtn = newState.model.getById(VpcElButton, h.ids.bBC1);\n    assertEq(true, newBtn.getB('checkmark'), 'G]|');\n    assertEq(false, newBtn.getB('enabled'), 'G[|');\n    assertEq(123, newBtn.getN('icon'), 'G@|');\n    assertEq('symbol', newBtn.getS('textfont'), 'G?|');\n    assertEq('on t4\\nend t4', newBtn.getS('script'), 'G>|');\n\n    /* check field */\n    let newFld = newState.model.getById(VpcElField, h.ids.fBD1);\n    assertEq(true, newFld.getB('dontwrap'), 'G=|');\n    assertEq(false, newFld.getB('enabled'), 'G<|');\n    assertEq(123, newFld.getN('scroll'), 'G;|');\n    assertEq('center', newFld.getS('textalign'), 'G:|');\n    assertEq('on t5\\nend t5', newFld.getS('script'), 'G/|');\n\n    /* check FormattedText */\n    let newTxt = newFld.getFmTxt();\n    assertTrue(newTxt.len() > 0, 'G.|');\n    assertEq(txt.toSerialized(), newTxt.toSerialized(), 'G-|');\n});\n\n/**\n * a TestVpcScriptRunBase with new features for testing expression levels.\n */\nclass TestVpcScriptRunBaseForScriptExpr extends TestVpcScriptRunBase {\n    testModelBgPartProps(newState: VpcState) {\n        /**\n         * some properties on background elements can have values stored per-card,\n         * which has its own logic and needs to be tested\n         */\n\n        /* we'll be setting sharedtext and sharedhilite a few times, so for convenience\n        allow setting data throughout */\n        h.vcstate.vci.doWithoutAbilityToUndo(() => {});\n    }\n\n    /**\n     * make changes to elements, that we'll read later\n     */\n    modifyVcState() {\n        /* modify productOpts (should not be persisted) */\n        h.vcstate.model.productOpts.setProductOpt('optPaintLineColor', 1234);\n        h.vcstate.model.productOpts.setProductOpt('optUseHostClipboard', false);\n        h.vcstate.model.productOpts.setProductOpt('name', `productname`);\n        h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n        let higher = h.vcstate.model;\n\n        /* modify stack */\n        h.vcstate.model.stack.setOnVel('script', `on t1\\nend t1`, higher);\n        h.vcstate.model.stack.setOnVel('name', `stackname`, higher);\n\n        /* modify bg */\n        let bg = h.vcstate.model.getById(VpcElBg, h.ids.bgB);\n        bg.setOnVel('script', `on t2\\nend t2`, higher);\n        bg.setOnVel('paint', `paint2`, higher);\n\n        /* modify card */\n        let card = h.vcstate.model.getCardById(h.ids.cdBC);\n        card.setOnVel('script', `on t3\\nend t3`, higher);\n        card.setOnVel('paint', `paint3`, higher);\n\n        /* modify button */\n        let btn = h.vcstate.model.getById(VpcElButton, h.ids.bBC1);\n        btn.setOnVel('checkmark', true, higher);\n        btn.setOnVel('enabled', false, higher);\n        btn.setOnVel('icon', 123, higher);\n        btn.setOnVel('textfont', 'symbol', higher);\n        btn.setOnVel('script', 'on t4\\nend t4', higher);\n\n        /* modify field */\n        let fld = h.vcstate.model.getById(VpcElField, h.ids.fBD1);\n        fld.setOnVel('dontwrap', true, higher);\n        fld.setOnVel('enabled', false, higher);\n        fld.setOnVel('scroll', 123, higher);\n        fld.setOnVel('textalign', 'center', higher);\n        fld.setOnVel('script', 'on t5\\nend t5', higher);\n\n        /* set a nontrivial FormattedText */\n        let c = specialCharFontChange;\n        let txt = FormattedText.newFromSerialized(`${c}f1${c}abc\\n${c}f2${c}de`);\n        fld.setFmTxt(txt, higher);\n\n        //~ /* modify bg field - for card bb */\n        //~ let bgfld = h.vcstate.model.getById(VpcElField, h.ids.bgfB1);\n        //~ bgfld.set('sharedtext', false);\n        //~ bgfld.setCardFmTxt(h.ids.cdBB, FormattedText.newFromSerialized(`forbb`));\n        //~ bgfld.setProp('scroll', VpcValN(123), h.ids.cdBB);\n\n        //~ /* modify bg field - for card bc */\n        //~ bgfld.setCardFmTxt(h.ids.cdBC, FormattedText.newFromSerialized(`forbc`));\n        //~ bgfld.setProp('scroll', VpcValN(456), h.ids.cdBC);\n\n        //~ /* modify bg field - shared contents */\n        //~ bgfld.set('sharedtext', true);\n        //~ bgfld.setCardFmTxt(\n        //~ h.ids.cdBC,\n        //~ FormattedText.newFromSerialized(`forshared`)\n        //~ );\n        //~ bgfld.setProp('scroll', VpcValN(789), h.ids.cdBC);\n        //~ bgfld.set('sharedtext', false);\n\n        //~ /* modify bg btn - for card bb */\n        //~ let bgbtn = h.vcstate.model.getById(VpcElButton, h.ids.bgbB1);\n        //~ bgbtn.set('sharedhilite', false);\n        //~ bgbtn.setProp('hilite', VpcValBoolea(true), h.ids.cdBB);\n        //~ bgbtn.setProp('checkmark', VpcValBoolea(false), h.ids.cdBB);\n\n        //~ /* modify bg btn - for card bc */\n        //~ bgbtn.setProp('hilite', VpcValBoolea(false), h.ids.cdBC);\n        //~ bgbtn.setProp('checkmark', VpcValBoolea(true), h.ids.cdBC);\n\n        //~ /* modify bg btn - shared contents */\n        //~ bgbtn.set('sharedhilite', true);\n        //~ bgbtn.setProp('hilite', VpcValBoolea(true), h.ids.cdBC);\n        //~ bgbtn.setProp('checkmark', VpcValBoolea(true), h.ids.cdBC);\n        //~ bgbtn.setProp('hilite', VpcValBoolea(true), h.ids.cdBD);\n        //~ bgbtn.setProp('checkmark', VpcValBoolea(true), h.ids.cdBD);\n        //~ bgbtn.set('sharedhilite', false);\n\n        return txt;\n    }\n\n    /**\n     * ensure that the new model has all expected vels,\n     * with correct parents and children in the right order\n     */\n    testModelHasItAll(newState: VpcState) {\n        assertEq(h.ids.stack, newState.model.stack.idInternal, 'G,|');\n        let bgParents = newState.model.stack.bgs.map(bg => bg.parentIdInternal).join(',');\n        assertEq(`${h.ids.stack},${h.ids.stack},${h.ids.stack}`, bgParents, 'G+|');\n        let bgIds = newState.model.stack.bgs.map(bg => bg.idInternal).join(',');\n        assertEq(`${h.ids.bgA},${h.ids.bgB},${h.ids.bgC}`, bgIds, 'G*|');\n        let bgNames = newState.model.stack.bgs.map(bg => bg.getS('name')).join(',');\n        assertEq(`a,b,c`, bgNames, 'G)|');\n\n        let bgA = newState.model.getById(VpcElBg, h.ids.bgA);\n        let cdParents = bgA.cards.map(cd => cd.parentIdInternal).join(',');\n        assertEq(`${h.ids.bgA}`, cdParents, 'G(|');\n        let cdIds = bgA.cards.map(cd => cd.idInternal).join(',');\n        assertEq(`${h.ids.cdA}`, cdIds, 'G&|');\n        let cdNames = bgA.cards.map(cd => cd.getS('name')).join(',');\n        assertEq(`a`, cdNames, 'G%|');\n\n        let bgB = newState.model.getById(VpcElBg, h.ids.bgB);\n        cdParents = bgB.cards.map(cd => cd.parentIdInternal).join(',');\n        assertEq(`${h.ids.bgB},${h.ids.bgB},${h.ids.bgB}`, cdParents, 'G$|');\n        cdIds = bgB.cards.map(cd => cd.idInternal).join(',');\n        assertEq(`${h.ids.cdBB},${h.ids.cdBC},${h.ids.cdBD}`, cdIds, 'G#|');\n        cdNames = bgB.cards.map(cd => cd.getS('name')).join(',');\n        assertEq(`b,c,d`, cdNames, 'G!|');\n\n        let bgC = newState.model.getById(VpcElBg, h.ids.bgC);\n        cdParents = bgC.cards.map(cd => cd.parentIdInternal).join(',');\n        assertEq(`${h.ids.bgC}`, cdParents, 'G |');\n        cdIds = bgC.cards.map(cd => cd.idInternal).join(',');\n        assertEq(`${h.ids.cdCD}`, cdIds, 'Gz|');\n        cdNames = bgC.cards.map(cd => cd.getS('name')).join(',');\n        assertEq(`d`, cdNames, 'Gy|');\n\n        let cd_a_a = newState.model.getCardById(h.ids.cdA);\n        let ptParents = cd_a_a.parts.map(pt => pt.parentIdInternal).join(',');\n        assertEq(`${h.ids.cdA}`, ptParents, 'Gx|');\n        let ptIds = cd_a_a.parts.map(pt => pt.idInternal).join(',');\n        assertEq(`${h.ids.go}`, ptIds, 'Gw|');\n        let ptNames = cd_a_a.parts.map(pt => pt.getS('name')).join(',');\n        assertEq(`go`, ptNames, 'Gv|');\n\n        let cd_b_b = newState.model.getCardById(h.ids.cdBB);\n        ptParents = cd_b_b.parts.map(pt => pt.parentIdInternal).join(',');\n        assertEq(``, ptParents, 'Gu|');\n        ptIds = cd_b_b.parts.map(pt => pt.idInternal).join(',');\n        assertEq(``, ptIds, 'Gt|');\n        ptNames = cd_b_b.parts.map(pt => pt.getS('name')).join(',');\n        assertEq(``, ptNames, 'Gs|');\n\n        let cd_b_c = newState.model.getCardById(h.ids.cdBC);\n        ptParents = cd_b_c.parts.map(pt => pt.parentIdInternal).join(',');\n        assertEq(\n            longstr(\n                `${h.ids.cdBC},${h.ids.cdBC},\n            ${h.ids.cdBC},${h.ids.cdBC},${h.ids.cdBC}`,\n                ''\n            ),\n            ptParents,\n            'Gr|'\n        );\n        ptIds = cd_b_c.parts.map(pt => pt.idInternal).join(',');\n        assertEq(\n            longstr(\n                `${h.ids.fBC1},${h.ids.fBC2},\n            ${h.ids.fBC3},${h.ids.bBC1},${h.ids.bBC2}`,\n                ''\n            ),\n            ptIds,\n            'Gq|'\n        );\n        ptNames = cd_b_c.parts.map(pt => pt.getS('name')).join(',');\n        assertEq(`p1,p2,p3,p1,p2`, ptNames, 'Gp|');\n\n        let cd_b_d = newState.model.getCardById(h.ids.cdBD);\n        ptParents = cd_b_d.parts.map(pt => pt.parentIdInternal).join(',');\n        assertEq(`${h.ids.cdBD},${h.ids.cdBD},${h.ids.cdBD}`, ptParents, 'Go|');\n        ptIds = cd_b_d.parts.map(pt => pt.idInternal).join(',');\n        assertEq(`${h.ids.fBD1},${h.ids.fBD2},${h.ids.bBD1}`, ptIds, 'Gn|');\n        ptNames = cd_b_d.parts.map(pt => pt.getS('name')).join(',');\n        assertEq(`p1,p2,p1`, ptNames, 'Gm|');\n\n        let cd_c_d = newState.model.getCardById(h.ids.cdCD);\n        ptParents = cd_c_d.parts.map(pt => pt.parentIdInternal).join(',');\n        assertEq(`${h.ids.cdCD},${h.ids.cdCD}`, ptParents, 'Gl|');\n        ptIds = cd_c_d.parts.map(pt => pt.idInternal).join(',');\n        assertEq(`${h.ids.fCD1},${h.ids.bCD1}`, ptIds, 'Gk|');\n        ptNames = cd_c_d.parts.map(pt => pt.getS('name')).join(',');\n        assertEq(`p1,p1`, ptNames, 'Gj|');\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptExtensiveChunk.ts",
    "content": "\n/* auto */ import { VpcEvalHelpers } from './../../vpc/vpcutils/vpcValEval';\n/* auto */ import { ScriptTestBatch, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { VpcGranularity, checkThrowInternal } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { callDebuggerIfNotInProduction } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertWarnEq, getStrToEnum, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionScriptExtensiveChunk', true);\nexport let testCollectionScriptExtensiveChunk = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBase>();\nt.atest('--init--testCollectionScriptExtensiveChunk', async () => {\n    h = new TestVpcScriptRunBase(t);\n    return h.initEnvironment();\n});\nt.atest('ScriptExtensiveChunk', async () => {\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h.vcstate.model.stack.setOnVel('compatibilitymode', true, h.vcstate.model)\n    );\n    let test = new RunExtensiveChunkTests();\n    await test.go();\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h.vcstate.model.stack.setOnVel('compatibilitymode', false, h.vcstate.model)\n    );\n});\n\n/**\n * I decided to thoroughly test chunk support by\n * writing a python script to generate hundreds of thousands of examples,\n * running the examples on the original product in an emulator,\n * in order to get very thorough fidelity.\n *\n * genchunktests.py (might not be included)\n * generates a list of chunks like \"item 2 to 4 of line 5 of\"\n * and then generates a READ, WRITE, and DELETE test for each chunk.\n * tests include:\n * 1) specific test strings for lines, items, words, and chars\n * 2) mixed test strings that begin as 3 lines containing 3 items\n * containing 3 words, and then all delimeters are rotated.\n * 3) mixed test strings with random delimeters\n * 4) recursive scopes, 3 levels\n * 5) recursive scopes with ranges, 2 levels\n * 6) recursive scopes with char, separate to reduce # of tests\n * 7) for each cartesian product of 5 and fewer characters:\n *      a) count lines, items, words\n *      b) chunks with all possible ranges\n *      c) recursive scopes, 2 levels\n */\nclass RunExtensiveChunkTests {\n    failures = 0;\n    skipped = 0;\n\n    /**\n     * asynchronously load the list of tests\n     */\n    async loadTestData() {\n        let url = '/resources03a/test/testScriptExtensiveChunkTests.txt';\n        let txt = await Util512Higher.asyncLoadJsonString(url);\n        let data = txt.trim().replace(/\\r\\n/g, '\\n').split('\\n');\n        data = this.expandTestData(data);\n        return data;\n    }\n\n    /* runs the test */\n    async go() {\n        /* let's run it in batches of 40 */\n        const batchSize = 40;\n        let count = 0;\n        let loopsWithoutSleep = 0;\n        let data = await this.loadTestData();\n        let enableThisTest = (s: string) => {\n            /* you can selectively enable tests */\n            return true;\n        };\n\n        while (true) {\n            /* release our timeslice for a bit so the ui doesn't freeze */\n            loopsWithoutSleep += 1;\n            if (loopsWithoutSleep > 300) {\n                await Util512Higher.sleep(10);\n                console.log(count, '...');\n                loopsWithoutSleep = 0;\n            }\n\n            if (!data.length) {\n                console.log(\n                    longstr(`extensive chunk tests done with ${count} tests,\n                     ${this.failures} failures, ${this.skipped}\n                     completely acceptable skips.`)\n                );\n                return;\n            }\n\n            let batch: string[] = [];\n            for (let i = 0; i < batchSize; i++) {\n                let last = data.pop();\n                if (last && last.length) {\n                    if (enableThisTest(last)) {\n                        batch.push(last);\n                        count += 1;\n                    }\n                } else {\n                    break;\n                }\n            }\n\n            this.doTestBatch(batch, count);\n        }\n    }\n\n    /**\n     * expand the R+W+D tests into separate read, write, delete tests\n     */\n    protected expandTestData(data: string[]): string[] {\n        let ret: string[] = [];\n        for (let item of data) {\n            let pts = item.split('\\t');\n            if (pts[0] === 'R+W+D') {\n                assertWarnEq(6, pts.length, 'Ut|not enough parts', item);\n                let [type, ch, target, resread, reswrite, resdelete] = pts;\n                ret.push(['READ', ch, target, resread].join('\\t'));\n                ret.push(['WRITE', ch, target, reswrite].join('\\t'));\n                ret.push(['DELETE', ch, target, resdelete].join('\\t'));\n                Util512.unused(type);\n            } else {\n                ret.push(item);\n            }\n        }\n        return ret;\n    }\n\n    /**\n     * run a batch of tests\n     */\n    protected doTestBatch(batch: string[], count: number) {\n        let code = '';\n        let expecteds: string[] = [];\n        let i = 0;\n        for (let entry of batch) {\n            if (\n                entry.startsWith('DELETE') &&\n                this.isADeleteWithFinalRange(entry.split('\\t')[1])\n            ) {\n                /* we don't support deleting ranges,\n                so confirm that we throw */\n                let b = new ScriptTestBatch();\n                let smcode = this.genTestCode(entry, [], 1).trim();\n                b.t(`${smcode}\\\\1`, 'ERR:6:deleting ranges');\n                b.batchEvaluate(h);\n                this.skipped++;\n            } else {\n                i++;\n                code += this.genTestCode(entry, expecteds, i);\n            }\n        }\n\n        h.runGeneralCode('', code);\n        for (let i = 0; i < expecteds.length; i++) {\n            this.compareResultsWithExpected(i, expecteds, count, batch);\n        }\n    }\n\n    /**\n     * for a single test case, see if results are what we expected\n     */\n    protected compareResultsWithExpected(\n        i: number,\n        expecteds: string[],\n        count: number,\n        batch: string[]\n    ) {\n        let got = h.vcstate.runtime.codeExec.globals\n            .get(`results${i + 1}`)\n            .readAsString();\n        got = got.replace(/\\n/g, '|');\n        if (got !== expecteds[i]) {\n            if (this.failures === 0) {\n                console.error('| refers to a newline and _ is a space in this output.');\n            }\n            console.error(`\\n\\n\\nFAILURE near test # ${count + i}`);\n            console.error('Test: ' + batch[i].replace(/\\t/g, '\\n').replace(/ /g, '_'));\n            console.error('Got: \\n' + got.replace(/ /g, '_'));\n            let pts = batch[i].split('\\t');\n            let input = pts[2];\n            let expected = pts[3].replace(/\\|/g, '\\\\n');\n            input = `\"\"&\"${input.replace(/\\|/g, '\"&cr&\"')}\"&\"\"`;\n            if (pts[0] === 'WRITE') {\n                /* write a helpful demo test case */\n                console.log('demo test case:');\n                console.log(`b.t('put ${input} into z1\\\\\\\\1', '1')`);\n                console.log(\n                    `b.t('put z1 into z\\\\nput \"ABCDE\" into ${pts[1]} z\\\\\\\\z', '${expected}')`\n                );\n            } else if (pts[0] === 'DELETE') {\n                /* write a helpful demo test case */\n                console.log('demo test case:');\n                console.log(`b.t('put ${input} into z1\\\\\\\\1', '1')`);\n                console.log(\n                    `b.t('put z1 into z\\\\ndelete ${pts[1]} z\\\\\\\\z', '${expected}')`\n                );\n            }\n            this.failures += 1;\n            if (this.failures % 20 === 0) {\n                callDebuggerIfNotInProduction();\n            }\n        }\n    }\n\n    /**\n     * generate test code\n     */\n    protected genTestCode(entry: string, expecteds: string[], i: number) {\n        let code = '';\n        let pts = entry.split('\\t');\n        assertTrue(pts.length === 4, 'Us|not 4 parts?', entry);\n        expecteds.push(pts[3]);\n        let targetStringForInput = `\"${pts[2]}\"`;\n        targetStringForInput = VpcEvalHelpers.escapeWithinString(targetStringForInput);\n        code += `\\nglobal results${i}`;\n        if (pts[0] === 'READ') {\n            code += `\\nput ${targetStringForInput} into z`;\n            code += `\\nput ${pts[1]} z into results${i}`;\n        } else if (pts[0] === 'WRITE') {\n            code += `\\nput ${targetStringForInput} into results${i}`;\n            code += `\\nput \"ABCDE\" into ${pts[1]} results${i}`;\n        } else if (pts[0] === 'DELETE') {\n            code += `\\nput ${targetStringForInput} into results${i}`;\n            code += `\\ndelete ${pts[1]} results${i}`;\n        } else if (pts[0] === 'COUNTITEM') {\n            assertWarn(!pts[1].length, 'Ur|');\n            code += `\\nput the number of items in (${targetStringForInput}) into results${i}`;\n        } else if (pts[0] === 'COUNTWORD') {\n            assertWarn(!pts[1].length, 'Uq|');\n            code += `\\nput the number of words in (${targetStringForInput}) into results${i}`;\n        } else if (pts[0] === 'COUNTLINE') {\n            assertWarn(!pts[1].length, 'Up|');\n            code += `\\nput the number of lines in (${targetStringForInput}) into results${i}`;\n        } else {\n            checkThrowInternal(false, 'Uo|unknown test');\n        }\n\n        return code;\n    }\n\n    /**\n     * we don't support a delete with a final range\n     * i.e. we support 'delete word 3 of line 4 to 5 of x'\n     * but not 'delete word 3 to 4 of line 5 of x'\n     * we need to re-order the input to see if there is\n     * a final range, since 'delete line x of word y'\n     * is actually done as 'delete word y of line x'\n     */\n    isADeleteWithFinalRange(s: string) {\n        /* typical input: \"line 3 to 5 of word 3 to 3 of\" */\n        s = s.replace(/(\\b[0-9]+\\b) to \\1 of\\b/g, '$1 of');\n        /* typical input is now: \"line 3 to 5 of word 3 of\" */\n        /* split on middle 'of's - not the final 'of' */\n        let pts = s.split(' of ');\n        if (pts.length <= 1) {\n            return !s.startsWith('char ') && /* bool */ s.includes(' to ');\n        }\n\n        /* typical input is now: [line 3 to 5, word 3 of] */\n        let newPts = Util512.sortDecorated(pts, pt =>\n            getStrToEnum<VpcGranularity>(\n                VpcGranularity,\n                'no such granularity',\n                pt.split(' ')[0]\n            )\n        );\n\n        /* typical input is now: [word 3 of, line 3 to 5] */\n        s = newPts.join(' of ');\n        if (s.startsWith('char ')) {\n            return false;\n        }\n\n        /* if \"to\" comes after the \" of \", then it is ok, we accept\n        ranges in the parents, just not the children */\n        let indexOf = s.indexOf(' of');\n        let indexOfTo = s.indexOf(' to ');\n        if (indexOf === -1 || indexOfTo === -1 || indexOfTo > indexOf) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptExtensiveIf.ts",
    "content": "\n/* auto */ import { VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { UI512ErrorHandling, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertWarnEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollectionScriptExtensiveIf', true);\nexport let testCollectionScriptExtensiveIf = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBase>();\nt.atest('--init--testCollectionScriptExtensiveIf', async () => {\n    h = new TestVpcScriptRunBase(t);\n    return h.initEnvironment();\n});\nt.atest('runConditionalTests', () => {\n    let test = new RunExtensiveConditionalTests();\n    return test.go();\n});\n\n/**\n * I decided to thoroughly test if-then support by\n * writing a python script to generate thousands of examples,\n * running the examples on the original product in an emulator,\n * then running the script in vipercard and comparing them.\n *\n * all tests pass - matches the original product perfectly!\n */\nclass RunExtensiveConditionalTests {\n    helperCode = `\nfunction veryWeakHash b\n    put 5381 into hash\n    put 2 ^ 24 into maxh\n    repeat with i = 1 to the number of chars in b\n        put charToNum(char i of b) into c\n        put (hash*32 + hash) + c into hash\n        put hash mod maxh into hash\n    end repeat\n    return hash\nend veryWeakHash\n\nfunction condition x\n    global conditions, allout\n    put x after allout\n    put char x of conditions into r\n    if r = \"1\" then return true\n    else return false\nend condition\n\non prepConditions x, bitwidth\n    -- converts x to binary with width bitwidth\n    global conditions\n    put \"\" into conditions\n    repeat with i = 1 to bitwidth\n        put x mod 2 after conditions\n        put x div 2 into x\n    end repeat\nend prepConditions\n\non doOperation p\n    global allout\n    put p after allout\nend doOperation\n\n    `;\n    helperCodeTests = `\non testPrepConditions\n    global conditions, allout\n    put \"\" into allout\n    repeat with x = 0 to 31\n        prepConditions x, 5\n        put conditions & \",\" after allout\n    end repeat\nend testPrepConditions\n\non testveryWeakHash\n    global allout\n    put veryWeakHash(\"1,2,3\") into allout\nend testveryWeakHash\n`;\n    async loadTestData() {\n        let url = '/resources03a/test/testScriptExtensiveConditionalsCollateral.txt';\n        let data = await Util512Higher.asyncLoadJsonString(url);\n        url = '/resources03a/test/testScriptExtensiveConditionalsExpected.txt';\n        let expected = await Util512Higher.asyncLoadJsonString(url);\n        let expectedar = expected.trim().replace(/\\r\\n/g, '\\n').split('\\n');\n        return [data.split('@'), expectedar];\n    }\n\n    getLineFromExpected(expected: string[], i: number) {\n        let ret = expected[i];\n        let pts = ret.split(':');\n        if (pts.length > 1) {\n            assertWarnEq((i + 1).toString(), pts[0], 'Q.|');\n            return pts[1];\n        } else {\n            return ret;\n        }\n    }\n\n    async testHelpers() {\n        h.runGeneralCode(this.helperCodeTests, 'testPrepConditions');\n        let got = h.vcstate.runtime.codeExec.globals.get('allout');\n        let expected = longstr(\n            `00000,10000,01000,11000,00100,10100,01100,\n            11100,00010,10010,01010,11010,00110,10110,01110,11110,00001,\n            10001,01001,11001,00101,10101,01101,11101,00011,10011,01011,\n            11011,00111,10111,01111,11111,`,\n            ''\n        );\n        assertWarnEq(expected, got.readAsString(), 'Q-|');\n        h.runGeneralCode(this.helperCodeTests, 'testveryWeakHash');\n        got = h.vcstate.runtime.codeExec.globals.get('allout');\n        assertWarnEq('9350163', got.readAsString(), 'Q,|');\n        /* confirm that we'll be writing to allout */\n        h.vcstate.runtime.codeExec.globals.set('allout', VpcValS(''));\n        h.runGeneralCode(\n            '',\n            `\nglobal conditions\nput 1101 into conditions\nif condition(2) then\n    doOperation \"a\"\nend if\nif condition(3) then\n    doOperation \"b\"\nend if\nif condition(4) then\n    doOperation \"c\"\nend if\n`\n        );\n        got = h.vcstate.runtime.codeExec.globals.get('allout');\n        assertWarnEq('2a34c', got.readAsString(), 'Q+|');\n    }\n\n    /*\n    by turning on silenceAssertMsgs, this makes assertWarns throw,\n      which is useful because we can catch the exception and not show\n     any dialogs. Many of the tests here throw. */\n    async go() {\n        UI512ErrorHandling.silenceAssertMsgs = true;\n        try {\n            await this.goImpl();\n        } finally {\n            UI512ErrorHandling.silenceAssertMsgs = false;\n        }\n    }\n\n    /* runs the test */\n    async goImpl() {\n        h.setScript(h.ids.stack, this.helperCode);\n        await this.testHelpers();\n\n        /* it's ok to stop and re-start code execution each time */\n        let [data, expectedar] = await this.loadTestData();\n        let countTests = Math.min(expectedar.length, data.length);\n        let failures = 0;\n        for (let i = 0; i < countTests; i++) {\n            if (i % 20 === 0) {\n                /* release our timeslice for a bit so the ui doesn't freeze */\n                await Util512Higher.sleep(10);\n                console.log(i, '.');\n            }\n\n            let prefix = 'global allout \\nput \"\" into allout\\n';\n            let suffix = '\\nput veryWeakHash(allout) into allout';\n            let code = prefix + data[i] + suffix;\n            let got: string;\n            try {\n                /* compile errors are assertwarns,\n                but we've set the silenceAssertMsgs flag, so\n                they will become thrown exceptions instead */\n                h.runGeneralCode('', code);\n                got = h.vcstate.runtime.codeExec.globals.get('allout').readAsString();\n            } catch (e) {\n                assertWarn(e.message.includes('unexpected failure'), 'Q*|');\n                console.log(e.message);\n                got = 'compileErr';\n            }\n\n            let expected = this.getLineFromExpected(expectedar, i);\n            if (expected !== got) {\n                console.error('Different result:', i, expected, got);\n                failures += 1;\n            }\n        }\n\n        console.log(`ran verification for ${countTests} tests. ${failures} failures.`);\n        h.setScript(h.ids.stack, '');\n    }\n\n    /* not for vipercard, but for the original project\n    running in an emulator.\n\n    we use on idle since capturing on errorDialog, while\n    silencing the error, still stops the current script from executing\n\n    1) optional: use genconditionaltests.py to generate\n        testScriptExtensiveConditionalsCollateral.txt\n    2) change lineendings in that file to \\r\n    3) put file into the emulator.\n    4) make a stack with a cd btn \"go\", cd btn \"target\" (id 5) and a cd fld \"myf\"\n    5) script of button \"go\" is\n        global isActive\n        put 1 into isActive\n    6) put this into the card script, update path to text file.\n  function veryWeakHash b\n    -- an even weaker version of djb2, but\n    -- it's fast and it won't run into intmax.\n    put 5381 into hash\n    put 2 ^ 24 into maxh\n    repeat with i = 1 to the number of chars in b\n      put charToNum(char i of b) into c\n      put (hash*32 + hash) + c into hash\n      put hash mod maxh into hash\n    end repeat\n    return hash\n  end veryWeakHash\n\n  function condition x\n    global conditions, allout\n    put x after allout\n    put char x of conditions into r\n    if r = \"1\" then return true\n    else return false\n  end condition\n\n  on prepConditions x, bitwidth\n    -- converts x to binary with width bitwidth\n    global conditions\n    put \"\" into conditions\n    repeat with i = 1 to bitwidth\n      put x mod 2 after conditions\n      put x div 2 into x\n    end repeat\n  end prepConditions\n\n  on doOperation p\n    global allout\n    put p after allout\n  end doOperation\n\n  on errordialog\n    put return & \"compileErr\" after cd fld \"myf\"\n  end errordialog\n\n  function getnth n\n    global whichLine, isActive\n    -- this is inefficient, but it's also simple.\n    -- plenty fast.\n    -- if I were to leave the file handle open,\n    -  a script error might cause the file handle to be leaked,\n    -- and I'm worried about getting a 'too many open file handles' error\n    put \"macmain:condoutcr.txt\" into txtf\n    open file txtf\n    repeat with i = 1 to (whichLine-1)\n      read from file txtf until \"@\"\n    end repeat\n    read from file txtf until \"@\"\n    put it into ret\n    close file txtf\n    put char 1 to (length(ret)-1) of ret into ret\n    return ret\n  end getnth\n\n  -- why use on idle?\n  -- because apparently compileErrors are really common.\n  -- although errorDialog traps an error, it doesn't pass execution\n  -- back to the caller, so it'd be tricky to have it continue the\n  -- script. so we just let execution halt, and wait for idle to\n  -- resume executing the script.\n  on idle\n    global whichLine, isActive\n    if isActive <> 1 then pass idle\n    if whichLine > 1000 then\n      put 0 into isActive\n    end if\n\n    global conditions, allout\n    put \"global allout \" & return & return & \"\" into prefix\n    put return & \"put veryWeakHash(allout) into allout\" into suffix\n\n    -- use a batch size of 32. arbitrary.\n    -- higher #s prob faster but make the ui freeze.\n    repeat with i = 1 to 32\n      put whichLine + 1 into whichLine\n      put getnth(whichLine) into code\n      put prefix & code & suffix into code\n      put \"on mouseup\" & return & code & return & \"end mouseup\" into code\n      put \"\" into allout\n      set the script of cd btn id 5 to code\n      set the lockerrordialogs to true\n      send \"mouseup\" to cd btn id 5\n      set the lockerrordialogs to false\n      put return & whichLine & \":\" & allout after cd fld \"myf\"\n    end repeat\n\n  end idle\n  7) click \"go\" and watch it run!\n */\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptParseCmd.ts",
    "content": "\n/* auto */ import { getParsingObjects } from './../../vpc/codeparse/vpcVisitor';\n/* auto */ import { BuildFakeTokens, cloneToken } from './../../vpc/codeparse/vpcTokens';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq, assertWarnEq, longstr, util512Sort } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test parsing a command\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcScriptParseCmd');\nexport let testCollectionvpcScriptParseCmd = t;\n\nt.test('VpcParseCmdSet.Basic syntax', () => {\n    testCmdSet(`set the topleft to 1`, 'parses');\n    testCmdSet(`set the topleft to -1`, 'parses');\n    testCmdSet(`set the topleft to 1 + 1`, 'parses');\n    testCmdSet(`set the topleft to (1 < 2)`, 'parses');\n    testCmdSet(`set topleft to 1`, 'parses');\n});\nt.test('VpcParseCmdSet.ConfirmThatFailureAsserts', () => {\n    testCmdSet(`set the topleft to 1`, 'parses');\n    assertFailsCmdSet(`set topleft in cd btn 1 to 2`, `Exception`);\n    /* test that the tests can fail */\n    assertAsserts('Q>|', 'assert:', () => {\n        testCmdSet(`set topleft in cd btn 1 to 2`, 'parses');\n    });\n    assertAsserts('Q=|', 'assert:', () => {\n        assertFailsCmdSet(`set the topleft to 1`, 'Exception');\n    });\n    /* incorrect message */\n    assertAsserts('Q<|', 'assert:', () => {\n        testCmdSet(`set the topleft to 1`, 'Exception');\n    });\n    assertAsserts('Q;|', 'assert:', () => {\n        assertFailsCmdSet(`set topleft in cd btn 1 to 2`, 'parses');\n    });\n});\nt.test('VpcParseCmdSet.confirm that cases that should fail, do fail', () => {\n    assertFailsCmdSet(\n        `set topleft in cd btn 1 to 2`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n    assertFailsCmdSet(\n        `set topleft of cd btn 1 to 2 and 3`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n});\nt.test('VpcParseCmdSet.test property targets', () => {\n    testCmdSet(`set topleft of cd 1 to 2`, 'parses');\n    testCmdSet(`set topleft of bg 1 to 2`, 'parses');\n    testCmdSet(`set topleft of cd x to 2`, 'parses');\n    testCmdSet(`set topleft of bg x to 2`, 'parses');\n    testCmdSet(`set topleft of cd btn 1 to 2`, 'parses');\n    testCmdSet(`set topleft of cd btn 1 of cd 2 to 3`, 'parses');\n    testCmdSet(`set topleft of cd fld 1 to 2`, 'parses');\n    testCmdSet(`set topleft of cd fld 1 to 2`, 'parses');\n    testCmdSet(`set topleft of this stack to 2`, 'parses');\n    testCmdSet(`set topleft of the target to 2`, 'parses');\n    testCmdSet(`set topleft of me to 2`, 'parses');\n});\nt.test('VpcParseCmdSet.using keyword \"to\" more than once', () => {\n    testCmdSet(`set topleft to chars 1 to 2 of \"a\"`, 'parses');\n    testCmdSet(\n        `set topleft of chars 1 to 2 of cd fld 1 to chars 3 to 4 of \"a\"`,\n        'parses'\n    );\n});\nt.test('VpcParseCmdSet.chunks of fields', () => {\n    testCmdSet(`set topleft of word 1 to 2 of cd fld 3 to 4`, 'parses');\n    testCmdSet(`set topleft of item 1 to (2 + 3) of cd fld 4 to 5`, 'parses');\n});\nt.test(`TestVpcParseCmdSet.can't take chunks of anything else`, () => {\n    assertFailsCmdSet(\n        `set topleft of word 1 to 2 of cd 3 to 4`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsCmdSet(\n        `set topleft of word 1 to 2 of bg 3 to 4`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsCmdSet(\n        `set topleft of word 1 to 2 of cd btn 3 to 4`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsCmdSet(`set topleft of word 1 to 2 of this stack to 4`, `Exception`);\n    assertFailsCmdSet(\n        `set topleft of word 1 to 2 of x to 4`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n});\nt.test('VpcParseCmdSet.will fail at runtime, but syntax is valid', () => {\n    testCmdSet(`set the id of cd btn 1 to 2`, 'parses');\n    testCmdSet(`set the id of cd btn id 1 to 2`, 'parses');\n});\nt.test('VpcParseCmdSet.types of things to set to', () => {\n    testCmdSet(`set topleft to ta`, 'parses');\n    testCmdSet(`set topleft to ta, tb`, 'parses');\n    testCmdSet(`set topleft to ta, tb, tc`, 'parses');\n    testCmdSet(`set topleft to ta, tb, tc, td`, 'parses');\n    testCmdSet(`set topleft to ta, tb, tc, td, te`, 'parses');\n    testCmdSet(`set topleft to opaque`, 'parses');\n    testCmdSet(`set topleft to bold`, 'parses');\n    testCmdSet(`set topleft to bold, italic`, 'parses');\n    testCmdSet(`set topleft to bold, italic, shadow`, 'parses');\n    testCmdSet(`set topleft to (1), (2)`, 'parses');\n    testCmdSet(`set topleft to (1+2), (3+4)`, 'parses');\n});\nt.test('VpcParseCmdSet.not a valid property set', () => {\n    assertFailsCmdSet(\n        `set topleft to cd 1`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsCmdSet(\n        `set topleft topleft to 1`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n    assertFailsCmdSet(\n        `set topleft to (ta, tb)`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n    assertFailsCmdSet(\n        `set topleft to ta tb`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n    assertFailsCmdSet(\n        `set topleft to 1 2`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n    assertFailsCmdSet(\n        `set topleft to`,\n        `EarlyExitException: Expecting: expecting at least `\n    );\n    assertFailsCmdSet(\n        `set topleft to ,`,\n        `EarlyExitException: Expecting: expecting at least `\n    );\n    assertFailsCmdSet(\n        `set topleft to 1,`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n});\nt.test('VpcParseCmdAdd', () => {\n    testCmd('add x to y', 'parses');\n    testCmd('add 1+2+3 to y', 'parses');\n    testCmd('add 1 to cd fld o', 'parses');\n    testCmd('add 1 to line 2 of cd fld o', 'parses');\n    testCmd('add 1 to line 2 to 3 of cd fld o', 'parses');\n    testCmd('add 1 to line 2 to (3*4) of cd fld o', 'parses');\n});\nt.test('VpcParseCmdAdd.invalid syntax', () => {\n    assertFailsCmd('add 1 + 2', 'MismatchedTokenException');\n    assertFailsCmd('add 1 to 2', 'NoViableAltException');\n    assertFailsCmd('add 1 to \"abc\"', 'NoViableAltException');\n    assertFailsCmd('add 1 to line 2', 'NoViableAltException');\n    assertFailsCmd('add 1 to line 2 to 3 of', 'NoViableAltException');\n    assertFailsCmd('add 1 to cd x', 'NoViableAltException');\n    assertFailsCmd('add 1 to bg x', 'NoViableAltException');\n    assertFailsCmd('add 1 to the x', 'Exception');\n    assertFailsCmd('add 1 to the left of cd btn 1', 'Exception');\n});\nt.test('VpcParseCmdAnswer', () => {\n    testCmd('answer x', 'parses');\n    testCmd('answer x {MK} y', 'parses');\n    testCmd('answer x {MK} y or z1', 'parses');\n    testCmd('answer x {MK} y or z1 or z2', 'parses');\n    testCmd('ask x', 'parses');\n    testCmd('ask x {MK} y', 'parses');\n});\nt.test('VpcParseCmdMultiply', () => {\n    testCmd('multiply x {MK} 2', 'parses');\n    testCmd('multiply x {MK} \"2\"', 'parses');\n});\nt.test('VpcParseCmdDrag', () => {\n    testCmd('drag from 2,3 to 4,5', 'parses');\n    testCmd('drag from 2,3 to 4,5 {MK} shiftkey', 'parses');\n    testCmd('drag from 2,3 to 4,5 {MK} shiftkey, optkey', 'parses');\n    testCmd('drag from 2,3 to 4,5 {MK} shiftkey, optkey, cmdkey', 'parses');\n    testCmd('drag from 2,3 to 4,5 to 6,7', 'parses');\n    testCmd('drag from 2,3 to 4,5 to 6,7 {MK} shiftkey', 'parses');\n    testCmd('drag from 2,3 to 4,5 to 6,7 {MK} shiftkey, optkey', 'parses');\n    testCmd('drag from 2,3 to 4,5 to 6,7 {MK} shiftkey, optkey, cmdkey', 'parses');\n});\nt.test('VpcParseCmdPut', () => {\n    testCmd('put 1+2 {MK} into {MK} x', 'parses');\n    testCmd('put 1+2 {MK} before {MK} x', 'parses');\n    testCmd('put 1 {MK} into {MK} x', 'parses');\n    testCmd('put \"abc\" {MK} into {MK} x', 'parses');\n    testCmd('put cd fld 1 {MK} into {MK} x', 'parses');\n    testCmd('put y {MK} into {MK} x', 'parses');\n    testCmd('put myfn(1,2) {MK} into {MK} x', 'parses');\n    testCmd('put sin(1) {MK} into {MK} x', 'parses');\n    testCmd('put result() {MK} into {MK} x', 'parses');\n    testCmd('put the result {MK} into {MK} x', 'parses');\n    testCmd('put the left of cd btn 1 {MK} into {MK} x', 'parses');\n    testCmd('put the textfont of line 1 of cd fld 1 {MK} into {MK} x', 'parses');\n    testCmd('put the long name of cd fld 1 {MK} into {MK} x', 'parses');\n    testCmd('put the long version {MK} into {MK} x', 'parses');\n    testCmd('put the number of cd btns {MK} into {MK} x', 'parses');\n    testCmd('put there is a cd btn y {MK} into {MK} x', 'parses');\n    testCmd('put true or false {MK} into {MK} x', `parses`);\n    testCmd('put 2 > 3 {MK} into {MK} x', 'parses');\n    testCmd('put 2 is a number {MK} into {MK} x', 'parses');\n    testCmd('put y is within z {MK} into {MK} x', 'parses');\n    testCmd('put y is in z {MK} into {MK} x', 'parses');\n    testCmd('put y & z {MK} into {MK} x', 'parses');\n    testCmd('put 4/5 {MK} into {MK} x', 'parses');\n    testCmd('put 4 div 5 {MK} into {MK} x', 'parses');\n    testCmd('put (1) {MK} into {MK} x', 'parses');\n    testCmd('put -1 {MK} into {MK} x', 'parses');\n    testCmd('put not true {MK} into {MK} x', 'parses');\n    testCmd('put first line of y {MK} into {MK} x', 'parses');\n    testCmd('put line 1 of y {MK} into {MK} x', 'parses');\n    testCmd('put line 1 to 2 of y {MK} into {MK} x', 'parses');\n    testCmd('put not char 1 of (char 2 of y) {MK} into {MK} x', 'parses');\n});\nt.test('LexerRemembersInitialLine', () => {\n    /* if chevrotain didn't remember this,\n        when there was a runtime error,\n        we'd take you to the wrong line number */\n    let lexer = TestParseHelpers.instance().lexer;\n    let input = 'put\\\\\\n 4\\\\\\n into\\\\\\n x\\nput 5\\\\\\n into y';\n    let lexResult = lexer.tokenize(input);\n    assertTrue(!lexResult.errors.length, `HX|${lexResult.errors[0]?.message}`);\n    assertEq(9, lexResult.tokens.length, 'HW|');\n    assertEq(\n        '1,2,3,4,4,5,5,6,6',\n        lexResult.tokens.map(o => o.startLine).join(','),\n        'HV|'\n    );\n    assertEq('1,2,3,4,4,5,5,6,6', lexResult.tokens.map(o => o.endLine).join(','), 'HU|');\n    assertEq(\n        'put,4,into,x,\\n,put,5,into,y',\n        lexResult.tokens.map(o => o.image).join(','),\n        'HT|'\n    );\n});\nt.test('CloneToken', () => {\n    let lexer = TestParseHelpers.instance().lexer;\n    let input = 'put 4 into x';\n    let lexResult = lexer.tokenize(input);\n    assertTrue(!lexResult.errors.length, `HS|${lexResult.errors[0]?.message}`);\n    assertEq(4, lexResult.tokens.length, 'HR|');\n    assertEq('put,4,into,x', lexResult.tokens.map(o => o.image).join(','), 'HQ|');\n\n    /* check that the properties we copy over in\n        cloneToken are the same that the real lexer produces */\n    let real = lexResult.tokens[0];\n    let cloned = cloneToken(real);\n    let realTokenKeys = Util512.getMapKeys(real as any);\n    let clonedTokenKeys = Util512.getMapKeys(cloned as any);\n    realTokenKeys.sort(util512Sort);\n    clonedTokenKeys.sort(util512Sort);\n\n    /* these ones we know we can ignore, after confirming they are undefined in the real object */\n    assertTrue(!real.isInsertedInRecovery, 'HP|');\n    clonedTokenKeys = clonedTokenKeys.filter(\n        k => k !== 'isInsertedInRecovery' && k !== 'tokenClassName' && k !== 'payload'\n    );\n    assertWarnEq(realTokenKeys.join(','), clonedTokenKeys.join(','), 'HN|');\n});\n\n/**\n * helpers for testing parsing\n */\nexport class TestParseHelpers {\n    protected static _instance: O<TestParseHelpers>;\n    lexer: chevrotain.Lexer;\n    parser: chevrotain.CstParser;\n    constructor() {\n        [this.lexer, this.parser] = getParsingObjects();\n        assertTrue(this.lexer, '1<|could not getParsingObjects');\n        assertTrue(this.parser, '1;|could not getParsingObjects');\n    }\n\n    /**\n     * make an instance or use cached\n     */\n    static instance() {\n        if (!TestParseHelpers._instance) {\n            TestParseHelpers._instance = new TestParseHelpers();\n        }\n\n        return TestParseHelpers._instance;\n    }\n\n    /**\n     * parse the input, flatten the resulting syntax tree into a string,\n     * and then compare the string to what was expected.\n     *\n     * if sErrExpected is set, expect there to be a parsing error\n     * with an error message containing sErrExpected\n     */\n    testParse(sInput: string, sTopRule: string, sExpected: string, sErrExpected: string) {\n        let lexResult = this.lexer.tokenize(sInput);\n        if (sErrExpected.startsWith('Lexer:')) {\n            sErrExpected = sErrExpected.substr('Lexer:'.length);\n            if (!lexResult.errors.length) {\n                assertWarn(\n                    false,\n                    \"Q:|expected a lexer error but there weren't any\",\n                    `${lexResult.errors[0]?.message}`\n                );\n            } else {\n                return;\n            }\n        } else {\n            assertWarn(!lexResult.errors.length, `1,|${lexResult.errors[0]?.message}`);\n        }\n\n        let line = lexResult.tokens;\n        line.splice(\n            0,\n            1,\n            BuildFakeTokens.makeSyntaxMarker(line[0]),\n            BuildFakeTokens.makeSyntaxMarker(line[0]),\n            BuildFakeTokens.makeSyntaxMarker(line[0])\n        );\n        this.parser.input = line;\n        let cst = Util512.callAsMethodOnClass(\n            this.testParse.name,\n            this.parser,\n            sTopRule,\n            [],\n            false\n        );\n        assertWarn(\n            sExpected === '' || sExpected === 'parses',\n            \"Q/|we don't check the cst anymore\"\n        );\n        let shouldCont = this.testParseRespondToErrs(sInput, sErrExpected, cst);\n        if (!shouldCont) {\n            return;\n        }\n    }\n\n    /**\n     * respond to errors coming from the parser.\n     * return false if we should return early\n     */\n    protected testParseRespondToErrs(sInput: string, sErrExpected: string, cst: any) {\n        if (this.parser.errors.length) {\n            if (sErrExpected.length) {\n                /* add the exception name, for backwards compat */\n                let compatName =\n                    this.parser.errors[0].name + ': ' + this.parser.errors[0].message;\n                if (!compatName.includes(sErrExpected)) {\n                    let sParseErr = longstr(\n                        `1+|for input ${sInput} got different\n                        failure message, expected ${sErrExpected} ${this.parser.errors}`\n                    );\n                    assertWarn(false, sParseErr);\n                }\n\n                return false;\n            } else {\n                let sParseErr = `1*|for input ${sInput} got parse errors ${this.parser.errors}`;\n                assertWarn(false, sParseErr);\n            }\n        } else {\n            if (sErrExpected.length > 0) {\n                let sParseErr = `1&|for input ${sInput} expected failure but succeeded.`;\n                assertWarn(false, sParseErr);\n            }\n        }\n\n        return true;\n    }\n}\n\n/**\n * wrapper around testParse, for the set command\n */\nfunction testCmdSet(sInput: string, sExpected: string) {\n    assertTrue(sInput.startsWith('set '), '1:|expected start with set');\n    return TestParseHelpers.instance().testParse(\n        sInput,\n        'RuleBuiltinCmdSet',\n        sExpected,\n        ''\n    );\n}\n\n/**\n * wrapper around testParse, asserts that it fails with the expected message\n */\nfunction assertFailsCmdSet(sInput: string, sErrExpected: string) {\n    assertTrue(sInput.startsWith('set '), '1/|expected start with set');\n    return TestParseHelpers.instance().testParse(\n        sInput,\n        'RuleBuiltinCmdSet',\n        '',\n        sErrExpected\n    );\n}\n\n/**\n * wrapper around testParse, for an arbitrary command\n * we'll get the rule name by extracting the first word from sInput\n */\nfunction testCmd(sInput: string, sExpected: string) {\n    /* manually make a syntax marker */\n    let sSyntaxMarker = BuildFakeTokens.strSyntaxMark;\n    sInput = sInput.replace(/\\{MK\\}/g, sSyntaxMarker);\n    let sCmd = sInput.split(' ')[0];\n    assertTrue(sInput.startsWith(sCmd + ' '), '1.|expected start with ' + sCmd);\n    let firstCapital = sCmd[0].toUpperCase() + sCmd.slice(1).toLowerCase();\n    firstCapital = firstCapital === 'Go' ? 'GoCard' : firstCapital;\n    return TestParseHelpers.instance().testParse(\n        sInput,\n        'RuleBuiltinCmd' + firstCapital,\n        sExpected,\n        ''\n    );\n}\n\n/**\n * wrapper around testParse, asserts that it fails with the expected message\n */\nfunction assertFailsCmd(sInput: string, sErrExpected: string) {\n    let sCmd = sInput.split(' ')[0];\n    assertTrue(sInput.startsWith(sCmd + ' '), '1-|expected start with ' + sCmd);\n    let firstCapital = sCmd[0].toUpperCase() + sCmd.slice(1).toLowerCase();\n    firstCapital = firstCapital === 'Go' ? 'GoCard' : firstCapital;\n    return TestParseHelpers.instance().testParse(\n        sInput,\n        'RuleBuiltinCmd' + firstCapital,\n        '',\n        sErrExpected\n    );\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptParseExpr.ts",
    "content": "\n/* auto */ import { TestParseHelpers } from './vpcTestScriptParseCmd';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test parsing an expression\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcScriptParseExpr');\nexport let testCollectionvpcScriptParseExpr = t;\n\nt.test('Simple Expressions', () => {\n    testExp('4', 'parses');\n    testExp('1+2', 'parses');\n    testExp('1 + 2', 'parses');\n    testExp('011  +  02.2', 'parses');\n    testExp('11  +  (2 * 3)', 'parses');\n    testExp('11  *  (2 + 3)', 'parses');\n});\nt.test('ExprConfirmThatFailureAsserts', () => {\n    testExp('1+2', 'parses');\n    assertFailsParseExp('1+', 'Exception');\n    /* test that the tests can fail */\n    assertAsserts('Q]|', 'assert:', () => {\n        testExp('1+', 'parses');\n    });\n    assertAsserts('Q[|', 'assert:', () => {\n        assertFailsParseExp('1+2', 'Exception');\n    });\n    /* incorrect message */\n    assertAsserts('Q@|', 'assert:', () => {\n        testExp('1+2', 'Exception');\n    });\n    assertAsserts('Q?|', 'assert:', () => {\n        assertFailsParseExp('1+', 'parses');\n    });\n});\nt.test('lexing should take care of this', () => {\n    testExp('1 + \\\\\\n2', 'parses');\n    testExp('1 + \\\\\\n\\\\\\n2', 'parses');\n    testExp('1 + \\\\\\n    \\\\\\n2', 'parses');\n    assertFailsParseExp('1 + \\n 2', 'NoViableAltException: Expecting: one of these');\n    assertFailsParseExp('1 + \\\\\\n\\n 2', 'NoViableAltException: Expecting: one of these');\n});\nt.test('ScriptParseUnaryMinusAndSubtraction', () => {\n    testExp('1-2-3', 'parses');\n    testExp('1 - 2 - 3', 'parses');\n    testExp('1.0-2.0-3.0', 'parses');\n    testExp('(1)-(2)-(3)', 'parses');\n    testExp('(1)- -(2)- -(3)', 'parses');\n    testExp('- 1 - - 2 - - 3- -4', 'parses');\n});\nt.test('EveryLevelOfExpression', () => {\n    testExp('true and false', 'parses');\n    testExp('true and false or true', 'parses');\n    testExp('1 > 2', 'parses');\n    testExp('1 > 2 != 3', 'parses');\n    testExp('x contains y', 'parses');\n    testExp('x contains y contains z', 'parses');\n    testExp('x is not a number', 'parses');\n    testExp('x is not a number is a point', 'parses');\n    testExp('1 is not in 2', 'parses');\n    testExp('1 is not in 2 is in 3', 'parses');\n    testExp('x is not within y', 'parses');\n    testExp('x is not within y is within z', 'parses');\n    testExp('1 is not 2', 'parses');\n    testExp('1 is not 2 is 3', 'parses');\n    testExp('x && y', 'parses');\n    testExp('x && y & z', 'parses');\n    testExp('1 + 2', 'parses');\n    testExp('1 + 2 - 3', 'parses');\n    testExp('1 * 2', 'parses');\n    testExp('1 * 2 / 3', 'parses');\n    testExp('not true', 'parses');\n    testExp('- (1)', 'parses');\n});\nt.test('expressions that should fail', () => {\n    /* cases that should fail */\n    assertFailsParseExp(`(1`, `MismatchedTokenException: Expecting token of type `);\n    assertFailsParseExp(`1(`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`1*`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(`1-`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(`1()`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`()1`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(`()`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(``, `NoViableAltException: Expecting: one of these poss`);\n\n    /* we don't want two consecutive TkIdentifiers to be a valid expression, */\n    /* not that important but it makes parsing more streamlined. */\n    assertFailsParseExp(\n        `var1 var2`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n\n    /* we don't want points to be a valid expression in general, */\n    /* I just think it's a good idea */\n    assertFailsParseExp(`1, 2`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(\n        `var1, var2`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n    assertFailsParseExp(`(1, 2)`, `MismatchedTokenException: Expecting token of type `);\n    assertFailsParseExp(\n        `(1, 2, 3)`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n\n    /* let's not accept these either */\n    assertFailsParseExp(`1 2`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`1 2 3`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`(1 2)`, `MismatchedTokenException: Expecting token of type `);\n    assertFailsParseExp(`(1 2 3)`, `MismatchedTokenException: Expecting token of type `);\n});\nt.test('basic properties', () => {\n    /* because properties are a different type of token now,\n    you can't say \"the prop of cd btn 1\" it has to be a real property. */\n    assertFailsParseExp(`the`, `Exception`);\n    assertFailsParseExp(`the style`, `Exception`);\n    testExp(`the style of cd btn \"a\"`, 'parses');\n    testExp(`style of cd btn \"a\"`, 'parses');\n    testExp(`the textfont of cd btn \"a\"`, 'parses');\n    testExp(`the textfont`, 'parses');\n});\nt.test('expression precedence, lvl0 to higher', () => {\n    /* for 1+2*3 */\n    /* I call this \"lower to higher\", the first operator in the input string (\"+\") is done last. */\n    /* for 1*2+3 */\n    /* I call this \"higher to lower\", the first operator in the input string (\"*\") is done first. */\n    testExp('1 and 2 is not a number', 'parses');\n    testExp('1 and 2 mod 3', 'parses');\n    testExp('not 1 and 2', 'parses');\n});\nt.test('expression precedence, lvl 1 to higher', () => {\n    testExp('1 > 2 is within \"a\"', 'parses');\n    testExp('1 > 2 && \"a\"', 'parses');\n    testExp('not 1>2', 'parses');\n});\nt.test('expression precedence, lvl 1 to lower', () => {\n    testExp('1 > 2 and 3', 'parses');\n});\nt.test('expression precedence, lvl 2 to higher', () => {\n    testExp('1 is in 2 + 3', 'parses');\n    testExp('1 is 2 mod 3', 'parses');\n    /* path \"is a number\" terminates, confirmed is consisent with the emulator. */\n    assertFailsParseExp(\n        `1 is a number & 2`,\n        `NotAllInputParsedException: Redundant input, expecting EOF`\n    );\n});\nt.test('expression precedence, lvl 2 to lower', () => {\n    testExp('1 is a number > 2', 'parses');\n    testExp('1 is in 2 contains 3', 'parses');\n    testExp('1 is 2 or 3', 'parses');\n});\nt.test('expression precedence, lvl 3 to higher', () => {\n    testExp(`\"a\" && \"b\" + 1`, 'parses');\n    testExp(`\"a\" & \"b\" div 1`, 'parses');\n});\nt.test('expression precedence, lvl 3 to lower', () => {\n    testExp(`\"a\" && \"b\" is a number`, 'parses');\n    testExp(`(\"a\" is a number) && \"b\"`, 'parses');\n    testExp(`\"a\" & \"b\" > 1`, 'parses');\n});\nt.test('expression precedence, lvl 4 to higher', () => {\n    testExp(`1 + 2 * 3`, 'parses');\n    testExp(`1 - 2 div 3`, 'parses');\n});\nt.test('expression precedence, lvl 4 to lower', () => {\n    testExp(`1 + 2 is 3`, 'parses');\n    testExp(`1 - 2 is within 3`, 'parses');\n});\nt.test('expression precedence, lvl 5 to higher', () => {\n    testExp(`not 1 * 2`, 'parses');\n    testExp(`- 1 mod 2`, 'parses');\n    testExp(`1 * sin(2)`, 'parses');\n    testExp(`1 * the result`, 'parses');\n    testExp(`1 * the result * 2`, 'parses');\n});\nt.test('expression precedence, level 5 to lower', () => {\n    testExp(`1 * 2 + 3`, 'parses');\n    testExp(`1 / 2 contains 3`, 'parses');\n});\nt.test('expression precedence, above level 5', () => {\n    testExp(`1 * style of cd btn \"a\"`, 'parses');\n    testExp(`1 & the style of cd btn var & 2`, 'parses');\n    testExp(`1 * style of cd btn \"a\"`, 'parses');\n    testExp(`1 & the style of cd btn var & 2`, 'parses');\n    testExp(`1 & the length of var & 2`, 'parses');\n});\nt.test('exp precedence', () => {\n    t.say(\n        longstr(`ScriptParseExpr.expression\n        precedence, the btn name is a Lvl6Expression, confirmed in emulator`)\n    );\n    testExp(`cd btn 1 + 1`, 'parses');\n    testExp(`not there is a cd btn the number of cds + 1`, 'parses');\n});\nt.test('expression precedence, high-level precedence', () => {\n    testExp(`cd fld 1`, 'parses');\n    testExp(`cd fld 1 of cd (cd fld 1)`, 'parses');\n    testExp(`cd fld 1 of cd the result + 1`, 'parses');\n    testExp(`char 1 of \"a\" + 2`, 'parses');\n    testExp(`char (1 + 2) of \"a\" + 3`, 'parses');\n    testExp(`char (char 1 of \"a\") of \"b\"`, 'parses');\n    testExp(`char (char 1 of (char 2 of \"a\")) of \"b\"`, 'parses');\n    testExp(`char (char (char 1 of \"a\") of \"b\") of \"c\"`, 'parses');\n});\nt.test('parts of expressions, HChunk', () => {\n    testExp(`word 1 of \"a\"`, 'parses');\n    testExp(`word 1 to 2 of \"a\"`, 'parses');\n    testExp(`word (1+2) of \"a\"`, 'parses');\n    testExp(`word (1+2) to (3+4) of \"a\"`, 'parses');\n    testExp(`word 1 of (word 2 of \"a\")`, 'parses');\n    testExp(`first word of \"a\"`, 'parses');\n    testExp(`fifth word of \"a\"`, 'parses');\n});\nt.test('parts of expressions, Lvl6Expression', () => {\n    testExp(`(1)`, 'parses');\n    testExp(`(\"a\")`, 'parses');\n    testExp(`((1))`, 'parses');\n    testExp(`(((1)))`, 'parses');\n});\nt.test('parts of expressions, ExprGetProperty', () => {\n    testExp(`topleft of this cd`, 'parses');\n    testExp(`the topleft of this cd`, 'parses');\n    testExp(`long topleft of this cd`, 'parses');\n    testExp(`the long topleft of this cd`, 'parses');\n    testExp(`id of this cd`, 'parses');\n    testExp(`the id of this cd`, 'parses');\n    testExp(`topleft of word 1 of cd fld 2`, 'parses');\n    testExp(`topleft of word 1 to 2 of cd fld 3`, 'parses');\n    testExp(`topleft of cd fld 1`, 'parses');\n    testExp(`topleft of cd btn 1`, 'parses');\n});\nt.test('parts of expressions, Object corner-cases', () => {\n    testExp(`topleft of the target`, 'parses');\n    testExp(`topleft of target`, 'parses');\n    testExp(`topleft of ${cProductName}`, 'parses');\n    testExp(`topleft of me`, 'parses');\n});\nt.test(\n    `testScriptParseExpr.parts of expressions, cards/bgs can't stand alone as an expression`,\n    () => {\n        assertFailsParseExp(`cd 1`, `NoViableAltException: Expecting: one of these poss`);\n        assertFailsParseExp(`this cd`, `NoViableAltException`);\n        assertFailsParseExp(`(cd 1)`, `NoViableAltException`);\n        assertFailsParseExp(`(this cd)`, `NoViableAltException`);\n        assertFailsParseExp(`bg 1`, `NoViableAltException`);\n        assertFailsParseExp(`this bg`, `NoViableAltException`);\n        assertFailsParseExp(`(bg 1)`, `NoViableAltException`);\n        assertFailsParseExp(`(this bg)`, `NoViableAltException`);\n\n        /* this will fail at a later stage, right now thinks target() is a function */\n        /* assertFailsParseExp(#the target#, ##) */\n        /* assertFailsParseExp(#(the target)#, ##) */\n    }\n);\nt.test('parts of exp', () => {\n    t.say(`ScriptParseExpr.parts of expressions,\n        Fields (they are 'containers' and as such can stand alone)`);\n    testExp(`cd fld 1`, 'parses');\n    testExp(`cd fld id 1`, 'parses');\n    testExp(`card field \"a\"`, 'parses');\n    testExp(`card field \"a\" & \"b\"`, 'parses');\n    testExp(`bg fld 1`, 'parses');\n    testExp(`bg fld id 1`, 'parses');\n    testExp(`background fld 1`, 'parses');\n    testExp(`background fld id 1`, 'parses');\n    testExp(`cd fld 1 of cd 2`, 'parses');\n    testExp(`cd fld id 1 of cd id 2`, 'parses');\n});\nt.test('ScriptParseExpr parts', () => {\n    t.say(\n        longstr(\n            `testScriptParseExpr.parts of expressions,\n            Buttons (they are 'containers' and as such can stand alone)`\n        )\n    );\n    testExp(`cd btn 1`, 'parses');\n    testExp(`cd btn id 1`, 'parses');\n    testExp(`card button \"a\"`, 'parses');\n    testExp(`card button \"a\"`, 'parses');\n    testExp(`bg btn 1`, 'parses');\n    testExp(`bg btn id 1`, 'parses');\n    testExp(`background btn 1`, 'parses');\n    testExp(`background btn id 1`, 'parses');\n    testExp(`cd btn 1 of cd 2`, 'parses');\n    testExp(`cd btn id 1 of cd id 2`, 'parses');\n});\nt.test('parts of', () => {\n    t.say(\n        longstr(`ScriptParseExpr.parts of\n        expressions, we require the cd or btn prefix.`)\n    );\n    assertFailsParseExp(`btn 1`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(\n        `topleft of btn 1`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsParseExp(`fld 1`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(\n        `topleft of fld 1`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n});\nt.test('parts of expressions, Cards', () => {\n    testExp(`topleft of cd 1`, 'parses');\n    testExp(`topleft of cd id 1`, 'parses');\n    testExp(`topleft of first cd`, 'parses');\n    testExp(`topleft of last cd`, 'parses');\n    testExp(`topleft of prev cd`, 'parses');\n    testExp(`topleft of next cd`, 'parses');\n});\nt.test('parts of expressions, Bkgnds', () => {\n    testExp(`topleft of bg 1`, 'parses');\n    testExp(`topleft of bg id 1`, 'parses');\n    testExp(`topleft of first bg`, 'parses');\n    testExp(`topleft of last bg`, 'parses');\n    testExp(`topleft of prev bg`, 'parses');\n    testExp(`topleft of next bg`, 'parses');\n});\nt.test('parts of expressions, Stacks', () => {\n    testExp(`topleft of this stack`, 'parses');\n    testExp(`there is a this stack`, 'parses');\n});\nt.test(\n    `testScriptParseExpr.parts of expressions, you can't refer to other stacks`,\n    () => {\n        assertFailsParseExp(\n            `topleft of stack`,\n            `NoViableAltException: Expecting: one of these poss`\n        );\n        assertFailsParseExp(\n            `there is a stack`,\n            `NoViableAltException: Expecting: one of these poss`\n        );\n        /* we'll accept these in the parser but fail at runtime */\n        testExp(`topleft of stack \"a\"`, `parses`);\n        testExp(`there is a stack \"a\"`, `parses`);\n    }\n);\nt.test('ScriptParseExpr1', () => {\n    t.say(\n        longstr(`ScriptParseExpr.parts of\n        expressions, other possible HSimpleContainers`)\n    );\n    testExp(`1 + cd fld \"a\"`, 'parses');\n    testExp(`cd fld \"a\" + 1`, 'parses');\n});\nt.test('ScriptParseFunctionCalls length', () => {\n    testExp(`the length of \"a\"`, 'parses');\n    testExp(`the length of \"a\" + 1`, 'parses');\n    testExp(`length(\"a\")`, 'parses');\n    testExp(`length()`, 'parses');\n    testExp(`the length`, 'parses');\n    testExp(`char (length(\"a\")) of \"b\"`, 'parses');\n    /* we used to accept this, but we don't anymore */\n    assertFailsParseExp(`the length(\"a\")`, 'NotAllInputParsed');\n});\nt.test('ScriptParseFunctionCalls fn call with no args', () => {\n    testExp(`time()`, 'parses');\n    testExp(`time ()`, 'parses');\n    testExp(`time \\\\\\n ()`, 'parses');\n    testExp(`(time())`, 'parses');\n    testExp(`the time`, 'parses');\n    testExp(`not time()`, 'parses');\n    testExp(`not the time`, 'parses');\n    testExp(`the target`, 'parses');\n    testExp(`the long target`, 'parses');\n    /* we specifically support these in rewrites for backwards compat,\n    but that happens in rewrite which doesn't get hit here! */\n    assertFailsParseExp(`the time()`, 'NotAllInputParsed');\n    assertFailsParseExp(`not the time()`, 'NotAllInputParsed');\n    assertFailsParseExp(`not the target()`, 'NotAllInputParsed');\n    /* we used to accept this, but we don't anymore */\n    assertFailsParseExp(`the myFunction()`, 'NotAllInputParsed');\n    assertFailsParseExp(`the keyrepeated()`, 'NotAllInputParsed');\n    assertFailsParseExp(`the objectById()`, 'NotAllInputParsed');\n});\nt.test('ScriptParseFunctionCalls ensure that invalid fn calls are rejected', () => {\n    assertFailsParseExp(`time() time()`, `NotAllInputParsedException`);\n    assertFailsParseExp(`time() 1`, `NotAllInputParsedException`);\n    assertFailsParseExp(`1 time()`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`1.23()`, `NotAllInputParsedException: Redundant input, expec`);\n    assertFailsParseExp(`the ()`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(`+ ()`, `NoViableAltException: Expecting: one of these poss`);\n    assertFailsParseExp(`the long target()`, `Redundant input, expecting EOF`);\n});\nt.test('ScriptParseFunctionCalls arguments', () => {\n    testExp(`time(f1())`, 'parses');\n    testExp(`time((1))`, 'parses');\n    testExp(`time(1,2)`, 'parses');\n    testExp(`time(1*2,3)`, 'parses');\n    testExp(`time(not 1,3)`, 'parses');\n    testExp(`time(1,2,3)`, 'parses');\n    testExp(`f1(f2(1,2))`, 'parses');\n    testExp(`f1(1,f2(2,3),4)`, 'parses');\n});\nt.test(`testScriptParseFunctionCalls arguments aren't given correctly`, () => {\n    assertFailsParseExp(\n        `f1(1,f2(2,3)),4`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n    assertFailsParseExp(`f1((1,2)`, `MismatchedTokenException: Expecting token of type `);\n    assertFailsParseExp(`f1(1 2)`, `MismatchedTokenException: Expecting token of type `);\n    assertFailsParseExp(\n        `f1(1 2 3)`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n});\nt.test('ScriptParseFunctionCalls allowed without parens', () => {\n    testExp(`the target`, 'parses');\n    testExp(`the long target`, 'parses');\n    testExp(`the long target + 1`, 'parses');\n    testExp(`the params`, 'parses');\n    testExp(`the paramcount`, 'parses');\n    testExp(`not the paramcount + 1`, 'parses');\n\n    assertFailsParseExp(\n        `the target params`,\n        `NotAllInputParsedException: Redundant input, expec`\n    );\n});\nt.test('ScriptParseFunctionCalls1', () => {\n    testExp(`the target`, 'parses');\n    testExp(`the params`, 'parses');\n    testExp(`the paramcount`, 'parses');\n    testExp(`not the paramcount + 1`, 'parses');\n});\nt.test('ScriptParseFunctionCalls number of', () => {\n    testExp(`the number of words of \"a\"`, 'parses');\n    testExp(`the number of words of \"a\" && \"b\"`, 'parses');\n    testExp(`the number of chars in \"a\"`, 'parses');\n    testExp(`the number of items in \"a\"`, 'parses');\n    testExp(`the number of cd btns`, 'parses');\n    testExp(`the number of cd flds`, 'parses');\n    testExp(`the number of bg btns`, 'parses');\n    testExp(`the number of bg flds`, 'parses');\n});\nt.test('ScriptParseFunctionCalls invalid \"number of\" syntax', () => {\n    testExp(`the number of cd btns`, 'parses');\n    testExp(`the number of cd flds`, 'parses');\n    assertFailsParseExp(`the number of btns`, 'Exception');\n    assertFailsParseExp(`the number of flds`, 'Exception');\n    assertFailsParseExp(`the number of cd cds`, `Exception`);\n    assertFailsParseExp(`the number of x in \"a\"`, `Exception`);\n    /* we now support this. it's treated as a special property like the owner of */\n    testExp(`the number of cd x`, `parses`);\n});\nt.test('ScriptParseFunctionCalls number of, nested', () => {\n    testExp(`the number of cds`, 'parses');\n    testExp(`the number of cds of bg 1`, 'parses');\n    testExp(`the number of cds of bg 1 of this stack`, 'parses');\n    testExp(`the number of bgs`, 'parses');\n    testExp(`the number of bgs of this stack`, 'parses');\n    /* we let you skip levels here */\n    testExp(`the name of cd 1 of this stack`, 'parses');\n    testExp(`the number of cds of this stack`, 'parses');\n});\nt.test('ScriptParseFunctionCalls number of, invalid', () => {\n    assertFailsParseExp(\n        `the long number of cds`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    testExp(`the number of this stack`, `parses`);\n    assertFailsParseExp(`the number of cd bg 1`, `Exception`);\n    assertFailsParseExp(\n        `the number of words of bg 1`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n});\nt.test('ScriptParse There-is-a', () => {\n    testExp(`there is a cd 1`, 'parses');\n    testExp(`there is a cd x`, 'parses');\n    testExp(`there is a cd btn 1`, 'parses');\n    testExp(`there is a cd btn x`, 'parses');\n    testExp(`there is a this stack`, 'parses');\n    testExp(`there is a me`, 'parses');\n    testExp(`there is a target`, 'parses');\n    testExp(`there is a the target`, 'parses');\n    testExp(`there is a ${cProductName}`, 'parses');\n});\nt.test('ScriptParse Invalid There-is-a, we require \"cd btn\", not \"btn\" alone', () => {\n    assertFailsParseExp(\n        `there is a btn 1`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    assertFailsParseExp(\n        `there is a (cd 1)`,\n        `NoViableAltException: Expecting: one of these poss`\n    );\n    /* these now parse, as if we are reading the contents out of the container. */\n    testExp(`there is a (cd btn 1)`, `parses`);\n    testExp(`there is a (cd fld 1)`, `parses`);\n});\nt.test('ScriptParse1', () => {\n    t.say(longstr(`ScriptParse there is not a`));\n    testExp(`there is not a card 1`, 'parses');\n    testExp(`there is not a card x`, 'parses');\n\n    assertFailsParseExp(\n        `there is not cd btn 1`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n    assertFailsParseExp(\n        `there not cd btn 1`,\n        `MismatchedTokenException: Expecting token of type `\n    );\n});\nt.test('testScriptParseExpr.get rect property', () => {\n    testExp(`the rect of cd btn \"p1\"`, 'parses');\n    testExp(`the rect of bg btn \"p1\"`, 'parses');\n});\nt.test('disallow double identifiers', () => {\n    /* if two consecutive identifiers is a valid expression,\n    harder to parse commands correctly */\n    assertFailsParseExp(`x y`, `Exception`);\n    assertFailsParseExp(`x y z`, `Exception`);\n    assertFailsParseExp(`7x`, `Lexer:lexerror`);\n    assertFailsParseExp(`???`, `Lexer:lexerror`);\n    /* try all orders of two consecutive literals */\n    assertFailsParseExp(`7 7`, `Exception`);\n    assertFailsParseExp(`7 x`, `Exception`);\n    assertFailsParseExp(`7 \"a\"`, `Exception`);\n    assertFailsParseExp(`x 7`, `Exception`);\n    assertFailsParseExp(`x x`, `Exception`);\n    assertFailsParseExp(`x \"a\"`, `Exception`);\n    assertFailsParseExp(`\"a\" 7`, `Exception`);\n    assertFailsParseExp(`\"a\" x`, `Exception`);\n    assertFailsParseExp(`\"a\" \"a\"`, `Exception`);\n});\n/**\n * wrapper around testParse, for testing parsing an expression\n * uses the RuleInternalCmdRequestEval (like \"get\") command,\n * and then strips the command out of the output as well\n */\nfunction testExp(sInput: string, sExpected: string) {\n    return TestParseHelpers.instance().testParse(\n        'RuleInternalCmdRequestEval ' + sInput,\n        'RuleInternalCmdRequestEval',\n        sExpected,\n        ''\n    );\n}\n\n/**\n * wrapper around testParse, asserts that it fails with the expected message\n */\nfunction assertFailsParseExp(sInput: string, sErrExpected: string) {\n    return TestParseHelpers.instance().testParse(\n        'RuleInternalCmdRequestEval ' + sInput,\n        'RuleInternalCmdRequestEval',\n        '',\n        sErrExpected\n    );\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptRewrites.ts",
    "content": "\n/* auto */ import { CountNumericIdNormal } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcParsedCodeCollection } from './../../vpc/codepreparse/vpcTopPreparse';\n/* auto */ import { BuildFakeTokens } from './../../vpc/codeparse/vpcTokens';\n/* auto */ import { VpcCacheParsedAST } from './../../vpc/codeexec/vpcScriptCaches';\n/* auto */ import { VpcLineCategory } from './../../vpc/codepreparse/vpcPreparseCommon';\n/* auto */ import { checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, getEnumToStrOrFallback, util512Sort } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test rewrites/preparse\n *\n * remember to set 'compatibility mode', which can affect rewriting\n */\nlet t = new SimpleUtil512TestCollection('testCollectionScriptRewrites');\nexport let testCollectionScriptRewrites = t;\nlet hardCodeCompatMode = true;\n\ninterface IVpcCacheParsedASTForTest {\n    compareRewrittenCode(script: string, expected: string): void;\n}\n\nlet h = YetToBeDefinedTestHelper<IVpcCacheParsedASTForTest>();\n\nt.test('--init--testCollectionScriptRewrites', () => {\n    h = new VpcCacheParsedASTForTest();\n});\n\nt.test('testcompareRewrittenCodeHelper', () => {\n    /* correct results */\n    let inp = `if 0 is 1 then\\nb\\nend if`;\n    let expected = `if~0~is~1~then~\\nb~\\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    /* wrong results */\n    assertAsserts('R2|', 'but got', () => {\n        inp = `if 0 is 1 then\\nb\\nend if`;\n        expected = `if~0~is~2~then~\\nb~\\nIfEnd`;\n        h.compareRewrittenCode(inp, expected);\n    });\n\n    /* compile error */\n    assertAsserts('R1|', 'unexpected err', () => {\n        let inp = `b\\nend if`;\n        let expected = `b~\\nIfEnd`;\n        h.compareRewrittenCode(inp, expected);\n    });\n\n    /* compile error with wrong err message */\n    assertAsserts('R0|', 'wrong err message', () => {\n        let inp = `b\\nend if`;\n        h.compareRewrittenCode(inp, 'ERR:(incorrect message)');\n    });\n\n    /* works when we said it should fail */\n    assertAsserts('Q~|', 'expected an err', () => {\n        let inp = `if 0 is 1 then\\nb\\nend if`;\n        h.compareRewrittenCode(inp, 'ERR:');\n    });\n});\nt.test('rewrites-empty lines are ok', () => {\n    let inp = `\n        code1\n\n\n        code2`;\n    let expected = `\n    code1~\n    code2~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\n        code1 -- a comment here\n        -- comment.\n        code2\n\n        `;\n    expected = `\n    code1~\n    code2~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\n        code1 -- a comment here\n        -- comment.\n\\t\\t\n        code2\\t\\t\n\n        `;\n    expected = `\n    code1~\n    code2~`;\n    h.compareRewrittenCode(inp, expected);\n});\nt.test('rewrites-make lowercase', () => {\n    let inp = `put aBcDe into TheVar`;\n    let expected = `put~abcde~^^~into~^^~thevar~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put \"aBcDe\" into TheVar`;\n    expected = `put~\"aBcDe\"~^^~into~^^~thevar~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `PUT aBcDe INTO THEVAR`;\n    expected = `put~abcde~^^~into~^^~thevar~`;\n    h.compareRewrittenCode(inp, expected);\n});\nt.test('rewrites-cd and bg part', () => {\n    t.say(/*——————————*/ 'by default, throw an error if omitted');\n    hardCodeCompatMode = false;\n    let inp = `put the number of btns into x`;\n    let expected = `ERR:mode`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put the short id of btn 1 into x`;\n    expected = `ERR:mode`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put fld 2 into x`;\n    expected = `ERR:mode`;\n    h.compareRewrittenCode(inp, expected);\n    hardCodeCompatMode = true;\n    t.say(/*——————————*/ 'number of is also affected');\n    inp = `put the number of btns into x`;\n    expected = `put~the~number~of~cd~btns~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put the number of flds into x`;\n    expected = `put~the~number~of~bg~flds~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put the number of cd btns into x`;\n    expected = `put~the~number~of~cd~btns~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put the number of cd flds into x`;\n    expected = `put~the~number~of~cd~flds~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    t.say(/*——————————*/ 'btn-insert it if needed');\n    inp = `put btn 1 into x`;\n    expected = `put~cd~btn~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put button 1 into x`;\n    expected = `put~cd~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put cd button 1 into x`;\n    expected = `put~cd~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put card button 1 into x`;\n    expected = `put~card~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put bg button 1 into x`;\n    expected = `put~bg~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put background button 1 into x`;\n    expected = `put~background~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put there is a btn 1 into x`;\n    expected = `put~there~is~a~cd~btn~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put there is a button 1 into x`;\n    expected = `put~there~is~a~cd~button~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put 1 > btn 1 into x`;\n    expected = `put~1~>~cd~btn~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    t.say(/*——————————*/ 'btn-insert it if needed');\n    inp = `put fld 1 into x`;\n    expected = `put~bg~fld~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put field 1 into x`;\n    expected = `put~bg~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put cd field 1 into x`;\n    expected = `put~cd~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put card field 1 into x`;\n    expected = `put~card~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put bg field 1 into x`;\n    expected = `put~bg~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put background field 1 into x`;\n    expected = `put~background~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put there is a fld 1 into x`;\n    expected = `put~there~is~a~bg~fld~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put there is a field 1 into x`;\n    expected = `put~there~is~a~bg~field~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `put 1 > fld 1 into x`;\n    expected = `put~1~>~bg~fld~1~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n});\nt.test('rewrites-synonyms', () => {\n    let inp = `mycode the rect of cd btn 1`;\n    let exp = `mycode~the~rectangle~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the rectangle of cd btn 1`;\n    exp = `mycode~the~rectangle~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the hilight of cd btn 1`;\n    exp = `mycode~the~hilite~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the highlight of cd btn 1`;\n    exp = `mycode~the~hilite~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the hilite of cd btn 1`;\n    exp = `mycode~the~hilite~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the loc of cd btn 1`;\n    exp = `mycode~the~location~of~cd~btn~1~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the itemdel`;\n    exp = `mycode~the~itemdel~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the itemdelimiter`;\n    exp = `mycode~the~itemdelimiter~`;\n    h.compareRewrittenCode(inp, exp);\n});\nt.test('rewrites-date', () => {\n    let inp = `mycode the long date`;\n    let exp = `mycode~the~long~date~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the short date`;\n    exp = `mycode~the~short~date~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the English date`;\n    exp = `mycode~the~long~date~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the english date`;\n    exp = `mycode~the~long~date~`;\n    h.compareRewrittenCode(inp, exp);\n    inp = `mycode the ENGLISH date of x`;\n    exp = `mycode~the~long~date~of~x~`;\n    h.compareRewrittenCode(inp, exp);\n});\nt.test('expand if + if else', () => {\n    let inp = `\ntest001\nif 0 is 1 then\n    code1\nend if`;\n    let expected = `\ntest001~\nif~0~is~1~then~\n    code1~\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest002\nif 0 is 1 then\n    code1\nelse\n    code2\nend if`;\n    expected = `\ntest002~\nif~0~is~1~then~\n    code1~\nIfElsePlain\n    code2~\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest003\nif 0 is 1 then\n    code1\nelse if 0 is 2 then\n    code2\nelse if 0 is 3 then\n    code3\nelse\n    code4\nend if`;\n    expected = `\ntest003~\nif~0~is~1~then~\n    code1~\nIfElsePlain\n    if~0~is~2~then~\n        code2~\n    IfElsePlain\n        if~0~is~3~then~\n            code3~\n        IfElsePlain\n            code4~\n        IfEnd\n    IfEnd\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest004\nif 0 is 1 then\n    code1\nelse if 0 is 2 then\n    code2\nelse if 0 is 3 then\n    code3\nelse if 0 is 4 then\n    code4\nend if`;\n    expected = `\ntest004~\nif~0~is~1~then~\n    code1~\nIfElsePlain\n    if~0~is~2~then~\n        code2~\n    IfElsePlain\n        if~0~is~3~then~\n            code3~\n        IfElsePlain\n            if~0~is~4~then~\n                code4~\n            IfEnd\n        IfEnd\n    IfEnd\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest005\nif 0 is 1 then\n    if -1 is 1 then\n        othercode1\n    end if\nelse if 0 is 2 then\n    code1a\n    if -1 is 2 then\n        othercode2\n    else if 3 then\n        othercode3\n    end if\n    code1b\nelse if 0 is 3 then\n    if -1 is 3 then\n    end if\nend if`;\n    expected = `\ntest005~\nif~0~is~1~then~\n    if~-~1~is~1~then~\n        othercode1~\n    IfEnd\nIfElsePlain\n    if~0~is~2~then~\n        code1a~\n        if~-~1~is~2~then~\n            othercode2~\n        IfElsePlain\n            if~3~then~\n                othercode3~\n            IfEnd\n        IfEnd\n        code1b~\n    IfElsePlain\n        if~0~is~3~then~\n            if~-~1~is~3~then~\n            IfEnd\n        IfEnd\n    IfEnd\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest006\nif 0 is 1 then\n    if -1 is 1 then\n    else\n    end if\nelse if 0 is 2 then\n    if -1 is 2 then\n        c1\n    else if -1 is 3 then\n        c2\n    end if\nelse if 0 is 3 then\n    if -1 is 4 then\n        d1\n    else if -1 is 5 then\n        d2\n    else if -1 is 6 then\n        d3\n    end if\nend if`;\n    expected = `\ntest006~\nif~0~is~1~then~\n    if~-~1~is~1~then~\n    IfElsePlain\n    IfEnd\nIfElsePlain\n    if~0~is~2~then~\n        if~-~1~is~2~then~\n            c1~\n        IfElsePlain\n            if~-~1~is~3~then~\n                c2~\n            IfEnd\n        IfEnd\n    IfElsePlain\n        if~0~is~3~then~\n            if~-~1~is~4~then~\n                d1~\n            IfElsePlain\n                if~-~1~is~5~then~\n                    d2~\n                IfElsePlain\n                    if~-~1~is~6~then~\n                        d3~\n                    IfEnd\n                IfEnd\n            IfEnd\n        IfEnd\n    IfEnd\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\ntest007\nif 0 is 1 then\n    if -1 is 1 then\n        if -2 is 1 then\n        else if -2 is 2 then\n        else if -2 is 3 then\n        end if\n    else if -1 is 2 then\n        if -3 is 1 then\n        else if -3 is 2 then\n            if -4 is 1 then\n            else if -4 is 2 then\n            else if -4 is 3 then\n            end if\n        else if -3 is 3 then\n        end if\n    else if -1 is 3 then\n    end if\nelse if 0 is 2 then\nelse if 0 is 3 then\nend if`;\n    expected = `\ntest007~\nif~0~is~1~then~\n    if~-~1~is~1~then~\n        if~-~2~is~1~then~\n        IfElsePlain\n            if~-~2~is~2~then~\n            IfElsePlain\n                if~-~2~is~3~then~\n                IfEnd\n            IfEnd\n        IfEnd\n    IfElsePlain\n        if~-~1~is~2~then~\n            if~-~3~is~1~then~\n            IfElsePlain\n                if~-~3~is~2~then~\n                    if~-~4~is~1~then~\n                    IfElsePlain\n                        if~-~4~is~2~then~\n                        IfElsePlain\n                            if~-~4~is~3~then~\n                            IfEnd\n                        IfEnd\n                    IfEnd\n                IfElsePlain\n                    if~-~3~is~3~then~\n                    IfEnd\n                IfEnd\n            IfEnd\n        IfElsePlain\n            if~-~1~is~3~then~\n            IfEnd\n        IfEnd\n    IfEnd\nIfElsePlain\n    if~0~is~2~then~\n    IfElsePlain\n        if~0~is~3~then~\n        IfEnd\n    IfEnd\nIfEnd`;\n    h.compareRewrittenCode(inp, expected);\n});\nt.test('expand single-line if and else-if', () => {\n    let inp = `\nif x > 1 then c1`;\n    let expected = `\nif~x~>~1~then~\n    c1~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 1 then c1\nif x > 2 then c2`;\n    expected = `\nif~x~>~1~then~\n    c1~\nIfEnd\nif~x~>~2~then~\n    c2~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 1 then c1\nif x > 2 then c2\nif x > 3 then c3`;\n    expected = `\nif~x~>~1~then~\n    c1~\nIfEnd\nif~x~>~2~then~\n    c2~\nIfEnd\nif~x~>~3~then~\n    c3~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 1 then\n    if x > 2 then c2\nend if`;\n    expected = `\nif~x~>~1~then~\n    if~x~>~2~then~\n        c2~\n    IfEnd\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 1 then c1\nc2`;\n    expected = `\nif~x~>~1~then~\n    c1~\nIfEnd\nc2~\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    /* two lines */\n    expected = `\nif~x~>~1~then~\n    c1~\nIfElsePlain\n    c2~\nIfEnd\n`;\n    inp = `\nif x > 1 then c1\nelse c2`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse c2`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse if c2 then`;\n    h.compareRewrittenCode(inp, 'ERR:interleaved');\n    inp = `\nif x > 1 then c1\nelse\n    c2\nend if`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse\n    c2\nend if`;\n    h.compareRewrittenCode(inp, expected);\n\n    /* three lines */\n    expected = `\nif~x~>~1~then~\n    c1~\nIfElsePlain\n    if~x~>~2~then~\n        c2~\n    IfElsePlain\n        c3~\n    IfEnd\nIfEnd\n`;\n    /* explicitly check for else then*/\n    inp = `\nif x > 1 then c1\nelse if x > 2 then c2\nelse then c3`;\n    h.compareRewrittenCode(inp, \"ERR:not 'else then\");\n    inp = `\nif x > 1 then c1\nelse if x > 2 then c2\nelse c3`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse if x > 2 then c2\nelse c3`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse if x > 2 then\n    c2\nelse c3`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then c1\nelse if x > 2 then c2\nelse\n    c3\nend if`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 1 then\n    c1\nelse if x > 2 then c2\nelse\n    c3\nend if`;\n    h.compareRewrittenCode(inp, expected);\n\n    /* if a plain else, must end the single line! */\n    inp = `\nif x > 0 then\n    if x > 1 then c1\n    else c2\nelse c3`;\n    expected = `\nif~x~>~0~then~\n    if~x~>~1~then~\n        c1~\n    IfElsePlain\n        c2~\n    IfEnd\nIfElsePlain\n    c3~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 0 then\n    if x > 1 then c1\n    else c2\nelse if x > 3 then\n    c3\nend if`;\n    expected = `\nif~x~>~0~then~\n    if~x~>~1~then~\n        c1~\n    IfElsePlain\n        c2~\n    IfEnd\nIfElsePlain\n    if~x~>~3~then~\n        c3~\n    IfEnd\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 0 then\n    if x > 1 then c1\n    else c2\nelse if x > 3 then c3`;\n    expected = `\nif~x~>~0~then~\n    if~x~>~1~then~\n        c1~\n    IfElsePlain\n        c2~\n    IfEnd\nIfElsePlain\n    if~x~>~3~then~\n        c3~\n    IfEnd\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nif x > 0 then\n    if x > 1 then c1\n    else if x > 2 then c2\n    else\n        c3\n    end if\nelse\n    c10\nend if`;\n    expected = `\nif~x~>~0~then~\n    if~x~>~1~then~\n        c1~\n    IfElsePlain\n        if~x~>~2~then~\n            c2~\n        IfElsePlain\n            c3~\n        IfEnd\n    IfEnd\nIfElsePlain\n    c10~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n    inp = `\nif x > 0 then\n    if x > 1 then c1\n    else if x > 2 then c2\n    else c3\nelse\n    c10\nend if`;\n    expected = `\nif~x~>~0~then~\n    if~x~>~1~then~\n        c1~\n    IfElsePlain\n        if~x~>~2~then~\n            c2~\n        IfElsePlain\n            c3~\n        IfEnd\n    IfEnd\nIfElsePlain\n    c10~\nIfEnd\n`;\n    h.compareRewrittenCode(inp, expected);\n});\nt.test('put into message box', () => {\n    let inp = `put \"abc\"`;\n    let expected = `    put~\"abc\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\"\nput \"def\"`;\n    expected = `    put~\"abc\"~^^~into~^^~msg~box~\n    put~\"def\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"a\" & \"b\" & \"c\"`;\n    expected = `    put~\"a\"~&~\"b\"~&~\"c\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"a\" & \"b into c\"`;\n    expected = `put~\"a\"~&~\"b into c\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into x`;\n    expected = `    put~\"abc\"~^^~into~^^~x~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into msgbox`;\n    expected = `put~\"abc\"~^^~into~^^~msgbox~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `add 1 to the msg box`;\n    expected = `add~1~to~the~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into msg boxb`;\n    expected = `put~\"abc\"~^^~into~^^~msg~boxb~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into bmsg box`;\n    expected = `put~\"abc\"~^^~into~^^~bmsg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into msg box`;\n    expected = `put~\"abc\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into msg box\nput \"def\" into msg box`;\n    expected = `put~\"abc\"~^^~into~^^~msg~box~\nput~\"def\"~^^~into~^^~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into the msg boxb`;\n    expected = `    put~\"abc\"~^^~into~^^~the~msg~boxb~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `put \"abc\" into xthe msg box`;\n    expected = `put~\"abc\"~^^~into~^^~xthe~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n\n    inp = `\nput \"abc\" into the msg box`;\n    expected = `put~\"abc\"~^^~into~^^~the~msg~box~`;\n    h.compareRewrittenCode(inp, expected);\n});\n\n/**\n * test helpers for comparing rewritten code\n */\nclass VpcCacheParsedASTForTest extends VpcCacheParsedAST {\n    constructor() {\n        super(new CountNumericIdNormal(1));\n    }\n\n    /**\n     * check that the preparsed/rewritten code is as expected\n     */\n    compareRewrittenCode(script: string, expected: string) {\n        script = script.trim();\n        expected = expected.trim();\n        if (!script.startsWith('on ')) {\n            script = 'on myCode\\n' + script + '\\nend myCode';\n            if (!expected.startsWith('ERR:')) {\n                expected = 'HandlerStart\\n' + expected + '\\nHandlerEnd';\n            }\n        }\n\n        let transformedCode: O<VpcParsedCodeCollection>;\n        let err: O<Error>;\n        try {\n            transformedCode = this.getParsedCodeCollectionOrThrow(\n                script,\n                'unknown-vel',\n                hardCodeCompatMode\n            );\n        } catch (e) {\n            /* catch the errors here,\n            otherwise the error site will be far away and hard to correlate\n            with which test actually failed. */\n            err = e;\n        }\n\n        if (err) {\n            if (expected.startsWith('ERR:')) {\n                expected = expected.slice('ERR:'.length);\n                assertWarn(err.message.includes(expected), 'Q}|wrong err message');\n            } else {\n                assertWarn(false, 'Q||unexpected err', err.message);\n            }\n\n            return;\n        } else if (expected.startsWith('ERR:')) {\n            assertWarn(false, 'Q{|expected an error but succeeded');\n            return;\n        }\n\n        checkThrow(\n            transformedCode instanceof VpcParsedCodeCollection,\n            'Q_|preparse failed'\n        );\n        let reSyntaxMark = new RegExp(\n            Util512.escapeForRegex(BuildFakeTokens.strSyntaxMark),\n            'g'\n        );\n        let got = transformedCode.lines.map(\n            o => o.allImages ?? getEnumToStrOrFallback(VpcLineCategory, o.ctg)\n        );\n        got = got.map(o => o.replace(reSyntaxMark, '^^'));\n        let exp = expected.split('\\n').map(s => s.trim());\n\n        if (util512Sort(exp, got) !== 0) {\n            assertWarn(\n                false,\n                `Q^|\\nexpected\\n${exp.join('\\n')}\\nbut got,\\n'${got.join(\n                    '\\n'\n                )}\\n\\n'\\ncontext\\n\\n`,\n                script\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptRunBase.ts",
    "content": "\n/* auto */ import { getParsingObjects } from './../../vpc/codeparse/vpcVisitor';\n/* auto */ import { VpcEvalHelpers } from './../../vpc/vpcutils/vpcValEval';\n/* auto */ import { VpcVal, VpcValN, VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { VpcState } from './../../vpcui/state/vpcState';\n/* auto */ import { VpcPresenterEvents } from './../../vpcui/presentation/vpcPresenterEvents';\n/* auto */ import { VpcPresenter } from './../../vpcui/presentation/vpcPresenter';\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { VpcErr, VpcErrStage, VpcOpCtg, VpcTool, checkThrowInternal } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { BrowserInfo } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, bool, checkIsProductionBuild } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512ErrorHandling, assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, NoParameterCtor, Util512, ValHolder, assertEq, assertWarnEq, cast, longstr } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * run a set of script tests.\n *\n * features: use ERR:details or PARSEERR:details\n * to indicate an expected exception\n * use ERR:5:details to indicate line failure\n * use MARK: to point to a line, is ignored\n * specify BatchType.floatingPoint to allow small differences\n * use \"onlyTestsWithPrefix\" to enable only certain tests, for debugging\n */\nexport class ScriptTestBatch {\n    protected static keepTrackOfPending = new MapKeyToObjectCanSet<string>();\n    id: string;\n    locked = false;\n    tests: [string, string][] = [];\n    constructor() {\n        let getTraceback = checkIsProductionBuild()\n            ? '(traceback not supported)'\n            : new Error().stack?.toString();\n        getTraceback = getTraceback ?? '(traceback not supported)';\n        this.id = Math.random().toString();\n        ScriptTestBatch.keepTrackOfPending.add(this.id, getTraceback);\n    }\n\n    t(s1: string, s2: string) {\n        assertTrue(!this.locked, 'Ux|forgot to create a new batch after evaluating?');\n        this.tests.push([s1, s2]);\n    }\n\n    batchEvaluate(\n        runner: TestVpcScriptRunBase,\n        multipliers?: NoParameterCtor<TestMultiplier>[],\n        typ = BatchType.default,\n        onlyTestsWithPrefix = ''\n    ) {\n        if (!onlyTestsWithPrefix) {\n            ScriptTestBatch.keepTrackOfPending.set(this.id, '');\n        }\n\n        let isFloatingPt = false;\n        if (typ === BatchType.floatingPoint) {\n            isFloatingPt = true;\n        }\n\n        let whichTests = this.tests.filter(t => t[1].startsWith(onlyTestsWithPrefix));\n        if (multipliers && multipliers.length) {\n            whichTests = this.multiplyTests(whichTests, multipliers);\n        }\n\n        runner.testBatchEvaluate(whichTests, isFloatingPt);\n\n        /* prevent you from re-using the object */\n        this.locked = true;\n    }\n\n    /**\n     * multiply tests, allowing you to either make changes to tests,\n     * or to turn each test case into several test cases.\n     *   canonical example: turn a == b comparisons into new b == a comparisons\n     * note that transformations will always be done in the same order,\n     * which can be helpful, since earlier multipliers can add markers that\n     * later multipliers can remove.\n     */\n    multiplyTests(\n        input: [string, string][],\n        multipliers: NoParameterCtor<TestMultiplier>[]\n    ): [string, string][] {\n        /* should we first run through all original tests in order, before multiplying?\n        no, some tests might be setup like global vars/go to card that we should keep in order */\n        let ret: [string, string][] = [];\n        let ms = multipliers.map(cls => new cls());\n        for (let itemInput of input) {\n            let curItems = [itemInput];\n            for (let multiplier of ms) {\n                let first = curItems.map(item =>\n                    multiplier.firstTransformation(item[0], item[1])\n                );\n                let second = curItems.map(item =>\n                    multiplier.secondTransformation(item[0], item[1])\n                );\n                let third = curItems.map(item =>\n                    multiplier.thirdTransformation(item[0], item[1])\n                );\n\n                let nextCurItems = first.concat(second, third);\n                curItems = nextCurItems.filter(item => item !== undefined) as [\n                    string,\n                    string\n                ][];\n            }\n\n            ret = ret.concat(curItems);\n        }\n\n        return ret;\n    }\n\n    static checkPending() {\n        let vals = ScriptTestBatch.keepTrackOfPending.getVals();\n        let foundSome = false;\n        for (let val of vals) {\n            if (val) {\n                foundSome = true;\n                console.error('Still pending from:');\n                console.error(val);\n            }\n        }\n\n        assertTrue(!foundSome, 'Uw|Test batch(es) left pending');\n    }\n}\n\n/**\n * infrastructure to set up a mock ViperCard environment\n * for compiling+running tests\n *\n * create cards, buttons, and fields in populateModel()\n * use testBatchEvaluate to evaluate an array of expressions and expected values.\n * use testBatchEvalInvertAndCommute to comfirm all four permutations,\n * since if a == b, we also confirm that\n * b == a, a != b, and b != a\n *\n */\nexport class TestVpcScriptRunBase {\n    pr: VpcPresenter;\n    vcstate: VpcState;\n    ids: { [key: string]: string } = {};\n    evalHelpers = new VpcEvalHelpers();\n    initedAppl = false;\n    /* are bg vels supported yet */\n    useBg = false;\n    readonly customFunc = 'function';\n    constructor(protected t: SimpleUtil512TestCollection) {}\n\n    async initEnvironment() {\n        if (!this.initedAppl) {\n            [this.pr, this.vcstate] = await this.startEnvironment();\n            this.vcstate.vci.doWithoutAbilityToUndo(() => this.populateModel());\n            this.vcstate.vci.doWithoutAbilityToUndo(() =>\n                this.pr.setTool(VpcTool.Browse)\n            );\n\n            /* ensure that it won't try to open the script in ui. */\n            this.pr.defaultShowScriptErr = () => {};\n        }\n\n        this.initedAppl = true;\n    }\n\n    async startEnvironment(): Promise<[VpcPresenter, VpcState]> {\n        let loader = new VpcIntroProvider('', '', VpcDocumentLocation.NewDoc);\n        return loader.loadDocumentTop();\n    }\n\n    setScript(id: string, s: string) {\n        let v = this.vcstate.model.getByIdUntyped(id);\n        this.vcstate.vci.doWithoutAbilityToUndo(() =>\n            v.setOnVel('script', s, this.vcstate.model)\n        );\n    }\n\n    populateModel() {\n        /*\n         1st bg \"a\" has 1 card named \"a\", btn \"go\"\n         2nd bg \"b\" has 3 cards named \"b\", \"c\", \"d\"\n               card \"c\" has 3 flds \"p1\", \"p2\", \"p3\"\n                       and 2 btns \"p1\", \"p2\"\n               card \"d\" has 2 flds \"p1\", \"p2\"\n                       and 1 btn \"p1\"\n         3rd bg \"c\" has 1 card named \"d\"\n               card \"d\" has 1 fld \"p1\"\n                       and 1 btn \"p1\"\n        */\n\n        let model = this.vcstate.model;\n        assertEq(1, model.stack.bgs.length, '2f|');\n        assertEq(1, model.stack.bgs[0].cards.length, '2e|');\n\n        let makeVel = (typ: string) => {\n            let creator = this.vcstate.vci.getCodeExec().directiveImpl;\n            return creator.goMakevelwithoutmsg(\n                new ValHolder(typ),\n                model.getCurrentCard(),\n                ['', '']\n            );\n        };\n\n        let bgA = model.stack.bgs[0];\n        let cdA = bgA.cards[0];\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdA.idInternal);\n        let bgB = cast(VpcElBg, makeVel('bkgnd'));\n        let cdBB = bgB.cards[0];\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdBB.idInternal);\n        let cdBC = cast(VpcElCard, makeVel('card'));\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdBC.idInternal);\n        let cdBD = cast(VpcElCard, makeVel('card'));\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdBD.idInternal);\n        let bgC = cast(VpcElBg, makeVel('bkgnd'));\n        let cdCD = bgC.cards[0];\n\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdBC.idInternal);\n        let fBC1 = makeVel('field');\n        let fBC2 = makeVel('field');\n        let fBC3 = makeVel('field');\n        let bBC1 = makeVel('button');\n        let bBC2 = makeVel('button');\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdBD.idInternal);\n        let fBD1 = makeVel('field');\n        let fBD2 = makeVel('field');\n        let bBD1 = makeVel('button');\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdCD.idInternal);\n        let fCD1 = makeVel('field');\n        let bCD1 = makeVel('button');\n\n        //~ let bgfB1 = this.vcstate.createVel(bgB.idInternal, VpcElType0.Fld, -1);\n        //~ let bgfB2 = this.vcstate.createVel(bgB.idInternal, VpcElType0.Fld, -1);\n        //~ let bgfC1 = this.vcstate.createVel(bgC.idInternal, VpcElType0.Fld, -1);\n        //~ let bgbB1 = this.vcstate.createVel(bgB.idInternal, VpcElType0.Btn, -1);\n        //~ let bgbB2 = this.vcstate.createVel(bgB.idInternal, VpcElType0.Btn, -1);\n        //~ let bgbC1 = this.vcstate.createVel(bgC.idInternal, VpcElType0.Btn, -1);\n        //~ bgfB1.setOnVel('name', 'p1', model);\n        //~ bgfB2.setOnVel('name', 'p2', model);\n        //~ bgfC1.setOnVel('name', 'p1', model);\n        //~ bgbB1.setOnVel('name', 'p1', model);\n        //~ bgbB2.setOnVel('name', 'p2', model);\n        //~ bgbC1.setOnVel('name', 'p1', model);\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdA.idInternal);\n        let go = makeVel('button');\n\n        model.stack.setOnVel('name', 'teststack', model);\n        bgA.setOnVel('name', 'a', model);\n        bgB.setOnVel('name', 'b', model);\n        bgC.setOnVel('name', 'c', model);\n        cdA.setOnVel('name', 'a', model);\n        cdBB.setOnVel('name', 'b', model);\n        cdBC.setOnVel('name', 'c', model);\n        cdBD.setOnVel('name', 'd', model);\n        cdCD.setOnVel('name', 'd', model);\n        fBC1.setOnVel('name', 'p1', model);\n        fBC2.setOnVel('name', 'p2', model);\n        fBC3.setOnVel('name', 'p3', model);\n        bBC1.setOnVel('name', 'p1', model);\n        bBC2.setOnVel('name', 'p2', model);\n        fBD1.setOnVel('name', 'p1', model);\n        fBD2.setOnVel('name', 'p2', model);\n        bBD1.setOnVel('name', 'p1', model);\n        fCD1.setOnVel('name', 'p1', model);\n        bCD1.setOnVel('name', 'p1', model);\n\n        go.setOnVel('name', 'go', model);\n\n        this.ids = {\n            stack: model.stack.idInternal,\n            bgA: bgA.idInternal,\n            bgB: bgB.idInternal,\n            bgC: bgC.idInternal,\n            cdA: cdA.idInternal,\n            cdBB: cdBB.idInternal,\n            cdBC: cdBC.idInternal,\n            cdBD: cdBD.idInternal,\n            cdCD: cdCD.idInternal,\n            fBC1: fBC1.idInternal,\n            fBC2: fBC2.idInternal,\n            fBC3: fBC3.idInternal,\n            bBC1: bBC1.idInternal,\n            bBC2: bBC2.idInternal,\n            fBD1: fBD1.idInternal,\n            fBD2: fBD2.idInternal,\n            bBD1: bBD1.idInternal,\n            fCD1: fCD1.idInternal,\n            bCD1: bCD1.idInternal,\n            //~ bgfB1: bgfB1.idInternal,\n            //~ bgfB2: bgfB2.idInternal,\n            //~ bgfC1: bgfC1.idInternal,\n            //~ bgbB1: bgbB1.idInternal,\n            //~ bgbB2: bgbB2.idInternal,\n            //~ bgbC1: bgbC1.idInternal,\n            go: go.idInternal\n        };\n    }\n\n    protected onScriptErr(\n        scriptErr: VpcErr,\n        built: string,\n        expectErrMsg?: string,\n        expectErrLine?: number,\n        expectPreparseErr?: boolean\n    ) {\n        let msg = scriptErr.message;\n        let velId = scriptErr.scriptErrVelid ?? 'unknown';\n        let line = scriptErr.scriptErrLine ?? -1;\n        this.vcstate.vci.doWithoutAbilityToUndo(() => {\n            this.vcstate.vci.setTool(VpcTool.Browse);\n        });\n\n        let makeWarningUseful = '';\n        let lns = built.split('\\n');\n        if (line) {\n            line -= 1; /* from 1-based index */\n        }\n        if (expectErrLine) {\n            expectErrLine -= 1; /* from 1-based index */\n        }\n        if (line >= 0 && line < lns.length) {\n            makeWarningUseful += `culprit line: <${lns[line]\n                .replace(/\\s+/, ' ')\n                .trim()}>`;\n            if (bool(expectPreparseErr) || expectErrMsg) {\n                makeWarningUseful += ` lines: <${lns\n                    .join('; ')\n                    .replace(/\\s+/, ' ')\n                    .trim()}>`;\n            }\n        } else {\n            makeWarningUseful += `culprit lines: <${lns\n                .join('; ')\n                .replace(/\\s+/, ' ')\n                .trim()}>`;\n        }\n\n        makeWarningUseful = makeWarningUseful.replace(/global testresult; /g, '');\n        makeWarningUseful += ` v=${velId} msg=\\n${msg}`;\n\n        if (expectErrMsg !== undefined) {\n            if (expectErrMsg.startsWith('ERR:')) {\n                expectErrMsg = expectErrMsg.slice('ERR:'.length);\n            }\n\n            if (msg.includes('parse error:')) {\n                /* add the exception name for compatibility */\n                if (getParsingObjects()[1].errors?.length) {\n                    msg = getParsingObjects()[1].errors[0].name + ': ' + msg;\n                }\n            }\n            assertWarn(\n                msg.includes(expectErrMsg),\n                `wrong err message, expected <${expectErrMsg}>`,\n                makeWarningUseful\n            );\n        }\n\n        if (expectErrLine !== undefined) {\n            assertWarnEq(expectErrLine + 1, line + 1, 'wrong line', makeWarningUseful);\n        }\n\n        if (expectPreparseErr) {\n            assertWarn(\n                scriptErr.stage !== VpcErrStage.Execute &&\n                    scriptErr.stage !== VpcErrStage.Visit &&\n                    scriptErr.stage !== VpcErrStage.SyntaxStep,\n                makeWarningUseful\n            );\n        }\n\n        assertWarn(expectErrMsg !== undefined, 'unexpected failure', makeWarningUseful);\n        return scriptErr;\n    }\n\n    runGeneralCode(\n        codeBefore: string,\n        codeIn: string,\n        expectErrMsg?: string,\n        expectErrLine?: number,\n        expectPreparseErr?: boolean,\n        addNoHandler?: boolean,\n        targetId = this.ids.go\n    ) {\n        let caughtErr: O<VpcErr>;\n        this.vcstate.runtime.codeExec.cbOnScriptError = scriptErr => {\n            caughtErr = this.onScriptErr(\n                scriptErr,\n                built,\n                expectErrMsg,\n                expectErrLine,\n                expectPreparseErr\n            );\n        };\n\n        let built = addNoHandler\n            ? codeBefore + '\\n' + codeIn\n            : `${codeBefore}\n            on mouseup\n            ${codeIn}\n            end mouseup`;\n        built = built.replace(/{BSLASH}/g, '\\\\');\n        built = FormattedText.fromExternalCharset(built, BrowserInfo.get().os);\n\n        let vel = this.vcstate.model.getByIdUntyped(targetId);\n        this.setScript(vel.idInternal, built);\n\n        /* fake a click inside a btn, usually btnGo */\n        assertEq(VpcTool.Browse, this.pr.getTool(), 'HY|');\n        let cursorX = vel.ui512GettableHas('x')\n            ? vel.getN('x') + 1\n            : this.pr.userBounds[0] + 100;\n        let cursorY = vel.ui512GettableHas('y')\n            ? vel.getN('y') + 1\n            : this.pr.userBounds[1] + 100;\n        this.pr.trackMouse = [cursorX, cursorY];\n        let fakeEvent = new MouseUpEventDetails(\n            1,\n            cursorX,\n            cursorY,\n            0,\n            ModifierKeys.None\n        );\n\n        VpcPresenterEvents.scheduleScriptMsgImpl(\n            this.pr,\n            fakeEvent,\n            vel.idInternal,\n            false\n        );\n\n        assertTrue(\n            !expectPreparseErr || expectErrMsg !== undefined,\n            \"R9|please pass an expectErrMsg, even if it's an empty string\"\n        );\n        if (expectPreparseErr && expectErrMsg !== undefined && !caughtErr) {\n            assertWarn(\n                false,\n                'R8|preparse error expected but not seen',\n                codeBefore,\n                codeIn\n            );\n        }\n\n        /* if it built, message should now be in the queue */\n        assertTrue(\n            this.vcstate.runtime.codeExec.workQueue.length > 0 === !expectPreparseErr,\n            `2V|you prob got a preparse err, not a runtime err, or vice versa.\n${codeBefore}\\n${codeIn}\\n`,\n            caughtErr?.message\n        );\n        if (expectPreparseErr) {\n            return;\n        }\n\n        this.vcstate.vci.doWithoutAbilityToUndo(() =>\n            this.vcstate.runtime.codeExec.runTimeslice(Infinity)\n        );\n\n        if (expectErrMsg !== undefined && !caughtErr) {\n            assertWarn(false, '2U|error not seen\\n', codeBefore, codeIn);\n        }\n\n        assertTrue(\n            this.vcstate.runtime.codeExec.workQueue.length === 0,\n            '2T|script took too long to execute'\n        );\n    }\n\n    assertPreparseErr(s: string, expectErrMsg?: string, expectErrLine?: number) {\n        return this.runGeneralCode(s, '', expectErrMsg, expectErrLine, true);\n    }\n\n    assertPreparseErrLn(s: string, expectErrMsg?: string, expectErrLine?: number) {\n        return this.runGeneralCode('', s, expectErrMsg, expectErrLine, true);\n    }\n\n    assertLineErr(s: string, expectErrMsg: string, expectErrLine?: number) {\n        return this.runGeneralCode('', s, expectErrMsg, expectErrLine, false);\n    }\n\n    testOneEvaluate(\n        beforeLine: string,\n        s: string,\n        expectErrMsg?: string,\n        expectErrLine?: number,\n        codeBefore = ''\n    ) {\n        assertWarn(\n            !s.startsWith('put ') && !s.startsWith('set '),\n            'R7|this is supposed to be an expression but it looks like a command'\n        );\n        this.vcstate.runtime.codeExec.globals.set('testresult', VpcValS('(placeholder)'));\n        let codeIn = `global testresult\n${beforeLine}\nput ${s} into testresult`;\n        this.runGeneralCode(codeBefore, codeIn, expectErrMsg, expectErrLine);\n        return this.vcstate.runtime.codeExec.globals.get('testresult');\n    }\n\n    testBatchEvaluate(testsRaw: [string, string][], floatingPoint = false) {\n        assertWarn(testsRaw.length > 0, 'R6|');\n        let getBeforeLine = (s: string): [string, string] => {\n            let ptsWithRes = s.split('{RESULT}');\n            if (ptsWithRes.length > 1) {\n                assertTrue(ptsWithRes.length === 2, 'R5|too many {RESULT}');\n                return [ptsWithRes[0], ptsWithRes[1]];\n            } else {\n                let pts = s.split('\\\\');\n                assertTrue(pts.length === 1 || pts.length === 2, '2S|too many \\\\');\n                return pts.length === 2 ? [pts[0], pts[1]] : ['', pts[0]];\n            }\n        };\n\n        let tests: [string, string][] = testsRaw.map(item => [\n            item[0],\n            item[1].replace(/MARK:/, '')\n        ]);\n        let testsErr = tests.filter(item => item[1].startsWith('ERR:'));\n        let testsPreparseErr = tests.filter(item => item[1].startsWith('PREPARSEERR:'));\n        let testsNoErr = tests.filter(\n            item => !item[1].startsWith('ERR:') && !item[1].startsWith('PREPARSEERR:')\n        );\n        this.vcstate.runtime.codeExec.globals.set('donewithbatch', VpcValS('0'));\n        let codeIn = `global donewithbatch\\nput 0 into donewithbatch\\n`;\n        for (let i = 0; i < testsNoErr.length; i++) {\n            this.vcstate.runtime.codeExec.globals.set(\n                `testresult${i}`,\n                VpcValS('(placeholder)')\n            );\n            let [beforeLine, expr] = getBeforeLine(testsNoErr[i][0]);\n            codeIn += `global testresult${i}\\n`;\n            codeIn += `${beforeLine}\\n`;\n            codeIn += `put ${expr} into testresult${i}\\n`;\n        }\n\n        codeIn += `put 1 into donewithbatch\\n`;\n        this.runGeneralCode('', codeIn);\n        for (let i = 0; i < testsNoErr.length; i++) {\n            let isDone = this.vcstate.runtime.codeExec.globals.get(`donewithbatch`);\n            if ('1' !== isDone.readAsString()) {\n                assertWarn(false, '2R|did not complete every test?');\n                break;\n            }\n\n            let got = this.vcstate.runtime.codeExec.globals.get(`testresult${i}`);\n            this.confirmCorrectResult(floatingPoint, got, testsNoErr, i);\n        }\n\n        for (let i = 0; i < testsErr.length; i++) {\n            let [beforeLine, expr] = getBeforeLine(testsErr[i][0]);\n            let errOnLine = beforeLine.length ? 4 : 5;\n            let expectErr = testsErr[i][1].replace(/ERR:/g, '');\n            let tryLine = Util512.parseInt(expectErr.split(':')[0]);\n            if (expectErr.includes(':') && tryLine !== undefined) {\n                errOnLine = tryLine;\n                expectErr = expectErr.split(':')[1];\n            }\n\n            let got = this.testOneEvaluate(beforeLine, expr, expectErr, errOnLine);\n            assertWarnEq(\n                '(placeholder)',\n                got.readAsString(),\n                '2K|expected to get an error and not actually assign anything'\n            );\n        }\n\n        for (let i = 0; i < testsPreparseErr.length; i++) {\n            let line: string;\n            let pts = getBeforeLine(testsPreparseErr[i][0]);\n            if (pts[0] && pts[1]) {\n                /* if it's like \"doSomeCode\\\\0\" then it is a line of code */\n                assertTrue(\n                    pts[1] === 'x' || pts[1] === '0',\n                    longstr(`Uv|It looks like this test expects a preparseerr.\n                     So, it can't have a \\\\\\\\expression, the first part needs\n                     to end with \\\\\\\\0, since it is ignored`)\n                );\n                line = pts[0];\n            } else {\n                /* if it's like \"doSomeCode\" then it is a statement */\n                assertTrue(pts[1], 'Uu|blank?');\n                line = `put ${pts[1]} into testpreparseerr`;\n            }\n\n            let expectErr = testsPreparseErr[i][1].replace(/PREPARSEERR:/g, '');\n            let errOnLine = 3;\n            let tryLine = Util512.parseInt(expectErr.split(':')[0]);\n            if (expectErr.includes(':') && tryLine !== undefined) {\n                errOnLine = tryLine;\n                expectErr = expectErr.split(':')[1];\n            }\n\n            this.assertPreparseErrLn(line, expectErr, errOnLine);\n        }\n    }\n\n    protected confirmCorrectResult(\n        floatingPoint: boolean,\n        got: VpcVal,\n        testsNoErr: [string, string][],\n        i: number\n    ) {\n        if (floatingPoint) {\n            assertWarn(got.isItNumeric(), '2Q|not numeric', got.readAsString());\n            assertWarnEq(\n                got.readAsString().trim(),\n                got.readAsString(),\n                '2P|why does it have whitespace'\n            );\n            let expectString = testsNoErr[i][1];\n            assertWarn(isFinite(parseFloat(expectString)), '2O|not numeric');\n            if (\n                this.evalHelpers\n                    .evalOp(\n                        VpcValN(parseFloat(expectString)),\n                        got,\n                        VpcOpCtg.OpEqualityGreaterLessOrContains,\n                        '=='\n                    )\n                    .readAsString() !== 'true'\n            ) {\n                if (!UI512ErrorHandling.silenceAssertMsgs) {\n                    console.error(\n                        ` input=${testsNoErr[i][0].replace(/\\n/g, '|')} expected=`\n                    );\n                    console.error(`${expectString} output=`);\n                    console.error(`${got.readAsString()}`);\n                }\n                assertWarn(false, 'R4|DIFF RESULT');\n            }\n        } else {\n            let gt = got.readAsString();\n            let expt = testsNoErr[i][1];\n            if (gt !== expt) {\n                if (!UI512ErrorHandling.silenceAssertMsgs) {\n                    console.error(\n                        `DIFF RESULT input=${testsNoErr[i][0].replace(\n                            /\\n/g,\n                            '|'\n                        )} expected=`\n                    );\n                    console.error(`${expt.replace(/\\n/g, '|')} output=`);\n                    console.error(`${gt.replace(/\\n/g, '|')}`);\n                }\n                assertWarn(false, 'R3|DIFF RESULT');\n            }\n        }\n    }\n}\n\nexport enum BatchType {\n    default = 1,\n    floatingPoint\n}\n\n/**\n * why three different methods?\n * by overriding only firstTransformation, you are modifying each test\n * without creating any new tests.\n * by overriding only secondTransformation, you are multiplying the number\n * of tests by two.\n * each transformation can elect to skip a test, just return undefined\n * you can also override both, for example, to remove a marker.\n */\nexport abstract class TestMultiplier {\n    firstTransformation(code: string, expected: string): O<[string, string]> {\n        return [code, expected];\n    }\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        return undefined;\n    }\n    thirdTransformation(code: string, expected: string): O<[string, string]> {\n        return undefined;\n    }\n}\n\nexport class TestMultiplierCommutative extends TestMultiplier {\n    firstTransformation(code: string, expected: string): [string, string] {\n        return [code.replace(/_/g, ''), expected];\n    }\n    secondTransformation(code: string, expected: string): [string, string] {\n        let pts = code.split('_');\n        assertEq(3, pts.length, '2I|');\n        let op = TestMultiplierInvert.flipOperationCommute(pts[1]);\n        return [pts[2] + ' ' + op + ' ' + pts[0], expected];\n    }\n}\n\nexport class TestMultiplierInvert extends TestMultiplier {\n    leaveUnderscores = false;\n    firstTransformation(code: string, expected: string): [string, string] {\n        if (this.leaveUnderscores) {\n            return [code, expected];\n        } else {\n            return [code.replace(/_/g, ''), expected];\n        }\n    }\n    secondTransformation(code: string, expected: string): [string, string] {\n        let pts = code.split('_');\n        assertEq(3, pts.length, '2G|');\n        let op = TestMultiplierInvert.flipOperationInvert(pts[1]);\n        let delim = this.leaveUnderscores ? '_' : '';\n        return [\n            pts[0] + ` ${delim}` + op + `${delim} ` + pts[2],\n            TestMultiplierInvert.flipBool(expected)\n        ];\n    }\n    protected static flipOperation(op: string): O<[string, string]> {\n        /* first is the op when order is reversed */\n        /* second is the op that is logical inverse */\n        if (op === '==') {\n            return ['==', '!='];\n        } else if (op === '=') {\n            return ['=', '<>'];\n        } else if (op === 'is') {\n            return ['is', 'is not'];\n        } else if (op === '!=') {\n            return ['!=', '=='];\n        } else if (op === '<>') {\n            return ['<>', '='];\n        } else if (op === 'is not') {\n            return ['is not', 'is'];\n        } else if (op === '<') {\n            return ['>', '>='];\n        } else if (op === '<=') {\n            return ['>=', '>'];\n        } else if (op === '>') {\n            return ['<', '<='];\n        } else if (op === '>=') {\n            return ['<=', '<'];\n        } else {\n            return undefined;\n        }\n    }\n    static flipOperationCommute(op: string): string {\n        let ret = TestMultiplierInvert.flipOperation(op);\n        return ret ? ret[0] : op;\n    }\n    static flipOperationInvert(op: string): string {\n        let ret = TestMultiplierInvert.flipOperation(op);\n        checkThrowInternal(ret, '2F|unknown op ' + op);\n        return ret[1];\n    }\n    static flipBool(s: string) {\n        if (s === 'true') {\n            return 'false';\n        } else if (s === 'false') {\n            return 'true';\n        } else if (s.startsWith('ERR:')) {\n            return s;\n        } else {\n            checkThrowInternal(false, '2J|could not flip ' + s);\n        }\n    }\n}\n\nexport class TestMultiplierInvertLeaveUnderscores extends TestMultiplierInvert {\n    leaveUnderscores = true;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptRunCmd.ts",
    "content": "\n/* auto */ import { BatchType, ScriptTestBatch, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { assertWarnEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test running ViperCard scripts.\n *\n * the syntax for a \"test batch\" is a tuple\n * [{script expression}, {expected result}]\n * for example, the following test passes:\n * ['1 + 1', '2']\n *\n * if you are testing a more complex expression or\n * command, you can write multiple lines, and use \\\\\n * at the end of the string to indicate what should be compared,\n * for example,\n *  ['put 1 + 1 into x\\\\x', '2']\n *\n *  or even\n *  ['put 1 into a \\n put a + 1 into x\\\\x', '2']\n * the \\\\x means to evaluate x and compare it with 2.\n *\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionScriptRunCmd');\nexport let testCollectionScriptRunCmd = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBase>();\nt.atest('--init--vpcTestScriptRunCmd', async () => {\n    h = new TestVpcScriptRunBase(t);\n    return h.initEnvironment();\n});\nt.test('execCommands choose', () => {\n    /* not valid tools */\n    let b = new ScriptTestBatch();\n    b.t('choose tool\\\\tool()', 'ERR:not a valid tool');\n    b.t('choose pencil def tool\\\\tool()', 'ERR:NotAllInputParsedException');\n    b.t('choose tool 3 tool\\\\tool()', 'ERR:Redundant input');\n    b.t('choose tool \"pencil\" tool\\\\tool()', 'ERR:NotAllInputParsedException');\n    b.t('choose tool \"pencil\" xyz\\\\tool()', 'ERR:NotAllInputParsedException');\n    b.t('choose tool \"pencil\" \"tool\"\\\\tool()', 'ERR:NotAllInputParsedException');\n    b.t('choose\\\\0', 'PREPARSEERR:not enough args');\n    b.t('choose brush\\\\0', 'PREPARSEERR:tool');\n    b.t('choose 3\\\\0', 'PREPARSEERR:tool');\n    b.t('choose pencil\\\\0', 'PREPARSEERR:tool');\n    b.t('choose abc\\\\0', 'PREPARSEERR:tool');\n    b.t('choose pencil def\\\\0', 'PREPARSEERR:tool');\n    b.t('choose \"pencil\" xyz\\\\0', 'PREPARSEERR:tool');\n    b.t('choose \"pencil\" \"tool\"\\\\0', 'PREPARSEERR:tool');\n\n    /* our new preferred style */\n    b.t('choose \"browse\" tool\\\\tool()', 'browse');\n    b.t('choose \"button\" tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose \"field\" tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose \"select\" tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose \"brush\" tool\\\\tool()', 'brush');\n    b.t('choose \"bucket\" tool\\\\tool()', 'bucket');\n    b.t('choose \"stamp\" tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose \"pencil\" tool\\\\tool()', 'pencil');\n    b.t('choose \"line\" tool\\\\tool()', 'line');\n    b.t('choose \"curve\" tool\\\\tool()', 'curve');\n    b.t('choose \"lasso\" tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose \"eraser\" tool\\\\tool()', 'eraser');\n    b.t('choose \"rect\" tool\\\\tool()', 'rect');\n    b.t('choose \"oval\" tool\\\\tool()', 'oval');\n    b.t('choose \"roundrect\" tool\\\\tool()', 'roundrect');\n    b.t('choose \"spray\" tool\\\\tool()', 'spray');\n    b.t('choose \"spray can\" tool\\\\tool()', 'spray');\n    b.t('choose \"round rect\" tool\\\\tool()', 'roundrect');\n    b.t('choose \"round  rect\" tool\\\\tool()', 'roundrect');\n    b.t('choose \"xyz\" tool\\\\tool()', 'ERR:Not a valid choice');\n    b.t('choose \"\" tool\\\\tool()', 'ERR:valid tool name');\n\n    /* classic style */\n    b.t('choose browse tool\\\\tool()', 'browse');\n    b.t('choose button tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose field tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose select tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose brush tool\\\\tool()', 'brush');\n    b.t('choose bucket tool\\\\tool()', 'bucket');\n    b.t('choose stamp tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose pencil tool\\\\tool()', 'pencil');\n    b.t('choose line tool\\\\tool()', 'line');\n    b.t('choose curve tool\\\\tool()', 'curve');\n    b.t('choose lasso tool\\\\tool()', 'ERR:drawing only');\n    b.t('choose eraser tool\\\\tool()', 'eraser');\n    b.t('choose rect tool\\\\tool()', 'rect');\n    b.t('choose oval tool\\\\tool()', 'oval');\n    b.t('choose roundrect tool\\\\tool()', 'roundrect');\n    b.t('choose spray tool\\\\tool()', 'spray');\n    b.t('choose spray can tool\\\\tool()', 'spray');\n    b.t('choose round rect tool\\\\tool()', 'roundrect');\n    b.t('choose round  rect tool\\\\tool()', 'roundrect');\n    b.t('choose xyz tool\\\\tool()', 'ERR:no variable found');\n\n    /* numeric style */\n    b.t('choose tool 1\\\\tool()', 'browse');\n    b.t('choose tool 2\\\\tool()', 'ERR:drawing only');\n    b.t('choose tool 4\\\\tool()', 'ERR:drawing only');\n    b.t('choose tool 9\\\\tool()', 'line');\n    b.t('choose tool 10\\\\tool()', 'spray');\n    b.t('choose tool 15\\\\tool()', 'curve');\n    b.t('choose tool 17\\\\tool()', 'ERR:unknown or unsupported');\n    b.t('choose tool 99\\\\tool()', 'ERR:unknown or unsupported');\n    b.t('choose tool 0\\\\tool()', 'ERR:unknown or unsupported');\n    b.t('choose tool -1\\\\tool()', 'ERR:unknown or unsupported');\n\n    /* we'll allow this */\n    b.t('choose tool \"pencil\"\\\\tool()', 'pencil');\n    b.t('choose 10 tool\\\\tool()', 'spray');\n\n    /* by expression */\n    b.t('choose \"pen\" & \"cil\" tool\\\\tool()', 'pencil');\n    b.t('choose (\"pen\" & \"cil\") tool\\\\tool()', 'pencil');\n    b.t('put \"pencil\" into x\\nchoose x tool\\\\tool()', 'pencil');\n    b.t('put \"spray can\" into x\\nchoose x tool\\\\tool()', 'spray');\n    b.t('put \"spray can\" into x\\nchoose (x) tool\\\\tool()', 'spray');\n    b.t('choose tool 10 + 5\\\\tool()', 'curve');\n    b.t('choose tool 100/10\\\\tool()', 'spray');\n    b.t('choose tool (10 - 1)\\\\tool()', 'line');\n    b.t('put 15 into x\\nchoose tool x\\\\tool()', 'curve');\n    b.t('put 15 into x\\nchoose tool (x)\\\\tool()', 'curve');\n\n    b.batchEvaluate(h);\n});\nt.test('execCommands arithmetic invalid parse', () => {\n    /* add, subtract, divide, multiply */\n    let b = new ScriptTestBatch();\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    h.runGeneralCode('', 'put \"0\" into cd fld \"p1\"');\n    b.t('add 4 with cd fld \"p1\"\\\\0', 'ERR:4:MismatchedTokenException');\n    b.t('add 4 into cd fld \"p1\"\\\\0', 'ERR:4:MismatchedTokenException');\n    b.t('add 4 from cd fld \"p1\"\\\\0', 'ERR:4:MismatchedTokenException');\n    b.t('add 4 from cd fld \"to\"\\\\0', 'ERR:4:MismatchedTokenException');\n    b.t('add 4 to\\\\0', 'ERR:4:NoViableAltException');\n    b.t('add to cd fld \"p1\"\\\\0', 'ERR:4:NoViableAltException');\n    b.t('subtract 4 with cd fld \"p1\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('subtract 4 into cd fld \"p1\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('subtract 4 to cd fld \"p1\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('subtract 4 to cd fld \"from\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('subtract 4 from\\\\0', 'ERR:4:NoViableAltException');\n    b.t('subtract from cd fld \"p1\"\\\\0', 'ERR:4:NoViableAltException');\n    b.t('divide cd fld \"p1\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('divide cd fld \"p1\" to 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('divide cd fld \"p1\" with 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('divide cd fld \"p1\" from 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('divide cd fld \"by\" from 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('divide cd fld \"p1\" by\\\\0', 'ERR:4:NoViableAltException');\n    b.t('multiply cd fld \"p1\"\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('multiply cd fld \"p1\" to 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('multiply cd fld \"p1\" with 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('multiply cd fld \"p1\" from 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('multiply cd fld \"by\" from 4\\\\0', 'PREPARSEERR:3:did not see');\n    b.t('multiply cd fld \"p1\" by\\\\0', 'ERR:4:NoViableAltException');\n    b.batchEvaluate(h);\n});\nt.test('execCommands arithmetic valid', () => {\n    let b = new ScriptTestBatch();\n\n    /* operations */\n    b.t('put 4 into x\\\\x', '4');\n    b.t('add (1+2) to x\\\\x', '7');\n    b.t('subtract (1+2) from x\\\\x', '4');\n    b.t('multiply x by (1+2)\\\\x', '12');\n    b.t('divide x by (1+3)\\\\x', '3');\n\n    /* operations, field */\n    b.t('put \"4\" into cd fld \"p1\"\\\\0', '0');\n    b.t('add (1+2) to cd fld \"p1\"\\\\cd fld \"p1\"', '7');\n    b.t('subtract (1+2) from cd fld \"p1\"\\\\cd fld \"p1\"', '4');\n    b.t('multiply cd fld \"p1\" by (1+2)\\\\cd fld \"p1\"', '12');\n    b.t('divide cd fld \"p1\" by (1+3)\\\\cd fld \"p1\"', '3');\n\n    /* by item */\n    b.t('put \"3,4,5\" into x\\\\0', '0');\n    b.t('add (1+2) to item 2 of x\\\\item 2 of x', '7');\n    b.t('subtract (1+2) from item 2 of x\\\\item 2 of x', '4');\n    b.t('multiply item 2 of x by (1+2)\\\\item 2 of x', '12');\n    b.t('divide item 2 of x by (1+3)\\\\item 2 of x', '3');\n    b.t('chartonum(x==\"3,3,5\")', '116');\n\n    /* by word */\n    b.t('put \"3  4  5\" into x\\\\0', '0');\n    b.t('add (1+2) to word 2 of x\\\\word 2 of x', '7');\n    b.t('subtract (1+2) from word 2 of x\\\\word 2 of x', '4');\n    b.t('multiply word 2 of x by (1+2)\\\\word 2 of x', '12');\n    b.t('divide word 2 of x by (1+3)\\\\word 2 of x', '3');\n    b.t('chartonum(x==\"3  3  5\")', '116');\n\n    /* by char */\n    b.t('put \"345\" into x\\\\0', '0');\n    b.t('add (1+2) to char 2 to 2 of x\\\\x', '375');\n    b.t('subtract (1+2) from char 2 to 2 of x\\\\x', '345');\n    b.t('multiply char 2 to 2 of x by (1+2)\\\\x', '3125');\n    b.t('divide char 2 to 3 of x by (1+3)\\\\x', '335');\n\n    /* not a number */\n    b.t('put \"4a\" into cd fld \"p2\"\\\\0', '0');\n    b.t('add (1+2) to cd fld \"p2\"\\\\cd fld \"p2\"', 'ERR:expected a number');\n    b.t('subtract (1+2) from cd fld \"p2\"\\\\cd fld \"p2\"', 'ERR:expected a number');\n    b.t('multiply cd fld \"p2\" by (1+2)\\\\cd fld \"p2\"', 'ERR:expected a number');\n    b.t('divide cd fld \"p2\" by (1+3)\\\\cd fld \"p2\"', 'ERR:expected a number');\n\n    /* to match original product, allow Lvl3Expressions */\n    b.t('put 1 into x\\n add 1&1 to x\\\\x', '12');\n    b.t('put 1 into x\\n add 1+1 to x\\\\x', '3');\n    b.t('put 1 into x\\n add 1*1 to x\\\\x', '2');\n    b.t('put 1 into x\\n subtract 1&1 from x\\\\x', '-10');\n    b.t('put 1 into x\\n subtract 1+1 from x\\\\x', '-1');\n    b.t('put 1 into x\\n subtract 1*1 from x\\\\x', '0');\n    b.t('put 1 into x\\n multiply x by 1&1\\\\x', '11');\n    b.t('put 1 into x\\n multiply x by 1+1\\\\x', '2');\n    b.t('put 1 into x\\n multiply x by 1*1\\\\x', '1');\n    b.t('put 22 into x\\n divide x by 1&1\\\\x', '2');\n    b.t('put 22 into x\\n divide x by 1+1\\\\x', '11');\n    b.t('put 22 into x\\n divide x by 1*1\\\\x', '22');\n\n    b.batchEvaluate(h, [], BatchType.floatingPoint);\n});\nt.test('execCommands go to card', () => {\n    /* changing current card */\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    h.assertPreparseErrLn('go', 'on its own', 3);\n    h.assertLineErr('go \"a\"', 'something like', 3);\n    h.assertLineErr('go 1', 'NoViableAltException', 3);\n    h.assertLineErr('go xyz', 'no variable found', 3);\n    h.assertLineErr('go to \"a\"', 'something like', 3);\n    h.assertLineErr('go to 1', 'NoViableAltException', 3);\n    h.assertLineErr('go to xyz', 'no variable found', 3);\n    let b = new ScriptTestBatch();\n\n    /* go by id */\n    b.t(\n        `go to card 1\\ngo to card id ${h.ids.cdBD}\\\\the short id of this cd`,\n        `${h.ids.cdBD}`\n    );\n\n    /* going to nonexistant cards is a no-op,\nconfirmed in emulator */\n    b.t(`go to card 1\\ngo to cd id 8888\\\\the short id of this cd`, `${h.ids.cdA}`);\n    b.t(`go to card 1\\ngo to cd \"notexist\"\\\\the short id of this cd`, `${h.ids.cdA}`);\n    b.t(`go to card 1\\ngo to bg 8888\\\\the short id of this cd`, `${h.ids.cdA}`);\n\n    /* going to different types of objects is an error,\nconfirmed in emulator  */\n    b.t(\n        `go to card id ${h.ids.cdBC}\\ngo to cd btn \"p1\"\\\\the short id of this cd`,\n        `ERR:5:Cannot go to a`\n    );\n    b.t(\n        `go to card id ${h.ids.cdBC}\\ngo to cd fld 1\\\\the short id of this cd`,\n        `ERR:5:Cannot go to a`\n    );\n    b.t(`go to vipercard\\\\the short id of this cd`, `ERR:Cannot go`);\n    b.t(`go to card 1\\ngo to cd btn id 1\\\\the short id of this cd`, `${h.ids.cdA}`);\n\n    /* go by id */\n    b.t(\n        `go to card 1\\ngo to card id ${h.ids.cdBD}\\\\the short id of this cd`,\n        `${h.ids.cdBD}`\n    );\n    b.t(\n        `go to card 1\\ngo to card id ${h.ids.cdCD}\\\\the short id of this cd`,\n        `${h.ids.cdCD}`\n    );\n\n    /* go by number */\n    b.t('go to card 1\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to card 2\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 3\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to card 4\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to card 5\\\\the short id of this cd', `${h.ids.cdCD}`);\n\n    /* get by relative (tests getCardByOrdinal) */\n    b.t('go to card 1\\\\the short id of next cd', `${h.ids.cdBB}`);\n    b.t('go to card 2\\\\the short id of next cd', `${h.ids.cdBC}`);\n    b.t('go to card 3\\\\the short id of next cd', `${h.ids.cdBD}`);\n    b.t('go to card 4\\\\the short id of next cd', `${h.ids.cdCD}`);\n    b.t('go to card 2\\\\the short id of prev cd', `${h.ids.cdA}`);\n    b.t('go to card 3\\\\the short id of prev cd', `${h.ids.cdBB}`);\n    b.t('go to card 4\\\\the short id of prev cd', `${h.ids.cdBC}`);\n    b.t('go to card 5\\\\the short id of prev cd', `${h.ids.cdBD}`);\n\n    /* ord/position */\n    b.t('go to card 3\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to next --[[f]]\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to prev\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to previous\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to next --[[g]]\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to first\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to last\\\\the short id of this cd', `${h.ids.cdCD}`);\n    b.t('go to third\\\\the short id of this cd', `${h.ids.cdBC}`);\n\n    /* ord/position with the */\n    b.t('go to card 3\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to the next\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to the prev\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to the previous\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to the next\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to the first\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to the last\\\\the short id of this cd', `${h.ids.cdCD}`);\n    b.t('go to the third\\\\the short id of this cd', `${h.ids.cdBC}`);\n\n    /* should wrap around */\n    b.t('go to first\\ngo to prev\\\\the short id of this cd', `${h.ids.cdCD}`);\n    b.t('go to last\\ngo to next --[[h]]\\\\the short id of this cd', `${h.ids.cdA}`);\n\n    /* reference by name */\n    b.t('go to card 1\\ngo to card \"a\"\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to card 1\\ngo to card \"b\"\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 1\\ngo to card \"c\"\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to card 1\\ngo to card \"d\"\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to card 1\\ngo to card \"d\" of bg 2\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to card 1\\ngo to card \"d\" of bg 3\\\\the short id of this cd', `${h.ids.cdCD}`);\n\n    /* confirmed in emulator: if there are ambiguous card names,\nuse whichever comes first in the stack, regardless of current bg\nbut if you're already at that one, keep going to next */\n    b.t(\n        `go to card id ${h.ids.cdA}\\ngo to card \"d\"\\\\the short id of this cd`,\n        `${h.ids.cdBD}`\n    );\n    b.t(\n        `go to card id ${h.ids.cdBD}\\ngo to card \"d\"\\\\the short id of this cd`,\n        `${h.ids.cdCD}`\n    );\n    b.t(\n        `go to card id ${h.ids.cdCD}\\ngo to card \"d\"\\\\the short id of this cd`,\n        `${h.ids.cdBD}`\n    );\n\n    /* reference by bg */\n    b.t('go to card 1\\ngo to bg 1\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to card 2\\ngo to bg 1\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to card 2\\ngo to bg 2\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 5\\ngo to bg 2\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 5\\ngo to bg 3\\\\the short id of this cd', `${h.ids.cdCD}`);\n    b.t('go to card 2\\ngo to bg 3\\\\the short id of this cd', `${h.ids.cdCD}`);\n\n    /* confirmed in emulator: if sent to the same bg,\ndo not change the current card */\n    b.t('go to card 2\\ngo to bg 2\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 3\\ngo to bg 2\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to card 4\\ngo to bg 2\\\\the short id of this cd', `${h.ids.cdBD}`);\n\n    /* object reference */\n    b.t('go to third\\ngo to this stack\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to third\\ngo to stack \"other\"\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t('go to third\\ngo to stack id 999\\\\the short id of this cd', `${h.ids.cdBC}`);\n    b.t(\n        `go to third\\ngo to stack id ${h.ids.stack}\\\\the short id of this cd`,\n        `${h.ids.cdBC}`\n    );\n    b.t('go to card 1 of this stack\\\\the short id of this cd', `${h.ids.cdA}`);\n    b.t('go to card 4 of this stack\\\\the short id of this cd', `${h.ids.cdBD}`);\n    b.t('go to card 1 of bg 2\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 1 of bg 3\\\\the short id of this cd', `${h.ids.cdCD}`);\n    b.t('go to card 1 of bg 2 of this stack\\\\the short id of this cd', `${h.ids.cdBB}`);\n    b.t('go to card 1 of bg 3 of this stack\\\\the short id of this cd', `${h.ids.cdCD}`);\n\n    /* go by variable lookup - correct, confirmed in emulator */\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put \"card id ${h.ids.cdBD}\" into\n                xx{{NEWLINE}}go to xx\\\\the short id of this cd`),\n        `${h.ids.cdBD}`\n    );\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put the long id of card id ${h.ids.cdBD} into\n                xx{{NEWLINE}}go to xx\\\\the short id of this cd`),\n        `${h.ids.cdBD}`\n    );\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put the short name of card id ${h.ids.cdBD} into\n                xx{{NEWLINE}}go to card xx\\\\the short id of this cd`),\n        `${h.ids.cdBD}`\n    );\n\n    /* go by variable lookup - incorrect, confirmed in emulator */\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put \"card id ${h.ids.cdBD}\" into xx{{NEWLINE}}go to\n                card xx\\\\the short id of this cd`),\n        `${h.ids.cdA}`\n    );\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put \"cd id ${h.ids.cdBC}\" into\n                xx{{NEWLINE}}go to card xx\\\\the short id of this cd`),\n        `${h.ids.cdA}`\n    );\n    b.t(\n        longstr(`go to card 1{{NEWLINE}}put the long id of cd id ${h.ids.cdBC} into\n                xx{{NEWLINE}}go to card xx\\\\the short id of this cd`),\n        `${h.ids.cdA}`\n    );\n    /* unfortunatly can't use a TestMultiplier because a lot of these\n    have state. should fix this by putting a go to card 1 in front of\n    each test so that each line is independent. */\n    let savedTests = b.tests;\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n    for (let i = 0; i < savedTests.length; i++) {\n        savedTests[i][0] = savedTests[i][0].replace(/go to /g, 'go ');\n    }\n    b.tests = savedTests;\n    b.batchEvaluate(h);\n});\nt.test('execCommands disable and enable', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    let b = new ScriptTestBatch();\n\n    /* not valid */\n    b.t('enable cd 1', `ERR:MismatchedTokenException`);\n    b.t('enable bg 1', `ERR:MismatchedTokenException`);\n    b.t('enable cd fld \"p1\"', `ERR:MismatchedTokenException`);\n    b.t('disable cd 1', `ERR:MismatchedTokenException`);\n    b.t('disable bg 1', `ERR:MismatchedTokenException`);\n    b.t('disable cd fld \"p1\"', `ERR:MismatchedTokenException`);\n\n    /* valid */\n    b.t('disable cd btn \"p1\"\\\\the enabled of cd btn \"p1\"', `false`);\n    b.t('disable cd btn \"p1\"\\\\the enabled of cd btn \"p1\"', `false`);\n    b.t('enable cd btn \"p1\"\\\\the enabled of cd btn \"p1\"', `true`);\n    b.t('enable cd btn \"p1\"\\\\the enabled of cd btn \"p1\"', `true`);\n    b.batchEvaluate(h);\n});\nt.test('execCommands hide and show', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    let b = new ScriptTestBatch();\n\n    /* not valid */\n    b.t('hide\\\\0', `ERR:NoViableAltException`);\n    b.t('hide cd 1\\\\0', `ERR:unknown property visible`);\n    b.t('hide bg 1\\\\0', `ERR:unknown property visible`);\n    b.t('hide this stack\\\\0', `ERR:unknown property visible`);\n    b.t('show\\\\0', `ERR:NoViableAltException`);\n    b.t('show cd 1\\\\0', `ERR:unknown property visible`);\n    b.t('show bg 1\\\\0', `ERR:unknown property visible`);\n    b.t('show this stack\\\\0', `ERR:unknown property visible`);\n    b.t('show cd btn \"p1\" from 12, 23\\\\0', `ERR:parse err`);\n    b.t('show cd btn \"p1\" into 12, 23\\\\0', `ERR:parse err`);\n    b.t('show cd btn \"p1\" xyz 12, 23\\\\0', `ERR:parse err`);\n    b.t('show cd btn \"p1\" at 12\\\\0', `ERR:Not a list`);\n    b.t('show cd btn \"p1\" at \"12a,23\"\\\\0', `ERR:Not a list`);\n    b.t('show cd btn \"p1\" at \"12,23a\"\\\\0', `ERR:Not a list`);\n    b.t('show cd btn \"p1\" at 12, 23, 34\\\\0', `ERR:parse err`);\n    b.t('show cd btn \"p1\" at \"12\", \"23\", \"34\"\\\\0', `ERR:parse err`);\n    b.t('show cd btn \"p1\" at \"12, 23, 34\"\\\\0', `ERR:expected 2 numbers`);\n\n    /* valid */\n    b.t('hide cd btn \"p1\"\\\\the visible of cd btn \"p1\"', `false`);\n    b.t('hide cd btn \"p1\"\\\\the visible of cd btn \"p1\"', `false`);\n    b.t('show cd btn \"p1\"\\\\the visible of cd btn \"p1\"', `true`);\n    b.t('show cd btn \"p1\"\\\\the visible of cd btn \"p1\"', `true`);\n    b.t('hide cd fld \"p1\"\\\\the visible of cd fld \"p1\"', `false`);\n    b.t('hide cd fld \"p1\"\\\\the visible of cd fld \"p1\"', `false`);\n    b.t('show cd fld \"p1\"\\\\the visible of cd fld \"p1\"', `true`);\n    b.t('show cd fld \"p1\"\\\\the visible of cd fld \"p1\"', `true`);\n    b.t('hide me\\\\the visible of me', `false`);\n    b.t('show me\\\\the visible of me', `true`);\n\n    /* set locations */\n    b.t('set the rect of cd btn \"p1\" to 10, 20, 40, 60\\\\0', `0`);\n    b.t('show cd btn \"p1\" at 123, 234\\\\the loc of cd btn \"p1\"', `123,234`);\n    b.t('show cd btn \"p1\" at 12, 23\\\\the loc of cd btn \"p1\"', `12,23`);\n    b.t('show cd btn \"p1\" at \"12\", \"23\"\\\\the loc of cd btn \"p1\"', `12,23`);\n    b.t('show cd btn \"p1\" at \"13,24\"\\\\the loc of cd btn \"p1\"', `13,24`);\n    b.t('show cd btn \"p1\" at (12), (\" 23 \")\\\\the loc of cd btn \"p1\"', `12,23`);\n    b.t('set the rect of cd fld \"p1\" to 10, 20, 40, 60\\\\0', `0`);\n    b.t('show cd fld \"p1\" at 123, 234\\\\the loc of cd fld \"p1\"', `123,234`);\n    b.t('show cd fld \"p1\" at 12, 23\\\\the loc of cd fld \"p1\"', `12,23`);\n    b.t('show cd fld \"p1\" at \"12\", \"23\"\\\\the loc of cd fld \"p1\"', `12,23`);\n    b.t('show cd fld \"p1\" at \"12, 23\"\\\\the loc of cd fld \"p1\"', `12,23`);\n    b.t('show cd fld \"p1\" at (12), (\" 23 \")\\\\the loc of cd fld \"p1\"', `12,23`);\n    b.batchEvaluate(h);\n});\nt.test('execCommands sort', () => {\n    let b = new ScriptTestBatch();\n\n    /* sort by item */\n    b.t('put \"pear,Apple2,z11,z2,11,2,apple1,peach\" into initlist\\\\0', '0');\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort items of x\\\\x', `11,2,apple1,Apple2,peach,pear,z11,z2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort ascending items of x text\\\\x', `11,2,apple1,Apple2,peach,pear,z11,z2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort items of x text descending\\\\x', `z2,z11,pear,peach,Apple2,apple1,2,11`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort descending items of x text\\\\x', `z2,z11,pear,peach,Apple2,apple1,2,11`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort items of x text ascending\\\\x', `11,2,apple1,Apple2,peach,pear,z11,z2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort items of x numeric\\\\x', `2,11,apple1,Apple2,peach,pear,z11,z2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort descending items of x numeric\\\\x', `z2,z11,pear,peach,Apple2,apple1,11,2`);\n    b.t(\n        longstr(\n            `put \"pear\"&cr&\"Apple2\"&cr&\"z11\"&cr&\n\"z2\"&cr&\"11\"&cr&\"2\"&cr&\"apple1\"&cr&\"peach\" into initlist\\\\0`,\n            ''\n        ),\n        `0`\n    );\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort lines of x\\\\x', `11\\n2\\napple1\\nApple2\\npeach\\npear\\nz11\\nz2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t(\n        'sort ascending lines of x text\\\\x',\n        `11\\n2\\napple1\\nApple2\\npeach\\npear\\nz11\\nz2`\n    );\n    b.t('put initlist into x\\\\0', `0`);\n    b.t(\n        'sort descending lines of x text\\\\x',\n        `z2\\nz11\\npear\\npeach\\nApple2\\napple1\\n2\\n11`\n    );\n    b.t('put initlist into x\\\\0', `0`);\n    b.t('sort lines of x numeric\\\\x', `2\\n11\\napple1\\nApple2\\npeach\\npear\\nz11\\nz2`);\n    b.t('put initlist into x\\\\0', `0`);\n    b.t(\n        'sort descending lines of x numeric\\\\x',\n        `z2\\nz11\\npear\\npeach\\nApple2\\napple1\\n11\\n2`\n    );\n    b.t('sort xyz items of x\\\\x', `PREPARSEERR:expect something like`);\n    b.t('sort xyz items of x xyz\\\\x', `PREPARSEERR:expect something like`);\n    b.t('sort items of x xyz\\\\x', `ERR:parse err`);\n    b.t('sort xyz of x\\\\x', `PREPARSEERR:expect something like`);\n    b.t('sort xyz xyz of x\\\\x', `PREPARSEERR:expect something like`);\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* new sort-by-expression! (very interesting to implement) */\n    b.t('put \"ac,bb,ca\" into li\\\\0', '0');\n    b.t('sort items of li by char 2 of each\\\\li', 'ca,bb,ac');\n    b.t('put \"ac\" & cr & \"bb\" & cr & \"ca\" into li\\\\0', '0');\n    b.t('sort lines of li by char 2 of each\\\\li', 'ca\\nbb\\nac');\n    b.batchEvaluate(h);\n});\nt.test('execCommands delete', () => {\n    let b = new ScriptTestBatch();\n\n    /* not yet supported */\n    b.t('put \"abcdef,123,456\" into initlist\\\\0', '0');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"a\" into x\\ndelete x\\\\0', 'ERR:5:expected something like');\n\n    /* normal chunks */\n    b.t('put \"abcdef,123,456\" into initlist\\\\0', '0');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete first char of x\\\\x', 'bcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete char 2 of x\\\\x', 'acdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete char 2 to 5 of x\\\\x', 'af,123,456');\n    b.t('put \"abcdef,123,456\" into x\\ndelete item 2 of x\\\\x', 'abcdef,456');\n\n    /* big numbers */\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete char 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete char 2 to 999 of x\\\\x', 'a');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('delete char 1 to 999 of x\\\\x', '');\n    b.batchEvaluate(h);\n});\nt.test('execCommands put', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n    let b = new ScriptTestBatch();\n\n    /* testing a lot of prepositions */\n    b.t('put \"abc\"\\\\0', '0');\n    b.t('put \"abc\" xyz\\\\0', 'ERR:MismatchedTokenException');\n    b.t('put \"abc\" xyz x\\\\0', 'ERR:MismatchedTokenException');\n    b.t('put \"abc\" xyz cd fld \"p1\"\\\\0', 'ERR:MismatchedTokenException');\n    b.t('put \"abc\" xyz line 1 to into of cd fld \"p1\"\\\\0', 'ERR:MismatchedTokenException');\n    b.t('put \"abc\" into line 1 to into of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" into line 1 to before of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" into line 1 to after of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" before line 1 to into of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t(\n        'put \"abc\" before line 1 to before of cd fld \"p1\"\\\\0',\n        'PREPARSEERR:only see one'\n    );\n    b.t('put \"abc\" before line 1 to after of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after line 1 to into of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after line 1 to before of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after line 1 to after of cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" into into cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" into after cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" into before cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" before into cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" before after cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" before before cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after into cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after after cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"abc\" after before cd fld \"p1\"\\\\0', 'PREPARSEERR:only see one');\n    b.t('put \"ab,cd,ef,12,34,56,78\" into inititms\\\\0', '0');\n    b.t('put \"abcdef,123,456\" into initlist\\\\0', '0');\n\n    /* empty string into */\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" into char 2 of x\\\\x', 'acdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" into char 2 to 5 of x\\\\x', 'af,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" into char 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" into char 888 to 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" into char 2 to 999 of x\\\\x', 'a');\n\n    /* empty string before/after */\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"\" before char 2 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" after char 2 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" before char 2 to 5 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" after char 2 to 5 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" before char 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" after char 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" before char 888 to 999 of x\\\\x', 'abcdef,123,456');\n    b.t('put \"\" after char 888 to 999 of x\\\\x', 'abcdef,123,456');\n\n    /* medium sized string into */\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" into char 2 of x\\\\x', 'aqwertyqwertycdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" into char 2 to 5 of x\\\\x', 'aqwertyqwertyf,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" into char 999 of x\\\\x', 'abcdef,123,456qwertyqwerty');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" into char 888 to 999 of x\\\\x', 'abcdef,123,456qwertyqwerty');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" into char 2 to 999 of x\\\\x', 'aqwertyqwerty');\n\n    /* medium sized string before/after */\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" before char 2 of x\\\\x', 'aqwertyqwertybcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" after char 2 of x\\\\x', 'abqwertyqwertycdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" before char 2 to 5 of x\\\\x', 'aqwertyqwertybcdef,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" after char 2 to 5 of x\\\\x', 'abcdeqwertyqwertyf,123,456');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" before char 999 of x\\\\x', 'abcdef,123,456qwertyqwerty');\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" after char 999 of x\\\\x', 'abcdef,123,456qwertyqwerty');\n    b.t('put initlist into x\\\\0', '0');\n    b.t(\n        'put \"qwertyqwerty\" before char 888 to 999 of x\\\\x',\n        'abcdef,123,456qwertyqwerty'\n    );\n    b.t('put initlist into x\\\\0', '0');\n    b.t('put \"qwertyqwerty\" after char 888 to 999 of x\\\\x', 'abcdef,123,456qwertyqwerty');\n\n    /* items */\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" into item 2 of x\\\\x', 'ab,,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" into item 2 to 5 of x\\\\x', 'ab,,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" into item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" into item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" into item 2 to 999 of x\\\\x', 'ab,');\n\n    /* empty string before/after */\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" before item 2 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" after item 2 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" before item 2 to 5 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" after item 2 to 5 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" before item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" after item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" before item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" after item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" before item 2 to 12 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"\" after item 2 to 12 of x\\\\x', 'ab,cd,ef,12,34,56,78');\n\n    /* medium sized string into */\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" into item 2 of x\\\\x', 'ab,qwerty,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" into item 2 to 5 of x\\\\x', 'ab,qwerty,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" into item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" into item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" into item 2 to 12 of x\\\\x', 'ab,qwerty');\n\n    /* medium sized string before/after */\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" before item 2 of x\\\\x', 'ab,qwertycd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" after item 2 of x\\\\x', 'ab,cdqwerty,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" before item 2 to 5 of x\\\\x', 'ab,qwertycd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" after item 2 to 5 of x\\\\x', 'ab,cd,ef,12,34qwerty,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" before item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" after item 12 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" before item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" after item 12 to 14 of x\\\\x', 'ab,cd,ef,12,34,56,78,,,,,qwerty');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" before item 2 to 12 of x\\\\x', 'ab,qwertycd,ef,12,34,56,78');\n    b.t('put inititms into x\\\\0', '0');\n    b.t('put \"qwerty\" after item 2 to 12 of x\\\\x', 'ab,cd,ef,12,34,56,78qwerty');\n\n    /* with variables that aren't yet defined */\n    /* we'll treat it as an empty string, unless you are trying to use with a chunk */\n    b.t('put \"abc\" into newvar1\\\\newvar1', 'abc');\n    b.t('put \"abc\" before newvar2\\\\newvar2', 'abc');\n    b.t('put \"abc\" after newvar3\\\\newvar3', 'abc');\n    b.t('put \"abc\" into char 2 of newvar4\\\\0', 'ERR:no variable found');\n    b.t('put \"abc\" before char 2 of newvar5\\\\0', 'ERR:no variable found');\n    b.t('put \"abc\" after char 2 of newvar6\\\\0', 'ERR:no variable found');\n    b.t('put \"abc\" into char 2 to 3 of newvar7\\\\0', 'ERR:no variable found');\n    b.t('put \"abc\" before char 2 to 3 of newvar8\\\\0', 'ERR:no variable found');\n    b.t('put \"abc\" after char 2 to 3 of newvar9\\\\0', 'ERR:no variable found');\n    b.batchEvaluate(h);\n});\nt.test('execCommands get', () => {\n    let b = new ScriptTestBatch();\n    b.t('get 1+2\\\\it', `3`);\n    b.t('get xyz()\\\\it', `ERR:no handler`);\n    b.t('get the environment\\\\it', `development`);\n    b.t('get the systemversion\\\\it', `7.55`);\n    b.t('get abs(-2)\\\\it', `2`);\n    b.t('get sum(3,4,5)\\\\it', `12`);\n    b.t('get - char 1 to 2 of 345\\\\it', `-34`);\n    b.t('get not true\\\\it', `false`);\n    b.t('get\\\\0', `ERR:NoViableAltException`);\n    b.t('get the\\\\0', `ERR:NoViableAltException`);\n    b.t('put 123 into it\\\\it', `123`);\n    b.batchEvaluate(h);\n});\nt.test('execCommands replace', () => {\n    let b = new ScriptTestBatch();\n\n    /* incorrect usage */\n    b.t('put 123 into replace\\\\0', `ERR:variable name not allowed`);\n    b.t('replace\\\\0', `PREPARSEERR:did not see`);\n    b.t('replace with\\\\0', `ERR:NoViableAltException`);\n    b.t('replace in\\\\0', `PREPARSEERR:did not see`);\n    b.t('replace \"aa\" \"bb\" \\\\0', `PREPARSEERR:did not see`);\n    b.t('replace \"aa\" with \"bb\" \\\\0', `ERR:MismatchedTokenException`);\n    b.t('replace \"aa\" in \"bb\" \\\\0', `PREPARSEERR:did not see`);\n    b.t('replace with in \\\\0', `ERR:NoViableAltException`);\n    b.t('replace with \"bb\" in \\\\0', `ERR:NoViableAltException`);\n    b.t('replace \"aa\" with in \\\\0', `ERR:NoViableAltException`);\n    b.t('replace \"aa\" with in \"bb\" \\\\0', `ERR:NoViableAltException`);\n    b.t('replace \"aa\" with \"bb\" in \"cc\" \\\\0', `ERR:NoViableAltException`);\n    b.t('replace \"aa\" with \"bb\" in 123 \\\\0', `ERR:NoViableAltException`);\n    b.t('replace \"aa\" with \"bb\" in this stack \\\\0', `ERR:parse err`);\n    b.t('replace \"aa\" with \"bb\" in this card \\\\0', `ERR:parse err`);\n    b.t(\n        `put \"\" into s\nreplace \"aa\" with \"bb\" of s\n\\\\s`,\n        'ERR:5:MismatchedTokenException'\n    );\n\n    /* correct usage */\n    b.t(\n        `put \"\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        ''\n    );\n    b.t(\n        `put \"abc\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'abc'\n    );\n    b.t(\n        `put \"aa\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'bb'\n    );\n    b.t(\n        `put \"aa.aa.aa.\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'bb.bb.bb.'\n    );\n    b.t(\n        `put \".aa.aa.aa\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        '.bb.bb.bb'\n    );\n    b.t(\n        `put \"aaa.aaaa.aaaaa\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'bba.bbbb.bbbba'\n    );\n    b.t(\n        `put \"123123\" into s\nreplace \"1\" with \"2\" in s\n\\\\s`,\n        '223223'\n    );\n    b.t(\n        `put \"123123\" into s\nput \"1\" into s1\nput \"2\" into s2\nreplace s1 with s2 in s\n\\\\s`,\n        '223223'\n    );\n    b.t(\n        `put \"aaAA\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'bbAA'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into s\nreplace \"aa\" with \"bb\" in s\n\\\\s`,\n        'cc bb bb bb'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into s\nreplace \"a\" & \"a\" with \"b\" & \"b\" in s\n\\\\s`,\n        'cc bb bb bb'\n    );\n\n    /* test with empty string */\n    b.t(\n        `put \"cc aa aa bb\" into s\nreplace \"aa\" with \"\" in s\n\\\\s`,\n        'cc   bb'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into s\nreplace \"\" with \"bb\" in s\n\\\\s`,\n        'ERR:5:empty string'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into s\nreplace \"\" with \"\" in s\n\\\\s`,\n        'ERR:5:empty string'\n    );\n\n    /* use regex trip-up chars */\n    b.t(\n        `put \"a**a\" into s\nreplace \"*\" with \"**\" in s\n\\\\s`,\n        'a****a'\n    );\n    b.t(\n        `put \"a%$a\" into s\nreplace \"%$\" with \"*\" in s\n\\\\s`,\n        'a*a'\n    );\n    b.t(\n        `put \"abba\" into s\nreplace \"b\" with \"$&\" in s\n\\\\s`,\n        'a$&$&a'\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* use a real field */\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdBC);\n\n    b.t(\n        `put \"\" into cd fld \"p1\"\nreplace \"1\" with \"2\" in cd fld (\"p\" & \"1\")\n\\\\cd fld \"p1\"`,\n        ''\n    );\n    b.t(\n        `put \"123123\" into cd fld \"p1\"\nreplace \"1\" with \"2\" in cd fld \"p1\"\n\\\\cd fld \"p1\"`,\n        '223223'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into cd fld \"p1\"\nreplace \"aa\" with \"bb\" in cd fld \"p1\"\n\\\\cd fld \"p1\"`,\n        'cc bb bb bb'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into cd fld \"p1\"\nreplace \"aa\" with \"bb\" in cd btn \"p1\"\n\\\\cd fld \"p1\"`,\n        'ERR:5:placing text'\n    );\n    b.t(\n        `put \"cc aa aa bb\" into cd fld \"p1\"\nreplace \"aa\" with \"bb\" in cd fld \"pnotexist\"\n\\\\cd fld \"p1\"`,\n        'ERR:5:not found'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('dynamicCode do', () => {\n    let b = new ScriptTestBatch();\n\n    /* valid */\n    b.t('global g\\ndo \"global g\" & cr & \"put 1+1 into g\"\\\\g', '2');\n    b.t('global g\\ndo \"global g\" & cr & \"put 2+2 into g\"\\\\g', '4');\n    b.t('global g\\ndo (\"global g\" & cr & \"put 3+3 into g\")\\\\g', '6');\n    b.t(\n        'global g\\ndo (\"global g\" & cr & \"put 64 into t\" & cr & \"put sqrt(t) into g\")\\\\g',\n        '8'\n    );\n    b.t('put \"put 0 into x\" into code\\ndo code\\\\0', '0');\n    b.t('put \"\" into code\\ndo code\\\\0', '0');\n\n    /* runtime error */\n    b.t(\n        'global g\\ndo (\"global g\" & cr & \"put abcde into g\")\\\\g',\n        'ERR:5:no variable found'\n    );\n    b.t('global g\\ndo \"callNonExist\"\\\\g', 'ERR:5:of this name found');\n\n    /* lex error */\n    b.t('put \"$$$\" into code\\ndo code\\\\0', 'ERR:5:lex error');\n    b.t('put \"put \" & quote & \"unterminated\" into code\\ndo code\\\\0', 'ERR:5:unexpected');\n\n    /* syntax error */\n    b.t('put \"on abc\" into code\\ndo code\\\\0', 'ERR:5:cannot begin');\n    b.t('put \"end if\" into code\\ndo code\\\\0', 'ERR:5:outside of if');\n    b.t('put \"if true then\" into code\\ndo code\\\\0', 'ERR:5:interleaved');\n    b.t('put \"put\" into code\\ndo code\\\\0', 'ERR:5:not enough args');\n    b.t('put 123 into do\\\\0', `ERR:variable name not allowed`);\n\n    /* nested (do calls do) */\n    b.t('put counting() into cfirst\\\\counting() - cfirst', '1');\n    b.t(\n        `\nput counting() into cfirst\nput \"put counting() into incremented\" into code1\nput (\"do \" & quote & code1 & quote) into code2\ndo code2\\\\counting() - cfirst`,\n        '2'\n    );\n\n    /* nested (do calls do calls do) */\n    b.t(\n        `\nput counting() into cfirst\nput \"\" into s\nput \"do (\" after s\nput quote & \"do\" & quote after s\nput \" & quote & \" after s\nput quote & \"put counting() into incremented\" & quote after s\nput \" & quote )\" after s\ndo s\\\\counting() - cfirst`,\n        '2'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('dynamicCode send', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdA);\n    let b = new ScriptTestBatch();\n\n    /* valid */\n    b.t(\n        `global g\n        put \"global g\" & cr & \"put the short id of me into g\" into code\n        send code to cd fld id ${h.ids.fCD1}\\\\g`,\n        `${h.ids.fCD1}`\n    );\n    b.t(\n        `global g\n        put \"global g\" & cr & \"put the short id of me into g\" into code\n        send code to cd btn id ${h.ids.bBC1}\\\\g`,\n        `${h.ids.bBC1}`\n    );\n    b.t(\n        `global g\n        put \"global g\" & cr & \"put the short id of me into g\" into code\n        send code to card \"a\"\\\\g`,\n        `${h.ids.cdA}`\n    );\n    b.t(\n        `global g\n        put \"global g\" & cr & \"put the short id of me into g\" into code\n        send code to card id ${h.ids.cdCD}\\\\g`,\n        `${h.ids.cdCD}`\n    );\n    b.t(\n        `global g\n        put \"global g\" & cr & \"put the short id of me into g\" into code\n        send code to bg \"b\"\\\\g`,\n        `${h.ids.bgB}`\n    );\n    b.t(\n        `global g\nput \"global g\" & cr & \"put the short id of me into g\" into code\nsend code to this stack\\\\g`,\n        `${h.ids.stack}`\n    );\n\n    /* not valid */\n    b.t('send\\\\0', 'ERR:parse err');\n    b.t('send \"put 1 into x\"\\\\0', 'ERR:MismatchedTokenException');\n    b.t('send to\\\\0', 'ERR:NoViableAltException');\n    b.t('send to this stack\\\\0', 'ERR:NoViableAltException');\n    b.t('send \"put 1 into x\" to\\\\0', 'ERR:NoViableAltException');\n    b.t('send \"put 1 into x\" this stack\\\\0', 'ERR:MismatchedTokenException');\n    b.t('send \"put 1 into x\" of this stack\\\\0', 'ERR:MismatchedTokenException');\n    b.t('send \"put 1 into x\" to \"string\"\\\\0', 'ERR:expected something like');\n    b.t('put 123 into send\\\\0', `ERR:variable name not allowed`);\n\n    /* syntax error in sent code */\n    b.t('send \"put\" to this stack\\\\0', 'ERR:4:not enough args');\n    b.t('send \"put 1 into\" to this stack\\\\0', 'ERR:4:parse err');\n    b.t('send \"put \\'1 into\" to this stack\\\\0', 'ERR:4:lex error');\n    b.t('send \"put \" & quote & \"1 into\" to this stack\\\\0', 'ERR:4:unexpected character');\n    b.t('send \"on h\" to this stack\\\\0', 'ERR:4:cannot begin');\n    b.t('send \"put 10 11 into x\" to this stack\\\\0', 'ERR:4:MismatchedTokenException');\n    b.t('send \"put 1 into cd fld id 99999\" to this stack\\\\0', 'ERR:4:element not found');\n\n    /* not exist */\n    b.t('send \"put 1 into x\" to card 10\\\\0', \"ERR:target of 'send' not found\");\n    b.t('send \"put 1 into x\" to bg \"notfound\"\\\\0', \"ERR:target of 'send' not found\");\n    b.t('send \"put 1 into x\" to cd btn 99999\\\\0', \"ERR:target of 'send' not found\");\n    b.t('send \"put 1 into x\" to cd btn id 99999\\\\0', \"ERR:target of 'send' not found\");\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* make sure that invalid code is cleaned out after a preparse failure. */\n    h.setScript(h.ids.stack, '');\n    b.t('send \"$$$#$%#$\" to this stack\\\\0', 'ERR:4:lex error');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    b.t(\n        `global g\nput \"global g\" & cr & \"put the short id of me into g\" into code\nsend code to this stack\\\\g`,\n        `${h.ids.stack}`\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* make sure that code can run after a runtime failure. */\n    h.setScript(h.ids.stack, '');\n    b.t('send \"put 1 into cd fld 999\" to this stack\\\\0', 'ERR:4:element not found');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    b.t(\n        `global g\nput \"global g\" & cr & \"put the short id of me into g\" into code\nsend code to this stack\\\\g`,\n        `${h.ids.stack}`\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* calling as a handler, like the original product could do */\n    let v = h.vcstate.vci.getModel().getById(VpcElButton, h.ids.bBC1);\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        v.setOnVel(\n            'script',\n            `\non myCompute a, b\nreturn a * a + b\nend myCompute`,\n            h.vcstate.model\n        )\n    );\n\n    b.t(\n        `send \"myCompute 2, 3\" to cd btn id ${h.ids.bBC1}\n        \\\\the result`,\n        `7`\n    );\n    b.t(\n        `send \"myCompute 2, 3\" & cr & \"return the result\" to cd btn id ${h.ids.bBC1}\n        \\\\the result`,\n        `7`\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* calling as a function */\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        v.setOnVel(\n            'script',\n            `\nfunction myCompute a, b\nreturn a * a + b\nend myCompute`,\n            h.vcstate.model\n        )\n    );\n\n    b.t(\n        `send \"myCompute(2, 3)\" to cd btn id ${h.ids.bBC1}\n        \\\\the result`,\n        `ERR:4:this isn't C`\n    );\n    b.t(\n        `send \"return myCompute(3, 3)\" to cd btn id ${h.ids.bBC1}\n        \\\\the result`,\n        `12`\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* calling as a function (can access others in that scope) */\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        v.setOnVel(\n            'script',\n            `\nfunction myDouble a\nreturn a * 2\nend myDouble\n\nfunction myCompute a, b\nreturn myDouble(a) + myDouble(b)\nend myCompute`,\n            h.vcstate.model\n        )\n    );\n\n    b.t(\n        `send \"return myCompute(2, 3)\" to cd btn id ${h.ids.bBC1}\n        \\\\the result`,\n        `10`\n    );\n    b.batchEvaluate(h);\n\n    /* the 'result' must be cleared out between calls */\n    let codeBefore = `\nfunction sometimesSetResult p\n    if p>=1 then return p * 2\nend sometimesSetResult`;\n    let got = h.testOneEvaluate(\n        '',\n        'sometimesSetResult(1) & sometimesSetResult(0) & \"a\"',\n        undefined,\n        undefined,\n        codeBefore\n    );\n    assertWarnEq('2a', got.readAsString(), 'RF|');\n    codeBefore = `\non sometimesSetResult p\n    if p>=1 then return p * 2\nend sometimesSetResult`;\n    got = h.testOneEvaluate(\n        '',\n        'sometimesSetResult(1) & sometimesSetResult(0) & \"a\"',\n        undefined,\n        undefined,\n        codeBefore\n    );\n    assertWarnEq('2a', got.readAsString(), 'RE|');\n    codeBefore = `\nfunction sometimesSetResult p\n    if length(the result) > 0 then return \"hmm\"\n    if p>=1 then return p * 2\nend sometimesSetResult`;\n    got = h.testOneEvaluate(\n        '',\n        'sometimesSetResult(1) & sometimesSetResult(0) & \"a\"',\n        undefined,\n        undefined,\n        codeBefore\n    );\n    assertWarnEq('2a', got.readAsString(), 'RD|');\n\n    /* sending an event down, it can bubble back up */\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h.vcstate.model.stack.setOnVel(\n            'script',\n            `\nfunction myCompute a, b\nreturn a * a + b\nend myCompute\n\non doTest\n    send \"myCompute 3, 4\" to cd btn id ${h.ids.go}\n    return the result\nend doTest\n`,\n            h.vcstate.model\n        )\n    );\n    got = h.testOneEvaluate('', 'doTest()');\n    assertWarnEq('13', got.readAsString(), 'RC|');\n\n    /* unless it is overridden in the button */\n    let differentFn = `\nfunction myCompute a, b\n    return 0\nend myCompute`;\n    got = h.testOneEvaluate('', 'doTest()', undefined, undefined, differentFn);\n    assertWarnEq('0', got.readAsString(), 'RB|');\n\n    /* or it is overridden in the card */\n    h.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h.vcstate.model.getCurrentCard().setOnVel(\n            'script',\n            `\nfunction myCompute a, b\n    return 1\nend myCompute`,\n            h.vcstate.model\n        )\n    );\n    got = h.testOneEvaluate('', 'doTest()');\n    assertWarnEq('1', got.readAsString(), 'RA|');\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptRunCustomFns.ts",
    "content": "\n/* auto */ import { ScriptTestBatch, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { VpcElStack } from './../../vpc/vel/velStack';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test running ViperCard scripts.\n *\n * test lexing, syntax structures like loops, functions, and handlers\n * see TestVpcScriptRunCmd for a description of testBatchEvaluate\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionScriptRunCustomFns');\nexport let testCollectionScriptRunCustomFns = t;\n\n/**\n * setup\n */\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunCustomFns>();\nt.atest('--init--vpcTestScriptRunCustomFns', async () => {\n    h = new TestVpcScriptRunCustomFns(t);\n    return h.initEnvironment();\n});\nt.test('run code with single-line if', () => {\n    let b = new ScriptTestBatch();\n    b.t(\n        `\nif 3 > 2 then put 1 into ret\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 3 > 2 then put 1 into ret\nif 3 > 2 then add 1 to ret\nif 3 > 2 then add 1 to ret\n\\\\ret`,\n        '3'\n    );\n    b.t(\n        `\nif 3 > 2 then\nif 2 > 1 then put 1 into ret\nend if\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 3 > 2 then put 1 into ret\nelse put 0 into ret\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 3 > 4 then put 1 into ret\nelse put 0 into ret\n\\\\ret`,\n        '0'\n    );\n    b.t(\n        `\nif 4 > 3 then put 2 into ret\nelse if 3 > 2 then put 1 into ret\nelse put 0 into ret\n\\\\ret`,\n        '2'\n    );\n    b.t(\n        `\nif 3 > 3 then put 2 into ret\nelse if 3 > 2 then put 1 into ret\nelse put 0 into ret\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 3 > 3 then put 2 into ret\nelse if 3 > 3 then put 1 into ret\nelse put 0 into ret\n\\\\ret`,\n        '0'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then put 1 into ret\nelse put 0 into ret\nelse\nput -1 into ret\nend if\n\\\\ret`,\n        '0'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then put 0 into ret\nelse if 2 > 1 then put 1 into ret\nelse\n    put 0 into ret\nend if\nelse\nput -1 into ret\nend if\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then put 0 into ret\nelse if 2 > 1 then put 1 into ret\nelse put 0 into ret\nelse\nput -1 into ret\nend if\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then put 0 into ret\nelse if 2 > 1 then put 1 into ret\nelse put 0 into ret\nelse if true then\nput -1 into ret\nend if\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then put 0 into ret\nelse if 2 > 1 then put 1 into ret\nelse put 0 into ret\nelse if true then put -1 into ret\n\\\\ret`,\n        '1'\n    );\n    b.t(\n        `\nif 6>5 then\nif 3 > 4 then\n    put 0 into ret\nelse if 2 > 1 then put 1 into ret\nelse put 0 into ret\nend if\n\\\\ret`,\n        '1'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand with nested calls', () => {\n    h.provideCustomFnInStackScript(`\nfunction myConcat p1, p2, p3\nglobal countCalls\nadd 1 to countCalls\nreturn p1 & p2 & p3\nlineShouldBeSkipped\nend myConcat`);\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3) into ret\n\\\\ret && countCalls`,\n        '23 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,4) into ret\n\\\\ret && countCalls`,\n        '234 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,myConcat(\"(\", 1)) into ret\n\\\\ret && countCalls`,\n        '23(1 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,myConcat(\")\", 1)) into ret\n\\\\ret && countCalls`,\n        '23)1 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,myMult(4,5)) into ret\n\\\\ret && countCalls`,\n        '2320 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,-myMult(4,5)) into ret\n\\\\ret && countCalls`,\n        '23-20 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myConcat(2,3,- myMult(4,5)) into ret\n\\\\ret && countCalls`,\n        '23-20 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myMult(2,myMult(myMult(2, 3), 4)) into ret\n\\\\ret && countCalls`,\n        '48 3'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput myMult(2,myMult(myMult((2), 3), (4))) into ret\n\\\\ret && countCalls`,\n        '48 3'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test(\"don't need to expand custom fns on these lines\", () => {\n    /* VpcLineCategory_.HandlerStart */\n    let inp = `\non myHandler myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'required comma', 2);\n\n    /* VpcLineCategory_.HandlerEnd */\n    inp = `\non myHandler\nend myHandler myFn(1, 2)`;\n    h.assertPreparseErr(inp, 'wrong line length', 3);\n\n    /* VpcLineCategory_.HandlerExit */\n    inp = `\non myHandler\nexit myHandler myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 3);\n\n    /* VpcLineCategory_.ProductExit */\n    inp = `\non myHandler\nexit to ${cProductName} myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 3);\n\n    /* VpcLineCategory_.HandlerPass */\n    inp = `\non myHandler\npass myHandler myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 3);\n\n    /* VpcLineCategory_.IfElsePlain */\n    inp = `\non myHandler\nif true then\nelse myFn(1, 2)\nend if\nend myHandler`;\n    h.assertPreparseErr(inp, 'outside of if', 5);\n\n    /* VpcLineCategory_.IfElsePlain */\n    inp = `\non myHandler\nif true then\nelse myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, \"'fn()' alone\", 4);\n\n    /* VpcLineCategory_.IfEnd */\n    inp = `\non myHandler\nif true then\nelse\nend if myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 5);\n\n    /* VpcLineCategory_.RepeatExit */\n    inp = `\non myHandler\nrepeat while false\n    exit repeat myFn(1, 2)\nend repeat\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 4);\n\n    /* VpcLineCategory_.RepeatNext */\n    inp = `\non myHandler\nrepeat while false\n    next repeat myFn(1, 2)\nend repeat\nend myHandler`;\n    h.assertPreparseErr(inp, \"just 'next repeat'\", 4);\n\n    /* VpcLineCategory_.RepeatEnd */\n    inp = `\non myHandler\nrepeat while false\n    next repeat\nend repeat myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'wrong line length', 5);\n\n    /* VpcLineCategory_.Global */\n    inp = `\non myHandler\nglobal myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'required comma', 3);\n\n    /* VpcLineCategory_.Global in list */\n    inp = `\non myHandler\nglobal a, myFn(1, 2)\nend myHandler`;\n    h.assertPreparseErr(inp, 'required comma', 3);\n});\nt.test('expand in VpcLineCategory_.ReturnExpr', () => {\n    h.provideCustomFnInStackScript(`\non theTest\n    global countCalls\n    put 0 into countCalls\n    put 4 into x\n    return myMult(2, myMult(3, x))\n    thisLineShouldNotBeHit\nend theTest\n`);\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t('theTest\\\\the result && countCalls', '24 2');\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.IfStart', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(2, myMult(3, x)) is 24 then\nput 1 into ret\nend if\\\\ret && countCalls`,\n        '1 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(myMult(3, x), 2) is 24 then\nif myMult(4, 5) is 20 then\n    put 1 into ret\nend if\nend if\\\\ret && countCalls`,\n        '1 3'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.IfElse', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    /* take first branch */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 12 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 24 then\nput 20 into ret\nelse if myMult(3, myMult(3, x)) is 36 then\nput 30 into ret\nelse\nput 40 into ret\nend if\\\\ret && countCalls`,\n        '10 2'\n    );\n    /* take second branch */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 11 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 24 then\nput 20 into ret\nelse if myMult(3, myMult(3, x)) is 36 then\nput 30 into ret\nelse\nput 40 into ret\nend if\\\\ret && countCalls`,\n        '20 4'\n    );\n    /* take third branch */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 11 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 23 then\nput 20 into ret\nelse if myMult(3, myMult(3, x)) is 36 then\nput 30 into ret\nelse\nput 40 into ret\nend if\\\\ret && countCalls`,\n        '30 6'\n    );\n    /* take fourth branch */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 11 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 23 then\nput 20 into ret\nelse if myMult(3, myMult(3, x)) is 35 then\nput 30 into ret\nelse\nput 40 into ret\nend if\\\\ret && countCalls`,\n        '40 6'\n    );\n    /* nested if */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 11 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 24 then\nif myMult(myMult(myMult(1,2),3),4) is 23 then\n    put 20 into ret\nelse if myMult(myMult(myMult(1,2),3),5) is 29 then\n    put 30 into ret\nelse if myMult(myMult(myMult(1,2),3),6) is 36 then\n    put 1 into ret\nelse if myMult(myMult(myMult(1,2),3),7) is 42 then\n    put 40 into ret\nend if\nelse if myMult(3, myMult(3, x)) is 36 then\nput 50 into ret\nend if\\\\ret && countCalls`,\n        '1 13'\n    );\n    /* nested if, 3 levels */\n    b.t(\n        `\nput 0 into countCalls\nput 4 into x\nput 0 into ret\nif myMult(1, myMult(3, x)) is 11 then\nput 10 into ret\nelse if myMult(2, myMult(3, x)) is 23 then\nput 20 into ret\nelse if myMult(3, myMult(3, x)) is 36 then\nif myMult(myMult(myMult(1,2),3),4) is 23 then\n    put 30 into ret\nelse if myMult(myMult(myMult(1,2),3),5) is 30 then\n    if myMult(x,5) is 19 then\n        put 40 into ret\n    else if myMult(x,6) is 24 then\n        put 1 into ret\n    else if myMult(x,7) is 28 then\n        put 50 into ret\n    end if\nelse if myMult(myMult(myMult(1,2),3),7) is 42 then\n    put 60 into ret\nend if\nend if\\\\ret && countCalls`,\n        '1 14'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in simple repeats', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    /* repeat with x */\n    /* confirmed in emulator the fn only called once */\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = 1 to myMult(2,3)\nput x after s\nend repeat\\\\s && countCalls`,\n        '123456 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = 9 down to myMult(2,3)\nput x after s\nend repeat\\\\s && countCalls`,\n        '9876 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = myMult(2,3) to 9\nput x after s\nend repeat\\\\s && countCalls`,\n        '6789 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = myMult(2,3) down to 1\nput x after s\nend repeat\\\\s && countCalls`,\n        '654321 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = myMult(2,3) to myMult(3,3)\nput x after s\nend repeat\\\\s && countCalls`,\n        '6789 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat with x = myMult(3,3) down to myMult(2,3)\nput x after s\nend repeat\\\\s && countCalls`,\n        '9876 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat myMult(2,3) times\nput \"-\" after s\nend repeat\\\\s && countCalls`,\n        '------ 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput \"\" into s\nrepeat myMult(1,3)\nput \"-\" after s\nend repeat\\\\s && countCalls`,\n        '--- 1'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in repeat while/until', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    /* repeat while */\n    /* confirmed in emulator the fn is called at every point */\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nput \"\" into s\nrepeat while x < myMult(2,3)\nput x after s\nadd 1 to x\nend repeat\\\\s && countCalls`,\n        '12345 6'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nput \"\" into s\nrepeat while myMult(2,3) >= x\nput x after s\nadd 1 to x\nend repeat\\\\s && countCalls`,\n        '123456 7'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nput \"\" into s\nrepeat until myMult(2,3) < x\nput x after s\nadd 1 to x\nend repeat\\\\s && countCalls`,\n        '123456 7'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nput \"\" into s\nrepeat until x >= myMult(2,3)\nput x after s\nadd 1 to x\nend repeat\\\\s && countCalls`,\n        '12345 6'\n    );\n    /* nested repeat */\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nput \"\" into s\nrepeat while x < myMult(2,3)\nput 1 into y\nrepeat while y < myMult(1,3)\n    put x & \"/\" & y & \",\" after s\n    add 1 to y\nend repeat\nadd 1 to x\nend repeat\\\\s && countCalls`,\n        '1/1,1/2,2/1,2/2,3/1,3/2,4/1,4/2,5/1,5/2, 21'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.built in command', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t(\n        `\nput 0 into countCalls\nset the left of cd fld \"p1\" of card \"c\" to 1\nset the left of cd fld \"p1\" of card \"c\" to myMult(2,3)\n\\\\the left of cd fld \"p1\" of card \"c\" && countCalls`,\n        '6 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nset the left of cd fld \"p1\" of card \"c\" to 1\nset the left of cd fld (\"p\" & myMult(1,1)) of card \"c\" to myMult(2,3)\n\\\\the left of cd fld \"p1\" of card \"c\" && countCalls`,\n        '6 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nadd myMult(2,3) to x\\\\x && countCalls`,\n        '7 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into x\nadd myMult(2,myMult(1,3)) to x\\\\x && countCalls`,\n        '7 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into cd fld \"p1\" of card \"c\"\nadd myMult(2,3) to cd fld \"p1\" of card \"c\"\n\\\\cd fld \"p1\" of card \"c\" && countCalls`,\n        '7 1'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into cd fld \"p1\" of card \"c\"\nadd myMult(2,3) to cd fld (\"p\" & myMult(1,1)) of card \"c\"\n\\\\cd fld \"p1\" of card \"c\" && countCalls`,\n        '7 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into cd fld \"p1\" of card \"c\"\nput myMult(2,myMult(1,3)) into cd fld \"p1\" of card \"c\"\n\\\\cd fld \"p1\" of card \"c\" && countCalls`,\n        '6 2'\n    );\n    b.t(\n        `\nput 0 into countCalls\nput 1 into cd fld \"p1\" of card \"c\"\nput myMult(2,myMult(1,3)) into cd fld (\"p\" & myMult(1,1)) of card \"c\"\n\\\\cd fld \"p1\" of card \"c\" && countCalls`,\n        '6 3'\n    );\n\n    /* across escaped lines */\n    b.t(\n        `\nput myMult(2,3) + myMult(1,3) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput myMult(2,3) + \\\\\\n myMult(1,3) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(1,3) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(1, \\\\\\n 3) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(\\\\\\n 1, 3\\\\\\n) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(\\\\\\n1\\\\\\n,\\\\\\n3\\\\\\n) into x\n{RESULT}x`,\n        '9'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(2, \\\\\\n myMult(3, \\\\\\n 4)) into x\n{RESULT}x`,\n        '30'\n    );\n    b.t(\n        `\nput 6 + \\\\\\n myMult(1, \\\\\\n 3) + myMult(\\\\\\n 1, 3) + myMult(1, 3 \\\\\\n) into x\n{RESULT}x`,\n        '15'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.GoCardImpl', () => {\n    h.provideCustomFnInStackScript();\n    let numExpectedCalls = 2;\n    /* in rewrites we currently expand it twice, not perfect but good enough */\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n\n    /* go to card */\n    b.t(\n        `\n    put 0 into countCalls\n    go to card myMult(1,1)\n    put the short id of this cd is the short id of card 1 into ret\n    \\\\ret && countCalls`,\n        `true ${numExpectedCalls}`\n    );\n    b.t(\n        `\n    put 0 into countCalls\n    go to card (1 + myMult(1,1))\n    put the short id of this cd is the short id of card 2 into ret\n    \\\\ret && countCalls`,\n        `true ${numExpectedCalls}`\n    );\n    b.t(\n        `\n    put 0 into countCalls\n    go to card myMult(1,3)\n    put the short id of this cd is the short id of card 3 into ret\n    \\\\ret && countCalls`,\n        `true ${numExpectedCalls}`\n    );\n    b.t(\n        `\n    put 0 into countCalls\n    go to card (myMult(3,1) + myMult(1,1))\n    put the short id of this cd is the short id of card 4 into ret\n    \\\\ret && countCalls`,\n        `true ${2 * numExpectedCalls}`\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.CallDynamic', () => {\n    h.provideCustomFnInStackScript();\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t(\n        `\nglobal g\nput 0 into countCalls\ndo \"global g\" & cr & \"put \" & myMult(2,3) & \" + 1 into g\"\n\\\\g && countCalls`,\n        '7 1'\n    );\n    b.t(\n        `\nglobal g\nput 0 into countCalls\nsend \"global g\" & cr & \"put \" & myMult(2,3) & \" + 1 into g\" to this card\n\\\\g && countCalls`,\n        '7 1'\n    );\n\n    b.batchEvaluate(h);\n});\nt.test('expand in VpcLineCategory_.CallHandler', () => {\n    h.provideCustomFnInStackScript(`\non theTest p1, p2\nglobal g\nput p1+p2 into g\nend theTest\n`);\n    let b = new ScriptTestBatch();\n    b.t('global countCalls\\\\0', '0');\n    b.t(\n        `\nglobal g\nput 0 into countCalls\ntheTest 4, 5\n\\\\g && countCalls`,\n        '9 0'\n    );\n    b.t(\n        `\nglobal g\nput 0 into countCalls\ntheTest 4, myMult(2,3)\n\\\\g && countCalls`,\n        '10 1'\n    );\n    b.t(\n        `\nglobal g\nput 0 into countCalls\ntheTest myMult(2,3), myMult(3,3)\n\\\\g && countCalls`,\n        '15 2'\n    );\n    b.t(\n        `\nglobal g\nput 0 into countCalls\ntheTest myMult(2,myMult(3,4)), myMult(5,6)\n\\\\g && countCalls`,\n        '54 3'\n    );\n\n    b.batchEvaluate(h);\n});\n\n/**\n * new features of TestVpcScriptRunBase for running custom functions\n */\nclass TestVpcScriptRunCustomFns extends TestVpcScriptRunBase {\n    /**\n     * in case it's not already there, provide myMult in the stack script\n     */\n    provideCustomFnInStackScript(addCode = '') {\n        let stack = h.vcstate.model.getById(VpcElStack, h.ids.stack);\n        h.vcstate.vci.doWithoutAbilityToUndo(() =>\n            stack.setOnVel(\n                'script',\n                `\n    function myMult p1, p2\n        global countCalls\n        add 1 to countCalls\n        return p1 * p2\n    end myMult\n    ${addCode}`,\n                h.vcstate.model\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestScriptRunSyntax.ts",
    "content": "\n/* auto */ import { VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { ScriptTestBatch, TestVpcScriptRunBase } from './vpcTestScriptRunBase';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { assertEq, assertWarnEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * test running ViperCard scripts.\n *\n * test lexing, syntax structures like loops, functions, and handlers\n * see _TestVpcScriptRunCmd_ for a description of testBatchEvaluate\n */\n\nlet t = new SimpleUtil512TestCollection('testCollectionvpcScriptRunSyntax');\nexport let testCollectionvpcScriptRunSyntax = t;\n\nlet h = YetToBeDefinedTestHelper<TestVpcScriptRunBase>();\nt.atest('--init--testCollectionvpcScriptRunSyntax', async () => {\n    h = new TestVpcScriptRunBase(t);\n    return h.initEnvironment();\n});\nt.test('vpcTestScriptBasics', () => {\n    let b = new ScriptTestBatch();\n    /* runtime error */\n    b.t('put unknownVar into x\\\\x', 'ERR:no variable');\n    /* valid statement */\n    b.t('put 9 into x\\\\x', '9');\n    /* also a valid statement */\n    b.t('9', '9');\n    /* preparse error1 */\n    b.t('x = 4\\\\0', \"PREPARSEERR:this isn't C\");\n    /* preparse error2 */\n    b.t('put ?? into x\\\\0', 'PREPARSEERR:');\n    b.batchEvaluate(h);\n\n    /* get a different string */\n    assertAsserts('RN|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('x = 4\\\\0', 'PREPARSEERR:(incorrectmessage)');\n        b.batchEvaluate(h);\n    });\n    assertAsserts('RM|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put unknownVar into x\\\\x', 'ERR:(incorrectmessage)x');\n        b.batchEvaluate(h);\n    });\n    assertAsserts('RL|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put 9 into x\\\\x', '11111');\n        b.batchEvaluate(h);\n    });\n    /* failure expected, but succeeds */\n    assertAsserts('RK|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put 9 into x\\\\0', 'PREPARSEERR:');\n        b.batchEvaluate(h);\n    });\n    assertAsserts('RJ|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put 9 into x\\\\x', 'ERR:');\n        b.batchEvaluate(h);\n    });\n    assertAsserts('RI|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put unknownVar into x\\\\x', '1111');\n        b.batchEvaluate(h);\n    });\n    /* same as above, but more tests in the array */\n    assertAsserts('RH|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put 5 into x\\\\x', '5');\n        b.t('put 9 into x\\\\x', 'ERR:');\n        b.batchEvaluate(h);\n    });\n    assertAsserts('RG|', 'assert:', () => {\n        let b = new ScriptTestBatch();\n        b.t('put 3 into x\\\\x', '3');\n        b.t('put unknownVar into x\\\\x', '1111');\n        b.batchEvaluate(h);\n    });\n});\nt.test('checkLexing', () => {\n    let b = new ScriptTestBatch();\n    /* empty lines don't interfere with scripts */\n    b.t('\\n\\n\\n\\nput 1 into t1\\n\\n\\n\\\\t1', '1');\n\n    /* wrong indentation doesn't interfere with scripts */\n    b.t('\\n         put 1 into t2\\n\\\\t2', '1');\n    b.t('\\n\\t\\t\\t\\t\\tput 1 into t3\\n\\\\t3', '1');\n\n    /* trailing whitespace doesn't interfere with scripts */\n    b.t('\\nput 1 into t4           \\n\\\\t4', '1');\n    b.t('\\nput 1 into t5\\t\\t\\t\\t\\t\\n\\\\t5', '1');\n\n    /* continued lines */\n    b.t('put 1 {BSLASH}\\n into t6\\\\t6', '1');\n    b.t('put {BSLASH}\\n 1 {BSLASH}\\n into {BSLASH}\\n t7\\\\t7', '1');\n    b.t('put 8 into t8{BSLASH}\\n{BSLASH}\\n{BSLASH}\\n\\\\t8', '8');\n    b.t('{BSLASH}\\n{BSLASH}\\n{BSLASH}\\nput 9 into t9\\\\t9', '9');\n\n    /* continued lines with whitespace after the backslash */\n    b.t('put 1 {BSLASH} \\n into t6\\\\t6', '1');\n    b.t('put {BSLASH}\\t  \\n 1 {BSLASH}\\t  \\n into {BSLASH}\\t  \\n t7\\\\t7', '1');\n\n    /* continued lines should still show errors on the expected line */\n    b.t('put {BSLASH}\\n xyz000 into tnot\\\\tnot', 'ERR:no variable found with this name');\n    b.t('put xyz000 into tnot\\\\tnot', 'ERR:no variable found with this name');\n    b.t('1 {BSLASH}\\n + {BSLASH}\\n xyz000', 'ERR:no variable found with this name');\n\n    /* continue a across a line */\n    b.t('put \"a\" & {BSLASH}\\n \"b\" into test\\\\test', 'ab');\n    b.t('put 2 + {BSLASH}\\n 3 into test\\\\test', '5');\n\n    /* string literal can contain comment symbols */\n    b.t('put \"--thetest\" into test\\\\test', '--thetest');\n    b.t('put \"  --thetest\" into test\\\\test', '  --thetest');\n    b.t('put \"aa--thetest\" into test\\\\test', 'aa--thetest');\n    b.t('put \"aa--thetest--test\" into test\\\\test', 'aa--thetest--test');\n\n    /* lexing: most but not all constructs need whitespace */\n    b.t('2*3*4', '24');\n    b.t('2 * 3 * 4', '24');\n    b.t('put 2 into myvar\\\\myvar', '2');\n    b.t('2*myvar*3', '12');\n    b.t('7 mod 3', '1');\n    b.t('7 div 3', '2');\n    b.t('put 90 into mod3\\\\mod3', '90');\n    b.t('put 91 into div3\\\\div3', '91');\n\n    /* lexing: strings don't need space */\n    b.t('\"a\"&\"b\"', 'ab');\n    b.t('\"a\"&&\"b\"', 'a b');\n    b.t('\"single\\'quotes ok\"', \"single'quotes ok\");\n    b.t('\"single\\'quotes\\'ok\"', \"single'quotes'ok\");\n\n    /* it is ok if identifiers contain a keyword. (\"of\" is a keyword) */\n    /* if \"of\" is a keyword, \"of_\" is still an ok variable name */\n    /* this is why it's important that the lexer regex is */\n    /* /of(?![a-zA-Z0-9_])/ and not just /of/ */\n    b.t('put 9 into put4into\\\\put4into', '9');\n    b.t('put 9 into ofa\\\\ofa', '9');\n    b.t('put 9 into ofcards\\\\ofcards', '9');\n    b.t('put 9 into ofnumber\\\\ofnumber', '9');\n    b.t('put 9 into ofto\\\\ofto', '9');\n    b.t('put 9 into of_to\\\\of_to', '9');\n    b.t('put 9 into ofa\\\\ofa', '9');\n    b.t('put 9 into ofA\\\\ofA', '9');\n    b.t('put 9 into of1\\\\of1', '9');\n    b.t('put 9 into aof\\\\aof', '9');\n    b.t('put 9 into Aof\\\\Aof', '9');\n    b.t('put 9 into Zof\\\\Zof', '9');\n    b.t('put 9 into a\\\\a', '9'); /* used to be disallowed */\n    b.t('put 9 into aa\\\\aa', '9');\n    b.t('put 9 into a4\\\\a4', '9');\n\n    /* most token types can't be used as a var name */\n    b.t('put 9 into length\\\\0', 'ERR:name not');\n    b.t('put 9 into if\\\\0', 'ERR:name not allowed');\n    b.t('put 9 into 4\\\\0', 'ERR:parse error');\n    b.t('put 9 into short\\\\0', 'PREPARSEERR:');\n    b.t('put 9 into long\\\\0', 'PREPARSEERR:');\n    b.t('put 9 into id\\\\0', 'PREPARSEERR:');\n    b.t('put 9 into in\\\\0', 'PREPARSEERR:');\n    b.t('put 9 into and\\\\0', 'PREPARSEERR:');\n\n    /* constants can't be used as a var name */\n    b.t('put 9 into pi\\\\0', 'ERR:a constant');\n    b.t('put 9 into space\\\\0', 'ERR:a constant');\n    b.t('put 9 into left\\\\0', 'ERR:a constant');\n    b.t('put 9 into underline\\\\0', 'ERR:a constant');\n    b.t('put 9 into radio\\\\0', 'ERR:a constant');\n\n    /* other reserved words can't be used as a var name */\n    b.t('put 9 into dialogs\\\\0', 'ERR:name not allowed');\n    b.t('put 9 into set\\\\0', 'ERR:name not allowed');\n    b.t('put 9 into pass\\\\0', 'ERR:name not allowed');\n    b.t('put 9 into exit\\\\0', 'ERR:name not allowed');\n\n    /* property names can be used as a var name, even\n        if they are a different token type.\n        go through every HAnyAllowedVariableName */\n    b.t('put 9 into autohilite\\\\autohilite', '9');\n    b.t('put 9 into number\\\\number', '9');\n    b.t('put 9 into a\\\\a', '9');\n    b.t('put 9 into autotab\\\\autotab', '9');\n    b.t('put 9 into enabled\\\\enabled', '9');\n    b.t('put 9 into textfont\\\\textfont', '9');\n    b.t('put 9 into label\\\\label', '9');\n    b.t('put 9 into alltext\\\\alltext', '9');\n\n    /* different tkidentifiers */\n    b.t('put 9 into _underscore_ok\\\\0', 'PREPARSEERR:lex err');\n    b.t('put 9 into underscore_ok\\\\underscore_ok', '9');\n    b.t('put 9 into $dollar$ok\\\\0', 'PREPARSEERR:lex err');\n    b.t('put 9 into dollar$ok\\\\dollar$ok', '9');\n    b.t('put 9 into 1var1\\\\0', 'PREPARSEERR:lex err');\n    b.t('put 9 into var1\\\\var1', '9');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* adding a letter or number makes it ok as a var name */\n    b.t('put 9 into ofa\\\\ofa', '9');\n    b.t('put 9 into lengtha\\\\lengtha', '9');\n    b.t('put 9 into ifa\\\\ifa', '9');\n    b.t('put 9 into shorta\\\\shorta', '9');\n    b.t('put 9 into ida\\\\ida', '9');\n    b.t('put 9 into ina\\\\ina', '9');\n    b.t('put 9 into pia\\\\pia', '9');\n    b.t('put 9 into dialogsa\\\\dialogsa', '9');\n    b.t('put 9 into exita\\\\exita', '9');\n    b.t('put 9 into labela\\\\labela', '9');\n    b.t('put 9 into of1\\\\ofa', '9');\n    b.t('put 9 into length1\\\\lengtha', '9');\n    b.t('put 9 into if1\\\\ifa', '9');\n    b.t('put 9 into short1\\\\shorta', '9');\n    b.t('put 9 into id1\\\\ida', '9');\n    b.t('put 9 into in1\\\\ina', '9');\n    b.t('put 9 into pi1\\\\pia', '9');\n    b.t('put 9 into dialogs1\\\\dialogsa', '9');\n    b.t('put 9 into exit1\\\\exita', '9');\n    b.t('put 9 into label1\\\\labela', '9');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* string literal cannot contain contline symbol since it has a newline */\n    h.assertPreparseErrLn('put \"a\\nb\" into test', '', 3);\n    h.assertPreparseErrLn(\n        'put \"a{BSLASH}\\nb\" into test',\n        'unexpected character: ->\"<-',\n        3\n    );\n    h.assertPreparseErrLn('put \"{BSLASH}\\n\" into test', 'unexpected character: ->\"<-', 3);\n    h.assertPreparseErrLn(\n        'put \"{BSLASH}\\n{BSLASH}\\n\" into test',\n        'unexpected character: ->\"<-',\n        3\n    );\n    h.assertPreparseErrLn(\n        'put {BSLASH}\\n\"{BSLASH}\\n{BSLASH}\\n\"{BSLASH}\\n into test',\n        'unexpected character: ->\"<-',\n        4\n    );\n\n    /* we changed lexer to disallow this, since it is clearly wrong */\n    b.t('put 3into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 3into into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 3sin into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 3of into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 3id into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 3e into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 7mod3 into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 7mod 3 into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 7div3 into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 7div 3 into test\\\\0', 'PREPARSEERR:unexpected character');\n    b.t('put 7 div3 into x\\\\x', 'ERR:parse error');\n    b.t('put 7 mod3 into x\\\\x', 'ERR:parse error');\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* for keywords/semikeywords that would be a common variable name, check */\n    b.t('x = 4\\\\0', \"PREPARSEERR:this isn't C\");\n    b.t('xyz(4)\\\\0', \"PREPARSEERR:this isn't C\");\n    b.t('sin(4)\\\\0', \"PREPARSEERR:this isn't C\");\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* plus and minus */\n    b.t(`get 1 + 2 -- + 3 -- + 4\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2 -- + 3 + 4\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2 -- + 3\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2 -- 3\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2 --3\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2--3\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2-- 3\\n put it into x\\\\x`, '3');\n    b.t(`get 1 + 2- -3\\n put it into x\\\\x`, '6');\n    b.t(`get 1 + 2 - -3\\n put it into x\\\\x`, '6');\n    b.t(`get 1 + 2 - - 3\\n put it into x\\\\x`, '6');\n    b.t(`put 1 into x\\n -- put x + 1 into x\\n put x into x\\\\x`, '1');\n    b.t(\n        `put 1 into x\n-- put x + 1 into x\n-- put x + 1 into x\n-- put x + 1 into x\nput x into x\\\\x`,\n        '1'\n    );\n    b.t(\n        `put 1 into x--'lex''error' #$%$%\n-- put x + 1 into x 'lex''error' #$%$%\nput x into x\\\\x`,\n        '1'\n    );\n    b.t(\n        `put 1 into x--parse 0 error 0 number number number\n-- put x + 1 into x 0 parse 0 error 0 number number number\nput x into x\\\\x`,\n        '1'\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* lexing: baseline for runGeneralCode */\n    h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS('(placeholder)'));\n    h.runGeneralCode('', 'global testresult \\n put 123.0 into testresult');\n    assertEq(\n        '123',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '24|'\n    );\n\n    /* lexing: invalid num literals */\n    b.t('put . into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put .5 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put x.5 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put e.5 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put .e into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put .e2 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put .e+2 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put .3e into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 3.4e into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 3.4e 2 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 3.4ee into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 3.4e4e into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 3.44. into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 0..1 into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put 4.. into x\\\\0', 'PREPARSEERR:3:unexpected character');\n\n    /* lexing: invalid string literals */\n    b.t('put \"abc into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"abc\\ndef\" into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"\\n\" into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \" into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"\"\" into x\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put a\"\" into x\\\\0', 'ERR:4:Expecting');\n    b.t('put \"\"a into x\\\\0', 'PREPARSEERR:3:unexpected');\n    b.t('put a\"\"a into x\\\\0', 'PREPARSEERR:3:unexpected');\n    b.t('put 1\"\" into x\\\\0', 'ERR:4:Expecting');\n    b.t('put \"\"1 into x\\\\0', 'PREPARSEERR:3:unexpected');\n    b.t('put 1\"\"1 into x\\\\0', 'PREPARSEERR:3:unexpected');\n    b.t('put \"\"\"\" into x\\\\0', 'ERR:4:Expecting');\n    b.t('put \"a\"\"b\" into x\\\\0', 'ERR:4:Expecting');\n    b.t('put \"a\" \"b\" into x\\\\0', 'ERR:4:Expecting');\n\n    /* invalid identifiers */\n    b.t('put \"abc\" into 1\\\\0', 'ERR:4:parse err');\n    b.t('put \"abc\" into 1 x\\\\0', 'ERR:4:parse err');\n    b.t('put \"abc\" into b c\\\\0', 'ERR:4:parse err');\n    b.t('put \"abc\" into \"def\"\\\\0', 'ERR:4:parse err');\n    b.t('put \"abc\" into \\x03\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"abc\" into b\\x03\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"abc\" into \\xf1\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.t('put \"abc\" into b\\xf1\\\\0', 'PREPARSEERR:3:unexpected character');\n    b.batchEvaluate(h);\n\n    /* not valid because it's something else */\n    let notvalid = longstr(\n        `pi,one,true,cr,autohilite,style,cursor,dontwrap,\n            script,owner,name,target,sin,result,params,\n            mouse,screenrect,from,into,after,before,at,with,on,\n            short,long,id,any,tenth,\n            end,exit,pass,return,if,else,while,until,global`,\n        ''\n    );\n\n    /* not 'id' 'of' 'length' 'first' because they are different tokens */\n    let disallowedAsHandler = notvalid.split(',');\n\n    /* don't check for local var use/global var/param any more,\n    there are many more var names we now allow  */\n\n    /* can't use this as a name for handlers */\n    h.assertPreparseErr(`on if\\nglobal x\\nend if`, \"can't have\", 3);\n    for (let reserved of disallowedAsHandler.filter(s => s !== 'if')) {\n        h.assertPreparseErr(\n            `on ${reserved}\\nglobal x\\nend ${reserved}`,\n            \"don't support\",\n            1\n        );\n    }\n\n    /* can't use this as a name for calling a handler */\n    let unaryProps = longstr(\n        `,autohilite,style,dontwrap,script,\n        owner,name,`,\n        ''\n    );\n    let diffTks = ',short,long,id,any,tenth,target,';\n    for (let reserved of disallowedAsHandler) {\n        let isPreparse = true;\n        let expectErr = \"don't support\";\n        if (reserved === 'on') {\n            expectErr = `don't support`;\n        } else if (reserved === 'end' || reserved === 'exit' || reserved === 'pass') {\n            expectErr = 'wrong line length';\n        } else if (reserved === 'if') {\n            expectErr = 'no \"then\"';\n        } else if (reserved === 'else') {\n            expectErr = 'else outside';\n        } else if (reserved === 'return') {\n            expectErr = 'Redundant';\n            isPreparse = false;\n        } else if (\n            unaryProps.includes(`,${reserved},`) ||\n            diffTks.includes(`,${reserved},`)\n        ) {\n            expectErr = 'not a valid';\n        }\n\n        h.runGeneralCode('', `${reserved} 1, 2, 3`, expectErr, 3, isPreparse);\n    }\n});\nt.test('ifStatementsAndRepeats', () => {\n    let b = new ScriptTestBatch();\n    b.t(\n        `put 2 into x\nif 2+3 > 4 then\nput 3 into x\nend if` + '\\\\x',\n        '3'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 < 4 then\nput 3 into x\nend if` + '\\\\x',\n        '2'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 > 4 and the number of cds in this stack is in \"456\" then\nput 3 into x\nend if` + '\\\\x',\n        '3'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 > 4 and the number of cds in this stack is not in \"456\" then\nput 3 into x\nend if` + '\\\\x',\n        '2'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 < 4 or the number of cds in this stack is in \"456\" then\nput 3 into x\nend if` + '\\\\x',\n        '3'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 < 4 or the number of cds in this stack is not in \"456\" then\nput 3 into x\nend if` + '\\\\x',\n        '2'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 < 4 then\nput 3 into x\nelse if 2+3 is 6 then\nput 4 into x\nend if` + '\\\\x',\n        '2'\n    );\n    b.t(\n        `put 2 into x\nif 2+3 < 4 then\nput 3 into x\nelse if 2+3 is 5 then\nput 4 into x\nend if` + '\\\\x',\n        '4'\n    );\n    b.t(\n        `if 2+3 < 4 then\nput 100 into x\nelse\nput 101 into x\nend if` + '\\\\x',\n        '101'\n    );\n    b.t(\n        `if 2+3 > 4 then\nput 100 into x\nelse\nput 101 into x\nend if` + '\\\\x',\n        '100'\n    );\n\n    /* use counter to see which loop conditions have been evaluated */\n    b.t(\n        `put counting() into cfirst\nif char 1 of counting() is \"z\" or 2+3 is 5 then\nput 1000 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 6 then\nput 1001 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 7 then\nput 1002 into x\nelse\nput 1003 into x\nend if` + '\\\\x && (counting() - cfirst)',\n        '1000 2'\n    );\n    b.t(\n        `put counting() into cfirst\nif char 1 of counting() is \"z\" or 2+3 is 4 then\nput 1000 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 5 then\nput 1001 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 6 then\nput 1002 into x\nelse\nput 1003 into x\nend if` + '\\\\x && (counting() - cfirst)',\n        '1001 3'\n    );\n    b.t(\n        `put counting() into cfirst\nif char 1 of counting() is \"z\" or 2+3 is 3 then\nput 1000 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 4 then\nput 1001 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 5 then\nput 1002 into x\nelse\nput 1003 into x\nend if` + '\\\\x && (counting() - cfirst)',\n        '1002 4'\n    );\n    b.t(\n        `put counting() into cfirst\nif char 1 of counting() is \"z\" or 2+3 is 2 then\nput 1000 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 3 then\nput 1001 into x\nelse if char 1 of counting() is \"z\" or 2+3 is 4 then\nput 1002 into x\nelse\nput 1003 into x\nend if` + '\\\\x && (counting() - cfirst)',\n        '1003 4'\n    );\n\n    /* order matters */\n    b.t(\n        `if char 1 of \"abc\" is \"b\" then\nput 20 into x\nelse if char 1 of \"abc\" is \"a\" then\nput 21 into x\nelse if true then\nput 22 into x\nend if\\\\x`,\n        '21'\n    );\n\n    /* nested if */\n    b.t(\n        `if 4 > 3 then\nif 4 > 2 then\nif 4 > 1 then\nput 100 into x\nend if\nend if\nend if\\\\x`,\n        '100'\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* repeats */\n    /* we use 'counting()' to see how often the condition is evaluated. */\n    /* confirmed in the product that a loop bound like\n    repeat with x = 1 to the length of abc\n    is only evaluated once! */\n\n    /* simple loop */\n    b.t(\n        `put \"a\" into s\nput 0 into i\nrepeat while i<3\nput s && i into s\nput i+1 into i\nend repeat\\\\s`,\n        `a 0 1 2`\n    );\n\n    /* condition never true */\n    b.t(\n        `put \"a\" into s\nput 0 into i\nrepeat while i>0\nput s && i into s\nput i+1 into i\nend repeat\\\\s`,\n        `a`\n    );\n\n    /* simple loop */\n    b.t(\n        `put \"b\" into s\nput 0 into i\nrepeat until i>=3\nput s && i into s\nput i+1 into i\nend repeat\\\\s`,\n        `b 0 1 2`\n    );\n\n    /* condition never true */\n    b.t(\n        `put \"b\" into s\nput 0 into i\nrepeat until i>=0\nput s && i into s\nput i+1 into i\nend repeat\\\\s`,\n        `b`\n    );\n\n    /* nested loop, and a second loop right after the first */\n    b.t(\n        `put \"a\" into s\nput 0 into i\nrepeat while i<3\nput 0 into j\nrepeat while j<2\nput s && \"j\" & j into s\nput j+1 into j\nend repeat\nput s && i into s\nput i+1 into i\nend repeat\nrepeat while j<4\nput s && \"j\" & j into s\nput j+1 into j\nend repeat\\\\s`,\n        `a j0 j1 0 j0 j1 1 j0 j1 2 j2 j3`\n    );\n\n    /* inner loop changes iteration count */\n    b.t(\n        `put \"a\" into s\nput 0 into i\nrepeat while i<3\nput i+1 into i\nput 0 into j\nrepeat while j<i\nput s && i & \",\" & j into s\nput j+1 into j\nend repeat\nend repeat\\\\s`,\n        `a 1,0 2,0 2,1 3,0 3,1 3,2`\n    );\n\n    /* condition must be checked every iteration */\n    b.t(\n        `put \"b\" into s\nput 0 into i\nput counting() into firstc\nrepeat until i>=(3 + counting() * 0)\nput s && i into s\nput i+1 into i\nend repeat\\\\s && (counting() - firstc)`,\n        `b 0 1 2 5`\n    );\n\n    /* \"with\" syntax rewriting, simplest form. */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 1 to (counting() * 0 + 3)\nput s && \"a\" & x into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a1 a2 a3 2`\n    );\n\n    /* \"with\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 1 to (counting() * 0 + 0)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* \"with\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 1 to (counting() * 0 - 1)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* \"with\" syntax rewriting, loop done once */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 1 to (counting() * 0 + 1)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a 2`\n    );\n\n    /* \"with down\" syntax rewriting, simplest form. */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 3 down to (counting() * 0)\nput s && \"a\" & x into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a3 a2 a1 a0 2`\n    );\n\n    /* \"with down\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 0 down to (counting() * 0 + 1)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* \"with down\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = -1 down to (counting() * 0 + 1)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* \"with down\" syntax rewriting, loop done once */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = 4 down to (counting() * 0 + 4)\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a 2`\n    );\n\n    /* \"with\" syntax rewriting, expect start only eval'd once */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat with x = (counting() * 0 + 1) to 3\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a a a 2`\n    );\n\n    /* \"with\" syntax rewriting, nested loop */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 to 2\n    repeat with j = 0 to 1\n        put s && \"j\" & j into s\n    end repeat\n    put s && i into s\nend repeat\nrepeat with k = j to 4\n    put s && \"k\" & k into s\nend repeat\\\\s`,\n        `a j0 j1 0 j0 j1 1 j0 j1 2 k1 k2 k3 k4`\n    );\n\n    /* \"with\" syntax rewriting, inner loop count changes */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 + 0 to 2 + 0\nrepeat with j = 0 + 0 to i\nput s && (i+1) & \",\" & j into s\nend repeat\nend repeat\\\\s`,\n        `a 1,0 2,0 2,1 3,0 3,1 3,2`\n    );\n\n    /* \"times\" syntax rewriting, simplest form. */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat (counting() * 0 + 3) times\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a a a a 2`\n    );\n\n    /* \"times\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat (counting() * 0 + 0) times\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* \"times\" syntax rewriting, loop never done */\n    b.t(\n        `put \"a\" into s\nput counting() into firstc\nrepeat (counting() * 0 - 1) times\nput s && \"a\" into s\nend repeat\\\\s && (counting() - firstc)`,\n        `a 2`\n    );\n\n    /* simple test next repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 3\nput s && x into s\nnext repeat\nput \"_\" into s\nend repeat\\\\s`,\n        `a 1 2 3`\n    );\n\n    /* simple test exit repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 3\nput s && x into s\nexit repeat\nput \"_\" into s\nend repeat\\\\s`,\n        `a 1`\n    );\n\n    /* next repeat in the nested loop */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 to 2\nrepeat with j = 0 to i\nput s && (i+1) & \",\" & j into s\nnext repeat\nput \"_\" into s\nend repeat\nend repeat\\\\s`,\n        `a 1,0 2,0 2,1 3,0 3,1 3,2`\n    );\n\n    /* next repeat out of the nested loop */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 to 2\nrepeat with j = 0 to i\nput s && (i+1) into s\nput s & \",\" & j into s\nend repeat\nnext repeat\nput \"_\" into s\nend repeat\\\\s`,\n        `a 1,0 2,0 2,1 3,0 3,1 3,2`\n    );\n\n    /* exit repeat in the nested loop */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 to 2\nrepeat with j = 0 to i\nput s && (i+1) & \",\" & j into s\nexit repeat\nput \"_\" into s\nend repeat\nend repeat\\\\s`,\n        `a 1,0 2,0 3,0`\n    );\n\n    /* exit repeat out of the nested loop */\n    b.t(\n        `put \"a\" into s\nrepeat with i = 0 to 2\nrepeat with j = 0 to i\nput s && (i+1) into s\nput s & \",\" & j into s\nend repeat\nexit repeat\nput \"_\" into s\nend repeat\\\\s`,\n        `a 1,0`\n    );\n\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* repeats and if statements */\n    /* if statement inside a loop */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 4\nif x == 2 or x == 4 then\nput s && x into s\nend if\nend repeat\\\\s`,\n        `a 2 4`\n    );\n    /* nested if statement inside a loop */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 5\nif x >= 3 then\nif x >= 4 then\n    if x >= 5 then\n        put \"got5\" after s\n    else\n        put \"got4\" after s\n    end if\nelse\n    put \"got3\" after s\nend if\nelse\nif x >= 2 then\n    put \"got2\" after s\nelse\n    if x >= 1 then\n        put \"got1\" after s\n    else\n        put \"_\" after s\n    end if\nend if\nend if\nend repeat\\\\s`,\n        `agot1got2got3got4got5`\n    );\n    /* if statement and exit repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 4\nput s && x into s\nif x == 2 then\nexit repeat\nend if\nend repeat\\\\s`,\n        `a 1 2`\n    );\n    /* if statement and next repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 4\nput s && x into s\nif x == 2 then\nnext repeat\nend if\nput s & \"-\" into s\nend repeat\\\\s`,\n        `a 1- 2 3- 4-`\n    );\n    /* nested if statement and exit repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 6\nput s && x into s\nif x mod 2 is 0 then\nif x > 2 then\nexit repeat\nend if\nend if\nend repeat\\\\s`,\n        `a 1 2 3 4`\n    );\n    /* nested if statement and next repeat */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 6\nput s && x into s\nif x mod 2 is 0 then\nif x > 2 then\nnext repeat\nend if\nend if\nput s & \"-\" into s\nend repeat\\\\s`,\n        `a 1- 2- 3- 4 5- 6`\n    );\n    /* exit repeat out of infinite loop */\n    b.t(\n        `put \"a\" into s\nrepeat\nput s & \"a\" into s\nif the length of s > 4 then\nexit repeat\nend if\nend repeat\\\\s`,\n        `aaaaa`\n    );\n    /* if statements *must* be reset */\n    b.t(\n        `put \"a\" into s\nrepeat with x = 1 to 4\nif x is 1 then\n    put s && \"a\" into s\nelse if x is 4 then\n    put s && \"z\" into s\nelse if x is 3 then\n    next repeat\nelse\n    put s && \"b\" into s\nend if\nput s & \"-\" into s\nend repeat\\\\s`,\n        `a a- b- z-`\n    );\n    /* loop inside of an if */\n    b.t(\n        `put \"a\" into s\nif char 1 of \"abc\" is \"a\" then\nrepeat with x = 1 to 3\nput s&&x into s\nend repeat\nelse\nput \"_\" into s\nend if\\\\s`,\n        `a 1 2 3`\n    );\n    /*\n        important to reset flags in a loop:\n        the state of which if branch has been taken\n        must not be re-used after encountering \"next repeat\"\n        */\n    b.t(\n        `put \"\" into s\n    repeat with x = 1 to 4\n        if x = 2 then\n            put \"a\" after s\n        else if x = 3 then\n            next repeat\n        else\n            put \"b\" after s\n        end if\n        put \".\" after s\n    end repeat\n        \\\\s`,\n        `b.a.b.`\n    );\n    /* test that flags are reset 2 */\n    b.t(\n        `put \"\" into s\n    repeat with x = 1 to 4\n        if x = 2 then\n            next repeat\n        else if x = 3 then\n            put \"a\" after s\n        else\n            put \"b\" after s\n        end if\n        put \".\" after s\n    end repeat\n        \\\\s`,\n        `b.a.b.`\n    );\n    /* test that flags are reset 3 */\n    b.t(\n        `put \"\" into s\n    repeat with x = 4 down to 1\n        if x = 2 then\n            next repeat\n        else if x = 3 then\n            put \"a\" after s\n        else\n            put \"b\" after s\n        end if\n        put \".\" after s\n    end repeat\n        \\\\s`,\n        `b.a.b.`\n    );\n    /* test that flags are reset 4 */\n    b.t(\n        `put \"\" into s\n    repeat with x = 4 down to 1\n        if x = 2 then\n            next repeat\n        else if x = 4 then\n            put \"a\" after s\n        else if x = 3 then\n            put \"c\" after s\n        else\n            put \"b\" after s\n        end if\n        put \".\" after s\n    end repeat\n        \\\\s`,\n        `a.c.b.`\n    );\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* locals, globals, and variable scopes */\n    h.vcstate.runtime.codeExec.globals.set('testvar', VpcValS('1'));\n    /* simple locals read/write */\n    b.t('put 3 into x\\\\x', '3');\n    b.t('3 * x', '9');\n    b.t('put 4 into x\\\\x', '4');\n    b.t('3 * x', '12');\n\n    /* simple globals read/write */\n    b.t('global gx\\\\0', '0');\n    b.t('put 3 into gx\\\\gx', '3');\n    b.t('3 * gx', '9');\n    b.t('put 4 into gx\\\\gx', '4');\n    b.t('3 * gx', '12');\n\n    /* variable not defined */\n    b.t('3 * undefinedlocal', 'ERR:no variable found');\n\n    /* declaring a global gives it \"\" */\n    b.t('global newlydefinedglobal\\\\\"a\" & newlydefinedglobal', 'a');\n    b.t('global newlydefinedglobal\\\\newlydefinedglobal is \"\"', 'true');\n\n    /* if you don't declare it as a global, it is treated as a local */\n    b.t('3 * testvar', 'ERR:no variable found');\n    b.t('put \"z\" into testvar\\\\testvar', 'z');\n    b.t('put \"z\" into testvar\\nglobal testvar\\\\testvar', '1');\n    b.batchEvaluate(h);\n});\nt.test('calls', () => {\n    let b = new ScriptTestBatch();\n    /* attempt to call something that isn't a valid custom handler */\n    b.t('3 + abs(4)', '7');\n    b.t('3 + xyz(4)', 'ERR:no handler');\n    b.t('3 + mousewithin(4)', 'ERR:no such function');\n    b.t('3 + with(4)', 'ERR:no such function');\n    b.t('3 + at(4)', 'ERR:no such function');\n    b.t('3 + from(4)', 'ERR:no such function');\n    b.t('3 + autohilite(4)', 'ERR:Expecting token');\n    b.t('3 + style(4)', 'ERR:Expecting token');\n    b.t('3 + locktext(4)', 'ERR:Expecting token');\n    b.t('3 + one(4)', 'ERR:no such function');\n    b.t('3 + pi(4)', 'ERR:no such function');\n\n    /* the result before anything is called */\n    b.t('put 3 into result\\\\0', 'ERR:name not allowed');\n    b.t('put 3 + into(4) into x\\\\0', 'PREPARSEERR:one of');\n    b.t('result()', '');\n    b.t('the result', '');\n    b.batchEvaluate(h);\n    b = new ScriptTestBatch();\n\n    /* call a custom handler */\n    h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS('(placeholder)'));\n    h.runGeneralCode(\n        `on myhandler\nglobal x\nput x + 1 into x\nend myhandler`,\n        `global x, testresult\nput 3 into x\nmyhandler\nput x into testresult`\n    );\n    assertWarnEq(\n        '4',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '23|'\n    );\n\n    /* wrong name for the handler */\n    h.runGeneralCode(\n        `on myhandler\nglobal x\nput x + 1 into x\nend myhandler`,\n        `global x, testresult\nput 3 into x\nmyhandler2\nput x into testresult`,\n        'no handler',\n        8\n    );\n\n    /* longer call stack */\n    h.runGeneralCode(\n        `on myhandler1\nglobal x\nput x && \"myhandler1\" into x\nend myhandler1\non myhandler2\nglobal x\nput x && \"myhandler2\" into x\nmyhandler1\nput x && \"j\" into x\nend myhandler2\non myhandler3\nglobal x\nput x && \"myhandler3\" into x\nmyhandler2\nput x && \"i\" into x\nend myhandler3\non myhandler4\nglobal x\nput x && \"myhandler4\" into x\nmyhandler3\nput x && \"h\" into x\nend myhandler4`,\n        `global x, testresult\nput \"\" into x\nmyhandler4\nput x into testresult`\n    );\n    assertWarnEq(\n        ' myhandler4 myhandler3 myhandler2 myhandler1 j i h',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '22|'\n    );\n    /* return value from one must not bleed down into the rest */\n    h.runGeneralCode(\n        `on myhandler1\nreturn 4\nend myhandler1\non myhandler2\nmyhandler1\nend myhandler2`,\n        `global testresult\nmyhandler2\nput \"a\" & the result into testresult`\n    );\n    assertWarnEq(\n        'a',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '21|'\n    );\n    /* handler with arguments */\n    h.runGeneralCode(\n        `on myhandler arg1\nglobal x\nif the paramcount is 1 and the params is \"hi\" then\nput x && \"myhandler\" & arg1 into x\nend if\nend myhandler\non myhandlerMany arg1, arg2, arg3\nglobal x\nif the paramcount is 3 and the params is \"h1,h2,h3\" then\nput x && \"myhandlermany\" & arg1 & arg2 & arg3 into x\nend if\nend myhandlerMany`,\n        `global x, testresult\nput \"a\" into x\nmyhandler \"hi\"\nmyhandler \"not\"\nmyhandlerMany \"h1\", \"h2\", \"h3\"\nmyhandlerMany \"h1,h2,h3\"\nmyhandler \"hi\"\nput x into testresult`\n    );\n    assertWarnEq(\n        'a myhandlerhi myhandlermanyh1h2h3 myhandlerhi',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '20|'\n    );\n    /* expect arguments eval'd from left to right */\n    h.runGeneralCode(\n        `on myhandler a1, a2, a3\nglobal x, testresult\nput testresult && (a1 - x) into testresult\nput testresult && (a2 - x) into testresult\nput testresult && (a3 - x) into testresult\nend myhandler`,\n        `global x, testresult\nput counting() into x\nput \"\" into testresult\nmyhandler counting(), counting(), counting()`\n    );\n    assertWarnEq(\n        ' 1 2 3',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1~|'\n    );\n\n    /* variadic handlers / giving a handler the wrong number of args */\n    h.runGeneralCode(\n        `on printargs a1, a2\nglobal x\nput cr & \"#args=\" & the paramcount after x\nput \" alla1=\" & param(1) after x\nput \" alla2=\" & param(2) after x\nput \" alla3=\" & param(3) after x\nput \" alla=\" & the params after x\nput \" a1=\" & a1 after x\nput \" a2=\" & a2 after x\nend printargs`,\n        `global x, testresult\nput \"\" into x\nprintargs\nprintargs \"a\"\nprintargs (\"a\")\nprintargs \"a\", (\"\" & \"b\")\nprintargs \"a\", (\"b\")\nprintargs \"a\", \"b\"\nprintargs \"a\", \"b\", \"c\"\nput x into testresult`\n    );\n    assertWarnEq(\n        `\n#args=0 alla1= alla2= alla3= alla= a1= a2=\n#args=1 alla1=a alla2= alla3= alla=a a1=a a2=\n#args=1 alla1=a alla2= alla3= alla=a a1=a a2=\n#args=2 alla1=a alla2=b alla3= alla=a,b a1=a a2=b\n#args=2 alla1=a alla2=b alla3= alla=a,b a1=a a2=b\n#args=2 alla1=a alla2=b alla3= alla=a,b a1=a a2=b\n#args=3 alla1=a alla2=b alla3=c alla=a,b,c a1=a a2=b`,\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1}|'\n    );\n\n    /* handler with return value */\n    h.runGeneralCode(\n        `on myhandler arg1\nglobal x\nput arg1 + 1 into y\nreturn arg1 * y\nput x && \"should not be reached\" into x\nend myhandler\n`,\n        `global x, testresult\nput \"\" into x\nmyhandler 4\nput the result into ret\nput ret & x into testresult`\n    );\n    assertWarnEq(\n        '20',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1||'\n    );\n\n    /* exit handler and exit product */\n    h.runGeneralCode(\n        `on myhandler arg1\nglobal testresult\nif arg1 is 10 then\nexit myhandler\nelse if arg1 is 12 then\nexit to ${cProductName}\nend if\nput testresult && \"called\" && arg1 into testresult\nend myhandler\n`,\n        `global testresult\nput \"\" into testresult\nmyhandler 9\nmyhandler 10\nmyhandler 11\nmyhandler 12\nmyhandler 13\nmyhandler 14`\n    );\n    assertWarnEq(\n        ' called 9 called 11',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1{|'\n    );\n\n    /* recursion in a handler */\n    h.runGeneralCode(\n        `on myhandler p\nif p is 1 then\nreturn p\nelse\nmyhandler p-1\nput the result into got\nreturn p * got\nend if\nend myhandler\n`,\n        `global testresult\nmyhandler 4\nput the result into testresult`\n    );\n    assertWarnEq(\n        '24',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1`|'\n    );\n\n    /* a simple custom function! */\n    h.runGeneralCode(\n        `${h.customFunc} myfn p\nreturn p * (p + 1)\nend myfn\n`,\n        `global testresult\nput myfn(2+myfn(3)) into testresult`\n    );\n    assertWarnEq(\n        '210',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1_|'\n    );\n\n    /* recursion. use g to 1) verify number of recursive calls and */\n    /* 2) run a real statement like \"put\" that can't be part of an eval'd expression */\n    h.runGeneralCode(\n        `${h.customFunc} recurse p\nglobal g\nput g + 1 into g\nif p is 1 then\nreturn p\nelse\nreturn p * recurse(p-1)\nend if\nend recurse\n`,\n        `global testresult, g\nput 0 into g\nput recurse(5) into testresult\nput testresult && g into testresult`\n    );\n    assertWarnEq(\n        '120 5',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1^|'\n    );\n\n    /* mutual recursion */\n    h.runGeneralCode(\n        `${h.customFunc} isEven n\nif n is 0 then\nreturn true\nelse\nreturn isOdd(n - 1)\nend if\nend isEven\n\n${h.customFunc} isOdd n\nif n is 0 then\nreturn false\nelse\nreturn isEven(n - 1)\nend if\nend isOdd\n`,\n        `global testresult\nput isEven(8) && isEven(9) && isEven(10) into testresult`\n    );\n    assertWarnEq(\n        'true false true',\n        h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n        '1]|'\n    );\n    /* nesting/interesting custom function calls\n     we *manually* parse custom fn calls by counting\n    parenthesis levels so this needs to be tested */\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdA);\n    h.setScript(\n        h.ids.cdA,\n        `${h.customFunc} mm p1, p2, p3\n    global g\n    put g+1 into g\n    return \"m\" & g & \"(\" & p1 & \",\" & p2 & \",\" & p3 & \")\"\n    end mm`\n    );\n    /* simple calls */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('put mm() into ret\\\\ret', 'm1(,,)');\n    b.t('put mm(1) into ret\\\\ret', 'm2(1,,)');\n    b.t('put mm(1,2) into ret\\\\ret', 'm3(1,2,)');\n    b.t('put mm(1,2,3) into ret\\\\ret', 'm4(1,2,3)');\n    /* expect to be called left to right */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('put mm(10) && mm(11) into ret\\\\ret', 'm1(10,,) m2(11,,)');\n    b.t(\n        'put (char 2 to 4 of mm(10)) && (char 2 to 4 of mm(11)) into ret\\\\ret',\n        '3(1 4(1'\n    );\n    /* custom nested within builtin */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('put length(mm(1)) into ret\\\\ret', '7');\n    b.t('put max(0,1,max(1,2,length(mm(1)))) into ret\\\\ret', '7');\n    b.t('put sum(1,sum(1,2,length(mm(1)), 3), 4) into ret\\\\ret', '18');\n    b.t('put offset(mm(),3) into ret\\\\ret', '0');\n    b.t('put offset(mm(1),3) into ret\\\\ret', '0');\n    b.t('put offset(mm(1,2),3) into ret\\\\ret', '0');\n    b.t('put offset(mm(1,\")\"),3) into ret\\\\ret', '0');\n    /* builtin nested within custom */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('mm(max(1))', 'm1(1,,)');\n    b.t('mm(max(1,2))', 'm2(2,,)');\n    b.t('mm(max(1,2,3))', 'm3(3,,)');\n    b.t('mm(max(1),max(2))', 'm4(1,2,)');\n    b.t('mm(max(1,2),max(1,3))', 'm5(2,3,)');\n    b.t('mm(max(1,2,3),max(1,2,4))', 'm6(3,4,)');\n    b.t('mm(max(1,2,3),max(max(min(1,2),2),2,4),5)', 'm7(3,4,5)');\n    b.t(\n        'char (2) to (999) of (mm(max(1,2,3),max(max(min(1,2),2),2,4),5)) & (abs(-1))',\n        '8(3,4,5)1'\n    );\n    /* custom inside custom */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('abs(1) && mm(mm()) && abs(1)', '1 m2(m1(,,),,) 1');\n    b.t('abs(1) && mm(mm(1)) && abs(1)', '1 m4(m3(1,,),,) 1');\n    b.t('abs(1) && mm(mm(1,max(2))) && abs(1)', '1 m6(m5(1,2,),,) 1');\n    b.t('abs(1) && mm(mm(1,max(2),max(3)),max(4)) && abs(1)', '1 m8(m7(1,2,3),4,) 1');\n    b.t('abs(1) && mm(max(1),mm(2),max(3)) && abs(1)', '1 m10(1,m9(2,,),3) 1');\n    /* even more nesting */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('abs(1) && mm(mm(mm(1))) && abs(1)', '1 m3(m2(m1(1,,),,),,) 1');\n    b.t('abs(1) && mm(mm(1),abs(2),mm(3)) && abs(1)', '1 m6(m4(1,,),2,m5(3,,)) 1');\n    b.t(\n        'abs(1) && mm(abs(1),mm(abs(2),mm(abs(3)))) && abs(1)',\n        '1 m9(1,m8(2,m7(3,,),),) 1'\n    );\n    b.t(\n        'abs(1) && mm(90+(1),90+(2),\"\" & mm(90+(3),90+(4),\"\" & mm(90+(5),90+(6)))) && abs(1)',\n        '1 m12(91,92,m11(93,94,m10(95,96,))) 1'\n    );\n    /* currently allow the call on the other side as well */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t(\n        'put \"\" into ret\\nput \"abc\" into item (the length of mm(1)) of ret\\\\ret',\n        ',,,,,,abc'\n    );\n    b.t('mm 2\\nput the result into ret\\\\ret', 'm2(2,,)');\n    /* we can now call it from some other types of statements! */\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('get mm(1)\\\\it', 'm1(1,,)');\n    b.t('put 0 into ret\\nadd (the length of mm(1)) to ret\\\\ret', '7');\n    b.t(\n        'put \"0,0,0,0,0,0,0,0,0\" into ret\\nadd 3 to item (the length of mm(1)) of ret\\\\ret',\n        '0,0,0,0,0,0,3,0,0'\n    );\n    b.t('get abs(mm(1))\\\\0', 'ERR:expected a number');\n    b.t('there is a cd btn mm(1)', 'false');\n    b.t('show cd btn mm(1)\\\\0', 'ERR:could not find');\n    b.t('enable cd btn mm(1)\\\\0', 'ERR:could not find');\n    /* can expand custom functions in condition */\n    b.t(\n        `if char 1 of mm(1) is \"m\" then\n        get 1\n        else\n        get 2\n        end if\\\\it`,\n        '1'\n    );\n    /* custom fn error reporting */\n    b.t('get mm(1\\\\it', 'ERR:Expecting');\n    /* using blank lines, line number reporting should be affected */\n    b.t(\n        `put \"abc\" into x\n\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:6:could not find'\n    );\n    b.t(\n        `put \"abc\" into x\n\n\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:7:could not find'\n    );\n    /* using continued lines, line number reporting should be affected */\n    b.t(\n        `put \"abc\" {BSLASH}\\n into x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:6:could not find'\n    );\n    b.t(\n        `put \"abc\" {BSLASH}\\n into {BSLASH}\\n x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:7:could not find'\n    );\n    b.t(\n        `put {BSLASH}\\n \"abc\" {BSLASH}\\n into {BSLASH}\\n x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:8:could not find'\n    );\n    /* but using put-expansion, line number reporting\n        should not be affected, even though we're adding calls */\n    b.t(\n        `put mm(1) into x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:5:could not find'\n    );\n    b.t(\n        `put mm(1) && mm(1) into x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:5:could not find'\n    );\n    b.t(\n        `put mm(mm(1)) into x\n        show cd btn \"notfound\"\\\\0`,\n        'ERR:5:could not find'\n    );\n    b.t('global g\\nput 0 into g\\\\0', '0');\n    b.t('mm (\"\")\\\\the result', 'm1(,,)');\n    /* difference between what is allowed and what is not.\n        we can look at token start pos to see if it is 'a()' or 'a ()'\n        myFunction() -- disallow, looks too much like C\n        myFunction(1) -- disallow, looks too much like C\n        myFunction () -- does not parse\n        myFunction (1) -- allow\n        myFunction() && \"\" -- does not parse\n        myFunction(1) && \"\" -- allow\n        myFunction (1) && \"\" -- allow\n        myFunction (1), \"\" -- allow\n        myFunction (1, \"\") -- does not parse\n        myFunction (1, \"\") && \"\" -- does not parse\n        myFunction  1, \"\" && \"\" -- allow\n        */\n    b.t('global g\\nput 0 into g\\nmm()\\\\0', `PREPARSEERR:5:isn't C`);\n    b.t('global g\\nput 0 into g\\nmm(1)\\\\0', `PREPARSEERR:5:isn't C`);\n    b.t('global g\\nput 0 into g\\nmm ()\\\\the result', 'ERR:6:parse error');\n    b.t('global g\\nput 0 into g\\nmm (1)\\\\the result', 'm1(1,,)');\n    b.t('global g\\nput 0 into g\\nmm() && \"\"\\\\the result', 'ERR:6:');\n    b.t('global g\\nput 0 into g\\nmm(1) && \"\"\\\\the result', 'm1(1 ,,)');\n    b.t('global g\\nput 0 into g\\nmm (1) && \"\"\\\\the result', 'm1(1 ,,)');\n    b.t('global g\\nput 0 into g\\nmm (1), \"o\"\\\\the result', 'm1(1,o,)');\n    b.t('global g\\nput 0 into g\\nmm (1, \"\")\\\\the result', 'ERR:6:parse error');\n    b.t('global g\\nput 0 into g\\nmm (1, \"\") && \"\"\\\\the result', 'ERR:6:parse error');\n    b.t('global g\\nput 0 into g\\nmm 1, \"\" && \"\"\\\\the result', 'm1(1, ,)');\n    b.t('global g\\nput 0 into g\\nmm (1),(2)\\\\the result', 'm1(1,2,)');\n    b.t('global g\\nput 0 into g\\nmm(1),(2)\\\\0', `PREPARSEERR:5:isn't C`);\n    b.t('get mm(abs(1\\\\0', 'PREPARSEERR:missing )');\n    b.batchEvaluate(h);\n    h.setScript(h.ids.cdA, ``);\n\n    /* disallow C-like function calls. if printargs is a handler,\n    printargs (\"a\") is ok (I guess) - but not printargs(\"a\") */\n    h.assertPreparseErrLn(\n        `put 1 into x\nsin(3)\nput 1 into x`,\n        `this isn't C`,\n        4\n    );\n    h.assertPreparseErrLn(\n        `put 1 into x\nmyfn(3)\nput 1 into x`,\n        `this isn't C`,\n        4\n    );\n    /* only block starts outside of scope */\n    h.assertPreparseErr(\n        `put 1 into x\non myhandler\nend myhandler`,\n        'can exist at this scope',\n        1\n    );\n    h.assertPreparseErr(\n        `\non myhandler\nend myhandler\nput 1 into x`,\n        'can exist at this scope',\n        4\n    );\n    /* cannot start handler inside handler */\n    h.assertPreparseErr(\n        `\non myhandler\non myhandler2\nend myhandler2\nend myhandler`,\n        'inside an existing handler',\n        3\n    );\n    /* cannot start handler inside handler */\n    h.assertPreparseErr(\n        `\n    ${h.customFunc} myhandler\non myhandler2\nend myhandler2\nend myhandler`,\n        'inside an existing handler',\n        3\n    );\n    /* cannot start handler inside handler */\n    h.assertPreparseErr(\n        `\non myhandler\n${h.customFunc} myhandler2\nend myhandler2\nend myhandler`,\n        'inside an existing handler',\n        3\n    );\n    /* mismatched handler name */\n    h.assertPreparseErr(\n        `\non myhandler1\nend myhandler2`,\n        'names mismatch',\n        3\n    );\n    /* doesn't make sense to end here */\n    h.assertPreparseErr(\n        `\non myhandler1\nend myhandler1\nend myhandler1`,\n        'can exist at this scope',\n        4\n    );\n    /* mismatched handler name in exit */\n    h.assertPreparseErr(\n        `\non myhandler1\nexit myhandler2\nend myhandler1`,\n        'but got exit',\n        3\n    );\n    /* mismatched handler name in pass */\n    h.assertPreparseErr(\n        `\non myhandler1\npass myhandler2\nend myhandler1`,\n        'but got exit',\n        3\n    );\n    /* mismatched handler name in end */\n    h.assertPreparseErr(\n        `\non myhandler1\nend myhandler2\nend myhandler1`,\n        'names mismatch',\n        3\n    );\n    /* no handler name */\n    h.assertPreparseErr(\n        `\non\nget 1 + 2\nend myhandler1`,\n        'cannot have a line',\n        2\n    );\n    /* no valid handler name */\n    h.assertPreparseErr(\n        `\non ,\nget 1 + 2\nend myhandler1`,\n        `don't support`,\n        2\n    );\n    /* handler params invalid 1 */\n    h.assertPreparseErr(\n        `\non myhandler1 x y\nget 1 + 2\nend myhandler1`,\n        'required comma',\n        2\n    );\n    /* handler params invalid 2 */\n    h.assertPreparseErr(\n        `\non myhandler1 x , ,\nget 1 + 2\nend myhandler1`,\n        `don't support`,\n        2\n    );\n    /* no handler end name */\n    h.assertPreparseErr(\n        `\non myhandler1\nget 1 + 2\nend`,\n        'cannot have a line',\n        4\n    );\n    /* duplicate handler name */\n    h.assertPreparseErr(\n        `\non myhandler\nget 1 + 2\nend myhandler\non myhandler\nget 1 + 2\nend myhandler`,\n        'already exists',\n        7\n    );\n    /* cannot exit repeat when no loop */\n    h.assertPreparseErrLn(`exit repeat`, 'outside of a loop', 3);\n    h.assertPreparseErrLn(\n        `repeat while false\nend repeat\nexit repeat`,\n        'outside of a loop',\n        5\n    );\n    /* cannot next repeat when no loop */\n    h.assertPreparseErrLn(`next repeat`, 'outside of a loop', 3);\n    h.assertPreparseErrLn(\n        `repeat while false\nend repeat\nnext repeat`,\n        'outside of a loop',\n        5\n    );\n    /* cannot end repeat when no loop */\n    h.assertPreparseErr(\n        `\n    on myhandler\n    end repeat\n    end myhandler`,\n        'interleaved within',\n        3\n    );\n    /* cannot else when no if */\n    h.assertPreparseErr(\n        `\n    on myhandler\n    else\n    end if\n    end myhandler`,\n        'outside of if',\n        3\n    );\n    /* cannot else if when no if */\n    h.assertPreparseErr(\n        `\n    on myhandler\n    else if true then\n    end if\n    end myhandler`,\n        'outside of if',\n        3\n    );\n    /* cannot else when after the if */\n    h.assertPreparseErr(\n        `\n    on myhandler\n    if true then\n    end if\n    else\n    end if\n    end myhandler`,\n        'outside of if',\n        5\n    );\n    /* cannot else if when after the if */\n    h.assertPreparseErr(\n        `\n    on myhandler\n    if true then\n    end if\n    else if true then\n    end if\n    end myhandler`,\n        'outside of if',\n        5\n    );\n    /* cannot end if when no if */\n    h.assertPreparseErrLn(`end if`, 'outside of if', 3);\n    /* cannot say \"else then\" */\n    h.assertPreparseErrLn(\n        `if false then\n    else then`,\n        \"ERR:not 'else then\"\n    );\n    /* cannot say just \"if\" */\n    h.assertPreparseErrLn(\n        `if\n    end if`,\n        'no \"then\"',\n        3\n    );\n    /* cannot ommit the \"then\" */\n    h.assertPreparseErrLn(\n        `if true\n    end if`,\n        'no \"then\"',\n        3\n    );\n    /* cannot just say \"return\" */\n    h.assertPreparseErrLn(`return`, 'cannot have a line that is just', 3);\n    /* cannot just say \"end\" */\n    h.assertPreparseErrLn(`end`, 'cannot have a line', 3);\n    /* cannot just say \"exit\" */\n    h.assertPreparseErrLn(`exit`, 'not enough args', 3);\n    /* cannot just say \"repeat while\" */\n    h.assertPreparseErrLn(\n        `repeat while\n    end repeat`,\n        'without an expression',\n        3\n    );\n    /* cannot just say \"repeat until\" */\n    h.assertPreparseErrLn(\n        `repeat until\n    end repeat`,\n        'without an expression',\n        3\n    );\n    /* invalid repeat part 1 */\n    h.assertLineErr(\n        `repeat xyz\n    end repeat`,\n        'no variable found with this name',\n        3\n    );\n    /* invalid repeat part 2 */\n    h.assertLineErr(\n        `repeat to\n    end repeat`,\n        'NoViableAltException',\n        3\n    );\n    /* invalid repeat part 3, not quite enough tokens */\n    h.assertPreparseErrLn(\n        `repeat with x = 1 to\n    end repeat`,\n        'wrong length',\n        3\n    );\n    /* invalid repeat part 4, not quite enough tokens */\n    h.assertPreparseErrLn(\n        `repeat with x = 1 down to\n    end repeat`,\n        'wrong length',\n        3\n    );\n    /* interleaved blocks */\n    h.assertPreparseErrLn(\n        `repeat while false\nif false then\nend repeat\nend if`,\n        'interleaved within',\n        5\n    );\n    h.assertPreparseErrLn(\n        `repeat while false\nif false then\nput \"a\" into x\nelse\nend repeat\nend if`,\n        'interleaved within',\n        7\n    );\n    h.assertPreparseErrLn(\n        `if false then\nrepeat while false\nend if\nend repeat`,\n        'interleaved within',\n        3 /* tree flatten messes with the line number a bit */\n    );\n    h.assertPreparseErrLn(\n        `if false then\nrepeat while false\nelse\nput \"a\" into x\nend if\nend repeat`,\n        'interleaved within',\n        3\n    );\n    /* forgot to close the block */\n    h.assertPreparseErr(\n        `\non myhandler\nrepeat while false\nend myhandler`,\n        'interleaved within',\n        4\n    );\n    h.assertPreparseErr(\n        `\non myhandler\nif false then\nend myhandler`,\n        'interleaved within',\n        4\n    );\n    h.assertPreparseErr(\n        `\non myhandler\nif false then\nelse\nend myhandler`,\n        'interleaved within',\n        5\n    );\n    h.runGeneralCode(\n        `\non myhandler\nput 3 into x`,\n        '',\n        'at end of',\n        3,\n        true,\n        true\n    );\n});\nt.test('scriptMessagePassing', () => {\n    h.pr.setCurCardNoOpenCardEvt(h.ids.cdA);\n    let parents = [h.ids.stack, h.ids.bgA, h.ids.cdA];\n    for (let parent of parents) {\n        /* reset all scripts */\n        let hClosure = h;\n        parents.map(id => hClosure.setScript(id, ''));\n        h.setScript(h.ids.go, '');\n\n        let script = `\n            on mouseup\n            global testresult\n            put \" me=\" & the short id of me after testresult\n            put \" target=\" & the short id of the target after testresult\n            end mouseup`;\n\n        /* if there is nothing in the button script but\n        something in a parent script, the parent script should be called instead */\n        h.setScript(h.ids.go, '');\n        h.setScript(parent, script);\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.runGeneralCode('', '', undefined, undefined, undefined, true);\n        let expectedMe = parent;\n        assertWarnEq(\n            ` me=${expectedMe} target=${h.ids.go}`,\n            h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n            '1[|'\n        );\n\n        /* if there is something in the button script and\n        something in a parent script, the parent script is not called */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.runGeneralCode(\n            '',\n            `global testresult\n            put \"button script instead\" after testresult`\n        );\n        assertWarnEq(\n            `button script instead`,\n            h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n            '1@|'\n        );\n\n        /* if the button script calls exit to product, the parent script also isn't called */\n        /* (currently has the same effect has just exiting with no call to pass) */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.runGeneralCode(\n            '',\n            `global testresult\n            put \"a\" after testresult\n            exit to ${cProductName}\n            put \"b\" after testresult`\n        );\n        assertWarnEq(\n            `a`,\n            h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n            '1?|'\n        );\n\n        /* pass upwards from the button script to the parent script */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.runGeneralCode(\n            '',\n            `global testresult\n            put \"a\" after testresult\n            pass mouseUp\n            put \"b\" after testresult`\n        );\n        assertWarnEq(\n            `a me=${expectedMe} target=${h.ids.go}`,\n            h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n            '1>|'\n        );\n\n        /* local variables should not bleed over into another scope (upwards) */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.setScript(\n            parent,\n            `${h.customFunc} parentfn p1\n            return \"got\" && myLocal && x && the short id of the target\n            end parentfn`\n        );\n        h.assertLineErr(\n            `global testresult\n            put \"a\" into myLocal\n            put parentfn(\"abc\") into testresult`,\n            'no variable found',\n            2\n        );\n\n        /* local variables should not bleed over into another scope (downwards) */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.setScript(\n            parent,\n            `${h.customFunc} parentfn p1\n            put \"abc\" into myLocal\n            return \"got\" && x && the short id of the target\n            end parentfn`\n        );\n        h.assertLineErr(\n            `global testresult\n            put parentfn(\"abc\") into testresult\n            put myLocal after testresult`,\n            'no variable found',\n            3\n        );\n\n        /* child can call a function in the parent script */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.setScript(\n            parent,\n            `${h.customFunc} parentfn p1\n            return \"got\" && p1 && the short id of me\n            end parentfn`\n        );\n        h.runGeneralCode(\n            '',\n            `global testresult\n            put parentfn(\"abc\") into testresult`\n        );\n        assertWarnEq(\n            `got abc ${expectedMe}`,\n            h.vcstate.runtime.codeExec.globals.get('testresult').readAsString(),\n            '1=|'\n        );\n\n        /* the parent script can't access function down in the button script though */\n        h.vcstate.runtime.codeExec.globals.set('testresult', VpcValS(''));\n        h.setScript(\n            parent,\n            `on mouseup\n            global testresult\n            put childfn(\"abc\") into testresult\n            end mouseup`\n        );\n        h.setScript(\n            h.ids.go,\n            `${h.customFunc} childfn p1\n            return \"got\" && p1 && the short id of me\n            end childfn`\n        );\n        h.runGeneralCode('', '', 'no handler', 3, false, true);\n    }\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcTestVpcVal.ts",
    "content": "\n/* auto */ import { VpcEvalHelpers } from './../../vpc/vpcutils/vpcValEval';\n/* auto */ import { VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { VpcOpCtg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { TextFontStyling, stringToTextFontStyling, textFontStylingToString } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512ComplexFontChanges } from './../../ui512/drawtext/ui512ComplexFontChanges';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper, assertAsserts } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on vpcutils\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcVpcVal');\nexport let testCollectionvpcVpcVal = t;\n\n/**\n * initiate test helpers\n */\nlet h = YetToBeDefinedTestHelper<VpcEvalHelpers>();\nt.test('--init--VpcEvalHelpers', () => {\n    h = new VpcEvalHelpers();\n});\n\nt.test('EvalHelpers.String Comparisons Must Be A Strict Match', () => {\n    testEquality(true, '', '');\n    testEquality(false, '', ' ');\n    testEquality(true, ' ', ' ');\n    testEquality(false, ' ', '\\t');\n    testEquality(false, ' ', '\\n');\n    testEquality(false, ' ', ' \\t');\n    testEquality(false, ' ', ' \\n');\n    testEquality(false, ' ', '  ');\n    testEquality(false, '\\n', '\\n\\n');\n    testEquality(false, '\\t', '\\t\\t');\n    testEquality(true, 'abc', 'abc');\n    testEquality(true, '123', '123');\n    testEquality(true, '   ', '   ');\n    testEquality(true, '\\t', '\\t');\n    testEquality(true, '\\r', '\\r');\n    testEquality(true, '\\n', '\\n');\n    testEquality(false, 'abc', 'abc ');\n    testEquality(true, 'abc ', 'abc ');\n    testEquality(false, 'abc', ' abc');\n    testEquality(true, ' abc', ' abc');\n    testEquality(false, 'abc', 'abc\\t');\n    testEquality(true, 'abc\\t', 'abc\\t');\n    testEquality(false, 'abc', '\\tabc');\n    testEquality(true, '\\tabc', '\\tabc');\n    testEquality(false, 'abc', 'abc\\n');\n    testEquality(true, 'abc\\n', 'abc\\n');\n    testEquality(false, 'abc', '\\nabc');\n    testEquality(true, '\\nabc', '\\nabc');\n    testEquality(false, '12a', '12a ');\n    testEquality(true, '12a ', '12a ');\n    testEquality(false, '12a', ' 12a');\n    testEquality(true, ' 12a', ' 12a');\n    testEquality(false, '12a', '12a\\t');\n    testEquality(true, '12a\\t', '12a\\t');\n    testEquality(false, '12a', '\\t12a');\n    testEquality(true, '\\t12a', '\\t12a');\n    testEquality(false, '12a', '12a\\n');\n    testEquality(true, '12a\\n', '12a\\n');\n    testEquality(false, '12a', '\\n12a');\n    testEquality(true, '\\n12a', '\\n12a');\n});\nt.test('EvalConfirmThatFailureAsserts', () => {\n    testEquality(true, '12', '12 ');\n    /* test for false positives */\n    assertAsserts('RR|', 'assert:', () => {\n        testEquality(true, '13', '12 ');\n    });\n    assertAsserts('RQ|', 'assert:', () => {\n        testEquality(true, '12 ', '13');\n    });\n    /* test for false negatives */\n    assertAsserts('RP|', 'assert:', () => {\n        testEquality(false, '12', '12 ');\n    });\n    assertAsserts('RO|', 'assert:', () => {\n        testEquality(false, '12 ', '12');\n    });\n});\nt.test('EvalHelpers1', () => {\n    t.say(\n        longstr(`EvalHelpers.Number comparisons\n        allow trailing - and even preceding - whitespace`)\n    );\n    testEquality(true, '12', '12 ');\n    testEquality(true, '12 ', '12 ');\n    testEquality(true, '12', ' 12');\n    testEquality(true, '12', ' 12 ');\n    testEquality(true, ' 12 ', ' 12 ');\n    testEquality(true, '12', '12\\t');\n    testEquality(true, '12\\t', '12\\t');\n    testEquality(true, '12', '\\t12');\n    testEquality(true, '12', ' 12\\t');\n    testEquality(true, '\\t12\\t', '\\t12\\t');\n    testEquality(true, '12', '12\\n');\n    testEquality(true, '12\\n', '12\\n');\n    testEquality(true, '12', '\\n12');\n    testEquality(true, '12', ' 12\\n');\n    testEquality(true, '\\n12\\n', '\\n12\\n');\n    testEquality(true, '12.0', '12 ');\n    testEquality(true, '12.0 ', '12 ');\n    testEquality(true, '12.0', ' 12');\n    testEquality(true, '12.0', ' 12 ');\n    testEquality(true, ' 12.0 ', ' 12 ');\n    testEquality(true, '12.0', '12\\t');\n    testEquality(true, '12.0\\t', '12\\t');\n    testEquality(true, '12.0', '\\t12');\n    testEquality(true, '12.0', ' 12\\t');\n    testEquality(true, '\\t12.0\\t', '\\t12\\t');\n    testEquality(true, '12.0', '12\\n');\n    testEquality(true, '12.0\\n', '12\\n');\n    testEquality(true, '12.0', '\\n12');\n    testEquality(true, '12.0', ' 12\\n');\n    testEquality(true, '\\n12.0\\n', '\\n12\\n');\n});\nt.test('EvalHelpers.Number special numeric cases', () => {\n    testEquality(true, '\\n12', '\\t12\\t');\n    testEquality(true, '   12', '\\n\\n12\\n\\n');\n    testEquality(true, '12', '12.');\n    testEquality(true, '12.', '12.');\n    testEquality(true, '12', '12.0');\n    testEquality(true, '12', '12.0000000');\n    testEquality(true, '12', '012');\n    testEquality(true, '12', '0000012');\n    testEquality(true, '12', '0000012.0000');\n    testEquality(true, '-12', '-0000012.0000');\n    testEquality(true, '-012', '-12');\n    testEquality(true, '-12 ', '-12');\n    testEquality(true, '12.000', '00012');\n    testEquality(false, '12', '12,0');\n    testEquality(false, '12,000', '00012,0');\n});\nt.test('EvalHelpers.Number, very close numbers compare equal', () => {\n    /* confirmed in an emulator that very close numbers compare equal */\n    testEquality(true, '4', '4 ');\n    testEquality(true, '4', '4.0 ');\n    testEquality(true, '4', '4.0000000000 ');\n    testEquality(true, '4', '4.0000000001 ');\n    testEquality(false, '4', '4.0001 ');\n    testEquality(true, '4', '3.99999999999 ');\n    testEquality(false, '4', '3.9999 ');\n    testEquality(true, '-4', '-4 ');\n    testEquality(true, '-4', ' -4. ');\n    testEquality(true, '-4', '-4.0 ');\n    testEquality(true, '-4', '-4.0000000000 ');\n    testEquality(true, '-4', '-4.0000000001 ');\n    testEquality(false, '-4', '-4.0001 ');\n    testEquality(true, '-4', '-3.99999999999 ');\n    testEquality(false, '-4', '-3.9999 ');\n    testEquality(true, '0', '0 ');\n    testEquality(true, '0', '0.0 ');\n    testEquality(true, '0', '0.0000000000 ');\n    testEquality(true, '0', '0.0000000001 ');\n    testEquality(false, '0', '0.0001 ');\n    testEquality(true, '0', '-0.0000000000 ');\n    testEquality(true, '0', '-0.0000000001 ');\n    testEquality(false, '0', '-0.0001 ');\n    testEquality(true, '0', '-0 ');\n    testEquality(true, '0', '-0');\n    testEquality(false, '4', '-4 ');\n    testEquality(false, '4', '-4');\n});\n\nt.test('styleListToInt', () => {\n    assertEq(TextFontStyling.Default, UI512ComplexFontChanges.styleListToInt([]), 'I#|');\n    assertEq(\n        TextFontStyling.Default,\n        UI512ComplexFontChanges.styleListToInt(['plain']),\n        'I!|'\n    );\n    assertEq(\n        TextFontStyling.Bold,\n        UI512ComplexFontChanges.styleListToInt(['bold']),\n        'I |'\n    );\n    assertEq(\n        TextFontStyling.Bold | TextFontStyling.Italic,\n        UI512ComplexFontChanges.styleListToInt(['bold', 'italic']),\n        'Iz|'\n    );\n    assertEq(\n        TextFontStyling.Bold | TextFontStyling.Italic | TextFontStyling.Underline,\n        UI512ComplexFontChanges.styleListToInt(['bold', 'italic', 'underline']),\n        'Iy|'\n    );\n    assertEq(\n        TextFontStyling.Shadow,\n        UI512ComplexFontChanges.styleListToInt(['shadow']),\n        'Ix|'\n    );\n    assertEq(\n        TextFontStyling.Shadow | TextFontStyling.Condense,\n        UI512ComplexFontChanges.styleListToInt(['shadow', 'condense']),\n        'Iw|'\n    );\n    assertEq(\n        TextFontStyling.Shadow | TextFontStyling.Condense | TextFontStyling.Outline,\n        UI512ComplexFontChanges.styleListToInt(['shadow', 'condense', 'outline']),\n        'Iv|'\n    );\n});\nt.test('testStringToTextFontStyling', () => {\n    assertEq(TextFontStyling.Default, stringToTextFontStyling('biuosdce'), 'Iu|');\n    assertEq(TextFontStyling.Bold, stringToTextFontStyling('+biuosdce'), 'It|');\n    assertEq(\n        TextFontStyling.Bold | TextFontStyling.Italic,\n        stringToTextFontStyling('+b+iuosdce'),\n        'Is|'\n    );\n    assertEq(\n        TextFontStyling.Bold | TextFontStyling.Italic | TextFontStyling.Underline,\n        stringToTextFontStyling('+b+i+uosdce'),\n        'Ir|'\n    );\n    assertEq(TextFontStyling.Shadow, stringToTextFontStyling('biuo+sdce'), 'Iq|');\n    assertEq(\n        TextFontStyling.Shadow | TextFontStyling.Condense,\n        stringToTextFontStyling('biuo+sd+ce'),\n        'Ip|'\n    );\n    assertEq(\n        TextFontStyling.Shadow | TextFontStyling.Condense | TextFontStyling.Outline,\n        stringToTextFontStyling('biu+o+sd+ce'),\n        'Io|'\n    );\n});\nt.test('intToStyleList', () => {\n    assertEq(\n        'plain',\n        UI512ComplexFontChanges.intToStyleList(TextFontStyling.Default),\n        'In|'\n    );\n    assertEq('bold', UI512ComplexFontChanges.intToStyleList(TextFontStyling.Bold), 'Im|');\n    assertEq(\n        'bold,italic',\n        UI512ComplexFontChanges.intToStyleList(\n            TextFontStyling.Bold | TextFontStyling.Italic\n        ),\n        'Il|'\n    );\n    assertEq(\n        'bold,italic,underline',\n        UI512ComplexFontChanges.intToStyleList(\n            TextFontStyling.Bold | TextFontStyling.Italic | TextFontStyling.Underline\n        ),\n        'Ik|'\n    );\n    assertEq(\n        'shadow',\n        UI512ComplexFontChanges.intToStyleList(TextFontStyling.Shadow),\n        'Ij|'\n    );\n    assertEq(\n        'shadow,condense',\n        UI512ComplexFontChanges.intToStyleList(\n            TextFontStyling.Shadow | TextFontStyling.Condense\n        ),\n        'Ii|'\n    );\n    assertEq(\n        'outline,shadow,condense',\n        UI512ComplexFontChanges.intToStyleList(\n            TextFontStyling.Shadow | TextFontStyling.Condense | TextFontStyling.Outline\n        ),\n        'Ih|'\n    );\n});\nt.test('TextFontStylingToString', () => {\n    assertEq('biuosdce', textFontStylingToString(TextFontStyling.Default), 'Ig|');\n    assertEq('+biuosdce', textFontStylingToString(TextFontStyling.Bold), 'If|');\n    assertEq(\n        '+b+iuosdce',\n        textFontStylingToString(TextFontStyling.Bold | TextFontStyling.Italic),\n        'Ie|'\n    );\n    assertEq(\n        '+b+i+uosdce',\n        textFontStylingToString(\n            TextFontStyling.Bold | TextFontStyling.Italic | TextFontStyling.Underline\n        ),\n        'Id|'\n    );\n    assertEq('biuo+sdce', textFontStylingToString(TextFontStyling.Shadow), 'Ic|');\n    assertEq(\n        'biuo+sd+ce',\n        textFontStylingToString(TextFontStyling.Shadow | TextFontStyling.Condense),\n        'Ib|'\n    );\n    assertEq(\n        'biu+o+sd+ce',\n        textFontStylingToString(\n            TextFontStyling.Shadow | TextFontStyling.Condense | TextFontStyling.Outline\n        ),\n        'Ia|'\n    );\n});\n\n/**\n * assert that (inp1 == inp2) is exp,\n * and that (inp2 == inp1) is exp\n */\nfunction testEquality(exp: boolean, inp1: string, inp2: string) {\n    let got = h.evalOp(\n        VpcValS(inp1),\n        VpcValS(inp2),\n        VpcOpCtg.OpEqualityGreaterLessOrContains,\n        '=='\n    );\n    assertEq(exp.toString(), got.readAsString(), '2i|');\n\n    /* it should also work this way too */\n    got = h.evalOp(\n        VpcValS(inp2),\n        VpcValS(inp1),\n        VpcOpCtg.OpEqualityGreaterLessOrContains,\n        '=='\n    );\n    assertEq(exp.toString(), got.readAsString(), '2h|');\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcuiTestIntroProvider.ts",
    "content": "\n/* auto */ import { VpcDocumentLocation } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { IntroPageFirst } from './../../vpcui/intro/vpcIntroPageFirst';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests related to the intro provider, for loading ViperCard documents\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcuiIntroProvider');\nexport let testCollectionvpcuiIntroProvider = t;\n\nt.test('CheckPageUrlParamsGetProvider.no params', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3'\n    );\n    assertEq(undefined, got, 'G8|');\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/'\n    );\n    assertEq(undefined, got, 'G7|');\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?'\n    );\n    assertEq(undefined, got, 'G6|');\n});\nt.test('CheckPageUrlParamsGetProvider.params, but not s', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?other=1'\n    );\n    assertEq(undefined, got, 'G5|');\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/??'\n    );\n    assertEq(undefined, got, 'G4|');\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s'\n    );\n    assertEq(undefined, got, 'G3|');\n});\nt.test('CheckPageUrlParamsGetProvider.provide demo stack', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=ZGVtb19nbGlkZXI'\n    );\n    assertEq(VpcDocumentLocation.FromStaticDemo, got?.loc, 'G2|');\n    assertEq('demo_glider.json', got?.identifier, 'G1|');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZGVtb19zcGFjZWdhbWU'\n    );\n    assertEq(VpcDocumentLocation.FromStaticDemo, got?.loc, 'G0|');\n    assertEq('demo_spacegame.json', got?.identifier, 'F~|');\n});\nt.test('CheckPageUrlParamsGetProvider.works even if not the only parameter', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?abc=1&s=ZGVtb19nbGlkZXI'\n    );\n    assertEq(VpcDocumentLocation.FromStaticDemo, got?.loc, 'F}|');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s1=*&s=ZGVtb19nbGlkZXI'\n    );\n    assertEq(VpcDocumentLocation.FromStaticDemo, got?.loc, 'F||');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=ZGVtb19nbGlkZXI&abc=1'\n    );\n    assertEq(VpcDocumentLocation.FromStaticDemo, got?.loc, 'F{|');\n});\nt.test('CheckPageUrlParams1', () => {\n    t.say(\n        longstr(`CheckPageUrlParamsGetProvider.provide\n        base64, but not a valid demo stack`)\n    );\n    /* starts with dem_ instead of demo_ */\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=ZGVtX2dsaWRlcg'\n    );\n    assertEq(undefined, got, 'F`|');\n    /* is demo_*, containing invalid character * */\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=ZGVtb18q'\n    );\n    assertEq(undefined, got, 'F_|');\n    /* is demo_a/a, containing invalid character a */\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZGVtb19hL2E'\n    );\n    assertEq(undefined, got, 'F^|');\n    /* is demo_a.a, containing invalid character . */\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZGVtb19hLmE'\n    );\n    assertEq(undefined, got, 'F]|');\n});\nt.test('CheckPageUrlParamsGetProvider.provide reference to stack', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=abc|def'\n    );\n    assertEq(VpcDocumentLocation.FromStackIdOnline, got?.loc, 'F[|');\n    assertEq('abc|def', got?.identifier, 'F@|');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZXJpY28|U3ZcVJvvxadd8_iQplmeYB'\n    );\n    assertEq(VpcDocumentLocation.FromStackIdOnline, got?.loc, 'F?|');\n    assertEq('ZXJpY28|U3ZcVJvvxadd8_iQplmeYB', got?.identifier, 'F>|');\n});\nt.test('CheckPageUrlParamsGetProvider.too many |', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=a|b|c'\n    );\n    assertEq(undefined, got, 'F=|');\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.2?s=a|b|c|d'\n    );\n    assertEq(undefined, got, 'F<|');\n});\nt.test('CheckPageUrlParamsGetProvider.| is escaped by percent', () => {\n    let got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZXJpY28%7cU3ZcVJvvxadd8_iQplmeYB'\n    );\n    assertEq(VpcDocumentLocation.FromStackIdOnline, got?.loc, 'F;|');\n    assertEq('ZXJpY28|U3ZcVJvvxadd8_iQplmeYB', got?.identifier, 'F:|');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=ZXJpY28%7CU3ZcVJvvxadd8_iQplmeYB'\n    );\n    assertEq(VpcDocumentLocation.FromStackIdOnline, got?.loc, 'F/|');\n    assertEq('ZXJpY28|U3ZcVJvvxadd8_iQplmeYB', got?.identifier, 'F.|');\n\n    got = IntroPageFirst.checkPageUrlParamsGetProvider(\n        'https://www.productname.com/0.3/?s=currentlyjustleave|a%77%xx'\n    );\n    assertEq(VpcDocumentLocation.FromStackIdOnline, got?.loc, 'F-|');\n    assertEq('currentlyjustleave|a%77%xx', got?.identifier, 'F,|');\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc/vpcuiTestMsgBox.ts",
    "content": "\n/* auto */ import { RememberHistory } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcNonModalReplBox } from './../../vpcui/nonmodaldialogs/vpcReplMessageBox';\n/* auto */ import { assertEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tests on FormattedText\n */\nlet t = new SimpleUtil512TestCollection('testCollectionvpcuiMsgBox');\nexport let testCollectionvpcuiMsgBox = t;\n\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with no input', () => {\n    let s = '';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq([], got, 'Gi|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with typical input', () => {\n    let s = 'put 4 into myVar';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global myVar'], got, 'Gh|');\n});\nt.test('with underscore', () => {\n    t.say(\n        longstr(`VpcNonModalReplBox.makeAllVarsGlobals\n        with typical input with underscore`)\n    );\n    let s = 'put 4 into my_var';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global my_var'], got, 'Gg|');\n});\nt.test('VpcNonModalReplBox1', () => {\n    t.say(\n        longstr(`VpcNonModalReplBox.makeAllVarsGlobals\n        with typical input with leading underscore`)\n    );\n    let s = 'put 4 into _my_var';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global _my_var'], got, 'Gf|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with customHandler', () => {\n    let s = 'myCustomFn 4, myVar';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global myVar'], got, 'Ge|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with no symbols', () => {\n    let s = 'exit repeat';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq([], got, 'Gd|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with only numbers and strings', () => {\n    let s = 'return 123 & \"notvars x y z\"';\n    let got: string[] = [];\n    s = VpcNonModalReplBox.removeStringLiterals(s);\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq([], got, 'Gc|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals, propnames can be vars', () => {\n    let s = 'put result + card background sin italic autohilite into on mouseUp';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global autohilite'], got, 'RS|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with only reserved keywords', () => {\n    let s = 'put result + card background sin italic into on mouseUp';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq([], got, 'Gb|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals should skip fn calls', () => {\n    let s = 'put 4 + myFunction() into myVar';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global myVar'], got, 'Ga|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals should skip fn calls at end', () => {\n    let s = 'put 4 + myFunction(x) into myFunction()';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global x'], got, 'GZ|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals should skip fn calls with args', () => {\n    let s = 'put 4 + myFunction(1,2) into myVar';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(['global myVar'], got, 'GY|');\n});\nt.test('VpcNonModalReplBox.makeAllVarsGlobals with input referencing many', () => {\n    let s = 'aCustomHandler x + (y * var1/var2)+x+y into myVar';\n    let got: string[] = [];\n    VpcNonModalReplBox.makeAllVarsGlobals(got, s);\n    assertEq(\n        [\n            'global x',\n            'global y',\n            'global var1',\n            'global var2',\n            'global x',\n            'global y',\n            'global myVar'\n        ],\n        got,\n        'GX|'\n    );\n});\nlet fallbackReturnsEmpty = () => '';\nt.test('VpcNonModalReplBox.RememberHistory walk previous with no history', () => {\n    let h = new RememberHistory();\n    assertEq('', h.walkPrevious(fallbackReturnsEmpty), 'GW|');\n    assertEq('', h.walkPrevious(fallbackReturnsEmpty), 'GV|');\n    assertEq('', h.walkPrevious(fallbackReturnsEmpty), 'GU|');\n});\nt.test('VpcNonModalReplBox.RememberHistory walk next with no history', () => {\n    let h = new RememberHistory();\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GT|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GS|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GR|');\n});\nt.test('VpcNonModalReplBox.RememberHistory walk through history', () => {\n    let h = new RememberHistory();\n    h.append('aa');\n    h.append('bb');\n    h.append('cc');\n    h.append('dd');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GQ|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GP|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GO|');\n    assertEq('dd', h.walkPrevious(fallbackReturnsEmpty), 'GN|');\n    assertEq('cc', h.walkPrevious(fallbackReturnsEmpty), 'GM|');\n    assertEq('bb', h.walkPrevious(fallbackReturnsEmpty), 'GL|');\n    assertEq('aa', h.walkPrevious(fallbackReturnsEmpty), 'GK|');\n    assertEq('aa', h.walkPrevious(fallbackReturnsEmpty), 'GJ|');\n    assertEq('aa', h.walkPrevious(fallbackReturnsEmpty), 'GI|');\n    assertEq('bb', h.walkNext(fallbackReturnsEmpty), 'GH|');\n    assertEq('cc', h.walkNext(fallbackReturnsEmpty), 'GG|');\n    assertEq('dd', h.walkNext(fallbackReturnsEmpty), 'GF|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GE|');\n    assertEq('', h.walkNext(fallbackReturnsEmpty), 'GD|');\n});\nt.test('VpcNonModalReplBox.RememberHistory add during going back', () => {\n    let h = new RememberHistory();\n    h.append('aa');\n    h.append('bb');\n    h.append('cc');\n    assertEq('cc', h.walkPrevious(fallbackReturnsEmpty), 'GC|');\n    assertEq('bb', h.walkPrevious(fallbackReturnsEmpty), 'GB|');\n    h.append('dd');\n    assertEq('dd', h.walkPrevious(fallbackReturnsEmpty), 'GA|');\n    assertEq('cc', h.walkPrevious(fallbackReturnsEmpty), 'G9|');\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/cmds/test03go.ts",
    "content": "\n/* should test back/forth on deleted card */\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/fns/test03standalone.ts",
    "content": "\n/* auto */ import { ScriptTestBatch } from './../../vpc/vpcTestScriptRunBase';\n/* auto */ import { assertTrue } from './../../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../../testUtils/testUtils';\n/* auto */ import { h3 } from './../test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03fnsStandalone');\nexport let testCollection03fnsStandalone = t;\n\nt.atest('--init--testCollection03fnsStandalone', async () => {\n    assertTrue(\n        h3,\n        longstr(`U.|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('casing', () => {\n    let b = new ScriptTestBatch();\n    b.t('toUpperCase(\"abc\")', 'ABC');\n    b.t('toUpperCase(\"AbC\")', 'ABC');\n    b.t('toUpperCase(\"ABC\")', 'ABC');\n    b.t('toUpperCase(\"123 abc\")', '123 ABC');\n    b.t('toUpperCase(\"123 AbC\")', '123 ABC');\n    b.t('toUpperCase(\"123 ABC\")', '123 ABC');\n    b.t('toUpperCase(\"123 \")', '123 ');\n    b.t('toLowerCase(\"abc\")', 'abc');\n    b.t('toLowerCase(\"AbC\")', 'abc');\n    b.t('toLowerCase(\"ABC\")', 'abc');\n    b.t('toLowerCase(\"123 abc\")', '123 abc');\n    b.t('toLowerCase(\"123 AbC\")', '123 abc');\n    b.t('toLowerCase(\"123 ABC\")', '123 abc');\n    b.t('toLowerCase(\"123 \")', '123 ');\n    b.batchEvaluate(h3);\n});\nt.test('min and max', () => {\n    let b = new ScriptTestBatch();\n    b.t('min(46, 40, 50)', '40');\n    b.t('min(\"46,40,50\")', '40');\n    b.t('min(40)', '40');\n    b.t('max(46, 40, 50)', '50');\n    b.t('max(\"46,40,50\")', '50');\n    b.t('max(50)', '50');\n    b.batchEvaluate(h3);\n});\nt.test('sum and average', () => {\n    let b = new ScriptTestBatch();\n    b.t('sum(46, 40, 50, 4)', '140');\n    b.t('sum(\"46,40,50,4\")', '140');\n    b.t('sum(40)', '40');\n    b.t('average(46, 40, 50, 4)', '35');\n    b.t('average(\"46,40,50,4\")', '35');\n    b.t('average(40)', '40');\n    b.batchEvaluate(h3);\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/props/test03chunk.ts",
    "content": "\n/* auto */ import { ScriptTestBatch } from './../../vpc/vpcTestScriptRunBase';\n/* auto */ import { assertTrue } from './../../../ui512/utils/util512Assert';\n/* auto */ import { Util512, longstr } from './../../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../../testUtils/testUtils';\n/* auto */ import { h3 } from './../test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03propsChunk');\nexport let testCollection03propsChunk = t;\n\nt.atest('--init--testCollection03propsChunk', async () => {\n    assertTrue(\n        h3,\n        longstr(`U;|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('03chunkTestReadStyle', () => {\n    let b = new ScriptTestBatch();\n    b.t(`go to card id ${h3.ids.cdBC}\\\\1`, '1');\n    setupManyFonts(b);\n    b.t(`the textstyle of cd fld 1`, 'bold');\n    b.t(`put \"\" into cd fld 1\\\\1`, '1');\n    b.batchEvaluate(h3);\n});\n\nfunction setupManyFonts(b: ScriptTestBatch) {\n    b.t(`put \"abc\" into cd fld 1\\\\1`, '1');\n    b.t(`set the textsize of cd fld 1 to 14\\\\the textsize of cd fld 1`, '14');\n    b.t(`set the textfont of cd fld 1 to \"courier\"\\\\the textfont of cd fld 1`, 'courier');\n    b.t(`set the textstyle of cd fld 1 to \"bold\"\\\\the textstyle of cd fld 1`, 'bold');\n    assertTrue(sizes.length === styles.length, 'U:|');\n    assertTrue(sizes.length === fonts.length, 'U/|');\n    let a = 'a'.charCodeAt(0);\n    let s = Util512.range(a, a + (3 + 3 * sizes.length))\n        .map(n => String.fromCharCode(a))\n        .join('');\n    b.t(`put \"${s}\" into cd fld 1\\\\1`, '1');\n    for (let i = 0; i < sizes.length; i++) {\n        b.t(\n            `set the textsize of char ${1 + 3 * i} to ${1 + 3 * i + 3} of cd fld 1 to ${\n                sizes[i]\n            }\\\\the textsize of char ${1 + 3 * i} to ${1 + 3 * i + 3} of cd fld 1`,\n            `${sizes[i]}`\n        );\n        b.t(\n            `set the textfont of char ${2 + 3 * i} to ${2 + 3 * i + 3} of cd fld 1 to \"${\n                fonts[i]\n            }\"\\\\the textfont of char ${2 + 3 * i} to ${2 + 3 * i + 3} of cd fld 1`,\n            `${fonts[i]}`\n        );\n        b.t(\n            `set the textstyle of char ${3 + 3 * i} to ${3 + 3 * i + 3} of cd fld 1 to \"${\n                styles[i]\n            }\"\\\\the textstyle of char ${3 + 3 * i} to ${3 + 3 * i + 3} of cd fld 1`,\n            `${styles[i]}`\n        );\n    }\n    return s;\n}\n\nconst sizes = [9, 10, 12, 14, 18, 24, 9, 10, 12, 14, 18, 24, 9, 10, 12];\nconst styles = [\n    'plain',\n    'bold',\n    'italic',\n    'underline',\n    'outline',\n    'grayed',\n    'bold,italic',\n    'bold,italic,underline',\n    'bold,italic,underline,outline',\n    'bold,italic,underline,outline,grayed',\n    'italic,outline',\n    'italic,underline,outline',\n    'italic,underline,outline,grayed',\n    'bold,grayed',\n    'outline,grayed'\n];\nconst fonts = [\n    'chicago',\n    'courier',\n    'geneva',\n    'new york',\n    'times',\n    'helvetica',\n    'monaco',\n    'symbol',\n    'chicago',\n    'courier',\n    'geneva',\n    'new york',\n    'times',\n    'helvetica',\n    'monaco'\n];\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/props/test03computed.ts",
    "content": "\n/* auto */ import { ScriptTestBatch } from './../../vpc/vpcTestScriptRunBase';\n/* auto */ import { PropAdjective } from './../../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcBuiltinFunctionsDateUtils } from './../../../vpc/codepreparse/vpcBuiltinFunctionsUtils';\n/* auto */ import { cProductName, vpcVersion } from './../../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertWarnEq, longstr } from './../../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../../testUtils/testUtils';\n/* auto */ import { h3 } from './../test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03propsComputed');\nexport let testCollection03propsComputed = t;\n\nt.atest('--init--testCollection03propsComputed', async () => {\n    assertTrue(\n        h3,\n        longstr(`V1|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('03internalid property', () => {\n    let b = new ScriptTestBatch();\n    b.t(`the internalid of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the long internalid of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the short internalid of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the internalid of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the internalid of cd id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the internalid of bg id ${h3.ids.bgC}`, `${h3.ids.bgC}`);\n    b.t(`the internalid of stack id ${h3.ids.stack}`, `${h3.ids.stack}`);\n    b.batchEvaluate(h3);\n});\nt.test('03number computed property', () => {\n    let b = new ScriptTestBatch();\n    b.t(`the number of ${cProductName}`, `ERR:does not have`);\n    b.t(`the number of stack id ${h3.ids.stack}`, `1`);\n    b.t(`the number of this stack`, `1`);\n    b.t(`the number of stack id -9`, `ERR: could not find`);\n    b.t(`the number of bg id ${h3.ids.bgA}`, `1`);\n    b.t(`the short number of bg id ${h3.ids.bgA}`, `1`);\n    b.t(`the long number of bg id ${h3.ids.bgA}`, `1`);\n    b.t(`the abbr number of bg id ${h3.ids.bgA}`, `1`);\n    b.t(`the number of bg id ${h3.ids.bgB}`, `2`);\n    b.t(`the number of bg id ${h3.ids.bgC}`, `3`);\n    b.t(`the number of bg id ${h3.ids.bgD}`, `4`);\n    b.t(`the number of cd id ${h3.ids.cdA}`, `1`);\n    b.t(`the number of cd id ${h3.ids.cdBB}`, `2`);\n    b.t(`the number of cd id ${h3.ids.cdBC}`, `3`);\n    b.t(`the number of cd id ${h3.ids.cdBD}`, `4`);\n    b.t(`the number of cd id ${h3.ids.cdCD}`, `5`);\n    b.t(`the number of cd id ${h3.ids.cdDD}`, `6`);\n    b.t(`the number of cd id ${h3.ids.cdDE}`, `7`);\n    b.t(`the number of cd id ${h3.ids.cdDF}`, `8`);\n    b.t(`the number of cd id ${h3.ids.cdDG}`, `9`);\n    b.t(`the number of cd id ${h3.ids.cdDH}`, `10`);\n    b.t(`the number of cd id ${h3.ids.cdDH}`, `10`);\n    b.t(`the number of cd btn id ${h3.ids.bDE1}`, `1`);\n    b.t(`the number of cd btn id ${h3.ids.bDE2}`, `2`);\n    b.t(`the number of cd btn id ${h3.ids.bDE3}`, `3`);\n    b.t(`the number of cd fld id ${h3.ids.fDE1}`, `1`);\n    b.t(`the number of cd fld id ${h3.ids.fDE2}`, `2`);\n    b.t(`the number of cd fld id ${h3.ids.fDE3}`, `3`);\n    /* current card should not matter */\n    let tests = b.tests;\n    h3.pr.setCurCardNoOpenCardEvt(h3.ids.cdA);\n    b.batchEvaluate(h3);\n    b = new ScriptTestBatch();\n    b.tests = tests;\n    h3.pr.setCurCardNoOpenCardEvt(h3.ids.cdDD);\n    b.batchEvaluate(h3);\n});\nt.test('03owner computed property', () => {\n    for (let compatmode of [true, false]) {\n        let b = new ScriptTestBatch();\n        b.t(`set the compatibilitymode of this stack to ${compatmode}\\\\1`, `1`);\n        b.t(`set the name of this stack to \"\"\\\\1`, `1`);\n        b.t(`the owner of ${cProductName}`, `ERR:Cannot get owner`);\n        b.t(`the owner of this stack`, `ERR:Cannot get owner`);\n        b.t(`the owner of bg 1`, `stack id ${h3.ids.stack}`);\n        b.t(`the long owner of bg 1`, `stack id ${h3.ids.stack}`);\n        b.t(`the short owner of bg 1`, `${h3.ids.stack}`);\n        if (compatmode) {\n            b.t(`the owner of cd 1`, `bkgnd \"a\"`);\n            b.t(`the long owner of cd 1`, `bkgnd \"a\" of stack \"\"`);\n            b.t(`the short owner of cd 1`, `a`);\n            b.t(`the owner of cd 9`, `bkgnd \"d\"`);\n            b.t(`the long owner of cd 9`, `bkgnd \"d\" of stack \"\"`);\n            b.t(`the short owner of cd 9`, `d`);\n        } else {\n            b.t(`the owner of cd 1`, `bkgnd id ${h3.ids.bgA}`);\n            b.t(`the long owner of cd 1`, `bkgnd id ${h3.ids.bgA}`);\n            b.t(`the short owner of cd 1`, `${h3.ids.bgA}`);\n            b.t(`the owner of cd 9`, `bkgnd id ${h3.ids.bgD}`);\n            b.t(`the long owner of cd 9`, `bkgnd id ${h3.ids.bgD}`);\n            b.t(`the short owner of cd 9`, `${h3.ids.bgD}`);\n        }\n\n        b.t(`the owner of cd btn id ${h3.ids.bDE2}`, `card id ${h3.ids.cdDE}`);\n        b.t(`the long owner of cd btn id ${h3.ids.bDE2}`, `card id ${h3.ids.cdDE}`);\n        b.t(`the short owner of cd btn id ${h3.ids.bDE2}`, `${h3.ids.cdDE}`);\n        b.t(`the owner of cd btn id ${h3.ids.bBC1}`, `card id ${h3.ids.cdBC}`);\n        b.t(`the long owner of cd btn id ${h3.ids.bBC1}`, `card id ${h3.ids.cdBC}`);\n        b.t(`the short owner of cd btn id ${h3.ids.bBC1}`, `${h3.ids.cdBC}`);\n        b.t(`the owner of cd fld id ${h3.ids.fDE2}`, `card id ${h3.ids.cdDE}`);\n        b.t(`the long owner of cd fld id ${h3.ids.fDE2}`, `card id ${h3.ids.cdDE}`);\n        b.t(`the short owner of cd fld id ${h3.ids.fDE2}`, `${h3.ids.cdDE}`);\n        b.t(`the owner of cd fld id ${h3.ids.fBC1}`, `card id ${h3.ids.cdBC}`);\n        b.t(`the long owner of cd fld id ${h3.ids.fBC1}`, `card id ${h3.ids.cdBC}`);\n        b.t(`the short owner of cd fld id ${h3.ids.fBC1}`, `${h3.ids.cdBC}`);\n        b.batchEvaluate(h3);\n    }\n});\nt.test('03target computed property', () => {\n    h3.pr.setCurCardNoOpenCardEvt(h3.ids.cdA);\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of this stack to true\\\\1`, `1`);\n    b.t(`the target`, `card button \"go\"`);\n    b.t(`the long target`, `card button \"go\" of card \"a\" of stack \"\"`);\n    b.t(`the short target`, `go`);\n    b.t(`set the compatibilitymode of this stack to false\\\\1`, `1`);\n    b.t(`the target`, `card button id ${h3.ids.go}`);\n    b.t(`the long target`, `card button id ${h3.ids.go}`);\n    b.t(`the short target`, `${h3.ids.go}`);\n    b.batchEvaluate(h3);\n});\nt.test('03date computed property', () => {\n    let b = new ScriptTestBatch();\n    b.t(`global d1\\\\1`, `1`);\n    b.t(`put \"\" into d1\\\\1`, `1`);\n    b.t(`put \"~\" & the date after d1\\\\1`, `1`);\n    b.t(`put \"~\" & the short date after d1\\\\1`, `1`);\n    b.t(`put \"~\" & the abbrev date after d1\\\\1`, `1`);\n    b.t(`put \"~\" & the long date after d1\\\\1`, `1`);\n    b.t(`put \"~\" & the English date after d1\\\\1`, `1`);\n    b.batchEvaluate(h3);\n    let d1 = h3.vcstate.vci.getCodeExec().globals.get('d1');\n    let pts = d1.readAsString().split('~');\n    assertWarn('' === pts[0], 'V0|');\n    assertWarn(/[0-9]+\\/[0-9]+\\/[0-9]+/.test(pts[1]), 'U~|');\n    assertWarn(/[0-9]+\\/[0-9]+\\/[0-9]+/.test(pts[2]), 'U}|');\n    assertWarn(/[a-zA-Z]{3}, [a-zA-Z]{3} [0-9]+, [0-9]+/.test(pts[3]), 'U||');\n    assertWarn(/[a-zA-Z]+, [a-zA-Z]+ [0-9]+, [0-9]+/.test(pts[4]), 'U{|');\n    assertWarn(/[a-zA-Z]+, [a-zA-Z]+ [0-9]+, [0-9]+/.test(pts[5]), 'U_|');\n    let testDateUtils: any = Util512.shallowClone(VpcBuiltinFunctionsDateUtils);\n    testDateUtils._getDateCurrent = () => {\n        return [0, 1, 0, 1900];\n    };\n    assertWarnEq(\n        'Sun, Jan 1, 1900',\n        testDateUtils.go(PropAdjective.Abbrev).readAsString(),\n        'U^|'\n    );\n    assertWarnEq('1/1/1900', testDateUtils.go(PropAdjective.Empty).readAsString(), 'U]|');\n    assertWarnEq(\n        'Sunday, January 1, 1900',\n        testDateUtils.go(PropAdjective.Long).readAsString(),\n        'U[|'\n    );\n    assertWarnEq('1/1/1900', testDateUtils.go(PropAdjective.Short).readAsString(), 'U@|');\n    testDateUtils._getDateCurrent = () => {\n        return [6, 31, 11, 2025];\n    };\n    assertWarnEq(\n        'Sat, Dec 31, 2025',\n        testDateUtils.go(PropAdjective.Abbrev).readAsString(),\n        'U?|'\n    );\n    assertWarnEq(\n        '12/31/2025',\n        testDateUtils.go(PropAdjective.Empty).readAsString(),\n        'U>|'\n    );\n    assertWarnEq(\n        'Saturday, December 31, 2025',\n        testDateUtils.go(PropAdjective.Long).readAsString(),\n        'U=|'\n    );\n    assertWarnEq(\n        '12/31/2025',\n        testDateUtils.go(PropAdjective.Short).readAsString(),\n        'U<|'\n    );\n});\nt.test('03version computed property', () => {\n    let b = new ScriptTestBatch();\n    b.t(`the version`, vpcVersion[4] + '.' + vpcVersion[6]);\n    b.t(`the short version`, vpcVersion[4] + '.' + vpcVersion[6]);\n    b.t(`the long version`, `${vpcVersion}`);\n    b.batchEvaluate(h3);\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03chunkAdditional.ts",
    "content": "\n/* auto */ import { ScriptTestBatch, TestMultiplier } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertWarnEq, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { h3 } from './test03lexer';\n/* auto */ import { EvaluateWithVarAndFld } from './test03chunkBasic';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* all tests here confirmed in emulator -\nyes, it's weird that put and delete ignore order.\nmost tests here, unlike in test03chunk additional,\nare not covered in the extensive test. */\n\nlet t = new SimpleUtil512TestCollection('testCollection03chunkAdditional');\nexport let testCollection03chunkAdditional = t;\n\nt.atest('--init--testCollection03chunkAdditional', async () => {\n    assertTrue(\n        h3,\n        longstr(`U!|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n\n    /* go to a cd with at least 2 fields */\n    let b = new ScriptTestBatch();\n    b.t(`go to cd id ${h3.ids.cdBC}\\\\1`, '1');\n    b.batchEvaluate(h3);\n\n    /* turn on compat mode */\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', true, h3.vcstate.model)\n    );\n});\n\n/*\n    what's not covered by the extensive tests:\n        put \"\" into item 2 to 4 of z\n        put \"A\" into item 2 to 4 of z\n        set the textstyle of item 2 to 4 of cd fld 1 to bold\n        put \"ABCDE\" into item 2 to 4 of cd fld 1\n        ensure disallow going backwards in granularity scope order\n        before/after\n        math ops\n*/\n\nt.test('03chunkexpression_set_textstyle', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let helperCode = `\non resetStyle\n    put \"ab,,cd\" into cd fld 1\n    set the textstyle of cd fld 1 to plain\nend resetStyle\nfunction getBoldChars\n    put cd fld 1 into unformatted\n    if unformatted != \"ab,,cd\" then\n        causeErrBecauseStringDoesNotMatch\n        return 0\n    end if\n    put \"\" into ret\n    repeat with x = 1 to the number of chars in cd fld 1\n        if the textstyle of char x of cd fld 1 is bold then\n            put char x of cd fld 1 after ret\n        end if\n    end repeat\n    return ret\nend getBoldChars\n    `;\n    h3.setScript(h3.ids.stack, helperCode);\n    let b = new ScriptTestBatch();\n    /* go to a cd with a field */\n    b.t(`go to cd id ${h3.ids.cdBC}\\\\1`, '1');\n    /* normal item */\n    b.t(\n        'resetStyle\\nset the textstyle of item 1 of cd fld 1 to bold\\\\getBoldChars()',\n        'ab'\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 2 of cd fld 1 to bold\\\\getBoldChars()',\n        ''\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 3 of cd fld 1 to bold\\\\getBoldChars()',\n        'cd'\n    );\n    /* abnormal item */\n    b.t(\n        'resetStyle\\nset the textstyle of item 0 of cd fld 1 to bold\\\\getBoldChars()',\n        ''\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 4 of cd fld 1 to bold\\\\getBoldChars()',\n        ''\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 5 of cd fld 1 to bold\\\\getBoldChars()',\n        ''\n    );\n    /* normal ranges */\n    b.t(\n        'resetStyle\\nset the textstyle of item 1 to 1 of cd fld 1 to bold\\\\getBoldChars()',\n        'ab'\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 1 to 2 of cd fld 1 to bold\\\\getBoldChars()',\n        'ab,'\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 1 to 3 of cd fld 1 to bold\\\\getBoldChars()',\n        'ab,,cd'\n    );\n    b.t(\n        'resetStyle\\nset the textstyle of item 2 to 3 of cd fld 1 to bold\\\\getBoldChars()',\n        ',cd'\n    );\n    /* recurse */\n    b.t(\n        longstr(`resetStyle{{NEWLINE}}set the textstyle of item 2 of item 1 to 2\n         of cd fld 1 to bold\\\\getBoldChars()`),\n        ''\n    );\n    b.t(\n        longstr(`resetStyle{{NEWLINE}}set the textstyle of item 2 to 3\n         of item 1 to 3 of cd fld 1 to bold\\\\getBoldChars()`),\n        ',cd'\n    );\n    b.t(\n        longstr(\n            `resetStyle{{NEWLINE}}set the textstyle of item 2 to 3\n         of item 2 to 3 of item 1 to 3 of cd fld 1 to bold\\\\getBoldChars()`\n        ),\n        'cd'\n    );\n    /* reset fld */\n    b.t('put \"\" into cd fld 1\\\\1', '1');\n    b.batchEvaluate(h3);\n    h3.setScript(h3.ids.stack, '');\n});\n\nt.test('03chunkexpression_recursivescopes', () => {\n    /*\n        test here:\n        char->char->item\n        char->char->word\n        char->word->word\n        char->item->line\n        char->line->item\n        line->item->line\n        item->line->item\n    */\n    /* scopes that should not work */\n    let b = new ScriptTestBatch();\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', false, h3.vcstate.model)\n    );\n    /* put, nothing after a char */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of char 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 of char 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of char 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    /* put, nothing after a word except char */\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of word 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of word 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of word 1 of word 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of word 1 of word 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of word 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of word 1 of char 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    /* can't double up */\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of line 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 2 of line 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 to 2 of line 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 of line 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into line 1 to 2 of line 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of item 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 2 of item 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 to 2 of item 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 of item 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into item 1 to 2 of item 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 of word 1 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 2 of word 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 to 2 of word 2 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 of word 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\nput \"A\" into word 1 to 2 of word 2 to 3 of z\\\\z',\n        'ERR:6:compatibility mode'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n    b = new ScriptTestBatch();\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', true, h3.vcstate.model)\n    );\n    /* negatives should throw */\n    b.t('char (-1) of \"abc\"', 'ERR:negative');\n    b.t('char (-1) to 1 of \"abc\"', 'ERR:negative');\n    b.t('char 1 to (-1) of \"abc\"', 'ERR:negative');\n    b.t('word (-1) of \"abc\"', 'ERR:negative');\n    b.t('word (-1) to 1 of \"abc\"', 'ERR:negative');\n    b.t('word 1 to (-1) of \"abc\"', 'ERR:negative');\n    b.t('item (-1) of \"abc\"', 'ERR:negative');\n    b.t('item (-1) to 1 of \"abc\"', 'ERR:negative');\n    b.t('item 1 to (-1) of \"abc\"', 'ERR:negative');\n    b.t('line (-1) of \"abc\"', 'ERR:negative');\n    b.t('line (-1) to 1 of \"abc\"', 'ERR:negative');\n    b.t('line 1 to (-1) of \"abc\"', 'ERR:negative');\n    /* transform the above into \"put\" */\n    class MakePutCmd extends TestMultiplier {\n        secondTransformation(code: string, expected: string): O<[string, string]> {\n            code = 'global z\\nput \"A\" into ' + code.replace(/\"abc\"/, 'z\\\\1');\n            expected = expected.replace(/ERR:/, 'ERR:5:');\n            return [code, expected];\n        }\n    }\n    b.batchEvaluate(h3, [MakePutCmd, EvaluateWithVarAndFld]);\n    b = new ScriptTestBatch();\n    b.t(\n        'global z\\nput \"ab cd, ef\"&cr&\"gh ii,jj,kk\"&cr&\"mn,op,q\"&cr&\"r,s\" into z1\\\\1',\n        '1'\n    );\n    /* get scopes */\n    b.t('char 2 of char 2 of z1', '');\n    b.t('char 2 of word 2 of z1', 'd');\n    b.t('char 2 of item 2 of z1', 'e');\n    b.t('char 2 of line 2 of z1', 'h');\n    b.t('word 2 of char 2 of z1', '');\n    b.t('word 2 of word 2 of z1', '');\n    b.t('word 2 of item 2 of z1', 'gh');\n    b.t('word 2 of line 2 of z1', 'ii,jj,kk');\n    b.t('item 2 of char 2 of z1', '');\n    b.t('item 2 of word 2 of z1', '');\n    b.t('item 2 of item 2 of z1', '');\n    b.t('item 2 of line 2 of z1', 'jj');\n    b.t('line 2 of char 2 of z1', '');\n    b.t('line 2 of word 2 of z1', '');\n    b.t('line 2 of item 2 of z1', 'gh ii');\n    b.t('line 2 of line 2 of z1', '');\n    b.t('char 2 of char 3 of z1', '');\n    b.t('word 2 of word 3 of z1', '');\n    b.t('item 2 of item 3 of z1', '');\n    b.t('line 2 of line 3 of z1', '');\n    b.t('char 3 of char 2 of z1', '');\n    b.t('word 3 of word 2 of z1', '');\n    b.t('item 3 of item 2 of z1', '');\n    b.t('line 3 of line 2 of z1', '');\n    /* set scopes */\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of char 2 of z\\\\z',\n        'aA cd, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of word 2 of z\\\\z',\n        'ab cA, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of item 2 of z\\\\z',\n        'ab cd, Af\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of line 2 of z\\\\z',\n        'ab cd, ef\\ngA ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 of char 2 of z\\\\z',\n        'ab cA, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 of word 2 of z\\\\z',\n        'ab A ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 of item 2 of z\\\\z',\n        'ab cd, ef\\nA ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 of line 2 of z\\\\z',\n        'ab cd, ef\\ngh A\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of char 2 of z\\\\z',\n        'ab cd, Af\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of word 2 of z\\\\z',\n        'ab cd, ef\\nA ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of item 2 of z\\\\z',\n        'ab cd,A,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of line 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of char 2 of z\\\\z',\n        'ab cd, ef\\ngA ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of word 2 of z\\\\z',\n        'ab cd, ef\\ngh A\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of item 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of line 2 of z\\\\z',\n        'ab cd, ef\\nA\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of char 3 of z\\\\z',\n        'aA cd, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 of word 3 of z\\\\z',\n        'ab A ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of item 3 of z\\\\z',\n        'ab cd,A,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of line 3 of z\\\\z',\n        'ab cd, ef\\nA\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 3 of char 2 of z\\\\z',\n        'abAcd, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into word 3 of word 2 of z\\\\z',\n        'ab cd, A\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 3 of item 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 3 of line 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,jj,kk\\nA\\nr,s'\n    );\n    /* get complicated scopes */\n    /* for get, it's as expected. can add parens, happens in logical order */\n    b.t('char 2 of char 4 of item 2 of z1', '');\n    b.t('char 2 of char 4 of word 2 of z1', '');\n    b.t('char 2 of word 2 of word 4 of z1', '');\n    b.t('char 2 of item 2 of line 2 of z1', 'j');\n    b.t('char 2 of line 2 of item 2 of z1', 'h');\n    b.t('line 2 of item 2 of line 2 of z1', '');\n    b.t('item 2 of line 2 of item 2 of z1', '');\n    b.t('char 2 to 3 of char 4 to 7 of item 2 to 3 of z1', 'gh');\n    b.t('char 2 to 3 of char 4 to 7 of word 2 to 3 of z1', 'ef');\n    b.t('char 2 to 3 of word 2 to 3 of word 4 to 7 of z1', 'i,');\n    b.t('char 2 to 3 of item 2 to 3 of line 2 to 3 of z1', 'j,');\n    b.t('char 2 to 3 of line 2 to 3 of item 2 to 3 of z1', 'h ');\n    b.t('line 2 to 3 of item 2 to 5 of line 2 to 3 of z1', 'mn,op,q');\n    b.t('item 2 to 3 of line 2 to 3 of item 2 to 5 of z1', 'jj,kk\\nmn');\n    /* set complicated scopes */\n    /* for set, it's NOT as expected. */\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of char 4 of item 2 of z\\\\z',\n        'ab cd, Af\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of char 4 of word 2 of z\\\\z',\n        'ab cA, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of word 2 of word 4 of z\\\\z',\n        'ab cA, ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of item 2 of line 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,jA,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 of line 2 of item 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,jA,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 of item 2 of line 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 of line 2 of item 2 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of char 4 to 7 of item 2 to 3 of z\\\\z',\n        'ab cd, A\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of char 4 to 7 of word 2 to 3 of z\\\\z',\n        'ab cA ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of word 2 to 3 of word 4 to 7 of z\\\\z',\n        'ab cA ef\\ngh ii,jj,kk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of item 2 to 3 of line 2 to 3 of z\\\\z',\n        'ab cd, ef\\ngh ii,jAkk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of line 2 to 3 of item 2 to 3 of z\\\\z',\n        'ab cd, ef\\ngh ii,jAkk\\nmn,op,q\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 to 3 of item 2 to 5 of line 2 to 3 of z\\\\z',\n        'ab cd, ef\\ngh ii,A\\nr,s'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 to 3 of line 2 to 3 of item 2 to 5 of z\\\\z',\n        'ab cd, ef\\ngh ii,A,op,q\\nr,s'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\nt.test('03chunkexpression_ordinal recursive', () => {\n    let b = new ScriptTestBatch();\n    b.t(\n        'global z1\\nput \"a,b\"&cr&\"cd,ef\"&cr&\"g,h\"&cr&\"ij\"&cr&\"kl\"&cr&\"mn,op\"&cr&\"qr\" into z1\\\\1',\n        '1'\n    );\n    b.t('second line of second item of z1', 'cd');\n    b.t(\n        'put z1 into z\\nput \"A\" into second line of second item of z\\\\z',\n        'a,b\\ncd,A\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t(\n        'put z1 into z\\ndelete second line of second item of z\\\\z',\n        'a,b\\ncd\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t('last line of last item of z1', 'qr');\n    b.t(\n        'put z1 into z\\nput \"A\" into last line of last item of z\\\\z',\n        'a,b\\ncd,ef\\ng,h\\nij\\nkl\\nmn,op\\nA'\n    );\n    b.t(\n        'put z1 into z\\ndelete last line of last item of z\\\\z',\n        'a,b\\ncd,ef\\ng,h\\nij\\nkl\\nmn,op'\n    );\n    b.t('second char of second item of z1', '\\n');\n    b.t(\n        'put z1 into z\\nput \"A\" into second char of second item of z\\\\z',\n        'a,bAcd,ef\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t(\n        'put z1 into z\\ndelete second char of second item of z\\\\z',\n        'a,bcd,ef\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t('second item of second char of z1', '');\n    b.t(\n        'put z1 into z\\nput \"A\" into second item of second char of z\\\\z',\n        'a,bAcd,ef\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t(\n        'put z1 into z\\ndelete second item of second char of z\\\\z',\n        'a,bcd,ef\\ng,h\\nij\\nkl\\nmn,op\\nqr'\n    );\n    b.t('global z1\\nput \"a,b,c\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete first item of z\\\\z', 'b,c');\n    b.t('put z1 into z\\ndelete last item of z\\\\z', 'a,b');\n    b.t('global z1\\nput \"a\"&cr&\"b\"&cr&\"c\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete first line of z\\\\z', 'b\\nc');\n    b.t('put z1 into z\\ndelete last line of z\\\\z', 'a\\nb\\n');\n    b.t('global z1\\nput \"abcd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete first char of z\\\\z', 'bcd');\n    b.t('put z1 into z\\ndelete last char of z\\\\z', 'abc');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * math ops\n */\nt.test('03chunkexpression_mathops', () => {\n    let b = new ScriptTestBatch();\n    b.t('global z1\\nput \"1,2,3\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 1 to item 0 of z\\\\z', '11,2,3');\n    b.t('put z1 into z\\nadd 1 to item 1 of z\\\\z', '2,2,3');\n    b.t('put z1 into z\\nadd 1 to item 2 of z\\\\z', '1,3,3');\n    b.t('put z1 into z\\nadd 1 to item 3 of z\\\\z', '1,2,4');\n    b.t('put z1 into z\\nadd 1 to item 4 of z\\\\z', '1,2,3,1');\n    b.t('put z1 into z\\nadd 1 to item 5 of z\\\\z', '1,2,3,,1');\n    b.t('global z1\\nput \",1,2,3,\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 1 to item 0 of z\\\\z', '1,1,2,3,');\n    b.t('put z1 into z\\nadd 1 to item 1 of z\\\\z', '1,1,2,3,');\n    b.t('put z1 into z\\nadd 1 to item 2 of z\\\\z', ',2,2,3,');\n    b.t('put z1 into z\\nadd 1 to item 3 of z\\\\z', ',1,3,3,');\n    b.t('put z1 into z\\nadd 1 to item 4 of z\\\\z', ',1,2,4,');\n    b.t('put z1 into z\\nadd 1 to item 5 of z\\\\z', ',1,2,3,1');\n    b.t('global z1\\nput \"1,2,3\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nmultiply item 0 of z by 2\\\\z', '01,2,3');\n    b.t('put z1 into z\\nmultiply item 1 of z by 2\\\\z', '2,2,3');\n    b.t('put z1 into z\\nmultiply item 2 of z by 2\\\\z', '1,4,3');\n    b.t('put z1 into z\\nmultiply item 3 of z by 2\\\\z', '1,2,6');\n    b.t('put z1 into z\\nmultiply item 4 of z by 2\\\\z', '1,2,3,0');\n    b.t('put z1 into z\\nmultiply item 5 of z by 2\\\\z', '1,2,3,,0');\n    /* has same weird behavior */\n    b.t('global z1\\nput \"1,2,3\"&cr&\"4,5,6\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 1 to item 2 of item 1 of z\\\\z', '1,3,3\\n4,5,6');\n    b.t('put z1 into z\\nadd 1 to item 1 of item 2 of z\\\\z', '2,2,3\\n4,5,6');\n    b.t('put z1 into z\\nadd 1 to item 2 of line 2 of z\\\\z', '1,2,3\\n4,6,6');\n    b.t('put z1 into z\\nadd 1 to line 2 of item 2 of z\\\\z', '1,2,3\\n4,6,6');\n    b.t('global z1\\nput \"1,2,3\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 100 to item 0 of z\\\\z', '1001,2,3');\n    b.t('put z1 into z\\nadd 100 to item 1 of z\\\\z', '101,2,3');\n    b.t('put z1 into z\\nadd 100 to item 2 of z\\\\z', '1,102,3');\n    b.t('put z1 into z\\nadd 100 to item 3 of z\\\\z', '1,2,103');\n    b.t('put z1 into z\\nadd 100 to item 4 of z\\\\z', '1,2,3,100');\n    b.t('put z1 into z\\nadd 100 to item 5 of z\\\\z', '1,2,3,,100');\n    b.t('global z1\\nput \",1,2,3,\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 100 to item 0 of z\\\\z', '100,1,2,3,');\n    b.t('put z1 into z\\nadd 100 to item 1 of z\\\\z', '100,1,2,3,');\n    b.t('put z1 into z\\nadd 100 to item 2 of z\\\\z', ',101,2,3,');\n    b.t('put z1 into z\\nadd 100 to item 3 of z\\\\z', ',1,102,3,');\n    b.t('put z1 into z\\nadd 100 to item 4 of z\\\\z', ',1,2,103,');\n    b.t('put z1 into z\\nadd 100 to item 5 of z\\\\z', ',1,2,3,100');\n    b.t('global z1\\nput \"1,2,3\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nmultiply item 0 of z by 200\\\\z', '01,2,3');\n    b.t('put z1 into z\\nmultiply item 1 of z by 200\\\\z', '200,2,3');\n    b.t('put z1 into z\\nmultiply item 2 of z by 200\\\\z', '1,400,3');\n    b.t('put z1 into z\\nmultiply item 3 of z by 200\\\\z', '1,2,600');\n    b.t('put z1 into z\\nmultiply item 4 of z by 200\\\\z', '1,2,3,0');\n    b.t('put z1 into z\\nmultiply item 5 of z by 200\\\\z', '1,2,3,,0');\n    /* has same weird behavior */\n    b.t('global z1\\nput \"1,2,3\"&cr&\"4,5,6\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nadd 100 to item 2 of item 1 of z\\\\z', '1,102,3\\n4,5,6');\n    b.t('put z1 into z\\nadd 100 to item 1 of item 2 of z\\\\z', '101,2,3\\n4,5,6');\n    b.t('put z1 into z\\nadd 100 to item 2 of line 2 of z\\\\z', '1,2,3\\n4,105,6');\n    b.t('put z1 into z\\nadd 100 to line 2 of item 2 of z\\\\z', '1,2,3\\n4,105,6');\n    b.t('global z1\\nput \"100,200,300\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndivide item 2 of z by 100\\\\z', '100,2,300');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\nt.test('03chunk, recommended use scenarios', () => {\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', false, h3.vcstate.model)\n    );\n    let b = new ScriptTestBatch();\n    /* use as a 1-d array */\n    b.t('global arrayLike\\nput \"\" into arrayLike\\\\1', '1');\n    b.t(\n        'put 9 into item 5 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        ',,,,9 5'\n    );\n    b.t(\n        'put 10 into item 3 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        ',,10,,9 5'\n    );\n    b.t(\n        'put 11 into item 1 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,10,,9 5'\n    );\n    b.t(\n        'put 12 into item 7 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,10,,9,,12 7'\n    );\n    b.t(\n        'put \"\" into item 3 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,,,9,,12 7'\n    );\n    b.t(\n        'put 1 into item 4 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,,1,9,,12 7'\n    );\n    b.t(\n        'delete item 4 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,,9,,12 6'\n    );\n    b.t(\n        'delete item 3 of arrayLike\\\\arrayLike && the number of items in arrayLike',\n        '11,,9,,12 5'\n    );\n    b.t('item 1 of arrayLike && item 2 of arrayLike && item 5 of arrayLike', '11  12');\n    /* use as a 2-d array */\n    b.t('global arr2d\\nput \"\" into arr2d\\\\1', '1');\n    b.t(\n        'put 9 into item 5 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        '\\n\\n,,,,9 3'\n    );\n    b.t(\n        'put 10 into item 3 of line 5 of arr2d\\\\arr2d && the number of lines in arr2d',\n        '\\n\\n,,,,9\\n\\n,,10 5'\n    );\n    b.t(\n        'put 11 into item 1 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        '\\n\\n11,,,,9\\n\\n,,10 5'\n    );\n    b.t(\n        'put 12 into item 2 of line 1 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12\\n\\n11,,,,9\\n\\n,,10 5'\n    );\n    b.t(\n        'put 13 into item 2 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12\\n\\n11,13,,,9\\n\\n,,10 5'\n    );\n    b.t(\n        'put 14 into item 2 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12\\n\\n11,14,,,9\\n\\n,,10 5'\n    );\n    b.t(\n        'put 20 into item 7 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12\\n\\n11,14,,,9,,20\\n\\n,,10 5'\n    );\n    b.t(\n        'put 21 into item 3 of line 1 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n11,14,,,9,,20\\n\\n,,10 5'\n    );\n    b.t(\n        'put 22 into item 5 of line 5 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n11,14,,,9,,20\\n\\n,,10,,22 5'\n    );\n    b.t(\n        'put \"\" into item 1 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n,14,,,9,,20\\n\\n,,10,,22 5'\n    );\n    b.t(\n        'put \"\" into item 3 of line 5 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n,14,,,9,,20\\n\\n,,,,22 5'\n    );\n    b.t(\n        'delete item 2 of line 3 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n,,,9,,20\\n\\n,,,,22 5'\n    );\n    b.t(\n        'put 23 into item 1 of line 2 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n23\\n,,,9,,20\\n\\n,,,,22 5'\n    );\n    b.t(\n        'delete item 1 of line 2 of arr2d\\\\arr2d && the number of lines in arr2d',\n        ',12,21\\n\\n,,,9,,20\\n\\n,,,,22 5'\n    );\n    b.batchEvaluate(h3);\n    /* loops */\n    const code = `\nfunction sum1d arr\n    put 0 into total\n    repeat with x = 1 to the number of items in arr\n        put item x of arr into v\n        if length(v) > 0 then add v to total\n    end repeat\n    return total\nend sum1d\n\nfunction sum2d arr\n    put 0 into total\n    repeat with y = 1 to the number of lines in arr\n        repeat with x = 1 to the number of items in line y of arr\n            put item x of line y of arr into v\n            if length(v) > 0 then add v to total\n        end repeat\n    end repeat\n    return total\nend sum2d\n    `;\n    h3.runGeneralCode(code, 'global testresult1\\nput sum1d(\"\") into testresult1');\n    let got = h3.vcstate.runtime.codeExec.globals.get(`testresult1`).readAsString();\n    assertWarnEq('0', got, 'U |');\n    h3.runGeneralCode(\n        code,\n        'global testresult1, arrayLike\\nput sum1d(arrayLike) into testresult1'\n    );\n    got = h3.vcstate.runtime.codeExec.globals.get(`testresult1`).readAsString();\n    assertWarnEq((11 + 9 + 12).toString(), got, 'Uz|');\n    h3.runGeneralCode(\n        code,\n        'global testresult1, arr2d\\nput sum2d(arr2d) into testresult1'\n    );\n    got = h3.vcstate.runtime.codeExec.globals.get(`testresult1`).readAsString();\n    assertWarnEq((12 + 21 + 9 + 20 + 22).toString(), got, 'Uy|');\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', true, h3.vcstate.model)\n    );\n});\n\nt.test('03chunkexpression_additional chunk tests', () => {\n    /* most are covered by extensive tests */\n    let b = new ScriptTestBatch();\n    /* line aggressive delete */\n    b.t('put \"a\"&cr&\"b\"&cr&\"c\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 1 of line 0 of z\\\\z', 'a\\nb\\nc');\n    b.t('put z1 into z\\ndelete item 1 of line 1 of z\\\\z', '\\nb\\nc');\n    b.t('put z1 into z\\ndelete item 1 of line 2 of z\\\\z', 'a\\nc');\n    b.t('put z1 into z\\ndelete item 1 of line 3 of z\\\\z', 'a\\nb');\n    b.t('put z1 into z\\ndelete item 1 of line 4 of z\\\\z', 'a\\nb\\nc');\n    b.t('put z1 into z\\ndelete item 1 of line 5 of z\\\\z', 'a\\nb\\nc');\n    /* aggressive delete */\n    b.t('put \",, \" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 3 of z\\\\z', ',');\n    /* aggressive delete in a line */\n    b.t('put \",, \"&cr into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 3 of line 1 of z\\\\z', ',\\n');\n    /* leave the space */\n    b.t('put \"\"&\"\"&cr&\" ,\"&cr&\"\"&\"\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 1 to 1 of line 2 to 2 of z\\\\z', '\\n \\n');\n    /* don't delete the comma */\n    b.t('put \"\"&\",\"&cr&\"\"&\"\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 2 to 2 of line 1 to 1 of z\\\\z', ',\\n');\n    /* don't delete the space */\n    b.t('put \"\"&\" ,\"&cr&\"\"&\"\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 1 to 1 of z\\\\z', ' \\n');\n    /* should add commas */\n    b.t(\n        longstr(`put \"\"&\"ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&cr&\"kl\"&cr&\"mn,op\"&cr&\n         \"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&cr&\"67 89,/.\"&cr&\"#$,;: &*,(),-=\"&cr&\n         \"~+, <>\"&cr&\"[],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into line 3 to 4 of item 3 to 3 of z\\\\z',\n        'ab\\ncd,ef\\n\\ngh,,ABCDE\\nij\\nkl\\nmn,op\\nqr\\nst,uv,wx\\n01 ' +\n            '23\\n45 \\n67 89,/.\\n#$,;: &*,(),-=\\n~+, <>\\n[],{}'\n    );\n    /* seems to contradict if (!okToAppend) { */\n    /* apparently it can add the bounds[2] info after all */\n    b.t(\n        longstr(`put \"\"&\"ab\"&cr&\"cd,ef  gh ij\"&cr&\"kl mn op qr,st,uv\"&cr&\n         \"wx,01,23,45 ,67,89\"&cr&\"/.,#$ ;:\"&cr&\"&*\"&cr&\"()\"&cr&\"-=\"&cr&\n         \"~+, <>,[]\"&cr&\"{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into line 2 of word 3 of item 3 of z\\\\z',\n        'ab\\ncd,ef  gh ij,ABCDE\\nkl mn op qr,st,uv\\nwx,01,23,45 ' +\n            ',67,89\\n/.,#$ ;:\\n&*\\n()\\n-=\\n~+, <>,[]\\n{}'\n    );\n    /* apparently it can add the bounds[2] info after all */\n    b.t(\n        longstr(`put \"\"&\"ab\"&cr&\"cd,ef  gh ij\"&cr&\"kl mn op qr,st,uv\"&cr&\n         \"wx,01,23,45 ,67,89\"&cr&\"/.,#$ ;:\"&cr&\"&*\"&cr&\"()\"&cr&\"-=\"&cr\n         &\"~+, <>,[]\"&cr&\"{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into line 1 of word 1 of item 3 of z\\\\z',\n        'ab,,ABCDE\\ncd,ef  gh ij\\nkl mn op qr,st,uv\\nwx,01,23,45 ,' +\n            '67,89\\n/.,#$ ;:\\n&*\\n()\\n-=\\n~+, <>,[]\\n{}'\n    );\n    /* should not delete anything */\n    b.t(\n        longstr(`put \"\"&\"ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&cr&\"kl\"&cr&\n         \"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&cr&\"67 89,/.\"&cr&\n         \"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\"[],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete line 3 of line 3 of word 3 of z\\\\z',\n        'ab\\ncd,ef\\n\\ngh\\nij\\nkl\\nmn,op\\nqr\\nst,uv,wx\\n01 23\\n45 \\n67' +\n            ' 89,/.\\n#$,;: &*,(),-=\\n~+, <>\\n[],{}'\n    );\n    /* shouldn't have the weird delete behavior if not actually by end of string */\n    b.t(\n        longstr(`put \"\"&\"ab\"&cr&\"cd,ef  gh ij\"&cr&\"kl mn op qr,st,uv\"&cr&\n         \"wx,01,23,45 ,67,89\"&cr&\"/.,#$ ;:\"&cr&\"&*\"&cr&\"()\"&cr&\"-=\"&cr&\n         \"~+, <>,[]\"&cr&\"{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete word 3 of line 2 of word 2 of z\\\\z',\n        'ab\\ncd,ef  gh \\nkl mn op qr,st,uv\\nwx,01,23,45 ,67,89\\n/.,#$ ;:\\n&*' +\n            '\\n()\\n-=\\n~+, <>,[]\\n{}'\n    );\n    /* shouldn't have the strip-last-whitespace behavior if not actually by end of string */\n    b.t(\n        longstr(`put \"\"&\"ab cd,ef ,gh,ij kl mn,op\"&cr&\"qr\"&cr&\"st,uv,wx 01 23 45,\"&\n         cr&\"67,89\"&cr&\"/. #$ ;: &*,() -=\"&cr&\"~+, <> [],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete line 1 of word 3 of item 2 of z\\\\z',\n        'ab cd,ef ,gh,ij kl mn,op\\nqr\\nst,uv,wx 01 23 45,\\n67,89\\n/. #$ ;: &*,() -=\\n~+, <> [],{}'\n    );\n    /* don't add commas. not intuitive, so disabled in compat mode */\n    b.t('put \"\"&\" ,\"&\"\" into z1\\\\1', '1');\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into item 2 to 2 of line 2 to 2 of z\\\\z',\n        ' ,\\nABCDE'\n    );\n    b.t('put \"\"&\" ,\"&\"\" into z1\\\\1', '1');\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into char 1 of item 2 of line 2 of z\\\\z',\n        ' ,\\nABCDE'\n    );\n    b.t('put \"\"&\" ,\"&\"\" into z1\\\\1', '1');\n    b.t(\n        'put z1 into z\\nput \"ABCDE\" into char 7 of item 2 of line 2 of z\\\\z',\n        ' ,\\nABCDE'\n    );\n\n    /* deleting item might delete a lot */\n    b.t(\n        longstr(`put \"\"&\"ab cd,ef ,gh,ij kl mn,op\"&cr&\"qr\"&cr&\"st,uv,wx 01 23 45,\"&\n         cr&\"67,89\"&cr&\"/. #$ ;: &*,() -=\"&cr&\"~+, <> [],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete line 2 of item 1 of line 3 of z\\\\z',\n        'ab cd,ef ,gh,ij kl mn,op\\nst,uv,wx 01 23 45,\\n67,89\\n/. #$ ;: &*,() -=\\n~+, <> [],{}'\n    );\n    /* deleting item might delete a lot, unless line is empty */\n    b.t(\n        longstr(`put \"\"&\"ab cd,ef ,gh,ij kl mn,op\"&cr&\"\"&cr&\"st,uv,wx 01 23 45,\"&\n         cr&\"67,89\"&cr&\"/. #$ ;: &*,() -=\"&cr&\"~+, <> [],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete line 2 of item 1 of line 3 of z\\\\z',\n        'ab cd,ef ,gh,ij kl mn,op\\n\\nst,uv,wx 01 23 45,\\n67,89\\n/. #$ ;: &*,() -=\\n~+, <> [],{}'\n    );\n    /* deleting item might delete a lot, only if delete item 0 */\n    b.t(\n        longstr(`put \"\"&\"ab cd,ef ,gh,ij kl mn,op\"&cr&\"qr\"&cr&\"st,uv,wx 01 23 45,\"&\n         cr&\"67,89\"&cr&\"/. #$ ;: &*,() -=\"&cr&\"~+, <> [],{}\"&\"\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'put z1 into z\\ndelete line 2 of item 0 of line 3 of z\\\\z',\n        'ab cd,ef ,gh,ij kl mn,op\\nqr\\nst,uv,wx 01 23 45,\\n67,89\\n/. #$ ;: &*,() -=\\n~+, <> [],{}'\n    );\n\n    /* shows that just doing this in a loop is not sufficient. */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 3 of z\\\\z', 'a.b  c.d\\n');\n    b.t('put z1 into z\\ndelete word 3 of z\\ndelete word 2 of z\\\\z', 'a.b  \\n');\n    b.t(\n        'put z1 into z\\ndelete word 3 of z\\ndelete word 2 of z\\ndelete word 1 of z\\\\z',\n        '\\n'\n    );\n\n    /* corner cases */\n    b.t('global z1\\nput \"  \"&cr&\" ab  \"&cr&\" bc  \"&cr&\" de  \"&cr&\" \" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 3 of z\\\\z', '  \\n ab  \\n bc  \\n \\n ');\n    b.t(\n        longstr(`global z1{{NEWLINE}}put \"ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\n        \"ij\"&cr&\"kl\"&cr&\"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr\n        &\"45 \"&cr&\"67 89,/.\"&cr&\"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\n        \"[],{}\" into z1\\\\1`),\n        '1'\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 3 to 4 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab\\ncd,ef\\n\\n\\nkl\\nmn,op\\nqr\\nst,uv,wx\\n\n        01 23\\n45 \\n67 89,/.\\n#$,;: &*,(),-=\\n~+, <>\\n[],{}' */\n    );\n\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\nt.test('03chunkadditional turn off compat mode', () => {\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', false, h3.vcstate.model)\n    );\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03chunkBasic.ts",
    "content": "\n/* auto */ import { ScriptTestBatch, TestMultiplier } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { h3 } from './test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* all tests here confirmed in emulator -\nyes, it's weird that put and delete ignore order.\nmost tests here, unlike in test03chunk additional,\nare redundant with those in the extensive test. */\n\nlet t = new SimpleUtil512TestCollection('testCollection03chunkBasic');\nexport let testCollection03chunkBasic = t;\n\nt.atest('--init--testCollection03chunkBasic', async () => {\n    assertTrue(\n        h3,\n        longstr(`U#|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n\n    /* go to a cd with at least 2 fields */\n    let b = new ScriptTestBatch();\n    b.t(`go to cd id ${h3.ids.cdBC}\\\\1`, '1');\n    b.batchEvaluate(h3);\n\n    /* turn on compat mode */\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', true, h3.vcstate.model)\n    );\n});\n\nt.test('03 chunk groundwork', () => {\n    let b = new ScriptTestBatch();\n    /* chunk bounds */\n    b.t('global z\\nput \"abcde\" into z\\\\1', '1');\n    b.t('char 1 of z', 'a');\n    b.t('char (1) of z', 'a');\n    b.t('char (1+1) of z', 'b');\n    /* var containers */\n    b.t('put 1 into x1\\\\x1', '1');\n    b.t('put 1 into x1\\\\char x1 of z', 'a');\n    b.t('put 2 into x1\\\\char x1 of z', 'b');\n    b.t('put 2 into x1\\nput 3 into y1\\\\char x1 to y1 of z', 'bc');\n    /* with field (it expects to see cd fld 1 of card \"parentCard\") */\n    b.t('global z\\nput 1 into cd fld 1\\\\char cd fld 1 of z', 'ERR:6:parse err');\n    b.t(\n        'global z\\nput 1 into cd fld 1\\\\char cd fld 1 of this cd of this stack of z',\n        'a'\n    );\n    b.t('global z\\nput 1 into cd fld 1\\\\char target of z', 'ERR:6:can only read/write');\n    /* with field */\n    b.t('put 1 into cd fld 1\\\\char (cd fld 1) of z', 'a');\n    b.t('put 2 into cd fld 1\\\\char (cd fld 1) of z', 'b');\n    b.t('put 2 into cd fld 1\\\\char (cd fld 1) to 3 of z', 'bc');\n    /* non integer bounds */\n    b.t('global z\\\\char 1.5 of z', 'ERR:5:expected an integer');\n    b.t('global z\\\\char 1.2 of z', 'ERR:5:expected an integer');\n    b.t('global z\\\\char 0.001 of z', 'ERR:5:expected an integer');\n    b.t('global z\\\\char \"no\" of z', 'ERR:5:parse err');\n    b.t('global z\\nput \"no\" into x\\\\char x of z', 'ERR:6:expected an integer');\n    b.t('global z\\nput -1 into x\\\\char x of z', 'ERR:6:negative');\n    b.t('global z\\nput \"\" into x\\\\char x of z', 'ERR:6:integer');\n    b.t('global z\\\\char -1 of z', 'ERR:5:parse err');\n    b.t('global z\\\\char 1 to char 2 of z', 'ERR:5:parse err');\n    b.t('global z\\\\char 1 to word 1 of z', 'ERR:5:parse err');\n    b.t('global z\\\\char 1 to 2 to 3 of z', 'ERR:5:parse err');\n    /* backwards bounds (more in vpcTestChunkResolution.ts) */\n    b.t('item 3 to 1 of \",,cd,\"', 'cd');\n    b.t('word 2 to 1 of \"  abc  .def gh.i   \"', '.def');\n    b.t('char 1 to 0 of \"abc\"', '');\n    /* we only allow backwards ranges if non-recursive and not a delete\n    (i.e. those covered by vpcTestChunkResolution.ts) */\n    b.t('global z\\\\char 3 to 2 of line 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\item 3 to 2 of line 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\line 3 to 2 of line 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\word 3 to 2 of line 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\line 2 of char 3 to 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\line 2 of item 3 to 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\line 2 of line 3 to 2 of z', 'ERR:5:backwards');\n    b.t('global z\\\\line 2 of word 3 to 2 of z', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into char 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into item 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into line 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into word 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into line 2 of char 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into line 2 of item 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into line 2 of line 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\nput \"A\" into line 2 of word 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 2 of char 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 2 of item 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 2 of line 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 2 of word 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete char 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete item 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete word 3 to 2 of line 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete char 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete item 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete line 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    b.t('global z\\ndelete word 3 to 2 of z\\\\1', 'ERR:5:backwards');\n    /* ordinal bounds */\n    b.t('first char of z', 'a');\n    b.t('third char of z', 'c');\n    b.t('last char of z', 'e');\n    b.t('tenth char of z', '');\n    b.t('global z\\\\char 1 to fifth char of z', 'ERR:5:parse err');\n    /* ordinal bounds with the */\n    b.t('the first char of z', 'a');\n    b.t('the third char of z', 'c');\n    b.t('the last char of z', 'e');\n    b.t('the tenth char of z', '');\n    b.t('global z\\\\char 1 to the fifth char of z', 'ERR:5:parse err');\n    /* ordinal puts */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"AA\" into char 1 of z\\\\z', 'AAbc');\n    b.t('put z1 into z\\nput \"AA\" into char 2 of z\\\\z', 'aAAc');\n    b.t('put z1 into z\\nput \"AA\" into char 10 of z\\\\z', 'abcAA');\n    b.t('put z1 into z\\nput \"AA\" into first char of z\\\\z', 'AAbc');\n    b.t('put z1 into z\\nput \"AA\" into third char of z\\\\z', 'abAA');\n    b.t('put z1 into z\\nput \"AA\" into last char of z\\\\z', 'abAA');\n    b.t('put z1 into z\\nput \"AA\" into tenth char of z\\\\z', 'abcAA');\n    b.t(\n        'global z1\\nput z1 into z\\nput \"AA\" into char 1 to fifth char of z\\\\z',\n        'ERR:6:parse err'\n    );\n    /* ordinal puts item */\n    b.t('global z1\\nput \"ab,cd,ef\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"AA\" into item 1 of z\\\\z', 'AA,cd,ef');\n    b.t('put z1 into z\\nput \"AA\" into item 2 of z\\\\z', 'ab,AA,ef');\n    b.t('put z1 into z\\nput \"AA\" into item 5 of z\\\\z', 'ab,cd,ef,,AA');\n    b.t('put z1 into z\\nput \"AA\" into first item of z\\\\z', 'AA,cd,ef');\n    b.t('put z1 into z\\nput \"AA\" into third item of z\\\\z', 'ab,cd,AA');\n    b.t('put z1 into z\\nput \"AA\" into last item of z\\\\z', 'ab,cd,AA');\n    b.t('put z1 into z\\nput \"AA\" into fifth item of z\\\\z', 'ab,cd,ef,,AA');\n    b.t(\n        'global z1\\nput z1 into z\\nput \"AA\" into item 1 to fifth item of z\\\\z',\n        'ERR:6:parse err'\n    );\n\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * count number\n */\nt.test('03countnumber', () => {\n    let b = new ScriptTestBatch();\n    b.t('the number of chars in \"\"', '0');\n    b.t('the number of chars in \"a\"', '1');\n    b.t('the number of chars in \"   \"', '3');\n    b.t('the number of chars in cr', '1');\n    b.t('the number of chars in \" \"&cr&\" \"', '3');\n    b.t(\n        'the number of chars in \"ab cd, ef\"&cr&\"gh ii,jj,kk\"&cr&\"mn,op,q\"&cr&\"r,s\"',\n        '33'\n    );\n    b.t(\n        longstr(`the number of chars in \" ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&\n         cr&\"kl\"&cr&\"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&cr&\n         \"67 89,/.\"&cr&\"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\"[],{}\"`),\n        '84'\n    );\n    b.t('the number of items in \"\"', '0');\n    b.t('the number of items in \"a\"', '1');\n    b.t('the number of items in \"   \"', '0');\n    b.t('the number of items in cr', '0');\n    b.t('the number of items in \" \"&cr&\" \"', '0');\n    b.t('the number of items in \"ab cd, ef\"&cr&\"gh ii,jj,kk\"&cr&\"mn,op,q\"&cr&\"r,s\"', '7');\n    b.t(\n        longstr(`the number of items in \" ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&cr&\n         \"kl\"&cr&\"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&cr&\"67 89,/.\"&\n         cr&\"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\"[],{}\"`),\n        '11'\n    );\n    b.t('the number of lines in \"\"', '0');\n    b.t('the number of lines in \"a\"', '1');\n    b.t('the number of lines in \"   \"', '1');\n    b.t('the number of lines in cr', '1');\n    b.t('the number of lines in \" \"&cr&\" \"', '2');\n    b.t('the number of lines in \"ab cd, ef\"&cr&\"gh ii,jj,kk\"&cr&\"mn,op,q\"&cr&\"r,s\"', '4');\n    b.t(\n        longstr(`the number of lines in \" ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&cr&\n         \"kl\"&cr&\"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&cr&\"67 89,/.\"&\n         cr&\"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\"[],{}\"`),\n        '15'\n    );\n    b.t('the number of words in \"\"', '0');\n    b.t('the number of words in \"a\"', '1');\n    b.t('the number of words in \"   \"', '0');\n    b.t('the number of words in cr', '0');\n    b.t('the number of words in \" \"&cr&\" \"', '0');\n    b.t('the number of words in \"ab cd, ef\"&cr&\"gh ii,jj,kk\"&cr&\"mn,op,q\"&cr&\"r,s\"', '7');\n    b.t(\n        longstr(`the number of words in \" ab\"&cr&\"cd,ef\"&cr&\"\"&cr&\"gh\"&cr&\"ij\"&\n         cr&\"kl\"&cr&\"mn,op\"&cr&\"qr\"&cr&\"st,uv,wx\"&cr&\"01 23\"&cr&\"45 \"&\n         cr&\"67 89,/.\"&cr&\"#$,;: &*,(),-=\"&cr&\"~+, <>\"&cr&\"[],{}\"`),\n        '18'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * get chunk\n */\nt.test('03chunkexpression_get_char', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z\\nput \"abc\" into z\\\\1', '1');\n    b.t('char 1 of z', 'a');\n    b.t('char 2 of z', 'b');\n    b.t('char 3 of z', 'c');\n    /* abnormal char */\n    b.t('char 0 of z', '');\n    b.t('char 4 of z', '');\n    b.t('char 5 of z', '');\n    /* normal ranges */\n    b.t('char 1 to 1 of z', 'a');\n    b.t('char 1 to 2 of z', 'ab');\n    b.t('char 1 to 3 of z', 'abc');\n    b.t('char 2 to 3 of z', 'bc');\n    /* recurse */\n    b.t('char 2 of char 1 to 2 of z', 'b');\n    b.t('char 2 to 3 of char 1 to 3 of z', 'bc');\n    b.t('char 2 to 3 of char 2 to 3 of char 1 to 3 of z', 'c');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_get_word', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z\\nput \"a.b  c.d\" & cr & \"e\" into z\\\\1', '1');\n    b.t('word 1 of z', 'a.b');\n    b.t('word 2 of z', 'c.d');\n    b.t('word 3 of z', 'e');\n    /* abnormal word */\n    b.t('word 0 of z', '');\n    b.t('word 4 of z', '');\n    b.t('word 5 of z', '');\n    /* normal ranges */\n    b.t('word 1 to 1 of z', 'a.b');\n    b.t('word 1 to 2 of z', 'a.b  c.d');\n    b.t('word 1 to 3 of z', 'a.b  c.d\\ne');\n    b.t('word 2 to 3 of z', 'c.d\\ne');\n    /* recurse */\n    b.t('word 2 of word 1 to 2 of z', 'c.d');\n    b.t('word 2 to 3 of word 1 to 3 of z', 'c.d\\ne');\n    b.t('word 2 to 3 of word 2 to 3 of word 1 to 3 of z', 'e');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_get_line', () => {\n    let b = new ScriptTestBatch();\n    /* normal line */\n    b.t('global z\\nput \"ab\" & cr & \"cd\" & cr & \"ef\" into z\\\\1', '1');\n    b.t('line 1 of z', 'ab');\n    b.t('line 2 of z', 'cd');\n    b.t('line 3 of z', 'ef');\n    /* abnormal line */\n    b.t('line 0 of z', '');\n    b.t('line 4 of z', '');\n    b.t('line 5 of z', '');\n    /* normal ranges */\n    b.t('line 1 to 1 of z', 'ab');\n    b.t('line 1 to 2 of z', 'ab\\ncd');\n    b.t('line 1 to 3 of z', 'ab\\ncd\\nef');\n    b.t('line 2 to 3 of z', 'cd\\nef');\n    /* recurse */\n    b.t('line 2 of line 1 to 2 of z', 'cd');\n    b.t('line 2 to 3 of line 1 to 3 of z', 'cd\\nef');\n    b.t('line 2 to 3 of line 2 to 3 of line 1 to 3 of z', 'ef');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_get_item', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z\\nput \"ab,,cd\" into z\\\\1', '1');\n    b.t('item 1 of z', 'ab');\n    b.t('item 2 of z', '');\n    b.t('item 3 of z', 'cd');\n    /* abnormal item */\n    b.t('item 0 of z', '');\n    b.t('item 4 of z', '');\n    b.t('item 5 of z', '');\n    /* normal ranges */\n    b.t('item 1 to 1 of z', 'ab');\n    b.t('item 1 to 2 of z', 'ab,');\n    b.t('item 1 to 3 of z', 'ab,,cd');\n    b.t('item 2 to 3 of z', ',cd');\n    /* recurse */\n    b.t('item 2 of item 1 to 2 of z', '');\n    b.t('item 2 to 3 of item 1 to 3 of z', ',cd');\n    b.t('item 2 to 3 of item 2 to 3 of item 1 to 3 of z', 'cd');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * put empty chunk\n */\nt.test('03chunkexpression_put_empty_char', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"\" into char 1 of z\\\\z', 'bc');\n    b.t('put z1 into z\\nput \"\" into char 2 of z\\\\z', 'ac');\n    b.t('put z1 into z\\nput \"\" into char 3 of z\\\\z', 'ab');\n    /* abnormal char */\n    b.t('put z1 into z\\nput \"\" into char 0 of z\\\\z', 'abc');\n    b.t('put z1 into z\\nput \"\" into char 4 of z\\\\z', 'abc');\n    b.t('put z1 into z\\nput \"\" into char 5 of z\\\\z', 'abc');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"\" into char 1 to 1 of z\\\\z', 'bc');\n    b.t('put z1 into z\\nput \"\" into char 1 to 2 of z\\\\z', 'c');\n    b.t('put z1 into z\\nput \"\" into char 1 to 3 of z\\\\z', '');\n    b.t('put z1 into z\\nput \"\" into char 2 to 3 of z\\\\z', 'a');\n    /* recurse */\n    b.t('put z1 into z\\nput \"\" into char 2 of char 1 to 2 of z\\\\z', 'ac');\n    b.t('put z1 into z\\nput \"\" into char 2 to 3 of char 1 to 3 of z\\\\z', 'a');\n    b.t(\n        'put z1 into z\\nput \"\" into char 2 to 3 of char 2 to 3 of char 1 to 3 of z\\\\z',\n        'a'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_empty_word', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"\" into word 1 of z\\\\z', '  c.d\\ne');\n    b.t('put z1 into z\\nput \"\" into word 2 of z\\\\z', 'a.b  \\ne');\n    b.t('put z1 into z\\nput \"\" into word 3 of z\\\\z', 'a.b  c.d\\n');\n    /* abnormal word */\n    b.t('put z1 into z\\nput \"\" into word 0 of z\\\\z', 'a.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"\" into word 4 of z\\\\z', 'a.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"\" into word 5 of z\\\\z', 'a.b  c.d\\ne');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"\" into word 1 to 1 of z\\\\z', '  c.d\\ne');\n    b.t('put z1 into z\\nput \"\" into word 1 to 2 of z\\\\z', '\\ne');\n    b.t('put z1 into z\\nput \"\" into word 1 to 3 of z\\\\z', '');\n    b.t('put z1 into z\\nput \"\" into word 2 to 3 of z\\\\z', 'a.b  ');\n    /* recurse */\n    b.t('put z1 into z\\nput \"\" into word 2 of word 1 to 2 of z\\\\z', 'a.b  \\ne');\n    b.t('put z1 into z\\nput \"\" into word 2 to 3 of word 1 to 3 of z\\\\z', 'a.b  ');\n    b.t(\n        'put z1 into z\\nput \"\" into word 2 to 3 of word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  '\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_empty_line', () => {\n    let b = new ScriptTestBatch();\n    /* normal line */\n    b.t('global z1\\nput \"ab\" & cr & \"cd\" & cr & \"ef\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"\" into line 1 of z\\\\z', '\\ncd\\nef');\n    b.t('put z1 into z\\nput \"\" into line 2 of z\\\\z', 'ab\\n\\nef');\n    b.t('put z1 into z\\nput \"\" into line 3 of z\\\\z', 'ab\\ncd\\n');\n    /* abnormal line */\n    b.t('put z1 into z\\nput \"\" into line 0 of z\\\\z', 'ab\\ncd\\nef');\n    b.t('put z1 into z\\nput \"\" into line 4 of z\\\\z', 'ab\\ncd\\nef\\n');\n    b.t('put z1 into z\\nput \"\" into line 5 of z\\\\z', 'ab\\ncd\\nef\\n\\n');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"\" into line 1 to 1 of z\\\\z', '\\ncd\\nef');\n    b.t('put z1 into z\\nput \"\" into line 1 to 2 of z\\\\z', '\\nef');\n    b.t('put z1 into z\\nput \"\" into line 1 to 3 of z\\\\z', '');\n    b.t('put z1 into z\\nput \"\" into line 2 to 3 of z\\\\z', 'ab\\n');\n    /* recurse */\n    b.t('put z1 into z\\nput \"\" into line 2 of line 1 to 2 of z\\\\z', 'ab\\n\\nef');\n    b.t('put z1 into z\\nput \"\" into line 2 to 3 of line 1 to 3 of z\\\\z', 'ab\\n');\n    b.t(\n        'put z1 into z\\nput \"\" into line 2 to 3 of line 2 to 3 of line 1 to 3 of z\\\\z',\n        'ab\\n'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_empty_item', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z1\\nput \"ab,,cd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"\" into item 1 of z\\\\z', ',,cd');\n    b.t('put z1 into z\\nput \"\" into item 2 of z\\\\z', 'ab,,cd');\n    b.t('put z1 into z\\nput \"\" into item 3 of z\\\\z', 'ab,,');\n    /* abnormal item */\n    b.t('put z1 into z\\nput \"\" into item 0 of z\\\\z', 'ab,,cd');\n    b.t('put z1 into z\\nput \"\" into item 4 of z\\\\z', 'ab,,cd,');\n    b.t('put z1 into z\\nput \"\" into item 5 of z\\\\z', 'ab,,cd,,');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"\" into item 1 to 1 of z\\\\z', ',,cd');\n    b.t('put z1 into z\\nput \"\" into item 1 to 2 of z\\\\z', ',cd');\n    b.t('put z1 into z\\nput \"\" into item 1 to 3 of z\\\\z', '');\n    b.t('put z1 into z\\nput \"\" into item 2 to 3 of z\\\\z', 'ab,');\n    /* recurse */\n    b.t('put z1 into z\\nput \"\" into item 2 of item 1 to 2 of z\\\\z', 'ab,,cd');\n    b.t('put z1 into z\\nput \"\" into item 2 to 3 of item 1 to 3 of z\\\\z', 'ab,');\n    b.t(\n        'put z1 into z\\nput \"\" into item 2 to 3 of item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ab,'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * put one char\n */\nt.test('03chunkexpression_put_one_char', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" into char 1 of z\\\\z', 'Abc');\n    b.t('put z1 into z\\nput \"A\" into char 2 of z\\\\z', 'aAc');\n    b.t('put z1 into z\\nput \"A\" into char 3 of z\\\\z', 'abA');\n    /* abnormal char */\n    b.t('put z1 into z\\nput \"A\" into char 0 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" into char 4 of z\\\\z', 'abcA');\n    b.t('put z1 into z\\nput \"A\" into char 5 of z\\\\z', 'abcA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" into char 1 to 1 of z\\\\z', 'Abc');\n    b.t('put z1 into z\\nput \"A\" into char 1 to 2 of z\\\\z', 'Ac');\n    b.t('put z1 into z\\nput \"A\" into char 1 to 3 of z\\\\z', 'A');\n    b.t('put z1 into z\\nput \"A\" into char 2 to 3 of z\\\\z', 'aA');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" into char 2 of char 1 to 2 of z\\\\z', 'aAc');\n    b.t('put z1 into z\\nput \"A\" into char 2 to 3 of char 1 to 3 of z\\\\z', 'aA');\n    b.t(\n        'put z1 into z\\nput \"A\" into char 2 to 3 of char 2 to 3 of char 1 to 3 of z\\\\z',\n        'aA'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_word', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" into word 1 of z\\\\z', 'A  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 2 of z\\\\z', 'a.b  A\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 3 of z\\\\z', 'a.b  c.d\\nA');\n    /* abnormal word */\n    b.t('put z1 into z\\nput \"A\" into word 0 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 4 of z\\\\z', 'a.b  c.d\\neA');\n    b.t('put z1 into z\\nput \"A\" into word 5 of z\\\\z', 'a.b  c.d\\neA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" into word 1 to 1 of z\\\\z', 'A  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 1 to 2 of z\\\\z', 'A\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 1 to 3 of z\\\\z', 'A');\n    b.t('put z1 into z\\nput \"A\" into word 2 to 3 of z\\\\z', 'a.b  A');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" into word 2 of word 1 to 2 of z\\\\z', 'a.b  A\\ne');\n    b.t('put z1 into z\\nput \"A\" into word 2 to 3 of word 1 to 3 of z\\\\z', 'a.b  A');\n    b.t(\n        'put z1 into z\\nput \"A\" into word 2 to 3 of word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  A'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_line', () => {\n    let b = new ScriptTestBatch();\n    /* normal line */\n    b.t('global z1\\nput \"ab\" & cr & \"cd\" & cr & \"ef\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" into line 1 of z\\\\z', 'A\\ncd\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 2 of z\\\\z', 'ab\\nA\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 3 of z\\\\z', 'ab\\ncd\\nA');\n    /* abnormal line */\n    b.t('put z1 into z\\nput \"A\" into line 0 of z\\\\z', 'Aab\\ncd\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 4 of z\\\\z', 'ab\\ncd\\nef\\nA');\n    b.t('put z1 into z\\nput \"A\" into line 5 of z\\\\z', 'ab\\ncd\\nef\\n\\nA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" into line 1 to 1 of z\\\\z', 'A\\ncd\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 1 to 2 of z\\\\z', 'A\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 1 to 3 of z\\\\z', 'A');\n    b.t('put z1 into z\\nput \"A\" into line 2 to 3 of z\\\\z', 'ab\\nA');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" into line 2 of line 1 to 2 of z\\\\z', 'ab\\nA\\nef');\n    b.t('put z1 into z\\nput \"A\" into line 2 to 3 of line 1 to 3 of z\\\\z', 'ab\\nA');\n    b.t(\n        'put z1 into z\\nput \"A\" into line 2 to 3 of line 2 to 3 of line 1 to 3 of z\\\\z',\n        'ab\\nA'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_item', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z1\\nput \"ab,,cd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" into item 1 of z\\\\z', 'A,,cd');\n    b.t('put z1 into z\\nput \"A\" into item 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" into item 3 of z\\\\z', 'ab,,A');\n    /* abnormal item */\n    b.t('put z1 into z\\nput \"A\" into item 0 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" into item 4 of z\\\\z', 'ab,,cd,A');\n    b.t('put z1 into z\\nput \"A\" into item 5 of z\\\\z', 'ab,,cd,,A');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" into item 1 to 1 of z\\\\z', 'A,,cd');\n    b.t('put z1 into z\\nput \"A\" into item 1 to 2 of z\\\\z', 'A,cd');\n    b.t('put z1 into z\\nput \"A\" into item 1 to 3 of z\\\\z', 'A');\n    b.t('put z1 into z\\nput \"A\" into item 2 to 3 of z\\\\z', 'ab,A');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" into item 2 of item 1 to 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" into item 2 to 3 of item 1 to 3 of z\\\\z', 'ab,A');\n    b.t(\n        'put z1 into z\\nput \"A\" into item 2 to 3 of item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ab,A'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * delete chunk\n */\nt.test('03chunkexpression_delete_char', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete char 1 of z\\\\z', 'bc');\n    b.t('put z1 into z\\ndelete char 2 of z\\\\z', 'ac');\n    b.t('put z1 into z\\ndelete char 3 of z\\\\z', 'ab');\n    /* abnormal char */\n    b.t('put z1 into z\\ndelete char 0 of z\\\\z', 'abc');\n    b.t('put z1 into z\\ndelete char 4 of z\\\\z', 'abc');\n    b.t('put z1 into z\\ndelete char 5 of z\\\\z', 'abc');\n    /* normal ranges */\n    b.t('put z1 into z\\ndelete char 1 to 1 of z\\\\z', 'bc');\n    b.t('put z1 into z\\ndelete char 1 to 2 of z\\\\z', 'c');\n    b.t('put z1 into z\\ndelete char 1 to 3 of z\\\\z', '');\n    b.t('put z1 into z\\ndelete char 2 to 3 of z\\\\z', 'a');\n    /* recurse */\n    b.t('put z1 into z\\ndelete char 2 of char 1 to 2 of z\\\\z', 'ac');\n    b.t('put z1 into z\\ndelete char 2 to 3 of char 1 to 3 of z\\\\z', 'a');\n    b.t('put z1 into z\\ndelete char 2 to 3 of char 2 to 3 of char 1 to 3 of z\\\\z', 'a');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\nt.test('03chunkexpression_delete_word', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 1 of z\\\\z', 'c.d\\ne');\n    b.t('put z1 into z\\ndelete word 2 of z\\\\z', 'a.b  \\ne');\n    b.t('put z1 into z\\ndelete word 3 of z\\\\z', 'a.b  c.d\\n');\n    /* abnormal word */\n    b.t('put z1 into z\\ndelete word 0 of z\\\\z', 'a.b  c.d\\ne');\n    b.t('put z1 into z\\ndelete word 4 of z\\\\z', 'a.b  c.d\\ne');\n    b.t('put z1 into z\\ndelete word 5 of z\\\\z', 'a.b  c.d\\ne');\n    /* normal ranges */\n    b.t('put z1 into z\\ndelete word 1 to 1 of z\\\\z', 'c.d\\ne');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 1 to 2 of z\\\\z',\n        'ERR:6:deleting ranges' /* '\\ne' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* '' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 2 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'a.b' */\n    );\n    /* recurse */\n    b.t('put z1 into z\\ndelete word 2 of word 1 to 2 of z\\\\z', 'a.b  \\ne');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 2 to 3 of word 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'a.b' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete word 2 to 3 of word 2 to 3 of word 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'a.b' */\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_delete_line', () => {\n    let b = new ScriptTestBatch();\n    /* normal line */\n    b.t('global z1\\nput \"ab\" & cr & \"cd\" & cr & \"ef\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete line 1 of z\\\\z', 'cd\\nef');\n    b.t('put z1 into z\\ndelete line 2 of z\\\\z', 'ab\\nef');\n    b.t('put z1 into z\\ndelete line 3 of z\\\\z', 'ab\\ncd\\n');\n    /* abnormal line */\n    b.t('put z1 into z\\ndelete line 0 of z\\\\z', 'ab\\ncd\\nef');\n    b.t('put z1 into z\\ndelete line 4 of z\\\\z', 'ab\\ncd\\nef');\n    b.t('put z1 into z\\ndelete line 5 of z\\\\z', 'ab\\ncd\\nef');\n    /* normal ranges */\n    b.t('put z1 into z\\ndelete line 1 to 1 of z\\\\z', 'cd\\nef');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete line 1 to 2 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ef' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete line 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* '' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete line 2 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab\\n' */\n    );\n    /* recurse */\n    b.t('global z1\\nput z1 into z\\ndelete line 2 of line 1 to 2 of z\\\\z', 'ab\\nef');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete line 2 to 3 of line 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab\\n' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete line 2 to 3 of line 2 to 3 of line 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab\\n' */\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_delete_item', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z1\\nput \"ab,,cd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 1 of z\\\\z', ',cd');\n    b.t('put z1 into z\\ndelete item 2 of z\\\\z', 'ab,cd');\n    b.t('put z1 into z\\ndelete item 3 of z\\\\z', 'ab,');\n    /* abnormal item */\n    b.t('put z1 into z\\ndelete item 0 of z\\\\z', 'ab,,cd');\n    b.t('put z1 into z\\ndelete item 4 of z\\\\z', 'ab,,cd');\n    b.t('put z1 into z\\ndelete item 5 of z\\\\z', 'ab,,cd');\n    /* normal ranges */\n    b.t('put z1 into z\\ndelete item 1 to 1 of z\\\\z', ',cd');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete item 1 to 2 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'cd' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete item 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* '' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete item 2 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab' */\n    );\n    /* recurse */\n    b.t('put z1 into z\\ndelete item 2 of item 1 to 2 of z\\\\z', 'ab,cd');\n    b.t(\n        'global z1\\nput z1 into z\\ndelete item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab' */\n    );\n    b.t(\n        'global z1\\nput z1 into z\\ndelete item 2 to 3 of item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ERR:6:deleting ranges' /* 'ab' */\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\nt.test('03chunkexpression_additional delete tests', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a b c\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 0 of z\\\\z', 'a b c');\n    b.t('put z1 into z\\ndelete word 1 of z\\\\z', 'b c');\n    b.t('put z1 into z\\ndelete word 2 of z\\\\z', 'a c');\n    b.t('put z1 into z\\ndelete word 3 of z\\\\z', 'a b');\n    b.t('put z1 into z\\ndelete word 4 of z\\\\z', 'a b c');\n    b.t('put z1 into z\\ndelete word 5 of z\\\\z', 'a b c');\n    /* normal word 2 */\n    b.t('global z1\\nput \" a b c \" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete word 0 of z\\\\z', 'a b c ');\n    b.t('put z1 into z\\ndelete word 1 of z\\\\z', ' b c ');\n    b.t('put z1 into z\\ndelete word 2 of z\\\\z', ' a c ');\n    b.t('put z1 into z\\ndelete word 3 of z\\\\z', ' a b');\n    b.t('put z1 into z\\ndelete word 4 of z\\\\z', ' a b c');\n    b.t('put z1 into z\\ndelete word 5 of z\\\\z', ' a b c');\n    b.t('put z1 into z\\ndelete word 6 of z\\\\z', ' a b c');\n    /* normal item */\n    b.t('global z1\\nput \"a,b,c\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 0 of z\\\\z', 'a,b,c');\n    b.t('put z1 into z\\ndelete item 1 of z\\\\z', 'b,c');\n    b.t('put z1 into z\\ndelete item 2 of z\\\\z', 'a,c');\n    b.t('put z1 into z\\ndelete item 3 of z\\\\z', 'a,b');\n    b.t('put z1 into z\\ndelete item 4 of z\\\\z', 'a,b,c');\n    b.t('put z1 into z\\ndelete item 5 of z\\\\z', 'a,b,c');\n    b.t('put z1 into z\\ndelete item 6 of z\\\\z', 'a,b,c');\n    /* normal item 2 */\n    b.t('global z1\\nput \",a,b,c,\" into z1\\\\1', '1');\n    b.t('put z1 into z\\ndelete item 0 of z\\\\z', 'a,b,c,');\n    b.t('put z1 into z\\ndelete item 1 of z\\\\z', 'a,b,c,');\n    b.t('put z1 into z\\ndelete item 2 of z\\\\z', ',b,c,');\n    b.t('put z1 into z\\ndelete item 3 of z\\\\z', ',a,c,');\n    b.t('put z1 into z\\ndelete item 4 of z\\\\z', ',a,b,');\n    b.t('put z1 into z\\ndelete item 5 of z\\\\z', ',a,b,c');\n    b.t('put z1 into z\\ndelete item 6 of z\\\\z', ',a,b,c,');\n    b.t('put z1 into z\\ndelete item 7 of z\\\\z', ',a,b,c,');\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * put one char before\n */\nt.test('03chunkexpression_put_one_char_before', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" before char 1 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" before char 2 of z\\\\z', 'aAbc');\n    b.t('put z1 into z\\nput \"A\" before char 3 of z\\\\z', 'abAc');\n    /* abnormal char */\n    b.t('put z1 into z\\nput \"A\" before char 0 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" before char 4 of z\\\\z', 'abcA');\n    b.t('put z1 into z\\nput \"A\" before char 5 of z\\\\z', 'abcA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" before char 1 to 1 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" before char 1 to 2 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" before char 1 to 3 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" before char 2 to 3 of z\\\\z', 'aAbc');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" before char 2 of char 1 to 2 of z\\\\z', 'aAbc');\n    b.t('put z1 into z\\nput \"A\" before char 2 to 3 of char 1 to 3 of z\\\\z', 'aAbc');\n    b.t(\n        'put z1 into z\\nput \"A\" before char 2 to 3 of char 2 to 3 of char 1 to 3 of z\\\\z',\n        'aAbc'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_word_before', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" before word 1 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 2 of z\\\\z', 'a.b  Ac.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 3 of z\\\\z', 'a.b  c.d\\nAe');\n    /* abnormal word */\n    b.t('put z1 into z\\nput \"A\" before word 0 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 4 of z\\\\z', 'a.b  c.d\\neA');\n    b.t('put z1 into z\\nput \"A\" before word 5 of z\\\\z', 'a.b  c.d\\neA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" before word 1 to 1 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 1 to 2 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 1 to 3 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" before word 2 to 3 of z\\\\z', 'a.b  Ac.d\\ne');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" before word 2 of word 1 to 2 of z\\\\z', 'a.b  Ac.d\\ne');\n    b.t(\n        'put z1 into z\\nput \"A\" before word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  Ac.d\\ne'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" before word 2 to 3 of word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  Ac.d\\ne'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_item_before', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z1\\nput \"ab,,cd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" before item 1 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" before item 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" before item 3 of z\\\\z', 'ab,,Acd');\n    /* abnormal item */\n    b.t('put z1 into z\\nput \"A\" before item 0 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" before item 4 of z\\\\z', 'ab,,cd,A');\n    b.t('put z1 into z\\nput \"A\" before item 5 of z\\\\z', 'ab,,cd,,A');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" before item 1 to 1 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" before item 1 to 2 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" before item 1 to 3 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" before item 2 to 3 of z\\\\z', 'ab,A,cd');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" before item 2 of item 1 to 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" before item 2 to 3 of item 1 to 3 of z\\\\z', 'ab,A,cd');\n    b.t(\n        'put z1 into z\\nput \"A\" before item 2 to 3 of item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ab,A,cd'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * put one char after\n */\nt.test('03chunkexpression_put_one_char_after', () => {\n    let b = new ScriptTestBatch();\n    /* normal char */\n    b.t('global z1\\nput \"abc\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" after char 1 of z\\\\z', 'aAbc');\n    b.t('put z1 into z\\nput \"A\" after char 2 of z\\\\z', 'abAc');\n    b.t('put z1 into z\\nput \"A\" after char 3 of z\\\\z', 'abcA');\n    /* abnormal char */\n    b.t('put z1 into z\\nput \"A\" after char 0 of z\\\\z', 'Aabc');\n    b.t('put z1 into z\\nput \"A\" after char 4 of z\\\\z', 'abcA');\n    b.t('put z1 into z\\nput \"A\" after char 5 of z\\\\z', 'abcA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" after char 1 to 1 of z\\\\z', 'aAbc');\n    b.t('put z1 into z\\nput \"A\" after char 1 to 2 of z\\\\z', 'abAc');\n    b.t('put z1 into z\\nput \"A\" after char 1 to 3 of z\\\\z', 'abcA');\n    b.t('put z1 into z\\nput \"A\" after char 2 to 3 of z\\\\z', 'abcA');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" after char 2 of char 1 to 2 of z\\\\z', 'abAc');\n    b.t('put z1 into z\\nput \"A\" after char 2 to 3 of char 1 to 3 of z\\\\z', 'abcA');\n    b.t(\n        'put z1 into z\\nput \"A\" after char 2 to 3 of char 2 to 3 of char 1 to 3 of z\\\\z',\n        'abcA'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_word_after', () => {\n    let b = new ScriptTestBatch();\n    /* normal word */\n    b.t('global z1\\nput \"a.b  c.d\" & cr & \"e\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" after word 1 of z\\\\z', 'a.bA  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" after word 2 of z\\\\z', 'a.b  c.dA\\ne');\n    b.t('put z1 into z\\nput \"A\" after word 3 of z\\\\z', 'a.b  c.d\\neA');\n    /* abnormal word */\n    b.t('put z1 into z\\nput \"A\" after word 0 of z\\\\z', 'Aa.b  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" after word 4 of z\\\\z', 'a.b  c.d\\neA');\n    b.t('put z1 into z\\nput \"A\" after word 5 of z\\\\z', 'a.b  c.d\\neA');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" after word 1 to 1 of z\\\\z', 'a.bA  c.d\\ne');\n    b.t('put z1 into z\\nput \"A\" after word 1 to 2 of z\\\\z', 'a.b  c.dA\\ne');\n    b.t('put z1 into z\\nput \"A\" after word 1 to 3 of z\\\\z', 'a.b  c.d\\neA');\n    b.t('put z1 into z\\nput \"A\" after word 2 to 3 of z\\\\z', 'a.b  c.d\\neA');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" after word 2 of word 1 to 2 of z\\\\z', 'a.b  c.dA\\ne');\n    b.t(\n        'put z1 into z\\nput \"A\" after word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  c.d\\neA'\n    );\n    b.t(\n        'put z1 into z\\nput \"A\" after word 2 to 3 of word 2 to 3 of word 1 to 3 of z\\\\z',\n        'a.b  c.d\\neA'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\nt.test('03chunkexpression_put_one_item_after', () => {\n    h3.vcstate.model.productOpts.setProductOpt('itemDel', ',');\n    let b = new ScriptTestBatch();\n    /* normal item */\n    b.t('global z1\\nput \"ab,,cd\" into z1\\\\1', '1');\n    b.t('put z1 into z\\nput \"A\" after item 1 of z\\\\z', 'abA,,cd');\n    b.t('put z1 into z\\nput \"A\" after item 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" after item 3 of z\\\\z', 'ab,,cdA');\n    /* abnormal item */\n    b.t('put z1 into z\\nput \"A\" after item 0 of z\\\\z', 'Aab,,cd');\n    b.t('put z1 into z\\nput \"A\" after item 4 of z\\\\z', 'ab,,cd,A');\n    b.t('put z1 into z\\nput \"A\" after item 5 of z\\\\z', 'ab,,cd,,A');\n    /* normal ranges */\n    b.t('put z1 into z\\nput \"A\" after item 1 to 1 of z\\\\z', 'abA,,cd');\n    b.t('put z1 into z\\nput \"A\" after item 1 to 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" after item 1 to 3 of z\\\\z', 'ab,,cdA');\n    b.t('put z1 into z\\nput \"A\" after item 2 to 3 of z\\\\z', 'ab,,cdA');\n    /* recurse */\n    b.t('put z1 into z\\nput \"A\" after item 2 of item 1 to 2 of z\\\\z', 'ab,A,cd');\n    b.t('put z1 into z\\nput \"A\" after item 2 to 3 of item 1 to 3 of z\\\\z', 'ab,,cdA');\n    b.t(\n        'put z1 into z\\nput \"A\" after item 2 to 3 of item 2 to 3 of item 1 to 3 of z\\\\z',\n        'ab,,cdA'\n    );\n    b.batchEvaluate(h3, [EvaluateWithVarAndFld]);\n});\n\n/**\n * replays the test in a field\n */\nexport class EvaluateWithVarAndFld extends TestMultiplier {\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        return [this.doReplace(code), this.doReplace(expected)];\n    }\n    protected doReplace(s: string) {\n        s = s.replace(/\\bglobal z\\b/g, '');\n        s = s.replace(/\\b z\\b/g, ' cd fld 2');\n        s = s.replace(/\\b\\\\z\\b/g, '\\\\cd fld 2');\n        return s;\n    }\n}\n\nt.test('03chunkbasic turn off compat mode', () => {\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', false, h3.vcstate.model)\n    );\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03exprObjectRef.ts",
    "content": "\n/* auto */ import { VpcEvalHelpers } from './../../vpc/vpcutils/vpcValEval';\n/* auto */ import { ScriptTestBatch, TestMultiplier } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { OrdinalOrPosition, VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { O, cAltProductName, cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, Util512, assertWarnEq, listEnumValsIncludingAlternates, longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { h3 } from './test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03exprObjectRef');\nexport let testCollection03exprObjectRef = t;\n\nt.atest('--init--testCollection03exprObjectRef', async () => {\n    assertTrue(\n        h3,\n        longstr(`U+|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('03ObjectSpecial', () => {\n    assertWarn(!h3.vcstate.model.stack.getB('compatibilitymode'), 'U*|');\n    let b = new ScriptTestBatch();\n    /* special objects. see pseudoObjects for more on 'me', 'target' */\n    b.t(`the short id of ${cProductName}`, `WILD`);\n    b.t(`the short id of ${cAltProductName}`, `WILD`);\n    b.t(`the short id of me`, `${h3.ids.go}`);\n    /* invalid syntax */\n    b.t(`the short id of 9`, `ERR:parse`);\n    b.t(`the short id of 9 card`, `ERR:parse`);\n    b.t(`the short id of 9 me`, `ERR:parse`);\n    b.t(`the short id of card card 1`, `ERR:parse`);\n    b.t(`the short id of id`, `ERR:parse`);\n    b.t(`the short id of the`, `ERR:parse`);\n    b.t(`the short id of stack`, `ERR:parse`);\n    b.t(`the short id of button`, `PREPARSEERR:compatibility`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\nt.test('03Object look by id', () => {\n    /* even if the id exists, we must reject if the type does not match.\n    confirm for every combination of types! */\n    /* exists, but wrong type\n    test every combination! */\n    let map = new MapKeyToObjectCanSet<string>();\n    map.set(h3.ids.stack, 'stack');\n    map.set(h3.ids.bgA, 'bg');\n    map.set(h3.ids.cdA, 'cd');\n    map.set(h3.ids.bBC1, 'cd btn');\n    map.set(h3.ids.fBC1, 'cd fld');\n    if (h3.useBg) {\n        map.set(h3.ids.bgbB1, 'bg btn');\n        map.set(h3.ids.bgfB1, 'bg fld');\n    }\n\n    let b = new ScriptTestBatch();\n    for (let key of map.getKeys()) {\n        for (let val of map.getVals()) {\n            if (map.get(key) === val) {\n                b.t(`the short id of ${val} id ${key}`, `${key}`);\n            } else {\n                b.t(`the short id of ${val} id ${key}`, `ERR:could not find`);\n            }\n        }\n    }\n\n    assertWarnEq(map.getKeys().length * map.getKeys().length, b.tests.length, 'U)|');\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n    /* looking by id with incorrect parent must also fail! */\n    b = new ScriptTestBatch();\n    b.t(`the short id of bg id ${h3.ids.bgA} of stack 2`, `ERR:could not find`);\n    b.t(\n        `the short id of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgB} of stack 2`,\n        `ERR:could not find`\n    );\n    b.t(`the short id of cd id ${h3.ids.cdBC} of stack 2`, `ERR:could not find`);\n    b.t(\n        `the short id of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgA}`,\n        `ERR:could not find`\n    );\n    b.t(\n        longstr(`the short id of cd fld id ${h3.ids.fBC1} of cd id\n         ${h3.ids.cdBC} of bg id ${h3.ids.bgB} of stack 2`),\n        `ERR:could not find`\n    );\n    b.t(\n        `the short id of cd fld id ${h3.ids.fBC1} of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgA}`,\n        `ERR:could not find`\n    );\n    b.t(\n        `the short id of cd fld id ${h3.ids.fBC1} of cd id ${h3.ids.cdBB}`,\n        `ERR:could not find`\n    );\n    b.t(\n        longstr(`the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBC}\n         of bg id ${h3.ids.bgB} of stack 2`),\n        `ERR:could not find`\n    );\n    b.t(\n        `the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgA}`,\n        `ERR:could not find`\n    );\n    b.t(\n        `the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBB}`,\n        `ERR:could not find`\n    );\n    b.t(`the short id of bg id ${h3.ids.bgA} of stack 1`, `${h3.ids.bgA}`);\n    b.t(\n        `the short id of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgB} of stack 1`,\n        `${h3.ids.cdBC}`\n    );\n    b.t(`the short id of cd id ${h3.ids.cdBC} of stack 1`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgB}`, `${h3.ids.cdBC}`);\n    b.t(\n        longstr(`the short id of cd fld id ${h3.ids.fBC1} of cd id ${h3.ids.cdBC}\n         of bg id ${h3.ids.bgB} of stack 1`),\n        `${h3.ids.fBC1}`\n    );\n    b.t(\n        `the short id of cd fld id ${h3.ids.fBC1} of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgB}`,\n        `${h3.ids.fBC1}`\n    );\n    b.t(\n        `the short id of cd fld id ${h3.ids.fBC1} of cd id ${h3.ids.cdBC}`,\n        `${h3.ids.fBC1}`\n    );\n    b.t(\n        longstr(`the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBC}\n         of bg id ${h3.ids.bgB} of stack 1`),\n        `${h3.ids.bBC1}`\n    );\n    b.t(\n        `the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBC} of bg id ${h3.ids.bgB}`,\n        `${h3.ids.bBC1}`\n    );\n    b.t(\n        `the short id of cd btn id ${h3.ids.bBC1} of cd id ${h3.ids.cdBC}`,\n        `${h3.ids.bBC1}`\n    );\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\nt.test('03Objects use a Lvl6Expression', () => {\n    let b = new ScriptTestBatch();\n    b.t(`go cd 1\\\\1`, `1`);\n    b.t(`put -1 into x\\\\the short id of cd -x`, `${h3.ids.cdA}`);\n    b.t(`put \"a b c\" into x\\\\the short id of cd word 2 of x`, `${h3.ids.cdBB}`);\n    b.t(`put \"a b c\" into x\\\\the short id of cd second word of x`, `${h3.ids.cdBB}`);\n    b.t(\n        `put \"a\"&cr&\"a b c\"&\"c\" into x\\\\the short id of cd word 2 of line 2 of x`,\n        `${h3.ids.cdBB}`\n    );\n    b.t(`put 1 into x\\\\the short id of cd x`, `${h3.ids.cdA}`);\n    b.t(`put 1 into x\\\\the short id of cd (x+1)`, `${h3.ids.cdBB}`);\n    b.t(`put 1 into x\\\\the short id of cd (char 1 of x)`, `${h3.ids.cdA}`);\n    b.t(`put 1 into x\\\\the short id of cd length(\"ab\")`, `${h3.ids.cdBB}`);\n    b.t(`put 1 into x\\\\the short id of cd the length of \"ab\"`, `${h3.ids.cdBB}`);\n    b.t(`put 1 into x\\\\the short id of cd (the short name of this cd)`, `${h3.ids.cdA}`);\n    b.t(`put 1 into x\\\\the short id of cd the short name of this cd`, `${h3.ids.cdA}`);\n    b.t(`put 1 into x\\\\the short id of cd the number of cds`, `${h3.ids.cdDH}`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\nt.test('03ObjectPart', () => {\n    let b = new ScriptTestBatch();\n    /* btns are valid parts */\n    b.t(`show cd btn id ${h3.ids.go}\\\\0`, `0`);\n    /* we don't yet support referring by part.\n    because we support object lookup by string (set the loc of x to 2,3)\n    it's not really necessary */\n    b.t(`show cd part id 1\\\\0`, `ERR:parse`);\n    b.t(`show bg part id 1\\\\0`, `ERR:parse`);\n    b.t(`show part id 1\\\\0`, `ERR:parse err`);\n    b.t(`show cd part 1\\\\0`, `ERR:parse err`);\n    b.t(`show bg part 1\\\\0`, `ERR:parse err`);\n    b.t(`show part 1\\\\0`, `ERR:parse err`);\n    b.t(`show part (1 + 1)\\\\0`, `ERR:no handler`);\n    b.t(`show first part\\\\0`, `ERR:parse err`);\n    b.t(`show first part of this card\\\\0`, `ERR:parse err`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\nt.test('03ObjectStack', () => {\n    let b = new ScriptTestBatch();\n    /* by position, confirmed in emulator */\n    b.t(`the short id of this stack`, `${h3.ids.stack}`);\n    b.t(`the short id of next stack`, `ERR:could not find`);\n    b.t(`the short id of prev stack`, `ERR:could not find`);\n    /* we support ordinal, although product doesn't */\n    b.t(`the short id of first stack`, `${h3.ids.stack}`);\n    b.t(`the short id of last stack`, `${h3.ids.stack}`);\n    b.t(`the short id of any stack`, `${h3.ids.stack}`);\n    /* by id */\n    b.t(`the short id of stack id ${h3.ids.stack}`, `${h3.ids.stack}`);\n    b.t(`the short id of stack id 9`, `ERR:could not find`);\n    b.t(`the short id of stack id -9`, `ERR:could not find`);\n    b.t(`the short id of stack id \"no\"`, `ERR:expected a number`);\n    /* by expression */\n    b.t(`the short id of stack 1`, `${h3.ids.stack}`);\n    b.t(`the short id of stack 999`, `ERR:could not find`);\n    /* stack-at-end-of-line is parsed differently\n    it's intentionally using 'get'\n    do not simplify! */\n    b.t(`the short id of stack`, `ERR:parse`);\n    b.t(`get the short id of first stack\\\\it`, `${h3.ids.stack}`);\n    b.t(`get the short id of this stack\\\\it`, `${h3.ids.stack}`);\n    b.t(`get the short id of stack\\\\it`, `${h3.ids.stack}`);\n    b.batchEvaluate(h3, [EvaluateThereIs, EvaluateAsParsedFromAString]);\n    /* by name */\n    b = new ScriptTestBatch();\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('name', 'stname', h3.vcstate.model)\n    );\n    b.t(`the short id of stack \"stname\"`, `${h3.ids.stack}`);\n    b.t(`the short id of stack \"Hard Drive:stname\"`, `${h3.ids.stack}`);\n    b.t(`the short id of stack \"STNAME\"`, `${h3.ids.stack}`);\n    b.batchEvaluate(h3, [EvaluateThereIs, EvaluateAsParsedFromAString]);\n    b = new ScriptTestBatch();\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('name', '', h3.vcstate.model)\n    );\n    b.t(`the short id of stack \"\"`, `${h3.ids.stack}`);\n    b.t(`the short id of stack \"Hard Drive:\"`, `${h3.ids.stack}`);\n    b.t(`the short id of stack \"xyz\"`, `ERR:could not find`);\n    b.batchEvaluate(h3, [EvaluateThereIs, EvaluateAsParsedFromAString]);\n});\nt.test('03ObjectBg', () => {\n    let b = new ScriptTestBatch();\n    b.t(`go cd 1\\\\1`, `1`);\n    /* synonyms */\n    b.t(`the short id of this bg`, `${h3.ids.bgA}`);\n    b.t(`the short id of this bkgnd`, `${h3.ids.bgA}`);\n    b.t(`the short id of this background`, `${h3.ids.bgA}`);\n    /* by expression */\n    b.t(`the short id of bg id ${h3.ids.bgA}`, `${h3.ids.bgA}`);\n    b.t(`the short id of bg id ${h3.ids.bgB}`, `${h3.ids.bgB}`);\n    b.t(`the short id of bg id ${h3.ids.bgC}`, `${h3.ids.bgC}`);\n    b.t(`the short id of bg id 9`, `ERR:could not find`);\n    b.t(`the short id of bg 1`, `${h3.ids.bgA}`);\n    b.t(`the short id of bg 2`, `${h3.ids.bgB}`);\n    b.t(`the short id of bg 3`, `${h3.ids.bgC}`);\n    b.t(`the short id of bg 999`, `ERR:could not find`);\n    b.t(`the short id of bg \"a\"`, `${h3.ids.bgA}`);\n    b.t(`the short id of bg \"b\"`, `${h3.ids.bgB}`);\n    b.t(`the short id of bg \"c\"`, `${h3.ids.bgC}`);\n    b.t(`the short id of bg \"A\"`, `${h3.ids.bgA}`);\n    b.t(`the short id of bg \"B\"`, `${h3.ids.bgB}`);\n    b.t(`the short id of bg \"C\"`, `${h3.ids.bgC}`);\n    b.t(`the short id of bg \"notfound\"`, `ERR:could not find`);\n    /* by ord/position */\n    b.t(`the short id of third bg`, `${h3.ids.bgC}`);\n    b.t(`the short id of second bg`, `${h3.ids.bgB}`);\n    b.t(`the short id of first bg`, `${h3.ids.bgA}`);\n    b.t(`the short id of last bg`, `${h3.ids.bgD}`);\n    b.t(`the short id of this bg`, `${h3.ids.bgA}`);\n    b.t(`the short id of next bg`, `${h3.ids.bgB}`);\n    b.t(`the short id of prev bg`, `${h3.ids.bgD}`);\n    b.t(`the short id of tenth bg`, `ERR:could not find`);\n    /* more by position */\n    b.t(`go cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the short id of this bg`, `${h3.ids.bgB}`);\n    b.t(`the short id of next bg`, `${h3.ids.bgC}`);\n    b.t(`the short id of prev bg`, `${h3.ids.bgA}`);\n    /* by ord/position at end of line\n    it's intentionally using 'get'\n    do not simplify! */\n    b.t(`get the short id of second bg\\\\it`, `${h3.ids.bgB}`);\n    b.t(`get the short id of this bg\\\\it`, `${h3.ids.bgB}`);\n    b.t(`get the short id of next bg\\\\it`, `${h3.ids.bgC}`);\n    /* not exist, by ord/position at end of line */\n    b.t(`get the short id of tenth bg\\\\it`, `ERR:could not find`);\n    /* bg-at-end-of-line is parsed differently*/\n    b.t(`put the short id of bg into x\\\\x`, `ERR:parse`);\n    b.t(`get the short id of 1 bg\\\\it`, `ERR:parse`);\n    b.t(`get the short id of bg\\\\it`, `${h3.ids.bgB}`);\n\n    b.batchEvaluate(h3, [\n        AppendOfThisStack,\n        EvaluateThereIs,\n        EvaluateAsParsedFromAString\n    ]);\n});\nt.test('03ObjectCard', () => {\n    let b = new ScriptTestBatch();\n    /* if names are ambiguous, pick the first, even if closer to another.\n    confirmed in emulator. but if you're already at one, pick the other. */\n    b.t(`go cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the short id of cd \"d\"`, `${h3.ids.cdBD}`);\n    b.t(`go cd id ${h3.ids.cdBD}\\\\1`, `1`);\n    b.t(`the short id of cd \"d\"`, `${h3.ids.cdCD}`);\n    b.t(`go cd id ${h3.ids.cdCD}\\\\1`, `1`);\n    b.t(`the short id of cd \"d\"`, `${h3.ids.cdDD}`);\n    b.t(`go cd id ${h3.ids.cdDD}\\\\1`, `1`);\n    b.t(`the short id of cd \"d\"`, `${h3.ids.cdBD}`);\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of cd \"d\"`, `${h3.ids.cdBD}`);\n    /* look by name */\n    b.t(`go cd id ${h3.ids.cdA}\\\\1`, `1`);\n    b.t(`the short id of cd \"a\"`, `${h3.ids.cdA}`);\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the short id of cd \"a\"`, `${h3.ids.cdA}`);\n    b.t(`the short id of cd \"b\"`, `${h3.ids.cdBB}`);\n    b.t(`the short id of cd \"C\"`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd \"b\" of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of cd \"C\" of bg 2`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd \"b\" of bg 1`, `ERR:could not find`);\n    b.t(`the short id of cd \"notfound\"`, `ERR:could not find`);\n    /* look by absolute */\n    b.t(`the short id of cd 1`, `${h3.ids.cdA}`);\n    b.t(`the short id of cd 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of cd 3`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd 8`, `${h3.ids.cdDF}`);\n    b.t(`the short id of cd 9`, `${h3.ids.cdDG}`);\n    b.t(`the short id of cd 10`, `${h3.ids.cdDH}`);\n    b.t(`the short id of cd 99`, `ERR:could not find`);\n    b.t(`the short id of cd 1 of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of cd 2 of bg 2`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd 3 of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of cd 99 of bg 2`, `ERR:could not find`);\n    /* look by relative */\n    b.t(`go cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the short id of first cd`, `${h3.ids.cdA}`);\n    b.t(`the short id of this cd`, `${h3.ids.cdBC}`);\n    b.t(`the short id of prev cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of next cd`, `${h3.ids.cdBD}`);\n    b.t(`the short id of last cd`, `${h3.ids.cdDH}`);\n    b.t(`the short id of tenth cd`, `${h3.ids.cdDH}`);\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the short id of first cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of this cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of prev cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of next cd of bg 2`, `${h3.ids.cdBC}`);\n    b.t(`the short id of last cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of tenth cd of bg 2`, `ERR:could not find`);\n    b.t(`go cd 1\\\\1`, `1`);\n    b.t(`the short id of first cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of this cd of bg 2`, `ERR:could not find`);\n    b.t(`the short id of prev cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of next cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of last cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of tenth cd of bg 2`, `ERR:could not find`);\n    /* add 'the' */\n    b.t(`go cd 1\\\\1`, `1`);\n    b.t(`the short id of the first cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of the this cd of bg 2`, `ERR:could not find`);\n    b.t(`the short id of the prev cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of the next cd of bg 2`, `${h3.ids.cdBB}`);\n    b.t(`the short id of the last cd of bg 2`, `${h3.ids.cdBD}`);\n    b.t(`the short id of the tenth cd of bg 2`, `ERR:could not find`);\n    /* special back-forth cards */\n    b.t(`go cd 2\\\\1`, `1`);\n    b.t(`go cd 3\\\\1`, `1`);\n    b.t(`the short id of recent card--[[noSParse]]`, `${h3.ids.cdBB}`);\n    b.t(`the short id of back --[[noSParse]]`, `${h3.ids.cdBB}`);\n    b.t(`go back\\\\1`, `1`);\n    b.t(`the short id of forth --[[noSParse]]`, `${h3.ids.cdBC}`);\n    /* by ord/position at end of line\n    it's intentionally using 'get'\n    do not simplify! */\n    b.t(`go cd 1\\\\1`, `1`);\n    b.t(`get the short id of second cd\\\\it`, `${h3.ids.cdBB}`);\n    b.t(`get the short id of this cd\\\\it`, `${h3.ids.cdA}`);\n    b.t(`get the short id of next cd\\\\it`, `${h3.ids.cdBB}`);\n    /* ord/position at end of line */\n    b.t(`get the short id of tenth cd\\\\it`, `${h3.ids.cdDH}`);\n    /* cd-at-end-of-line is parsed differently*/\n    b.t(`put the short id of cd into x\\\\x`, `ERR:parse`);\n    b.t(`get the short id of 1 cd\\\\it`, `ERR:parse`);\n    b.t(`get the short id of cd\\\\it`, `${h3.ids.cdA}`);\n    b.batchEvaluate(h3, [\n        AppendOfThisStack,\n        EvaluateThereIs,\n        EvaluateAsParsedFromAString\n    ]);\n});\nt.test('03ObjectCardMarked', () => {\n    let b = new ScriptTestBatch();\n    b.t(`unmark all cards\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdCD}\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdDD}\\\\1`, `1`);\n    /* look by name */\n    b.t(`the short id of marked cd \"b\"`, `${h3.ids.cdBB}`);\n    b.t(`the short id of marked cd \"d\"`, `${h3.ids.cdCD}`);\n    b.t(`the short id of marked cd \"c\"`, `ERR:could not find`);\n    b.t(`the short id of marked cd \"a\"`, `ERR:could not find`);\n    /* look by absolute */\n    b.t(`the short id of marked cd 1`, `${h3.ids.cdBB}`);\n    b.t(`the short id of marked cd 2`, `${h3.ids.cdCD}`);\n    b.t(`the short id of marked cd 10`, `ERR:could not find`);\n    /* look by ordinal */\n    b.t(`the short id of first marked cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of second marked cd`, `${h3.ids.cdCD}`);\n    b.t(`the short id of last marked cd`, `${h3.ids.cdDD}`);\n    b.t(`the short id of tenth marked cd`, `ERR:could not find`);\n    /* look by relative - before all */\n    b.t(`go cd 1\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `ERR:could not find`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdDD}`);\n    /* look by relative - on first */\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdCD}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdDD}`);\n    /* look by relative - between them */\n    b.t(`go cd id ${h3.ids.cdBD}\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `ERR:could not find`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdCD}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdBB}`);\n    /* look by relative - on last */\n    b.t(`go cd id ${h3.ids.cdDD}\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `${h3.ids.cdDD}`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdCD}`);\n    /* look by relative - after all */\n    b.t(`go cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `ERR:could not find`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdBB}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdDD}`);\n    /* none marked */\n    b.t(`unmark all cards\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `ERR:could not find`);\n    b.t(`the short id of next marked cd`, `ERR:could not find`);\n    b.t(`the short id of prev marked cd`, `ERR:could not find`);\n    /* one marked, wraps around */\n    b.t(`mark cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`go cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`the short id of this marked cd`, `${h3.ids.cdDF}`);\n    b.t(`the short id of next marked cd`, `${h3.ids.cdDF}`);\n    b.t(`the short id of prev marked cd`, `${h3.ids.cdDF}`);\n    /* now do all of the above, but within a bg */\n    /* prepare */\n    b.t(`unmark all cards\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdCD}\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdDD}\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`mark cd id ${h3.ids.cdDG}\\\\1`, `1`);\n    /* look by name */\n    b.t(`the short id of marked cd \"d\" of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of marked cd \"f\" of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of marked cd \"e\" of bg 4`, `ERR:could not find`);\n    b.t(`the short id of marked cd \"a\" of bg 4`, `ERR:could not find`);\n    /* look by absolute */\n    b.t(`the short id of marked cd 1 of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of marked cd 2 of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of marked cd 10 of bg 4`, `ERR:could not find`);\n    /* look by ordinal */\n    b.t(`the short id of first marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of second marked cd of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of last marked cd of bg 4`, `${h3.ids.cdDG}`);\n    b.t(`the short id of tenth marked cd of bg 4`, `ERR:could not find`);\n    /* look by relative - before all */\n    b.t(`go cd id ${h3.ids.cdCD}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDG}`);\n    /* look by relative - on first */\n    b.t(`go cd id ${h3.ids.cdDD}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDG}`);\n    /* look by relative - between them */\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDD}`);\n    /* look by relative - on last */\n    b.t(`go cd id ${h3.ids.cdDG}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `${h3.ids.cdDG}`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDF}`);\n    /* look by relative - after all */\n    b.t(`go cd id ${h3.ids.cdDH}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDG}`);\n    /* bg ones that don't have an analogue */\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDD}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDG}`);\n    b.t(`the short id of this marked cd of bg 1`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 1`, `ERR:could not find`);\n    b.t(`the short id of prev marked cd of bg 1`, `ERR:could not find`);\n    /* count number of! */\n    b.t(`the number of marked cards`, `4`);\n    b.t(`the number of marked cards of bg 1`, `0`);\n    b.t(`the number of marked cards of bg 2`, `0`);\n    b.t(`the number of marked cards of bg 3`, `1`);\n    b.t(`the number of marked cards of bg 4`, `3`);\n    b.t(`the number of marked cards of bg 999`, `ERR:could not find`);\n    /* none marked */\n    b.t(`unmark all cards\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of next marked cd of bg 4`, `ERR:could not find`);\n    b.t(`the short id of prev marked cd of bg 4`, `ERR:could not find`);\n    /* one marked, wraps around */\n    b.t(`mark cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`go cd id ${h3.ids.cdDF}\\\\1`, `1`);\n    b.t(`the short id of this marked cd of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of next marked cd of bg 4`, `${h3.ids.cdDF}`);\n    b.t(`the short id of prev marked cd of bg 4`, `${h3.ids.cdDF}`);\n    /* clean up */\n    b.t(`unmark all cards\\\\1`, `1`);\n    b.batchEvaluate(h3, [AppendOfThisStack, EvaluateThereIs]);\n});\nt.test('03ObjectBtnAndField', () => {\n    let b = new ScriptTestBatch();\n    /* can't read ones from the wrong card */\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of cd btn \"p1\"`, `ERR:could not find`);\n    b.t(`the short id of cd fld \"p2\"`, `ERR:could not find`);\n    b.t(`the short id of cd btn \"p1\" of cd 1`, `ERR:could not find`);\n    b.t(`the short id of cd fld \"p2\" of cd 1`, `ERR:could not find`);\n    b.t(`the short id of cd btn \"p1\" of cd id ${h3.ids.cdBC}`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd fld \"p2\" of cd id ${h3.ids.cdBC}`, `${h3.ids.fBC2}`);\n    /* look by name */\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of cd (typ) \"de1\"`, `(1)`);\n    b.t(`the short id of cd (typ) \"de2\"`, `(2)`);\n    b.t(`the short id of cd (typ) \"DE3\"`, `(3)`);\n    b.t(`the short id of cd (typ) \"de1\" of this bg --[[noSParse]]`, `ERR:parse err`);\n    b.t(`the short id of cd (typ) \"de1\" of this stack --[[noSParse]]`, `ERR:parse err`);\n    b.t(`the short id of cd (typ) \"xyz\"`, `ERR:could not find`);\n    /* look by absolute */\n    b.t(`the short id of cd (typ) 1`, `(1)`);\n    b.t(`the short id of cd (typ) 2`, `(2)`);\n    b.t(`the short id of cd (typ) 3`, `(3)`);\n    b.t(`the short id of cd (typ) -1`, `ERR:could not find`);\n    b.t(`the short id of cd (typ) 0`, `ERR:could not find`);\n    b.t(`the short id of cd (typ) 99`, `ERR:could not find`);\n    /* look by relative */\n    b.t(`the short id of this cd (typ)`, `ERR:by position`);\n    b.t(`the short id of prev cd (typ)`, `ERR:by position`);\n    b.t(`the short id of next cd (typ)`, `ERR:by position`);\n    b.t(`the short id of first cd (typ)`, `(1)`);\n    b.t(`the short id of second cd (typ)`, `(2)`);\n    b.t(`the short id of last cd (typ)`, `(3)`);\n    /* bad syntax */\n    b.t(`the short id of first cd (typ) 1`, `ERR:parse err`);\n    b.t(`the short id of cd (typ) (typ) 1`, `PREPARSEERR:mode`);\n    b.t(`the short id of cd 1 of this cd`, `ERR:parse err`);\n    b.batchEvaluate(h3, [\n        GoForBothFldAndBtn,\n        EvaluateThereIs,\n        EvaluateAsParsedFromAString\n    ]);\n});\nt.test('03exprNumberOfObjects', () => {\n    let b = new ScriptTestBatch();\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    /* buttons and fields */\n    b.t(`the number of cd btns`, `0`);\n    b.t(`the number of cd flds`, `0`);\n    b.t(`the number of bg btns`, `0`);\n    b.t(`the number of bg btns`, `0`);\n    /* the original product doesn't support this either */\n    b.t(`the number of cd btns of cd id ${h3.ids.cdBC}`, `ERR:parse err`);\n    b.t(`the number of cd flds of cd id ${h3.ids.cdBC}`, `ERR:parse err`);\n    b.t(`go cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the number of cd btns`, `2`);\n    b.t(`the number of cd flds`, `3`);\n    /* cards */\n    b.t(`the number of cards`, `10`);\n    b.t(`the number of cards of this stack`, `10`);\n    b.t(`the number of cards of bg 1`, `1`);\n    b.t(`the number of cards of bg 2`, `3`);\n    b.t(`the number of cards of bg 1 of this stack`, `1`);\n    b.t(`the number of cards of bg 2 of this stack`, `3`);\n    b.t(`the number of cards of bg 99`, `ERR:could not find`);\n    b.t(`the number of cards of me`, `ERR:incorrect type`);\n    b.t(`the number of cards of card 2`, `ERR:incorrect type`);\n    b.t(`the number of cards of cd btn 1`, `ERR:incorrect type`);\n    /* number of marked cards-see above */\n    /* bkgnds */\n    b.t(`the number of bkgnds`, `4`);\n    b.t(`the number of bkgnds of this stack`, `4`);\n    b.t(`the number of bkgnds of stack 2`, `ERR:could not find`);\n    /* other */\n    b.t(`the number of stacks`, `ERR:no variable`);\n    b.t(`the number of ViperCards`, `ERR:no variable`);\n    b.t(`the number of me`, `1`);\n    /* parent should accept different expressions */\n    b.t(`put \"bg id ${h3.ids.bgB}\" into x\\\\the number of cards of x`, `3`);\n    b.t(`the number of cards of the owner of cd id ${h3.ids.cdBC}`, `3`);\n    b.t(`the number of cards of (the owner of cd id ${h3.ids.cdBC})`, `3`);\n    b.t(`the number of cards of the target`, `ERR:incorrect type`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\nt.test('03Object Auto-insert scope for backwards compat', () => {\n    /* tests rewriteSpecifyCdOrBgPart in vpcRewritesGlobal.ts */\n    /* turn on compat mode */\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', true, h3.vcstate.model)\n    );\n    let b = new ScriptTestBatch();\n    b.t(`go to cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the number of btns`, `0`);\n    b.t(`the number of flds`, `0`);\n    b.t(`go to cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the number of btns`, `2`);\n    b.t(`the number of flds`, `0`);\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of btn 1`, `${h3.ids.bDE1}`);\n    b.t(`the short id of btn \"de2\"`, `${h3.ids.bDE2}`);\n    b.t(`the short id of last btn`, `${h3.ids.bDE3}`);\n    b.t(`the short id of fld 1`, `ERR:could not find`);\n    b.t(`the short id of fld \"de2\"`, `ERR:could not find`);\n    b.t(`the short id of last fld`, `ERR:could not find`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n    /* turn off compat mode */\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('compatibilitymode', false, h3.vcstate.model)\n    );\n\n    b = new ScriptTestBatch();\n    b.t(`go cd id ${h3.ids.cdBB}\\\\1`, `1`);\n    b.t(`the number of btns`, `PREPARSEERR:compatibility mode`);\n    b.t(`the number of flds`, `PREPARSEERR:compatibility mode`);\n    b.t(`go cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the number of btns`, `PREPARSEERR:compatibility mode`);\n    b.t(`the number of flds`, `PREPARSEERR:compatibility mode`);\n    b.t(`go cd id ${h3.ids.cdDE}\\\\1`, `1`);\n    b.t(`the short id of btn 1`, `PREPARSEERR:compatibility mode`);\n    b.t(`the short id of btn \"de2\"`, `PREPARSEERR:compatibility mode`);\n    b.t(`the short id of last btn`, `PREPARSEERR:compatibility mode`);\n    b.t(`the short id of fld 1`, `PREPARSEERR:compatibility mode`);\n    b.t(`the short id of fld \"de2\"`, `PREPARSEERR:compatibility mode`);\n    b.t(`the short id of last fld`, `PREPARSEERR:compatibility mode`);\n    b.batchEvaluate(h3, [EvaluateThereIs]);\n});\n\n/* run the tests again, except for fld instead of btn */\nclass GoForBothFldAndBtn extends TestMultiplier {\n    firstTransformation(code: string, expected: string): O<[string, string]> {\n        code = code.replace(/\\(typ\\)/g, 'btn');\n        expected = expected.replace(/\\(1\\)/g, `${h3.ids.bDE1}`);\n        expected = expected.replace(/\\(2\\)/g, `${h3.ids.bDE2}`);\n        expected = expected.replace(/\\(3\\)/g, `${h3.ids.bDE3}`);\n        return [code, expected];\n    }\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        code = code.replace(/\\(typ\\)/g, 'fld');\n        expected = expected.replace(/\\(1\\)/g, `${h3.ids.fDE1}`);\n        expected = expected.replace(/\\(2\\)/g, `${h3.ids.fDE2}`);\n        expected = expected.replace(/\\(3\\)/g, `${h3.ids.fDE3}`);\n        return [code, expected];\n    }\n}\n\n/* run the tests again, specifying the stack */\nclass AppendOfThisStack extends TestMultiplier {\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        if (code.startsWith('the short id of')) {\n            code = code + ' of stack 1';\n            return [code, expected];\n        } else {\n            return undefined;\n        }\n    }\n}\n\n/**\n * transform it from \"the short id\" to \"there is a\"\n */\nclass EvaluateThereIs extends TestMultiplier {\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        if (!code.startsWith('the short id of')) {\n            /* might be testing a command, or going to a card */\n            return undefined;\n        } else {\n            return [this.convertCode(code), this.convertExpected(expected)];\n        }\n    }\n    protected convertCode(s: string) {\n        assertWarn(s.startsWith('the short id of'), 'U(|');\n        assertWarn(!s.includes('\\\\'), 'U&|');\n        return s.replace(/the short id of/, 'there is a');\n    }\n    protected convertExpected(s: string) {\n        if (s.startsWith('ERR:could not find')) {\n            return 'false';\n        } else if (s.startsWith('ERR:') || s.startsWith('PREPARSEERR:')) {\n            return s;\n        } else {\n            assertWarn(s === 'WILD' || Util512.parseIntStrict(s) !== undefined, 'U%|');\n            return 'true';\n        }\n    }\n}\n\n/**\n * transform from\n * the short id of card \"myCard\"\n * to\n * put \"card \"&quote&\"myCard\"&quote&\"\" into x; the short id of x\n */\nexport class EvaluateAsParsedFromAString extends TestMultiplier {\n    secondTransformation(code: string, expected: string): O<[string, string]> {\n        if (\n            !code.startsWith('the short id of ') ||\n            code.includes('\\\\') ||\n            code.includes('--[[noSParse]]')\n        ) {\n            /* might be testing a command, or going to a card */\n            return undefined;\n        } else {\n            /* automatically skip \"next\", \"third\", etc */\n            for (let key of listEnumValsIncludingAlternates(OrdinalOrPosition)) {\n                if (\n                    key.toLowerCase() !== 'this' &&\n                    new RegExp('(^|\\\\b)' + key + '(\\\\b|$)', 'i').exec(code)\n                ) {\n                    return undefined;\n                }\n            }\n\n            /* we don't support absolute like cd 4,\n            so look for either quotes or the string id.\n            bg 4. automatically skip \"bg 4\" */\n            for (let key of listEnumValsIncludingAlternates(VpcElType)) {\n                if (new RegExp('(^|\\\\b)' + key + '\\\\b [0-9]+(\\\\b|$)', 'i').exec(code)) {\n                    return undefined;\n                }\n            }\n\n            code = '\"' + code.substr('the short id of '.length) + '\"';\n            code = VpcEvalHelpers.escapeWithinString(code, /\"/g, 'quote');\n            code = `put ${code} into x\\\\the short id of x --[[${code}]]`;\n            if (expected.startsWith('ERR:') || expected.startsWith('PREPARSEERR:')) {\n                expected = 'ERR:5:';\n            }\n\n            return [code, expected];\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03exprPseudoObjects.ts",
    "content": "\n/* auto */ import { ScriptTestBatch } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { h3 } from './test03lexer';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03exprPseudoObjects');\nexport let testCollection03exprPseudoObjects = t;\n\nt.atest('--init--testCollection03exprPseudoObject', async () => {\n    assertTrue(\n        h3,\n        longstr(`U,|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('03exprObjectInterpretedFromString', () => {\n    h3.pr.setCurCardNoOpenCardEvt(h3.ids.cdBC);\n    let svdMethod = h3.pr.getSelectedFieldVel;\n    h3.pr.getSelectedFieldVel = () => h3.vcstate.model.getById(VpcElField, h3.ids.fBC1);\n\n    let b = new ScriptTestBatch();\n    /* HUnaryPropertyGet */\n    b.t(\n        `put \"cd btn id ${h3.ids.go}\" into x\\\\the short id of the owner of x`,\n        `${h3.ids.cdA}`\n    );\n    /* tkStringLiteral */\n    b.t(`the short id of \"cd btn id ${h3.ids.bBC1}\"`, `${h3.ids.bBC1}`);\n    /* HAnyAllowedVariableName 1 */\n    b.t(`put \"cd btn id ${h3.ids.bDE1}\" into x\\\\the short id of x`, `${h3.ids.bDE1}`);\n    /* HAnyAllowedVariableName 2 */\n    b.t(`put \"cd btn id ${h3.ids.bDE1}\" into a\\\\the short id of a`, `${h3.ids.bDE1}`);\n    /* _target 1 */\n    b.t(`the short id of target`, `${h3.ids.go}`);\n    /* HOldStyleFnNullaryOrNullaryPropGet or _target 2 */\n    b.t(`the short id of the target`, `${h3.ids.go}`);\n    /* parens 1 */\n    b.t(`the short id of (\"cd btn id ${h3.ids.bBC1}\")`, `${h3.ids.bBC1}`);\n    /* parens 2 */\n    b.t(`the short id of (\"cd\" && \"btn id\" && ${h3.ids.bBC1})`, `${h3.ids.bBC1}`);\n    /* parens 3 */\n    b.t(\n        `put \"cd btn id ${h3.ids.go}\" into x\\\\the short id of (the owner of x)`,\n        `${h3.ids.cdA}`\n    );\n    //~ todo: difference between target and the target, see internaldocs\n    //~ need bg support to fully test it\n    b.batchEvaluate(h3);\n    h3.pr.getSelectedFieldVel = svdMethod;\n});\nt.test('03exprPseudoObject me and target', () => {\n    //~ todo: make this line up with original product\n    /*\n    do is not the same as send to me, 1) gets local vars 2) might change target\n    \"DO\": does not change either ME or TARGET\n    \"SEND\": me is what owns the current code-- so if it's a function\n    in somewhere else, me is that, but if it's just the plain code,\n    me is the sender. same for target.\n    DEFAULT: target is from original event, me is what's running script\n    */\n    h3.pr.setCurCardNoOpenCardEvt(h3.ids.cdBC);\n    let expecteds = [\n        longstr(`s${h3.ids.bBC2}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.bBC2}\n    s${h3.ids.cdBC}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.cdBC}\n    s${h3.ids.stack}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.stack},\n    s${h3.ids.bBC2}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.bBC2}\n    s${h3.ids.cdBC}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.cdBC}\n    s${h3.ids.stack}t${h3.ids.bBC2}t${h3.ids.bBC2}m${h3.ids.stack},\n    T${h3.ids.bBC2}t${h3.ids.bBC2}M${h3.ids.bBC2},T${h3.ids.bBC2}t${h3.ids.bBC2}M${h3.ids.bBC2}\n    s${h3.ids.cdBC}t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC}\n    s${h3.ids.stack}t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack}\n    s${h3.ids.bDE1}t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1}\n    s${h3.ids.cdDE}t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE}\n    s${h3.ids.stack}t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.stack}\n    s${h3.ids.cdDE}t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE}\n    s${h3.ids.stack}t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack}`),\n        longstr(\n            `s${h3.ids.cdBC}t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC} s${h3.ids.stack}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack}, s${h3.ids.cdBC}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC} s${h3.ids.stack}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack},T${h3.ids.cdBC}t${h3.ids.cdBC}M${h3.ids.cdBC},\n    T${h3.ids.cdBC}t${h3.ids.cdBC}M${h3.ids.cdBC} s${h3.ids.bDE1}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1} s${h3.ids.cdDE}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.stack} s${h3.ids.cdDE}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack}`,\n            ''\n        ),\n        longstr(\n            `s${h3.ids.bDE1}t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1} s${h3.ids.cdDE}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE} s${h3.ids.stack}t${h3.ids.bDE1}t${h3.ids.bDE1}\n    m${h3.ids.stack}, s${h3.ids.bDE1}t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1} s${h3.ids.cdDE}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.stack},T${h3.ids.bDE1}\n    t${h3.ids.bDE1}M${h3.ids.bDE1},T${h3.ids.bDE1}t${h3.ids.bDE1}\n    M${h3.ids.bDE1} s${h3.ids.cdBC}t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC} s${h3.ids.stack}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack} s${h3.ids.cdDE}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack}`,\n            ''\n        ),\n        longstr(`s${h3.ids.cdDE}t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack}, s${h3.ids.cdDE}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack},T${h3.ids.cdDE}t${h3.ids.cdDE}M${h3.ids.cdDE},\n    T${h3.ids.cdDE}t${h3.ids.cdDE}M${h3.ids.cdDE} s${h3.ids.cdBC}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC} s${h3.ids.stack}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack} s${h3.ids.bDE1}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1} s${h3.ids.cdDE}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.stack}`),\n        longstr(\n            `s${h3.ids.stack}t${h3.ids.stack}t${h3.ids.stack}m${h3.ids.stack}, s${h3.ids.stack}\n    t${h3.ids.stack}t${h3.ids.stack}m${h3.ids.stack},\n    T${h3.ids.stack}t${h3.ids.stack}M${h3.ids.stack},\n    T${h3.ids.stack}t${h3.ids.stack}M${h3.ids.stack} s${h3.ids.cdBC}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.cdBC} s${h3.ids.stack}\n    t${h3.ids.cdBC}t${h3.ids.cdBC}m${h3.ids.stack} s${h3.ids.bDE1}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.bDE1} s${h3.ids.cdDE}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.bDE1}t${h3.ids.bDE1}m${h3.ids.stack} s${h3.ids.cdDE}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.cdDE} s${h3.ids.stack}\n    t${h3.ids.cdDE}t${h3.ids.cdDE}m${h3.ids.stack}`,\n            ''\n        )\n    ];\n    let targetIds = [h3.ids.bBC2, h3.ids.cdBC, h3.ids.bDE1, h3.ids.cdDE, h3.ids.stack];\n    for (let i = 0; i < targetIds.length; i++) {\n        let expected = expecteds[i];\n        let targetId = targetIds[i];\n        for (let tid of targetIds) {\n            let vel = h3.vcstate.model.getByIdUntyped(tid);\n            h3.setScript(\n                vel.idInternal,\n                `on myHandler\nglobal d1\nput \" s\" & ${tid} & \"t\" & the short id of the target &\"t\"& the \\\n    short id of target & \"m\" & the short id of me after d1\npass myHandler\nend myHandler`\n            );\n        }\n        let vel = h3.vcstate.model.getByIdUntyped(targetId);\n        let codeIn = `\nglobal d1\nput \"\" into d1\nmyHandler\nput \",\" after d1\ndo \"myHandler\"\nput \",\" after d1\nput \"global d1\" & cr & \"put 'T' & the short id of the target &'t'& \\\n            the short id of target & 'M' & the short id of me after d1\" into theCode\nreplace \"'\" with quote in theCode\nsend theCode to me\nput \",\" after d1\ndo theCode`;\n        if (targetId !== h3.ids.cdBC) {\n            codeIn += `\\nsend \"myHandler\" to cd id ${h3.ids.cdBC}`;\n        }\n        if (targetId !== h3.ids.bDE1) {\n            codeIn += `\\nsend \"myHandler\" to cd btn id ${h3.ids.bDE1}`;\n        }\n        if (targetId !== h3.ids.cdDE) {\n            codeIn += `\\nsend \"myHandler\" to cd id ${h3.ids.cdDE}`;\n        }\n\n        let codeBefore = vel.getS('script');\n        h3.runGeneralCode(\n            codeBefore,\n            codeIn,\n            undefined,\n            undefined,\n            undefined,\n            undefined,\n            targetId\n        );\n        let got = h3.vcstate.vci.getCodeExec().globals.get('d1').readAsString();\n        if (expected.replace(/ /g, '') !== got.replace(/ /g, '')) {\n            console.log(i, 'expected:', expected);\n            console.log('got:', got);\n        }\n    }\n\n    /* reset scripts */\n    for (let tid of targetIds) {\n        h3.setScript(tid, '');\n    }\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03lexer.ts",
    "content": "\n/* auto */ import { BatchType, ScriptTestBatch, TestVpcScriptRunBase } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { ValHolder, cast } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection, YetToBeDefinedTestHelper } from './../testUtils/testUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03lexer');\nexport let testCollection03lexer = t;\n\nexport let h3 = YetToBeDefinedTestHelper<TestVpc03>();\nt.atest('--init--testCollection03lexer', async () => {\n    if (!h3) {\n        h3 = new TestVpc03(t);\n        return h3.initEnvironment();\n    }\n});\nt.test('03StringLiterals', () => {\n    let b = new ScriptTestBatch();\n    /* basic */\n    b.t('put \"\" into x\\\\x', '');\n    b.t('put \"a\" into x\\\\x', 'a');\n    b.t('put \"a--comment ok\" into x\\\\x', 'a--comment ok');\n    b.t('put \"a--[[comment]]\" into x\\\\x', 'a--[[comment]]');\n    b.t('put \"a into x\" into x\\\\x', 'a into x');\n    b.t('put \"a\"\"b\" into x\\\\x', 'ERR:parse');\n    b.t(\"put 'a' into x\\\\x\", 'PREPARSEERR:lex');\n    b.t(\"put '' into x\\\\x\", 'PREPARSEERR:lex');\n    b.t('put \" into x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"\\n\" into x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\\nb\" into x\\\\x', 'PREPARSEERR:lex');\n    /* things right after the quotes */\n    b.t('put (\"a\") into x\\\\x', 'a');\n    b.t('put \"1\"+\"2\" into x\\\\x', '3');\n    b.t('put \"a\"id x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\"stack x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\"into x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\"4 into x\\\\x', 'PREPARSEERR:lex');\n    /* things right before the quotes */\n    b.t('put )\"b\" into x\\\\x', 'ERR:');\n    b.t('put -\"4\" into x\\\\x', '-4');\n    b.t('put id\"b\" into x\\\\x', 'ERR:');\n    b.t('put stack\"b\" into x\\\\x', 'ERR:');\n    b.t('put into\"b\" into x\\\\x', 'PREPARSEERR:only see one');\n    b.t('put 4\"b\" into x\\\\x', 'ERR:');\n    /* works, but maybe shouldn't */\n    b.t('put\"4\" into x\\\\x', '4');\n    b.t('put 4 into x\\ndivide x by\"2\"\\\\x', '2');\n    b.t('there is a cd btn\"xyz\"', 'false');\n    b.batchEvaluate(h3);\n});\nt.test('03BlockComment', () => {\n    let b = new ScriptTestBatch();\n    /* block comments */\n    b.t('put \"abc\" --[[ignore this]] into x\\\\x', 'abc');\n    b.t('put \"abc\" --[[ignore ??? this @@@ ]] into x\\\\x', 'abc');\n    b.t('put \"abc\" --[[put \"d\" into x]] into x\\\\x', 'abc');\n    b.t('put \"A\" into x\\n--[[put \"B\" into x]]\\\\x', 'A');\n    b.t('--[[]]\\\\1', '1');\n    b.t('--[[commented out]]\\\\1', '1');\n    /* block comments containing odd characters */\n    b.t('put \"a\" & \"c\" into x\\\\x', 'ac');\n    b.t('put \"a\" --[[ & \"b\"]] & \"c\" into x\\\\x', 'ac');\n    b.t('put \"a\" --[[ & \"b\"] & \"c\" ]] & \"c\" into x\\\\x', 'ac');\n    b.t('put \"abc\" --[[put \"d\" into x]] into x\\\\x', 'abc');\n    b.t('put \"abc\" --[[put \"d\" into x --]] into x\\\\x', 'abc');\n    b.t('put \"abc\" --[[put \"d\" into x -- line]] into x\\\\x', 'abc');\n    b.t('put \"\" --[[ no nested --[[ ? ]] ? ]] into x\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\" --[[ & \"]] & \"c\" into x\\\\x', 'ac');\n    /* block comments span lines */\n    b.t('--[[\\n]]\\\\1', '1');\n    b.t('put \"a\" --[[\\n]] & \"c\" into x\\\\x', 'ac');\n    b.t('put \"a\" --[[{BSLASH}\\n]] & \"c\" into x\\\\x', 'ac');\n    b.t('put \"a\" --[[ & \"b\"\\n]] & \"c\" into x\\\\x', 'ac');\n    b.t('put \"a\" into x\\n--[[put \"d\" into x ]]\\\\x', 'a');\n    b.t('put \"a\" into x\\n--[[put \"d\" into x\\nput \"d\" into x ]]\\\\x', 'a');\n    b.t('put \"a\" into x\\n--[[put \"d\" into x\\nput \"d\" into x ]]put \"b\" into x\\\\x', 'b');\n    b.t('put \"a\" into x\\n--[[put \"d\" into x\\nput \"d\" into x ]]\\nput \"b\" into x\\\\x', 'b');\n    /* block comments unmatched */\n    /* important that --[[ is never a valid line comment */\n    b.t('put \"a\" --[[\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\" ]]\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\" [[\\\\x', 'PREPARSEERR:lex');\n    b.t('put \"a\" -[[\\\\x', 'PREPARSEERR:lex');\n    b.batchEvaluate(h3);\n});\nt.test('03LineComment', () => {\n    let b = new ScriptTestBatch();\n    /* line comments */\n    b.t('put \"abc\" into x --\\\\x', 'abc');\n    b.t('put \"a\" into x --\\nput \"b\" into x\\\\x', 'b');\n    b.t('put \"a\" into x --?\\nput \"b\" into x\\\\x', 'b');\n    b.t('put \"a\" into x\\nput \"b\" --into x\\\\x', 'a');\n    b.t('put \"abc\" into x -- ? -- ?\\\\x', 'abc');\n    /* line comments shouldn't be carried over */\n    b.t('put \"a\" into x --{BSLASH}\\nput \"c\" into x\\\\x', 'c');\n    b.t('put \"a\" into x -- a {BSLASH}\\nput \"c\" into x\\\\x', 'c');\n    b.t('put \"a\" into x -- a {BSLASH}\\nput --\"c\" into x\\\\x', 'PREPARSEERR:4:not enough');\n    b.batchEvaluate(h3);\n});\nt.test('03ContinuedLineOrWhiteSpace', () => {\n    /* \\xC2 is logical not in mac-roman encoding (utf8 is ¬)*/\n    let b = new ScriptTestBatch();\n    b.t('put \"123\" \\n into x --\\\\x', 'PREPARSEERR:4:looked like');\n    b.t('put \"123\" {BSLASH}\\n into x --\\\\x', '123');\n    b.t('put \"456\" ¬\\n into x --\\\\x', '456');\n    /* can continue with no whitespace */\n    b.t('put 4*{BSLASH}\\n5 into x --\\\\x', '20');\n    b.batchEvaluate(h3);\n});\nt.test('03NewLine', () => {\n    let b = new ScriptTestBatch();\n    /* basics */\n    b.t('put 1 into x\\nadd 1 to x\\\\x', '2');\n    b.t('put 1 into x\\n\\nadd 1 to x\\\\x', '2');\n    b.t('put 1 into x\\n\\n\\nadd 1 to x\\\\x', '2');\n    b.t('put 1 into x\\n  \\n  \\nadd 1 to x\\\\x', '2');\n    /* our test framework converts to linux newlines */\n    b.t('put 1 into x\\radd 1 to x\\\\x', '2');\n    b.t('put 1 into x\\r\\nadd 1 to x\\\\x', '2');\n    b.t('put 1 into x\\r\\radd 1 to x\\\\x', '2');\n    b.batchEvaluate(h3);\n});\nt.test('03NumLiteral', () => {\n    let b = new ScriptTestBatch();\n    /* basics */\n    b.t('0', '0');\n    b.t('2', '2');\n    b.t('012', '12');\n    b.t('0012', '12');\n    b.t('0.5', '0.5');\n    /* negative (actually not in lexer, but we'll test here) */\n    b.t('-0', '0');\n    b.t('-2', '-2');\n    b.t('-012', '-12');\n    b.t('-0012', '-12');\n    b.t('-0.5', '-0.5');\n    /* sci notation */\n    b.t('2e-2', '0.02');\n    b.t('2e-1', '0.2');\n    b.t('2e-0', '2');\n    b.t('2e0', '2');\n    b.t('2e1', '20');\n    b.t('2e2', '200');\n    b.t('2e+0', '2');\n    b.t('2e+1', '20');\n    b.t('2e+2', '200');\n    b.t('2e00', '2');\n    b.t('2e01', '20');\n    b.t('2e02', '200');\n    /* sci notation with decimal */\n    b.t('2.3e-2', '0.023');\n    b.t('2.3e-1', '0.23');\n    b.t('2.3e-0', '2.3');\n    b.t('2.3e0', '2.3');\n    b.t('2.3e1', '23');\n    b.t('2.3e2', '230');\n    b.t('2.3e+0', '2.3');\n    b.t('2.3e+1', '23');\n    b.t('2.3e+2', '230');\n    b.t('2.3e00', '2.3');\n    b.t('2.3e01', '23');\n    b.t('2.3e02', '230');\n    /* we are case insensitive */\n    b.t('2E0', '2');\n    b.t('2E1', '20');\n    b.t('2E2', '200');\n    /* invalid sci notation */\n    b.t('2a0', 'PREPARSEERR:lex');\n    b.t('2ee0', 'PREPARSEERR:lex');\n    b.t('2e1.3', 'PREPARSEERR:lex');\n    b.t('2e.3', 'PREPARSEERR:lex');\n    b.t('2e.3', 'PREPARSEERR:lex');\n    b.t('2e+', 'PREPARSEERR:lex');\n    b.t('2e-', 'PREPARSEERR:lex');\n    b.t('2 e 0', 'ERR:');\n    b.t('2 e +1', 'ERR:');\n    b.t('2 e -1', 'ERR:');\n    /* something right before */\n    b.t('put1 into x\\\\x', 'ERR:parse err');\n    b.t('put 4 into x\\ndivide x by2\\\\x', 'PREPARSEERR:4:did not see by');\n    b.t('put 4 into x\\nsubtract1 from x\\\\x', 'ERR:5:parse err');\n    b.t('put --[[c]]4 into x\\\\x', '4');\n    /* something right after */\n    b.t('put 1into x\\\\x', 'PREPARSEERR:lex');\n    b.t('put 4 into x\\nadd 1to x\\\\x', 'PREPARSEERR:4:lex');\n    b.t('put 4 into x\\nsubtract 1from x\\\\x', 'PREPARSEERR:4:lex');\n    b.t('put 4--[[c]] into x\\\\x', '4');\n    /* surrounded by symbols */\n    b.t('put 3 into x\\\\x/1', '3');\n    b.t('put 3 into x\\\\x+1', '4');\n    b.t('put 3 into x\\\\x+(1)', '4');\n    b.t('put 3 into x\\\\1/x', '0.3333333');\n    b.t('put 3 into x\\\\1+x', '4');\n    b.t('put 3 into x\\\\(1)+x', '4');\n    b.t('3/1', '3');\n    b.t('1+1', '2');\n    b.t('1+(1)', '2');\n    b.t('there is a cd btn1234', 'ERR:no variable');\n    b.batchEvaluate(h3, [], BatchType.floatingPoint);\n});\nt.test('03Identifier', () => {\n    let b = new ScriptTestBatch();\n    /* basics */\n    b.t('put 9 into b\\\\b', '9');\n    b.t('put 9 into a9\\\\a9', '9');\n    b.t('put 9 into a9$\\\\a9$', '9');\n    b.t('put 9 into a9$_\\\\a9$_', '9');\n    b.t('put 9 into 9\\\\0', 'ERR:parse');\n    b.t('put 9 into 9a\\\\0', 'PREPARSEERR:');\n    b.t('put 9 into $a\\\\0', 'PREPARSEERR:');\n    /* varnames explicitly allowed */\n    b.t('put 9 into a\\\\a', '9');\n    b.t('put 9 into an\\\\an', 'ERR:not allowed');\n    b.t('put 9 into number\\\\number', '9');\n    /* properties can be valid var names,\n    this is also covered in 02 tests */\n    b.t('put 9 into alltext\\\\alltext', '9');\n    b.t('put 9 into defaulttextstyle\\\\defaulttextstyle', '9');\n    b.t('put 9 into autoselect\\\\autoselect', '9');\n    b.t('put 9 into cantdelete\\\\cantdelete', '9');\n    b.t('put 9 into textsize\\\\textsize', '9');\n    b.t('put 9 into textstyle\\\\textstyle', '9');\n    b.t('put 9 into id\\\\0', 'PREPARSEERR:support');\n    b.batchEvaluate(h3);\n});\n\n/**\n * adds a few more elements\n */\nexport class TestVpc03 extends TestVpcScriptRunBase {\n    populateModel() {\n        super.populateModel();\n\n        let makeVel = (typ: string) => {\n            let creator = this.vcstate.vci.getCodeExec().directiveImpl;\n            return creator.goMakevelwithoutmsg(\n                new ValHolder(typ),\n                this.vcstate.model.getCurrentCard(),\n                ['', '']\n            );\n        };\n\n        this.vcstate.vci.setCurCardNoOpenCardEvt(this.ids.cdCD);\n        let bgD = cast(VpcElBg, makeVel('bkgnd'));\n        let cdDD = bgD.cards[0];\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdDD.idInternal);\n        let cdDE = makeVel('card');\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdDE.idInternal);\n        let cdDF = makeVel('card');\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdDF.idInternal);\n        let cdDG = makeVel('card');\n        this.vcstate.vci.setCurCardNoOpenCardEvt(cdDG.idInternal);\n        let cdDH = makeVel('card');\n        this.ids.bgD = bgD.idInternal;\n        this.ids.cdDD = cdDD.idInternal;\n        this.ids.cdDE = cdDE.idInternal;\n        this.ids.cdDF = cdDF.idInternal;\n        this.ids.cdDG = cdDG.idInternal;\n        this.ids.cdDH = cdDH.idInternal;\n        this.vcstate.vci.setCurCardNoOpenCardEvt(this.ids.cdDE);\n        let bDE1 = makeVel('button');\n        let fDE1 = makeVel('field');\n        let bDE2 = makeVel('button');\n        let fDE2 = makeVel('field');\n        let bDE3 = makeVel('button');\n        let fDE3 = makeVel('field');\n        this.ids.bDE1 = bDE1.idInternal;\n        this.ids.fDE1 = fDE1.idInternal;\n        this.ids.bDE2 = bDE2.idInternal;\n        this.ids.fDE2 = fDE2.idInternal;\n        this.ids.bDE3 = bDE3.idInternal;\n        this.ids.fDE3 = fDE3.idInternal;\n        this.vcstate.vci.setCurCardNoOpenCardEvt(this.ids.cdCD);\n        bgD.setOnVel('name', 'd', this.vcstate.model);\n        cdDD.setOnVel('name', 'd', this.vcstate.model);\n        cdDE.setOnVel('name', 'e', this.vcstate.model);\n        cdDF.setOnVel('name', 'f', this.vcstate.model);\n        cdDG.setOnVel('name', 'g', this.vcstate.model);\n        cdDH.setOnVel('name', 'h', this.vcstate.model);\n        bDE1.setOnVel('name', 'de1', this.vcstate.model);\n        bDE2.setOnVel('name', 'de2', this.vcstate.model);\n        bDE3.setOnVel('name', 'de3', this.vcstate.model);\n        fDE1.setOnVel('name', 'de1', this.vcstate.model);\n        fDE2.setOnVel('name', 'de2', this.vcstate.model);\n        fDE3.setOnVel('name', 'de3', this.vcstate.model);\n        this.vcstate.vci.getCodeExec().doMaintenance();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/test/vpc03/test03objectRenderName.ts",
    "content": "\n/* auto */ import { ScriptTestBatch } from './../vpc/vpcTestScriptRunBase';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { cAltProductName, cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { SimpleUtil512TestCollection } from './../testUtils/testUtils';\n/* auto */ import { h3 } from './test03lexer';\n/* auto */ import { EvaluateAsParsedFromAString } from './test03exprObjectRef';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet t = new SimpleUtil512TestCollection('testCollection03objectRenderName');\nexport let testCollection03objectRenderName = t;\n\nt.atest('--init--testCollection03objectRenderName', async () => {\n    assertTrue(\n        h3,\n        longstr(`U-|forgot to include the\n        _testCollection03lexer_ test? put it below this test in _testTop_.ts`)\n    );\n});\nt.test('03objectRenderName product', () => {\n    let b = new ScriptTestBatch();\n    b.t('the name of ViperCard', `${cProductName}`);\n    b.t('the name of HyperCard', `${cProductName}`);\n    b.t('the short name of ViperCard', `${cProductName}`);\n    b.t('the short name of HyperCard', `${cProductName}`);\n    b.t('the long name of ViperCard', `Hard Drive:${cProductName}`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderName stack', () => {\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('name', 'stname', h3.vcstate.model)\n    );\n    let b = new ScriptTestBatch();\n    b.t('the name of this stack', 'stack \"stname\"');\n    b.t('the short name of this stack', 'stname');\n    b.t('the long name of this stack', 'stack \"Hard Drive:stname\"');\n    b.batchEvaluate(h3);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.setOnVel('name', '', h3.vcstate.model)\n    );\n    b = new ScriptTestBatch();\n    b.t('the name of this stack', 'stack \"\"');\n    b.t('the short name of this stack', '');\n    b.t('the long name of this stack', 'stack \"Hard Drive:\"');\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderName bg', () => {\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.bgs[1].setOnVel('name', '', h3.vcstate.model)\n    );\n    let b = new ScriptTestBatch();\n    b.t('the name of bg 2', `bkgnd id ${h3.ids.bgB}`);\n    b.t('the short name of bg 2', `bkgnd id ${h3.ids.bgB}`);\n    b.t('the long name of bg 2', `bkgnd id ${h3.ids.bgB} of stack \"\"`);\n    b.batchEvaluate(h3);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        h3.vcstate.model.stack.bgs[1].setOnVel('name', 'b', h3.vcstate.model)\n    );\n    b = new ScriptTestBatch();\n    b.t('the name of bg 2', `bkgnd \"b\"`);\n    b.t('the short name of bg 2', `b`);\n    b.t('the long name of bg 2', `bkgnd \"b\" of stack \"\"`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderName card', () => {\n    let cdBC = h3.vcstate.model.getCardById(h3.ids.cdBC);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        cdBC.setOnVel('name', '', h3.vcstate.model)\n    );\n    let b = new ScriptTestBatch();\n    b.t(`the name of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC}`);\n    b.t(`the short name of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC}`);\n    b.t(`the long name of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC} of stack \"\"`);\n    b.batchEvaluate(h3);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        cdBC.setOnVel('name', 'c', h3.vcstate.model)\n    );\n    b = new ScriptTestBatch();\n    b.t(`the name of cd id ${h3.ids.cdBC}`, `card \"c\"`);\n    b.t(`the short name of cd id ${h3.ids.cdBC}`, `c`);\n    b.t(`the long name of cd id ${h3.ids.cdBC}`, `card \"c\" of stack \"\"`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderName button', () => {\n    let p = h3.vcstate.model.getById(VpcElButton, h3.ids.bBC1);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() => p.setOnVel('name', '', h3.vcstate.model));\n    let b = new ScriptTestBatch();\n    b.t(`the name of cd btn id ${h3.ids.bBC1}`, `card button id ${h3.ids.bBC1}`);\n    b.t(`the short name of cd btn id ${h3.ids.bBC1}`, `card button id ${h3.ids.bBC1}`);\n    b.t(\n        `the long name of cd btn id ${h3.ids.bBC1}`,\n        `card button id ${h3.ids.bBC1} of card \"c\" of stack \"\"`\n    );\n    b.batchEvaluate(h3);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        p.setOnVel('name', 'p1', h3.vcstate.model)\n    );\n    b = new ScriptTestBatch();\n    b.t(`the name of cd btn id ${h3.ids.bBC1}`, `card button \"p1\"`);\n    b.t(`the short name of cd btn id ${h3.ids.bBC1}`, `p1`);\n    b.t(\n        `the long name of cd btn id ${h3.ids.bBC1}`,\n        `card button \"p1\" of card \"c\" of stack \"\"`\n    );\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderName field', () => {\n    let p = h3.vcstate.model.getById(VpcElField, h3.ids.fBC1);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() => p.setOnVel('name', '', h3.vcstate.model));\n    let b = new ScriptTestBatch();\n    b.t(`the name of cd fld id ${h3.ids.fBC1}`, `card field id ${h3.ids.fBC1}`);\n    b.t(`the short name of cd fld id ${h3.ids.fBC1}`, `card field id ${h3.ids.fBC1}`);\n    b.t(\n        `the long name of cd fld id ${h3.ids.fBC1}`,\n        `card field id ${h3.ids.fBC1} of card \"c\" of stack \"\"`\n    );\n    b.batchEvaluate(h3);\n    h3.vcstate.vci.doWithoutAbilityToUndo(() =>\n        p.setOnVel('name', 'p1', h3.vcstate.model)\n    );\n    b = new ScriptTestBatch();\n    b.t(`the name of cd fld id ${h3.ids.fBC1}`, `card field \"p1\"`);\n    b.t(`the short name of cd fld id ${h3.ids.fBC1}`, `p1`);\n    b.t(\n        `the long name of cd fld id ${h3.ids.fBC1}`,\n        `card field \"p1\" of card \"c\" of stack \"\"`\n    );\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID product', () => {\n    let b = new ScriptTestBatch();\n    b.t('the id of ViperCard', `WILD`);\n    b.t('the id of HyperCard', `WILD`);\n    b.t('the short id of ViperCard', `WILD`);\n    b.t('the short id of HyperCard', `WILD`);\n    b.t('the long id of ViperCard', `WILD`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID stack', () => {\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of stack 1 to true\\\\1`, `1`);\n    b.t('the id of this stack', `${h3.ids.stack}`);\n    b.t('the short id of this stack', `${h3.ids.stack}`);\n    b.t('the long id of this stack', `${h3.ids.stack}`);\n    b.t(`set the compatibilitymode of stack 1 to false\\\\1`, `1`);\n    b.t('the id of this stack', `${h3.ids.stack}`);\n    b.t('the short id of this stack', `${h3.ids.stack}`);\n    b.t('the long id of this stack', `stack id ${h3.ids.stack}`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID bg', () => {\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of stack 1 to true\\\\1`, `1`);\n    b.t('the id of bg 2', `${h3.ids.bgB}`);\n    b.t('the short id of bg 2', `${h3.ids.bgB}`);\n    b.t('the long id of bg 2', `${h3.ids.bgB}`);\n    b.t(`set the compatibilitymode of stack 1 to false\\\\1`, `1`);\n    b.t('the id of bg 2', `${h3.ids.bgB}`);\n    b.t('the short id of bg 2', `${h3.ids.bgB}`);\n    b.t('the long id of bg 2', `bkgnd id ${h3.ids.bgB}`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID card', () => {\n    /* our compatmode this time makes it less verbose, not more,\n    to make it more consistent */\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of stack 1 to true\\\\1`, `1`);\n    b.t(`the id of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC}`);\n    b.t(`the short id of cd id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the long id of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC} of stack \"\"`);\n    b.t(`set the compatibilitymode of stack 1 to false\\\\1`, `1`);\n    b.t(`the id of cd id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the long id of cd id ${h3.ids.cdBC}`, `card id ${h3.ids.cdBC}`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID button', () => {\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of stack 1 to true\\\\1`, `1`);\n    b.t(`the id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the long id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`set the compatibilitymode of stack 1 to false\\\\1`, `1`);\n    b.t(`the id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the long id of cd btn id ${h3.ids.bBC1}`, `card button id ${h3.ids.bBC1}`);\n    b.batchEvaluate(h3);\n});\nt.test('03objectRenderID field', () => {\n    let b = new ScriptTestBatch();\n    b.t(`set the compatibilitymode of stack 1 to true\\\\1`, `1`);\n    b.t(`the id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the long id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`set the compatibilitymode of stack 1 to false\\\\1`, `1`);\n    b.t(`the id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the long id of cd fld id ${h3.ids.fBC1}`, `card field id ${h3.ids.fBC1}`);\n    b.batchEvaluate(h3);\n});\n/**\n * VelRenderId.parseFromString is similar to resolve-reference,\n * but does string manipulation instead. it's used when interpreting a string as an object.\n */\nt.test('VelRenderId.parseFromString', () => {\n    let b = new ScriptTestBatch();\n    /* what's most important is that we can successfully\n    parse everything from the long id of */\n    /* product (not supported) */\n\n    b.t(`put \"${cProductName}\" into x\\\\the short id of x`, `ERR:5:too short`);\n    b.t(`put \"${cAltProductName}\" into x\\\\the short id of x`, `ERR:5:too short`);\n    b.t(`put \"target\" into x\\\\the short id of x`, `ERR:5:too short`);\n    b.t(`put \"me\" into x\\\\the short id of x`, `ERR:5:too short`);\n    b.t(`put \"product\" into x\\\\the short id of x`, `ERR:5:too short`);\n    b.batchEvaluate(h3);\n    b = new ScriptTestBatch();\n    /* stack */\n\n    b.t(`the short id of stack 1`, `${h3.ids.stack}`);\n    b.t(`the short id of stack 9`, `ERR:could not find`);\n    b.t(`the short id of stack id ${h3.ids.stack}`, `${h3.ids.stack}`);\n    b.t(`the short id of stack id 9`, `ERR:could not find`);\n    b.t(`the short id of 9`, `ERR:parse err`);\n    /* bg */\n\n    b.t(`the short id of bg id ${h3.ids.bgB}`, `${h3.ids.bgB}`);\n    b.t(`the short id of bg id ${h3.ids.bgB} of stack 1`, `${h3.ids.bgB}`);\n    b.t(`the short id of bkgnd id ${h3.ids.bgB}`, `${h3.ids.bgB}`);\n    b.t(`the short id of bkgnd id ${h3.ids.bgB} of stack 1`, `${h3.ids.bgB}`);\n    b.t(`the short id of bkgnd \"b\"`, `${h3.ids.bgB}`);\n    b.t(`the short id of bkgnd \"b\" of stack 1`, `${h3.ids.bgB}`);\n    /* card */\n    b.t(`the short id of cd id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the short id of card id ${h3.ids.cdBC}`, `${h3.ids.cdBC}`);\n    b.t(`the short id of card \"c\"`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd id ${h3.ids.cdBC} of bg \"b\"`, `${h3.ids.cdBC}`);\n    b.t(`the short id of card id ${h3.ids.cdBC} of bg \"b\"`, `${h3.ids.cdBC}`);\n    b.t(`the short id of card \"c\" of bg \"b\"`, `${h3.ids.cdBC}`);\n    b.t(`the short id of cd id ${h3.ids.cdBC} of bg \"a\"`, `ERR:could not find`);\n    b.t(`the short id of card id ${h3.ids.cdBC} of bg \"a\"`, `ERR:could not find`);\n    b.t(`the short id of card \"c\" of bg \"a\"`, `ERR:could not find`);\n    /* btn */\n    b.t(`go to cd id ${h3.ids.cdBC}\\\\1`, `1`);\n    b.t(`the short id of cd btn id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the short id of card button id ${h3.ids.bBC1}`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h3.ids.bBC1} of cd \"c\"`, `${h3.ids.bBC1}`);\n    b.t(`the short id of card button id ${h3.ids.bBC1} of cd \"c\"`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn \"p1\"`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn \"p1\" of cd \"c\"`, `${h3.ids.bBC1}`);\n    b.t(`the short id of cd btn id ${h3.ids.bBC1} of cd \"a\"`, `ERR:could not find`);\n    b.t(`the short id of card button id ${h3.ids.bBC1} of cd \"a\"`, `ERR:could not find`);\n    /* fld */\n    b.t(`the short id of cd fld id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the short id of card field id ${h3.ids.fBC1}`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h3.ids.fBC1} of cd \"c\"`, `${h3.ids.fBC1}`);\n    b.t(`the short id of card field id ${h3.ids.fBC1} of cd \"c\"`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld \"p1\"`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld \"p1\" of cd \"c\"`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld id ${h3.ids.fBC1} of cd \"a\"`, `ERR:could not find`);\n    b.t(`the short id of card field id ${h3.ids.fBC1} of cd \"a\"`, `ERR:could not find`);\n    /* should support a name with spaces */\n    b.t(`set the name of cd fld id ${h3.ids.fBC1} to \"name with spaces\"\\\\1`, `1`);\n    b.t(`the short id of cd fld \"name with spaces\"`, `${h3.ids.fBC1}`);\n    b.t(`the short id of cd fld \"name with spaces\" of cd \"c\"`, `${h3.ids.fBC1}`);\n    b.t(`set the name of cd fld id ${h3.ids.fBC1} to \"p1\"\\\\1`, `1`);\n    b.batchEvaluate(h3, [EvaluateAsParsedFromAString]);\n});\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512ButtonGroup.ts",
    "content": "\n/* auto */ import { Util512, cast } from './../utils/util512';\n/* auto */ import { MouseUpEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512CompBase } from './ui512Composites';\n/* auto */ import { lng } from './../lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * if isExclusive, a group of mutually exclusive radio buttons\n * if not isExclusive, a group of checkboxes\n * to use this composite,\n * create an onMouseUp listener in your presenter\n * that forwards the event to this object's listenMouseUp\n *\n * see uiDemoComposites for an example.\n */\nexport class UI512CompButtonGroup extends UI512CompBase {\n    items: [string, string][] = [];\n    isExclusive = false;\n    itemMargin = 5;\n    itemHeight = 20;\n    compositeType = 'buttongroup';\n\n    /**\n     * draw UI\n     */\n    createSpecific(app: UI512Application) {\n        Util512.freezeRecurse(this.items);\n        let grp = app.getGroup(this.grpId);\n        let curY = this.y;\n        for (let item of this.items) {\n            /* create a button for each item */\n            let el = this.genBtn(app, grp, item[0]);\n            el.set(\n                'style',\n                this.isExclusive ? UI512BtnStyle.Radio : UI512BtnStyle.Checkbox\n            );\n            el.set('labelhalign', false);\n            el.set('labelvalign', true);\n            el.setDimensions(this.x, curY, this.logicalWidth, this.itemHeight);\n            let translated = lng(item[1]);\n            el.set('labeltext', translated);\n            curY += this.itemHeight + this.itemMargin;\n        }\n    }\n\n    /**\n     * returns short id of the chosen item(s), or empty array\n     */\n    getWhichChecked(app: UI512Application) {\n        let ret: string[] = [];\n        let grp = app.getGroup(this.grpId);\n        for (let item of this.items) {\n            let el = grp.getEl(this.getElId(item[0]));\n            let btn = cast(UI512ElButton, el);\n            if (btn.getB('checkmark')) {\n                ret.push(item[0]);\n            }\n        }\n\n        return ret;\n    }\n\n    /**\n     * choose an item\n     */\n    setWhichChecked(app: UI512Application, idlist: string[]) {\n        let grp = app.getGroup(this.grpId);\n        for (let item of this.items) {\n            let el = grp.getEl(this.getElId(item[0]));\n            let shouldCheck = idlist.indexOf(item[0]) !== -1;\n            el.set('checkmark', shouldCheck);\n        }\n    }\n\n    /**\n     * onMouseUp, see if one of our elements was clicked on\n     */\n    respondMouseUp(app: UI512Application, d: MouseUpEventDetails) {\n        if (!this.children.length) {\n            return;\n        }\n\n        if (d.elClick && this.isExclusive) {\n            let userId = this.fromFullId(d.elClick.id);\n            if (userId) {\n                this.setWhichChecked(app, [userId]);\n            }\n        } else if (d.elClick) {\n            let userId = this.fromFullId(d.elClick.id);\n            if (userId) {\n                d.elClick.set('checkmark', !d.elClick.getB('checkmark'));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512CodeEditor.ts",
    "content": "\n/* auto */ import { arLast } from './../utils/util512';\n/* auto */ import { TextSelModify } from './../textedit/ui512TextSelModify';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { KeyDownEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n/* auto */ import { UI512CompBase, WndBorderDecorationConsts } from './ui512Composites';\n/* auto */ import { UI512AutoIndent, UI512CompCodeEditorFont } from './ui512CodeEditorAutoIndent';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a code editor\n * to use this composite,\n * create an onKeyDown listener in your presenter\n * that forwards the event to this object's respondKeydown\n *\n * see uiDemoComposites for an example.\n */\nexport class UI512CompCodeEditor extends UI512CompBase {\n    hasCloseBtn = false;\n    autoCreateBlock = true;\n    compositeType = 'editor';\n    lineCommentPrefix = '//~ ';\n    blockCommentStart = '/*';\n    blockCommentEnd = '*/';\n    el: UI512ElTextField;\n    autoIndent = new UI512AutoIndent();\n    constructor(compositeId: string) {\n        super(compositeId);\n    }\n\n    /**\n     * draw UI\n     */\n    createSpecific(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        let headerHeight = this.drawWindowDecoration(\n            app,\n            new WndBorderDecorationConsts(),\n            this.hasCloseBtn\n        );\n\n        let curY = this.y + headerHeight - 1;\n        const spacerHeight = headerHeight;\n        let spacer = this.genBtn(app, grp, 'spacer');\n        spacer.set('autohighlight', false);\n        spacer.setDimensions(this.x, curY, this.logicalWidth, spacerHeight);\n        curY += spacerHeight - 1;\n\n        this.el = this.genChild(app, grp, 'editor', UI512ElTextField);\n        this.el.set('style', UI512FldStyle.Rectangle);\n        this.el.set('labelwrap', false);\n        this.el.set('scrollbar', true);\n        this.el.set('defaultFont', UI512CompCodeEditorFont.font);\n        this.el.setDimensionsX1Y1(\n            this.x,\n            curY,\n            this.x + this.logicalWidth,\n            this.y + this.logicalHeight\n        );\n    }\n\n    /**\n     * set content of code editor\n     */\n    setContent(s: string) {\n        s = UI512DrawText.setFont(s, UI512CompCodeEditorFont.font);\n        let txt = FormattedText.newFromSerialized(s);\n        this.el.setFmTxt(txt);\n    }\n\n    /**\n     * set the caption at the top\n     */\n    setCaption(app: UI512Application, s: string) {\n        let grp = app.getGroup(this.grpId);\n        let el = grp.findEl(this.getElId('caption'));\n        if (el) {\n            el.set('labeltext', s);\n        }\n    }\n\n    /**\n     * see if any shortcut keys were pressed, and respond accordingly\n     */\n    respondKeydown(d: KeyDownEventDetails) {\n        if (!this.el.getB('canselecttext') || !this.el.getB('canedit')) {\n            return;\n        }\n\n        let gel = new UI512ElTextFieldAsGeneric(this.el);\n        let wasShortcut = true;\n        switch (d.readableShortcut) {\n            case 'Cmd+D':\n                TextSelModify.changeTextDuplicate(gel);\n                break;\n            case 'Cmd+L':\n                TextSelModify.changeTextDeleteLine(gel);\n                break;\n            case 'Cmd+Q':\n                /* Ctrl Q comments/uncomments a line */\n                TextSelModify.changeTextToggleLinePrefix(gel, this.lineCommentPrefix);\n                break;\n            case 'Cmd+Shift+Q':\n                /* Note: Ctrl-Shift-Q in older Chrome exits the browser */\n                TextSelModify.changeTextToggleBlockComment(\n                    gel,\n                    this.blockCommentStart,\n                    this.blockCommentEnd\n                );\n                break;\n            case 'Opt+Enter':\n                /* insert continued line character */\n                TextSelModify.changeTextInsert(\n                    gel,\n                    arLast(this.autoIndent.lineContinuation)\n                );\n                TextSelModify.changeTextInsert(gel, '\\n');\n                this.autoIndent.runAutoIndentAll(this.el);\n                break;\n            case 'Enter':\n                /* run auto-indent when you hit Enter */\n                TextSelModify.changeTextInsert(gel, '\\n');\n                this.autoIndent.runAutoIndentAll(this.el);\n                break;\n            case 'Tab':\n                this.autoIndent.runAutoIndentAll(this.el);\n                break;\n            default:\n                wasShortcut = false;\n                break;\n        }\n\n        if (wasShortcut) {\n            d.setHandled();\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512CodeEditorAutoIndent.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../utils/util512Assert';\n/* auto */ import { Util512, arLast, assertWarnEq, lastIfThere, slength } from './../utils/util512';\n/* auto */ import { UI512Lines } from './../textedit/ui512TextLines';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { TextFontStyling, specialCharNumNewline, textFontStylingToString } from './../drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * automatically indent code,\n * to make editing code more convenient\n * can helpfully indicate source of syntax errors if code isn't lining up as expected.\n * also auto-closes clauses, e.g. automatically adds \"end if\" to match an \"if\"\n */\nexport class UI512AutoIndent {\n    /* ending a line with one of these characters will continue statement onto next line */\n    lineContinuation = ['\\\\'];\n\n    /* pattern matching. start pattern, end pattern, and end-to-automatically-insert */\n    linesCauseIndent: [RegExp, RegExp, string][] = [\n        [/^start1\\b/, /^end1\\b/, 'end1'],\n        [/^start\\s+b2\\b/, /^end\\s+b2\\b/, 'end'],\n        [/^start\\s+b2\\b/, /^end\\s+b2\\b/, 'end'],\n        [/^on\\s+(\\w+)\\b/, /^end\\s+%MATCH%\\b/, 'end %MATCH%']\n    ];\n\n    caseSensitive = true;\n    useTabs = true;\n    useAutoIndent = true;\n    useAutoCreateBlock = true;\n\n    /**\n     * in many languages you can continue a long statement to the next line with a backslash\n     */\n    protected lineIsContinuation(s: string) {\n        for (let i = 0, len = this.lineContinuation.length; i < len; i++) {\n            let cont = this.lineContinuation[i];\n            if (s.endsWith(cont) || s.endsWith(cont + '\\n')) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * does this line open a new block, for this specific prefix?\n     */\n    getLevelChangeIsStartNewBlock(\n        s: string,\n        stack: AutoIndentMatch[],\n        st: RegExp,\n        end: RegExp,\n        endText: string\n    ) {\n        let matched = s.match(st);\n        if (matched && !this.lineDoesNotActuallyStartBlock(s)) {\n            let nextWord = '';\n            if (endText.includes('%MATCH%')) {\n                assertTrue(\n                    matched.length > 1,\n                    '2s|the regex should have a 2nd group to capture next word'\n                );\n                if (matched[1].match(/^\\w+$/)) {\n                    nextWord = matched[1];\n                }\n            }\n\n            let store = new AutoIndentMatch();\n            store.startPattern = st;\n            store.desiredEndPattern = new RegExp(\n                end.source.replace(/%MATCH%/g, nextWord)\n            );\n            store.desiredEndText = endText.replace(/%MATCH%/g, nextWord);\n            stack.push(store);\n            return 1;\n        }\n\n        return 0;\n    }\n\n    /**\n     * child classes can override this\n     */\n    lineDoesNotActuallyStartBlock(s: string) {\n        return false;\n    }\n\n    /**\n     * does this line end a block, for this specific prefix?\n     */\n    getLevelChangeIsEndOfBlock(s: string, stack: AutoIndentMatch[]) {\n        let desiredMatch = arLast(stack);\n        let matched = s.match(desiredMatch.desiredEndPattern);\n        if (matched) {\n            stack.pop();\n            return -1;\n        } else {\n            return 0;\n        }\n    }\n\n    /**\n     * does this line start a new block, or end a block?\n     */\n    protected getLevelChange(\n        sTrimmed: string,\n        stack: AutoIndentMatch[]\n    ): [boolean, boolean] {\n        let isBlockStart = false;\n        let isBlockEnd = false;\n        sTrimmed = sTrimmed.trim();\n        if (!this.caseSensitive) {\n            sTrimmed = sTrimmed.toLowerCase();\n        }\n\n        /* are we starting a new block? */\n        for (let [st, end, endInsert] of this.linesCauseIndent) {\n            let rt = this.getLevelChangeIsStartNewBlock(\n                sTrimmed,\n                stack,\n                st,\n                end,\n                endInsert\n            );\n\n            if (rt !== 0) {\n                isBlockStart = true;\n                break;\n            }\n        }\n\n        /* are we finishing a block? */\n        if (stack.length > 0) {\n            let rt = this.getLevelChangeIsEndOfBlock(sTrimmed, stack);\n            if (rt !== 0) {\n                isBlockEnd = true;\n            }\n        }\n\n        /* the same line can be both a block-start and block-end: an 'else' line */\n        return [isBlockStart, isBlockEnd];\n    }\n\n    /**\n     * main runAutoIndent method\n     */\n    runAutoIndentAll(el: UI512ElTextField) {\n        if (!this.useAutoIndent) {\n            return;\n        }\n\n        let lns = new UI512Lines(el.getFmTxt());\n        let lnsAfterIndent = this.runAutoIndent(lns, el);\n        let next = lnsAfterIndent.flatten();\n        let flattxtcurrent = el.getFmTxt().toUnformatted();\n        if (flattxtcurrent !== next.toUnformatted()) {\n            el.setFmTxt(next);\n        }\n    }\n\n    /**\n     * run autoIndent for a set of lines of code\n     */\n    protected runAutoIndent(lns: UI512Lines, el: UI512ElTextField): UI512Lines {\n        let len = el.getFmTxt().len();\n        let [outLns, outSelCaret, outSelEnd] = this.runAutoIndentImpl(\n            lns,\n            el.getN('selcaret'),\n            el.getN('selend'),\n            len,\n            true\n        );\n\n        el.set('selcaret', outSelCaret);\n        el.set('selend', outSelEnd);\n        return outLns;\n    }\n\n    /**\n     * set the indentation of a line\n     */\n    protected lineSetIndent(s: string, n: number) {\n        s = s.replace(/^[ \\t]+/g, '');\n        let space = this.useTabs\n            ? '\\t'\n            : Util512.repeat(ScrollConsts.TabSize, ' ').join('');\n        for (let i = 0; i < n; i++) {\n            s = space + s;\n        }\n\n        return s;\n    }\n\n    /**\n     * auto indent implemetation\n     */\n    protected runAutoIndentImpl(\n        lns: UI512Lines,\n        selCaret: number,\n        selEnd: number,\n        len: number,\n        attemptInsertText: boolean\n    ): [UI512Lines, number, number] {\n        let currentline = lns.indexToLineNumber(selCaret);\n        let lnsOut = new UI512Lines(FormattedText.newFromSerialized(''));\n        lnsOut.lns = [];\n\n        let level = 0;\n        let overrideLevel: O<number> = undefined;\n        let lastUnclosedDelta = 0;\n        let lastUnclosedMatch: O<AutoIndentMatch>;\n\n        /* store levels in a stack, an open pushes onto the stack, a close pops from the stack */\n        let stack: AutoIndentMatch[] = [];\n        for (let i = 0; i < lns.lns.length; i++) {\n            let s = lns.getLineUnformatted(i);\n            let isContinuation = this.lineIsContinuation(s);\n            let [isBlockStart, isBlockEnd] = this.getLevelChange(s, stack);\n\n            /* make a record of the indentation state of the 'current' line where the caret it */\n            if (i === currentline - 1 && !isContinuation && isBlockStart) {\n                lastUnclosedDelta = 1;\n                lastUnclosedMatch = lastIfThere(stack);\n            }\n\n            /* decrease the indentation if we ended a block */\n            if (isBlockEnd) {\n                level -= 1;\n            }\n\n            s = this.lineSetIndent(\n                s,\n                overrideLevel !== undefined ? overrideLevel : level\n            );\n            s = UI512DrawText.setFont(s, UI512CompCodeEditorFont.font);\n            lnsOut.lns[i] = FormattedText.newFromSerialized(s);\n            overrideLevel = isContinuation ? level + 1 : undefined;\n\n            /* increase the indentation if we started a block */\n            if (isBlockStart) {\n                level += 1;\n            }\n        }\n\n        /* if phrases are unbalanced, let's see if we can auto-fix the problem! */\n        if (level !== 0 && attemptInsertText) {\n            if (\n                this.createAutoBlock(\n                    lnsOut,\n                    currentline,\n                    lastUnclosedMatch,\n                    lastUnclosedDelta\n                )\n            ) {\n                /* do a second pass on indentation */\n                let newselcaret = lnsOut.lineNumberToLineEndIndex(currentline);\n                return this.runAutoIndentImpl(\n                    lnsOut,\n                    newselcaret,\n                    newselcaret,\n                    lnsOut.length(),\n                    false\n                );\n            }\n        }\n\n        assertWarnEq(lns.lns.length, lnsOut.lns.length, '2r|');\n        assertWarn(currentline < lnsOut.lns.length, '2q|invalid currentline');\n        let index = lnsOut.lineNumberToLineEndIndex(currentline);\n        return [lnsOut, index, index];\n    }\n\n    /**\n     * automatically add code to close the block!\n     * if you type 'if', automatically adds the 'end if'\n     */\n    createAutoBlock(\n        lnsOut: UI512Lines,\n        currentLine: number,\n        lastEncounteredDesiredMatch: O<AutoIndentMatch>,\n        delta: number\n    ) {\n        if (delta !== 1 || !lastEncounteredDesiredMatch || !this.useAutoCreateBlock) {\n            return false;\n        } else if (!slength(lastEncounteredDesiredMatch.desiredEndText)) {\n            return false;\n        }\n\n        /* we'll do a second pass later to correct the indentation */\n        let s = UI512DrawText.setFont(\n            lastEncounteredDesiredMatch.desiredEndText,\n            UI512CompCodeEditorFont.font\n        );\n\n        /* are we on the very last line? then don't add a newline character */\n        if (currentLine >= lnsOut.lns.length - 1) {\n            lnsOut.lns[currentLine].push(\n                specialCharNumNewline,\n                UI512CompCodeEditorFont.font\n            );\n        } else {\n            s += '\\n';\n        }\n\n        let txt = FormattedText.newFromSerialized(s);\n        lnsOut.lns.splice(currentLine + 1, 0, txt);\n        return true;\n    }\n}\n\n/**\n * defaults for the code editor font\n */\nexport class UI512CompCodeEditorFont {\n    static face = 'monaco';\n    static style = TextFontStyling.Default;\n    static size = 9;\n    static font = `${UI512CompCodeEditorFont.face}_${\n        UI512CompCodeEditorFont.size\n    }_${textFontStylingToString(UI512CompCodeEditorFont.style)}`;\n}\n\n/**\n * struct holding regex match information\n */\nclass AutoIndentMatch {\n    startPattern: RegExp;\n    desiredEndPattern: RegExp;\n    desiredEndText: string;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512Composites.ts",
    "content": "\n/* auto */ import { RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { AnyParameterCtor, assertEq } from './../utils/util512';\n/* auto */ import { UI512PresenterBase } from './../presentation/ui512PresenterBase';\n/* auto */ import { UI512ElLabel } from './../elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for composites. a composite has a UI512group of elements that act in a connected way.\n * composites add a namespace (id prefix) to elements,\n * to make it easier for many composites to be shown on the screen at a time.\n */\nexport abstract class UI512CompBase {\n    idPrefix = '';\n    readonly grpId: string;\n    readonly compositeId: string;\n    compositeType = '';\n    children: UI512Element[] = [];\n\n    /* the conceptual 'size' of the composite.\n    it's fine if some child elements are outside these boundaries. */\n    x = 0;\n    y = 0;\n    logicalWidth = 0;\n    logicalHeight = 0;\n\n    /**\n     * the compositeId forms part of the namespace (id prefix)\n     */\n    constructor(compositeId: string) {\n        this.compositeId = compositeId;\n        this.grpId = this.getElId('composite');\n    }\n\n    /**\n     * get full id of the element\n     */\n    getElId(suffix: string) {\n        return this.compositeId + '##' + this.compositeType + '##' + suffix;\n    }\n\n    /**\n     * get our internal id of the element, or return undefined if we don't own it\n     */\n    fromFullId(fullId: string) {\n        let parts = fullId.split(this.compositeId + '##' + this.compositeType + '##');\n        if (parts.length !== 2) {\n            return undefined;\n        } else {\n            return parts[1];\n        }\n    }\n\n    /**\n     * move every child\n     */\n    moveAllTo(newX: number, newY: number, app: UI512Application) {\n        let dx = newX - this.x;\n        let dy = newY - this.y;\n        if (dx !== 0 && dy !== 0) {\n            this.x += dx;\n            this.y += dy;\n            for (let el of this.children) {\n                el.setDimensions(el.x + dx, el.y + dy, el.w, el.h);\n            }\n        }\n    }\n\n    /**\n     * one-line shortcut for creating a child button\n     */\n    protected genBtn(app: UI512Application, grp: UI512ElGroup, shortId: string) {\n        return this.genChild(app, grp, shortId, UI512ElButton);\n    }\n\n    /**\n     * one-line shortcut for creating any child element\n     */\n    protected genChild<T extends UI512Element>(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        shortId: string,\n        ctor: AnyParameterCtor<T>\n    ): T {\n        let el = new ctor(this.getElId(shortId));\n        grp.addElement(app, el);\n        this.children.push(el);\n        return el;\n    }\n\n    /**\n     * subclass-specific logic for creating the UI of this composite\n     */\n    abstract createSpecific(app: UI512Application): void;\n\n    /**\n     * create the UI of this composite\n     */\n    create(pr: UI512PresenterBase, app: UI512Application, index = -1) {\n        assertEq(\n            0,\n            this.children.length,\n            `2v|creating composite twice? ${this.compositeId}`\n        );\n        if (!app.findGroup(this.grpId)) {\n            let grp = new UI512ElGroup(this.grpId, app.observer);\n            app.addGroup(grp, index);\n        }\n\n        this.createSpecific(app);\n        pr.rebuildFieldScrollbars();\n    }\n\n    /**\n     * remove the UI of this composite.\n     * if you want to use the composite again, you must call create() to revive and rebuild it.\n     */\n    destroy(pr: UI512PresenterBase, app: UI512Application) {\n        this.children.length = 0;\n        app.removeGroup(this.grpId);\n        pr.rebuildFieldScrollbars();\n    }\n\n    /**\n     * creates UI buttons+fields to draw window decoration\n     */\n    protected drawWindowDecoration(\n        app: UI512Application,\n        pr: BorderDecorationConsts,\n        hasCloseBtn: boolean\n    ) {\n        let grp = app.getGroup(this.grpId);\n\n        /* draw background+shadow */\n        let headerBox = this.genBtn(app, grp, 'headerbox');\n        headerBox.set('autohighlight', false);\n        headerBox.setDimensions(this.x, this.y, this.logicalWidth, pr.headHeight);\n\n        /* get header fill rect */\n        if (pr.fillShrinkX >= 0) {\n            let fillRect = RectUtils.getSubRectRaw(\n                this.x,\n                this.y,\n                this.logicalWidth,\n                pr.headHeight,\n                pr.fillShrinkX,\n                pr.fillShrinkY\n            );\n            if (!fillRect) {\n                return pr.headHeight;\n            }\n\n            /* draw header fill */\n            let headerFill = this.genBtn(app, grp, 'headerFill');\n            headerFill.set('style', UI512BtnStyle.Opaque);\n            headerFill.set('autohighlight', false);\n            headerFill.set('icongroupid', pr.fillIconGroup);\n            headerFill.set('iconnumber', pr.fillIconNumber);\n            headerFill.set('iconadjustx', pr.fillIconAdjustX);\n            headerFill.set('iconadjusty', pr.fillIconAdjustY);\n            headerFill.setDimensions(fillRect[0], fillRect[1], fillRect[2], fillRect[3]);\n        } else {\n            headerBox.set('icongroupid', pr.fillIconGroup);\n            headerBox.set('iconnumber', pr.fillIconNumber);\n            headerBox.set('iconadjustx', pr.fillIconAdjustX);\n            headerBox.set('iconadjusty', pr.fillIconAdjustY);\n        }\n\n        if (hasCloseBtn) {\n            /* draw image behind close button */\n            let behindCloseBtn = this.genBtn(app, grp, 'behindclosebtn');\n            behindCloseBtn.set('style', UI512BtnStyle.Opaque);\n            behindCloseBtn.set('autohighlight', false);\n            let clX =\n                pr.closeBtnX -\n                Math.floor((pr.behindCloseBtnWidth - pr.closeBtnWidth) / 2);\n            behindCloseBtn.setDimensions(\n                this.x + clX,\n                this.y + 1,\n                pr.behindCloseBtnWidth,\n                pr.headHeight - 2\n            );\n\n            /* draw close button */\n            let closeBtn = this.genBtn(app, grp, 'closebtn');\n            closeBtn.set('autohighlight', true);\n            closeBtn.setDimensions(\n                this.x + pr.closeBtnX,\n                this.y + pr.closeBtnY,\n                pr.closeBtnWidth,\n                pr.closeBtnHeight\n            );\n        }\n\n        /* draw caption */\n        if (pr instanceof WndBorderDecorationConsts) {\n            let caption = this.genChild(app, grp, 'caption', UI512ElLabel);\n            caption.set('transparentExceptChars', true);\n            caption.set('labeltext', '');\n            caption.set('labelwrap', false);\n            caption.set('labelhalign', true);\n            caption.set('labelvalign', true);\n            caption.setDimensions(headerBox.x, headerBox.y, headerBox.w, headerBox.h);\n        }\n\n        return pr.headHeight;\n    }\n\n    /**\n     * set visibility\n     */\n    setVisible(app: UI512Application, visible: boolean) {\n        let grp = app.getGroup(this.grpId);\n        grp.setVisible(visible);\n    }\n}\n\n/**\n * base class for border decoration constants\n */\nexport class BorderDecorationConsts {\n    headHeight = 0;\n    fillShrinkX = 0;\n    fillShrinkY = 0;\n    behindCloseBtnWidth = 0;\n    closeBtnWidth = 0;\n    closeBtnHeight = 0;\n    closeBtnX = 0;\n    closeBtnY = 0;\n    fillIconGroup = '';\n    fillIconNumber = 0;\n    fillIconAdjustX = 0;\n    fillIconAdjustY = 0;\n    footer = 2;\n}\n\n/**\n * a \"palette\" style window border\n */\nexport class PalBorderDecorationConsts extends BorderDecorationConsts {\n    readonly headHeight = 11;\n    readonly fillShrinkX = -1;\n    readonly fillShrinkY = -1;\n    readonly fillIconGroup = '000';\n    readonly fillIconNumber = 2;\n    readonly fillIconAdjustY = 1;\n    readonly behindCloseBtnWidth = 11;\n    readonly closeBtnWidth = 7;\n    readonly closeBtnHeight = 7;\n    readonly closeBtnX = 8;\n    readonly closeBtnY = 2;\n}\n\n/**\n * a \"window\" style window border\n */\nexport class WndBorderDecorationConsts extends BorderDecorationConsts {\n    readonly headHeight = 19;\n    readonly fillShrinkX = 1;\n    readonly fillShrinkY = 2;\n    readonly fillIconGroup = '000';\n    readonly fillIconNumber = 3;\n    readonly fillIconAdjustY = 1;\n    readonly behindCloseBtnWidth = 13;\n    readonly closeBtnWidth = 11;\n    readonly closeBtnHeight = 11;\n    readonly closeBtnX = 9;\n    readonly closeBtnY = 4;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512ModalDialog.ts",
    "content": "\n/* auto */ import { ScreenConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../utils/utilsCursors';\n/* auto */ import { RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { RespondToErr, Util512Higher } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { addDefaultListeners } from './../textedit/ui512TextEvents';\n/* auto */ import { TemporarilySuspendEvents } from './../menu/ui512SuspendEvents';\n/* auto */ import { UI512PresenterBase } from './../presentation/ui512PresenterBase';\n/* auto */ import { UI512Presenter } from './../presentation/ui512Presenter';\n/* auto */ import { FnEventCallback, MouseDragStatus, UI512EventType, UI512PresenterInterface } from './../draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { KeyDownEventDetails, MouseDownEventDetails, MouseUpEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle } from './../elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512CompBase } from './ui512Composites';\n/* auto */ import { lng } from './../lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a modal dialog\n * \"answer\", like an alert() box\n * \"ask\", like an input() box\n *\n * becuse all of the Presenter's events, including the onIdle event,\n * are redirected when the dialog is open, it basically pauses everything.\n *\n * see uiDemoComposites for an example\n */\nexport class UI512CompModalDialog extends UI512CompBase {\n    compositeType = 'modaldialog';\n    dlgType = UI512CompStdDialogType.Answer;\n    labelText = '';\n    btnLabels = ['', '', ''];\n    redirect: O<TemporarilyRedirectForModal>;\n    aboutToClose = false;\n    chosen = UI512CompStdDialogResult.NotChosen;\n\n    /* caller can provide rectangle of a button that, if clicked on,\n    exits out of the dialog */\n    cancelBtnBounds: number[][] = [];\n\n    /* we normally mute all events, since it is modal. this callback\n    lets a mouseup event through. */\n    cbOnMouseUp: O<(btn: number) => void>;\n\n    /* provide default text */\n    providedText = '';\n\n    /* result text the user typed in */\n    resultText: O<string>;\n\n    /* in case dialog was re-used */\n    create(pr: UI512Presenter, app: UI512Application) {\n        this.aboutToClose = false;\n        super.create(pr, app);\n    }\n\n    /**\n     * \"answer\", like an alert() box\n     */\n    standardAnswer(\n        pr: UI512Presenter,\n        app: UI512Application,\n        prompt: string,\n        fnOnResult?: (n: number) => void,\n        choice1 = '',\n        choice2 = '',\n        choice3 = ''\n    ) {\n        fnOnResult = fnOnResult ?? (() => {});\n        this.dlgType = UI512CompStdDialogType.Answer;\n        this.btnLabels = [choice1, choice2, choice3];\n        this.labelText = prompt;\n        this.resultText = '';\n        this.create(pr, app);\n        this.showStandardModalDialog(pr, app, fnOnResult);\n    }\n\n    /**\n     * \"ask\", like an input() box\n     */\n    standardAsk(\n        pr: UI512Presenter,\n        app: UI512Application,\n        prompt: string,\n        defText: string,\n        fnOnResult: (ret: O<string>, n: number) => void\n    ) {\n        this.dlgType = UI512CompStdDialogType.Ask;\n        this.providedText = defText;\n        this.resultText = '';\n        this.btnLabels = [lng('lngOK'), lng('lngCancel'), ''];\n        this.labelText = prompt;\n        this.create(pr, app);\n        let cb = (n: number) => {\n            fnOnResult(n === 0 ? this.resultText : undefined, n);\n        };\n\n        this.showStandardModalDialog(pr, app, cb);\n    }\n\n    /**\n     * draw button in the dialog\n     */\n    protected drawBtn(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        dims: number[],\n        n: number,\n        x: number,\n        y: number,\n        w: number,\n        h: number\n    ) {\n        if (this.btnLabels[n]) {\n            let btn = this.genBtn(app, grp, `choicebtn${n}`);\n            btn.set(\n                'style',\n                n === 0 ? UI512BtnStyle.OSDefault : UI512BtnStyle.OSStandard\n            );\n            btn.set('autohighlight', true);\n            btn.set('labeltext', this.btnLabels[n]);\n            btn.setDimensions(x + dims[0], y + dims[1], w, h);\n        }\n    }\n\n    /**\n     * draw an input field in the dialog\n     */\n    protected drawInputFld(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        dims: number[],\n        x: number,\n        y: number,\n        w: number,\n        h: number\n    ) {\n        let fld = this.genChild(app, grp, 'inputfld', UI512ElTextField);\n        fld.set('multiline', false);\n        fld.set('labelwrap', false);\n        fld.setDimensions(x + dims[0], y + dims[1], w, h);\n        fld.setFmTxt(FormattedText.newFromUnformatted(this.providedText));\n\n        /* select all */\n        fld.set('selcaret', 0);\n        fld.set('selend', fld.getFmTxt().len());\n\n        /* without this adjustment, the text appears too high. */\n        /* the real fix is to have vertically-aligned text, but since the product doesn't support */\n        /* a text-edit with vertically-aligned text, it's probably not the effort to write+test. */\n        fld.set('nudgey', 2);\n    }\n\n    /**\n     * draw UI\n     */\n    createSpecific(app: UI512Application) {\n        const marginX = this.dlgType === UI512CompStdDialogType.Ask ? 15 : 16;\n        const marginY = this.dlgType === UI512CompStdDialogType.Ask ? 13 : 16;\n        let grp = app.getGroup(this.grpId);\n        let bg = this.genBtn(app, grp, 'bgbtn');\n        bg.set('style', UI512BtnStyle.OSBoxModal);\n        bg.set('autohighlight', false);\n        let dims = this.getFullDimensions();\n        bg.setDimensions(dims[0], dims[1], dims[2], dims[3]);\n\n        /* draw prompt */\n        let prompt = this.genChild(app, grp, 'dlgprompt', UI512ElLabel);\n        prompt.set('labeltext', this.labelText);\n        prompt.set('labelwrap', true);\n        prompt.setDimensionsX1Y1(\n            dims[0] + marginX,\n            dims[1] + marginY,\n            dims[0] + dims[2] - marginX,\n            dims[1] + dims[3] - marginY\n        );\n\n        /* draw buttons */\n        this.btnLabels[0] =\n            this.btnLabels[0].length > 0 ? this.btnLabels[0] : lng('lngOK');\n        if (this.dlgType === UI512CompStdDialogType.Answer) {\n            this.drawBtn(app, grp, dims, 0, 230, 105, 99, 28);\n            this.drawBtn(app, grp, dims, 1, 126, 108, 91, 20);\n            this.drawBtn(app, grp, dims, 2, 19, 108, 91, 20);\n        } else if (this.dlgType === UI512CompStdDialogType.Ask) {\n            this.resultText = undefined;\n            this.drawBtn(app, grp, dims, 0, 174, 64, 69, 29);\n            this.drawBtn(app, grp, dims, 1, 252, 68, 68, 21);\n            this.drawInputFld(app, grp, dims, 15, 36, 305, 22);\n        } else {\n            assertTrue(false, '2o|dialog not yet supported');\n        }\n    }\n\n    /**\n     * show the modal dialog, and cancel all outgoing events until it is closed.\n     *\n     * we'll temporarily replace *all* current listeners with the default UI512Presenter listeners.\n     * because we replaced the idle event listener, we've basically frozen the app in its place.\n     */\n    showStandardModalDialog(\n        pr: UI512Presenter,\n        app: UI512Application,\n        fnGetResult: (n: number) => void\n    ) {\n        /* record the state, to be restored after dialog closes */\n        let savedFocus = pr.getCurrentFocus();\n        let savedCursor = UI512CursorAccess.getCursor();\n\n        pr.mouseDragStatus = MouseDragStatus.None;\n        pr.setCurrentFocus(\n            this.dlgType === UI512CompStdDialogType.Ask\n                ? this.getElId(`inputfld`)\n                : undefined\n        );\n        UI512CursorAccess.setCursor(UI512Cursors.arrow);\n        let whenComplete = () => {\n            /* restore listeners and run the callback */\n            if (this.redirect) {\n                this.redirect.restoreInteraction(app, this.grpId);\n            }\n\n            pr.setCurrentFocus(savedFocus);\n            let grp = app.getGroup(this.grpId);\n            let inputfld = grp.findEl(this.getElId(`inputfld`)) as UI512ElTextField;\n            this.resultText = inputfld ? inputfld.getFmTxt().toUnformatted() : undefined;\n            this.destroy(pr, app);\n            fnGetResult(this.chosen);\n            UI512CursorAccess.setCursor(savedCursor);\n        };\n\n        /* redirect events */\n        this.redirect = new TemporarilyRedirectForModal(whenComplete);\n        pr.tmpSuspend = this.redirect;\n        this.redirect.saveInteraction(app, this.grpId);\n        this.redirect.start(pr);\n        addDefaultListeners(pr.listeners);\n\n        /* add returnkey listener */\n        this.addReturnKeyListener(pr.listeners[UI512EventType.KeyDown], app);\n\n        /* if you clicked on a special 'cancel' rect, close the dialog */\n        pr.listenEvent(UI512EventType.MouseDown, (_, d: MouseDownEventDetails) => {\n            if (this.isCancelRect(d.mouseX, d.mouseY)) {\n                this.chosen = UI512CompStdDialogResult.Exit;\n                if (this.redirect) {\n                    this.redirect.completed = true;\n                }\n            }\n        });\n\n        /* set callback */\n        pr.listenEvent(UI512EventType.MouseUp, (_, d: MouseUpEventDetails) => {\n            this.chosen = this.getWhichBtnFromClick(d);\n            this.onClickChoiceBtn();\n        });\n    }\n\n    /* if you clicked in a button, run the callback and close the dialog */\n    onClickChoiceBtn() {\n        if (this.chosen !== UI512CompStdDialogResult.NotChosen) {\n            if (!this.children.length || this.aboutToClose) {\n                /* we're already closing */\n                return;\n            }\n\n            if (this.cbOnMouseUp) {\n                this.cbOnMouseUp(this.chosen);\n            }\n\n            if (this.redirect) {\n                this.redirect.completed = true;\n            }\n\n            this.aboutToClose = true;\n        }\n    }\n\n    /**\n     * press Enter to confirm. note: our event should take precedence\n     * over textediting.\n     */\n    addReturnKeyListener(cbs: FnEventCallback[], app: UI512Application) {\n        let onReturn = (pr: UI512PresenterInterface, d: KeyDownEventDetails) => {\n            let btnId: string;\n            let nChosen = UI512CompStdDialogResult.NotChosen;\n            if (\n                d.readableShortcut.toLowerCase() === 'enter' ||\n                d.readableShortcut.toLowerCase() === 'return'\n            ) {\n                btnId = `choicebtn0`;\n                nChosen = UI512CompStdDialogResult.Btn1;\n            } else if (\n                d.readableShortcut.toLowerCase() === 'escape' &&\n                this.btnLabels[1].toLowerCase() === lng('lngCancel').toLowerCase()\n            ) {\n                btnId = `choicebtn1`;\n                nChosen = UI512CompStdDialogResult.Btn2;\n            } else {\n                return;\n            }\n\n            d.setHandled();\n            let fn = () => {\n                this.chosen = nChosen;\n                this.onClickChoiceBtn();\n            };\n\n            let el = app.getEl(this.getElId(btnId));\n            el.set('highlightactive', true);\n            Util512Higher.syncToAsyncAfterPause(\n                fn,\n                200,\n                'HitEnter',\n                RespondToErr.ConsoleErrOnly\n            );\n        };\n\n        cbs.splice(0, 0, onReturn);\n    }\n\n    /**\n     * close the dialog\n     */\n    destroy(pr: UI512PresenterBase, app: UI512Application) {\n        this.cbOnMouseUp = undefined;\n        super.destroy(pr, app);\n    }\n\n    /**\n     * did you click on a special 'cancel' rect\n     */\n    protected isCancelRect(x: number, y: number) {\n        for (let cancelBtnBound of this.cancelBtnBounds) {\n            if (\n                RectUtils.hasPoint(\n                    x,\n                    y,\n                    cancelBtnBound[0],\n                    cancelBtnBound[1],\n                    cancelBtnBound[2],\n                    cancelBtnBound[3]\n                )\n            ) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * which button was clicked\n     */\n    protected getWhichBtnFromClick(d: MouseUpEventDetails) {\n        let theId = d.elClick ? d.elClick.id : '';\n        let userId = this.fromFullId(theId);\n        if (userId === 'choicebtn0') {\n            return UI512CompStdDialogResult.Btn1;\n        } else if (userId === 'choicebtn1') {\n            return UI512CompStdDialogResult.Btn2;\n        } else if (userId === 'choicebtn2') {\n            return UI512CompStdDialogResult.Btn3;\n        } else {\n            return UI512CompStdDialogResult.NotChosen;\n        }\n    }\n\n    /**\n     * get dimensions\n     */\n    getFullDimensions() {\n        let w: number;\n        let h: number;\n        let yratio: number;\n        if (this.dlgType === UI512CompStdDialogType.Answer) {\n            w = 344;\n            h = 156 - 11;\n            yratio = 0.275;\n        } else if (this.dlgType === UI512CompStdDialogType.Ask) {\n            w = 338;\n            h = 106;\n            yratio = 0.3;\n        } else {\n            checkThrow512(false, `2n|unknown dialog type ${this.dlgType}`);\n        }\n\n        const screenh = ScreenConsts.ScreenHeight;\n        const screenw = ScreenConsts.ScreenWidth;\n\n        /* centered horizontally */\n        let x = Math.floor((screenw - w) / 2);\n\n        /* partway down from the top */\n        let y = Math.floor(screenh * yratio);\n        return [x, y, w, h];\n    }\n}\n\n/**\n * redirect all events, including the onIdle event, in effect pausing everything\n */\nclass TemporarilyRedirectForModal extends TemporarilySuspendEvents {\n    completed = false;\n    savedMouseInteraction: { [key: string]: boolean } = {};\n    constructor(public callback: () => void) {\n        super();\n    }\n\n    /**\n     * record the mouse interaction for groups\n     */\n    saveInteraction(app: UI512Application, grpid: string) {\n        assertTrue(app.findGroup(grpid), '2m|current grp not found');\n        for (let grp of app.iterGrps()) {\n            if (grp.id !== grpid) {\n                this.savedMouseInteraction[grp.id] = grp.enableMouseInteraction;\n                grp.enableMouseInteraction = false;\n            }\n        }\n    }\n\n    /**\n     * restore the mouse interaction for groups\n     */\n    restoreInteraction(app: UI512Application, grpid: string) {\n        for (let grp of app.iterGrps()) {\n            if (this.savedMouseInteraction[grp.id] !== undefined) {\n                grp.enableMouseInteraction = this.savedMouseInteraction[grp.id];\n            }\n        }\n    }\n\n    /**\n     * when asked if we are ready to close the dialog\n     */\n    shouldRestore(ms: number) {\n        return this.completed;\n    }\n\n    /**\n     * called when dialog is closed\n     */\n    whenComplete() {\n        this.callback();\n    }\n}\n\n/**\n * which type of dialog\n */\nexport enum UI512CompStdDialogType {\n    Ask = 1,\n    Answer\n}\n\n/**\n * what button was clicked on\n */\nexport enum UI512CompStdDialogResult {\n    NotChosen = -1,\n    Btn1 = 0,\n    Btn2 = 1,\n    Btn3 = 2,\n    Exit = 3\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/composites/ui512Toolbox.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertWarn, ensureDefined } from './../utils/util512Assert';\n/* auto */ import { Util512 } from './../utils/util512';\n/* auto */ import { MouseUpEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { PalBorderDecorationConsts, UI512CompBase } from './ui512Composites';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a \"toolbox\"/tool pallete\n * to use this composite,\n * create an onMouseUp listener in your presenter\n * that forwards the event to this object's respondMouseUp\n *\n * see uiDemoComposites for an example.\n */\nexport class UI512CompToolbox extends UI512CompBase {\n    protected whichChosen: O<string>;\n    protected totalHeight = 0;\n    compositeType = 'toolbox';\n    iconGroupId = '';\n    items: [string, number][] = [];\n    hasCloseBtn = true;\n    iconH = 20;\n    callbackOnChange: O<(id: O<string>) => void>;\n\n    /**\n     * draw UI\n     */\n    createSpecific(app: UI512Application) {\n        Util512.freezeRecurse(this.items);\n        let grp = app.getGroup(this.grpId);\n        let headerHeight = this.drawWindowDecoration(\n            app,\n            new PalBorderDecorationConsts(),\n            this.hasCloseBtn\n        );\n\n        let curX = this.x;\n        let curY = this.y + headerHeight - 1;\n        let marginX = -1;\n        let marginY = -1;\n        for (let item of this.items) {\n            /* draw a button for each tool */\n            let el = this.genBtn(app, grp, 'choice##' + item[0]);\n            let thiswidth = this.widthOfIcon(item[0]);\n            el.set('icongroupid', this.iconGroupId);\n            el.set('iconnumber', item[1]);\n            el.setDimensions(curX, curY, thiswidth, this.iconH);\n\n            curX += thiswidth + marginX;\n            if (curX >= this.x + this.logicalWidth + marginX) {\n                /* we've gone too far to the right, make a new row */\n                curX = this.x;\n                curY += this.iconH + marginY;\n            }\n        }\n\n        this.totalHeight = curY + this.iconH;\n        this.whichChosen = this.items[0][0];\n        this.refreshHighlight(app);\n    }\n\n    /**\n     * returns short id of chosen tool\n     */\n    getWhich() {\n        return ensureDefined(this.whichChosen, '2u|this.whichChosen');\n    }\n\n    /**\n     * set the current tool\n     */\n    setWhich(app: UI512Application, subid: O<string>) {\n        this.whichChosen = subid;\n        this.refreshHighlight(app);\n    }\n\n    /**\n     * width in pixels of each tool part\n     */\n    widthOfIcon(iconid: string) {\n        return Math.floor(this.logicalWidth / this.items.length);\n    }\n\n    /**\n     * onMouseUp, see if one of our tools was clicked\n     */\n    respondMouseUp(app: UI512Application, d: MouseUpEventDetails) {\n        let grp = app.getGroup(this.grpId);\n        if (!grp || !grp.getVisible()) {\n            /* optimization for a hidden toolbox */\n            return;\n        }\n\n        if (this.children.length && d.elClick) {\n            let theId = d.elClick.id;\n            let userId = this.fromFullId(theId);\n            if (userId && userId.startsWith('choice##')) {\n                userId = userId.substr('choice##'.length);\n                let found = this.items.filter(o => o[0] === userId);\n                if (found.length) {\n                    /* it was one of ours, highlight it */\n                    let wasChosenBefore = this.whichChosen;\n                    this.whichChosen = found[0][0];\n                    this.refreshHighlight(app);\n                    if (this.callbackOnChange && wasChosenBefore !== this.whichChosen) {\n                        this.callbackOnChange(this.whichChosen);\n                    }\n                } else {\n                    assertWarn(false, `2t|did not find ${userId} in ${this.idPrefix}`);\n                }\n            }\n        }\n    }\n\n    /**\n     * refresh our UI as to which tool is active\n     */\n    protected refreshHighlight(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        let lookfor = this.whichChosen;\n        for (let item of this.items) {\n            let id = this.getElId('choice##' + item[0]);\n            let el = grp.getEl(id);\n            el.set('highlightactive', item[0] === lookfor);\n            el.set('autohighlight', item[0] !== lookfor);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawBorders.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete } from './../utils/util512Higher';\n/* auto */ import { assertEq } from './../utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* go straight to these, which are passed to the Canvas context object */\nconst cW = 'white';\nconst cB = 'black';\n\n/**\n * draw borders, like buttons with shadows, window headers, and rounded rectangles\n * all loops completely unrolled, this code was generated by my Python script\n * border-img-to-js.py, which converts a png image to the code here.\n */\nexport class UI512ViewDrawBorders {\n    didFallbackToSimpleRect = false;\n    constructor(\n        public canvas: CanvasWrapper,\n        public bx: number,\n        public by: number,\n        public w: number,\n        public h: number,\n        public complete: RenderComplete\n    ) {}\n\n    /**\n     * a wrapper around fillRect\n     */\n    dr(x: number, y: number, w: number, h: number, color: string) {\n        /* used to be fillRect, switch to fillRectUnchecked for better perf */\n        this.canvas.fillRectUnchecked(x, y, w, h, color);\n    }\n\n    /**\n     * in original os, the borders would scale intelligently for very small boxes\n     * we don't yet support this, we just fall back to a plain rectangle\n     */\n    fallbackToSimpleRect(highlight: boolean) {\n        if (highlight) {\n            this.drawboxthinborderclicked();\n        } else {\n            this.drawboxthinborder();\n        }\n\n        this.didFallbackToSimpleRect = true;\n    }\n\n    /* BEGIN:GENERATED CODE (get-ui-borders.py) */\n    /* generated code, any changes past this point will be lost: --------------- */\n\n    drawosboxmodal() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (6 + 6) + 1;\n        if (w < 13) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 12) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 12) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (106 - 95);\n        y = by;\n        this.dr(bx + 0, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 0, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 0, y, 1, 6, cB);\n        y += 6;\n\n        y = by;\n        this.dr(bx + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 1, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 1, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 1, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 1, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 2, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 2, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 2, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 3, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 3, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 3, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 3, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 3, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 4, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 4, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 5, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 5, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 5, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 6, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 6, y, streX, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, streX, 2, cB);\n        y += 2;\n        this.dr(bx + 5, by + 5, streX, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 6, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 6, y, streX, 2, cB);\n        y += 2;\n        this.dr(bx + 6, y, streX, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, streX, 1, cB);\n        y += 1;\n\n        /* drawing right side */\n        streY = h - (106 - 95);\n        y = by;\n        this.dr(bx + w - 6 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 6 + 0, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 0, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 6 + 0, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 6 + 0, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 6 + 0, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 0, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 6 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 6 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 6 + 1, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 1, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 6 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 1, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 6 + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 6 + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 6 + 2, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 2, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 6 + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 6 + 2, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 6 + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 6 + 3, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 6 + 3, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 3, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 6 + 3, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 6 + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 6 + 4, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 6 + 4, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 4, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 6 + 4, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 6 + 5, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 6 + 5, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + w - 6 + 5, y, 1, 6, cB);\n        y += 6;\n\n        return true;\n    }\n\n    /* osboxshadow.png */\n    drawosboxshadow() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (2 + 3) + 1;\n        if (w < 6) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 5) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 5) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (44 - 40);\n        y = by;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 0, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + 0, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr(bx + 0, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 1, by + 1, 1, streY, cW);\n        y = by + 1 + streY;\n        this.dr(bx + 1, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 2, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 1, by + 1, streX, streY, cW);\n        y = by + 1 + streY;\n        this.dr(bx + 2, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 2, y, streX, 2, cB);\n        y += 2;\n\n        /* drawing right side */\n        streY = h - (44 - 40);\n        y = by;\n        this.dr(bx + w - 3 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 3 + 0, by + 1, 1, streY, cW);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 3 + 0, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        this.dr(bx + w - 3 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 3 + 1, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 1, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 3) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 3 + 2, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 2, y, 1, 3, cB);\n        y += 3;\n\n        return true;\n    }\n\n    /* osboxshadowclicked.png */\n    drawosboxshadowclicked() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (2 + 3) + 1;\n        if (w < 6) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 4) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 4) {\n            return this.fallbackToSimpleRect(true);\n        }\n\n        /* drawing left side */\n        streY = h - (44 - 41);\n        y = by;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 0, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 1, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 2, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 1, by + 1, streX, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + 2, y, streX, 2, cB);\n        y += 2;\n\n        /* drawing right side */\n        streY = h - (44 - 41);\n        y = by;\n        this.dr(bx + w - 3 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 3 + 0, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 0, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        this.dr(bx + w - 3 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 3 + 1, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 1, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 3) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 3 + 2, by + 1, 1, streY, cB);\n        y = by + 1 + streY;\n        this.dr(bx + w - 3 + 2, y, 1, 2, cB);\n        y += 2;\n\n        return true;\n    }\n\n    /* osbtn.png */\n    drawosbtn() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (5 + 5) + 1;\n        if (w < 11) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 8) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 8) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (21 - 14);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 0, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + 1, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr(bx + 1, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 2, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 3, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 3, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 4, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 5, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 5, y, streX, 2, cW);\n        y += 2;\n        this.dr(bx + 4, by + 3, streX, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + 5, y, streX, 3, cW);\n        y += 3;\n        this.dr(bx + 5, y, streX, 1, cB);\n        y += 1;\n\n        /* drawing right side */\n        streY = h - (21 - 14);\n        y = by;\n        this.dr(bx + w - 5 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 5 + 0, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 5 + 0, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 0, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 5 + 0, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + w - 5 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 5 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 5 + 1, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 1, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 5 + 1, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 5 + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 5 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 5 + 2, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 5 + 2, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 5) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 5 + 3, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 5 + 3, by + 3, 1, streY, cW);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 3, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 5 + 3, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr((bx + w - 5) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 5 + 4, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 4, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 5) + 4, y, 1, 3, cT) */\n        y += 3;\n\n        return true;\n    }\n\n    /* osbtnclicked.png */\n    drawosbtnclicked() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (5 + 5) + 1;\n        if (w < 11) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 8) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 8) {\n            return this.fallbackToSimpleRect(true);\n        }\n\n        /* drawing left side */\n        streY = h - (21 - 14);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 0, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 1, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 1, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 2, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 2, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 3, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 3, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 3, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 4, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 4, y, 1, 4, cB);\n        y += 4;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 5, y, streX, 3, cB);\n        y += 3;\n        this.dr(bx + 4, by + 3, streX, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + 5, y, streX, 4, cB);\n        y += 4;\n\n        /* drawing right side */\n        streY = h - (21 - 14);\n        y = by;\n        this.dr(bx + w - 5 + 0, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 5 + 0, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 0, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        this.dr(bx + w - 5 + 1, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 5 + 1, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 1, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 5 + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 5 + 2, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 2, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 5) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 5 + 3, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 5 + 3, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 3, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 5) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 5) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 5 + 4, by + 3, 1, streY, cB);\n        y = by + 3 + streY;\n        this.dr(bx + w - 5 + 4, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 5) + 4, y, 1, 3, cT) */\n        y += 3;\n\n        return true;\n    }\n\n    /* osdefaultbtn.png */\n    drawosdefaultbtn() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (8 + 8) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 16) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 16) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (29 - 14);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + 0, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 0, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 0, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 1, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 1, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 1, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 2, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 2, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 2, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 3, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 3, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 3, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 5, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 5, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 6, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 6, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 6, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 6, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 6, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 7, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 7, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 7, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 7, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 7, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 7, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 7, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 7, y, 1, 3, cB);\n        y += 3;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 8, y, streX, 3, cB);\n        y += 3;\n        this.dr(bx + 8, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 8, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 8, y, streX, 2, cW);\n        y += 2;\n        this.dr(bx + 7, by + 7, streX, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 8, y, streX, 3, cW);\n        y += 3;\n        this.dr(bx + 8, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 8, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 8, y, streX, 3, cB);\n        y += 3;\n\n        /* drawing right side */\n        streY = h - (29 - 14);\n        y = by;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 0, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + w - 8 + 1, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 1, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 1, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 1, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + w - 8 + 2, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 8 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 2, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 2, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 8 + 3, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 8) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 8 + 4, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 8 + 4, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 4, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 4, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 8) + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 5, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 8 + 5, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 8 + 5, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 5, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr((bx + w - 8) + 5, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 6, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 8 + 6, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 8 + 6, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 6, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 8) + 6, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 7, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + w - 8 + 7, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 7, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 7, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 8) + 7, y, 1, 5, cT) */\n        y += 5;\n\n        return true;\n    }\n\n    /* osdefaultbtnclicked.png */\n    drawosdefaultbtnclicked() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (8 + 8) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 16) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 16) {\n            return this.fallbackToSimpleRect(true);\n        }\n\n        /* drawing left side */\n        streY = h - (29 - 14);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + 0, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 0, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 0, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 1, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 1, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 1, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 2, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 2, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 2, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 3, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 3, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + 3, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 5, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 5, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 5, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 5, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 6, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 6, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 6, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 6, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 6, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 7, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 7, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 7, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 7, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 7, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 7, y, 1, 3, cB);\n        y += 3;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 8, y, streX, 3, cB);\n        y += 3;\n        this.dr(bx + 8, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 8, y, streX, 3, cB);\n        y += 3;\n        this.dr(bx + 7, by + 7, streX, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + 8, y, streX, 4, cB);\n        y += 4;\n        this.dr(bx + 8, y, streX, 1, cW);\n        y += 1;\n        this.dr(bx + 8, y, streX, 3, cB);\n        y += 3;\n\n        /* drawing right side */\n        streY = h - (29 - 14);\n        y = by;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 0, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 0, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 8 + 0, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 0, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + w - 8 + 1, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 1, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 1, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 1, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 1, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        this.dr(bx + w - 8 + 2, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 8 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 2, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 2, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 2, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 2, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 2, y, 1, 4, cB);\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 8 + 3, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 8 + 3, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 8) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 8 + 4, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 8 + 4, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 8 + 4, by + 7, 1, streY, cW);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 8 + 4, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 8) + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 5, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 8 + 5, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 8 + 5, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 5, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr((bx + w - 8) + 5, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 6, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 8 + 6, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 8 + 6, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 6, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 8) + 6, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 8) + 7, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + w - 8 + 7, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 8 + 7, by + 7, 1, streY, cB);\n        y = by + 7 + streY;\n        this.dr(bx + w - 8 + 7, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 8) + 7, y, 1, 5, cT) */\n        y += 5;\n\n        return true;\n    }\n\n    /* vpcbtn.png */\n    drawvpcbtn() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (9 + 7) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 13) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 14) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (41 - 29);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + 0, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 1, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 2, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 2, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 3, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 3, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 4, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 4, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 4, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 5, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 5, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 5, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 6, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 6, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 6, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 6, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 7, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 7, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 7, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 7, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        this.dr(bx + 8, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 8, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 8, by + 5, 1, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 8, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 8, y, 1, 2, cB);\n        y += 2;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 9, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 9, y, streX, 4, cW);\n        y += 4;\n        this.dr(bx + 8, by + 5, streX, streY, cW);\n        y = by + 5 + streY;\n        this.dr(bx + 9, y, streX, 5, cW);\n        y += 5;\n        this.dr(bx + 9, y, streX, 2, cB);\n        y += 2;\n\n        /* drawing right side */\n        streY = h - (41 - 28);\n        y = by;\n        this.dr(bx + w - 7 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 0, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 7 + 0, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 0, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 7 + 0, y, 1, 2, cB);\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 1, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 1, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 1, y, 1, 3, cB);\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 2, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 2, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 2, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 7 + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 7 + 3, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 7 + 3, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 7 + 4, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 7 + 4, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 7 + 4, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 4, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 7 + 4, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + w - 7 + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 7 + 5, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 5, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + w - 7 + 6, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 6, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 5, cT) */\n        y += 5;\n\n        return true;\n    }\n\n    /* vpcbtnclicked.png */\n    drawvpcbtnclicked() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (9 + 7) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 13) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 13) {\n            return this.fallbackToSimpleRect(true);\n        }\n\n        /* drawing left side */\n        streY = h - (41 - 29);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 5, cT) */\n        y += 5;\n        this.dr(bx + 0, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 1, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 2, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 2, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 2, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 3, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 3, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 4, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 4, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 5, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 5, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 5, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 6, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 6, y, 1, 7, cB);\n        y += 7;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 7, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 7, y, 1, 7, cB);\n        y += 7;\n\n        y = by;\n        this.dr(bx + 8, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 8, by + 5, 1, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 8, y, 1, 7, cB);\n        y += 7;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 9, y, streX, 5, cB);\n        y += 5;\n        this.dr(bx + 8, by + 5, streX, streY, cB);\n        y = by + 5 + streY;\n        this.dr(bx + 9, y, streX, 7, cB);\n        y += 7;\n\n        /* drawing right side */\n        streY = h - (41 - 29);\n        y = by;\n        this.dr(bx + w - 7 + 0, y, 1, 6, cB);\n        y += 6;\n        this.dr(bx + w - 7 + 0, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 0, y, 1, 6, cB);\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 7 + 1, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 1, y, 1, 6, cB);\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 7 + 2, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 2, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 7 + 3, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 7 + 3, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 7 + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 7 + 4, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 4, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + w - 7 + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 7 + 5, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 5, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + w - 7 + 6, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 6, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 5, cT) */\n        y += 5;\n\n        return true;\n    }\n\n    /* vpcroundrect.png */\n    drawvpcroundrect() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (9 + 7) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 14) {\n            return this.fallbackToSimpleRect(false);\n        }\n        if (h < 14) {\n            return this.fallbackToSimpleRect(false);\n        }\n\n        /* drawing left side */\n        streY = h - (40 - 27);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + 0, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 1, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 2, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + 2, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 2, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 2, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + 3, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 3, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 3, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 4, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 4, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 4, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 4, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 5, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + 5, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 5, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 5, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 6, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 6, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 6, y, 1, 6, cW);\n        y += 6;\n        this.dr(bx + 6, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 7, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 7, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 7, y, 1, 6, cW);\n        y += 6;\n        this.dr(bx + 7, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        this.dr(bx + 8, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + 8, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + 8, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 8, y, 1, 6, cW);\n        y += 6;\n        this.dr(bx + 8, y, 1, 1, cB);\n        y += 1;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 9, y, streX, 1, cB);\n        y += 1;\n        this.dr(bx + 9, y, streX, 5, cW);\n        y += 5;\n        this.dr(bx + 8, by + 6, streX, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + 9, y, streX, 6, cW);\n        y += 6;\n        this.dr(bx + 9, y, streX, 1, cB);\n        y += 1;\n\n        /* drawing right side */\n        streY = h - (40 - 27);\n        y = by;\n        this.dr(bx + w - 7 + 0, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 0, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 7 + 0, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 0, y, 1, 6, cW);\n        y += 6;\n        this.dr(bx + w - 7 + 0, y, 1, 1, cB);\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 1, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 1, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 7 + 1, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 2, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 2, y, 1, 5, cW);\n        y += 5;\n        this.dr(bx + w - 7 + 2, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 7 + 3, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 3, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 7 + 3, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 3, y, 1, 4, cW);\n        y += 4;\n        this.dr(bx + w - 7 + 3, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 7 + 4, y, 1, 1, cB);\n        y += 1;\n        this.dr(bx + w - 7 + 4, y, 1, 2, cW);\n        y += 2;\n        this.dr(bx + w - 7 + 4, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 4, y, 1, 3, cW);\n        y += 3;\n        this.dr(bx + w - 7 + 4, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + w - 7 + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 7 + 5, by + 6, 1, streY, cW);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 5, y, 1, 1, cW);\n        y += 1;\n        this.dr(bx + w - 7 + 5, y, 1, 2, cB);\n        y += 2;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + w - 7 + 6, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 6, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n\n        return true;\n    }\n\n    /* vpcroundrectclicked.png */\n    drawvpcroundrectclicked() {\n        const w = this.w;\n        const h = this.h;\n        const bx = this.bx;\n        const by = this.by;\n        let y = 0;\n        let streY = 0;\n        const streX = w - (9 + 7) + 1;\n        if (w < 17) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 14) {\n            return this.fallbackToSimpleRect(true);\n        }\n        if (h < 14) {\n            return this.fallbackToSimpleRect(true);\n        }\n\n        /* drawing left side */\n        streY = h - (40 - 27);\n        y = by;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + 0, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 0, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr(bx + 0, y, 1, 6, cT) */\n        y += 6;\n\n        y = by;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + 1, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + 1, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 1, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr(bx + 1, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + 2, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + 2, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 2, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr(bx + 2, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + 3, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + 3, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr(bx + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 4, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 4, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 4, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 4, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + 5, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + 5, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 5, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr(bx + 5, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        this.dr(bx + 6, y, 1, 6, cB);\n        y += 6;\n        this.dr(bx + 6, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 6, y, 1, 7, cB);\n        y += 7;\n\n        y = by;\n        this.dr(bx + 7, y, 1, 6, cB);\n        y += 6;\n        this.dr(bx + 7, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 7, y, 1, 7, cB);\n        y += 7;\n\n        y = by;\n        this.dr(bx + 8, y, 1, 6, cB);\n        y += 6;\n        this.dr(bx + 8, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 8, y, 1, 7, cB);\n        y += 7;\n\n        /* drawing middle */\n        y = by;\n        this.dr(bx + 9, y, streX, 6, cB);\n        y += 6;\n        this.dr(bx + 8, by + 6, streX, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + 9, y, streX, 7, cB);\n        y += 7;\n\n        /* drawing right side */\n        streY = h - (40 - 27);\n        y = by;\n        this.dr(bx + w - 7 + 0, y, 1, 6, cB);\n        y += 6;\n        this.dr(bx + w - 7 + 0, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 0, y, 1, 7, cB);\n        y += 7;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 1, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 7 + 1, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 1, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr((bx + w - 7) + 1, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n        this.dr(bx + w - 7 + 2, y, 1, 5, cB);\n        y += 5;\n        this.dr(bx + w - 7 + 2, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 2, y, 1, 6, cB);\n        y += 6;\n        /* (transparent) this.dr((bx + w - 7) + 2, y, 1, 1, cT) */\n        y += 1;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n        this.dr(bx + w - 7 + 3, y, 1, 4, cB);\n        y += 4;\n        this.dr(bx + w - 7 + 3, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 3, y, 1, 5, cB);\n        y += 5;\n        /* (transparent) this.dr((bx + w - 7) + 3, y, 1, 2, cT) */\n        y += 2;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n        this.dr(bx + w - 7 + 4, y, 1, 3, cB);\n        y += 3;\n        this.dr(bx + w - 7 + 4, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 4, y, 1, 4, cB);\n        y += 4;\n        /* (transparent) this.dr((bx + w - 7) + 4, y, 1, 3, cT) */\n        y += 3;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n        this.dr(bx + w - 7 + 5, y, 1, 2, cB);\n        y += 2;\n        this.dr(bx + w - 7 + 5, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 5, y, 1, 3, cB);\n        y += 3;\n        /* (transparent) this.dr((bx + w - 7) + 5, y, 1, 4, cT) */\n        y += 4;\n\n        y = by;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n        this.dr(bx + w - 7 + 6, by + 6, 1, streY, cB);\n        y = by + 6 + streY;\n        this.dr(bx + w - 7 + 6, y, 1, 1, cB);\n        y += 1;\n        /* (transparent) this.dr((bx + w - 7) + 6, y, 1, 6, cT) */\n        y += 6;\n\n        return true;\n    }\n    /* generated code, any changes above this point will be lost: --------------- */\n\n    drawboxthinborder() {\n        if (this.w > 0 && this.h > 0) {\n            let realbordersize = 1;\n\n            /* clear it */\n            this.dr(this.bx, this.by, this.w, this.h, cW);\n\n            /* draw borders */\n            this.dr(this.bx, this.by, this.w, realbordersize, cB);\n            this.dr(this.bx, this.by, realbordersize, this.h, cB);\n            this.dr(\n                this.bx,\n                this.by + this.h - realbordersize,\n                this.w,\n                realbordersize,\n                cB\n            );\n            this.dr(\n                this.bx + this.w - realbordersize,\n                this.by,\n                realbordersize,\n                this.h,\n                cB\n            );\n        }\n    }\n\n    drawboxthinborderclicked() {\n        this.dr(this.bx, this.by, this.w, this.h, cB);\n    }\n\n    drawboxnoborder() {\n        this.dr(this.bx, this.by, this.w, this.h, cW);\n    }\n\n    drawboxnoborderclicked() {\n        this.dr(this.bx, this.by, this.w, this.h, cW);\n    }\n\n    drawCorners(corner: string) {\n        assertEq(5, this.w, '3D|');\n        assertEq(5, this.h, '3C|');\n        if (corner === 'nw') {\n            this.dr(this.bx, this.by + 0, 5, 1, cB);\n            this.dr(this.bx, this.by + 1, 3, 1, cB);\n            this.dr(this.bx, this.by + 2, 2, 1, cB);\n            this.dr(this.bx, this.by + 3, 1, 1, cB);\n            this.dr(this.bx, this.by + 4, 1, 1, cB);\n        } else if (corner === 'sw') {\n            this.dr(this.bx, this.by + 0, 1, 1, cB);\n            this.dr(this.bx, this.by + 1, 1, 1, cB);\n            this.dr(this.bx, this.by + 2, 2, 1, cB);\n            this.dr(this.bx, this.by + 3, 3, 1, cB);\n            this.dr(this.bx, this.by + 4, 5, 1, cB);\n        } else if (corner === 'ne') {\n            this.dr(this.bx + 0, this.by + 0, 5, 1, cB);\n            this.dr(this.bx + 2, this.by + 1, 3, 1, cB);\n            this.dr(this.bx + 3, this.by + 2, 2, 1, cB);\n            this.dr(this.bx + 4, this.by + 3, 1, 1, cB);\n            this.dr(this.bx + 4, this.by + 4, 1, 1, cB);\n        } else if (corner === 'se') {\n            this.dr(this.bx + 4, this.by + 0, 1, 1, cB);\n            this.dr(this.bx + 4, this.by + 1, 1, 1, cB);\n            this.dr(this.bx + 3, this.by + 2, 2, 1, cB);\n            this.dr(this.bx + 2, this.by + 3, 3, 1, cB);\n            this.dr(this.bx + 0, this.by + 4, 5, 1, cB);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawIconClasses.ts",
    "content": "\n/* auto */ import { CanvasWrapper, DrawableImage } from './../utils/utilsCanvasDraw';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * arguments for drawing icon into a box\n */\nexport class IconInfo {\n    adjustX = 0;\n    adjustY = 0;\n    adjustWidth = 0;\n    adjustHeight = 0;\n    adjustSrcX = 0;\n    adjustSrcY = 0;\n    centered = true;\n    constructor(public iconGroup: string, public iconNumber: number) {}\n}\n\n/**\n * drawing an icon into box\n */\nexport class RenderIcon {\n    constructor(public set: RenderIconGroup, public srcRect: number[]) {}\n    drawIntoBox(\n        canvas: CanvasWrapper,\n        info: IconInfo,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number\n    ) {\n        let srcRect = [\n            this.srcRect[0] + info.adjustSrcX,\n            this.srcRect[1] + info.adjustSrcY,\n            this.srcRect[2] + info.adjustWidth - info.adjustSrcX,\n            this.srcRect[3] + info.adjustHeight - info.adjustSrcY\n        ];\n\n        if (info.centered) {\n            canvas.drawFromImageCentered(\n                this.set.image,\n                srcRect[0],\n                srcRect[1],\n                srcRect[2],\n                srcRect[3],\n                info.adjustX,\n                info.adjustY,\n                boxX0,\n                boxY0,\n                boxW,\n                boxH\n            );\n        } else {\n            canvas.drawFromImage(\n                this.set.image,\n                srcRect[0],\n                srcRect[1],\n                srcRect[2],\n                srcRect[3],\n                boxX0 + info.adjustX,\n                boxY0 + info.adjustY,\n                boxX0,\n                boxY0,\n                boxW,\n                boxH\n            );\n        }\n    }\n\n    drawAtLocationAndClipFromBox(\n        canvas: CanvasWrapper,\n        info: IconInfo,\n        destX: number,\n        destY: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number\n    ) {\n        let srcRect = [\n            this.srcRect[0] + info.adjustSrcX,\n            this.srcRect[1] + info.adjustSrcY,\n            this.srcRect[2] + info.adjustWidth - info.adjustSrcX,\n            this.srcRect[3] + info.adjustHeight - info.adjustSrcY\n        ];\n        canvas.drawFromImage(\n            this.set.image,\n            srcRect[0],\n            srcRect[1],\n            srcRect[2],\n            srcRect[3],\n            destX + info.adjustX,\n            destY + info.adjustY,\n            boxX0,\n            boxY0,\n            boxW,\n            boxH\n        );\n    }\n}\n\n/**\n * a group of cached icons.\n * each group is one .png file on the server.\n */\nexport class RenderIconGroup {\n    image: DrawableImage;\n    loadedImage = false;\n    customDims: { [key: number]: number[] } = {};\n    customOffsets: { [key: number]: number[] } = {};\n    totalIcons = 0;\n    gridSize = 1;\n    gridSpacing = 1;\n    gridWidth = 1;\n\n    /* a map from group id to IconGroupInfo */\n    static cachedGridInfo: { [groupId: string]: IconGroupInfo } = {};\n\n    /* initialize from the cached IconGroupInfo information */\n    constructor(public readonly groupId: string) {\n        let info = RenderIconGroup.cachedGridInfo[groupId];\n        assertTrue(info, '3I|unknown icon set', groupId);\n        if (info) {\n            this.customDims = info.customDims;\n            this.customOffsets = info.customOffsets;\n            this.gridSize = info.gridSize;\n            this.gridSpacing = info.gridSpacing;\n            this.gridWidth = info.gridWidth;\n            this.totalIcons = info.totalIcons;\n        }\n    }\n\n    /* eslint no-mixed-operators: 0 */\n\n    /* get source rectangle */\n    getRectangle(iconNumber: number) {\n        if (iconNumber < 0 || iconNumber >= this.totalIcons) {\n            return undefined;\n        }\n\n        /* srcX and srcY can either be manually set in customOffsets,\n        or computed assuming that icons are laid out in a grid */\n        let offsets = this.customOffsets[iconNumber];\n        if (offsets === undefined) {\n            let gridY = Math.trunc(iconNumber / this.gridWidth);\n            let gridX = iconNumber - gridY * this.gridWidth;\n            offsets = [\n                gridX * this.gridSize + (gridX + 1) * this.gridSpacing,\n                gridY * this.gridSize + (gridY + 1) * this.gridSpacing\n            ];\n        }\n\n        /* width and height can either be manually set in customDims,\n        or computed assuming that icons are laid out in a grid */\n        let dims = this.customDims[iconNumber];\n        if (dims === undefined) {\n            dims = [this.gridSize, this.gridSize];\n        }\n\n        return [offsets[0], offsets[1], dims[0], dims[1]];\n    }\n\n    /* get icon, throws if not found */\n    getIcon(iconNumber: number): RenderIcon {\n        let rect = this.getRectangle(iconNumber);\n        return new RenderIcon(\n            this,\n            ensureDefined(rect, '3G|could not load icon number', iconNumber, this.groupId)\n        );\n    }\n\n    /* get icon, return undefined if not found  */\n    static lookupRectangle(iconGroupId: string, iconNumber: number): O<number[]> {\n        let group = new RenderIconGroup(iconGroupId);\n        return group.getRectangle(iconNumber);\n    }\n}\n\n/**\n * by default, icons are arranged in a grid.\n * you can use customDims and customOffsets to specify arbitrary positions for the icons.\n */\nexport class IconGroupInfo {\n    customDims: { [key: number]: number[] } = {};\n    customOffsets: { [key: number]: number[] } = {};\n    totalIcons = 0;\n    gridSize = 1;\n    gridSpacing = 1;\n    gridWidth = 1;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawIconManager.ts",
    "content": "\n/* auto */ import { UI512IsDrawIconInterface, Util512Higher } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { RenderIcon, RenderIconGroup } from './ui512DrawIconClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * main icon class.\n * give it a group id and number,\n * and get back a RenderIcon that can be drawn on a canvas.\n */\nexport class UI512IconManager implements UI512IsDrawIconInterface {\n    cachedIconGroups: { [key: string]: RenderIconGroup } = {};\n\n    /**\n     * find an icon by id and number\n     */\n    findIcon(iconGroupId: string, iconNumber: number): O<RenderIcon> {\n        let cached = this.cachedIconGroups[iconGroupId];\n        if (cached === undefined) {\n            /* case 1) we haven't started loading this group yet. */\n            assertTrue(\n                iconGroupId.match(/^[0-9A-Za-z_]+$/),\n                `3F|icongroupid must be alphanumeric but got ${iconGroupId}`\n            );\n            let iconGroup = new RenderIconGroup(iconGroupId);\n            this.cachedIconGroups[iconGroupId] = iconGroup;\n            let url = `/resources03a/images/${iconGroupId}.png`;\n            iconGroup.image = new Image();\n            Util512Higher.beginLoadImage(url, iconGroup.image, () => {\n                iconGroup.loadedImage = true;\n            });\n\n            return undefined;\n        } else {\n            if (!cached.loadedImage) {\n                /* case 2) we need to wait for the icon group to load. */\n                return undefined;\n            } else {\n                /* case 3) it's loaded and ready to use */\n                return cached.getIcon(iconNumber);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawPaintDispatch.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../utils/utilsKeypressHelpers';\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../utils/util512Assert';\n/* auto */ import { Util512, assertEq } from './../utils/util512';\n/* auto */ import { clrWhite, needsPatternSupport, simplifyPattern } from './ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvDataAndPatterns } from './ui512DrawPainter';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * painted shapes supported\n */\nexport enum UI512PaintDispatchShapes {\n    __isUI512Enum = 1,\n    SmearPencil,\n    SmearRectangle,\n    SmearSmallBrush,\n    SmearSpraycan,\n    ShapeLine,\n    ShapeRectangle,\n    ShapeEllipse,\n    ShapeRoundRect,\n    ShapeCurve,\n    Bucket,\n    IrregularPolygon\n}\n\n/**\n * high-level interface for painting a shape on a canvas\n */\nexport class UI512PaintDispatch {\n    mods: ModifierKeys;\n    cardId: string;\n    constructor(\n        public shape: UI512PaintDispatchShapes,\n        public xPts: number[],\n        public yPts: number[],\n        public color: number,\n        public fillColor: number,\n        public isFilled = true,\n        public lineSize = 1\n    ) {}\n\n    /**\n     * get arguments based on flags\n     */\n    static fromMemoryOpts(\n        shape: UI512PaintDispatchShapes,\n        isErase: boolean,\n        fromOptsPattern: string,\n        fromOptsFillcolor: number,\n        fromOptsLineColor: number,\n        fromOptsWide: boolean\n    ) {\n        let fill = fromOptsFillcolor;\n        let isFilled = fromOptsFillcolor !== -1;\n        if (shape === UI512PaintDispatchShapes.Bucket) {\n            let pattern = fromOptsPattern;\n            isFilled = true;\n            fill = 0;\n            if (pattern.startsWith('pattern')) {\n                let npattern = Util512.parseInt(pattern.substr('pattern'.length));\n                fill = npattern ?? 0;\n            }\n        }\n\n        let ret = new UI512PaintDispatch(\n            shape,\n            [],\n            [],\n            fromOptsLineColor,\n            fill,\n            isFilled,\n            fromOptsWide ? 5 : 1\n        );\n        if (isErase) {\n            ret.color = clrWhite;\n            ret.fillColor = clrWhite;\n            ret.isFilled = true;\n        }\n\n        return ret;\n    }\n\n    /**\n     * apply paint onto canvas\n     */\n    static go(args: UI512PaintDispatch, painter: UI512Painter) {\n        let color: number = args.color;\n        let fill: O<number> = args.isFilled ? simplifyPattern(args.fillColor) : undefined;\n        if (args.shape !== UI512PaintDispatchShapes.Bucket) {\n            assertTrue(\n                !needsPatternSupport(color) && !needsPatternSupport(fill),\n                'I=|not yet implemented (currently kinda slow when tested)'\n            );\n        }\n\n        let xPts = args.xPts;\n        let yPts = args.yPts;\n        switch (args.shape) {\n            case UI512PaintDispatchShapes.SmearPencil: {\n                return painter.publicSmearPencil(xPts, yPts, color);\n            }\n            case UI512PaintDispatchShapes.SmearRectangle: {\n                return painter.publicSmearRectangle(xPts, yPts, color, 16, 16);\n            }\n            case UI512PaintDispatchShapes.SmearSpraycan: {\n                return painter.publicSmearSpraycan(xPts, yPts, color);\n            }\n            case UI512PaintDispatchShapes.SmearSmallBrush: {\n                return painter.publicSmearSmallBrush(xPts, yPts, color);\n            }\n            case UI512PaintDispatchShapes.IrregularPolygon: {\n                return painter.fillPolygon(\n                    0,\n                    0,\n                    painter.getCanvasWidth(),\n                    painter.getCanvasHeight(),\n                    xPts,\n                    yPts,\n                    color\n                );\n            }\n            case UI512PaintDispatchShapes.ShapeLine: {\n                assertEq(2, xPts.length, 'I<|ShapeLine');\n                assertEq(2, yPts.length, 'I;|ShapeLine');\n                return painter.publicStraightLine(\n                    xPts[0],\n                    yPts[0],\n                    xPts[1],\n                    yPts[1],\n                    color,\n                    args.lineSize\n                );\n            }\n            case UI512PaintDispatchShapes.ShapeRectangle: {\n                assertEq(2, xPts.length, 'I:|ShapeRectangle');\n                assertEq(2, yPts.length, 'I/|ShapeRectangle');\n                return painter.publicRectangle(\n                    xPts[0],\n                    yPts[0],\n                    xPts[1],\n                    yPts[1],\n                    color,\n                    fill,\n                    args.lineSize\n                );\n            }\n            case UI512PaintDispatchShapes.ShapeEllipse: {\n                assertEq(2, xPts.length, 'I.|ShapeEllipse');\n                assertEq(2, yPts.length, 'I-|ShapeEllipse');\n                return painter.publicPlotEllipse(\n                    xPts[0],\n                    yPts[0],\n                    xPts[1],\n                    yPts[1],\n                    color,\n                    fill,\n                    args.lineSize\n                );\n            }\n            case UI512PaintDispatchShapes.ShapeRoundRect: {\n                assertEq(2, xPts.length, 'I,|ShapeRoundRect');\n                assertEq(2, yPts.length, 'I+|ShapeRoundRect');\n                return painter.publicRoundRect(\n                    xPts[0],\n                    yPts[0],\n                    xPts[1],\n                    yPts[1],\n                    color,\n                    fill,\n                    args.lineSize\n                );\n            }\n            case UI512PaintDispatchShapes.ShapeCurve: {\n                assertEq(3, xPts.length, 'I*|ShapeCurve');\n                assertEq(3, yPts.length, 'I)|ShapeCurve');\n                return painter.publicCurve(\n                    xPts[0],\n                    yPts[0],\n                    xPts[1],\n                    yPts[1],\n                    xPts[2],\n                    yPts[2],\n                    color,\n                    args.lineSize\n                );\n            }\n            case UI512PaintDispatchShapes.Bucket: {\n                assertEq(1, xPts.length, 'I(|Bucket');\n                assertEq(1, yPts.length, 'I&|Bucket');\n                return UI512PaintDispatch.paintBucketSlowButWorks(\n                    painter,\n                    xPts[0],\n                    yPts[0],\n                    fill ?? 0\n                );\n            }\n            default: {\n                assertWarn(false, 'I%|unknown shape', args.shape);\n            }\n        }\n    }\n\n    /**\n     * the other shapes work against either a canvas or against raw data\n     * this one needs to be against raw data, so might need to call getImageData.\n     */\n    static paintBucketSlowButWorks(\n        painter: UI512Painter,\n        x: number,\n        y: number,\n        fillPattern: number\n    ) {\n        fillPattern = simplifyPattern(fillPattern);\n        if (painter.readPixelSupported()) {\n            painter.floodFill(x, y, fillPattern);\n        } else {\n            /* unfortunately, we'll have to make a new painter that\n            supports reading pixels */\n            let cv: CanvasWrapper = painter.getBackingSurface();\n            assertTrue(cv instanceof CanvasWrapper, 'I$|cv instanceof CanvasWrapper');\n            const w = cv.canvas.width;\n            const h = cv.canvas.height;\n            let data = cv.context.getImageData(0, 0, w, h);\n\n            let painterWithData = new UI512PainterCvDataAndPatterns(data.data, w, h);\n            painterWithData.floodFill(x, y, fillPattern);\n            cv.context.putImageData(data, 0, 0);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawPainter.ts",
    "content": "\n/* auto */ import { CanvasWrapper, RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { assertTrue, assertWarn, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { assertEq, slength } from './../utils/util512';\n/* auto */ import { UI512Patterns, clrBlack, clrTransp, clrWhite, needsPatternSupport, simplifyPattern } from './ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './ui512DrawPainterClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * paint into an array of raw pixel data\n */\nexport class UI512PainterCvData extends UI512Painter {\n    constructor(\n        public arr: Uint8ClampedArray,\n        public widthParam: number,\n        public heightParam: number\n    ) {\n        super();\n    }\n\n    setPixel(x: number, y: number, color: number): void {\n        if (!RectUtils.hasPoint(x, y, 0, 0, this.widthParam, this.heightParam)) {\n            return;\n        }\n\n        let offset = 4 * (y * this.widthParam + x);\n        if (color === clrTransp) {\n            this.arr[offset + 0] = 0;\n            this.arr[offset + 1] = 0;\n            this.arr[offset + 2] = 0;\n            this.arr[offset + 3] = 0;\n        } else if (color === clrBlack) {\n            this.arr[offset + 0] = 0;\n            this.arr[offset + 1] = 0;\n            this.arr[offset + 2] = 0;\n            this.arr[offset + 3] = 255;\n        } else if (color === clrWhite) {\n            this.arr[offset + 0] = 255;\n            this.arr[offset + 1] = 255;\n            this.arr[offset + 2] = 255;\n            this.arr[offset + 3] = 255;\n        } else {\n            assertWarn(false, `2~|unknown color ${color}`);\n        }\n    }\n\n    fillRect(xIn: number, yIn: number, wIn: number, hIn: number, color: number): void {\n        for (let y = yIn; y < yIn + hIn; y++) {\n            for (let x = xIn; x < xIn + wIn; x++) {\n                this.setPixel(x, y, color);\n            }\n        }\n    }\n\n    readPixel(x: number, y: number) {\n        /* remember to use clrThreshold, since writing to a Canvas is lossy */\n        const i = (y * this.widthParam + x) * 4;\n        const clrLarge = 256 - clrThreshold;\n\n        if (this.arr[i + 3] < clrThreshold) {\n            return clrTransp;\n        } else if (\n            this.arr[i] > clrLarge &&\n            this.arr[i + 1] > clrLarge &&\n            this.arr[i + 2] > clrLarge\n        ) {\n            return clrWhite;\n        } else if (\n            this.arr[i] < clrThreshold &&\n            this.arr[i + 1] < clrThreshold &&\n            this.arr[i + 2] < clrThreshold\n        ) {\n            return clrBlack;\n        } else {\n            assertWarn(\n                false,\n                `2||unknown color ${this.arr[i]},${this.arr[i + 1]},${this.arr[i + 2]},${\n                    this.arr[i + 3]\n                }`\n            );\n            return clrBlack;\n        }\n    }\n\n    readPixelSupported() {\n        return true;\n    }\n\n    getCanvasWidth() {\n        return this.widthParam;\n    }\n\n    getCanvasHeight() {\n        return this.heightParam;\n    }\n\n    getBackingSurface() {\n        return this.arr;\n    }\n\n    getSurfaceName() {\n        return 'makePainterCvDataDraw';\n    }\n\n    supportsPatterns() {\n        return false;\n    }\n\n    floodFill(xIn: number, yIn: number, color: number) {\n        assertTrue(isFinite(xIn) && isFinite(yIn), 'I>|not finite', xIn, yIn);\n        color = simplifyPattern(color);\n        if (needsPatternSupport(color)) {\n            this.floodFillInTwoStages(xIn, yIn, color);\n        } else {\n            this.floodFillImpl(xIn, yIn, color, undefined, undefined);\n        }\n    }\n\n    protected floodFillInTwoStages(xIn: number, yIn: number, color: number) {\n        /* we need to use two stages, because our algorithm reads\n        what we have set to see where we have already placed a pixel.*/\n\n        /* find the opposite color of what is already there */\n        let currentColor = this.readPixel(xIn, yIn);\n        let oppositeColor = this.getOppositeColor(currentColor);\n\n        /* make a painter with a simple setPixel */\n        let simpleDraw = new UI512PainterCvData(\n            this.getBackingSurface(),\n            this.getCanvasWidth(),\n            this.getCanvasHeight()\n        );\n\n        /* stage 1: run flood fill with a solid color and record every pixel drawn */\n        let recordOutputX: number[] = [];\n        let recordOutputY: number[] = [];\n        simpleDraw.floodFillImpl(xIn, yIn, oppositeColor, recordOutputX, recordOutputY);\n\n        /* stage 2: replace drawn pixels with our pattern */\n        for (let i = 0; i < recordOutputX.length; i++) {\n            this.setPixel(recordOutputX[i], recordOutputY[i], color);\n        }\n    }\n\n    protected getOppositeColor(clr: number) {\n        if (clr === clrBlack) {\n            return clrWhite;\n        } else {\n            return clrBlack;\n        }\n    }\n}\n\n/**\n * paint into an array of raw pixel data, supports drawing with a pattern\n */\nexport class UI512PainterCvDataAndPatterns extends UI512PainterCvData {\n    constructor(\n        public arr: Uint8ClampedArray,\n        public widthParam: number,\n        public heightParam: number\n    ) {\n        super(arr, widthParam, heightParam);\n    }\n\n    setPixel(x: number, y: number, color: number): void {\n        const offsetpatternx = 0;\n        const offsetpatterny = 0;\n        /* fill with a pattern */\n        /* note: this is slow, but works well enough for now */\n        if (needsPatternSupport(color)) {\n            const dim = 8;\n            let patternstring = UI512Patterns.patterns[color];\n            if (!patternstring) {\n                patternstring = UI512Patterns.defaultPatternData();\n            }\n\n            assertEq(dim * dim, slength(patternstring), '3B|');\n            let xmod = (x + offsetpatternx) % dim;\n            let ymod = (y + offsetpatterny) % dim;\n            let index = ymod * dim + xmod;\n            let c = patternstring.charCodeAt(index);\n            color = c === UI512Patterns.c0 ? clrBlack : clrWhite;\n        }\n\n        super.setPixel(x, y, color);\n    }\n\n    getSurfaceName() {\n        return 'makePainterCvDataWithPatternSupport';\n    }\n\n    supportsPatterns() {\n        return true;\n    }\n}\n\n/**\n * paint onto an HTML5 canvas object\n * efficiently draws rectangles, since it can call fillRect.\n */\nexport class UI512PainterCvCanvas extends UI512Painter {\n    constructor(\n        public cv: CanvasWrapper,\n        public widthParam: number,\n        public heightParam: number\n    ) {\n        super();\n    }\n\n    setPixel(x: number, y: number, color: number): void {\n        if (color === clrBlack) {\n            this.cv.fillPixelUnchecked(x, y, 'black');\n        } else if (color === clrWhite) {\n            this.cv.fillPixelUnchecked(x, y, 'white');\n        } else if (color === clrTransp) {\n            this.cv.context.clearRect(x, y, 1, 1);\n        } else {\n            assertWarn(false, '32|unsupported color', color);\n        }\n    }\n\n    fillRect(x: number, y: number, w: number, h: number, color: number): void {\n        if (color === clrBlack) {\n            this.cv.fillRectUnchecked(x, y, w, h, 'black');\n        } else if (color === clrWhite) {\n            this.cv.fillRectUnchecked(x, y, w, h, 'white');\n        } else if (color === clrTransp) {\n            this.cv.context.clearRect(x, y, w, h);\n        } else {\n            assertWarn(false, '30|unsupported color', color);\n        }\n    }\n\n    readPixel(x: number, y: number): number {\n        checkThrow512(false, '31|not implemented');\n    }\n\n    readPixelSupported() {\n        return false;\n    }\n\n    getCanvasWidth() {\n        return this.widthParam;\n    }\n\n    getCanvasHeight() {\n        return this.heightParam;\n    }\n\n    getBackingSurface() {\n        return this.cv;\n    }\n\n    getSurfaceName() {\n        return 'makePainterCvCanvas';\n    }\n\n    supportsPatterns() {\n        return false;\n    }\n}\n\n/**\n * browsers can change the colors written, see\n * https://en.wikipedia.org/wiki/Canvas_fingerprinting\n * so use clrThreshold instead of doing a strict comparison\n */\nexport const clrThreshold = 20;\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawPainterClasses.ts",
    "content": "\n/* auto */ import { RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertWarn, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { UI512BasePainterUtils } from './ui512DrawPatterns';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * abstract painting class, can be attached to different surfaces\n * clr is generally clrBlack or clrWhite, but at this layer we support any color.\n */\nexport abstract class UI512Painter extends UI512BasePainterUtils {\n    abstract setPixel(x: number, y: number, clr: number): void;\n    abstract fillRect(x: number, y: number, w: number, h: number, clr: number): void;\n    abstract readPixel(x: number, y: number): number;\n    abstract readPixelSupported(): boolean;\n    abstract getCanvasWidth(): number;\n    abstract getCanvasHeight(): number;\n    abstract getBackingSurface(): any;\n    abstract getSurfaceName(): string;\n    abstract supportsPatterns(): boolean;\n\n    /**\n     * draw with a single pixel brush\n     *\n     * a 'smear' is this: you're in say the pencil tool, and you drag to draw a jagged\n     * line on the screen. internally, whenever the mouse moves, we add a line segment\n     * from previous point to next point\n     * to render what you drew, we'll draw each of these line segments.\n     */\n    publicSmearPencil(xPts: number[], yPts: number[], clrIn: number) {\n        let realSetPixel = this.setPixel.bind(this);\n        this.smearShapeImpl(xPts, yPts, clrIn, (x: number, y: number, clr: number) => {\n            realSetPixel(x, y, clr);\n        });\n    }\n\n    /**\n     * draw with a solid rectangle brush, used for eraser tool.\n     */\n    publicSmearRectangle(\n        xPts: number[],\n        yPts: number[],\n        colorparam: number,\n        diameterx: number,\n        diametery: number\n    ) {\n        let realFillRect = this.fillRect.bind(this);\n        this.smearShapeImpl(xPts, yPts, colorparam, (x, y, color) => {\n            realFillRect(\n                x - Math.floor(diameterx / 2),\n                y - Math.floor(diametery / 2),\n                diameterx,\n                diametery,\n                color\n            );\n        });\n    }\n\n    /**\n     * draw with a solid brush shape\n     */\n    publicSmearSmallBrush(xPts: number[], yPts: number[], colorparam: number) {\n        let realFillRect = this.fillRect.bind(this);\n        this.smearShapeImpl(xPts, yPts, colorparam, (x, y, color) => {\n            /* central 4x2 rectangle */\n            realFillRect(x - 1, y, 4, 2, color);\n            /* first smaller 2x1 rectangle */\n            realFillRect(x, y - 1, 2, 1, color);\n            /* second smaller 2x1 rectangle */\n            realFillRect(x, y + 2, 2, 1, color);\n        });\n    }\n\n    /**\n     * draw a brush that is a spray of pixels\n     */\n    publicSmearSpraycan(xPts: number[], yPts: number[], colorparam: number) {\n        let realSetPixel = this.setPixel.bind(this);\n        this.smearShapeImpl(xPts, yPts, colorparam, (x, y, color) => {\n            realSetPixel(x + -1, y + -8, color);\n            realSetPixel(x + 3, y + -7, color);\n            realSetPixel(x + -6, y + -6, color);\n            realSetPixel(x + 0, y + -6, color);\n            realSetPixel(x + -3, y + -5, color);\n            realSetPixel(x + 2, y + -4, color);\n            realSetPixel(x + 6, y + -4, color);\n            realSetPixel(x + -8, y + -3, color);\n            realSetPixel(x + -2, y + -3, color);\n            realSetPixel(x + -5, y + -2, color);\n            realSetPixel(x + 1, y + -2, color);\n            realSetPixel(x + 4, y + -2, color);\n            realSetPixel(x + -1, y + -1, color);\n            realSetPixel(x + 7, y + -1, color);\n            realSetPixel(x + -3, y + 0, color);\n            realSetPixel(x + 1, y + 0, color);\n            realSetPixel(x + -8, y + 1, color);\n            realSetPixel(x + -5, y + 1, color);\n            realSetPixel(x + 4, y + 1, color);\n            realSetPixel(x + -2, y + 2, color);\n            realSetPixel(x + 2, y + 2, color);\n            realSetPixel(x + 6, y + 2, color);\n            realSetPixel(x + -4, y + 3, color);\n            realSetPixel(x + -7, y + 4, color);\n            realSetPixel(x + -1, y + 4, color);\n            realSetPixel(x + 2, y + 4, color);\n            realSetPixel(x + 5, y + 5, color);\n            realSetPixel(x + -4, y + 6, color);\n            realSetPixel(x + 0, y + 7, color);\n        });\n    }\n\n    /**\n     * draw a straight line\n     */\n    publicStraightLine(\n        x0: number,\n        y0: number,\n        x1in: number,\n        y1in: number,\n        clr: number,\n        lineSize: number\n    ) {\n        let w = x1in - x0;\n        let h = y1in - y0;\n        return this.drawShapeAdjustableBorderImpl(\n            0,\n            lineSize,\n            (fillColorInput, ofX, ofY) => {\n                let x1 = x0 + ofX + w;\n                let y1 = y0 + ofY + h;\n                this.plotLine(x0 + ofX, y0 + ofY, x1, y1, clr);\n            }\n        );\n    }\n\n    /**\n     * draw a rounded rectangle\n     */\n    publicRoundRect(\n        x0: number,\n        y0: number,\n        x1: number,\n        y1: number,\n        color: number,\n        fillColor: O<number>,\n        lineSize: number\n    ) {\n        let w = x1 - x0;\n        let h = y1 - y0;\n        return this.drawShapeAdjustableBorderImpl(\n            fillColor,\n            lineSize,\n            (fillColorInput, ofX, ofY) => {\n                this.drawvpcroundrectPorted(\n                    x0 + ofX,\n                    y0 + ofY,\n                    w,\n                    h,\n                    color,\n                    fillColorInput\n                );\n            }\n        );\n    }\n\n    publicRectangle(\n        x0: number,\n        y0: number,\n        x1: number,\n        y1: number,\n        color: number,\n        fillColor: O<number>,\n        lineSize: number\n    ) {\n        let w = x1 - x0;\n        let h = y1 - y0;\n        return this.drawShapeAdjustableBorderImpl(\n            fillColor,\n            lineSize,\n            (fillColorInput, ofX, ofY) => {\n                this.drawboxthinborderPorted(\n                    x0 + ofX,\n                    y0 + ofY,\n                    w,\n                    h,\n                    color,\n                    fillColorInput\n                );\n            }\n        );\n    }\n\n    publicCurve(\n        x0: number,\n        y0: number,\n        x1: number,\n        y1: number,\n        x2: number,\n        y2: number,\n        color: number,\n        lineSize: number\n    ) {\n        return this.drawShapeAdjustableBorderImpl(\n            0,\n            lineSize,\n            (fillColorInput, ofX, ofY) => {\n                this.plotQuadBezier(\n                    x0 + ofX,\n                    y0 + ofY,\n                    x1 + ofX,\n                    y1 + ofY,\n                    x2 + ofX,\n                    y2 + ofY,\n                    color\n                );\n            }\n        );\n    }\n\n    publicPlotEllipse(\n        xm: number,\n        ym: number,\n        x1: number,\n        y1: number,\n        color: number,\n        fillColor: O<number>,\n        lineSize: number\n    ) {\n        let w = x1 - xm;\n        let h = y1 - ym;\n        let centerx = xm + Math.floor(w / 2);\n        let centery = ym + Math.floor(h / 2);\n        let a = Math.floor(w / 2);\n        let b = Math.floor(h / 2);\n\n        return this.drawShapeAdjustableBorderImpl(\n            fillColor,\n            lineSize,\n            (fillColorInput, ofX, ofY) => {\n                this.plotEllipseAxis(\n                    centerx + ofX,\n                    centery + ofY,\n                    a,\n                    b,\n                    color,\n                    fillColorInput\n                );\n            }\n        );\n    }\n\n    /**\n     * implementation to draw a smear\n     */\n    protected smearShapeImpl(\n        xPts: number[],\n        yPts: number[],\n        color: number,\n        newSetPixel: (x: number, y: number, color: number) => void\n    ) {\n        let savedSetPixel = this.setPixel;\n        let savedFillRect = this.fillRect;\n        try {\n            this.fillRect = () => {\n                checkThrow512(false, \"I@|shouldn't be called\");\n            };\n            this.setPixel = newSetPixel;\n            if (xPts.length === 1 && yPts.length === 1) {\n                /* plot one point */\n                this.plotLine(xPts[0], yPts[0], xPts[0], yPts[0], color);\n            } else {\n                /* draw all line segments */\n                for (let i = 0; i < xPts.length - 1; i++) {\n                    this.plotLine(xPts[i], yPts[i], xPts[i + 1], yPts[i + 1], color);\n                }\n            }\n        } finally {\n            this.setPixel = savedSetPixel;\n            this.fillRect = savedFillRect;\n        }\n    }\n\n    /**\n     * implementation to draw a shape\n     * optionally draw a \"thicker\" line by drawing the same shape 5 times,\n     * once in the center and all around it.\n     */\n    protected drawShapeAdjustableBorderImpl(\n        fillColor: O<number>,\n        lineSize: number,\n        fn: (fill: O<number>, offsetX: number, ofsetfY: number) => void\n    ) {\n        fn(fillColor, 0, 0);\n        if (lineSize > 1) {\n            /* draw the shape again (with transparent fill) to make border thicker */\n            fn(undefined, 0, 1);\n            fn(undefined, 0, -1);\n            fn(undefined, 1, 0);\n            fn(undefined, -1, 0);\n        }\n    }\n\n    /**\n     * flood fill ('bucket tool')\n     */\n    floodFill(xIn: number, yIn: number, color: number) {\n        checkThrow512(false, 'I?|not implemented');\n    }\n\n    /**\n     * flood fill ('bucket tool') implementation\n     *\n     * by Jared Updike\n     * http://stackoverflow.com/questions/1257117/\n     * does-anyone-have-a-working-non-recursive-floodfill-algorithm-written-in-c\n     * released under Creative Commons Attribution-Share Alike\n     * ported to JavaScript by Ben Fisher, 2017\n     */\n    protected floodFillImpl(\n        xIn: number,\n        yIn: number,\n        tmpColor: number,\n        recordOutputX?: number[],\n        recordOutputY?: number[]\n    ): void {\n        const w = this.getCanvasWidth();\n        const h = this.getCanvasHeight();\n        if (!RectUtils.hasPoint(xIn, yIn, 0, 0, w, h)) {\n            return;\n        }\n\n        /* queue of work to do */\n        let qx: number[] = [];\n        let qy: number[] = [];\n        const targetColor = this.readPixel(xIn, yIn);\n        if (targetColor === tmpColor) {\n            /* no work needed */\n            return;\n        }\n\n        qx.push(xIn);\n        qy.push(yIn);\n        let maxAllowedIters = 1000 * w * h;\n        let counter = 0;\n        while (qx.length > 0) {\n            counter += 1;\n            if (counter > maxAllowedIters) {\n                assertWarn(false, `39|exceeded maxallowediters ${counter}`);\n                return;\n            }\n\n            let x = qx.pop() as number;\n            let y = qy.pop() as number;\n            if (\n                RectUtils.hasPoint(x, y, 0, 0, w, h) &&\n                this.readPixel(x, y) === targetColor\n            ) {\n                this.setPixel(x, y, tmpColor);\n                if (recordOutputX) {\n                    recordOutputX.push(x);\n                }\n                if (recordOutputY) {\n                    recordOutputY.push(y);\n                }\n\n                qx.push(x + 1);\n                qy.push(y);\n                qx.push(x - 1);\n                qy.push(y);\n                qx.push(x);\n                qy.push(y + 1);\n                qx.push(x);\n                qy.push(y - 1);\n            }\n        }\n    }\n\n    /**\n     * plot ellipse fitting the rectangle, rather than with center+radius\n     */\n    plotEllipse(\n        xm: number,\n        ym: number,\n        w: number,\n        h: number,\n        color: number,\n        fillColor: O<number>\n    ) {\n        this.plotEllipseAxis(\n            xm + Math.floor(w / 2),\n            ym + Math.floor(h / 2),\n            Math.floor(w / 2),\n            Math.floor(h / 2),\n            color,\n            fillColor\n        );\n    }\n\n    /**\n     * Bresenham Curve Rasterizing Algorithms\n     * Used with explicit permission of author, e-mail on Oct 27 2017\n     * @author  Zingl Alois\n     * @date    17.12.2014\n     * @version 1.3\n     * @url     http://members.chello.at/easyfilter/bresenham.html\n     */\n    plotLine(x0: number, y0: number, x1: number, y1: number, color: number) {\n        x0 = Math.floor(x0);\n        y0 = Math.floor(y0);\n        x1 = Math.floor(x1);\n        y1 = Math.floor(y1);\n        let dx = Math.abs(x1 - x0);\n        let sx = x0 < x1 ? 1 : -1;\n        let dy = -Math.abs(y1 - y0);\n        let sy = y0 < y1 ? 1 : -1;\n        let err = dx + dy;\n        let e2; /* error value exy */\n\n        for (;;) {\n            /* loop */\n            this.setPixel(x0, y0, color);\n            if (x0 === x1 && y0 === y1) {\n                break;\n            }\n\n            e2 = 2 * err;\n            if (e2 >= dy) {\n                err += dy;\n                x0 += sx;\n            } /* x step */\n            if (e2 <= dx) {\n                err += dx;\n                y0 += sy;\n            } /* y step */\n        }\n    }\n\n    /* eslint no-mixed-operators: 0 */\n    /* eslint no-multi-assign: 0 */\n\n    protected plotEllipseAxis(\n        xm: number,\n        ym: number,\n        a: number,\n        b: number,\n        color: number,\n        fillColor: O<number>\n    ) {\n        xm = Math.floor(xm);\n        ym = Math.floor(ym);\n        a = Math.floor(a);\n        b = Math.floor(b);\n        let x = -a;\n        let y = 0; /* II. quadrant from bottom left to top right */\n        let e2;\n        let dx = (1 + 2 * x) * b * b; /* error increment  */\n        let dy = x * x;\n        let err = dx + dy; /* error of 1.step */\n\n        do {\n            this.fillRectMightBeClear(\n                xm - Math.abs(x),\n                ym - Math.abs(y),\n                Math.abs(x) * 2 + 1,\n                Math.abs(y) * 2 + 1,\n                fillColor\n            );\n            this.setPixel(xm - x, ym + y, color); /*   I. Quadrant */\n            this.setPixel(xm + x, ym + y, color); /*  II. Quadrant */\n            this.setPixel(xm + x, ym - y, color); /* III. Quadrant */\n            this.setPixel(xm - x, ym - y, color); /*  IV. Quadrant */\n            e2 = 2 * err;\n            if (e2 >= dx) {\n                x++;\n                err += dx += 2 * b * b;\n            } /* x step */\n            if (e2 <= dy) {\n                y++;\n                err += dy += 2 * a * a;\n            } /* y step */\n        } while (x <= 0);\n\n        while (y++ < b) {\n            /* too early stop for flat ellipses with a=1, */\n            this.fillRectMightBeClear(\n                xm,\n                ym - Math.abs(y),\n                1,\n                Math.abs(y) * 2,\n                fillColor\n            );\n            this.setPixel(xm, ym - y, color); /* -> finish tip of ellipse */\n            this.setPixel(xm, ym + y, color);\n        }\n    }\n\n    plotCircle(xm: number, ym: number, r: number, color: number, fillColor: number) {\n        xm = Math.floor(xm);\n        ym = Math.floor(ym);\n        r = Math.floor(r);\n        let x = -r;\n        let y = 0;\n        let err = 2 - 2 * r; /* bottom left to top right */\n        do {\n            this.setPixel(xm - x, ym + y, color); /*   I. Quadrant +x +y */\n            this.setPixel(xm - y, ym - x, color); /*  II. Quadrant -x +y */\n            this.setPixel(xm + x, ym - y, color); /* III. Quadrant -x -y */\n            this.setPixel(xm + y, ym + x, color); /*  IV. Quadrant +x -y */\n            r = err;\n            if (r <= y) {\n                err += ++y * 2 + 1; /* y step */\n            }\n\n            if (r > x || err > y) {\n                err += ++x * 2 + 1; /* x step */\n            }\n        } while (x < 0);\n    }\n\n    plotQuadBezierSeg(\n        x0: number,\n        y0: number,\n        x1: number,\n        y1: number,\n        x2: number,\n        y2: number,\n        color: number\n    ) {\n        /* plot a limited quadratic Bezier segment */\n\n        let sx = x2 - x1;\n        let sy = y2 - y1;\n        let xx = x0 - x1;\n        let yy = y0 - y1;\n        let xy; /* relative values for checks */\n        let dx;\n        let dy;\n        let err;\n        let cur = xx * sy - yy * sx; /* curvature */\n\n        if (!(xx * sx <= 0 && yy * sy <= 0)) {\n            console.error('38|sign of gradient must not change');\n            return;\n        }\n\n        if (sx * sx + sy * sy > xx * xx + yy * yy) {\n            /* begin with shorter part */\n            x2 = x0;\n            x0 = sx + x1;\n            y2 = y0;\n            y0 = sy + y1;\n            cur = -cur; /* swap P0 P2 */\n        }\n        if (cur !== 0) {\n            /* no straight line */\n            xx += sx;\n            xx *= sx = x0 < x2 ? 1 : -1; /* x step direction */\n            yy += sy;\n            yy *= sy = y0 < y2 ? 1 : -1; /* y step direction */\n            xy = 2 * xx * yy;\n            xx *= xx;\n            yy *= yy; /* differences 2nd degree */\n            if (cur * sx * sy < 0) {\n                /* negated curvature? */\n                xx = -xx;\n                yy = -yy;\n                xy = -xy;\n                cur = -cur;\n            }\n            dx = 4.0 * sy * cur * (x1 - x0) + xx - xy; /* differences 1st degree */\n            dy = 4.0 * sx * cur * (y0 - y1) + yy - xy;\n            xx += xx;\n            yy += yy;\n            err = dx + dy + xy; /* error 1st step */\n            do {\n                this.setPixel(x0, y0, color); /* plot curve */\n                if (x0 === x2 && y0 === y2) {\n                    return; /* last pixel -> curve finished */\n                }\n\n                y1 = 2 * err < dx ? 1 : 0; /* save value for test of y step */\n                if (2 * err > dy) {\n                    x0 += sx;\n                    dx -= xy;\n                    err += dy += yy;\n                } /* x step */\n                if (y1) {\n                    y0 += sy;\n                    dy -= xy;\n                    err += dx += xx;\n                } /* y step */\n            } while (dy < 0 && dx > 0); /* gradient negates -> algorithm fails */\n        }\n\n        this.plotLine(x0, y0, x2, y2, color); /* plot remaining part to end */\n    }\n\n    plotQuadBezier(\n        x0: number,\n        y0: number,\n        x1: number,\n        y1: number,\n        x2: number,\n        y2: number,\n        color: number\n    ) {\n        /* plot any quadratic Bezier curve */\n        let x = x0 - x1;\n        let y = y0 - y1;\n        let t = x0 - 2 * x1 + x2;\n        let r;\n\n        if (x * (x2 - x1) > 0) {\n            /* horizontal cut at P4? */\n            if (y * (y2 - y1) > 0) {\n                if (Math.abs(((y0 - 2 * y1 + y2) / t) * x) > Math.abs(y)) {\n                    /* vertical cut at P6 too? */\n                    /* which first? */\n                    x0 = x2;\n                    x2 = x + x1;\n                    y0 = y2;\n                    y2 = y + y1; /* swap points */\n                } /* now horizontal cut at P4 comes first */\n            }\n\n            t = (x0 - x1) / t;\n            r = (1 - t) * ((1 - t) * y0 + 2.0 * t * y1) + t * t * y2; /* By(t=P4) */\n            t = ((x0 * x2 - x1 * x1) * t) / (x0 - x1); /* gradient dP4/dx=0 */\n            x = Math.floor(t + 0.5);\n            y = Math.floor(r + 0.5);\n            r = ((y1 - y0) * (t - x0)) / (x1 - x0) + y0; /* intersect P3 | P0 P1 */\n            this.plotQuadBezierSeg(x0, y0, x, Math.floor(r + 0.5), x, y, color);\n            r = ((y1 - y2) * (t - x2)) / (x1 - x2) + y2; /* intersect P4 | P1 P2 */\n            x0 = x1 = x;\n            y0 = y;\n            y1 = Math.floor(r + 0.5); /* P0 = P4, P1 = P8 */\n        }\n        if ((y0 - y1) * (y2 - y1) > 0) {\n            /* vertical cut at P6? */\n            t = y0 - 2 * y1 + y2;\n            t = (y0 - y1) / t;\n            r = (1 - t) * ((1 - t) * x0 + 2.0 * t * x1) + t * t * x2; /* Bx(t=P6) */\n            t = ((y0 * y2 - y1 * y1) * t) / (y0 - y1); /* gradient dP6/dy=0 */\n            x = Math.floor(r + 0.5);\n            y = Math.floor(t + 0.5);\n            r = ((x1 - x0) * (t - y0)) / (y1 - y0) + x0; /* intersect P6 | P0 P1 */\n            this.plotQuadBezierSeg(x0, y0, Math.floor(r + 0.5), y, x, y, color);\n            r = ((x1 - x2) * (t - y2)) / (y1 - y2) + x2; /* intersect P7 | P1 P2 */\n            x0 = x;\n            x1 = Math.floor(r + 0.5);\n            y0 = y1 = y; /* P0 = P6, P1 = P7 */\n        }\n        this.plotQuadBezierSeg(x0, y0, x1, y1, x2, y2, color); /* remaining part */\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512DrawPatterns.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport const clrBlack = 0;\nexport const clrWhite = 1;\nexport const clrTransp = 2;\n\n/**\n * table of patterns.\n * currently held as strings, probably could be faster, but works well enough for now.\n */\nexport const UI512Patterns = /* static class */ {\n    patterns: {\n        100: '1111111111111111111111111111111111111111111111111111111111111111',\n        101: '1101111111111110111101111011111111111011011111111110111111111101',\n        102: '1111111111111111111111111111111111111111011111111111111111111111',\n        103: '1111111111111011111101011111111111111111101111110101111111111111',\n        104: '1111111111110111111111111111111111111111011111111111111111111111',\n        105: '0000000000000000000000000000000000000000000000000000000000000000',\n        106: '1010101001010101101010100101010110101010010101011010101001010101',\n        107: '1101111111111111111111011111101111110111111111110111111110111111',\n        108: '1101110111111111011101111111111111011101111111110111011111111111',\n        109: '0111011111011101011101111101110101110111110111010111011111011101',\n        110: '1011011111001111111100111111110111111110111111101111110001111011',\n        111: '0111111111111111011101111111111101111111111111110101010111111111',\n        112: '1101110111011101011101110111011111011101110111010111011101110111',\n        113: '1011101101110111111011101101110110111011011101111110111011011101',\n        114: '0111110110111011110001101011101101111101111111101111111011111110',\n        115: '0000000001111111011111110111111101111111011111110111111101111111',\n        116: '0111011101010101110111010101010101110111010101011101110101010101',\n        117: '0011101101111111111100111001011110111100111111011100111111011001',\n        118: '0111011111101011110111011011111001110111101111101101110111101011',\n        119: '1111011111100011110111010011111001111111111111101111110111111011',\n        120: '0011001101010101110011000101010100110011010101011100110001010101',\n        121: '0100111011001111111111001110010000100111001111111111001101110010',\n        122: '0111111101111111101111101100000111110111111101111110101100011100',\n        123: '0000000001111111011111110111111100000000111101111111011111110111',\n        124: '0001000101010101010001000101010100010001010101010100010001010101',\n        125: '0101010111111111010101011111111101010101111111110101010111111111',\n        126: '1101110111111011011100111000101111011101111010000110011111101111',\n        127: '0000011110001011110111011011100001110000111010001101110110001110',\n        128: '0001000101000100010001000001000100010001010001000100010000010001',\n        129: '0111011111011101101010101101110101110111110111011010101011011101',\n        130: '0100000101111111011101111111011100010100111101110111011101111111',\n        131: '0100000011111111010000000100000001001111010011110100111101001111',\n        132: '0000000001000100000000000001000100000000010001000000000000010001',\n        133: '0111011110101010110111011010101001110111101010101101110110101010',\n        134: '1101101000110111110011010111011010011011110110111011001101101101',\n        135: '0000000010000000010000011010001001011101101111100111111111111111',\n        136: '0000000000000000000000000100010000000000000000000000000001000100',\n        137: '1000100000100010100010000010001010001000001000101000100000100010',\n        138: '1110101100010100010111010110001110111110010000011101010100110110',\n        139: '0101111110101111000001010000101000000101000010100101111110101111',\n        140: '0100100000110000000011000000001000000001000000010000001110000100',\n        141: '1011111010000000100010000000100011101011000010001000100010000000',\n        142: '1000001001000100001110010100010010000010000000010000000100000001',\n        143: '1111111110000000100000001000000010000000100000001000000010000000',\n        144: '1100010010000000000011000110100001000011000000100011000000100110',\n        145: '1011000100110000000000110001101111011000110000000000110010001101',\n        146: '0010001000000100100011000111010000100010000101111001100000010000',\n        147: '0100010010001000000100010010001001000100100010000001000100100010',\n        148: '1111111111101111111111111011101111111111111011111111111111111111'\n    },\n\n    defaultPatternData() {\n        return UI512Patterns.patterns[148];\n    },\n\n    defaultPattern: 'pattern148',\n    defaultLineColor: clrBlack,\n    defaultFillColor: -1,\n    c0: '0'.charCodeAt(0),\n    c1: '1'.charCodeAt(0)\n};\n\n/**\n * paint utilities that are more complex than drawing a line or shape.\n */\nexport abstract class UI512BasePainterUtils {\n    abstract setPixel(x: number, y: number, color: number): void;\n    abstract fillRect(x: number, y: number, w: number, h: number, color: number): void;\n\n    /**\n     * fill a polygon\n     * http://alienryderflex.com/polygon_fill/\n     * Darel Rex Finley, released as public-domain\n     * ported to JavaScript by Ben Fisher\n     */\n    fillPolygon(\n        x0: number,\n        y0: number,\n        w: number,\n        h: number,\n        xPts: number[],\n        yPts: number[],\n        color: number\n    ) {\n        let nodeX: number[] = [];\n        let sortByNumber = (a: number, b: number) => {\n            return a - b;\n        };\n\n        /* loop through the rows of the image */\n        for (let pixelY = y0; pixelY < y0 + h; pixelY++) {\n            nodeX.length = 0;\n\n            /* build a list of nodes */\n            let nodes = 0;\n            let j = xPts.length - 1;\n            let i = 0;\n            for (i = 0; i < xPts.length; i++) {\n                if (\n                    (yPts[i] < pixelY && yPts[j] >= pixelY) ||\n                    (yPts[j] < pixelY && yPts[i] >= pixelY)\n                ) {\n                    let div1 = (pixelY - yPts[i]) / (yPts[j] - yPts[i]);\n                    let sub1 = xPts[j] - xPts[i];\n                    nodeX[nodes++] = Math.floor(xPts[i] + div1 * sub1);\n                }\n\n                j = i;\n            }\n\n            /* sort the nodes */\n            nodeX.sort(sortByNumber);\n\n            /* fill the pixels between node pairs. */\n            const imageLeft = x0;\n            const imageRight = x0 + w;\n            for (i = 0; i < nodes; i += 2) {\n                if (nodeX[i] >= imageRight) {\n                    break;\n                }\n\n                if (nodeX[i + 1] > imageLeft) {\n                    if (nodeX[i] < imageLeft) {\n                        nodeX[i] = imageLeft;\n                    }\n\n                    if (nodeX[i + 1] > imageRight) {\n                        nodeX[i + 1] = imageRight;\n                    }\n\n                    for (j = nodeX[i]; j < nodeX[i + 1]; j++) {\n                        this.setPixel(j, pixelY, color);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * same as drawBorder's drawvpcroundrect, but ported to painting.\n     * code generated by a Python script I wrote\n     */\n    drawvpcroundrectPorted(\n        bx: number,\n        by: number,\n        w: number,\n        h: number,\n        clr: number,\n        fill: O<number>\n    ) {\n        let y = 0;\n        let stretchV = 0;\n        const stretchH = w - (9 + 7) + 1;\n        if (w < 17) {\n            return this.drawboxthinborderPorted(bx, by, w, h, clr, fill);\n        }\n        if (h < 14) {\n            return this.drawboxthinborderPorted(bx, by, w, h, clr, fill);\n        }\n\n        /* drawing left side */\n        stretchV = h - (40 - 27);\n        y = by;\n        y += 6;\n        this.fillRect(bx + 0, by + 6, 1, stretchV, clr);\n        y = by + 6 + stretchV;\n        this.fillRect(bx + 0, y, 1, 1, clr);\n        y += 1;\n        y += 6;\n\n        y = by;\n        y += 4;\n        this.fillRect(bx + 1, y, 1, 2, clr);\n        y += 2;\n        this.fillRectMightBeClear(bx + 1, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 1, y, 1, 1, fill);\n        y += 1;\n        this.fillRect(bx + 1, y, 1, 2, clr);\n        y += 2;\n        y += 4;\n\n        y = by;\n        y += 3;\n        this.fillRect(bx + 2, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 2, y, 1, 2, fill);\n        y += 2;\n        this.fillRectMightBeClear(bx + 2, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 2, y, 1, 3, fill);\n        y += 3;\n        this.fillRect(bx + 2, y, 1, 1, clr);\n        y += 1;\n        y += 3;\n\n        y = by;\n        y += 2;\n        this.fillRect(bx + 3, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 3, y, 1, 3, fill);\n        y += 3;\n        this.fillRectMightBeClear(bx + 3, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 3, y, 1, 4, fill);\n        y += 4;\n        this.fillRect(bx + 3, y, 1, 1, clr);\n        y += 1;\n        y += 2;\n\n        y = by;\n        y += 1;\n        this.fillRect(bx + 4, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 4, y, 1, 4, fill);\n        y += 4;\n        this.fillRectMightBeClear(bx + 4, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 4, y, 1, 5, fill);\n        y += 5;\n        this.fillRect(bx + 4, y, 1, 1, clr);\n        y += 1;\n        y += 1;\n\n        y = by;\n        y += 1;\n        this.fillRect(bx + 5, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 5, y, 1, 4, fill);\n        y += 4;\n        this.fillRectMightBeClear(bx + 5, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 5, y, 1, 5, fill);\n        y += 5;\n        this.fillRect(bx + 5, y, 1, 1, clr);\n        y += 1;\n        y += 1;\n\n        y = by;\n        this.fillRect(bx + 6, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 6, y, 1, 5, fill);\n        y += 5;\n        this.fillRectMightBeClear(bx + 6, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 6, y, 1, 6, fill);\n        y += 6;\n        this.fillRect(bx + 6, y, 1, 1, clr);\n        y += 1;\n\n        y = by;\n        this.fillRect(bx + 7, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 7, y, 1, 5, fill);\n        y += 5;\n        this.fillRectMightBeClear(bx + 7, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 7, y, 1, 6, fill);\n        y += 6;\n        this.fillRect(bx + 7, y, 1, 1, clr);\n        y += 1;\n\n        y = by;\n        this.fillRect(bx + 8, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 8, y, 1, 5, fill);\n        y += 5;\n        this.fillRectMightBeClear(bx + 8, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 8, y, 1, 6, fill);\n        y += 6;\n        this.fillRect(bx + 8, y, 1, 1, clr);\n        y += 1;\n\n        /* drawing middle */\n        y = by;\n        this.fillRect(bx + 9, y, stretchH, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + 9, y, stretchH, 5, fill);\n        y += 5;\n        this.fillRectMightBeClear(bx + 8, by + 6, stretchH, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + 9, y, stretchH, 6, fill);\n        y += 6;\n        this.fillRect(bx + 9, y, stretchH, 1, clr);\n        y += 1;\n\n        /* drawing right side */\n        stretchV = h - (40 - 27);\n        y = by;\n        this.fillRect(bx + w - 7 + 0, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + w - 7 + 0, y, 1, 5, fill);\n        y += 5;\n        this.fillRectMightBeClear(bx + w - 7 + 0, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 0, y, 1, 6, fill);\n        y += 6;\n        this.fillRect(bx + w - 7 + 0, y, 1, 1, clr);\n        y += 1;\n\n        y = by;\n        y += 1;\n        this.fillRect(bx + w - 7 + 1, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + w - 7 + 1, y, 1, 4, fill);\n        y += 4;\n        this.fillRectMightBeClear(bx + w - 7 + 1, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 1, y, 1, 5, fill);\n        y += 5;\n        this.fillRect(bx + w - 7 + 1, y, 1, 1, clr);\n        y += 1;\n        y += 1;\n\n        y = by;\n        y += 1;\n        this.fillRect(bx + w - 7 + 2, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + w - 7 + 2, y, 1, 4, fill);\n        y += 4;\n        this.fillRectMightBeClear(bx + w - 7 + 2, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 2, y, 1, 5, fill);\n        y += 5;\n        this.fillRect(bx + w - 7 + 2, y, 1, 1, clr);\n        y += 1;\n        y += 1;\n\n        y = by;\n        y += 2;\n        this.fillRect(bx + w - 7 + 3, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + w - 7 + 3, y, 1, 3, fill);\n        y += 3;\n        this.fillRectMightBeClear(bx + w - 7 + 3, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 3, y, 1, 4, fill);\n        y += 4;\n        this.fillRect(bx + w - 7 + 3, y, 1, 1, clr);\n        y += 1;\n        y += 2;\n\n        y = by;\n        y += 3;\n        this.fillRect(bx + w - 7 + 4, y, 1, 1, clr);\n        y += 1;\n        this.fillRectMightBeClear(bx + w - 7 + 4, y, 1, 2, fill);\n        y += 2;\n        this.fillRectMightBeClear(bx + w - 7 + 4, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 4, y, 1, 3, fill);\n        y += 3;\n        this.fillRect(bx + w - 7 + 4, y, 1, 1, clr);\n        y += 1;\n        y += 3;\n\n        y = by;\n        y += 4;\n        this.fillRect(bx + w - 7 + 5, y, 1, 2, clr);\n        y += 2;\n        this.fillRectMightBeClear(bx + w - 7 + 5, by + 6, 1, stretchV, fill);\n        y = by + 6 + stretchV;\n        this.fillRectMightBeClear(bx + w - 7 + 5, y, 1, 1, fill);\n        y += 1;\n        this.fillRect(bx + w - 7 + 5, y, 1, 2, clr);\n        y += 2;\n        y += 4;\n\n        y = by;\n        y += 6;\n        this.fillRect(bx + w - 7 + 6, by + 6, 1, stretchV, clr);\n        y = by + 6 + stretchV;\n        this.fillRect(bx + w - 7 + 6, y, 1, 1, clr);\n        y += 1;\n        y += 6;\n\n        return true;\n    }\n\n    /**\n     * same as drawBorder's drawboxthinborder, but ported to painting.\n     */\n    drawboxthinborderPorted(\n        x0: number,\n        y0: number,\n        w: number,\n        h: number,\n        clr: number,\n        fill: O<number>\n    ) {\n        if (w > 0 && h > 0) {\n            let realBorderSize = 1;\n\n            /* clear it */\n            this.fillRectMightBeClear(x0, y0, w, h, fill);\n\n            /* draw borders */\n            this.fillRect(x0, y0, w, realBorderSize, clr);\n            this.fillRect(x0, y0, realBorderSize, h, clr);\n            this.fillRect(x0, y0 + h - realBorderSize, w, realBorderSize, clr);\n            this.fillRect(x0 + w - realBorderSize, y0, realBorderSize, h, clr);\n        }\n    }\n\n    /**\n     * distinguish between make-transparent and draw transparent.\n     * filling-with-transparent means to make the area transparent\n     * filling-with-undefined means to leave the area untouched\n     */\n    fillRectMightBeClear(x: number, y: number, w: number, h: number, fill: O<number>) {\n        if (fill !== undefined) {\n            this.fillRect(x, y, w, h, fill);\n        }\n    }\n}\n\n/**\n * test if the color represents a pattern.\n * if clr is 100 and above, it represents a pattern\n */\nexport function needsPatternSupport(fillColor: O<number>) {\n    return fillColor !== undefined && fillColor >= 100;\n}\n\n/**\n * simplifyPattern\n * this is a perf optimization,\n * it is faster to draw a solid color black than pattern #105.\n */\nexport function simplifyPattern(colorOrPattern: number) {\n    if (colorOrPattern === 100) {\n        return clrWhite;\n    } else if (colorOrPattern === 105) {\n        return clrBlack;\n    } else {\n        return colorOrPattern;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512ImageCollection.ts",
    "content": "\n/* auto */ import { Util512Higher } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { Util512, arLast } from './../utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * an array of UI512ImageCollections.\n */\nexport class UI512ImageCollectionCollection {\n    children: UI512ImageCollection[] = [];\n}\n\n/**\n * an array of cached images.\n */\nexport class UI512ImageCollection {\n    children: UI512ImageCollectionImage[] = [];\n    suffix = '.png';\n    constructor(public id: string, public name: string, public readonly url: string) {}\n    genChildren(largestNumber: number) {\n        for (let i = 1; i <= largestNumber; i++) {\n            let id = Util512.padStart(i, 2, '0');\n            let name = 'lng' + i.toString();\n            this.children.push(new UI512ImageCollectionImage(id, name));\n            arLast(this.children).parent = this;\n        }\n    }\n}\n\n/**\n * a cached image.\n * three possible states\n * 1) image is completely unloaded (!image && !loaded)\n * 2) image is waiting for download (image && !loaded)\n * 3) image is ready to use (image && loaded)\n */\nexport class UI512ImageCollectionImage {\n    constructor(public id: string, public name: string) {}\n    parent: UI512ImageCollection;\n    image: O<HTMLImageElement>;\n    loaded = false;\n    startLoad(cb: () => void) {\n        if (!this.loaded && !this.image) {\n            let url = this.getUrl();\n            this.image = new Image();\n            Util512Higher.beginLoadImage(url, this.image, () => {\n                this.loaded = true;\n                cb();\n            });\n        }\n    }\n\n    getSize() {\n        return this.image ? [this.image.naturalWidth, this.image.naturalHeight] : [0, 0];\n    }\n\n    getUrl() {\n        assertTrue(this.parent.id.match(/^[a-z]+$/), 'I}|');\n        return this.parent.url + this.parent.id + '/' + this.id + this.parent.suffix;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512ImageDissolve.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, getRoot } from './../utils/util512Higher';\n/* auto */ import { cast } from './../utils/util512';\n/* auto */ import { UI512IconManager } from './ui512DrawIconManager';\n/* auto */ import { IconInfo } from './ui512DrawIconClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * dissolve from one image to another\n * we can cleverly use composition modes to do this very efficiently.\n */\nexport class UI512ImageDissolve {\n    readonly iconGroup = 'fordissolvet';\n    readonly countstages = 12;\n    blendAtStage(\n        c1: CanvasWrapper,\n        c2: CanvasWrapper,\n        stage: number,\n        comp: RenderComplete\n    ) {\n        /* note: is destructive to c2, */\n        /* changes written to c1 */\n        if (stage <= 0) {\n            return;\n        }\n\n        const iconnumber = 12; /* stage - 1 */\n        let iconManager = cast(UI512IconManager, getRoot().getDrawIcon());\n        let icon = iconManager.findIcon(this.iconGroup, iconnumber);\n        if (!icon) {\n            comp.complete = false;\n            return;\n        }\n\n        let info = new IconInfo(this.iconGroup, iconnumber);\n        info.centered = false;\n        const tileW = icon.srcRect[2];\n        const tileH = icon.srcRect[3];\n\n        c2.temporarilyChangeCompositeMode('destination-in', () => {\n            c2.context.globalCompositeOperation = 'destination-in';\n            for (let tileY = 0; tileY < Math.ceil(c2.canvas.height / tileH); tileY++) {\n                for (let tileX = 0; tileX < Math.ceil(c2.canvas.width / tileW); tileX++) {\n                    let destX = tileX * tileW;\n                    let destY = tileY * tileH;\n                    if (icon) {\n                        icon.drawIntoBox(c2, info, destX, destY, tileX, tileY);\n                    }\n                }\n            }\n        });\n\n        c1.drawFromImage(\n            c2.canvas,\n            0,\n            0,\n            c2.canvas.width,\n            c2.canvas.height,\n            0,\n            0,\n            0,\n            0,\n            c1.canvas.width,\n            c1.canvas.height\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512ImageSerialization.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { UI512Compress } from './../utils/util512Base';\n/* auto */ import { checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { assertEq } from './../utils/util512';\n/* auto */ import { clrBlack, clrTransp, clrWhite } from './ui512DrawPatterns';\n/* auto */ import { UI512PainterCvData } from './ui512DrawPainter';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * serialize an image to a string\n *\n * create a long string of ascii characters 0,1,2,\n * one character for each pixel in the image.\n * then run lz to compress the string to binary data.\n */\nexport const UI512ImageSerialization = /* static class */ {\n    asciiBlack: clrBlack.toString().charAt(0),\n    asciiWhite: clrWhite.toString().charAt(0),\n    asciiTransp: clrTransp.toString().charAt(0),\n    asciiNumBlack: clrBlack.toString().charCodeAt(0),\n    asciiNumWhite: clrWhite.toString().charCodeAt(0),\n    asciiNumTransp: clrTransp.toString().charCodeAt(0),\n\n    /**\n     * uncompress the string and paint the image onto the canvas\n     */\n    loadFromString(canvas: CanvasWrapper, compressed: string) {\n        const w = canvas.canvas.width;\n        const h = canvas.canvas.height;\n        if (compressed.length === 0) {\n            /* treat empty string as an empty white image. */\n            canvas.fillRect(0, 0, w, h, 0, 0, w, h, 'white');\n            return;\n        }\n\n        let data = canvas.context.createImageData(w, h);\n        assertEq(data.data.length, 4 * w * h, '2{|');\n        let uncompressed = UI512Compress.decompressString(compressed);\n        if (uncompressed.length * 4 !== data.data.length) {\n            let loc = window.location.href;\n            if (loc.includes('U3ZcVJ')) {\n                console.error(\n                    `length mismatch, expected, got ${data.data.length} wanted ${\n                        uncompressed.length * 4\n                    }`\n                );\n                console.error('not throwing due to special stack.');\n                return;\n            }\n        }\n\n        checkThrow512(\n            uncompressed.length * 4 === data.data.length,\n            'K=|length mismatch, expected, got',\n            data.data.length,\n            uncompressed.length * 4\n        );\n\n        let paint = new UI512PainterCvData(data.data, w, h);\n        let i = 0;\n        for (let y = 0; y < h; y++) {\n            for (let x = 0; x < w; x++) {\n                let pixel = uncompressed.charCodeAt(i);\n                paint.setPixel(x, y, pixel - this.asciiNumBlack);\n                i++;\n            }\n        }\n\n        canvas.context.putImageData(data, 0, 0);\n    },\n\n    /**\n     * convert the image on the canvas to a compressed string\n     */\n    writeToString(canvas: CanvasWrapper) {\n        const w = canvas.canvas.width;\n        const h = canvas.canvas.height;\n        let data = canvas.context.getImageData(0, 0, w, h);\n        return this.writeToStringFromData(data.data, w, h);\n    },\n\n    /**\n     * convert the given imagedata to a compressed string\n     */\n    writeToStringFromData(data: Uint8ClampedArray, w: number, h: number) {\n        assertEq(data.length, 4 * w * h, '2`|');\n        let reader = new UI512PainterCvData(data, w, h);\n        let result = '';\n        let map: { [key: number]: string } = {};\n        map[clrBlack] = this.asciiBlack;\n        map[clrWhite] = this.asciiWhite;\n        map[clrTransp] = this.asciiTransp;\n\n        for (let y = 0; y < h; y++) {\n            for (let x = 0; x < w; x++) {\n                let clr = reader.readPixel(x, y);\n                result += map[clr];\n            }\n        }\n\n        return UI512Compress.compressString(result);\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/draw/ui512Interfaces.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../utils/utilsKeypressHelpers';\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, RepeatingTimer, UI512IsEventInterface, UI512IsPresenterInterface, VoidFn } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * in original os, you had to hold mouse down on the menus the entire time\n * in ours, you can click once and the menu stays open\n */\nexport enum MenuOpenState {\n    __isUI512Enum = 1,\n    MenusClosed,\n    MenusOpenInitialMouseDown,\n    MenusOpen\n}\n\n/**\n * type of event\n */\nexport enum UI512EventType {\n    __isUI512Enum = 1,\n    None,\n    KeyUp,\n    KeyDown,\n    MouseDown,\n    MouseDownDouble,\n    MouseUp,\n    MouseMove,\n    MouseEnter,\n    MouseLeave,\n    MenuItemClicked,\n    PasteText,\n    Idle,\n    FocusChanged\n}\n\n/**\n * clipboard for copying/pasting text\n */\nexport interface ClipManagerInterface {\n    ensureReadyForPaste(milliseconds: number): void;\n    paste(useOSClipboard: boolean): void;\n    copy(s: string, useOSClipboard: boolean): boolean;\n}\n\n/**\n * context of change\n * e.g., changes from renderModel could hypothetically use a different value here,\n * since it's a different type of change than one coming directly from user.\n * (not currently used)\n */\nexport enum ChangeContext {\n    __isUI512Enum = 1,\n    Default\n}\n\n/**\n * current mouse drag status\n * there's no use extending this to every type of drag action,\n * tried that, but in all meaningful drag actions, one needs to maintain state\n * beyond just mouse-down or mouse-up.\n */\nexport enum MouseDragStatus {\n    __isUI512Enum = 1,\n    None,\n    ScrollArrow,\n    SelectingText,\n    DragAndDrop\n}\n\n/**\n * a _TemporarySuspendEvents_ temporarily replaces all event listeners in a presenter.\n */\nexport interface TemporarilySuspendEventsInterface {\n    whenComplete(): void;\n    shouldRestore(ms: number): boolean;\n}\n\n/**\n * stronger typing for event callbacks\n */\nexport type FnEventCallback = (\n    pr: UI512IsPresenterInterface,\n    d: UI512IsEventInterface\n) => void;\n\n/**\n * a Presenter receives Events,\n * updates Models accordingly,\n * and sends Models to ElementsView to be drawn.\n */\nexport interface UI512PresenterInterface {\n    clipManager: ClipManagerInterface;\n    timerSlowIdle: RepeatingTimer;\n    useOSClipboard: boolean;\n    mouseDragStatus: number;\n    removeEl(grpId: string, elId: string, context: ChangeContext): void;\n    rebuildFieldScrollbars(): void;\n    trackMouse: number[];\n    trackPressedBtns: boolean[];\n    trackClickedIds: O<string>[];\n    trackMetaKeys: ModifierKeys;\n    trackLastClick: [number, number, number];\n    listeners: { [t: number]: FnEventCallback[] };\n    callbackQueueForIdle: O<VoidFn>[];\n    needRedraw: boolean;\n    inited: boolean;\n    openState: MenuOpenState;\n    tmpSuspend: O<TemporarilySuspendEventsInterface>;\n    importMouseTracking(other: UI512PresenterInterface): void;\n    getCurrentFocus(): O<string>;\n    setCurrentFocus(next: O<string>): void;\n    listenEvent(type: UI512EventType, fn: FnEventCallback): void;\n    changeSeen(context: ChangeContext): void;\n    render(canvas: CanvasWrapper, ms: number, cmpTotal: RenderComplete): void;\n    invalidateAll(): void;\n    placeCallbackInQueue(cb: () => void): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512ComplexFontChanges.ts",
    "content": "\n/* auto */ import { checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { Util512, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { FormattedText } from './ui512FormattedText';\n/* auto */ import { UI512FontRequest } from './ui512DrawTextFontRequest';\n/* auto */ import { TextFontSpec, TextFontStyling, stringToTextFontStyling, textFontStylingToString } from './ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * tools for dealing with formatted substrings, e.g.\n * set the textstyle of char 2 to 4 of cd fld \"fld1\" to bold\n */\nexport const UI512ComplexFontChanges = /* static class */ {\n    /**\n     * parse a list [\"bold\", \"italic\"] into bitfield bold|italic\n     */\n    styleListToInt(list: string[]): TextFontStyling {\n        let ret = TextFontStyling.Default;\n        for (let i = 0, len = list.length; i < len; i++) {\n            let s = list[i];\n            s = s.toLowerCase().trim();\n            switch (s) {\n                case 'plain':\n                    break;\n                case 'bold':\n                    ret |= TextFontStyling.Bold;\n                    break;\n                case 'italic':\n                    ret |= TextFontStyling.Italic;\n                    break;\n                case 'underline':\n                    ret |= TextFontStyling.Underline;\n                    break;\n                case 'outline':\n                    ret |= TextFontStyling.Outline;\n                    break;\n                case 'shadow':\n                    ret |= TextFontStyling.Shadow;\n                    break;\n                case 'grayed':\n                    ret |= TextFontStyling.Grayed;\n                    break;\n                case 'condense':\n                    ret |= TextFontStyling.Condense;\n                    break;\n                case 'extend':\n                    ret |= TextFontStyling.Extend;\n                    break;\n                default:\n                    checkThrow512(false, `67|warning: unrecognized text style ${s}`);\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * from bitfield bold|italic to [\"bold\", \"italic\"]\n     */\n    intToStyleList(style: TextFontStyling) {\n        let ret: string[] = [];\n        if (style === 0) {\n            ret.push('plain');\n        }\n\n        if ((style & TextFontStyling.Bold) !== 0) {\n            ret.push('bold');\n        }\n\n        if ((style & TextFontStyling.Italic) !== 0) {\n            ret.push('italic');\n        }\n\n        if ((style & TextFontStyling.Underline) !== 0) {\n            ret.push('underline');\n        }\n\n        if ((style & TextFontStyling.Outline) !== 0) {\n            ret.push('outline');\n        }\n\n        if ((style & TextFontStyling.Shadow) !== 0) {\n            ret.push('shadow');\n        }\n\n        if ((style & TextFontStyling.Grayed) !== 0) {\n            ret.push('grayed');\n        }\n\n        if ((style & TextFontStyling.Condense) !== 0) {\n            ret.push('condense');\n        }\n\n        if ((style & TextFontStyling.Extend) !== 0) {\n            ret.push('extend');\n        }\n\n        return ret.join(',');\n    },\n\n    /**\n     * ['italic', 'outline'] to \"b+iu+osdce\"\n     */\n    styleListToLowString(vpcStyles: string[]) {\n        let n = this.styleListToInt(vpcStyles);\n        return textFontStylingToString(n);\n    },\n\n    /**\n     * \"b+iu+osdce\" to ['italic', 'outline']\n     */\n    lowStringToStyleList(style: string) {\n        let enumStyle = stringToTextFontStyling(style);\n        return this.intToStyleList(enumStyle).split(',');\n    },\n\n    /**\n     * when you say set the textstyle of char 999 of cd fld \"fld1\",\n     * adjust to fit into what's actually there\n     */\n    fitBounds(txtlen: number, inStart: number, inLen: number, isGet: boolean) {\n        if (isGet && inLen === 0) {\n            inLen = 1;\n        }\n\n        let end = inStart + inLen;\n        let start = fitIntoInclusive(inStart, 0, txtlen - 1);\n        end = fitIntoInclusive(end, start, txtlen);\n        return [start, end];\n    },\n\n    /**\n     * get attribute of a chunk of text\n     * if it varies, we'll return \"mixed\".\n     */\n    _getChunkTextAttribute(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        fn: (s: string) => string\n    ) {\n        if (txt.len() === 0 || inStart >= txt.len()) {\n            return fn(defaultFont);\n        }\n\n        let seenAttr = '';\n        let [start, end] = this.fitBounds(txt.len(), inStart, inLen, true);\n        for (let i = start; i < end; i++) {\n            let attr = fn(txt.fontAt(i));\n            if (seenAttr !== '' && seenAttr !== attr) {\n                return 'mixed';\n            } else {\n                seenAttr = attr;\n            }\n        }\n\n        return seenAttr ? seenAttr : fn(defaultFont);\n    },\n\n    /**\n     * set attribute of a chunk of text\n     */\n    _setChunkTextAttribute(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        fn: (s: string) => string\n    ) {\n        if (txt.len() === 0 || inStart >= txt.len()) {\n            return;\n        }\n\n        let [start, end] = this.fitBounds(txt.len(), inStart, inLen, false);\n        for (let i = start; i < end; i++) {\n            txt.setFontAt(i, fn(txt.fontAt(i)));\n        }\n    },\n\n    /**\n     * get typeface of chunk, \"courier\" or \"mixed\" if there's more than one typeface\n     */\n    getChunkTextFaceOrMixed(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number\n    ): string {\n        let fn = (s: string) => TextFontSpec.getTypeface(s);\n        return this._getChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n    },\n\n    /**\n     * set typeface of chunk\n     */\n    setChunkTextFace(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        sNext: string\n    ) {\n        let fn = (scurrent: string) => TextFontSpec.setTypeface(scurrent, sNext);\n        return this._setChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n    },\n\n    /**\n     * get point size of chunk, \"12\" or \"mixed\" if it varies\n     */\n    getChunkTextSizeOrMixed(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number\n    ): number | string {\n        let fn = (s: string) => TextFontSpec.getFontSize(s);\n        let ret = this._getChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n        let n = Util512.parseInt(ret);\n        return ret === 'mixed' ? ret : n ?? 0;\n    },\n\n    /**\n     * set point size of chunk\n     */\n    setChunkTextSize(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        next: number\n    ) {\n        let ssize = next.toString();\n        let fn = (scurrent: string) => TextFontSpec.setFontSize(scurrent, ssize);\n        return this._setChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n    },\n\n    /**\n     * get font style of chunk, [\"bold\", \"italic\"] or [\"mixed\"] if it varies\n     */\n    getChunkTextStyleOrMixed(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number\n    ): string[] {\n        let fn = (s: string) => TextFontSpec.getFontStyle(s);\n        let ret = this._getChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n        return ret === 'mixed' ? ['mixed'] : this.lowStringToStyleList(ret);\n    },\n\n    /**\n     * set font style of chunk\n     */\n    setChunkTextStyleSimple(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        list: string[]\n    ) {\n        let sNext = this.styleListToLowString(list);\n        let fn = (scurrent: string) => TextFontSpec.setFontStyle(scurrent, sNext);\n        return this._setChunkTextAttribute(txt, defaultFont, inStart, inLen, fn);\n    },\n\n    /**\n     * set font style of chunk. \"add-bold\" \"subtract-italic\"\n     */\n    _setChunkTextStyleAddOrSub(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        spec: string\n    ) {\n        let isAdd: boolean;\n        if (spec.startsWith('add-')) {\n            isAdd = true;\n            spec = spec.substr('add-'.length);\n        } else if (spec.startsWith('subtract-')) {\n            isAdd = false;\n            spec = spec.substr('subtract-'.length);\n        }\n\n        if (spec === 'plain') {\n            return;\n        }\n        let bitToModify = this.styleListToInt([spec]);\n        let f = (full: string) => {\n            let low = TextFontSpec.getFontStyle(full);\n            let n = stringToTextFontStyling(low);\n            if (isAdd) {\n                n |= bitToModify;\n            } else {\n                n &= ~bitToModify;\n            }\n\n            return TextFontSpec.setFontStyle(full, textFontStylingToString(n));\n        };\n\n        this._setChunkTextAttribute(txt, defaultFont, inStart, inLen, f);\n    },\n\n    /**\n     * return true if any characters have a style\n     */\n    doAnyCharactersNotHaveThisStyle(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        styleToCheck: string\n    ) {\n        checkThrow512(styleToCheck !== 'plain', 'V5|cannot ask if it contains plain');\n        let bitToCheck = this.styleListToInt([styleToCheck]);\n        let sawOneWithoutIt = false;\n        let f = (full: string) => {\n            let low = TextFontSpec.getFontStyle(full);\n            let n = stringToTextFontStyling(low);\n            if ((n & bitToCheck) === 0) {\n                sawOneWithoutIt = true;\n            }\n\n            return '_';\n        };\n\n        this._getChunkTextAttribute(txt, defaultFont, inStart, inLen, f);\n        return sawOneWithoutIt;\n    },\n\n    /**\n     * set font style of chunk. \"toggle-outline\"\n     */\n    _setChunkTextStyleToggle(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        spec: string\n    ) {\n        checkThrow512(spec.startsWith('toggle-'), 'V4|');\n        spec = spec.substr('toggle-'.length);\n        checkThrow512(spec !== 'plain', 'V3|cannot say toggle-plain');\n        if (spec === 'condense') {\n            this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                'subtract-extend'\n            );\n        } else if (spec === 'extend') {\n            this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                'subtract-condense'\n            );\n        }\n\n        let onesWithout = this.doAnyCharactersNotHaveThisStyle(\n            txt,\n            defaultFont,\n            inStart,\n            inLen,\n            spec\n        );\n        if (onesWithout) {\n            this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                'add-' + spec\n            );\n        } else {\n            this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                'subtract-' + spec\n            );\n        }\n    },\n\n    /**\n     * set font style of chunk, supports \"add-bold\" \"subtract-italic\" \"toggle-outline\"\n     */\n    setChunkTextStyleAdvanced(\n        txt: FormattedText,\n        defaultFont: string,\n        inStart: number,\n        inLen: number,\n        list: string[]\n    ) {\n        if (list.length === 1 && list[0].startsWith('add-')) {\n            return this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                list[0]\n            );\n        } else if (list.length === 1 && list[0].startsWith('subtract-')) {\n            return this._setChunkTextStyleAddOrSub(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                list[0]\n            );\n        } else if (list.length === 1 && list[0].startsWith('toggle-')) {\n            return this._setChunkTextStyleToggle(\n                txt,\n                defaultFont,\n                inStart,\n                inLen,\n                list[0]\n            );\n        }\n\n        checkThrow512(\n            !list.some(\n                item =>\n                    item.startsWith('add-') ||\n                    item.startsWith('subtract-') ||\n                    item.startsWith('toggle-')\n            ),\n            'V2|you can only say add- subtract- or toggle- if one style is given'\n        );\n        return this.setChunkTextStyleSimple(txt, defaultFont, inStart, inLen, list);\n    },\n\n    /**\n     * go from (\"add-bold\", \"biuosdce\") to \"+biuosdce\"\n     * do this by creating a temp string and calling setChunkTextStyleAdvanced\n     */\n    setGeneralTextStyleAdvanced(low: string, spec: string) {\n        let txt = new FormattedText();\n        /* it doesn't matter what character is used */\n        txt.fromSerialized(' ');\n        let full = TextFontSpec.setFontStyle(UI512FontRequest.defaultFont, low);\n        txt.setFontAt(0, full);\n        this.setChunkTextStyleAdvanced(\n            txt,\n            UI512FontRequest.defaultFont,\n            0,\n            1,\n            spec.split(',')\n        );\n        return TextFontSpec.getFontStyle(txt.fontAt(0));\n    },\n\n    /**\n     * go from (\"add-bold\", TextFontStyling.Italic) to TextFontStyling.Italic|Bold\n     */\n    setGeneralTextStyleAdvancedInt(n: number, spec: string) {\n        return stringToTextFontStyling(\n            this.setGeneralTextStyleAdvanced(textFontStylingToString(n), spec)\n        );\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawText.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { UI512IsDrawTextInterface } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { arLast } from './../utils/util512';\n/* auto */ import { FormattedText } from './ui512FormattedText';\n/* auto */ import { UI512FontRequest } from './ui512DrawTextFontRequest';\n/* auto */ import { CharRectType, DrawCharResult, TextRendererFont, largeArea, specialCharFontChange, specialCharNumNewline, specialCharNumZeroPixelChar, typefacenameToTypefaceIdFull } from './ui512DrawTextClasses';\n/* auto */ import { UI512DrawChar } from './ui512DrawTextChar';\n/* auto */ import { DrawTextArgs } from './ui512DrawTextArgs';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nconst space = ' '.charCodeAt(0);\nconst dash = '-'.charCodeAt(0);\n\n/**\n * main class to draw text.\n */\nexport class UI512DrawText implements UI512IsDrawTextInterface {\n    cache = new UI512FontRequest();\n    static readonly defaultFont = UI512FontRequest.defaultFont;\n    static readonly smallestFont = UI512FontRequest.smallestFont;\n\n    /**\n     * check if font is supported\n     */\n    isFontSupported(font: string) {\n        font = typefacenameToTypefaceIdFull(font);\n        let gridkey = this.cache.stripManuallyAddedStylingToGetGridKey(font);\n        return this.cache.cachedGrids[gridkey] !== undefined;\n    }\n\n    /**\n     * measure dimensions of text without drawing onto a canvas\n     */\n    measureString(s: string) {\n        let args = new DrawTextArgs(0, 0, largeArea, largeArea, false, false, false);\n        return this.drawStringIntoBox(s, undefined, args);\n    }\n\n    /**\n     * draws a (plain text) string, returns undefined if still waiting\n     * for the font to load.\n     */\n    drawStringIntoBox(\n        s: string,\n        canvas: O<CanvasWrapper>,\n        args: DrawTextArgs\n    ): O<DrawCharResult> {\n        if (s === null || s === undefined) {\n            assertTrue(false, '3M|tried to draw null string...');\n        }\n\n        let text = new FormattedText();\n        text.fromSerialized(s);\n        return this.drawFormattedStringIntoBox(text, canvas, args);\n    }\n\n    /**\n     * draws a (formatted) string, returns undefined if still waiting for\n     * the font to load.\n     */\n    drawFormattedStringIntoBox(\n        text: FormattedText,\n        canvas: O<CanvasWrapper>,\n        args: DrawTextArgs\n    ): O<DrawCharResult> {\n        if (!text) {\n            return new DrawCharResult(args.boxX, args.boxX + 1, args.boxY + 1);\n        }\n\n        /* the default font must be available */\n        if (\n            !this.cache.findFont(UI512DrawText.defaultFont) ||\n            !this.cache.findFont(args.defaultFont)\n        ) {\n            return undefined;\n        }\n\n        /* are any of the fonts not available? if so, exit early */\n        for (let i = 0; i < text.len(); i++) {\n            if (!this.cache.findFont(text.fontAt(i))) {\n                return undefined;\n            }\n        }\n\n        return this.drawStringIntoBoxImpl(text, canvas, args);\n    }\n\n    /**\n     * wrap text, one character at a time. e.g, if there is a long string with no spaces,\n     * fall back to wrapping one character at a time.\n     */\n    protected wrapTextIntoLinesOneCharAtATime(\n        s: FormattedText,\n        boxW: number,\n        ret: LineTextToRender[],\n        retStarts: number[],\n        charNum: number,\n        measurements: DrawCharResult[],\n        curX: number\n    ) {\n        if (\n            curX + measurements[charNum].newLogicalX >= boxW &&\n            arLast(ret).text.len() > 0\n        ) {\n            ret.push(new LineTextToRender());\n            retStarts.push(charNum);\n            curX = 0;\n        }\n\n        arLast(ret).text.push(s.charAt(charNum), s.fontAt(charNum));\n        curX += measurements[charNum].newLogicalX;\n        return curX;\n    }\n\n    /**\n     * get width in pixels of a span of text.\n     */\n    protected measureSpanOfText(measurements: DrawCharResult[], n1: number, n2: number) {\n        let total = 0;\n        for (let i = n1; i < n2; i++) {\n            total += measurements[i].newLogicalX;\n        }\n\n        return total;\n    }\n\n    /**\n     * wrap text into lines.\n     * 1) measure the size of characters\n     * 2) split by words\n     * 3) add placeholder at end of string\n     * 4) place words into LineTextToRender\n     */\n    protected wrapTextIntoLines(\n        s: FormattedText,\n        args: DrawTextArgs\n    ): [LineTextToRender[], DrawCharResult[]] {\n        let measurements: DrawCharResult[] = [];\n        let words: FormattedText[] = [new FormattedText()];\n        let wordStarts: number[] = [0];\n        for (let i = 0; i < s.len(); i++) {\n            /* 1) measure the size of characters */\n            let c = s.charAt(i);\n            let font = s.fontAt(i);\n            let fontObj = this.cache.getFont(font);\n            measurements[i] = UI512DrawChar.draw(\n                fontObj,\n                c,\n                0,\n                largeArea / 2,\n                0,\n                0,\n                largeArea,\n                largeArea,\n                undefined\n            );\n\n            /* 2) split by words */\n            if (i > 0) {\n                let prevC = s.charAt(i - 1);\n                if (\n                    prevC === specialCharNumNewline ||\n                    prevC === space ||\n                    prevC === dash\n                ) {\n                    words.push(new FormattedText());\n                    wordStarts.push(i);\n                }\n            }\n\n            arLast(words).push(c, font);\n        }\n\n        /* 3) placeholder for the end of the string,\n        for convenience drawing the selection when end of string is selected */\n        let fontLast = s.len() === 0 ? args.defaultFont : s.fontAt(s.len() - 1);\n        words.push(new FormattedText());\n        arLast(words).push(specialCharNumZeroPixelChar, fontLast);\n        wordStarts.push(s.len());\n\n        /* 4) place words into LineTextToRender */\n        let boxW = args.wrap ? args.boxW : largeArea;\n        boxW = Math.max(1, boxW);\n        let ret = [new LineTextToRender()];\n        let retStarts: number[] = [0];\n        let curX = 0;\n        for (let nWord = 0; nWord < words.length; nWord++) {\n            /* make a new line if the last word ended with a newline */\n            let word = words[nWord];\n            if (nWord > 0) {\n                let prevWord = words[nWord - 1];\n                if (prevWord.charAt(prevWord.len() - 1) === specialCharNumNewline) {\n                    ret.push(new LineTextToRender());\n                    retStarts.push(wordStarts[nWord]);\n                    curX = 0;\n                }\n            }\n\n            /* measure the text, unless it's the placeholder at the end */\n            let wordMeasured = 0;\n            if (nWord < words.length - 1) {\n                wordMeasured = this.measureSpanOfText(\n                    measurements,\n                    wordStarts[nWord],\n                    wordStarts[nWord + 1]\n                );\n            }\n\n            let nextX = curX + wordMeasured;\n            if (nextX < boxW) {\n                /* it fits on the line */\n                arLast(ret).text.append(word);\n                curX = nextX;\n            } else if (wordMeasured < boxW) {\n                /* it would fit on *a* line, just not this line */\n                if (arLast(ret).text.len()) {\n                    ret.push(new LineTextToRender());\n                    retStarts.push(wordStarts[nWord]);\n                    curX = 0;\n                }\n\n                nextX = curX + wordMeasured;\n                arLast(ret).text.append(word);\n                curX = nextX;\n            } else {\n                /* it won't fit on any line at all... */\n                /* first go down to the next line if we're not at the start of a line */\n                if (arLast(ret).text.len()) {\n                    ret.push(new LineTextToRender());\n                    retStarts.push(wordStarts[nWord]);\n                    curX = 0;\n                }\n\n                /* then add chars 1 by 1 */\n                for (\n                    let charNum = wordStarts[nWord];\n                    charNum < wordStarts[nWord + 1];\n                    charNum++\n                ) {\n                    curX = this.wrapTextIntoLinesOneCharAtATime(\n                        s,\n                        boxW,\n                        ret,\n                        retStarts,\n                        charNum,\n                        measurements,\n                        curX\n                    );\n                }\n            }\n        }\n\n        /* putting abc\\ndef into a very narrow field of width 1px, wrapping enabled\n        adds an extra vertical space between the c and the d\n        doesn't look that bad, but maybe something to revisit */\n\n        /* set charIndices */\n        for (let lineNum = 0; lineNum < ret.length; lineNum++) {\n            let line = ret[lineNum];\n            line.charIndices = [];\n            for (\n                let charnum = retStarts[lineNum];\n                charnum < retStarts[lineNum] + line.text.len();\n                charnum++\n            ) {\n                line.charIndices.push(charnum);\n            }\n        }\n\n        return [ret, measurements];\n    }\n\n    /**\n     * draw the caret, a vertical line\n     */\n    protected drawCaret(args: DrawTextArgs, canvas: CanvasWrapper, bounds: number[]) {\n        canvas.fillRect(\n            bounds[0],\n            bounds[1],\n            1,\n            bounds[3],\n            args.boxX,\n            args.boxY,\n            args.boxW,\n            args.boxH,\n            'black'\n        );\n    }\n\n    /**\n     * show text as selected by inverting the colors\n     */\n    protected drawSelected(\n        args: DrawTextArgs,\n        canvas: CanvasWrapper,\n        bounds: number[],\n        type: CharRectType\n    ) {\n        canvas.invertColorsRect(\n            bounds[0],\n            bounds[1],\n            bounds[2],\n            bounds[3],\n            args.boxX,\n            args.boxY,\n            args.boxW,\n            args.boxH\n        );\n    }\n\n    /**\n     * for each character, run the callback, draw the caret,\n     * highlight the letter if it should be selected\n     */\n    protected callPerChar(\n        args: DrawTextArgs,\n        canvas: O<CanvasWrapper>,\n        charIndex: number,\n        type: CharRectType,\n        bounds: number[]\n    ): ShouldContinueDrawing {\n        /* run the callback and see if it's telling us to stop looping */\n        if (\n            args.callbackPerChar &&\n            args.callbackPerChar(charIndex, type, bounds) === false\n        ) {\n            return ShouldContinueDrawing.No;\n        }\n\n        if (canvas && args.selCaret === args.selEnd) {\n            /* draw the caret */\n            if (\n                args.showCaret &&\n                args.selCaret === charIndex &&\n                type === CharRectType.Char\n            ) {\n                this.drawCaret(args, canvas, bounds);\n            }\n        } else if (canvas) {\n            /* highlight the selected text */\n            if (\n                args.selCaret < args.selEnd &&\n                charIndex >= args.selCaret &&\n                charIndex < args.selEnd\n            ) {\n                this.drawSelected(args, canvas, bounds, type);\n            } else if (\n                args.selEnd < args.selCaret &&\n                charIndex >= args.selEnd &&\n                charIndex < args.selCaret\n            ) {\n                this.drawSelected(args, canvas, bounds, type);\n            }\n        }\n\n        return ShouldContinueDrawing.Yes;\n    }\n\n    /**\n     * draw one line of text\n     */\n    protected drawStringIntoBoxImplLine(\n        curX: number,\n        curY: number,\n        baseline: number,\n        text: FormattedText,\n        canvas: O<CanvasWrapper>,\n        args: DrawTextArgs,\n        line: LineTextToRender,\n        ret: DrawCharResult\n    ) {\n        assertTrue(\n            args.selCaret !== undefined && args.selCaret !== null,\n            '3L|invalid selection'\n        );\n        assertTrue(\n            args.selEnd !== undefined && args.selEnd !== null,\n            '3K|invalid selection'\n        );\n        for (let i = 0; i < text.len(); i++) {\n            let fontObj = this.cache.getFont(text.fontAt(i));\n            let drawn = UI512DrawChar.draw(\n                fontObj,\n                text.charAt(i),\n                curX,\n                baseline,\n                args.boxX,\n                args.boxY,\n                args.boxW,\n                args.boxH,\n                canvas\n            );\n\n            let prevX = curX;\n            curX = drawn.newLogicalX;\n            ret.update(drawn);\n            let prevXForBounds = prevX + 1;\n            let curXForBounds = curX + 1;\n\n            /* the \"logical\" bounds is the full area surrounding the character,\n            the area that is highlighted when char is selected */\n            let cbounds = [\n                prevXForBounds,\n                curY,\n                curXForBounds - prevXForBounds,\n                line.tallestLineHeight\n            ];\n            if (\n                this.callPerChar(\n                    args,\n                    canvas,\n                    line.charIndices[i],\n                    CharRectType.Char,\n                    cbounds\n                ) === ShouldContinueDrawing.No\n            ) {\n                return ret;\n            }\n\n            /* region to the left of the text on this line (can be large if\n            field is haligned) */\n            if (i === 0) {\n                let bounds = [\n                    args.boxX,\n                    curY,\n                    prevXForBounds - args.boxX,\n                    line.tallestLineHeight\n                ];\n                if (bounds[2] >= 0 && bounds[3] >= 0) {\n                    if (\n                        this.callPerChar(\n                            args,\n                            canvas,\n                            line.charIndices[i],\n                            CharRectType.SpaceToLeft,\n                            bounds\n                        ) === ShouldContinueDrawing.No\n                    ) {\n                        return ret;\n                    }\n                }\n            }\n\n            /* region to the right of the text on this line */\n            if (i === text.len() - 1) {\n                let bounds = [\n                    curXForBounds,\n                    curY,\n                    args.boxX + args.boxW - curXForBounds,\n                    line.tallestLineHeight\n                ];\n                if (bounds[2] >= 0 && bounds[3] >= 0) {\n                    if (\n                        this.callPerChar(\n                            args,\n                            canvas,\n                            line.charIndices[i],\n                            CharRectType.SpaceToRight,\n                            bounds\n                        ) === ShouldContinueDrawing.No\n                    ) {\n                        return ret;\n                    }\n                }\n            }\n        }\n\n        return ShouldContinueDrawing.Yes;\n    }\n\n    /**\n     * draw as asterisk (or solid dot to mimic original os)\n     * \"ask password\"\n     */\n    static makeAsteriskOnlyIfApplicable(textin: FormattedText, args: DrawTextArgs) {\n        if (!args.asteriskOnly) {\n            return textin;\n        }\n\n        let modifiedText = textin.clone();\n        let c = '\\xA5'.charCodeAt(0);\n        for (let i = 0; i < modifiedText.len(); i++) {\n            modifiedText.setCharAt(i, c);\n        }\n\n        modifiedText.lock();\n        return modifiedText;\n    }\n\n    /**\n     * main draw text implementation\n     */\n    protected drawStringIntoBoxImpl(\n        textIn: FormattedText,\n        canvas: O<CanvasWrapper>,\n        args: DrawTextArgs\n    ): DrawCharResult {\n        /* divide into lines */\n        textIn = UI512DrawText.makeAsteriskOnlyIfApplicable(textIn, args);\n        let [lines, measurements] = this.wrapTextIntoLines(textIn, args);\n\n        /* measure dimensions */\n        let totalHeight = 0;\n        let lastHeightMeasured = 0;\n        let lastCapHeightMeasured = 0;\n        for (let i = 0, len = lines.length; i < len; i++) {\n            let line = lines[i];\n            line.measureWidth(this.cache, measurements);\n            line.measureHeight(\n                this.cache,\n                args.addVSpacing,\n                lastHeightMeasured,\n                lastCapHeightMeasured\n            );\n            totalHeight += line.tallestLineHeight;\n            lastHeightMeasured = line.tallestLineHeight;\n            lastCapHeightMeasured = line.tallestCapHeight;\n        }\n\n        /* align vertically if requested */\n        let curY = args.boxY - args.vScrollAmt;\n        if (args.vAlign) {\n            curY = args.boxY + Math.trunc((args.boxH - totalHeight) / 2);\n        }\n\n        /* align horizontally if requested */\n        let getPositionLineStart = (lineno: number) => {\n            if (args.hAlign) {\n                return args.boxX + Math.trunc((args.boxW - lines[lineno].width) / 2) - 1;\n            } else {\n                return args.boxX - args.hScrollAmt;\n            }\n        };\n\n        let ret = new DrawCharResult(-1, -1, -1);\n        let curX = 0;\n        for (let lineno = 0; lineno < lines.length; lineno++) {\n            curX = getPositionLineStart(lineno);\n            let baseline = curY + lines[lineno].tallestCapHeight;\n            let text = lines[lineno].text;\n            assertTrue(text.len() > 0, '3J|cannot draw empty line');\n\n            if (!args.drawBeyondVisible && curY > args.boxY + args.boxH) {\n                /* perf optimization, don't need to keep drawing chars beyond the field */\n                return ret;\n            } else if (\n                !args.drawBeyondVisible &&\n                curY + lines[lineno].tallestLineHeight < args.boxY\n            ) {\n                /* perf optimization, skip this line since it is above visible text */\n            } else {\n                /* draw this line of text */\n                let r = this.drawStringIntoBoxImplLine(\n                    curX,\n                    curY,\n                    baseline,\n                    text,\n                    canvas,\n                    args,\n                    lines[lineno],\n                    ret\n                );\n                if (r !== ShouldContinueDrawing.Yes) {\n                    return r;\n                }\n            }\n\n            curY += lines[lineno].tallestLineHeight;\n        }\n\n        return ret;\n    }\n\n    /**\n     * set initial font of the string, preparing FormattedText.newFromSerialized\n     */\n    static setFont(s: string, font: string) {\n        return specialCharFontChange + font + specialCharFontChange + s;\n    }\n\n    /**\n     * will set the font to grayed.\n     */\n    static makeInitialTextGrayed(s: string) {\n        let defaultGrayed =\n            specialCharFontChange + 'chicago_12_biuos+dce' + specialCharFontChange;\n        if (s.length === 0) {\n            /* empty string, no point in changing style */\n            return s;\n        } else if (!s.startsWith(specialCharFontChange)) {\n            /* text uses the default font, so add grayed style */\n            return defaultGrayed + s;\n        } else {\n            /* make it grayed everywhere */\n            let obj = new FormattedText();\n            obj.fromSerialized(s);\n            for (let i = 0; i < obj.len(); i++) {\n                let spec = obj.fontAt(i);\n                spec = spec.replace(/sd/, 's+d');\n                obj.setFontAt(i, spec);\n            }\n\n            return obj.toSerialized();\n        }\n    }\n}\n\n/**\n * we draw text one line at a time\n * this helps for computing horizontal alignment\n */\nclass LineTextToRender {\n    text = new FormattedText();\n    tallestLineHeight = -1;\n    tallestCapHeight = -1;\n    width = -1;\n    charIndices: number[] = [];\n\n    /**\n     * get total height of the line (in pixels). need to check every character,\n     * because there could be one very tall character in a different font\n     */\n    measureHeight(\n        cache: UI512FontRequest,\n        addVSpacing: number,\n        lastHeightMeasured: number,\n        lastCapHeightMeasured: number\n    ) {\n        if (this.text.len() === 0) {\n            this.tallestLineHeight = lastHeightMeasured;\n            this.tallestCapHeight = lastCapHeightMeasured;\n            return;\n        }\n\n        this.tallestLineHeight = 0;\n        this.tallestCapHeight = 0;\n        let currentFont: TextRendererFont;\n\n        for (let i = 0; i < this.text.len(); i++) {\n            currentFont = cache.getFont(this.text.fontAt(i));\n            this.tallestLineHeight = Math.max(\n                this.tallestLineHeight,\n                currentFont.grid.getLineHeight()\n            );\n            this.tallestCapHeight = Math.max(\n                this.tallestCapHeight,\n                currentFont.grid.getCapHeight()\n            );\n        }\n\n        this.tallestLineHeight += addVSpacing;\n    }\n\n    /**\n     * get total width of this line (in pixels)\n     */\n    measureWidth(cache: UI512FontRequest, measurements: DrawCharResult[]) {\n        let curX = 0;\n        for (let i = 0; i < this.text.len(); i++) {\n            if (this.text.charAt(i) !== specialCharNumZeroPixelChar) {\n                let drawn = this.measureChar(i, measurements);\n                assertTrue(drawn !== undefined, 'I[|');\n                curX += drawn.newLogicalX;\n            }\n        }\n\n        this.width = curX;\n    }\n\n    /**\n     * get measurements of a character\n     */\n    measureChar(i: number, measurements: DrawCharResult[]) {\n        let totalNumber = this.charIndices[i];\n        return measurements[totalNumber];\n    }\n}\n\n/**\n * indicate if we should continue drawing text\n */\nconst enum ShouldContinueDrawing {\n    None = 1,\n    No,\n    Yes\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawTextArgs.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { FormattedText } from './ui512FormattedText';\n/* auto */ import { UI512FontRequest } from './ui512DrawTextFontRequest';\n/* auto */ import { CharRectType } from './ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * arguments that will be passed to DrawText\n */\nexport class DrawTextArgs {\n    constructor(\n        public boxX: number,\n        public boxY: number,\n        public boxW: number,\n        public boxH: number,\n        public hAlign = false,\n        public vAlign = false,\n        public wrap = false\n    ) {}\n\n    addVSpacing = 0;\n    vScrollAmt = 0;\n    hScrollAmt = 0;\n    selCaret = -1;\n    selEnd = -1;\n    showCaret = false;\n    drawBeyondVisible = true;\n    asteriskOnly = false;\n    defaultFont = UI512FontRequest.defaultFont;\n    callbackPerChar: O<\n        (charIndex: number, type: CharRectType, bounds: number[]) => boolean\n    >;\n}\n\n/**\n * fill out a DrawTextArgs object\n * based on the properties of a text field element\n */\nexport function drawTextArgsFromEl(\n    el: CanGetValue,\n    subRect: number[],\n    hasFocus: boolean\n): [DrawTextArgs, FormattedText] {\n    let args = new DrawTextArgs(\n        subRect[0],\n        subRect[1],\n        subRect[2],\n        subRect[3],\n        el.getB('labelhalign'),\n        el.getB('labelvalign'),\n        el.getB('labelwrap')\n    );\n\n    /* adjust positions */\n    args.boxX += el.getN('nudgex');\n    args.boxY += el.getN('nudgey');\n    args.boxW -= el.getN('nudgex');\n    args.boxH -= el.getN('nudgey');\n\n    /* we currently don't support v-aligned text fields. can be used in a label. */\n    args.vAlign = false;\n    args.addVSpacing = el.getN('addvspacing');\n    args.hScrollAmt = 0;\n    args.vScrollAmt = el.getN('scrollamt');\n    args.defaultFont = el.getS('defaultFont');\n    args.asteriskOnly = el.getB('asteriskonly');\n\n    if (el.getB('selectbylines')) {\n        /* always show the highlight, even when text in another field is being edited. */\n        hasFocus = true;\n\n        /* shrink margins of the field. */\n        args.boxX -= 2;\n        args.boxW += 4;\n    }\n\n    if (hasFocus && el.getB('canselecttext')) {\n        args.selCaret = el.getN('selcaret');\n        args.selEnd = el.getN('selend');\n        args.showCaret = el.getB('showcaret');\n    }\n\n    if (el.getB('selectbylines') && args.selCaret === args.selEnd) {\n        /* when selecting by lines, don't show the normal blinking caret */\n        args.showCaret = false;\n    }\n\n    let ret: FormattedText = el.getFmTxt();\n    return [args, ret];\n}\n\n/**\n * rough structure of a _UI512Gettable_\n */\ninterface CanGetValue {\n    getB(s: string): boolean;\n    getN(s: string): number;\n    getS(s: string): string;\n    getFmTxt(): FormattedText;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawTextChar.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { DrawCharResult, TextFontStyling, TextRendererFont, specialCharNumNewline, specialCharNumNonBreakingSpace, specialCharNumOnePixelSpace, specialCharNumTab, specialCharNumZeroPixelChar } from './ui512DrawTextClasses';\n/* auto */ import { UI512DrawTextCharGrayed } from './ui512DrawTextCharGrayed';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nconst space = ' '.charCodeAt(0);\n\n/**\n * draw one character onto a canvas\n * returns metadata/dimensions of the character drawn\n */\nexport const UI512DrawChar = /* static class */ {\n    /**\n     * draw a character, does some redirection like unknown -> ?\n     * and tab -> spaces\n     */\n    draw(\n        font: TextRendererFont,\n        n: number,\n        x: number,\n        baseline: number,\n        destX0: number,\n        destY0: number,\n        destW: number,\n        destH: number,\n        canvas?: O<CanvasWrapper>\n    ): DrawCharResult {\n        if (n === specialCharNumTab) {\n            /* to draw a tab, just draw 4 spaces */\n            let ret = new DrawCharResult(0, 0, 0);\n            for (let i = 0; i < ScrollConsts.TabSize; i++) {\n                ret = UI512DrawChar.draw(\n                    font,\n                    space,\n                    x,\n                    baseline,\n                    destX0,\n                    destY0,\n                    destW,\n                    destH,\n                    canvas\n                );\n                x = ret.newLogicalX;\n            }\n\n            return ret;\n        } else if (n === specialCharNumOnePixelSpace) {\n            /* character 1 is a one-pixel spacer */\n            /* pretend to draw a 1x1 pixel, exit early before applying any styling */\n            return new DrawCharResult(x + 1, x, baseline);\n        } else if (n === specialCharNumNewline) {\n            /* character is a zero-pixel placeholder representing the newline */\n            return new DrawCharResult(x, x, baseline);\n        } else if (n === specialCharNumZeroPixelChar) {\n            /* character is a zero-pixel placeholder */\n            return new DrawCharResult(x, x, baseline);\n        } else if (n === specialCharNumNonBreakingSpace) {\n            /* draw a nbsp as a space, the only place nbsp is different is in\n            GetCharClass */\n            n = space;\n        } else if (n < 32 || n >= font.grid.metrics.bounds.length) {\n            /* invalid characters drawn as '?' */\n            n = '?'.charCodeAt(0);\n        }\n\n        return UI512DrawChar._drawImpl(\n            font,\n            n,\n            x,\n            baseline,\n            destX0,\n            destY0,\n            destW,\n            destH,\n            canvas\n        );\n    },\n\n    /**\n     * draws a character\n     */\n    _drawImpl(\n        font: TextRendererFont,\n        n: number,\n        x: number,\n        baseline: number,\n        destX0: number,\n        destY0: number,\n        destW: number,\n        destH: number,\n        canvas?: O<CanvasWrapper>\n    ): DrawCharResult {\n        /* these decorations are flags on the TextRendererFont\n        rather than part of the grid. */\n        assertTrue(\n            (font.grid.spec.style & TextFontStyling.Underline) === 0,\n            '3S|style should have been removed'\n        );\n        assertTrue(\n            (font.grid.spec.style & TextFontStyling.Condense) === 0,\n            '3R|style should have been removed'\n        );\n        assertTrue(\n            (font.grid.spec.style & TextFontStyling.Extend) === 0,\n            '3Q|style should have been removed'\n        );\n\n        /* get dimensions of the subset from source image */\n        let bounds = font.grid.metrics.bounds[n] as number[];\n        assertTrue(bounds && bounds.length >= 6, '3P|invalid bounds');\n        let logicalHorizontalSpace = bounds[4];\n        let verticalOffset = bounds[5];\n\n        /* get coordinates within source image */\n        let srcX = bounds[0] + (font.grid.metrics.leftmost - 1);\n        let srcY = bounds[1];\n        let srcW = bounds[2] - (font.grid.metrics.leftmost - 1);\n        let srcH = bounds[3];\n\n        /* ensure dimensions are >= 1; there are empty chars like an italics space */\n        srcW = Math.max(1, srcW);\n        srcH = Math.max(1, srcH);\n\n        /* get destination coordinates */\n        let destX = x;\n        let destY = baseline + verticalOffset - font.grid.metrics.capHeight;\n\n        /* get logical spacing */\n        /* for example, when drawing italics,\n        the spacing < the width of the character drawn */\n        let spacing = logicalHorizontalSpace - font.grid.metrics.leftmost;\n        spacing += font.grid.adjustHSpacing ?? 0;\n        if (font.extend && !font.condense) {\n            spacing = Math.max(1, spacing + 1);\n        } else if (font.condense && !font.extend) {\n            spacing = Math.max(1, spacing - 1);\n        } else {\n            spacing = Math.max(1, spacing);\n        }\n\n        if (canvas) {\n            if (font.grayed) {\n                UI512DrawTextCharGrayed.go(\n                    font.grid.image,\n                    canvas,\n                    srcX,\n                    srcY,\n                    srcW,\n                    srcH,\n                    destX,\n                    destY,\n                    destX0,\n                    destY0,\n                    destW,\n                    destH\n                );\n            } else {\n                canvas.drawFromImage(\n                    font.grid.image,\n                    srcX,\n                    srcY,\n                    srcW,\n                    srcH,\n                    destX,\n                    destY,\n                    destX0,\n                    destY0,\n                    destW,\n                    destH\n                );\n            }\n\n            /* following original os, underline follows the drawn width\n            if longer than the logical width */\n            if (font.underline) {\n                let underlinelength = Math.max(srcW + 1, spacing);\n                canvas.fillRect(\n                    destX,\n                    baseline + 1,\n                    underlinelength,\n                    1,\n                    destX0,\n                    destY0,\n                    destW,\n                    destH,\n                    'black'\n                );\n            }\n        }\n\n        return new DrawCharResult(x + spacing, destX + srcW, destY + srcH);\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawTextCharGrayed.ts",
    "content": "\n/* auto */ import { CanvasWrapper, DrawableImage } from './../utils/utilsCanvasDraw';\n/* auto */ import { O } from './../utils/util512Base';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport const UI512DrawTextCharGrayed = /* static class */ {\n    maxCharWidth: 64 as const,\n    maxCharHeight: 64 as const,\n    tempCanvas: undefined as O<CanvasWrapper>,\n    ensureTempCanvas(): CanvasWrapper {\n        /* create the cached mem canvas if we don't have one */\n        if (!this.tempCanvas) {\n            this.tempCanvas = CanvasWrapper.createMemoryCanvas(\n                this.maxCharWidth,\n                this.maxCharHeight\n            );\n        }\n\n        /* erase any previous contents */\n        this.tempCanvas.clear();\n        return this.tempCanvas;\n    },\n    go(\n        img: DrawableImage,\n        dest: CanvasWrapper,\n        srcX: number,\n        srcY: number,\n        width: number,\n        height: number,\n        destX: number,\n        destY: number,\n        boxX: number,\n        boxY: number,\n        boxW: number,\n        boxH: number\n    ) {\n        let cnvs = this.ensureTempCanvas();\n        /* draw font character onto the temp canvas */\n        cnvs.drawFromImage(\n            img,\n            srcX,\n            srcY,\n            width,\n            height,\n            0,\n            0,\n            0,\n            0,\n            cnvs.canvas.width,\n            cnvs.canvas.height\n        );\n\n        /* make every other pixel transparent */\n        let parity = (destX + destY) % 2;\n        this.makeCheckered(cnvs, parity);\n\n        /* draw the results */\n        dest.drawFromImage(\n            cnvs.canvas,\n            0,\n            0,\n            cnvs.canvas.width,\n            cnvs.canvas.height,\n            destX,\n            destY,\n            boxX,\n            boxY,\n            boxW,\n            boxH\n        );\n    },\n\n    /**\n     * make every other pixel transparent\n     */\n    makeCheckered(c: CanvasWrapper, parity: number) {\n        for (let y = 0; y < c.canvas.height; y++) {\n            for (let x = 0; x < c.canvas.width; x++) {\n                if ((x + y) % 2 === parity) {\n                    c.context.clearRect(x, y, 1, 1);\n                }\n            }\n        }\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawTextClasses.ts",
    "content": "\n/* auto */ import { assertTrue, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { Util512, longstr } from './../utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* Bitmap-font-drawing\nExtraction and rendering by Ben Fisher, 2017 */\n\n/* we assign our own meaning to certain rarely-used charcodes. */\nexport const specialCharOnePixelSpace = '\\x01';\nexport const specialCharFontChange = '\\x02';\nexport const specialCharZeroPixelChar = '\\x03';\nexport const specialCharCmdSymbol = '\\xBD';\n\n/* small perf optimization so that we're not always calling charCodeAt */\nexport const specialCharNumNewline = '\\n'.charCodeAt(0);\nexport const specialCharNumZeroPixelChar = specialCharZeroPixelChar.charCodeAt(0);\nexport const specialCharNumOnePixelSpace = specialCharOnePixelSpace.charCodeAt(0);\nexport const specialCharNumFontChange = specialCharFontChange.charCodeAt(0);\nexport const specialCharNumCmdSymbol = specialCharCmdSymbol.charCodeAt(0);\nexport const specialCharNumTab = '\\t'.charCodeAt(0);\nexport const largeArea = 1024 * 1024 * 1024;\n\n/* nbsp in the os-roman character set */\nexport const specialCharNonBreakingSpace = '\\xCA';\nexport const specialCharNumNonBreakingSpace = specialCharNonBreakingSpace.charCodeAt(0);\n\n/**\n * metadata returned after a single character has been drawn.\n */\nexport class DrawCharResult {\n    constructor(\n        public newLogicalX: number,\n        public rightmostPixelDrawn: number,\n        public lowestPixelDrawn: number\n    ) {}\n    update(drawn: DrawCharResult) {\n        this.lowestPixelDrawn = Math.max(this.lowestPixelDrawn, drawn.lowestPixelDrawn);\n        this.rightmostPixelDrawn = Math.max(\n            this.rightmostPixelDrawn,\n            drawn.rightmostPixelDrawn\n        );\n        this.newLogicalX = drawn.newLogicalX;\n    }\n}\n\n/**\n * each font has a large bitmap image with every character\n * a grid object is necessary to specify the width and height of the characters --\n * these are bitmap fonts (not vector) but letters still have varying widths.\n */\nexport class UI512FontGrid {\n    metrics: UI512FontMetrics;\n    image: HTMLImageElement;\n    loadedMetrics = false;\n    loadedImage = false;\n    spec: TextFontSpec;\n    adjustHSpacing = 0;\n\n    freeze() {\n        if (this.loadedImage && this.loadedMetrics) {\n            Object.freeze(this.metrics);\n            Object.freeze(this.spec);\n            Object.freeze(this);\n        }\n    }\n\n    getLineHeight() {\n        if (!this.metrics || !this.metrics.lineheight) {\n            checkThrow512(\n                false,\n                '3U|invalid metrics for font ' +\n                    longstr(`${this.spec.typefacename}\n                    ${this.spec.size} ${this.spec.style}`)\n            );\n        }\n\n        return this.metrics.lineheight;\n    }\n\n    getCapHeight() {\n        if (!this.metrics || !this.metrics.capHeight) {\n            checkThrow512(\n                false,\n                '3T|invalid metrics for font' +\n                    longstr(`${this.spec.typefacename}\n                    ${this.spec.size} ${this.spec.style}`)\n            );\n        }\n\n        return this.metrics.capHeight;\n    }\n}\n\n/**\n * internal structure of json font metrics, as generated by the python script\n */\ninterface UI512FontMetrics {\n    version: string;\n    lineheight: number;\n    leftmost: number;\n    bounds: (number | number[])[];\n    widestlogicalchar: number;\n    widestglyph: number;\n    tallestglyph: number;\n    capHeight: number;\n}\n\n/**\n * a complete font, ready to be drawn.\n */\nexport class TextRendererFont {\n    underline = false;\n    condense = false;\n    extend = false;\n    grayed = false;\n    constructor(public readonly grid: UI512FontGrid) {}\n}\n\n/**\n * when drawing a textfield, in effect we divide it into regions\n * a CharRectType.Char region is within the box of a character that was drawn.\n * a CharRectType.SpaceToLeft region is in the left margin of the text field.\n *  (this margin is typically narrow, but can be large if field is horizontal-aligned)\n * a CharRectType.SpaceToRight region is in the right margin of the text field.\n */\nexport enum CharRectType {\n    __isUI512Enum = 1,\n    Char,\n    SpaceToLeft,\n    SpaceToRight\n}\n\n/**\n * results finding which character was hit by x,y coordinates\n */\nexport class FoundCharByLocation {\n    constructor(\n        public x: number,\n        public y: number,\n        public w: number,\n        public h: number,\n        public charIndex: number,\n        public type: CharRectType,\n        public reserved: number\n    ) {}\n}\n\n/**\n * bit field for font styling.\n * use bitwise operations, e.g. bold and italic is (bold|italic)\n */\nexport enum TextFontStyling {\n    Default = 0,\n    Bold = 1 << 0,\n    Italic = 1 << 1,\n    Underline = 1 << 2,\n    Outline = 1 << 3,\n    Shadow = 1 << 4,\n    Grayed = 1 << 5,\n    Condense = 1 << 6,\n    Extend = 1 << 7\n}\n\n/**\n * serialize TextFontStyling to a string.\n */\nexport function textFontStylingToString(e: TextFontStyling): string {\n    let ret = '';\n    ret += e & TextFontStyling.Bold ? '+b' : 'b';\n    ret += e & TextFontStyling.Italic ? '+i' : 'i';\n    ret += e & TextFontStyling.Underline ? '+u' : 'u';\n    ret += e & TextFontStyling.Outline ? '+o' : 'o';\n    ret += e & TextFontStyling.Shadow ? '+s' : 's';\n    ret += e & TextFontStyling.Grayed ? '+d' : 'd';\n    ret += e & TextFontStyling.Condense ? '+c' : 'c';\n    ret += e & TextFontStyling.Extend ? '+e' : 'e';\n    return ret;\n}\n\n/**\n * deserialize TextFontStyling from a string.\n */\nexport function stringToTextFontStyling(s: string): TextFontStyling {\n    let ret = TextFontStyling.Default;\n    for (let i = 0; i < s.length - 1; i++) {\n        let c = s.charAt(i);\n        checkThrow512(c !== '_', 'V7|passed in a spec?');\n        if (c === '+') {\n            switch (s.charAt(i + 1)) {\n                case 'b':\n                    ret |= TextFontStyling.Bold;\n                    break;\n                case 'i':\n                    ret |= TextFontStyling.Italic;\n                    break;\n                case 'u':\n                    ret |= TextFontStyling.Underline;\n                    break;\n                case 'o':\n                    ret |= TextFontStyling.Outline;\n                    break;\n                case 's':\n                    ret |= TextFontStyling.Shadow;\n                    break;\n                case 'd':\n                    ret |= TextFontStyling.Grayed;\n                    break;\n                case 'c':\n                    ret |= TextFontStyling.Condense;\n                    break;\n                case 'e':\n                    ret |= TextFontStyling.Extend;\n                    break;\n                default:\n                    console.log(`warning: unrecognized text style ${s}`);\n                    break;\n            }\n        }\n    }\n\n    return ret;\n}\n\n/**\n * when strings are persisted to disk, use the font name \"geneva\"\n * when loading font from json, use font id as a number.\n */\nfunction typefacenameToTypefaceId(s: string): string {\n    switch (s.toLowerCase().replace(/%20/g, ' ')) {\n        case 'chicago':\n            return '00';\n        case 'courier':\n            return '01';\n        case 'geneva':\n            return '02';\n        case 'new york':\n            return '03';\n        case 'times':\n            return '04';\n        case 'helvetica':\n            return '05';\n        case 'monaco':\n            return '06';\n        case 'symbol':\n            return '07';\n        default:\n            assertTrue(\n                !s.startsWith('0'),\n                'V6|expecting a string but looks like id given?'\n            );\n            return '00';\n    }\n}\n\n/**\n * from geneva/x/y to 02/x/y\n */\nexport function typefacenameToTypefaceIdFull(s: string): string {\n    let face = TextFontSpec.getTypeface(s);\n    return TextFontSpec.setTypeface(s, typefacenameToTypefaceId(face));\n}\n\n/**\n * serialize+deserialize a font spec, which currently consists of\n * 1) typeface name\n * 2) size\n * 3) style\n */\nexport class TextFontSpec {\n    constructor(\n        public typefacename: string,\n        public style: TextFontStyling,\n        public size: number\n    ) {}\n    static fromString(s: string) {\n        let parts = s.split('_');\n        let typefacename = parts[0];\n        let size = Util512.parseInt(parts[1]) ?? 0;\n        let style = stringToTextFontStyling(parts[2]);\n        return new TextFontSpec(typefacename, style, size);\n    }\n\n    toSpecString() {\n        let ret = this.typefacename + '_';\n        ret += this.size.toString() + '_';\n        ret += textFontStylingToString(this.style);\n        return ret;\n    }\n\n    static getTypeface(s: string) {\n        return s.split('_')[0];\n    }\n\n    static getFontSize(s: string) {\n        return s.split('_')[1];\n    }\n\n    static getFontStyle(s: string) {\n        return s.split('_')[2];\n    }\n\n    static setTypeface(s: string, sNext: string) {\n        let parts = s.split('_');\n        assertTrue(\n            !sNext.includes('_'),\n            '3X|parts of a font cannot contain the \"_\" character'\n        );\n        return [sNext, parts[1], parts[2]].join('_');\n    }\n\n    static setFontSize(s: string, sNext: string) {\n        let parts = s.split('_');\n        assertTrue(\n            !sNext.includes('_'),\n            '3W|parts of a font cannot contain the \"_\" character'\n        );\n        return [parts[0], sNext, parts[2]].join('_');\n    }\n\n    static setFontStyle(s: string, sNext: string) {\n        let parts = s.split('_');\n        assertTrue(\n            !sNext.includes('_'),\n            '3V|parts of a font cannot contain the \"_\" character'\n        );\n        return [parts[0], parts[1], sNext].join('_');\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512DrawTextFontRequest.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../utils/util512Assert';\n/* auto */ import { longstr } from './../utils/util512';\n/* auto */ import { TextFontSpec, TextFontStyling, TextRendererFont, UI512FontGrid, typefacenameToTypefaceIdFull } from './ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * cache the font data that has been loaded\n */\nexport class UI512FontRequest {\n    /* default font, we fall back to this if a nonexistent font is requested */\n    static readonly defaultFont = 'chicago_12_biuosdce';\n    static readonly defaultFontAsId = '00_12_biuosdce';\n\n    /* define a small 1-pt font which can be useful for UI spacing */\n    static readonly smallestFont = 'symbol_1_biuosdce';\n    static readonly smallestFontAsId = '07_1_biuosdce';\n\n    static manualFonts: { [key: string]: boolean } = {\n        '00_12_biuosdce': true,\n        '00_12_biuos+dce': true,\n        '05_12_biuosdce': true,\n        '00_9_biuosdce': true,\n        '02_9_biuosdce': true,\n        '02_9_biuos+dce': true,\n        '06_9_biuosdce': true,\n        '06_12_biuosdce': true,\n        '07_12_biuosdce': true,\n        '07_1_biuosdce': true\n    };\n\n    static hasRealGrayedImage: { [key: string]: boolean } = {\n        '00_12_biuos+dce': true,\n        '02_9_biuos+dce': true\n    };\n\n    /* 3 possible states\n    1) undefined means that this font isn't supported at all\n    2) NotYetLoaded means that the font is supported but hasn't been loaded yet\n    3) UI512FontGrid, the loaded font */\n    cachedGrids: { [key: string]: UI512FontGrid | CacheState | undefined } = {};\n    cachedFonts: { [key: string]: TextRendererFont } = {};\n    constructor() {\n        /* pre-specify which fonts can be loaded */\n        let fnts = '00,01,02,03,04,05,06,07'.split(/,/g);\n        let sizes = '9,10,12,14,18,24'.split(/,/g);\n        let styls = longstr(\n            `biuosdce\n        |+biuosdce\n        |b+iuosdce\n        |biu+osdce\n        |+b+iuosdce\n        |b+iu+osdce\n        |+biu+osdce\n        |+b+iu+osdce`,\n            ''\n        ).split('|');\n        for (let fnt of fnts) {\n            for (let style of styls) {\n                for (let sz of sizes) {\n                    let keyname = `${fnt}_${sz}_${style}`;\n                    this.cachedGrids[keyname] = CacheState.NotYetLoaded;\n                }\n            }\n        }\n\n        /* we captured the fonts in 5 different stages:\n            1) got the ones in manualFonts,\n            confirmed pixel-perfect if not italic\n            2) cohort 1, used in v0.2release\n            listFonts=r'''00,01,02,03,04'''\n            listSizes = r'''10,12,14,18,24'''\n            listStyles = r'''biuosdce\n            +biuosdce\n            b+iuosdce\n            biu+osdce\n            +b+iuosdce\n            b+iu+osdce'''\n            we confirmed that 'chicago,courier,geneva',\n            '10,12,14,18,24',\n            'biuosdce,+biuosdce'\n            were pixel perfect\n            3) cohort 2, add missing styles\n            listFonts=r'''00,01,02,03,04'''\n            listSizes = r'''10,12,14,18,24'''\n            listStyles = r'''+biu+osdce\n            +b+iu+osdce'''\n            4) cohort 3, add 9pt size for the original 5 fonts\n            5) cohort 4, add last 3 fonts in all styles+sizes\n        */\n\n        /* these we've defined manually, e.g. to make a common font a pixel perfect match */\n        for (let key in UI512FontRequest.manualFonts) {\n            if (UI512FontRequest.manualFonts.hasOwnProperty(key)) {\n                this.cachedGrids[key] = CacheState.NotYetLoaded;\n            }\n        }\n\n        Object.seal(this.cachedGrids);\n    }\n\n    /**\n     * find grid for a font\n     */\n    findGrid(font: string): O<UI512FontGrid> {\n        font = typefacenameToTypefaceIdFull(font);\n        let gridkey = this.stripManuallyAddedStylingToGetGridKey(font);\n        let found = this.cachedGrids[gridkey];\n        if (found === undefined) {\n            /* case 1) you asked for an unsupported font, fall back to default font */\n            /* considered gracefully going to a similar font,\n            but that is confusing also, because it's not what you asked for either. */\n            gridkey = UI512FontRequest.defaultFontAsId;\n            found = this.cachedGrids[gridkey];\n            assertTrue(found !== undefined, '3N|found is undefined');\n        }\n\n        if (found === CacheState.NotYetLoaded) {\n            /* case 2) you asked for a supported font that has never been asked\n            to be loaded */\n            let pendingGrid = new UI512FontGrid();\n            pendingGrid.spec = TextFontSpec.fromString(gridkey);\n            this.cachedGrids[gridkey] = pendingGrid;\n\n            /* queue loading the image */\n            const imgUrl = '/resources03a/fonts/' + gridkey + '.png';\n            pendingGrid.image = new Image();\n            Util512Higher.beginLoadImage(imgUrl, pendingGrid.image, () => {\n                pendingGrid.loadedImage = true;\n                pendingGrid.freeze();\n            });\n\n            /* queue loading the metrics */\n            const jsonUrl = '/resources03a/fonts/' + gridkey + '.json';\n            let afn = async () => {\n                let obj = await Util512Higher.asyncLoadJson(jsonUrl);\n                pendingGrid.metrics = obj;\n                pendingGrid.loadedMetrics = true;\n                AdjustFontMetrics.go(gridkey, pendingGrid);\n                pendingGrid.freeze();\n            };\n\n            Util512Higher.syncToAsyncTransition(afn(), 'loadfont', RespondToErr.Alert);\n            return undefined;\n        } else {\n            if (!found || !found.loadedMetrics || !found.loadedImage) {\n                /* case 3) font was started to load, but not yet complete. */\n                return undefined;\n            } else {\n                /* case 4) font is loaded and ready to use. */\n                return found;\n            }\n        }\n    }\n\n    /**\n     * find font in cache.\n     * if font is not supported, return undefined\n     */\n    findFont(font: string): O<TextRendererFont> {\n        let found = this.cachedFonts[font];\n        if (found) {\n            return found;\n        }\n\n        /* different fonts share the same grid */\n        /* for example an \"underline\" variant of font has the same grid,\n        just different flag */\n        let grid = this.findGrid(font);\n        if (grid) {\n            let spec = TextFontSpec.fromString(font);\n            let fontObj = new TextRendererFont(grid);\n            fontObj.underline = (spec.style & TextFontStyling.Underline) !== 0;\n            fontObj.condense = (spec.style & TextFontStyling.Condense) !== 0;\n            fontObj.extend = (spec.style & TextFontStyling.Extend) !== 0;\n            if ((spec.style & TextFontStyling.Grayed) !== 0) {\n                /* for \"grayed\", chicago12 and geneva9 have a special\n                one we've tested against emulator. the rest of the grayed,\n                we'll just do in software like an underline. */\n                let fontwId = typefacenameToTypefaceIdFull(font);\n                let gridkey = this.stripManuallyAddedStylingToGetGridKey(fontwId);\n                if (!UI512FontRequest.hasRealGrayedImage[gridkey]) {\n                    fontObj.grayed = true;\n                }\n            }\n\n            this.cachedFonts[font] = fontObj;\n            return fontObj;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * find font and throw if not present.\n     */\n    getFont(font: string): TextRendererFont {\n        return ensureDefined(\n            this.findFont(font),\n            '3O|font should have been cached',\n            font\n        );\n    }\n\n    /**\n     * the decorations condense, extend, underline are added at runtime,\n     * and aren't persisted in a json file\n     */\n    stripManuallyAddedStylingToGetGridKey(s: string) {\n        s = s.replace(/\\+c/g, 'c');\n        s = s.replace(/\\+e/g, 'e');\n        s = s.replace(/\\+u/g, 'u');\n        if (!UI512FontRequest.hasRealGrayedImage[s]) {\n            s = s.replace(/\\+d/g, 'd');\n        }\n\n        return s;\n    }\n}\n\nenum CacheState {\n    NotYetLoaded = 1\n}\n\nexport const mapAdjustLineHeight: { [key: string]: number } = {};\n\nmapAdjustLineHeight['00_9_+biuosdce'] = 1;\nmapAdjustLineHeight['01_9_+biuosdce'] = 2;\nmapAdjustLineHeight['01_9_b+iuosdce'] = -1;\nmapAdjustLineHeight['01_9_biu+osdce'] = 1;\nmapAdjustLineHeight['01_9_b+iu+osdce'] = -1;\nmapAdjustLineHeight['01_9_+biu+osdce'] = 1;\nmapAdjustLineHeight['01_9_+b+iu+osdce'] = 0; /* not checked yet */\nmapAdjustLineHeight['01_10_+biuosdce'] = 1;\nmapAdjustLineHeight['04_9_+biuosdce'] = 2;\nmapAdjustLineHeight['04_9_b+iuosdce'] = -1;\nmapAdjustLineHeight['04_9_biu+osdce'] = 1;\nmapAdjustLineHeight['04_9_b+iu+osdce'] = -1;\nmapAdjustLineHeight['04_9_+biu+osdce'] = 1;\nmapAdjustLineHeight['04_9_+b+iu+osdce'] = 0; /* not checked yet */\nmapAdjustLineHeight['04_10_+biuosdce'] = 1;\nmapAdjustLineHeight['04_12_+biuosdce'] = 1;\nmapAdjustLineHeight['05_9_+biuosdce'] = 2;\nmapAdjustLineHeight['05_9_b+iuosdce'] = -1;\nmapAdjustLineHeight['05_9_biu+osdce'] = 1;\nmapAdjustLineHeight['05_9_b+iu+osdce'] = -1;\nmapAdjustLineHeight['05_9_+biu+osdce'] = 1;\nmapAdjustLineHeight['05_9_+b+iu+osdce'] = 0; /* not checked yet */\nmapAdjustLineHeight['05_10_+biuosdce'] = 1;\nmapAdjustLineHeight['06_9_+biuosdce'] = 1;\nmapAdjustLineHeight['07_10_+biuosdce'] = 1;\n\n/**\n * our font-screenshot gathering tool can't know the metrics\n * with 100% accuracy, so adjust metrics here\n */\nconst AdjustFontMetrics = /* static class */ {\n    go(gridkey: string, obj: UI512FontGrid) {\n        obj.adjustHSpacing = 0;\n\n        /*\n            when addressing differences: move towards the blue.\n            to slide characters horizontally,\n                keep (adjustHSpacing - obj.metrics['leftmost']) a constant\n                and adjust both of them in lockstep\n            to stretch characters horizontally,\n                adjust (adjustHSpacing - obj.metrics['leftmost'])\n        */\n\n        if (gridkey.startsWith('02_9_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n            /* j is too wide */\n            obj.metrics.bounds['j'.charCodeAt(0)][4] += -1;\n        } else if (gridkey.startsWith('02_12_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += -1;\n        } else if (gridkey.startsWith('02_24_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += -1;\n        } else if (gridkey.startsWith('02_24_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('03_18_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += -1;\n        } else if (gridkey.startsWith('04_18_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('05_18_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('06_10_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('06_12_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += -1;\n        } else if (gridkey.startsWith('06_14_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('06_18_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('06_24_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('07_9_') && gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('07_10_')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        } else if (gridkey.startsWith('07_14_') && !gridkey.includes('+i')) {\n            obj.adjustHSpacing += 0;\n            obj.metrics['leftmost'] += 1;\n        }\n\n        /* all outlines need to be offset */\n        if (gridkey.includes('+o')) {\n            obj.metrics['leftmost'] += 1;\n        }\n\n        let adj = mapAdjustLineHeight[gridkey];\n        if (adj !== undefined) {\n            obj.metrics.lineheight += adj;\n        }\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512FormattedText.ts",
    "content": "\n/* auto */ import { BrowserOSInfo } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, assertWarn, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { assertEq, assertWarnEq } from './../utils/util512';\n/* auto */ import { TranslateCharset } from './ui512TranslateCharset';\n/* auto */ import { UI512FontRequest } from './ui512DrawTextFontRequest';\n/* auto */ import { specialCharFontChange } from './ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the formatted text class for UI512.\n * can be losslessly serialized to/from a plain string.\n */\nexport class FormattedText {\n    /* every character has an associated font. */\n    protected charArray: number[] = [];\n    protected fontArray: string[] = [];\n\n    /* you can safely pass a FormattedText to a function and ensure that\n    it won't be modified, by calling lock(). */\n    protected locked = false;\n\n    charAt(i: number) {\n        return this.charArray[i];\n    }\n\n    fontAt(i: number) {\n        return this.fontArray[i];\n    }\n\n    indexOf(c: number) {\n        return this.charArray.indexOf(c);\n    }\n\n    setFontAt(i: number, s: string) {\n        assertWarn(s.length > 0, 'I||');\n        assertTrue(!this.locked, '3q|locked');\n        assertTrue(\n            !s.includes(specialCharFontChange),\n            `3p|invalid character ${specialCharFontChange.charCodeAt(\n                0\n            )} in font description`\n        );\n\n        this.fontArray[i] = s;\n    }\n\n    setCharAt(i: number, n: number) {\n        assertTrue(!this.locked, '3o|locked');\n        FormattedText.throwIfContainsControlCharacters(String.fromCharCode(n));\n        this.charArray[i] = n;\n    }\n\n    setFontEverywhere(s: string) {\n        assertWarn(s.length > 0, 'I{|');\n        assertTrue(!this.locked, '3n|locked');\n        assertTrue(\n            !s.includes(specialCharFontChange),\n            `3m|invalid character ${specialCharFontChange.charCodeAt(\n                0\n            )} in font description`\n        );\n\n        for (let i = 0; i < this.fontArray.length; i++) {\n            this.fontArray[i] = s;\n        }\n    }\n\n    push(char: number, font: string) {\n        assertWarn(font.length > 0, 'I`|');\n        assertTrue(!this.locked, '3l|locked');\n        assertTrue(\n            !font.includes(specialCharFontChange),\n            `3k|invalid character ${specialCharFontChange.charCodeAt(\n                0\n            )} in font description`\n        );\n        FormattedText.throwIfContainsControlCharacters(String.fromCharCode(char));\n        this.charArray.push(char);\n        this.fontArray.push(font);\n    }\n\n    slice(start: number, end: number) {\n        assertTrue(\n            end >= start && start >= 0 && end >= 0,\n            'V9|invalid slice bounds',\n            start,\n            end\n        );\n        let newOne = new FormattedText();\n        for (let i = 0; i < this.len(); i++) {\n            if (i >= start && i < end) {\n                newOne.push(this.charAt(i), this.fontAt(i));\n            }\n        }\n\n        return newOne;\n    }\n\n    append(other: FormattedText) {\n        assertTrue(!this.locked, '3j|locked');\n        this.charArray = this.charArray.concat(other.charArray);\n        this.fontArray = this.fontArray.concat(other.fontArray);\n    }\n\n    lock() {\n        this.locked = true;\n    }\n\n    isLocked() {\n        return this.locked;\n    }\n\n    getUnlockedCopy() {\n        let other = this.clone();\n        other.locked = false;\n        return other;\n    }\n\n    clone() {\n        let other = new FormattedText();\n        other.charArray = this.charArray.slice(0);\n        other.fontArray = this.fontArray.slice(0);\n        return other;\n    }\n\n    splice(n: number, nDelete: number) {\n        assertTrue(!this.locked, '3i|locked');\n        this.charArray.splice(n, nDelete);\n        this.fontArray.splice(n, nDelete);\n    }\n\n    deleteAll() {\n        assertTrue(!this.locked, '3h|locked');\n        this.charArray = [];\n        this.fontArray = [];\n    }\n\n    /**\n     * adds a string (of constant font) to the string\n     * works like array.splice.\n     */\n    static byInsertion(\n        t: FormattedText,\n        n: number,\n        nDelete: number,\n        insert: string,\n        font: string\n    ) {\n        /* previously used splice and fn.apply to do this in a few lines,\n        but if done with long strings might hit the javascript engine's argument\n        count limit */\n        let tNew = new FormattedText();\n        assertTrue(\n            !font.includes(specialCharFontChange),\n            `3g|invalid character ${specialCharFontChange.charCodeAt(\n                0\n            )} in font description`\n        );\n        assertTrue(n >= 0, 'I_|invalid n', n);\n        assertTrue(nDelete >= 0, 'I^|invalid nDelete', nDelete);\n\n        tNew.charArray = t.charArray.slice(0, n);\n        for (let i = 0; i < insert.length; i++) {\n            tNew.charArray.push(insert.charCodeAt(i));\n        }\n\n        tNew.fontArray = t.fontArray.slice(0, n);\n        for (let i = 0; i < insert.length; i++) {\n            tNew.fontArray.push(font);\n        }\n\n        tNew.charArray = tNew.charArray.concat(t.charArray.slice(n + nDelete));\n        tNew.fontArray = tNew.fontArray.concat(t.fontArray.slice(n + nDelete));\n        return tNew;\n    }\n\n    /**\n     * deserialize from string\n     */\n    static newFromSerialized(s: string) {\n        let tNew = new FormattedText();\n        tNew.fromSerialized(s);\n        return tNew;\n    }\n\n    /**\n     * erase special characters and always use unix newlines\n     */\n    static filterAndConvertNewlines(s: string) {\n        s = s.replace(new RegExp(specialCharFontChange, 'g'), '');\n        /* eslint-disable-next-line no-control-regex */\n        s = s.replace(new RegExp('\\x00', 'g'), '');\n        /* eslint-disable-next-line no-control-regex */\n        s = s.replace(new RegExp('\\r\\n', 'g'), '\\n');\n        /* eslint-disable-next-line no-control-regex */\n        s = s.replace(new RegExp('\\r', 'g'), '\\n');\n        return s;\n    }\n\n    /**\n     * from a plain-text string to formattedtext.\n     */\n    static newFromUnformatted(s: string) {\n        FormattedText.throwIfContainsControlCharacters(s);\n        s = FormattedText.filterAndConvertNewlines(s);\n        return FormattedText.newFromSerialized(s);\n    }\n\n    /**\n     * when reading text input by user, translate from utf16 to os-roman\n     */\n    static fromExternalCharset(s: string, info: BrowserOSInfo, fallback = '?') {\n        s = FormattedText.filterAndConvertNewlines(s);\n        s = TranslateCharset.translateUnToRoman(s, fallback);\n        return s;\n    }\n\n    /**\n     * when outputting our text to external os (Edit->Paste),\n     * translate from os-roman to utf16\n     */\n    static toExternalCharset(s: string, info: BrowserOSInfo, fallback = '?') {\n        s = FormattedText.filterAndConvertNewlines(s);\n        s = TranslateCharset.translateRomanToUn(s, fallback);\n        if (info === BrowserOSInfo.Windows) {\n            /* eslint-disable-next-line no-control-regex */\n            s = s.replace(new RegExp('\\n', 'g'), '\\r\\n');\n        }\n\n        return s;\n    }\n\n    /**\n     * translated charsets, returns undefined if any of the characters cannot be mapped\n     */\n    static fromHostCharsetStrict(s: string, brinfo: BrowserOSInfo) {\n        let try1 = FormattedText.fromExternalCharset(s, brinfo, '?');\n        let try2 = FormattedText.fromExternalCharset(s, brinfo, '!');\n        return try1 !== try2 ? undefined : try1;\n    }\n\n    /**\n     * append slice of another FormattedText, the interval [b1, b2)\n     */\n    appendSubstring(other: FormattedText, b1: number, b2: number) {\n        this.charArray = this.charArray.concat(other.charArray.slice(b1, b2));\n        this.fontArray = this.fontArray.concat(other.fontArray.slice(b1, b2));\n    }\n\n    /**\n     * length of our string\n     */\n    len() {\n        assertWarnEq(this.charArray.length, this.fontArray.length, '3f|');\n        return this.charArray.length;\n    }\n\n    /**\n     * serialize formatted text to a string\n     * the serialized format is alternating sections between font-spec and text.\n     * for example,\n     * $geneva_10_biuosdce$some text$geneva_12_biuosdce$other text\n     * where $ represents the specialCharFontChange character.\n     */\n    toSerialized() {\n        let s = '';\n        let currentFont: O<string> = undefined;\n        assertEq(this.charArray.length, this.fontArray.length, '3Z|');\n        for (let i = 0; i < this.charArray.length; i++) {\n            if (currentFont !== this.fontArray[i]) {\n                s += specialCharFontChange + this.fontArray[i] + specialCharFontChange;\n                currentFont = this.fontArray[i];\n            }\n\n            let c = String.fromCharCode(this.charAt(i));\n            FormattedText.throwIfContainsControlCharacters(c);\n            s += c;\n        }\n\n        return s;\n    }\n\n    /**\n     * deserialize formatted text from string\n     */\n    fromSerialized(s: string) {\n        assertTrue(!this.locked, '3e|locked');\n        this.charArray = [];\n        this.fontArray = [];\n        assertEq(-1, s.indexOf('\\r'), '3d|');\n\n        /* add a default font if no font was specified. */\n        if (!s.startsWith(specialCharFontChange)) {\n            s =\n                specialCharFontChange +\n                UI512FontRequest.defaultFont +\n                specialCharFontChange +\n                s;\n        }\n\n        let parts = s.split(new RegExp(specialCharFontChange, 'g'));\n        assertTrue(parts.length % 2 === 1, '3b|parts length must be odd');\n        let currentFont = UI512FontRequest.defaultFont;\n        for (let i = 0; i < parts.length; i++) {\n            if (i % 2 === 0) {\n                let content = parts[i];\n                for (let j = 0; j < content.length; j++) {\n                    this.charArray.push(content.charCodeAt(j));\n                    this.fontArray.push(currentFont);\n                }\n            } else {\n                currentFont = parts[i];\n                assertTrue(currentFont.length > 0, 'I]|');\n            }\n        }\n    }\n\n    /**\n     * to plain text, stripping all formatting\n     */\n    toUnformatted() {\n        let ret = this.charArray.map(c => String.fromCharCode(c)).join('');\n        assertEq(this.len(), ret.length, '3Y|');\n        FormattedText.throwIfContainsControlCharacters(ret);\n        return ret;\n    }\n\n    /**\n     * a substring as plain text, stripping all formatting\n     */\n    toUnformattedSubstr(from: number, len: number) {\n        let ret = this.charArray\n            .slice(from, from + len)\n            .map(c => String.fromCharCode(c))\n            .join('');\n        FormattedText.throwIfContainsControlCharacters(ret);\n        return ret;\n    }\n\n    /**\n     * we shouldn't allow special characters most places\n     */\n    static throwIfContainsControlCharacters(s: string) {\n        checkThrow512(\n            !s.includes(specialCharFontChange),\n            'V8|Text cannot include this character.'\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/drawtext/ui512TranslateCharset.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * translate back and forth between mac-os-roman and utf16.\n * all text shown in a UI512 text field is in mac-os-roman encoding,\n * except that newlines are \\n and not \\r.\n * when the user copies text in, or pastes text out, we should\n * use this mapping to translate character sets.\n */\nexport const TranslateCharset = /* static class */ {\n    /* for faster load times, don't populate the map until it is requested. */\n    romanToUn: undefined as O<{ [key: number]: string }>,\n    unToRoman: undefined as O<{ [key: number]: string }>,\n\n    /**\n     * roman to unicode\n     * https://en.wikipedia.org/wiki/Mac_OS_Roman\n     */\n    _getRomanToUn() {\n        if (this.romanToUn === undefined) {\n            this.romanToUn = {\n                9: '\\u0009',\n                10: '\\u000A',\n                32: '\\u0020',\n                33: '\\u0021',\n                34: '\\u0022',\n                35: '\\u0023',\n                36: '\\u0024',\n                37: '\\u0025',\n                38: '\\u0026',\n                39: '\\u0027',\n                40: '\\u0028',\n                41: '\\u0029',\n                42: '\\u002A',\n                43: '\\u002B',\n                44: '\\u002C',\n                45: '\\u002D',\n                46: '\\u002E',\n                47: '\\u002F',\n                48: '\\u0030',\n                49: '\\u0031',\n                50: '\\u0032',\n                51: '\\u0033',\n                52: '\\u0034',\n                53: '\\u0035',\n                54: '\\u0036',\n                55: '\\u0037',\n                56: '\\u0038',\n                57: '\\u0039',\n                58: '\\u003A',\n                59: '\\u003B',\n                60: '\\u003C',\n                61: '\\u003D',\n                62: '\\u003E',\n                63: '\\u003F',\n                64: '\\u0040',\n                65: '\\u0041',\n                66: '\\u0042',\n                67: '\\u0043',\n                68: '\\u0044',\n                69: '\\u0045',\n                70: '\\u0046',\n                71: '\\u0047',\n                72: '\\u0048',\n                73: '\\u0049',\n                74: '\\u004A',\n                75: '\\u004B',\n                76: '\\u004C',\n                77: '\\u004D',\n                78: '\\u004E',\n                79: '\\u004F',\n                80: '\\u0050',\n                81: '\\u0051',\n                82: '\\u0052',\n                83: '\\u0053',\n                84: '\\u0054',\n                85: '\\u0055',\n                86: '\\u0056',\n                87: '\\u0057',\n                88: '\\u0058',\n                89: '\\u0059',\n                90: '\\u005A',\n                91: '\\u005B',\n                92: '\\u005C',\n                93: '\\u005D',\n                94: '\\u005E',\n                95: '\\u005F',\n                96: '\\u0060',\n                97: '\\u0061',\n                98: '\\u0062',\n                99: '\\u0063',\n                100: '\\u0064',\n                101: '\\u0065',\n                102: '\\u0066',\n                103: '\\u0067',\n                104: '\\u0068',\n                105: '\\u0069',\n                106: '\\u006A',\n                107: '\\u006B',\n                108: '\\u006C',\n                109: '\\u006D',\n                110: '\\u006E',\n                111: '\\u006F',\n                112: '\\u0070',\n                113: '\\u0071',\n                114: '\\u0072',\n                115: '\\u0073',\n                116: '\\u0074',\n                117: '\\u0075',\n                118: '\\u0076',\n                119: '\\u0077',\n                120: '\\u0078',\n                121: '\\u0079',\n                122: '\\u007A',\n                123: '\\u007B',\n                124: '\\u007C',\n                125: '\\u007D',\n                126: '\\u007E',\n                127: '\\u007F',\n                128: '\\u00C4',\n                129: '\\u00C5',\n                130: '\\u00C7',\n                131: '\\u00C9',\n                132: '\\u00D1',\n                133: '\\u00D6',\n                134: '\\u00DC',\n                135: '\\u00E1',\n                136: '\\u00E0',\n                137: '\\u00E2',\n                138: '\\u00E4',\n                139: '\\u00E3',\n                140: '\\u00E5',\n                141: '\\u00E7',\n                142: '\\u00E9',\n                143: '\\u00E8',\n                144: '\\u00EA',\n                145: '\\u00EB',\n                146: '\\u00ED',\n                147: '\\u00EC',\n                148: '\\u00EE',\n                149: '\\u00EF',\n                150: '\\u00F1',\n                151: '\\u00F3',\n                152: '\\u00F2',\n                153: '\\u00F4',\n                154: '\\u00F6',\n                155: '\\u00F5',\n                156: '\\u00FA',\n                157: '\\u00F9',\n                158: '\\u00FB',\n                159: '\\u00FC',\n                160: '\\u2020',\n                161: '\\u00B0',\n                162: '\\u00A2',\n                163: '\\u00A3',\n                164: '\\u00A7',\n                165: '\\u2022',\n                166: '\\u00B6',\n                167: '\\u00DF',\n                168: '\\u00AE',\n                169: '\\u00A9',\n                170: '\\u2122',\n                171: '\\u00B4',\n                172: '\\u00A8',\n                173: '\\u2260',\n                174: '\\u00C6',\n                175: '\\u00D8',\n                176: '\\u221E',\n                177: '\\u00B1',\n                178: '\\u2264',\n                179: '\\u2265',\n                180: '\\u00A5',\n                181: '\\u00B5',\n                182: '\\u2202',\n                183: '\\u2211',\n                184: '\\u220F',\n                185: '\\u03C0',\n                186: '\\u222B',\n                187: '\\u00AA',\n                188: '\\u00BA',\n                189: '\\u03A9',\n                190: '\\u00E6',\n                191: '\\u00F8',\n                192: '\\u00BF',\n                193: '\\u00A1',\n                194: '\\u00AC',\n                195: '\\u221A',\n                196: '\\u0192',\n                197: '\\u2248',\n                198: '\\u2206',\n                199: '\\u00AB',\n                200: '\\u00BB',\n                201: '\\u2026',\n                202: '\\u00A0',\n                203: '\\u00C0',\n                204: '\\u00C3',\n                205: '\\u00D5',\n                206: '\\u0152',\n                207: '\\u0153',\n                208: '\\u2013',\n                209: '\\u2014',\n                210: '\\u201C',\n                211: '\\u201D',\n                212: '\\u2018',\n                213: '\\u2019',\n                214: '\\u00F7',\n                215: '\\u25CA',\n                216: '\\u00FF',\n                217: '\\u0178',\n                218: '\\u2044',\n                219: '\\u20AC',\n                220: '\\u2039',\n                221: '\\u203A',\n                222: '\\uFB01',\n                223: '\\uFB02',\n                224: '\\u2021',\n                225: '\\u00B7',\n                226: '\\u201A',\n                227: '\\u201E',\n                228: '\\u2030',\n                229: '\\u00C2',\n                230: '\\u00CA',\n                231: '\\u00C1',\n                232: '\\u00CB',\n                233: '\\u00C8',\n                234: '\\u00CD',\n                235: '\\u00CE',\n                236: '\\u00CF',\n                237: '\\u00CC',\n                238: '\\u00D3',\n                239: '\\u00D4',\n                240: '\\uF8FF',\n                241: '\\u00D2',\n                242: '\\u00DA',\n                243: '\\u00DB',\n                244: '\\u00D9'\n            };\n\n            Object.freeze(this.romanToUn);\n        }\n\n        return this.romanToUn;\n    },\n\n    /**\n     * get unicode to roman\n     */\n    _getUnToRoman() {\n        if (this.unToRoman === undefined) {\n            this.unToRoman = {\n                9: '\\u0009',\n                10: '\\u000a',\n                32: '\\u0020',\n                33: '\\u0021',\n                34: '\\u0022',\n                35: '\\u0023',\n                36: '\\u0024',\n                37: '\\u0025',\n                38: '\\u0026',\n                39: '\\u0027',\n                40: '\\u0028',\n                41: '\\u0029',\n                42: '\\u002a',\n                43: '\\u002b',\n                44: '\\u002c',\n                45: '\\u002d',\n                46: '\\u002e',\n                47: '\\u002f',\n                48: '\\u0030',\n                49: '\\u0031',\n                50: '\\u0032',\n                51: '\\u0033',\n                52: '\\u0034',\n                53: '\\u0035',\n                54: '\\u0036',\n                55: '\\u0037',\n                56: '\\u0038',\n                57: '\\u0039',\n                58: '\\u003a',\n                59: '\\u003b',\n                60: '\\u003c',\n                61: '\\u003d',\n                62: '\\u003e',\n                63: '\\u003f',\n                64: '\\u0040',\n                65: '\\u0041',\n                66: '\\u0042',\n                67: '\\u0043',\n                68: '\\u0044',\n                69: '\\u0045',\n                70: '\\u0046',\n                71: '\\u0047',\n                72: '\\u0048',\n                73: '\\u0049',\n                74: '\\u004a',\n                75: '\\u004b',\n                76: '\\u004c',\n                77: '\\u004d',\n                78: '\\u004e',\n                79: '\\u004f',\n                80: '\\u0050',\n                81: '\\u0051',\n                82: '\\u0052',\n                83: '\\u0053',\n                84: '\\u0054',\n                85: '\\u0055',\n                86: '\\u0056',\n                87: '\\u0057',\n                88: '\\u0058',\n                89: '\\u0059',\n                90: '\\u005a',\n                91: '\\u005b',\n                92: '\\u005c',\n                93: '\\u005d',\n                94: '\\u005e',\n                95: '\\u005f',\n                96: '\\u0060',\n                97: '\\u0061',\n                98: '\\u0062',\n                99: '\\u0063',\n                100: '\\u0064',\n                101: '\\u0065',\n                102: '\\u0066',\n                103: '\\u0067',\n                104: '\\u0068',\n                105: '\\u0069',\n                106: '\\u006a',\n                107: '\\u006b',\n                108: '\\u006c',\n                109: '\\u006d',\n                110: '\\u006e',\n                111: '\\u006f',\n                112: '\\u0070',\n                113: '\\u0071',\n                114: '\\u0072',\n                115: '\\u0073',\n                116: '\\u0074',\n                117: '\\u0075',\n                118: '\\u0076',\n                119: '\\u0077',\n                120: '\\u0078',\n                121: '\\u0079',\n                122: '\\u007a',\n                123: '\\u007b',\n                124: '\\u007c',\n                125: '\\u007d',\n                126: '\\u007e',\n                127: '\\u007f',\n                196: '\\u0080',\n                197: '\\u0081',\n                199: '\\u0082',\n                201: '\\u0083',\n                209: '\\u0084',\n                214: '\\u0085',\n                220: '\\u0086',\n                225: '\\u0087',\n                224: '\\u0088',\n                226: '\\u0089',\n                228: '\\u008a',\n                227: '\\u008b',\n                229: '\\u008c',\n                231: '\\u008d',\n                233: '\\u008e',\n                232: '\\u008f',\n                234: '\\u0090',\n                235: '\\u0091',\n                237: '\\u0092',\n                236: '\\u0093',\n                238: '\\u0094',\n                239: '\\u0095',\n                241: '\\u0096',\n                243: '\\u0097',\n                242: '\\u0098',\n                244: '\\u0099',\n                246: '\\u009a',\n                245: '\\u009b',\n                250: '\\u009c',\n                249: '\\u009d',\n                251: '\\u009e',\n                252: '\\u009f',\n                8224: '\\u00a0',\n                176: '\\u00a1',\n                162: '\\u00a2',\n                163: '\\u00a3',\n                167: '\\u00a4',\n                8226: '\\u00a5',\n                182: '\\u00a6',\n                223: '\\u00a7',\n                174: '\\u00a8',\n                169: '\\u00a9',\n                8482: '\\u00aa',\n                180: '\\u00ab',\n                168: '\\u00ac',\n                8800: '\\u00ad',\n                198: '\\u00ae',\n                216: '\\u00af',\n                8734: '\\u00b0',\n                177: '\\u00b1',\n                8804: '\\u00b2',\n                8805: '\\u00b3',\n                165: '\\u00b4',\n                181: '\\u00b5',\n                8706: '\\u00b6',\n                8721: '\\u00b7',\n                8719: '\\u00b8',\n                960: '\\u00b9',\n                8747: '\\u00ba',\n                170: '\\u00bb',\n                186: '\\u00bc',\n                937: '\\u00bd',\n                230: '\\u00be',\n                248: '\\u00bf',\n                191: '\\u00c0',\n                161: '\\u00c1',\n                172: '\\u00c2',\n                8730: '\\u00c3',\n                402: '\\u00c4',\n                8776: '\\u00c5',\n                8710: '\\u00c6',\n                171: '\\u00c7',\n                187: '\\u00c8',\n                8230: '\\u00c9',\n                160: '\\u00ca',\n                192: '\\u00cb',\n                195: '\\u00cc',\n                213: '\\u00cd',\n                338: '\\u00ce',\n                339: '\\u00cf',\n                8211: '\\u00d0',\n                8212: '\\u00d1',\n                8220: '\\u00d2',\n                8221: '\\u00d3',\n                8216: '\\u00d4',\n                8217: '\\u00d5',\n                247: '\\u00d6',\n                9674: '\\u00d7',\n                255: '\\u00d8',\n                376: '\\u00d9',\n                8260: '\\u00da',\n                8364: '\\u00db',\n                8249: '\\u00dc',\n                8250: '\\u00dd',\n                64257: '\\u00de',\n                64258: '\\u00df',\n                8225: '\\u00e0',\n                183: '\\u00e1',\n                8218: '\\u00e2',\n                8222: '\\u00e3',\n                8240: '\\u00e4',\n                194: '\\u00e5',\n                202: '\\u00e6',\n                193: '\\u00e7',\n                203: '\\u00e8',\n                200: '\\u00e9',\n                205: '\\u00ea',\n                206: '\\u00eb',\n                207: '\\u00ec',\n                204: '\\u00ed',\n                211: '\\u00ee',\n                212: '\\u00ef',\n                63743: '\\u00f0',\n                210: '\\u00f1',\n                218: '\\u00f2',\n                219: '\\u00f3',\n                217: '\\u00f4'\n            };\n\n            Object.freeze(this.unToRoman);\n        }\n\n        return this.unToRoman;\n    },\n\n    /**\n     * translate entire string, roman to unicode\n     */\n    translateRomanToUn(s: string, fallback = '?') {\n        return this._translate(s, this._getRomanToUn(), fallback);\n    },\n\n    /**\n     * translate entire string, unicode to roman\n     */\n    translateUnToRoman(s: string, fallback = '?') {\n        return this._translate(s, this._getUnToRoman(), fallback);\n    },\n\n    /**\n     * translate a string to different character set\n     */\n    _translate(s: string, map: { [key: number]: string }, fallback: string) {\n        let ret = '';\n        for (let i = 0; i < s.length; i++) {\n            let found = map[s.charCodeAt(i)];\n            ret += found ? found : fallback;\n        }\n\n        return ret;\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512Element.ts",
    "content": "\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512PublicSettable } from './ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for UI model classes (button, label, etc)\n */\nexport abstract class UI512Element extends UI512PublicSettable {\n    readonly typename: string = 'UI512Element';\n    transparentToClicks = false;\n    protected _visible = true;\n    protected _enabled = true;\n    protected _enabledstyle = true;\n    protected _x = 0;\n    protected _y = 0;\n    protected _w = 0;\n    protected _h = 0;\n\n    /* simply a quick way to set x, y, w, and h in one line */\n    setDimensions(\n        newX: number,\n        newY: number,\n        newW: number,\n        newH: number,\n        context = ChangeContext.Default\n    ) {\n        assertTrue(newW >= 0, `2 |width must be >= 0 but got ${newW}`);\n        assertTrue(newH >= 0, `2z|height must be >= 0 but got ${newH}`);\n        this.set('x', newX, context);\n        this.set('y', newY, context);\n        this.set('w', newW, context);\n        this.set('h', newH, context);\n    }\n\n    /* instead of setting by width and height, set by x1 and y1. */\n    setDimensionsX1Y1(\n        newX0: number,\n        newY0: number,\n        newX1: number,\n        newY1: number,\n        context = ChangeContext.Default\n    ) {\n        this.setDimensions(newX0, newY0, newX1 - newX0, newY1 - newY0);\n    }\n\n    getFmTxt(): FormattedText {\n        let got = (this as any)['_' + UI512PublicSettable.fmtTxtVarName];\n        assertTrue(\n            got instanceof FormattedText,\n            `2&|did not get formatted text as expected`\n        );\n\n        /* ensure the \"lock\" bit has been set before we allow access\n        otherwise, you could make changes to the object and we'd never\n        receive any change notification */\n        got.lock();\n        return got;\n    }\n\n    setFmTxt(newTxt: FormattedText, context = ChangeContext.Default) {\n        this.setImpl(UI512PublicSettable.fmtTxtVarName, newTxt, undefined, context);\n    }\n\n    /* a few getters for convenience */\n    get enabled() {\n        return this._enabled;\n    }\n\n    get visible() {\n        return this._visible;\n    }\n\n    get x() {\n        return this.getN('x');\n    }\n\n    get y() {\n        return this.getN('y');\n    }\n\n    get w() {\n        return this.getN('w');\n    }\n\n    get h() {\n        return this.getN('h');\n    }\n\n    get bottom() {\n        return this.y + this.h;\n    }\n\n    get right() {\n        return this.x + this.w;\n    }\n}\n\n/**\n * an element that has a text label\n */\nexport abstract class UI512ElementWithText extends UI512Element {\n    protected _labeltext = '';\n    protected _labelvalign = true;\n    protected _labelhalign = true;\n    protected _labelwrap = false;\n}\n\n/**\n * an element that can show an icon and be highlighted\n */\nexport abstract class UI512ElementWithHighlight extends UI512ElementWithText {\n    protected _highlightactive = false;\n    protected _autohighlight = true;\n    protected _checkmark = false;\n    protected _icongroupid = '';\n    protected _iconnumber = -1;\n    protected _iconnumberwhenhighlight = -1;\n    protected _iconadjustx = 0;\n    protected _iconadjusty = 0;\n    protected _iconadjustwidth = 0;\n    protected _iconadjustheight = 0;\n    protected _iconadjustsrcx = 0;\n    protected _iconadjustsrcy = 0;\n    protected _iconcentered = true;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementApp.ts",
    "content": "\n/* auto */ import { RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { O, tostring } from './../utils/util512Base';\n/* auto */ import { ensureDefined } from './../utils/util512Assert';\n/* auto */ import { AnyParameterCtor, OrderedHash } from './../utils/util512';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { UI512ApplicationInterface, UI512ElGroup } from './ui512ElementGroup';\n/* auto */ import { ElementObserver, elementObserverDefault } from './ui512ElementGettable';\n/* auto */ import { UI512Element } from './ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a class that contains all groups shown on the current form\n * this class has model state only: rendering logic should go in view, not here.\n */\nexport class UI512Application implements UI512ApplicationInterface {\n    protected groups = new OrderedHash<UI512ElGroup>();\n    observer: ElementObserver;\n    bounds: number[] = [];\n\n    constructor(bounds: number[], observer: ElementObserver = elementObserverDefault) {\n        this.bounds = bounds;\n        this.observer = observer;\n    }\n\n    /**\n     * look for group by id. throw exception if not found.\n     */\n    getGroup(id: string) {\n        return this.groups.get(id);\n    }\n\n    /**\n     * look for group by id. return undefined if not found.\n     */\n    findGroup(id: string) {\n        return this.groups.find(id);\n    }\n\n    /**\n     * return index where condition is true\n     */\n    findIndex(fn: (a: UI512ElGroup) => boolean): number {\n        let i = 0;\n        for (let grp of this.groups.iter()) {\n            if (fn(grp)) {\n                return i;\n            }\n\n            i++;\n        }\n        return -1;\n    }\n\n    /**\n     * loop over groups. in z-order from background to foreground.\n     */\n    iterGrps() {\n        return this.groups.iter();\n    }\n\n    /**\n     * loop over groups. in z-order from foreground to background.\n     */\n    iterGrpsReversed() {\n        return this.groups.iterReversed();\n    }\n\n    /**\n     * add a group to the application.\n     * for convenience, attaches our Observer to the new group\n     */\n    addGroup(grp: UI512ElGroup, index = -1, context = ChangeContext.Default) {\n        grp.observer = this.observer;\n        if (index === -1) {\n            this.groups.insertNew(grp.id, grp);\n        } else {\n            this.groups.insertAt(grp.id, grp, index);\n        }\n\n        this.observer.changeSeen(context, grp.id, '(addgrp)', 0, 0);\n    }\n\n    /**\n     * remove a group\n     */\n    removeGroup(id: string, context = ChangeContext.Default) {\n        this.groups.delete(id);\n        this.observer.changeSeen(context, id, '(removegrp)', 0, 0);\n    }\n\n    /**\n     * find which element contains the coordinates\n     */\n    coordsToElement(x: number, y: number) {\n        for (let grp of this.groups.iterReversed()) {\n            if (\n                !grp.getVisible() ||\n                !grp.enableMouseInteraction ||\n                !RectUtils.hasPoint(\n                    x,\n                    y,\n                    grp.mouseInteractionBounds[0],\n                    grp.mouseInteractionBounds[1],\n                    grp.mouseInteractionBounds[2],\n                    grp.mouseInteractionBounds[3]\n                )\n            ) {\n                continue;\n            }\n\n            for (let el of grp.iterElsReversed()) {\n                if (el.visible && !el.transparentToClicks) {\n                    if (RectUtils.hasPoint(x, y, el.x, el.y, el.w, el.h)) {\n                        return el;\n                    }\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * look for an element, return the parent group\n     */\n    findElAndGroupById(elId: O<string>): O<[UI512ElGroup, UI512Element]> {\n        if (!elId) {\n            return undefined;\n        }\n\n        for (let grp of this.groups.iterReversed()) {\n            let el = grp.findEl(elId);\n            if (el) {\n                return [grp, el];\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * look for an element by id, search all groups, return undefined if not found\n     */\n    findEl(elId: O<string>) {\n        if (!elId) {\n            return undefined;\n        }\n\n        for (let grp of this.groups.iterReversed()) {\n            let el = grp.findEl(elId);\n            if (el) {\n                return el;\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * look for an element by id, search all groups, throw exception if not found\n     */\n    getEl(elId: string) {\n        return ensureDefined(this.findEl(elId), '2w|not found ' + elId);\n    }\n}\n\n/**\n * add elements and arrange them in a grid\n */\nexport class GridLayout<RowType, ColType> {\n    constructor(\n        public baseX: number,\n        public baseY: number,\n        public itemW: number,\n        public itemH: number,\n        public cols: ColType[],\n        public rows: RowType[],\n        public marginX: number,\n        public marginY: number\n    ) {}\n\n    /**\n     * width of one column\n     */\n    getColWidth() {\n        return this.itemW + this.marginX;\n    }\n\n    /**\n     * heigh of one row\n     */\n    getRowHeight() {\n        return this.itemH + this.marginY;\n    }\n\n    /**\n     * total width\n     */\n    getTotalWidth() {\n        return this.getColWidth() * this.cols.length;\n    }\n\n    /**\n     * total height\n     */\n    getTotalHeight() {\n        return this.getRowHeight() * this.rows.length;\n    }\n\n    /**\n     * get bounds rect for one of the elements\n     */\n    boundsForNumber(numX: number, numY: number) {\n        return [\n            this.baseX + numX * (this.itemW + this.marginX),\n            this.baseY + numY * (this.itemH + this.marginY),\n            this.itemW,\n            this.itemH\n        ];\n    }\n\n    /**\n     * don't actually add the elements, but compute the grid layout\n     * and run the callback for each item that would be in the grid\n     */\n    combinations(fn: (n: number, a: ColType, b: RowType, bnds: number[]) => void) {\n        let count = 0;\n        for (let rowNum = 0; rowNum < this.rows.length; rowNum++) {\n            for (let colNum = 0; colNum < this.cols.length; colNum++) {\n                let bnds = this.boundsForNumber(colNum, rowNum);\n                fn(count, this.cols[colNum], this.rows[rowNum], bnds);\n                count += 1;\n            }\n        }\n    }\n\n    /**\n     * create and add elements in a grid layout\n     * we'll run the callback for each element created.\n     * you can provide your own ids by setting idBasedOnCol to false\n     * you can provide your own labels by setting labelBasedOnCol to false\n     */\n    createElems<T extends UI512Element>(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        idPrefix: string,\n        ctor: AnyParameterCtor<T>,\n        fn: (a: ColType, b: RowType, el: T) => void,\n        idBasedOnCol = false,\n        labelBasedOnCol = false\n    ) {\n        this.combinations((n, a, b, bnds) => {\n            /* use either row data or col data, whichever is a string\n            we can use as part of the id. */\n            let cellIdSuffix = typeof a === 'string' ? a : b;\n            let id = idBasedOnCol ? `${idPrefix}${cellIdSuffix}` : `${idPrefix}_${n}`;\n            let el = new ctor(id);\n            grp.addElement(app, el);\n            el.setDimensions(bnds[0], bnds[1], bnds[2], bnds[3]);\n            fn(a, b, el);\n\n            if (labelBasedOnCol) {\n                el.set('labeltext', tostring(cellIdSuffix).toLowerCase());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementButton.ts",
    "content": "\n/* auto */ import { UI512ElementWithHighlight } from './ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * general button class, rendering logic will render anything inheriting\n * from this class as a button.\n */\nexport abstract class UI512ElementButtonBase extends UI512ElementWithHighlight {\n    readonly typename: string = 'UI512ElementButtonBase';\n    protected _style: number = UI512BtnStyle.Rectangle;\n}\n\n/**\n * the model for a UI button element\n */\nexport class UI512ElButton extends UI512ElementButtonBase {}\n\n/**\n * style of a button, e.g. type of border decoration\n */\nexport enum UI512BtnStyle {\n    __isUI512Enum = 1,\n    Transparent,\n    Rectangle,\n    Opaque,\n    RoundRect,\n    Plain,\n    Shadow,\n    OSStandard,\n    OSDefault,\n    OSBoxModal,\n    Checkbox,\n    Radio\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementCanvasPiece.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { UI512Element } from './ui512Element';\n/* auto */ import { UI512Painter } from './../draw/ui512DrawPainterClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the model for a UI image element,\n * the image is drawn from a region of a canvas.\n */\nexport class UI512ElCanvasPiece extends UI512Element {\n    readonly typename: string = 'UI512ElCanvasPiece';\n    protected canvas: CanvasWrapper;\n    protected cachedPainter: UI512Painter;\n    protected _srcX = 0;\n    protected _srcY = 0;\n    protected _incrementUntilLoaded = 0;\n\n    /**\n     * signal to our Observer that something has changed.\n     */\n    protected signalChange() {\n        this.set('incrementUntilLoaded', this.getN('incrementUntilLoaded') + 1);\n    }\n\n    /**\n     * set which canvas the image will be drawn from. we need to bump\n     * the other property, to signal to our Observer that something has changed.\n     */\n    setCanvas(cv: CanvasWrapper) {\n        this.signalChange();\n        this.canvas = cv;\n    }\n\n    /**\n     * get the canvas in order to draw changes on the canvas. we need to bump\n     * the other property, to signal to our Observer that something has changed.\n     */\n    getCanvasForWrite() {\n        this.signalChange();\n        return this.canvas;\n    }\n\n    /**\n     * get the canvas, but not to make changes.\n     */\n    getCanvasForRead() {\n        return this.canvas;\n    }\n\n    /**\n     * get width of canvas\n     */\n    getCvWidth() {\n        return this.canvas.canvas.width;\n    }\n\n    /**\n     * get height of canvas\n     */\n    getCvHeight() {\n        return this.canvas.canvas.height;\n    }\n\n    /**\n     * we can cache a painter as a very minor perf improvement. we need to bump\n     * the other property, to signal to our Observer that something has changed.\n     */\n    setCachedPainter(pnter: UI512Painter) {\n        this.signalChange();\n        this.cachedPainter = pnter;\n    }\n\n    /**\n     * get the cached painter.\n     * assumes that we'll use it to draw something soon, so we need to bump\n     * the other property, to signal to our Observer that something has changed.\n     */\n    getCachedPainterForWrite() {\n        this.signalChange();\n        return this.cachedPainter;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementGettable.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { assertEq, assertWarnEq, slength } from './../utils/util512';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* properties can be any one of these types */\nexport type ElementObserverVal = string | boolean | number | FormattedText;\n\n/**\n * a \"Gettable\" class has all of its properties marked as protected,\n * and allows access to them through a get() method.\n * types are currently verified at runtime.\n */\nexport abstract class UI512Gettable {\n    getN(s: string): number {\n        let v = (this as any)['_' + s]; /* gettable */\n        assertEq(typeof 0, typeof v, `2+|${s} expected type ${typeof 0}`);\n        return v;\n    }\n\n    getS(s: string): string {\n        let v = (this as any)['_' + s]; /* gettable */\n        assertWarnEq(typeof '', typeof v, `2*|${s} expected type ${typeof ''}`);\n        return v;\n    }\n\n    getB(s: string): boolean {\n        let v = (this as any)['_' + s]; /* gettable */\n        assertEq('boolean', typeof v, `2)|${s} expected type 'boolean'}`);\n        return v;\n    }\n\n    getGeneric(s: string): ElementObserverVal {\n        let v = (this as any)['_' + s]; /* gettable */\n        assertTrue(v !== null && v !== undefined, `2(|${s} undefined`);\n        return v;\n    }\n\n    ui512GettableHas(s: string): boolean {\n        let v = (this as any)['_' + s]; /* gettable */\n        return v !== null && v !== undefined;\n    }\n}\n\n/**\n * a \"Settable\" class has all of its properties marked as protected,\n * and allows access to them through a set() method.\n *\n * ChangeContext can indicate the origin of the event, it\n * currently has no effect anywhere.\n */\nexport abstract class UI512Settable extends UI512Gettable {\n    static readonly fmtTxtVarName = 'ftxt';\n    readonly idInternal: string;\n    protected dirty = true;\n    protected locked = false;\n    protected static readonly emptyFmTxt = new FormattedText();\n    observer: ElementObserver;\n\n    lock(locked: boolean) {\n        this.locked = locked;\n    }\n\n    constructor(id: string, observer: ElementObserver = elementObserverDefault) {\n        super();\n        assertTrue(slength(id), '2%|invalid id');\n        assertTrue(!id.includes('|'), '2$|invalid id');\n        this.idInternal = id;\n        this.observer = observer;\n        UI512PublicSettable.emptyFmTxt.lock();\n    }\n\n    protected setImplInternal(\n        makeAccessDifficult: MakeAccessDifficult,\n        s: string,\n        newVal: ElementObserverVal,\n        defaultVal: O<ElementObserverVal>,\n        context: ChangeContext\n    ) {\n        checkThrow512(\n            !this.locked,\n            'O:|tried to set value when locked. setting during refresh()?'\n        );\n        let prevVal = (this as any)['_' + s];\n        (this as any)['_' + s] = newVal; /* gettable */\n        if (prevVal !== newVal) {\n            if (defaultVal === undefined) {\n                /* type check mandatory */\n                assertWarnEq(\n                    typeof prevVal,\n                    typeof newVal,\n                    `2#|property ${s} type mismatch, did you misspell a prop name?`\n                );\n            } else {\n                /* skip the type check, since the prev val might be undefined */\n                if (prevVal === undefined || prevVal === null) {\n                    prevVal = defaultVal;\n                }\n            }\n\n            this.dirty = true;\n            if (newVal instanceof FormattedText) {\n                newVal.lock();\n            }\n\n            this.observer.changeSeen(context, this.idInternal, s, prevVal, newVal);\n        }\n    }\n\n    getDirty() {\n        return this.dirty;\n    }\n\n    setDirty(newVal: boolean, context = ChangeContext.Default) {\n        this.dirty = newVal;\n        if (newVal) {\n            this.observer.changeSeen(context, this.idInternal, '', '', '');\n        }\n    }\n}\n\n/**\n * not only settable, but lets anyone set things\n */\nexport abstract class UI512PublicSettable extends UI512Settable {\n    protected setImpl(\n        s: string,\n        newVal: ElementObserverVal,\n        defaultVal: O<ElementObserverVal>,\n        context: ChangeContext\n    ) {\n        this.setImplInternal(makeAccessDifficult, s, newVal, defaultVal, context);\n    }\n\n    set(s: string, newVal: ElementObserverVal, context = ChangeContext.Default) {\n        this.setImplInternal(makeAccessDifficult, s, newVal, undefined, context);\n    }\n\n    get id(): string {\n        return this.idInternal;\n    }\n}\n\n/**\n * don't want people outside this file calling this\n */\nclass MakeAccessDifficult {}\nconst makeAccessDifficult = new MakeAccessDifficult();\n\n/**\n * relay an Observer event to two classes.\n */\nexport class ElementObserverToTwo implements ElementObserver {\n    observer1: ElementObserver;\n    observer2: ElementObserver;\n    changeSeen(\n        context: ChangeContext,\n        elId: string,\n        propName: string,\n        prevVal: ElementObserverVal,\n        newVal: ElementObserverVal\n    ) {\n        this.observer1.changeSeen(context, elId, propName, prevVal, newVal);\n        this.observer2.changeSeen(context, elId, propName, prevVal, newVal);\n    }\n}\n\n/* when properties are set on an Element, an Observer can be attached\nto receive a callback for all changes */\nexport interface ElementObserver {\n    changeSeen(\n        context: ChangeContext,\n        elId: string,\n        propName: string,\n        prevVal: ElementObserverVal,\n        newVal: ElementObserverVal\n    ): void;\n}\n\n/* all Elements must have an observer,\nso use this class if the observer truly isn't needed */\nexport class ElementObserverNoOp implements ElementObserver {\n    changeSeen(\n        context: ChangeContext,\n        elId: string,\n        propName: string,\n        prevVal: ElementObserverVal,\n        newVal: ElementObserverVal\n    ) {}\n}\n\n/* Default to this, to remind you to attach to a better Observer. */\nexport class ElementObserverDefault implements ElementObserver {\n    changeSeen(\n        context: ChangeContext,\n        elId: string,\n        propName: string,\n        prevVal: ElementObserverVal,\n        newVal: ElementObserverVal\n    ) {\n        assertTrue(false, '2,|no observer attached');\n    }\n}\n\n/* pre-made instances for convenience */\nexport const elementObserverNoOp = new ElementObserverNoOp();\nexport const elementObserverDefault = new ElementObserverDefault();\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementGroup.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { checkThrow512 } from './../utils/util512Assert';\n/* auto */ import { OrderedHash } from './../utils/util512';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { ElementObserver, elementObserverDefault } from './ui512ElementGettable';\n/* auto */ import { UI512Element } from './ui512Element';\n/* auto */ import { largeArea } from './../drawtext/ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a group of elements.\n * useful for say, a dialog box, because you can hide the entire group at once,\n * or close the entire group at once.\n * also, if mouseInteractionBounds is used, better perf\n * when going from mouse coords to element.\n * this class has model state only: rendering logic should go in view, not here.\n */\nexport class UI512ElGroup {\n    readonly id: string;\n    observer: ElementObserver;\n    protected elements = new OrderedHash<UI512Element>();\n    protected visible = true;\n    enableMouseInteraction = true;\n    mouseInteractionBounds: [number, number, number, number] = [\n        0,\n        0,\n        largeArea,\n        largeArea\n    ];\n\n    constructor(id: string, observer: ElementObserver = elementObserverDefault) {\n        this.id = id;\n        this.observer = observer;\n    }\n\n    /**\n     * is the group visible\n     */\n    getVisible() {\n        return this.visible;\n    }\n\n    /**\n     * set the group visibility\n     */\n    setVisible(v: boolean, context = ChangeContext.Default) {\n        if (v !== this.visible) {\n            this.observer.changeSeen(context, '(setVisible)', '(setVisible)', 0, 0);\n            this.visible = v;\n        }\n    }\n\n    /**\n     * updateBoundsBasedOnChildren is a performance optimization:\n     * to go from mouse coords to which element clicked, we loop through all elements\n     * but since a group is likely confined to one area, we can check and maybe skip\n     * everything in the group\n     */\n    updateBoundsBasedOnChildren() {\n        let setAtLeastOne = false;\n        let maxBounds = [\n            Number.POSITIVE_INFINITY,\n            Number.POSITIVE_INFINITY,\n            Number.NEGATIVE_INFINITY,\n            Number.NEGATIVE_INFINITY\n        ];\n\n        for (let el of this.elements.iter()) {\n            setAtLeastOne = true;\n            maxBounds[0] = Math.min(maxBounds[0], el.x);\n            maxBounds[1] = Math.min(maxBounds[1], el.y);\n            maxBounds[2] = Math.max(maxBounds[2], el.right);\n            maxBounds[3] = Math.max(maxBounds[3], el.bottom);\n        }\n\n        if (setAtLeastOne) {\n            this.mouseInteractionBounds[0] = maxBounds[0];\n            this.mouseInteractionBounds[1] = maxBounds[1];\n            this.mouseInteractionBounds[2] = maxBounds[2] - maxBounds[0];\n            this.mouseInteractionBounds[3] = maxBounds[3] - maxBounds[1];\n        } else {\n            this.mouseInteractionBounds[0] = 0;\n            this.mouseInteractionBounds[1] = 0;\n            this.mouseInteractionBounds[2] = 0;\n            this.mouseInteractionBounds[3] = 0;\n        }\n    }\n\n    /**\n     * look for element by id. throws if not found.\n     */\n    getEl(id: string): UI512Element {\n        return this.elements.get(id);\n    }\n\n    /**\n     * look for element by id. returns undefined if not found\n     */\n    findEl(id: string): O<UI512Element> {\n        return this.elements.find(id);\n    }\n\n    /**\n     * loop over elements. in z-order from background to foreground.\n     */\n    *iterEls() {\n        for (let o of this.elements.iter()) {\n            yield o;\n        }\n    }\n\n    /**\n     * loop over elements. in reversed z-order from foreground to background.\n     */\n    *iterElsReversed() {\n        for (let o of this.elements.iterReversed()) {\n            yield o;\n        }\n    }\n\n    /**\n     * remove all elements.\n     */\n    removeAllEls(context = ChangeContext.Default) {\n        this.observer.changeSeen(context, '(removeallels)', '(removeallels)', 0, 0);\n        this.elements.deleteAll();\n    }\n\n    /**\n     * add an element to the group.\n     * for convenience, attaches our Observer to the new element\n     */\n    addElementAfter(\n        parent: UI512ApplicationInterface,\n        elemIn: UI512Element,\n        elToAddAfter: O<string>,\n        context = ChangeContext.Default\n    ) {\n        /* disallow any duplicates */\n        for (let grp of parent.iterGrps()) {\n            checkThrow512(\n                !grp.findEl(elemIn.id),\n                `2x|dup ${elemIn.id} found in grp ${grp.id}`\n            );\n        }\n\n        /* for convenience, copy our observer onto the new element */\n        if (elemIn.observer === elementObserverDefault) {\n            elemIn.observer = this.observer;\n        }\n\n        if (elToAddAfter) {\n            /* if we are adding \"elemC##test\" and elToAddAfter==\"elemC\", and\n            already existing are\n                \"elemA\", \"elemB\", \"elemC\", \"elemC##1\", \"elemC##2\", \"elemD\"\n            we want the order to be\n                \"elemA\", \"elemB\", \"elemC\", \"elemC##1\", \"elemC##2\", \"elemC##test\", \"elemD\"\n            validated in testAddElementAfter */\n            let index = this.elements.getIndex(elToAddAfter);\n            let first = this.elements.atIndex(index);\n            if (first) {\n                let firstId = first.id;\n                while (true) {\n                    index += 1;\n                    let cur = this.elements.atIndex(index);\n                    if (!cur || !cur.id.startsWith(firstId + '##')) {\n                        break;\n                    }\n                }\n            }\n\n            this.elements.insertAt(elemIn.id, elemIn, index);\n        } else {\n            this.elements.insertNew(elemIn.id, elemIn);\n        }\n\n        this.observer.changeSeen(context, elemIn.id, '(addel)', 0, 0);\n    }\n\n    /**\n     * add an element to the group.\n     */\n    addElement(\n        parent: UI512ApplicationInterface,\n        elemIn: UI512Element,\n        context = ChangeContext.Default\n    ) {\n        return this.addElementAfter(parent, elemIn, undefined, context);\n    }\n\n    /**\n     * remove an element from the group.\n     */\n    removeElement(id: string, context = ChangeContext.Default): boolean {\n        let found = this.elements.find(id);\n        if (found) {\n            this.observer.changeSeen(context, found.id, '(removeel)', 0, 0);\n        }\n\n        return this.elements.delete(id);\n    }\n\n    /**\n     * return number of elements\n     */\n    countElems() {\n        return this.elements.length();\n    }\n}\n\n/**\n * forward declaration of application interface\n */\nexport interface UI512ApplicationInterface {\n    iterGrps(): Iterable<UI512ElGroup>;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementLabel.ts",
    "content": "\n/* auto */ import { ElementObserver, elementObserverDefault } from './ui512ElementGettable';\n/* auto */ import { UI512ElementWithText } from './ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the model for a UI label element\n */\nexport class UI512ElLabel extends UI512ElementWithText {\n    readonly typename: string = 'UI512ElLabel';\n    protected _transparentExceptChars = false;\n    constructor(\n        idString: string,\n        labeltext = '',\n        observer: ElementObserver = elementObserverDefault\n    ) {\n        super(idString, observer);\n        this._labeltext = labeltext;\n        this._labelvalign = false;\n        this._labelhalign = false;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementMenu.ts",
    "content": "\n/* auto */ import { ElementObserver, elementObserverDefault } from './ui512ElementGettable';\n/* auto */ import { UI512BtnStyle, UI512ElementButtonBase } from './ui512ElementButton';\n/* auto */ import { UI512Application } from './ui512ElementApp';\n/* auto */ import { UI512Element } from './ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the model for a UI menu item\n * you can use specialCharCmdSymbol in the hotkey to make the symbol.\n */\nexport class UI512MenuItem extends UI512Element {\n    readonly typename: string = 'UI512MenuItem';\n    protected _highlightactive = false;\n    protected _labeltext = '';\n    protected _labelhotkey = '';\n    protected _checkmark = false;\n    protected _enabled = true;\n    constructor(id: string, observer: ElementObserver = elementObserverDefault) {\n        super(id, observer);\n    }\n}\n\n/**\n * the model for a UI menu drop-down\n */\nexport class UI512MenuDropdown extends UI512ElementButtonBase {\n    protected _labeltext = '';\n    protected _fixedoffset = -1;\n    protected _fixedwidth = -1;\n    protected _style: number = UI512BtnStyle.Transparent;\n    protected _autohighlight = true;\n    protected _icongroupid = '';\n    protected _iconnumber = -1;\n\n    /* list of item ids separated by | */\n    protected _childids = '';\n\n    constructor(idString: string, observer: ElementObserver = elementObserverDefault) {\n        super(idString, observer);\n        this._style = UI512BtnStyle.Transparent;\n        this._autohighlight = false;\n    }\n\n    getChildren(app: UI512Application) {\n        return idsToList<UI512MenuItem>(app, this._childids, '$$grpmenuitems');\n    }\n}\n\n/**\n * the model for a UI menu root element\n */\nexport class UI512MenuRoot extends UI512Element {\n    readonly typename: string = 'UI512MenuRoot';\n    protected _whichIsExpanded = -1;\n\n    /* list of item ids separated by | */\n    protected _childids = '';\n\n    getchildren(app: UI512Application) {\n        return idsToList<UI512MenuDropdown>(app, this._childids, '$$grpmenubar');\n    }\n}\n\n/**\n * calls getElByID on a list of ids.\n */\nfunction idsToList<T extends UI512Element>(\n    app: UI512Application,\n    childIds: string,\n    grpId: string\n): T[] {\n    let list = childIds.split('|');\n    if (list.length) {\n        let grp = app.getGroup(grpId);\n        return list.map(s => grp.getEl(s) as T);\n    } else {\n        return [];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementTextField.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512ElGroup } from './ui512ElementGroup';\n/* auto */ import { ElementObserver, ElementObserverVal, elementObserverDefault } from './ui512ElementGettable';\n/* auto */ import { UI512Application } from './ui512ElementApp';\n/* auto */ import { UI512Element } from './ui512Element';\n/* auto */ import { specialCharNumNewline } from './../drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the model for a UI text field element\n */\nexport class UI512ElTextField extends UI512Element {\n    readonly typename: string = 'UI512ElTextField';\n    protected _labelvalign = true;\n    protected _labelhalign = true;\n    protected _labelwrap = false;\n    protected _showcaret = false;\n    protected _canedit = true;\n    protected _canselecttext = true;\n    protected _multiline = true;\n    protected _asteriskonly = false;\n    protected _style: number = UI512FldStyle.Rectangle;\n    protected _defaultFont: string = UI512DrawText.defaultFont;\n    protected _addvspacing = 0;\n\n    /* contents of the field */\n    protected _ftxt = new FormattedText();\n\n    /* vertical scroll amount in pixels. */\n    protected _scrollamt = 0;\n\n    /* adjust rendered text within the field, e.g. to add additional margin space */\n    protected _nudgex = 0;\n\n    /* adjust rendered text within the field, e.g. to add additional margin space */\n    protected _nudgey = 0;\n\n    /* start of selection. 0-based. ok if past the length of content. */\n    protected _selcaret = 0;\n\n    /* end of selection. 0-based. ok if past the length of content.\n    can be before selcaret if, say, you drag from right to left to\n    select text, or hit shift-left. */\n    protected _selend = 0;\n\n    /* used for choice box. it's easiest to call makeChoiceBox instead\n    of setting this directly */\n    protected _selectbylines = false;\n\n    /* a scrollbar is not part of the field, it is created separately.  */\n    protected _scrollbar = false;\n\n    /* we'll cache the height of content, for better perf. used for scrollbar math. */\n    protected _contentHeightInPixels = -1;\n\n    constructor(idString: string, observer: ElementObserver = elementObserverDefault) {\n        super(idString, observer);\n        this._labelwrap = true;\n        this._labelvalign = false;\n        this._labelhalign = false;\n        this._ftxt.lock();\n    }\n\n    /**\n     * we override set() so that we can invalidate our cached contentHeightInPixels\n     */\n    set(s: string, newVal: ElementObserverVal, context = ChangeContext.Default) {\n        /* reset cached height if anything substantial changes */\n        if (\n            s !== 'contentHeightInPixels' &&\n            s !== 'selcaret' &&\n            s !== 'selend' &&\n            s !== 'scrollamt' &&\n            s !== 'showcaret' &&\n            s !== 'canedit' &&\n            s !== 'canselecttext'\n        ) {\n            this.set('contentHeightInPixels', -1, context);\n\n            /* reset scroll position if dimensions change. */\n            if (s === 'x' || s === 'y' || s === 'w' || s === 'h') {\n                this.set('scrollamt', 0, context);\n            }\n        }\n\n        return super.set(s, newVal, context);\n    }\n\n    /**\n     * change the content of the text field\n     */\n    setFmTxt(newTxt: FormattedText, context = ChangeContext.Default) {\n        if (newTxt !== this._ftxt) {\n            this.set('contentHeightInPixels', -1, context);\n        }\n\n        return super.setFmTxt(newTxt, context);\n    }\n\n    /**\n     * helper function for a choicebox list of choices\n     */\n    static setListChoices(el: UI512ElTextField, choices: string[]) {\n        if (choices.length) {\n            /* add a space before each item because it looks better */\n            let s = choices.map(item => ' ' + item).join('\\n');\n            let ftxt = FormattedText.newFromUnformatted(s);\n\n            /* little hack: add an ending newline so that selecting the last\n            line looks right. logic elsewhere prevents this last ending line\n            from being actually chosen/selected. we'll add the ending newline\n            in a small font so it won't affect the scrollbar much. */\n            ftxt.push(specialCharNumNewline, UI512DrawText.smallestFont);\n            el.setFmTxt(ftxt);\n        } else {\n            el.setFmTxt(FormattedText.newFromUnformatted(''));\n        }\n    }\n\n    /**\n     * helper function for a choicebox list of choices\n     */\n    static makeChoiceBox(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        id: string,\n        x: number,\n        y: number\n    ) {\n        let fld = new UI512ElTextField(id);\n        grp.addElement(app, fld);\n        fld.set('scrollbar', true);\n        fld.set('selectbylines', true);\n        fld.set('multiline', true);\n        fld.set('canselecttext', true);\n        fld.set('canedit', false);\n        fld.set('labelwrap', false);\n        fld.setDimensions(\n            x,\n            y,\n            ScrollConsts.ChoiceListDefaultWidth,\n            ScrollConsts.ChoiceListDefaultHeight\n        );\n        return fld;\n    }\n}\n\n/**\n * style of a text field, e.g. type of border decoration\n */\nexport enum UI512FldStyle {\n    __isUI512Enum = 1,\n    Opaque,\n    Transparent,\n    Rectangle,\n    Shadow\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/elements/ui512ElementView.ts",
    "content": "\n/* auto */ import { MenuConsts, ScreenConsts, ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper, RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, VoidFn, getRoot } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../utils/util512Assert';\n/* auto */ import { Util512, cast, slength } from './../utils/util512';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './ui512ElementTextField';\n/* auto */ import { UI512MenuItem, UI512MenuRoot } from './ui512ElementMenu';\n/* auto */ import { UI512ElLabel } from './ui512ElementLabel';\n/* auto */ import { UI512ElCanvasPiece } from './ui512ElementCanvasPiece';\n/* auto */ import { UI512BtnStyle, UI512ElementButtonBase } from './ui512ElementButton';\n/* auto */ import { UI512Application } from './ui512ElementApp';\n/* auto */ import { UI512Element, UI512ElementWithHighlight } from './ui512Element';\n/* auto */ import { DrawTextArgs, drawTextArgsFromEl } from './../drawtext/ui512DrawTextArgs';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n/* auto */ import { UI512IconManager } from './../draw/ui512DrawIconManager';\n/* auto */ import { IconInfo, RenderIconGroup } from './../draw/ui512DrawIconClasses';\n/* auto */ import { UI512ViewDrawBorders } from './../draw/ui512DrawBorders';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * draw UI elements onto a canvas\n */\nexport class UI512ViewDraw {\n    allowMultipleFocus = false;\n\n    /**\n     * shrink a rectangle by a defined amount of padding, and keep it centered.\n     */\n    getSubRect(b: UI512ViewDrawBorders, padX: number, padY: number) {\n        return RectUtils.getSubRectRaw(b.bx, b.by, b.w, b.h, padX, padY);\n    }\n\n    /**\n     * fill a rectangle, no-op if rect isn't set\n     */\n    drawFillIfDefined(b: UI512ViewDrawBorders, rect: number[], fillStyle: string) {\n        if (rect) {\n            b.canvas.fillRect(\n                rect[0],\n                rect[1],\n                rect[2],\n                rect[3],\n                b.bx,\n                b.by,\n                b.w,\n                b.h,\n                fillStyle\n            );\n        }\n    }\n\n    /**\n     * invert colors for a rectangle, no-op if rect isn't set\n     */\n    drawInvertIfDefined(b: UI512ViewDrawBorders, rect: number[]) {\n        if (rect) {\n            b.canvas.invertColorsRect(\n                rect[0],\n                rect[1],\n                rect[2],\n                rect[3],\n                b.bx,\n                b.by,\n                b.w,\n                b.h\n            );\n        }\n    }\n\n    /**\n     * draw text in a rectangle, no-op if rect isn't set\n     */\n    drawTextIfDefined(\n        b: UI512ViewDrawBorders,\n        rect: O<number[]>,\n        text: string,\n        wrap: boolean,\n        hAlign: boolean,\n        vAlign: boolean,\n        styleEnabled: boolean\n    ) {\n        if (rect) {\n            let opts = new DrawTextArgs(\n                rect[0],\n                rect[1],\n                rect[2],\n                rect[3],\n                hAlign,\n                vAlign,\n                wrap\n            );\n            return this.drawText(b, text, opts, styleEnabled);\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * draw text in a rectangle from element, no-op if rect isn't set\n     */\n    drawTextIfDefinedFromEl(\n        b: UI512ViewDrawBorders,\n        rect: O<number[]>,\n        el: UI512Element\n    ) {\n        return this.drawTextIfDefined(\n            b,\n            rect,\n            el.getS('labeltext'),\n            el.getB('labelwrap'),\n            el.getB('labelhalign'),\n            el.getB('labelvalign'),\n            el.getB('enabledstyle')\n        );\n    }\n\n    /**\n     * draw text in a rectangle\n     */\n    drawText(\n        b: UI512ViewDrawBorders,\n        text: string,\n        opts: DrawTextArgs,\n        styleEnabled: boolean\n    ) {\n        let drawText = cast(UI512DrawText, getRoot().getDrawText());\n        if (!styleEnabled) {\n            text = UI512DrawText.makeInitialTextGrayed(text);\n        }\n\n        let drawn = drawText.drawStringIntoBox(text, b.canvas, opts);\n        if (drawn) {\n            return drawn;\n        } else {\n            b.complete.complete = false;\n            return undefined;\n        }\n    }\n\n    /**\n     * draw icon in a rectangle, no-op if rect isn't set\n     */\n    drawIconIfDefined(b: UI512ViewDrawBorders, rect: O<number[]>, iconInfo: IconInfo) {\n        if (rect) {\n            let iconManager = cast(UI512IconManager, getRoot().getDrawIcon());\n            let icon = iconManager.findIcon(iconInfo.iconGroup, iconInfo.iconNumber);\n            if (icon) {\n                icon.drawIntoBox(b.canvas, iconInfo, rect[0], rect[1], rect[2], rect[3]);\n            } else {\n                b.complete.complete = false;\n            }\n        }\n    }\n\n    /**\n     * render a button\n     */\n    renderButtonImpl(\n        b: UI512ViewDrawBorders,\n        el: UI512ElementButtonBase,\n        padX: number,\n        padY: number\n    ) {\n        assertTrue(b.w >= 2 * padX, '4h|too small');\n        assertTrue(b.h >= 2 * padY, '4g|too small');\n\n        let iconInfo = this.getIconInfo(el);\n        let subRect = this.getSubRect(b, padX, padY);\n        if (!slength(el.getS('labeltext')) && !iconInfo) {\n            /* case 1) no icon and no label */\n        } else if (slength(el.getS('labeltext')) && !iconInfo) {\n            /* case 2) no icon and a label */\n            this.drawTextIfDefinedFromEl(b, subRect, el);\n        } else if (!slength(el.getS('labeltext')) && iconInfo) {\n            /* case 3) icon and no label */\n            this.drawIconIfDefined(b, subRect, iconInfo);\n        } else if (slength(el.getS('labeltext')) && iconInfo) {\n            /* case 4) both icon and label */\n            this.drawBothTextAndIcon(\n                b,\n                subRect,\n                iconInfo,\n                el.getS('labeltext'),\n                el.getB('enabledstyle')\n            );\n        }\n    }\n\n    /**\n     * draw both text and icon in a rectangle, no-op if rect isn't set\n     */\n    drawBothTextAndIcon(\n        b: UI512ViewDrawBorders,\n        rect: O<number[]>,\n        iconInfo: IconInfo,\n        s: string,\n        styleEnabled: boolean\n    ) {\n        const marginBetweenIconAndTxt = 0;\n        const assumeTxtHeight = 12;\n        let iconSrcRect = RenderIconGroup.lookupRectangle(\n            iconInfo.iconGroup,\n            iconInfo.iconNumber\n        );\n\n        if (!rect || !iconSrcRect) {\n            return;\n        }\n\n        let iconW = iconSrcRect[2] + iconInfo.adjustWidth;\n        let iconH = iconSrcRect[3] + iconInfo.adjustHeight;\n        let iconAndTextH = iconH + marginBetweenIconAndTxt + assumeTxtHeight;\n        let iconX = rect[0] + Math.trunc(rect[2] / 2) - Math.trunc(iconW / 2);\n        let iconY = rect[1] + Math.trunc(rect[3] / 2) - Math.trunc(iconAndTextH / 2);\n\n        let iconManager = cast(UI512IconManager, getRoot().getDrawIcon());\n        let icon = iconManager.findIcon(iconInfo.iconGroup, iconInfo.iconNumber);\n        if (!icon) {\n            b.complete.complete = false;\n            return;\n        }\n\n        /* draw the icon */\n        icon.drawAtLocationAndClipFromBox(\n            b.canvas,\n            iconInfo,\n            iconX,\n            iconY,\n            rect[0],\n            rect[1],\n            rect[2],\n            rect[3]\n        );\n\n        /* now draw the text */\n        /* set the font to 9pt Geneva, unless it's already been set.\n        in fact, in HC no other font is supported. */\n        let style = styleEnabled ? 'biuosdce' : 'biuos+dce';\n        let labelSmall = UI512DrawText.setFont(s, `geneva_9_${style}`);\n        labelSmall = labelSmall.replace(/\\r|\\n/g, '');\n        let lowestY = rect[1] + rect[3];\n        let args = new DrawTextArgs(\n            rect[0],\n            iconY + iconH + marginBetweenIconAndTxt,\n            rect[2],\n            0,\n            true /*hAlign*/,\n            false /*vAlign*/,\n            false /*wrap - always make false*/\n        );\n        args.boxH = Math.max(0, lowestY - args.boxY);\n        this.drawText(b, labelSmall, args, styleEnabled);\n    }\n\n    /**\n     * populate an IconInfo object by getting properties from the element\n     */\n    getIconInfo(el: UI512ElementWithHighlight): O<IconInfo> {\n        if (el.getS('icongroupid').length > 0 && el.getN('iconnumber') >= 0) {\n            let ret = new IconInfo(el.getS('icongroupid'), el.getN('iconnumber'));\n            ret.adjustX = el.getN('iconadjustx');\n            ret.adjustY = el.getN('iconadjusty');\n            ret.adjustWidth = el.getN('iconadjustwidth');\n            ret.adjustHeight = el.getN('iconadjustheight');\n            ret.adjustSrcX = el.getN('iconadjustsrcx');\n            ret.adjustSrcY = el.getN('iconadjustsrcy');\n            ret.centered = el.getB('iconcentered');\n            if (el.getB('highlightactive') && el.getN('iconnumberwhenhighlight') >= 0) {\n                ret.iconNumber = el.getN('iconnumberwhenhighlight');\n            }\n\n            return ret;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * render a checkbox and label\n     */\n    renderButtonCheckbox(b: UI512ViewDrawBorders, el: UI512ElementButtonBase) {\n        let iconInfo = new IconInfo('001', -1);\n        iconInfo.centered = true;\n        const spaceBetweenCheckAndText = 4;\n        const padLeft = 2;\n        const iconWidth = 12;\n\n        if (el.getN('style') === UI512BtnStyle.Radio && el.getB('checkmark')) {\n            iconInfo.iconNumber = el.getB('highlightactive') ? 34 : 32;\n        } else if (el.getN('style') === UI512BtnStyle.Radio && !el.getB('checkmark')) {\n            iconInfo.iconNumber = el.getB('highlightactive') ? 35 : 33;\n        } else if (el.getB('checkmark')) {\n            iconInfo.iconNumber = el.getB('highlightactive') ? 30 : 28;\n        } else {\n            iconInfo.iconNumber = el.getB('highlightactive') ? 31 : 29;\n        }\n\n        let boxIcon = [b.bx + padLeft, b.by, padLeft + iconWidth, b.h];\n        let boxTextX = b.bx + padLeft + iconWidth + spaceBetweenCheckAndText;\n        let boxTextY = b.by;\n        let boxText = [boxTextX, boxTextY, b.w - (boxTextX - b.bx), b.h];\n        if (boxIcon[2] > 0 && boxText[2] > 0) {\n            iconInfo.centered = true;\n\n            this.drawIconIfDefined(b, boxIcon, iconInfo);\n            this.drawTextIfDefinedFromEl(b, boxText, el);\n        }\n    }\n\n    /**\n     * render an opaque button (clears out insides before drawing)\n     */\n    renderOpaqueButton(\n        b: UI512ViewDrawBorders,\n        el: UI512ElementButtonBase,\n        fnNotHighlight: VoidFn,\n        fnHighlight: VoidFn,\n        decorationSize: number\n    ) {\n        if (el.getB('highlightactive') && el.getN('iconnumberwhenhighlight') === -1) {\n            /* draw the border */\n            fnHighlight.apply(b);\n            let subRect = this.getSubRect(b, decorationSize, decorationSize);\n            if (subRect && !b.didFallbackToSimpleRect) {\n                /* clear the insides */\n                this.drawFillIfDefined(b, subRect, 'white');\n                /* draw the label */\n                this.renderButtonImpl(b, el, decorationSize, decorationSize);\n                /* invert colors on the insides */\n                this.drawInvertIfDefined(b, subRect);\n            }\n        } else {\n            /* draw the border */\n            fnNotHighlight.apply(b);\n            if (\n                !b.didFallbackToSimpleRect &&\n                b.w > decorationSize * 2 &&\n                b.h > decorationSize * 2\n            ) {\n                /* draw the label */\n                this.renderButtonImpl(b, el, decorationSize, decorationSize);\n            }\n        }\n    }\n\n    /**\n     * draw transparent button\n     */\n    renderButtonTransparent(b: UI512ViewDrawBorders, el: UI512ElementButtonBase) {\n        if (el.getB('highlightactive') && el.getN('iconnumberwhenhighlight') === -1) {\n            b.drawboxnoborder();\n            this.renderButtonImpl(b, el, 0, 0);\n            this.drawInvertIfDefined(b, [b.bx, b.by, el.w, el.h]);\n        } else {\n            this.renderButtonImpl(b, el, 0, 0);\n        }\n    }\n\n    /**\n     * draw a button\n     */\n    goUI512ElementButtonBase(b: UI512ViewDrawBorders, el: UI512ElementButtonBase) {\n        switch (el.getN('style')) {\n            case UI512BtnStyle.Transparent:\n                this.renderButtonTransparent(b, el);\n                break;\n            case UI512BtnStyle.Opaque:\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawboxnoborder,\n                    b.drawboxnoborderclicked,\n                    1\n                );\n                break;\n            case UI512BtnStyle.RoundRect:\n                this.renderOpaqueButton(b, el, b.drawvpcbtn, b.drawvpcbtnclicked, 7);\n                break;\n            case UI512BtnStyle.Plain:\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawvpcroundrect,\n                    b.drawvpcroundrectclicked,\n                    7\n                );\n                break;\n            case UI512BtnStyle.Shadow:\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawosboxshadow,\n                    b.drawosboxshadowclicked,\n                    4\n                );\n                break;\n            case UI512BtnStyle.OSStandard:\n                this.renderOpaqueButton(b, el, b.drawosbtn, b.drawosbtnclicked, 5);\n                break;\n            case UI512BtnStyle.OSDefault:\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawosdefaultbtn,\n                    b.drawosdefaultbtnclicked,\n                    9\n                );\n                break;\n            case UI512BtnStyle.OSBoxModal:\n                this.renderOpaqueButton(b, el, b.drawosboxmodal, b.drawosboxmodal, 7);\n                break;\n            case UI512BtnStyle.Checkbox:\n                this.renderButtonCheckbox(b, el);\n                break;\n            case UI512BtnStyle.Radio:\n                this.renderButtonCheckbox(b, el);\n                break;\n            case UI512BtnStyle.Rectangle:\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawboxthinborder,\n                    b.drawboxthinborderclicked,\n                    1\n                );\n                break;\n            default:\n                assertWarn(false, `4f|unknown button style ${el.getN('style')}`);\n                this.renderOpaqueButton(\n                    b,\n                    el,\n                    b.drawboxthinborder,\n                    b.drawboxthinborderclicked,\n                    2\n                );\n                break;\n        }\n    }\n\n    /**\n     * draw a mostly-transparent label, used for dialog captions\n     */\n    renderStaticLabelTransparentExceptChars(b: UI512ViewDrawBorders, el: UI512ElLabel) {\n        /* measure the string so that we can white out the space before drawing letters */\n        let drawText = cast(UI512DrawText, getRoot().getDrawText());\n        let subrectAlmostAll = this.getSubRect(b, 1, 1);\n        let measured = drawText.measureString(el.getS('labeltext'));\n        if (measured && subrectAlmostAll) {\n            /* get the smaller rectangle that will contain the text */\n            let shrinkx = Math.floor(\n                (el.w -\n                    (measured.rightmostPixelDrawn + ScrollConsts.WindowCaptionSpacing)) /\n                    2\n            );\n\n            /* the white rectangle should cover the horizontal lines\n            but not the outer border */\n            let subRect = this.getSubRect(b, Math.max(0, shrinkx), 1);\n            if (subRect) {\n                b.canvas.fillRect(\n                    subRect[0],\n                    subRect[1],\n                    subRect[2],\n                    subRect[3],\n                    b.bx,\n                    b.by,\n                    b.w,\n                    b.h,\n                    'white'\n                );\n                subrectAlmostAll[1] += ScrollConsts.WindowCaptionAdjustTextY;\n                this.drawTextIfDefinedFromEl(b, subrectAlmostAll, el);\n            }\n        } else {\n            b.complete.complete = false;\n        }\n    }\n\n    /**\n     * draw a label\n     */\n    goUI512ElLabel(b: UI512ViewDrawBorders, el: UI512ElLabel) {\n        if (el.getB('transparentExceptChars')) {\n            this.renderStaticLabelTransparentExceptChars(b, el);\n        } else {\n            b.drawboxnoborder();\n            let subRect = this.getSubRect(b, 1, 1);\n            this.drawTextIfDefinedFromEl(b, subRect, el);\n        }\n    }\n\n    /**\n     * draw a white rectangle for menu root\n     */\n    goUI512MenuRoot(b: UI512ViewDrawBorders, el: UI512MenuRoot) {\n        if (el.getS('childids').length > 0) {\n            b.drawboxnoborder();\n            b.canvas.fillRect(\n                el.x,\n                el.bottom - 1,\n                el.w,\n                1,\n                el.x,\n                el.y,\n                el.w,\n                el.h,\n                'black'\n            );\n        }\n    }\n\n    /**\n     * draw a menu item\n     */\n    goUI512MenuItem(b: UI512ViewDrawBorders, el: UI512MenuItem) {\n        if (el.getS('labeltext') === '---') {\n            this.renderMenuItemDivider(b, el);\n        } else {\n            this.renderMenuItemText(b, el);\n        }\n    }\n\n    /**\n     * draw a grayed-out menu separator item\n     */\n    renderMenuItemDivider(b: UI512ViewDrawBorders, el: UI512MenuItem) {\n        /* faster than drawing lots of dots, draw a carefully sized slice of an image */\n        let iconInfo = new IconInfo('001', 145);\n        let srcRect = RenderIconGroup.lookupRectangle(\n            iconInfo.iconGroup,\n            iconInfo.iconNumber\n        );\n        assertWarn(srcRect, '4e|expected to get srcRect');\n        if (srcRect) {\n            /* adjust so that the icon width is exactly the width we want */\n            let resultingwidth = Math.min(el.w, srcRect[2]);\n            let resultingheight = 1;\n\n            /* adjust by 1px so the pattern of dots and dashes looks correct\n            against the black border */\n            const shiftleft = 1;\n            iconInfo.adjustWidth = shiftleft + resultingwidth - srcRect[2];\n            iconInfo.adjustHeight = resultingheight - srcRect[3];\n            iconInfo.adjustSrcX = shiftleft;\n            iconInfo.centered = true;\n            this.drawIconIfDefined(b, [b.bx, b.by, el.w, el.h], iconInfo);\n        }\n    }\n\n    /**\n     * render a menu item\n     */\n    renderMenuItemText(b: UI512ViewDrawBorders, el: UI512MenuItem) {\n        /* draw the checkmark, if applicable */\n        let boxLeft = [b.bx, b.by, MenuConsts.FirstLabelPadding, el.h];\n        if (el.getB('checkmark')) {\n            let iconInfo = new IconInfo('001', 19);\n            iconInfo.centered = true;\n            this.drawIconIfDefined(b, boxLeft, iconInfo);\n        }\n\n        /* draw the first text */\n        if (el.w > MenuConsts.FirstLabelPadding) {\n            let boxMain = [\n                b.bx + MenuConsts.FirstLabelPadding,\n                b.by,\n                el.w - MenuConsts.FirstLabelPadding,\n                el.h\n            ];\n            this.drawTextIfDefined(\n                b,\n                boxMain,\n                el.getS('labeltext'),\n                false,\n                false,\n                true,\n                el.getB('enabledstyle')\n            );\n        }\n\n        /* draw the second text (cmd shortcut) */\n        if (el.w > MenuConsts.SecondLabelDistance) {\n            let boxRight = [\n                b.bx + el.w - MenuConsts.SecondLabelDistance,\n                b.by,\n                MenuConsts.SecondLabelDistance,\n                el.h\n            ];\n            this.drawTextIfDefined(\n                b,\n                boxRight,\n                el.getS('labelhotkey'),\n                false,\n                false,\n                true,\n                el.getB('enabledstyle')\n            );\n        }\n\n        /* highlight it */\n        if (el.getB('highlightactive') && el.getB('enabledstyle')) {\n            this.drawInvertIfDefined(b, [b.bx, b.by, el.w, el.h]);\n        }\n    }\n\n    /**\n     * render piece of an image\n     */\n    goUI512ElCanvasPiece(b: UI512ViewDrawBorders, el: UI512ElCanvasPiece) {\n        if (el.getCanvasForRead()) {\n            b.canvas.drawFromImage(\n                el.getCanvasForRead().canvas,\n                el.getN('srcX'),\n                el.getN('srcY'),\n                el.w,\n                el.h,\n                el.x,\n                el.y,\n                el.x,\n                el.y,\n                el.w,\n                el.h\n            );\n        }\n    }\n\n    /**\n     * different styles have different borders and margins\n     */\n    protected getBorderAndMarginForField(\n        b: UI512ViewDrawBorders,\n        style: number\n    ): [O<VoidFn>, number, number] {\n        switch (style) {\n            case UI512FldStyle.Transparent:\n                return [undefined, 3, 1];\n            case UI512FldStyle.Opaque:\n                return [b.drawboxnoborder, 3, 1];\n            case UI512FldStyle.Shadow:\n                return [b.drawosboxshadow, 4, 4];\n            case UI512FldStyle.Rectangle:\n                return [b.drawboxthinborder, 3, 1];\n            default:\n                assertWarn(false, `4c|unknown field style ${style}`);\n                return [b.drawboxthinborder, 3, 1];\n        }\n    }\n\n    /**\n     * shrink a rectangle by a defined amount of padding, and keep it centered.\n     */\n    getSubRectForField(\n        b: UI512ViewDrawBorders,\n        el: UI512ElTextField\n    ): [O<VoidFn>, O<number[]>] {\n        let [fnborder, padX, padY] = this.getBorderAndMarginForField(b, el.getN('style'));\n        if (el.getB('scrollbar')) {\n            /* make it smaller to make room for the scrollbar */\n            b.w = b.w - ScrollConsts.BarWidth + 1;\n            b.w = Math.max(1, b.w);\n        }\n\n        let subRect = this.getSubRect(b, padX, padY);\n        return [fnborder, subRect];\n    }\n\n    /**\n     * render a text field\n     */\n    protected goUI512ElTextField(\n        b: UI512ViewDrawBorders,\n        el: UI512ElTextField,\n        hasFocus: boolean\n    ) {\n        let [fnborder, subRect] = this.getSubRectForField(b, el);\n        if (fnborder) {\n            fnborder.apply(b);\n        }\n\n        if (subRect) {\n            let [args, rtext] = drawTextArgsFromEl(el, subRect, hasFocus);\n            args.drawBeyondVisible = false;\n\n            let drawText = cast(UI512DrawText, getRoot().getDrawText());\n            if (!drawText.drawFormattedStringIntoBox(rtext, b.canvas, args)) {\n                b.complete.complete = false;\n            }\n        }\n    }\n\n    /**\n     * loop and render everything visible\n     * if something can't be rendered, e.g. font isn't loaded yet,\n     * the RenderComplete flag will be set to false\n     */\n    renderAllElements(\n        canvas: CanvasWrapper,\n        app: UI512Application,\n        bounds: number[],\n        complete: RenderComplete,\n        currentFocus: O<string>,\n        clearBefore = true\n    ) {\n        if (clearBefore) {\n            canvas.fillRectUnchecked(bounds[0], bounds[1], bounds[2], bounds[3], 'white');\n        }\n\n        for (let grp of app.iterGrps()) {\n            if (grp.getVisible()) {\n                for (let el of grp.iterEls()) {\n                    this.renderElement(canvas, el, el.id === currentFocus, complete);\n                }\n            }\n        }\n    }\n\n    /**\n     * render an element\n     * if something can't be rendered, e.g. font isn't loaded yet,\n     * the RenderComplete flag will be set to false\n     */\n    renderElement(\n        canvas: CanvasWrapper,\n        el: UI512Element,\n        hasFocus: boolean,\n        complete: RenderComplete\n    ) {\n        assertWarn(el.w >= 0, '4b|too small');\n        assertWarn(el.h >= 0, '4a|too small');\n        if (el.w === 0 && el.h === 0) {\n            return;\n        } else if (!el.visible) {\n            return;\n        }\n\n        /* use the 'borders' argument to also store canvas and bounds */\n        let b = new UI512ViewDrawBorders(canvas, el.x, el.y, el.w, el.h, complete);\n        hasFocus = hasFocus || /* bool */ this.allowMultipleFocus;\n        let methodName = 'go' + el.typename;\n        Util512.callAsMethodOnClass(\n            UI512ViewDraw.name,\n            this,\n            methodName,\n            [b, el, hasFocus],\n            false\n        );\n    }\n\n    /**\n     * render everything, including the rounded black corners of the screen\n     */\n    renderApp(\n        canvas: CanvasWrapper,\n        cmpTotal: RenderComplete,\n        app: UI512Application,\n        currentFocus: O<string>,\n        needRedraw: boolean,\n        clearBefore = true\n    ) {\n        let drewAnything = false;\n        let needDrawBorders = false;\n        if (needRedraw) {\n            drewAnything = true;\n            needDrawBorders = true;\n            this.renderAllElements(\n                canvas,\n                app,\n                app.bounds,\n                cmpTotal,\n                currentFocus,\n                clearBefore\n            );\n        }\n\n        if (needDrawBorders && clearBefore) {\n            drewAnything = true;\n            this.renderBorders(canvas, cmpTotal);\n        }\n\n        return drewAnything;\n    }\n\n    /**\n     * render the rounded black corners of the screen\n     */\n    renderBorders(canvas: CanvasWrapper, complete: RenderComplete) {\n        /* draw the thick borders */\n        const color = 'black';\n        const screen = [0, 0, ScreenConsts.ScreenWidth, ScreenConsts.ScreenHeight];\n\n        /* left margin */\n        canvas.fillRect(\n            0,\n            0,\n            ScreenConsts.xLeftMargin,\n            ScreenConsts.ScreenHeight,\n            screen[0],\n            screen[1],\n            screen[2],\n            screen[3],\n            color\n        );\n\n        /* right margin */\n        canvas.fillRect(\n            ScreenConsts.ScreenWidth - ScreenConsts.xRightMargin,\n            0,\n            ScreenConsts.ScreenHeight,\n            ScreenConsts.xRightMargin,\n            screen[0],\n            screen[1],\n            screen[2],\n            screen[3],\n            color\n        );\n\n        /* top margin */\n        canvas.fillRect(\n            0,\n            0,\n            ScreenConsts.ScreenWidth,\n            ScreenConsts.yTopMargin,\n            screen[0],\n            screen[1],\n            screen[2],\n            screen[3],\n            color\n        );\n\n        /* bottom margin */\n        canvas.fillRect(\n            0,\n            ScreenConsts.ScreenHeight - ScreenConsts.yLowerMargin,\n            ScreenConsts.ScreenWidth,\n            ScreenConsts.yLowerMargin,\n            screen[0],\n            screen[1],\n            screen[2],\n            screen[3],\n            color\n        );\n\n        /* draw the rounded corners */\n        let corners = ['nw', 'ne', 'sw', 'se'];\n        for (let i = 0, len = corners.length; i < len; i++) {\n            this.renderCurvedCorner(\n                canvas,\n                corners[i],\n                ScreenConsts.xLeftMargin,\n                ScreenConsts.yTopMargin,\n                0,\n                ScreenConsts.yLowerMargin,\n                screen[2],\n                screen[3],\n                complete\n            );\n        }\n    }\n\n    /**\n     * draw one corner\n     */\n    renderCurvedCorner(\n        canvas: CanvasWrapper,\n        corner: string,\n        marginL: number,\n        marginT: number,\n        marginR: number,\n        marginB: number,\n        screenW: number,\n        screenH: number,\n        complete: RenderComplete\n    ) {\n        let rect = [0, 0, 5, 5];\n        if (corner === 'nw') {\n            rect[0] = marginL;\n            rect[1] = marginT;\n        } else if (corner === 'sw') {\n            rect[0] = marginL;\n            rect[1] = screenH - rect[3] - marginB;\n        } else if (corner === 'ne') {\n            rect[0] = screenW - rect[2] - marginR;\n            rect[1] = marginT;\n        } else if (corner === 'se') {\n            rect[0] = screenW - rect[2] - marginR;\n            rect[1] = screenH - rect[3] - marginB;\n        }\n\n        let b = new UI512ViewDrawBorders(\n            canvas,\n            rect[0],\n            rect[1],\n            rect[2],\n            rect[3],\n            complete\n        );\n        b.drawCorners(corner);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/lang/langBase.ts",
    "content": "\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nconst lngPrefix = 'lng';\nconst lngPrefixLength = 'lng'.length;\n\n/**\n * for future internationalization + globalization\n * */\nexport function lng(s: string) {\n    if (!s.length) {\n        return s;\n    }\n\n    assertTrue(s.startsWith(lngPrefix), '0C|must start with prefix', lngPrefix);\n    let ret = s.substr(lngPrefixLength);\n    return ret;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512Events.ts",
    "content": "\n/* auto */ import { ModifierKeys, toShortcutString } from './../utils/utilsKeypressHelpers';\n/* auto */ import { UI512IsEventInterface } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { UI512EventType } from './../draw/ui512Interfaces';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * event details base class\n */\nexport abstract class EventDetails {\n    isEventDetails = true;\n    protected _handled = false;\n    constructor() {}\n\n    abstract type(): UI512EventType;\n\n    handled() {\n        return this._handled;\n    }\n\n    setHandled() {\n        this._handled = true;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        return ret;\n    }\n}\n\n/**\n * key event base class\n */\nexport abstract class KeyEventDetails extends EventDetails {\n    isKeyEventDetails = true;\n    constructor(\n        public readonly timestamp: number,\n        public readonly keyCode: string,\n        public readonly keyChar: string,\n        public readonly repeated: boolean,\n        public readonly mods: ModifierKeys\n    ) {\n        super();\n    }\n}\n\n/**\n * mouse event base class\n */\nexport abstract class MouseUpOrDownDetails extends EventDetails {\n    isMouseEventDetails = true;\n    constructor(\n        public readonly timestamp: number,\n        public mouseX: number,\n        public mouseY: number,\n        public button: number,\n        public mods: ModifierKeys\n    ) {\n        super();\n    }\n}\n\n/**\n * mouse move details\n * elPrev and elNext aren't set here,\n * but will optionally be filled in by a listener\n */\nexport class MouseMoveEventDetails extends EventDetails {\n    isMouseMoveEventDetails = true;\n    elPrev: O<UI512Element>;\n    elNext: O<UI512Element>;\n    mods: ModifierKeys;\n    constructor(\n        public readonly timestamp: number,\n        public mouseX: number,\n        public mouseY: number,\n        public prevMouseX: number,\n        public prevMouseY: number\n    ) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.MouseMove;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.elPrev) {\n            ret.push(this.elPrev);\n        }\n        if (this.elNext) {\n            ret.push(this.elNext);\n        }\n\n        return ret;\n    }\n}\n\n/**\n * \"idle\" event. always firing, several times a second.\n */\nexport class IdleEventDetails extends EventDetails {\n    isIdleEventDetails = true;\n    constructor(public readonly milliseconds: number) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.Idle;\n    }\n}\n\n/**\n * mouse enter details.\n * event not sent directly by Root, but as a consequence of mousemove\n */\nexport class MouseEnterDetails extends EventDetails {\n    isMouseEnterDetails = true;\n    constructor(public el: UI512Element) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.MouseEnter;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.el) {\n            ret.push(this.el);\n        }\n        return ret;\n    }\n}\n\n/**\n * mouse leave details\n * event not sent directly by Root, but as a consequence of mousemove\n */\nexport class MouseLeaveDetails extends EventDetails {\n    isMouseLeaveDetails = true;\n    constructor(public el: UI512Element) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.MouseLeave;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.el) {\n            ret.push(this.el);\n        }\n        return ret;\n    }\n}\n\n/**\n * menu item clicked\n * don't use a button's mouseup event for this, it's kind of different\n * because the mouseup event should fire right after user releases mouse,\n * whereas menuitem event is fired after a few seconds because of the menuitem animation.\n */\nexport class MenuItemClickedDetails extends EventDetails {\n    isMenuItemClickedDetails = true;\n    constructor(public readonly id: string, public readonly mods: ModifierKeys) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.MenuItemClicked;\n    }\n}\n\n/**\n * key up event\n */\nexport class KeyUpEventDetails extends KeyEventDetails {\n    isKeyUpEventDetails = true;\n\n    type() {\n        return UI512EventType.KeyUp;\n    }\n}\n\n/**\n * key down event\n */\nexport class KeyDownEventDetails extends KeyEventDetails {\n    isKeyDownEventDetails = true;\n    readonly readableShortcut: string;\n    constructor(\n        timestamp: number,\n        keyCode: string,\n        keyChar: string,\n        repeated: boolean,\n        mods: ModifierKeys\n    ) {\n        super(timestamp, keyCode, keyChar, repeated, mods);\n        this.readableShortcut = toShortcutString(mods, keyCode);\n    }\n\n    type() {\n        return UI512EventType.KeyDown;\n    }\n}\n\n/**\n * mouse up event.\n * elRaw and elClick are filled out later by a listener.\n * did the user click down and release on the same element (a full click)?\n * if so, set \"elClick\".\n * otherwise, only \"elRaw\" is set.\n */\nexport class MouseUpEventDetails extends MouseUpOrDownDetails {\n    isMouseUpEventDetails = true;\n    elRaw: O<UI512Element>;\n    elClick: O<UI512Element>;\n\n    type() {\n        return UI512EventType.MouseUp;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.elRaw) {\n            ret.push(this.elRaw);\n        }\n\n        if (this.elClick) {\n            ret.push(this.elClick);\n        }\n\n        return ret;\n    }\n}\n\n/**\n * mouse down event.\n * el is filled out later by a listener.\n */\nexport class MouseDownEventDetails extends MouseUpOrDownDetails {\n    isMouseDownEventDetails = true;\n    el: O<UI512Element>;\n    type() {\n        return UI512EventType.MouseDown;\n    }\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.el) {\n            ret.push(this.el);\n        }\n\n        return ret;\n    }\n}\n\n/**\n * mouse double-click event.\n * el is filled out later by a listener.\n */\nexport class MouseDownDoubleEventDetails extends MouseUpOrDownDetails {\n    isMouseDownDoubleEventDetails = true;\n    el: O<UI512Element>;\n    type() {\n        return UI512EventType.MouseDownDouble;\n    }\n\n    getAffectedElements() {\n        let ret: UI512Element[] = [];\n        if (this.el) {\n            ret.push(this.el);\n        }\n\n        return ret;\n    }\n}\n\n/**\n * paste event\n */\nexport class PasteTextEventDetails extends EventDetails implements UI512IsEventInterface {\n    isPasteTextEventDetails = true;\n    constructor(\n        public readonly timestamp: number,\n        public readonly text: string,\n        public readonly fromOS: boolean\n    ) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.PasteText;\n    }\n}\n\n/**\n * focus-changed event\n */\nexport class FocusChangedEventDetails extends EventDetails {\n    isFocusChangedEventDetails = true;\n    preventChange = false;\n    skipCloseFieldMsg = false;\n    constructor(public readonly idPrev: O<string>, public readonly idNext: O<string>) {\n        super();\n    }\n\n    type() {\n        return UI512EventType.FocusChanged;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512MenuAnimation.ts",
    "content": "\n/* auto */ import { TemporarilySuspendEvents } from './ui512SuspendEvents';\n/* auto */ import { UI512MenuItem } from './../elements/ui512ElementMenu';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * right when you choose a menu item, suspend all other events while we blink the menu item\n */\nexport class SuspendEventsForMenuBlinkAnimation extends TemporarilySuspendEvents {\n    readonly msPerStage = 60;\n    firstMs = 0;\n    stage = -1;\n    completed = false;\n    constructor(public item: UI512MenuItem, public callback: () => void) {\n        super();\n    }\n\n    /**\n     * we're not done until we've hit the final stage\n     */\n    shouldRestore(ms: number) {\n        if (this.firstMs === 0) {\n            this.firstMs = ms;\n        }\n\n        let stage = Math.trunc((ms - this.firstMs) / this.msPerStage);\n        if (stage !== this.stage) {\n            this.stage = stage;\n            this.goStage();\n        }\n\n        return this.completed;\n    }\n\n    /**\n     * alternate between highlighting and not-highlighting the button\n     */\n    goStage() {\n        this.item.set('highlightactive', this.stage % 2 === 0);\n        if (this.stage >= 6) {\n            this.completed = true;\n        }\n    }\n\n    /**\n     * run the callback\n     */\n    whenComplete() {\n        this.callback();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512MenuListeners.ts",
    "content": "\n/* auto */ import { UI512ErrorHandling } from './../utils/util512Assert';\n/* auto */ import { cast } from './../utils/util512';\n/* auto */ import { UI512PresenterWithMenuInterface } from './ui512PresenterWithMenu';\n/* auto */ import { MenuPositioning } from './ui512MenuPositioning';\n/* auto */ import { SuspendEventsForMenuBlinkAnimation } from './ui512MenuAnimation';\n/* auto */ import { ChangeContext, MenuOpenState } from './../draw/ui512Interfaces';\n/* auto */ import { MenuItemClickedDetails, MouseDownEventDetails, MouseEnterDetails, MouseLeaveDetails, MouseUpEventDetails } from './ui512Events';\n/* auto */ import { UI512MenuDropdown, UI512MenuItem, UI512MenuRoot } from './../elements/ui512ElementMenu';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * menu listeners+behaviors, opening the menu when you click on it and so on.\n */\nexport const MenuListeners = /* static class */ {\n    /**\n     * open this menu and make all items unhighlighted\n     * it is wrong if you'd open a window and one of the items is still highlighted from earlier\n     */\n    setwhichIsExpanded(\n        pr: UI512PresenterWithMenuInterface,\n        menuRoot: UI512MenuRoot,\n        which: number,\n        context = ChangeContext.Default\n    ) {\n        if (menuRoot.getN('whichIsExpanded') !== which) {\n            menuRoot.set('whichIsExpanded', which);\n\n            /* make all the items unhighlighted */\n            for (let dropDn of menuRoot.getchildren(pr.app)) {\n                dropDn.set('highlightactive', false);\n\n                for (let item of dropDn.getChildren(pr.app)) {\n                    item.set('highlightactive', false);\n                }\n            }\n        }\n    },\n\n    myAdd(n1: number, n2: number) {\n        return n1 + n2;\n    },\n\n    /**\n     * open this menu and close all others\n     */\n    setActiveMenu(pr: UI512PresenterWithMenuInterface, chosenid: string) {\n        let menuRoot = MenuPositioning.getMenuRoot(pr.app);\n        let dropDns = menuRoot.getchildren(pr.app);\n        for (let i = 0; i < dropDns.length; i++) {\n            let menu = dropDns[i];\n            if (chosenid === menu.id) {\n                MenuListeners.closeAllActiveMenus(pr);\n                MenuListeners.setwhichIsExpanded(pr, menuRoot, i);\n                return;\n            }\n        }\n    },\n\n    /**\n     * can this item be highlighted\n     */\n    canHighlightMenuItem(el: UI512Element) {\n        if (el instanceof UI512MenuItem) {\n            return el.enabled && el.getS('labeltext') !== '---';\n        }\n\n        return false;\n    },\n\n    /**\n     * close all the menus\n     */\n    closeAllActiveMenus(pr: UI512PresenterWithMenuInterface) {\n        let menuRoot = MenuPositioning.getMenuRoot(pr.app);\n        menuRoot.set('whichIsExpanded', -1);\n    },\n\n    /**\n     * is any menu active\n     */\n    isAnyMenuActive(pr: UI512PresenterWithMenuInterface) {\n        let menuRoot = MenuPositioning.getMenuRoot(pr.app);\n        return menuRoot.getN('whichIsExpanded') >= 0;\n    },\n\n    /**\n     * when clicking a menu item,\n     * queue the MenuItemClicked event and start the animation\n     */\n    respondToMenuItemClick(\n        pr: UI512PresenterWithMenuInterface,\n        item: UI512MenuItem,\n        d: MouseUpEventDetails\n    ) {\n        let cbAfterAnim = () => {\n            UI512ErrorHandling.contextHint = 'respondToMenuItemClick';\n            MenuListeners.closeAllActiveMenus(pr);\n            pr.openState = MenuOpenState.MenusClosed;\n            pr.rawEventCanThrow(new MenuItemClickedDetails(item.id, d.mods));\n            pr.queueRefreshCursor();\n        };\n\n        /* ignore all events during the animation */\n        let playAnim = new SuspendEventsForMenuBlinkAnimation(item, cbAfterAnim);\n        pr.tmpSuspend = playAnim;\n        playAnim.start(pr);\n\n        /* don't send the mouse-up event. playAnim will send the MenuItemClicked after animation */\n        d.setHandled();\n    },\n\n    /**\n     * determine if you clicked on a menu dropdown\n     */\n    onMouseDown(pr: UI512PresenterWithMenuInterface, d: MouseDownEventDetails) {\n        if (d.button !== 0) {\n            return;\n        }\n\n        if (d.el && d.el instanceof UI512MenuDropdown) {\n            if (pr.openState === MenuOpenState.MenusClosed) {\n                if (d.el.id !== 'topClock') {\n                    MenuListeners.setActiveMenu(pr, d.el.id);\n                    pr.openState = MenuOpenState.MenusOpenInitialMouseDown;\n                }\n            }\n        }\n    },\n\n    /**\n     * determine if you clicked on a dropdown or menu item\n     */\n    onMouseUp(pr: UI512PresenterWithMenuInterface, d: MouseUpEventDetails) {\n        if (d.button !== 0) {\n            return;\n        }\n\n        /* for normal btns, a full click needs mouseDn and mouseUp on the same element\n           for menu items, it only matters where the mouseUp is, i.e.\n                use elRaw instead of elFullClick */\n\n        if (d.elRaw && MenuListeners.canHighlightMenuItem(d.elRaw)) {\n            MenuListeners.respondToMenuItemClick(pr, cast(UI512MenuItem, d.elRaw), d);\n        } else if (d.elRaw && d.elRaw instanceof UI512MenuDropdown) {\n            if (pr.openState === MenuOpenState.MenusClosed) {\n                /* do nothing, the menu is closed */\n            } else if (pr.openState === MenuOpenState.MenusOpenInitialMouseDown) {\n                /* in original os, you had to hold mouse down on the menus the entire time\n                in ours, you can click once and the menu stays open*/\n                pr.openState = MenuOpenState.MenusOpen;\n            } else if (pr.openState === MenuOpenState.MenusOpen) {\n                /* the menus were open, so clicking closes them */\n                MenuListeners.closeAllActiveMenus(pr);\n                pr.openState = MenuOpenState.MenusClosed;\n            }\n        } else {\n            /* clicking away from the menu closes all menus */\n            MenuListeners.closeAllActiveMenus(pr);\n            pr.openState = MenuOpenState.MenusClosed;\n        }\n    },\n\n    /**\n     * if one of the dropdowns is open, hovering the mouse on another menu should open that menu\n     */\n    onMouseEnter(pr: UI512PresenterWithMenuInterface, d: MouseEnterDetails) {\n        if (d.el && d.el instanceof UI512MenuItem) {\n            d.el.set('highlightactive', true);\n        }\n\n        if (\n            d.el &&\n            d.el instanceof UI512MenuDropdown &&\n            pr.openState !== MenuOpenState.MenusClosed\n        ) {\n            if (d.el.id === 'topClock') {\n                MenuListeners.closeAllActiveMenus(pr);\n            } else {\n                MenuListeners.setActiveMenu(pr, d.el.id);\n            }\n        }\n\n        if (d.el && d.el instanceof UI512MenuRoot) {\n            MenuListeners.closeAllActiveMenus(pr);\n        }\n\n        if (!d.el) {\n            MenuListeners.closeAllActiveMenus(pr);\n        }\n    },\n\n    /**\n     * un-highlight a menuitem after cursor leaves it\n     */\n    onMouseLeave(pr: UI512PresenterWithMenuInterface, d: MouseLeaveDetails) {\n        if (d.el && d.el instanceof UI512MenuItem) {\n            d.el.set('highlightactive', false);\n        }\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512MenuPositioning.ts",
    "content": "\n/* auto */ import { MenuConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { RenderComplete, getRoot } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertWarn } from './../utils/util512Assert';\n/* auto */ import { Util512, assertEq, cast, slength } from './../utils/util512';\n/* auto */ import { UI512PresenterWithMenuInterface } from './ui512PresenterWithMenu';\n/* auto */ import { UI512MenuDropdown, UI512MenuItem, UI512MenuRoot } from './../elements/ui512ElementMenu';\n/* auto */ import { UI512ElGroup } from './../elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n/* auto */ import { lng } from './../lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * you can build a menu in code,\n * but for convenience we have a way to build menu from an array\n * see example in uiDemoMenus\n */\nexport type UI512MenuDefn = [string, string[]] | [string, number, string[]];\n\n/**\n * sets the position of the models\n * and creates a few helper elements\n */\nexport class MenuPositioning {\n    /**\n     * create menu helper elements. must be called when adding a menubar.\n     */\n    static createMenuHelperEls(\n        app: UI512Application,\n        grpItems: UI512ElGroup,\n        menuRoot: UI512MenuRoot\n    ) {\n        let dropdownBgId = menuRoot.id + '##dropdownBg';\n        if (!grpItems.findEl(dropdownBgId)) {\n            let dropdownBg = new UI512ElButton(dropdownBgId, menuRoot.observer);\n            dropdownBg.set('autohighlight', false);\n            dropdownBg.set('style', UI512BtnStyle.Shadow);\n            grpItems.addElement(app, dropdownBg);\n        }\n    }\n\n    /**\n     * remove helper elements. call when removing a menubar.\n     */\n    static removeMenuHelperObjects(\n        app: UI512Application,\n        grpItems: UI512ElGroup,\n        menuRoot: UI512MenuRoot\n    ) {\n        let dropdownBgId = menuRoot.id + '##dropdownBg';\n        grpItems.removeElement(dropdownBgId);\n    }\n\n    /**\n     * remove a menu\n     */\n    static removeMenuRoot(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        menuRoot: UI512MenuRoot\n    ) {\n        let [grpBar, grpItems] = MenuPositioning.getMenuGroups(app, false);\n        assertEq(grp.id, grpBar.id, '2]|');\n        MenuPositioning.removeMenuHelperObjects(app, grpItems, menuRoot);\n        let children = menuRoot.getchildren(app);\n        for (let child of children) {\n            for (let subchild of child.getChildren(app)) {\n                grpItems.removeElement(subchild.id);\n            }\n\n            grpBar.removeElement(child.id);\n        }\n\n        grpBar.removeElement(menuRoot.id);\n    }\n\n    /**\n     * set positions of menu items.\n     */\n    static setMenuItemPositions(\n        app: UI512Application,\n        menuRoot: UI512MenuRoot,\n        header: UI512MenuDropdown,\n        complete: RenderComplete\n    ) {\n        /* highlight the menu name */\n        header.set('highlightactive', true);\n\n        /* find the widest string, and set the width based on that */\n        let items = header.getChildren(app);\n        let widest = MenuPositioning.getWidestString(items);\n        if (widest === undefined) {\n            /* font has not loaded yet */\n            complete.complete = false;\n            return;\n        }\n\n        let totalHeight = MenuConsts.ItemHeight * items.length;\n        let rect = [header.x, header.bottom, widest, totalHeight];\n        let isRightSide = header.getN('fixedoffset') !== -1;\n        if (isRightSide) {\n            /* drawing a menu on the right side, it is right-justified */\n            const farRight = app.bounds[0] + app.bounds[2];\n            let shiftAmount = rect[0] + rect[2] - farRight;\n            if (shiftAmount > 0) {\n                rect[0] -= shiftAmount;\n            }\n        }\n\n        /* draw shadowed bg */\n        /* the top of this rect will goes under the main menu bar, so the top line won't be seen */\n        let grpItems = MenuPositioning.getMenuGroups(app)[1];\n        let dropdownBg = grpItems.getEl(menuRoot.id + '##dropdownBg');\n        dropdownBg.setDimensions(\n            rect[0],\n            rect[1] - 1,\n            rect[2],\n            rect[3] + 1 + MenuConsts.ShadowSizeBottom /* for the shadow*/\n        );\n\n        /* draw items */\n        for (let i = 0; i < items.length; i++) {\n            items[i].setDimensions(\n                rect[0] + MenuConsts.ShadowSizeLeft,\n                rect[1] + MenuConsts.ItemHeight * i,\n                rect[2] - (MenuConsts.ShadowSizeLeft + MenuConsts.ShadowSizeRight),\n                MenuConsts.ItemHeight\n            );\n\n            items[i].set('visible', true);\n        }\n    }\n\n    /**\n     * set positions of a menu dropdown.\n     */\n    static setMenuDropdownPosition(\n        app: UI512Application,\n        menuRoot: UI512MenuRoot,\n        header: UI512MenuDropdown,\n        curX: number,\n        isExpanded: boolean,\n        complete: RenderComplete\n    ) {\n        /* measure width of the header to draw */\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let curwidth = header.getN('fixedwidth');\n        if (curwidth === -1) {\n            let measured = drawText.measureString(header.getS('labeltext'));\n            if (!measured) {\n                complete.complete = false;\n                return curX;\n            }\n\n            curwidth = measured.newLogicalX + MenuConsts.XSpacing;\n        }\n\n        /* x position is overridden, e.g. menus on the right. */\n        if (header.getN('fixedoffset') !== -1) {\n            curX = header.getN('fixedoffset');\n        }\n\n        /* the emulator has a 1 pixel margin between top of screen and menu, */\n        /* but we'll not do that because it doesn't look good against black background */\n        header.setDimensions(\n            curX - 4,\n            app.bounds[1],\n            curwidth + 5,\n            MenuConsts.BarHeight - 1\n        );\n        curX += curwidth;\n\n        /* draw active one */\n        header.set('highlightactive', false);\n        if (isExpanded) {\n            MenuPositioning.setMenuItemPositions(app, menuRoot, header, complete);\n\n            let grpItems = MenuPositioning.getMenuGroups(app)[1];\n            grpItems.setVisible(true);\n        } else {\n            let children = header.getChildren(app);\n            for (let i = 0, len = children.length; i < len; i++) {\n                children[i].set('visible', false);\n            }\n        }\n\n        return curX;\n    }\n\n    /**\n     * set all menu positions\n     */\n    static setMenuPositions(\n        app: UI512Application,\n        menuRoot: UI512MenuRoot,\n        complete: RenderComplete\n    ) {\n        if (!menuRoot || !menuRoot.visible || !menuRoot.getS('childids')) {\n            return;\n        }\n\n        /* top bar */\n        let grpItems = MenuPositioning.getMenuGroups(app)[1];\n        menuRoot.setDimensions(\n            app.bounds[0],\n            app.bounds[1],\n            app.bounds[2],\n            MenuConsts.BarHeight - 1\n        );\n        assertWarn(\n            grpItems.findEl(menuRoot.id + '##dropdownBg'),\n            'J0|forgot to call createMenuHelperEls?'\n        );\n\n        /* draw menu headers */\n        /* interesting fact: the headers overlap each other. confirmed in emulator */\n        let curX = app.bounds[0] + MenuConsts.TopHeaderMargin1;\n        let dropDowns = menuRoot.getchildren(app);\n        grpItems.setVisible(false);\n        for (let i = 0; i < dropDowns.length; i++) {\n            let header = dropDowns[i];\n            let open = menuRoot.getN('whichIsExpanded') === i;\n            curX = MenuPositioning.setMenuDropdownPosition(\n                app,\n                menuRoot,\n                header,\n                curX,\n                open,\n                complete\n            );\n        }\n    }\n\n    /**\n     * measure the widest label\n     */\n    protected static getWidestString(items: UI512MenuItem[]): O<number> {\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let widest = 0;\n        for (let i = 0, len = items.length; i < len; i++) {\n            let item = items[i];\n            let width = drawText.measureString(item.getS('labeltext'));\n            if (!width) {\n                return undefined;\n            }\n\n            widest = Math.max(widest, width.newLogicalX + MenuConsts.AddToWidth);\n        }\n\n        return widest;\n    }\n\n    /**\n     * you can build a menu in code,\n     * but for convenience we have a way to build menu from an array\n     * see example in uiDemoMenus\n     */\n    static buildFromArray(pr: UI512PresenterWithMenuInterface, st: UI512MenuDefn[]) {\n        let menuRoot = MenuPositioning.getMenuRoot(pr.app);\n        let [grpBar, grpItems] = MenuPositioning.getMenuGroups(pr.app);\n\n        /* ensures background items are created first, because they should be behind foreground */\n        MenuPositioning.createMenuHelperEls(pr.app, grpItems, menuRoot);\n\n        let dropdowns: string[] = [];\n        for (let mnuDef of st) {\n            let childIds: string[] = [];\n            let dropdown = MenuPositioning.buildDropdnFromArray(\n                pr.app,\n                grpBar,\n                grpItems,\n                menuRoot,\n                dropdowns,\n                childIds,\n                mnuDef\n            );\n\n            dropdown.set('childids', childIds.join('|'));\n        }\n\n        menuRoot.set('childids', dropdowns.join('|'));\n    }\n\n    /**\n     * you can build a menu in code,\n     * but for convenience we have a way to build menu from an array\n     */\n    protected static buildDropdnFromArray(\n        app: UI512Application,\n        grpBar: UI512ElGroup,\n        grpItems: UI512ElGroup,\n        menuRoot: UI512MenuRoot,\n        dropdowns: string[],\n        childIds: string[],\n        ar: UI512MenuDefn\n    ) {\n        let arMenuHeader = undefined;\n        let arMenu = undefined;\n        let fixedOffset = -1;\n        if (ar.length === 2) {\n            [arMenuHeader, arMenu] = ar;\n        } else {\n            [arMenuHeader, fixedOffset, arMenu] = ar;\n        }\n\n        let [headerId, headerLabelUntranslated] = arMenuHeader.split('|');\n        let dropdn = new UI512MenuDropdown(headerId);\n        dropdowns.push(headerId);\n        grpBar.addElementAfter(app, dropdn, menuRoot.id);\n        dropdn.set('fixedoffset', fixedOffset);\n        if (headerLabelUntranslated.startsWith('icon:')) {\n            let [iconGroupId, iconNumber, fixWidth] = headerLabelUntranslated\n                .split(':')\n                .slice(1);\n            dropdn.set('icongroupid', iconGroupId);\n            dropdn.set('iconnumber', Util512.parseInt(iconNumber) ?? 0);\n            dropdn.set('fixedwidth', Util512.parseInt(fixWidth) ?? 0);\n            dropdn.set('labeltext', '');\n        } else {\n            dropdn.set('labeltext', lng(headerLabelUntranslated));\n        }\n\n        assertWarn(\n            grpItems.findEl(menuRoot.id + '##dropdownBg'),\n            'I~|forgot to call createMenuHelperEls?'\n        );\n        for (let menuString of arMenu) {\n            let [itemId, itemUntranslated, hotkey] = menuString.split('|');\n            itemId = slength(itemId) ? itemId : 'unnamedmenu' + Math.random();\n            let item = new UI512MenuItem(itemId);\n\n            grpItems.addElement(app, item);\n            childIds.push(itemId);\n            item.set(\n                'labeltext',\n                itemUntranslated === '---' ? itemUntranslated : lng(itemUntranslated)\n            );\n            item.set('labelhotkey', hotkey.replace(/ /g, ''));\n            item.set('visible', false);\n        }\n\n        return dropdn;\n    }\n\n    /**\n     * get groups for menus\n     */\n    static getMenuGroups(\n        app: UI512Application,\n        createIfNeeded = true\n    ): [UI512ElGroup, UI512ElGroup] {\n        return [\n            MenuPositioning.getOrCreateGrp(app, '$$grpmenubar', createIfNeeded),\n            MenuPositioning.getOrCreateGrp(app, '$$grpmenuitems', createIfNeeded)\n        ];\n    }\n\n    /**\n     * get or create a group\n     */\n    static getOrCreateGrp(app: UI512Application, s: string, createIfNeeded: boolean) {\n        let grp = app.findGroup(s);\n        if (grp) {\n            return grp;\n        } else {\n            assertWarn(createIfNeeded, 'K?|menubar group expected but not found');\n            let addedGrp = new UI512ElGroup(s, app.observer);\n            app.addGroup(addedGrp);\n            return addedGrp;\n        }\n    }\n\n    /**\n     * by default we'll give the menuRoot a hard-coded id so it can always be found by id\n     */\n    static getMenuRoot(app: UI512Application, createIfNeeded = true): UI512MenuRoot {\n        let grpBar = MenuPositioning.getMenuGroups(app, createIfNeeded)[0];\n        let elem = grpBar.findEl('$$menubarforapp');\n        if (elem) {\n            return cast(UI512MenuRoot, elem);\n        } else {\n            assertWarn(createIfNeeded, '2[|menubar group expected but not found');\n            let mb = new UI512MenuRoot('$$menubarforapp', app.observer);\n            grpBar.addElement(app, mb);\n            return mb;\n        }\n    }\n\n    /**\n     * dynamically change a property on the menu item.\n     */\n    static setItemStatus(\n        app: UI512Application,\n        id: string,\n        checked: O<boolean>,\n        enabled: O<boolean>,\n        translatedLabel?: string\n    ) {\n        let grpItems = MenuPositioning.getMenuGroups(app, true)[1];\n        let elem = grpItems.findEl(id);\n        if (elem) {\n            if (checked !== undefined) {\n                elem.set('checkmark', checked);\n            }\n\n            if (enabled !== undefined) {\n                elem.set('enabled', enabled);\n                elem.set('enabledstyle', enabled);\n            }\n\n            if (translatedLabel !== undefined) {\n                elem.set('labeltext', translatedLabel);\n            }\n        } else {\n            assertWarn(false, `2?|menuitem ${id} not found`);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512PresenterWithMenu.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { UI512PresenterInterface } from './../draw/ui512Interfaces';\n/* auto */ import { EventDetails } from './ui512Events';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * forward-declare more of the Presenter class\n */\nexport interface UI512PresenterWithMenuInterface extends UI512PresenterInterface {\n    app: UI512Application;\n\n    rawEventCanThrow(d: EventDetails): void;\n    canInteract(el: O<UI512Element>): boolean;\n    canSelectTextInField(el: O<UI512ElTextField>): boolean;\n    queueRefreshCursor(): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/menu/ui512SuspendEvents.ts",
    "content": "\n/* auto */ import { assertTrue, respondUI512Error } from './../utils/util512Assert';\n/* auto */ import { UI512PresenterWithMenuInterface } from './ui512PresenterWithMenu';\n/* auto */ import { FnEventCallback, TemporarilySuspendEventsInterface } from './../draw/ui512Interfaces';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * temporarily suspend (ignore) events.\n * replace all listeners with a different set of listeners,\n * until shouldRestore() returns true, then return to normal\n */\nexport abstract class TemporarilySuspendEvents\n    implements TemporarilySuspendEventsInterface {\n    savedListeners: { [t: number]: FnEventCallback[] } = {};\n    isStarted = false;\n\n    /**\n     * called when state is restored to normal\n     */\n    abstract whenComplete(): void;\n\n    /**\n     * called periodically to ask if it is time to restore.\n     * when this returns true, we'll go back to normal\n     */\n    abstract shouldRestore(ms: number): boolean;\n\n    /**\n     * start ignoring normal events and route them to us\n     */\n    start(pr: UI512PresenterWithMenuInterface) {\n        assertTrue(!this.isStarted, \"2.|can't call start twice\");\n        this.savedListeners = pr.listeners;\n        pr.listeners = {};\n        this.isStarted = true;\n    }\n\n    /**\n     * called periodically. ms can be used to know the time elapsed.\n     */\n    pulse(pr: UI512PresenterWithMenuInterface, ms: number) {\n        assertTrue(this.isStarted, '2-|please call start first');\n\n        /* catch exceptions, otherwise an exception in\n        shouldRestore would make us stuck in this temp state. */\n        let shouldRestore = false;\n        try {\n            shouldRestore = this.shouldRestore(ms);\n        } catch (e) {\n            respondUI512Error(e, 'TemporarilySuspendEvents', true);\n            shouldRestore = true;\n        }\n\n        if (shouldRestore) {\n            pr.listeners = this.savedListeners;\n            this.savedListeners = {};\n            this.isStarted = false;\n            pr.tmpSuspend = undefined;\n            this.whenComplete();\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/presentation/ui512Presenter.ts",
    "content": "\n/* auto */ import { getUI512WindowBounds } from './../utils/utilsDrawConstants';\n/* auto */ import { RenderComplete, RepeatingTimer } from './../utils/util512Higher';\n/* auto */ import { ScrollbarImpl } from './../textedit/ui512Scrollbar';\n/* auto */ import { UI512PresenterBase } from './ui512PresenterBase';\n/* auto */ import { MenuPositioning } from './../menu/ui512MenuPositioning';\n/* auto */ import { ChangeContext, MouseDragStatus } from './../draw/ui512Interfaces';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512MenuRoot } from './../elements/ui512ElementMenu';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n/* auto */ import { ClipManager } from './../textedit/ui512ClipManager';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a Presenter receives Events,\n * updates Models accordingly,\n * and sends Models to ElementsView to be drawn.\n */\nexport abstract class UI512Presenter extends UI512PresenterBase {\n    timerSlowIdlePeriod = 500;\n    timerSlowIdle = new RepeatingTimer(this.timerSlowIdlePeriod);\n    useOSClipboard = false;\n    mouseDragStatus: number = MouseDragStatus.None;\n\n    /**\n     * init the presenter\n     */\n    init() {\n        let clipManager = new ClipManager();\n        this.clipManager = clipManager;\n    }\n\n    /**\n     * remove an element\n     */\n    removeEl(gpid: string, elId: string, context = ChangeContext.Default) {\n        let grp = this.app.getGroup(gpid);\n        let el = grp.findEl(elId);\n\n        if (el && el instanceof UI512ElTextField) {\n            new ScrollbarImpl().removeScrollbarField(this.app, grp, el);\n        } else if (el && el instanceof UI512MenuRoot) {\n            MenuPositioning.removeMenuRoot(this.app, grp, el);\n        } else if (el) {\n            grp.removeElement(elId, context);\n        }\n    }\n\n    /**\n     * get bounds/dimensions of the window\n     */\n    getStandardWindowBounds() {\n        return getUI512WindowBounds();\n    }\n\n    /**\n     * create the elements to make a scrollbar for a field\n     * must be called after adding a field with a scrollbar\n     */\n    rebuildFieldScrollbars() {\n        for (let grp of this.app.iterGrps()) {\n            /* don't modify while iterating */\n            let els: UI512Element[] = [];\n            for (let el of grp.iterEls()) {\n                els.push(el);\n            }\n\n            /* now we can modify safely */\n            let builder = new ScrollbarImpl();\n            for (let el of els) {\n                if (el instanceof UI512ElTextField) {\n                    if (el.getB('scrollbar')) {\n                        builder.buildScrollbar(this.app, grp, el);\n                    } else {\n                        builder.removeScrollbar(this.app, grp, el);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * every time we call render, ensure that scrollbars and menuitems have the right positions.\n     */\n    protected setPositionsForRender(cmpTotal: RenderComplete) {\n        for (let grp of this.app.iterGrps()) {\n            /* don't modify while iterating */\n            let els: UI512Element[] = [];\n            for (let el of grp.iterEls()) {\n                els.push(el);\n            }\n\n            /* now we can modify safely */\n            let stillDirty: { [key: string]: boolean } = {};\n            for (let i = 0, len = els.length; i < len; i++) {\n                let el = els[i];\n                let cmp = new RenderComplete();\n                if (el instanceof UI512ElTextField) {\n                    new ScrollbarImpl().setPositions(this.app, grp, el, cmp);\n                } else if (el instanceof UI512MenuRoot) {\n                    MenuPositioning.setMenuPositions(this.app, el, cmp);\n                }\n\n                if (!cmp.complete) {\n                    stillDirty[el.id] = true;\n                    cmpTotal.complete = false;\n                }\n            }\n\n            for (let el of grp.iterEls()) {\n                el.setDirty(stillDirty[el.id] === true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/presentation/ui512PresenterBase.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../utils/utilsKeypressHelpers';\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, RepeatingTimer, UI512IsPresenterInterface, VoidFn } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { UI512ErrorHandling } from './../utils/util512Assert';\n/* auto */ import { Util512, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { TemporarilySuspendEvents } from './../menu/ui512SuspendEvents';\n/* auto */ import { UI512PresenterWithMenuInterface } from './../menu/ui512PresenterWithMenu';\n/* auto */ import { ChangeContext, ClipManagerInterface, FnEventCallback, MenuOpenState, UI512EventType, UI512PresenterInterface } from './../draw/ui512Interfaces';\n/* auto */ import { EventDetails, FocusChangedEventDetails, MouseEnterDetails, MouseLeaveDetails, MouseMoveEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512ViewDraw } from './../elements/ui512ElementView';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a Presenter receives Events,\n * updates Models accordingly,\n * and sends Models to ElementsView to be drawn.\n *\n * UI512PresenterBase can draw a UI not including indirectly constructed\n * elements (scrollbars and menus).\n * for those, use the full _UI512Presenter_ class.\n */\nexport abstract class UI512PresenterBase\n    implements UI512PresenterWithMenuInterface, UI512IsPresenterInterface {\n    readonly defaultPriority = 10;\n    readonly maxMouseButtons = 5;\n    private currentFocus: O<string>;\n    app: UI512Application;\n    trackMouse = [-1, -1];\n    trackMetaKeys = ModifierKeys.None;\n    trackPressedBtns: boolean[] = Util512.repeat(this.maxMouseButtons, false);\n    trackClickedIds: O<string>[] = Util512.repeat(this.maxMouseButtons, undefined);\n    trackLastClick: [number, number, number] = [0, 0, 0];\n    listeners: { [t: number]: FnEventCallback[] } = {};\n    callbackQueueForIdle: O<VoidFn>[] = [];\n    needRedraw = true;\n    inited = false;\n    openState = MenuOpenState.MenusClosed;\n    view = new UI512ViewDraw();\n    tmpSuspend: O<TemporarilySuspendEvents>;\n    mouseDragStatus: number;\n    useOSClipboard: boolean;\n    clipManager: ClipManagerInterface;\n    timerSlowIdle: RepeatingTimer;\n\n    /**\n     * copy over mouse-tracking state from another presenter.\n     */\n    importMouseTracking(other: UI512PresenterWithMenuInterface) {\n        /* note, we don't need to copy over trackClickedIds,\n        since having a click+drag persist across loading a screen would be weird. */\n        if (other.trackMouse !== undefined) {\n            this.trackMouse = other.trackMouse;\n            this.trackPressedBtns = other.trackPressedBtns;\n            this.trackMetaKeys = other.trackMetaKeys;\n        }\n    }\n\n    /**\n     * which element is focused\n     */\n    getCurrentFocus() {\n        return this.currentFocus;\n    }\n\n    /**\n     * set element with the focus\n     */\n    setCurrentFocus(next: O<string>, skipCloseFieldMsg = false) {\n        if (next !== this.currentFocus) {\n            let evt = new FocusChangedEventDetails(this.currentFocus, next);\n            evt.skipCloseFieldMsg = skipCloseFieldMsg;\n\n            UI512ErrorHandling.contextHint = 'setCurrentFocus';\n            this.rawEventCanThrow(evt);\n            if (!evt.preventChange) {\n                this.currentFocus = next;\n            }\n\n            /* adjust focus to be appropriate to length of content */\n            let nextFocus = this.app.findEl(next);\n            if (nextFocus && nextFocus instanceof UI512ElTextField) {\n                let txt = nextFocus.getFmTxt();\n                nextFocus.set(\n                    'selcaret',\n                    fitIntoInclusive(nextFocus.getN('selcaret'), 0, txt.len())\n                );\n                nextFocus.set(\n                    'selend',\n                    fitIntoInclusive(nextFocus.getN('selend'), 0, txt.len())\n                );\n            }\n        }\n    }\n\n    /**\n     * register to listen for an event\n     */\n    listenEvent(\n        type: UI512EventType,\n        fn: (pr: UI512PresenterInterface, d: EventDetails) => void\n    ) {\n        let ar = this.listeners[type];\n        if (ar !== undefined) {\n            ar.push(fn);\n        } else {\n            this.listeners[type] = [fn];\n        }\n    }\n\n    /**\n     * handle an incoming event, and dispatch it to all of the listeners\n     */\n    rawEventCanThrow(d: EventDetails) {\n        let evtNumber = d.type();\n        let ar = this.listeners[evtNumber];\n        if (ar) {\n            /* use a plain JS loop and not a for/of loop here, this area\n            benefits from perf micro-optimizations */\n            for (let i = 0, len = ar.length; i < len; i++) {\n                if (d.handled()) {\n                    break;\n                }\n\n                let cb = ar[i];\n                cb(this, d);\n            }\n        }\n\n        /* construct mouseleave and mouseenter events */\n        if (d instanceof MouseMoveEventDetails) {\n            if (d.elNext !== d.elPrev) {\n                if (d.elPrev) {\n                    this.rawEventCanThrow(new MouseLeaveDetails(d.elPrev));\n                }\n\n                if (d.elNext && this.canInteract(d.elNext)) {\n                    this.rawEventCanThrow(new MouseEnterDetails(d.elNext));\n                }\n            }\n        }\n    }\n\n    /**\n     * can the element be interacted with\n     */\n    canInteract(el: O<UI512Element>) {\n        if (el) {\n            return el.enabled && el.visible;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * return true if text can be selected in this field\n     */\n    canSelectTextInField(el: UI512ElTextField): boolean {\n        /* subclasses can provide other logic here */\n        return true;\n    }\n\n    /**\n     * implementation of the change Observer. cause redraw if an element has changed.\n     */\n    changeSeen(context: ChangeContext): void {\n        this.needRedraw = true;\n    }\n\n    /**\n     * cause redraw if an element has changed.\n     */\n    invalidateAll() {\n        this.needRedraw = true;\n    }\n\n    /**\n     * render - if an element has changed, draw all elements onto the canvas!\n     */\n    render(canvas: CanvasWrapper, ms: number, cmpTotal: RenderComplete): boolean {\n        let drewAnything = false;\n        if (!this.inited) {\n            cmpTotal.complete = false;\n            return drewAnything;\n        }\n\n        if (this.needRedraw) {\n            this.setPositionsForRender(cmpTotal);\n        }\n\n        drewAnything =\n            drewAnything ||\n            this.view.renderApp(\n                canvas,\n                cmpTotal,\n                this.app,\n                this.currentFocus,\n                this.needRedraw\n            );\n        if (cmpTotal.complete) {\n            this.needRedraw = false;\n        }\n\n        if (this.tmpSuspend) {\n            this.tmpSuspend.pulse(this, ms);\n        }\n\n        return drewAnything;\n    }\n\n    /**\n     * this is a way to run code asynchronously, while still\n     * responding to unhandled exceptions\n     */\n    placeCallbackInQueue(cb: () => void) {\n        this.callbackQueueForIdle.push(cb);\n    }\n\n    /**\n     * queueRefreshCursor, not needed here but a subclass can implement it\n     */\n    queueRefreshCursor(): void {}\n\n    abstract removeEl(gpid: string, elId: string, context: ChangeContext): void;\n    protected abstract setPositionsForRender(cmpTotal: RenderComplete): void;\n    abstract rebuildFieldScrollbars(): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/root/rootSetupHelpers.ts",
    "content": "\n/* auto */ import { RootHigher } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { ScreenConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { UI512CursorAccess } from './../utils/utilsCursors';\n/* auto */ import { justConsoleMsgIfExceptionThrown } from './../utils/util512Higher';\n/* auto */ import { coalesceIfFalseLike } from './../utils/util512Base';\n/* auto */ import { assertWarn } from './../utils/util512Assert';\n/* auto */ import { Util512 } from './../utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * non-application-specific ui helpers\n */\nexport class RootSetupHelpers {\n    /**\n     * called on init and on browser resize,\n     * it gets called continually *during* the resize\n     */\n    static mainOnResize(root: RootHigher, gly: any) {\n        let res: [number, number];\n        if (RootSetupHelpers.useNewResize()) {\n            res = RootSetupHelpers.mainOnResizeNew(root, gly);\n        } else {\n            res = RootSetupHelpers.mainOnResizeClassic(root, gly);\n        }\n\n        let canFitMultiple = coalesceIfFalseLike(res[1], 1);\n        UI512CursorAccess.notifyScreenMult(canFitMultiple);\n    }\n\n    /**\n     * allow user to fallback to old scaling\n     */\n    static useNewResize() {\n        if (window.document.location.href.includes('oldscaling')) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /*\n    css \"transform\" -- automatically show the best sharpest graphics!\n        use to negate the effects of the \"devicePixelRatio\"\n        for example, the OS will often for a high-dpi screen\n        set devicePixelRatio to 1.25 by default. This doesn't blur\n        our canvas, but it still looks nearest-neighbor-aliased and bad.\n        We used to have to tell the user to set the browser zoom,\n        but using css transform seems to solve it.\n        Also use to fit\n\n        we need to scale the coordinates of mouse events to compensate.\n\n        scaling methods that I'm not currently using:\n            canvas sizing\n                set the width of the dom element to 800 pixels\n                set the internal width of the canvas to 400 pixels\n                this has the effect of scaling all the output.\n                works well, used in v0.2.\n            tab.setZoom() only available for browser extensions\n            css \"zoom\", non-standard\n            canvasCtx.scale(0.8, 0.8) makes canvas blurred\n            multiplying in the canvas: the width of dom element and width of canvas are 800px,\n                but when our app tells it to draw 1pixel, it will draw 4.\n                would work, but loading png images would be trickier.\n    */\n    static mainOnResizeNew(root: RootHigher, gly: any): [number, number] {\n        /* to be conservative, set everything to 1x, so that later failures won't\n        destroy the ui */\n        let domElement: HTMLCanvasElement = gly.domElement;\n        gly.width = ScreenConsts.ScreenWidth;\n        gly.height = ScreenConsts.ScreenHeight;\n        domElement.style.width = ScreenConsts.ScreenWidth + 'px';\n        domElement.style.height = ScreenConsts.ScreenHeight + 'px';\n        root.rawResize(ScreenConsts.ScreenWidth, ScreenConsts.ScreenHeight);\n        root.scaleMouseCoords = 1;\n        let ret: [number, number] = [1, 1];\n        justConsoleMsgIfExceptionThrown(() => {\n            ret = RootSetupHelpers.mainOnResizeNewAdvanced(root, gly);\n        }, RootSetupHelpers.mainOnResizeNewAdvanced.name);\n\n        return ret;\n    }\n\n    /**\n     * place this math in another method just to be very cautious\n     */\n    static mainOnResizeNewAdvanced(root: RootHigher, gly: any): [number, number] {\n        /* note, window.innerWidth is affected by browser's current zoom setting */\n        let dpr = window.devicePixelRatio ?? 1;\n        let domElement: HTMLCanvasElement = gly.domElement;\n        let availW = window.innerWidth * dpr;\n        let availH = window.innerHeight * dpr;\n        let canFitW = Math.max(1, Math.trunc(availW / ScreenConsts.ScreenWidth));\n        let canFitH = Math.max(1, Math.trunc(availH / ScreenConsts.ScreenHeight));\n        let canFit = Math.min(canFitW, canFitH);\n        gly.width = ScreenConsts.ScreenWidth;\n        gly.height = ScreenConsts.ScreenHeight;\n        domElement.style.width = ScreenConsts.ScreenWidth + 'px';\n        domElement.style.height = ScreenConsts.ScreenHeight + 'px';\n        let totalScale = canFit / dpr;\n        let totalScaleR = dpr / canFit;\n        window.document.body.style.transform = `matrix(${totalScale}, 0, 0, ${totalScale}, 0, 0)`;\n        window.document.body.style.transformOrigin = 'top left';\n\n        root.scaleMouseCoords = totalScaleR;\n        root.rawResize(ScreenConsts.ScreenWidth, ScreenConsts.ScreenHeight);\n        return [root.scaleMouseCoords, canFit];\n    }\n\n    /**\n     * previous resizing,\n     * could expand to fit big screens,\n     * but looked blurry if window.devicePixelRatio != 1\n     */\n    static mainOnResizeClassic(root: RootHigher, gly: any): [number, number] {\n        /* on high-dpi screens, automatically show bigger pixels, with no blurring */\n\n        let availW = window.innerWidth;\n        let availH = window.innerHeight;\n        let canFitW = Math.max(1, Math.trunc(availW / ScreenConsts.ScreenWidth));\n        let canFitH = Math.max(1, Math.trunc(availH / ScreenConsts.ScreenHeight));\n        let canFitTotal = Math.min(canFitW, canFitH);\n        if (!Util512.isValidNumber(canFitTotal)) {\n            assertWarn(false, `3?|invalid canFitW=${canFitW} canFitW=${canFitW}`);\n            return [1, 1];\n        }\n\n        let elemMessageBelow = window.document.getElementById('elemMessageBelow');\n        if (elemMessageBelow) {\n            if (\n                Math.abs(window.devicePixelRatio - Math.round(window.devicePixelRatio)) >\n                0.01\n            ) {\n                elemMessageBelow.innerText =\n                    'Please set your browser zoom level to 100% for the sharpest graphics...';\n            } else {\n                elemMessageBelow.innerText = '';\n            }\n        }\n\n        if (1.0 / canFitTotal !== root.scaleMouseCoords) {\n            /* sets both priv['domElement']['width'] and priv['width'] */\n            gly.width = ScreenConsts.ScreenWidth;\n\n            /* sets both priv['domElement']['height'] and priv['height'] */\n            gly.height = ScreenConsts.ScreenHeight;\n\n            let domElement = gly.domElement;\n            domElement.style.width = ScreenConsts.ScreenWidth * canFitTotal + 'px';\n            domElement.style.height = ScreenConsts.ScreenHeight * canFitTotal + 'px';\n            root.scaleMouseCoords = 1.0 / canFitTotal;\n            root.rawResize(ScreenConsts.ScreenWidth, ScreenConsts.ScreenHeight);\n        }\n\n        return [root.scaleMouseCoords, canFitTotal];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/root/rootStartCanvas.ts",
    "content": "\n/* auto */ import { toShortcutString, ui512TranslateModifiers } from './../utils/utilsKeypressHelpers';\n/* auto */ import { BrowserInfo, setRoot, showMsgIfExceptionThrown } from './../utils/util512Higher';\n/* auto */ import { respondUI512Error } from './../utils/util512Assert';\n/* auto */ import { KeyDownEventDetails, KeyUpEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../menu/ui512Events';\n/* auto */ import { FullRootUI512 } from './rootUI512';\n/* auto */ import { RootSetupHelpers } from './rootSetupHelpers';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nlet mainVPCStartCanvasStarted = false;\n\nfunction mainVPCStartCanvas(fnMakeGolly: any) {\n    if (mainVPCStartCanvasStarted) {\n        return;\n    }\n\n    mainVPCStartCanvasStarted = true;\n    let gollyParams = {\n        eatallkeyevents: true,\n        customsizing: true,\n        trackFrameTime: false,\n        includeallmousemoveevents: true,\n        fnaddtodom: (container: any, d: any) => {\n            container.insertBefore(d, window.document.getElementById('elemMessageBelow'));\n        }\n    };\n\n    let browserOSInfo = BrowserInfo.get().os;\n    let root = new FullRootUI512();\n    let gly: any = fnMakeGolly(gollyParams);\n    gly.desiredFrameTime = 60;\n    root.init(gly);\n    gly.draw = () => {\n        try {\n            root.drawFrame(gly.frameCount, gly.milliseconds);\n        } catch (e) {\n            respondUI512Error(e, 'drawframe');\n        }\n    };\n\n    gly.onresize = () => {\n        try {\n            RootSetupHelpers.mainOnResize(root, gly);\n        } catch (e) {\n            respondUI512Error(e, 'onresize');\n        }\n        return true;\n    };\n\n    gly.keydown = (\n        keyCode: string,\n        keyChar: string,\n        repeated: boolean,\n        ctrlKey: boolean,\n        shiftKey: boolean,\n        altKey: boolean,\n        metaKey: boolean\n    ) => {\n        try {\n            let mods = ui512TranslateModifiers(\n                browserOSInfo,\n                ctrlKey,\n                shiftKey,\n                altKey,\n                metaKey\n            );\n            let details = new KeyDownEventDetails(\n                gly.milliseconds,\n                keyCode,\n                keyChar,\n                repeated,\n                mods\n            );\n            root.event(details);\n\n            /* let \"paste\" through, stop everything else */\n            if (details.readableShortcut !== 'Cmd+V') {\n                details.setHandled();\n            }\n\n            return !details.handled();\n        } catch (e) {\n            respondUI512Error(e, 'keydown');\n            return true;\n        }\n    };\n\n    gly.keyup = (\n        keyCode: string,\n        keyChar: string,\n        ctrlKey: boolean,\n        shiftKey: boolean,\n        altKey: boolean,\n        metaKey: boolean\n    ) => {\n        try {\n            let mods = ui512TranslateModifiers(\n                browserOSInfo,\n                ctrlKey,\n                shiftKey,\n                altKey,\n                metaKey\n            );\n            let details = new KeyUpEventDetails(\n                gly.milliseconds,\n                keyCode,\n                keyChar,\n                false,\n                mods\n            );\n            root.event(details);\n\n            /* let \"paste\" through, stop everything else */\n            let readableShortcut = toShortcutString(details.mods, details.keyCode);\n            if (readableShortcut !== 'Cmd+V') {\n                details.setHandled();\n            }\n\n            return !details.handled();\n        } catch (e) {\n            respondUI512Error(e, 'keyup');\n            return true;\n        }\n    };\n\n    gly.mousemove = (\n        mouseX: number,\n        mouseY: number,\n        button: number,\n        buttons: number,\n        prevMouseX: number,\n        prevMouseY: number,\n        ctrlKey: boolean,\n        altKey: boolean,\n        shiftKey: boolean\n    ) => {\n        try {\n            let details = new MouseMoveEventDetails(\n                gly.milliseconds,\n                mouseX,\n                mouseY,\n                prevMouseX,\n                prevMouseY\n            );\n            let mods = ui512TranslateModifiers(\n                browserOSInfo,\n                ctrlKey,\n                shiftKey,\n                altKey,\n                false\n            );\n            details.mods = mods;\n            root.event(details);\n            if (buttons !== root.mouseButtonsExpected) {\n                root.sendMissedEvents(buttons);\n            }\n\n            return !details.handled();\n        } catch (e) {\n            respondUI512Error(e, 'mousemove');\n            return true;\n        }\n    };\n\n    gly.mouseup = (\n        mouseX: number,\n        mouseY: number,\n        button: number,\n        buttons: number,\n        ctrlKey: boolean,\n        shiftKey: boolean,\n        altKey: boolean,\n        metaKey: boolean\n    ) => {\n        try {\n            let mods = ui512TranslateModifiers(\n                browserOSInfo,\n                ctrlKey,\n                shiftKey,\n                altKey,\n                metaKey\n            );\n            let details = new MouseUpEventDetails(\n                gly.milliseconds,\n                mouseX,\n                mouseY,\n                button,\n                mods\n            );\n            root.event(details);\n            root.mouseButtonsExpected = buttons;\n            return !details.handled();\n        } catch (e) {\n            respondUI512Error(e, 'mouseup');\n            return true;\n        }\n    };\n\n    gly.mousedown = (\n        mouseX: number,\n        mouseY: number,\n        button: number,\n        buttons: number,\n        ctrlKey: boolean,\n        shiftKey: boolean,\n        altKey: boolean,\n        metaKey: boolean\n    ) => {\n        try {\n            let mods = ui512TranslateModifiers(\n                browserOSInfo,\n                ctrlKey,\n                shiftKey,\n                altKey,\n                metaKey\n            );\n            let details = new MouseDownEventDetails(\n                gly.milliseconds,\n                mouseX,\n                mouseY,\n                button,\n                mods\n            );\n            root.event(details);\n            root.mouseButtonsExpected = buttons;\n            return !details.handled();\n        } catch (e) {\n            respondUI512Error(e, 'mousedown');\n            return true;\n        }\n    };\n\n    showMsgIfExceptionThrown(() => {\n        setRoot(root);\n        RootSetupHelpers.mainOnResize(root, gly);\n    }, 'rootStartCanvas');\n}\n\n/* expose this function globally */\n(window as any).mainVPCStartCanvas = mainVPCStartCanvas; /* on window */\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/root/rootUI512.ts",
    "content": "\n/* auto */ import { initAllVpcTokens } from './../../vpc/codeparse/vpcTokens';\n/* auto */ import { RootHigher } from './../../vpcui/intro/vpcIntroProvider';\n/* auto */ import { VpcUiIntro } from './../../vpcui/intro/vpcIntro';\n/* auto */ import { VpcInitIcons } from './../../vpc/vpcutils/vpcInitIcons';\n/* auto */ import { checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { ModifierKeys } from './../utils/utilsKeypressHelpers';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../utils/utilsCursors';\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, RepeatingTimer, RespondToErr, UI512IsEventInterface, UI512IsSessionInterface, Util512Higher, showMsgIfExceptionThrown } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertWarn } from './../utils/util512Assert';\n/* auto */ import { UI512Presenter } from './../presentation/ui512Presenter';\n/* auto */ import { EventDetails, IdleEventDetails, MouseDownDoubleEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails, MouseUpOrDownDetails } from './../menu/ui512Events';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n/* auto */ import { UI512IconManager } from './../draw/ui512DrawIconManager';\n/* auto */ import { SimpleUtil512Tests } from './../../test/testUtils/testTop';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport class FullRootUI512 implements RootHigher {\n    domCanvas: CanvasWrapper;\n    canvasBeforeCursor: CanvasWrapper;\n    presenter: UI512Presenter;\n    drawText: UI512DrawText;\n    iconManager: UI512IconManager;\n    prevMouseDown: O<MouseDownEventDetails>;\n    scaleMouseCoords = 1;\n    session: O<UI512IsSessionInterface>;\n    hasLoadedExternalDelay = '';\n\n    /* send a ping to the apps every 0.1 seconds */\n    timerSendIdleEvent = new RepeatingTimer(100);\n    mouseButtonsExpected = 0;\n\n    init(gly: any) {\n        this.beginDelayLoad();\n\n        let domCanvas: HTMLCanvasElement = gly.domElement;\n        this.canvasBeforeCursor = CanvasWrapper.createMemoryCanvas(\n            domCanvas.width,\n            domCanvas.height\n        );\n        this.drawText = new UI512DrawText();\n        this.iconManager = new UI512IconManager();\n        this.domCanvas = new CanvasWrapper(domCanvas);\n\n        /* this.presenter = new UI512DemoBasic(); */\n        /* this.presenter = new UI512DemoButtons(); */\n        /* this.presenter = new UI512DemoComposites(); */\n        /* this.presenter = new UI512DemoMenus(); */\n        /* this.presenter = new UI512DemoPaint(); */\n        /* this.presenter = new UI512DemoText(); */\n        /* this.presenter = new UI512DemoTextEdit(); */\n        this.presenter = new VpcUiIntro();\n        domCanvas.setAttribute('id', 'mainDomCanvas');\n        showMsgIfExceptionThrown(\n            () => UI512CursorAccess.setCursor(UI512Cursors.arrow),\n            UI512CursorAccess.setCursor.name\n        );\n        showMsgIfExceptionThrown(VpcInitIcons.go, 'VpcInitIcons');\n        showMsgIfExceptionThrown(() => this.presenter.init(), 'root.init');\n    }\n\n    protected useMinified() {\n        if (window.location.href.split('#')[0].includes('test')) {\n            return false;\n        } else if (window.location.href.split('#')[0].includes(':80')) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    protected beginDelayLoad() {\n        let fn = async () => {\n            try {\n                await Util512Higher.asyncLoadJsIfNotAlreadyLoaded(\n                    this.useMinified()\n                        ? '/external/externaldelaybundlemin.js'\n                        : '/external/externaldelaybundlebig.js'\n                );\n                this.hasLoadedExternalDelay = 'success';\n                initAllVpcTokens();\n            } catch (e) {\n                this.hasLoadedExternalDelay = e.toString();\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(\n            fn(),\n            'Delay-loading external code',\n            RespondToErr.Alert\n        );\n\n        showMsgIfExceptionThrown(\n            () => UI512CursorAccess.suggestPreloadCursors(),\n            'suggestPreloadCursors'\n        );\n    }\n\n    invalidateAll() {\n        /* called by us. does not need try/catch */\n        this.presenter.invalidateAll();\n    }\n\n    getDrawText() {\n        return this.drawText;\n    }\n\n    getDrawIcon() {\n        return this.iconManager;\n    }\n\n    getSession() {\n        return this.session;\n    }\n\n    setSession(ss: O<UI512IsSessionInterface>) {\n        this.session = ss;\n    }\n\n    /* these are coming straight from golly, need to wrap in try/catch */\n\n    replaceCurrentPresenter(newPrIn: any) {\n        /* called by us. does not need try/catch */\n        let newPr = newPrIn as UI512Presenter;\n        checkThrow(newPr instanceof UI512Presenter, 'J2|');\n        if (newPr.importMouseTracking) {\n            newPr.importMouseTracking(this.presenter);\n        }\n\n        this.presenter = newPr;\n        this.invalidateAll();\n    }\n\n    sendEvent(evt: UI512IsEventInterface) {\n        let details = evt as EventDetails;\n        assertWarn(details instanceof EventDetails, 'J1|');\n        return this.event(details);\n    }\n\n    event(details: EventDetails, skipScaleMouseClickEvent?: boolean) {\n        if (details instanceof MouseUpOrDownDetails && !skipScaleMouseClickEvent) {\n            details.mouseX = adjustMouseCoord(details.mouseX, this.scaleMouseCoords);\n            details.mouseY = adjustMouseCoord(details.mouseY, this.scaleMouseCoords);\n        }\n\n        if (details instanceof MouseMoveEventDetails) {\n            /* we changed golly so that it sends mousemove events\n            for the entire document, even if outside the canvas.\n            this is useful for cursor movement -- if we stopped getting mouse events\n            when the cursor left the canvas, we wouldn't know to hide the cursor */\n            details.mouseX = adjustMouseCoord(details.mouseX, this.scaleMouseCoords);\n            details.mouseY = adjustMouseCoord(details.mouseY, this.scaleMouseCoords);\n            details.prevMouseX = adjustMouseCoord(\n                details.prevMouseX,\n                this.scaleMouseCoords\n            );\n            details.prevMouseY = adjustMouseCoord(\n                details.prevMouseY,\n                this.scaleMouseCoords\n            );\n            UI512CursorAccess.onmousemove(details.mouseX, details.prevMouseY);\n        }\n\n        if (!details.handled()) {\n            this.presenter.rawEventCanThrow(details);\n        }\n\n        if (details instanceof MouseDownEventDetails) {\n            if (this.prevMouseDown) {\n                if (\n                    details.timestamp - this.prevMouseDown.timestamp < 500 &&\n                    Math.abs(details.mouseX - this.prevMouseDown.mouseX) < 2 &&\n                    Math.abs(details.mouseY - this.prevMouseDown.mouseY) < 2 &&\n                    details.button === this.prevMouseDown.button\n                ) {\n                    let newevent = new MouseDownDoubleEventDetails(\n                        details.timestamp,\n                        details.mouseX,\n                        details.mouseY,\n                        details.button,\n                        details.mods\n                    );\n\n                    /* don't set d.el yet, this.prevMouseDown.el might be out of date. */\n                    /* set skipScaleMouseClickEvent flag, don't scale coords twice. */\n                    this.event(newevent, true);\n                }\n            }\n\n            this.prevMouseDown = details;\n        }\n\n        return details.handled();\n    }\n\n    rawResize(width: number, height: number) {\n        this.invalidateAll();\n    }\n\n    sendMissedEvents(buttons: number) {\n        /**\n         * observed behavior: let's say there is a button on the screen.\n         * you click the button, and it highlights as expected. you then, while\n         * holding the mouse button down, drag the cursor outside of the window.\n         * then release the mouse button when the cursor is outside. now,\n         * when you bring the cursor back into the window, it *incorrectly*\n         * thinks that the button should be re-highlighted, even though the mouse\n         * button is up, because we never got the mouseup event.\n         *\n         * so, I wrote this fix. if we see that the mouse buttons are\n         * different than we expected, send simulated \"mouseup\" events for\n         * each mouse button that is now up. (the same could be done for\n         * mousedown events, but we don't have any drag-into-window scenario now).\n         */\n\n        const maxNumberOfMouseButtons = 10;\n        let needToSendMouseUp = this.mouseButtonsExpected & ~buttons;\n        this.mouseButtonsExpected = buttons;\n        for (let i = 0; i < maxNumberOfMouseButtons; i++) {\n            if (needToSendMouseUp & (1 << i)) {\n                let details = new MouseUpEventDetails(0, 0, 0, i, ModifierKeys.None);\n                this.event(details);\n            }\n        }\n    }\n\n    drawFrame(frameCount: number, milliseconds: number) {\n        this.timerSendIdleEvent.update(milliseconds);\n        if (this.timerSendIdleEvent.isDue()) {\n            this.timerSendIdleEvent.reset();\n            this.event(new IdleEventDetails(milliseconds));\n        }\n        if (\n            this.canvasBeforeCursor.canvas.width !== this.domCanvas.canvas.width ||\n            this.canvasBeforeCursor.canvas.height !== this.domCanvas.canvas.height\n        ) {\n            this.canvasBeforeCursor = CanvasWrapper.createMemoryCanvas(\n                this.domCanvas.canvas.width,\n                this.domCanvas.canvas.height\n            );\n        }\n\n        let complete = new RenderComplete();\n        let drewAnything = this.presenter.render(\n            this.canvasBeforeCursor,\n            milliseconds,\n            complete\n        );\n        UI512CursorAccess.drawFinalWithCursor(\n            this.canvasBeforeCursor,\n            this.domCanvas,\n            drewAnything\n        );\n    }\n\n    setTimerRate(s: string): void {\n        let rate = 100;\n        if (s === 'faster') {\n            rate = 50;\n        } else if (s === 'faster2') {\n            rate = 25;\n        }\n\n        this.timerSendIdleEvent = new RepeatingTimer(rate);\n    }\n\n    runTests(all: boolean) {\n        Util512Higher.syncToAsyncTransition(\n            SimpleUtil512Tests.runTests(all),\n            'tests',\n            RespondToErr.Alert\n        );\n    }\n}\n\nfunction adjustMouseCoord(c: number, scaleMouseCoords: number) {\n    return Math.round(c * scaleMouseCoords);\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512BasicHandlers.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './../utils/utilsCanvasDraw';\n/* auto */ import { getRoot } from './../utils/util512Higher';\n/* auto */ import { checkIsProductionBuild } from './../utils/util512Base';\n/* auto */ import { UI512PresenterWithMenuInterface } from './../menu/ui512PresenterWithMenu';\n/* auto */ import { KeyDownEventDetails, KeyUpEventDetails, MouseDownDoubleEventDetails, MouseDownEventDetails, MouseEnterDetails, MouseLeaveDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512ElementWithHighlight } from './../elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a set of useful event-handler methods\n */\nexport class BasicHandlers {\n    /**\n     * keep a record of which mouse buttons are currently down.\n     */\n    static trackMouseStatusMouseDown(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseDownEventDetails\n    ) {\n        if (d.button >= 0 && d.button < pr.trackPressedBtns.length) {\n            pr.trackPressedBtns[d.button] = true;\n        } else {\n            d.setHandled();\n        }\n    }\n\n    /**\n     * keep a record of which mouse buttons are currently down, set to false.\n     */\n    static trackMouseStatusMouseUp(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseUpEventDetails\n    ) {\n        pr.trackLastClick[0] = d.mouseX;\n        pr.trackLastClick[1] = d.mouseY;\n        pr.trackLastClick[2] += 1;\n        if (d.button >= 0 && d.button < pr.trackPressedBtns.length) {\n            pr.trackPressedBtns[d.button] = false;\n        } else {\n            d.setHandled();\n        }\n    }\n\n    /**\n     * find which element the user clicked on, and save it in the event.\n     */\n    static trackCurrentElMouseDown(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseDownEventDetails\n    ) {\n        d.el = pr.app.coordsToElement(d.mouseX, d.mouseY);\n        if (!pr.canInteract(d.el)) {\n            d.el = undefined;\n        }\n\n        if (d.el) {\n            pr.trackClickedIds[d.button] = d.el.id;\n        } else {\n            pr.trackClickedIds[d.button] = undefined;\n        }\n    }\n\n    /**\n     * did the user click down and release on the same element?\n     * if so, set \"elClick\".\n     * otherwise, only \"elRaw\" is set.\n     */\n    static trackCurrentElMouseUp(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseUpEventDetails\n    ) {\n        d.elRaw = pr.app.coordsToElement(d.mouseX, d.mouseY);\n        d.elClick =\n            d.elRaw && pr.trackClickedIds[d.button] === d.elRaw.id ? d.elRaw : undefined;\n        if (!pr.canInteract(d.elRaw)) {\n            d.elRaw = undefined;\n            d.elClick = undefined;\n        }\n\n        pr.trackClickedIds[d.button] = undefined;\n    }\n\n    /**\n     * keep a record of mouse position\n     */\n    static trackCurrentElMouseMove(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseMoveEventDetails\n    ) {\n        pr.trackMouse[0] = d.mouseX;\n        pr.trackMouse[1] = d.mouseY;\n        pr.trackMetaKeys = d.mods;\n        d.elNext = pr.app.coordsToElement(d.mouseX, d.mouseY);\n        d.elPrev = pr.app.coordsToElement(d.prevMouseX, d.prevMouseY);\n    }\n\n    /**\n     * find which element the user clicked on, and save it in the event.\n     */\n    static trackMouseDoubleDown(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseDownDoubleEventDetails\n    ) {\n        d.el = pr.app.coordsToElement(d.mouseX, d.mouseY);\n    }\n\n    /**\n     * if the element is \"autohighlight\", make it highlighted when mouse is down on it.\n     */\n    static trackHighlightedButtonMouseDown(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseDownEventDetails\n    ) {\n        if (\n            d.button === 0 &&\n            pr.canInteract(d.el) &&\n            d.el instanceof UI512ElementWithHighlight\n        ) {\n            if (d.el.getB('autohighlight')) {\n                d.el.set('highlightactive', true);\n            }\n        }\n    }\n\n    /**\n     * if the element is \"autohighlight\", make it not highlighted when mouse is up on it.\n     */\n    static trackHighlightedButtonMouseUp(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseUpEventDetails\n    ) {\n        if (\n            d.button === 0 &&\n            d.elClick &&\n            d.elClick instanceof UI512ElementWithHighlight\n        ) {\n            if (d.elClick.getB('autohighlight')) {\n                d.elClick.set('highlightactive', false);\n            }\n        }\n    }\n\n    /**\n     * if the element is \"autohighlight\", make it highlighted when mouse is down on it.\n     */\n    static trackHighlightedButtonMouseEnter(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseEnterDetails\n    ) {\n        if (\n            pr.trackClickedIds[0] === d.el.id &&\n            pr.canInteract(d.el) &&\n            d.el instanceof UI512ElementWithHighlight\n        ) {\n            if (d.el.getB('autohighlight')) {\n                d.el.set('highlightactive', true);\n            }\n        }\n    }\n\n    /**\n     * if the element is \"autohighlight\", make it highlighted when mouse is down on it.\n     */\n    static trackHighlightedButtonMouseLeave(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseLeaveDetails\n    ) {\n        if (d.el && d.el instanceof UI512ElementWithHighlight) {\n            if (d.el.getB('autohighlight')) {\n                d.el.set('highlightactive', false);\n            }\n        }\n    }\n\n    /**\n     * track keyup events\n     */\n    static trackKeyUp(pr: UI512PresenterWithMenuInterface, d: KeyUpEventDetails) {\n        pr.trackMetaKeys = d.mods;\n    }\n\n    /**\n     * define a few global shortcut keys.\n     */\n    static basicKeyShortcuts(\n        pr: UI512PresenterWithMenuInterface,\n        d: KeyDownEventDetails\n    ) {\n        pr.trackMetaKeys = d.mods;\n        if (!d.repeated) {\n            let wasShortcut = true;\n            let runTestsShortcut = checkIsProductionBuild() ? 'Opt+Shift+T' : 'Opt+T';\n            switch (d.readableShortcut) {\n                case 'Cmd+Opt+Shift+Q':\n                    pr.invalidateAll();\n                    CanvasWrapper.setDebugRenderingWithChangingColors(\n                        !CanvasWrapper.debugRenderingWithChangingColors\n                    );\n                    break;\n                case runTestsShortcut:\n                    BasicHandlers.showTestImage();\n                    getRoot().runTests(false);\n                    break;\n                case 'Cmd+Opt+Shift+T':\n                    BasicHandlers.showTestImage();\n                    getRoot().runTests(true);\n                    break;\n                default:\n                    wasShortcut = false;\n                    break;\n            }\n\n            if (wasShortcut) {\n                d.setHandled();\n            }\n        }\n    }\n\n    /**\n     * show an image saying that we're running tests\n     */\n    static showTestImage() {\n        let img = window.document.createElement('img');\n        img.src = '/resources03a/test/messagefortests.png';\n        window.document.body.appendChild(img);\n\n        /* center image in the browser */\n        img.style.position = 'absolute';\n        const imgh = 160;\n        const imgw = 456;\n        let top = Math.round(window.innerHeight / 2 - imgh / 2);\n        let left = Math.round(window.innerWidth / 2 - imgw / 2);\n        img.style.top = top + 'px';\n        img.style.left = left + 'px';\n    }\n\n    /**\n     * run callbacks that were sent to the main event loop.\n     */\n    static onIdleRunCallbackQueueFromAsyncs(\n        pr: UI512PresenterWithMenuInterface,\n        d: KeyDownEventDetails\n    ) {\n        for (let i = 0; i < pr.callbackQueueForIdle.length; i++) {\n            let cb = pr.callbackQueueForIdle[i];\n\n            /* set to undefined before calling it: otherwise if it throws an exception,\n            we might call it repeatedly. */\n            pr.callbackQueueForIdle[i] = undefined;\n            if (cb) {\n                cb();\n            }\n        }\n\n        pr.callbackQueueForIdle = [];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512ClipManager.ts",
    "content": "\n/* auto */ import { RepeatingTimer, RespondToErr, Util512Higher, getRoot, justConsoleMsgIfExceptionThrown } from './../utils/util512Higher';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { ClipManagerInterface } from './../draw/ui512Interfaces';\n/* auto */ import { PasteTextEventDetails } from './../menu/ui512Events';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * ClipManager\n * Ben Fisher, 2017\n * Uses some ideas from clipboard.js\n * If useOSClipboard, reads from operating system clipboard\n * If not useOSClipboard, simulates a clipboard and holds the string in memory\n * Modern browsers are quite restrictive about clipboard access,\n * for example, Paste basically has to come from a Cmd+V event and can't be triggered by us.\n */\nexport class ClipManager implements ClipManagerInterface {\n    simClipboard = '';\n    readonly ensureClipboardReady = 2000;\n    timerClipboardReady: RepeatingTimer;\n\n    constructor() {\n        this.timerClipboardReady = new RepeatingTimer(this.ensureClipboardReady);\n    }\n\n    /**\n     * every 2 seconds, set the browser focus to\n     * our hidden input box in case the focus somehow was changed\n     */\n    ensureReadyForPaste(milliseconds: number) {\n        this.timerClipboardReady.update(milliseconds);\n        if (this.timerClipboardReady.isDue()) {\n            this.timerClipboardReady.reset();\n            this.goEnsureReadyForPaste();\n        }\n    }\n\n    /**\n     * paste from the clipboard\n     */\n    paste(useOSClipboard: boolean) {\n        if (useOSClipboard) {\n            /* cannot do anything here, the PasteTextEventDetails event will be sent from _root_ */\n        } else {\n            let d = new PasteTextEventDetails(0, this.simClipboard, useOSClipboard);\n            getRoot().sendEvent(d);\n        }\n    }\n\n    /**\n     * copy to the clipboard. this one can be triggered by us.\n     */\n    copy(s: string, useOSClipboard: boolean) {\n        if (useOSClipboard) {\n            let hiddenInput = this.getOrCreateHidden();\n            assertTrue(hiddenInput, '2>|could not create hiddenInput');\n            hiddenInput.value = s;\n            hiddenInput.select();\n            let ret = justConsoleMsgIfExceptionThrown(\n                () => window.document.execCommand('copy'),\n                'copy'\n            );\n\n            return ret === true;\n        } else {\n            this.simClipboard = s;\n            return true;\n        }\n    }\n\n    /**\n     * sets focus so we can paste\n     */\n    goEnsureReadyForPaste() {\n        ClipManager.ensureReadyForPasteImplDoesNotThrow(this.getOrCreateHidden());\n    }\n\n    /**\n     * set the focus.\n     * run in a try/catch, we shouldn't interrupt user with a non-critical error\n     */\n    protected static ensureReadyForPasteImplDoesNotThrow(\n        hiddenInput: HTMLTextAreaElement\n    ) {\n        justConsoleMsgIfExceptionThrown(() => {\n            hiddenInput.value = ' ';\n            hiddenInput.focus();\n            hiddenInput.select();\n        }, 'ensureReadyForPasteImplDoesNotThrow');\n    }\n\n    /**\n     * a hidden input box, required for the browser to let us copy/paste\n     */\n    protected getOrCreateHidden() {\n        let hiddenInput = window.document.getElementById(\n            'hidden-dom-input'\n        ) as HTMLTextAreaElement;\n        if (!hiddenInput) {\n            const isRTL = window.document.documentElement.getAttribute('dir') === 'rtl';\n            hiddenInput = window.document.createElement('textarea');\n            hiddenInput.id = 'hidden-dom-input';\n\n            /* prevent zooming on iOS */\n            hiddenInput.style.fontSize = '12pt';\n\n            /* reset box model */\n            hiddenInput.style.border = '0';\n            hiddenInput.style.padding = '0';\n            hiddenInput.style.margin = '0';\n\n            /* move element out of screen horizontally */\n            hiddenInput.style.position = 'absolute';\n            hiddenInput.style[isRTL ? 'right' : 'left'] = '-99999px';\n\n            /* move element to the same position vertically */\n            let yPosition =\n                window.pageYOffset ?? window.document.documentElement.scrollTop;\n            hiddenInput.style.top = `${yPosition}px`;\n            hiddenInput.setAttribute('readonly', '');\n            window.document.body.appendChild(hiddenInput);\n\n            /* register events */\n            let setFocusToHiddenInput = () => {\n                ClipManager.ensureReadyForPasteImplDoesNotThrow(hiddenInput);\n            };\n\n            /* keep the hidden text area focused, no matter what... */\n            window.document.addEventListener('mouseup', setFocusToHiddenInput);\n            window.document.addEventListener('keyup', setFocusToHiddenInput);\n            hiddenInput.addEventListener('input', () =>\n                Util512Higher.syncToAsyncAfterPause(\n                    setFocusToHiddenInput,\n                    1,\n                    'setFocusToHiddenInput',\n                    RespondToErr.ConsoleErrOnly\n                )\n            );\n\n            /* register for paste event */\n            window.document.addEventListener('paste', (e: ClipboardEvent) => {\n                setFocusToHiddenInput();\n                e.preventDefault();\n                if (\n                    e.clipboardData &&\n                    e.clipboardData.types.indexOf('text/plain') !== -1\n                ) {\n                    let plainText = e.clipboardData.getData('text/plain');\n                    if (plainText) {\n                        let details = new PasteTextEventDetails(0, plainText, true);\n                        getRoot().sendEvent(details);\n                    }\n                }\n            });\n        }\n\n        return hiddenInput;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512GenericField.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * IGenericTextField, a generic text-field-like object.\n *\n * let's say you are typing on the keyboard to insert a letter into the text field.\n * if this is a UI512 text field, we can directly insert the letter.\n * but if it is a ViperCard text field,\n * we need to update the _VpcElField_ model first, for undoability,\n * and let modelrender insert the letter into the field.\n */\nexport interface GenericTextField {\n    setFmtTxt(newTxt: FormattedText, context: ChangeContext): void;\n    getFmtTxt(): FormattedText;\n    canEdit(): boolean;\n    canSelectText(): boolean;\n    isMultiline(): boolean;\n    setSel(a: number, b: number): void;\n    getSel(): [number, number];\n    getHeight(): number;\n    getDefaultFont(): string;\n    getReadOnlyUI512(): UI512ElTextField;\n    getScrollAmt(): number;\n    setScrollAmt(n: O<number>): void;\n}\n\n/**\n * GenericTextField wrapping a normal UI512ElTextField\n */\nexport class UI512ElTextFieldAsGeneric implements GenericTextField {\n    constructor(protected el: UI512ElTextField) {}\n    setFmtTxt(newTxt: FormattedText, context: ChangeContext) {\n        this.el.setFmTxt(newTxt, context);\n    }\n\n    getFmtTxt(): FormattedText {\n        return this.el.getFmTxt();\n    }\n\n    canEdit() {\n        return this.el.getB('canedit');\n    }\n\n    canSelectText(): boolean {\n        return this.el.getB('canselecttext');\n    }\n\n    isMultiline(): boolean {\n        return this.el.getB('multiline');\n    }\n\n    setSel(a: number, b: number): void {\n        this.el.set('selcaret', a);\n        this.el.set('selend', b);\n    }\n\n    getSel(): [number, number] {\n        return [this.el.getN('selcaret'), this.el.getN('selend')];\n    }\n\n    getHeight(): number {\n        return this.el.h;\n    }\n\n    getDefaultFont(): string {\n        return this.el.getS('defaultFont');\n    }\n\n    getReadOnlyUI512(): UI512ElTextField {\n        return this.el;\n    }\n\n    getScrollAmt(): number {\n        return this.el.getN('scrollamt');\n    }\n\n    setScrollAmt(n: O<number>): void {\n        if (n !== undefined && n !== null) {\n            return this.el.set('scrollamt', n);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512Scrollbar.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { CanvasWrapper, RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, getRoot } from './../utils/util512Higher';\n/* auto */ import { O, bool } from './../utils/util512Base';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { Util512, assertWarnEq, cast, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { UI512PresenterWithMenuInterface } from './../menu/ui512PresenterWithMenu';\n/* auto */ import { GenericTextField, UI512ElTextFieldAsGeneric } from './ui512GenericField';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512ViewDraw } from './../elements/ui512ElementView';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512ElGroup } from './../elements/ui512ElementGroup';\n/* auto */ import { UI512ElButton } from './../elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../elements/ui512Element';\n/* auto */ import { CharRectType, FoundCharByLocation, largeArea } from './../drawtext/ui512DrawTextClasses';\n/* auto */ import { DrawTextArgs, drawTextArgsFromEl } from './../drawtext/ui512DrawTextArgs';\n/* auto */ import { UI512DrawText } from './../drawtext/ui512DrawText';\n/* auto */ import { UI512ViewDrawBorders } from './../draw/ui512DrawBorders';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * creation and positioning of scrollbar elements\n */\nexport class ScrollbarImpl {\n    /**\n     * if calling set(), you should always use a GenericTextField and not the UI512Element\n     */\n    protected gelFromEl(el: O<UI512Element>): O<GenericTextField> {\n        return el && el instanceof UI512ElTextField\n            ? new UI512ElTextFieldAsGeneric(el)\n            : undefined;\n    }\n\n    /**\n     * construct elements for scrollbar\n     */\n    buildScrollbar(app: UI512Application, grp: UI512ElGroup, el: UI512ElTextField) {\n        let arrowUp = new UI512ElButton(\n            fldIdToScrollbarPartId(el.id, 'arrowUp'),\n            el.observer\n        );\n        arrowUp.set('visible', false);\n        arrowUp.set('icongroupid', '001');\n        arrowUp.set('iconnumber', 23);\n\n        let arrowDn = new UI512ElButton(\n            fldIdToScrollbarPartId(el.id, 'arrowDn'),\n            el.observer\n        );\n        arrowDn.set('visible', false);\n        arrowDn.set('icongroupid', '001');\n        arrowDn.set('iconnumber', 24);\n\n        let scrollBgUp = new UI512ElButton(\n            fldIdToScrollbarPartId(el.id, 'scrollBgUp'),\n            el.observer\n        );\n        scrollBgUp.set('visible', false);\n        scrollBgUp.set('autohighlight', false);\n\n        let scrollBgDn = new UI512ElButton(\n            fldIdToScrollbarPartId(el.id, 'scrollBgDn'),\n            el.observer\n        );\n        scrollBgDn.set('visible', false);\n        scrollBgDn.set('autohighlight', false);\n\n        let scrollThm = new UI512ElButton(\n            fldIdToScrollbarPartId(el.id, 'scrollThm'),\n            el.observer\n        );\n        scrollThm.set('visible', false);\n        scrollThm.set('autohighlight', false);\n\n        let elParts = [scrollBgUp, scrollBgDn, arrowUp, arrowDn, scrollThm];\n        for (let elPart of elParts) {\n            if (!grp.findEl(elPart.id)) {\n                grp.addElementAfter(app, elPart, el.id);\n            }\n        }\n    }\n\n    /**\n     * remove elements for scrollbar\n     */\n    removeScrollbar(app: UI512Application, grp: UI512ElGroup, el: UI512ElTextField) {\n        grp.removeElement(fldIdToScrollbarPartId(el.id, 'arrowUp'));\n        grp.removeElement(fldIdToScrollbarPartId(el.id, 'arrowDn'));\n        grp.removeElement(fldIdToScrollbarPartId(el.id, 'scrollBgUp'));\n        grp.removeElement(fldIdToScrollbarPartId(el.id, 'scrollBgDn'));\n        grp.removeElement(fldIdToScrollbarPartId(el.id, 'scrollThm'));\n    }\n\n    /**\n     * position scrollbar elements.\n     * if the font has not yet loaded, returns early and doesn't set the RenderComplete flag.\n     */\n    setPositions(\n        app: UI512Application,\n        grp: UI512ElGroup,\n        el: UI512ElTextField,\n        complete: RenderComplete\n    ) {\n        if (!el) {\n            return;\n        }\n\n        assertWarnEq(\n            el.getB('scrollbar'),\n            bool(grp.findEl(fldIdToScrollbarPartId(el.id, 'arrowUp'))),\n            'J3|forgot to call rebuildFieldScrollbars? ' + el.id\n        );\n\n        if (!el || !el.visible || !el.getDirty() || !el.getB('scrollbar')) {\n            return;\n        }\n\n        let pieces = this.getScrollbarPieces(app, el);\n        if (this.isThereSpaceToShowScrollbar(el)) {\n            let pieceEls = Util512.getMapVals(pieces);\n            for (let i = 0, len = pieceEls.length; i < len; i++) {\n                pieceEls[i].set('visible', true);\n            }\n\n            /* set positions */\n            this.setPositionsImpl(el, pieces, complete);\n        } else {\n            /* hide everything if field dimensions are too small to show a scrollbar */\n            let pieceEls = Util512.getMapVals(pieces);\n            for (let i = 0, len = pieceEls.length; i < len; i++) {\n                pieceEls[i].set('visible', false);\n            }\n        }\n    }\n\n    /**\n     * set positions\n     */\n    protected setPositionsImpl(\n        el: UI512ElTextField,\n        pieces: { [key: string]: UI512Element },\n        complete: RenderComplete\n    ) {\n        let scrollRatio = this.repositionScrollbarGetThumbPos(el);\n        if (scrollRatio === undefined) {\n            /* font is not yet loaded */\n            complete.complete = false;\n        }\n\n        /* set position of arrow up and down */\n        let sbX = el.right - ScrollConsts.BarWidth;\n        pieces.arrowUp.setDimensions(\n            sbX,\n            el.y,\n            ScrollConsts.BoxHeight,\n            ScrollConsts.BoxHeight\n        );\n        pieces.arrowDn.setDimensions(\n            sbX,\n            el.bottom - ScrollConsts.BoxHeight,\n            ScrollConsts.BoxHeight,\n            ScrollConsts.BoxHeight\n        );\n\n        if (scrollRatio === -1 || scrollRatio === undefined) {\n            /* content is short, so */\n            /* make the scrollbar look \"disabled\" and hide the thumb */\n            pieces.scrollThm.setDimensions(0, 0, 0, 0);\n            pieces.scrollBgDn.setDimensions(0, 0, 0, 0);\n            pieces.scrollBgUp.setDimensions(\n                pieces.arrowUp.x,\n                pieces.arrowUp.y,\n                ScrollConsts.BarWidth,\n                el.h\n            );\n            pieces.scrollBgUp.set('icongroupid', '');\n            pieces.scrollBgUp.set('iconnumber', 0);\n            pieces.scrollBgDn.set('icongroupid', '');\n            pieces.scrollBgDn.set('iconnumber', 0);\n            pieces.arrowUp.set('autohighlight', false);\n            pieces.arrowUp.set('iconnumberwhenhighlight', -1);\n            pieces.arrowDn.set('autohighlight', false);\n            pieces.arrowDn.set('iconnumberwhenhighlight', -1);\n        } else {\n            /* content is long enough, so enable the scrollbar */\n            let spaceBetween =\n                pieces.arrowDn.y - pieces.arrowUp.bottom - ScrollConsts.BoxHeight;\n            let thumbPos = Math.floor(scrollRatio * spaceBetween) + pieces.arrowUp.bottom;\n            let midpoint = thumbPos + Math.floor(ScrollConsts.BoxHeight / 2);\n\n            /* make it an even number */\n            midpoint = midpoint + (midpoint % 2);\n            pieces.scrollBgUp.setDimensions(\n                sbX,\n                el.y,\n                ScrollConsts.BarWidth,\n                midpoint - el.y\n            );\n            pieces.scrollBgDn.setDimensions(\n                sbX,\n                midpoint,\n                ScrollConsts.BarWidth,\n                el.bottom - midpoint\n            );\n            pieces.scrollThm.setDimensions(\n                sbX + 1,\n                thumbPos,\n                ScrollConsts.BoxHeight - 2,\n                ScrollConsts.BoxHeight\n            );\n\n            /* set icons and properties */\n            pieces.scrollBgUp.set('icongroupid', '001');\n            pieces.scrollBgUp.set('iconnumber', 144);\n            pieces.scrollBgUp.set('iconadjustsrcx', 2);\n            pieces.scrollBgUp.set('iconcentered', false);\n            pieces.scrollBgDn.set('icongroupid', '001');\n            pieces.scrollBgDn.set('iconnumber', 144);\n            pieces.scrollBgDn.set('iconadjustsrcx', 2);\n            pieces.scrollBgDn.set('iconcentered', false);\n            pieces.arrowUp.set('autohighlight', true);\n            pieces.arrowUp.set('iconnumberwhenhighlight', 25);\n            pieces.arrowDn.set('autohighlight', true);\n            pieces.arrowDn.set('iconnumberwhenhighlight', 26);\n        }\n    }\n\n    /**\n     * just a convenient way to call getElemById on all the pieces\n     */\n    protected getScrollbarPieces(\n        app: UI512Application,\n        el: UI512Element\n    ): { [key: string]: UI512Element } {\n        return {\n            arrowUp: app.getEl(fldIdToScrollbarPartId(el.id, 'arrowUp')),\n            arrowDn: app.getEl(fldIdToScrollbarPartId(el.id, 'arrowDn')),\n            scrollBgUp: app.getEl(fldIdToScrollbarPartId(el.id, 'scrollBgUp')),\n            scrollBgDn: app.getEl(fldIdToScrollbarPartId(el.id, 'scrollBgDn')),\n            scrollThm: app.getEl(fldIdToScrollbarPartId(el.id, 'scrollThm'))\n        };\n    }\n\n    /**\n     * remove both the text field and its scrollbar parts\n     */\n    removeScrollbarField(app: UI512Application, grp: UI512ElGroup, el: UI512Element) {\n        if (el instanceof UI512ElTextField) {\n            el.set('scrollbar', false);\n            this.removeScrollbar(app, grp, el);\n            grp.removeElement(el.id);\n        }\n    }\n\n    /**\n     * if there isn't enough space to show the full scrollbar\n     * we currently just hide everything. doesn't match original, but simpler.\n     */\n    isThereSpaceToShowScrollbar(el: UI512Element) {\n        return el.w > ScrollConsts.BarWidth + 1 && el.h > 3 * ScrollConsts.BoxHeight + 1;\n    }\n\n    /**\n     * draw characters in a field -- either to really draw the text,\n     * or to find the eventual position-on-screen of a character.\n     */\n    protected simulateDrawField(\n        el: UI512ElTextField,\n        measureHeight: boolean,\n        drawBeyondVisible: boolean,\n        callbackPerChar: O<\n            (charindex: number, type: CharRectType, bounds: number[]) => boolean\n        >\n    ) {\n        /* mimic the logic in elementView */\n        let b = new UI512ViewDrawBorders(\n            new CanvasWrapper(undefined),\n            el.x,\n            el.y,\n            el.w,\n            el.h,\n            new RenderComplete()\n        );\n        let view = new UI512ViewDraw();\n        let subRect = view.getSubRectForField(b, el)[1];\n        if (!subRect) {\n            subRect = [0, 0, 0, 0];\n        }\n\n        /* drawBeyondVisible is a perf optimization, telling text render to stop looping\n        once it leaves visible area. */\n        let drawText = cast(UI512DrawText, getRoot().getDrawText());\n        let [args, fmtText] = drawTextArgsFromEl(el, subRect, false);\n        args.callbackPerChar = callbackPerChar;\n        args.drawBeyondVisible = drawBeyondVisible;\n\n        if (measureHeight) {\n            /* manually specify a very large height for the field, so we can see where\n            the last character will be drawn, effectively measuring height of content */\n            args.boxY = 0;\n            args.boxH = largeArea;\n            args.vScrollAmt = 0;\n        }\n\n        let drawn = drawText.drawFormattedStringIntoBox(fmtText, undefined, args);\n        return drawn ? drawn : undefined;\n    }\n\n    /**\n     * when you click on a letter in a field, or the margin to left or right,\n     * which letter does it correspond with?\n     */\n    fromMouseCoordsToCaretPosition(el: UI512ElTextField, x: number, y: number) {\n        let [found, lowest] = this.getCoordToCharInField(\n            el,\n            x,\n            y,\n            false /* draw beyond visible */\n        );\n        if (found) {\n            if (found.type === CharRectType.Char) {\n                /* split each letter in half. if you clicked on the\n                left side of the letter, go left.\n                if you clicked on the right side of the letter, go right. */\n                let midpoint = found.x + Math.floor(found.w / 2);\n                let ret = x > midpoint ? found.charIndex + 1 : found.charIndex;\n                ret = fitIntoInclusive(ret, 0, el.getFmTxt().len());\n                return ret;\n            } else {\n                /* padding area always belongs to its adjacent character */\n                return found.charIndex;\n            }\n        } else if (\n            RectUtils.hasPoint(x, y, el.x, el.y, el.w, el.h) &&\n            lowest !== undefined &&\n            y >= lowest\n        ) {\n            /* user clicked below all of the text */\n            return el.getFmTxt().len();\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * when you click on a letter in a field, which letter did you click on?\n     */\n    getCoordToCharInField(\n        el: UI512ElTextField,\n        x: number,\n        y: number,\n        drawBeyondVisible: boolean\n    ): [O<FoundCharByLocation>, O<number>] {\n        /* if font loaded but pos not seen: return [] */\n        /* if font not yet loaded: return undefined */\n        let lowest = -1;\n        let found: O<FoundCharByLocation>;\n        let cb = (charindex: number, type: CharRectType, bounds: number[]) => {\n            lowest = Math.max(lowest, bounds[1] + bounds[3]);\n            if (RectUtils.hasPoint(x, y, bounds[0], bounds[1], bounds[2], bounds[3])) {\n                found = new FoundCharByLocation(\n                    bounds[0],\n                    bounds[1],\n                    bounds[2],\n                    bounds[3],\n                    charindex,\n                    type,\n                    0\n                );\n\n                /* signal that we can stop iterating */\n                return false;\n            } else {\n                return true;\n            }\n        };\n\n        let drawn = this.simulateDrawField(\n            el,\n            false /* measure height */,\n            drawBeyondVisible,\n            cb\n        );\n        return drawn ? [found, lowest] : [undefined, undefined];\n    }\n\n    /**\n     * where was the letter drawn on the screen in x, y coordinates?\n     */\n    getCharacterInFieldToCoords(el: UI512ElTextField, index: number) {\n        /* if font loaded but char not seen: return [] */\n        /* if font not yet loaded: return undefined */\n        let found: number[] = [];\n        let cb = (charindex: number, type: CharRectType, bounds: number[]) => {\n            if (type === CharRectType.Char && charindex === index) {\n                found = [bounds[0], bounds[1], bounds[2], bounds[3], charindex, type];\n                return false; /* we can stop iterating now */\n            } else {\n                return true;\n            }\n        };\n\n        let drawn = this.simulateDrawField(\n            el,\n            false /* measure height */,\n            true /* beyond visible */,\n            cb\n        );\n        return drawn ? found : undefined;\n    }\n\n    /**\n     * if there is a lot of content in the field, where should we scroll to so that you can\n     * see the caret?\n     */\n    getScrollPosThatWouldMakeStartCaretVisible(el: UI512ElTextField): O<number> {\n        el.set('showcaret', true);\n        if (!el.getN('scrollamt') && !el.getB('scrollbar')) {\n            /* perf optimization; we don't care about scrolling for non-scrollbar fields. */\n            return undefined;\n        }\n\n        let index = el.getN('selcaret');\n        let contentHeightInPixels = this.getCachedHeightOfField(el);\n        if (!contentHeightInPixels) {\n            /* font not yet loaded */\n            return undefined;\n        }\n\n        let maxScroll = contentHeightInPixels - el.h;\n        if (maxScroll <= 0) {\n            /* we can see everything in the field, no need to set the scroll */\n            /* set scroll to 0 */\n            return 0;\n        }\n\n        let found = this.getCharacterInFieldToCoords(el, index);\n        if (found && found.length > 0) {\n            let drawnY = found[1];\n            let drawnBottom = found[1] + found[3];\n            let chgScroll = 0;\n            if (drawnY > el.y && drawnBottom < el.bottom) {\n                /* it's already visible, we are ok */\n            } else if (drawnY <= el.y) {\n                chgScroll = drawnY - el.y;\n            } else if (drawnBottom >= el.bottom) {\n                chgScroll = drawnBottom - el.bottom;\n            }\n\n            if (chgScroll !== 0) {\n                let scroll = el.getN('scrollamt') + chgScroll;\n                scroll = fitIntoInclusive(scroll, 0, maxScroll);\n                return scroll;\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * get the height of content in the field, for better perf use cached height if available\n     */\n    getCachedHeightOfField(el: UI512ElTextField) {\n        let cachedHeight = el.getN('contentHeightInPixels');\n        if (cachedHeight && cachedHeight !== -1) {\n            return cachedHeight;\n        } else {\n            let drawn = this.simulateDrawField(\n                el,\n                true /* measure height */,\n                true /* beyond visible */,\n                undefined\n            );\n            if (drawn) {\n                let ret = drawn.lowestPixelDrawn + ScrollConsts.PadBottomOfField;\n                el.set('contentHeightInPixels', ret);\n                return ret;\n            } else {\n                return undefined;\n            }\n        }\n    }\n\n    /**\n     * the value 'scrollamt' is in pixels, but we want to get the\n     * ratio from 0.0 (top) to 1.0 (bottom)\n     */\n    repositionScrollbarGetThumbPos(el: UI512ElTextField) {\n        let contentHeightInPixels = this.getCachedHeightOfField(el);\n        if (contentHeightInPixels === undefined) {\n            return undefined;\n        }\n\n        let maxScroll = contentHeightInPixels - el.h;\n        if (maxScroll <= 0) {\n            return -1;\n        }\n\n        let scrollRatio = el.getN('scrollamt') / (maxScroll + 0.0);\n        scrollRatio = fitIntoInclusive(scrollRatio, 0.0, 1.0);\n        return scrollRatio;\n    }\n\n    /**\n     * set scroll amount when clicking scroll bar\n     */\n    onScrollArrowClicked(\n        pr: UI512PresenterWithMenuInterface,\n        arrowId: string,\n        amt: number\n    ) {\n        let fldid = scrollbarPartIdToFldId(arrowId);\n        let el = pr.app.findEl(fldid);\n        let gel = this.gelFromEl(el);\n        if (el && gel) {\n            let contentHeightInPixels = el.getN('contentHeightInPixels');\n            if (!contentHeightInPixels || contentHeightInPixels === -1) {\n                /* looks like the font hasn't loaded yet. */\n                /* for simplicity, let's just ignore this click */\n                return;\n            }\n\n            let maxScroll = contentHeightInPixels - el.h;\n            if (maxScroll <= 0) {\n                /* the content is too short for a scrollbar to even be needed */\n                return;\n            }\n\n            let curScroll = gel.getScrollAmt();\n            curScroll += amt;\n            curScroll = fitIntoInclusive(curScroll, 0, maxScroll);\n            gel.setScrollAmt(curScroll);\n        }\n    }\n\n    /**\n     * how tall in pixels is a line of text in this field?\n     */\n    getApproxLineHeight(el: UI512ElTextField, index: number) {\n        if (el.getFmTxt().len() === 0) {\n            /* field has no content */\n            return undefined;\n        }\n\n        index = fitIntoInclusive(index, 0, el.getFmTxt().len() - 1);\n        let font = el.getFmTxt().fontAt(index);\n        let textGetHeight = new FormattedText();\n        textGetHeight.push('|'.charCodeAt(0), font);\n\n        let drawText = getRoot().getDrawText() as UI512DrawText;\n        let args = new DrawTextArgs(0, 0, largeArea, largeArea, false, false, false);\n        args.addVSpacing = el.getN('addvspacing');\n        let drawn = drawText.drawFormattedStringIntoBox(textGetHeight, undefined, args);\n        if (drawn) {\n            return drawn.lowestPixelDrawn;\n        } else {\n            /* font not yet loaded */\n            return undefined;\n        }\n    }\n}\n\n/**\n * scrollbar parts have an id based on the parent element\n */\nexport function fldIdToScrollbarPartId(elId: string, partName: string) {\n    return elId + '##sb##' + partName;\n}\n\n/**\n * scrollbar parts have an id based on the parent element\n */\nexport function scrollbarPartIdToFldId(s: string) {\n    let pts = s.split('##sb##');\n    assertTrue(pts.length > 1, '2^|unexpected element id');\n    return pts[0];\n}\n\n/**\n * how far to scroll if clicked\n * if you click on the inside of the scrollbar, not on the arrow, move a greater distance\n */\nexport function getAmountIfScrollArrowClicked(elId: string) {\n    if (elId.endsWith('##sb##arrowDn')) {\n        return 15;\n    } else if (elId.endsWith('##sb##arrowUp')) {\n        return -15;\n    } else if (elId.endsWith('##sb##scrollBgDn')) {\n        return 100;\n    } else if (elId.endsWith('##sb##scrollBgUp')) {\n        return -100;\n    } else {\n        return undefined;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512TextEvents.ts",
    "content": "\n/* auto */ import { ModifierKeys } from './../utils/utilsKeypressHelpers';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../utils/utilsCursors';\n/* auto */ import { RectUtils } from './../utils/utilsCanvasDraw';\n/* auto */ import { BrowserInfo } from './../utils/util512Higher';\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { TextSelModify } from './ui512TextSelModify';\n/* auto */ import { ScrollbarImpl, fldIdToScrollbarPartId, getAmountIfScrollArrowClicked } from './ui512Scrollbar';\n/* auto */ import { UI512PresenterWithMenuInterface } from './../menu/ui512PresenterWithMenu';\n/* auto */ import { MenuListeners } from './../menu/ui512MenuListeners';\n/* auto */ import { FnEventCallback, MouseDragStatus, UI512EventType } from './../draw/ui512Interfaces';\n/* auto */ import { GenericTextField, UI512ElTextFieldAsGeneric } from './ui512GenericField';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { IdleEventDetails, KeyDownEventDetails, MouseDownDoubleEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails, PasteTextEventDetails } from './../menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { UI512ElButton } from './../elements/ui512ElementButton';\n/* auto */ import { BasicHandlers } from './ui512BasicHandlers';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * Base class for text events\n */\nexport class UI512TextEvents {\n    static readonly amtScrollArrowClicked = 12;\n    static readonly amtScrollAreaClicked = 36;\n\n    /**\n     * get generic text field from a UI512ElTextField\n     * subclasses can provide a different implementation\n     */\n    protected gelFromEl(el: O<UI512ElTextField>): O<GenericTextField> {\n        return el ? new UI512ElTextFieldAsGeneric(el) : undefined;\n    }\n\n    /**\n     * get scrollbar positioning class\n     * subclasses can provide a different implementation\n     */\n    protected getScrollbarImpl() {\n        return new ScrollbarImpl();\n    }\n\n    /**\n     * onMouseDown, see if scroll arrow clicked\n     */\n    onMouseDownScroll(pr: UI512PresenterWithMenuInterface, d: MouseDownEventDetails) {\n        if (d.button === 0 && d.el instanceof UI512ElButton) {\n            let moveAmt = getAmountIfScrollArrowClicked(d.el.id);\n            if (moveAmt !== undefined) {\n                this.getScrollbarImpl().onScrollArrowClicked(pr, d.el.id, moveAmt);\n                pr.mouseDragStatus = MouseDragStatus.ScrollArrow;\n            }\n        }\n    }\n\n    /**\n     * onMouseDown, see if we should select text\n     */\n    onMouseDownSelect(pr: UI512PresenterWithMenuInterface, d: MouseDownEventDetails) {\n        if (\n            d.button === 0 &&\n            d.el instanceof UI512ElTextField &&\n            d.el.getB('canselecttext') &&\n            pr.canSelectTextInField(d.el)\n        ) {\n            let gel = this.gelFromEl(d.el);\n            if (!gel) {\n                return;\n            }\n\n            if ((d.mods & ModifierKeys.Cmd) !== 0 || (d.mods & ModifierKeys.Opt) !== 0) {\n                return;\n            }\n\n            pr.setCurrentFocus(d.el.id);\n            if (d.el.getB('selectbylines')) {\n                TextSelModify.mouseClickSelectByLines(gel, d.mouseX, d.mouseY);\n            } else {\n                let isShift = (d.mods & ModifierKeys.Shift) !== 0;\n                TextSelModify.mouseClickCoordsToSetCaret(\n                    gel,\n                    d.mouseX,\n                    d.mouseY,\n                    isShift\n                );\n                if (!isShift) {\n                    pr.mouseDragStatus = MouseDragStatus.SelectingText;\n                }\n            }\n        }\n    }\n\n    /**\n     * onMouseMove, see if we should select text\n     */\n    onMouseMoveSelect(pr: UI512PresenterWithMenuInterface, d: MouseMoveEventDetails) {\n        if (\n            pr.mouseDragStatus === MouseDragStatus.SelectingText &&\n            pr.trackPressedBtns[0]\n        ) {\n            let el = pr.app.findEl(pr.trackClickedIds[0]);\n            if (\n                el &&\n                el instanceof UI512ElTextField &&\n                el.getB('canselecttext') &&\n                pr.canSelectTextInField(el) &&\n                !el.getB('selectbylines')\n            ) {\n                let gel = this.gelFromEl(el);\n                if (gel) {\n                    if (RectUtils.hasPoint(d.mouseX, d.mouseY, el.x, el.y, el.w, el.h)) {\n                        TextSelModify.mouseClickCoordsAdjustSelection(\n                            gel,\n                            d.mouseX,\n                            d.mouseY\n                        );\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * if cursor is in an editable field, change the cursor!\n     */\n    onMouseMoveSetTextEditCursor(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseMoveEventDetails\n    ) {\n        if (d.elPrev !== d.elNext) {\n            if (\n                d.elNext &&\n                d.elNext instanceof UI512ElTextField &&\n                d.elNext.getB('canedit')\n            ) {\n                UI512CursorAccess.setCursor(UI512Cursors.lbeam);\n            } else {\n                UI512CursorAccess.setCursor(UI512Cursors.arrow);\n            }\n        }\n    }\n\n    /**\n     * onMouseDoubleDown, select the current word\n     */\n    onMouseDoubleDown(\n        pr: UI512PresenterWithMenuInterface,\n        d: MouseDownDoubleEventDetails\n    ) {\n        if (d.button === 0) {\n            if (\n                d.el &&\n                d.el instanceof UI512ElTextField &&\n                d.el.getB('canselecttext') &&\n                pr.canSelectTextInField(d.el) &&\n                !d.el.getB('selectbylines')\n            ) {\n                let gel = this.gelFromEl(d.el);\n                if (gel) {\n                    /* disable the drag-to-select */\n                    pr.mouseDragStatus = MouseDragStatus.None;\n                    TextSelModify.changeSelCurrentWord(gel);\n                }\n            }\n        }\n    }\n\n    /**\n     * onMouseUp, we are no longer dragging\n     */\n    onMouseUp(pr: UI512PresenterWithMenuInterface, d: MouseUpEventDetails) {\n        pr.mouseDragStatus = MouseDragStatus.None;\n    }\n\n    /**\n     * onKeyDown, send both keyboard shortcuts and inserted text to the field\n     */\n    onKeyDown(pr: UI512PresenterWithMenuInterface, d: KeyDownEventDetails) {\n        let el = TextSelModify.getSelectedField(pr);\n        if (el && el.getB('selectbylines')) {\n            return;\n        } else if (!el || d.handled()) {\n            return;\n        }\n\n        let gel = this.gelFromEl(el);\n        if (!gel) {\n            return;\n        }\n\n        let wasShortcut = true;\n        switch (d.readableShortcut) {\n            case 'Cmd+A':\n                TextSelModify.changeSelSelectAll(gel);\n                break;\n            case 'Backspace':\n                TextSelModify.changeTextBackspace(gel, true, false);\n                break;\n            case 'Cmd+Backspace':\n                TextSelModify.changeTextBackspace(gel, true, true);\n                break;\n            case 'Delete':\n                TextSelModify.changeTextBackspace(gel, false, false);\n                break;\n            case 'Cmd+Delete':\n                TextSelModify.changeTextBackspace(gel, false, true);\n                break;\n            case 'PageUp':\n                TextSelModify.changeSelPageUpDown(gel, true, false);\n                break;\n            case 'Shift+PageUp':\n                TextSelModify.changeSelPageUpDown(gel, true, true);\n                break;\n            case 'PageDown':\n                TextSelModify.changeSelPageUpDown(gel, false, false);\n                break;\n            case 'Shift+PageDown':\n                TextSelModify.changeSelPageUpDown(gel, false, true);\n                break;\n            case 'Home':\n                TextSelModify.changeSelGoLineHomeEnd(gel, true, false);\n                break;\n            case 'Shift+Home':\n                TextSelModify.changeSelGoLineHomeEnd(gel, true, true);\n                break;\n            case 'Cmd+Home':\n                TextSelModify.changeSelGoDocHomeEnd(gel, true, false);\n                break;\n            case 'Cmd+Shift+Home':\n                TextSelModify.changeSelGoDocHomeEnd(gel, true, true);\n                break;\n            case 'End':\n                TextSelModify.changeSelGoLineHomeEnd(gel, false, false);\n                break;\n            case 'Shift+End':\n                TextSelModify.changeSelGoLineHomeEnd(gel, false, true);\n                break;\n            case 'Cmd+End':\n                TextSelModify.changeSelGoDocHomeEnd(gel, false, false);\n                break;\n            case 'Cmd+Shift+End':\n                TextSelModify.changeSelGoDocHomeEnd(gel, false, true);\n                break;\n            case 'ArrowLeft':\n                TextSelModify.changeSelLeftRight(gel, true, false, false);\n                break;\n            case 'Shift+ArrowLeft':\n                TextSelModify.changeSelLeftRight(gel, true, true, false);\n                break;\n            case 'Cmd+ArrowLeft':\n                TextSelModify.changeSelLeftRight(gel, true, false, true);\n                break;\n            case 'Cmd+Shift+ArrowLeft':\n                TextSelModify.changeSelLeftRight(gel, true, true, true);\n                break;\n            case 'ArrowRight':\n                TextSelModify.changeSelLeftRight(gel, false, false, false);\n                break;\n            case 'Shift+ArrowRight':\n                TextSelModify.changeSelLeftRight(gel, false, true, false);\n                break;\n            case 'Cmd+ArrowRight':\n                TextSelModify.changeSelLeftRight(gel, false, false, true);\n                break;\n            case 'Cmd+Shift+ArrowRight':\n                TextSelModify.changeSelLeftRight(gel, false, true, true);\n                break;\n            case 'ArrowUp':\n                TextSelModify.changeSelArrowKeyUpDownVisual(gel, true, false);\n                break;\n            case 'Shift+ArrowUp':\n                TextSelModify.changeSelArrowKeyUpDownVisual(gel, true, true);\n                break;\n            case 'Cmd+ArrowUp': {\n                let arrowbtnup = fldIdToScrollbarPartId(el.id, 'arrowUp');\n                this.getScrollbarImpl().onScrollArrowClicked(\n                    pr,\n                    arrowbtnup,\n                    -1 * UI512TextEvents.amtScrollArrowClicked\n                );\n                break;\n            }\n            case 'ArrowDown':\n                TextSelModify.changeSelArrowKeyUpDownVisual(gel, false, false);\n                break;\n            case 'Shift+ArrowDown':\n                TextSelModify.changeSelArrowKeyUpDownVisual(gel, false, true);\n                break;\n            case 'Cmd+ArrowDown': {\n                let arrowbtndn = fldIdToScrollbarPartId(el.id, 'arrowDn');\n                this.getScrollbarImpl().onScrollArrowClicked(\n                    pr,\n                    arrowbtndn,\n                    UI512TextEvents.amtScrollArrowClicked\n                );\n                break;\n            }\n            case 'Return':\n                TextSelModify.changeTextInsert(gel, '\\n');\n                break;\n            case 'Enter':\n                TextSelModify.changeTextInsert(gel, '\\n');\n                break;\n            case 'Cmd+C':\n                this.sendCutOrCopy(pr, el, false);\n                break;\n            case 'Cmd+X':\n                this.sendCutOrCopy(pr, el, true);\n                break;\n            default:\n                wasShortcut = false;\n                break;\n        }\n\n        if (d.readableShortcut === 'Cmd+V' && !pr.useOSClipboard) {\n            pr.clipManager.paste(pr.useOSClipboard);\n            wasShortcut = true;\n        }\n\n        if (wasShortcut) {\n            d.setHandled();\n        } else if (\n            (d.mods === 0 || d.mods === ModifierKeys.Shift) &&\n            d.keyChar.length === 1\n        ) {\n            let char = d.keyChar;\n            let charcode = d.keyChar.charCodeAt(0);\n            let toRoman = FormattedText.fromHostCharsetStrict(char, BrowserInfo.get().os);\n            if (\n                toRoman &&\n                toRoman.length === 1 &&\n                toRoman.charCodeAt(0) >= 32 &&\n                charcode >= 32\n            ) {\n                if (gel) {\n                    /* insert the char into the field */\n                    TextSelModify.changeTextInsert(gel, toRoman);\n                    d.setHandled();\n                }\n            }\n        }\n    }\n\n    /**\n     * will this key probably cause a change in the text field?\n     */\n    static keyDownProbablyCausesTextChange(d: KeyDownEventDetails) {\n        if ((d.mods === 0 || d.mods === ModifierKeys.Shift) && d.keyChar.length === 1) {\n            return true;\n        }\n\n        if (\n            d.readableShortcut.search(/\\bBackspace\\b/) !== -1 ||\n            d.readableShortcut.search(/\\bDelete\\b/) !== -1\n        ) {\n            return true;\n        }\n\n        switch (d.readableShortcut) {\n            case 'Return':\n                return true;\n            case 'Enter':\n                return true;\n            case 'NumpadEnter':\n                return true;\n            case 'Cmd+V':\n                return true;\n            case 'Cmd+X':\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * onPasteText, insert the text\n     */\n    onPasteText(pr: UI512PresenterWithMenuInterface, d: PasteTextEventDetails) {\n        let el = TextSelModify.getSelectedField(pr);\n        if (el && !(d.fromOS && !pr.useOSClipboard)) {\n            let text = d.fromOS\n                ? FormattedText.fromExternalCharset(d.text, BrowserInfo.get().os)\n                : d.text;\n            let gel = this.gelFromEl(el);\n            if (gel) {\n                TextSelModify.changeTextInsert(gel, text);\n            }\n        }\n    }\n\n    /**\n     * cut or copy text\n     */\n    sendCutOrCopy(\n        pr: UI512PresenterWithMenuInterface,\n        el: UI512ElTextField,\n        isCut: boolean\n    ) {\n        if (el) {\n            let gel = this.gelFromEl(el);\n            if (!gel) {\n                return;\n            }\n\n            if (el.getB('asteriskonly')) {\n                /* this is a password \"asteriskonly\" field so don't allow cut/copy */\n                return;\n            }\n\n            let sel = TextSelModify.getSelectedText(gel);\n            if (sel && sel.length > 0) {\n                let text = pr.useOSClipboard\n                    ? FormattedText.toExternalCharset(sel, BrowserInfo.get().os)\n                    : sel;\n                let succeeded = pr.clipManager.copy(text, pr.useOSClipboard);\n                if (succeeded && isCut && sel.length > 0) {\n                    TextSelModify.changeTextBackspace(gel, false, false);\n                }\n            }\n        }\n    }\n\n    /**\n     * onIdle, blink the caret\n     */\n    protected onBlinkCaret(pr: UI512PresenterWithMenuInterface, d: IdleEventDetails) {\n        pr.timerSlowIdle.update(d.milliseconds);\n        if (pr.timerSlowIdle.isDue()) {\n            pr.timerSlowIdle.reset();\n\n            /* blink the caret for this field */\n            if (pr.getCurrentFocus()) {\n                let el = pr.app.findEl(pr.getCurrentFocus());\n                if (el && el instanceof UI512ElTextField && el.getB('canselecttext')) {\n                    el.set('showcaret', !el.getB('showcaret'));\n                }\n            }\n        }\n    }\n\n    /**\n     * onIdle, continue scrolling if holding mouse down on field\n     */\n    onIdle(pr: UI512PresenterWithMenuInterface, d: IdleEventDetails) {\n        /* scroll down more if user is still clicked on the down arrow */\n        let clickedid = pr.trackClickedIds[0];\n        if (pr.mouseDragStatus === MouseDragStatus.ScrollArrow && clickedid) {\n            let moveAmt = getAmountIfScrollArrowClicked(clickedid);\n            if (moveAmt) {\n                let el = pr.app.findEl(clickedid);\n                if (\n                    el &&\n                    RectUtils.hasPoint(\n                        pr.trackMouse[0],\n                        pr.trackMouse[1],\n                        el.x,\n                        el.y,\n                        el.w,\n                        el.h\n                    )\n                ) {\n                    this.getScrollbarImpl().onScrollArrowClicked(pr, clickedid, moveAmt);\n                }\n            }\n        }\n\n        this.onBlinkCaret(pr, d);\n        if (pr.useOSClipboard) {\n            pr.clipManager.ensureReadyForPaste(d.milliseconds);\n        }\n    }\n}\n\n/**\n * default listeners for a presenter with text editing.\n */\nexport function addDefaultListeners(listeners: { [t: number]: FnEventCallback[] }) {\n    let editTextBehavior = new UI512TextEvents();\n    listeners[UI512EventType.MouseDown] = [\n        BasicHandlers.trackMouseStatusMouseDown,\n        BasicHandlers.trackCurrentElMouseDown,\n        BasicHandlers.trackHighlightedButtonMouseDown,\n        MenuListeners.onMouseDown,\n        editTextBehavior.onMouseDownScroll.bind(editTextBehavior),\n        editTextBehavior.onMouseDownSelect.bind(editTextBehavior)\n    ];\n\n    listeners[UI512EventType.MouseUp] = [\n        BasicHandlers.trackMouseStatusMouseUp,\n        BasicHandlers.trackCurrentElMouseUp,\n        BasicHandlers.trackHighlightedButtonMouseUp,\n        MenuListeners.onMouseUp,\n        editTextBehavior.onMouseUp.bind(editTextBehavior)\n    ];\n\n    listeners[UI512EventType.Idle] = [\n        editTextBehavior.onIdle.bind(editTextBehavior),\n        BasicHandlers.onIdleRunCallbackQueueFromAsyncs\n    ];\n\n    listeners[UI512EventType.MouseMove] = [\n        BasicHandlers.trackCurrentElMouseMove,\n        editTextBehavior.onMouseMoveSetTextEditCursor.bind(editTextBehavior),\n        editTextBehavior.onMouseMoveSelect.bind(editTextBehavior)\n    ];\n\n    listeners[UI512EventType.MouseEnter] = [\n        BasicHandlers.trackHighlightedButtonMouseEnter,\n        MenuListeners.onMouseEnter\n    ];\n\n    listeners[UI512EventType.MouseLeave] = [\n        BasicHandlers.trackHighlightedButtonMouseLeave,\n        MenuListeners.onMouseLeave\n    ];\n\n    listeners[UI512EventType.KeyDown] = [\n        BasicHandlers.basicKeyShortcuts,\n        editTextBehavior.onKeyDown.bind(editTextBehavior)\n    ];\n\n    listeners[UI512EventType.KeyUp] = [BasicHandlers.trackKeyUp];\n\n    listeners[UI512EventType.MouseDownDouble] = [\n        BasicHandlers.trackMouseDoubleDown,\n        editTextBehavior.onMouseDoubleDown.bind(editTextBehavior)\n    ];\n\n    listeners[UI512EventType.PasteText] = [\n        editTextBehavior.onPasteText.bind(editTextBehavior)\n    ];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512TextLines.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { Util512, arLast, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { specialCharNumNewline } from './../drawtext/ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* small perf opt to reduce calls to charCodeAt */\nconst space = ' '.charCodeAt(0);\nconst tab = '\\t'.charCodeAt(0);\n\n/**\n * splits text into lines, in order to answer questions like:\n * which character is the start of the 5th line?\n * which line contains the 60th character?\n * what is the indentation level of the 9th line?\n */\nexport class UI512Lines {\n    lns: FormattedText[];\n    constructor(txt: FormattedText) {\n        this.lns = [new FormattedText()];\n\n        /* include the '\\n' characters at the end of the line like we do when rendering */\n        /* if we strip the \\n character we would lose the formatting of the \\n character */\n        for (let i = 0; i < txt.len(); i++) {\n            arLast(this.lns).push(txt.charAt(i), txt.fontAt(i));\n            if (txt.charAt(i) === specialCharNumNewline) {\n                this.lns.push(new FormattedText());\n            }\n        }\n    }\n\n    /**\n     * join lines back into one FormattedText object\n     */\n    flatten() {\n        let ret = new FormattedText();\n        for (let line of this.lns) {\n            ret.append(line);\n        }\n\n        return ret;\n    }\n\n    /**\n     * which line contains the 60th character?\n     */\n    indexToLineNumber(n: number) {\n        let runningTotal = 0;\n        for (let i = 0; i < this.lns.length; i++) {\n            let nextTotal = runningTotal + this.lns[i].len();\n            if (n >= runningTotal && n < nextTotal) {\n                return i;\n            }\n\n            runningTotal = nextTotal;\n        }\n\n        /* if beyond every line, return the last line. */\n        return this.lns.length - 1;\n    }\n\n    /**\n     * which character is the start of the 5th line?\n     */\n    lineNumberToIndex(lineNum: number) {\n        let runningTotal = 0;\n        lineNum = Math.min(lineNum, this.lns.length - 1);\n        for (let i = 0; i < lineNum; i++) {\n            runningTotal += this.lns[i].len();\n        }\n\n        return runningTotal;\n    }\n\n    /**\n     * which character is the end of the 5th line?\n     * this != start(n+1) - 1, consider the last line.\n     */\n    lineNumberToLineEndIndex(lineNum: number) {\n        lineNum = fitIntoInclusive(lineNum, 0, this.lns.length - 1);\n        let ln = this.lns[lineNum];\n        let startLine = this.lineNumberToIndex(lineNum);\n        if (ln.len() === 0) {\n            return startLine;\n        } else if (ln.charAt(ln.len() - 1) === specialCharNumNewline) {\n            return startLine + ln.len() - 1;\n        } else {\n            return startLine + ln.len();\n        }\n    }\n\n    /**\n     * same as lineNumberToIndex, but skips overhead creating a UI512Lines object\n     */\n    static fastLineNumberToIndex(txt: FormattedText, lineNum: number) {\n        let count = 0;\n        let mostRecentLineStart = 0;\n        for (let i = 0; i < txt.len(); i++) {\n            if (count === lineNum) {\n                return i;\n            } else if (txt.charAt(i) === specialCharNumNewline) {\n                count += 1;\n                mostRecentLineStart = i + 1;\n            }\n        }\n\n        return mostRecentLineStart;\n    }\n\n    /**\n     * same as lineNumberAndEndToIndex, but skips overhead creating a UI512Lines object\n     */\n    static fastLineNumberAndEndToIndex(txt: FormattedText, lineNum: number) {\n        let startIndex = UI512Lines.fastLineNumberToIndex(txt, lineNum);\n        let i = startIndex;\n        for (; i < txt.len(); i++) {\n            if (txt.charAt(i) === specialCharNumNewline) {\n                break;\n            }\n        }\n\n        return [startIndex, i + 1];\n    }\n\n    /**\n     * get total length\n     */\n    length() {\n        let runningTotal = 0;\n        for (let i = 0; i < this.lns.length; i++) {\n            runningTotal += this.lns[i].len();\n        }\n\n        return runningTotal;\n    }\n\n    /**\n     * get unformatted content of the line\n     */\n    getLineUnformatted(linenum: number) {\n        return this.lns[linenum].toUnformatted();\n    }\n\n    /**\n     * apply a function to a certain number of lines\n     * returns start and end positions of the text that was affected.\n     */\n    static alterSelectedLines(\n        txt: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        fnAlterLine: (t: FormattedText) => void\n    ): [FormattedText, number, number] {\n        let lines = new UI512Lines(txt);\n        let firstLine = lines.indexToLineNumber(Math.min(nCaret, nEnd));\n        let lastLine = lines.indexToLineNumber(Math.max(nCaret, nEnd));\n        for (let i = firstLine; i <= lastLine; i++) {\n            fnAlterLine(lines.lns[i]);\n        }\n\n        /* let's select both entire lines we altered */\n        let nextCaret = lines.lineNumberToIndex(firstLine);\n        let nextEnd = lines.lineNumberToLineEndIndex(lastLine);\n        return [lines.flatten(), nextCaret, nextEnd];\n    }\n\n    /**\n     * get start of line excluding whitespace\n     */\n    static getNonSpaceStartOfLine(txt: FormattedText, okToExceedLength: boolean) {\n        let i = 0;\n        if (!txt.len()) {\n            return 0;\n        }\n\n        for (i = 0; i < txt.len(); i++) {\n            if (txt.charAt(i) !== space && txt.charAt(i) !== tab) {\n                return i;\n            }\n        }\n\n        return okToExceedLength ? txt.len() : txt.len() - 1;\n    }\n\n    /**\n     * count indentation level\n     */\n    static getIndentLevel(txt: FormattedText) {\n        const maxIndents = 1024;\n        let spaces = Util512.repeat(ScrollConsts.TabSize, ' ').join('');\n        let s = txt.toUnformatted();\n        let count = 0;\n        for (let i = 0; i < maxIndents; i++) {\n            if (s.startsWith('\\t')) {\n                count += 1;\n                s = s.substr(1);\n            } else if (s.startsWith(spaces)) {\n                count += 1;\n                s = s.substr(spaces.length);\n            } else {\n                break;\n            }\n        }\n\n        return count;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512TextSelModify.ts",
    "content": "\n/* auto */ import { O } from './../utils/util512Base';\n/* auto */ import { assertEq, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { TextSelModifyImpl } from './ui512TextSelModifyImpl';\n/* auto */ import { UI512Lines } from './ui512TextLines';\n/* auto */ import { ScrollbarImpl } from './ui512Scrollbar';\n/* auto */ import { UI512PresenterWithMenuInterface } from './../menu/ui512PresenterWithMenu';\n/* auto */ import { ChangeContext } from './../draw/ui512Interfaces';\n/* auto */ import { GenericTextField } from './ui512GenericField';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField } from './../elements/ui512ElementTextField';\n/* auto */ import { specialCharNumNewline } from './../drawtext/ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * modifications of selection and content within a text field\n *\n * uses TextSelModifyImpl to respond to events that change selection and content\n */\nexport class TextSelModify {\n    protected static readOnlyScrollbarImpl = new ScrollbarImpl();\n\n    /**\n     * get field that has focus\n     */\n    static getSelectedField(pr: UI512PresenterWithMenuInterface): O<UI512ElTextField> {\n        if (!pr.getCurrentFocus()) {\n            return undefined;\n        }\n\n        let el = pr.app.findEl(pr.getCurrentFocus());\n        if (!(el && el instanceof UI512ElTextField && el.getB('canselecttext'))) {\n            return undefined;\n        }\n\n        return el;\n    }\n\n    /**\n     * helper function for changing text in a field,\n     * makes sure that the field can be edited,\n     * makes sure that the caret positions are valid after calling the function,\n     * and makes sure that a single-line field doesn't have newlines.\n     * also sets the scroll to make the caret visible, which feels important to user\n     */\n    protected static changeTextInField(\n        el: GenericTextField,\n        fn: (\n            t: FormattedText,\n            nCaret: number,\n            nEnd: number\n        ) => [FormattedText, number, number]\n    ) {\n        if (!el.canEdit() || !el.canSelectText()) {\n            return;\n        }\n\n        let tRead = el.getFmtTxt();\n        let tWritable = tRead.getUnlockedCopy();\n        TextSelModify.fixSelection(el);\n        let [selCaretBefore, selEndBefore] = el.getSel();\n        let [tResult, nCaret, nEnd] = fn(tWritable, selCaretBefore, selEndBefore);\n        el.setFmtTxt(tResult, ChangeContext.Default);\n        el.setSel(nCaret, nEnd);\n        TextSelModify.fixSelection(el);\n\n        if (!el.isMultiline()) {\n            assertEq(\n                -1,\n                tResult.indexOf(specialCharNumNewline),\n                `2/|fld is not multiline but has newline ${tResult.toSerialized()}`\n            );\n        }\n\n        let amt = TextSelModify.readOnlyScrollbarImpl.getScrollPosThatWouldMakeStartCaretVisible(\n            el.getReadOnlyUI512()\n        );\n        el.setScrollAmt(amt);\n    }\n\n    /**\n     * helper function for changing selection in a field,\n     * makes sure field can have selection changed,\n     * makes sure that the caret positions are valid after calling the function,\n     * also sets the scroll to make the caret visible, which feels important to user\n     */\n    protected static changeSelInField(\n        el: GenericTextField,\n        fn: (t: FormattedText, nCaret: number, nEnd: number) => [number, number]\n    ) {\n        TextSelModify.fixSelection(el);\n        let t = el.getFmtTxt();\n\n        /* lock the text, so it can't be accidentally modified */\n        t.lock();\n        if (t.len() && el.canSelectText()) {\n            let [ncaretBefore, nEndBefore] = el.getSel();\n            let [nextCaret, nextEnd] = fn(t, ncaretBefore, nEndBefore);\n            el.setSel(nextCaret, nextEnd);\n            TextSelModify.fixSelection(el);\n            let o = TextSelModify.readOnlyScrollbarImpl;\n            let amt = o.getScrollPosThatWouldMakeStartCaretVisible(el.getReadOnlyUI512());\n            el.setScrollAmt(amt);\n        }\n    }\n\n    /**\n     * fixes the selection in case it extended beyond content\n     * note that going one character beyond the content is fine, though\n     */\n    static fixSelection(el: GenericTextField) {\n        let [nCaret, nEnd] = el.getSel();\n        nCaret = fitIntoInclusive(nCaret, 0, el.getFmtTxt().len());\n        nEnd = fitIntoInclusive(nEnd, 0, el.getFmtTxt().len());\n        el.setSel(nCaret, nEnd);\n    }\n\n    /**\n     * select all\n     */\n    static changeSelSelectAll(el: GenericTextField) {\n        TextSelModify.changeSelInField(el, TextSelModifyImpl.changeSelSelectAll);\n    }\n\n    /**\n     * delete leftwards if you hit backspace\n     */\n    static changeTextBackspace(\n        el: GenericTextField,\n        isLeft: boolean,\n        isUntilWord: boolean\n    ) {\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextBackspace(t, nCaret, nEnd, isLeft, isUntilWord)\n        );\n    }\n\n    /**\n     * duplicate the current line\n     */\n    static changeTextDuplicate(el: GenericTextField) {\n        if (el.isMultiline()) {\n            TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n                TextSelModifyImpl.changeTextDuplicate(t, nCaret, nEnd)\n            );\n        }\n    }\n\n    /**\n     * delete the current line\n     */\n    static changeTextDeleteLine(el: GenericTextField) {\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextDeleteLine(t, nCaret, nEnd)\n        );\n    }\n\n    /**\n     * for one or more lines, add or remove whitespace\n     */\n    static changeTextIndentation(el: GenericTextField, isLeft: boolean) {\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextIndentation(\n                t,\n                nCaret,\n                nEnd,\n                isLeft,\n                el.getDefaultFont()\n            )\n        );\n    }\n\n    /**\n     * add or remove a prefix from any number of selected lines,\n     * e.g. hitting Cmd+Q to comment out lines\n     */\n    static changeTextToggleLinePrefix(el: GenericTextField, prefix: string) {\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextToggleLinePrefix(\n                t,\n                nCaret,\n                nEnd,\n                prefix,\n                el.getDefaultFont()\n            )\n        );\n    }\n\n    /**\n     * add/remove a block comment\n     */\n    static changeTextToggleBlockComment(\n        el: GenericTextField,\n        startChars: string,\n        endChars: string\n    ) {\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextToggleBlockComment(\n                t,\n                nCaret,\n                nEnd,\n                startChars,\n                endChars,\n                el.getDefaultFont()\n            )\n        );\n    }\n\n    /**\n     * what happens when you type a letter in a field\n     */\n    static changeTextInsert(el: GenericTextField, s: string) {\n        if (!el.isMultiline()) {\n            s = s.split('\\n')[0];\n        }\n\n        TextSelModify.changeTextInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeTextInsert(t, nCaret, nEnd, s, el.getDefaultFont())\n        );\n    }\n\n    /**\n     * when you press left or right, change selection\n     */\n    static changeSelLeftRight(\n        el: GenericTextField,\n        isLeft: boolean,\n        isExtend: boolean,\n        isUntilWord: boolean\n    ) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeSelLeftRight(\n                t,\n                nCaret,\n                nEnd,\n                isLeft,\n                isExtend,\n                isUntilWord\n            )\n        );\n    }\n\n    /**\n     * when you press cmd+left or cmd+right, change selection\n     */\n    static changeSelCurrentWord(el: GenericTextField) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeSelCurrentWord(t, nCaret, nEnd)\n        );\n    }\n\n    /**\n     * when you press Home, go to first char in the line\n     */\n    static changeSelGoLineHomeEnd(\n        el: GenericTextField,\n        isLeft: boolean,\n        isExtend: boolean\n    ) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeSelGoLineHomeEnd(t, nCaret, nEnd, isLeft, isExtend)\n        );\n    }\n\n    /**\n     * when you press Cmd+Home, go to first char in the field\n     */\n    static changeSelGoDocHomeEnd(\n        el: GenericTextField,\n        isLeft: boolean,\n        isExtend: boolean\n    ) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) =>\n            TextSelModifyImpl.changeSelGoDocHomeEnd(t, nCaret, nEnd, isLeft, isExtend)\n        );\n    }\n\n    /**\n     * move by one page\n     */\n    static changeSelPageUpDown(el: GenericTextField, isUp: boolean, isExtend: boolean) {\n        let nCaret = el.getSel()[0];\n        let approxLineHeight = TextSelModify.readOnlyScrollbarImpl.getApproxLineHeight(\n            el.getReadOnlyUI512(),\n            nCaret\n        );\n        if (approxLineHeight) {\n            /* go about one line less than the amount of lines per page, and minimum of one line */\n            let linesPerPage = Math.floor(el.getHeight() / approxLineHeight);\n            linesPerPage = Math.max(1, linesPerPage - 1);\n            for (let i = 0; i < linesPerPage; i++) {\n                TextSelModify.changeSelArrowKeyUpDownVisual(el, isUp, isExtend);\n            }\n        }\n    }\n\n    /**\n     * clicking in a text field, where to set the caret\n     */\n    static mouseClickCoordsToSetCaret(\n        el: GenericTextField,\n        x: number,\n        y: number,\n        isExtend: boolean\n    ) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) => {\n            let index = TextSelModify.readOnlyScrollbarImpl.fromMouseCoordsToCaretPosition(\n                el.getReadOnlyUI512(),\n                x,\n                y\n            );\n            if (index !== undefined) {\n                if (isExtend) {\n                    return [index, nEnd];\n                } else {\n                    return [index, index];\n                }\n            } else {\n                return [nCaret, nEnd];\n            }\n        });\n    }\n\n    /**\n     * clicking+dragging in a text field, where to set the caret\n     */\n    static mouseClickCoordsAdjustSelection(el: GenericTextField, x: number, y: number) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) => {\n            let index = TextSelModify.readOnlyScrollbarImpl.fromMouseCoordsToCaretPosition(\n                el.getReadOnlyUI512(),\n                x,\n                y\n            );\n            if (index !== undefined) {\n                return [index, nEnd];\n            } else {\n                return [nCaret, nEnd];\n            }\n        });\n    }\n\n    /**\n     * clicking in a lines choice field, we should select the entire line\n     */\n    static mouseClickSelectByLines(el: GenericTextField, x: number, y: number) {\n        let [selcaretBefore, selendBefore] = el.getSel();\n        this.mouseClickCoordsToSetCaret(el, x, y, false);\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) => {\n            if (\n                el.getFmtTxt().len() > 0 &&\n                (nCaret !== selcaretBefore || nEnd !== selendBefore)\n            ) {\n                let lines = new UI512Lines(el.getFmtTxt());\n                let lineNumber = lines.indexToLineNumber(nCaret);\n                let [newncaret, newnend] = [\n                    lines.lineNumberToIndex(lineNumber),\n                    lines.lineNumberToLineEndIndex(lineNumber) + 1\n                ];\n                if (newnend - newncaret > 1) {\n                    /* only allow a line to be selected if it's not empty. */\n                    return [newncaret, newnend];\n                }\n            }\n\n            return [selcaretBefore, selendBefore];\n        });\n    }\n\n    /**\n     * select the Nth line in a field, 0-based\n     */\n    static selectLineInField(el: GenericTextField, n: number) {\n        TextSelModify.changeSelInField(el, (t, nCaret, nEnd) => {\n            let txt = el.getFmtTxt();\n            if (txt.len() > 0) {\n                let [lineStart, lineEnd] = UI512Lines.fastLineNumberAndEndToIndex(txt, n);\n                return [lineStart, lineEnd];\n            } else {\n                return [nCaret, nEnd];\n            }\n        });\n    }\n\n    /**\n     * which line is selected?\n     */\n    static selectByLinesWhichLine(el: GenericTextField) {\n        let [selcaret, selend] = el.getSel();\n        if (selcaret === selend || el.getFmtTxt().len() === 0) {\n            return undefined;\n        } else {\n            let lines = new UI512Lines(el.getFmtTxt());\n            return lines.indexToLineNumber(selcaret);\n        }\n    }\n\n    /**\n     * respond to user hitting up or down.\n     *\n     * if the field is full of wrapped text, and the caret is in the middle,\n     * with many line of text above it and below it,\n     * and you hit the \"up\" arrow key, what should happen?\n     *\n     * a) \"logical\" the caret is 24 characters from the left, so we should go up\n     * a line and move the caret to be 24 characters from the left\n     *\n     * b) \"visual\" the caret is 130 pixels from the left, so we should go up\n     * a line and move the caret to be whatever happens to be 130 pixels from the left\n     *\n     * it looks like most text editors use method b)\n     * so use that here.\n     */\n    static changeSelArrowKeyUpDownVisual(\n        gel: GenericTextField,\n        isUp: boolean,\n        isExtend: boolean\n    ) {\n        TextSelModify.changeSelInField(gel, (t, nCaret, nEnd) => {\n            let bounds = TextSelModify.readOnlyScrollbarImpl.getCharacterInFieldToCoords(\n                gel.getReadOnlyUI512(),\n                nCaret\n            );\n\n            if (bounds && bounds.length > 0) {\n                /* find a location above the middle of the letter */\n                const pixelsExtendedPast = 4;\n                let middle = bounds[0] + Math.floor(bounds[2] / 2);\n                let above = isUp\n                    ? bounds[1] - pixelsExtendedPast\n                    : bounds[1] + bounds[3] + pixelsExtendedPast;\n                let found = TextSelModify.readOnlyScrollbarImpl.getCoordToCharInField(\n                    gel.getReadOnlyUI512(),\n                    middle,\n                    above,\n                    true\n                )[0];\n\n                if (found) {\n                    let nextcaret = found.charIndex;\n                    let nextend = isExtend ? nEnd : nextcaret;\n                    return [nextcaret, nextend];\n                }\n            }\n            return [nCaret, nEnd];\n        });\n    }\n\n    /**\n     * what text is selected, unformatted\n     */\n    static getSelectedText(el: GenericTextField) {\n        let bounds = TextSelModify.getSelectedTextBounds(el);\n        if (bounds) {\n            let [pp1, pp2] = bounds;\n            let t = el.getFmtTxt();\n            return t.toUnformattedSubstr(pp1, pp2 - pp1);\n        } else {\n            return '';\n        }\n    }\n\n    /**\n     * what text is selected, unformatted\n     */\n    static getSelectedTextBounds(el: GenericTextField): O<[number, number]> {\n        if (el.canSelectText()) {\n            TextSelModify.fixSelection(el);\n            let [p1, p2] = el.getSel();\n            let pp1 = Math.min(p1, p2);\n            let pp2 = Math.max(p1, p2);\n            return [pp1, pp2];\n        } else {\n            return undefined;\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/textedit/ui512TextSelModifyImpl.ts",
    "content": "\n/* auto */ import { ScrollConsts } from './../utils/utilsDrawConstants';\n/* auto */ import { GetCharClass } from './../utils/util512Higher';\n/* auto */ import { assertTrue } from './../utils/util512Assert';\n/* auto */ import { Util512, fitIntoInclusive } from './../utils/util512';\n/* auto */ import { UI512Lines } from './ui512TextLines';\n/* auto */ import { FormattedText } from './../drawtext/ui512FormattedText';\n/* auto */ import { specialCharNumNewline } from './../drawtext/ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * modifications of selection and content within a text field\n *\n * \"caret\" is the start of selection. 0-based. ok if one past the length of content.\n * \"end\" is the end of selection. 0-based. ok if past the length of content.\n * end can be before caret if, say, you drag from right to left to select text, or hit Shift-left.\n * if caret === end, the selection is zero-width, and we'll show a blinking caret marker\n * if caret !== end, there is selected text you can copy, and we'll highlight the selection\n *\n * functions in this class return a tuple [newSelCaret, newSelEnd]\n *\n * this class works on an abstract caret and end, as used by the _SelAndEntry_ class\n * isExtend means to extend the selection, e.g. when the Shift key is held.\n * isUntilWord means to extend until next word, e.g. when the Cmd key is held.\n */\nexport class TextSelModifyImpl {\n    /**\n     * select all\n     * returns the tuple [newSelCaret, newSelEnd]\n     */\n    static changeSelSelectAll(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number\n    ): [number, number] {\n        return [0, t.len()];\n    }\n\n    /**\n     * when you press Cmd+Home, go to first char in the field\n     * when you press Cmd+End, go to the last char in the field\n     * returns the tuple [newSelCaret, newSelEnd]\n     */\n    static changeSelGoDocHomeEnd(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        isLeft: boolean,\n        isExtend: boolean\n    ): [number, number] {\n        let nextCaret = isLeft ? 0 : t.len();\n        let nextEnd = isExtend ? nEnd : nextCaret;\n        return [nextCaret, nextEnd];\n    }\n\n    /**\n     * when you press Home, go to first char in the line\n     * when you press End, go to the last char in the line\n     */\n    static changeSelGoLineHomeEnd(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        isLeft: boolean,\n        isExtend: boolean\n    ): [number, number] {\n        let lines = new UI512Lines(t);\n        let lineNumber = lines.indexToLineNumber(nCaret);\n        if (isLeft) {\n            /* if you press Home on an indented line, go to first non-whitepace */\n            let startOfLine = lines.lineNumberToIndex(lineNumber);\n            let startOfLineNonSpace =\n                startOfLine +\n                UI512Lines.getNonSpaceStartOfLine(lines.lns[lineNumber], true);\n            let nextCaret =\n                nCaret <= startOfLineNonSpace ? startOfLine : startOfLineNonSpace;\n            let nextEnd = isExtend ? nEnd : nextCaret;\n            return [nextCaret, nextEnd];\n        } else {\n            let nextCaret = lines.lineNumberToLineEndIndex(lineNumber);\n            let nextEnd = isExtend ? nEnd : nextCaret;\n            return [nextCaret, nextEnd];\n        }\n    }\n\n    /**\n     * when you press left or right, change selection\n     */\n    static changeSelLeftRight(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        isLeft: boolean,\n        isExtend: boolean,\n        isUntilWord: boolean\n    ): [number, number] {\n        let nextCaret = TextSelModifyImpl.getLeftRight(\n            t,\n            nCaret,\n            isLeft,\n            isUntilWord,\n            true\n        );\n        let nextEnd = isExtend ? nEnd : nextCaret;\n        return [nextCaret, nextEnd];\n    }\n\n    /**\n     * when you, say, double click on a word, select the word\n     */\n    static changeSelCurrentWord(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number\n    ): [number, number] {\n        /* essentially emulate hitting Ctrl-Right then Ctrl-Shift-Left */\n        /* except that the intitial Ctrl-Right does not include trailing space */\n        let endword = TextSelModifyImpl.getLeftRight(t, nCaret, false, true, false);\n        let nextCaret = TextSelModifyImpl.getLeftRight(t, endword, true, true, false);\n        return [nextCaret, endword];\n    }\n\n    /**\n     * what happens when you type a letter in a field?\n     * we have to erase any content that was selected\n     * we'll use font of adjacent character, but if field is empty, fall back to defaultFont\n     */\n    static changeTextInsert(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        sToInsert: string,\n        defaultFont: string\n    ): [FormattedText, number, number] {\n        let font: string;\n        let getFontFrom = Math.max(0, nCaret - 1);\n        if (t.len() === 0) {\n            font = defaultFont;\n        } else if (getFontFrom >= 0 && getFontFrom < t.len()) {\n            font = t.fontAt(getFontFrom);\n        } else {\n            font = t.fontAt(t.len() - 1);\n        }\n\n        let higher = Math.max(nCaret, nEnd);\n        let lower = Math.min(nCaret, nEnd);\n        let newTxt = FormattedText.byInsertion(t, lower, higher - lower, sToInsert, font);\n        return [newTxt, lower + sToInsert.length, lower + sToInsert.length];\n    }\n\n    /**\n     * what happens when there's selected text and you hit delete?\n     */\n    static changeTextDeleteSelection(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number\n    ): [FormattedText, number, number] {\n        let higher = Math.max(nCaret, nEnd);\n        let lower = Math.min(nCaret, nEnd);\n        t.splice(lower, higher - lower);\n        return [t, lower, lower];\n    }\n\n    /**\n     * delete leftwards if you hit backspace\n     */\n    static changeTextBackspace(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        isLeft: boolean,\n        isUntilWord: boolean\n    ): [FormattedText, number, number] {\n        if (t.len() === 0) {\n            return [t, nCaret, nEnd];\n        }\n\n        if (nCaret === nEnd) {\n            /* hitting backspace is equal to hitting shift-left and deleting the selection */\n            [nCaret, nEnd] = TextSelModifyImpl.changeSelLeftRight(\n                t,\n                nCaret,\n                nEnd,\n                isLeft,\n                true,\n                isUntilWord\n            );\n        }\n\n        return TextSelModifyImpl.changeTextDeleteSelection(t, nCaret, nEnd);\n    }\n\n    /**\n     * duplicate the current line\n     */\n    static changeTextDuplicate(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number\n    ): [FormattedText, number, number] {\n        if (t.len() === 0) {\n            return [t, nCaret, nEnd];\n        }\n\n        /* let's just duplicate the line where the caret is at */\n        let index = nCaret;\n        let lines = new UI512Lines(t);\n        let linenumbertoDupe = lines.indexToLineNumber(index);\n        let ln = lines.lns[linenumbertoDupe];\n        let lncopy = ln.clone();\n        if (ln.len() === 0) {\n            /* it's the last line and empty, just exit for simplicity */\n            return [t, nCaret, nEnd];\n        } else if (ln.charAt(ln.len() - 1) !== specialCharNumNewline) {\n            /* it's the last line, so add a \\n */\n            ln.push(specialCharNumNewline, ln.fontAt(ln.len() - 1));\n            ln.append(lncopy);\n        } else {\n            ln.append(lncopy);\n        }\n\n        return [lines.flatten(), index, index];\n    }\n\n    /**\n     * delete the current line\n     */\n    static changeTextDeleteLine(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number\n    ): [FormattedText, number, number] {\n        if (t.len() === 0) {\n            return [t, nCaret, nEnd];\n        }\n\n        let lines = new UI512Lines(t);\n        let lineNumber = lines.indexToLineNumber(nCaret);\n        assertTrue(lines.lns.length > 0, '2<|lines.lns is empty');\n        if (lineNumber >= lines.lns.length - 1) {\n            /* be careful, it's the last line */\n            lines.lns.splice(lineNumber, 1);\n            let tNew = lines.flatten();\n            return [tNew, tNew.len(), tNew.len()];\n        } else {\n            lines.lns.splice(lineNumber, 1);\n            let nextCaret = lines.lineNumberToIndex(lineNumber);\n            return [lines.flatten(), nextCaret, nextCaret];\n        }\n    }\n\n    /**\n     * for a single line, add or remove whitespace\n     */\n    static setIndentLevel(\n        t: FormattedText,\n        level: number,\n        preferTab: boolean,\n        defaultFont: string\n    ) {\n        let space = preferTab ? '\\t' : Util512.repeat(ScrollConsts.TabSize, ' ').join('');\n        /* 1) erase all current whitespace */\n        let countCharsToDelete = UI512Lines.getNonSpaceStartOfLine(t, true);\n        t.splice(0, countCharsToDelete);\n\n        /* 2) add spaces */\n        assertTrue(level >= 0, '2;|negative level');\n        let added = Util512.repeat(level, space).join('');\n        let tNew = TextSelModifyImpl.changeTextInsert(t, 0, 0, added, defaultFont)[0];\n        return tNew;\n    }\n\n    /**\n     * for one or more lines, add or remove whitespace\n     */\n    static changeTextIndentation(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        isLeft: boolean,\n        defaultFont: string\n    ): [FormattedText, number, number] {\n        if (t.len() === 0) {\n            return [t, nCaret, nEnd];\n        }\n\n        /* let's do a batch indent/dedent */\n        let cb = (line: FormattedText) => {\n            let level = UI512Lines.getIndentLevel(line);\n            level += isLeft ? -1 : 1;\n            level = Math.max(0, level);\n            let newline = TextSelModifyImpl.setIndentLevel(\n                line,\n                level,\n                true,\n                defaultFont\n            );\n            line.deleteAll();\n            line.append(newline);\n        };\n\n        return UI512Lines.alterSelectedLines(t, nCaret, nEnd, cb);\n    }\n\n    /**\n     * add or remove a prefix from any number of selected lines,\n     * e.g. hitting Cmd+Q to comment out lines\n     */\n    static changeTextToggleLinePrefix(\n        t: FormattedText,\n        nCaret: number,\n        nEnd: number,\n        prefix: string,\n        defaultFont: string\n    ): [FormattedText, number, number] {\n        assertTrue(\n            !prefix.startsWith(' ') &&\n                !prefix.startsWith('\\t') &&\n                !prefix.startsWith('\\n'),\n            `2:|we don't support prefix that starts with whitespace but got ${prefix}`\n        );\n\n        if (t.len() === 0) {\n            return [t, nCaret, nEnd];\n        }\n\n        let cb = (line: FormattedText) => {\n            let lineStart = UI512Lines.getNonSpaceStartOfLine(line, false);\n            let existingPrefix = line.toUnformattedSubstr(lineStart, prefix.length);\n            if (existingPrefix === prefix) {\n                /* prefix is there, remove it */\n                TextSelModifyImpl.changeTextDeleteSelection(\n                    line,\n                    lineStart,\n                    lineStart + prefix.length\n                );\n            } else {\n                /* no prefix, add it */\n                let tNew = TextSelModifyImpl.changeTextInsert(\n                    line,\n                    lineStart,\n                    lineStart,\n                    prefix,\n                    defaultFont\n                )[0];\n                line.deleteAll();\n                line.append(tNew);\n            }\n        };\n\n        return UI512Lines.alterSelectedLines(t, nCaret, nEnd, cb);\n    }\n\n    /**\n     * toggle block comment\n     */\n    static changeTextToggleBlockComment(\n        t: FormattedText,\n        nCaretRaw: number,\n        nEndRaw: number,\n        startChars: string,\n        endChars: string,\n        defaultFont: string\n    ): [FormattedText, number, number] {\n        if (t.len() === 0) {\n            return [t, nCaretRaw, nEndRaw];\n        }\n\n        let nCaret = Math.min(nCaretRaw, nEndRaw);\n        let nEnd = Math.max(nCaretRaw, nEndRaw);\n        nCaret = fitIntoInclusive(nCaret, 0, t.len() - 1);\n        nEnd = fitIntoInclusive(nEnd, 0, t.len() - 1);\n        let unformatted = t.toUnformattedSubstr(nCaret, nEnd - nCaret);\n        if (unformatted.startsWith(startChars) && unformatted.endsWith(endChars)) {\n            /* already commented. remove the comment */\n            t.splice(nEnd - endChars.length, endChars.length);\n            t.splice(nCaret, startChars.length);\n            return [t, nCaret, nEnd - (startChars.length + endChars.length)];\n        } else {\n            /* add the comment */\n            t = FormattedText.byInsertion(t, nEnd, 0, endChars, t.fontAt(nEnd));\n            t = FormattedText.byInsertion(t, nCaret, 0, startChars, t.fontAt(nCaret));\n            if (nCaret === nEnd) {\n                /* conveniently position the caret */\n                return [t, nCaret + startChars.length, nCaret + startChars.length];\n            } else {\n                /* leave it selected */\n                return [t, nCaret, nEnd + startChars.length + endChars.length];\n            }\n        }\n    }\n\n    /**\n     * move left or right in a text editor, with support for moving until next word boundary.\n     * returns the next caret position.\n     */\n    static getLeftRight(\n        t: FormattedText,\n        nCaret: number,\n        isLeft: boolean,\n        isUntilWord: boolean,\n        includeTrailingSpace: boolean\n    ) {\n        return GetCharClass.getLeftRight(\n            (i: number) => t.charAt(i),\n            t.len(),\n            nCaret,\n            isLeft,\n            isUntilWord,\n            includeTrailingSpace\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/util512.ts",
    "content": "\n/* auto */ import { O, tostring } from './util512Base';\n/* auto */ import { assertTrue, assertWarn, checkThrow512, ensureDefined, make512Error } from './util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * typescript utilities\n */\nexport const Util512 = /* static class */ {\n    /**\n     * checks for NaN and Infinity\n     */\n    isValidNumber(value: unknown) {\n        return typeof value === 'number' && Number.isFinite(value);\n    },\n\n    /**\n     * like Python's range()\n     */\n    range(start: number, end: O<number>, inc = 1) {\n        if (end === undefined || end === null) {\n            end = start;\n            start = 0;\n        }\n\n        if ((inc > 0 && start >= end) || (inc < 0 && start <= end)) {\n            return [];\n        }\n\n        let ret: number[] = [];\n        for (let i = start; inc > 0 ? i < end : i > end; i += inc) {\n            ret.push(i);\n        }\n\n        return ret;\n    },\n\n    /**\n     * like Python's [x] * y\n     */\n    repeat<T>(amount: number, item: T) {\n        let ret: T[] = [];\n        for (let i = 0; i < amount; i++) {\n            ret.push(item);\n        }\n\n        return ret;\n    },\n\n    /**\n     * sets an element, expands array if necessary\n     */\n    setarr<T>(ar: O<T>[], index: number, val: T, fill: T) {\n        assertTrue(index >= 0, 'Oy|must be >= 0');\n        if (index >= ar.length) {\n            for (let i = ar.length; i <= index; i++) {\n                ar.push(fill);\n            }\n        }\n\n        ar[index] = val;\n    },\n\n    /**\n     * as distinct from Array.concat which returns a new object\n     * don't use splice+apply, might run into issues with max-args-pased\n     */\n    extendArray<T>(ar: T[], added: T[]) {\n        for (let i = 0; i < added.length; i++) {\n            ar.push(added[i]);\n        }\n    },\n\n    /*\n     * plain parseInt allows trailing text\n     */\n    parseIntStrict(s: O<string>): O<number> {\n        if (!s) {\n            return undefined;\n        }\n\n        s = s.trim();\n        if (s.match(/^\\d+$/)) {\n            return this.parseInt(s);\n        } else {\n            return undefined;\n        }\n    },\n\n    /*\n     * use this, not parseInt where you might forget to specify base 10\n     */\n    parseInt(s: O<string>): O<number> {\n        let ret = 0;\n        if (s) {\n            /* ok to use, we remembered to say base 10 */\n            /* eslint-disable-next-line ban/ban */\n            ret = parseInt(s, 10);\n        } else {\n            ret = NaN;\n        }\n\n        return Number.isFinite(ret) ? ret : undefined;\n    },\n\n    /**\n     * ensure that the string is <= maxLen\n     */\n    truncateWithEllipsis(s: string, maxLen: number) {\n        if (s.length <= maxLen) {\n            return s;\n        } else {\n            const ellipsis = '...';\n            if (maxLen < ellipsis.length) {\n                return s.slice(0, maxLen);\n            } else {\n                return s.slice(0, maxLen - ellipsis.length) + ellipsis;\n            }\n        }\n    },\n\n    /**\n     * for unused-variable warnings\n     */\n    unused(...args: unknown[]) {},\n\n    /**\n     * useful for map/reduce\n     */\n    add(n1: number, n2: number) {\n        return n1 + n2;\n    },\n\n    /**\n     * is map empty\n     */\n    isMapEmpty<U>(map: { [key: string]: U }) {\n        for (let key in map) {\n            if (map.hasOwnProperty(key)) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    /**\n     * shallow clone of an object\n     */\n    shallowClone<T extends object>(o: object): T {\n        return Object.assign({}, o) as T;\n    },\n\n    /**\n     * freeze a property\n     */\n    freezeProperty(o: object, propName: string) {\n        Object.freeze(o[propName]);\n        Object.defineProperty(o, propName, { configurable: false, writable: false });\n    },\n\n    /**\n     * https://github.com/substack/deep-freeze\n     * public domain\n     */\n    freezeRecurse(o: object) {\n        Object.freeze(o);\n        for (let prop in o) {\n            if (\n                Object.prototype.hasOwnProperty.call(o, prop) &&\n                o[prop] !== null &&\n                o[prop] !== undefined &&\n                (typeof o[prop] === 'object' || typeof o[prop] === 'function') &&\n                !Object.isFrozen(o[prop])\n            ) {\n                Util512.freezeRecurse(o[prop]);\n            }\n        }\n    },\n\n    /**\n     * like Python's re.escape.\n     */\n    escapeForRegex(s: string) {\n        return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    },\n\n    /**\n     * make the first character uppercase.\n     */\n    capitalizeFirst(s: string) {\n        return s.substr(0, 1).toLocaleUpperCase() + s.substr(1);\n    },\n\n    /**\n     * instead of a switch() or a map string->function,\n     * use the class itself. (we'll need to tell js minifiers not to minify method names).\n     * example:\n     * class MyClass {\n     *      goAbc() {\n     *      }\n     * }\n     *\n     * let inst = new MyClass()\n     * let method = 'goAbc'\n     * callAsMethodOnClass(MyClass.name, inst, method, [], true)\n     */\n    callAsMethodOnClass(\n        clsname: string,\n        me: any,\n        s: string,\n        args: unknown[],\n        okIfNotExists: boolean,\n        returnIfNotExists = '',\n        okIfOnParentClass = false\n    ): unknown {\n        checkThrow512(\n            s.match(/^[a-zA-Z][0-9a-zA-Z_]+$/),\n            'K@|callAsMethodOnClass requires alphanumeric no spaces',\n            s\n        );\n\n        let method = me[s];\n        assertTrue(args === undefined || Array.isArray(args), '4I|args not an array');\n        if (method && typeof method === 'function') {\n            assertTrue(\n                okIfOnParentClass ||\n                    me.hasOwnProperty(s) ||\n                    me.__proto__.hasOwnProperty(s),\n                '4H|cannot use parent classes',\n                clsname,\n                s\n            );\n\n            assertTrue(args.length < 100, 'Ox|too many args', clsname, s);\n            return method.apply(me, args); /* warn-apply-ok */\n        } else if (okIfNotExists) {\n            return returnIfNotExists ? returnIfNotExists : undefined;\n        } else {\n            checkThrow512(false, `4G|callAsMethodOnClass ${clsname} could not find ${s}`);\n        }\n    },\n\n    /**\n     * for use with callAsMethodOnClass\n     */\n    isMethodOnClass(me: object, s: string) {\n        return me[s] !== undefined && typeof me[s] === 'function' ? me[s] : undefined;\n    },\n\n    /**\n     * returns list of keys.\n     */\n    getMapKeys(map: object): string[] {\n        let ret: string[] = [];\n        for (let key in map) {\n            if (Object.prototype.hasOwnProperty.call(map, key)) {\n                ret.push(key);\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * returns list of vals.\n     */\n    getMapVals<T>(map: { [key: string]: T }): T[] {\n        let ret: T[] = [];\n        for (let key in map) {\n            if (Object.prototype.hasOwnProperty.call(map, key)) {\n                ret.push(map[key]);\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * padStart, from reference implementation on mozilla.org\n     * from 1 to 001.\n     */\n    padStart(sIn: string | number, targetLength: number, padString: string) {\n        let s = tostring(sIn);\n        padString = typeof padString !== 'undefined' ? padString : ' ';\n        if (s.length > targetLength) {\n            return s;\n        } else {\n            targetLength = targetLength - s.length;\n            if (targetLength > padString.length) {\n                /* append to original to ensure we are longer than needed */\n                padString += padString.repeat(targetLength / padString.length);\n            }\n\n            return padString.slice(0, targetLength) + s;\n        }\n    },\n\n    /**\n     * to base64 with / and + characters\n     */\n    arrayToBase64(b: number[] | Uint8Array) {\n        let s = '';\n        for (let i = 0, len = b.length; i < len; i++) {\n            s += String.fromCharCode(b[i]);\n        }\n\n        return btoa(s);\n    },\n\n    /**\n     * to base64 with _ and - characters.\n     * note: strips off final = padding\n     */\n    toBase64UrlSafe(s: string) {\n        return btoa(s).replace(/\\//g, '_').replace(/\\+/g, '-').replace(/=+$/, '');\n    },\n\n    /**\n     * from base64 with _ and - characters.\n     * re-adds final = padding if needed.\n     */\n    fromBase64UrlSafe(s: string) {\n        if (s.length % 4 !== 0) {\n            s += '==='.slice(0, 4 - (s.length % 4));\n        }\n        return atob(s.replace(/_/g, '/').replace(/-/g, '+'));\n    },\n\n    /**\n     * split by character. decided not to use the\n     * Array.prototype.map.call trick.\n     */\n    stringToCharArray(s: string) {\n        let ar: string[] = [];\n        for (let i = 0; i < s.length; i++) {\n            ar.push(s[i]);\n        }\n\n        return ar;\n    },\n\n    /**\n     * split to bytes. decided not to use the\n     * Array.prototype.map.call trick.\n     */\n    stringToByteArray(s: string) {\n        let ar: number[] = [];\n        for (let i = 0; i < s.length; i++) {\n            ar.push(s.charCodeAt(i));\n        }\n\n        return ar;\n    },\n\n    /**\n     * javascript's default sort is dangerous because it's\n     * always a string sort, but we can use this for cases where\n     * we know we are sorting strings. our util512 sort is\n     * usually better though because it checks types at runtime.\n     */\n    sortStringArray(arr: string[]) {\n        /* eslint-disable-next-line @typescript-eslint/require-array-sort-compare */\n        arr.sort();\n    },\n\n    /**\n     * use the function to provide sort order\n     * like Python's sort(key=fn)\n     * often more efficient than passing a comparison function.\n     */\n    sortDecorated<T>(ar: T[], fn: (a: T) => unknown): T[] {\n        /* 1) decorate */\n        let decorated = ar.map(val => [fn(val), val] as [unknown, T]);\n        /* 2) sort */\n        decorated.sort((a, b) => util512Sort(a[0], b[0]));\n        /* 3) undecorate */\n        return decorated.map(val => val[1]);\n    },\n\n    /**\n     * normalize newlines to \\n\n     */\n    normalizeNewlines(s: string) {\n        return s.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n    },\n\n    /**\n     * filter a list, keeping only unique values.\n     */\n    keepOnlyUnique(ar: string[]) {\n        let ret: string[] = [];\n        let seen: { [key: string]: boolean } = {};\n        for (let i = 0; i < ar.length; i++) {\n            if (!seen[ar[i]]) {\n                seen[ar[i]] = true;\n                ret.push(ar[i]);\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * array that can be locked\n     */\n    LockableArr: class<T> {\n        protected vals: T[] = [];\n        protected locked = false;\n        constructor(vals: T[] = []) {\n            this.vals = vals;\n        }\n        lock() {\n            this.locked = true;\n        }\n        push(v: T) {\n            checkThrowEq512(false, this.locked, 'Ow|locked');\n            this.vals.push(v);\n        }\n        set(i: number, v: T) {\n            checkThrowEq512(false, this.locked, '4A|locked');\n            this.vals[i] = v;\n        }\n        len() {\n            return this.vals.length;\n        }\n        at(i: number) {\n            return this.vals[i];\n        }\n        getUnlockedCopy() {\n            let other = new Util512.LockableArr<T>();\n            other.locked = false;\n            other.vals = this.vals.slice(0);\n            return other;\n        }\n    }\n};\n\n/**\n * polyfill for String.includes, from http://developer.mozilla.org\n * /en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n */\nif (!String.prototype.includes) {\n    /* eslint-disable-next-line no-extend-native */\n    String.prototype.includes = function (search: string | RegExp, start?: number) {\n        if (search instanceof RegExp) {\n            throw TypeError('first argument must not be a RegExp');\n        }\n        if (start === undefined) {\n            start = 0;\n        }\n\n        /* eslint-disable-next-line @typescript-eslint/prefer-includes */\n        return this.indexOf(search, start) !== -1;\n    };\n}\n\n/**\n * polyfill for String.startsWith, from http://developer.mozilla.org\n * /en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\nif (!String.prototype.startsWith) {\n    /* eslint-disable-next-line no-extend-native */\n    Object.defineProperty(String.prototype, 'startsWith', {\n        value: function (search: string, rawPos: number) {\n            let pos = rawPos > 0 ? rawPos | 0 : 0;\n            return this.substring(pos, pos + search.length) === search;\n        }\n    });\n}\n\n/**\n * polyfill for String.endsWith, from https://developer.mozilla.org\n * /en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\n */\nif (!String.prototype.endsWith) {\n    /* eslint-disable-next-line no-extend-native */\n    String.prototype.endsWith = function (search: string, this_len?: number) {\n        if (this_len === undefined || this_len > this.length) {\n            this_len = this.length;\n        }\n        return this.substring(this_len - search.length, this_len) === search;\n    };\n}\n\n/**\n * holds a value. useful for out-parameters.\n */\nexport class ValHolder<T> {\n    constructor(public val: T) {}\n}\n\n/**\n * a plain JS object, can be null\n */\ntype AnyJsonInner =\n    | string\n    | number\n    | boolean\n    | null\n    | { [property: string]: AnyJsonInner }\n    | AnyJsonInner[];\n\n/**\n * indicates that the value is a plain JS object\n */\nexport type AnyJson = { [property: string]: AnyJsonInner } | AnyJsonInner[];\nexport type AnyUnshapedJson = any;\nexport type NoParameterCtor<T> = { new (): T };\nexport type AnyParameterCtor<T> = { new (...args: unknown[]): T };\n\n/**\n * by jcalz, stackoverflow\n */\nexport type TypeLikeAnEnum<E> = Record<keyof E, number | string> & {\n    [k: number]: string;\n};\n\n/**\n * list enum vals\n */\nexport function listEnumValsIncludingAlternates<T>(Enm: T) {\n    let ret: string[] = [];\n    for (let enumMember in Enm) {\n        /* show possible values */\n        if (\n            typeof enumMember === 'string' &&\n            !'0123456789'.includes(enumMember[0].toString())\n        ) {\n            let s = enumMember.toString();\n            if (s.startsWith('__AlternateForm__')) {\n                s = s.substr('__AlternateForm__'.length);\n            }\n\n            ret.push(s);\n        }\n    }\n\n    return ret;\n}\n\n/**\n * list enum vals\n */\nexport function listEnumVals<T>(Enm: T, makeLowercase: boolean) {\n    let s = '';\n    for (let enumMember in Enm) {\n        /* show possible values */\n        if (\n            typeof enumMember === 'string' &&\n            !enumMember.startsWith('__') &&\n            !enumMember.startsWith('__AlternateForm__') &&\n            !'0123456789'.includes(enumMember[0].toString())\n        ) {\n            s += ', ' + (makeLowercase ? enumMember.toLowerCase() : enumMember);\n        }\n    }\n\n    return s;\n}\n\n/**\n * string to enum.\n * accepts synonyms (\"alternate forms\") if enum contains __isUI512Enum\n */\nexport function findStrToEnum<T>(Enm: any, s: string): O<T> {\n    assertTrue(\n        Enm['__isUI512Enum'] !== undefined,\n        '4F|must provide an enum type with __isUI512Enum defined.'\n    );\n    if (s.startsWith('__')) {\n        return undefined;\n    } else if (s.startsWith('AlternateForm')) {\n        return undefined;\n    } else if (s.startsWith('__AlternateForm__')) {\n        return undefined;\n    } else {\n        if (Enm['__UI512EnumCapitalize'] !== undefined) {\n            s = Util512.capitalizeFirst(s);\n        }\n\n        let found = Enm[s];\n        if (found) {\n            return found;\n        } else {\n            return Enm['__AlternateForm__' + s];\n        }\n    }\n}\n\n/**\n * same as findStrToEnum, but throws if not found, showing possible values.\n */\nexport function getStrToEnum<T>(Enm: any, msgContext: string, s: string): T {\n    let found = findStrToEnum<T>(Enm, s);\n    if (found !== undefined) {\n        return found;\n    } else {\n        msgContext = msgContext\n            ? `Not a valid choice of ${msgContext}. `\n            : `Not a valid choice for this value. `;\n        if (Enm['__isUI512Enum'] !== undefined) {\n            let makeLowercase = Enm['__UI512EnumCapitalize'] !== undefined;\n            msgContext += 'try one of' + listEnumVals(Enm, makeLowercase);\n        }\n\n        checkThrow512(false, msgContext, '4E|');\n    }\n}\n\n/**\n * enum to string.\n * checks that the primary string is returned, not a synonym ('alternate form')\n */\nexport function findEnumToStr<E>(Enm: TypeLikeAnEnum<E>, n: number): O<string> {\n    assertTrue(\n        Enm['__isUI512Enum'] !== undefined,\n        '4D|must provide an enum type with __isUI512Enum defined.'\n    );\n\n    /* using e[n] would work, but it's fragile if enum implementation changes. */\n    for (let enumMember in Enm) {\n        if (\n            (Enm[enumMember] as unknown) === n &&\n            !enumMember.startsWith('__') &&\n            !enumMember.startsWith('__AlternateForm__')\n        ) {\n            let makeLowercase = Enm['__UI512EnumCapitalize'] !== undefined;\n            return makeLowercase\n                ? enumMember.toString().toLowerCase()\n                : enumMember.toString();\n        }\n    }\n\n    return undefined;\n}\n\n/**\n * findEnumToStr, but returns a fallback value.\n */\nexport function getEnumToStrOrFallback<E>(\n    Enm: TypeLikeAnEnum<E>,\n    n: number,\n    fallback = 'Unknown'\n): string {\n    return findEnumToStr(Enm, n) ?? fallback;\n}\n\n/**\n * length of a string, or 0 if null\n */\nexport function slength(s: string | null | undefined) {\n    return !s ? 0 : s.length;\n}\n\n/**\n * safe cast, throws if cast would fail.\n * ts inference lets us type simply\n * let myObj = cast(MyClass, o)\n\n * instanceof is a little slow, so at one point I used a\n * class Foo {\n *  isFoo = true\n * }\n * and could type check by doing (obj as Foo).isFoo,\n * but it looked clumsy, and didn't type-guard.\n */\nexport function cast<T>(\n    ctor: AnyParameterCtor<T>,\n    instance: unknown,\n    context?: string\n): T {\n    if (instance instanceof ctor) {\n        return instance;\n    }\n\n    checkThrow512(false, 'J7|type cast exception', context);\n}\n\n/**\n * safe cast, throws if cast would fail.\n */\nexport function castVerifyIsNum(instance: unknown, context?: string): number {\n    if (typeof instance === 'number') {\n        return instance;\n    }\n\n    throw make512Error('J7|type cast exception', context).clsAsErr();\n}\n\n/**\n * safe cast, throws if cast would fail.\n */\nexport function castVerifyIsStr(instance: unknown, context?: string): string {\n    if (typeof instance === 'string') {\n        return instance;\n    }\n\n    throw make512Error('J7|type cast exception', context).clsAsErr();\n}\n\n/**\n * fit n into the boundaries.\n */\nexport function fitIntoInclusive(n: number, min: number, max: number) {\n    n = Math.min(n, max);\n    n = Math.max(n, min);\n    return n;\n}\n\n/**\n * compare two objects.\n * confirms that types match.\n * works on arbitrarily nested array structures.\n * can be used in .sort() or just to compare values.\n */\nexport function util512Sort(a: unknown, b: unknown, silent?: boolean): number {\n    if (a === undefined && b === undefined) {\n        return 0;\n    } else if (a === null && b === null) {\n        return 0;\n    } else if (typeof a === 'string' && typeof b === 'string') {\n        return a < b ? -1 : a > b ? 1 : 0;\n    } else if (typeof a === 'number' && typeof b === 'number') {\n        return a < b ? -1 : a > b ? 1 : 0;\n    } else if (typeof a === 'boolean' && typeof b === 'boolean') {\n        return a < b ? -1 : a > b ? 1 : 0;\n    } else if (a instanceof Array && b instanceof Array) {\n        if (a.length < b.length) {\n            return -1;\n        }\n        if (a.length > b.length) {\n            return 1;\n        }\n        let howManyElementsToSort = a.length;\n        for (let i = 0; i < howManyElementsToSort; i++) {\n            let cmp = util512Sort(a[i], b[i]);\n            if (cmp !== 0) {\n                return cmp;\n            }\n        }\n        return 0;\n    } else {\n        if (silent) {\n            return 1;\n        } else {\n            checkThrow512(false, `4B|could not compare types ${a} and ${b}`);\n        }\n    }\n}\n\n/**\n * a map from string to object that preserves insertion order.\n * like Python's OrderedDict\n */\nexport class OrderedHash<TValue> {\n    protected keys: string[] = [];\n    protected vals: { [key: string]: TValue } = Object.create(null);\n\n    deleteAll() {\n        this.keys = [];\n        this.vals = Object.create(null);\n    }\n\n    insertNew(k: string, v: TValue) {\n        assertTrue(k !== null && k !== undefined, '48|invalid key');\n        assertTrue(v !== undefined, '47|invalid val');\n        assertTrue(this.vals[k] === undefined, `46|key ${k} already exists`);\n        this.keys.push(k);\n        this.vals[k] = v;\n    }\n\n    insertAt(k: string, v: TValue, n: number) {\n        assertTrue(k !== null && k !== undefined, '45|invalid key');\n        assertTrue(v !== undefined, '44|invalid val');\n        assertTrue(this.vals[k] === undefined, `43|key ${k} already exists`);\n        this.keys.splice(n, 0, k);\n        this.vals[k] = v;\n    }\n\n    getIndex(k: string) {\n        let ret = this.keys.indexOf(k);\n        assertTrue(ret !== -1, `42|could not find ${k}`);\n        return ret;\n    }\n\n    atIndex(n: number): O<TValue> {\n        if (n >= 0 && n < this.keys.length) {\n            return this.vals[this.keys[n]];\n        } else {\n            return undefined;\n        }\n    }\n\n    find(k: string): O<TValue> {\n        return this.vals[k];\n    }\n\n    get(k: string): TValue {\n        return ensureDefined(this.find(k), '41|could not find ', k);\n    }\n\n    delete(k: string): boolean {\n        assertTrue(k !== null && k !== undefined, '40|invalid key');\n        let index = this.keys.indexOf(k);\n        if (index !== -1) {\n            this.keys.splice(index, 1);\n            delete this.vals[k];\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    length() {\n        return this.keys.length;\n    }\n\n    *iterKeys() {\n        for (let i = 0, len = this.keys.length; i < len; i++) {\n            yield this.keys[i];\n        }\n    }\n\n    *iter() {\n        for (let i = 0, len = this.keys.length; i < len; i++) {\n            let key = this.keys[i];\n            yield this.vals[key];\n        }\n    }\n\n    *iterReversed() {\n        for (let i = this.keys.length - 1; i >= 0; i--) {\n            yield this.vals[this.keys[i]];\n        }\n    }\n}\n\n/**\n * dump ordered hash to a string\n */\nexport function orderedHashSummary<T>(hash: OrderedHash<T>) {\n    let ret = '';\n    for (let k of hash.iterKeys()) {\n        ret += k;\n        ret += ':';\n        ret += hash.get(k);\n        ret += '\\n';\n    }\n\n    return ret;\n}\n\n/**\n * map a key to object, does not allow setting a value twice.\n */\nexport class MapKeyToObject<T> {\n    protected objects: { [key: string]: T } = Object.create(null);\n    exists(key: string) {\n        return Object.prototype.hasOwnProperty.call(this.objects, key);\n    }\n\n    get(key: string) {\n        return ensureDefined(this.objects[key], '3_|id not found', key);\n    }\n\n    getOrFallback(key: string, fallback: T) {\n        let found = this.objects[key];\n        return found ?? fallback;\n    }\n\n    find(key: O<string>): O<T> {\n        if (key) {\n            return this.objects[key];\n        } else {\n            return undefined;\n        }\n    }\n\n    add(key: string, obj: T) {\n        assertTrue(slength(key) > 0, `3^|invalid id ${key}`);\n        checkThrow512(\n            this.objects[key] === undefined,\n            `3]|duplicate key, ${key} already exists`\n        );\n\n        this.objects[key] = obj;\n    }\n\n    freeze() {\n        Object.freeze(this.objects);\n    }\n\n    remove(key: string) {\n        delete this.objects[key];\n    }\n\n    getVals(): T[] {\n        return Util512.getMapVals(this.objects);\n    }\n\n    getKeys(): string[] {\n        return Util512.getMapKeys(this.objects);\n    }\n}\n\n/**\n * map a key to object, does allow setting a value twice.\n */\nexport class MapKeyToObjectCanSet<T> extends MapKeyToObject<T> {\n    set(key: string, obj: T) {\n        assertTrue(slength(key) > 0, `3[|invalid id ${key}`);\n        this.objects[key] = obj;\n    }\n}\n\n/**\n * a quick way to trigger assertion if value is not what was expected.\n * 'hard' assert, does not let execution continue.\n */\nexport function assertEq<T>(\n    expected: T,\n    got: unknown,\n    msg: string,\n    c1?: unknown,\n    c2?: unknown\n): asserts got is T {\n    if (expected !== got && util512Sort(expected, got, true) !== 0) {\n        let msgEq = ` expected '${expected}' but got '${got}'.`;\n        assertTrue(false, msg + msgEq, c1, c2);\n    }\n}\n\n/**\n * if expected and msg are not the same, assertWarn.\n */\nexport function assertWarnEq(\n    expected: unknown,\n    got: unknown,\n    msg: string,\n    c1?: unknown,\n    c2?: unknown\n) {\n    if (expected !== got && util512Sort(expected, got, true) !== 0) {\n        let msgEq = ` expected '${expected}' but got '${got}'.`;\n        assertWarn(false, msg + msgEq, c1, c2);\n    }\n}\n\n/**\n * a quick way to throw an expection if value is not what was expected.\n */\nexport function checkThrowEq512<T>(\n    expected: T,\n    got: unknown,\n    msg: string,\n    c1: unknown = '',\n    c2: unknown = ''\n): asserts got is T {\n    if (expected !== got && util512Sort(expected, got, true) !== 0) {\n        let msgEq = ` expected '${expected}' but got '${got}'.`;\n        checkThrow512(false, msg + msgEq, c1, c2);\n    }\n}\n\n/**\n * get last of an array\n */\nexport function arLast<T>(ar: T[]): T {\n    assertTrue(ar.length >= 1, 'Ou|empty array');\n    return ar[ar.length - 1];\n}\n\n/**\n * get last of an array, or undefined if array is empty\n */\nexport function lastIfThere<T>(ar: T[]): O<T> {\n    return ar ? ar[ar.length - 1] : undefined;\n}\n\n/**\n * conveniently write a long string\n */\nexport function longstr(s: string, newlinesBecome = ' ') {\n    s = s.replace(/\\s*(\\r\\n|\\n)\\s*/g, newlinesBecome);\n    return s.replace(/\\s*{{NEWLINE}}\\s*/g, '\\n');\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/util512Assert.ts",
    "content": "\n/* auto */ import { O, RingBufferLocalStorage, UI512Compress, bool, callDebuggerIfNotInProduction, tostring } from './util512Base';\n/* auto */ import { BridgedLZString } from './../../bridge/bridgeLzString';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * EXCEPTION HANDLING STRATEGY:\n *\n * We don't want any exception to be accidentally swallowed silently.\n * It's not enough to just put an alert in assertTrue,\n * because this won't cover base javascript errors like null-dereference.\n * It's important to show errors visibly so not to silently fall into\n * a bad state, and also we can log into local storage.\n * So, EVERY TOP OF THE CALL STACK must catch errors and send them to respondUI512Error\n * This includes:\n *          events from the browser (e.g. via golly)\n *              make sure they are wrapped in trycatch\n *          onload callbacks\n *              for images, json, server requests, dynamic script loading\n *              look for \"addEventListener\" and \"onload\"\n *              make sure they are wrapped in showMsgIfExceptionThrown\n *          setinterval and settimeout. use eslint ban / ban to stop them.\n *              use syncToAsyncAfterPause instead\n *          all async code\n *              use syncToAsyncTransition\n *          placeCallbackInQueue\n *              already ok because it's under the drawframe event.\n */\n\n/**\n * It's useful to distinguish between errors we've thrown\n * and generic javascript errors.\n *\n * Currently we use a plain Error object and expando our\n * own properties onto it. Works for everything except\n * instanceof, because it's not actually a different class.\n * If I wanted true custom Error objects I'd have to navigate\n * a lot of browser differences, see\n * https://github.com/bjyoungblood/es6-error\n */\nexport class Util512BaseErr {\n    typeName = 'Util512BaseErr';\n    protected constructor(public message: string, public level: string) {}\n\n    /**\n     * cast an Error instance to a Util512BaseErr, or return undefined\n     * if the Error isn't marked as that classs.\n     * we used to use isUtil512BaseErr, which supported inheritance,\n     * but this doesn't support inheritance now\n     */\n    static errIfExactCls<T extends Util512BaseErr>(nm: string, e: Error): O<T> {\n        if ((e as any).typeName === nm) {\n            return (e as any) as T;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * cast a class to an Error\n     */\n    clsAsErr() {\n        assertWarn((this as any).typeName, 'RW|');\n        assertWarn((this as any).message, 'RV|');\n        return (this as any) as Error;\n    }\n\n    /**\n     * take the information from another Error object\n     * and put it into the information in this object.\n     */\n    addErr(e: Error) {\n        (this as any).message += '\\n' + e.message;\n        (this as any).stack = e.stack;\n        (this as any).line = (e as any).line;\n        (this as any).sourceURL = (e as any).sourceURL;\n    }\n\n    /**\n     * create an Error instance that also acts like a\n     * Util512BaseErr instance (it isn't really, but because\n     * it has the same shape, it works fine)\n     */\n    static createErrorImpl<T extends Util512BaseErr>(\n        fnCtor: (...args: unknown[]) => T,\n        ...params: unknown[]\n    ): T {\n        let e = new Error();\n        let err = fnCtor(...params);\n        Object.assign(e, err);\n        let cls = (e as any) as T;\n        cls.clsAsErr = err.clsAsErr.bind(e);\n        cls.addErr = err.addErr.bind(e);\n        if (!UI512ErrorHandling.runningTests) {\n            callDebuggerIfNotInProduction(e.message);\n        }\n\n        return cls;\n    }\n\n    /**\n     * workaround because constructor is protected\n     */\n    protected static gen(message: string, level: string) {\n        return new Util512BaseErr(message, level);\n    }\n\n    /**\n     * create a Util512BaseErr (or at least something that acts like one)\n     */\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(Util512BaseErr.gen, ...params);\n    }\n}\n\n/**\n * a warning. execution can continue afterwards, but\n * we'll show a message to the user.\n */\nexport class Util512Warn extends Util512BaseErr {\n    typeName = 'Util512Warn';\n    protected static gen(message: string, level: string) {\n        return new Util512Warn(message, level);\n    }\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(Util512Warn.gen, ...params);\n    }\n}\n\n/**\n * just a message, not an error case.\n */\nexport class Util512Message extends Util512BaseErr {\n    typeName = 'Util512Message';\n    protected static gen(message: string, level: string) {\n        return new Util512Message(message, level);\n    }\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(Util512Message.gen, ...params);\n    }\n}\n\n/**\n * helper for making a Util512BaseErr, at any level\n */\nfunction makeUtil512BaseErrGeneric(\n    firstMsg: string,\n    level: string,\n    s1?: unknown,\n    s2?: unknown,\n    s3?: unknown\n) {\n    let msg = joinIntoMessage(firstMsg, level, s1, s2, s3);\n    return Util512BaseErr.createError(msg, level);\n}\n\n/**\n * make a Util512BaseErr\n */\nexport function make512Error(msg: string, s1?: unknown, s2?: unknown, s3?: unknown) {\n    return makeUtil512BaseErrGeneric(msg, 'ui512', s1, s2, s3);\n}\n\n/**\n * this is a hard assert that always throws.\n */\nexport function assertTrue(\n    condition: unknown,\n    s1: string,\n    s2?: unknown,\n    s3?: unknown\n): asserts condition {\n    if (!condition) {\n        if (!UI512ErrorHandling.silenceAssertMsgs) {\n            let msg = joinIntoMessage('assertTrue:', 'ui512', s1, s2, s3);\n            console.error(msg);\n            callDebuggerIfNotInProduction(msg);\n        }\n\n        throw make512Error('assert:', s1, s2, s3).clsAsErr();\n    }\n}\n\n/**\n * can be ignored/ignore all.\n * if proceeding with execution would be unsafe, use assertTrue instead\n */\nexport function assertWarn(condition: unknown, s1: string, s2?: unknown, s3?: unknown) {\n    if (!condition) {\n        if (UI512ErrorHandling.silenceAssertMsgs) {\n            /* we are in a assertAsserts test,\n            for testing convenience throw, we won't normally. */\n            throw new Error('assert:' + s1 + (s2 ?? '') + (s3 ?? ''));\n        }\n\n        let msg = joinIntoMessage('assert:', 'ui512', s1, s2, s3);\n        console.error(msg);\n        callDebuggerIfNotInProduction(msg);\n        if (!UI512ErrorHandling.silenceWarnings) {\n            /* we won't throw this error, but we'll make it\n            so we can save it + the callstack to logs */\n            let e = Util512Warn.createError(msg, 'ui512warn');\n            respondUI512Error(e.clsAsErr(), 'ui512warn');\n            if (UI512ErrorHandling.runningTests) {\n                let msgTotal = msg + ' Press Cancel to exit tests.';\n                if (!confirm(msgTotal)) {\n                    throw new Error('Exiting tests.');\n                }\n            } else {\n                let msgTotal = msg + ' Press OK to silence future asserts.';\n                if (confirm(msgTotal)) {\n                    UI512ErrorHandling.silenceWarnings = true;\n                }\n            }\n        }\n    }\n}\n\n/**\n * a quick way to throw if condition is false.\n * not the same as assert - an assert should only be\n * triggered for unexpected conditions.\n */\nexport function checkThrow512(\n    condition: unknown,\n    msg: string,\n    s1: unknown = '',\n    s2: unknown = ''\n): asserts condition {\n    if (!condition) {\n        throw make512Error(msg, s1, s2).clsAsErr();\n    }\n}\n\n/* see also: assertEq, assertWarnEq, checkThrowEq512 in util512.ts */\n\n/**\n * store logs. user can choose \"send err report\" to send us error context.\n */\nexport class UI512ErrorHandling {\n    static shouldRecordErrors = true;\n    static runningTests = false;\n    static silenceAssertMsgs = false;\n    static silenceWarnings = false;\n    static silenceWarningsAndMore = false;\n    static silenceWarningsAndMoreCount = 0;\n    static contextHint = '';\n    static readonly maxEntryLength = 512;\n    static readonly maxLinesKept = 256;\n    static store = new RingBufferLocalStorage(UI512ErrorHandling.maxLinesKept);\n\n    protected static encodeErrMsg(s: string) {\n        s = s.substr(0, UI512ErrorHandling.maxEntryLength);\n        return BridgedLZString() ? UI512Compress.compressString(s) : s;\n    }\n\n    protected static decodeErrMsg(compressed: string) {\n        assertTrue(BridgedLZString(), 'VA|lzstring not yet loaded');\n        return UI512Compress.decompressString(compressed);\n    }\n\n    static appendErrMsgToLogs(severity: boolean, s: string) {\n        if (UI512ErrorHandling.shouldRecordErrors) {\n            if (!UI512ErrorHandling.runningTests) {\n                let sseverity = severity ? '1' : '2';\n                let encoded = sseverity + UI512ErrorHandling.encodeErrMsg(s);\n                UI512ErrorHandling.store.append(encoded);\n            }\n        }\n    }\n\n    static getLatestErrLogs(amount: number): string[] {\n        return UI512ErrorHandling.store.retrieve(amount);\n    }\n}\n\n/**\n * I used to show a dialog in assertTrue, but that's not needed,\n * since we'll show a dialog in the respondtoui512. and by putting the\n * logging in just the response and not the error site, we won't have\n * unbounded recursion if there's an exception in the logging code.\n *\n * how to respond to exception:\n */\nexport function respondUI512Error(e: Error, context: string, logOnly = false) {\n    let message =\n        (e as any).typeName?.includes('Message') ||\n        /* bool */ (e as any).typeName?.includes('Msg');\n    let warn = (e as any).typeName?.includes('Warn');\n    let structure = bool((e as any).typeName);\n    callDebuggerIfNotInProduction(e.message);\n    if (message) {\n        /* not really an error, just a message */\n        if (logOnly) {\n            console.error(e.message);\n        } else {\n            window.alert(e.message);\n        }\n\n        return;\n    }\n\n    let sAllInfo = '';\n    if (e.message) {\n        sAllInfo += e.message;\n    }\n    if (e.stack) {\n        sAllInfo += '\\n\\n' + e.stack.toString();\n    }\n    if ((e as any).line) {\n        sAllInfo += '\\n\\n' + (e as any).line.toString();\n    }\n    if ((e as any).sourceURL) {\n        sAllInfo += '\\n\\n' + (e as any).sourceURL;\n    }\n    if (!structure && UI512ErrorHandling.contextHint) {\n        sAllInfo += ` ${UI512ErrorHandling.contextHint}`;\n    }\n    if (context) {\n        sAllInfo += ` (${context})`;\n    }\n\n    console.error(sAllInfo);\n    let severity = false;\n    if (!e.message || !e.message.includes('assertion failed')) {\n        severity = true;\n    }\n\n    if (UI512ErrorHandling.shouldRecordErrors && !UI512ErrorHandling.runningTests) {\n        UI512ErrorHandling.appendErrMsgToLogs(severity, sAllInfo);\n    }\n\n    /* let's always show at least some type of dialog,\n    unless user has explicitly silenced it. */\n    if (!(warn && UI512ErrorHandling.silenceWarnings)) {\n        UI512ErrorHandling.silenceWarningsAndMoreCount += 1;\n        if (logOnly || UI512ErrorHandling.silenceWarningsAndMore) {\n            /* do nothing, we've already logged it */\n        } else if (UI512ErrorHandling.silenceWarningsAndMoreCount > 4) {\n            /* unfortunately, we probably want an option like this,\n            otherwise if there's a steady stream of dialogs it will be bad */\n            let msgTotal =\n                sAllInfo +\n                ` -- we recommend that you save your` +\n                `work and refresh the website -- Press OK to silence future asserts`;\n            if (confirm(msgTotal)) {\n                UI512ErrorHandling.silenceWarningsAndMore = true;\n            }\n        } else {\n            window.alert(sAllInfo);\n        }\n    }\n}\n\n/**\n * combine strings, and move all 'markers' to the end\n */\nexport function joinIntoMessage(\n    c0: string,\n    level: string,\n    s1?: unknown,\n    s2?: unknown,\n    s3?: unknown\n) {\n    let markers: string[] = [];\n    c0 = findMarkers(c0, markers) ?? '';\n    s1 = findMarkers(s1, markers);\n    let message = level + ': ' + c0;\n    message += s1 ? '\\n' + s1 : '';\n    message += s2 ? ', ' + s2 : '';\n    message += s3 ? ', ' + s3 : '';\n    if (markers.length) {\n        message += ' (' + markers.join(',') + ')';\n    }\n\n    return message;\n}\n\n/**\n * we add two-digit markers to most asserts, so that if a bug report comes in,\n * we have more context about the site of failure.\n * assert markers are in the form xx|; this fn extracts them from a string.\n */\nfunction findMarkers(s: unknown, markers: string[]): O<string> {\n    if (s && typeof s === 'string' && s[2] === '|') {\n        markers.push(s.slice(0, 2));\n        return s.slice(3);\n    } else if (!s) {\n        return undefined;\n    } else {\n        return tostring(s);\n    }\n}\n\n/**\n * a way to safely go from optional<T> to T\n */\nexport function ensureDefined<T>(\n    v: T | null | undefined,\n    s1: string,\n    s2: unknown = '',\n    s3: unknown = ''\n): T {\n    if (v === undefined || v === null) {\n        let sTotal = 'not defined';\n        if (s1 !== '') {\n            sTotal += ', ' + s1;\n        }\n\n        if (s2 !== '') {\n            sTotal += ', ' + s2;\n        }\n\n        if (s3 !== '') {\n            sTotal += ', ' + s3;\n        }\n\n        throw make512Error(sTotal).clsAsErr();\n    } else {\n        return v;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/util512Base.ts",
    "content": "\n/* auto */ import { BridgedLZString } from './../../bridge/bridgeLzString';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * is it truthy? anything except false, 0, \"\", null, undefined, and NaN\n */\nexport function bool(x: unknown): boolean {\n    /* eslint-disable-next-line no-implicit-coercion */\n    return !!x;\n}\n\n/**\n * works as a typescript type assertion\n */\nexport function trueIfDefinedAndNotNull<T>(x: O<T>): x is T {\n    return bool(x);\n}\n\n/**\n * cast to string.\n * we used to have an isstring() check, but weird 'new String'\n * hybrid strings are rare and banned by es-lint\n */\nexport function tostring(s: unknown): string {\n    /* eslint-disable-next-line no-implicit-coercion */\n    return '' + s;\n}\n\n/**\n * retains the let a = b || c; behavior\n */\nexport function coalesceIfFalseLike<T>(instance: T | null | undefined, defaultval: T): T {\n    return instance ? instance : defaultval;\n}\n\n/**\n * this will not exist at runtime, the string is rewritten\n */\ndeclare const WEBPACK_PRODUCTION: boolean;\ndeclare const DBGPLACEHOLDER: boolean;\n\n/**\n * check if we are in a production build.\n */\nexport function checkIsProductionBuild(): boolean {\n    let ret = false;\n    try {\n        /* when webpack builds this file it will replace the string */\n        /* with `true` or `false` */\n        ret = WEBPACK_PRODUCTION;\n    } catch {\n        ret = false;\n    }\n\n    return ret;\n}\n\n/**\n * at build time, the string below\n * might be replaced with \"debugger\".\n * V8's perf can be affected if there's a debugger statement around,\n * so this makes sure it's not even there.\n */\nexport function callDebuggerIfNotInProduction(context?: string) {\n    window['DBG' + 'PLACEHOLDER'] = true;\n    /* eslint-disable-next-line no-unused-expressions */\n    DBGPLACEHOLDER;\n}\n\n/**\n * store the last <size> log entries, without needing to\n * move contents or allocate more memory.\n */\nexport abstract class RingBuffer {\n    constructor(protected size: number) {}\n\n    /**\n     * add log to buffer.\n     */\n    append(s: string) {\n        let ptrLatest = this.getLatestIndex();\n        ptrLatest = this.mod(ptrLatest + 1, this.size);\n        this.setAt(ptrLatest, s);\n        this.setLatestIndex(ptrLatest);\n    }\n\n    /**\n     * retrieve the latest entries.\n     */\n    retrieve(howMany: number) {\n        howMany = Math.min(howMany, this.size - 1);\n        let ptrLatest = this.getLatestIndex();\n        let ret: string[] = [];\n        for (let i = 0; i < howMany; i++) {\n            let index = this.mod(ptrLatest - i, this.size);\n            ret.push(this.getAt(index));\n        }\n\n        return ret;\n    }\n\n    /**\n     * more intuitive with negative numbers than the % operator\n     */\n    mod(a: number, n: number) {\n        return ((a % n) + n) % n;\n    }\n\n    abstract getAt(index: number): string;\n    abstract setAt(index: number, s: string): void;\n    abstract getLatestIndex(): number;\n    abstract setLatestIndex(index: number): void;\n}\n\n/**\n * use localstorage to store, so that logs persist when page is refreshed.\n * ui512LogPtr should be in local storage, we could be running in 2 browser windows.\n */\nexport class RingBufferLocalStorage extends RingBuffer {\n    getAt(index: number): string {\n        if (window.localStorage) {\n            return window.localStorage['ui512Log_' + index] ?? '';\n        } else {\n            return '';\n        }\n    }\n\n    setAt(index: number, s: string) {\n        if (window.localStorage) {\n            window.localStorage['ui512Log_' + index] = s;\n        }\n    }\n\n    getLatestIndex() {\n        if (window.localStorage) {\n            let sLatest = window.localStorage['ui512LogPtr'] ?? '0';\n\n            /* ok to use here, we remembered to say base 10 */\n            /* eslint-disable-next-line ban/ban */\n            let ptrLatest = parseInt(sLatest, 10);\n            return Number.isFinite(ptrLatest) ? ptrLatest : 0;\n        } else {\n            return 0;\n        }\n    }\n\n    setLatestIndex(index: number) {\n        if (window.localStorage) {\n            window.localStorage['ui512LogPtr'] = index.toString();\n        }\n    }\n}\n\n/**\n * change these as appropriate for your product\n */\nexport const cProductName = 'ViperCard';\nexport const cAltProductName = 'HyperCard';\nexport const vpcVersion = '00002061';\nexport const vpcWebsite = 'https://www.vipercard.net/0.3/';\nexport const vpcWebsitePart = '/0.3/';\n\n/**\n * a short way to say optional<T>.\n * prefer O<string> over ?string, I find it easier to read and reason about.\n */\nexport type O<T> = T | undefined;\n\n/**\n * LZString uses the fact that JS strings have 16 bit chars to compress data succinctly.\n * I use compressToUTF16() instead of compress() to use only valid utf sequences.\n */\nexport class UI512Compress {\n    protected static stringEscapeNewline = '##Newline##';\n    protected static reEscapeNewline = new RegExp(UI512Compress.stringEscapeNewline, 'g');\n    protected static reNewline = /\\n/g;\n    static compressString(s: string): string {\n        let compressed = BridgedLZString().compressToUTF16(s);\n        return compressed;\n    }\n\n    static decompressString(s: string): string {\n        return BridgedLZString().decompressFromUTF16(s) ?? '';\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/util512Higher.ts",
    "content": "\n/* auto */ import { O } from './util512Base';\n/* auto */ import { assertTrue, assertWarn, checkThrow512, respondUI512Error } from './util512Assert';\n/* auto */ import { AnyUnshapedJson, Util512, arLast, assertEq, fitIntoInclusive } from './util512';\n/* auto */ import { BowserBrowsers, BowserOS, BowserPlatform, bridgedGetAllBrowserInfo } from './../../bridge/bridgeBrowserInfo';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * typescript utilities\n * contains utilities like RNG that aren't as straightforward to test.\n */\nexport class Util512Higher {\n    /**\n     * weakUuid, by broofa\n     * uses the weak Math.random, not cryptographically sound.\n     */\n    static weakUuid() {\n        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n            let r = (Math.random() * 16) | 0;\n            let v = c === 'x' ? r : (r & 0x3) | 0x8;\n            return v.toString(16);\n        });\n    }\n\n    /**\n     * random number between min and max, inclusive\n     * uses the weak Math.random, don't use this for crypto.\n     * slightly an uneven distribution.\n     */\n    static getRandIntInclusiveWeak(min: number, max: number) {\n        assertTrue(min >= 1 && max >= 1, `4M|invalid min ${min}`);\n        if (min === max) {\n            return min;\n        } else {\n            min = Math.ceil(min);\n            max = Math.floor(max);\n            return Math.floor(Math.random() * (max - min + 1)) + min;\n        }\n    }\n\n    /**\n     * random number between min and max, inclusive\n     */\n    static getRandIntInclusiveStrong(min: number, max: number) {\n        assertTrue(min >= 1 && max >= 1, 'O)|getRandIntInclusiveStrong must be >= 1');\n        min = Math.ceil(min);\n        max = Math.floor(max);\n        let nRange = max - min;\n        assertTrue(\n            nRange > 1 && nRange < 255,\n            'O(|getRandIntInclusiveStrong too wide range'\n        );\n        let nextPowerOf2 = 1;\n        while (nextPowerOf2 < nRange) {\n            nextPowerOf2 *= 2;\n        }\n\n        /* use rejection sampling. slower, but better for uniform values */\n        let buf = new Uint8Array(8);\n        while (true) {\n            window.crypto.getRandomValues(buf);\n            for (let i = 0; i < buf.length; i++) {\n                assertTrue(buf[i] >= 0 && buf[i] < 256, 'O&|out of range');\n                let v = buf[i] % nextPowerOf2;\n                if (v <= nRange) {\n                    return min + v;\n                }\n            }\n        }\n    }\n\n    /**\n     * make random bytes, return as base64.\n     */\n    static makeCryptRandString(bytes: number) {\n        let buf = new Uint8Array(bytes);\n        window.crypto.getRandomValues(buf);\n        return Util512.arrayToBase64(Array.from(buf));\n    }\n\n    /**\n     * generate random string, first byte is specified\n     */\n    static generateUniqueBase64UrlSafe(nBytes: number, charPrefix: string) {\n        assertEq(1, charPrefix.length, 'O%|expected one char');\n        let buf = new Uint8Array(nBytes + 1);\n        window.crypto.getRandomValues(buf);\n        buf[0] = charPrefix.charCodeAt(0);\n        let dataAsString = Array.from(buf)\n            .map(item => String.fromCharCode(item))\n            .join('');\n        return Util512.toBase64UrlSafe(dataAsString);\n    }\n\n    /**\n     * download image asynchronously\n     */\n    static beginLoadImage(url: string, img: HTMLImageElement, callback: () => void) {\n        let haveRunCallback = false;\n        let on_load = () => {\n            if (!haveRunCallback) {\n                haveRunCallback = true;\n                callback();\n            }\n        };\n\n        let on_error = () => {\n            throw new Error('failed to load ' + url);\n        };\n\n        img.addEventListener('load', () =>\n            showMsgIfExceptionThrown(on_load, 'LoadImage.on_load')\n        );\n        img.addEventListener('error', () =>\n            showMsgIfExceptionThrown(on_error, 'LoadImage.on_error')\n        );\n        img.src = url;\n        if (img.complete) {\n            /* apparently it might be possible for .complete to be set\n            immediately in some cases */\n            showMsgIfExceptionThrown(() => {\n                haveRunCallback = true;\n                callback();\n            }, 'LoadImage.on_load');\n        }\n    }\n\n    /**\n     * download json asynchronously. see vpcrequest.ts if sending parameters.\n     */\n    private static loadJsonImpl(\n        url: string,\n        req: XMLHttpRequest,\n        callback: (s: string) => void,\n        callbackOnErr: (n: number) => void\n    ) {\n        req.overrideMimeType('application/json');\n        req.open('GET', url, true);\n        let on_load = () => {\n            if (req.status >= 200 && req.status <= 299) {\n                callback(req.responseText);\n            } else {\n                callbackOnErr(req.status);\n            }\n        };\n\n        let on_error = () => {\n            callbackOnErr(-1);\n        };\n\n        req.addEventListener('load', () =>\n            showMsgIfExceptionThrown(on_load, 'loadJson.on_load')\n        );\n        req.addEventListener('error', () =>\n            showMsgIfExceptionThrown(on_error, 'loadJson.on_error')\n        );\n        req.send();\n    }\n\n    /**\n     * download json asynchronously, and return string.\n     */\n    static asyncLoadJsonString(url: string): Promise<string> {\n        return new Promise((resolve, reject) => {\n            let req = new XMLHttpRequest();\n            Util512Higher.loadJsonImpl(\n                url,\n                req,\n                s => {\n                    resolve(s);\n                },\n                n => {\n                    reject(new Error(`failed to load ${url}, status=${n}`));\n                }\n            );\n        });\n    }\n\n    /**\n     * download json asynchronously, and return parsed js object.\n     */\n    static async asyncLoadJson(url: string): Promise<AnyUnshapedJson> {\n        let s = await Util512Higher.asyncLoadJsonString(url);\n        return JSON.parse(s);\n    }\n\n    /**\n     * load and run script. must be on same domain.\n     */\n    static scriptsAlreadyLoaded: { [key: string]: boolean } = {};\n    static asyncLoadJsIfNotAlreadyLoaded(url: string): Promise<void> {\n        return new Promise((resolve, reject) => {\n            assertTrue(url.startsWith('/'), 'J8|');\n            if (Util512Higher.scriptsAlreadyLoaded[url]) {\n                resolve();\n                return;\n            }\n\n            let script = window.document.createElement('script');\n            script.setAttribute('src', url);\n\n            /* prevents cb from being called twice */\n            let cbCalled = false;\n            let on_error = () => {\n                if (!cbCalled) {\n                    cbCalled = true;\n                    let urlsplit = url.split('/');\n                    reject(new Error('Did not load ' + arLast(urlsplit)));\n                }\n            };\n\n            let on_load = () => {\n                if (!cbCalled) {\n                    cbCalled = true;\n                    Util512Higher.scriptsAlreadyLoaded[url] = true;\n                    resolve();\n                }\n            };\n\n            script.addEventListener('load', () =>\n                showMsgIfExceptionThrown(on_load, 'LoadJs.on_load')\n            );\n            script.addEventListener('error', () =>\n                showMsgIfExceptionThrown(on_error, 'LoadJs.on_error')\n            );\n            /* if you need to support old browsers, use onreadystatechange */\n            window.document.getElementsByTagName('head')[0].appendChild(script);\n        });\n    }\n\n    /**\n     * all code that goes from sync to async *must* use this method\n     * so that errors can be shown, otherwise they might be invisible.\n     */\n    static syncToAsyncTransition<T>(\n        fn: Promise<T>,\n        context: string,\n        rtype: RespondToErr\n    ) {\n        fn.then(\n            () => {\n                /* fulfilled with no exceptions */\n            },\n            (err: Error) => {\n                respondUI512Error(err, context, rtype === RespondToErr.ConsoleErrOnly);\n            }\n        );\n    }\n\n    /**\n     * essentially a replacement for timeout.\n     */\n    static syncToAsyncAfterPause<T>(\n        fn: () => unknown,\n        nMilliseconds: number,\n        context: string,\n        rtype: RespondToErr\n    ) {\n        let asyncf = async () => {\n            await Util512Higher.sleep(nMilliseconds);\n            fn();\n        };\n\n        Util512Higher.syncToAsyncTransition(asyncf(), context, rtype);\n    }\n\n    /**\n     * call this in an async function: await sleep(1000) to wait one second.\n     */\n    static sleep(ms: number) {\n        return new Promise<void>(resolve => {\n            /* it's ok to use an old-style promise, we're not going from sync to async */\n            /* eslint-disable-next-line ban/ban */\n            setTimeout(resolve, ms);\n        });\n    }\n\n    /**\n     * rejects if operation takes too long.\n     * if I threw an exception to reject from within fTimeout, I'd have to\n            1) add state to ensure the timeout was cleared and\n            2) use a try/finally in case fn throws exceptions\n        I think my approach is simpler.\n     */\n    static async runAsyncWithTimeout<T>(fn: Promise<T>, ms: number): Promise<T> {\n        class SentinelClass {}\n        let fTimeout = async () => {\n            await Util512Higher.sleep(ms);\n            return new SentinelClass();\n        };\n\n        let ps = [fn, fTimeout()];\n        let ret = await Promise.race(ps);\n        if (ret instanceof SentinelClass) {\n            checkThrow512(false, 'RX|Timed out.');\n        } else {\n            return ret;\n        }\n    }\n\n    /**\n     * takes at least ms seconds.\n     */\n    static async runAsyncWithMinimumTime<T>(fn: Promise<T>, ms: number): Promise<T> {\n        let fTimeout = async (): Promise<any> => {\n            return Util512Higher.sleep(ms);\n        };\n\n        let ps = [fn, fTimeout()];\n        let ret = await Promise.all(ps);\n        return ret[0];\n    }\n\n    /**\n     * get date as month day hh mm\n     */\n    static getdatestring(includeSeconds = false) {\n        let d = new Date();\n        let hours = d.getHours();\n        if (hours > 12) {\n            hours -= 12;\n        } else if (hours === 0) {\n            hours = 12;\n        }\n\n        let sc = includeSeconds ? '-' + ('0' + d.getSeconds()).slice(-2) : '';\n        return (\n            `${d.getMonth() + 1} ${d.getDate()}, ` +\n            ('0' + hours).slice(-2) +\n            '-' +\n            ('0' + d.getMinutes()).slice(-2) +\n            sc\n        );\n    }\n}\n\n/**\n * by default, alert on every exception\n */\nexport enum RespondToErr {\n    __isUI512Enum = 1,\n    Alert,\n    ConsoleErrOnly\n}\n\n/**\n * if an error is thrown, show a message\n */\nexport function showMsgIfExceptionThrown(fn: () => void, context: string) {\n    try {\n        fn();\n        return true;\n    } catch (e) {\n        respondUI512Error(e, context);\n        return e as Error;\n    }\n}\n\n/**\n * if an error is thrown, show a warning message just in the console\n */\nexport function justConsoleMsgIfExceptionThrown(fn: () => void, context: string) {\n    try {\n        fn();\n        return true;\n    } catch (e) {\n        respondUI512Error(e, context, true);\n        return e as Error;\n    }\n}\n\n/**\n * easier-to-read type aliases\n */\nexport type VoidFn = () => void;\nexport type AsyncVoidFn = () => Promise<void>;\nexport type AsyncFn = () => Promise<unknown>;\n\n/**\n * used to intentionally free memory\n */\nexport function SetToInvalidObjectAtEndOfExecution<T>(_useToGetType: T): T {\n    return (undefined as any) as T;\n}\n\n/**\n * root (top-level) object\n */\nexport interface UI512IsDrawTextInterface {}\nexport interface UI512IsDrawIconInterface {}\nexport interface UI512IsSessionInterface {}\nexport interface UI512IsPresenterInterface {}\nexport interface UI512IsEventInterface {}\nexport interface Root {\n    invalidateAll(): void;\n    getDrawText(): UI512IsDrawTextInterface;\n    getDrawIcon(): UI512IsDrawIconInterface;\n    getSession(): O<UI512IsSessionInterface>;\n    setSession(session: O<UI512IsSessionInterface>): void;\n    setTimerRate(s: string): void;\n    sendEvent(evt: UI512IsEventInterface): void;\n    replaceCurrentPresenter(pr: O<UI512IsPresenterInterface>): void;\n    runTests(all: boolean): void;\n}\n\n/**\n * get top-level object\n */\nlet rootHolder: Root[] = [];\nexport function getRoot(): Root {\n    assertWarn(rootHolder[0], 'J6|root not yet set.');\n    return rootHolder[0];\n}\n\n/**\n * set top-level object\n */\nexport function setRoot(r: Root) {\n    rootHolder[0] = r;\n}\n\n/**\n * currently just the detected OS\n */\nexport enum BrowserOSInfo {\n    __isUI512Enum = 1,\n    Unknown,\n    Windows,\n    Linux,\n    Mac\n}\n\n/**\n * stores browser/platform information\n */\nexport class BrowserInfo {\n    os = BrowserOSInfo.Unknown;\n    bowserOs = BowserOS.unknown;\n    browser = BowserBrowsers.unknown;\n    platform = BowserPlatform.unknown;\n    static cached: O<BrowserInfo>;\n    static get() {\n        if (!BrowserInfo.cached) {\n            BrowserInfo.cached = new BrowserInfo();\n        }\n\n        return BrowserInfo.cached;\n    }\n\n    /**\n     * use the bowser library to get information\n     */\n    constructor(nav?: string) {\n        nav = nav ?? window.navigator.userAgent;\n        try {\n            let [br, os, platform] = bridgedGetAllBrowserInfo(nav);\n            this.browser = br;\n            this.bowserOs = os;\n            this.platform = platform;\n            if (os === BowserOS.windows) {\n                this.os = BrowserOSInfo.Windows;\n            } else if (os === BowserOS.macos || os === BowserOS.ios) {\n                this.os = BrowserOSInfo.Mac;\n            } else if (os === BowserOS.linux) {\n                this.os = BrowserOSInfo.Linux;\n            }\n        } catch (e) {\n            console.error(e);\n        }\n    }\n}\n\n/**\n * can be used to build a periodic timer.\n */\nexport class RepeatingManualTimer {\n    periodInMilliseconds = 0;\n    lasttimeseen = 0;\n    started = 0;\n    constructor(periodInMilliseconds: number) {\n        this.periodInMilliseconds = periodInMilliseconds;\n    }\n\n    update(ms: number) {\n        this.lasttimeseen = ms;\n    }\n\n    isDue(): boolean {\n        return this.lasttimeseen - this.started > this.periodInMilliseconds;\n    }\n\n    reset() {\n        this.started = this.lasttimeseen;\n    }\n}\n\n/**\n * just a flag indicating that the operation is complete.\n */\nexport class RenderComplete {\n    complete = true;\n    and(other: RenderComplete) {\n        this.complete = this.complete && other.complete;\n    }\n\n    andB(other: boolean) {\n        this.complete = this.complete && other;\n    }\n}\n\n/**\n * can be used to build a periodic timer.\n */\nexport class RepeatingTimer {\n    periodInMilliseconds = 0;\n    lasttimeseen = 0;\n    started = 0;\n    constructor(periodInMilliseconds: number) {\n        this.periodInMilliseconds = periodInMilliseconds;\n    }\n\n    update(ms: number) {\n        this.lasttimeseen = ms;\n    }\n\n    isDue(): boolean {\n        return this.lasttimeseen - this.started > this.periodInMilliseconds;\n    }\n\n    reset() {\n        this.started = this.lasttimeseen;\n    }\n}\n\n/**\n * CharClassify\n *\n * Permission to use, copy, modify, and distribute this software and its\n * documentation for all purposes and without fee is hereby granted,\n * provided that the above copyright notice appear in all copies and that\n * both that copyright notice and this permission notice appear in\n * supporting documentation.\n * Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n * Ported from C++ to TypeScript by Ben Fisher, 2017\n */\nexport enum CharClass {\n    __isUI512Enum = 1,\n    Space,\n    NewLine,\n    Word,\n    Punctuation\n}\n\n/**\n * Porting SciTE's logic for typing move-to-next-word and move-to-prev-word.\n */\nexport class GetCharClass {\n    static readonly a = 'a'.charCodeAt(0);\n    static readonly z = 'z'.charCodeAt(0);\n    static readonly A = 'A'.charCodeAt(0);\n    static readonly Z = 'Z'.charCodeAt(0);\n    static readonly n0 = '0'.charCodeAt(0);\n    static readonly n9 = '9'.charCodeAt(0);\n    static readonly hash = '#'.charCodeAt(0);\n    static readonly under = '_'.charCodeAt(0);\n    static readonly dash = '-'.charCodeAt(0);\n    static readonly nl = '\\n'.charCodeAt(0);\n    static readonly cr = '\\r'.charCodeAt(0);\n    static readonly space = ' '.charCodeAt(0);\n    static readonly nonbreakingspace = '\\xCA'.charCodeAt(0);\n\n    /**\n     * classify a character as word or whitespace\n     */\n    static get(c: number) {\n        if (c === GetCharClass.cr || c === GetCharClass.nl) {\n            return CharClass.NewLine;\n        } else if (\n            c < 0x20 ||\n            c === GetCharClass.space ||\n            c === GetCharClass.nonbreakingspace\n        ) {\n            return CharClass.Space;\n        } else if (\n            (c >= 0x80 && c <= 0xff) ||\n            (c >= GetCharClass.a && c <= GetCharClass.z) ||\n            (c >= GetCharClass.A && c <= GetCharClass.Z) ||\n            (c >= GetCharClass.n0 && c <= GetCharClass.n9) ||\n            c === GetCharClass.hash ||\n            c === GetCharClass.under ||\n            c === GetCharClass.dash\n        ) {\n            return CharClass.Word;\n        } else if (c <= 0xff) {\n            return CharClass.Punctuation;\n        } else {\n            /* let's choose to treat all unicode non-ascii as word. */\n            return CharClass.Word;\n        }\n    }\n\n    /**\n     * move left or right in the text editor...\n     * charCodeAt gets the character code at an index in the string\n     * len is the length of the string\n     * n is current index (caret position) in the string\n     * isLeft is true if moving left, false if moving right\n     * isUntilWord means to keep moving until word boundary is seen.\n     * returns the next caret position.\n     */\n    static getLeftRight(\n        charCodeAt: (pos: number) => number,\n        len: number,\n        n: number,\n        isLeft: boolean,\n        isUntilWord: boolean,\n        includeTrailingSpace: boolean\n    ) {\n        if (len === 0) {\n            return n;\n        }\n\n        if (isUntilWord && isLeft) {\n            if (includeTrailingSpace) {\n                while (n > 0 && GetCharClass.get(charCodeAt(n - 1)) === CharClass.Space) {\n                    n--;\n                }\n            }\n\n            if (n > 0) {\n                let classStart = GetCharClass.get(charCodeAt(n - 1));\n                while (n > 0 && GetCharClass.get(charCodeAt(n - 1)) === classStart) {\n                    n--;\n                }\n            }\n        } else if (isUntilWord && !isLeft) {\n            if (n === len) {\n                n -= 1;\n            }\n\n            let classStart = GetCharClass.get(charCodeAt(n));\n            while (n < len && GetCharClass.get(charCodeAt(n)) === classStart) {\n                n++;\n            }\n\n            if (includeTrailingSpace) {\n                while (n < len && GetCharClass.get(charCodeAt(n)) === CharClass.Space) {\n                    n++;\n                }\n            }\n        } else {\n            n += isLeft ? -1 : 1;\n        }\n\n        return fitIntoInclusive(n, 0, len);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/util512Serialize.ts",
    "content": "\n/* auto */ import { checkThrow512 } from './util512Assert';\n/* auto */ import { NoParameterCtor, Util512 } from './util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the MIT license */\n\n/**\n * serialize and deserialize simple structures.\n *\n * use optional_ to indicate an optional field.\n * fields beginning with \"__\" will be skipped.\n * unknown incoming fields are skipped silently.\n */\nexport const Util512SerializableHelpers = /* static class */ {\n    /**\n     * serialize a typescript object to a plain json map of strings to strings\n     */\n    serializeObj<T extends IsUtil512Serializable>(obj: T) {\n        checkThrow512(obj.__isUtil512Serializable, 'Rg|must be a isUtil512Serializable');\n        let objToSend: { [key: string]: unknown } = {};\n        for (let prop in obj) {\n            if (this.shouldSerializeProperty(obj, prop)) {\n                let isOpt = prop.startsWith('optional_');\n                if (isOpt) {\n                    checkThrow512(\n                        obj[prop] === undefined ||\n                            obj[prop] === null ||\n                            typeof obj[prop] === 'string',\n                        'Rf|we currently only support strings'\n                    );\n                    let propDest = prop.slice('optional_'.length);\n                    if (typeof obj[prop] === 'string') {\n                        objToSend[propDest] = obj[prop];\n                    }\n                } else {\n                    checkThrow512(\n                        typeof obj[prop] === 'string',\n                        'Re|we currently only support strings'\n                    );\n                    objToSend[prop] = obj[prop];\n                }\n            }\n        }\n\n        return objToSend;\n    },\n\n    /**\n     * helper that calls stringify for you\n     */\n    serializeToJson<T extends IsUtil512Serializable>(obj: T) {\n        return JSON.stringify(this.serializeObj(obj));\n    },\n\n    /**\n     * goes from a plain json map of string-of-strings\n     * to instance of a typescript class\n     */\n    deserializeObj<T extends IsUtil512Serializable>(\n        ctor: NoParameterCtor<T>,\n        incoming: IsUtil512Serializable\n    ): T {\n        let objNew = new ctor();\n        checkThrow512(\n            objNew.__isUtil512Serializable,\n            'Rd|must be a isUtil512Serializable'\n        );\n        let prop = '';\n        for (prop in objNew) {\n            if (this.shouldSerializeProperty(objNew, prop)) {\n                let isOpt = prop.startsWith('optional_');\n                if (isOpt) {\n                    checkThrow512(\n                        objNew[prop] === undefined ||\n                            objNew[prop] === null ||\n                            typeof objNew[prop] === 'string',\n                        'Rc|we currently only support strings'\n                    );\n                    let propSrc = prop.slice('optional_'.length);\n                    checkThrow512(\n                        typeof incoming[propSrc] === 'string' ||\n                            incoming[propSrc] === null ||\n                            incoming[propSrc] === undefined,\n                        `Rb|field ${prop} is not a string`\n                    );\n                    objNew[prop] =\n                        incoming[propSrc] === null ? undefined : incoming[propSrc];\n                } else {\n                    checkThrow512(\n                        typeof objNew[prop] === 'string',\n                        'Ra|we currently only support strings'\n                    );\n                    checkThrow512(\n                        incoming[prop] !== undefined,\n                        `RZ|did not see required field ${prop}`\n                    );\n                    checkThrow512(\n                        typeof incoming[prop] === 'string',\n                        `RY|field ${prop} not a string, only support strings`\n                    );\n                    objNew[prop] = incoming[prop];\n                }\n            }\n        }\n\n        return objNew;\n    },\n\n    /**\n     * like deserializeObj, but with less validation\n     */\n    deserializeObjLoose<T extends IsUtil512Serializable>(\n        ctor: NoParameterCtor<T>,\n        incoming: IsUtil512Serializable\n    ): T {\n        let objNew = new ctor();\n        let prop = '';\n        for (prop in objNew) {\n            if (\n                this.shouldSerializeProperty(objNew, prop) &&\n                !prop.startsWith('optional_')\n            ) {\n                //~ let onGot = incoming[prop];\n                //~ checkThrow512(onGot !== null && onGot !== undefined, 'VB|');\n                //~ objNew[prop] = incoming[prop]\n            }\n        }\n\n        incoming['__isUtil512Serializable'] = true;\n        return incoming as T;\n    },\n\n    /**\n     * helper that cals json parse for you\n     */\n    deserializeFromJson<T extends IsUtil512Serializable>(\n        ctor: NoParameterCtor<T>,\n        s: string\n    ): T {\n        return this.deserializeObj(ctor, JSON.parse(s));\n    },\n\n    /**\n     * is this something like toString() that's everywhere?\n     * another approach is checking hasOwnProperty,\n     * but we do want to see parent classes\n     */\n    isAPropertyOnAllObjects(prop: string) {\n        return prop in new Object();\n    },\n\n    /**\n     * we'll skip methods, Object properties, and props starting with __\n     */\n    shouldSerializeProperty(obj: { [key: string]: any }, prop: string) {\n        return (\n            !this.isAPropertyOnAllObjects(prop) &&\n            !prop.startsWith('__') &&\n            typeof obj[prop] !== 'function'\n        );\n    }\n};\n\n/**\n * essentially just a signal that this class can be serialized\n */\nexport abstract class IsUtil512Serializable {\n    __isUtil512Serializable = true;\n\n    /**\n     * get a shallow clone of the object\n     */\n    static getClone<T extends object>(me: IsUtil512Serializable): T {\n        return Util512.shallowClone(me);\n    }\n\n    /**\n     * get only the keys that should be serialized\n     */\n    static getKeys(me: IsUtil512Serializable) {\n        return Util512.getMapKeys(me).filter(k =>\n            Util512SerializableHelpers.shouldSerializeProperty(me, k)\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/utilsCanvasDraw.ts",
    "content": "\n/* auto */ import { O } from './util512Base';\n/* auto */ import { assertTrue } from './util512Assert';\n/* auto */ import { Util512 } from './util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * wrap a canvas element.\n */\nexport class CanvasWrapper {\n    canvas: HTMLCanvasElement;\n    context: CanvasRenderingContext2D;\n    constructor(canvas: O<HTMLCanvasElement>) {\n        if (canvas) {\n            let context = canvas.getContext('2d');\n            assertTrue(context, '3=|could not create 2d context');\n            this.canvas = canvas;\n            this.context = context;\n            let contextSetParams = this.context as any; /* browser compat */\n\n            /* we want sharp, aliased, non-smoothed graphics */\n            contextSetParams.imageSmoothingEnabled = false; /* standard */\n            contextSetParams.mozImageSmoothingEnabled = false; /* Firefox */\n            contextSetParams.oImageSmoothingEnabled = false; /* Opera */\n            contextSetParams.webkitImageSmoothingEnabled = false; /* Safari */\n            contextSetParams.msImageSmoothingEnabled = false; /* IE */\n        }\n    }\n\n    /**\n     * create, but don't add to DOM. very useful for bg rendering.\n     */\n    static createMemoryCanvas(width: number, height: number) {\n        let hiddenCanvasDom = window.document.createElement('canvas');\n        hiddenCanvasDom.width = width;\n        hiddenCanvasDom.height = height;\n        let a = new CanvasWrapper(hiddenCanvasDom);\n        a.fillRectUnchecked(0, 0, a.canvas.width, a.canvas.height, 'white');\n        return a;\n    }\n\n    /**\n     * set pixel, ignored if out of bounds\n     */\n    fillPixelUnchecked(x: number, y: number, fillStyle: string) {\n        return this.fillRectUnchecked(x, y, 1, 1, fillStyle);\n    }\n\n    /**\n     * set pixel, asserts if out of bounds\n     */\n    fillPixel(\n        x: number,\n        y: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number,\n        fillStyle: string,\n        assertWithin?: boolean\n    ) {\n        if (x >= boxX0 && x < boxX0 + boxW && y >= boxY0 && y < boxY0 + boxH) {\n            this.context.fillStyle = fillStyle;\n            this.context.fillRect(x, y, 1, 1);\n            return true;\n        } else {\n            assertTrue(!assertWithin, '3<|drawing out of bounds');\n            return false;\n        }\n    }\n\n    /**\n     * fill rectangle, ignored if out of bounds\n     */\n    fillRectUnchecked(\n        x0: number,\n        y0: number,\n        width: number,\n        height: number,\n        fillStyle: string\n    ) {\n        assertTrue(width >= 0, '3;|invalid width ' + width.toString());\n        assertTrue(height >= 0, '3:|invalid height ' + height.toString());\n        assertTrue(\n            Util512.isValidNumber(x0) &&\n                Util512.isValidNumber(y0) &&\n                Util512.isValidNumber(width) &&\n                Util512.isValidNumber(height),\n            '3/|dimensions must be numeric'\n        );\n\n        /* to visualize bugs with unnecessary redraws, use random colors in this mode */\n        if (CanvasWrapper.debugRenderingWithChangingColors && fillStyle !== 'white') {\n            let r = Math.trunc(Math.random() * 200);\n            let g = Math.trunc(Math.random() * 200);\n            let b = Math.trunc(Math.random() * 200);\n            fillStyle = `rgb(${r},${g},${b})`;\n        }\n\n        this.context.fillStyle = fillStyle;\n        this.context.fillRect(x0, y0, width, height);\n    }\n\n    /**\n     * fill rectangle.\n     * the \"box\" is the region of the canvas we are allowed to write to,\n     * any writes outside of this region will be clipped\n     */\n    fillRect(\n        x0: number,\n        y0: number,\n        width: number,\n        height: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number,\n        fillStyle: string,\n        assertWithin?: boolean\n    ) {\n        let rectClipped = RectUtils.getRectClipped(\n            x0,\n            y0,\n            width,\n            height,\n            boxX0,\n            boxY0,\n            boxW,\n            boxH\n        );\n        if (assertWithin) {\n            assertTrue(\n                rectClipped[0] === x0 &&\n                    rectClipped[1] === y0 &&\n                    rectClipped[2] === width &&\n                    rectClipped[3] === height,\n                '3.|not within'\n            );\n        }\n\n        this.fillRectUnchecked(\n            rectClipped[0],\n            rectClipped[1],\n            rectClipped[2],\n            rectClipped[3],\n            fillStyle\n        );\n        return rectClipped;\n    }\n\n    /**\n     * rectangle outline.\n     */\n    outlineRect(\n        x0: number,\n        y0: number,\n        width: number,\n        height: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number,\n        fillStyle: string\n    ) {\n        this.fillRect(x0, y0, width, 1, boxX0, boxY0, boxW, boxH, fillStyle);\n        this.fillRect(x0, y0 + height, width, 1, boxX0, boxY0, boxW, boxH, fillStyle);\n        this.fillRect(x0, y0, 1, height, boxX0, boxY0, boxW, boxH, fillStyle);\n        this.fillRect(x0 + width, y0, 1, height, boxX0, boxY0, boxW, boxH, fillStyle);\n    }\n\n    /**\n     * invert colors in a rectangle.\n     * it's so nice to have globalCompositeOperations\n     */\n    protected invertColorsRectUnchecked(\n        x0: number,\n        y0: number,\n        width: number,\n        height: number\n    ) {\n        assertTrue(width >= 0, '3-|invalid width ' + width.toString());\n        assertTrue(height >= 0, '3,|invalid height ' + height.toString());\n        assertTrue(\n            Util512.isValidNumber(x0) &&\n                Util512.isValidNumber(y0) &&\n                Util512.isValidNumber(width) &&\n                Util512.isValidNumber(height),\n            '3+|dimensions must be numeric'\n        );\n\n        if (CanvasWrapper.debugRenderingWithChangingColors && Math.random() > 0.75) {\n            this.fillRectUnchecked(x0, y0, width, height, 'black');\n        } else {\n            this.context.globalCompositeOperation = 'difference';\n            this.context.fillStyle = 'white';\n            this.context.fillRect(x0, y0, width, height);\n            this.context.globalCompositeOperation = 'source-over';\n        }\n    }\n\n    /**\n     * invert colors in a rectangle.\n     * the \"box\" is the region of the canvas we are allowed to write to,\n     * any writes outside of this region will be clipped\n     */\n    invertColorsRect(\n        x0: number,\n        y0: number,\n        width: number,\n        height: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number,\n        assertWithin?: boolean\n    ) {\n        let rectClipped = RectUtils.getRectClipped(\n            x0,\n            y0,\n            width,\n            height,\n            boxX0,\n            boxY0,\n            boxW,\n            boxH\n        );\n        if (assertWithin) {\n            assertTrue(\n                rectClipped[0] === x0 &&\n                    rectClipped[1] === y0 &&\n                    rectClipped[2] === width &&\n                    rectClipped[3] === height,\n                '3*|not within'\n            );\n        }\n\n        this.invertColorsRectUnchecked(\n            rectClipped[0],\n            rectClipped[1],\n            rectClipped[2],\n            rectClipped[3]\n        );\n        return rectClipped;\n    }\n\n    /**\n     * draw an image, or a piece of another canvas, onto the canvas\n     */\n    protected drawFromImageUnchecked(\n        img: DrawableImage,\n        srcX: number,\n        srcY: number,\n        srcWidth: number,\n        srcHeight: number,\n        destX: number,\n        destY: number\n    ) {\n        assertTrue(srcWidth >= 0, '3)|invalid sWidth ' + srcWidth.toString());\n        assertTrue(srcHeight >= 0, '3(|invalid height ' + srcHeight.toString());\n        assertTrue(\n            Util512.isValidNumber(srcX) &&\n                Util512.isValidNumber(srcY) &&\n                Util512.isValidNumber(srcWidth) &&\n                Util512.isValidNumber(srcHeight) &&\n                Util512.isValidNumber(destX) &&\n                Util512.isValidNumber(destY),\n            '3&|dimensions must be numeric'\n        );\n\n        if (CanvasWrapper.debugRenderingWithChangingColors && Math.random() > 0.8) {\n            this.fillRectUnchecked(destX, destY, srcWidth, srcHeight, 'black');\n        } else {\n            this.context.drawImage(\n                img,\n                srcX,\n                srcY,\n                srcWidth,\n                srcHeight,\n                destX,\n                destY,\n                srcWidth,\n                srcHeight\n            );\n        }\n    }\n\n    /**\n     * draw an image, or a piece of another canvas, onto the canvas\n     * the \"box\" is the region of the canvas we are allowed to write to,\n     * any writes outside of this region will be clipped\n     */\n    drawFromImage(\n        img: DrawableImage,\n        srcX: number,\n        srcY: number,\n        width: number,\n        height: number,\n        destX: number,\n        destY: number,\n        boxX: number,\n        boxY: number,\n        boxW: number,\n        boxH: number\n    ) {\n        let rectClipped = RectUtils.getRectClipped(\n            destX,\n            destY,\n            width,\n            height,\n            boxX,\n            boxY,\n            boxW,\n            boxH\n        );\n        if (rectClipped[2] === 0 || rectClipped[3] === 0) {\n            return [destX, destY, 0, 0];\n        } else {\n            srcX += rectClipped[0] - destX;\n            srcY += rectClipped[1] - destY;\n            this.drawFromImageUnchecked(\n                img,\n                srcX,\n                srcY,\n                rectClipped[2],\n                rectClipped[3],\n                rectClipped[0],\n                rectClipped[1]\n            );\n            return rectClipped;\n        }\n    }\n\n    /**\n     * draw image centered in the box.\n     */\n    drawFromImageCentered(\n        img: DrawableImage,\n        sx: number,\n        sy: number,\n        width: number,\n        height: number,\n        adjustx: number,\n        adjusty: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number\n    ) {\n        const destx0 = boxX0 + Math.trunc((boxW - width) / 2) + adjustx;\n        const desty0 = boxY0 + Math.trunc((boxH - height) / 2) + adjusty;\n        return this.drawFromImage(\n            img,\n            sx,\n            sy,\n            width,\n            height,\n            destx0,\n            desty0,\n            boxX0,\n            boxY0,\n            boxW,\n            boxH\n        );\n    }\n\n    /**\n     * use a try/finally block to ensure that the mode is reset,\n     * even if an exception is thrown.\n     */\n    temporarilyChangeCompositeMode(s: string, fn: () => void) {\n        try {\n            this.context.globalCompositeOperation = s;\n            fn();\n        } finally {\n            this.context.globalCompositeOperation = 'source-over';\n        }\n    }\n\n    /**\n     * clear everything on the canvas. note that transparent != white.\n     */\n    clear() {\n        this.resetTransform();\n        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n    }\n\n    /**\n     * resizing a canvas implicitly clears all contents, so name method likewise\n     */\n    resizeAndClear(newWidth: number, newHeight: number) {\n        assertTrue(newWidth >= 0, '3%|invalid newWidth ' + newWidth.toString());\n        assertTrue(newHeight >= 0, '3$|invalid newHeight ' + newHeight.toString());\n        this.canvas.width = newWidth;\n        this.canvas.height = newHeight;\n    }\n\n    /**\n     * reset any current scaling/transformations\n     */\n    resetTransform() {\n        this.context.setTransform(1, 0, 0, 1, 0, 0);\n    }\n\n    /**\n     * use this mode to visually see where redrawing is occurring,\n     * if a region is rapidly flickering rainbow colors, there is a bug\n     * causing extra re-draws.\n     */\n    static debugRenderingWithChangingColors = false;\n    static setDebugRenderingWithChangingColors(b: boolean) {\n        this.debugRenderingWithChangingColors = b;\n    }\n}\n\n/**\n * math on rectangles\n */\nexport class RectUtils {\n    /**\n     * return a rectangle that is the intersection of the rectangles.\n     */\n    static getRectClipped(\n        x0: number,\n        y0: number,\n        w: number,\n        h: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number\n    ) {\n        const x1 = x0 + w;\n        const y1 = y0 + h;\n        const boxX1 = boxX0 + boxW;\n        const boxY1 = boxY0 + boxH;\n        let newX0;\n        let newY0;\n        let newX1;\n        let newY1;\n        let newW;\n        let newH;\n        if (x0 >= boxX1 || y0 >= boxY1) {\n            /* it's way outside on the right or bottom */\n            newX0 = boxX0;\n            newY0 = boxY0;\n            newW = 0;\n            newH = 0;\n        } else if (x1 < boxX0 || y1 < boxY0) {\n            /* it's way outside on the left or top */\n            newX0 = boxX0;\n            newY0 = boxY0;\n            newW = 0;\n            newH = 0;\n        } else {\n            /* it's at least partially overlapping */\n            newX0 = x0 >= boxX0 ? x0 : boxX0;\n            newY0 = y0 >= boxY0 ? y0 : boxY0;\n            newX1 = x1 <= boxX1 ? x1 : boxX1;\n            newY1 = y1 <= boxY1 ? y1 : boxY1;\n            newW = newX1 - newX0;\n            newH = newY1 - newY0;\n        }\n\n        assertTrue(\n            w >= 0 &&\n                h >= 0 &&\n                newW <= w &&\n                newH <= h &&\n                newX0 >= boxX0 &&\n                newX0 + newW <= boxX0 + boxW &&\n                newY0 >= boxY0 &&\n                newY0 + newH <= boxY0 + boxH,\n            '3>|dimensions must be numeric'\n        );\n\n        return [newX0, newY0, newW, newH];\n    }\n\n    /**\n     * same as getRectClipped, but just return the type of overlap rather\n     * than resulting rectangle.\n     */\n    static getOverlap(\n        x0: number,\n        y0: number,\n        w: number,\n        h: number,\n        boxX0: number,\n        boxY0: number,\n        _unused_boxW: number,\n        _unused_boxH: number,\n        boxX1: number,\n        boxY1: number\n    ): RectOverlapType {\n        const x1 = x0 + w;\n        const y1 = y0 + h;\n        if (x0 >= boxX1 || y0 >= boxY1) {\n            /* it's way outside on the right or bottom */\n            return RectOverlapType.NoOverlap;\n        } else if (x1 < boxX0 || y1 < boxY0) {\n            /* it's way outside on the left or top */\n            return RectOverlapType.NoOverlap;\n        } else if (x0 >= boxX0 && x1 <= boxX1 && y0 >= boxY0 && y1 <= boxY1) {\n            return RectOverlapType.BoxCompletelyCovers;\n        } else if (boxX0 >= x0 && boxX1 <= x1 && boxY0 >= y0 && boxY1 <= y1) {\n            return RectOverlapType.BoxCompletelyWithin;\n        } else {\n            return RectOverlapType.PartialOverlap;\n        }\n    }\n\n    /**\n     * is point within rectangle.\n     */\n    static hasPoint(\n        x: number,\n        y: number,\n        boxX0: number,\n        boxY0: number,\n        boxW: number,\n        boxH: number\n    ) {\n        return x >= boxX0 && x < boxX0 + boxW && y >= boxY0 && y < boxY0 + boxH;\n    }\n\n    /**\n     * shrink a rectangle by a defined amount of padding, and keep it centered.\n     */\n    static getSubRectRaw(\n        x: number,\n        y: number,\n        w: number,\n        h: number,\n        padX: number,\n        padY: number\n    ) {\n        if (w > padX * 2 && h > padY * 2) {\n            /* prettier-ignore */\n            return [x + padX, y + padY, w - (padX * 2), h - (padY * 2)];\n        } else {\n            return undefined;\n        }\n    }\n}\n\n/**\n * either of these can be drawn onto a canvas\n */\nexport type DrawableImage = HTMLCanvasElement | HTMLImageElement;\n\n/**\n * for determining overlap between two rectangles\n */\nexport enum RectOverlapType {\n    __isUI512Enum = 1,\n    NoOverlap,\n    PartialOverlap,\n    BoxCompletelyCovers,\n    BoxCompletelyWithin\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/utilsCursors.ts",
    "content": "\n/* auto */ import { CanvasWrapper } from './utilsCanvasDraw';\n/* auto */ import { getRoot } from './util512Higher';\n/* auto */ import { cast } from './util512';\n/* auto */ import { UI512IconManager } from './../draw/ui512DrawIconManager';\n/* auto */ import { IconInfo } from './../draw/ui512DrawIconClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * NEW CURSOR IMPLEMENTATION\n * We used to use css to specify a cursor, e.g.\n * el.style.cursor = \"url('browse.png') 3 3, auto\"\n * the problem is that if window.devicePixelRatio != 1,\n * chrome showed the cursor as BLURRY+GLITCHED.\n *\n * The border between white and transparent gains a small\n * gray line for some reason -- it makes no sense. and even\n * if that were solved, it would look blurry.\n * cursors are blurry. due to windows @ 1.25 scaling.\n *    tried adjusting browser zoom\n *    tried setting browser bg to white\n *    tried making it only 95% transparent\n *    tried not pnggauntlet\n *    tried using a .cur not a .png file\n *    tried on a simple page with no canvas\n * I then tried faking a cursor with a <img> moved around by javascript\n *      Pros: simpler code\n *      Pros: can still show the arrow cursor in the black margins, looks nicer\n *      Cons: doesn't look right when page scrolls\n *          (our page never scrolls, enforce with body {position:fixed})\n *      Cons: slightly blurry since it shows at 125% and css-scales to 80%\n *          might get even more blurry as screenmult increases\n *      complication:\n *          the <img> will eat the mousemove events and the cursor gets stuck.\n *          a simple workaround is to OFFSET the <img> and real cursor position\n *          you don't notice, the real cursor is hidden and we can compensate in all clicks\n *      problem: will all corners of the screen be clickable?\n *      problem: on touch devices the offset will mess with where you tap!\n * It would be possible to work around these problems, but let's do this instead:\n * Just draw the cursor on the canvas like everything else\n *      Pros: enables better emulation (original product has cursors that invert)\n *      Pros: never blurry, and we get arbitrary screenmult for free\n *      Cons: has to maintain a graphics buffer or it would be slow\n *\n * Other ppl hitting the same issue:\n * https://stackoverflow.com/questions/35561547/svg-mouse-cursor-blurry-on-retina-display\n * https://jsfiddle.net/jhhbrook/ucuLefut/\n *\n * Another big downside of drawing the cursor manually:\n *      When javascript is busy, the cursor is stuck.\n *      For example, commiting a drawn spraypaint to the card takes a few hundred milliseconds,\n *      and that delay is noticeable when it causes the cursor to stick.\n *      even worse, if you're running a script that takes a long time,\n *      the cursor is really laggy.\n *      so I've decided to\n *          1) use drawn cursors as often as possible\n *          2) use css cursors for potentially long operations (painting)\n *          3) for the css cursors, try not to have any white-to-transparent borders,\n *              which is one of the main reasons it looked bad (caused a gray line)\n *\n *      If I know the scale is 125%, should I use an 80% cursor to compensate?\n *      Prob not because a) still stretched, fewer pixels\n *          b) devicePixelRatio could be one of 3 things:\n *              os scaling to 125%, browser scaling, or Retina setting it to 2\n *             since I don't know which, hard to know the right approach.\n */\n\n/**\n * assign a number to cursor\n * must correlate with canvas.classCursor in style.css\n */\nexport enum UI512Cursors {\n    __isUI512Enum = -1,\n    /* manually drawn cursors\n    advantage: looks better */\n    /* order here should match order in 0cursors1.png */\n    drawn_lbeam = 1,\n    drawn_cross,\n    drawn_plus,\n    drawn_watch,\n    drawn_hand,\n    drawn_arrow,\n    drawn_busy,\n    drawn_unknown,\n    drawn_paintbrush,\n    drawn_painterase,\n    drawn_paintlasso,\n    drawn_paintpencil,\n    drawn_paintrectsel,\n    drawn_paintspray,\n    drawn_paintbucket,\n    drawn_busy2,\n    drawn_busy3,\n    drawn_busy4,\n\n    /* css cursors\n    advantage: still move even when JS is running heavy */\n    css_hand,\n    css_paintbrush,\n    css_paintpencil,\n    css_cross,\n    css_painterase,\n    css_paintspray,\n    css_watch,\n    css_busy,\n    css_busy2,\n    css_busy3,\n    css_busy4,\n\n    /* what is currently chosen */\n    lbeam = drawn_lbeam,\n    cross = css_cross,\n    plus = drawn_plus,\n    watch = css_watch,\n    hand = css_hand,\n    arrow = drawn_arrow,\n    busy = css_busy,\n    busy2 = css_busy2,\n    busy3 = css_busy3,\n    busy4 = css_busy4,\n    unknown = drawn_unknown,\n    paintbrush = css_paintbrush,\n    painterase = drawn_painterase /* use drawn, otherwise size might not match */,\n    paintlasso = drawn_paintlasso,\n    paintpencil = css_paintpencil,\n    paintrectsel = drawn_paintrectsel,\n    paintspray = css_paintspray,\n    paintbucket = drawn_paintbucket,\n    __AlternateForm__none = arrow\n}\n\n/**\n * x, y offset indicating the active pixel of the cursor\n */\nconst hotCoords = [[0, 0] /* placeholder */];\nhotCoords[UI512Cursors.drawn_lbeam] = [3, 7];\nhotCoords[UI512Cursors.drawn_cross] = [7, 7];\nhotCoords[UI512Cursors.drawn_plus] = [7, 7];\nhotCoords[UI512Cursors.drawn_watch] = [7, 7];\nhotCoords[UI512Cursors.drawn_hand] = [6, 0];\nhotCoords[UI512Cursors.drawn_arrow] = [3, 1];\nhotCoords[UI512Cursors.drawn_busy] = [7, 7];\nhotCoords[UI512Cursors.drawn_unknown] = [3, 1];\nhotCoords[UI512Cursors.drawn_paintbrush] = [5, 14];\nhotCoords[UI512Cursors.drawn_painterase] = [7, 7];\nhotCoords[UI512Cursors.drawn_paintlasso] = [2, 13];\nhotCoords[UI512Cursors.drawn_paintpencil] = [1, 15];\nhotCoords[UI512Cursors.drawn_paintrectsel] = [7, 7];\nhotCoords[UI512Cursors.drawn_paintspray] = [2, 2];\nhotCoords[UI512Cursors.drawn_paintbucket] = [14, 14];\nhotCoords[UI512Cursors.drawn_busy2] = [7, 7];\nhotCoords[UI512Cursors.drawn_busy3] = [7, 7];\nhotCoords[UI512Cursors.drawn_busy4] = [7, 7];\nhotCoords[UI512Cursors.css_cross] = [7, 7];\nhotCoords[UI512Cursors.css_watch] = [7, 7];\nhotCoords[UI512Cursors.css_hand] = [6, 0];\nhotCoords[UI512Cursors.css_busy] = [7, 7];\nhotCoords[UI512Cursors.css_paintbrush] = [5, 14];\nhotCoords[UI512Cursors.css_painterase] = [7, 7];\nhotCoords[UI512Cursors.css_paintpencil] = [1, 15];\nhotCoords[UI512Cursors.css_paintspray] = [2, 2];\nhotCoords[UI512Cursors.css_busy2] = [7, 7];\nhotCoords[UI512Cursors.css_busy3] = [7, 7];\nhotCoords[UI512Cursors.css_busy4] = [7, 7];\n\n/* cross is slightly different in\nthe css version,\npart of what makes the css cursors look terrible\nis that the white-to-transparent transition becomes\na faint gray line. so add no white pixels\nin the css version */\nconst cssCursorFilenames: { [key: number]: string } = {};\ncssCursorFilenames[UI512Cursors.css_paintbrush] = 'brush5,14.png';\ncssCursorFilenames[UI512Cursors.css_cross] = 'cross7,7.png';\ncssCursorFilenames[UI512Cursors.css_painterase] = 'erase7,7.png';\ncssCursorFilenames[UI512Cursors.css_hand] = 'hand6,0.png';\ncssCursorFilenames[UI512Cursors.css_paintpencil] = 'pencil1,15.png';\ncssCursorFilenames[UI512Cursors.css_paintspray] = 'spray2,2.png';\ncssCursorFilenames[UI512Cursors.css_busy] = 'xtrabusya7,7.png';\ncssCursorFilenames[UI512Cursors.css_busy2] = 'xtrabusyb7,7.png';\ncssCursorFilenames[UI512Cursors.css_busy3] = 'xtrabusyc7,7.png';\ncssCursorFilenames[UI512Cursors.css_busy4] = 'xtrabusyd7,7.png';\ncssCursorFilenames[UI512Cursors.css_watch] = 'xtrawatch7,7.png';\n\nconst cssCursorFallbacks: { [key: number]: string } = {};\ncssCursorFallbacks[UI512Cursors.css_hand] = 'pointer';\ncssCursorFallbacks[UI512Cursors.css_watch] = 'progress';\ncssCursorFallbacks[UI512Cursors.css_busy] = 'wait';\ncssCursorFallbacks[UI512Cursors.css_busy2] = 'wait';\ncssCursorFallbacks[UI512Cursors.css_busy3] = 'wait';\ncssCursorFallbacks[UI512Cursors.css_busy4] = 'wait';\ncssCursorFallbacks[UI512Cursors.css_cross] = 'crosshair';\n\n/**\n * certain cursors are neither black nor white,\n * they are the opposite of the underlying content.\n * in the original product, the paintbucket cursor\n * has pixels of both normal and inverted type,\n * but it's barely noticeable and not worth\n * the effort to implement.\n */\nconst isInvert: { [key: number]: boolean } = {};\nisInvert[UI512Cursors.drawn_lbeam] = true;\nisInvert[UI512Cursors.drawn_paintrectsel] = true;\nisInvert[UI512Cursors.drawn_paintlasso] = true;\nisInvert[UI512Cursors.drawn_cross] = true;\n\n/**\n * hide cursor when it leaves our canvas, otherwise it looks stuck.\n */\nconst enum Constants {\n    HideCursorWhenThisCloseToLeft = 40,\n    HideCursorWhenThisCloseToTop = 40,\n    HideCursorWhenThisCloseToRight = 5,\n    HideCursorWhenThisCloseToBottom = 5\n}\n\n/**\n * cache the current cursor so that repeated calls to setCursor\n * won't have any effect on performance\n */\nexport class UI512CursorAccess {\n    protected static currentCursor = UI512Cursors.unknown;\n    protected static currentMx = 0;\n    protected static currentMy = 0;\n    protected static lastDrawnMx = -1;\n    protected static lastDrawnMy = -1;\n    protected static lastDrawnCur = -1;\n    protected static currentHotX = 0;\n    protected static currentHotY = 0;\n    protected static wasCursorLoaded = false;\n    protected static curInfo = new IconInfo('0cursors1', UI512Cursors.arrow);\n    protected static multForCssCursor = 1;\n\n    /**\n     * get the current cursor\n     */\n    static getCursor(): UI512Cursors {\n        return UI512CursorAccess.currentCursor;\n    }\n\n    /**\n     * set the cursor\n     */\n    static setCursor(nextCursor: UI512Cursors, always = false) {\n        if (!always && UI512CursorAccess.currentCursor === nextCursor) {\n            /* for efficiency, exit early */\n            return;\n        }\n\n        let el = window.document.getElementById('mainDomCanvas');\n        if (el) {\n            let fname = cssCursorFilenames[nextCursor];\n            if (fname) {\n                /* show a real cursor */\n                let fullname =\n                    '/resources03a/images/cursors/x' +\n                    `${UI512CursorAccess.multForCssCursor}${fname}`;\n                let [hotsx, hotsy] = hotCoords[nextCursor] ?? [0, 0];\n                hotsx *= UI512CursorAccess.multForCssCursor;\n                hotsy *= UI512CursorAccess.multForCssCursor;\n                let fallback = cssCursorFallbacks[nextCursor] ?? 'default';\n                el.style.cursor = `url(${fullname}) ${hotsx} ${hotsy}, ${fallback}`;\n            } else {\n                /* hide the real cursor */\n                let hots = hotCoords[nextCursor] ?? [0, 0];\n                UI512CursorAccess.currentHotX = hots[0];\n                UI512CursorAccess.currentHotY = hots[1];\n                UI512CursorAccess.curInfo.iconGroup = '0cursors1';\n                UI512CursorAccess.curInfo.iconNumber = nextCursor - 1;\n                UI512CursorAccess.curInfo.centered = false;\n                el.style.cursor = 'none';\n            }\n        }\n\n        UI512CursorAccess.currentCursor = nextCursor;\n    }\n\n    /**\n     * repeatedly calling set cursor to busy makes it spin\n     */\n    static setCursorSupportRotate(nextCursor: UI512Cursors) {\n        if (nextCursor === UI512Cursors.busy) {\n            let cycle = [\n                UI512Cursors.busy,\n                UI512Cursors.busy2,\n                UI512Cursors.busy3,\n                UI512Cursors.busy4\n            ];\n            let index = cycle.findIndex(item => item === UI512CursorAccess.currentCursor);\n            if (index !== -1) {\n                index = (index + 1) % cycle.length;\n                return UI512CursorAccess.setCursor(cycle[index]);\n            }\n        }\n\n        return UI512CursorAccess.setCursor(nextCursor);\n    }\n\n    /**\n     * called after resizing the window changes the current mult,\n     * also called on init()\n     */\n    static notifyScreenMult(mult: number) {\n        UI512CursorAccess.multForCssCursor = mult;\n        /* don't actually call setcursor here to\n        force the refresh because it might flash for a second */\n        UI512CursorAccess.lastDrawnCur = UI512Cursors.busy4;\n        UI512CursorAccess.setCursor(UI512CursorAccess.getCursor(), true);\n    }\n\n    /**\n     * keep track of the current mouse position!\n     * mouse events might be faster or slower than drawFrame events,\n     * so it makes sense to handle them separately.\n     */\n    static onmousemove(x: number, y: number) {\n        UI512CursorAccess.currentMx = x;\n        UI512CursorAccess.currentMy = y;\n    }\n\n    /**\n     * begin preloading common cursors\n     */\n    static suggestPreloadCursors() {\n        /* preload some cursors we'll probably want */\n        for (let cursor of [\n            UI512Cursors.css_hand,\n            UI512Cursors.css_paintpencil,\n            UI512Cursors.css_cross\n        ]) {\n            let preloadLink = window.document.createElement('link');\n            let fname = cssCursorFilenames[cursor];\n            preloadLink.href =\n                '/resources03a/images/cursors/x' +\n                `${UI512CursorAccess.multForCssCursor}${fname}`;\n            preloadLink.rel = 'preload';\n            preloadLink.as = 'image';\n            document.head.appendChild(preloadLink);\n        }\n    }\n\n    /**\n     * draw our virtual cursor onto the screen\n     */\n    static drawFinalWithCursor(\n        buffer: CanvasWrapper,\n        final: CanvasWrapper,\n        drewAnything: boolean\n    ) {\n        if (cssCursorFilenames[UI512CursorAccess.currentCursor]) {\n            /* hope to erase a previously drawn one */\n            if (\n                UI512CursorAccess.lastDrawnCur !== UI512CursorAccess.currentCursor ||\n                drewAnything\n            ) {\n                final.context.drawImage(buffer.canvas, 0, 0);\n            }\n\n            UI512CursorAccess.lastDrawnMx = UI512CursorAccess.currentMx;\n            UI512CursorAccess.lastDrawnMy = UI512CursorAccess.currentMy;\n            UI512CursorAccess.lastDrawnCur = UI512CursorAccess.currentCursor;\n            return;\n        }\n\n        /* we're not using a css cursor -\n        prevent there from being 2 cursors shown */\n        let el = window.document.getElementById('mainDomCanvas');\n        if (el) {\n            el.style.cursor = 'none';\n        }\n\n        if (\n            !drewAnything &&\n            UI512CursorAccess.currentMx === UI512CursorAccess.lastDrawnMx &&\n            UI512CursorAccess.currentMy === UI512CursorAccess.lastDrawnMy &&\n            UI512CursorAccess.lastDrawnCur === UI512CursorAccess.currentCursor &&\n            UI512CursorAccess.wasCursorLoaded\n        ) {\n            /* we're up to date, don't need to draw anything */\n            return;\n        }\n\n        /* draw the buffer */\n        final.context.drawImage(buffer.canvas, 0, 0);\n\n        /* trick: by hiding the cursor if it's by the edge,\n        we are less likely to leave our fake cursor on the screen */\n        if (\n            !(\n                UI512CursorAccess.currentMx < Constants.HideCursorWhenThisCloseToLeft ||\n                UI512CursorAccess.currentMx >\n                    final.canvas.width - Constants.HideCursorWhenThisCloseToRight ||\n                UI512CursorAccess.currentMy < Constants.HideCursorWhenThisCloseToTop ||\n                UI512CursorAccess.currentMy >\n                    final.canvas.height - Constants.HideCursorWhenThisCloseToBottom\n            )\n        ) {\n            let iconManager = cast(UI512IconManager, getRoot().getDrawIcon());\n            let found = iconManager.findIcon(\n                UI512CursorAccess.curInfo.iconGroup,\n                UI512CursorAccess.curInfo.iconNumber\n            );\n\n            if (!found) {\n                /* we haven't loaded the cursor image yet!\n                    in the meantime, hand-draw a little square cursor */\n                UI512CursorAccess.wasCursorLoaded = false;\n                final.fillRectUnchecked(\n                    UI512CursorAccess.currentMx,\n                    UI512CursorAccess.currentMy,\n                    8,\n                    8,\n                    'black'\n                );\n            } else {\n                UI512CursorAccess.wasCursorLoaded = true;\n                UI512CursorAccess.curInfo.adjustX =\n                    UI512CursorAccess.currentMx - UI512CursorAccess.currentHotX;\n                UI512CursorAccess.curInfo.adjustY =\n                    UI512CursorAccess.currentMy - UI512CursorAccess.currentHotY;\n                if (isInvert[UI512CursorAccess.currentCursor]) {\n                    /* be 100% sure that the composite won't get stuck in the wrong mode */\n                    try {\n                        final.context.globalCompositeOperation = 'difference';\n                        found.drawIntoBox(\n                            final,\n                            UI512CursorAccess.curInfo,\n                            0,\n                            0,\n                            final.canvas.width,\n                            final.canvas.height\n                        );\n                    } finally {\n                        final.context.globalCompositeOperation = 'source-over';\n                    }\n                } else {\n                    found.drawIntoBox(\n                        final,\n                        UI512CursorAccess.curInfo,\n                        0,\n                        0,\n                        final.canvas.width,\n                        final.canvas.height\n                    );\n                }\n            }\n        }\n\n        UI512CursorAccess.lastDrawnMx = UI512CursorAccess.currentMx;\n        UI512CursorAccess.lastDrawnMy = UI512CursorAccess.currentMy;\n        UI512CursorAccess.lastDrawnCur = UI512CursorAccess.currentCursor;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/utilsDrawConstants.ts",
    "content": "\n/* auto */ import { assertEq } from './util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport enum MenuConsts {\n    AddToWidth = 45 + 6,\n    ShadowSizeLeft = 1,\n    ShadowSizeRight = 2,\n    ShadowSizeTop = 1,\n    ShadowSizeBottom = 2,\n    ItemHeight = 16,\n    XSpacing = 13,\n    FirstLabelPadding = 13,\n    SecondLabelDistance = 24,\n    TopHeaderMargin1 = 11,\n    TopHeaderMargin2 = 500,\n    BarHeight = 21\n}\n\nexport enum ScrollConsts {\n    BarWidth = 16,\n    BoxHeight = 16,\n    AmtPerClick = 10,\n    PadBottomOfField = 6,\n    TabSize = 4,\n    WindowCaptionSpacing = 12,\n    WindowCaptionAdjustTextY = 1,\n    ChoiceListDefaultWidth = 130,\n    ChoiceListDefaultHeight = 117\n}\n\nexport enum ScreenConsts {\n    xLeftMargin = 47,\n    xAreaWidth = 512,\n    xToolWidth = 23,\n    xToolCount = 16,\n    xToolMargin = 1,\n    xRightMargin = 0,\n    yTopMargin = 47,\n    yMenuBar = 20,\n    yAreaHeight = 342,\n    yLowerMargin = 7,\n    ScreenWidth = 928,\n    ScreenHeight = 416\n}\n\n/**\n * return bounds in form [x, y, width, height]\n */\nexport function getUI512WindowBounds() {\n    return [\n        ScreenConsts.xLeftMargin,\n        ScreenConsts.yTopMargin,\n        ScreenConsts.ScreenWidth - (ScreenConsts.xLeftMargin + ScreenConsts.xRightMargin),\n        ScreenConsts.ScreenHeight - (ScreenConsts.yTopMargin + ScreenConsts.yLowerMargin)\n    ];\n}\n\n/**\n * screen width should equal all the widths put together\n */\nassertEq(\n    ScreenConsts.ScreenWidth,\n    ScreenConsts.xLeftMargin +\n        ScreenConsts.xAreaWidth +\n        ScreenConsts.xToolWidth * ScreenConsts.xToolCount +\n        ScreenConsts.xToolMargin +\n        ScreenConsts.xRightMargin,\n    '3 |'\n);\n\n/**\n * screen height should equal all the heights put together\n */\nassertEq(\n    ScreenConsts.ScreenHeight,\n    ScreenConsts.yTopMargin +\n        ScreenConsts.yMenuBar +\n        ScreenConsts.yAreaHeight +\n        ScreenConsts.yLowerMargin,\n    '3z|'\n);\n\n/**\n * let's use dimensions divisible by 8\n */\nassertEq(0, ScreenConsts.ScreenWidth % 8, '3y|');\nassertEq(0, ScreenConsts.ScreenHeight % 8, '3x|');\n"
  },
  {
    "path": "vipercard/vipercard/src/ui512/utils/utilsKeypressHelpers.ts",
    "content": "\n/* auto */ import { BrowserOSInfo } from './util512Higher';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * ModifierKeys bitfield.\n */\nexport enum ModifierKeys {\n    None = 0,\n    Shift = 1 << 0,\n    Cmd = 1 << 1,\n    Opt = 1 << 2\n}\n\n/**\n * fill out ModifierKeys bitfield.\n */\nexport function ui512TranslateModifiers(\n    browserOS: BrowserOSInfo,\n    ctrlKey: boolean,\n    shiftKey: boolean,\n    altKey: boolean,\n    metaKey: boolean\n) {\n    let ret = ModifierKeys.None;\n    if (shiftKey) {\n        ret |= ModifierKeys.Shift;\n    }\n\n    if (browserOS === BrowserOSInfo.Mac) {\n        /* there are apparently differences between chrome+safari here,\n        so allow either. */\n        if (ctrlKey || metaKey) {\n            ret |= ModifierKeys.Cmd;\n        }\n        if (altKey) {\n            ret |= ModifierKeys.Opt;\n        }\n    } else {\n        if (ctrlKey) {\n            ret |= ModifierKeys.Cmd;\n        }\n        if (altKey) {\n            ret |= ModifierKeys.Opt;\n        }\n    }\n\n    return ret;\n}\n\n/**\n * produce a human-readable string.\n * fortunately the new keyevent.code and keyevent.char do the heavy lifting here.\n */\nexport function toShortcutString(mods: ModifierKeys, code: string) {\n    let s = '';\n    if ((mods & ModifierKeys.Cmd) !== 0) {\n        s += 'Cmd+';\n    }\n\n    if ((mods & ModifierKeys.Opt) !== 0) {\n        s += 'Opt+';\n    }\n\n    if ((mods & ModifierKeys.Shift) !== 0) {\n        s += 'Shift+';\n    }\n\n    /* from \"KeyA\" to \"A\" */\n    /* check length first as a perf opt. */\n    if (\n        code.length === 4 &&\n        code.toLowerCase().startsWith('key') &&\n        code.charCodeAt(3) >= 'A'.charCodeAt(0) &&\n        code.charCodeAt(3) <= 'Z'.charCodeAt(0)\n    ) {\n        code = code.substr(3);\n    }\n\n    /* from \"Digit1\" to \"1\" */\n    /* check length first as a perf opt. */\n    if (\n        code.length === 6 &&\n        code.toLowerCase().startsWith('digit') &&\n        code.charCodeAt(5) >= '0'.charCodeAt(0) &&\n        code.charCodeAt(5) <= '9'.charCodeAt(0)\n    ) {\n        code = code.substr(5);\n    }\n\n    /* e.g. numpadenter -> enter */\n    if (code.toLowerCase().startsWith('Numpad')) {\n        code = code.substr('Numpad'.length);\n    }\n\n    return s + code;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptCaches.ts",
    "content": "\n/* auto */ import { getParsingObjects } from './../codeparse/vpcVisitor';\n/* auto */ import { CodeLimits, CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { VpcParsedCodeCollection, VpcTopPreparse } from './../codepreparse/vpcTopPreparse';\n/* auto */ import { VpcParsed } from './../codeparse/vpcTokens';\n/* auto */ import { ChvRuleFnType, VpcCodeLine, VpcCodeLineReference, VpcCurrentScriptStage } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { VpcErrStage, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertEq } from './../../ui512/utils/util512';\n/* auto */ import { BridgedLRUMap } from './../../bridge/bridgeJsLru';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * cache the CST from a parsed line of code, for better perf.\n * it can be re-evaluated by calling visit() again.\n *\n * the cache is across all code in the stack, so\n * the line \"put 1 into x\" in the script of one button can re-use the CST\n * for the line \"put 1 into x\" in the script of another button\n *\n * the cache is an LRU so that it doesn't have unbounded memory usage\n */\nexport class VpcCacheParsedCST {\n    cache = new (BridgedLRUMap())<string, VpcParsed>(CodeLimits.CacheThisManyParsedLines);\n    parser: chevrotain.CstParser;\n    static ensureNotChanged = true;\n    constructor() {\n        this.parser = getParsingObjects()[1];\n    }\n\n    /**\n     * get the CST object for a line of code, using the cache if possible\n     */\n    getParsedLine(ln: VpcCodeLine) {\n        let rule = ln.getParseRule();\n        assertEq(bool(rule), bool(ln.allImages), '4>|');\n        if (rule && ln.allImages) {\n            assertTrue(ln.excerptToParse.length > 0, '4=|ln readyToParse is empty', ln.offset);\n            let key = ln.allImages;\n            let foundInCache = this.cache.get(key);\n            if (foundInCache !== undefined) {\n                /* we can use the cached cst */\n                return foundInCache;\n            } else {\n                /* call the parser to get a new cst */\n                let cst = this.callParser(ln, rule);\n                checkThrow(cst !== null && cst !== undefined, '4<|parse results null', ln.offset);\n                this.cache.set(key, cst);\n                return cst;\n            }\n        } else {\n            /* this line doesn't use the parser (a line like \"end repeat\") */\n            return undefined;\n        }\n    }\n\n    /**\n     * call the parser to get a new cst\n     */\n    protected callParser(ln: VpcCodeLine, firstRule: ChvRuleFnType) {\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Parse;\n        VpcCurrentScriptStage.latestSrcLineSeen = ln.firstToken.startLine;\n        VpcCurrentScriptStage.latestDestLineSeen = ln;\n        VpcCurrentScriptStage.origClass = undefined;\n\n        /* setting input again will reset the parser's state */\n        this.parser.input = ln.excerptToParse;\n        this.parser.errors.length = 0;\n        VpcCurrentScriptStage.origClass = 'chevrotain.parsecallthrew';\n        let parsed = firstRule.apply(this.parser, []);\n        if (VpcCacheParsedCST.ensureNotChanged) {\n            Util512.freezeRecurse(parsed);\n        }\n\n        VpcCurrentScriptStage.origClass = 'chevrotain.parse';\n        if (this.parser.errors.length) {\n            let s = this.parser.errors[0]?.message?.substr(0, CodeLimits.LimitChevErrStringLen);\n            checkThrow(false, '4:|parse error: ' + s);\n        }\n\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Unknown;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        return parsed;\n    }\n}\n\n/**\n * for efficiency, let's cache the entire script once we've processed it.\n * note that this isn't keyed by element id. if two elements have exactly\n * the same script, they'll share an entry here.\n *\n * this also helps simplify the case where a script deletes objects at runtime,\n * it can even delete itself with no issues.\n */\nexport class VpcCacheParsedAST {\n    cache = new (BridgedLRUMap())<string, VpcParsedCodeCollection>(CodeLimits.CacheThisManyScripts);\n    constructor(public idGen: CountNumericId) {}\n\n    /**\n     * if there is a lex error, preparse error or syntax error, throws.\n     * parse errors and runtime errors will not be seen until later\n     */\n    protected getParsedCodeCollectionOrThrow(code: string, velIdForErrMsg: string, compatMode: boolean): VpcParsedCodeCollection {\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Unknown;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = velIdForErrMsg;\n\n        if (code.match(/^\\s*$/)) {\n            return VpcParsedCodeCollection.makeEmptyInst();\n        }\n\n        let found = this.cache.get(code);\n        if (found) {\n            return found;\n        } else {\n            let got = VpcTopPreparse.goPreparseOrThrow(code, this.idGen, compatMode);\n            if (VpcCacheParsedCST.ensureNotChanged) {\n                Util512.freezeRecurse(got);\n            }\n\n            this.cache.set(code, got);\n            return got;\n        }\n    }\n\n    /**\n     * parse+compile code, and find a handler.\n     * if the handler isn't found, returns undefined for the 2nd item\n     */\n    getHandlerOrThrow(\n        code: string,\n        handlername: string,\n        velIdForErrMsg: string,\n        compatMode: boolean\n    ): [VpcParsedCodeCollection, O<VpcCodeLineReference>] {\n        let coll = this.getParsedCodeCollectionOrThrow(code, velIdForErrMsg, compatMode);\n        let handler = coll.handlers.find(handlername);\n        return [coll, handler];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecAsync.ts",
    "content": "\n/* auto */ import { VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcPhoneDial } from './../vpcutils/vpcAudio';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { RespondToErr, Util512Higher, VoidFn } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, ValHolder } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompStdDialogResult } from './../../ui512/composites/ui512ModalDialog';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * execute an asynchronous statement\n *\n * case 1) when you first hit the statement:\n *      add an entry to \"waitingFor\"\n *      begin the async op\n *      return with 'AsyncCodeOpState.DisallowNext' so that the script can exit early\n *\n * case 2) when you next hit the statement, and it's not done yet:\n *      we can tell it's not done because there's no entry in completed\n *      return with 'AsyncCodeOpState.DisallowNext' so that the script can exit early\n *\n * case 3) when you hit the statement, and it's done:\n *      we can tell it's done because there's an entry in completed\n *      clear out everything\n *      return what was set in completed\n *      return with 'AsyncCodeOpState.AllowNext' (the default) so script can continue\n *\n */\nexport class VpcScriptExecAsync {\n    /**\n     * e.g. 'wait 5 seconds'\n     * when the script can continue, blocked will be set to 0\n     */\n    static goAsyncWait(\n        pendingOps: VpcPendingAsyncOps,\n        blocked: ValHolder<AsyncCodeOpState>,\n        asyncOpId: string,\n        milliseconds: number\n    ) {\n        let op = () => {\n            Util512Higher.syncToAsyncAfterPause(\n                () => pendingOps.markCompleted(asyncOpId, true),\n                milliseconds,\n                'goAsyncWait',\n                RespondToErr.Alert\n            );\n        };\n\n        pendingOps.go(asyncOpId, op, blocked);\n    }\n\n    /**\n     * e.g. 'dial \"1234\"'\n     * because we know the length of each audio clip,\n     * we know how long to wait\n     */\n    static goAsyncDial(\n        pendingOps: VpcPendingAsyncOps,\n        blocked: ValHolder<AsyncCodeOpState>,\n        asyncOpId: string,\n        numbersToDial: string\n    ) {\n        let op = () => {\n            let markComplete = () => pendingOps.markCompleted(asyncOpId, true);\n            VpcPhoneDial.goDial(numbersToDial, markComplete);\n        };\n\n        pendingOps.go(asyncOpId, op, blocked);\n    }\n\n    /**\n     * e.g. 'answer \"abc\"'\n     * when the script can continue, blocked will be set to 0\n     */\n    static goAsyncAnswer(\n        pendingOps: VpcPendingAsyncOps,\n        blocked: ValHolder<AsyncCodeOpState>,\n        outside: OutsideWorldReadWrite,\n        dlg: O<FnAnswerMsgCallback>,\n        cbStopCodeRunning: O<VoidFn>,\n        asyncOpId: string,\n        prmpt: string,\n        opt1: string,\n        opt2: string,\n        opt3: string\n    ) {\n        let op = () => {\n            let markComplete = (n: number) => {\n                pendingOps.markCompleted(asyncOpId, [n]);\n            };\n\n            dlg = ensureDefined(dlg, 'JH|cbAnswerMsg is undefined');\n            dlg(prmpt, markComplete, opt1, opt2, opt3);\n        };\n\n        let retrieved = pendingOps.go(asyncOpId, op, blocked);\n        if (retrieved) {\n            let [whichBtn] = retrieved;\n            if (whichBtn === UI512CompStdDialogResult.Exit) {\n                /* user is exiting out of the modal dialog by clicking the Stop button */\n                if (cbStopCodeRunning) {\n                    cbStopCodeRunning();\n                } else {\n                    checkThrowInternal(false, 'JG|cbStopCodeRunning');\n                }\n\n                /* this causes script to stop immediately,\n                which is necessary because cbStopCodeRunning nuked our parent stack frame */\n                blocked.val = AsyncCodeOpState.DisallowNext;\n            } else {\n                /* user can read which button by reading value of \"it\" */\n                outside.SetSpecialVar('it', VpcValN(whichBtn + 1));\n            }\n        }\n    }\n\n    /**\n     * e.g. 'ask \"abc\"'\n     * when the script can continue, blocked will be set to 0\n     */\n    static goAsyncAsk(\n        pendingOps: VpcPendingAsyncOps,\n        blocked: ValHolder<AsyncCodeOpState>,\n        outside: OutsideWorldReadWrite,\n        dlg: O<FnAskMsgCallback>,\n        cbStopCodeRunning: O<VoidFn>,\n        asyncOpId: string,\n        prmpt: string,\n        defval: string\n    ) {\n        let op = () => {\n            dlg = ensureDefined(dlg, 'JF|cbAskMsg');\n            dlg(prmpt, defval, (s: string, n: number) => {\n                pendingOps.markCompleted(asyncOpId, [s, n]);\n            });\n        };\n\n        let retrieved = pendingOps.go(asyncOpId, op, blocked);\n        if (retrieved) {\n            let [typedText, btnPressed] = retrieved;\n            if (btnPressed === UI512CompStdDialogResult.Exit) {\n                /* user is exiting out of the modal dialog by clicking the Stop button */\n                if (cbStopCodeRunning) {\n                    cbStopCodeRunning();\n                } else {\n                    checkThrowInternal(false, 'JE|cbStopCodeRunning');\n                }\n\n                /* this causes script to stop immediately,\n                which is necessary because cbStopCodeRunning nuked our parent stack frame */\n                blocked.val = AsyncCodeOpState.DisallowNext;\n            } else {\n                /* user can read the result by reading value of \"it\" */\n                let s = (typedText ?? '').toString();\n                outside.SetSpecialVar('it', VpcValS(s));\n            }\n        }\n    }\n}\n\n/**\n * logic for pending asynchronous operations\n */\nexport class VpcPendingAsyncOps {\n    waitingFor = new MapKeyToObjectCanSet<boolean>();\n    completed = new MapKeyToObjectCanSet<any>();\n\n    /**\n     * an async callback can run this and leave data to be picked up\n     */\n    markCompleted(asyncId: string, data: any) {\n        this.waitingFor.remove(asyncId);\n        this.completed.add(asyncId, data);\n    }\n\n    /**\n     * when encountering code for an async operation,\n     * do different actions based on if it is the first time we've encountered the action\n     */\n    go(asyncId: string, op: () => void, isblocked: ValHolder<AsyncCodeOpState>) {\n        let ret: any = undefined;\n        if (this.waitingFor.find(asyncId)) {\n            /* case 2) described at the top of this file, we're still waiting */\n            isblocked.val = AsyncCodeOpState.DisallowNext;\n        } else if (this.completed.find(asyncId)) {\n            /* case 3) described at the top of this file, we're done */\n            ret = this.completed.get(asyncId);\n            this.completed.remove(asyncId);\n        } else {\n            /* case 1) described at the top of this file,\n            this is the first time we've hit the line */\n            this.waitingFor.add(asyncId, true);\n            isblocked.val = AsyncCodeOpState.DisallowNext;\n            op();\n        }\n\n        return ret;\n    }\n}\n\n/* callback structure for 'answer' */\nexport type FnAnswerMsgCallback = (\n    prompt: string,\n    fnOnResult: (n: number) => void,\n    choice1: string,\n    choice2: string,\n    choice3: string\n) => void;\n\n/* callback structure for 'ask' */\nexport type FnAskMsgCallback = (prompt: string, deftxt: string, fnOnResult: (ret: O<string>, n: number) => void) => void;\n\n/* use this flag to indicate that the script is temporarily blocked */\nexport enum AsyncCodeOpState {\n    AllowNext = 'AllowNext0',\n    DisallowNext = 'DisallowNext1'\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecFrame.ts",
    "content": "\n/* auto */ import { VarCollection } from './../vpcutils/vpcVarCollection';\n/* auto */ import { VpcVal } from './../vpcutils/vpcVal';\n/* auto */ import { CodeLimits, VpcScriptMessage } from './../vpcutils/vpcUtils';\n/* auto */ import { VpcParsedCodeCollection } from './../codepreparse/vpcTopPreparse';\n/* auto */ import { LoopLimit, VpcLineCategory } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './../vel/velStack';\n/* auto */ import { VpcElProductOpts } from './../vel/velProductOpts';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * why do frames require a value for both \"me\" and \"parent\"?\n * when executing code dynamically with 'send',\n * we set the \"parent\" to be the same as \"me\" so that it can\n * access the methods there.\n *\n * the dynamicCodeOrigin is used to show better error messages\n * when code is sent from \"do\", \"send\", or the message box.\n * in those cases if an error occurs it's not correct\n * to say the error occurred in the temporary location,\n * we should instead point to the offending send statement.\n */\n\n/**\n * an \"execution frame\"\n * holding local variables and the offset to the current line of code\n */\nexport class VpcExecFrame {\n    locals = new VarCollection(CodeLimits.MaxLocalVars, 'local');\n    codeSection: VpcParsedCodeCollection;\n    declaredGlobals: { [varName: string]: boolean } = {};\n    args: VpcVal[] = [];\n    currentHandler: O<number>;\n    messageChain: string[];\n    protected offset: number;\n    constructor(\n        public handlerName: string,\n        public message: VpcScriptMessage,\n        public meId: string,\n        public statedParentId: O<string>,\n        public dynamicCodeOrigin: O<[string, number]>,\n        tmpOutside: OutsideWorldReadWrite\n    ) {\n        /* make special locals */\n        this.locals.set('$result', VpcVal.Empty);\n        this.locals.set('it', VpcVal.Empty);\n        assertTrue(this.message, '5N|message is null');\n        this.messageChain = VpcExecFrame.getMessageChain(meId, statedParentId, tmpOutside);\n    }\n\n    /* use to mark when a branch has been taken */\n    offsetsMarked: { [offset: number]: boolean } = {};\n\n    /**\n     * get offset (index within codeSection of the current line of code)\n     */\n    getOffset() {\n        return this.offset;\n    }\n\n    /**\n     * advance to the next line of code\n     */\n    next() {\n        this.offset += 1;\n        checkThrow(this.offset < this.codeSection.lines.length, '7n|went past end of code');\n        checkThrow(\n            this.codeSection.lines[this.offset].ctg !== VpcLineCategory.HandlerStart,\n            '7m|we should never walk onto a handler start'\n        );\n    }\n\n    /**\n     * set the instruction pointer, jumping to another line of code\n     */\n    jumpToOffset(newOffset: number, okToStartHandler?: boolean) {\n        this.offset = newOffset;\n        checkThrow(this.offset < this.codeSection.lines.length, '7l|went past end of code');\n        checkThrow(\n            bool(okToStartHandler) || this.codeSection.lines[this.offset].ctg !== VpcLineCategory.HandlerStart,\n            '7k|we should never walk onto a handler start'\n        );\n\n        /* make sure we did not jump into a different handler */\n        let next = this.codeSection.determineHandlerFromOffset(this.offset);\n        checkThrow(next !== -1, '7j|could not determine handler', next);\n        if (this.currentHandler === undefined) {\n            this.currentHandler = next;\n        } else {\n            checkThrow(next === this.currentHandler, '7i|jumping into a different handler is not allowed', next);\n            this.currentHandler = next;\n        }\n    }\n\n    /**\n    get the message chain.\n    we need to precompute the message chain in advance,\n    consider this case:\n        cd 4 has a doCardThing handler\n        you are on cd 1 and click a button that does this:\n        send \"myMessage\" to btn 1 of cd 4\n        btn 1's myMessage handler says\n            delete btn 1 of cd 4\n            doCardThing\n\n        if we hadn't precomputed the message chain, it would\n        be hard to know how doCardThing would reach the right target.\n\n    i confirmed in the product that the message chain is about\n    the parent card, not the current card.\n\n    Note the \"stated parent\", it let's us have snippets of code that run\n    in the context of an element's script,\n    but aren't actually in that script.\n     */\n    static getMessageChain(velId: string, statedParent: O<string>, outside: OutsideWorldReadWrite): string[] {\n        let ret: string[] = [];\n        let vel = outside.Model().findByIdUntyped(velId);\n        let haveUsedStatedParent = false;\n        let hasSeenStack = false;\n        let hasSeenProduct = false;\n        if (!vel && statedParent) {\n            vel = outside.Model().findByIdUntyped(statedParent);\n            haveUsedStatedParent = true;\n        }\n\n        let loop = new LoopLimit(CodeLimits.MaxObjectsInMsgChain, 'maxObjectsInMsgChain');\n        while (loop.next()) {\n            if (!vel) {\n                break;\n            }\n\n            if (vel instanceof VpcElStack) {\n                hasSeenStack = true;\n            } else if (vel instanceof VpcElProductOpts) {\n                hasSeenProduct = true;\n            }\n\n            ret.push(vel.idInternal);\n            if (!haveUsedStatedParent && statedParent && outside.Model().findByIdUntyped(statedParent)) {\n                vel = outside.Model().findByIdUntyped(statedParent);\n                haveUsedStatedParent = true;\n            } else {\n                vel = outside.Model().findByIdUntyped(vel.parentIdInternal);\n            }\n        }\n\n        if (!hasSeenStack) {\n            ret.push(outside.Model().stack.idInternal);\n        }\n        if (!hasSeenProduct) {\n            ret.push(outside.Model().productOpts.idInternal);\n        }\n\n        return ret;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecFrameStack.ts",
    "content": "\n/* auto */ import { getChvVisitor } from './../codeparse/vpcVisitor';\n/* auto */ import { VarCollection } from './../vpcutils/vpcVarCollection';\n/* auto */ import { IntermedMapOfIntermedVals, VpcIntermedValBase, VpcVal, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { CodeLimits, VpcScriptMessage, VpcScriptMessageMsgBoxCode } from './../vpcutils/vpcUtils';\n/* auto */ import { VpcParsedCodeCollection } from './../codepreparse/vpcTopPreparse';\n/* auto */ import { VpcParsed, tks, tkstr } from './../codeparse/vpcTokens';\n/* auto */ import { VpcTables } from './../vpcutils/vpcTables';\n/* auto */ import { ExecuteStatement } from './vpcScriptExecStatement';\n/* auto */ import { VpcExecInternalDirectiveAbstract } from './vpcScriptExecInternalDirective';\n/* auto */ import { VpcExecFrame } from './vpcScriptExecFrame';\n/* auto */ import { AsyncCodeOpState, VpcPendingAsyncOps } from './vpcScriptExecAsync';\n/* auto */ import { VpcCacheParsedAST, VpcCacheParsedCST } from './vpcScriptCaches';\n/* auto */ import { RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { VpcCodeLine, VpcCodeLineReference, VpcCurrentScriptStage, VpcLineCategory } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { VpcBuiltinMsg, VpcElType, VpcErrStage, VpcTool, checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './../codepreparse/vpcCheckReserved';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { VpcElBase } from './../vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, ValHolder, arLast, assertEq, assertWarnEq, cast, getEnumToStrOrFallback, getStrToEnum, lastIfThere, longstr, slength } from './../../ui512/utils/util512';\n/* auto */ import { UI512PaintDispatch } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * messages and our support for them\n *\n * let's support, for now,\n *      openStack(already implemented) idle(already implemented) keydown(already implemented)\n *      mouse ones(already implemented)\n *      deleteBackground, deleteButton, deleteCard, deleteField\n *      newBackground, newButton, newCard, newField, openBackground, openCard\n *      closeBackground, closeCard\n *\n * Orders: verified in product.\n * startup: startup, openStack, openBackground, openCard\n * new bg: closecard, closebg, *, newbg, newcard, openbg, opencard\n * new card: closecard, *, newcard, opencard\n * delete bg: closecard, closebg, deletecard, deletebg, *, [ (openbg), opencard ]\n * delete cd: closecd, (closebg), deletecard (deletebg),* [ (openbg), opencard ]\n * move cd: closeorexitfield, closecd, closebg, *, openbg, opencard\n * cut card: let's not support this\n * paste card: closecard newcard opencard (it's different if pasting into a\n * newbg, but unclear how that is possible)\n */\n\n/**\n * frame stack for the vipercard code-interpreter\n * entering a function pushes a frame onto this stack,\n * returning from a function pops a frame from this stack\n */\nexport class VpcExecFrameStack {\n    stack: O<VpcExecFrame>[] = [undefined];\n    vpcTables = new VpcTables();\n    constructor(\n        protected outside: OutsideWorldReadWrite,\n        protected cacheParsedCST: VpcCacheParsedCST,\n        protected cacheParsedAST: VpcCacheParsedAST,\n        protected execStatements: ExecuteStatement,\n        public constants: VarCollection,\n        public globals: VarCollection,\n        public check: CheckReservedWords,\n        public originalMsg: VpcScriptMessage,\n        public directiveImpl: VpcExecInternalDirectiveAbstract\n    ) {\n        this.execStatements.pendingOps = VpcExecFrameStack.staticPendingOps;\n    }\n\n    /* if you are drawing paint on the screen with a script,\n    we cache the commands sent to the screen to coalesce later for better performance */\n    paintQueue: UI512PaintDispatch[] = [];\n\n    /* is this a completely new framestack? */\n    hasRunCode = false;\n\n    /* keep track of state for an async script action (like \"wait 4 seconds\") */\n    static staticPendingOps = new VpcPendingAsyncOps();\n\n    /**\n     * send a message, like \"on mouseUp\", and see if anything in the message hierarchy responds\n     * if something responds, push it onto the stack so that it's ready to execute\n     */\n    getAndRunHandlerOrThrow() {\n        let chain = VpcExecFrame.getMessageChain(this.originalMsg.targetId, undefined, this.outside);\n        if (this.originalMsg instanceof VpcScriptMessageMsgBoxCode) {\n            return this.startHandlerMsgBox(this.originalMsg);\n        }\n\n        let found = this.getHandlerUpwardsOrThrow(this.originalMsg.targetId, chain, this.originalMsg.msgName, false);\n        if (found) {\n            let [ast, lineRef, vel] = found;\n            this.pushStackFrame(\n                this.originalMsg.msgName,\n                this.originalMsg,\n                ast,\n                lineRef,\n                vel.idInternal,\n                vel.parentIdInternal,\n                undefined\n            );\n        }\n    }\n\n    /**\n     * start for the message box\n     */\n    startHandlerMsgBox(obj: VpcScriptMessageMsgBoxCode) {\n        let meId = this.outside.GetCurrentCardId();\n        let statedParentId = this.outside.GetCurrentCardId();\n        let targetId = this.outside.GetCurrentCardId();\n        let codeToCompile = obj.msgBoxCodeBody;\n        if (obj.returnToMsgBox) {\n            codeToCompile += `\\ninternalvpcmessagesdirective \"returntomsgbox\"`;\n        }\n\n        let dynamicCodeOrigin: [string, number] = ['messagebox', 0];\n        let [ast, lineRef, newHandlerName] = this.visitCallDynamicHelper(\n            codeToCompile,\n            meId,\n            statedParentId,\n            targetId,\n            dynamicCodeOrigin\n        );\n\n        this.pushStackFrame(newHandlerName, obj, ast, lineRef, meId, statedParentId, dynamicCodeOrigin);\n    }\n\n    /**\n     * push frame onto the stack so that it is ready to execute\n     */\n    protected pushStackFrame(\n        msgName: string,\n        msg: VpcScriptMessage,\n        code: VpcParsedCodeCollection,\n        codeLine: VpcCodeLineReference,\n        meId: string,\n        statedParentId: O<string>,\n        dynamicCodeOrigin: O<[string, number]>\n    ) {\n        checkThrowEq(VpcTool.Browse, this.outside.GetCurrentTool(true), 'JI|not browse tool?');\n        let newFrame = new VpcExecFrame(msgName, msg, meId, statedParentId, dynamicCodeOrigin, this.outside);\n        newFrame.codeSection = code;\n        this.validatedGoto(newFrame, codeLine, true);\n        this.stack.push(newFrame);\n        assertTrue(this.stack.length < CodeLimits.MaxCodeFrames, '5e|stack overflow... perhaps unbounded recursion?');\n        return newFrame;\n    }\n\n    /**\n     * when jumping to a line, ensure the expected line id matches line line we get.\n     */\n    protected validatedGoto(frame: VpcExecFrame, ref: VpcCodeLineReference, okToStartHandler?: boolean) {\n        frame.jumpToOffset(ref.offset, okToStartHandler);\n        assertEq(ref.lineId, frame.codeSection.lines[frame.getOffset()].lineId, '5h|');\n        assertEq(ref.offset, frame.codeSection.lines[frame.getOffset()].offset, '5g|');\n    }\n\n    /**\n     * continue running code until _ms_ milliseconds have passed\n     */\n    runTimesliceOrThrow(ms: number) {\n        const howOftenToCheckElapsedTime = 4;\n        if (!this.hasRunCode) {\n            VpcExecFrameStack.staticPendingOps = new VpcPendingAsyncOps();\n            this.execStatements.pendingOps = VpcExecFrameStack.staticPendingOps;\n        }\n\n        /* we should never have exited from more fns than we've entered. */\n        assertTrue(this.stack.length >= 1 && this.stack[0] === undefined, '5f|popped too many off the stack');\n\n        /* code will set this to true if we're blocked on an async op\n        there's no sense in spin-waiting if the code says \"wait 4 seconds\" */\n        let blocked = new ValHolder<AsyncCodeOpState>(AsyncCodeOpState.AllowNext);\n\n        this.hasRunCode = true;\n        let started = performance.now();\n        let count = 0;\n        while (this.stack.length > 1) {\n            /* run one line of code */\n            let isComplete = this.runOneLineOrThrow(blocked);\n            if (isComplete || blocked.val !== AsyncCodeOpState.AllowNext) {\n                break;\n            }\n\n            count += 1;\n            if (count > howOftenToCheckElapsedTime) {\n                /* see if our timeslice has expired */\n                count = 0;\n                let now = performance.now();\n                if (now - started >= ms) {\n                    break;\n                }\n            }\n        }\n\n        if (!this.outside.GetOptionB('screenLocked') || this.stack.length <= 1) {\n            /* apply paint changes all in one swoop, for better perf */\n            this.outside.CommitSimulatedClicks(this.paintQueue);\n            this.paintQueue = [];\n        }\n    }\n\n    /**\n     * run one line of code, and catch exceptions\n     */\n    protected runOneLineOrThrow(blocked: ValHolder<AsyncCodeOpState>): boolean {\n        let curFrame = lastIfThere(this.stack);\n        if (curFrame) {\n            let curLine = curFrame.codeSection.lines[curFrame.getOffset()];\n            checkThrow(curLine, `5c|no code defined at offset ${curFrame.getOffset()} of element ${curFrame.meId}`);\n            assertEq(curLine.offset, curFrame.getOffset(), '5d|');\n            VpcCurrentScriptStage.latestSrcLineSeen = curLine.firstToken.startLine;\n            VpcCurrentScriptStage.latestDestLineSeen = curLine;\n            VpcCurrentScriptStage.origClass = undefined;\n            VpcCurrentScriptStage.latestVelID = curFrame.meId;\n            VpcCurrentScriptStage.dynamicCodeOrigin = curFrame.dynamicCodeOrigin;\n            this.runOneLineOrThrowImpl(curFrame, curLine, blocked);\n            return false;\n        } else {\n            /* there's no current stack, looks like we are done! */\n            VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n            VpcCurrentScriptStage.latestDestLineSeen = undefined;\n            VpcCurrentScriptStage.origClass = undefined;\n            VpcCurrentScriptStage.latestVelID = undefined;\n            VpcCurrentScriptStage.dynamicCodeOrigin = undefined;\n            return true;\n        }\n    }\n\n    /**\n     * run one line of code\n     */\n    protected runOneLineOrThrowImpl(curFrame: VpcExecFrame, curLine: VpcCodeLine, blocked: ValHolder<AsyncCodeOpState>) {\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Parse;\n        let parsed = this.cacheParsedCST.getParsedLine(curLine);\n        VpcCurrentScriptStage.currentStage = VpcErrStage.SyntaxStep;\n        VpcCurrentScriptStage.latestSrcLineSeen = curLine.firstToken.startLine;\n        VpcCurrentScriptStage.latestDestLineSeen = curLine;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = curFrame.meId;\n        VpcCurrentScriptStage.dynamicCodeOrigin = curFrame.dynamicCodeOrigin;\n\n        let methodName = 'visit' + getEnumToStrOrFallback(VpcLineCategory, curLine.ctg);\n        Util512.callAsMethodOnClass(VpcExecFrameStack.name, this, methodName, [curFrame, curLine, parsed, blocked], false);\n\n        /* make sure we're not stuck on the same line again */\n        if (arLast(this.stack) === curFrame && blocked.val === AsyncCodeOpState.AllowNext) {\n            checkThrow(curFrame.getOffset() !== curLine.offset, '7x|stuck on the same line', curLine.offset.toString());\n        }\n    }\n\n    /**\n     * we were told to evaluate an expression, return the value\n     */\n    protected evalRequestedExpression(parsed: VpcParsed, curLine: VpcCodeLine): VpcVal {\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Visit;\n        VpcCurrentScriptStage.origClass = undefined;\n        assertTrue(curLine.ctg !== VpcLineCategory.Statement, '5b|', curLine.ctg);\n        assertTrue(\n            this.cacheParsedCST.parser[tkstr.RuleInternalCmdRequestEval] === curLine.getParseRule(),\n            '5a|expected eval parse rule'\n        );\n\n        VpcCurrentScriptStage.origClass = 'evalGeneralVisit';\n        let visited = this.evalGeneralVisit(parsed, curLine, true);\n        VpcCurrentScriptStage.origClass = undefined;\n        let ret = cast(VpcVal, visited);\n        VpcCurrentScriptStage.currentStage = VpcErrStage.SyntaxStep;\n        return ret;\n    }\n\n    /**\n     * run the visitor, to get a value from the CST\n     */\n    protected evalGeneralVisit(parsed: VpcParsed, curLine: VpcCodeLine, okCustom = false): VpcIntermedValBase {\n        if (parsed !== null && parsed !== undefined) {\n            let visitor = getChvVisitor(this.outside);\n            let visited = visitor.visit(parsed);\n            checkThrow(\n                okCustom || visited instanceof VpcIntermedValBase,\n                '7t|did not get IntermedValBase when running',\n                curLine.allImages\n            );\n            return visited;\n        } else {\n            checkThrow(false, '5Z|no expression was parsed');\n        }\n    }\n\n    /**\n     * look in the message hierarchy for a handler\n     * don't stop iterating if an object is missing!\n     */\n    getHandlerUpwardsOrThrow(velIdStart: string, chain: string[], handlername: string, onlyParents: boolean) {\n        let storecurrentStage = VpcCurrentScriptStage.currentStage;\n        let storelatestSrcLineSeen = VpcCurrentScriptStage.latestSrcLineSeen;\n        let storelatestDestLineSeen = VpcCurrentScriptStage.latestDestLineSeen;\n        let storeorigClass = VpcCurrentScriptStage.origClass;\n        let storelatestVelID = VpcCurrentScriptStage.latestVelID;\n        let storedynamicCodeOrigin = VpcCurrentScriptStage.dynamicCodeOrigin;\n        let ret = this.getHandlerUpwardsOrThrowImpl(velIdStart, chain, handlername, onlyParents);\n        VpcCurrentScriptStage.currentStage = storecurrentStage;\n        VpcCurrentScriptStage.latestSrcLineSeen = storelatestSrcLineSeen;\n        VpcCurrentScriptStage.latestDestLineSeen = storelatestDestLineSeen;\n        VpcCurrentScriptStage.origClass = storeorigClass;\n        VpcCurrentScriptStage.latestVelID = storelatestVelID;\n        VpcCurrentScriptStage.dynamicCodeOrigin = storedynamicCodeOrigin;\n        return ret;\n    }\n    /**\n     * look in the message hierarchy for a handler\n     * don't stop iterating if an object is missing!\n     */\n    getHandlerUpwardsOrThrowImpl(\n        velIdStart: string,\n        chain: string[],\n        handlername: string,\n        onlyParents: boolean\n    ): O<[VpcParsedCodeCollection, VpcCodeLineReference, VpcElBase]> {\n        for (let velId of chain) {\n            if (onlyParents && velId === velIdStart) {\n                continue;\n            }\n\n            let v = this.outside.Model().findByIdUntyped(velId);\n            if (v) {\n                let [codeColl, lineRef] = this.cacheParsedAST.getHandlerOrThrow(\n                    v.getS('script'),\n                    handlername,\n                    v.idInternal,\n                    this.outside.Model().stack.getB('compatibilitymode')\n                );\n                if (codeColl && lineRef) {\n                    return [codeColl, lineRef, v];\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * run a builtin command\n     */\n    visitStatement(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed, blocked: ValHolder<AsyncCodeOpState>) {\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Visit;\n        VpcCurrentScriptStage.latestSrcLineSeen = curLine.firstToken.startLine;\n        VpcCurrentScriptStage.latestDestLineSeen = curLine;\n        VpcCurrentScriptStage.origClass = 'visit';\n        VpcCurrentScriptStage.latestVelID = curFrame.meId;\n        VpcCurrentScriptStage.dynamicCodeOrigin = curFrame.dynamicCodeOrigin;\n        let customOk = curLine.getParseRule() === this.cacheParsedCST.parser[tkstr.RuleBuiltinCmdPut];\n        let visited = parsed ? this.evalGeneralVisit(parsed, curLine, customOk) : VpcVal.Empty;\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Execute;\n        VpcCurrentScriptStage.latestSrcLineSeen = curLine.firstToken.startLine;\n        VpcCurrentScriptStage.latestDestLineSeen = curLine;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = curFrame.meId;\n        VpcCurrentScriptStage.dynamicCodeOrigin = curFrame.dynamicCodeOrigin;\n        this.execStatements.go(curLine, visited, blocked, curFrame.message);\n        if (blocked.val === AsyncCodeOpState.AllowNext) {\n            curFrame.next();\n        }\n    }\n\n    /**\n     * declare a global\n     */\n    visitDeclareGlobal(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        for (let i = 0; i < curLine.excerptToParse.length; i++) {\n            let varName = curLine.excerptToParse[i].image;\n            checkThrow(varName !== 'it' && this.check.okLocalVar(varName), '7s|reserved word', varName);\n            curFrame.declaredGlobals[varName] = true;\n            if (!this.outside.IsVarDefined(varName)) {\n                /* not-yet-used globals default to \"\" */\n                this.outside.SetVarContents(varName, VpcValS(''));\n            }\n        }\n\n        curFrame.next();\n    }\n\n    /**\n     * beginning of a handler, like \"on mouseup\"\n     */\n    visitHandlerStart(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* confirm handler name */\n        assertTrue(curLine.excerptToParse.length > 1, '5X|wrong readyToParse length');\n        assertWarnEq(curFrame.handlerName.toLowerCase(), curLine.excerptToParse[1].image.toLowerCase(), '5W|');\n\n        for (let i = 2; i < curLine.excerptToParse.length; i++) {\n            /* set \"params\" values */\n            let paramname = curLine.excerptToParse[i].image;\n            let val = curFrame.args[i - 2] ?? VpcVal.Empty;\n            curFrame.locals.set(paramname, val);\n        }\n\n        curFrame.next();\n    }\n\n    /**\n     * end a handler\n     */\n    visitHandlerEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        this.stack.pop();\n    }\n\n    /**\n     * end all handlers\n     */\n    visitProductExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        while (this.stack.length > 1) {\n            this.stack.pop();\n        }\n    }\n\n    /**\n     * exit a handler\n     */\n    visitHandlerExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* we've validated curLine.readyToParse[1] in the BranchProcessing class */\n        this.stack.pop();\n    }\n\n    /**\n     * \"pass\" the message up the chain\n     */\n    visitHandlerPass(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* we've validated curLine.readyToParse[1] in the BranchProcessing class */\n        /* in rewriting we've added a \"return\" after this line so we don't need to pop a frame */\n        curFrame.next();\n        let found = this.getHandlerUpwardsOrThrow(curFrame.meId, curFrame.messageChain, curFrame.handlerName, true);\n        if (found) {\n            let [ast, lineRef, vel] = found;\n            this.pushStackFrame(\n                curFrame.handlerName,\n                curFrame.message,\n                ast,\n                lineRef,\n                vel.idInternal,\n                vel.parentIdInternal,\n                undefined\n            );\n        }\n    }\n\n    /**\n     * return an expression, place results into the local variable \"result\"\n     */\n    visitReturnExpr(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        let val = this.evalRequestedExpression(parsed, curLine);\n\n        /* set the result as a local variable in the frame beneath */\n        let frameBeneath = this.stack[this.stack.length - 2];\n        if (frameBeneath !== undefined) {\n            frameBeneath.locals.set('$result', val);\n        }\n\n        this.stack.pop();\n    }\n\n    /**\n     * get block information (e.g. branch offsets)\n     */\n    protected getBlockInfo(curLine: VpcCodeLine, nAtLeast: number): VpcCodeLineReference[] {\n        if (curLine.blockInfo && curLine.blockInfo.length >= nAtLeast) {\n            return curLine.blockInfo;\n        } else {\n            checkThrow(false, `5V|no branches stored in blockInfo`);\n        }\n    }\n\n    /**\n     * start an \"if\" block\n     */\n    visitIfStart(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* if blocks must start with \"if\" and end with an \"end if\" */\n        let blockInfo = this.getBlockInfo(curLine, 2);\n        let blockEnd = arLast(blockInfo);\n        assertEq(curLine.offset, blockInfo[0].offset, '5U|');\n        assertEq(curLine.lineId, blockInfo[0].lineId, '5T|');\n        assertEq(VpcLineCategory.IfEnd, curFrame.codeSection.lines[blockEnd.offset].ctg, '5S|');\n\n        /* mark all of the child branches as untried. */\n        for (let i = 0; i < blockInfo.length; i++) {\n            curFrame.offsetsMarked[blockInfo[i].offset] = false;\n            assertEq(blockInfo[i].lineId, curFrame.codeSection.lines[blockInfo[i].offset].lineId, '5R|');\n        }\n\n        let evaluated = this.evalRequestedExpression(parsed, curLine);\n        let got = evaluated.readAsStrictBoolean();\n        if (got) {\n            /* enter this branch */\n            curFrame.offsetsMarked[blockInfo[0].offset] = true;\n            curFrame.next();\n        } else {\n            /* skip to the next */\n            this.validatedGoto(curFrame, blockInfo[1]);\n        }\n    }\n\n    /**\n     * start an \"else\"\n     * use offsetsMarked to record where we've been\n     */\n    visitIfElsePlain(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        let blockInfo = this.getBlockInfo(curLine, 3);\n        let anyTaken = blockInfo.some(ln => curFrame.offsetsMarked[ln.offset]);\n        if (anyTaken) {\n            /* we've already taken a branch - skip to one past the end of the block */\n            this.validatedGoto(curFrame, arLast(blockInfo));\n            curFrame.next();\n        } else {\n            /* enter the branch */\n            curFrame.offsetsMarked[curLine.offset] = true;\n            curFrame.next();\n        }\n    }\n\n    /**\n     * run an \"end if\"\n     */\n    visitIfEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        curFrame.next();\n    }\n\n    /**\n     * run an \"exit repeat\"\n     */\n    visitRepeatExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* advance to one line past the end of the loop */\n        let blockInfo = this.getBlockInfo(curLine, 2);\n        this.validatedGoto(curFrame, arLast(blockInfo));\n        curFrame.next();\n    }\n\n    /**\n     * run an \"end repeat\"\n     */\n    visitRepeatEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        /* go back to the top of the loop */\n        let blockInfo = this.getBlockInfo(curLine, 2);\n        this.validatedGoto(curFrame, blockInfo[0]);\n    }\n\n    /**\n     * run a \"next repeat\"\n     */\n    visitRepeatNext(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        return this.visitRepeatEnd(curFrame, curLine, parsed);\n    }\n\n    /**\n     * run a \"repeat\"\n     */\n    visitRepeatForever(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        curFrame.next();\n    }\n\n    /**\n     * run custom handler like doMyHandler\n     */\n    visitCallHandler(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        let newHandlerName = curLine.firstToken.image;\n        checkThrow(curLine.getParseRule() === this.cacheParsedCST.parser[tkstr.RuleInternalCmdUserHandler], 'Rw|');\n        let evaluated = this.evalGeneralVisit(parsed, curLine, true);\n        checkThrow(Array.isArray(evaluated), 'Rv|');\n        let args = evaluated as VpcVal[];\n        curFrame.next();\n        this.callHandlerAndThrowIfNotExist(curFrame, curLine, args, newHandlerName);\n    }\n\n    /**\n     * call a handler\n     */\n    protected callHandlerAndThrowIfNotExist(curFrame: VpcExecFrame, curLine: VpcCodeLine, args: VpcVal[], handlerName: string) {\n        /* reset the result, in case the callee doesn't return anything */\n        curFrame.locals.set('$result', VpcVal.Empty);\n        let found = this.getHandlerUpwardsOrThrow(curFrame.meId, curFrame.messageChain, handlerName, false);\n        if (found) {\n            let [ast, lineRef, vel] = found;\n            let newFrame = this.pushStackFrame(\n                handlerName,\n                curFrame.message,\n                ast,\n                lineRef,\n                vel.idInternal,\n                vel.parentIdInternal,\n                undefined\n            );\n            newFrame.args = args;\n            Util512.freezeRecurse(newFrame.args);\n            if (vel.getType() === VpcElType.Product && !curFrame.dynamicCodeOrigin) {\n                /* don't let the debugger say that the error was in standardlib */\n                newFrame.dynamicCodeOrigin = [curFrame.meId, curLine.firstToken.startLine ?? 0];\n            } else if (vel.getType() === VpcElType.Product) {\n                /* e.g. some code in standardlib is calling other code in standardlib */\n                newFrame.dynamicCodeOrigin = curFrame.dynamicCodeOrigin;\n            }\n        } else {\n            if (new CheckReservedWords().isBuiltinHandler(handlerName.toLowerCase())) {\n                /* it's fine, we shouldn't throw in this case.\n                send \"openCard\" to cd 3 should never be an error\n                even if there's no openCard handler.\n                same effect has putting empty handlers in the standardlib. */\n            } else {\n                checkThrow(false, `5O|tried to call ${handlerName} but no handler of this name found`);\n            }\n        }\n    }\n\n    /**\n     * 'send' has both an expression and a target object,\n     * so can't use the typical evalRequestedExpression\n     */\n    protected visitSendStatement(curLine: VpcCodeLine, parsed: VpcParsed): [VpcVal, VpcElBase] {\n        assertTrue(this.cacheParsedCST.parser[tkstr.RuleCmdSend] === curLine.getParseRule(), 'Ru|expected \"send\" parse rule');\n\n        let visited = this.evalGeneralVisit(parsed, curLine);\n        checkThrow(visited instanceof IntermedMapOfIntermedVals, '7w|visitSendStatement wrong type');\n        checkThrow(\n            visited.vals.RuleExpr && visited.vals.RuleObject,\n            'Rt|visitSendStatement expected both RuleExpr and RuleObject'\n        );\n\n        //~ let isDo = visited.vals[tkstr.tkStringLiteral] && visited.vals[tkstr.tkStringLiteral][0] === 'do'\n        let val = visited.vals.RuleExpr[0];\n        checkThrow(val instanceof VpcVal, 'Rs|visitSendStatement expected a string.');\n        let newLineAndLowercaseCode = '\\n' + val.readAsString().toLowerCase();\n        checkThrow(\n            !newLineAndLowercaseCode.includes('\\nfunction\\n') && !newLineAndLowercaseCode.includes('\\non\\n'),\n            `Rr|defining custom handlers in dynamic code\n            is an interesting idea, but it's not supported yet.`\n        );\n\n        let velRef = visited.vals.RuleObject[0];\n        checkThrow(velRef instanceof RequestedVelRef, 'Rq|visitSendStatement expected vel reference.');\n        let vel = ensureDefined(this.outside.ResolveVelRef(velRef), \"Rp|target of 'send' not found\");\n\n        return [val, vel];\n    }\n\n    /**\n     * run dynamically built code.\n     */\n    visitCallDynamic(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        let [val, velTarget] = this.visitSendStatement(curLine, parsed);\n        let codeToCompile = val.readAsString();\n        curFrame.next();\n        let meId = velTarget.idInternal;\n        let statedParentId = velTarget.idInternal;\n        let dynamicCodeOrigin: [string, number] = [curFrame.meId, curLine.firstToken.startLine ?? 0];\n\n        /* confirmed in original product: if there's no return statement,\n        return the last result that was computed. send \"myCompute\" to cd btn 4,\n        it would make sense that the result is set to the result of myCompute. */\n        codeToCompile += '\\nreturn the result';\n        let [ast, lineref, newHandlerName] = this.visitCallDynamicHelper(\n            codeToCompile,\n            meId,\n            statedParentId,\n            velTarget.idInternal,\n            dynamicCodeOrigin\n        );\n        this.callCodeAtATarget(\n            curFrame,\n            ast,\n            lineref,\n            newHandlerName,\n            meId,\n            statedParentId,\n            velTarget.idInternal,\n            VpcBuiltinMsg.SendCode,\n            dynamicCodeOrigin\n        );\n    }\n\n    /**\n     * run dynamically-built code like 'send \"answer 1+1\" to cd btn \"myBtn\"'\n        confirmed in the product when running `send`,\n        \"the target\" and \"me\" are both set to the recipient of the event\n     */\n    visitCallDynamicHelper(\n        codeToCompile: string,\n        meId: string,\n        statedParentId: string,\n        targetId: string,\n        dynamicCodeOrigin: [string, number]\n    ): [VpcParsedCodeCollection, VpcCodeLineReference, string] {\n        /*\n        build a new temporary handler, then call it.\n        give the temp handler a unique name?\n        seems safer, but then it couldn't be cached. */\n        let newHandlerName = 'vpcinternaltmpcode';\n        let code = longstr(\n            `\n        on ${newHandlerName}\n        ${codeToCompile}\n        end ${newHandlerName}\n        `,\n            '\\n'\n        );\n\n        VpcCurrentScriptStage.currentStage = VpcErrStage.SyntaxStep;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = meId;\n        VpcCurrentScriptStage.dynamicCodeOrigin = dynamicCodeOrigin;\n        let [codeColl, lineRef] = this.cacheParsedAST.getHandlerOrThrow(\n            code,\n            newHandlerName,\n            meId,\n            this.outside.Model().stack.getB('compatibilitymode')\n        );\n        checkThrow(lineRef, 'Ro|did not find the handler we just created?');\n        VpcCurrentScriptStage.currentStage = VpcErrStage.SyntaxStep;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = meId;\n        VpcCurrentScriptStage.dynamicCodeOrigin = undefined;\n        return [codeColl, lineRef, newHandlerName];\n    }\n\n    /**\n     * call code in the context of another object. \"me\" is set correctly.\n     */\n    private callCodeAtATarget(\n        curFrame: VpcExecFrame,\n        code: VpcParsedCodeCollection,\n        linref: VpcCodeLineReference,\n        newHandlerName: string,\n        meId: string,\n        statedParentId: string,\n        velTargetId: string,\n        msg: VpcBuiltinMsg,\n        dynamicCodeOrigin: O<[string, number]>\n    ) {\n        curFrame.locals.set('$result', VpcVal.Empty);\n\n        /* this is a bit interesting: we are setting the \"me\" and the \"StatedParent\" to the\n        same object, so that calls in the new code can access the real object's code\n        in the message chain. */\n        let newScriptMessage = Util512.shallowClone<VpcScriptMessage>(curFrame.message);\n        newScriptMessage.targetId = velTargetId;\n        newScriptMessage.msgName = getEnumToStrOrFallback(VpcBuiltinMsg, msg);\n        newScriptMessage.msg = msg;\n        let newFrame = this.pushStackFrame(\n            newHandlerName,\n            newScriptMessage,\n            code,\n            linref,\n            meId,\n            statedParentId,\n            dynamicCodeOrigin\n        );\n        newFrame.args = [];\n    }\n\n    /**\n     * some commands like \"go to card\"\n     * are done mostly in software, but need help here\n     * to say, send closefield/exitfield events or do visual effects.\n     */\n    visitIsInternalvpcmessagesdirective(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcParsed) {\n        curFrame.next();\n        checkThrow(curLine.excerptToParse.length === 2 || curLine.excerptToParse.length === 3, 'Rn|');\n        checkThrowEq(tks.tkStringLiteral, curLine.excerptToParse[1].tokenType, 'Rm|');\n        let directive = curLine.excerptToParse[1].image.replace(/\"/g, '').toLowerCase();\n        let variable: O<string>;\n        let variableSend = new ValHolder('');\n        if (curLine.excerptToParse.length > 2) {\n            checkThrowEq(tks.tkIdentifier, curLine.excerptToParse[2].tokenType, 'Rl|');\n            variable = curLine.excerptToParse[2].image;\n            variableSend.val = curFrame.locals.get(ensureDefined(variable, 'VC|')).readAsString();\n        }\n\n        let sendMsgParam: [string, string] = ['', ''];\n        let valBefore = variableSend.val;\n        this.directiveImpl.go(directive, variableSend, sendMsgParam);\n        if (valBefore !== variableSend.val) {\n            curFrame.locals.set(ensureDefined(variable, 'Ri|'), VpcValS(variableSend.val));\n        }\n\n        let sendMsg = sendMsgParam[0];\n        let sendMsgTarget = sendMsgParam[1];\n        if (slength(sendMsg)) {\n            let theMsg = getStrToEnum<VpcBuiltinMsg>(VpcBuiltinMsg, this.visitIsInternalvpcmessagesdirective.name, sendMsg);\n            let found = this.getHandlerUpwardsOrThrow(\n                this.originalMsg.targetId,\n                curFrame.messageChain,\n                this.originalMsg.msgName,\n                false\n            );\n            if (found) {\n                let [ast, lineRef, vel] = found;\n                this.callCodeAtATarget(\n                    curFrame,\n                    ast,\n                    lineRef,\n                    sendMsg,\n                    vel.idInternal,\n                    vel.parentIdInternal,\n                    sendMsgTarget,\n                    theMsg,\n                    undefined\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecInternalDirective.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { RememberHistory } from './../vpcutils/vpcUtils';\n/* auto */ import { RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { VpcElType, VpcVisualEffectSpec, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { VpcElField } from './../vel/velField';\n/* auto */ import { VpcElCard } from './../vel/velCard';\n/* auto */ import { VpcElBase } from './../vel/velBase';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, ValHolder } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * provide advanced capabilities to scripts.\n * this is, for example, how doMenu can accomplish so many things\n * fully implemented in a higher level.\n */\nexport abstract class VpcExecInternalDirectiveAbstract {\n    outside: OutsideWorldReadWrite;\n    abstract setGlobal(key: string, v: VpcVal): void;\n    abstract getGlobal(key: string): VpcVal;\n    abstract getCardHistory(): RememberHistory;\n    abstract goMakevelwithoutmsg(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]): VpcElBase;\n    abstract goRemovevelwithoutmsg(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]): void;\n    abstract rawCreateOneVelUseCarefully(parentId: string, type: VpcElType, insertIndex: number, newId: O<string>): VpcElBase;\n    abstract setSelection(vel: O<VpcElField>, start: number, end: number): void;\n\n    /**\n     * run a directive\n     */\n    go(directive: string, param: ValHolder<string>, msg: [string, string]) {\n        let cur = this.outside.Model().getCurrentCard();\n        Util512.callAsMethodOnClass(\n            'VpcExecInternalDirectiveAbstract',\n            this,\n            'go' + Util512.capitalizeFirst(directive),\n            [param, cur, msg],\n            false,\n            '',\n            true /*okIfOnParentClass*/\n        );\n    }\n\n    /**\n     * sends either the closeField or exitField message\n     */\n    goCloseorexitfield(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let seld = this.outside.FindSelectedTextBounds()[0];\n        if (seld && seld.parentIdInternal === cur.idInternal) {\n            let fieldsRecent = this.outside.GetFieldsRecentlyEdited().val;\n            if (fieldsRecent[seld.idInternal]) {\n                msg[0] = 'closefield';\n                msg[1] = seld.idInternal;\n                fieldsRecent[seld.idInternal] = false;\n            } else {\n                msg[0] = 'exitfield';\n                msg[1] = seld.idInternal;\n            }\n            /* we're changing cards, so mark the other ones false too */\n            this.outside.GetFieldsRecentlyEdited().val = {};\n        }\n    }\n\n    /**\n     * sets current card\n     */\n    goGotocardsendnomessages(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let nextCardId = VpcValS(param.val);\n        checkThrow(nextCardId && nextCardId.isItInteger(), 'Rj|');\n        this.outside.SetCurCardNoOpenCardEvt(nextCardId.readAsString());\n    }\n\n    /**\n     * starts visual effect\n     */\n    goViseffect(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let nextCardId = VpcValS(param.val);\n        let spec = this.getGlobal('$currentVisEffect').readAsString().split('|');\n        this.setGlobal('$currentVisEffect', VpcValS(''));\n        if (spec.length >= 4) {\n            let parsed = VpcVisualEffectSpec.getVisualEffect(spec);\n            console.log(nextCardId, parsed);\n        }\n    }\n\n    /**\n     * return focus to messagebox\n     */\n    goReturntomsgbox(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        this.outside.WriteToReplMessageBox('', true);\n    }\n\n    /**\n     * implement 'go back' and 'go forth'\n     */\n    goApplybackforth(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let fallback = () => cur.idInternal;\n        let cardExists = (s: string) => {\n            let ref = new RequestedVelRef(VpcElType.Card);\n            ref.lookById = Util512.parseInt(s);\n            return bool(this.outside.ElementExists(ref));\n        };\n\n        if (param.val === 'back') {\n            this.getCardHistory().walkPreviousWhileAcceptible(fallback, cardExists);\n        } else {\n            this.getCardHistory().walkNextWhileAcceptible(fallback, cardExists);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecStatement.ts",
    "content": "\n/* auto */ import { IntermedMapOfIntermedVals, VpcIntermedValBase, VpcVal, VpcValBool, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcScriptMessage } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk, tks, tkstr } from './../codeparse/vpcTokens';\n/* auto */ import { VpcScriptExecuteStatementHelpers } from './vpcScriptExecStatementHelpers';\n/* auto */ import { VpcExecInternalDirectiveAbstract } from './vpcScriptExecInternalDirective';\n/* auto */ import { AsyncCodeOpState, FnAnswerMsgCallback, FnAskMsgCallback, VpcPendingAsyncOps, VpcScriptExecAsync } from './vpcScriptExecAsync';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { VpcCodeLine, VpcLineCategory } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { MapTermToMilliseconds, OrdinalOrPosition, SortType, VpcChunkPreposition, VpcElType, VpcGranularity, VpcTool, VpcToolCtg, checkThrow, checkThrowEq, checkThrowNotifyMsg, getToolCategory, originalToolNumberToTool } from './../vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { ChunkResolutionSort } from './../vpcutils/vpcChunkResolutionSort';\n/* auto */ import { ChunkResolution } from './../vpcutils/vpcChunkResolution';\n/* auto */ import { VpcAudio } from './../vpcutils/vpcAudio';\n/* auto */ import { RWContainerField } from './../vel/velResolveContainer';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { VpcElField } from './../vel/velField';\n/* auto */ import { VoidFn } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, ValHolder, cast, getStrToEnum, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * execute a single line of code\n */\nexport class ExecuteStatement {\n    cbAskMsg: O<FnAskMsgCallback>;\n    cbAnswerMsg: O<FnAnswerMsgCallback>;\n    cbStopCodeRunning: O<VoidFn>;\n\n    outside: OutsideWorldReadWrite;\n    pendingOps: VpcPendingAsyncOps;\n    h = new VpcScriptExecuteStatementHelpers();\n    directiveImpl: VpcExecInternalDirectiveAbstract;\n\n    /**\n     * execute a single line of code\n     */\n    go(line: VpcCodeLine, visitResult: VpcIntermedValBase, blocked: ValHolder<AsyncCodeOpState>, msg: VpcScriptMessage) {\n        checkThrowEq(VpcLineCategory.Statement, line.ctg, '7h|not a statement');\n        let firstToken = line.firstToken;\n        let method = 'go' + Util512.capitalizeFirst(firstToken.image);\n        Util512.callAsMethodOnClass(ExecuteStatement.name, this, method, [line, visitResult, blocked, msg], false);\n    }\n\n    /**\n     * add {number} to [chunk of] {container}\n     * Adds the value of number to the number in a container.\n     */\n    goAdd(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.h.goMathAlter(line, vals, (a: number, b: number) => a + b);\n    }\n    /**\n     * Displays a dialog box.\n     * The button that is pressed (1, 2, or 3) will be assigned to the variable \"it\".\n     */\n    goAnswer(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>) {\n        let ruleCaption = tkstr.RuleExpr;\n        let captionVals = this.h.getChildVpcVals(vals, ruleCaption, true);\n        let captionArgs = captionVals.map(item => item.readAsString());\n        let ruleChoices = tkstr.RuleLvl6Expression;\n        let choicesVals = this.h.getChildVpcVals(vals, ruleChoices, false);\n        let choicesArgs = choicesVals.map(item => item.readAsString());\n\n        /* because there is only 1 script execution thread, don't need to assign a unique id. */\n        let asyncOpId = 'singleThreadAsyncOpId';\n        VpcScriptExecAsync.goAsyncAnswer(\n            this.pendingOps,\n            blocked,\n            this.outside,\n            this.cbAnswerMsg,\n            this.cbStopCodeRunning,\n            asyncOpId,\n            captionArgs[0] || '',\n            choicesArgs[0] || '',\n            choicesArgs[1] || '',\n            choicesArgs[2] || ''\n        );\n    }\n    /**\n     * Displays a dialog box allowing the user to type in a response.\n     * The text typed will be assigned to the variable \"it\".\n     * If the user clicks Cancel, the result will be an empty string \"\".\n     */\n    goAsk(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>) {\n        let argsVals = this.h.getChildVpcVals(vals, tkstr.RuleExpr, true);\n        let args = argsVals.map(item => item.readAsString());\n\n        /* because there is only 1 script execution thread, don't need to assign a unique id. */\n        let asyncOpId = 'singleThreadAsyncOpId';\n        VpcScriptExecAsync.goAsyncAsk(\n            this.pendingOps,\n            blocked,\n            this.outside,\n            this.cbAskMsg,\n            this.cbStopCodeRunning,\n            asyncOpId,\n            args[0] || '',\n            args[1] || ''\n        );\n    }\n    /**\n     * Play the system beep sound.\n     */\n    goBeep(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        VpcAudio.beep();\n    }\n    /**\n     * choose {toolname} tool\n     * Use the choose command for programmatically drawing pictures.\n     * Doesn't set the actual tool, which is always Browse when scripts are running.\n     */\n    goVpccalluntrappablechoose(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let term = ensureDefined(this.h.findChildVal(vals, tkstr.RuleExpr), '5G|');\n        let tool = this.getWhichTool(term.readAsString());\n        let ctg = getToolCategory(tool);\n\n        /* see if we support setting to this tool */\n        if (\n            ctg === VpcToolCtg.CtgShape ||\n            ctg === VpcToolCtg.CtgSmear ||\n            ctg === VpcToolCtg.CtgBucket ||\n            ctg === VpcToolCtg.CtgCurve ||\n            ctg === VpcToolCtg.CtgBrowse\n        ) {\n            this.outside.SetOption('mimicCurrentTool', tool);\n        } else {\n            checkThrow(\n                false,\n                longstr(`5F|the choose command is currently used for\n                simulating drawing only, so it must be one of the\n                paint tools like \"pencil\" or \"brush\" chosen`)\n            );\n        }\n    }\n    /**\n     * click at {x}, {y}\n     * Use the click command for programmatically drawing pictures.\n     */\n    goClick(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>, msg: VpcScriptMessage) {\n        return this.h.clickOrDrag(line, vals, 'at', msg);\n    }\n    /**\n     * delete char {i} of {container}\n     */\n    goDelete(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        if (vals.vals.RuleObject && vals.vals.RuleObject.length) {\n            checkThrow(false, \"5C|the 'delete' command is not yet supported for btns or flds.\");\n        } else {\n            let contRef = ensureDefined(this.h.findChildAndCast(RequestedContainerRef, vals, tkstr.RuleHSimpleContainer), '5B|');\n            let chunk = ensureDefined(this.h.findChildAndCast(RequestedChunk, vals, tkstr.RuleHChunk), '5A|');\n\n            contRef.chunk = chunk;\n            let cont = this.outside.ResolveContainerWritable(contRef);\n            ChunkResolution.applyDelete(\n                cont,\n                contRef.chunk,\n                this.outside.GetItemDelim(),\n                this.outside.Model().stack.getB('compatibilitymode')\n            );\n        }\n    }\n    /**\n     * Dial a number with old touch tones\n     */\n    goDial(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>) {\n        let args = this.h.getChildVpcVals(vals, tkstr.RuleExpr, true);\n\n        /* read as a string, since it could have embedded - or a leading zero */\n        let numbersToDial = args[0].readAsString();\n\n        /* because there is only 1 script execution thread, don't need to assign a unique id. */\n        let asyncOpId = 'singleThreadAsyncOpId';\n        VpcScriptExecAsync.goAsyncDial(this.pendingOps, blocked, asyncOpId, numbersToDial);\n    }\n    /**\n     * divide [chunk of] {container} by {number}\n     * Divides the number in a container by a number.\n     */\n    goDivide(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.h.goMathAlter(line, vals, (a: number, b: number) => a / b);\n    }\n    /**\n     * disable a vel\n     */\n    goDisable(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.setEnabled(line, vals, false);\n    }\n    /**\n     * drag from {x1}, {y1} to {x2}, {y2}\n     * Use the drag command for programmatically drawing pictures.\n     */\n    goDrag(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>, msg: VpcScriptMessage) {\n        return this.h.clickOrDrag(line, vals, 'from', msg);\n    }\n    /**\n     * enable a vel\n     */\n    goEnable(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.setEnabled(line, vals, true);\n    }\n    /**\n     * show an error, appears as a script error conveniently\n     */\n    goVpccalluntrappableerrordialog(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let args = this.h.getChildVpcVals(vals, tkstr.RuleExpr, true);\n        let s = args[0].readAsString();\n        checkThrowNotifyMsg(false, 'aa|' + s);\n    }\n    /**\n     * hide command. hide an object or the menubar\n     */\n    goHide(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let ref = this.h.findChildVelRef(vals, tkstr.RuleObject);\n        let identifier = this.h.findChildStr(vals, tkstr.tkIdentifier);\n        if (ref) {\n            this.outside.SetProp(ref, 'visible', VpcVal.False, undefined);\n        } else if (identifier) {\n            if (identifier === 'menubar') {\n                this.outside.SetOption('fullScreen', true);\n            } else {\n                checkThrow(false, '4_|so far we only support hide menubar or hide cd btn 1');\n            }\n        } else {\n            checkThrow(false, '4^|all choices null');\n        }\n    }\n    /**\n     * lock screen\n     */\n    goLock(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        checkThrow(params[0] === 'screen', 'R<|only support lock screen');\n        this.outside.SetOption('screenLocked', true);\n    }\n    /**\n     * mark cards\n     */\n    goMark(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        let shouldMark = !bool(vals.vals[tkstr._not]?.length);\n        if (params[0] === 'all') {\n            for (let bg of this.outside.Model().stack.bgs) {\n                for (let cd of bg.cards) {\n                    cd.setOnVel('marked', shouldMark, this.outside.Model());\n                }\n            }\n        } else {\n            let ref = ensureDefined(this.h.findChildVelRef(vals, tkstr.RuleObject), 'VJ|no object?');\n            let vel = ensureDefined(this.outside.ResolveVelRef(ref), 'VI|could not find card');\n            checkThrow(vel.getType() === VpcElType.Card, 'VH|you can only mark a card');\n            vel.setOnVel('marked', shouldMark, this.outside.Model());\n        }\n    }\n    /**\n     * multiply [chunk of] {container} by {number}\n     * Multiplies the number in a container by a number.\n     */\n    goMultiply(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.h.goMathAlter(line, vals, (a: number, b: number) => a * b);\n    }\n    /**\n     * Play a sound effect.\n     * Use\n     *      play \"mySound\" load\n     * first, and then\n     *      play \"mySound\"\n     */\n    goPlay(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        /* this one's a little different.\n        original product supports play \"mySound\" \"abc\",\n        which is consecutive expressions which we don't want to support.\n        so 1) in rewrites, add a TkSyntaxMarker after each param\n        2) parser only accepts variables, num literals, or string literals\n        3) this way we can also get tempo, stop, load, etc. */\n        let ar = vals.vals[tkstr.RuleHBuiltinCmdPlay_1];\n        checkThrow(ar && ar.length, 'no args given');\n        let tempo = 0;\n        let isStop = false;\n        let isLoad = false;\n        let theSound: O<string>;\n        let theNotes: O<string>;\n        let isGettingTempo = false;\n        for (let item of ar) {\n            let tk = item as ChvITk;\n            let s = tk.tokenType === tks.tkStringLiteral ? tk.image.slice(1, -1) : tk.image;\n            if (s === 'stop') {\n                isStop = true;\n            } else if (s === 'load') {\n                isLoad = true;\n            } else if (s === 'tempo') {\n                isGettingTempo = true;\n            } else {\n                let val = this.h.getValAsLiteralOrVar(tk);\n                if (isGettingTempo) {\n                    tempo = VpcValS(val).readAsStrictNumeric();\n                    isGettingTempo = false;\n                } else if (theSound === undefined) {\n                    theSound = val;\n                } else if (theNotes === undefined) {\n                    theNotes = val;\n                } else {\n                    checkThrow(false, 'too many args to play', tk.image);\n                }\n            }\n        }\n\n        checkThrow(isStop || theSound, 'no sound specified');\n        checkThrow(!isStop, 'stop not yet supported');\n        checkThrow(!theNotes, 'notes not yet supported');\n        checkThrow(!tempo, 'tempo not yet supported');\n\n        if (theSound) {\n            if (isLoad) {\n                VpcAudio.preloadNoThrow(theSound);\n            } else {\n                VpcAudio.play(theSound);\n            }\n        }\n    }\n    /**\n     * put {expression} into {container}\n     * Evaluates any expression and saves the result to a variable or container.\n     */\n    goPut(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        /* for performance, visiting a put returns a flat array */\n        let ar = vals as any;\n        let val = cast(VpcVal, ar[0]);\n        let prep = getStrToEnum<VpcChunkPreposition>(VpcChunkPreposition, 'VpcChunkPreposition', ar[1]);\n        let contRef = cast(RequestedContainerRef, ar[2]);\n        let cont = this.outside.ResolveContainerWritable(contRef);\n        let itemDel = this.outside.GetItemDelim();\n        let compatibility = this.outside.Model().stack.getB('compatibilitymode');\n        ChunkResolution.applyPut(cont, contRef.chunk, itemDel, val.readAsString(), prep, compatibility);\n    }\n    /**\n     * reset paint/ menubar\n     */\n    goReset(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        checkThrow(params[0] === 'paint', 'R:|only support reset paint');\n        checkThrow(false, \"52|the 'reset' command is not yet implemented.\");\n    }\n    /**\n     * replace text\n     */\n    goReplace(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let exprs = vals.vals[tkstr.RuleExpr];\n        let expr1 = exprs[0];\n        let expr2 = exprs[1];\n        checkThrowEq(2, exprs.length, 'R/|');\n        checkThrow(expr1 instanceof VpcVal, 'R.|');\n        checkThrow(expr2 instanceof VpcVal, 'R-|');\n        let searchFor = expr1.readAsString();\n        let replaceWith = expr2.readAsString();\n\n        let contRef = ensureDefined(this.h.findChildAndCast(RequestedContainerRef, vals, tkstr.RuleHSimpleContainer), 'R,|');\n        let cont = this.outside.ResolveContainerWritable(contRef);\n        cont.replaceAll(searchFor, replaceWith);\n    }\n    /**\n     * selects text\n     * does support 'put \"cd fld id 213\" into x; select line 3 of x'\n     * doesn't need to support 'select line 3 of the target; select line 3 of the selection'\n     */\n    goSelect(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals);\n        if (params[0] === 'empty') {\n            this.directiveImpl.setSelection(undefined, 0, 0);\n        } else {\n            let chunk = this.h.findChildAndCast(RequestedChunk, vals, tkstr.RuleHChunk);\n            let velRef = ensureDefined(this.h.findChildVelRef(vals, tkstr.RuleObject), 'VG|');\n            let resolved = this.outside.ResolveVelRef(velRef);\n            checkThrow(resolved instanceof VpcElField, 'VF|expected a field');\n            if (resolved.parentIdInternal !== this.outside.GetCurrentCardId()) {\n                /* trying to select something on another card is a no-op */\n            } else {\n                let cont = new RWContainerField(resolved, this.outside.Model());\n                let bounds = ChunkResolution.applyRead(cont, chunk, this.outside.GetItemDelim());\n                if (bounds) {\n                    if (params[0] === 'before') {\n                        bounds.endPos = bounds.startPos;\n                    } else if (params[0] === 'after') {\n                        bounds.startPos = bounds.endPos;\n                    }\n\n                    this.directiveImpl.setSelection(resolved, bounds.startPos, bounds.endPos);\n                }\n            }\n        }\n    }\n    /**\n     * set the {property} of {button|field} to {value}\n     */\n    goSet(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let velRef = this.h.findChildAndCast(RequestedVelRef, vals, 'velRef');\n        let velRefChunk = this.h.findChildAndCast(RequestedChunk, vals, 'chunk');\n        let tk = ensureDefined(vals.vals[tkstr.RuleHCouldBeAPropertyToSet], 'R(|')[0];\n        let propName = (tk as ChvITk).image;\n\n        /* let's concat all of the values together into one string separated by commas */\n        /* that way we'll support coordinates \"1,2\" and text styles \"plain, bold\" */\n        let strings: string[] = [];\n        let val = this.h.findChildMap(vals, tkstr.RuleAnyPropertyVal);\n        let nm = tkstr.RuleLvl1Expression;\n        let ar = val ? val.vals[nm] : undefined;\n        if (ar && ar.length) {\n            let arVals = ar as VpcVal[];\n            for (let i = 0, len = arVals.length; i < len; i++) {\n                let item = arVals[i];\n                assertTrue(item instanceof VpcVal, '50|every item must be a vpcval');\n                strings.push(item.readAsString());\n            }\n        }\n\n        checkThrow(strings.length > 0, '7L|could not find RuleAnyPropertyVal or its child', nm);\n        let combined = VpcValS(strings.join(','));\n        if (!velRef) {\n            /* no velref? this is a productopts */\n            velRef = new RequestedVelRef(VpcElType.Product);\n            velRef.lookByRelative = OrdinalOrPosition.This;\n        }\n\n        this.outside.SetProp(velRef, propName, combined, velRefChunk);\n    }\n    /**\n     * show {button|field}\n     */\n    goShow(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let identifiers = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        if (identifiers && identifiers[0] === 'menubar') {\n            this.outside.SetOption('fullScreen', false);\n            return;\n        }\n\n        checkThrow(!identifiers || identifiers.length === 0, 'R&|show identifier unknown');\n        let location = this.h.getChildVpcVals(vals, tkstr.RuleLvl4Expression, false);\n        let locationStr = location.map(v => v.readAsString()).join(',');\n\n        let ref = ensureDefined(this.h.findChildVelRef(vals, tkstr.RuleObject), '4||');\n        this.outside.SetProp(ref, 'visible', VpcVal.True, undefined);\n        if (locationStr) {\n            this.outside.SetProp(ref, 'location', VpcValS(locationStr), undefined);\n        }\n    }\n    /**\n     * sort (has been rewritten to add string literal params)\n     */\n    goSort(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals);\n        checkThrowEq(2, params.length, 'R%|');\n        let itemDel = this.outside.GetItemDelim();\n        let [smethod, sorder] = params;\n        let sg = ensureDefined(this.h.findChildStr(vals, tkstr.tkChunkGranularity), 'R#|');\n        let granularity = getStrToEnum<VpcGranularity>(VpcGranularity, 'Granularity', sg);\n        let method = getStrToEnum<SortType>(SortType, 'SortType', smethod);\n        let ascend = sorder.toLowerCase() !== 'descending';\n        let contRef = ensureDefined(this.h.findChildAndCast(RequestedContainerRef, vals, tkstr.RuleHSimpleContainer), '4[|');\n        let cont = this.outside.ResolveContainerWritable(contRef);\n        ChunkResolutionSort.applySort(cont, itemDel, granularity, method, ascend);\n    }\n    /**\n     * subtract [chunk of] {container} from {number}\n     * Subtracts a number from the number in a container.\n     */\n    goSubtract(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        this.h.goMathAlter(line, vals, (a: number, b: number) => a - b);\n    }\n    /**\n     * unlock screen\n     */\n    goUnlock(line: VpcCodeLine, vals: IntermedMapOfIntermedVals) {\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        checkThrow(params[0] === 'screen', 'R!|only support lock screen');\n        this.outside.SetOption('screenLocked', false);\n        if (params.length > 1) {\n            let str = params.slice(1).join('|');\n            this.outside.SetVarContents('$currentVisEffect', VpcValS(str));\n            checkThrow(false, 'R |visual effects are nyi');\n        }\n    }\n    /**\n     * visual effect\n     */\n    goVisual(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>) {\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        checkThrow(params[0] === 'effect', 'Rz|only support lock screen');\n        if (params.length > 1) {\n            let str = params.slice(1).join('|');\n            this.outside.DeclareGlobal('$currentVisEffect');\n            this.outside.SetVarContents('$currentVisEffect', VpcValS(str));\n            checkThrow(false, 'Ry|visual effects are nyi');\n        }\n    }\n    /**\n     * wait {number} [seconds|milliseconds|ms|ticks]\n     * Pauses the script.\n     */\n    goWait(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, blocked: ValHolder<AsyncCodeOpState>) {\n        /* essentially turn OrdinalOrPosition.second into \"second\" */\n        let params = this.h.getLiteralParams(vals, tkstr.tkIdentifier);\n        params = params.concat(this.h.getLiteralParams(vals, tkstr.tkOrdinalOrPosition));\n        let multiply = MapTermToMilliseconds.Ticks;\n        if (params && params.length) {\n            checkThrowEq(1, params.length, 'Rx|expected something like `wait 400 ms`');\n            multiply = getStrToEnum<MapTermToMilliseconds>(MapTermToMilliseconds, 'MapTermToMilliseconds', params[0]);\n        }\n\n        let args = this.h.getChildVpcVals(vals, tkstr.RuleExpr, true);\n        let number = args[0].readAsStrictNumeric();\n        /* because there is only 1 script execution thread, don't need to assign a unique id. */\n        let asyncOpId = 'singleThreadAsyncOpId';\n        let milliseconds = Math.max(0, Math.round(number * multiply));\n        VpcScriptExecAsync.goAsyncWait(this.pendingOps, blocked, asyncOpId, milliseconds);\n    }\n\n    /**\n     * understands both \"4\" and \"line\"\n     */\n    protected getWhichTool(s: string): VpcTool {\n        s = s.replace(/ +/g, '');\n        checkThrow(s.length >= 1, 'JP|not a valid tool name.');\n        let num = Util512.parseInt(s);\n        if (num !== undefined) {\n            return originalToolNumberToTool(num);\n        } else {\n            return getStrToEnum<VpcTool>(VpcTool, 'VpcTool', s);\n        }\n    }\n\n    /**\n     * set if a vel is enabled or not\n     */\n    protected setEnabled(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, b: boolean) {\n        let ref = ensureDefined(this.h.findChildVelRef(vals, tkstr.RuleObject), '59|');\n        let vel = this.outside.ResolveVelRef(ref);\n        checkThrow(vel, 'VE|could not find this object');\n        checkThrow(vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld, 'VD|object not a btn or fld');\n        this.outside.SetProp(ref, 'enabled', VpcValBool(b), undefined);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecStatementHelpers.ts",
    "content": "\n/* auto */ import { IntermedMapOfIntermedVals, VpcIntermedValBase, VpcVal, VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcScriptMessage } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk, tks, tkstr } from './../codeparse/vpcTokens';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { VpcCodeLine } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { checkThrow, checkThrowEq, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { AnyParameterCtor, cast } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * helpers for executing statements\n */\nexport class VpcScriptExecuteStatementHelpers {\n    outside: OutsideWorldReadWrite;\n\n    /**\n     * implementation of add, subtract, etc\n     */\n    goMathAlter(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, fn: (a: number, b: number) => number) {\n        let val = ensureDefined(this.findChildVal(vals, tkstr.RuleLvl1Expression), '5M|');\n        let container = ensureDefined(this.findChildAndCast(RequestedContainerRef, vals, tkstr.RuleHContainer), '5L|');\n        let getResultAsString = (s: string) => {\n            /* follow original product, treat empty string as 0 */\n            let f1 = s ? VpcValS(s).readAsStrictNumeric() : 0;\n            let f2 = val.readAsStrictNumeric();\n            let res = fn(f1, f2);\n            return VpcValN(res).readAsString();\n        };\n\n        this.outside.ContainerModify(container, getResultAsString);\n    }\n\n    /**\n     * click, drag implementation\n     */\n    clickOrDrag(line: VpcCodeLine, vals: IntermedMapOfIntermedVals, expectSee: string, msg: VpcScriptMessage) {\n        let argsGiven: number[] = [];\n        checkThrow(\n            vals.vals[tkstr.RuleHBuiltinCmdDrag_1] && vals.vals[tkstr.RuleHBuiltinCmdDrag_1].length,\n            'R>|no RuleHBuiltinCmdDrag_1'\n        );\n        for (let big of vals.vals[tkstr.RuleHBuiltinCmdDrag_1]) {\n            let a1 = cast(IntermedMapOfIntermedVals, big);\n            for (let item of a1.vals[tkstr.RuleLvl4Expression]) {\n                assertTrue(item instanceof VpcVal, 'JO|every item must be a vpcval');\n                /* confirmed in emulator that floats are not accepted here */\n                let coords = item.isIntegerList(2);\n                if (coords) {\n                    argsGiven = argsGiven.concat(coords);\n                } else {\n                    argsGiven.push(item.readAsStrictInteger());\n                }\n            }\n        }\n\n        checkThrow(argsGiven.length > 1, 'JN|not enough args');\n        let mods = ModifierKeys.None;\n        let allIdentifiers = this.getChildStrs(vals, tkstr.tkIdentifier, true);\n        let sawExpected = false;\n        for (let i = 0, len = allIdentifiers.length; i < len; i++) {\n            let id = allIdentifiers[i];\n            if (id === 'shiftkey') {\n                mods |= ModifierKeys.Shift;\n            } else if (id === 'optionkey') {\n                mods |= ModifierKeys.Opt;\n            } else if (id === 'commandkey' || id === 'cmdkey') {\n                mods |= ModifierKeys.Cmd;\n            } else if (id === expectSee) {\n                sawExpected = true;\n            }\n        }\n\n        checkThrow(sawExpected, 'JM|syntax error did not see ', expectSee);\n        this.outside.SimulateClick(argsGiven, mods);\n        if (msg && argsGiven.length >= 2) {\n            checkThrowInternal(msg instanceof VpcScriptMessage, 'VK|wrong type');\n            /* add click to the pr's click tracking.\n            confirmed in emulator that it uses first coordinates.\n            don't update lastSeenClickId--\n            we should update clickLoc() but not mouseClick() */\n            msg.clickLoc[0] = argsGiven[0];\n            msg.clickLoc[1] = argsGiven[1];\n        }\n    }\n\n    /**\n     * get string literal params\n     */\n    getLiteralParams(vals: IntermedMapOfIntermedVals, nm = tkstr.tkStringLiteral): string[] {\n        let strs = this.getChildStrs(vals, nm, false);\n        for (let i = 0; i < strs.length; i++) {\n            strs[i] = strs[i].toLowerCase();\n            if (strs[i].startsWith('\"') && strs[i].endsWith('\"')) {\n                strs[i] = strs[i].toLowerCase().slice(1, -1);\n            }\n        }\n\n        return strs;\n    }\n\n    /**\n     * get child strings\n     */\n    getChildStrs(vals: IntermedMapOfIntermedVals, nm: string, atLeastOne: boolean): string[] {\n        let ret: string[] = [];\n        if (vals.vals[nm]) {\n            for (let i = 0, len = vals.vals[nm].length; i < len; i++) {\n                let child = vals.vals[nm][i];\n                checkThrow(typeof child === 'string', '7T|not a string');\n                ret.push(child);\n            }\n        } else {\n            checkThrow(!atLeastOne, '7S|no child');\n        }\n\n        return ret;\n    }\n\n    /**\n     * get child VpcVals\n     */\n    getChildVpcVals(vals: IntermedMapOfIntermedVals, nm: string, atLeastOne: boolean): VpcVal[] {\n        let ret: VpcVal[] = [];\n        if (vals.vals[nm]) {\n            for (let i = 0, len = vals.vals[nm].length; i < len; i++) {\n                let child = vals.vals[nm][i];\n                checkThrow(child instanceof VpcVal, 'JS|');\n                ret.push(child);\n            }\n        } else {\n            checkThrow(!atLeastOne, 'JR|no child');\n        }\n\n        return ret;\n    }\n\n    /**\n     * retrieve an expected IntermedMapOfIntermedVals from the visitor result\n     */\n    findChildMap(vals: IntermedMapOfIntermedVals, nm: string): O<IntermedMapOfIntermedVals> {\n        let got = vals.vals[nm];\n        if (got) {\n            checkThrowEq(1, got.length, '7d|expected length 1');\n            let gotAsMap = got[0];\n            checkThrow(gotAsMap instanceof IntermedMapOfIntermedVals, '7c|wrong type');\n            return gotAsMap;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * retrieve an expected VpcVal from the visitor result\n     */\n    findChildVal(vals: IntermedMapOfIntermedVals, nm: string): O<VpcVal> {\n        let got = vals.vals[nm];\n        if (got) {\n            checkThrowEq(1, got.length, '7b|expected length 1');\n            let gotAsVal = got[0];\n            checkThrow(gotAsVal instanceof VpcVal, '7a|wrong type');\n            return gotAsVal;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * retrieve an expected string from the visitor result\n     */\n    findChildStr(vals: IntermedMapOfIntermedVals, nm: string): O<string> {\n        let got = vals.vals[nm];\n        if (got) {\n            let gotAsString = got[0] as string;\n            checkThrowEq(1, got.length, '7Z|expected length 1');\n            checkThrow(typeof gotAsString === 'string', '7Y|wrong type');\n            return gotAsString;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * retrieve an expected RequestedVelRef from the visitor result\n     */\n    findChildVelRef(vals: IntermedMapOfIntermedVals, nm: string): O<RequestedVelRef> {\n        let got = vals.vals[nm];\n        if (got) {\n            checkThrowEq(1, got.length, '7X|expected length 1');\n            let gotAsVelRef = got[0];\n            checkThrow(gotAsVelRef instanceof RequestedVelRef, '7W|wrong type');\n            return gotAsVelRef;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * retrieve an expected type of VpcIntermedValBase from the visitor result\n     */\n    findChildAndCast<T extends VpcIntermedValBase>(ctor: AnyParameterCtor<T>, vals: IntermedMapOfIntermedVals, nm: string): O<T> {\n        let got = vals.vals[nm];\n        if (got) {\n            let gotAsT = got[0] as T;\n            checkThrowEq(1, got.length, '7V|expected length 1');\n            return gotAsT;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * if a literal, return the literal, otherwise treat it as a variable\n     */\n    getValAsLiteralOrVar(tk: ChvITk): string {\n        if (tk.tokenType === tks.tkStringLiteral) {\n            return tk.image.slice(1, -1);\n        } else if (tk.tokenType === tks.tkNumLiteral) {\n            return tk.image;\n        } else {\n            return this.outside.ReadVarContents(tk.image).readAsString();\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeexec/vpcScriptExecTop.ts",
    "content": "\n/* auto */ import { VarCollection, VariableCollectionConstants } from './../vpcutils/vpcVarCollection';\n/* auto */ import { VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { CodeLimits, CountNumericId, RememberHistory, VpcScriptMessage, VpcScriptMessageMsgBoxCode } from './../vpcutils/vpcUtils';\n/* auto */ import { ExecuteStatement } from './vpcScriptExecStatement';\n/* auto */ import { VpcExecInternalDirectiveAbstract } from './vpcScriptExecInternalDirective';\n/* auto */ import { VpcExecFrameStack } from './vpcScriptExecFrameStack';\n/* auto */ import { VpcExecFrame } from './vpcScriptExecFrame';\n/* auto */ import { VpcCacheParsedAST, VpcCacheParsedCST } from './vpcScriptCaches';\n/* auto */ import { VpcCurrentScriptStage } from './../codepreparse/vpcPreparseCommon';\n/* auto */ import { PropAdjective, VpcBuiltinMsg, VpcElType, VpcErr, VpcErrStage, VpcTool } from './../vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './../codepreparse/vpcCheckReserved';\n/* auto */ import { VpcElStack } from './../vel/velStack';\n/* auto */ import { VelRenderName } from './../vel/velRenderName';\n/* auto */ import { OutsideWorldReadWrite } from './../vel/velOutsideInterfaces';\n/* auto */ import { VpcElBg } from './../vel/velBg';\n/* auto */ import { VpcElBase } from './../vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512BaseErr, assertWarn, respondUI512Error } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObjectCanSet, OrderedHash, ValHolder, assertWarnEq, lastIfThere, orderedHashSummary, slength } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * script execution in ViperCard\n *\n * user actions will schedule code execution by adding to the workQueue\n * periodically the Presenter within onIdle will call runTimeslice\n * and we'll start running code\n */\nexport class VpcExecTop {\n    globals = new VarCollection(CodeLimits.MaxGlobalVars, 'global');\n    cardHistory = new RememberHistory();\n    constants = new VariableCollectionConstants();\n    check = new CheckReservedWords();\n    runStatements = new ExecuteStatement();\n    workQueue: VpcExecFrameStack[] = [];\n    cbOnScriptError: O<(err: VpcErr, msg: O<VpcScriptMessage>) => void>;\n    cbCauseUIRedraw: O<() => void>;\n    cbSetRealTool: (tl: VpcTool) => void;\n    directiveImpl: VpcExecInternalDirectiveAbstract;\n    fieldsRecentlyEdited: ValHolder<{ [id: string]: boolean }> = new ValHolder({});\n    silenceMessagesForUIAction: ValHolder<O<VpcTool>> = new ValHolder(undefined);\n    protected justSawRepeatedMousedown = false;\n    protected readonly cachedCST: VpcCacheParsedCST;\n    readonly cachedAST: VpcCacheParsedAST;\n    protected readonly outside: OutsideWorldReadWrite;\n    protected haveSentOpenStack = false;\n    constructor(outside: OutsideWorldReadWrite, public idGen: CountNumericId) {\n        this.cachedAST = new VpcCacheParsedAST(this.idGen);\n        this.cachedCST = new VpcCacheParsedCST();\n        this.outside = outside;\n        this.runStatements.outside = outside;\n        this.runStatements.h.outside = outside;\n        this.cardHistory.keepBeforeEnd = true;\n    }\n\n    /**\n     * add an entry to the queue, scheduling code execution\n     */\n    scheduleCodeExec(msg: VpcScriptMessage) {\n        if (\n            this.silenceMessagesForUIAction.val &&\n            this.silenceMessagesForUIAction.val !== VpcTool.Browse &&\n            !(msg instanceof VpcScriptMessageMsgBoxCode)\n        ) {\n            /* all messages are silenced  */\n            console.log('Message was muted.', msg.msgName);\n            return;\n        }\n\n        let newWork = new VpcExecFrameStack(\n            this.outside,\n            this.cachedCST,\n            this.cachedAST,\n            this.runStatements,\n            this.constants,\n            this.globals,\n            this.check,\n            msg,\n            this.directiveImpl\n        );\n\n        let isRepeatedKeydown = newWork.originalMsg.msgName === 'afterkeydown' && newWork.originalMsg.keyRepeated;\n        if (isRepeatedKeydown && this.workQueue.length > 2) {\n            /* don't queue up a key that is held down at least beyond 3 evts */\n            return;\n        } else if (\n            (newWork.originalMsg.msgName === 'idle' || newWork.originalMsg.msgName === 'mousewithin') &&\n            this.workQueue.length > 0\n        ) {\n            /* don't queue up an onidle */\n            return;\n        }\n\n        /* don't let keydowns starve everyone else! */\n        if (isRepeatedKeydown) {\n            if (this.justSawRepeatedMousedown) {\n                return;\n            }\n\n            this.justSawRepeatedMousedown = true;\n        } else {\n            this.justSawRepeatedMousedown = false;\n        }\n\n        /* an error might be thrown, for example if\n        the script has a lexer error. */\n        try {\n            newWork.getAndRunHandlerOrThrow();\n            if (newWork.stack.length > 1) {\n                this.workQueue.push(newWork);\n            }\n        } catch (e) {\n            this.handleScriptException(e, 'scheduleCodeExec');\n        }\n    }\n\n    /**\n     * is code currently running?\n     */\n    isCodeRunning() {\n        /* check hasRunCode to make ui less gummed up */\n        return this.workQueue.length > 0 && this.workQueue[0].hasRunCode;\n    }\n\n    /**\n     * force code to stop running\n     */\n    forceStopRunning() {\n        this.workQueue.length = 0;\n        if (this.cbCauseUIRedraw) {\n            this.cbCauseUIRedraw();\n        }\n    }\n\n    /**\n     * run code, and trigger UI refresh\n     */\n    runTimeslice(ms: number) {\n        if (!this.haveSentOpenStack && !this.silenceMessagesForUIAction.val) {\n            this.haveSentOpenStack = true;\n            this.sendInitialOpenStackAndOpenCard();\n        }\n\n        if (this.workQueue.length === 0) {\n            return;\n        }\n\n        let codeRunningBefore = this.isCodeRunning();\n        try {\n            this.runTimesliceImpl(ms);\n        } catch (e) {\n            this.handleScriptException(e, 'runTimeslice');\n        }\n\n        let codeRunningAfter = this.isCodeRunning();\n        if (codeRunningBefore !== codeRunningAfter && this.cbCauseUIRedraw) {\n            this.cbCauseUIRedraw();\n        }\n        if (codeRunningBefore !== codeRunningAfter && !codeRunningAfter) {\n            this.resetAfterFrameStackIsDone();\n        }\n    }\n\n    /**\n     * send the first opencard, openbackground, and openstack message\n     */\n    sendInitialOpenStackAndOpenCard() {\n        {\n            /* send openstack */\n            let msg = new VpcScriptMessage(this.outside.Model().stack.idInternal, VpcBuiltinMsg.Openstack);\n            this.scheduleCodeExec(msg);\n        }\n\n        {\n            /* send openbackground */\n            let currentCard = this.outside.Model().getCardById(this.outside.GetCurrentCardId());\n            let currentBg = this.outside.Model().getOwner(VpcElBg, currentCard);\n            let msg = new VpcScriptMessage(currentBg.idInternal, VpcBuiltinMsg.Openbackground);\n            this.scheduleCodeExec(msg);\n        }\n\n        {\n            /* send opencard */\n            let msg = new VpcScriptMessage(this.outside.GetCurrentCardId(), VpcBuiltinMsg.Opencard);\n            this.scheduleCodeExec(msg);\n        }\n    }\n\n    /**\n     * some state should be reset after the call returns.\n     */\n    resetAfterFrameStackIsDone() {\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = undefined;\n        VpcCurrentScriptStage.dynamicCodeOrigin = undefined;\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Unknown;\n\n        this.outside.SetOption('screenLocked', false);\n        this.outside.SetOption('mimicCurrentTool', VpcTool.Browse);\n        this.outside.Model().productOpts.setProductOpt('itemDel', ',');\n        this.globals.set('$currentVisEffect', VpcValS(''));\n\n        if (this.silenceMessagesForUIAction.val) {\n            this.cbSetRealTool(this.silenceMessagesForUIAction.val);\n            this.silenceMessagesForUIAction.val = undefined;\n        }\n    }\n\n    /**\n     * run code\n     */\n    protected runTimesliceImpl(ms: number) {\n        VpcCurrentScriptStage.latestVelID = undefined;\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Unknown;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.dynamicCodeOrigin = undefined;\n\n        let first = this.workQueue[0];\n        let currentCardId = this.outside.GetOptionS('currentCardId');\n\n        if (!this.workQueue.length || !first) {\n            /* no code is running. */\n            /* make sure screen is unlocked, just in case */\n            this.outside.SetOption('screenLocked', false);\n            return;\n        }\n\n        if (\n            !first.hasRunCode &&\n            slength(first.originalMsg.cardWhenFired) > 0 &&\n            first.originalMsg.causedByUserAction &&\n            first.originalMsg.cardWhenFired !== currentCardId\n        ) {\n            /* important: don't run queued messages that were created on a different card */\n            this.workQueue.splice(0, 1);\n            return;\n        }\n\n        if (first.stack.length <= 1) {\n            /* we just finished a handler */\n            this.workQueue.splice(0, 1);\n            this.resetAfterFrameStackIsDone();\n            return;\n        }\n\n        first.runTimesliceOrThrow(ms);\n\n        if (first.stack.length <= 1) {\n            /* we just finished a frame */\n            this.workQueue.splice(0, 1);\n            this.resetAfterFrameStackIsDone();\n            return;\n        }\n    }\n\n    /**\n     * respond to an exception when running a script.\n     * because the error is likely from the last line that\n     * was encountered, we'll attach the information from\n     * VpcCurrentScriptStage to the error.\n     */\n    protected handleScriptException(e: Error, context: string) {\n        let stackTrace = new GuessStackTrace(this, this.outside).go();\n        let msgObj = this.workQueue[0]?.originalMsg;\n        this.forceStopRunning();\n\n        let scriptErr = Util512BaseErr.errIfExactCls<VpcErr>('VpcErr', e);\n        if (!scriptErr) {\n            scriptErr = VpcErr.createError('', 'runOneLine');\n            scriptErr.addErr(e);\n            scriptErr.origClass = (e as any).typeName ?? '(javascript)';\n        }\n\n        if (!scriptErr.scriptErrVelid) {\n            scriptErr.scriptErrVelid = VpcCurrentScriptStage.latestVelID;\n        }\n        if (!scriptErr.stage) {\n            scriptErr.stage = VpcCurrentScriptStage.currentStage;\n        }\n        if (!scriptErr.scriptErrLine) {\n            scriptErr.scriptErrLine = VpcCurrentScriptStage.latestSrcLineSeen;\n        }\n        if (!scriptErr.lineObj) {\n            scriptErr.lineObj = VpcCurrentScriptStage.latestDestLineSeen;\n        }\n        if (!scriptErr.dynamicCodeOrigin) {\n            scriptErr.dynamicCodeOrigin = VpcCurrentScriptStage.dynamicCodeOrigin;\n        }\n        if (!scriptErr.traceInfo) {\n            scriptErr.traceInfo = stackTrace;\n        }\n        if (VpcCurrentScriptStage.origClass) {\n            scriptErr.origClass = VpcCurrentScriptStage.origClass;\n        }\n\n        /* for errors in dynamic code, the line number should be adjusted */\n        if (scriptErr.dynamicCodeOrigin) {\n            scriptErr.origClass += ';';\n            scriptErr.origClass += scriptErr.scriptErrVelid;\n            scriptErr.origClass += ';';\n            scriptErr.origClass += scriptErr.scriptErrLine;\n            scriptErr.scriptErrVelid = scriptErr.dynamicCodeOrigin[0];\n            scriptErr.scriptErrLine = scriptErr.dynamicCodeOrigin[1];\n        }\n\n        /* reset state */\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        VpcCurrentScriptStage.latestVelID = undefined;\n        VpcCurrentScriptStage.dynamicCodeOrigin = undefined;\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Unknown;\n\n        /* reset flags */\n        this.resetAfterFrameStackIsDone();\n\n        if (this.cbOnScriptError) {\n            this.cbOnScriptError(scriptErr, msgObj);\n        } else {\n            respondUI512Error(scriptErr.clsAsErr(), context);\n        }\n    }\n\n    /**\n     * run maintenance\n     */\n    doMaintenance() {\n        let stack = this.outside.Model().stack;\n        VpcExecTop.checkNoRepeatedIds(stack);\n    }\n\n    /**\n     * run messagebox code\n     */\n    runMsgBoxCodeOrThrow(codeBody: string, curCardId: string, addReturnToMsgBox: boolean) {\n        let msg = new VpcScriptMessageMsgBoxCode(curCardId, VpcBuiltinMsg.SendCode);\n        msg.msgBoxCodeBody = codeBody;\n        msg.returnToMsgBox = addReturnToMsgBox;\n        this.scheduleCodeExec(msg);\n    }\n\n    /**\n     * make sure there are no repeated ids\n     */\n    static checkNoRepeatedIds(stack: VpcElStack) {\n        let idsSeen = new MapKeyToObjectCanSet<boolean>();\n        idsSeen.set(stack.parentIdInternal, true);\n        for (let vel of stack.iterEntireStack()) {\n            if (idsSeen.exists(vel.idInternal)) {\n                /* use assertwarn, not throw, because it's sure to show\n                a dialog, but the user can also ignore subsequent ones */\n                assertWarn(false, 'R?|duplicate id seen: ' + vel.idInternal);\n            }\n\n            idsSeen.set(vel.idInternal, true);\n        }\n\n        /* check that each bg element is correctly present on each card */\n        for (let bg of stack.bgs) {\n            let template = bg.getTemplateCard();\n            let bgParts = template.parts.filter(vel => vel.getS('is_bg_velement_id').length);\n            let bgIdsSeen = new OrderedHash<VpcElType>();\n            for (let pt of bgParts) {\n                assertWarn(!idsSeen.exists(pt.getS('is_bg_velement_id')), 'VO|bg id seen twice across bgs');\n                idsSeen.add(pt.getS('is_bg_velement_id'), true);\n                assertWarn(!bgIdsSeen.find(pt.getS('is_bg_velement_id')), 'VN|bg id seen twice');\n                bgIdsSeen.insertNew(pt.getS('is_bg_velement_id'), pt.getType());\n            }\n\n            let expect = orderedHashSummary(bgIdsSeen);\n            for (let cd of bg.cards) {\n                if (cd.idInternal === template.idInternal) {\n                    continue;\n                }\n\n                let bgIdsSeenThisCd = new OrderedHash<VpcElType>();\n                for (let pt of bgParts) {\n                    assertWarn(!bgIdsSeenThisCd.find(pt.getS('is_bg_velement_id')), 'VM|bg id seen twice');\n                    bgIdsSeenThisCd.insertNew(pt.getS('is_bg_velement_id'), pt.getType());\n                }\n\n                assertWarnEq(expect, orderedHashSummary(bgIdsSeenThisCd), 'VL|');\n            }\n        }\n    }\n}\n\n/**\n * get a stack trace, just to show in the ui\n */\nexport class GuessStackTrace {\n    constructor(protected top: VpcExecTop, protected outside: OutsideWorldReadWrite) {}\n    protected guessLatestFrame(): O<VpcExecFrame>[] {\n        let lastSeen = VpcCurrentScriptStage.latestDestLineSeen;\n        for (let stack of this.top.workQueue) {\n            let lastFrame = lastIfThere(stack.stack);\n            if (lastFrame) {\n                let lns = lastFrame?.codeSection?.lines;\n                if (lns && (lns[lastFrame.getOffset()] === lastSeen || lns[lastFrame.getOffset() - 1] === lastSeen)) {\n                    return stack.stack;\n                }\n            }\n        }\n\n        return [];\n    }\n\n    go() {\n        /* vel, handlername, origoffset */\n        let ret: [string, string, number][] = [];\n        let stack = this.guessLatestFrame();\n        if (stack) {\n            stack.reverse();\n            for (let frame of stack) {\n                if (frame) {\n                    let velId = frame.meId;\n                    let origoffset = frame?.codeSection?.lines[frame.getOffset() - 1]?.firstToken?.startLine;\n                    origoffset = origoffset ?? 0;\n                    ret.push([velId, frame.handlerName, origoffset]);\n                }\n            }\n        }\n\n        return ret;\n    }\n\n    goAsString(actualMeId: string, actualLine: number, ar: O<[string, string, number][]>) {\n        let arout: string[] = [];\n        if (!ar || !ar.length) {\n            return '';\n        }\n\n        /* Ignore the top of the stack trace!\n        It might be inaccurate because of dynamic code.\n        we **don't use** the me-id there.\n        we need to look at actualMeId */\n        ar = ar.slice(1);\n\n        for (let [velId, handlername, origoffset] of ar) {\n            let vel = this.outside.Model().findByIdUntyped(velId);\n            if (!vel) {\n                arout.push('missing');\n            } else if (vel.getType() === VpcElType.Product) {\n                arout.push('vpc');\n            } else {\n                arout.push(this.renderVelAndLine(actualMeId, vel, handlername, origoffset));\n            }\n        }\n\n        let ret = arout.join('\\n');\n        return ret ? 'via ' + ret : ret;\n    }\n\n    renderVelAndLine(actualMeId: string, vel: VpcElBase, handlername: string, origoffset: number): string {\n        let s = '';\n        if (vel.idInternal.toString() === actualMeId.toString()) {\n            /* save space */\n        } else if (vel.getType() === VpcElType.Stack) {\n            s += 'stack';\n        } else if (vel.getS('name')) {\n            s += `\"${vel.getS('name')}\"`;\n        } else {\n            /* get the short name of v */\n            let res = new VelRenderName(this.outside.Model());\n            s += res.go(vel, PropAdjective.Short);\n        }\n\n        return s + ' ' + handlername + ', line ' + origoffset;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeparse/vpcParser.ts",
    "content": "\n/* auto */ import { allVpcTokens, tks } from './vpcTokens';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * parser class for VPC language.\n * generated by the genparse Python script.\n */\nexport function MakeVpcChvParser() {\n    class VpcChvParser extends chevrotain.CstParser {\n        constructor() {\n            super(allVpcTokens, {\n                recoveryEnabled: false,\n                outputCst: true,\n                maxLookahead: 4\n            });\n\n            this.performSelfAnalysis();\n        }\n\n        /* generated code, any changes past this point will be lost: --------------- */\n\n        RuleHAllPropertiesThatCouldBeUnary = this.RULE('RuleHAllPropertiesThatCouldBeUnary', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkAllUnaryPropertiesIfNotAlready);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkUnaryVipercardProperties);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkAllNullaryOrUnaryPropertiesIfNotAlready);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._id);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._marked);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._number);\n                    }\n                }\n            ]);\n        });\n\n        RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary = this.RULE('RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAnyFnName);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkAllNullaryOrUnaryPropertiesIfNotAlready);\n                    }\n                }\n            ]);\n        });\n\n        RuleHAnyFnName = this.RULE('RuleHAnyFnName', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkIdentifier);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._target);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._windows);\n                    }\n                }\n            ]);\n        });\n\n        RuleHCouldBeAPropertyToSet = this.RULE('RuleHCouldBeAPropertyToSet', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkIdentifier);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAllPropertiesThatCouldBeUnary);\n                    }\n                }\n            ]);\n        });\n\n        RuleHAnyAllowedVariableName = this.RULE('RuleHAnyAllowedVariableName', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkIdentifier);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._number);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkA);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkAllUnaryPropertiesIfNotAlready);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkUnaryVipercardProperties);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkAllNullaryOrUnaryPropertiesIfNotAlready);\n                    }\n                }\n            ]);\n        });\n\n        RuleObject = this.RULE('RuleObject', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectSpecial);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectInterpretedFromString);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectBtn);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectFld);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectCard);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectBg);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectStack);\n                    }\n                }\n            ]);\n        });\n\n        RuleObjectBtn = this.RULE('RuleObjectBtn', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkBg);\n                                }\n                            }\n                        ]);\n                        this.CONSUME1(tks.tkBtn);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OR3([\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkBg);\n                                }\n                            }\n                        ]);\n                        this.OR4([\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkBtn);\n                                    this.CONSUME1(tks._id);\n                                    this.SUBRULE1(this.RuleLvl6Expression);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME3(tks.tkBtn);\n                                    this.SUBRULE2(this.RuleLvl6Expression);\n                                }\n                            }\n                        ]);\n                    }\n                }\n            ]);\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectCard);\n            });\n        });\n\n        RuleObjectFld = this.RULE('RuleObjectFld', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkBg);\n                                }\n                            }\n                        ]);\n                        this.CONSUME1(tks.tkFld);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OR3([\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkBg);\n                                }\n                            }\n                        ]);\n                        this.OR4([\n                            {\n                                ALT: () => {\n                                    this.CONSUME2(tks.tkFld);\n                                    this.CONSUME1(tks._id);\n                                    this.SUBRULE1(this.RuleLvl6Expression);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME3(tks.tkFld);\n                                    this.SUBRULE2(this.RuleLvl6Expression);\n                                }\n                            }\n                        ]);\n                    }\n                }\n            ]);\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectCard);\n            });\n        });\n\n        RuleObjectCard = this.RULE('RuleObjectCard', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._recent);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkCardPlural);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkCardAtEndOfLine);\n                                }\n                            }\n                        ]);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._back);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._forth);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkCard);\n                        this.CONSUME1(tks._id);\n                        this.SUBRULE1(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OPTION1(() => {\n                            this.CONSUME1(tks._marked);\n                        });\n                        this.CONSUME3(tks.tkCard);\n                        this.SUBRULE2(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkCardAtEndOfLine);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.OPTION2(() => {\n                            this.CONSUME2(tks._marked);\n                        });\n                        this.OR3([\n                            {\n                                ALT: () => {\n                                    this.CONSUME4(tks.tkCard);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME3(tks.tkCardAtEndOfLine);\n                                }\n                            }\n                        ]);\n                    }\n                }\n            ]);\n            this.OPTION3(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectBg);\n            });\n            this.OPTION4(() => {\n                this.SUBRULE2(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectStack);\n            });\n        });\n\n        RuleObjectBg = this.RULE('RuleObjectBg', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkBg);\n                        this.CONSUME1(tks._id);\n                        this.SUBRULE1(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkBg);\n                        this.SUBRULE2(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME3(tks.tkBg);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkBgAtEndOfLine);\n                                }\n                            }\n                        ]);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkBgAtEndOfLine);\n                    }\n                }\n            ]);\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectStack);\n            });\n        });\n\n        RuleObjectStack = this.RULE('RuleObjectStack', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkStack);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkStackAtEndOfLine);\n                                }\n                            }\n                        ]);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkStack);\n                        this.SUBRULE1(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME3(tks.tkStack);\n                        this.CONSUME1(tks._id);\n                        this.SUBRULE2(this.RuleLvl6Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkStackAtEndOfLine);\n                    }\n                }\n            ]);\n        });\n\n        RuleObjectSpecial = this.RULE('RuleObjectSpecial', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkProductName);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._me);\n                    }\n                }\n            ]);\n        });\n\n        RuleObjectInterpretedFromString = this.RULE('RuleObjectInterpretedFromString', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkStringLiteral);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._target);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkLParen);\n                        this.SUBRULE1(this.RuleExpr);\n                        this.CONSUME1(tks.tkRParen);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAnyAllowedVariableName);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHOldStyleFnNullaryOrNullaryPropGet);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._the);\n                        this.OPTION1(() => {\n                            this.CONSUME1(tks.tkAdjective);\n                        });\n                        this.CONSUME1(tks.tkAllUnaryPropertiesIfNotAlready);\n                        this.CONSUME1(tks.tkOfOnly);\n                        this.SUBRULE1(this.RuleObject);\n                    }\n                }\n            ]);\n        });\n\n        RuleOf = this.RULE('RuleOf', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOfOnly);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkInOnly);\n                    }\n                }\n            ]);\n        });\n\n        RuleMenuItem = this.RULE('RuleMenuItem', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.CONSUME1(tks._menuItem);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks._menuItem);\n                        this.SUBRULE1(this.RuleLvl6Expression);\n                    }\n                }\n            ]);\n        });\n\n        RuleMenu = this.RULE('RuleMenu', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.CONSUME1(tks._menu);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks._menu);\n                        this.SUBRULE1(this.RuleLvl6Expression);\n                    }\n                }\n            ]);\n        });\n\n        RuleWindow_1 = this.RULE('RuleWindow_1', () => {\n            this.OPTION1(() => {\n                this.CONSUME1(tks._the);\n            });\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkCard);\n                    }\n                }\n            ]);\n            this.CONSUME1(tks._window);\n        });\n\n        RuleWindow = this.RULE('RuleWindow', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleWindow_1);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleMessageBox);\n                    }\n                }\n            ]);\n        });\n\n        RuleMessageBox = this.RULE('RuleMessageBox', () => {\n            this.OPTION1(() => {\n                this.CONSUME1(tks._the);\n            });\n            this.CONSUME1(tks._message);\n            this.OPTION2(() => {\n                this.OR1([\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks._box);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks._window);\n                        }\n                    }\n                ]);\n            });\n        });\n\n        RuleHSimpleContainer = this.RULE('RuleHSimpleContainer', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleMenu);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleMessageBox);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OPTION1(() => {\n                            this.CONSUME1(tks._the);\n                        });\n                        this.CONSUME1(tks._selection);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._target);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectBtn);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObjectFld);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAnyAllowedVariableName);\n                    }\n                }\n            ]);\n        });\n\n        RuleHContainer = this.RULE('RuleHContainer', () => {\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleHChunk);\n            });\n            this.SUBRULE1(this.RuleHSimpleContainer);\n        });\n\n        RuleHChunk = this.RULE('RuleHChunk', () => {\n            this.SUBRULE1(this.RuleHChunkOne);\n            this.MANY1(() => {\n                this.SUBRULE2(this.RuleHChunkOne);\n            });\n        });\n\n        RuleHChunkOne = this.RULE('RuleHChunkOne', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkOrdinalOrPosition);\n                        this.CONSUME1(tks.tkChunkGranularity);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME2(tks.tkChunkGranularity);\n                        this.SUBRULE1(this.RuleHChunkBound);\n                        this.OPTION1(() => {\n                            this.CONSUME1(tks._to);\n                            this.SUBRULE2(this.RuleHChunkBound);\n                        });\n                    }\n                }\n            ]);\n            this.SUBRULE1(this.RuleOf);\n        });\n\n        RuleHChunkBound = this.RULE('RuleHChunkBound', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkLParen);\n                        this.SUBRULE1(this.RuleExpr);\n                        this.CONSUME1(tks.tkRParen);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkNumLiteral);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHSimpleContainer);\n                    }\n                }\n            ]);\n        });\n\n        RuleHSource = this.RULE('RuleHSource', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHSource_1);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHGenericFunctionCall);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHSimpleContainer);\n                    }\n                }\n            ]);\n        });\n\n        RuleHSource_1 = this.RULE('RuleHSource_1', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkStringLiteral);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkNumLiteral);\n                    }\n                }\n            ]);\n        });\n\n        RuleHFnCallWParens = this.RULE('RuleHFnCallWParens', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAnyFnName);\n                        this.CONSUME1(tks.tkLParen);\n                        this.MANY_SEP1({\n                            SEP: tks.tkComma,\n                            DEF: () => {\n                                this.SUBRULE1(this.RuleExpr);\n                            }\n                        });\n                        this.CONSUME1(tks.tkRParen);\n                    }\n                }\n            ]);\n        });\n\n        RuleHUnaryPropertyGet = this.RULE('RuleHUnaryPropertyGet', () => {\n            this.OPTION1(() => {\n                this.CONSUME1(tks._the);\n            });\n            this.OPTION2(() => {\n                this.CONSUME1(tks.tkAdjective);\n            });\n            this.SUBRULE1(this.RuleHAllPropertiesThatCouldBeUnary);\n            this.CONSUME1(tks.tkOfOnly);\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleObject);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleWindow);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleMenuItem);\n                        this.SUBRULE1(this.RuleOf);\n                        this.SUBRULE1(this.RuleMenu);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHChunk);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.SUBRULE1(this.RuleObjectFld);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks._me);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.OPTION3(() => {\n                                        this.CONSUME2(tks._the);\n                                    });\n                                    this.CONSUME1(tks._target);\n                                }\n                            }\n                        ]);\n                    }\n                }\n            ]);\n        });\n\n        RuleHOldStyleFnNonNullary = this.RULE('RuleHOldStyleFnNonNullary', () => {\n            this.CONSUME1(tks._the);\n            this.SUBRULE1(this.RuleHAnyFnName);\n            this.CONSUME1(tks.tkOfOnly);\n            this.SUBRULE1(this.RuleLvl6Expression);\n        });\n\n        RuleHOldStyleFnNullaryOrNullaryPropGet = this.RULE('RuleHOldStyleFnNullaryOrNullaryPropGet', () => {\n            this.CONSUME1(tks._the);\n            this.OPTION1(() => {\n                this.CONSUME1(tks.tkAdjective);\n            });\n            this.SUBRULE1(this.RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary);\n        });\n\n        RuleHGenericFunctionCall = this.RULE('RuleHGenericFunctionCall', () => {\n            this.OR1({\n                MAX_LOOKAHEAD: 5,\n                DEF: [\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleFnCallNumberOf);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleFnCallThereIs);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleHFnCallWParens);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleHUnaryPropertyGet);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleHOldStyleFnNonNullary);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleHOldStyleFnNullaryOrNullaryPropGet);\n                        }\n                    }\n                ]\n            });\n        });\n\n        RuleFnCallNumberOf = this.RULE('RuleFnCallNumberOf', () => {\n            this.CONSUME1(tks._the);\n            this.CONSUME1(tks._number);\n            this.CONSUME1(tks.tkOfOnly);\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleFnCallNumberOf_1);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleFnCallNumberOf_2);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleFnCallNumberOf_3);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleFnCallNumberOf_4);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleFnCallNumberOf_5);\n                    }\n                }\n            ]);\n        });\n\n        RuleFnCallNumberOf_1 = this.RULE('RuleFnCallNumberOf_1', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkCard);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkBg);\n                    }\n                }\n            ]);\n            this.OR2([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkBtnPlural);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkFldPlural);\n                    }\n                }\n            ]);\n        });\n\n        RuleFnCallNumberOf_2 = this.RULE('RuleFnCallNumberOf_2', () => {\n            this.OPTION1(() => {\n                this.CONSUME1(tks._marked);\n            });\n            this.CONSUME1(tks.tkCardPlural);\n            this.OPTION2(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.OR1([\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleObject);\n                        }\n                    }\n                ]);\n            });\n        });\n\n        RuleFnCallNumberOf_3 = this.RULE('RuleFnCallNumberOf_3', () => {\n            this.CONSUME1(tks.tkBgPlural);\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleOf);\n                this.SUBRULE1(this.RuleObjectStack);\n            });\n        });\n\n        RuleFnCallNumberOf_4 = this.RULE('RuleFnCallNumberOf_4', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._windows);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._menu);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._menuItem);\n                        this.SUBRULE1(this.RuleOf);\n                        this.SUBRULE1(this.RuleMenu);\n                    }\n                }\n            ]);\n        });\n\n        RuleFnCallNumberOf_5 = this.RULE('RuleFnCallNumberOf_5', () => {\n            this.CONSUME1(tks.tkChunkGranularity);\n            this.SUBRULE1(this.RuleOf);\n            this.SUBRULE1(this.RuleLvl3Expression);\n        });\n\n        RuleFnCallThereIs = this.RULE('RuleFnCallThereIs', () => {\n            this.CONSUME1(tks._there);\n            this.CONSUME1(tks._is);\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._no);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OPTION1(() => {\n                            this.CONSUME1(tks._not);\n                        });\n                        this.CONSUME1(tks.tkA);\n                    }\n                }\n            ]);\n            this.SUBRULE1(this.RuleObject);\n        });\n\n        RuleAnyPropertyVal = this.RULE('RuleAnyPropertyVal', () => {\n            this.AT_LEAST_ONE_SEP1({\n                SEP: tks.tkComma,\n                DEF: () => {\n                    this.SUBRULE1(this.RuleLvl1Expression);\n                }\n            });\n        });\n\n        RuleExpr = this.RULE('RuleExpr', () => {\n            this.SUBRULE1(this.RuleLvl1Expression);\n            this.MANY1(() => {\n                this.SUBRULE1(this.RuleAndOrOr);\n                this.SUBRULE2(this.RuleLvl1Expression);\n            });\n        });\n\n        RuleLvl1Expression = this.RULE('RuleLvl1Expression', () => {\n            this.SUBRULE1(this.RuleLvl2Expression);\n            this.MANY1(() => {\n                this.SUBRULE1(this.RuleContainsOrGreaterLessEqual);\n                this.SUBRULE2(this.RuleLvl2Expression);\n            });\n        });\n\n        RuleLvl2Expression = this.RULE('RuleLvl2Expression', () => {\n            this.SUBRULE1(this.RuleLvl3Expression);\n            this.MANY1(() => {\n                this.CONSUME1(tks._is);\n                this.SUBRULE1(this.RuleIsExpression);\n            });\n        });\n\n        RuleLvl3Expression = this.RULE('RuleLvl3Expression', () => {\n            this.SUBRULE1(this.RuleLvl4Expression);\n            this.MANY1(() => {\n                this.CONSUME1(tks.tkStringConcat);\n                this.SUBRULE2(this.RuleLvl4Expression);\n            });\n        });\n\n        RuleLvl4Expression = this.RULE('RuleLvl4Expression', () => {\n            this.SUBRULE1(this.RuleLvl5Expression);\n            this.MANY1(() => {\n                this.CONSUME1(tks.tkPlusOrMinus);\n                this.SUBRULE2(this.RuleLvl5Expression);\n            });\n        });\n\n        RuleLvl5Expression = this.RULE('RuleLvl5Expression', () => {\n            this.SUBRULE1(this.RuleLvl6Expression);\n            this.MANY1(() => {\n                this.CONSUME1(tks.tkMultDivideExpDivMod);\n                this.SUBRULE2(this.RuleLvl6Expression);\n            });\n        });\n\n        RuleLvl6Expression = this.RULE('RuleLvl6Expression', () => {\n            this.OPTION1(() => {\n                this.OR1([\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks.tkPlusOrMinus);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks._not);\n                        }\n                    }\n                ]);\n            });\n            this.OPTION2(() => {\n                this.SUBRULE1(this.RuleHChunk);\n            });\n            this.OR2([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHSource);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkLParen);\n                        this.SUBRULE1(this.RuleExpr);\n                        this.CONSUME1(tks.tkRParen);\n                    }\n                }\n            ]);\n        });\n\n        RuleAndOrOr = this.RULE('RuleAndOrOr', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._or);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._and);\n                    }\n                }\n            ]);\n        });\n\n        RuleContainsOrGreaterLessEqual = this.RULE('RuleContainsOrGreaterLessEqual', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks._contains);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkGreaterOrLessEqualOrEqual);\n                    }\n                }\n            ]);\n        });\n\n        RuleIsExpression = this.RULE('RuleIsExpression', () => {\n            this.OPTION1(() => {\n                this.CONSUME1(tks._not);\n            });\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkA);\n                        this.OR2([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks._number);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkIdentifier);\n                                }\n                            }\n                        ]);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.OR3([\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks.tkInOnly);\n                                }\n                            },\n                            {\n                                ALT: () => {\n                                    this.CONSUME1(tks._within);\n                                }\n                            }\n                        ]);\n                        this.SUBRULE1(this.RuleLvl3Expression);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.SUBRULE2(this.RuleLvl3Expression);\n                    }\n                }\n            ]);\n        });\n\n        RuleBuiltinCmdAdd = this.RULE('RuleBuiltinCmdAdd', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleLvl1Expression);\n            this.CONSUME1(tks._to);\n            this.SUBRULE1(this.RuleHContainer);\n        });\n\n        RuleBuiltinCmdAnswer = this.RULE('RuleBuiltinCmdAnswer', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n            this.OPTION1(() => {\n                this.CONSUME4(tks.tkSyntaxMark);\n                this.SUBRULE1(this.RuleLvl6Expression);\n                this.OPTION2(() => {\n                    this.CONSUME1(tks._or);\n                    this.SUBRULE2(this.RuleLvl6Expression);\n                    this.OPTION3(() => {\n                        this.CONSUME2(tks._or);\n                        this.SUBRULE3(this.RuleLvl6Expression);\n                    });\n                });\n            });\n        });\n\n        RuleBuiltinCmdAsk = this.RULE('RuleBuiltinCmdAsk', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.OPTION1(() => {\n                this.CONSUME1(tks.tkComma);\n            });\n            this.SUBRULE1(this.RuleExpr);\n            this.OPTION2(() => {\n                this.CONSUME4(tks.tkSyntaxMark);\n                this.SUBRULE2(this.RuleExpr);\n            });\n        });\n\n        RuleBuiltinCmdBeep = this.RULE('RuleBuiltinCmdBeep', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.OPTION1(() => {\n                this.SUBRULE1(this.RuleExpr);\n            });\n        });\n\n        RuleBuiltinCmdVpccalluntrappablechoose = this.RULE('RuleBuiltinCmdVpccalluntrappablechoose', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n        });\n\n        RuleBuiltinCmdClick = this.RULE('RuleBuiltinCmdClick', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.SUBRULE1(this.RuleHBuiltinCmdDrag_1);\n            this.OPTION1(() => {\n                this.CONSUME4(tks.tkSyntaxMark);\n                this.CONSUME2(tks.tkIdentifier);\n                this.OPTION2(() => {\n                    this.CONSUME1(tks.tkComma);\n                    this.CONSUME3(tks.tkIdentifier);\n                    this.OPTION3(() => {\n                        this.CONSUME2(tks.tkComma);\n                        this.CONSUME4(tks.tkIdentifier);\n                    });\n                });\n            });\n        });\n\n        RuleBuiltinCmdDelete = this.RULE('RuleBuiltinCmdDelete', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleHChunk);\n            this.SUBRULE1(this.RuleHSimpleContainer);\n        });\n\n        RuleBuiltinCmdDial = this.RULE('RuleBuiltinCmdDial', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n        });\n\n        RuleBuiltinCmdDisable = this.RULE('RuleBuiltinCmdDisable', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleObject);\n        });\n\n        RuleBuiltinCmdDivide = this.RULE('RuleBuiltinCmdDivide', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleHContainer);\n            this.CONSUME4(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleLvl1Expression);\n        });\n\n        RuleBuiltinCmdDrag = this.RULE('RuleBuiltinCmdDrag', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.MANY_SEP1({\n                SEP: tks._to,\n                DEF: () => {\n                    this.SUBRULE1(this.RuleHBuiltinCmdDrag_1);\n                }\n            });\n            this.OPTION1(() => {\n                this.CONSUME4(tks.tkSyntaxMark);\n                this.CONSUME2(tks.tkIdentifier);\n                this.OPTION2(() => {\n                    this.CONSUME1(tks.tkComma);\n                    this.CONSUME3(tks.tkIdentifier);\n                    this.OPTION3(() => {\n                        this.CONSUME2(tks.tkComma);\n                        this.CONSUME4(tks.tkIdentifier);\n                    });\n                });\n            });\n        });\n\n        RuleHBuiltinCmdDrag_1 = this.RULE('RuleHBuiltinCmdDrag_1', () => {\n            this.SUBRULE1(this.RuleLvl4Expression);\n            this.OPTION1(() => {\n                this.CONSUME1(tks.tkComma);\n                this.SUBRULE2(this.RuleLvl4Expression);\n            });\n        });\n\n        RuleBuiltinCmdEnable = this.RULE('RuleBuiltinCmdEnable', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleObject);\n        });\n\n        RuleBuiltinCmdVpccalluntrappableerrordialog = this.RULE('RuleBuiltinCmdVpccalluntrappableerrordialog', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n        });\n\n        RuleBuiltinCmdHide = this.RULE('RuleBuiltinCmdHide', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleObject);\n        });\n\n        RuleBuiltinCmdLock = this.RULE('RuleBuiltinCmdLock', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n        });\n\n        RuleBuiltinCmdMark = this.RULE('RuleBuiltinCmdMark', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.OPTION1(() => {\n                this.CONSUME1(tks._not);\n            });\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkIdentifier);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME4(tks.tkSyntaxMark);\n                        this.SUBRULE1(this.RuleObject);\n                    }\n                }\n            ]);\n        });\n\n        RuleBuiltinCmdMultiply = this.RULE('RuleBuiltinCmdMultiply', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleHContainer);\n            this.CONSUME4(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleLvl1Expression);\n        });\n\n        RuleBuiltinCmdPlay = this.RULE('RuleBuiltinCmdPlay', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.MANY1(() => {\n                this.SUBRULE1(this.RuleHBuiltinCmdPlay_1);\n                this.CONSUME4(tks.tkSyntaxMark);\n            });\n        });\n\n        RuleHBuiltinCmdPlay_1 = this.RULE('RuleHBuiltinCmdPlay_1', () => {\n            this.OR1([\n                {\n                    ALT: () => {\n                        this.SUBRULE1(this.RuleHAnyAllowedVariableName);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkStringLiteral);\n                    }\n                },\n                {\n                    ALT: () => {\n                        this.CONSUME1(tks.tkNumLiteral);\n                    }\n                }\n            ]);\n        });\n\n        RuleBuiltinCmdPut = this.RULE('RuleBuiltinCmdPut', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n            this.CONSUME4(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.CONSUME5(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleHContainer);\n        });\n\n        RuleBuiltinCmdReset = this.RULE('RuleBuiltinCmdReset', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n        });\n\n        RuleBuiltinCmdReplace = this.RULE('RuleBuiltinCmdReplace', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n            this.CONSUME4(tks.tkSyntaxMark);\n            this.SUBRULE2(this.RuleExpr);\n            this.CONSUME1(tks.tkInOnly);\n            this.SUBRULE1(this.RuleHSimpleContainer);\n        });\n\n        RuleBuiltinCmdSelect = this.RULE('RuleBuiltinCmdSelect', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkStringLiteral);\n            this.OPTION1(() => {\n                this.OPTION2(() => {\n                    this.SUBRULE1(this.RuleHChunk);\n                });\n                this.SUBRULE1(this.RuleObject);\n            });\n        });\n\n        RuleBuiltinCmdSet = this.RULE('RuleBuiltinCmdSet', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.OPTION1(() => {\n                this.CONSUME1(tks._the);\n            });\n            this.SUBRULE1(this.RuleHCouldBeAPropertyToSet);\n            this.OPTION2(() => {\n                this.CONSUME1(tks.tkOfOnly);\n                this.OR1([\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleHChunk);\n                            this.OR2([\n                                {\n                                    ALT: () => {\n                                        this.SUBRULE1(this.RuleObjectFld);\n                                    }\n                                },\n                                {\n                                    ALT: () => {\n                                        this.CONSUME1(tks._me);\n                                    }\n                                },\n                                {\n                                    ALT: () => {\n                                        this.OPTION3(() => {\n                                            this.CONSUME2(tks._the);\n                                        });\n                                        this.CONSUME1(tks._target);\n                                    }\n                                }\n                            ]);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.SUBRULE1(this.RuleObject);\n                        }\n                    }\n                ]);\n            });\n            this.CONSUME1(tks._to);\n            this.SUBRULE1(this.RuleAnyPropertyVal);\n        });\n\n        RuleBuiltinCmdShow = this.RULE('RuleBuiltinCmdShow', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleObject);\n            this.OPTION1(() => {\n                this.CONSUME4(tks.tkSyntaxMark);\n                this.SUBRULE1(this.RuleLvl4Expression);\n                this.OPTION2(() => {\n                    this.CONSUME1(tks.tkComma);\n                    this.SUBRULE2(this.RuleLvl4Expression);\n                });\n            });\n        });\n\n        RuleBuiltinCmdSort = this.RULE('RuleBuiltinCmdSort', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkStringLiteral);\n            this.CONSUME2(tks.tkStringLiteral);\n            this.CONSUME1(tks.tkChunkGranularity);\n            this.CONSUME1(tks.tkOfOnly);\n            this.SUBRULE1(this.RuleHSimpleContainer);\n        });\n\n        RuleBuiltinCmdStart = this.RULE('RuleBuiltinCmdStart', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.SUBRULE1(this.RuleObjectStack);\n        });\n\n        RuleBuiltinCmdStop = this.RULE('RuleBuiltinCmdStop', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.SUBRULE1(this.RuleObjectStack);\n        });\n\n        RuleBuiltinCmdSubtract = this.RULE('RuleBuiltinCmdSubtract', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleLvl1Expression);\n            this.CONSUME4(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleHContainer);\n        });\n\n        RuleBuiltinCmdUnlock = this.RULE('RuleBuiltinCmdUnlock', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.OPTION1(() => {\n                this.CONSUME1(tks.tkStringLiteral);\n                this.CONSUME2(tks.tkStringLiteral);\n                this.CONSUME3(tks.tkStringLiteral);\n                this.CONSUME4(tks.tkStringLiteral);\n            });\n        });\n\n        RuleBuiltinCmdVisual = this.RULE('RuleBuiltinCmdVisual', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkIdentifier);\n            this.OPTION1(() => {\n                this.CONSUME1(tks.tkStringLiteral);\n                this.CONSUME2(tks.tkStringLiteral);\n                this.CONSUME3(tks.tkStringLiteral);\n                this.CONSUME4(tks.tkStringLiteral);\n            });\n        });\n\n        RuleBuiltinCmdWait = this.RULE('RuleBuiltinCmdWait', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n            this.OPTION1(() => {\n                this.OR1([\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks.tkIdentifier);\n                        }\n                    },\n                    {\n                        ALT: () => {\n                            this.CONSUME1(tks.tkOrdinalOrPosition);\n                        }\n                    }\n                ]);\n            });\n        });\n\n        RuleCmdSend = this.RULE('RuleCmdSend', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.CONSUME1(tks.tkStringLiteral);\n            this.SUBRULE1(this.RuleExpr);\n            this.CONSUME1(tks._to);\n            this.SUBRULE1(this.RuleObject);\n        });\n\n        RuleInternalCmdRequestEval = this.RULE('RuleInternalCmdRequestEval', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.SUBRULE1(this.RuleExpr);\n        });\n\n        RuleInternalCmdUserHandler = this.RULE('RuleInternalCmdUserHandler', () => {\n            this.CONSUME1(tks.tkSyntaxMark);\n            this.CONSUME2(tks.tkSyntaxMark);\n            this.CONSUME3(tks.tkSyntaxMark);\n            this.MANY_SEP1({\n                SEP: tks.tkComma,\n                DEF: () => {\n                    this.SUBRULE1(this.RuleExpr);\n                }\n            });\n        });\n        /* generated code, any changes above this point will be lost: --------------- */\n    }\n\n    return new VpcChvParser();\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeparse/vpcTokens.ts",
    "content": "\n/* auto */ import { cAltProductName, cProductName, trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * check the type of a token\n */\nexport function isTkType(tk: chevrotain.IToken, tkType: chevrotain.TokenType) {\n    return tk.tokenType === tkType;\n}\n\n/**\n * allowed symbols fpr makeGreaterLessThanEqual\n */\nexport type TypeGreaterLessThanEqual = '=' | '==' | '<' | '>' | '<=' | '>=';\n\n/**\n * a plain-JS object from the parser, the CST\n */\nexport type VpcParsed = any;\n\n/**\n * create an object cloning the token,\n * TestCloneToken will verify that no properties were missed\n */\nexport function cloneToken(tk: chevrotain.IToken): chevrotain.IToken {\n    return {\n        image: tk.image,\n        startOffset: tk.startOffset,\n        startLine: tk.startLine,\n        startColumn: tk.startColumn,\n        endOffset: tk.endOffset,\n        endLine: tk.endLine,\n        endColumn: tk.endColumn,\n        isInsertedInRecovery: tk.isInsertedInRecovery,\n        tokenTypeIdx: tk.tokenTypeIdx,\n        tokenType: tk.tokenType,\n        payload: tk.payload\n    };\n}\n\n/**\n * a list of disallowed variable names.\n * includes both actual tokens in the grammar and\n * tkidentifiers that we just don't want to be used as variable names\n */\nexport const alsoReservedWordsList: { [key: string]: boolean } = {\n    /* a: true, we now allow this as a variable name */\n    div: true,\n    mod: true,\n    owner: true,\n    name: true,\n\n    /* processed at an early stage */\n    on: true,\n    end: true,\n    exit: true,\n    pass: true,\n    return: true,\n    if: true,\n    else: true,\n    while: true,\n    until: true,\n    global: true,\n\n    /* tokens from realVpc000 that aren't OneOfWords or SAME */\n    commandchar: true,\n    cmdchar: true,\n    message: true,\n    msg: true,\n    previous: true,\n    prev: true,\n    of: true,\n    in: true,\n    it: true,\n\n    /* tokens from realVpc000, includes all built-in commands */\n    do: true,\n    send: true,\n    the: true,\n    put: true,\n    set: true,\n    last: true,\n    mid: true,\n    middle: true,\n    repeat: true,\n    any: true,\n    true: true,\n    false: true,\n    first: true,\n    second: true,\n    third: true,\n    fourth: true,\n    fifth: true,\n    sixth: true,\n    seventh: true,\n    eighth: true,\n    ninth: true,\n    tenth: true,\n    this: true,\n    next: true,\n    box: true,\n    window: true,\n    word: true,\n    item: true,\n    line: true,\n    to: true,\n    me: true,\n    target: true,\n    id: true,\n    stack: true,\n    before: true,\n    after: true,\n    into: true,\n    plain: true,\n    bold: true,\n    italic: true,\n    underline: true,\n    outline: true,\n    shadow: true,\n    condense: true,\n    extend: true,\n    from: true,\n    push: true,\n    open: true,\n    close: true,\n    left: true,\n    right: true,\n    up: true,\n    down: true,\n    out: true,\n    top: true,\n    bottom: true,\n    center: true,\n    rect: true,\n    select: true,\n    text: true,\n    shiftkey: true,\n    optionkey: true,\n    commandkey: true,\n    add: true,\n    answer: true,\n    with: true,\n    or: true,\n    ask: true,\n    password: true,\n    beep: true,\n    choose: true,\n    tool: true,\n    click: true,\n    at: true,\n    delete: true,\n    disable: true,\n    divide: true,\n    by: true,\n    drag: true,\n    enable: true,\n    get: true,\n    go: true,\n    hide: true,\n    menubar: true,\n    lock: true,\n    screen: true,\n    messages: true,\n    error: true,\n    dialogs: true,\n    recent: true,\n    multiply: true,\n    reset: true,\n    paint: true,\n    printing: true,\n    show: true,\n    all: true,\n    sort: true,\n    ascending: true,\n    descending: true,\n    numeric: true,\n    international: true,\n    datetime: true,\n    lines: true,\n    items: true,\n    subtract: true,\n    unlock: true,\n    visual: true,\n    effect: true,\n    wait: true,\n    for: true,\n    long: true,\n    short: true,\n    abbrev: true,\n    abbr: true,\n    abbreviated: true,\n    length: true,\n    result: true,\n    paramcount: true,\n    params: true,\n    number: true,\n    words: true,\n    there: true,\n    is: true,\n    no: true,\n    not: true,\n    integer: true,\n    point: true,\n    logical: true,\n    and: true,\n    contains: true,\n    within: true\n};\n\nalsoReservedWordsList[cProductName.toLowerCase()] = true;\nalsoReservedWordsList[cAltProductName.toLowerCase()] = true;\n/* we'll also add to this list during genparse, see below */\n\n/* check_long_lines_silence_subsequent */\n\n/* generated code, any changes past this point will be lost: --------------- */\n/* as a map so that we get quick access */\nexport const tks = {\n    tkStringLiteral: (undefined as any) as chevrotain.TokenType,\n    tkBlockComment: (undefined as any) as chevrotain.TokenType,\n    tkLineComment: (undefined as any) as chevrotain.TokenType,\n    tkContinuedLineOrWhiteSpace: (undefined as any) as chevrotain.TokenType,\n    tkCardAtEndOfLine: (undefined as any) as chevrotain.TokenType,\n    tkBgAtEndOfLine: (undefined as any) as chevrotain.TokenType,\n    tkStackAtEndOfLine: (undefined as any) as chevrotain.TokenType,\n    tkNewLine: (undefined as any) as chevrotain.TokenType,\n    tkSyntaxMark: (undefined as any) as chevrotain.TokenType,\n    tkNumLiteral: (undefined as any) as chevrotain.TokenType,\n    tkStack: (undefined as any) as chevrotain.TokenType,\n    tkBg: (undefined as any) as chevrotain.TokenType,\n    tkBgPlural: (undefined as any) as chevrotain.TokenType,\n    tkCard: (undefined as any) as chevrotain.TokenType,\n    tkCardPlural: (undefined as any) as chevrotain.TokenType,\n    tkBtn: (undefined as any) as chevrotain.TokenType,\n    tkBtnPlural: (undefined as any) as chevrotain.TokenType,\n    tkFld: (undefined as any) as chevrotain.TokenType,\n    tkFldPlural: (undefined as any) as chevrotain.TokenType,\n    tkProductName: (undefined as any) as chevrotain.TokenType,\n    tkAdjective: (undefined as any) as chevrotain.TokenType,\n    tkOrdinalOrPosition: (undefined as any) as chevrotain.TokenType,\n    tkChunkGranularity: (undefined as any) as chevrotain.TokenType,\n    tkInOnly: (undefined as any) as chevrotain.TokenType,\n    tkOfOnly: (undefined as any) as chevrotain.TokenType,\n    tkA: (undefined as any) as chevrotain.TokenType,\n    _not: (undefined as any) as chevrotain.TokenType,\n    _there: (undefined as any) as chevrotain.TokenType,\n    _is: (undefined as any) as chevrotain.TokenType,\n    _no: (undefined as any) as chevrotain.TokenType,\n    _and: (undefined as any) as chevrotain.TokenType,\n    _or: (undefined as any) as chevrotain.TokenType,\n    _contains: (undefined as any) as chevrotain.TokenType,\n    _within: (undefined as any) as chevrotain.TokenType,\n    _the: (undefined as any) as chevrotain.TokenType,\n    _message: (undefined as any) as chevrotain.TokenType,\n    _window: (undefined as any) as chevrotain.TokenType,\n    _windows: (undefined as any) as chevrotain.TokenType,\n    _box: (undefined as any) as chevrotain.TokenType,\n    _me: (undefined as any) as chevrotain.TokenType,\n    _recent: (undefined as any) as chevrotain.TokenType,\n    _back: (undefined as any) as chevrotain.TokenType,\n    _forth: (undefined as any) as chevrotain.TokenType,\n    _marked: (undefined as any) as chevrotain.TokenType,\n    _to: (undefined as any) as chevrotain.TokenType,\n    _menuItem: (undefined as any) as chevrotain.TokenType,\n    _menu: (undefined as any) as chevrotain.TokenType,\n    _id: (undefined as any) as chevrotain.TokenType,\n    _number: (undefined as any) as chevrotain.TokenType,\n    _selection: (undefined as any) as chevrotain.TokenType,\n    _target: (undefined as any) as chevrotain.TokenType,\n    tkComma: (undefined as any) as chevrotain.TokenType,\n    tkLParen: (undefined as any) as chevrotain.TokenType,\n    tkRParen: (undefined as any) as chevrotain.TokenType,\n    tkPlusOrMinus: (undefined as any) as chevrotain.TokenType,\n    tkMultDivideExpDivMod: (undefined as any) as chevrotain.TokenType,\n    tkStringConcat: (undefined as any) as chevrotain.TokenType,\n    tkGreaterOrLessEqualOrEqual: (undefined as any) as chevrotain.TokenType,\n    tkUnaryVipercardProperties: (undefined as any) as chevrotain.TokenType,\n    tkAllUnaryPropertiesIfNotAlready: (undefined as any) as chevrotain.TokenType,\n    tkAllNullaryOrUnaryPropertiesIfNotAlready: (undefined as any) as chevrotain.TokenType,\n    tkIdentifier: (undefined as any) as chevrotain.TokenType\n};\nexport const allVpcTokens: chevrotain.TokenType[] = [];\n\n/* as a map so that we get quick access */\nexport function initAllVpcTokens() {\n    if (!tks.tkStringLiteral) {\n        tks.tkStringLiteral = chevrotain.createToken({\n            name: 'tkStringLiteral',\n            pattern: /\"[^\"\\n]*\"(?![a-zA-Z0-9_])/i\n        });\n        tks.tkBlockComment = chevrotain.createToken({\n            name: 'tkBlockComment',\n            pattern: /--\\[\\[[\\s\\S]*?\\]\\]/i,\n            group: chevrotain.Lexer.SKIPPED,\n            line_breaks: true\n        });\n        tks.tkLineComment = chevrotain.createToken({\n            name: 'tkLineComment',\n            pattern: /--(?!\\[\\[)[^\\n]*/i,\n            group: chevrotain.Lexer.SKIPPED\n        });\n        tks.tkContinuedLineOrWhiteSpace = chevrotain.createToken({\n            name: 'tkContinuedLineOrWhiteSpace',\n            pattern: /(?:[ \\t]+)|(?:[\\\\\\xC2][ \\t]*\\n)/i,\n            group: chevrotain.Lexer.SKIPPED,\n            line_breaks: true\n        });\n        tks.tkCardAtEndOfLine = chevrotain.createToken({\n            name: 'tkCardAtEndOfLine',\n            pattern: /(?:card|cd)(?=\\s*\\n)/i\n        });\n        tks.tkBgAtEndOfLine = chevrotain.createToken({\n            name: 'tkBgAtEndOfLine',\n            pattern: /(?:background|bkgnd|bg)(?=\\s*\\n)/i\n        });\n        tks.tkStackAtEndOfLine = chevrotain.createToken({\n            name: 'tkStackAtEndOfLine',\n            pattern: /stack(?=\\s*\\n)/i\n        });\n        tks.tkNewLine = chevrotain.createToken({\n            name: 'tkNewLine',\n            pattern: /\\n+/i,\n            line_breaks: true\n        });\n        tks.tkSyntaxMark = chevrotain.createToken({\n            name: 'tkSyntaxMark',\n            pattern: /\\?{9}/i\n        });\n        tks.tkNumLiteral = chevrotain.createToken({\n            name: 'tkNumLiteral',\n            pattern: /[0-9]+(?:\\.[0-9]*)?(?:e[-+]?[0-9]+)?(?![a-zA-Z0-9_])/i\n        });\n        tks.tkStack = chevrotain.createToken({\n            name: 'tkStack',\n            pattern: /(?:stack(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkBg = chevrotain.createToken({\n            name: 'tkBg',\n            pattern: /(?:background(?![a-zA-Z0-9_]))|(?:bkgnd(?![a-zA-Z0-9_]))|(?:bg(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkBgPlural = chevrotain.createToken({\n            name: 'tkBgPlural',\n            pattern: /(?:backgrounds(?![a-zA-Z0-9_]))|(?:bkgnds(?![a-zA-Z0-9_]))|(?:bgs(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkCard = chevrotain.createToken({\n            name: 'tkCard',\n            pattern: /(?:card(?![a-zA-Z0-9_]))|(?:cd(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkCardPlural = chevrotain.createToken({\n            name: 'tkCardPlural',\n            pattern: /(?:cards(?![a-zA-Z0-9_]))|(?:cds(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkBtn = chevrotain.createToken({\n            name: 'tkBtn',\n            pattern: /(?:button(?![a-zA-Z0-9_]))|(?:btn(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkBtnPlural = chevrotain.createToken({\n            name: 'tkBtnPlural',\n            pattern: /(?:buttons(?![a-zA-Z0-9_]))|(?:btns(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkFld = chevrotain.createToken({\n            name: 'tkFld',\n            pattern: /(?:field(?![a-zA-Z0-9_]))|(?:fld(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkFldPlural = chevrotain.createToken({\n            name: 'tkFldPlural',\n            pattern: /(?:fields(?![a-zA-Z0-9_]))|(?:flds(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkProductName = chevrotain.createToken({\n            name: 'tkProductName',\n            pattern: /(?:hypercard(?![a-zA-Z0-9_]))|(?:vipercard(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkAdjective = chevrotain.createToken({\n            name: 'tkAdjective',\n            pattern: /(?:long(?![a-zA-Z0-9_]))|(?:short(?![a-zA-Z0-9_]))|(?:abbrev(?![a-zA-Z0-9_]))|(?:abbr(?![a-zA-Z0-9_]))|(?:abbreviated(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkOrdinalOrPosition = chevrotain.createToken({\n            name: 'tkOrdinalOrPosition',\n            pattern: /(?:this(?![a-zA-Z0-9_]))|(?:prev(?![a-zA-Z0-9_]))|(?:previous(?![a-zA-Z0-9_]))|(?:next(?![a-zA-Z0-9_]))|(?:last(?![a-zA-Z0-9_]))|(?:mid(?![a-zA-Z0-9_]))|(?:middle(?![a-zA-Z0-9_]))|(?:any(?![a-zA-Z0-9_]))|(?:first(?![a-zA-Z0-9_]))|(?:second(?![a-zA-Z0-9_]))|(?:third(?![a-zA-Z0-9_]))|(?:fourth(?![a-zA-Z0-9_]))|(?:fifth(?![a-zA-Z0-9_]))|(?:sixth(?![a-zA-Z0-9_]))|(?:seventh(?![a-zA-Z0-9_]))|(?:eighth(?![a-zA-Z0-9_]))|(?:ninth(?![a-zA-Z0-9_]))|(?:tenth(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkChunkGranularity = chevrotain.createToken({\n            name: 'tkChunkGranularity',\n            pattern: /(?:characters?(?![a-zA-Z0-9_]))|(?:chars?(?![a-zA-Z0-9_]))|(?:words?(?![a-zA-Z0-9_]))|(?:items?(?![a-zA-Z0-9_]))|(?:lines?(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkInOnly = chevrotain.createToken({\n            name: 'tkInOnly',\n            pattern: /(?:in(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkOfOnly = chevrotain.createToken({\n            name: 'tkOfOnly',\n            pattern: /(?:of(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkA = chevrotain.createToken({\n            name: 'tkA',\n            pattern: /(?:a(?![a-zA-Z0-9_]))|(?:an(?![a-zA-Z0-9_]))/i\n        });\n        tks._not = chevrotain.createToken({\n            name: '_not',\n            pattern: /(?:not(?![a-zA-Z0-9_]))/i\n        });\n        tks._there = chevrotain.createToken({\n            name: '_there',\n            pattern: /(?:there(?![a-zA-Z0-9_]))/i\n        });\n        tks._is = chevrotain.createToken({\n            name: '_is',\n            pattern: /(?:is(?![a-zA-Z0-9_]))/i\n        });\n        tks._no = chevrotain.createToken({\n            name: '_no',\n            pattern: /(?:no(?![a-zA-Z0-9_]))/i\n        });\n        tks._and = chevrotain.createToken({\n            name: '_and',\n            pattern: /(?:and(?![a-zA-Z0-9_]))/i\n        });\n        tks._or = chevrotain.createToken({\n            name: '_or',\n            pattern: /(?:or(?![a-zA-Z0-9_]))/i\n        });\n        tks._contains = chevrotain.createToken({\n            name: '_contains',\n            pattern: /(?:contains(?![a-zA-Z0-9_]))/i\n        });\n        tks._within = chevrotain.createToken({\n            name: '_within',\n            pattern: /(?:within(?![a-zA-Z0-9_]))/i\n        });\n        tks._the = chevrotain.createToken({\n            name: '_the',\n            pattern: /(?:the(?![a-zA-Z0-9_]))/i\n        });\n        tks._message = chevrotain.createToken({\n            name: '_message',\n            pattern: /(?:msg(?![a-zA-Z0-9_]))|(?:message(?![a-zA-Z0-9_]))/i\n        });\n        tks._window = chevrotain.createToken({\n            name: '_window',\n            pattern: /(?:window(?![a-zA-Z0-9_]))/i\n        });\n        tks._windows = chevrotain.createToken({\n            name: '_windows',\n            pattern: /(?:windows(?![a-zA-Z0-9_]))/i\n        });\n        tks._box = chevrotain.createToken({\n            name: '_box',\n            pattern: /(?:box(?![a-zA-Z0-9_]))/i\n        });\n        tks._me = chevrotain.createToken({\n            name: '_me',\n            pattern: /(?:me(?![a-zA-Z0-9_]))/i\n        });\n        tks._recent = chevrotain.createToken({\n            name: '_recent',\n            pattern: /(?:recent(?![a-zA-Z0-9_]))/i\n        });\n        tks._back = chevrotain.createToken({\n            name: '_back',\n            pattern: /(?:back(?![a-zA-Z0-9_]))/i\n        });\n        tks._forth = chevrotain.createToken({\n            name: '_forth',\n            pattern: /(?:forth(?![a-zA-Z0-9_]))/i\n        });\n        tks._marked = chevrotain.createToken({\n            name: '_marked',\n            pattern: /(?:marked(?![a-zA-Z0-9_]))/i\n        });\n        tks._to = chevrotain.createToken({\n            name: '_to',\n            pattern: /(?:to(?![a-zA-Z0-9_]))/i\n        });\n        tks._menuItem = chevrotain.createToken({\n            name: '_menuItem',\n            pattern: /(?:menuitems?(?![a-zA-Z0-9_]))/i\n        });\n        tks._menu = chevrotain.createToken({\n            name: '_menu',\n            pattern: /(?:menu(?![a-zA-Z0-9_]))/i\n        });\n        tks._id = chevrotain.createToken({\n            name: '_id',\n            pattern: /(?:id(?![a-zA-Z0-9_]))/i\n        });\n        tks._number = chevrotain.createToken({\n            name: '_number',\n            pattern: /(?:number(?![a-zA-Z0-9_]))/i\n        });\n        tks._selection = chevrotain.createToken({\n            name: '_selection',\n            pattern: /(?:selection(?![a-zA-Z0-9_]))/i\n        });\n        tks._target = chevrotain.createToken({\n            name: '_target',\n            pattern: /(?:target(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkComma = chevrotain.createToken({\n            name: 'tkComma',\n            pattern: /,/i\n        });\n        tks.tkLParen = chevrotain.createToken({\n            name: 'tkLParen',\n            pattern: /\\(/i\n        });\n        tks.tkRParen = chevrotain.createToken({\n            name: 'tkRParen',\n            pattern: /\\)/i\n        });\n        tks.tkPlusOrMinus = chevrotain.createToken({\n            name: 'tkPlusOrMinus',\n            pattern: /(?:\\+)|(?:-)/i\n        });\n        tks.tkMultDivideExpDivMod = chevrotain.createToken({\n            name: 'tkMultDivideExpDivMod',\n            pattern: /(?:\\*)|(?:\\/)|(?:\\^)|(?:div(?![a-zA-Z0-9_]))|(?:mod(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkStringConcat = chevrotain.createToken({\n            name: 'tkStringConcat',\n            pattern: /(?:&&)|(?:&)/i\n        });\n        tks.tkGreaterOrLessEqualOrEqual = chevrotain.createToken({\n            name: 'tkGreaterOrLessEqualOrEqual',\n            pattern: /(?:<>)|(?:>=?)|(?:<=?)|(?:!=)|(?:==?)|(?:\\xB2)|(?:\\xB3)|(?:\\xAD)/i\n        });\n        tks.tkUnaryVipercardProperties = chevrotain.createToken({\n            name: 'tkUnaryVipercardProperties',\n            pattern: /(?:alltext(?![a-zA-Z0-9_]))|(?:label(?![a-zA-Z0-9_]))|(?:showlabel(?![a-zA-Z0-9_]))|(?:singleline(?![a-zA-Z0-9_]))|(?:defaulttextstyle(?![a-zA-Z0-9_]))|(?:defaulttextfont(?![a-zA-Z0-9_]))|(?:defaulttextsize(?![a-zA-Z0-9_]))|(?:internalid(?![a-zA-Z0-9_]))|(?:compatibilitymode(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkAllUnaryPropertiesIfNotAlready = chevrotain.createToken({\n            name: 'tkAllUnaryPropertiesIfNotAlready',\n            pattern: /(?:autohilite(?![a-zA-Z0-9_]))|(?:autoselect(?![a-zA-Z0-9_]))|(?:autotab(?![a-zA-Z0-9_]))|(?:bottom(?![a-zA-Z0-9_]))|(?:bottomright(?![a-zA-Z0-9_]))|(?:cantabort(?![a-zA-Z0-9_]))|(?:cantdelete(?![a-zA-Z0-9_]))|(?:cantmodify(?![a-zA-Z0-9_]))|(?:cantpeek(?![a-zA-Z0-9_]))|(?:checkmark(?![a-zA-Z0-9_]))|(?:commandchar(?![a-zA-Z0-9_]))|(?:dontsearch(?![a-zA-Z0-9_]))|(?:dontwrap(?![a-zA-Z0-9_]))|(?:enabled(?![a-zA-Z0-9_]))|(?:family(?![a-zA-Z0-9_]))|(?:fixedlineheight(?![a-zA-Z0-9_]))|(?:freesize(?![a-zA-Z0-9_]))|(?:height(?![a-zA-Z0-9_]))|(?:hilite(?![a-zA-Z0-9_]))|(?:icon(?![a-zA-Z0-9_]))|(?:left(?![a-zA-Z0-9_]))|(?:location(?![a-zA-Z0-9_]))|(?:locktext(?![a-zA-Z0-9_]))|(?:markchar(?![a-zA-Z0-9_]))|(?:menumessage(?![a-zA-Z0-9_]))|(?:multiplelines(?![a-zA-Z0-9_]))|(?:name(?![a-zA-Z0-9_]))|(?:owner(?![a-zA-Z0-9_]))|(?:partnumber(?![a-zA-Z0-9_]))|(?:rectangle(?![a-zA-Z0-9_]))|(?:reporttemplates(?![a-zA-Z0-9_]))|(?:right(?![a-zA-Z0-9_]))|(?:script(?![a-zA-Z0-9_]))|(?:scroll(?![a-zA-Z0-9_]))|(?:sharedhilite(?![a-zA-Z0-9_]))|(?:sharedtext(?![a-zA-Z0-9_]))|(?:showlines(?![a-zA-Z0-9_]))|(?:showname(?![a-zA-Z0-9_]))|(?:showpict(?![a-zA-Z0-9_]))|(?:size(?![a-zA-Z0-9_]))|(?:style(?![a-zA-Z0-9_]))|(?:textalign(?![a-zA-Z0-9_]))|(?:titlewidth(?![a-zA-Z0-9_]))|(?:top(?![a-zA-Z0-9_]))|(?:topleft(?![a-zA-Z0-9_]))|(?:visible(?![a-zA-Z0-9_]))|(?:widemargins(?![a-zA-Z0-9_]))|(?:width(?![a-zA-Z0-9_]))|(?:zoomed(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkAllNullaryOrUnaryPropertiesIfNotAlready = chevrotain.createToken({\n            name: 'tkAllNullaryOrUnaryPropertiesIfNotAlready',\n            pattern: /(?:scriptinglanguage(?![a-zA-Z0-9_]))|(?:textfont(?![a-zA-Z0-9_]))|(?:textheight(?![a-zA-Z0-9_]))|(?:textsize(?![a-zA-Z0-9_]))|(?:textstyle(?![a-zA-Z0-9_]))|(?:version(?![a-zA-Z0-9_]))/i\n        });\n        tks.tkIdentifier = chevrotain.createToken({\n            name: 'tkIdentifier',\n            pattern: /[a-zA-Z][0-9a-zA-Z$_]*/i\n        });\n    }\n\n    Object.freeze(tks);\n\n    /* as an array, since order matters */\n    if (allVpcTokens.length <= 1) {\n        allVpcTokens[0] = tks.tkStringLiteral;\n        allVpcTokens[1] = tks.tkBlockComment;\n        allVpcTokens[2] = tks.tkLineComment;\n        allVpcTokens[3] = tks.tkContinuedLineOrWhiteSpace;\n        allVpcTokens[4] = tks.tkCardAtEndOfLine;\n        allVpcTokens[5] = tks.tkBgAtEndOfLine;\n        allVpcTokens[6] = tks.tkStackAtEndOfLine;\n        allVpcTokens[7] = tks.tkNewLine;\n        allVpcTokens[8] = tks.tkSyntaxMark;\n        allVpcTokens[9] = tks.tkNumLiteral;\n        allVpcTokens[10] = tks.tkStack;\n        allVpcTokens[11] = tks.tkBg;\n        allVpcTokens[12] = tks.tkBgPlural;\n        allVpcTokens[13] = tks.tkCard;\n        allVpcTokens[14] = tks.tkCardPlural;\n        allVpcTokens[15] = tks.tkBtn;\n        allVpcTokens[16] = tks.tkBtnPlural;\n        allVpcTokens[17] = tks.tkFld;\n        allVpcTokens[18] = tks.tkFldPlural;\n        allVpcTokens[19] = tks.tkProductName;\n        allVpcTokens[20] = tks.tkAdjective;\n        allVpcTokens[21] = tks.tkOrdinalOrPosition;\n        allVpcTokens[22] = tks.tkChunkGranularity;\n        allVpcTokens[23] = tks.tkInOnly;\n        allVpcTokens[24] = tks.tkOfOnly;\n        allVpcTokens[25] = tks.tkA;\n        allVpcTokens[26] = tks._not;\n        allVpcTokens[27] = tks._there;\n        allVpcTokens[28] = tks._is;\n        allVpcTokens[29] = tks._no;\n        allVpcTokens[30] = tks._and;\n        allVpcTokens[31] = tks._or;\n        allVpcTokens[32] = tks._contains;\n        allVpcTokens[33] = tks._within;\n        allVpcTokens[34] = tks._the;\n        allVpcTokens[35] = tks._message;\n        allVpcTokens[36] = tks._window;\n        allVpcTokens[37] = tks._windows;\n        allVpcTokens[38] = tks._box;\n        allVpcTokens[39] = tks._me;\n        allVpcTokens[40] = tks._recent;\n        allVpcTokens[41] = tks._back;\n        allVpcTokens[42] = tks._forth;\n        allVpcTokens[43] = tks._marked;\n        allVpcTokens[44] = tks._to;\n        allVpcTokens[45] = tks._menuItem;\n        allVpcTokens[46] = tks._menu;\n        allVpcTokens[47] = tks._id;\n        allVpcTokens[48] = tks._number;\n        allVpcTokens[49] = tks._selection;\n        allVpcTokens[50] = tks._target;\n        allVpcTokens[51] = tks.tkComma;\n        allVpcTokens[52] = tks.tkLParen;\n        allVpcTokens[53] = tks.tkRParen;\n        allVpcTokens[54] = tks.tkPlusOrMinus;\n        allVpcTokens[55] = tks.tkMultDivideExpDivMod;\n        allVpcTokens[56] = tks.tkStringConcat;\n        allVpcTokens[57] = tks.tkGreaterOrLessEqualOrEqual;\n        allVpcTokens[58] = tks.tkUnaryVipercardProperties;\n        allVpcTokens[59] = tks.tkAllUnaryPropertiesIfNotAlready;\n        allVpcTokens[60] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        allVpcTokens[61] = tks.tkIdentifier;\n        Object.freeze(allVpcTokens);\n    }\n    if (!listOfAllWordLikeTokens['stack']) {\n        listOfAllWordLikeTokens['stack'] = tks.tkStack;\n        listOfAllWordLikeTokens['background'] = tks.tkBg;\n        listOfAllWordLikeTokens['bkgnd'] = tks.tkBg;\n        listOfAllWordLikeTokens['bg'] = tks.tkBg;\n        listOfAllWordLikeTokens['backgrounds'] = tks.tkBgPlural;\n        listOfAllWordLikeTokens['bkgnds'] = tks.tkBgPlural;\n        listOfAllWordLikeTokens['bgs'] = tks.tkBgPlural;\n        listOfAllWordLikeTokens['card'] = tks.tkCard;\n        listOfAllWordLikeTokens['cd'] = tks.tkCard;\n        listOfAllWordLikeTokens['cards'] = tks.tkCardPlural;\n        listOfAllWordLikeTokens['cds'] = tks.tkCardPlural;\n        listOfAllWordLikeTokens['button'] = tks.tkBtn;\n        listOfAllWordLikeTokens['btn'] = tks.tkBtn;\n        listOfAllWordLikeTokens['buttons'] = tks.tkBtnPlural;\n        listOfAllWordLikeTokens['btns'] = tks.tkBtnPlural;\n        listOfAllWordLikeTokens['field'] = tks.tkFld;\n        listOfAllWordLikeTokens['fld'] = tks.tkFld;\n        listOfAllWordLikeTokens['fields'] = tks.tkFldPlural;\n        listOfAllWordLikeTokens['flds'] = tks.tkFldPlural;\n        listOfAllWordLikeTokens['hypercard'] = tks.tkProductName;\n        listOfAllWordLikeTokens['vipercard'] = tks.tkProductName;\n        listOfAllWordLikeTokens['long'] = tks.tkAdjective;\n        listOfAllWordLikeTokens['short'] = tks.tkAdjective;\n        listOfAllWordLikeTokens['abbrev'] = tks.tkAdjective;\n        listOfAllWordLikeTokens['abbr'] = tks.tkAdjective;\n        listOfAllWordLikeTokens['abbreviated'] = tks.tkAdjective;\n        listOfAllWordLikeTokens['this'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['prev'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['previous'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['next'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['last'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['mid'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['middle'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['any'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['first'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['second'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['third'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['fourth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['fifth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['sixth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['seventh'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['eighth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['ninth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['tenth'] = tks.tkOrdinalOrPosition;\n        listOfAllWordLikeTokens['characters'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['character'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['chars'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['char'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['words'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['word'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['items'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['item'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['lines'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['line'] = tks.tkChunkGranularity;\n        listOfAllWordLikeTokens['in'] = tks.tkInOnly;\n        listOfAllWordLikeTokens['of'] = tks.tkOfOnly;\n        listOfAllWordLikeTokens['a'] = tks.tkA;\n        listOfAllWordLikeTokens['an'] = tks.tkA;\n        listOfAllWordLikeTokens['not'] = tks._not;\n        listOfAllWordLikeTokens['there'] = tks._there;\n        listOfAllWordLikeTokens['is'] = tks._is;\n        listOfAllWordLikeTokens['no'] = tks._no;\n        listOfAllWordLikeTokens['and'] = tks._and;\n        listOfAllWordLikeTokens['or'] = tks._or;\n        listOfAllWordLikeTokens['contains'] = tks._contains;\n        listOfAllWordLikeTokens['within'] = tks._within;\n        listOfAllWordLikeTokens['the'] = tks._the;\n        listOfAllWordLikeTokens['msg'] = tks._message;\n        listOfAllWordLikeTokens['message'] = tks._message;\n        listOfAllWordLikeTokens['window'] = tks._window;\n        listOfAllWordLikeTokens['windows'] = tks._windows;\n        listOfAllWordLikeTokens['box'] = tks._box;\n        listOfAllWordLikeTokens['me'] = tks._me;\n        listOfAllWordLikeTokens['recent'] = tks._recent;\n        listOfAllWordLikeTokens['back'] = tks._back;\n        listOfAllWordLikeTokens['forth'] = tks._forth;\n        listOfAllWordLikeTokens['marked'] = tks._marked;\n        listOfAllWordLikeTokens['to'] = tks._to;\n        listOfAllWordLikeTokens['menuitems'] = tks._menuItem;\n        listOfAllWordLikeTokens['menuitem'] = tks._menuItem;\n        listOfAllWordLikeTokens['menu'] = tks._menu;\n        listOfAllWordLikeTokens['id'] = tks._id;\n        listOfAllWordLikeTokens['number'] = tks._number;\n        listOfAllWordLikeTokens['selection'] = tks._selection;\n        listOfAllWordLikeTokens['target'] = tks._target;\n        listOfAllWordLikeTokens['alltext'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['label'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['showlabel'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['singleline'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['defaulttextstyle'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['defaulttextfont'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['defaulttextsize'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['internalid'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['compatibilitymode'] = tks.tkUnaryVipercardProperties;\n        listOfAllWordLikeTokens['autohilite'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['autoselect'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['autotab'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['bottom'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['bottomright'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['cantabort'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['cantdelete'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['cantmodify'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['cantpeek'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['checkmark'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['commandchar'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['dontsearch'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['dontwrap'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['enabled'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['family'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['fixedlineheight'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['freesize'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['height'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['hilite'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['icon'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['left'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['location'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['locktext'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['markchar'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['menumessage'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['multiplelines'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['name'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['owner'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['partnumber'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['rectangle'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['reporttemplates'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['right'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['script'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['scroll'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['sharedhilite'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['sharedtext'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['showlines'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['showname'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['showpict'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['size'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['style'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['textalign'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['titlewidth'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['top'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['topleft'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['visible'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['widemargins'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['width'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['zoomed'] = tks.tkAllUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['scriptinglanguage'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['textfont'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['textheight'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['textsize'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['textstyle'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        listOfAllWordLikeTokens['version'] = tks.tkAllNullaryOrUnaryPropertiesIfNotAlready;\n        manuallyAddToListOfAllWordLikeTokens();\n        Object.freeze(listOfAllWordLikeTokens);\n    }\n}\n\nalsoReservedWordsList['stack'] = true;\nalsoReservedWordsList['background'] = true;\nalsoReservedWordsList['bkgnd'] = true;\nalsoReservedWordsList['bg'] = true;\nalsoReservedWordsList['backgrounds'] = true;\nalsoReservedWordsList['bkgnds'] = true;\nalsoReservedWordsList['bgs'] = true;\nalsoReservedWordsList['card'] = true;\nalsoReservedWordsList['cd'] = true;\nalsoReservedWordsList['cards'] = true;\nalsoReservedWordsList['cds'] = true;\nalsoReservedWordsList['button'] = true;\nalsoReservedWordsList['btn'] = true;\nalsoReservedWordsList['buttons'] = true;\nalsoReservedWordsList['btns'] = true;\nalsoReservedWordsList['field'] = true;\nalsoReservedWordsList['fld'] = true;\nalsoReservedWordsList['fields'] = true;\nalsoReservedWordsList['flds'] = true;\nalsoReservedWordsList['hypercard'] = true;\nalsoReservedWordsList['vipercard'] = true;\nalsoReservedWordsList['long'] = true;\nalsoReservedWordsList['short'] = true;\nalsoReservedWordsList['abbrev'] = true;\nalsoReservedWordsList['abbr'] = true;\nalsoReservedWordsList['abbreviated'] = true;\nalsoReservedWordsList['this'] = true;\nalsoReservedWordsList['prev'] = true;\nalsoReservedWordsList['previous'] = true;\nalsoReservedWordsList['next'] = true;\nalsoReservedWordsList['last'] = true;\nalsoReservedWordsList['mid'] = true;\nalsoReservedWordsList['middle'] = true;\nalsoReservedWordsList['any'] = true;\nalsoReservedWordsList['first'] = true;\nalsoReservedWordsList['second'] = true;\nalsoReservedWordsList['third'] = true;\nalsoReservedWordsList['fourth'] = true;\nalsoReservedWordsList['fifth'] = true;\nalsoReservedWordsList['sixth'] = true;\nalsoReservedWordsList['seventh'] = true;\nalsoReservedWordsList['eighth'] = true;\nalsoReservedWordsList['ninth'] = true;\nalsoReservedWordsList['tenth'] = true;\nalsoReservedWordsList['characters'] = true;\nalsoReservedWordsList['character'] = true;\nalsoReservedWordsList['chars'] = true;\nalsoReservedWordsList['char'] = true;\nalsoReservedWordsList['words'] = true;\nalsoReservedWordsList['word'] = true;\nalsoReservedWordsList['items'] = true;\nalsoReservedWordsList['item'] = true;\nalsoReservedWordsList['lines'] = true;\nalsoReservedWordsList['line'] = true;\nalsoReservedWordsList['in'] = true;\nalsoReservedWordsList['of'] = true;\nalsoReservedWordsList['a'] = true;\nalsoReservedWordsList['an'] = true;\nalsoReservedWordsList['not'] = true;\nalsoReservedWordsList['there'] = true;\nalsoReservedWordsList['is'] = true;\nalsoReservedWordsList['no'] = true;\nalsoReservedWordsList['and'] = true;\nalsoReservedWordsList['or'] = true;\nalsoReservedWordsList['contains'] = true;\nalsoReservedWordsList['within'] = true;\nalsoReservedWordsList['the'] = true;\nalsoReservedWordsList['msg'] = true;\nalsoReservedWordsList['message'] = true;\nalsoReservedWordsList['window'] = true;\nalsoReservedWordsList['windows'] = true;\nalsoReservedWordsList['box'] = true;\nalsoReservedWordsList['me'] = true;\nalsoReservedWordsList['recent'] = true;\nalsoReservedWordsList['back'] = true;\nalsoReservedWordsList['forth'] = true;\nalsoReservedWordsList['marked'] = true;\nalsoReservedWordsList['to'] = true;\nalsoReservedWordsList['menuitems'] = true;\nalsoReservedWordsList['menuitem'] = true;\nalsoReservedWordsList['menu'] = true;\nalsoReservedWordsList['id'] = true;\nalsoReservedWordsList['number'] = true;\nalsoReservedWordsList['selection'] = true;\nalsoReservedWordsList['target'] = true;\n\n/* map word-like tokens to the token type, useful for\n fabricating new tokens in rewrite stage. */\nexport const listOfAllWordLikeTokens: { [key: string]: chevrotain.TokenType } = {};\n\n/* list commands, even the ones we don't support. */\nexport const listOfAllBuiltinCommandsInOriginalProduct: { [key: string]: boolean } = {};\n\nlistOfAllBuiltinCommandsInOriginalProduct['add'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['answer'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['arrowkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['ask'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['beep'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['choose'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['click'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['close'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['commandkeydown'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['controlkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['convert'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['copy'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['create'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['debug'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['delete'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['dial'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['disable'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['divide'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['domenu'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['drag'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['edit'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['enable'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['enterinfield'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['enterkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['export'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['find'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['functionkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['get'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['go'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['help'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['hide'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['import'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['keydown'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['lock'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['mark'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['multiply'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['open'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['open'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['open'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['open'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['play'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['pop'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['print'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['push'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['put'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['read'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['reply'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['request'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['reset'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['returninfield'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['returnkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['run'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['save'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['select'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['set'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['show'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['sort'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['start'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['stop'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['subtract'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['tabkey'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['type'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['unlock'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['unmark'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['visual'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['wait'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['write'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['do'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['exit'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['global'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['next'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['pass'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['return'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['send'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['if'] = true;\n/* ones we've defined */\nlistOfAllBuiltinCommandsInOriginalProduct['vpccalluntrappablechoose'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['vpccalluntrappableerrordialog'] = true;\nlistOfAllBuiltinCommandsInOriginalProduct['replace'] = true;\n\n/* list events, even the ones we don't support. */\nexport const listOfAllBuiltinEventsInOriginalProduct: { [key: string]: boolean } = {};\n\nlistOfAllBuiltinEventsInOriginalProduct['choose'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['domenu'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['help'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['arrowkey'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['commandkeydown'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['controlkey'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['functionkey'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['keydown'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['returninfield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['returnkey'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['tabkey'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['errordialog'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['appleevent'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['appleevent'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['closebackground'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['closecard'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['closefield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['closestack'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['deletebackground'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['deletebutton'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['deletecard'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['deletefield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['deletestack'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['errordialog'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['exitfield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['idle'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mousedoubleclick'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mousedown'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mouseenter'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mouseleave'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mousestilldown'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mouseup'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['mousewithin'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['movewindow'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['newbackground'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['newbutton'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['newcard'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['newfield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['newstack'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['openbackground'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['opencard'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['openfield'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['openstack'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['quit'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['resume'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['resumestack'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['sizewindow'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['startup'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['suspend'] = true;\nlistOfAllBuiltinEventsInOriginalProduct['suspendstack'] = true;\n\n/* it would be too restrictive to say a variable can only be a tkidentifier. */\nexport function couldTokenTypeBeAVariableName(t: chevrotain.IToken) {\n    return (\n        t.tokenType === tks.tkIdentifier ||\n        t.tokenType === tks._number ||\n        t.tokenType === tks.tkA ||\n        t.tokenType === tks.tkAllUnaryPropertiesIfNotAlready ||\n        t.tokenType === tks.tkUnaryVipercardProperties ||\n        t.tokenType === tks.tkAllNullaryOrUnaryPropertiesIfNotAlready\n    );\n}\n\n/* so that we'll get compile-time error if a rule name is misspelled */\nexport const tkstr = {\n    RuleHAllPropertiesThatCouldBeUnary: 'RuleHAllPropertiesThatCouldBeUnary',\n    RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary: 'RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary',\n    RuleHAnyFnName: 'RuleHAnyFnName',\n    RuleHCouldBeAPropertyToSet: 'RuleHCouldBeAPropertyToSet',\n    RuleHAnyAllowedVariableName: 'RuleHAnyAllowedVariableName',\n    RuleObject: 'RuleObject',\n    RuleObjectBtn: 'RuleObjectBtn',\n    RuleObjectFld: 'RuleObjectFld',\n    RuleObjectCard: 'RuleObjectCard',\n    RuleObjectBg: 'RuleObjectBg',\n    RuleObjectStack: 'RuleObjectStack',\n    RuleObjectSpecial: 'RuleObjectSpecial',\n    RuleObjectInterpretedFromString: 'RuleObjectInterpretedFromString',\n    RuleOf: 'RuleOf',\n    RuleMenuItem: 'RuleMenuItem',\n    RuleMenu: 'RuleMenu',\n    RuleWindow_1: 'RuleWindow_1',\n    RuleWindow: 'RuleWindow',\n    RuleMessageBox: 'RuleMessageBox',\n    RuleHSimpleContainer: 'RuleHSimpleContainer',\n    RuleHContainer: 'RuleHContainer',\n    RuleHChunk: 'RuleHChunk',\n    RuleHChunkOne: 'RuleHChunkOne',\n    RuleHChunkBound: 'RuleHChunkBound',\n    RuleHSource: 'RuleHSource',\n    RuleHSource_1: 'RuleHSource_1',\n    RuleHFnCallWParens: 'RuleHFnCallWParens',\n    RuleHUnaryPropertyGet: 'RuleHUnaryPropertyGet',\n    RuleHOldStyleFnNonNullary: 'RuleHOldStyleFnNonNullary',\n    RuleHOldStyleFnNullaryOrNullaryPropGet: 'RuleHOldStyleFnNullaryOrNullaryPropGet',\n    RuleHGenericFunctionCall: 'RuleHGenericFunctionCall',\n    RuleFnCallNumberOf: 'RuleFnCallNumberOf',\n    RuleFnCallNumberOf_1: 'RuleFnCallNumberOf_1',\n    RuleFnCallNumberOf_2: 'RuleFnCallNumberOf_2',\n    RuleFnCallNumberOf_3: 'RuleFnCallNumberOf_3',\n    RuleFnCallNumberOf_4: 'RuleFnCallNumberOf_4',\n    RuleFnCallNumberOf_5: 'RuleFnCallNumberOf_5',\n    RuleFnCallThereIs: 'RuleFnCallThereIs',\n    RuleAnyPropertyVal: 'RuleAnyPropertyVal',\n    RuleExpr: 'RuleExpr',\n    RuleLvl1Expression: 'RuleLvl1Expression',\n    RuleLvl2Expression: 'RuleLvl2Expression',\n    RuleLvl3Expression: 'RuleLvl3Expression',\n    RuleLvl4Expression: 'RuleLvl4Expression',\n    RuleLvl5Expression: 'RuleLvl5Expression',\n    RuleLvl6Expression: 'RuleLvl6Expression',\n    RuleAndOrOr: 'RuleAndOrOr',\n    RuleContainsOrGreaterLessEqual: 'RuleContainsOrGreaterLessEqual',\n    RuleIsExpression: 'RuleIsExpression',\n    RuleBuiltinCmdAdd: 'RuleBuiltinCmdAdd',\n    RuleBuiltinCmdAnswer: 'RuleBuiltinCmdAnswer',\n    RuleBuiltinCmdAsk: 'RuleBuiltinCmdAsk',\n    RuleBuiltinCmdBeep: 'RuleBuiltinCmdBeep',\n    RuleBuiltinCmdVpccalluntrappablechoose: 'RuleBuiltinCmdVpccalluntrappablechoose',\n    RuleBuiltinCmdClick: 'RuleBuiltinCmdClick',\n    RuleBuiltinCmdDelete: 'RuleBuiltinCmdDelete',\n    RuleBuiltinCmdDial: 'RuleBuiltinCmdDial',\n    RuleBuiltinCmdDisable: 'RuleBuiltinCmdDisable',\n    RuleBuiltinCmdDivide: 'RuleBuiltinCmdDivide',\n    RuleBuiltinCmdDrag: 'RuleBuiltinCmdDrag',\n    RuleHBuiltinCmdDrag_1: 'RuleHBuiltinCmdDrag_1',\n    RuleBuiltinCmdEnable: 'RuleBuiltinCmdEnable',\n    RuleBuiltinCmdVpccalluntrappableerrordialog: 'RuleBuiltinCmdVpccalluntrappableerrordialog',\n    RuleBuiltinCmdHide: 'RuleBuiltinCmdHide',\n    RuleBuiltinCmdLock: 'RuleBuiltinCmdLock',\n    RuleBuiltinCmdMark: 'RuleBuiltinCmdMark',\n    RuleBuiltinCmdMultiply: 'RuleBuiltinCmdMultiply',\n    RuleBuiltinCmdPlay: 'RuleBuiltinCmdPlay',\n    RuleHBuiltinCmdPlay_1: 'RuleHBuiltinCmdPlay_1',\n    RuleBuiltinCmdPut: 'RuleBuiltinCmdPut',\n    RuleBuiltinCmdReset: 'RuleBuiltinCmdReset',\n    RuleBuiltinCmdReplace: 'RuleBuiltinCmdReplace',\n    RuleBuiltinCmdSelect: 'RuleBuiltinCmdSelect',\n    RuleBuiltinCmdSet: 'RuleBuiltinCmdSet',\n    RuleBuiltinCmdShow: 'RuleBuiltinCmdShow',\n    RuleBuiltinCmdSort: 'RuleBuiltinCmdSort',\n    RuleBuiltinCmdStart: 'RuleBuiltinCmdStart',\n    RuleBuiltinCmdStop: 'RuleBuiltinCmdStop',\n    RuleBuiltinCmdSubtract: 'RuleBuiltinCmdSubtract',\n    RuleBuiltinCmdUnlock: 'RuleBuiltinCmdUnlock',\n    RuleBuiltinCmdVisual: 'RuleBuiltinCmdVisual',\n    RuleBuiltinCmdWait: 'RuleBuiltinCmdWait',\n    RuleCmdSend: 'RuleCmdSend',\n    RuleInternalCmdRequestEval: 'RuleInternalCmdRequestEval',\n    RuleInternalCmdUserHandler: 'RuleInternalCmdUserHandler',\n    tkStringLiteral: 'tkStringLiteral',\n    tkBlockComment: 'tkBlockComment',\n    tkLineComment: 'tkLineComment',\n    tkContinuedLineOrWhiteSpace: 'tkContinuedLineOrWhiteSpace',\n    tkCardAtEndOfLine: 'tkCardAtEndOfLine',\n    tkBgAtEndOfLine: 'tkBgAtEndOfLine',\n    tkStackAtEndOfLine: 'tkStackAtEndOfLine',\n    tkNewLine: 'tkNewLine',\n    tkSyntaxMark: 'tkSyntaxMark',\n    tkNumLiteral: 'tkNumLiteral',\n    tkStack: 'tkStack',\n    tkBg: 'tkBg',\n    tkBgPlural: 'tkBgPlural',\n    tkCard: 'tkCard',\n    tkCardPlural: 'tkCardPlural',\n    tkBtn: 'tkBtn',\n    tkBtnPlural: 'tkBtnPlural',\n    tkFld: 'tkFld',\n    tkFldPlural: 'tkFldPlural',\n    tkProductName: 'tkProductName',\n    tkAdjective: 'tkAdjective',\n    tkOrdinalOrPosition: 'tkOrdinalOrPosition',\n    tkChunkGranularity: 'tkChunkGranularity',\n    tkInOnly: 'tkInOnly',\n    tkOfOnly: 'tkOfOnly',\n    tkA: 'tkA',\n    _not: '_not',\n    _there: '_there',\n    _is: '_is',\n    _no: '_no',\n    _and: '_and',\n    _or: '_or',\n    _contains: '_contains',\n    _within: '_within',\n    _the: '_the',\n    _message: '_message',\n    _window: '_window',\n    _windows: '_windows',\n    _box: '_box',\n    _me: '_me',\n    _recent: '_recent',\n    _back: '_back',\n    _forth: '_forth',\n    _marked: '_marked',\n    _to: '_to',\n    _menuItem: '_menuItem',\n    _menu: '_menu',\n    _id: '_id',\n    _number: '_number',\n    _selection: '_selection',\n    _target: '_target',\n    tkComma: 'tkComma',\n    tkLParen: 'tkLParen',\n    tkRParen: 'tkRParen',\n    tkPlusOrMinus: 'tkPlusOrMinus',\n    tkMultDivideExpDivMod: 'tkMultDivideExpDivMod',\n    tkStringConcat: 'tkStringConcat',\n    tkGreaterOrLessEqualOrEqual: 'tkGreaterOrLessEqualOrEqual',\n    tkUnaryVipercardProperties: 'tkUnaryVipercardProperties',\n    tkAllUnaryPropertiesIfNotAlready: 'tkAllUnaryPropertiesIfNotAlready',\n    tkAllNullaryOrUnaryPropertiesIfNotAlready: 'tkAllNullaryOrUnaryPropertiesIfNotAlready',\n    tkIdentifier: 'tkIdentifier'\n};\n\n/* generated code, any changes above this point will be lost: --------------- */\n\nObject.freeze(alsoReservedWordsList);\n\nexport type ChvITk = chevrotain.IToken;\nexport type ChvITkType = chevrotain.ITokenConfig;\n\nfunction manuallyAddToListOfAllWordLikeTokens() {\n    listOfAllWordLikeTokens['+'] = tks.tkPlusOrMinus;\n    listOfAllWordLikeTokens['-'] = tks.tkPlusOrMinus;\n    listOfAllWordLikeTokens['('] = tks.tkLParen;\n    listOfAllWordLikeTokens[')'] = tks.tkRParen;\n    listOfAllWordLikeTokens['<'] = tks.tkGreaterOrLessEqualOrEqual;\n    listOfAllWordLikeTokens['<='] = tks.tkGreaterOrLessEqualOrEqual;\n    listOfAllWordLikeTokens['>'] = tks.tkGreaterOrLessEqualOrEqual;\n    listOfAllWordLikeTokens['>='] = tks.tkGreaterOrLessEqualOrEqual;\n    listOfAllWordLikeTokens['=='] = tks.tkGreaterOrLessEqualOrEqual;\n    listOfAllWordLikeTokens['\\n'] = tks.tkNewLine;\n    listOfAllWordLikeTokens['%MARK%'] = tks.tkSyntaxMark;\n}\n\n/**\n * when re-writing syntax, sometimes we want to construct a token, and make it\n * look just as if it had come from the lexer.\n * use this class to build a fake token based on a real token\n */\nexport const BuildFakeTokens = /* static class */ {\n    strSyntaxMark: Util512.repeat(9, '?').join(''),\n    /**\n     * make a syntax marker token\n     */\n    makeSyntaxMarker(basis: chevrotain.IToken, whichMarker = '') {\n        if (whichMarker === ',') {\n            return this.make(basis, tks.tkComma);\n        } else if (whichMarker === '') {\n            return this.make(basis, tks.tkSyntaxMark);\n        } else {\n            assertTrue(false, '8]|expected \"\" or \",\"', whichMarker);\n        }\n    },\n\n    /**\n     * make an arbitrary token, pass in the constructor\n     */\n    make(basis: chevrotain.IToken, type: chevrotain.TokenType) {\n        let image = getKnownImages()[type.name];\n        assertTrue(trueIfDefinedAndNotNull(image), '8@|image is undefined', type.name);\n        return this.makeTk(basis, type, image);\n    },\n\n    /**\n     * make a string literal\n     */\n    makeStringLiteral(basis: chevrotain.IToken, unquoted: string) {\n        return this.makeTk(basis, tks.tkStringLiteral, '\"' + unquoted + '\"');\n    },\n\n    /**\n     * implementation\n     */\n    makeTk(basis: chevrotain.IToken, type: chevrotain.TokenType, image: string) {\n        let cloned = cloneToken(basis);\n        cloned.image = image;\n        cloned.endOffset = cloned.startOffset + image.length;\n        cloned.endColumn = trueIfDefinedAndNotNull(cloned.startColumn) ? cloned.startColumn + image.length : undefined;\n        cloned.endLine = cloned.startLine;\n        cloned.tokenType = type;\n        assertTrue(trueIfDefinedAndNotNull(type.tokenTypeIdx), 'does not have a idx yet?', type.name);\n        cloned.tokenTypeIdx = type.tokenTypeIdx;\n        return cloned;\n    }\n};\n\nconst knownImages: { [tkname: string]: string } = {};\nfunction getKnownImages() {\n    if (!knownImages[tks.tkNewLine.name]) {\n        knownImages[tks.tkNewLine.name] = '\\n';\n        knownImages[tks.tkComma.name] = ',';\n        knownImages[tks.tkSyntaxMark.name] = BuildFakeTokens.strSyntaxMark;\n    }\n\n    return knownImages;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeparse/vpcVisitor.ts",
    "content": "\n/* auto */ import { VpcVisitorAddMixinMethods, VpcVisitorInterface } from './vpcVisitorMixin';\n/* auto */ import { VisitingContext } from './vpcVisitorInterface';\n/* auto */ import { VpcEvalHelpers } from './../vpcutils/vpcValEval';\n/* auto */ import { IntermedMapOfIntermedVals, VpcVal } from './../vpcutils/vpcVal';\n/* auto */ import { ChvITk, allVpcTokens, initAllVpcTokens } from './vpcTokens';\n/* auto */ import { RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { MakeVpcChvParser } from './vpcParser';\n/* auto */ import { VpcOpCtg, checkThrow, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldRead } from './../vel/velOutsideInterfaces';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* check_long_lines_silence_subsequent */\n\n/**\n * create a Visitor class instance\n * a Visitor can recurse through a CST to produce a single value.\n */\nexport function createVisitor(parser: chevrotain.CstParser): VpcVisitorInterface {\n    let BaseVisitor = parser.getBaseCstVisitorConstructor();\n    class VPCCustomVisitor extends BaseVisitor {\n        evalAllExpressions = true;\n        evalHelp = new VpcEvalHelpers();\n        outside: OutsideWorldRead;\n        tmpArr: [boolean, any] = [false, undefined];\n        constructor() {\n            super();\n            this.validateVisitor();\n        }\n\n        /**\n         * recurse through, and construct an IntermedMapOfIntermedVals\n         * note: method name must have a $ so that chevrotain understands it is not a response to a rule.\n         */\n        H$BuildMap(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            let ret = new IntermedMapOfIntermedVals();\n            for (let key in ctx) {\n                if (!ctx.hasOwnProperty(key)) {\n                    continue;\n                }\n\n                let item = ctx[key];\n                if (item) {\n                    let looksLikeRule = key.startsWith('Rule');\n                    /* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing */\n                    let looksLikeToken = key.startsWith('tk') || key.startsWith('_');\n                    /* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing */\n                    if (looksLikeRule || looksLikeToken) {\n                        const len = item.length;\n                        for (let i = 0; i < len; i++) {\n                            let child = item[i];\n                            if (child.image) {\n                                ret.addString(key, child.image);\n                            } else if (looksLikeRule && child.children !== undefined) {\n                                ret.addResult(key, this.visit(child));\n                            }\n                        }\n                    }\n                }\n            }\n\n            return ret;\n        }\n\n        /* generated code, any changes past this point will be lost: --------------- */\n\n        RuleHAllPropertiesThatCouldBeUnary(ctx: VisitingContext): ChvITk {\n            if (ctx.tkAllUnaryPropertiesIfNotAlready && ctx.tkAllUnaryPropertiesIfNotAlready[0]) {\n                return ctx.tkAllUnaryPropertiesIfNotAlready[0];\n            } else if (ctx.tkUnaryVipercardProperties && ctx.tkUnaryVipercardProperties[0]) {\n                return ctx.tkUnaryVipercardProperties[0];\n            } else if (ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready && ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0]) {\n                return ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0];\n            } else if (ctx._id && ctx._id[0]) {\n                return ctx._id[0];\n            } else if (ctx._marked && ctx._marked[0]) {\n                return ctx._marked[0];\n            } else if (ctx._number && ctx._number[0]) {\n                return ctx._number[0];\n            } else {\n                checkThrowInternal(false, '<,|OR in HAllPropertiesThatCouldBeUnary, no branch found');\n            }\n        }\n\n        RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary(ctx: VisitingContext): ChvITk {\n            if (ctx.RuleHAnyFnName && ctx.RuleHAnyFnName[0]) {\n                return this.visit(ctx.RuleHAnyFnName[0]);\n            } else if (ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready && ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0]) {\n                return ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0];\n            } else {\n                checkThrowInternal(false, '<-|OR in HAnyFnNameOrAllPropertiesThatCouldBeNullary, no branch found');\n            }\n        }\n\n        RuleHAnyFnName(ctx: VisitingContext): ChvITk {\n            if (ctx.tkIdentifier && ctx.tkIdentifier[0]) {\n                return ctx.tkIdentifier[0];\n            } else if (ctx._target && ctx._target[0]) {\n                return ctx._target[0];\n            } else if (ctx._windows && ctx._windows[0]) {\n                return ctx._windows[0];\n            } else {\n                checkThrowInternal(false, '<.|OR in HAnyFnName, no branch found');\n            }\n        }\n\n        RuleHCouldBeAPropertyToSet(ctx: VisitingContext): ChvITk {\n            if (ctx.tkIdentifier && ctx.tkIdentifier[0]) {\n                return ctx.tkIdentifier[0];\n            } else if (ctx.RuleHAllPropertiesThatCouldBeUnary && ctx.RuleHAllPropertiesThatCouldBeUnary[0]) {\n                return this.visit(ctx.RuleHAllPropertiesThatCouldBeUnary[0]);\n            } else {\n                checkThrowInternal(false, '</|OR in HCouldBeAPropertyToSet, no branch found');\n            }\n        }\n\n        RuleHAnyAllowedVariableName(ctx: VisitingContext): ChvITk {\n            if (ctx.tkIdentifier && ctx.tkIdentifier[0]) {\n                return ctx.tkIdentifier[0];\n            } else if (ctx._number && ctx._number[0]) {\n                return ctx._number[0];\n            } else if (ctx.tkA && ctx.tkA[0]) {\n                return ctx.tkA[0];\n            } else if (ctx.tkAllUnaryPropertiesIfNotAlready && ctx.tkAllUnaryPropertiesIfNotAlready[0]) {\n                return ctx.tkAllUnaryPropertiesIfNotAlready[0];\n            } else if (ctx.tkUnaryVipercardProperties && ctx.tkUnaryVipercardProperties[0]) {\n                return ctx.tkUnaryVipercardProperties[0];\n            } else if (ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready && ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0]) {\n                return ctx.tkAllNullaryOrUnaryPropertiesIfNotAlready[0];\n            } else {\n                checkThrowInternal(false, '<:|OR in HAnyAllowedVariableName, no branch found');\n            }\n        }\n\n        RuleObject(ctx: VisitingContext): RequestedVelRef {\n            if (ctx.RuleObjectSpecial && ctx.RuleObjectSpecial[0]) {\n                return this.visit(ctx.RuleObjectSpecial[0]);\n            } else if (ctx.RuleObjectInterpretedFromString && ctx.RuleObjectInterpretedFromString[0]) {\n                return this.visit(ctx.RuleObjectInterpretedFromString[0]);\n            } else if (ctx.RuleObjectBtn && ctx.RuleObjectBtn[0]) {\n                return this.visit(ctx.RuleObjectBtn[0]);\n            } else if (ctx.RuleObjectFld && ctx.RuleObjectFld[0]) {\n                return this.visit(ctx.RuleObjectFld[0]);\n            } else if (ctx.RuleObjectCard && ctx.RuleObjectCard[0]) {\n                return this.visit(ctx.RuleObjectCard[0]);\n            } else if (ctx.RuleObjectBg && ctx.RuleObjectBg[0]) {\n                return this.visit(ctx.RuleObjectBg[0]);\n            } else if (ctx.RuleObjectStack && ctx.RuleObjectStack[0]) {\n                return this.visit(ctx.RuleObjectStack[0]);\n            } else {\n                checkThrowInternal(false, '<;|OR in Object, no branch found');\n            }\n        }\n\n        RuleOf(ctx: VisitingContext): ChvITk {\n            if (ctx.tkOfOnly && ctx.tkOfOnly[0]) {\n                return ctx.tkOfOnly[0];\n            } else if (ctx.tkInOnly && ctx.tkInOnly[0]) {\n                return ctx.tkInOnly[0];\n            } else {\n                checkThrowInternal(false, '<<|OR in Of, no branch found');\n            }\n        }\n\n        RuleMenuItem(ctx: VisitingContext): string {\n            return '{menuitemExpr}';\n        }\n\n        RuleMenu(ctx: VisitingContext): string {\n            return '{menuExpr}';\n        }\n\n        RuleWindow_1(ctx: VisitingContext): string {\n            return '{windowExpr}';\n        }\n\n        RuleWindow(ctx: VisitingContext): string {\n            return '{windowExpr}';\n        }\n\n        RuleMessageBox(ctx: VisitingContext): string {\n            return '{msgBoxExpr}';\n        }\n\n        RuleHGenericFunctionCall(ctx: VisitingContext): VpcVal {\n            if (ctx.RuleFnCallNumberOf && ctx.RuleFnCallNumberOf[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf[0]);\n            } else if (ctx.RuleFnCallThereIs && ctx.RuleFnCallThereIs[0]) {\n                return this.visit(ctx.RuleFnCallThereIs[0]);\n            } else if (ctx.RuleHFnCallWParens && ctx.RuleHFnCallWParens[0]) {\n                return this.visit(ctx.RuleHFnCallWParens[0]);\n            } else if (ctx.RuleHUnaryPropertyGet && ctx.RuleHUnaryPropertyGet[0]) {\n                return this.visit(ctx.RuleHUnaryPropertyGet[0]);\n            } else if (ctx.RuleHOldStyleFnNonNullary && ctx.RuleHOldStyleFnNonNullary[0]) {\n                return this.visit(ctx.RuleHOldStyleFnNonNullary[0]);\n            } else if (ctx.RuleHOldStyleFnNullaryOrNullaryPropGet && ctx.RuleHOldStyleFnNullaryOrNullaryPropGet[0]) {\n                return this.visit(ctx.RuleHOldStyleFnNullaryOrNullaryPropGet[0]);\n            } else {\n                checkThrowInternal(false, '<=|OR in HGenericFunctionCall, no branch found');\n            }\n        }\n\n        RuleFnCallNumberOf(ctx: VisitingContext): VpcVal {\n            if (ctx.RuleFnCallNumberOf_1 && ctx.RuleFnCallNumberOf_1[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf_1[0]);\n            } else if (ctx.RuleFnCallNumberOf_2 && ctx.RuleFnCallNumberOf_2[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf_2[0]);\n            } else if (ctx.RuleFnCallNumberOf_3 && ctx.RuleFnCallNumberOf_3[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf_3[0]);\n            } else if (ctx.RuleFnCallNumberOf_4 && ctx.RuleFnCallNumberOf_4[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf_4[0]);\n            } else if (ctx.RuleFnCallNumberOf_5 && ctx.RuleFnCallNumberOf_5[0]) {\n                return this.visit(ctx.RuleFnCallNumberOf_5[0]);\n            } else {\n                checkThrowInternal(false, '<>|OR in FnCallNumberOf, no branch found');\n            }\n        }\n\n        RuleAnyPropertyVal(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleExpr(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.RuleAndOrOr;\n            let operatorListLen = operatorList ? operatorList.length : 0;\n            if (\n                !ctx.RuleLvl1Expression ||\n                !ctx.RuleLvl1Expression.length ||\n                operatorListLen + 1 !== ctx.RuleLvl1Expression.length\n            ) {\n                checkThrowInternal(false, `<?|RuleExpr:${operatorListLen},${ctx.RuleLvl1Expression.length}.`);\n            }\n\n            let total = this.visit(ctx.RuleLvl1Expression[0]);\n            checkThrow(total instanceof VpcVal, '<@|RuleExpr: first not a vpcval');\n            const oprulecategory = VpcOpCtg.OpLogicalOrAnd;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = this.visit(ctx.RuleAndOrOr[i]);\n                checkThrow(typeof whichop === 'string', '<[|RuleExpr: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.RuleLvl1Expression[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '<]|RuleExpr: not a vpcval');\n            }\n\n            return total;\n        }\n\n        RuleLvl1Expression(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.RuleContainsOrGreaterLessEqual;\n            let operatorListLen = operatorList ? operatorList.length : 0;\n            if (\n                !ctx.RuleLvl2Expression ||\n                !ctx.RuleLvl2Expression.length ||\n                operatorListLen + 1 !== ctx.RuleLvl2Expression.length\n            ) {\n                checkThrowInternal(false, `<^|RuleLvl1Expression:${operatorListLen},${ctx.RuleLvl2Expression.length}.`);\n            }\n\n            let total = this.visit(ctx.RuleLvl2Expression[0]);\n            checkThrow(total instanceof VpcVal, '<_|RuleLvl1Expression: first not a vpcval');\n            const oprulecategory = VpcOpCtg.OpEqualityGreaterLessOrContains;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = this.visit(ctx.RuleContainsOrGreaterLessEqual[i]);\n                checkThrow(typeof whichop === 'string', '<{|RuleLvl1Expression: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.RuleLvl2Expression[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '<||RuleLvl1Expression: not a vpcval');\n            }\n\n            return total;\n        }\n\n        RuleLvl3Expression(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.tkStringConcat;\n            let operatorListLen = operatorList ? operatorList.length : 0;\n            if (\n                !ctx.RuleLvl4Expression ||\n                !ctx.RuleLvl4Expression.length ||\n                operatorListLen + 1 !== ctx.RuleLvl4Expression.length\n            ) {\n                checkThrowInternal(false, `<}|RuleLvl3Expression:${operatorListLen},${ctx.RuleLvl4Expression.length}.`);\n            }\n\n            let total = this.visit(ctx.RuleLvl4Expression[0]);\n            checkThrow(total instanceof VpcVal, '<~|RuleLvl3Expression: first not a vpcval');\n            const oprulecategory = VpcOpCtg.OpStringConcat;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = ctx.tkStringConcat[i].image;\n                checkThrow(typeof whichop === 'string', '=0|RuleLvl3Expression: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.RuleLvl4Expression[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '=1|RuleLvl3Expression: not a vpcval');\n            }\n\n            return total;\n        }\n\n        RuleLvl4Expression(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.tkPlusOrMinus;\n            let operatorListLen = operatorList ? operatorList.length : 0;\n            if (\n                !ctx.RuleLvl5Expression ||\n                !ctx.RuleLvl5Expression.length ||\n                operatorListLen + 1 !== ctx.RuleLvl5Expression.length\n            ) {\n                checkThrowInternal(false, `=2|RuleLvl4Expression:${operatorListLen},${ctx.RuleLvl5Expression.length}.`);\n            }\n\n            let total = this.visit(ctx.RuleLvl5Expression[0]);\n            checkThrow(total instanceof VpcVal, '=3|RuleLvl4Expression: first not a vpcval');\n            const oprulecategory = VpcOpCtg.OpPlusMinus;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = ctx.tkPlusOrMinus[i].image;\n                checkThrow(typeof whichop === 'string', '=4|RuleLvl4Expression: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.RuleLvl5Expression[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '=5|RuleLvl4Expression: not a vpcval');\n            }\n\n            return total;\n        }\n\n        RuleLvl5Expression(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.tkMultDivideExpDivMod;\n            let operatorListLen = operatorList ? operatorList.length : 0;\n            if (\n                !ctx.RuleLvl6Expression ||\n                !ctx.RuleLvl6Expression.length ||\n                operatorListLen + 1 !== ctx.RuleLvl6Expression.length\n            ) {\n                checkThrowInternal(false, `=6|RuleLvl5Expression:${operatorListLen},${ctx.RuleLvl6Expression.length}.`);\n            }\n\n            let total = this.visit(ctx.RuleLvl6Expression[0]);\n            checkThrow(total instanceof VpcVal, '=7|RuleLvl5Expression: first not a vpcval');\n            const oprulecategory = VpcOpCtg.OpMultDivideExpDivMod;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = ctx.tkMultDivideExpDivMod[i].image;\n                checkThrow(typeof whichop === 'string', '=8|RuleLvl5Expression: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.RuleLvl6Expression[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '=9|RuleLvl5Expression: not a vpcval');\n            }\n\n            return total;\n        }\n\n        RuleAndOrOr(ctx: VisitingContext): string {\n            if (ctx._or && ctx._or[0]) {\n                return ctx._or[0].image;\n            } else if (ctx._and && ctx._and[0]) {\n                return ctx._and[0].image;\n            } else {\n                checkThrowInternal(false, '=A|OR in AndOrOr, no branch found');\n            }\n        }\n\n        RuleContainsOrGreaterLessEqual(ctx: VisitingContext): string {\n            if (ctx._contains && ctx._contains[0]) {\n                return ctx._contains[0].image;\n            } else if (ctx.tkGreaterOrLessEqualOrEqual && ctx.tkGreaterOrLessEqualOrEqual[0]) {\n                return ctx.tkGreaterOrLessEqualOrEqual[0].image;\n            } else {\n                checkThrowInternal(false, '=B|OR in ContainsOrGreaterLessEqual, no branch found');\n            }\n        }\n\n        RuleIsExpression(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdAdd(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdAnswer(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdAsk(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdBeep(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdVpccalluntrappablechoose(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdClick(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdDelete(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdDial(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdDisable(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdDivide(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdDrag(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleHBuiltinCmdDrag_1(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdEnable(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdVpccalluntrappableerrordialog(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdHide(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdLock(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdMark(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdMultiply(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdPlay(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleHBuiltinCmdPlay_1(ctx: VisitingContext): ChvITk {\n            if (ctx.RuleHAnyAllowedVariableName && ctx.RuleHAnyAllowedVariableName[0]) {\n                return this.visit(ctx.RuleHAnyAllowedVariableName[0]);\n            } else if (ctx.tkStringLiteral && ctx.tkStringLiteral[0]) {\n                return ctx.tkStringLiteral[0];\n            } else if (ctx.tkNumLiteral && ctx.tkNumLiteral[0]) {\n                return ctx.tkNumLiteral[0];\n            } else {\n                checkThrowInternal(false, '=C|OR in HBuiltinCmdPlay_1, no branch found');\n            }\n        }\n\n        RuleBuiltinCmdReset(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdReplace(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdSelect(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdShow(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdSort(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdStart(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdStop(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdSubtract(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdUnlock(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdVisual(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleBuiltinCmdWait(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        RuleCmdSend(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            return this.H$BuildMap(ctx);\n        }\n\n        /* generated code, any changes above this point will be lost: --------------- */\n\n        /**\n         * for slightly faster performance, hand-write the put command,\n         * since it is used so often\n         */\n        RuleBuiltinCmdPut(ctx: VisitingContext) {\n            return [this.visit(ctx.RuleExpr[0]), ctx.tkIdentifier[0].image, this.visit(ctx.RuleHContainer[0])];\n        }\n\n        /**\n         * for slightly faster performance, hand-write these commands,\n         * since they are used so often\n         */\n        RuleInternalCmdRequestEval(ctx: VisitingContext) {\n            return this.visit(ctx.RuleExpr[0]);\n        }\n\n        /**\n         * for slightly faster performance, hand-write these commands,\n         * since they are used so often\n         */\n        RuleInternalCmdUserHandler(ctx: VisitingContext) {\n            let ret: VpcVal[] = [];\n            let len = ctx.RuleExpr ? ctx.RuleExpr.length : 0;\n            for (let i = 0; i < len; i++) {\n                ret.push(this.visit(ctx.RuleExpr[i]));\n            }\n            return ret;\n        }\n\n        /**\n         * you can optionally rename this method to visit()\n         * to add an additional check\n         */\n        visit$check_array_param(rule: any) {\n            /* the default .visit() accepts arrays and silently only processes the first element, */\n            /* this has a risk of accepting unintended results, let's throw instead */\n            checkThrow(\n                !Array.isArray(rule),\n                longstr(\n                    `9b|internal error, make sure you\n                say this.visit(ctx.RuleX[0]) not this.visit(ctx.RuleX)`,\n                    ''\n                ),\n                rule\n            );\n\n            return super.visit(rule);\n        }\n    }\n\n    let ComposedClass = VpcVisitorAddMixinMethods(VPCCustomVisitor);\n    return new ComposedClass();\n}\n\n/**\n * cache the lexer, parser, and visitor\n * singleton\n */\nconst CachedObjects = {\n    lexer: undefined as O<chevrotain.Lexer>,\n    parser: undefined as O<chevrotain.CstParser>,\n    visitor: undefined as O<VpcVisitorInterface>\n};\n\n/**\n * retrieve cached objects, creating if needed\n */\nexport function getParsingObjects(): [chevrotain.Lexer, chevrotain.CstParser] {\n    if (!CachedObjects.lexer) {\n        initAllVpcTokens();\n        CachedObjects.lexer = new chevrotain.Lexer(allVpcTokens, {\n            ensureOptimizations: true\n        });\n    }\n\n    if (!CachedObjects.parser) {\n        CachedObjects.parser = MakeVpcChvParser();\n    }\n\n    return [CachedObjects.lexer, CachedObjects.parser];\n}\n\n/**\n * because the visitor is a singleton, one must provide\n * it with the correct OutsideWorldRead before using it.\n */\nexport function getChvVisitor(outside: OutsideWorldRead): VpcVisitorInterface {\n    let parser = getParsingObjects()[1];\n    if (!CachedObjects.visitor) {\n        CachedObjects.visitor = createVisitor(parser);\n    }\n\n    CachedObjects.visitor.outside = outside;\n    return CachedObjects.visitor;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeparse/vpcVisitorInterface.ts",
    "content": "\n/* auto */ import { IntermedMapOfIntermedVals, VpcVal } from './../vpcutils/vpcVal';\n/* auto */ import { ChvITk } from './vpcTokens';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { RequestedChunk } from './../vpcutils/vpcChunkResolutionUtils';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the VpcCompleteVisitor interface will ensure that\n * all visitor methods are defined as expected, or we'll get a\n * type check warning.\n *\n * the VisitingContext interface just basically\n * helps with auto-complete when writing code.\n */\n\n/* generated code, any changes past this point will be lost: --------------- */\n\n/* ensures we have all the expected Rule methods */\nexport interface VpcCompleteVisitor {\n    RuleHAllPropertiesThatCouldBeUnary(ctx: VisitingContext): ChvITk;\n    RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary(ctx: VisitingContext): ChvITk;\n    RuleHAnyFnName(ctx: VisitingContext): ChvITk;\n    RuleHCouldBeAPropertyToSet(ctx: VisitingContext): ChvITk;\n    RuleHAnyAllowedVariableName(ctx: VisitingContext): ChvITk;\n    RuleObject(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectBtn(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectFld(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectCard(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectBg(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectStack(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectSpecial(ctx: VisitingContext): RequestedVelRef;\n    RuleObjectInterpretedFromString(ctx: VisitingContext): RequestedVelRef;\n    RuleOf(ctx: VisitingContext): ChvITk;\n    RuleMenuItem(ctx: VisitingContext): string;\n    RuleMenu(ctx: VisitingContext): string;\n    RuleWindow_1(ctx: VisitingContext): string;\n    RuleWindow(ctx: VisitingContext): string;\n    RuleMessageBox(ctx: VisitingContext): string;\n    RuleHSimpleContainer(ctx: VisitingContext): RequestedContainerRef;\n    RuleHContainer(ctx: VisitingContext): RequestedContainerRef;\n    RuleHChunk(ctx: VisitingContext): RequestedChunk;\n    RuleHChunkOne(ctx: VisitingContext): RequestedChunk;\n    RuleHChunkBound(ctx: VisitingContext): VpcVal;\n    RuleHSource(ctx: VisitingContext): VpcVal;\n    RuleHSource_1(ctx: VisitingContext): VpcVal;\n    RuleHFnCallWParens(ctx: VisitingContext): VpcVal;\n    RuleHUnaryPropertyGet(ctx: VisitingContext): VpcVal;\n    RuleHOldStyleFnNonNullary(ctx: VisitingContext): VpcVal;\n    RuleHOldStyleFnNullaryOrNullaryPropGet(ctx: VisitingContext): VpcVal;\n    RuleHGenericFunctionCall(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf_1(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf_2(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf_3(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf_4(ctx: VisitingContext): VpcVal;\n    RuleFnCallNumberOf_5(ctx: VisitingContext): VpcVal;\n    RuleFnCallThereIs(ctx: VisitingContext): VpcVal;\n    RuleAnyPropertyVal(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleExpr(ctx: VisitingContext): VpcVal;\n    RuleLvl1Expression(ctx: VisitingContext): VpcVal;\n    RuleLvl2Expression(ctx: VisitingContext): VpcVal;\n    RuleLvl3Expression(ctx: VisitingContext): VpcVal;\n    RuleLvl4Expression(ctx: VisitingContext): VpcVal;\n    RuleLvl5Expression(ctx: VisitingContext): VpcVal;\n    RuleLvl6Expression(ctx: VisitingContext): VpcVal;\n    RuleAndOrOr(ctx: VisitingContext): string;\n    RuleContainsOrGreaterLessEqual(ctx: VisitingContext): string;\n    RuleIsExpression(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdAdd(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdAnswer(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdAsk(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdBeep(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdVpccalluntrappablechoose(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdClick(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdDelete(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdDial(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdDisable(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdDivide(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdDrag(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleHBuiltinCmdDrag_1(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdEnable(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdVpccalluntrappableerrordialog(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdHide(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdLock(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdMark(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdMultiply(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdPlay(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleHBuiltinCmdPlay_1(ctx: VisitingContext): ChvITk;\n    RuleBuiltinCmdPut(ctx: VisitingContext): any;\n    RuleBuiltinCmdReset(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdReplace(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdSelect(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdSet(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdShow(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdSort(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdStart(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdStop(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdSubtract(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdUnlock(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdVisual(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleBuiltinCmdWait(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleCmdSend(ctx: VisitingContext): IntermedMapOfIntermedVals;\n    RuleInternalCmdRequestEval(ctx: VisitingContext): any;\n    RuleInternalCmdUserHandler(ctx: VisitingContext): any;\n}\n\n/* for nicer auto-complete in a visitor implementation */\nexport interface VisitingContext {\n    /* you can add something like [index: string]: any if you want to */\n    /* silence type errors during development */\n    RuleHAllPropertiesThatCouldBeUnary: any[];\n    RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary: any[];\n    RuleHAnyFnName: any[];\n    RuleHCouldBeAPropertyToSet: any[];\n    RuleHAnyAllowedVariableName: any[];\n    RuleObject: any[];\n    RuleObjectBtn: any[];\n    RuleObjectFld: any[];\n    RuleObjectCard: any[];\n    RuleObjectBg: any[];\n    RuleObjectStack: any[];\n    RuleObjectSpecial: any[];\n    RuleObjectInterpretedFromString: any[];\n    RuleOf: any[];\n    RuleMenuItem: any[];\n    RuleMenu: any[];\n    RuleWindow_1: any[];\n    RuleWindow: any[];\n    RuleMessageBox: any[];\n    RuleHSimpleContainer: any[];\n    RuleHContainer: any[];\n    RuleHChunk: any[];\n    RuleHChunkOne: any[];\n    RuleHChunkBound: any[];\n    RuleHSource: any[];\n    RuleHSource_1: any[];\n    RuleHFnCallWParens: any[];\n    RuleHUnaryPropertyGet: any[];\n    RuleHOldStyleFnNonNullary: any[];\n    RuleHOldStyleFnNullaryOrNullaryPropGet: any[];\n    RuleHGenericFunctionCall: any[];\n    RuleFnCallNumberOf: any[];\n    RuleFnCallNumberOf_1: any[];\n    RuleFnCallNumberOf_2: any[];\n    RuleFnCallNumberOf_3: any[];\n    RuleFnCallNumberOf_4: any[];\n    RuleFnCallNumberOf_5: any[];\n    RuleFnCallThereIs: any[];\n    RuleAnyPropertyVal: any[];\n    RuleExpr: any[];\n    RuleLvl1Expression: any[];\n    RuleLvl2Expression: any[];\n    RuleLvl3Expression: any[];\n    RuleLvl4Expression: any[];\n    RuleLvl5Expression: any[];\n    RuleLvl6Expression: any[];\n    RuleAndOrOr: any[];\n    RuleContainsOrGreaterLessEqual: any[];\n    RuleIsExpression: any[];\n    RuleBuiltinCmdAdd: any[];\n    RuleBuiltinCmdAnswer: any[];\n    RuleBuiltinCmdAsk: any[];\n    RuleBuiltinCmdBeep: any[];\n    RuleBuiltinCmdVpccalluntrappablechoose: any[];\n    RuleBuiltinCmdClick: any[];\n    RuleBuiltinCmdDelete: any[];\n    RuleBuiltinCmdDial: any[];\n    RuleBuiltinCmdDisable: any[];\n    RuleBuiltinCmdDivide: any[];\n    RuleBuiltinCmdDrag: any[];\n    RuleHBuiltinCmdDrag_1: any[];\n    RuleBuiltinCmdEnable: any[];\n    RuleBuiltinCmdVpccalluntrappableerrordialog: any[];\n    RuleBuiltinCmdHide: any[];\n    RuleBuiltinCmdLock: any[];\n    RuleBuiltinCmdMark: any[];\n    RuleBuiltinCmdMultiply: any[];\n    RuleBuiltinCmdPlay: any[];\n    RuleHBuiltinCmdPlay_1: any[];\n    RuleBuiltinCmdPut: any[];\n    RuleBuiltinCmdReset: any[];\n    RuleBuiltinCmdReplace: any[];\n    RuleBuiltinCmdSelect: any[];\n    RuleBuiltinCmdSet: any[];\n    RuleBuiltinCmdShow: any[];\n    RuleBuiltinCmdSort: any[];\n    RuleBuiltinCmdStart: any[];\n    RuleBuiltinCmdStop: any[];\n    RuleBuiltinCmdSubtract: any[];\n    RuleBuiltinCmdUnlock: any[];\n    RuleBuiltinCmdVisual: any[];\n    RuleBuiltinCmdWait: any[];\n    RuleCmdSend: any[];\n    RuleInternalCmdRequestEval: any[];\n    RuleInternalCmdUserHandler: any[];\n    tkStringLiteral: ChvITk[];\n    tkBlockComment: ChvITk[];\n    tkLineComment: ChvITk[];\n    tkContinuedLineOrWhiteSpace: ChvITk[];\n    tkCardAtEndOfLine: ChvITk[];\n    tkBgAtEndOfLine: ChvITk[];\n    tkStackAtEndOfLine: ChvITk[];\n    tkNewLine: ChvITk[];\n    tkSyntaxMark: ChvITk[];\n    tkNumLiteral: ChvITk[];\n    tkStack: ChvITk[];\n    tkBg: ChvITk[];\n    tkBgPlural: ChvITk[];\n    tkCard: ChvITk[];\n    tkCardPlural: ChvITk[];\n    tkBtn: ChvITk[];\n    tkBtnPlural: ChvITk[];\n    tkFld: ChvITk[];\n    tkFldPlural: ChvITk[];\n    tkProductName: ChvITk[];\n    tkAdjective: ChvITk[];\n    tkOrdinalOrPosition: ChvITk[];\n    tkChunkGranularity: ChvITk[];\n    tkInOnly: ChvITk[];\n    tkOfOnly: ChvITk[];\n    tkA: ChvITk[];\n    _not: ChvITk[];\n    _there: ChvITk[];\n    _is: ChvITk[];\n    _no: ChvITk[];\n    _and: ChvITk[];\n    _or: ChvITk[];\n    _contains: ChvITk[];\n    _within: ChvITk[];\n    _the: ChvITk[];\n    _message: ChvITk[];\n    _window: ChvITk[];\n    _windows: ChvITk[];\n    _box: ChvITk[];\n    _me: ChvITk[];\n    _recent: ChvITk[];\n    _back: ChvITk[];\n    _forth: ChvITk[];\n    _marked: ChvITk[];\n    _to: ChvITk[];\n    _menuItem: ChvITk[];\n    _menu: ChvITk[];\n    _id: ChvITk[];\n    _number: ChvITk[];\n    _selection: ChvITk[];\n    _target: ChvITk[];\n    tkComma: ChvITk[];\n    tkLParen: ChvITk[];\n    tkRParen: ChvITk[];\n    tkPlusOrMinus: ChvITk[];\n    tkMultDivideExpDivMod: ChvITk[];\n    tkStringConcat: ChvITk[];\n    tkGreaterOrLessEqualOrEqual: ChvITk[];\n    tkUnaryVipercardProperties: ChvITk[];\n    tkAllUnaryPropertiesIfNotAlready: ChvITk[];\n    tkAllNullaryOrUnaryPropertiesIfNotAlready: ChvITk[];\n    tkIdentifier: ChvITk[];\n}\n\n/* generated code, any changes above this point will be lost: --------------- */\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codeparse/vpcVisitorMixin.ts",
    "content": "\n/* auto */ import { VisitingContext } from './vpcVisitorInterface';\n/* auto */ import { VpcEvalHelpers } from './../vpcutils/vpcValEval';\n/* auto */ import { IntermedMapOfIntermedVals, VpcVal, VpcValBool, VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { LogToReplMsgBox } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk, tkstr } from './vpcTokens';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { OrdinalOrPosition, PropAdjective, VpcElType, VpcGranularity, VpcOpCtg, checkThrow, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { ChunkResolution } from './../vpcutils/vpcChunkResolution';\n/* auto */ import { ReadableContainerStr } from './../vel/velResolveContainer';\n/* auto */ import { VelRenderId } from './../vel/velRenderName';\n/* auto */ import { OutsideWorldRead } from './../vel/velOutsideInterfaces';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { arLast, cast, castVerifyIsStr, getStrToEnum } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* check_long_lines_silence_subsequent */\n\n/**\n * a Visitor object can recurse through a syntax tree to evaluate an expression\n * this interface provides what is needed for VpcVisitorAddMixinMethods\n */\nexport interface VpcVisitorInterface {\n    visit(rule: any): any;\n    tmpArr: [boolean, any];\n    outside: OutsideWorldRead;\n    evalHelp: VpcEvalHelpers;\n}\n\n/**\n * constructor type, used to create a mixin\n */\ntype Constructor<T> = new (...args: any[]) => T;\n\n/**\n * create a mixin adding more methods to the visitor\n * this class contains the custom visitor logic not created by genparse.py\n *\n *\n * places where we don't use the normal visit() mechanism and traverse ourself (look for .children):\n * RuleHUnaryPropertyGet looks ahead for a ObjectInterpretedFromString to get 'char 2 of' phrases\n *\n */\nexport function VpcVisitorAddMixinMethods<T extends Constructor<VpcVisitorInterface>>(Base: T) {\n    return class extends Base {\n        Helper$ReadVpcVal(ctx: VisitingContext, subrule: string, context: string): VpcVal {\n            let child = ctx[subrule];\n            checkThrow(child && child[0], `9P|expected to have an expression ${context}`);\n            let evaledVpc = this.visit(child[0]);\n            checkThrow(evaledVpc instanceof VpcVal, `9O|expected a vpcval when looking up element id or name`);\n            return evaledVpc;\n        }\n\n        Helper$SetByNumberOrName(ref: RequestedVelRef, ctx: VisitingContext, subrule: string) {\n            let val = this.Helper$ReadVpcVal(ctx, subrule, this.Helper$SetByNumberOrName.name);\n            if (val.isItInteger()) {\n                ref.lookByAbsolute = val.readAsStrictInteger(this.tmpArr);\n            } else {\n                ref.lookByName = val.readAsString();\n            }\n        }\n\n        RuleObjectBtn(ctx: VisitingContext): RequestedVelRef {\n            let ref = new RequestedVelRef(VpcElType.Btn);\n            return this.help$ObjBtnOrFld(ctx, tkstr.tkBtn, ref);\n        }\n\n        RuleObjectFld(ctx: VisitingContext): RequestedVelRef {\n            let ref = new RequestedVelRef(VpcElType.Fld);\n            return this.help$ObjBtnOrFld(ctx, tkstr.tkFld, ref);\n        }\n\n        help$ObjBtnOrFld(ctx: VisitingContext, tokenName: string, ref: RequestedVelRef): RequestedVelRef {\n            if (ctx.RuleObjectCard && ctx.RuleObjectCard[0]) {\n                ref.parentCdInfo = this.visit(ctx.RuleObjectCard[0]);\n            }\n\n            let isBg = tokenName === tkstr.tkFld;\n            if (ctx.tkBg && ctx.tkBg[0]) {\n                isBg = true;\n            }\n            if (ctx.tkCard && ctx.tkCard[0]) {\n                isBg = false;\n            }\n\n            ref.partIsBg = isBg;\n            ref.partIsCd = !isBg;\n            let ordOrPos = this.helpFind$OrdinalOrPos(ctx);\n            if (ordOrPos && ctx.RuleLvl6Expression && ctx.RuleLvl6Expression[0]) {\n                checkThrow(false, \"SH|you can't say 'the first cd btn 1'\");\n            } else if (ordOrPos) {\n                ref.lookByRelative = ordOrPos;\n            } else if (ctx._id && ctx._id[0]) {\n                ref.lookById = this.Helper$ReadVpcVal(\n                    ctx,\n                    tkstr.RuleLvl6Expression,\n                    this.help$ObjBtnOrFld.name\n                ).readAsStrictNumeric(this.tmpArr);\n            } else {\n                this.Helper$SetByNumberOrName(ref, ctx, tkstr.RuleLvl6Expression);\n            }\n\n            return ref;\n        }\n\n        RuleObjectCard(ctx: VisitingContext): RequestedVelRef {\n            let ref = new RequestedVelRef(VpcElType.Card);\n            if (ctx.RuleObjectBg && ctx.RuleObjectBg[0]) {\n                ref.parentBgInfo = this.visit(ctx.RuleObjectBg[0]);\n            }\n            if (ctx.RuleObjectStack && ctx.RuleObjectStack[0]) {\n                ref.parentStackInfo = this.visit(ctx.RuleObjectStack[0]);\n            }\n            if (ctx._marked && ctx._marked[0]) {\n                ref.cardLookAtMarkedOnly = true;\n            }\n\n            let ordOrPos = this.helpFind$OrdinalOrPos(ctx);\n            if (ctx._recent && ctx._recent[0]) {\n                ref.cardIsRecentHistory = 'recent';\n            } else if (ctx._back && ctx._back[0]) {\n                ref.cardIsRecentHistory = 'back';\n            } else if (ctx._forth && ctx._forth[0]) {\n                ref.cardIsRecentHistory = 'forth';\n            } else if (ctx._id && ctx._id[0]) {\n                ref.lookById = this.Helper$ReadVpcVal(\n                    ctx,\n                    tkstr.RuleLvl6Expression,\n                    this.RuleObjectCard.name\n                ).readAsStrictNumeric(this.tmpArr);\n            } else if (ordOrPos) {\n                ref.lookByRelative = ordOrPos;\n            } else if (ctx.RuleLvl6Expression && ctx.RuleLvl6Expression[0]) {\n                this.Helper$SetByNumberOrName(ref, ctx, tkstr.RuleLvl6Expression);\n            } else if (ctx.tkCardAtEndOfLine && ctx.tkCardAtEndOfLine[0]) {\n                ref.lookByRelative = OrdinalOrPosition.This;\n            } else {\n                checkThrow(false, 'SG|no branch taken');\n            }\n\n            return ref;\n        }\n\n        RuleObjectBg(ctx: VisitingContext): RequestedVelRef {\n            let ret = new RequestedVelRef(VpcElType.Bg);\n            if (ctx.RuleObjectStack && ctx.RuleObjectStack[0]) {\n                ret.parentStackInfo = this.visit(ctx.RuleObjectStack[0]);\n            }\n\n            let ordOrPos = this.helpFind$OrdinalOrPos(ctx);\n            if (ctx._id && ctx._id[0]) {\n                ret.lookById = this.Helper$ReadVpcVal(ctx, tkstr.RuleLvl6Expression, this.RuleObjectBg.name).readAsStrictNumeric(\n                    this.tmpArr\n                );\n            } else if (ordOrPos) {\n                ret.lookByRelative = ordOrPos;\n            } else if (ctx.RuleLvl6Expression && ctx.RuleLvl6Expression[0]) {\n                this.Helper$SetByNumberOrName(ret, ctx, tkstr.RuleLvl6Expression);\n            } else if (ctx.tkBgAtEndOfLine && ctx.tkBgAtEndOfLine[0]) {\n                ret.lookByRelative = OrdinalOrPosition.This;\n            } else {\n                checkThrow(false, 'SF|no branch taken');\n            }\n\n            return ret;\n        }\n\n        RuleObjectStack(ctx: VisitingContext): RequestedVelRef {\n            let ref = new RequestedVelRef(VpcElType.Stack);\n            let ordOrPos = this.helpFind$OrdinalOrPos(ctx);\n            if (ctx._id && ctx._id[0]) {\n                ref.lookById = this.Helper$ReadVpcVal(\n                    ctx,\n                    tkstr.RuleLvl6Expression,\n                    this.RuleObjectStack.name\n                ).readAsStrictNumeric(this.tmpArr);\n            } else if (ordOrPos) {\n                ref.lookByRelative = ordOrPos;\n            } else if (ctx.tkStackAtEndOfLine && ctx.tkStackAtEndOfLine[0]) {\n                ref.lookByRelative = OrdinalOrPosition.This;\n            } else if (ctx.RuleLvl6Expression && ctx.RuleLvl6Expression[0]) {\n                this.Helper$SetByNumberOrName(ref, ctx, tkstr.RuleLvl6Expression);\n            } else {\n                checkThrow(false, 'SE|no branch taken');\n            }\n\n            return ref;\n        }\n\n        RuleObjectSpecial(ctx: VisitingContext): RequestedVelRef {\n            let ref: RequestedVelRef;\n            if (ctx.tkProductName && ctx.tkProductName[0]) {\n                ref = new RequestedVelRef(VpcElType.Product);\n                ref.lookByRelative = OrdinalOrPosition.This;\n            } else if (ctx._me && ctx._me[0]) {\n                ref = new RequestedVelRef(VpcElType.Unknown);\n                ref.isReferenceToMe = true;\n            } else if (ctx._target && ctx._target[0]) {\n                ref = new RequestedVelRef(VpcElType.Unknown);\n                ref.isReferenceToTarget = true;\n            } else {\n                checkThrowInternal(false, 'SD|null');\n            }\n\n            return ref;\n        }\n\n        Help$ObjectInterpretedFromString(ctx: VisitingContext): VpcVal {\n            let val = VpcVal.Empty;\n            if (ctx.RuleHAnyAllowedVariableName && ctx.RuleHAnyAllowedVariableName[0]) {\n                let s: string = this.visit(ctx.RuleHAnyAllowedVariableName[0]).image;\n                checkThrow(typeof s === 'string', 'SC|');\n                let req = new RequestedContainerRef();\n                req.variable = s;\n                let resolved = this.outside.ResolveContainerReadable(req);\n                val = VpcValS(resolved.getRawString());\n            } else if (ctx.RuleExpr && ctx.RuleExpr[0]) {\n                val = this.visit(ctx.RuleExpr[0]);\n            } else if (ctx.tkStringLiteral && ctx.tkStringLiteral[0]) {\n                let im = ctx.tkStringLiteral[0].image;\n                val = VpcValS(im.slice(1, -1));\n            } else if (ctx.tkAllUnaryPropertiesIfNotAlready && ctx.tkAllUnaryPropertiesIfNotAlready[0]) {\n                /* get the short id of the owner of cd btn 1 */\n                checkThrow(ctx.RuleObject && ctx.RuleObject[0], 'VW|RuleObject is undefined');\n                let velRef = this.visit(ctx.RuleObject[0]);\n                checkThrow(velRef instanceof RequestedVelRef, `VV|internal error, expected RuleObject to be a RequestedElRef`);\n                let adjective =\n                    ctx.tkAdjective && ctx.tkAdjective[0]\n                        ? getStrToEnum<PropAdjective>(PropAdjective, 'PropAdjective', ctx.tkAdjective[0].image)\n                        : PropAdjective.Empty;\n                let propName = ctx.tkAllUnaryPropertiesIfNotAlready[0].image;\n                val = this.outside.GetProp(velRef, propName, adjective, undefined);\n            } else if (ctx.RuleHOldStyleFnNullaryOrNullaryPropGet && ctx.RuleHOldStyleFnNullaryOrNullaryPropGet[0]) {\n                val = this.visit(ctx.RuleHOldStyleFnNullaryOrNullaryPropGet[0]);\n            } else {\n                checkThrow(false, 'SB|no branch');\n            }\n\n            return val;\n        }\n\n        RuleObjectInterpretedFromString(ctx: VisitingContext): RequestedVelRef {\n            if (ctx._target && ctx._target[0]) {\n                /* note: here we're looking up a true object, not reading the results of a variable */\n                let ref = new RequestedVelRef(VpcElType.Unknown);\n                ref.isReferenceToTarget = true;\n                return ref;\n            } else {\n                let val = this.Help$ObjectInterpretedFromString(ctx);\n                checkThrow(val instanceof VpcVal, 'SA|');\n                return VelRenderId.parseFromString(val.readAsString());\n            }\n        }\n\n        /*\n        something interesting about Chevtrotain:\n            The indices are not tied to the position in the grammar.\n            For example, let's say you have a rule like\n            MyRule := {<sub1> | <sub2>} {<sub1> | <sub3>}\n            you might imagine that results for\n            \"Sub1\" \"Sub3\" this would become tree.Sub1 = [\"Sub1\", null] tree.Sub2 = [null] tree.Sub3 = [\"Sub3\"]\n            \"Sub2\" \"Sub1\" this would become tree.Sub1 = [null, \"Sub1\"] tree.Sub2 = [\"Sub2\"] tree.Sub3 = [null]\n            the actual results are -- tree.Sub1 = [\"Sub1\"] in both cases...\n            --- you have to use the presence of <sub2> or <sub3> to know which branch was taken. ---\n            the rule results are pushed onto the array just from left to right as they come, they have no position information.\n        */\n        protected helpFind$OrdinalOrPos(ctx: VisitingContext): O<OrdinalOrPosition> {\n            if (ctx.tkOrdinalOrPosition && ctx.tkOrdinalOrPosition[0]) {\n                let image = ctx.tkOrdinalOrPosition[0].image;\n                return getStrToEnum<OrdinalOrPosition>(OrdinalOrPosition, this.helpFind$OrdinalOrPos.name, image);\n            } else {\n                return undefined;\n            }\n        }\n\n        RuleHSimpleContainer(ctx: VisitingContext): RequestedContainerRef {\n            let ret = new RequestedContainerRef();\n            if (ctx.RuleMenu && ctx.RuleMenu[0]) {\n                checkThrow(false, \"S8|we don't yet support custom menus\");\n            } else if (ctx.RuleMessageBox && ctx.RuleMessageBox[0]) {\n                ret.variable = LogToReplMsgBox.redirectThisVariableToMsgBox;\n            } else if (ctx._target && ctx._target[0]) {\n                ret.vel = new RequestedVelRef(VpcElType.Unknown);\n                ret.vel.isReferenceToTarget = true;\n            } else if (ctx._selection && ctx._selection[0]) {\n                ret.isJustSelection = true;\n            } else if (ctx.RuleObjectBtn && ctx.RuleObjectBtn[0]) {\n                checkThrow(\n                    false,\n                    `9Z|we do not allow placing text into btns, or retrieving text from btns, please fields instead`\n                );\n            } else if (ctx.RuleObjectFld && ctx.RuleObjectFld[0]) {\n                ret.vel = this.visit(ctx.RuleObjectFld[0]);\n                checkThrow(ret.vel instanceof RequestedVelRef, `9a|internal error, not an element reference`);\n            } else if (ctx.RuleHAnyAllowedVariableName && ctx.RuleHAnyAllowedVariableName[0]) {\n                let token = this.visit(ctx.RuleHAnyAllowedVariableName[0]);\n                ret.variable = token.image;\n            } else {\n                checkThrowInternal(false, 'S6|HsimpleContainer no branch taken');\n            }\n\n            return ret;\n        }\n\n        RuleHContainer(ctx: VisitingContext): RequestedContainerRef {\n            let ret = this.visit(ctx.RuleHSimpleContainer[0]);\n            checkThrow(ret instanceof RequestedContainerRef, `S5|internal error, expected IntermedValContainer`);\n            if (ctx.RuleHChunk && ctx.RuleHChunk[0]) {\n                let newChunk = this.visit(ctx.RuleHChunk[0]);\n                checkThrow(newChunk && newChunk instanceof RequestedChunk, `9W|chunk not valid`);\n                if (ret.chunk) {\n                    /* append our chunk. e.g. \"char 3 of the selection\" */\n                    let wasThere = ret.chunk;\n                    ret.chunk = newChunk;\n                    ret.chunk.child = wasThere;\n                } else {\n                    ret.chunk = newChunk;\n                }\n            }\n\n            return ret;\n        }\n\n        RuleHChunk(ctx: VisitingContext): RequestedChunk {\n            checkThrow(ctx.RuleHChunkOne && ctx.RuleHChunkOne[0], 'VU|RuleHChunkOne');\n            let ret = cast(RequestedChunk, this.visit(arLast(ctx.RuleHChunkOne)));\n            let hasBackwards = ret.hasBackwardsBounds();\n            let current = ret;\n            /* start with len-2 because we already did the len-1 one */\n            for (let i = ctx.RuleHChunkOne.length - 2; i >= 0; i--) {\n                current.child = cast(RequestedChunk, this.visit(ctx.RuleHChunkOne[i]));\n                hasBackwards = hasBackwards || /* bool */ current.child.hasBackwardsBounds();\n                current = current.child;\n            }\n\n            checkThrow(\n                current === ret || !hasBackwards,\n                `VT|backwards bounds in a recursive chunk.\n            you can't do 'put item 3 to 2 of line 2 of \"abc\" into x', if you need to you can do\n            'put line 2 of \"abc\"' into x1' and 'put item 3 to 2 of x1 into x'`\n            );\n            return ret;\n        }\n\n        RuleHChunkOne(ctx: VisitingContext): RequestedChunk {\n            let ret = new RequestedChunk(-1);\n            checkThrow(ctx.tkChunkGranularity && ctx.tkChunkGranularity[0], 'S3|RuleHChunk');\n            ret.granularity = getStrToEnum<VpcGranularity>(VpcGranularity, tkstr.RuleHChunk, ctx.tkChunkGranularity[0].image);\n            let ordOrPos = this.helpFind$OrdinalOrPos(ctx);\n            if (ordOrPos) {\n                ret.ordinal = ordOrPos;\n            } else {\n                ret.first = this.visit(ctx.RuleHChunkBound[0]).readAsStrictInteger(this.tmpArr);\n                if (ctx.RuleHChunkBound[1]) {\n                    ret.last = this.visit(ctx.RuleHChunkBound[1]).readAsStrictInteger(this.tmpArr);\n                }\n            }\n\n            return ret;\n        }\n\n        RuleHChunkBound(ctx: VisitingContext): VpcVal {\n            if (ctx.RuleExpr && ctx.RuleExpr[0]) {\n                return this.visit(ctx.RuleExpr[0]);\n            } else if (ctx.tkNumLiteral && ctx.tkNumLiteral[0]) {\n                return VpcVal.getScientificNotation(ctx.tkNumLiteral[0].image);\n            } else if (ctx.RuleHSimpleContainer && ctx.RuleHSimpleContainer[0]) {\n                let container = this.visit(ctx.RuleHSimpleContainer[0]);\n                checkThrow(container instanceof RequestedContainerRef, `VS|internal error, expected IntermedValContainer`);\n                return VpcValS(this.outside.ContainerRead(container));\n            } else {\n                checkThrowInternal(false, '|3|null');\n            }\n        }\n\n        RuleHSource(ctx: VisitingContext): VpcVal {\n            if (ctx.RuleHSource_1 && ctx.RuleHSource_1[0]) {\n                return this.visit(ctx.RuleHSource_1[0]);\n            } else if (ctx.RuleHGenericFunctionCall && ctx.RuleHGenericFunctionCall[0]) {\n                return this.visit(ctx.RuleHGenericFunctionCall[0]);\n            } else if (ctx.RuleHSimpleContainer && ctx.RuleHSimpleContainer[0]) {\n                let reference = this.visit(ctx.RuleHSimpleContainer[0]);\n                checkThrow(reference instanceof RequestedContainerRef, `JT|internal error, expected IntermedValContainer`);\n                return VpcValS(this.outside.ContainerRead(reference));\n            } else {\n                checkThrowInternal(false, 'S1|OR in HSource, no branch found');\n            }\n        }\n\n        RuleHSource_1(ctx: VisitingContext): VpcVal {\n            if (ctx.tkNumLiteral && ctx.tkNumLiteral[0]) {\n                /* here we allow scientific notation */\n                return VpcVal.getScientificNotation(ctx.tkNumLiteral[0].image);\n            } else if (ctx.tkStringLiteral && ctx.tkStringLiteral[0]) {\n                /* example: put \"abc\" into x */\n                /* strip the opening and closing quotes */\n                let sLit = ctx.tkStringLiteral[0].image;\n                sLit = sLit.slice(1, -1);\n                return VpcValS(sLit);\n            } else {\n                checkThrowInternal(false, 'S0|RuleHSource_1 no branch taken');\n            }\n        }\n\n        RuleFnCallThereIs(ctx: VisitingContext): VpcVal {\n            /* put there is a cd btn \"myBtn\" into x */\n            let requestRef = this.visit(ctx.RuleObject[0]);\n            checkThrow(requestRef instanceof RequestedVelRef, `98|internal error, expected RuleObject to be a RequestedElRef`);\n            let velExists = bool(this.outside.ElementExists(requestRef));\n            return VpcValBool(ctx._not && ctx._not.length ? !velExists : velExists);\n        }\n\n        RuleFnCallNumberOf_1(ctx: VisitingContext): VpcVal {\n            let type: VpcElType;\n            if (ctx.tkFldPlural) {\n                type = VpcElType.Fld;\n            } else if (ctx.tkBtnPlural) {\n                type = VpcElType.Btn;\n            } else {\n                checkThrow(false, \"R~|we don't yet support looking up an object by 'part'\");\n            }\n            let contextIsBg = type === VpcElType.Fld;\n            if (ctx.tkBg && ctx.tkBg[0]) {\n                contextIsBg = true;\n            }\n            if (ctx.tkCard && ctx.tkCard[0]) {\n                contextIsBg = false;\n            }\n\n            /* indicate whether context is cd or bg */\n            let parentRef = new RequestedVelRef(contextIsBg ? VpcElType.Bg : VpcElType.Card);\n            parentRef.lookByRelative = OrdinalOrPosition.This;\n            return VpcValN(this.outside.CountElements(type, parentRef));\n        }\n\n        RuleFnCallNumberOf_2(ctx: VisitingContext): VpcVal {\n            let parentRef = new RequestedVelRef(VpcElType.Stack);\n            parentRef.lookByRelative = OrdinalOrPosition.This;\n            if (ctx.RuleObject && ctx.RuleObject[0]) {\n                /* must be a bg or stack, but let's check that\n                later so we can accept forms like 'me' or 'x' */\n                parentRef = this.visit(ctx.RuleObject[0]);\n            }\n\n            if (ctx._marked && ctx._marked[0]) {\n                /* indicate only counting marked */\n                parentRef.cardLookAtMarkedOnly = true;\n            }\n\n            return VpcValN(this.outside.CountElements(VpcElType.Card, parentRef));\n        }\n\n        RuleFnCallNumberOf_3(ctx: VisitingContext): VpcVal {\n            let parentRef = new RequestedVelRef(VpcElType.Stack);\n            parentRef.lookByRelative = OrdinalOrPosition.This;\n            if (ctx.RuleObjectStack && ctx.RuleObjectStack[0]) {\n                parentRef = this.visit(ctx.RuleObjectStack[0]);\n            }\n\n            return VpcValN(this.outside.CountElements(VpcElType.Bg, parentRef));\n        }\n\n        RuleFnCallNumberOf_4(_ctx: VisitingContext): VpcVal {\n            checkThrow(false, \"R{|we don't yet support getting the number of custom menus or windows\");\n        }\n\n        RuleFnCallNumberOf_5(ctx: VisitingContext): VpcVal {\n            /* put the number of card buttons into x */\n            let evaledvpc = this.Helper$ReadVpcVal(ctx, tkstr.RuleLvl3Expression, this.RuleFnCallNumberOf_5.name);\n            let str = evaledvpc.readAsString();\n            let stype = ctx.tkChunkGranularity[0].image;\n            let type = getStrToEnum<VpcGranularity>(VpcGranularity, 'VpcGranularity', stype);\n            let result = ChunkResolution.applyCount(str, this.outside.GetItemDelim(), type, true);\n            return VpcValN(result);\n        }\n\n        RuleHFnCallWParens(ctx: VisitingContext): VpcVal {\n            /* note: custom functions are handled separately */\n            let fnName = this.visit(ctx.RuleHAnyFnName[0]).image;\n            let args: VpcVal[] = [];\n            if (ctx.RuleExpr) {\n                for (let i = 0; i < ctx.RuleExpr.length; i++) {\n                    args.push(this.visit(ctx.RuleExpr[i]));\n                    checkThrow(arLast(args) instanceof VpcVal, '9H|did not get a vpc val, got', arLast(args));\n                }\n            }\n\n            return this.outside.CallBuiltinFunction(fnName, args);\n        }\n\n        Helper$fieldChunkProp(ctx: VisitingContext): [RequestedVelRef, RequestedChunk] {\n            /* put the textfont of char 2 to 4 of cd fld \"myFld\" into x */\n            let chunk = this.visit(ctx.RuleHChunk[0]);\n            checkThrow(chunk instanceof RequestedChunk, `9B|internal error, expected RuleHChunk to be a chunk`);\n            let ref: RequestedVelRef;\n            if (ctx.RuleObjectFld && ctx.RuleObjectFld[0]) {\n                ref = this.visit(ctx.RuleObjectFld[0]);\n            } else if (ctx._me && ctx._me[0]) {\n                ref = new RequestedVelRef(VpcElType.Unknown);\n                ref.isReferenceToMe = true;\n            } else if (ctx._target && ctx._target[0]) {\n                ref = new RequestedVelRef(VpcElType.Unknown);\n                ref.isReferenceToTarget = true;\n            } else {\n                checkThrowInternal(false, 'VR|no branch seen');\n            }\n\n            checkThrow(ref instanceof RequestedVelRef, `9A|internal error, expected RuleObjectFld to be a RequestedElRef`);\n            return [ref, chunk];\n        }\n\n        RuleHUnaryPropertyGet(ctx: VisitingContext): VpcVal {\n            let propName = this.visit(ctx.RuleHAllPropertiesThatCouldBeUnary[0]).image;\n            let adjective =\n                ctx.tkAdjective && ctx.tkAdjective[0]\n                    ? getStrToEnum<PropAdjective>(PropAdjective, 'PropAdjective', ctx.tkAdjective[0].image)\n                    : PropAdjective.Empty;\n            checkThrow(!ctx.RuleWindow || !ctx.RuleWindow[0], \"R_|don't yet support looking up property on window\");\n            checkThrow(!ctx.RuleMenuItem || !ctx.RuleMenuItem[0], \"R^|don't yet support looking up property on menuitem\");\n            checkThrow(!ctx.RuleMenu || !ctx.RuleMenu[0], \"R]|don't yet support looking up property on menu\");\n            let [velRef, chunk] = this.Helper$PropertyMightChunk(propName, ctx);\n            checkThrow(velRef instanceof RequestedVelRef, `99|internal error, expected RuleObject to be a RequestedElRef`);\n            return this.outside.GetProp(velRef, propName, adjective, chunk);\n        }\n\n        protected Helper$PropertyMightChunk(propName: string, ctx: VisitingContext): [O<RequestedVelRef>, O<RequestedChunk>] {\n            checkThrow(typeof propName === 'string', `VQ|internal error, expected AnyPropertyName to be a string`);\n            let velRef: O<RequestedVelRef>;\n            let chunk: O<RequestedChunk>;\n            if (ctx.RuleHChunk && ctx.RuleHChunk[0]) {\n                /* put the textfont of char 2 to 4 of cd fld \"myFld\" into x */\n                /* see \"Pseudo-functions that refer to objects\" in internaldocs.md */\n                let got = this.Helper$fieldChunkProp(ctx);\n                velRef = got[0];\n                chunk = got[1];\n            } else {\n                /* put \"char 4 to 7 of cd fld id 123\" into x; get the textfont of x */\n                if (\n                    propName.startsWith('text') &&\n                    ctx.RuleObject &&\n                    ctx.RuleObject[0] &&\n                    ctx.RuleObject[0].children.RuleObjectInterpretedFromString &&\n                    ctx.RuleObject[0].children.RuleObjectInterpretedFromString[0]\n                ) {\n                    let val = this.Help$ObjectInterpretedFromString(\n                        ctx.RuleObject[0].children.RuleObjectInterpretedFromString[0].children\n                    );\n                    checkThrow(val.readAsString(), 'VP|Empty string given. Perhaps there is no selection.');\n                    let got = RequestedChunk.parseFromString(val.readAsString());\n                    if (got[0]) {\n                        chunk = got[0];\n                        velRef = VelRenderId.parseFromString(got[1]);\n                    }\n                }\n                /* put the locktext of cd fld \"myFld\" into x */\n                if (!chunk && ctx.RuleObject && ctx.RuleObject[0]) {\n                    velRef = this.visit(ctx.RuleObject[0]);\n                }\n            }\n\n            return [velRef, chunk];\n        }\n\n        RuleHOldStyleFnNonNullary(ctx: VisitingContext): VpcVal {\n            let fnName = this.visit(ctx.RuleHAnyFnName[0]).image;\n            let arg = this.visit(ctx.RuleLvl6Expression[0]);\n            return this.outside.CallBuiltinFunction(fnName, [arg]);\n        }\n\n        RuleHOldStyleFnNullaryOrNullaryPropGet(ctx: VisitingContext): VpcVal {\n            let adjective =\n                ctx.tkAdjective && ctx.tkAdjective[0]\n                    ? getStrToEnum<PropAdjective>(PropAdjective, 'PropAdjective', ctx.tkAdjective[0].image)\n                    : PropAdjective.Empty;\n            let fnOrPropName = this.visit(ctx.RuleHAnyFnNameOrAllPropertiesThatCouldBeNullary[0]).image;\n            if (this.outside.IsProductProp(fnOrPropName)) {\n                let refProductOps = new RequestedVelRef(VpcElType.Product);\n                refProductOps.lookByRelative = OrdinalOrPosition.This;\n                return this.outside.GetProp(refProductOps, fnOrPropName, adjective, undefined);\n            } else {\n                /* we'll match the product and let you say \"get the long sin of 4\" and ignore the nonsensical adjective */\n                return this.outside.CallBuiltinFunction(fnOrPropName, []);\n            }\n        }\n\n        RuleLvl2Expression(ctx: VisitingContext): VpcVal {\n            let total = this.visit(ctx.RuleLvl3Expression[0]);\n            checkThrow(total instanceof VpcVal, '|L|');\n            if (ctx.RuleIsExpression) {\n                for (let i = 0; i < ctx.RuleIsExpression.length; i++) {\n                    let map = this.visit(ctx.RuleIsExpression[i]);\n                    total = this.help$RuleLvl2Expression(total, map);\n                }\n            }\n\n            return total;\n        }\n\n        help$RuleLvl2Expression(total: VpcVal, map: IntermedMapOfIntermedVals): VpcVal {\n            let typeCheck = '';\n            if (map.vals.tkIdentifier && map.vals.tkIdentifier[0]) {\n                typeCheck = castVerifyIsStr(map.vals.tkIdentifier[0]);\n            } else if (map.vals._number && map.vals._number[0]) {\n                typeCheck = castVerifyIsStr(map.vals._number[0]);\n            }\n\n            let checkIsWithin = map.vals.tkInOnly || /* bool */ map.vals._within;\n            if (checkIsWithin) {\n                /* \"is within\" expression */\n                checkThrow(map.vals.RuleLvl3Expression && map.vals.RuleLvl3Expression[0] instanceof VpcVal, 'R[|');\n                total = this.evalHelp.evalOp(total, map.vals.RuleLvl3Expression[0], VpcOpCtg.OpStringWithin, 'is within');\n            } else if (typeCheck) {\n                /* type check expression \"is a number\" */\n                total = this.evalHelp.typeMatches(total, typeCheck);\n            } else {\n                /* \"is\" or \"is not\" expression */\n                checkThrow(map.vals.RuleLvl3Expression && map.vals.RuleLvl3Expression[0] instanceof VpcVal, 'R@|');\n                total = this.evalHelp.evalOp(\n                    total,\n                    map.vals.RuleLvl3Expression[0],\n                    VpcOpCtg.OpEqualityGreaterLessOrContains,\n                    'is'\n                );\n            }\n\n            let negated = map.vals._not && map.vals._not.length > 0;\n            if (negated) {\n                total = VpcValBool(!total.readAsStrictBoolean());\n            }\n\n            return total;\n        }\n\n        RuleLvl6Expression(ctx: VisitingContext): VpcVal {\n            let val: VpcVal;\n            if (ctx.RuleHSource && ctx.RuleHSource[0]) {\n                val = this.visit(ctx.RuleHSource[0]);\n                checkThrow(val instanceof VpcVal, '8||not a vpcval', val);\n            } else if (ctx.RuleExpr && ctx.RuleExpr[0]) {\n                val = this.visit(ctx.RuleExpr[0]);\n                checkThrow(val instanceof VpcVal, '8{|not a vpcval', val);\n            } else {\n                checkThrowInternal(false, `80|in RuleLvl6Expression. all interesting children null.`);\n            }\n\n            if (ctx.RuleHChunk && ctx.RuleHChunk[0]) {\n                let chunk = this.visit(ctx.RuleHChunk[0]);\n                checkThrow(chunk instanceof RequestedChunk, '8_|not a RequestedChunk', chunk);\n                let reader = new ReadableContainerStr(val.readAsString());\n                let result = ChunkResolution.applyReadToString(reader, chunk, this.outside.GetItemDelim());\n                val = VpcValS(result);\n            }\n\n            if (ctx.tkPlusOrMinus && ctx.tkPlusOrMinus[0]) {\n                val = this.evalHelp.evalUnary(val, ctx.tkPlusOrMinus[0].image);\n            } else if (ctx._not && ctx._not[0]) {\n                val = this.evalHelp.evalUnary(val, ctx._not[0].image);\n            }\n\n            return val;\n        }\n\n        /**\n         * customize, for setting\n         */\n        RuleBuiltinCmdSet(ctx: VisitingContext): IntermedMapOfIntermedVals {\n            let ret = new IntermedMapOfIntermedVals();\n            let propName = this.visit(ctx.RuleHCouldBeAPropertyToSet[0]);\n            ret.vals[tkstr.RuleHCouldBeAPropertyToSet] = [propName];\n            ret.vals[tkstr.RuleAnyPropertyVal] = [this.visit(ctx.RuleAnyPropertyVal[0])];\n            let sPropName = (propName as ChvITk).image;\n            checkThrow(typeof sPropName === 'string', `9C|internal error, expected AnyPropertyName to be a string`);\n            let [velRef, chunk] = this.Helper$PropertyMightChunk(sPropName, ctx);\n            if (velRef) {\n                ret.vals['velRef'] = [velRef];\n            }\n            if (chunk) {\n                ret.vals['chunk'] = [chunk];\n            }\n            return ret;\n        }\n    };\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcBuiltinFunctions.ts",
    "content": "\n/* auto */ import { VpcEvalHelpers } from './../vpcutils/vpcValEval';\n/* auto */ import { VpcVal, VpcValBool, VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcScriptMessage } from './../vpcutils/vpcUtils';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { OrdinalOrPosition, PropAdjective, VpcElType, VpcTool, checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldRead } from './../vel/velOutsideInterfaces';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, ValHolder, findEnumToStr, longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512Lines } from './../../ui512/textedit/ui512TextLines';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * built-in functions\n */\nexport class VpcBuiltinFunctions {\n    protected tmpArr: [boolean, any] = [false, false];\n    protected static readonly sep = ',';\n    protected static readonly hardcodedMemoryAvailable = 100 * 1024 * 1024;\n    protected static readonly hardcodedSysVersion = 7.55;\n    protected static readonly time1904 = -2082844800;\n    protected static basisTicks = 0;\n    protected static count = 0;\n    protected static indicateVarArgs = -1;\n    constructor(protected readoutside: OutsideWorldRead) {\n        Object.freeze(VpcBuiltinFunctions.simpleFns);\n        Object.freeze(VpcBuiltinFunctions.simpleMath);\n        Object.freeze(VpcBuiltinFunctions.fnsNeedOutside);\n    }\n\n    /**\n     * define the # of parameters for \"simpleFns\"\n     * a \"simpleFn\" takes a VpcVal[] and returns a VpcVal\n     */\n    protected static simpleFns: { [key: string]: number } = {\n        diskspace: 0,\n        heapspace: 0,\n        stackspace: 0,\n        systemversion: 0,\n        seconds: 0,\n        tick: 0,\n        ticks: 0,\n        random: 1,\n        round: 1,\n        screenrect: 0,\n        counting: 0,\n        chartonum: 1,\n        numtochar: 1,\n        strtonumber: 1,\n        numbertostr: 1,\n        touppercase: 1,\n        tolowercase: 1,\n        length: 1,\n        offset: 2,\n        annuity: 2,\n        compound: 2,\n        max: VpcBuiltinFunctions.indicateVarArgs,\n        min: VpcBuiltinFunctions.indicateVarArgs,\n        sum: VpcBuiltinFunctions.indicateVarArgs,\n        average: VpcBuiltinFunctions.indicateVarArgs\n    };\n\n    /**\n     * define the # of parameters for \"fnsNeedOutside\"\n     * a \"fnsNeedOutside\" takes a VpcScriptMessage\n     */\n    protected static fnsNeedOutside: { [key: string]: number } = {\n        cmdkey: 0,\n        commandkey: 0,\n        optionkey: 0,\n        shiftkey: 0,\n        keyrepeated: 0,\n        keychar: 0,\n        clickh: 0,\n        clickloc: 0,\n        clickv: 0,\n        mouse: 0,\n        mouseclick: 0,\n        mouseh: 0,\n        mouseloc: 0,\n        mousev: 0,\n        objectbyid: 1,\n        param: 1,\n        paramcount: 0,\n        params: 0,\n        result: 0,\n        selectedchunk: 0,\n        selectedfield: 0,\n        selectedline: 0,\n        selectedtext: 0,\n        tool: 0\n    };\n\n    /**\n     * define the # of parameters for a \"simpleMath\"\n     * a simplemath returns a number which we'll call a VpcValN on\n     */\n    protected static simpleMath: { [key: string]: (f: number) => number } = {\n        abs: (f: number) => Math.abs(f),\n        atan: (f: number) => Math.atan(f),\n        sin: (f: number) => Math.sin(f),\n        cos: (f: number) => Math.cos(f),\n        tan: (f: number) => Math.tan(f),\n        ln: (f: number) => Math.log(f),\n        ln1: (f: number) => Math.log(f + 1),\n        log2: (f: number) => Math.log(f) / Math.log(2),\n        exp: (f: number) => Math.exp(f),\n        exp1: (f: number) => Math.exp(f) - 1,\n        exp2: (f: number) => Math.pow(2, f),\n        sqrt: (f: number) => Math.sqrt(f),\n        trunc: (f: number) => Math.trunc(f)\n    };\n\n    /**\n     * is this the name of a function\n     */\n    static isFunction(s: string) {\n        return (\n            VpcBuiltinFunctions.simpleFns[s] !== undefined ||\n            VpcBuiltinFunctions.simpleMath[s] !== undefined ||\n            VpcBuiltinFunctions.fnsNeedOutside[s] !== undefined\n        );\n    }\n\n    /**\n     * call the function, return result as a VpcVal\n     */\n    call(name: string, args: VpcVal[]): VpcVal {\n        let asSimpleMath = VpcBuiltinFunctions.simpleMath[name];\n        if (asSimpleMath !== undefined) {\n            /* it's a \"simple math\" one */\n            checkThrowEq(1, args.length, '7%|function requires exactly one arg', name);\n            let fin = args[0].readAsStrictNumeric(this.tmpArr);\n            let v = asSimpleMath(fin);\n            return VpcValN(v);\n        }\n\n        let asSimpleFns = VpcBuiltinFunctions.simpleFns[name];\n        if (asSimpleFns !== undefined) {\n            /* it's a \"simpleFns\" one */\n            if (asSimpleFns === VpcBuiltinFunctions.indicateVarArgs) {\n                checkThrow(args.length > 0, '7$|function requires at least one arg', name);\n            } else {\n                checkThrowEq(asSimpleFns, args.length, '7#|function recieved incorrect # of args', name, asSimpleFns);\n            }\n\n            let method = 'call' + Util512.capitalizeFirst(name);\n            let ret = Util512.callAsMethodOnClass(VpcBuiltinFunctions.name, this, method, [args], false);\n            assertTrue(ret instanceof VpcVal, '5m|did not return a vpcval');\n            return ret;\n        }\n\n        let asfnsNeedOutside = VpcBuiltinFunctions.fnsNeedOutside[name];\n        if (asfnsNeedOutside !== undefined) {\n            /* it's a \"needs outside\" one */\n            checkThrowEq(asfnsNeedOutside, args.length, '7!|function recieved incorrect # of args', name, asfnsNeedOutside);\n\n            let [frameMsg, frameParams] = this.readoutside.GetFrameInfo();\n            let method = 'call' + Util512.capitalizeFirst(name);\n            let ret = Util512.callAsMethodOnClass(VpcBuiltinFunctions.name, this, method, [args, frameMsg, frameParams], false);\n\n            assertTrue(ret instanceof VpcVal, '5l|did not return a vpcval');\n            return ret;\n        }\n\n        checkThrow(false, `5k|no such function ${name}`);\n    }\n\n    /**\n     * returns the largest of all arguments given\n     */\n    callMax(args: VpcVal[]) {\n        let f = (ar: number[]) => {\n            assertTrue(ar.length < 100, 'SJ|too many args');\n            return Math.max.apply(null, ar); /* warn-apply-ok */\n        };\n\n        return this.mathVariadic(args, 'max', f);\n    }\n\n    /**\n     * returns the smallest of all arguments given\n     */\n    callMin(args: VpcVal[]) {\n        let f = (ar: number[]) => {\n            assertTrue(ar.length < 100, 'SI|too many args');\n            return Math.min.apply(null, ar); /* warn-apply-ok */\n        };\n\n        return this.mathVariadic(args, 'min', f);\n    }\n\n    /**\n     * returns the sum of all arguments given\n     */\n    callSum(args: VpcVal[]) {\n        return this.mathVariadic(args, 'sum', ar => ar.reduce(Util512.add));\n    }\n\n    /**\n     * returns the average of all arguments given\n     */\n    callAverage(args: VpcVal[]) {\n        return this.mathVariadic(args, 'sum', ar => ar.reduce(Util512.add) / ar.length);\n    }\n\n    /**\n     * disk space (Deprecated and hard-coded)\n     */\n    callDiskspace(args: VpcVal[]) {\n        return VpcValN(VpcBuiltinFunctions.hardcodedMemoryAvailable);\n    }\n\n    /**\n     * heap space (Deprecated and hard-coded)\n     */\n    callHeapspace(args: VpcVal[]) {\n        return VpcValN(VpcBuiltinFunctions.hardcodedMemoryAvailable);\n    }\n\n    /**\n     * stack space (Deprecated and hard-coded)\n     */\n    callStackspace(args: VpcVal[]) {\n        return VpcValN(VpcBuiltinFunctions.hardcodedMemoryAvailable);\n    }\n\n    /**\n     * system version (Deprecated and hard-coded)\n     */\n    callSystemversion(args: VpcVal[]) {\n        return VpcValN(VpcBuiltinFunctions.hardcodedSysVersion);\n    }\n\n    /**\n     * Seconds since January 1, 1904.\n     */\n    callSeconds(args: VpcVal[]) {\n        let unixNow = Date.now() / 1000.0;\n        return VpcValN(Math.trunc(unixNow - VpcBuiltinFunctions.time1904));\n    }\n\n    /**\n     * synonym\n     */\n    callTick(args: VpcVal[]) {\n        return this.callTicks(args);\n    }\n\n    /**\n     * Ticks (60th of a second) since January 1, 1904.\n     */\n    callTicks(args: VpcVal[]) {\n        if (VpcBuiltinFunctions.basisTicks === 0) {\n            VpcBuiltinFunctions.basisTicks = Date.now();\n        }\n\n        let msSinceFirstCall = Date.now() - VpcBuiltinFunctions.basisTicks;\n        return VpcValN(Math.trunc(msSinceFirstCall * (60 / 1000)));\n    }\n\n    /**\n     * n must be an integer.\n     * Returns random value between 1 and n.\n     */\n    callRandom(args: VpcVal[]) {\n        let f = args[0].readAsStrictNumeric(this.tmpArr);\n        let max = Math.trunc(f);\n        if (max < 1) {\n            checkThrow(false, `5j|value must be >= 1 but got ${f}`);\n        } else {\n            return VpcValN(Util512Higher.getRandIntInclusiveWeak(1, max));\n        }\n    }\n\n    /**\n     * Returns integer nearest to number. Odd integers plus 0.5\n     * round up, even integers plus 0.5 round down.\n     */\n    callRound(args: VpcVal[]) {\n        /* credit: @warby on jsfiddle */\n        let f = args[0].readAsStrictNumeric(this.tmpArr);\n        if (f % 0.5 === 0) {\n            let flr = Math.floor(f);\n            return VpcValN(flr % 2 === 0 ? flr : Math.round(f));\n        } else {\n            return VpcValN(Math.round(f));\n        }\n    }\n\n    /**\n     * screen dimensions\n     */\n    callScreenrect(args: VpcVal[]) {\n        return VpcValS(`0,0,${ScreenConsts.ScreenWidth},${ScreenConsts.ScreenHeight}`);\n    }\n\n    /**\n     * get an incrementing counter\n     *\n     * every other function here is basically idempotent,\n     * this is intentionally a non-idempotent function, for testing, to detect if it has been called\n     */\n    callCounting(args: VpcVal[]) {\n        VpcBuiltinFunctions.count += 1;\n        return VpcValN(VpcBuiltinFunctions.count);\n    }\n\n    /**\n     * From ascii-like number to a character.\n     * Note that characters in a field are displayed in Mac OS Roman\n     * encoding.\n     */\n    callChartonum(args: VpcVal[]) {\n        let s = args[0].readAsString();\n        return VpcValN(s.length ? s.charCodeAt(0) : 0);\n    }\n\n    /**\n     * From a character to an ascii-like number.\n     * Note that characters in a field are displayed in Mac OS Roman\n     * encoding.\n     */\n    callNumtochar(args: VpcVal[]) {\n        let n = args[0].readAsStrictInteger(this.tmpArr);\n        checkThrow(n >= 1, `7 |numToChar must be given a number >= 1`);\n        return VpcValS(String.fromCharCode(n));\n    }\n\n    /**\n     * Parse string to number.\n     * Supports scientific notation.\n     * If cannot be parsed, returns \"false\"\n     */\n    callStrtonumber(args: VpcVal[]) {\n        return VpcVal.readScientificNotation(args[0].readAsString()) ?? VpcVal.False;\n    }\n\n    /**\n     * Convert number to string.\n     */\n    callNumbertostr(args: VpcVal[]) {\n        return VpcValS(args[0].readAsString());\n    }\n\n    /**\n     * Convert to uppercase\n     */\n    callTouppercase(args: VpcVal[]) {\n        return VpcValS(args[0].readAsString().toUpperCase());\n    }\n\n    /**\n     * Convert to lowercase\n     */\n    callTolowercase(args: VpcVal[]) {\n        return VpcValS(args[0].readAsString().toLowerCase());\n    }\n\n    /**\n     * Returns the length of a string, in characters.\n     */\n    callLength(args: VpcVal[]) {\n        return VpcValN(args[0].readAsString().length);\n    }\n\n    /**\n     * Search for a string within a string, and return the position where found.\n     * If not found, returns 0.\n     * (one-based indexing).\n     */\n    callOffset(args: VpcVal[]) {\n        let needle = args[0].readAsString();\n        let haystack = args[1].readAsString();\n        let index = haystack.indexOf(needle);\n        return VpcValN(index === -1 ? 0 : index + 1);\n    }\n\n    /**\n     * Calculates interest rate annuity.\n     */\n    callAnnuity(args: VpcVal[]) {\n        let rate = args[0].readAsStrictNumeric();\n        let periods = args[1].readAsStrictNumeric();\n        let ret = (1 - Math.pow(1 + rate, -periods)) / rate;\n        return VpcValN(ret);\n    }\n\n    /**\n     * Calculates compound interest rate.\n     */\n    callCompound(args: VpcVal[]) {\n        let rate = args[0].readAsStrictNumeric();\n        let periods = args[1].readAsStrictNumeric();\n        let ret = Math.pow(1 + rate, periods);\n        return VpcValN(ret);\n    }\n\n    /**\n     * In an afterkeydown or afterkeyup handler, check if this modifier\n        key is pressed.\n     */\n    callCommandkey(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return this.callCmdkey(args, frmMsg, frmParams);\n    }\n\n    /**\n     * In an afterkeydown or afterkeyup handler, check if this modifier\n        key is pressed.\n     */\n    callCmdkey(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState([0, 0], [0, 0, 0], buttons, mods);\n        return VpcValS((mods.val & ModifierKeys.Cmd) !== 0 ? 'down' : 'up');\n    }\n\n    /**\n     * In an afterkeydown or afterkeyup handler, check if this modifier\n        key is pressed.\n     */\n    callOptionkey(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState([0, 0], [0, 0, 0], buttons, mods);\n        return VpcValS((mods.val & ModifierKeys.Opt) !== 0 ? 'down' : 'up');\n    }\n\n    /**\n     * In an afterkeydown or afterkeyup handler, check if this modifier\n        key is pressed.\n     */\n    callShiftkey(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState([0, 0], [0, 0, 0], buttons, mods);\n        return VpcValS((mods.val & ModifierKeys.Shift) !== 0 ? 'down' : 'up');\n    }\n\n    /**\n     * In an afterkeydown or afterkeyup handler, check the character.\n        Is affected by shift.\n     */\n    callKeychar(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        if (!frmMsg || frmMsg.keyChar === undefined) {\n            checkThrow(\n                false,\n                longstr(`JX|not a key event - function can only be called\n                    in a handler like 'on afterkeydown'`)\n            );\n        } else {\n            return VpcValS(frmMsg.keyChar);\n        }\n    }\n\n    /**\n     * In an afterkeydown handler, did this event come from the user holding the key down?\n     */\n    callKeyrepeated(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        if (!frmMsg || frmMsg.keyRepeated === undefined) {\n            checkThrow(\n                false,\n                longstr(`JW|not a key event - function can only be called\n                    in a handler like 'on afterkeydown'`)\n            );\n        } else {\n            return VpcValBool(frmMsg && frmMsg.keyRepeated);\n        }\n    }\n\n    /**\n     * Get click x coordinate.\n     */\n    callClickh(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return frmMsg && frmMsg.clickLoc && frmMsg.clickLoc.length > 1 ? VpcValN(frmMsg.clickLoc[0]) : VpcVal.Empty;\n    }\n\n    /**\n     * Get click y coordinate.\n     */\n    callClickv(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return frmMsg && frmMsg.clickLoc && frmMsg.clickLoc.length > 1 ? VpcValN(frmMsg.clickLoc[1]) : VpcVal.Empty;\n    }\n\n    /**\n     * Get click x,y coordinates.\n     */\n    callClickloc(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return frmMsg && frmMsg.clickLoc && frmMsg.clickLoc.length > 1\n            ? VpcValS(`${frmMsg.clickLoc[0]},${frmMsg.clickLoc[1]}`)\n            : VpcVal.Empty;\n    }\n\n    /**\n     * Is the mouse button currently down.\n     */\n    callMouse(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState([0, 0], [0, 0, 0], buttons, mods);\n        let isDown = buttons.val && buttons.val[0];\n        return VpcValS(isDown ? 'down' : 'up');\n    }\n\n    /**\n     * Was the mouse clicked?\n     */\n    callMouseclick(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let clicked: [number, number, number] = [0, 0, 0];\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState([0, 0], clicked, buttons, mods);\n        let ret = false;\n        if (clicked[2] !== frmMsg.lastSeenClickId) {\n            ret = true;\n            frmMsg.clickLoc[0] = clicked[0];\n            frmMsg.clickLoc[1] = clicked[1];\n            /* reset the mouseclick so subsequent calls return false */\n            frmMsg.lastSeenClickId = clicked[2];\n        }\n\n        return VpcValBool(ret);\n    }\n\n    /**\n     * The x coordinate of mouse location.\n     */\n    callMouseh(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let mouseCoords: [number, number] = [0, 0];\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState(mouseCoords, [0, 0, 0], buttons, mods);\n        return VpcValN(mouseCoords[0]);\n    }\n\n    /**\n     * The y coordinate of mouse location.\n     */\n    callMousev(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let mouseCoords: [number, number] = [0, 0];\n        let buttons = new ValHolder([false]);\n        let mods = new ValHolder(ModifierKeys.None);\n        this.readoutside.GetMouseAndKeyState(mouseCoords, [0, 0, 0], buttons, mods);\n        return VpcValN(mouseCoords[1]);\n    }\n\n    /**\n     * The coordinates of mouse location.\n     */\n    callMouseloc(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let h = this.callMouseh(args, frmMsg, frmParams);\n        let v = this.callMousev(args, frmMsg, frmParams);\n        return VpcValS(`${h.readAsString()},${v.readAsString()}`);\n    }\n\n    /**\n     * Get the number of values passed into the current procedure.\n    Can be used to build a function that takes any number of arguments\n     */\n    callParamcount(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return VpcValN(frmParams.length);\n    }\n\n    /**\n     * Get the nth value passed into the current procedure. Can be used\n    to build a function that takes any number of arguments\n     */\n    callParam(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let n = args[0].readAsStrictInteger(this.tmpArr);\n        let ret = frmParams[this.fromOneBased(n)];\n        return ret === undefined ? VpcVal.Empty : ret;\n    }\n\n    /**\n     * Get all of the values passed into the current procedure.\n     */\n    callParams(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let s = frmParams.map(v => v.readAsString()).join(',');\n        return VpcValS(s);\n    }\n\n    /**\n     * The return value of the last called function or procedure.\n     */\n    callResult(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        return this.readoutside.ReadVarContents('$result');\n    }\n\n    /**\n     * The field that contains current selected text, looks something\n        like 'cd fld id 1234'.\n     */\n    callSelectedfield(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let fld = this.readoutside.FindSelectedTextBounds()[0];\n        if (fld) {\n            let container = this.renderVelName(fld.idInternal);\n            return VpcValS(container);\n        } else {\n            return VpcVal.Empty;\n        }\n    }\n\n    /**\n     * Find bounds of current selection\n     * If length of selection is 0, might say 'char 4 to 3 of cd fld 1',\n     * but this is what the original product said.\n     */\n    callSelectedchunk(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let selInfo = this.readoutside.FindSelectedTextBounds();\n        if (selInfo && selInfo[0]) {\n            let name = this.renderVelName(selInfo[0].idInternal);\n            return VpcValS(`char ${this.toOneBased(selInfo[1])} to ${selInfo[2]} of ${name}`);\n        } else {\n            return VpcVal.Empty;\n        }\n    }\n\n    /**\n     * The value of the current selected text.\n     */\n    callSelectedtext(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let ref = new RequestedContainerRef();\n        ref.isJustSelection = true;\n        let resolved = this.readoutside.ResolveContainerReadable(ref);\n        return VpcValS(resolved.getRawString());\n    }\n\n    /**\n     * Are we in compatibility mode\n     */\n    protected getCompatMode() {\n        let ref = new RequestedVelRef(VpcElType.Stack);\n        ref.lookByRelative = OrdinalOrPosition.This;\n        let read = this.readoutside.GetProp(ref, 'compatibilitymode', PropAdjective.Empty, undefined);\n        return read.readAsStrictBoolean();\n    }\n\n    /**\n     * The number of the line of the current selected text.\n     * Note: disregards the end of the selection.\n     */\n    callSelectedline(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let selInfo = this.readoutside.FindSelectedTextBounds();\n        if (selInfo && selInfo[0]) {\n            let start = selInfo[1];\n            let lines = new UI512Lines(selInfo[0].getFmTxt());\n            let whichLine = this.toOneBased(lines.indexToLineNumber(start));\n            if (this.getCompatMode()) {\n                let s = `line ${whichLine} of ${this.renderVelName(selInfo[0].idInternal)}`;\n                return VpcValS(s);\n            } else {\n                return VpcValN(whichLine);\n            }\n        } else {\n            return VpcVal.Empty;\n        }\n    }\n\n    /**\n     * The tool to be used when programmatically drawing shapes.\n        (Not the actual tool, which would always be Browse)\n     */\n    callTool(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let nTool = this.readoutside.GetCurrentTool(false);\n        let s = findEnumToStr(VpcTool, nTool);\n        return VpcValS(s ? s.toLowerCase() : '');\n    }\n\n    /**\n     * What is the long id of this object, by id? return empty if object not found\n     * supports both internalId and userfacingId\n     */\n    callObjectbyid(args: VpcVal[], frmMsg: VpcScriptMessage, frmParams: VpcVal[]) {\n        let ref = new RequestedVelRef(VpcElType.Unknown);\n        ref.lookById = args[0].readAsStrictInteger();\n        ref.partIsCdOrBg = true;\n        let s = this.readoutside.ElementExists(ref);\n        return VpcValS(s ?? '');\n    }\n\n    /**\n     * Get the name of a vel as a string.\n     * if compat mode, \"card field 3\" (confirmed in emulator)\n     * if non-compat mode, \"card field id 234\" or \"bg field id 345 of cd id 567\"\n     * (i.e. non-compat mode can be parsed as string and points to the correct field.)\n     */\n    protected renderVelName(idInternal: string): string {\n        let ref = new RequestedVelRef(VpcElType.Unknown);\n        ref.partIsCdOrBg = true;\n        ref.lookById = Util512.parseInt(idInternal);\n        checkThrow(ref.lookById, 'VY|id not a number');\n        let sInfo = this.readoutside.ElementExists(ref);\n        checkThrow(sInfo, 'VX|not found');\n        if (this.getCompatMode()) {\n            let words = sInfo.split(' ');\n            let objType = words[0];\n            if (words[1] === 'button' || words[1] === 'field') {\n                objType += ' ' + words[1];\n            }\n\n            let objNumber = this.readoutside.GetProp(ref, 'number', PropAdjective.Long, undefined);\n            return `${objType} ${objNumber.readAsString()}`;\n        } else {\n            return sInfo;\n        }\n    }\n\n    /**\n     * In the script, lists are all 1 based, but it's easier to work with 0-based indexes,\n     * so convert them here\n     */\n    protected toOneBased(n: number) {\n        /* here, unfortunately arrays start at 1 instead of 0. */\n        return n + 1;\n    }\n\n    /**\n     * in the script, lists are all 1 based, but it's easier to work with 0-based indexes,\n     * so convert them here\n     */\n    protected fromOneBased(n: number) {\n        return n - 1;\n    }\n\n    /**\n     * variadic functions can take either sum(1,2,3) or sum(\"1,2,3\")\n     */\n    protected mathVariadic(args: VpcVal[], name: string, fn: (ar: number[]) => number): VpcVal {\n        let h = new VpcEvalHelpers();\n        let numlist = h.numberListFromArgsGiven(name, args, VpcBuiltinFunctions.sep);\n        return VpcValN(fn(numlist));\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcBuiltinFunctionsUtils.ts",
    "content": "\n/* auto */ import { VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { PropAdjective } from './../vpcutils/vpcEnums';\n/* auto */ import { vpcVersion } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * separate utilities for builtin functions\n */\nexport const VpcBuiltinFunctionsDateUtils = /* static class */ {\n    /* render short date. */\n    _getShortDate() {\n        let [nDay, nDate, nMonth, nYear] = this._getDateCurrent();\n        Util512.unused(nDay);\n        return `${nMonth + 1}/${nDate}/${nYear}`;\n    },\n\n    /* render abbrev date. */\n    _getAbbrevDate() {\n        let [nDay, nDate, nMonth, nYear] = this._getDateCurrent();\n        return `${lng(day_names_short[nDay])}, ${lng(month_names_short[nMonth])} ${nDate}, ${nYear}`;\n    },\n\n    /* render long date. */\n    _getLongDate() {\n        let [nDay, nDate, nMonth, nYear] = this._getDateCurrent();\n        return `${lng(day_names[nDay])}, ${lng(month_names[nMonth])} ${nDate}, ${nYear}`;\n    },\n\n    /* get date info from javascript. month is 0-based. */\n    _getDateCurrent(): [number, number, number, number] {\n        let d = new Date();\n        return [d.getDay(), d.getDate(), d.getMonth(), d.getFullYear()];\n    },\n\n    /* get the current date as a string */\n    go(adjective: PropAdjective) {\n        if (adjective === PropAdjective.Abbrev) {\n            return VpcValS(this._getAbbrevDate());\n        } else if (adjective === PropAdjective.Long) {\n            return VpcValS(this._getLongDate());\n        } else {\n            return VpcValS(this._getShortDate());\n        }\n    },\n\n    /* get the product version */\n    getVersion(adjective: PropAdjective) {\n        if (adjective === PropAdjective.Long) {\n            return VpcValS(vpcVersion);\n        } else {\n            return VpcValS(vpcVersion[4] + '.' + vpcVersion[6]);\n        }\n    }\n};\n\nconst month_names = [\n    'lngJanuary',\n    'lngFebruary',\n    'lngMarch',\n    'lngApril',\n    'lngMay',\n    'lngJune',\n    'lngJuly',\n    'lngAugust',\n    'lngSeptember',\n    'lngOctober',\n    'lngNovember',\n    'lngDecember'\n];\n\nconst month_names_short = [\n    'lngJan',\n    'lngFeb',\n    'lngMar',\n    'lngApr',\n    'lngMay',\n    'lngJun',\n    'lngJul',\n    'lngAug',\n    'lngSep',\n    'lngOct',\n    'lngNov',\n    'lngDec'\n];\nconst day_names = ['lngSunday', 'lngMonday', 'lngTuesday', 'lngWednesday', 'lngThursday', 'lngFriday', 'lngSaturday'];\nconst day_names_short = ['lngSun', 'lngMon', 'lngTue', 'lngWed', 'lngThu', 'lngFri', 'lngSat'];\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcCheckReserved.ts",
    "content": "\n/* auto */ import { VariableCollectionConstants } from './../vpcutils/vpcVarCollection';\n/* auto */ import { alsoReservedWordsList, listOfAllBuiltinCommandsInOriginalProduct, listOfAllBuiltinEventsInOriginalProduct } from './../codeparse/vpcTokens';\n/* auto */ import { VpcStandardLibScript } from './../vpcutils/vpcStandardLibScript';\n/* auto */ import { VpcBuiltinMsg, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcBuiltinFunctions } from './vpcBuiltinFunctions';\n/* auto */ import { VpcElProductOpts } from './../vel/velProductOpts';\n/* auto */ import { bool } from './../../ui512/utils/util512Base';\n/* auto */ import { findStrToEnum, slength } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * provides ways to see if a certain term is ok to use as a variable name,\n * or if it is a reserved term that is disallowed.\n * Needed because many keywords aren't separate tokens,\n * you shouldn't be able to create a variable named \"repeat\" even though\n * it lexes as a tkidentifier.\n */\nexport class CheckReservedWords {\n    readonly constants = new VariableCollectionConstants();\n    isBuiltinHandler(s: string): boolean {\n        /* \"mouseup\", \"arrowkey\" */\n        s = s.toLowerCase();\n        return (\n            bool(findStrToEnum(VpcBuiltinMsg, s)) ||\n            listOfAllBuiltinEventsInOriginalProduct[s] ||\n            VpcStandardLibScript.handlersImplementedInSoftware[s] ||\n            s.includes('vpcinternal')\n        );\n    }\n\n    isBuiltinVarOrConstant(s: string): boolean {\n        /* \"pi\", \"result\" */\n        return bool(this.constants.find(s)) || /* bool */ s === 'result' || s === '$result';\n    }\n\n    isPropertyName(s: string): boolean {\n        /* \"autohilite\", \"style\" */\n        return bool(VpcElProductOpts.isAnyProp(s));\n    }\n\n    isBuiltinFunction(s: string): boolean {\n        /* \"sin\", \"length\", \"result\" */\n        return VpcBuiltinFunctions.isFunction(s);\n    }\n\n    isKeyword(s: string): boolean {\n        /* \"put\" \"do\" \"replace\" */\n        let isCmd = listOfAllBuiltinCommandsInOriginalProduct[s.toLowerCase()] !== undefined;\n\n        /* \"from\", \"with\", \"to\", \"end\" */\n        return isCmd || /* bool */ alsoReservedWordsList[s];\n    }\n\n    okHandlerName(s: string) {\n        /* user is making a new handler like on myOperation */\n        checkThrow(slength(s), `7)|invalid identifier ${s}`);\n        if (!s.match(/^[A-Za-z_$]/)) {\n            return false;\n        }\n        return (\n            this.isBuiltinHandler(s) ||\n            (!this.isKeyword(s) && !this.isPropertyName(s) && !this.isBuiltinFunction(s) && !this.isBuiltinVarOrConstant(s))\n        );\n    }\n\n    okLocalVar(s: string) {\n        if (s === 'number' || s === 'a' || s === 'it') {\n            /* these ones we've explicitly said are ok variable names.\n            see also checkCommonMistakenVarNames */\n            return true;\n        }\n\n        if (!s.match(/^[A-Za-z$_][A-Za-z0-9$_]*$/)) {\n            return false;\n        }\n\n        /* new: don't need to check this.isPropertyName,\n        it'd fine for local variables to shadow a property name. */\n        checkThrow(slength(s), `7(|invalid identifier ${s}`);\n        return !this.isKeyword(s) && !this.isBuiltinHandler(s) && !this.isBuiltinFunction(s) && !this.isBuiltinVarOrConstant(s);\n    }\n\n    potentialUserFn(s: string) {\n        checkThrow(s.match(/^[A-Za-z$]/), 'SK|must start with a letter');\n        checkThrow(slength(s), `7&|invalid identifier ${s}`);\n        return (\n            !this.isKeyword(s) &&\n            !this.isBuiltinHandler(s) &&\n            !this.isPropertyName(s) &&\n            !this.isBuiltinFunction(s) &&\n            !this.isBuiltinVarOrConstant(s)\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcLineToCodeObj.ts",
    "content": "\n/* auto */ import { getParsingObjects } from './../codeparse/vpcVisitor';\n/* auto */ import { CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { BuildFakeTokens, ChvITk, isTkType, tks, tkstr } from './../codeparse/vpcTokens';\n/* auto */ import { VpcCodeLine, VpcLineCategory, checkCommonMistakenVarNames } from './vpcPreparseCommon';\n/* auto */ import { checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './vpcCheckReserved';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, arLast, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * determine the category of a line of code\n */\nexport class VpcLineToCodeObj {\n    parser: chevrotain.CstParser;\n    cachedStartOnes: ChvITk[];\n    constructor(protected idGen: CountNumericId, protected check: CheckReservedWords) {}\n\n    /**\n     * cache a few tokens for efficiency\n     */\n    init(basis: ChvITk) {\n        this.parser = getParsingObjects()[1];\n\n        /* the offsets here won't be right, but we shouldn't encounter errs here anyways */\n        this.cachedStartOnes = [\n            BuildFakeTokens.makeSyntaxMarker(basis),\n            BuildFakeTokens.makeSyntaxMarker(basis),\n            BuildFakeTokens.makeSyntaxMarker(basis)\n        ];\n    }\n\n    /**\n     * top-level creating a VpcCodeLine object, and determining what type of line it is.\n     */\n    toCodeLine(line: ChvITk[]) {\n        checkThrow(line && line.length > 0, \"8O|we don't allow empty lines of code\");\n        checkThrow(\n            line[0].tokenType === tks.tkIdentifier || line[0].image.toLowerCase() === 'next',\n            '8N|The first word of this line is not a valid command or keyword.',\n            line[0].image\n        );\n        let firstImage = line[0].image;\n        let ruleAsBuiltin = 'RuleBuiltinCmd' + Util512.capitalizeFirst(firstImage);\n        let output = new VpcCodeLine(this.idGen.next(), line);\n        if (this.parser[ruleAsBuiltin] !== undefined) {\n            this.goBuiltinCmd(firstImage, line, output);\n            output.setParseRule(this.parser[ruleAsBuiltin]);\n        } else {\n            /* this is either a syntax structure (like end repeat) or a custom handler call */\n            let cmd = firstImage.replace(/\\^/g, '');\n            let method = 'go' + Util512.capitalizeFirst(cmd);\n            let ret: unknown;\n            if (Util512.isMethodOnClass(this, method)) {\n                ret = Util512.callAsMethodOnClass(VpcLineToCodeObj.name, this, method, [line, output], false);\n            } else {\n                ret = this.goCustomHandler(line, output);\n            }\n\n            assertTrue(ret === undefined, '5v|expected undefined but got', ret);\n            if (!output.getParseRule() && output.excerptToParse.length > 0) {\n                if (this.isParsingNeeded(output.ctg)) {\n                    /* construct an array to be sent to the parser */\n                    output.excerptToParse = this.cachedStartOnes.concat(output.excerptToParse);\n                    output.setParseRule(this.parser[tkstr.RuleInternalCmdRequestEval]);\n                }\n            }\n\n            return output;\n        }\n\n        return output;\n    }\n\n    /**\n     * this line is a call to a built in command like \"put\"\n     */\n    goBuiltinCmd(firstImage: string, line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.Statement;\n        output.excerptToParse = this.cachedStartOnes.concat(line.slice(1));\n    }\n\n    /**\n     * requestEvals are only added later\n     */\n    goRequestEval(line: ChvITk[], output: VpcCodeLine) {\n        checkThrow(false, `8J|we shouldn't reach this yet, we don't add them until after this step.`);\n    }\n\n    /**\n     * this line is a function start like \"function myFunc\"\n     */\n    goFunction(line: ChvITk[], output: VpcCodeLine) {\n        this.goOn(line, output);\n    }\n\n    /**\n     * this line is a handler start like \"on mouseUp\"\n     */\n    goOn(line: ChvITk[], output: VpcCodeLine) {\n        let firstImage = line[0].image;\n        output.ctg = VpcLineCategory.HandlerStart;\n        checkThrow(line.length > 1, `8F|cannot have a line that is just \"${firstImage}\"`);\n        checkThrow(line[1].image !== 'keydown', 'SP|we support `on afterkeydown` but not `on keydown`');\n        checkCommonMistakenVarNames(line[1]);\n        checkThrow(this.check.okHandlerName(line[1].image), `8E|name of handler like 'on ${line[1].image}' we don't support.`);\n        checkThrowEq(\n            tks.tkIdentifier,\n            line[1].tokenType,\n            `8D|expected \"${firstImage} myhandler\" but got \"${firstImage} <invalid name>`\n        );\n\n        output.excerptToParse.push(line[0]); /* 'on' or 'function' */\n        output.excerptToParse.push(line[1]); /* name of handler */\n        this.getListOfValidVariableNames(line, output, 2);\n    }\n\n    /**\n     * this line is opening an if block\n     */\n    goIf(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.IfStart;\n        let lastToken = arLast(line);\n        checkThrow(\n            isTkType(lastToken, tks.tkIdentifier) && lastToken.image === 'then',\n            `87|expected line to end with \"then\". 'if x > 2 then' `\n        );\n\n        checkThrow(line.length > 2, `86|cannot have a line that is just \"if then\"`);\n        output.excerptToParse = line.slice(1, -1);\n    }\n\n    /**\n     * this line is like \"else\"\n     */\n    goElse(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.IfElsePlain;\n        checkThrowEq(1, line.length, `82|line should be just 'else'`);\n    }\n\n    /**\n     * this line is like \"end if\"\n     */\n    goEndIf(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.IfEnd;\n        checkThrowEq(2, line.length, `81|line should be just 'end if'`);\n    }\n\n    /**\n     * this line is like \"exit repeat\"\n     */\n    goExitRepeat(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.RepeatExit;\n        checkThrowEq(2, line.length, `Jb|line should be just 'exit repeat'`);\n    }\n\n    /**\n     * this line is like \"end repeat\"\n     */\n    goEndRepeat(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.RepeatEnd;\n        checkThrowEq(2, line.length, `7~|line should be just 'end repeat'`);\n    }\n\n    /**\n     * this line is like \"next repeat\"\n     */\n    goNext(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.RepeatNext;\n        checkThrowEq(2, line.length, `7}|line should be just 'next repeat'`);\n        checkThrow(isTkType(line[1], tks.tkIdentifier) && line[1].image === 'repeat', `7||line should be just 'next repeat'`);\n    }\n\n    /**\n     * this line is declaring global variable(s)\n     */\n    goGlobal(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.DeclareGlobal;\n        checkThrow(line.length > 1, `8C|cannot have a line that is just \"global\"`);\n        this.getListOfValidVariableNames(line, output, 1);\n    }\n\n    /**\n     * this line is a call to a custom handler \"myHandler 1,2,3\"\n     */\n    goCustomHandler(line: ChvITk[], output: VpcCodeLine) {\n        /* we used to check listOfAllBuiltinCommandsInOriginalProduct\n        and throw if it wasn't in handlersImplementedInSoftware,\n        but that would make this a preparse-time error,\n        and it'd be nicer just as a runtime error, if importing stacks */\n\n        if (line.length > 1) {\n            /* kind reminders to the user */\n            let firstToken = line[0];\n            checkThrow(line[1].image !== '=', `8M|this isn't C... you need to use 'put 1 into x' not 'x = 1'`);\n            checkThrow(\n                !firstToken.endOffset ||\n                    line[1].image !== '(' ||\n                    arLast(line).image !== ')' ||\n                    line[1].startOffset > firstToken.endOffset + 1,\n                longstr(`8L|this isn't C... you need to say\n                 'put fn() into x' or 'fn (1)' but not 'fn()' alone`)\n            );\n        }\n\n        output.ctg = VpcLineCategory.CallHandler;\n        checkThrow(\n            this.check.okHandlerName(line[0].image),\n            longstr(`8K|it looked like you were calling a handler like\n                myHandler, but this is a reserved word, we don't support that here.`)\n        );\n        output.excerptToParse = this.cachedStartOnes.concat(line.slice(1));\n        output.setParseRule(this.parser[tkstr.RuleInternalCmdUserHandler]);\n    }\n\n    /**\n     * this line is ending a block (\"end if\" or \"end repeat\" etc)\n     */\n    endStatementCommon(line: ChvITk[], output: VpcCodeLine, s: string) {\n        checkThrowEq(2, line.length, `8B|wrong line length, in '${s} myhandler'`);\n        checkCommonMistakenVarNames(line[1]);\n        checkThrow(\n            this.check.okHandlerName(line[1].image),\n            longstr(\n                `8A|we think you are trying to say '${s} myhandler', but\n                name of handler is a reserved word.`\n            )\n        );\n        checkThrowEq(tks.tkIdentifier, line[1].tokenType, `89|expected \"end myhandler\" but name of my handler is not valid`);\n\n        output.excerptToParse.push(line[0]);\n        output.excerptToParse.push(line[1]);\n    }\n\n    /**\n     * this line is like \"exit to ViperCard\"\n     */\n    goExitProduct(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.ProductExit;\n    }\n\n    /**\n     * this line is like \"return x\"\n     */\n    goReturn(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.ReturnExpr;\n        checkThrow(\n            line.length > 1,\n            longstr(`88|cannot have a line that is just\n                \"return\". if you really want to return void,\n                try exit myhandler.`)\n        );\n        output.excerptToParse = line.slice(1);\n    }\n\n    /**\n     * this line is ending a handler\n     */\n    goEndHandler(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.HandlerEnd;\n        this.endStatementCommon(line, output, 'end');\n    }\n\n    /**\n     * this line is exiting a handler\n     */\n    goExitHandler(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.HandlerExit;\n        this.endStatementCommon(line, output, 'exit');\n    }\n\n    /**\n     * this line is like \"pass mouseUp\"\n     */\n    goPass(line: ChvITk[], output: VpcCodeLine) {\n        output.ctg = VpcLineCategory.HandlerPass;\n        this.endStatementCommon(line, output, 'pass');\n    }\n\n    /**\n     * by this point all loops have become just \"repeat\"\n     */\n    goRepeat(line: ChvITk[], output: VpcCodeLine) {\n        checkThrowEq(1, line.length, 'SO|all repeats should have already been transformed.');\n        output.ctg = VpcLineCategory.RepeatForever;\n    }\n\n    /**\n     * the line begins with \"end\"\n     */\n    goEnd(line: ChvITk[], output: VpcCodeLine) {\n        checkThrow(line.length > 1, `7_|cannot have a line that is just \"end\"`);\n        checkThrowEq(2, line.length, `7^|wrong line length. expected \"end if\", \"end repeat\", \"end handler\"`);\n        checkThrowEq(tks.tkIdentifier, line[1].tokenType, `7]|expected one of: \"end if\", \"end repeat\", \"end handler\"`);\n\n        if (line[1].image === 'if') {\n            return this.goEndIf(line, output);\n        } else if (line[1].image === 'repeat') {\n            return this.goEndRepeat(line, output);\n        } else {\n            return this.goEndHandler(line, output);\n        }\n    }\n\n    /**\n     * the line begins with \"exit\"\n     */\n    goExit(line: ChvITk[], output: VpcCodeLine) {\n        checkThrow(line.length > 1, `7[|cannot have a line that is just \"exit\"`);\n        checkThrow(\n            line.length === 2,\n            longstr(\n                `7@|wrong line length, expected \"exit myhandler\",\n                 \"exit repeat\", \"exit to ${cProductName}\"`\n            )\n        );\n        checkThrow(\n            line[1].tokenType === tks.tkIdentifier || line[1].tokenType === tks.tkProductName,\n            `7?|expected \"exit myhandler\", \"exit repeat\", \"exit to ${cProductName}\"`\n        );\n\n        if (line[1].image === 'repeat') {\n            return this.goExitRepeat(line, output);\n        } else if (line[1].tokenType === tks.tkProductName) {\n            return this.goExitProduct(line, output);\n        } else {\n            return this.goExitHandler(line, output);\n        }\n    }\n\n    /**\n     * line begins with send\n     */\n    goSend(line: ChvITk[], output: VpcCodeLine) {\n        checkThrow(line.length >= 2, `SN|line is too short.`);\n\n        /* other control blocks just parse a single expression,\n        but this has to parse both an expression and an object,\n        so use a separate parse rule */\n        output.setParseRule(this.parser[tkstr.RuleCmdSend]);\n        output.excerptToParse = this.cachedStartOnes.concat(line.slice(1));\n        output.ctg = VpcLineCategory.CallDynamic;\n    }\n\n    /**\n     * line begins with internalvpcmessagesdirective\n     */\n    goInternalvpcmessagesdirective(line: ChvITk[], output: VpcCodeLine) {\n        checkThrow(line.length === 3 || line.length === 2, `SM|line must contain 2 or 3 tokens.`);\n        output.excerptToParse = line.slice();\n        output.ctg = VpcLineCategory.IsInternalvpcmessagesdirective;\n    }\n\n    /**\n     * perf. optimization, many lines of code (like 'end repeat') don't need\n     * to be sent to the parser since there is not expression to be evaluated.\n     */\n    protected isParsingNeeded(ctg: VpcLineCategory) {\n        switch (ctg) {\n            case VpcLineCategory.CallDynamic:\n                checkThrow(false, 'SL|call dynamic should be handled elsewhere');\n                break;\n            case VpcLineCategory.HandlerStart: /* fall-through */\n            case VpcLineCategory.HandlerEnd: /* fall-through */\n            case VpcLineCategory.HandlerExit: /* fall-through */\n            case VpcLineCategory.ProductExit: /* fall-through */\n            case VpcLineCategory.HandlerPass: /* fall-through */\n            case VpcLineCategory.IfElsePlain: /* fall-through */\n            case VpcLineCategory.IfEnd: /* fall-through */\n            case VpcLineCategory.RepeatExit: /* fall-through */\n            case VpcLineCategory.RepeatNext: /* fall-through */\n            case VpcLineCategory.RepeatForever: /* fall-through */\n            case VpcLineCategory.RepeatEnd: /* fall-through */\n            case VpcLineCategory.DeclareGlobal /* fall-through */:\n            case VpcLineCategory.IsInternalvpcmessagesdirective /* fall-through */:\n                return false;\n            default:\n                return true;\n        }\n    }\n\n    /**\n     * for a line like \"on myHandler a,b,c\"\n     * note that in this version, variable names aren't always a tkIdentifier\n     */\n    protected getListOfValidVariableNames(line: ChvITk[], output: VpcCodeLine, index: number) {\n        let count = 0;\n        for (let i = index; i < line.length; i++) {\n            count += 1;\n            if (count % 2 === 0) {\n                checkThrowEq(\n                    tks.tkComma,\n                    line[i].tokenType,\n                    `8H|required comma every other param (expected on myhandler x, y, z)`,\n                    line[i].image\n                );\n            } else {\n                checkCommonMistakenVarNames(line[i]);\n                checkThrow(\n                    this.check.okLocalVar(line[i].image),\n                    `8I|name of parameter is a reserved word, we don't support here.`\n                );\n\n                output.excerptToParse.push(line[i]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcPreparseCommon.ts",
    "content": "\n/* auto */ import { CodeLimits } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk, isTkType, tks } from './../codeparse/vpcTokens';\n/* auto */ import { IVpcCodeLine, VpcErrStage, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * make every symbol lowercase, because the language is case insensitive\n */\nexport class MakeLowerCase {\n    go(tk: ChvITk) {\n        if (tk.tokenType !== tks.tkStringLiteral) {\n            tk.image = tk.image.toLowerCase();\n        }\n    }\n}\n\n/**\n * enforce an upper bound on the number of iterations in a loop\n */\nexport class LoopLimit {\n    count: number;\n    constructor(protected maxcount: number, protected msg = '') {\n        this.count = maxcount;\n    }\n\n    /* return true if it's ok to keep looping */\n    next(): true {\n        this.count--;\n        if (this.count < 0) {\n            checkThrow(\n                false,\n                longstr(`5n|Unfortunately, we need to have\n            limitations on scripts, in order to prevent denial of service.\n                for ${this.msg}, the limit is ${this.maxcount}`)\n            );\n        }\n\n        return true;\n    }\n}\n\n/**\n * chevrotain 'rules' take these arguments\n */\nexport type ChvRuleFnType = (idxInCallingRule?: number, ...args: any[]) => chevrotain.CstNode;\n\n/**\n * a line of code.\n * can span multiple user-typed lines if the \\ escape across lines,\n * the offset to the user-typed source code is offset\n */\nexport class VpcCodeLine implements IVpcCodeLine {\n    /* unique id for this line */\n    readonly lineId: number;\n\n    /* first token of the code in the line. useful to keep because\n    it points to the current line, and stores original command in\n    case transformations are done later. */\n    readonly firstToken: ChvITk;\n\n    /* parsing entry point */\n    protected parseRule: O<ChvRuleFnType>;\n\n    /* list of tokens, if any, that should be sent to parser */\n    excerptToParse: ChvITk[] = [];\n\n    /* category */\n    ctg = VpcLineCategory.Invalid;\n\n    /* other associated lines, e.g. end repeat links to the initial repeat */\n    blockInfo: O<VpcCodeLineReference[]>;\n\n    /* represent the line joined into a string */\n    allImages: O<string>;\n\n    /* holds all tokens in the line, nulled out when not needed to save memory */\n    tmpEntireLine: O<ChvITk[]>;\n\n    /* the actual offset in the user-typed source code ('error on line 234') */\n    offset = -1;\n\n    /**\n     * make an instance\n     */\n    constructor(lineId: number, line: ChvITk[]) {\n        this.lineId = lineId;\n        this.firstToken = line[0];\n        this.tmpEntireLine = line;\n    }\n\n    /**\n     * get parser entry point\n     */\n    getParseRule() {\n        return this.parseRule;\n    }\n\n    /**\n     * set parser entry point\n     */\n    setParseRule(fn: O<ChvRuleFnType>) {\n        this.parseRule = fn;\n\n        /* while we're here, let's store 'allImages' as a string\n        we can later use the string to uniquely identify a parsed line of code\n        and re-use the CST */\n        assertTrue(this.tmpEntireLine && this.tmpEntireLine.length, `5)|invalid line`);\n        if (fn && this.tmpEntireLine) {\n            this.allImages = '';\n            for (let i = 0, len = this.tmpEntireLine.length; i < len; i++) {\n                this.allImages += this.tmpEntireLine[i].image;\n                this.allImages += '~';\n            }\n        }\n    }\n}\n\n/**\n * efficiently splits an array of tokens by line,\n * producing an iterator\n */\nexport class SplitIntoLinesAndMakeLowercase {\n    index = 0;\n    constructor(protected instream: ChvITk[], protected makeLower: MakeLowerCase) {}\n\n    /* splits the list by newlines */\n    nextWithNewlines(): O<ChvITk[]> {\n        let currentLine: ChvITk[] = [];\n        let limit = new LoopLimit(CodeLimits.MaxTokensInLine, 'maxTokensInLine');\n        while (limit.next()) {\n            let tk = this.instream[this.index];\n            this.index += 1;\n\n            /* have we reached the end of the stream? */\n            if (tk === undefined) {\n                return currentLine.length ? currentLine : undefined;\n            }\n\n            if (isTkType(tk, tks.tkNewLine)) {\n                return currentLine;\n            } else {\n                this.makeLower.go(tk);\n                currentLine.push(tk);\n            }\n        }\n\n        return undefined;\n    }\n\n    /* get the next line */\n    next(): O<ChvITk[]> {\n        while (true) {\n            let next = this.nextWithNewlines();\n            if (next === undefined) {\n                return undefined;\n            } else if (next && next.length === 0) {\n                continue; /* skip empty lines */\n            } else if (next && next.length === 1 && isTkType(next[0], tks.tkNewLine)) {\n                continue; /* skip only newlines */\n            } else {\n                return next;\n            }\n        }\n    }\n}\n\n/**\n * every line of code is assigned a category\n */\nexport enum VpcLineCategory {\n    __isUI512Enum = 1,\n    Invalid,\n    HandlerStart,\n    HandlerEnd,\n    HandlerExit,\n    ProductExit,\n    HandlerPass,\n    ReturnExpr,\n    IfStart,\n    IfElsePlain,\n    IfEnd,\n    RepeatExit,\n    RepeatNext,\n    RepeatForever,\n    RepeatEnd,\n    DeclareGlobal,\n    Statement,\n    IsInternalvpcmessagesdirective,\n    CallDynamic,\n    CallHandler\n}\n\n/**\n * we could tag all exceptions and attach line information.\n * this is simpler (though perhaps less accurate),\n * just record last line seen, and if an error occurs, it\n * was probably during that line.\n */\nexport class VpcCurrentScriptStage {\n    static latestVelID: O<string>;\n    static currentStage = VpcErrStage.Unknown;\n    static latestSrcLineSeen: O<number>;\n    static latestDestLineSeen: O<VpcCodeLine>;\n    static origClass: O<string>;\n    static dynamicCodeOrigin: O<[string, number]>;\n}\n\n/**\n * a weak reference to a line of code\n */\nexport class VpcCodeLineReference {\n    readonly offset: number;\n    readonly lineId: number;\n    constructor(line: VpcCodeLine) {\n        assertTrue(line.offset !== undefined && line.offset >= 0, '5t|invalid line');\n        assertTrue(line.lineId !== undefined && line.lineId >= 0, '5s|invalid line');\n        this.offset = line.offset;\n        this.lineId = line.lineId;\n    }\n}\n\n/**\n * RequestHandlerCall means to call a handler (and eval each argument)\n * RequestEval means to eval one expression\n */\nexport enum CodeSymbols {\n    RequestHandlerCall = '$requesthandlercall',\n    RequestEval = '$requesteval'\n}\n\n/**\n * some variable names can't be used because they are separate tokens in the lexer\n * since a variable name must be a TkIdentifier token, if you tried to do this,\n * you'd get a weird \"syntax error\" instead of just saying \"you can't use this variable name\"\n *\n * so let's do a few basic checks here to try to give you a better error message\n */\nexport function checkCommonMistakenVarNames(tk: O<ChvITk>) {\n    if (!tk) {\n        return;\n    }\n    if (\n        tk.tokenType === tks._number ||\n        tk.tokenType === tks.tkA ||\n        tk.tokenType === tks.tkIdentifier ||\n        tk.tokenType === tks.tkAllNullaryOrUnaryPropertiesIfNotAlready ||\n        tk.tokenType === tks.tkAllUnaryPropertiesIfNotAlready ||\n        tk.tokenType === tks._box /* i.e. message box */\n    ) {\n        /* these ones we've explicitly said are ok variable names */\n        return;\n    }\n\n    /* regex from \"([^=]+)=OneOfWords\\(([^)]+)\\)\" to\n    checkThrow(tk.tokenType !== tks.\\1, \"S)|we don't support variable names like \\2\");\n    */\n    checkThrow(tk.tokenType !== tks.tkStack, \"S(|we don't support variable names like stack\");\n    checkThrow(tk.tokenType !== tks.tkBg, \"S&|we don't support variable names like background,bkgnd,bg\");\n    checkThrow(tk.tokenType !== tks.tkBgPlural, \"S%|we don't support variable names like backgrounds,bkgnds,bgs\");\n    checkThrow(tk.tokenType !== tks.tkCard, \"S#|we don't support variable names like card,cd\");\n    checkThrow(tk.tokenType !== tks.tkCardPlural, \"S!|we don't support variable names like cards,cds\");\n    checkThrow(tk.tokenType !== tks.tkBtn, \"S |we don't support variable names like button,btn\");\n    checkThrow(tk.tokenType !== tks.tkBtnPlural, \"Sz|we don't support variable names like buttons,btns\");\n    checkThrow(tk.tokenType !== tks.tkFld, \"Sy|we don't support variable names like field,fld\");\n    checkThrow(tk.tokenType !== tks.tkFldPlural, \"Sx|we don't support variable names like fields,flds\");\n    checkThrow(tk.tokenType !== tks.tkProductName, \"Su|we don't support variable names like hypercard,vipercard\");\n    checkThrow(tk.tokenType !== tks.tkAdjective, \"St|we don't support variable names like long,short,abbrev,abbr,abbreviated\");\n    checkThrow(\n        tk.tokenType !== tks.tkOrdinalOrPosition,\n        longstr(`Ss|we don't support variable names like last,\n         mid,middle,any,first,second,third,fourth,fifth,\n         sixth,seventh,eigth,ninth,tenth`)\n    );\n    checkThrow(\n        tk.tokenType !== tks.tkChunkGranularity,\n        \"Sq|we don't support variable names like characters,chars,words,items,lines\"\n    );\n    checkThrow(tk.tokenType !== tks.tkInOnly, \"Sp|we don't support variable names like in\");\n    checkThrow(tk.tokenType !== tks.tkOfOnly, \"So|we don't support variable names like of\");\n    checkThrow(tk.tokenType !== tks._not, \"Sn|we don't support variable names like not\");\n    checkThrow(tk.tokenType !== tks._there, \"Sm|we don't support variable names like there\");\n    checkThrow(tk.tokenType !== tks._is, \"Sl|we don't support variable names like is\");\n    checkThrow(tk.tokenType !== tks._no, \"Sk|we don't support variable names like no\");\n    checkThrow(tk.tokenType !== tks._and, \"Sj|we don't support variable names like and\");\n    checkThrow(tk.tokenType !== tks._or, \"Si|we don't support variable names like or\");\n    checkThrow(tk.tokenType !== tks._contains, \"Sh|we don't support variable names like contains\");\n    checkThrow(tk.tokenType !== tks._within, \"Sg|we don't support variable names like within\");\n    checkThrow(tk.tokenType !== tks._the, \"Sf|we don't support variable names like the\");\n    checkThrow(tk.tokenType !== tks._message, \"Se|we don't support variable names like msg,message\");\n    checkThrow(tk.tokenType !== tks._window, \"Sd|we don't support variable names like window\");\n    checkThrow(tk.tokenType !== tks._windows, \"Sc|we don't support variable names like windows\");\n    checkThrow(tk.tokenType !== tks._box, \"Sb|we don't support variable names like box\");\n    checkThrow(tk.tokenType !== tks._me, \"Sa|we don't support variable names like me\");\n    checkThrow(tk.tokenType !== tks._recent, \"SZ|we don't support variable names like recent\");\n    checkThrow(tk.tokenType !== tks._back, \"SY|we don't support variable names like back\");\n    checkThrow(tk.tokenType !== tks._forth, \"SX|we don't support variable names like forth\");\n    checkThrow(tk.tokenType !== tks._marked, \"SW|we don't support variable names like marked\");\n    checkThrow(tk.tokenType !== tks._to, \"SV|we don't support variable names like to\");\n    checkThrow(tk.tokenType !== tks._menuItem, \"SU|we don't support variable names like menuitems?\");\n    checkThrow(tk.tokenType !== tks._menu, \"ST|we don't support variable names like menu\");\n    checkThrow(tk.tokenType !== tks._id, \"SS|we don't support variable names like id\");\n    checkThrow(tk.tokenType !== tks._number, \"SR|we don't support variable names like number\");\n    checkThrow(tk.tokenType !== tks._selection, \"SQ|we don't support variable names like selection\");\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcProcessBranchAndLoops.ts",
    "content": "\n/* auto */ import { CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { VpcCodeLine, VpcCodeLineReference, VpcLineCategory } from './vpcPreparseCommon';\n/* auto */ import { checkThrow, checkThrowEq, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { MapKeyToObject, arLast, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * in BranchProcessing we collect and validate the hierarchical structure of code,\n * e.g. collecting all of the if/else lines so that goto points can be set,\n * and making sure that every opening 'if' has a matching 'end if' at the same hierarchical level.\n *\n * we'll create a BranchBlockInfo for each block to track related lines in the block\n * and we'll fill out a handlers object marking where all the handlers are\n */\nexport class BranchProcessing {\n    constructor(protected idGen: CountNumericId) {}\n\n    /* marking where all the handlers are */\n    handlers = new MapKeyToObject<VpcCodeLineReference>();\n\n    /* current hierarchical level stored in a stack; push onto and pop off from */\n    stack: BranchBlockInfo[] = [];\n\n    /**\n     * you typed 'exit repeat', walk up the stack to find which loop this is exiting from\n     */\n    protected findCurrentLoop() {\n        for (let i = this.stack.length - 1; i >= 0; i--) {\n            if (this.stack[i].cat === VpcLineCategory.RepeatForever) {\n                return this.stack[i];\n            }\n        }\n\n        checkThrow(false, `5r|cannot call 'exit repeat' or 'next repeat' outside of a loop`);\n    }\n\n    /**\n     * you typed 'exit mouseUp', the handler must always be at the bottom of the stack\n     */\n    protected findCurrentHandler(): BranchBlockInfo {\n        checkThrowEq(VpcLineCategory.HandlerStart, this.stack[0].cat, `7>|could not find current handler`);\n        return this.stack[0];\n    }\n\n    /**\n     * call this when finished with a block, like after an 'end if'\n     */\n    protected finalizeBlock() {\n        let topOfStack = arLast(this.stack);\n        let references = topOfStack.relevantLines.map(ln => new VpcCodeLineReference(ln));\n        for (let i = 0, len = topOfStack.relevantLines.length; i < len; i++) {\n            let line = topOfStack.relevantLines[i];\n            line.blockInfo = references;\n        }\n\n        this.stack.pop();\n    }\n\n    /**\n     * hierarchical level should be down to 0 at the end.\n     */\n    ensureComplete() {\n        checkThrowEq(0, this.stack.length, `7=|missing 'end myHandler' at end of script.`);\n    }\n\n    /**\n     * process one line.\n     */\n    go(line: VpcCodeLine) {\n        if (this.stack.length === 0 && line.ctg !== VpcLineCategory.HandlerStart) {\n            checkThrow(false, `5q|code outside function? only 'on mouseup' and 'function myfunction' can exist at this scope`);\n        } else if (this.stack.length > 0 && line.ctg === VpcLineCategory.HandlerStart) {\n            checkThrow(false, `5p|cannot begin a handler inside an existing handler`);\n        }\n\n        switch (line.ctg) {\n            case VpcLineCategory.RepeatForever /* fall-through */:\n                this.stack.push(new BranchBlockInfo(VpcLineCategory.RepeatForever, line));\n                break;\n            case VpcLineCategory.RepeatNext: /* fall-through */\n            case VpcLineCategory.RepeatExit: {\n                let tracking = this.findCurrentLoop();\n                tracking.add(line);\n                break;\n            }\n            case VpcLineCategory.RepeatEnd: {\n                checkThrow(\n                    this.stack.length && VpcLineCategory.RepeatForever === arLast(this.stack).cat,\n                    `7<|cannot \"end repeat\" interleaved within some other block.`\n                );\n                arLast(this.stack).add(line);\n                this.finalizeBlock();\n                break;\n            }\n            case VpcLineCategory.IfStart:\n                this.stack.push(new BranchBlockInfo(VpcLineCategory.IfStart, line));\n                break;\n            case VpcLineCategory.IfElsePlain:\n                checkThrow(\n                    this.stack.length && VpcLineCategory.IfStart === arLast(this.stack).cat,\n                    `S*|cannot have an \"else\" interleaved within some other block.`\n                );\n                arLast(this.stack).add(line);\n                break;\n            case VpcLineCategory.IfEnd:\n                checkThrow(\n                    this.stack.length && VpcLineCategory.IfStart === arLast(this.stack).cat,\n                    `7;|cannot have an \"endif\" interleaved within some other block.`\n                );\n                arLast(this.stack).add(line);\n                this.finalizeBlock();\n                break;\n            case VpcLineCategory.HandlerStart:\n                this.stack.push(new BranchBlockInfo(VpcLineCategory.HandlerStart, line));\n                break;\n            case VpcLineCategory.HandlerEnd: {\n                let topOfStack = arLast(this.stack);\n                checkThrowEq(\n                    VpcLineCategory.HandlerStart,\n                    topOfStack.cat,\n                    `7/|cannot have an \"end myHandler\" interleaved within some other block.`\n                );\n                topOfStack.add(line);\n                this.checkStartAndEndMatch(topOfStack.relevantLines);\n                let firstName = topOfStack.relevantLines[0].excerptToParse[1].image;\n\n                /* call add() so that we'll throw if there is a duplicate */\n                this.handlers.add(firstName, new VpcCodeLineReference(topOfStack.relevantLines[0]));\n                this.finalizeBlock();\n                break;\n            }\n            case VpcLineCategory.HandlerExit: /* fall-through */\n            case VpcLineCategory.HandlerPass: {\n                /* if we're in \"on mouseup\", it's illegal to say \"exit otherHandler\" */\n                let currentHandlerStart = this.findCurrentHandler().relevantLines[0];\n                checkThrow(currentHandlerStart.excerptToParse.length > 1, '7.|expected on myHandler, not found');\n                let currentHandlerName = currentHandlerStart.excerptToParse[1].image;\n                let gotName = line.excerptToParse[1].image;\n                checkThrowEq(\n                    gotName,\n                    currentHandlerName,\n                    '7-|we are in handler but got exit otherHandler',\n                    currentHandlerName,\n                    gotName\n                );\n                break;\n            }\n            case VpcLineCategory.Invalid:\n                checkThrowInternal(false, '5o|should not have this line category');\n                break;\n            default:\n                break;\n        }\n    }\n\n    /**\n     * on mouseUp must end with end mouseUp, and so on.\n     */\n    checkStartAndEndMatch(lines: VpcCodeLine[]) {\n        checkThrow(lines[0].excerptToParse.length > 1, '7,|on myHandler, missing name of handler');\n        let firstname = lines[0].excerptToParse[1].image;\n        let lastline = arLast(lines);\n        checkThrow(lastline.excerptToParse.length > 1, '7+|end myHandler, missing name of handler');\n        let lastname = lastline.excerptToParse[1].image;\n        checkThrowEq(\n            lastname,\n            firstname,\n            longstr(\n                `7*|handler names mismatch. start with with\n                \"on ${firstname}\" ended with \"end ${lastname}\"`\n            )\n        );\n    }\n}\n\n/**\n * remember the entrance/exit points of a block\n * we'll use this to set the blockInformation for these lines,\n * so that e.g. a loop knows which offset to go back up to.\n */\nclass BranchBlockInfo {\n    constructor(public readonly cat: VpcLineCategory, firstline?: VpcCodeLine) {\n        if (firstline) {\n            this.add(firstline);\n        }\n    }\n\n    add(line: VpcCodeLine) {\n        this.relevantLines.push(line);\n    }\n\n    relevantLines: VpcCodeLine[] = [];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcRewritesCommands.ts",
    "content": "\n/* auto */ import { BuildFakeTokens, ChvITk, tks } from './../codeparse/vpcTokens';\n/* auto */ import { VpcRewritesLoops } from './vpcRewritesLoops';\n/* auto */ import { VpcSuperRewrite } from './vpcRewritesGlobal';\n/* auto */ import { checkCommonMistakenVarNames } from './vpcPreparseCommon';\n/* auto */ import { VpcTool, VpcVisualEffectType, VpcVisualEffectTypeDestination, VpcVisualEffectTypeDirection, checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { ChunkResolutionSort } from './../vpcutils/vpcChunkResolutionSort';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { arLast, findStrToEnum, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * SyntaxRewriter rewrites syntax for some lines:\n    1) To minimize number of tokens needed in the lexer (for faster lexing)\n        for example:\n        ask line 2 of x with \"defaultText\"\n        we could make 'with' a token so that it wouldn't get lumped into the expression line 2 of x.\n        but we want to minimze number of tokens.\n        so instead, during codepreparse, if the command is ask, replace any tokens that are exactly 'with'.\n        ask line 2 of x $syntaxmarker$ \"defaultText\"\n        a $syntaxmarker$ is never part of an expression, and so the parser has no difficulty.\n    2) To transform \"repeat with x=1 to 5\" into a \"repeat while\" loop with the same functionality\n    3) To simplify parsing for a few commands\n */\n\n/**\n * important:\n * replacements must be in raw form!\n * you shouldn't write\n *      'put 3 into x'\n * you should write\n *      'put 3 %INTO% x'\n * since that's what the put-rewriter would do.\n *\n * we will do a final pass for custom functions,\n * but everything else needs to be output in finished form here.\n */\nexport class VpcRewriteForCommands {\n    constructor(protected rw: VpcSuperRewrite) {}\n    rewriteAnswer(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'T1|not enough args');\n        if (line[1].image === 'file' || line[1].image === 'program') {\n            return [this.hBuildNyi('answer ' + line[1].image, line[0])];\n        }\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'with', false);\n        return [line];\n    }\n    rewriteAsk(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'T0|not enough args');\n        if (line[1].image === 'file' || line[1].image === 'program') {\n            return [this.hBuildNyi('ask ' + line[1].image, line[0])];\n        }\n\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'password', false, ',');\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'with', false);\n        return [line];\n    }\n    rewriteChoose(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S~|not enough args');\n\n        /* delete \"tool\" */\n        let found = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'tool');\n        checkThrow(found !== -1, \"S}|expected to see something like 'choose brush tool'\");\n        line.splice(found, 1);\n\n        /* turn \"spray can\" into \"spray\" */\n        found = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'can');\n        if (found !== -1 && found !== 0) {\n            if (line[found - 1].image === 'spray') {\n                line.splice(found, 1);\n            }\n        }\n\n        /* turn \"round rect\" into \"round\" */\n        found = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'rect');\n        if (found !== -1 && found !== 0) {\n            if (line[found - 1].image === 'round') {\n                line.splice(found, 1);\n            }\n        }\n\n        /* turn \"reg poly\" into \"reg\", \"regular poly\" into \"regular\" */\n        found = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'poly');\n        if (found !== -1 && found !== 0) {\n            if (line[found - 1].image === 'reg' || line[found - 1].image === 'regular') {\n                line.splice(found, 1);\n            }\n        }\n\n        /* turn \"reg polygon\" into \"reg\", \"regular polygon\" into \"regular\" */\n        found = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'polygon');\n        if (found !== -1 && found !== 0) {\n            if (line[found - 1].image === 'reg' || line[found - 1].image === 'regular') {\n                line.splice(found, 1);\n            }\n        }\n\n        /* turn any plain identifiers that are valid VpcTools into string literals */\n        for (let i = 0; i < line.length; i++) {\n            let im = line[i].image;\n            let en = findStrToEnum<VpcTool>(VpcTool, im);\n            if (en !== undefined) {\n                line[i] = BuildFakeTokens.makeStringLiteral(line[i], im);\n            }\n        }\n\n        return [line];\n    }\n    rewriteClick(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'with', false);\n        return [line];\n    }\n    rewriteClose(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the close command', line[0])];\n    }\n    rewriteCommandkeydown(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the commandKeyDown command', line[0])];\n    }\n    rewriteConvert(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the convert command', line[0])];\n    }\n    rewriteCopy(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the copy command', line[0])];\n    }\n    rewriteCreate(line: ChvITk[]): ChvITk[][] {\n        return [\n            this.hBuildNyi(\n                longstr(`the create command. Note: use 'doMenu\n                    \"Create Button\"' to create a button and\n                    'doMenu \"Create Field\"' to create a field.`),\n                line[0]\n            )\n        ];\n    }\n    rewriteDebug(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the debug command', line[0])];\n    }\n    rewriteDelete(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'Vc|not enough args');\n        if (\n            line[1]?.tokenType === tks.tkChunkGranularity ||\n            (line[1]?.tokenType === tks.tkOrdinalOrPosition && line[2]?.tokenType === tks.tkChunkGranularity) ||\n            (line[1]?.tokenType === tks._the &&\n                line[2]?.tokenType === tks.tkOrdinalOrPosition &&\n                line[3]?.tokenType === tks.tkChunkGranularity)\n        ) {\n            return this.hReturnNyiIfMenuMentionedOutsideParens(line);\n        } else {\n            /* rewrite to internalvpcdeletevelhelper */\n            return this.rw.gen(`internalvpcdeletevelhelper the internalid of %ARG0% , the short id of %ARG0%`, line[0], [\n                line.slice(1)\n            ]);\n        }\n    }\n    rewriteDisable(line: ChvITk[]): ChvITk[][] {\n        return this.hReturnNyiIfMenuMentionedOutsideParens(line);\n    }\n    rewriteDivide(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'by', true);\n        return [line];\n    }\n    rewriteDo(line: ChvITk[]): ChvITk[][] {\n        let template = `send \"do\" ( %ARG0% ) to me`;\n        return this.rw.gen(template, line[0], [line.slice(1)]);\n    }\n    rewriteDoMenu(line: ChvITk[]): ChvITk[][] {\n        /* doMenu is implemented in standardlib,\n        it's just like any user handler. */\n        let allImages = line.map(t => t.image).join('***') + '***';\n        if (allImages.includes('***with***keys***')) {\n            return [this.hBuildNyi('doMenu with keys', line[0])];\n        } else if (allImages.includes('***without***dialog***')) {\n            return [this.hBuildNyi('doMenu without dialog', line[0])];\n        } else {\n            return [line];\n        }\n    }\n    rewriteDrag(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'with', false);\n        return [line];\n    }\n    rewriteEdit(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the edit command', line[0])];\n    }\n    rewriteEnable(line: ChvITk[]): ChvITk[][] {\n        return this.hReturnNyiIfMenuMentionedOutsideParens(line);\n    }\n    rewriteExport(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the export command', line[0])];\n    }\n    rewriteExit(line: ChvITk[]): ChvITk[][] {\n        /* remove the 'to' for easier parsing later */\n        checkThrow(line.length > 1, 'S||exit: not enough args');\n        if (line[1].image === 'to') {\n            line.splice(1, 1);\n        }\n        return [line];\n    }\n    rewriteFind(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the find command', line[0])];\n    }\n    rewriteGet(line: ChvITk[]): ChvITk[][] {\n        let template = `put ( %ARG0% ) %INTO% it`;\n        return this.rw.gen(template, line[0], [line.slice(1)]);\n    }\n    rewriteGo(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, \"8k|can't have just 'go' on its own. try 'go next' or 'go prev' \");\n        /* remove the \"to\" */\n        if (line[1].image === 'to') {\n            line.splice(1, 1);\n        }\n\n        let shouldSuspendHistory = '\"\"';\n        if (line[1].image === 'back' || line[1].image === 'recent') {\n            shouldSuspendHistory = '\"applyback\"';\n        } else if (line[1].image === 'forth') {\n            shouldSuspendHistory = '\"applyforth\"';\n        }\n\n        let allImages = line.map(t => t.image).join('***') + '***';\n        if (allImages.includes('***new***window***')) {\n            return [this.hBuildNyi(`go to new window`, line[0])];\n        } else if (allImages.includes('***without***dialog***')) {\n            return [this.hBuildNyi(`go without dialog`, line[0])];\n        }\n\n        let template = '';\n        if (line.length === 2 && line[1].tokenType === tks.tkOrdinalOrPosition) {\n            template = `\nif there is a %ARG0% card then\n    internalvpcmovecardhelper ( the internalid of %ARG0% card ) , ${shouldSuspendHistory}\nelse\n    internalvpcmovecardhelper -1000 , ${shouldSuspendHistory}\nend if`;\n        } else {\n            /* the id might refer to a bg or stack, we will correctly handle that.\n            also note that `the id of back` is correctly understood. */\n            template = `\nif there is a %ARG0% then\n    internalvpcmovecardhelper  ( the internalid of %ARG0% ) , ${shouldSuspendHistory}\nelse\n    internalvpcmovecardhelper -1000 , ${shouldSuspendHistory}\nend if`;\n        }\n        return this.rw.gen(template, line[0], [line.slice(1)]);\n    }\n    rewriteHide(line: ChvITk[]): ChvITk[][] {\n        return this.hReturnNyiIfMenuMentionedOutsideParens(line);\n    }\n    rewriteImport(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the import command', line[0])];\n    }\n    rewriteKeydown(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the keydown command', line[0])];\n    }\n    rewriteLock(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length === 2, \"S{|we only support 'lock screen'\");\n        if (line[1].image !== 'screen') {\n            return [this.hBuildNyi('any type of unlock besides unlock screen', line[0])];\n        } else {\n            /* make it just \"lock\" */\n            return [[line[0]]];\n        }\n    }\n    rewriteMark(line: ChvITk[], fromUnmark = false): ChvITk[][] {\n        checkThrow(line.length > 1, 'Vb|not enough args for mark/unmark.');\n        let isAll = false;\n        if (line[1].image === 'cards') {\n            if (line[2].image === 'where') {\n                return this.hBuildMarkExpression(line.slice(3), fromUnmark);\n            } else {\n                return [this.hBuildNyi('this type of mark expression', line[0])];\n            }\n        } else if (line[1].image === 'all') {\n            if (line[2].image === 'cards' || line[2].image === 'cds') {\n                isAll = true;\n            } else {\n                checkThrow(false, 'Va|expected mark all cards');\n            }\n        }\n\n        let ret: ChvITk[] = [this.rw.tokenFromEnglishTerm('mark', line[0])];\n        if (fromUnmark) {\n            ret.push(this.rw.tokenFromEnglishTerm('not', line[0]));\n        }\n\n        if (isAll) {\n            ret.push(line[1]);\n        } else {\n            ret.push(BuildFakeTokens.makeSyntaxMarker(line[0]));\n            ret = ret.concat(line.slice(1));\n        }\n        return [ret];\n    }\n    rewriteMultiply(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'by', true);\n        return [line];\n    }\n    rewritePass(line: ChvITk[]): ChvITk[][] {\n        /* add a return statement afterwards, solely to make code exec simpler. */\n        return this.rw.gen(\n            `%ARG0%\nreturn 0`,\n            line[0],\n            [line]\n        );\n    }\n    rewritePop(line: ChvITk[]): ChvITk[][] {\n        /* two forms: only one actually moves it */\n        checkThrow(line.length >= 2, 'S_|not enough args');\n        checkThrowEq(tks.tkCard, line[1], 'S^|must be pop *card*');\n        if (line.length === 2) {\n            return this.rw.gen('pop true', line[0]);\n        } else {\n            let newCode = `\npop false\nput the result %ARG0%`;\n            let gen = this.rw.gen(newCode, line[0], [line.slice(2)]);\n            let fixedPut = this.rewritePut(gen[1]);\n            return [gen[0], fixedPut[0]];\n        }\n    }\n    rewritePlay(line: ChvITk[]): ChvITk[][] {\n        /* everything must be a <HAnyAllowedVariableName> | tkStringLiteral | tkNumLiteral,\n        but we'll let the parser take care of that. put a tkSyntaxMarker between each.  */\n        let newLine: ChvITk[] = [line[0]];\n        for (let i = 1; i < line.length; i++) {\n            checkThrow(\n                line[i].tokenType !== tks.tkLParen && line[i].tokenType !== tks.tkRParen,\n                \"we don't support expressions here\"\n            );\n            newLine.push(line[i]);\n            newLine.push(BuildFakeTokens.makeSyntaxMarker(line[0]));\n        }\n\n        return [newLine];\n    }\n    rewritePush(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length === 2, 'S]|expect 2 args');\n        checkThrowEq(tks.tkCard, line[1], 'S[|must be push *card*');\n        return this.rw.gen('push \"card\"', line[0]);\n    }\n    rewritePut(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S@|not enough args');\n\n        let foundPreposition = -1;\n        for (let i = 0; i < line.length; i++) {\n            let tk = line[i];\n            if (tk.image === 'into' || tk.image === 'before' || tk.image === 'after') {\n                checkThrowEq(-1, foundPreposition, '5#|expected to only see one of into, before, or after...');\n                foundPreposition = i;\n            }\n        }\n\n        if (foundPreposition !== -1) {\n            /* let's say you don't realize that \"length\" is a reserved word,\n            and you try to use it as a variable. \"put 4 into length\"\n            you'd get the error message NotAllInputParsed exception,\n            which doesn't make too much sense, let's try to give you a better error message */\n            if (arLast(line).tokenType !== tks._selection) {\n                checkCommonMistakenVarNames(arLast(line));\n            }\n        } else {\n            /* you can say `put 1+1` to add to the message box */\n            foundPreposition = line.length;\n            line.push(this.rw.tokenFromEnglishTerm('into', line[0]));\n            line.push(this.rw.tokenFromEnglishTerm('msg', line[0]));\n            line.push(this.rw.tokenFromEnglishTerm('box', line[0]));\n        }\n\n        /* transform to put \"abc\" (TkSyntaxMarker) into (TkSyntaxMarker) x */\n        line.splice(foundPreposition + 1, 0, BuildFakeTokens.makeSyntaxMarker(line[0]));\n        line.splice(foundPreposition, 0, BuildFakeTokens.makeSyntaxMarker(line[0]));\n        return [line];\n    }\n    rewriteRead(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the read command', line[0])];\n    }\n    rewriteReplace(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'with', true);\n        return [line];\n    }\n    rewriteReply(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the reply command', line[0])];\n    }\n    rewriteRequest(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the request command', line[0])];\n    }\n    rewriteReset(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length === 2, \"S?|we only support 'reset paint\");\n        if (line[1].image !== 'paint') {\n            return [this.hBuildNyi('any type of unlock besides reset paint', line[0])];\n        } else {\n            return [line];\n        }\n    }\n    rewriteSend(line: ChvITk[]): ChvITk[][] {\n        line.splice(1, 0, BuildFakeTokens.makeStringLiteral(line[0], 'send'));\n        return [line];\n    }\n    rewriteSave(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the save command', line[0])];\n    }\n    rewriteSelect(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S>|not enough args');\n        if (line[1].image === 'empty') {\n            checkThrowEq(2, line.length, 'S=|select empty should be alone');\n            return [[line[0], BuildFakeTokens.makeStringLiteral(line[0], 'empty')]];\n        } else {\n            let startContainer = 1;\n            let ret = [line[0]];\n            let whereToSelect = 'all';\n            if (line[1].image === 'before') {\n                whereToSelect = 'before';\n                startContainer += 1;\n            } else if (line[1].image === 'after') {\n                whereToSelect = 'after';\n                startContainer += 1;\n            }\n\n            checkThrow(\n                line[startContainer].tokenType === tks.tkChunkGranularity || 'text' === line[startContainer].image,\n                'S<|incorrect syntax for select'\n            );\n            if ('text' === line[startContainer].image) {\n                startContainer += 1;\n                checkThrowEq('of', line[startContainer].image, \"S;|incorrect syntax for select, no 'of' seen\");\n                startContainer += 1;\n            }\n\n            let container = line.slice(startContainer);\n            ret.push(BuildFakeTokens.makeStringLiteral(line[0], whereToSelect));\n            return [ret.concat(container)];\n        }\n    }\n    rewriteShow(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'at', false);\n\n        for (let unsupportedTerm of ['all', 'menu', 'picture', 'window']) {\n            if (this.rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], unsupportedTerm) !== -1) {\n                return [this.hBuildNyi(`the show ${unsupportedTerm} command`, line[0])];\n            }\n        }\n        return [line];\n    }\n    rewriteSort(line: ChvITk[]): ChvITk[][] {\n        let allImages = line.map(t => t.image).join('***') + '***';\n        if (\n            allImages.startsWith('sort***cards') ||\n            allImages.startsWith('sort***cds') ||\n            allImages.startsWith('sort***marked***cards') ||\n            allImages.startsWith('sort***marked***cds')\n        ) {\n            return [this.hBuildNyi(`We don't yet support sorting by cards`, line[0])];\n        }\n\n        /* split off by */\n        let byPhrase: O<ChvITk[]>;\n        let byLvl0 = this.rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'by');\n        if (byLvl0 !== -1) {\n            byPhrase = line.slice(byLvl0 + 1);\n            line = line.slice(0, byLvl0);\n            checkThrow(byPhrase.length, \"S:|expect something like 'sort lines of x by char 1 of each'\");\n        }\n\n        /* go backwards and pick up sort options until we don't see the first that isn't one */\n        let sortOptions: { [key: string]: string } = {};\n        sortOptions['order'] = 'ascending';\n        sortOptions['method'] = 'text';\n\n        /* support old-style ones where ascending/descending could be anywhere*/\n        let found = this.rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'ascending');\n        if (found !== -1) {\n            sortOptions['order'] = 'ascending';\n            line.splice(found, 1);\n        }\n        found = this.rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'descending');\n        if (found !== -1) {\n            sortOptions['order'] = 'descending';\n            line.splice(found, 1);\n        }\n\n        /* check correct syntax */\n        checkThrow(\n            line.length >= 3 && line[1].tokenType === tks.tkChunkGranularity && line[2].image === 'of',\n            \"S/|expect something like 'sort lines of x'\"\n        );\n\n        /* look backwards for any keywords. */\n        let i = line.length - 1;\n        for (; i >= 0; i--) {\n            let t = line[i];\n            if (t.image === 'ascending' || t.image === 'descending') {\n                sortOptions['order'] = t.image;\n            } else if (t.image === 'text' || t.image === 'numeric' || t.image === 'international' || t.image === 'datetime') {\n                sortOptions['method'] = t.image;\n            } else {\n                break;\n            }\n        }\n\n        /* grab just the part before the options */\n        let template = longstr(\n            `sort\n            \"${sortOptions['method']}\"\n            \"${sortOptions['order']}\" %ARG0%`\n        );\n        if (!byPhrase) {\n            return this.rw.gen(template, line[0], [line.slice(1, i + 1)]);\n        } else {\n            let granularity = line[1];\n            let container = line.slice(3, i + 1);\n            let template = ChunkResolutionSort.writeCodeCustomSort(granularity.image, sortOptions);\n            let newcode = this.rw.gen(template, line[0], [container, byPhrase]);\n            /* expand the repeats in the new code, I'm too lazy to do this manually */\n            let ret: ChvITk[][] = [];\n            for (let line of newcode) {\n                if (line[0].image === 'repeat') {\n                    let newlines = VpcRewritesLoops.Go(line, this.rw);\n                    for (let newline of newlines) {\n                        if (newline[0].image === 'put') {\n                            ret = ret.concat(this.rewritePut(newline));\n                        } else {\n                            ret.push(newline);\n                        }\n                    }\n                } else {\n                    ret.push(line);\n                }\n            }\n\n            return ret;\n        }\n    }\n    rewriteStart(line: ChvITk[]): ChvITk[][] {\n        return this.hReturnNoOp(line);\n    }\n    rewriteStop(line: ChvITk[]): ChvITk[][] {\n        return this.hReturnNoOp(line);\n    }\n    rewriteSubtract(line: ChvITk[]): ChvITk[][] {\n        this.rw.replaceWithSyntaxMarkerAtLvl0(line, line[0], 'from', true);\n        return [line];\n    }\n    rewriteType(line: ChvITk[]): ChvITk[][] {\n        return [this.hBuildNyi('the type command', line[0])];\n    }\n    rewriteUnlock(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S.|not enough args');\n        if (line[1].image !== 'screen') {\n            return [this.hBuildNyi('any type of unlock besides unlock screen', line[0])];\n        } else if (line.length === 2) {\n            return [line];\n        } else {\n            /* strip any \"with\" */\n            let foundWith = this.rw.searchTokenGivenEnglishTerm(line, line[0], 'with');\n            if (foundWith !== -1) {\n                line.splice(foundWith, 1);\n            }\n\n            return this.hParseVisualEffect(line, 'unlock screen');\n        }\n    }\n    rewriteUnmark(line: ChvITk[]): ChvITk[][] {\n        return this.rewriteMark(line, true);\n    }\n    rewriteVisual(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S-|not enough args');\n        if (line[1].image !== 'effect') {\n            return [this.hBuildNyi('any type of visual besides visual effect', line[0])];\n        } else {\n            return this.hParseVisualEffect(line, 'visual effect');\n        }\n    }\n    rewriteWait(line: ChvITk[]): ChvITk[][] {\n        checkThrow(line.length > 1, 'S,|not enough args');\n        if (line[1].image === 'for') {\n            line.splice(1, 1);\n        }\n\n        if (line[1].image === 'until' || line[1].image === 'while') {\n            /* remember that the only type of repeat we can make is an unconditional one */\n            let isNegated = line[1].image === 'while' ? 'not' : '';\n            let template = `\nrepeat\n    if ${isNegated} ( %ARG0% ) then\n        exit repeat\n    end if\n    wait 100 \"ms\"\nend repeat`;\n            return this.rw.gen(template, line[0], [line.slice(2)]);\n        } else {\n            return [line];\n        }\n    }\n\n    /* interpret a visual effect, currently order doesn't matter */\n    hParseVisualEffect(line: ChvITk[], prefix: string) {\n        let opts: { [key: string]: string } = {};\n        opts['speed'] = '';\n        opts['method'] = '';\n        opts['direction'] = '';\n        opts['dest'] = 'card';\n        for (let t of line) {\n            if (t.image === 'slow' || t.image === 'slowly' || t.image === 'fast') {\n                opts['speed'] += t.image;\n            } else if (t.image === 'very') {\n                opts['speed'] = 'very' + opts['speed'];\n            } else {\n                let foundMethod = findStrToEnum<VpcVisualEffectType>(VpcVisualEffectType, t.image);\n                let foundDirection = findStrToEnum<VpcVisualEffectTypeDirection>(VpcVisualEffectTypeDirection, t.image);\n                let foundDest = findStrToEnum<VpcVisualEffectTypeDestination>(VpcVisualEffectTypeDestination, t.image);\n                if (foundMethod) {\n                    opts['method'] = t.image;\n                } else if (foundDirection) {\n                    opts['direction'] = t.image;\n                } else if (foundDest) {\n                    opts['dest'] = t.image;\n                } else if (t.image !== 'to' && t.image !== 'from' && t.image !== 'door' && t.image !== 'blinds') {\n                    checkThrow(false, 'S+|unknown visual effect term', t.image);\n                }\n            }\n        }\n\n        if (!opts['speed']) {\n            opts['speed'] = 'normal';\n        }\n\n        let template = longstr(\n            `${prefix} \"${opts['speed']}\"\n            \"${opts['method']}\" \"${opts['direction']}\" \"${opts['dest']}\" `\n        );\n\n        return this.rw.gen(template, line[0]);\n    }\n\n    /* doesn't produce a pre-parse error, produces a runtime error */\n    hBuildNyi(msg: string, basis: ChvITk) {\n        return [BuildFakeTokens.makeTk(basis, tks.tkIdentifier, 'errordialog'), BuildFakeTokens.makeStringLiteral(basis, msg)];\n    }\n\n    /* helper that builds an nyi if 'menu' is seen */\n    hReturnNyiIfMenuMentionedOutsideParens(line: ChvITk[]): ChvITk[][] {\n        let found = this.rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'menu');\n        if (found !== -1) {\n            return [this.hBuildNyi('deleting from a menu', line[0])];\n        } else {\n            return [line];\n        }\n    }\n\n    /* insert code that does nothing. leaving out the line entirely might destabalize syntax. */\n    hReturnNoOp(line: ChvITk[]): ChvITk[][] {\n        let template = `put \"no-op\" %INTO% c%UNIQUE% `;\n        return this.rw.gen(template, line[0]);\n    }\n\n    /* build a mark expression in software */\n    hBuildMarkExpression(expression: ChvITk[], fromUnmark: boolean): ChvITk[][] {\n        /* can't put this in standardlib, it needs \"each\" access */\n        /* go to each card, so that bg field accesses work */\n        checkThrow(expression?.length, 'VZ|requires expression');\n        let code = `\nput the short id of this cd into prevCard%UNIQUE%\nput 1 into i%UNIQUE%\nrepeat\n    go cd i%UNIQUE%\n    if ( %ARG0% ) then\n        set the marked of this cd to true\n    else\n        set the marked of this cd to false\n    end if\n    add 1 to i%UNIQUE%\n    if i%UNIQUE% > the number of cds then\n        exit repeat\n    end if\nend repeat\ngo cd id prevCard%UNIQUE%\n        `;\n        return this.rw.gen(code, expression[0], [expression]);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcRewritesConditions.ts",
    "content": "\n/* auto */ import { ChvITk } from './../codeparse/vpcTokens';\n/* auto */ import { VpcSuperRewrite } from './vpcRewritesGlobal';\n/* auto */ import { checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { arLast } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * in the original product you can write a one-line if like this,\n *       'if true then put 1+1 into x'\n * it is convenient, so I suppose I will support it.\n * let's split it into different lines so it's easier to parse.\n * verified by both unit tests and vpcTestScriptExtensive.ts\n */\nexport class VpcSplitSingleLineIf {\n    holdingFromBefore: O<ChvITk[]>;\n    _classify(line: ChvITk[], rw: VpcSuperRewrite): [IfTypes, number, number] {\n        if (line[0].image === 'if') {\n            let findThen = rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'then');\n            checkThrow(findThen !== -1, 'TE|if statement, no \"then\" found');\n            if (findThen === line.length - 1) {\n                return [IfTypes.ifnormal, -1, -1];\n            } else {\n                return [IfTypes.ifnormal, findThen, findThen];\n            }\n        } else if (line.length >= 2 && line[0].image === 'else' && line[1].image === 'if') {\n            let findThen = rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'then');\n            checkThrow(findThen !== -1, 'TD|elseif statement, no \"then\" found');\n            if (findThen === line.length - 1) {\n                return [IfTypes.elseifnormal, -1, -1];\n            } else {\n                return [IfTypes.elseif_jammed, findThen, findThen];\n            }\n        } else if (line[0].image === 'else') {\n            if (line.length === 1) {\n                return [IfTypes.elsenormal, -1, -1];\n            } else {\n                checkThrow(line[1].image !== 'then', \"TC|use 'else', not 'else then'\");\n                return [IfTypes.else_jammed, 0, 0];\n            }\n        } else {\n            return [IfTypes.other, -1, -1];\n        }\n    }\n\n    go(line: ChvITk[], rw: VpcSuperRewrite): ChvITk[][] {\n        let ret: ChvITk[][] = [];\n        let got = this._classify(line, rw);\n        let type = got[0];\n        let cutStart = got[1];\n        let cutEnd = got[2];\n        if (this.holdingFromBefore) {\n            if (type === IfTypes.else_jammed || type === IfTypes.elseif_jammed) {\n                /* defer the endif until later */\n            } else if (type === IfTypes.elsenormal || type === IfTypes.elseifnormal) {\n                /* it will have it's own end if */\n                this.holdingFromBefore = undefined;\n            } else {\n                ret.push(this.holdingFromBefore);\n                this.holdingFromBefore = undefined;\n            }\n        }\n\n        if (cutStart !== -1) {\n            let firstPart = line.slice(0, cutStart + 1);\n            let secondPart = line.slice(cutEnd + 1);\n            ret.push(firstPart);\n            if (secondPart.length) {\n                ret.push(secondPart);\n            }\n\n            let endif = rw.gen('end if', line[0])[0];\n            if (type === IfTypes.else_jammed) {\n                ret.push(endif);\n                this.holdingFromBefore = undefined;\n            } else {\n                this.holdingFromBefore = endif;\n            }\n\n            return ret;\n        } else {\n            /* already on different lines, we are fine */\n            ret.push(line);\n            return ret;\n        }\n    }\n}\n\n/* \"jammed\" is a single-line case\nwhere you have both a condition and a statement on the same line. */\nenum IfTypes {\n    other = 1,\n    ifnormal,\n    if_jammed,\n    elseifnormal,\n    elseif_jammed,\n    elsenormal,\n    else_jammed\n}\n\n/**\n * get rid of else-if clauses, mostly because they don't support custom function calls\n * (which we expand onto multiple lines)\n * also, at runtime, an else-if requires the framestack to hold more state\n * (remembering if a clause has been taken) so it's more complex.\n * verified by both unit tests and vpcTestScriptExtensive.ts\n */\nexport const VpcRewriteNoElseIfClauses = /* static class */ {\n    /**\n     * we'll build the code into a tree structure,\n     * then walk the tree recursively to flatten it.\n     */\n    go(tree: NoElseIfClausesTreeBuilder, rw: VpcSuperRewrite) {\n        let ret: ChvITk[][] = [];\n        this._flattenTreeRecurse(tree.root, rw, ret);\n        return ret;\n    },\n\n    _isLineEndIf(l: ChvITk[]) {\n        return l.length === 2 && l[0].image === 'end' && l[1].image === 'if';\n    },\n\n    _isLineIf(l: ChvITk[]) {\n        if (l.length >= 1 && l[0].image === 'if') {\n            checkThrow(l.length >= 3, \"TB|expect line starting with if to be 'if condition then'\");\n            checkThrowEq('then', arLast(l).image, \"TA|expect line starting with else to be 'if condition *then*'\");\n            return l.slice(1, -1);\n        }\n\n        return undefined;\n    },\n\n    _isLineElsePlain(l: ChvITk[]) {\n        return l.length === 1 && l[0].image === 'else';\n    },\n\n    _isLineElseCondition(l: ChvITk[]) {\n        if (l.length > 1 && l[0].image === 'else') {\n            checkThrow(l.length >= 4, \"T9|expect line starting with else to be 'else if condition then'\");\n            checkThrowEq('if', l[1].image, \"T8|expect line starting with else to be 'else *if* condition then'\");\n            checkThrowEq('then', arLast(l).image, \"T7|expect line starting with else to be 'else if condition *then*'\");\n            return l.slice(2, -1);\n        }\n        return undefined;\n    },\n\n    /**\n     * flatten the tree, and while doing so,\n     * write out the clauses as separate if statements.\n     */\n    _flattenTreeRecurse(node: IfConstruct, rw: VpcSuperRewrite, output: ChvITk[][]) {\n        let numberOfEndIfsNeeded = 0;\n        if (!node.isRoot) {\n            let firstLine = rw.gen('if %ARG0% then', node.clauses[0].condition[0], [node.clauses[0].condition]);\n            output.push(firstLine[0]);\n            numberOfEndIfsNeeded = 1;\n        }\n        for (let clause of node.clauses) {\n            if (!clause.isFirst) {\n                if (clause.condition.length) {\n                    output.push([rw.tokenFromEnglishTerm('else', node.clauses[0].condition[0])]);\n                    let line = rw.gen('if %ARG0% then', clause.condition[0], [clause.condition]);\n                    output.push(line[0]);\n                    numberOfEndIfsNeeded += 1;\n                } else {\n                    output.push([rw.tokenFromEnglishTerm('else', node.clauses[0].condition[0])]);\n                }\n            }\n            for (let item of clause.children) {\n                if (item instanceof IfConstruct) {\n                    this._flattenTreeRecurse(item, rw, output);\n                } else {\n                    output.push(item);\n                }\n            }\n        }\n\n        for (let i = 0; i < numberOfEndIfsNeeded; i++) {\n            output.push([\n                rw.tokenFromEnglishTerm('end', node.clauses[0].condition[0]),\n                rw.tokenFromEnglishTerm('if', node.clauses[0].condition[0])\n            ]);\n        }\n    }\n};\n\nclass IfConstructClause {\n    children: (ChvITk[] | IfConstruct)[] = [];\n    constructor(public condition: ChvITk[], public isFirst: boolean) {}\n}\n\nclass IfConstruct {\n    clauses: IfConstructClause[];\n    hasSeenPlainElse = false;\n    isRoot = false;\n    constructor(public parent: O<IfConstruct>) {}\n}\n\n/**\n * make a tree, where each if statement has clauses,\n * and each clause has either lines of code or if statements.\n * no transformations applied yet - the IfConstruct\n * will match 1-1 with the input code\n */\nexport class NoElseIfClausesTreeBuilder {\n    root = new IfConstruct(undefined);\n    current = this.root;\n    constructor() {\n        this.root.isRoot = true;\n        this.root.clauses = [new IfConstructClause([], true)];\n    }\n\n    addLine(line: ChvITk[]) {\n        let arisLineIf = VpcRewriteNoElseIfClauses._isLineIf(line);\n        let arisLineElseCondition = VpcRewriteNoElseIfClauses._isLineElseCondition(line);\n        if (arisLineIf) {\n            let clause = new IfConstructClause(arisLineIf, true);\n            let construct = new IfConstruct(this.current);\n            construct.clauses = [clause];\n            arLast(this.current.clauses).children.push(construct);\n            this.current = construct;\n        } else if (arisLineElseCondition) {\n            checkThrow(!this.current.isRoot, 'T6|else outside of if?');\n            checkThrow(!this.current.hasSeenPlainElse, \"T5|can't have conditional else after plain else\");\n            let clause = new IfConstructClause(arisLineElseCondition, false);\n            this.current.clauses.push(clause);\n        } else if (VpcRewriteNoElseIfClauses._isLineElsePlain(line)) {\n            checkThrow(!this.current.isRoot, 'T4|else outside of if?');\n            checkThrow(!this.current.hasSeenPlainElse, \"T3|can't have two plain elses\");\n            this.current.hasSeenPlainElse = true;\n            let clause = new IfConstructClause([], false);\n            this.current.clauses.push(clause);\n        } else if (VpcRewriteNoElseIfClauses._isLineEndIf(line)) {\n            checkThrow(!this.current.isRoot && this.current.parent, \"T2|can't have an end if outside of if\");\n            this.current = this.current.parent;\n        } else {\n            arLast(this.current.clauses).children.push(line);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcRewritesCustomFunctions.ts",
    "content": "\n/* auto */ import { CodeLimits, CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk, isTkType, tks } from './../codeparse/vpcTokens';\n/* auto */ import { VpcSuperRewrite } from './vpcRewritesGlobal';\n/* auto */ import { LoopLimit } from './vpcPreparseCommon';\n/* auto */ import { checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './vpcCheckReserved';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { ValHolder, assertEq } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * if a function call occurs inside an expression, we pull it outside:\n\n    put 2 * mycustomfunc(5 + mycustomfunc(7 + sin(x))) into x\n\n        -->\n\n    mycustomfunc(7 + sin(x))\n    put the result into tmp001\n    put 2 * mycustomfunc(5 + tmp001) into x\n\n        -->\n\n    mycustomfunc(7 + sin(x))\n    put the result into tmp001\n    mycustomfunc(5 + tmp001)\n    put the result into tmp002\n    put 2 * tmp002 into x\n */\nexport class ExpandCustomFunctions {\n    protected skipExpansion: { [key: string]: boolean } = {};\n    protected rw: VpcSuperRewrite;\n    constructor(protected idgenThisScript: CountNumericId, protected check: CheckReservedWords) {\n        /* we don't need to check for fn calls if the line starts with any of these symbols. */\n        this.skipExpansion['global'] = true;\n        this.skipExpansion['next'] = true;\n        this.skipExpansion['exit'] = true;\n        this.skipExpansion['else'] = true;\n        this.skipExpansion['end'] = true;\n        this.skipExpansion['on'] = true;\n        this.skipExpansion['function'] = true;\n        this.skipExpansion['pass'] = true;\n\n        this.rw = new VpcSuperRewrite(idgenThisScript);\n    }\n\n    /* expand function call in this line\n    returns a list of resulting lines, since the result could be many lines */\n    go(line: ChvITk[]): ChvITk[][] {\n        if (this.supportsCustomFnExpansion(line)) {\n            return this.goImpl(line);\n        } else {\n            return [line];\n        }\n    }\n\n    /**\n     * does this line support expansion?\n     */\n    protected supportsCustomFnExpansion(line: ChvITk[]) {\n        return line.length > 0 && !this.skipExpansion[line[0].image];\n    }\n\n    /**\n     * find a function call within interval [start, end)\n     */\n    findAFunctionCall(\n        ln: ChvITk[],\n        start: number,\n        end: number,\n        filterCalls: (n: number, s: string) => boolean\n    ): O<[number, number]> {\n        /* function call has TkIdentifier, LParen, then a RParen at the same level */\n        /* find a TkIdentifier next to a LParen */\n        let foundCall = -1;\n        for (let i = start; i < end - 1; i++) {\n            if (\n                ln[i] &&\n                isTkType(ln[i], tks.tkIdentifier) &&\n                ln[i + 1] &&\n                isTkType(ln[i + 1], tks.tkLParen) &&\n                filterCalls(i, ln[i].image)\n            ) {\n                foundCall = i;\n                break;\n            }\n        }\n\n        if (foundCall !== -1) {\n            /* find the closing paren */\n            let level = 0;\n            let foundEnd = -1;\n            for (let i = foundCall; i < end; i++) {\n                if (isTkType(ln[i], tks.tkLParen)) {\n                    level++;\n                } else if (isTkType(ln[i], tks.tkRParen)) {\n                    level--;\n                    if (level === 0) {\n                        foundEnd = i;\n                        break;\n                    }\n                }\n            }\n\n            checkThrow(foundEnd !== -1, '8Q|missing ) for function call?', ln[foundCall].image);\n            return [foundCall, foundEnd + 1];\n        }\n\n        return undefined;\n    }\n\n    /**\n     * find all the custom function calls and put them on separate lines!\n     */\n    protected goImpl(line: ChvITk[]) {\n        let ret: ChvITk[][] = [];\n        let limit = new LoopLimit(CodeLimits.MaxCustomFnCallsAllowedInLine, 'maxCustomFnCallsAllowedInLine');\n        let cantUseYetAr = new ValHolder<{ [key: number]: boolean }>({});\n        while (limit.next()) {\n            /* look for a custom function call */\n            let isPotentialUserFn = (n: number, s: string) => !cantUseYetAr.val[n] && this.check.potentialUserFn(s);\n            let found = this.findAFunctionCall(line, 1, line.length, isPotentialUserFn);\n            if (!found) {\n                break;\n            }\n\n            /* is there a custom function call *within* this call? */\n            let [callstart, callend] = found;\n            let foundInside = this.findAFunctionCall(line, callstart + 1, callend, isPotentialUserFn);\n            if (foundInside) {\n                /* there is a custom fn inside, can't process it yet */\n                cantUseYetAr.val[callstart] = true;\n            } else {\n                /* let's process this one */\n                this.expandAFnCall(ret, line, callstart, callend);\n\n                /* reset, since one we couldn't do before we might be able to do now */\n                cantUseYetAr.val = {};\n            }\n        }\n\n        ret.push(line);\n        return ret;\n    }\n\n    /**\n     * create new line calling the function and putting the result in a temp var\n     */\n    expandAFnCall(ret: ChvITk[][], line: ChvITk[], start: number, end: number) {\n        assertTrue(isTkType(line[start], tks.tkIdentifier), '5 |line did not start w identifier');\n        assertTrue(isTkType(line[start + 1], tks.tkLParen), '5z|line did not start w identifier(');\n        assertTrue(isTkType(line[end - 1], tks.tkRParen), '5y|line did not end w )');\n        let stmtCall: ChvITk[] = [];\n        let newvarname = `$tmpvar${this.idgenThisScript.next()}`;\n\n        /* create new line of code calling this fn */\n        checkThrow(this.check.potentialUserFn(line[start].image), '8P|must be valid userfn', line[start].image);\n        stmtCall.push(line[start]);\n        assertEq(line[start + 1].image, '(', '5x|expected to start with lparen');\n        assertEq(line[end - 1].image, ')', '5w|expected to end with rparen');\n        let argsNoParens = line.slice(start + 2, end - 1);\n        stmtCall = stmtCall.concat(argsNoParens);\n        ret.push(stmtCall);\n\n        /* rewrite the syntax, replacing the function call with the new variable! */\n        line.splice(start, end - start, this.rw.tokenFromEnglishTerm(newvarname, line[0]));\n\n        /* put results of the call into the temporary variable */\n        let template = `put result ( ) %INTO% %ARG0%`;\n        let tokenNewVarname = this.rw.tokenFromEnglishTerm(newvarname, line[0]);\n        let fromTemplateLines = this.rw.gen(template, line[0], [[tokenNewVarname]]);\n        checkThrowEq(1, fromTemplateLines.length, 'TF|');\n        ret.push(fromTemplateLines[0]);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcRewritesGlobal.ts",
    "content": "\n/* auto */ import { CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { BuildFakeTokens, ChvITk, listOfAllWordLikeTokens, tks } from './../codeparse/vpcTokens';\n/* auto */ import { checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { Util512, arLast, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * preparsing rewrites that aren't specific to a certain command\n */\nexport const VpcRewritesGlobal = /* static class */ {\n    mapSynonyms: {\n        rect: 'rectangle',\n        /* all these are in original product */\n        highlight: 'hilite',\n        hilight: 'hilite',\n        highlite: 'hilite',\n        autohighlight: 'autohilite',\n        autohilight: 'autohilite',\n        autohighlite: 'autohilite',\n        loc: 'location',\n        botright: 'bottomright'\n        /* itemdel and itemdelimiter too, but it's\n        a nullary prop, so it's done in productopts */\n    },\n\n    /**\n     * 1) replace properties.\n     * 2) go from 'the english date' to 'the long date' for compat.\n     */\n    rewritePropertySynonyms(line: ChvITk[], rw: VpcSuperRewrite): ChvITk[] {\n        for (let i = 0; i < line.length - 1; i++) {\n            if (line[i + 1].tokenType === tks.tkOfOnly) {\n                let mapped = this.mapSynonyms[line[i].image];\n                if (mapped) {\n                    line[i] = rw.tokenFromEnglishTerm(mapped, line[i]);\n                }\n            } else if (\n                line[i + 1].tokenType === tks.tkIdentifier &&\n                line[i + 1].image === 'date' &&\n                line[i].image === 'english'\n            ) {\n                line[i] = rw.tokenFromEnglishTerm('long', line[i]);\n            }\n        }\n\n        return line;\n    },\n\n    /* these ones appear in tutorials/old demo stacks and so should be fixed */\n    fixOldSyntaxFor: {\n        result: 1,\n        paramcount: 1,\n        params: 1,\n        target: 1,\n        time: 1,\n        clickh: 1,\n        clickv: 1,\n        clickloc: 1,\n        mouseh: 1,\n        mousev: 1,\n        mouse: 1,\n        mouseloc: 1,\n        keychar: 1,\n        version: 1,\n        systemversion: 1,\n        tool: 1\n    },\n\n    _shouldOmit(line: ChvITk[], i: number) {\n        /* omit \"the\" if it is in \"hilite of the target\" */\n        /* see \"Pseudo-functions that refer to objects\" in internaldocs.md */\n        if (\n            i >= 2 &&\n            (line[i - 2].tokenType === tks.tkAllUnaryPropertiesIfNotAlready ||\n                line[i - 2].tokenType === tks.tkUnaryVipercardProperties ||\n                line[i - 2].tokenType === tks.tkAllNullaryOrUnaryPropertiesIfNotAlready) &&\n            line[i - 1].tokenType === tks.tkOfOnly &&\n            line[i].tokenType === tks._the &&\n            line[i + 1].tokenType === tks._target\n        ) {\n            return true;\n        }\n\n        /* transform 'the clickloc()' into 'the clickloc' */\n        if (\n            i >= 2 &&\n            line[i].tokenType === tks.tkLParen &&\n            this.fixOldSyntaxFor[line[i - 1].image] &&\n            line[i - 2].tokenType === tks._the\n        ) {\n            return true;\n        } else if (\n            i >= 3 &&\n            line[i].tokenType === tks.tkRParen &&\n            line[i - 1].tokenType === tks.tkLParen &&\n            this.fixOldSyntaxFor[line[i - 2].image] &&\n            line[i - 3].tokenType === tks._the\n        ) {\n            return true;\n        }\n\n        /* transform 'the first' into 'first'. saves a parse rule and helps us for parsing 'the selection' */\n        if (line[i].tokenType === tks._the && line[i + 1] && line[i + 1].tokenType === tks.tkOrdinalOrPosition) {\n            return true;\n        }\n\n        return false;\n    },\n\n    /**\n     * 1) from \"short id of fld 1\" to \"short id of bg fld 1\"\n     * do this in software, at parse time it is difficult to clear\n     * the ambiguity: the name of cd fld 1 could be parsed either way.\n     * 2) go from 'the hilite of the target' to 'the hilite of target' for compat.\n     *      see bgrammar_01.ccc for an explanation of why\n     * 3) go from 'the clickloc()' to 'the clickloc' for compat with old vipercard scripts.\n     */\n    rewriteSpecifyCdOrBgPartAndMore(line: ChvITk[], rw: VpcSuperRewrite, compatMode: boolean): ChvITk[] {\n        let ret: ChvITk[] = [];\n        for (let i = 0; i < line.length - 1; i++) {\n            /* omit certain symbols */\n            if (!this._shouldOmit(line, i)) {\n                ret.push(line[i]);\n            }\n\n            /* btn 4 -> cd btn 4 */\n            if (\n                (line[i + 1].tokenType === tks.tkBtn ||\n                    line[i + 1].tokenType === tks.tkFld ||\n                    line[i + 1].tokenType === tks.tkBtnPlural ||\n                    line[i + 1].tokenType === tks.tkFldPlural) &&\n                line[i].image !== 'choose'\n            ) {\n                if (line[i].tokenType !== tks.tkCard && line[i].tokenType !== tks.tkBg) {\n                    if (compatMode) {\n                        /* insert a missing 'bg' or 'cd' */\n                        let s =\n                            line[i + 1].tokenType === tks.tkFld || /* bool */ line[i + 1].tokenType === tks.tkFldPlural\n                                ? 'bg'\n                                : 'cd';\n                        let newTk = rw.tokenFromEnglishTerm(s, line[i]);\n                        ret.push(newTk);\n                    } else {\n                        checkThrow(\n                            false,\n                            longstr(`Vd|You should specify 'cd fld \"myFld\"' or\n                        cd btn \"myBtn\" instead of just fld \"myFld\" or btn \"myBtn\".\n                        If you need this, go Object->Stack Info and turn on compatibility mode.`)\n                        );\n                    }\n                }\n            }\n        }\n\n        ret.push(line[line.length - 1]);\n        return ret;\n    }\n};\n\n/**\n * helps rewrite code\n * rewriting used to be done with code like\n * outputLine.push(tokenBuilder.build('put'))\n * outputLine.push(tokenBuilder.build('3'))\n * outputLine.push(tokenBuilder.build('into'))\n * outputLine.push(tokenBuilder.build('x'))\n * but what we have now is much more convenient to write (and read).\n\n   example:\n   `put %ARG0% into x\n    put %ARG1% into $loopbound%UNIQUE%\n    repeat\n        if x >= $loopbound%UNIQUE% then\n            exit repeat\n        end if\n        put x + 1 into x\n    end repeat`\n\n * it will build code and automatically use the correct tokens.\n */\nexport class VpcSuperRewrite {\n    constructor(protected idGen: CountNumericId) {}\n\n    /* go from the string template to lines of lexed code */\n    gen(s: string, realTokenAsBasis: ChvITk, args?: ChvITk[][], argMany?: ChvITk[][], needsToBePostProcess = true): ChvITk[][] {\n        args = args ?? [];\n        let ret: ChvITk[][] = [];\n        s = s.trim();\n        s = s.replace(/%UNIQUE%/g, '$unique' + this.idGen.nextAsStr());\n        let lines = s.replace(/\\r\\n/g, '\\n').split('\\n');\n        for (let line of lines) {\n            if (line.trim() === '%ARGMANY%' && argMany) {\n                ret = ret.concat(argMany);\n            } else {\n                let terms = line.split(/\\s+/);\n                ret.push([]);\n                for (let term of terms) {\n                    if (term) {\n                        this.addTerm(ret, term, args, realTokenAsBasis, needsToBePostProcess);\n                    }\n                }\n            }\n        }\n        return ret;\n    }\n\n    /* when generating a token from a template, add the term.\n     in most cases, the template must say %INTO% and not into,\n     since rewritePut() has already been called and won't be called again! */\n    protected addTerm(ret: ChvITk[][], term: string, args: ChvITk[][], realTokenAsBasis: ChvITk, needsToBePostProcess: boolean) {\n        if (term.startsWith('%ARG')) {\n            checkThrowEq('%', term[term.length - 1], 'TK|');\n            let sn = term.replace(/%ARG/g, '').replace(/%/g, '');\n            let n = Util512.parseIntStrict(sn);\n            checkThrow(typeof n === 'number' && n >= 0 && n < args.length, 'TJ|internal error in template');\n            ret[ret.length - 1] = ret[ret.length - 1].concat(args[n]);\n        } else if (term === '%INTO%' || term === '%BEFORE%' || term === '%AFTER%') {\n            arLast(ret).push(BuildFakeTokens.makeSyntaxMarker(realTokenAsBasis));\n            let newToken = this.tokenFromEnglishTerm(term.replace(/%/g, '').toLowerCase(), realTokenAsBasis);\n            arLast(ret).push(newToken);\n            arLast(ret).push(BuildFakeTokens.makeSyntaxMarker(realTokenAsBasis));\n        } else {\n            checkThrow(\n                !needsToBePostProcess || (term !== 'into' && term !== 'before' && term !== 'after'),\n                \"TI|it's not safe to say 'put 4 into x' here. try 'put 4 %INTO% x' instead.\"\n            );\n            let newToken = this.tokenFromEnglishTerm(term, realTokenAsBasis);\n            arLast(ret).push(newToken);\n        }\n    }\n\n    /* much safer than just building a tkidentifier or trying to remember what has its own token type\n     this looks at the script-generated table to know what token-type to generate. */\n    tokenFromEnglishTerm(term: string, realTokenAsBasis: ChvITk) {\n        let tktype = listOfAllWordLikeTokens[term];\n        if (!tktype && term.startsWith('\"') && term.endsWith('\"')) {\n            /* we can make a simple string literal, not one that contains spaces though. */\n            tktype = tks.tkStringLiteral;\n            term = term.replace(/~/g, ' ');\n        } else if (!tktype && term.match(/^-?[0-9]+$/)) {\n            tktype = tks.tkNumLiteral;\n        } else if (!tktype && term === ',') {\n            tktype = tks.tkComma;\n        } else if (!tktype && (term === '==' || term === '=')) {\n            tktype = tks.tkGreaterOrLessEqualOrEqual;\n        } else if (!tktype && (term === '&&' || term === '&')) {\n            tktype = tks.tkStringConcat;\n        } else if (!tktype) {\n            tktype = tks.tkIdentifier;\n            checkThrow(\n                term.match(/^[a-zA-Z$_][0-9a-zA-Z$_]*$/),\n                'TH|internal error in template, not a known symbol or valid tkidentifier'\n            );\n        }\n\n        return BuildFakeTokens.makeTk(realTokenAsBasis, tktype, term);\n    }\n\n    /* safer to replace only when not in parens, see searchTokenGivenEnglishTermInParensLevel */\n    replaceWithSyntaxMarkerAtLvl0(\n        line: ChvITk[],\n        realTokenAsBasis: ChvITk,\n        term: string,\n        mustExist: boolean,\n        syntaxMarkerType = ''\n    ) {\n        let index = this.searchTokenGivenEnglishTermInParensLevel(0, line, realTokenAsBasis, term);\n        if (index === -1) {\n            checkThrow(!mustExist, `TG|did not see ${term} in a ${line[0].image}`);\n            return false;\n        } else {\n            let marker = BuildFakeTokens.makeSyntaxMarker(realTokenAsBasis, syntaxMarkerType);\n            line[index] = marker;\n            return true;\n        }\n    }\n\n    /* combines generating a token and searching */\n    searchTokenGivenEnglishTerm(line: ChvITk[], realTokenAsBasis: ChvITk, term: string) {\n        let tk1 = this.tokenFromEnglishTerm(term, realTokenAsBasis);\n        return line.findIndex(t => t.tokenType === tk1.tokenType && t.image === tk1.image);\n    }\n\n    /* sometimes you only want to search at a paren level.\n     example: add x to y, we want to replace \"to\" with a syntax marker.\n     we should only do the replacement at 0-parens level so that\n    add (char 2 to 3 of x) to y\n    won't replace the wrong 'to' token.\n    */\n    searchTokenGivenEnglishTermInParensLevel(wantedLevel: number, line: ChvITk[], realTokenAsBasis: ChvITk, term: string) {\n        let tk1 = this.tokenFromEnglishTerm(term, realTokenAsBasis);\n        let lvl = 0;\n        for (let i = 0; i < line.length; i++) {\n            let t = line[i];\n            if (t.tokenType === tks.tkLParen) {\n                lvl += 1;\n            } else if (t.tokenType === tks.tkRParen) {\n                lvl -= 1;\n            } else if (t.tokenType === tk1.tokenType && t.image === tk1.image && lvl === wantedLevel) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    /* generates a unique variable name */\n    generateUniqueVariable(realTokenAsBasis: ChvITk, prefix: string) {\n        let image = '$unique_' + prefix + this.idGen.nextAsStr();\n        return BuildFakeTokens.makeTk(realTokenAsBasis, tks.tkIdentifier, image);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcRewritesLoops.ts",
    "content": "\n/* auto */ import { BuildFakeTokens, ChvITk, couldTokenTypeBeAVariableName, tks } from './../codeparse/vpcTokens';\n/* auto */ import { VpcSuperRewrite } from './vpcRewritesGlobal';\n/* auto */ import { checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { arLast } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * let's turn all loops into infinite loops and break statements.\n * this makes code-execution simpler because it doesn't have to hold separate state,\n * the state is now held in a normal local variable.\n */\nexport const VpcRewritesLoops = /* static class */ {\n    /* begin to rewrite a loop */\n    Go(line: ChvITk[], rw: VpcSuperRewrite): ChvITk[][] {\n        checkThrowEq('repeat', line[0].image, 'TU|');\n        if (line.length === 1) {\n            return [line];\n        } else if (line[1].image === 'forever') {\n            checkThrowEq(2, line.length, \"TT|didn't expect to see anything after 'repeat forever'\");\n            return [line.slice(0, 1)];\n        } else if (line[1].image === 'until' || line[1].image === 'while') {\n            return this._goUntilWhile(line, rw);\n        } else if (line[1].image === 'with') {\n            return this._goWith(line, rw);\n        } else {\n            let times = rw.tokenFromEnglishTerm('times', line[0]);\n            if (arLast(line).tokenType === times.tokenType && arLast(line).image === times.image) {\n                line.pop();\n            }\n\n            let loopVar = rw.generateUniqueVariable(line[0], '$repeatTimes');\n            let firstExpr = [BuildFakeTokens.makeTk(line[0], tks.tkNumLiteral, '1')];\n            let secondExpr = line.slice(1);\n            return this._goWithImpl(firstExpr, secondExpr, loopVar, false, rw);\n        }\n    },\n\n    /* rewrite a loop of the form \"repeat while\" or \"repeat until\" */\n    _goUntilWhile(line: ChvITk[], rw: VpcSuperRewrite): ChvITk[][] {\n        let template = `\nrepeat\n    if %NOTSTART% %ARG0% %NOTEND% then\n        exit repeat\n    end if\n`; /* the end repeat comes later */\n        if (line[1].image === 'until') {\n            template = template.replace(/%NOTSTART%/g, '');\n            template = template.replace(/%NOTEND%/g, '');\n        } else {\n            template = template.replace(/%NOTSTART%/g, 'not (');\n            template = template.replace(/%NOTEND%/g, ')');\n        }\n\n        let conditionExpression = line.slice(2);\n        checkThrow(conditionExpression?.length, 'TS|without an expression');\n        return rw.gen(template, line[0], [conditionExpression], undefined, false);\n    },\n\n    /* rewrite a loop of the form \"repeat with x = 1 to 5\" */\n    _goWith(line: ChvITk[], rw: VpcSuperRewrite): ChvITk[][] {\n        checkThrowEq('repeat', line[0].image, 'TR|');\n        checkThrowEq('with', line[1].image, 'TQ|');\n        checkThrow(couldTokenTypeBeAVariableName(line[2]), 'TP|');\n        checkThrowEq('=', line[3].image, 'TO|');\n        let findTo = rw.searchTokenGivenEnglishTermInParensLevel(0, line, line[0], 'to');\n        checkThrow(findTo !== -1, 'TN|repeat with, no \"to\" found');\n        let startFirstExpr = 4;\n        let endFirstExpr = findTo - 1;\n        let isDown = false;\n        if (line[findTo - 1].image === 'down') {\n            isDown = true;\n            endFirstExpr -= 1;\n        }\n        let firstExpr = line.slice(startFirstExpr, endFirstExpr + 1);\n        let secondExpr = line.slice(findTo + 1);\n        return this._goWithImpl(firstExpr, secondExpr, line[2], isDown, rw);\n    },\n\n    /* build the code for a loop of the form \"repeat with x = 1 to 5\" */\n    _goWithImpl(firstExpr: ChvITk[], secondExpr: ChvITk[], loopVar: ChvITk, isDown: boolean, rw: VpcSuperRewrite): ChvITk[][] {\n        let template = `\nput ( %ARG1% ) -  %ADJUST%  into %ARG0%\nput %ARG2% into $loopbound%UNIQUE%\nrepeat\n    if %ARG0% %CMPARE% $loopbound%UNIQUE% then\n        exit repeat\n    end if\n    put %ARG0% + %ADJUST% into %ARG0%\n`;\n        if (isDown) {\n            template = template.replace(/%ADJUST%/g, ' - 1');\n            template = template.replace(/%CMPARE%/g, ' <= ');\n        } else {\n            template = template.replace(/%ADJUST%/g, ' 1');\n            template = template.replace(/%CMPARE%/g, ' >= ');\n        }\n\n        checkThrow(firstExpr?.length, 'TM|wrong length');\n        checkThrow(secondExpr?.length, 'TL|wrong length');\n        return rw.gen(template, firstExpr[0], [[loopVar], firstExpr, secondExpr], undefined, false);\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/codepreparse/vpcTopPreparse.ts",
    "content": "\n/* auto */ import { getParsingObjects } from './../codeparse/vpcVisitor';\n/* auto */ import { CodeLimits, CountNumericId } from './../vpcutils/vpcUtils';\n/* auto */ import { ChvITk } from './../codeparse/vpcTokens';\n/* auto */ import { VpcRewritesLoops } from './vpcRewritesLoops';\n/* auto */ import { VpcRewritesGlobal, VpcSuperRewrite } from './vpcRewritesGlobal';\n/* auto */ import { ExpandCustomFunctions } from './vpcRewritesCustomFunctions';\n/* auto */ import { NoElseIfClausesTreeBuilder, VpcRewriteNoElseIfClauses, VpcSplitSingleLineIf } from './vpcRewritesConditions';\n/* auto */ import { VpcRewriteForCommands } from './vpcRewritesCommands';\n/* auto */ import { BranchProcessing } from './vpcProcessBranchAndLoops';\n/* auto */ import { MakeLowerCase, SplitIntoLinesAndMakeLowercase, VpcCodeLine, VpcCodeLineReference, VpcCurrentScriptStage } from './vpcPreparseCommon';\n/* auto */ import { VpcLineToCodeObj } from './vpcLineToCodeObj';\n/* auto */ import { VpcErrStage, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './vpcCheckReserved';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MapKeyToObject, Util512, util512Sort } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/* see the section in internaldocs.md to read how we execute code. */\n\n/**\n * the main preparse (syntax rewriting) logic is here\n */\nexport const VpcTopPreparse = /* static class */ {\n    goPreparseOrThrow(code: string, idGen: CountNumericId, compatMode: boolean): VpcParsedCodeCollection {\n        /* set current status */\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Lex;\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n\n        /* lex the input */\n        let lexer = getParsingObjects()[0];\n        let lexed = lexer.tokenize(code);\n        if (lexed.errors.length) {\n            VpcCurrentScriptStage.latestSrcLineSeen = lexed.errors[0].line;\n            VpcCurrentScriptStage.origClass = 'chevrotain.lex';\n            let errmsg = lexed.errors[0]?.message?.substr(0, CodeLimits.LimitChevErrStringLen);\n            checkThrow(false, `5(|lex error: ${errmsg}`);\n        }\n\n        VpcCurrentScriptStage.currentStage = VpcErrStage.Rewrite;\n        let rw = new VpcSuperRewrite(idGen);\n        let lowercase = new MakeLowerCase();\n        let splitter = new SplitIntoLinesAndMakeLowercase(lexed.tokens, lowercase);\n        let rewrites = new VpcRewriteForCommands(rw);\n        let exp = new ExpandCustomFunctions(idGen, new CheckReservedWords());\n        let buildTree = new NoElseIfClausesTreeBuilder();\n        let ifSplitter = new VpcSplitSingleLineIf();\n        while (true) {\n            let next = splitter.next();\n            if (!next) {\n                break;\n            }\n\n            /* the stage 1 transformations must be done first */\n            VpcCurrentScriptStage.latestSrcLineSeen = next[0].startLine;\n            let nextSublines = this._stage1Process(next, rw);\n            if (nextSublines) {\n                for (let subline of nextSublines) {\n                    let sublines2 = ifSplitter.go(subline, rw);\n                    for (let subline2 of sublines2) {\n                        buildTree.addLine(subline2);\n                    }\n                }\n            } else {\n                let sublines2 = ifSplitter.go(next, rw);\n                for (let subline2 of sublines2) {\n                    buildTree.addLine(subline2);\n                }\n            }\n        }\n\n        /* transform else-if into their own if-end */\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        let lines = VpcRewriteNoElseIfClauses.go(buildTree, rw);\n        if (!lines.length) {\n            return VpcParsedCodeCollection.makeEmptyInst();\n        }\n\n        /* now do these as stages, they don't need access to the entire array */\n        /* by passing the result of one to the next, we're saving some allocations */\n        VpcCurrentScriptStage.latestSrcLineSeen = lines[0][0].startLine;\n        let totalOutput: VpcCodeLine[] = [];\n        let checkReserved = new CheckReservedWords();\n        let toCodeObj = new VpcLineToCodeObj(idGen, checkReserved);\n        toCodeObj.init(lines[0][0]);\n        let lineNumber = 0;\n        let branchProcessor = new BranchProcessing(idGen);\n        for (let line of lines) {\n            VpcCurrentScriptStage.latestSrcLineSeen = line[0].startLine;\n            let nextLines2 = this._stage2Process(line, rewrites, rw, compatMode) ?? [line];\n            for (let line2 of nextLines2) {\n                VpcCurrentScriptStage.latestSrcLineSeen = line2[0].startLine;\n                let nextLines3 = this._stage3Process(line2, exp, rw);\n                for (let line3 of nextLines3) {\n                    VpcCurrentScriptStage.latestSrcLineSeen = line3[0].startLine;\n                    /* make it lowercase again, just in case */\n                    for (let item of line3) {\n                        lowercase.go(item);\n                    }\n\n                    let lineObj = toCodeObj.toCodeLine(line3);\n                    VpcCurrentScriptStage.latestDestLineSeen = lineObj;\n                    lineObj.offset = lineNumber;\n                    branchProcessor.go(lineObj);\n                    totalOutput[lineNumber] = lineObj;\n                    lineNumber += 1;\n                    checkThrow(lineNumber < CodeLimits.MaxLinesInScript, 'TV|maxLinesInScript');\n\n                    /* save memory, we don't need this anymore */\n                    lineObj.tmpEntireLine = undefined;\n                }\n            }\n        }\n\n        branchProcessor.ensureComplete();\n        VpcCurrentScriptStage.latestSrcLineSeen = undefined;\n        VpcCurrentScriptStage.latestDestLineSeen = undefined;\n        VpcCurrentScriptStage.origClass = undefined;\n        return new VpcParsedCodeCollection(branchProcessor.handlers, totalOutput);\n    },\n\n    /* apply the 1st stage of rewriting */\n    _stage1Process(line: ChvITk[], rw: VpcSuperRewrite): O<ChvITk[][]> {\n        if (line.length && line[0].image === 'repeat') {\n            return VpcRewritesLoops.Go(line, rw);\n        } else {\n            return undefined;\n        }\n    },\n\n    /* apply the 3nd stage of rewriting */\n    _stage2Process(line: ChvITk[], rwcmd: VpcRewriteForCommands, rw: VpcSuperRewrite, compatMode: boolean): O<ChvITk[][]> {\n        line = VpcRewritesGlobal.rewriteSpecifyCdOrBgPartAndMore(line, rw, compatMode);\n        let methodName = 'rewrite' + Util512.capitalizeFirst(line[0].image);\n        return Util512.callAsMethodOnClass(VpcRewriteForCommands.name, rwcmd, methodName, [line], true) as O<ChvITk[][]>;\n    },\n\n    /* apply the 3rd stage of rewriting */\n    _stage3Process(line: ChvITk[], exp: ExpandCustomFunctions, rw: VpcSuperRewrite): ChvITk[][] {\n        line = VpcRewritesGlobal.rewritePropertySynonyms(line, rw);\n        let outlines = exp.go(line);\n        return outlines;\n    }\n};\n\n/**\n * the top level collection of parsed and processed code.\n */\nexport class VpcParsedCodeCollection {\n    protected _handlerStarts: number[];\n    constructor(protected _handlers: MapKeyToObject<VpcCodeLineReference>, public lines: VpcCodeLine[]) {\n        this._handlerStarts = _handlers.getVals().map(h => h.offset);\n        this._handlerStarts.sort(util512Sort);\n        Object.freeze(this._handlerStarts);\n    }\n\n    /**\n     * cache information about each handler (like on mouseUp)\n     */\n    get handlers() {\n        return this._handlers;\n    }\n\n    /**\n     * cache where each handler (like on mouseUp) begins\n     */\n    get handlerStarts() {\n        return this._handlerStarts;\n    }\n\n    /**\n     * given a code offset, which handler is it in?\n     */\n    determineHandlerFromOffset(offset: number): number {\n        if (this._handlerStarts.length && offset < this._handlerStarts[0]) {\n            /* line is before any handlers */\n            return -1;\n        }\n\n        for (let i = 0; i < this._handlerStarts.length; i++) {\n            if (offset >= this._handlerStarts[i]) {\n                /* line is in this handler */\n                return i;\n            }\n        }\n\n        /* line is after all handlers */\n        return -1;\n    }\n\n    /**\n     * for cases like where the script is only comments\n     */\n    static makeEmptyInst() {\n        return new VpcParsedCodeCollection(new MapKeyToObject<VpcCodeLineReference>(), []);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/request/vpcRequest.ts",
    "content": "/* auto */ import { VpcSessionToolsEmpty } from './vpcRequestBase';\n\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport function getVpcSessionTools() {\n    return new VpcSessionToolsEmpty()\n}\n\n\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/request/vpcRequestBase.ts",
    "content": "\n/* auto */ import { checkThrow, checkThrowNotifyMsg } from './../vpcutils/vpcEnums';\n/* auto */ import { IsUtil512Serializable } from './../../ui512/utils/util512Serialize';\n/* auto */ import { UI512IsSessionInterface, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a response with an integer return code\n */\nexport class ResponseWithRetcode extends IsUtil512Serializable {\n    retcode = -1;\n}\n\nexport interface VpcUsersCheckLoginResponseInterface {\n    buffer: ArrayBuffer;\n    status: string;\n}\n\nexport abstract class VpcSessionInterface implements UI512IsSessionInterface {\n    username: string;\n    /**\n     * update account email\n     */\n    abstract vpcUsersUpdateEmail(newEmail: string): Promise<boolean>;\n\n    /**\n     * user clicked \"send error report\"\n     * returns true upon success\n     */\n    abstract vpcLogEntriesCreate(\n        logentriesUserTypedDesc: string,\n        logentriesLastClientLogs: string,\n        logentriesStackServerGuid: string,\n        setfakeIp?: string,\n        setServerAndClientTime?: string\n    ): Promise<boolean>;\n\n    /**\n     * save stack as\n     */\n    abstract vpcStacksSaveAs(\n        stackNewPartialId: string,\n        newName: string,\n        newstackdata: string,\n        setFakeMaxStacks?: string\n    ): Promise<boolean>;\n\n    /**\n     * save stack\n     */\n    abstract vpcStacksSave(stackpartialid: string, newstackdata: string): Promise<boolean>;\n\n    /**\n     * list my stacks\n     * returns map of stackid to stack information\n     */\n    abstract vpcListMyStacks(testOverrideUsername?: string): Promise<ResponseShapes.ListMyStacks[]>;\n}\n\nexport interface VpcSessionToolsInterface {\n    readonly minPwLength: number;\n    enableServerCode: boolean;\n\n    /**\n     * get a VpcSessionInterface from a Root object\n     */\n    fromRoot(): O<VpcSessionInterface>;\n\n    /**\n     * stack id to url\n     */\n    getUrlForOpeningStack(loc: string, stackOwner: string, stackId: string, stackName: string): string;\n\n    /**\n     * count number of saves to json\n     */\n    vpcStacksCountJsonSaves(stackOwner: string, stackId: string, currentUsername: string): Promise<ResponseWithRetcode>;\n\n    /**\n     * generate a stack partial id\n     * S and then 15 random bytes, then b64encode it\n     * roughly as much entropy as guid, but looks shorter in a url\n     */\n    generateStackPartialId(): string;\n\n    /**\n     * get full stack id (username+stackid)\n     */\n    getFullStackId(ownerUsername: string, partialStackid: string): string;\n\n    /**\n     * create a new user account\n     * returns true upon success\n     */\n    vpcUsersCreate(username: string, pw: string, email: string): Promise<boolean>;\n\n    /**\n     * check login credentials\n     * - if incorrect creds, throws exception\n     * - if correct creds but email has not been verified, returns a tuple\n     * - if correct creds, returns a VpcSessionInterface\n     */\n    vpcUsersCheckLogin(\n        username: string,\n        pw: string,\n        fakeIp?: string\n    ): Promise<VpcUsersCheckLoginResponseInterface | VpcSessionInterface>;\n\n    /**\n     * enter the email verification code\n     * returns a VpcSessionInterface upon success\n     */\n    vpcUsersEnterEmailVerifyCode(username: string, keyBuffer: ArrayBuffer, codeEmailVerify: string): Promise<VpcSessionInterface>;\n\n    /**\n     * flag inappropriate content\n     */\n    vpcStacksFlagContent(\n        stackOwner: string,\n        stackId: string,\n        currentUsername: string,\n        simulateRemoteIp?: string\n    ): Promise<boolean>;\n\n    vpcStacksGetData(stackFullId: string): Promise<any>;\n}\n\n/**\n * we'll use these classes to validate data from the server\n */\nexport namespace ResponseShapes {\n    export class CheckLoginFinal extends ResponseWithRetcode {\n        optional_need_email_verify = '';\n    }\n\n    export class ListMyStacks extends ResponseWithRetcode {\n        fullstackid = '';\n        stackname = '';\n    }\n\n    export class StacksGetData extends ResponseWithRetcode {\n        stackname = '';\n        stackdata = '';\n        ownerusername = '';\n        flagged = '';\n    }\n}\n\nexport class VpcSessionToolsEmpty implements VpcSessionToolsInterface {\n    readonly minPwLength = 3;\n    enableServerCode = false;\n\n    /**\n     * generate a stack partial id\n     * S and then 15 random bytes, then b64encode it\n     * roughly as much entropy as guid, but looks shorter in a url\n     */\n    generateStackPartialId(): string {\n        return 'S' + Util512Higher.generateUniqueBase64UrlSafe(15, 'S');\n    }\n\n    /**\n     * get full stack id (username+stackid)\n     */\n    getFullStackId(ownerUsername: string, partialStackid: string): string {\n        checkThrow(partialStackid.startsWith('S'), 'Tk|');\n        partialStackid = partialStackid.substr(1);\n        let ownerUsernameEncoded = Util512.toBase64UrlSafe(ownerUsername);\n        return ownerUsernameEncoded + '|' + partialStackid;\n    }\n\n    fromRoot(): O<VpcSessionInterface> {\n        return undefined;\n    }\n    getUrlForOpeningStack(loc: string, stackOwner: string, stackId: string, stackName: string): string {\n        checkThrowNotifyMsg(false, 'Tj|Server code is not enabled.');\n    }\n    vpcStacksCountJsonSaves(stackOwner: string, stackId: string, currentUsername: string): Promise<ResponseWithRetcode> {\n        checkThrowNotifyMsg(false, 'Ti|Server code is not enabled.');\n    }\n\n    vpcUsersCreate(username: string, pw: string, email: string): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'Th|Server code is not enabled.');\n    }\n    vpcUsersCheckLogin(\n        username: string,\n        pw: string,\n        fakeIp?: string\n    ): Promise<VpcUsersCheckLoginResponseInterface | VpcSessionInterface> {\n        checkThrowNotifyMsg(false, 'Tg|Server code is not enabled.');\n    }\n    vpcUsersEnterEmailVerifyCode(\n        username: string,\n        keyBuffer: ArrayBuffer,\n        codeEmailVerify: string\n    ): Promise<VpcSessionInterface> {\n        checkThrowNotifyMsg(false, 'Tf|Server code is not enabled.');\n    }\n    vpcStacksFlagContent(\n        stackOwner: string,\n        stackId: string,\n        currentUsername: string,\n        simulateRemoteIp?: string\n    ): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'Te|Server code is not enabled.');\n    }\n    vpcStacksGetData(stackFullId: string): Promise<any> {\n        checkThrowNotifyMsg(false, 'Td|Server code is not enabled.');\n    }\n}\n\nexport class VpcSessionEmpty implements VpcSessionInterface {\n    username = '';\n    vpcUsersUpdateEmail(newEmail: string): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'Tc|Server code is not enabled.');\n    }\n    vpcLogEntriesCreate(\n        logentriesUserTypedDesc: string,\n        logentriesLastClientLogs: string,\n        logentriesStackServerGuid: string,\n        setfakeIp?: string,\n        setServerAndClientTime?: string\n    ): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'Tb|Server code is not enabled.');\n    }\n    vpcStacksSaveAs(\n        stackNewPartialId: string,\n        newName: string,\n        newstackdata: string,\n        setFakeMaxStacks?: string\n    ): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'Ta|Server code is not enabled.');\n    }\n    vpcStacksSave(stackpartialid: string, newstackdata: string): Promise<boolean> {\n        checkThrowNotifyMsg(false, 'TZ|Server code is not enabled.');\n    }\n    vpcListMyStacks(testOverrideUsername?: string): Promise<ResponseShapes.ListMyStacks[]> {\n        checkThrowNotifyMsg(false, 'TY|Server code is not enabled.');\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/request/vpcSigned.ts",
    "content": "\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport function getVpcSigned() {\n    return 'Server code is not currently enabled.'\n}\n\n\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velBase.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValBool, VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcElType, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { SetToInvalidObjectAtEndOfExecution } from './../../ui512/utils/util512Higher';\n/* auto */ import { coalesceIfFalseLike } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { ElementObserverVal, UI512Gettable, UI512Settable } from './../../ui512/elements/ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for a vel (vpc element)\n *\n * this is just a model, _modelrender_ will create a corresponding ui512 element.\n * why have separate \"vpc\" objects and not use ui512 elements directly?\n *      vipercard elements have properties like 'script' that don't apply to ui512\n *      vipercard elements like a scrolling text field comprise several ui512 elements\n *      for features like 'lock screen' a script should be able to set properties of\n *      vipercard elements without seeing the change in ui which would be complex to do\n *      otherwise (you'd have to clone the state somewhere). also allows ui512 to change\n *      apart from vpc; vpc is persisted to disk, so harder to change w/o breaking compat\n */\nexport abstract class VpcElBase extends UI512Settable {\n    readonly parentIdInternal: string;\n    protected abstract _name: string;\n    abstract getType(): VpcElType;\n    abstract startGettersSetters(): void;\n    readonly tmpArray: [boolean, any] = [false, undefined];\n\n    /* a vel prop-getter can be either a\n     string (1-1 map from vel property to ui512el property) or a\n     function (dynamic code to retrieve the property) */\n    protected getters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* a vel prop-setter can be either a\n     string (1-1 map from vel property to ui512el property) or a\n     function (dynamic code to set the property) */\n    protected setters: { [key: string]: PropSetter<VpcElBase> };\n\n    /**\n     * construct an element,\n     * and set its .getters and .setters\n     * we store the parentId, this is an ok weakreference that\n     * allows access to the parent without keeping a reference cycle.\n     */\n    constructor(id: string, parentId: string) {\n        super(id);\n        this.parentIdInternal = parentId;\n        this.startGettersSetters();\n    }\n\n    /**\n     * make this inaccessible from outside - you must use setOnVel instead\n     */\n    private setImplInternalExposedOnlyInVelBase(s: string, newVal: ElementObserverVal, context = ChangeContext.Default) {\n        /* here and productopts are the only places we're allowed to do this */\n        super.setImplInternal(undefined as any, s, newVal, undefined, context);\n    }\n\n    /**\n     * can link to all siblings for a bg vel!\n     */\n    setOnVel(s: string, newVal: ElementObserverVal, higher: VpcHandleLinkedVels, context = ChangeContext.Default) {\n        higher.setOnVelLinked(this, s, newVal, this.setImplInternalExposedOnlyInVelBase);\n    }\n\n    /**\n     * for bg elements, the one shown to user is NOT the same as our internal one\n     */\n    getUserFacingId() {\n        if (this.ui512GettableHas('is_bg_velement_id')) {\n            return coalesceIfFalseLike(this.getS('is_bg_velement_id'), this.idInternal);\n        } else {\n            return this.idInternal;\n        }\n    }\n\n    /**\n     * subclasses can use this to quickly define\n     * simple properties that map directly to ui512\n     */\n    protected static simpleGetSet(\n        getters: { [key: string]: PropGetter<VpcElBase> },\n        setters: { [key: string]: PropSetter<VpcElBase> },\n        simple: [string, PrpTyp][]\n    ) {\n        for (let [propName, prpTyp] of simple) {\n            getters[propName] = [prpTyp, propName];\n            setters[propName] = [prpTyp, propName];\n        }\n    }\n\n    /**\n     * high-level property get, from a vpc script\n     */\n    getProp(propName: string): VpcVal {\n        let found = this.getters[propName];\n        if (found) {\n            let type = found[0];\n            let mappedProp = found[1];\n            if (type === PrpTyp.Str) {\n                if (typeof mappedProp === 'function') {\n                    return VpcValS(mappedProp(this) as string);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4,|not a string');\n                    return VpcValS(this.getS(mappedProp));\n                }\n            } else if (type === PrpTyp.Num) {\n                if (typeof mappedProp === 'function') {\n                    return VpcValN(mappedProp(this) as number);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4+|not a string');\n                    return VpcValN(this.getN(mappedProp));\n                }\n            } else if (type === PrpTyp.Bool) {\n                if (typeof mappedProp === 'function') {\n                    return VpcValBool(mappedProp(this) as boolean);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4*|not a string');\n                    return VpcValBool(this.getB(mappedProp));\n                }\n            } else {\n                checkThrow(false, `4)|invalid PrpTyp ${type} for el id ${this.getUserFacingId()}`);\n            }\n        } else {\n            checkThrow(false, `4(|unknown property ${propName} for el id ${this.getUserFacingId()}`);\n        }\n    }\n\n    /**\n     * high-level property set, from a vpc script\n     */\n    setProp(propName: string, val: VpcVal, higher: VpcHandleLinkedVels): void {\n        let found = this.setters[propName];\n        if (found) {\n            let type = found[0];\n            let mappedProp = found[1];\n            if (type === PrpTyp.Str) {\n                if (typeof mappedProp === 'function') {\n                    mappedProp(this, val.readAsString(), higher);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4&|prop name not a string');\n                    FormattedText.throwIfContainsControlCharacters(val.readAsString());\n                    this.setOnVel(mappedProp, val.readAsString(), higher);\n                }\n            } else if (type === PrpTyp.Num) {\n                if (typeof mappedProp === 'function') {\n                    mappedProp(this, val.readAsStrictInteger(this.tmpArray), higher);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4%|prop name not a string');\n                    this.setOnVel(mappedProp, val.readAsStrictInteger(this.tmpArray), higher);\n                }\n            } else if (type === PrpTyp.Bool) {\n                if (typeof mappedProp === 'function') {\n                    mappedProp(this, val.readAsStrictBoolean(this.tmpArray), higher);\n                } else {\n                    assertTrue(typeof mappedProp === 'string', '4$|prop name not a string');\n                    this.setOnVel(mappedProp, val.readAsStrictBoolean(this.tmpArray), higher);\n                }\n            } else {\n                checkThrow(false, `4#|invalid PrpTyp ${type} for el id ${this.getUserFacingId()}`);\n            }\n        } else {\n            checkThrow(false, `4!|unknown property ${propName} for el id ${this.getUserFacingId()}`);\n        }\n    }\n\n    /* e.g. a background field has different content on every card */\n    isCardSpecificContent(key: string) {\n        return false;\n    }\n\n    /**\n     * when a vel is no longer valid, null out the fields\n     * so that code mistakenly referring to it will\n     * cause an exception\n     */\n    destroy() {\n        this.getters = SetToInvalidObjectAtEndOfExecution(this.getters);\n        this.setters = SetToInvalidObjectAtEndOfExecution(this.setters);\n        this.setOnVel = SetToInvalidObjectAtEndOfExecution(this.setOnVel);\n        this.setFmTxt = SetToInvalidObjectAtEndOfExecution(this.setFmTxt);\n    }\n\n    /**\n     * find a child element by name\n     */\n    static findByName<T extends VpcElBase>(list: VpcElBase[], name: string, type: VpcElType) {\n        for (let i = 0, len = list.length; i < len; i++) {\n            let item = list[i];\n            if (item._name === name) {\n                if (item.getType() === type) {\n                    return item as T;\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    getFmTxt(): FormattedText {\n        if (this.getB('sharedtext')) {\n            return cast(FormattedText, this.getGeneric('ftxt'));\n        } else {\n            return cast(FormattedText, this.getGeneric('ftxt_uniquetocard'));\n        }\n    }\n\n    setFmTxt(newTxt: FormattedText, h: VpcHandleLinkedVels, context = ChangeContext.Default) {\n        newTxt.lock();\n        if (this.getB('sharedtext')) {\n            this.setOnVel('ftxt', newTxt, h);\n        } else {\n            this.setOnVel('ftxt_uniquetocard', newTxt, h);\n        }\n    }\n}\n\n/**\n * base class for elements that can be resized.\n */\nexport abstract class VpcElSizable extends VpcElBase {\n    protected _x = 0;\n    protected _y = 0;\n    protected _w = 0;\n    protected _h = 0;\n\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n    }\n\n    /**\n     * a quick way to set dimensions of an object\n     */\n    setDimensions(\n        newX: number,\n        newY: number,\n        newW: number,\n        newH: number,\n        h: VpcHandleLinkedVels,\n        context = ChangeContext.Default\n    ) {\n        checkThrow(newW >= 0, `7H|width must be >= 0 but got ${newW}`);\n        checkThrow(newH >= 0, `7G|height must be >= 0 but got ${newH}`);\n        this.setOnVel('x', newX, h, context);\n        this.setOnVel('y', newY, h, context);\n        this.setOnVel('w', newW, h, context);\n        this.setOnVel('h', newH, h, context);\n    }\n\n    /**\n     * define size getters\n     */\n    static initSizeGetters(getters: { [key: string]: PropGetter<VpcElBase> }) {\n        getters['script'] = [PrpTyp.Str, 'script'];\n        getters['width'] = [PrpTyp.Num, 'w'];\n        getters['height'] = [PrpTyp.Num, 'h'];\n        getters['left'] = [PrpTyp.Num, 'x'];\n        getters['top'] = [PrpTyp.Num, 'y'];\n        getters['right'] = [PrpTyp.Num, (me: VpcElSizable) => me._x + me._w];\n        getters['bottom'] = [PrpTyp.Num, (me: VpcElSizable) => me._y + me._h];\n        getters['topleft'] = [PrpTyp.Str, (me: VpcElSizable) => `${me._x},${me._y}`];\n        getters['bottomright'] = [PrpTyp.Str, (me: VpcElSizable) => `${me._x + me._w},${me._y + me._h}`];\n        getters['rectangle'] = [PrpTyp.Str, (me: VpcElSizable) => `${me._x},${me._y},${me._x + me._w},${me._y + me._h}`];\n        getters['location'] = [\n            PrpTyp.Str,\n            (me: VpcElSizable) => `${me._x + Math.trunc(me._w / 2)},${me._y + Math.trunc(me._h / 2)}`\n        ];\n    }\n\n    /**\n     * define size setters\n     */\n    static initSizeSetters(setters: { [key: string]: PropSetter<VpcElBase> }) {\n        setters['script'] = [PrpTyp.Str, 'script'];\n        setters['width'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(me._x, me._y, n, me._h, h)\n        ];\n        setters['height'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(me._x, me._y, me._w, n, h)\n        ];\n        setters['left'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(n, me._y, me._w, me._h, h)\n        ];\n        setters['top'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(me._x, n, me._w, me._h, h)\n        ];\n        setters['right'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(n - me._w, me._y, me._w, me._h, h)\n        ];\n        setters['bottom'] = [\n            PrpTyp.Num,\n            (me: VpcElSizable, n: number, h: VpcHandleLinkedVels) => me.setDimensions(me._x, n - me._h, me._w, me._h, h)\n        ];\n        setters['topleft'] = [\n            PrpTyp.Str,\n            (me: VpcElSizable, s: string, h: VpcHandleLinkedVels) => {\n                let coords = VpcValS(s).readAsIntegerList(2);\n                me.setDimensions(coords[0], coords[1], me._w, me._h, h);\n            }\n        ];\n        setters['bottomright'] = [\n            PrpTyp.Str,\n            (me: VpcElSizable, s: string, h: VpcHandleLinkedVels) => {\n                let coords = VpcValS(s).readAsIntegerList(2);\n                me.setDimensions(me._x, me._y, coords[0] - me._x, coords[1] - me._y, h);\n            }\n        ];\n        setters['rectangle'] = [\n            PrpTyp.Str,\n            (me: VpcElSizable, s: string, h: VpcHandleLinkedVels) => {\n                let coords = VpcValS(s).readAsIntegerList(4);\n                me.setDimensions(coords[0], coords[1], coords[2] - coords[0], coords[3] - coords[1], h);\n            }\n        ];\n        setters['location'] = [\n            PrpTyp.Str,\n            (me: VpcElSizable, s: string, h: VpcHandleLinkedVels) => {\n                let coords = VpcValS(s).readAsIntegerList(2);\n                let wasLocX = me._x + Math.trunc(me._w / 2);\n                let wasLocY = me._y + Math.trunc(me._h / 2);\n                let moveX = coords[0] - wasLocX;\n                let moveY = coords[1] - wasLocY;\n                me.setDimensions(me._x + moveX, me._y + moveY, me._w, me._h, h);\n            }\n        ];\n    }\n}\n\n/**\n * will currently be a ModelTop\n */\nexport interface VpcHandleLinkedVels {\n    setOnVelLinked(\n        me: VpcElBase,\n        s: string,\n        newVal: ElementObserverVal,\n        cb: (s: string, newVal: ElementObserverVal, ctx: ChangeContext) => void\n    ): void;\n}\n\n/**\n * type of property.\n * string, numeric (integer), or boolean\n */\nexport enum PrpTyp {\n    __isUI512Enum = 1,\n    Str,\n    Num,\n    Bool\n}\n\n/**\n * a vel prop-getter can be either a\n * string (1-1 map from vel property to ui512el property)\n * or a\n * function (dynamic code to retrieve the property)\n */\nexport type PropGetter<T extends UI512Gettable> = [PrpTyp, string | ((me: T) => string | number | boolean)];\n\n/**\n * a vel prop-setter can be either a\n * string (1-1 map from vel property to ui512el property)\n * or a\n * function (dynamic code to set the property)\n */\nexport type PropSetter<T extends UI512Settable> = [\n    PrpTyp,\n    string | ((me: T, v: string | number | boolean, higher: VpcHandleLinkedVels) => void)\n];\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velBg.ts",
    "content": "\n/* auto */ import { VpcElType } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElCard } from './velCard';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase } from './velBase';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a vipercard \"background\"\n * a stack contains backgrounds, which contain cards\n */\nexport class VpcElBg extends VpcElBase {\n    protected _script = '';\n    protected _name = '';\n    protected _paint = '';\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n    }\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /* child cards */\n    cards: VpcElCard[] = [];\n\n    /* get template card, for bg vel replication */\n    getTemplateCard() {\n        return this.cards[0];\n    }\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Bg;\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElBg.bgInit();\n        this.getters = VpcElBg.cachedGetters;\n        this.setters = VpcElBg.cachedSetters;\n    }\n\n    /**\n     * define getters and setters\n     */\n    static bgInit() {\n        if (!VpcElBg.cachedGetters || !VpcElBg.cachedSetters) {\n            VpcElBg.cachedGetters = {};\n            VpcElBg.cachedGetters['script'] = [PrpTyp.Str, 'script'];\n            VpcElBg.cachedSetters = {};\n            VpcElBg.cachedSetters['name'] = [PrpTyp.Str, 'name'];\n            VpcElBg.cachedSetters['script'] = [PrpTyp.Str, 'script'];\n            Util512.freezeRecurse(VpcElBg.cachedGetters);\n            Util512.freezeRecurse(VpcElBg.cachedSetters);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velButton.ts",
    "content": "\n/* auto */ import { VpcElType, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase, VpcElSizable, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { Util512, getEnumToStrOrFallback, getStrToEnum } from './../../ui512/utils/util512';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512ComplexFontChanges } from './../../ui512/drawtext/ui512ComplexFontChanges';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a vipercard \"button\"\n */\nexport class VpcElButton extends VpcElSizable {\n    protected _is_bg_velement_id = '';\n\n    protected _autohilite = true;\n    protected _enabled = true;\n    protected _hilite = false;\n    protected _hilite_uniquetocard = false;\n    protected _checkmark = false;\n    protected _checkmark_uniquetocard = false;\n    protected _icon = 0;\n    protected _showlabel = true;\n    protected _style: number = VpcBtnStyle.Rectangle;\n    protected _label = '';\n    protected _textalign = 'center';\n    protected _textfont = 'chicago';\n    protected _textsize = 12;\n    protected _textstyle = 0;\n    protected _visible = true;\n    protected _script = '';\n    protected _name = '';\n\n    protected _sharedhilite = true;\n\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n    }\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Btn;\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElButton.btnInit();\n        this.getters = VpcElButton.cachedGetters;\n        this.setters = VpcElButton.cachedSetters;\n    }\n\n    /**\n     * define getters\n     */\n    static btnGetters(getters: { [key: string]: PropGetter<VpcElBase> }) {\n        getters['textalign'] = [PrpTyp.Str, 'textalign'];\n        getters['textstyle'] = [PrpTyp.Str, (me: VpcElButton) => UI512ComplexFontChanges.intToStyleList(me.getN('textstyle'))];\n        getters['style'] = [\n            PrpTyp.Str,\n            (me: VpcElButton) => {\n                let ret = getEnumToStrOrFallback(VpcBtnStyle, me.getN('style'));\n                return ret.replace(/osstandard/g, 'standard').replace(/osdefault/g, 'default');\n            }\n        ];\n\n        getters['hilite'] = [\n            PrpTyp.Bool,\n            (me: VpcElButton) => {\n                let p = me.getB('sharedhilite') ? 'hilite' : 'hilite_uniquetocard';\n                return me.getB(p);\n            }\n        ];\n\n        getters['checkmark'] = [\n            PrpTyp.Bool,\n            (me: VpcElButton) => {\n                let p = me.getB('sharedhilite') ? 'checkmark' : 'checkmark_uniquetocard';\n                return me.getB(p);\n            }\n        ];\n    }\n\n    /**\n     * define setters\n     */\n    static btnSetters(setters: { [key: string]: PropSetter<VpcElBase> }) {\n        setters['name'] = [PrpTyp.Str, 'name'];\n        setters['textstyle'] = [\n            PrpTyp.Str,\n            (me: VpcElButton, s: string, h: VpcHandleLinkedVels) => {\n                let next = UI512ComplexFontChanges.setGeneralTextStyleAdvancedInt(me.getN('textstyle'), s);\n                me.setOnVel('textstyle', next, h);\n            }\n        ];\n\n        setters['style'] = [\n            PrpTyp.Str,\n            (me: VpcElButton, s: string, h: VpcHandleLinkedVels) => {\n                let styl = getStrToEnum<VpcBtnStyle>(VpcBtnStyle, 'Button style', s);\n                checkThrow((styl as any) !== VpcBtnStyle.Osboxmodal, '7D|this style is only supported internally');\n                me.setOnVel('style', styl, h);\n            }\n        ];\n\n        setters['textalign'] = [\n            PrpTyp.Str,\n            (me: VpcElButton, s: string, h: VpcHandleLinkedVels) => {\n                s = s.toLowerCase().trim();\n                if (s === 'left') {\n                    me.setOnVel('textalign', 'left', h);\n                } else if (s === 'center') {\n                    me.setOnVel('textalign', 'center', h);\n                } else {\n                    checkThrow(false, `4z|we don't currently support setting text align to ${s}`);\n                }\n            }\n        ];\n\n        setters['hilite'] = [\n            PrpTyp.Bool,\n            (me: VpcElButton, v: boolean, h: VpcHandleLinkedVels) => {\n                let p = me.getB('sharedhilite') ? 'hilite' : 'hilite_uniquetocard';\n                me.setOnVel(p, v, h);\n            }\n        ];\n\n        setters['checkmark'] = [\n            PrpTyp.Bool,\n            (me: VpcElButton, v: boolean, h: VpcHandleLinkedVels) => {\n                let p = me.getB('sharedhilite') ? 'checkmark' : 'checkmark_uniquetocard';\n                me.setOnVel(p, v, h);\n            }\n        ];\n    }\n\n    static simpleBtnGetSet(): [string, PrpTyp][] {\n        return [\n            ['autohilite', PrpTyp.Bool],\n            ['sharedhilite', PrpTyp.Bool],\n            ['enabled', PrpTyp.Bool],\n            ['icon', PrpTyp.Num],\n            ['label', PrpTyp.Str],\n            ['showlabel', PrpTyp.Bool],\n            ['visible', PrpTyp.Bool],\n            ['textfont', PrpTyp.Str],\n            ['textsize', PrpTyp.Num]\n        ];\n    }\n\n    /**\n     * define getters and setters\n     */\n    static btnInit() {\n        if (!VpcElButton.cachedGetters || !VpcElButton.cachedSetters) {\n            VpcElButton.cachedGetters = {};\n            VpcElButton.cachedSetters = {};\n            VpcElBase.simpleGetSet(VpcElButton.cachedGetters, VpcElButton.cachedSetters, VpcElButton.simpleBtnGetSet());\n            VpcElButton.btnGetters(VpcElButton.cachedGetters);\n            VpcElSizable.initSizeGetters(VpcElButton.cachedGetters);\n            VpcElButton.btnSetters(VpcElButton.cachedSetters);\n            VpcElSizable.initSizeSetters(VpcElButton.cachedSetters);\n            Util512.freezeRecurse(VpcElButton.cachedGetters);\n            Util512.freezeRecurse(VpcElButton.cachedSetters);\n        }\n    }\n\n    /**\n     * from internal textfont to \"geneva_12_biuosdce\"\n     */\n    getFontAsUI512() {\n        let spec = new TextFontSpec(this.getS('textfont'), this.getN('textstyle'), this.getN('textsize'));\n        return spec.toSpecString();\n    }\n}\n\n/**\n * button styles\n */\nexport enum VpcBtnStyle {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Transparent = UI512BtnStyle.Transparent,\n    Rectangle = UI512BtnStyle.Rectangle,\n    Opaque = UI512BtnStyle.Opaque,\n    Roundrect = UI512BtnStyle.RoundRect,\n    Plain = UI512BtnStyle.Plain,\n    Shadow = UI512BtnStyle.Shadow,\n    Osstandard = UI512BtnStyle.OSStandard,\n    Osdefault = UI512BtnStyle.OSDefault,\n    Osboxmodal = UI512BtnStyle.OSBoxModal,\n    Checkbox = UI512BtnStyle.Checkbox,\n    Radio = UI512BtnStyle.Radio,\n    __AlternateForm__Standard = UI512BtnStyle.OSStandard,\n    __AlternateForm__Default = UI512BtnStyle.OSDefault,\n    __AlternateForm__Rect = UI512BtnStyle.Rectangle\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velCard.ts",
    "content": "\n/* auto */ import { VpcElType } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElButton } from './velButton';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase } from './velBase';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a vipercard \"card\"\n */\nexport class VpcElCard extends VpcElBase {\n    protected _script = '';\n    protected _name = '';\n    protected _paint = '';\n    protected _marked = false;\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n    }\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /* child vels */\n    parts: (VpcElButton | VpcElField)[] = [];\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Card;\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElCard.cdInit();\n        this.getters = VpcElCard.cachedGetters;\n        this.setters = VpcElCard.cachedSetters;\n    }\n\n    /**\n     * define getters and setters\n     */\n    static cdInit() {\n        if (!VpcElCard.cachedGetters || !VpcElCard.cachedSetters) {\n            VpcElCard.cachedGetters = {};\n            VpcElCard.cachedGetters['script'] = [PrpTyp.Str, 'script'];\n            VpcElCard.cachedGetters['marked'] = [PrpTyp.Bool, 'marked'];\n            VpcElCard.cachedSetters = {};\n            VpcElCard.cachedSetters['name'] = [PrpTyp.Str, 'name'];\n            VpcElCard.cachedSetters['script'] = [PrpTyp.Str, 'script'];\n            VpcElCard.cachedSetters['marked'] = [PrpTyp.Bool, 'marked'];\n            Util512.freezeRecurse(VpcElCard.cachedGetters);\n            Util512.freezeRecurse(VpcElCard.cachedSetters);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velField.ts",
    "content": "\n/* auto */ import { VpcValN, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcElType, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase, VpcElSizable, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, getEnumToStrOrFallback, getStrToEnum } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { GenericTextField } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { TextFontSpec, specialCharNumNewline } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512ComplexFontChanges } from './../../ui512/drawtext/ui512ComplexFontChanges';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * vpc text field class.\n */\nexport class VpcElField extends VpcElSizable {\n    protected _is_bg_velement_id = '';\n\n    protected _dontwrap = false;\n    protected _enabled = true;\n    protected _locktext = false;\n    protected _singleline = false;\n    protected _selcaret = 0;\n    protected _selend = 0;\n    protected _style: number = VpcFldStyleInclScroll.Rectangle;\n    protected _visible = true;\n    protected _script = '';\n    protected _textalign = 'left';\n    protected _name = '';\n    protected _scroll = 0;\n    protected _scroll_uniquetocard = 0;\n    protected _ftxt = new FormattedText();\n    protected _ftxt_uniquetocard = new FormattedText();\n\n    /* confirmed that there is a separate 'defaultfont' property\n    try this in an emulator:\n    create a new field, by default it has geneva text.\n    browse tool, select all, font menu->symbol, put \"abc\" into cd fld 1, text is still geneva\n    field tool, select the field, font menu->symbol, put \"abc\" into cd fld 1, text is now symbol */\n    protected _defaulttextfont = 'geneva';\n    protected _defaulttextsize = 12;\n    protected _defaulttextstyle = 0;\n\n    /* always true if belongs to a card */\n    protected _sharedtext = true;\n\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n        this._ftxt.lock();\n        this._ftxt_uniquetocard.lock();\n    }\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Fld;\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElField.fldInit();\n        this.getters = VpcElField.cachedGetters;\n        this.setters = VpcElField.cachedSetters;\n    }\n\n    /**\n     * from internal textfont to \"geneva_12_biuosdce\"\n     */\n    getFontAsUI512() {\n        let spec = new TextFontSpec(this.getS('textfont'), this.getN('textstyle'), this.getN('textsize'));\n        return spec.toSpecString();\n    }\n\n    /**\n     * for convenience, get the default font as ui512\n     */\n    getDefaultFontAsUi512() {\n        let spec = new TextFontSpec(this.getS('defaulttextfont'), this.getN('defaulttextstyle'), this.getN('defaulttextsize'));\n        return spec.toSpecString();\n    }\n\n    /**\n     * for convenience, set entire font\n     */\n    protected setEntireFontFromDefaultFont(h: VpcHandleLinkedVels) {\n        let font = this.getDefaultFontAsUi512();\n        let newTxt = this.getFmTxt().getUnlockedCopy();\n        newTxt.setFontEverywhere(font);\n        this.setFmTxt(newTxt, h);\n    }\n\n    /**\n     * define getters\n     */\n    static fldGetters(getters: { [key: string]: PropGetter<VpcElBase> }) {\n        getters['singleline'] = [PrpTyp.Bool, 'singleline'];\n        getters['textalign'] = [PrpTyp.Str, 'textalign'];\n        getters['alltext'] = [PrpTyp.Str, (me: VpcElField) => me.getFmTxt().toUnformatted()];\n        getters['defaulttextstyle'] = [\n            PrpTyp.Str,\n            (me: VpcElField) => UI512ComplexFontChanges.intToStyleList(me.getN('defaulttextstyle'))\n        ];\n        getters['style'] = [\n            PrpTyp.Str,\n            (me: VpcElField) => {\n                return getEnumToStrOrFallback(VpcFldStyleInclScroll, me.getN('style'));\n            }\n        ];\n\n        /* interestingly, when calling these without providing a chunk,\n        they always act on the default font.\n        confirmed in emulator that it won't even say 'mixed',\n        and it will return default font even if no chars have it. */\n        getters['textstyle'] = getters['defaulttextstyle'];\n        getters['textfont'] = getters['defaulttextfont'];\n        getters['textsize'] = getters['defaulttextsize'];\n        getters['scroll'] = [\n            PrpTyp.Num,\n            (me: VpcElField) => {\n                return me.getB('sharedtext') ? me.getN('scroll') : me.getN('scroll_uniquetocard');\n            }\n        ];\n    }\n\n    /**\n     * define setters\n     */\n    static fldSetters(setters: { [key: string]: PropSetter<VpcElBase> }) {\n        setters['name'] = [PrpTyp.Str, 'name'];\n        setters['style'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                let styl = getStrToEnum<VpcFldStyleInclScroll>(VpcFldStyleInclScroll, 'Field style or \"scrolling\"', s);\n                me.setOnVel('style', styl, h);\n\n                /* changing style resets scroll amount */\n                me.setProp('scroll', VpcValN(0), h);\n            }\n        ];\n\n        setters['textstyle'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                me.setProp('defaulttextstyle', VpcValS(s), h);\n                me.setEntireFontFromDefaultFont(h);\n            }\n        ];\n\n        setters['textfont'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                me.setProp('defaulttextfont', VpcValS(s), h);\n                me.setEntireFontFromDefaultFont(h);\n            }\n        ];\n\n        setters['textsize'] = [\n            PrpTyp.Num,\n            (me: VpcElField, n: number, h: VpcHandleLinkedVels) => {\n                me.setProp('defaulttextsize', VpcValN(n), h);\n                me.setEntireFontFromDefaultFont(h);\n            }\n        ];\n\n        /* as done by ui when the field tool is selected,\n        or when saying put \"abc\" into cd fld 1 with no chunk qualifications */\n        setters['alltext'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                let newTxt = FormattedText.newFromUnformatted(s);\n                newTxt.setFontEverywhere(me.getDefaultFontAsUi512());\n                me.setFmTxt(newTxt, h);\n            }\n        ];\n\n        setters['defaulttextstyle'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                let nextStyle = UI512ComplexFontChanges.setGeneralTextStyleAdvancedInt(me.getN('defaulttextstyle'), s);\n                me.setOnVel('defaulttextstyle', nextStyle, h);\n            }\n        ];\n\n        setters['textalign'] = [\n            PrpTyp.Str,\n            (me: VpcElField, s: string, h: VpcHandleLinkedVels) => {\n                s = s.toLowerCase().trim();\n                if (s === 'left') {\n                    me.setOnVel('textalign', 'left', h);\n                } else if (s === 'center') {\n                    me.setOnVel('textalign', 'center', h);\n                } else {\n                    checkThrow(false, `4y|we don't currently support setting text align to ${s}`);\n                }\n            }\n        ];\n\n        setters['singleline'] = [\n            PrpTyp.Bool,\n            (me: VpcElField, b: boolean, h: VpcHandleLinkedVels) => {\n                me.setOnVel('singleline', b, h);\n                if (b) {\n                    let hasNewLine = me.getFmTxt().indexOf(specialCharNumNewline);\n                    if (hasNewLine !== -1) {\n                        let newTxt = new FormattedText();\n                        newTxt.appendSubstring(me.getFmTxt(), 0, hasNewLine);\n                        me.setFmTxt(newTxt, h);\n                    }\n                }\n            }\n        ];\n\n        setters['scroll'] = [\n            PrpTyp.Num,\n            (me: VpcElField, n: number, h: VpcHandleLinkedVels) => {\n                me.setOnVel(me.getB('sharedtext') ? 'scroll' : 'scroll_uniquetocard', n, h);\n            }\n        ];\n    }\n\n    /**\n     * define getters+setters that simply get/set a value\n     */\n    static simpleFldGetSet(): [string, PrpTyp][] {\n        return [\n            ['dontwrap', PrpTyp.Bool],\n            ['enabled', PrpTyp.Bool],\n            ['locktext', PrpTyp.Bool],\n            ['sharedtext', PrpTyp.Bool],\n            ['defaulttextfont', PrpTyp.Str],\n            ['defaulttextsize', PrpTyp.Num],\n            ['visible', PrpTyp.Bool]\n        ];\n    }\n\n    /**\n     * define getters and setters\n     */\n    static fldInit() {\n        if (!VpcElField.cachedGetters || !VpcElField.cachedSetters) {\n            VpcElField.cachedGetters = {};\n            VpcElField.cachedSetters = {};\n            VpcElBase.simpleGetSet(VpcElField.cachedGetters, VpcElField.cachedSetters, VpcElField.simpleFldGetSet());\n            VpcElField.fldGetters(VpcElField.cachedGetters);\n            VpcElSizable.initSizeGetters(VpcElField.cachedGetters);\n            VpcElField.fldSetters(VpcElField.cachedSetters);\n            VpcElSizable.initSizeSetters(VpcElField.cachedSetters);\n            Util512.freezeRecurse(VpcElField.cachedGetters);\n            Util512.freezeRecurse(VpcElField.cachedSetters);\n        }\n    }\n}\n\n/**\n * implementation of GenericTextField for vel text fields\n *\n * let's say you are typing on the keyboard to insert a letter into the text field.\n * if this is a UI512 text field, we can directly insert the letter.\n * but if it is a ViperCard text field,\n * we need to update the _VpcElField_ model first\n */\nexport class VpcTextFieldAsGeneric implements GenericTextField {\n    constructor(protected el512: O<UI512ElTextField>, protected impl: VpcElField, protected h: VpcHandleLinkedVels) {}\n\n    setFmtTxt(newTxt: FormattedText, context: ChangeContext) {\n        this.impl.setFmTxt(newTxt, this.h, context);\n    }\n\n    getFmtTxt(): FormattedText {\n        return this.impl.getFmTxt();\n    }\n\n    canEdit() {\n        return !this.impl.getB('locktext');\n    }\n\n    canSelectText(): boolean {\n        return !this.impl.getB('locktext');\n    }\n\n    isMultiline(): boolean {\n        return !this.impl.getB('singleline');\n    }\n\n    setSel(a: number, b: number): void {\n        this.impl.setOnVel('selcaret', a, this.h);\n        this.impl.setOnVel('selend', b, this.h);\n    }\n\n    getSel(): [number, number] {\n        return [this.impl.getN('selcaret'), this.impl.getN('selend')];\n    }\n\n    getHeight(): number {\n        return this.impl.getN('h');\n    }\n\n    getDefaultFont(): string {\n        return this.impl.getDefaultFontAsUi512();\n    }\n\n    getReadOnlyUI512(): UI512ElTextField {\n        return ensureDefined(this.el512, 'Ve|');\n    }\n\n    getScrollAmt(): number {\n        return this.impl.getProp('scroll').readAsStrictNumeric();\n    }\n\n    setScrollAmt(n: O<number>): void {\n        if (n !== undefined && n !== null) {\n            this.impl.setProp('scroll', VpcValN(n), this.h);\n        }\n    }\n}\n\n/**\n * field styles.\n */\nexport enum VpcFldStyleInclScroll {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Opaque = UI512FldStyle.Opaque,\n    Transparent = UI512FldStyle.Transparent,\n    Rectangle = UI512FldStyle.Rectangle,\n    Shadow = UI512FldStyle.Shadow,\n    __AlternateForm__Rect = UI512FldStyle.Rectangle,\n    Scrolling = 200\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velFieldChangeFont.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { VpcGranularity, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { ChunkResolution } from './../vpcutils/vpcChunkResolution';\n/* auto */ import { RWContainerField } from './velResolveContainer';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcHandleLinkedVels } from './velBase';\n/* auto */ import { fitIntoInclusive, longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512ComplexFontChanges } from './../../ui512/drawtext/ui512ComplexFontChanges';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * apply changes for character-specific properties\n */\nexport class VpcFontSpecialChunk {\n    constructor(public vel: VpcElField) {}\n    /**\n     * chunk set, e.g. 'set the textstyle of char 2 to 4 of cd fld...'\n     */\n    specialSetPropChunkImpl(h: VpcHandleLinkedVels, prop: string, s: string, charstart: number, charend: number): void {\n        let newTxt = this.vel.getFmTxt().getUnlockedCopy();\n        let len = charend - charstart;\n        if (prop === 'textstyle') {\n            let list = s.split(',').map(item => item.trim().toLowerCase());\n            UI512ComplexFontChanges.setChunkTextStyleAdvanced(newTxt, this.vel.getDefaultFontAsUi512(), charstart, len, list);\n        } else if (prop === 'textfont') {\n            UI512ComplexFontChanges.setChunkTextFace(newTxt, this.vel.getDefaultFontAsUi512(), charstart, len, s);\n        } else if (prop === 'textsize') {\n            let n = VpcValS(s).readAsStrictInteger();\n            UI512ComplexFontChanges.setChunkTextSize(newTxt, this.vel.getDefaultFontAsUi512(), charstart, len, n);\n        } else {\n            checkThrow(\n                false,\n                longstr(`4x|can only say 'set the (prop) of char 1 to 2'\n                    for textstyle, textfont, or textsize`)\n            );\n        }\n\n        this.vel.setFmTxt(newTxt, h);\n    }\n\n    /**\n     * chunk get, e.g. 'get the textstyle of char 2 to 4 of cd fld...'\n     */\n    specialGetPropChunkImpl(prop: string, charstart: number, charend: number): string {\n        let len = charend - charstart;\n        if (prop === 'textstyle') {\n            /* returns comma-delimited styles, or the string 'mixed' */\n            let list = UI512ComplexFontChanges.getChunkTextStyleOrMixed(\n                this.vel.getFmTxt(),\n                this.vel.getDefaultFontAsUi512(),\n                charstart,\n                len\n            );\n\n            return list.join(',');\n        } else if (prop === 'textfont') {\n            /* returns typeface name or the string 'mixed' */\n            return UI512ComplexFontChanges.getChunkTextFaceOrMixed(\n                this.vel.getFmTxt(),\n                this.vel.getDefaultFontAsUi512(),\n                charstart,\n                len\n            );\n        } else if (prop === 'textsize') {\n            /* as per spec this can return either an integer or the string 'mixed' */\n            return UI512ComplexFontChanges.getChunkTextSizeOrMixed(\n                this.vel.getFmTxt(),\n                this.vel.getDefaultFontAsUi512(),\n                charstart,\n                len\n            ).toString();\n        } else {\n            checkThrow(\n                false,\n                longstr(`4w|can only say 'get the (prop) of char 1 to 2'\n                    for textstyle, textfont, or textsize`)\n            );\n        }\n    }\n\n    /**\n     * when you say set the textstyle of char 999 to 1000...\n     * how do we respond when outside content length\n     */\n    protected resolveChunkBounds(h: VpcHandleLinkedVels, chunk: RequestedChunk, itemDel: string) {\n        let newChunk = chunk.getClone();\n        if (\n            newChunk.granularity === VpcGranularity.Chars &&\n            !newChunk.ordinal &&\n            newChunk.last !== undefined &&\n            newChunk.last < newChunk.first\n        ) {\n            /* for consistency with emulator, interesting behavior for negative intervals */\n            newChunk.first = newChunk.first - 1;\n            newChunk.last = newChunk.first + 1;\n        }\n\n        let unformatted = this.vel.getFmTxt().toUnformatted();\n        newChunk.first = fitIntoInclusive(newChunk.first, 1, unformatted.length);\n\n        /* we've already handled the formattedText.len() === 0 case in getChunkTextAttribute */\n        let cont = new RWContainerField(this.vel, h);\n        let bounds = ChunkResolution.applyRead(cont, chunk, itemDel);\n        return bounds ? [bounds.startPos, bounds.endPos] : [0, 0];\n    }\n\n    /**\n     * chunk set, e.g. 'set the textstyle of char 2 to 4 of cd fld...'\n     */\n    specialSetPropChunk(h: VpcHandleLinkedVels, prop: string, chunk: RequestedChunk, val: VpcVal, itemDel: string) {\n        let [start, end] = this.resolveChunkBounds(h, chunk, itemDel);\n        return this.specialSetPropChunkImpl(h, prop, val.readAsString(), start, end);\n    }\n\n    /**\n     * chunk get, e.g. 'get the textstyle of char 2 to 4 of cd fld...'\n     */\n    specialGetPropChunk(h: VpcHandleLinkedVels, prop: string, chunk: RequestedChunk, itemDel: string): VpcVal {\n        let [start, end] = this.resolveChunkBounds(h, chunk, itemDel);\n        return VpcValS(this.specialGetPropChunkImpl(prop, start, end));\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velModelTop.ts",
    "content": "\n/* auto */ import { VpcElType, checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './velStack';\n/* auto */ import { VpcElProductOpts } from './velProductOpts';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElCard } from './velCard';\n/* auto */ import { VpcElButton } from './velButton';\n/* auto */ import { VpcElBg } from './velBg';\n/* auto */ import { VpcElBase, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { SetToInvalidObjectAtEndOfExecution } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { AnyParameterCtor, MapKeyToObject, cast } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { ElementObserverDefault, ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * owner of the stack model and productopts model\n */\nexport class VpcModelTop implements VpcHandleLinkedVels {\n    /* initialized by _VpcDocLoader_ which calls ensureModelNotEmpty() */\n    stack: VpcElStack;\n\n    /* initialized by _VpcDocLoader_ which calls ensureModelNotEmpty() */\n    productOpts: VpcElProductOpts;\n\n    /* a unique id for the entire project, as distinct from the stack's stackLineage */\n    uuid: string;\n\n    /* for performance, a fast map from velId to vel */\n    protected elements = new MapKeyToObject<VpcElBase>();\n\n    /**\n     * look for a vel by id, returns undefined if not found\n     */\n    findByIdUntyped(id: O<string>) {\n        return this.elements.find(id);\n    }\n\n    /**\n     * look for a vel by id, throw if not found\n     */\n    getByIdUntyped(id: string) {\n        return this.elements.get(id);\n    }\n\n    /**\n     * look for a vel of specified type by id, returns undefined if not found\n     */\n    findById<T extends VpcElBase>(ctor: AnyParameterCtor<T>, id: O<string>) {\n        let vel = this.elements.find(id);\n        return vel ? cast(ctor, vel, id) : undefined;\n    }\n\n    /**\n     * look for a vel of specified type by id, throws if not found\n     */\n    getById<T extends VpcElBase>(ctor: AnyParameterCtor<T>, id: string): T {\n        let vel = this.elements.get(id);\n        return cast(ctor, vel, id);\n    }\n\n    /**\n     * look for a vel of specified type by id, throws if not found\n     */\n    getCardById(id: string) {\n        return this.getById(VpcElCard, id);\n    }\n\n    /**\n     * add a vel to our map\n     */\n    addIdToMapOfElements(vel: VpcElBase) {\n        this.elements.add(vel.idInternal, vel);\n    }\n\n    /**\n     * remove a vel from our map\n     */\n    removeIdFromMapOfElements(id: string) {\n        return this.elements.remove(id);\n    }\n\n    /**\n     * a convenient way to go from a vel to its owner\n     */\n    getOwnerUntyped(vel: VpcElBase): VpcElBase {\n        if (vel instanceof VpcElStack) {\n            return this.productOpts;\n        } else if (vel instanceof VpcElProductOpts) {\n            checkThrow(false, `4t|cannot get the owner of product`);\n        } else {\n            let found = this.findByIdUntyped(vel.parentIdInternal);\n            if (found !== undefined) {\n                return found;\n            } else {\n                checkThrow(false, `4s|cannot get the owner of el ${vel.idInternal}`);\n            }\n        }\n    }\n\n    /**\n     * a convenient way to go from a vel to its owner, confirm type is as expected\n     */\n    getOwner<T>(ctor: AnyParameterCtor<T>, vel: VpcElBase) {\n        let found = this.getOwnerUntyped(vel);\n        return cast(ctor, found);\n    }\n\n    /**\n     * get the parent card of an element\n     */\n    getParentCardOfElement(vel: VpcElBase): VpcElBase {\n        let cur = this.getCurrentCard();\n        if (vel instanceof VpcElCard) {\n            return vel;\n        } else if (vel instanceof VpcElBg) {\n            if (vel.idInternal === cur.parentIdInternal) {\n                return cur;\n            } else {\n                return vel.cards[0];\n            }\n        } else if (vel instanceof VpcElButton || vel instanceof VpcElField) {\n            return this.getCardById(vel.parentIdInternal);\n        } else {\n            return cur;\n        }\n    }\n\n    /**\n     * get the current card\n     */\n    getCurrentCard() {\n        let cardId = this.productOpts.getS('currentCardId');\n        let found = this.getCardById(cardId);\n        checkThrow(found instanceof VpcElCard && found.getType() === VpcElType.Card, '79|getCurrentCard failed');\n        return found;\n    }\n\n    /**\n     * get child arrays\n     */\n    static getChildArrays(vel: VpcElBase): VpcElBase[][] {\n        if (vel instanceof VpcElCard) {\n            return [vel.parts];\n        } else if (vel instanceof VpcElBg) {\n            return [vel.cards];\n        } else if (vel instanceof VpcElStack) {\n            return [vel.bgs];\n        } else {\n            return [];\n        }\n    }\n\n    /**\n     * background elements are linked!\n     */\n    setOnVelLinked(\n        me: VpcElBase,\n        s: string,\n        newVal: ElementObserverVal,\n        cb: (s: string, newVal: ElementObserverVal, ctx: ChangeContext) => void\n    ): void {\n        if (me instanceof VpcElButton || me instanceof VpcElField) {\n            let group = me.getS('is_bg_velement_id');\n            if (group && !s.endsWith('_uniquetocard')) {\n                /* it's a linked one, we'll need to update everything it is linked to! */\n                let card = this.getById(VpcElCard, me.parentIdInternal);\n                let bg = this.getById(VpcElBg, card.parentIdInternal);\n                for (let card of bg.cards) {\n                    for (let part of card.parts) {\n                        if (part.getS('is_bg_velement_id') === group) {\n                            cb.apply(part, [s, newVal, ChangeContext.Default]);\n                            break;\n                        }\n                    }\n                }\n            } else {\n                cb.apply(me, [s, newVal, ChangeContext.Default]);\n            }\n        } else {\n            cb.apply(me, [s, newVal, ChangeContext.Default]);\n        }\n    }\n\n    /**\n     * we've created a new card. copy over the vels\n     */\n    copyBgVelsOnNewCard(newCard: VpcElBase) {\n        checkThrow(newCard instanceof VpcElCard, 'Vg|');\n        let bg = this.getById(VpcElBg, newCard.parentIdInternal);\n        /* use the first card in the bg as a template */\n        for (let part of bg.getTemplateCard().parts) {\n            let group = part.getS('is_bg_velement_id');\n            if (group) {\n                checkThrow(false, 'Vf|nyi');\n            }\n        }\n    }\n\n    /**\n     * when modeltop is no longer valid, null out the fields\n     * so that code mistakenly referring to it will\n     * cause an exception\n     */\n    destroy() {\n        for (let vel of this.stack.iterEntireStack()) {\n            vel.destroy();\n        }\n\n        this.productOpts.observer = new ElementObserverDefault();\n        this.elements = SetToInvalidObjectAtEndOfExecution(this.elements);\n        this.productOpts = SetToInvalidObjectAtEndOfExecution(this.productOpts);\n        this.stack = SetToInvalidObjectAtEndOfExecution(this.stack);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velOutsideInterfaces.ts",
    "content": "\n/* auto */ import { VpcVal } from './../vpcutils/vpcVal';\n/* auto */ import { ReadableContainer, VpcScriptMessage, WritableContainer } from './../vpcutils/vpcUtils';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { PropAdjective, VpcElType, VpcTool } from './../vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { VpcModelTop } from './velModelTop';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElBase } from './velBase';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ValHolder } from './../../ui512/utils/util512';\n/* auto */ import { ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512PaintDispatch } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * OutsideWorldRead:\n * provides scripts with a read-only view of the \"world\".\n * we've decided that when a script evaluates an expression, this should be pure,\n * with no side effects, and so when evaluating we only provide an interface with read-only ability.\n */\nexport interface OutsideWorldRead {\n    /**\n     * try resolving a RequestedVelRef, if succeeds return its long id\n     * if resolution fails, return undefined\n     */\n    ElementExists(vel: RequestedVelRef): O<string>;\n\n    /**\n     * read variable contents\n     */\n    ReadVarContents(varName: string): VpcVal;\n\n    /**\n     * is a variable defined\n     */\n    IsVarDefined(varName: string): boolean;\n\n    /**\n     * resolve a reference to a container,\n     * throws if the requested vel does not exist\n     */\n    ResolveContainerReadable(contRef: RequestedContainerRef): ReadableContainer;\n\n    /**\n     * read text from a container\n     */\n    ContainerRead(contRef: RequestedContainerRef): string;\n\n    /**\n     * high-level get property of a vel, returns VpcVal\n     */\n    GetProp(ref: RequestedVelRef, prop: string, adjective: PropAdjective, chunk: O<RequestedChunk>): VpcVal;\n\n    /**\n     * is this a runtime property on the 'product' object?\n     */\n    IsProductProp(propName: string): boolean;\n\n    /**\n     * get selected field and bounds\n     */\n    FindSelectedTextBounds(): [O<VpcElField>, number, number];\n\n    /**\n     * get the current tool, specify the 'real' tool or the 'simulated' tool chosen by a script\n     */\n    GetCurrentTool(realOrMimic: boolean): VpcTool;\n\n    /**\n     * get code execution frame information\n     */\n    GetFrameInfo(): [VpcScriptMessage, VpcVal[]];\n\n    /**\n     * get the current \"item delemiter\" to know how to interpret 'get item 3 of \"a,b,c\"'\n     */\n    GetItemDelim(): string;\n\n    /**\n     * count the number of elements of a certain type\n     */\n    CountElements(type: VpcElType, parentRef: RequestedVelRef): number;\n\n    /**\n     * is this a built-in function\n     */\n    IsBuiltinFunction(s: string): boolean;\n\n    /**\n     * call a built-in function\n     */\n    CallBuiltinFunction(s: string, args: VpcVal[]): VpcVal;\n\n    /**\n     * get the current card\n     */\n    GetCurrentCardId(): string;\n\n    /**\n     * get information about mouse and keyboard state\n     */\n    GetMouseAndKeyState(\n        mouseCoords: [number, number],\n        trackClick: [number, number, number],\n        buttons: ValHolder<boolean[]>,\n        mods: ValHolder<ModifierKeys>\n    ): void;\n}\n\n/**\n * OutsideWorldReadWrite:\n * provides scripts with access to the outside \"world\".\n *\n * this interface helps with layering.\n */\nexport interface OutsideWorldReadWrite extends OutsideWorldRead {\n    /**\n     * resolve reference to a vel\n     */\n    ResolveVelRef(ref: RequestedVelRef): O<VpcElBase>;\n\n    /**\n     * declare a global\n     */\n    DeclareGlobal(varName: string): void;\n\n    /**\n     * set variable contents\n     */\n    SetVarContents(varName: string, v: VpcVal): void;\n\n    /**\n     * set variable contents (allows access to special vars like \"it\")\n     */\n    SetSpecialVar(varName: string, v: VpcVal): void;\n\n    /**\n     * resolve reference to writable container\n     * throws if the requested vel does not exist\n     */\n    ResolveContainerWritable(contRef: RequestedContainerRef): WritableContainer;\n\n    /**\n     * modify a container\n     */\n    ContainerModify(contRef: RequestedContainerRef, fn: (s: string) => string): void;\n\n    /**\n     * high-level property set on a vel\n     */\n    SetProp(ref: RequestedVelRef, prop: string, v: VpcVal, chunk: O<RequestedChunk>): void;\n\n    /**\n     * access the model\n     */\n    Model(): VpcModelTop;\n\n    /**\n     * get a runtime (non-persisted) string value\n     */\n    GetOptionS(prop: string): string;\n\n    /**\n     * get a runtime (non-persisted) numeric value\n     */\n    GetOptionN(prop: string): number;\n\n    /**\n     * get a runtime (non-persisted) boolean value\n     */\n    GetOptionB(prop: string): boolean;\n\n    /**\n     * set a runtime (non-persisted) value\n     */\n    SetOption<T extends ElementObserverVal>(prop: string, newVal: T): void;\n\n    /**\n     * go straight to a card without calling closecard or opencard\n     */\n    SetCurCardNoOpenCardEvt(id: string): void;\n\n    /**\n     * draw paint on the screen by simulating a click\n     */\n    SimulateClick(argsGiven: number[], mods: ModifierKeys): void;\n\n    /**\n     * commit simulated clicks to the screen\n     */\n    CommitSimulatedClicks(queue: UI512PaintDispatch[]): void;\n\n    /**\n     * append text to the message box\n     * ignored if the message box is not currently open\n     */\n    WriteToReplMessageBox(s: string, returnFocus: boolean): void;\n\n    /**\n     * get access to FieldsRecentlyEdited, used to determine\n     * whether we should call openField or exitField\n     */\n    GetFieldsRecentlyEdited(): ValHolder<{ [id: string]: boolean }>;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velProductOpts.ts",
    "content": "\n/* auto */ import { VpcStandardLibScript } from './../vpcutils/vpcStandardLibScript';\n/* auto */ import { VpcStandardLibDoMenu } from './../vpcutils/vpcStandardLibDoMenu';\n/* auto */ import { VpcElType, VpcTool, checkThrow, checkThrowEq } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './velStack';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElCard } from './velCard';\n/* auto */ import { VpcElButton } from './velButton';\n/* auto */ import { VpcElBg } from './velBg';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, getEnumToStrOrFallback, getStrToEnum } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512Patterns, clrBlack, clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * product options class\n *\n * the vel object singleton that can be referred to with code like\n * 'exit to ViperCard'\n * or\n * 'set the cursor to watch'\n * (when you set a global property, you are setting a\n * property on this object.)\n *\n * settings here are undoable, since they are on a vel\n * settings in vpcruntimesettings, on the other hand, are not undoable\n *\n * these are runtime-only settings -- nothing here is persisted during save.\n */\nexport class VpcElProductOpts extends VpcElBase {\n    allowSetCurrentTool = false;\n    allowSetCurrentCard = false;\n    protected _itemDel = ',';\n    protected _script = VpcStandardLibDoMenu.script + '\\n' + VpcStandardLibScript.script;\n    protected _name = `${cProductName}`;\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n        VpcElProductOpts.prodInit();\n    }\n\n    /* settings that shouldn't be touched directly */\n    protected _currentTool = VpcTool.Pencil;\n    protected _currentCardId = '';\n\n    /* settings stored here to get an undoable setting */\n    protected _optWideLines = false;\n    protected _optPaintDrawMult = false;\n    protected _currentPattern = UI512Patterns.defaultPattern;\n    protected _optPaintLineColor = UI512Patterns.defaultLineColor;\n    protected _optPaintFillColor = UI512Patterns.defaultFillColor;\n    protected _optUseHostClipboard = true;\n    protected _viewingScriptVelId = '';\n    protected _selectedVelId = '';\n    protected _suggestedIdleRate = '';\n    protected _skipArrowkeyMessages = false;\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Product;\n    }\n\n    /**\n     * set a property\n     * add a check allowSetCurrentTool -- the only place that can set currentTool\n     * is the _vpcpresenter_ object, since it has special tool clean-up logic\n     */\n    setProductOpt(s: string, newVal: ElementObserverVal, context = ChangeContext.Default) {\n        assertWarn(s !== 'currentTool' || this.allowSetCurrentTool, 'Jt|');\n        assertWarn(s !== 'currentCardId' || this.allowSetCurrentCard, 'Tr|');\n        assertTrue(s !== 'script', \"Tq|you can't set script of Vpc\");\n        /* here and velbase are the only places we're allowed to do this */\n        super.setImplInternal(undefined as any, s, newVal, undefined, context);\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElProductOpts.prodInit();\n        this.getters = VpcElProductOpts.cachedGetters;\n        this.setters = VpcElProductOpts.cachedSetters;\n    }\n\n    /**\n     * define getters\n     */\n    static prodGetters(getters: { [key: string]: PropGetter<VpcElBase> }) {\n        /* many 'properties' here are hard-coded values for backwards-compat only */\n        getters['environment'] = [PrpTyp.Str, () => 'development'];\n        getters['stacksinuse'] = [PrpTyp.Str, () => ''];\n        getters['suspended'] = [PrpTyp.Bool, () => false];\n        getters['itemdelimiter'] = [PrpTyp.Str, 'itemDel'];\n        getters['itemdel'] = getters['itemdelimiter'];\n        getters['itemdelim'] = getters['itemdelimiter'];\n        getters['cursor'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts) => {\n                let curs = UI512CursorAccess.getCursor();\n                let ret = getEnumToStrOrFallback(UI512Cursors, curs);\n                if (ret.startsWith('drawn_')) {\n                    ret = ret.substr('drawn_'.length);\n                }\n                if (ret.startsWith('css_')) {\n                    ret = ret.substr('css_'.length);\n                }\n                return ret.toLowerCase();\n            }\n        ];\n\n        /* paint settings */\n        getters['linesize'] = [\n            PrpTyp.Num,\n            (me: VpcElProductOpts) => {\n                return me.getB('optWideLines') ? 2 : 1;\n            }\n        ];\n        getters['filled'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts) => {\n                let v = me.getN('optPaintFillColor');\n                if (v === clrBlack) {\n                    return 'true';\n                } else if (v === clrWhite) {\n                    return 'white';\n                } else {\n                    return 'false';\n                }\n            }\n        ];\n\n        getters['multiple'] = [PrpTyp.Bool, 'optPaintDrawMult'];\n        getters['pattern'] = [PrpTyp.Num, 'currentPattern'];\n        getters['linecolor'] = [PrpTyp.Num, 'optPaintLineColor'];\n        getters['skiparrowkeymessages'] = [PrpTyp.Bool, 'skipArrowkeyMessages'];\n    }\n\n    /**\n     * define setters\n     */\n    static prodSetters(setters: { [key: string]: PropSetter<VpcElBase> }) {\n        setters['itemdelimiter'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts, s: string) => {\n                checkThrowEq(1, s.length, `7C|length of itemDel must be 1`);\n                me.setProductOpt('itemDel', s);\n            }\n        ];\n        setters['itemdel'] = setters['itemdelimiter'];\n        setters['itemdelim'] = setters['itemdelimiter'];\n\n        setters['cursor'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts, s: string) => {\n                if (s === '1') {\n                    s = 'lbeam';\n                } else if (s === '2') {\n                    s = 'cross';\n                } else if (s === '3') {\n                    s = 'plus';\n                } else if (s === '4') {\n                    s = 'watch';\n                } else if (s === '5') {\n                    s = 'hand';\n                } else if (s === '6') {\n                    s = 'arrow';\n                } else if (s === '7') {\n                    s = 'busy';\n                } else if (s === '8') {\n                    s = 'none';\n                }\n\n                let n = getStrToEnum<UI512Cursors>(UI512Cursors, `cursor ${s} not supported`, s);\n                UI512CursorAccess.setCursorSupportRotate(n);\n            }\n        ];\n\n        setters['idlerate'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts, s: string) => {\n                if (s === 'faster') {\n                    me.setProductOpt('suggestedIdleRate', 'faster');\n                } else if (s === 'faster2') {\n                    me.setProductOpt('suggestedIdleRate', 'faster2');\n                } else if (!s || s === 'default') {\n                    me.setProductOpt('suggestedIdleRate', 'default');\n                } else {\n                    checkThrow(false, `Js|unsupported idlerate, try \"faster\" or \"default\"`);\n                }\n            }\n        ];\n\n        /* paint settings */\n        setters['linesize'] = [\n            PrpTyp.Num,\n            (me: VpcElProductOpts, s: string, h: VpcHandleLinkedVels) => {\n                let n = Util512.parseInt(s);\n                if (n !== undefined && n >= 2) {\n                    me.setOnVel('optWideLines', true, h);\n                } else if (n !== undefined) {\n                    me.setOnVel('optWideLines', false, h);\n                }\n            }\n        ];\n        setters['filled'] = [\n            PrpTyp.Str,\n            (me: VpcElProductOpts, s: string, h: VpcHandleLinkedVels) => {\n                if (s.toLowerCase() === 'white') {\n                    me.setOnVel('optPaintFillColor', clrWhite, h);\n                } else if (s.toLowerCase() === 'black' || s.toLowerCase() === 'true') {\n                    me.setOnVel('optPaintFillColor', clrBlack, h);\n                } else {\n                    /* make transparent */\n                    me.setOnVel('optPaintFillColor', -1, h);\n                }\n            }\n        ];\n\n        setters['multiple'] = [PrpTyp.Bool, 'optPaintDrawMult'];\n        setters['pattern'] = [PrpTyp.Num, 'currentPattern'];\n        setters['linecolor'] = [PrpTyp.Num, 'optPaintLineColor'];\n        setters['skiparrowkeymessages'] = [PrpTyp.Bool, 'skipArrowkeyMessages'];\n    }\n\n    /**\n     * define getters and setters\n     */\n    static prodInit() {\n        if (!VpcElProductOpts.cachedGetters || !VpcElProductOpts.cachedSetters) {\n            VpcElProductOpts.cachedGetters = {};\n            VpcElProductOpts.prodGetters(VpcElProductOpts.cachedGetters);\n            VpcElProductOpts.cachedSetters = {};\n            VpcElProductOpts.prodSetters(VpcElProductOpts.cachedSetters);\n            Util512.freezeRecurse(VpcElProductOpts.cachedGetters);\n            Util512.freezeRecurse(VpcElProductOpts.cachedSetters);\n        }\n    }\n\n    /**\n     * is this the name of a property?\n     */\n    static canGetProductProp(propName: string) {\n        VpcElProductOpts.prodInit();\n        return (\n            VpcElProductOpts.cachedGetters[propName] !== undefined ||\n            /* bool */ VpcElProductOpts.cachedSetters[propName] !== undefined\n        );\n    }\n\n    /**\n     * is this the name of any property on any type of object?\n     */\n    static isAnyProp(propName: string) {\n        VpcElButton.btnInit();\n        VpcElField.fldInit();\n        VpcElCard.cdInit();\n        VpcElBg.bgInit();\n        VpcElStack.stackInit();\n        VpcElProductOpts.prodInit();\n        return (\n            VpcElButton.cachedGetters[propName] ||\n            VpcElButton.cachedSetters[propName] ||\n            VpcElField.cachedGetters[propName] ||\n            VpcElField.cachedSetters[propName] ||\n            VpcElCard.cachedGetters[propName] ||\n            VpcElCard.cachedSetters[propName] ||\n            VpcElBg.cachedGetters[propName] ||\n            VpcElBg.cachedSetters[propName] ||\n            VpcElStack.cachedGetters[propName] ||\n            VpcElStack.cachedSetters[propName] ||\n            VpcElProductOpts.cachedGetters[propName] ||\n            VpcElProductOpts.cachedSetters[propName]\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velRenderName.ts",
    "content": "\n/* auto */ import { RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { OrdinalOrPosition, PropAdjective, VpcElType, checkThrow, vpcElTypeShowInUI } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './velStack';\n/* auto */ import { VpcElProductOpts } from './velProductOpts';\n/* auto */ import { VpcModelTop } from './velModelTop';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElCard } from './velCard';\n/* auto */ import { VpcElButton } from './velButton';\n/* auto */ import { VpcElBg } from './velBg';\n/* auto */ import { VpcElBase } from './velBase';\n/* auto */ import { cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, castVerifyIsStr, findStrToEnum, getEnumToStrOrFallback, getStrToEnum } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * when a script asks for the name of an object\n * put the long name of cd btn \"myBtn\" into x\n */\nexport class VelRenderName {\n    constructor(protected model: VpcModelTop) {}\n\n    /**\n     * get the name\n     */\n    go(vel: VpcElBase, adjective: PropAdjective): string {\n        let type = vel.getType();\n        let methodName = 'goRenderName' + Util512.capitalizeFirst(getEnumToStrOrFallback(VpcElType, type));\n        return castVerifyIsStr(Util512.callAsMethodOnClass(VelRenderName.name, this, methodName, [vel, adjective], false));\n    }\n\n    /**\n     * re-use logic for buttons and fields\n     */\n    protected goRenderNameBtn(vel: VpcElButton, adjective: PropAdjective) {\n        checkThrow(vel instanceof VpcElButton, 'J[|');\n        return this.goResolveBtnOrFld(vel, adjective);\n    }\n\n    /**\n     * re-use logic for buttons and fields\n     */\n    protected goRenderNameFld(vel: VpcElField, adjective: PropAdjective) {\n        checkThrow(vel instanceof VpcElField, 'J@|');\n        return this.goResolveBtnOrFld(vel, adjective);\n    }\n\n    /**\n     * get the name of a button or field\n     */\n    protected goResolveBtnOrFld(vel: VpcElButton | VpcElField, adjective: PropAdjective) {\n        let typ = vel.getType() === VpcElType.Btn ? 'button' : 'field';\n        let name = vel.getS('name');\n        let cdOrBg = vel.getS('is_bg_velement_id').length ? 'bkgnd' : 'card';\n        if (name.length) {\n            /* name exists, show the name */\n            if (adjective === PropAdjective.Long) {\n                let parent = this.model.getCardById(vel.parentIdInternal);\n                return `${cdOrBg} ${typ} \"${name}\" of ${this.goRenderNameCard(parent, adjective)}`;\n            } else if (adjective === PropAdjective.Short) {\n                return `${name}`;\n            } else {\n                return `${cdOrBg} ${typ} \"${name}\"`;\n            }\n        } else {\n            /* no name, fall back to showing the id */\n            let userFacingId = vel.getUserFacingId();\n            if (adjective === PropAdjective.Long) {\n                let parent = this.model.getCardById(vel.parentIdInternal);\n                return `${cdOrBg} ${typ} id ${userFacingId} of ${this.goRenderNameCard(parent, adjective)}`;\n            } else {\n                return `${cdOrBg} ${typ} id ${userFacingId}`;\n            }\n        }\n    }\n\n    /**\n     * get the name of a card\n     */\n    protected goRenderNameCard(vel: VpcElCard, adjective: PropAdjective): string {\n        checkThrow(vel instanceof VpcElCard, 'J>|');\n        let name = vel.getS('name');\n        let stname = this.model.stack.getS('name');\n        if (name.length) {\n            /* name exists, show the name */\n            if (adjective === PropAdjective.Long) {\n                return `card \"${name}\" of stack \"${stname}\"`;\n            } else if (adjective === PropAdjective.Short) {\n                return `${name}`;\n            } else {\n                return `card \"${name}\"`;\n            }\n        } else {\n            /* no name, fall back to showing the id */\n            if (adjective === PropAdjective.Long) {\n                return `card id ${vel.getUserFacingId()} of stack \"${stname}\"`;\n            } else {\n                return `card id ${vel.getUserFacingId()}`;\n            }\n        }\n    }\n\n    /**\n     * get the name of a background\n     */\n    protected goRenderNameBg(vel: VpcElBg, adjective: PropAdjective) {\n        checkThrow(vel instanceof VpcElBg, 'J=|');\n        let name = vel.getS('name');\n        let stname = this.model.stack.getS('name');\n        if (name.length) {\n            /* name exists, show the name */\n            if (adjective === PropAdjective.Long) {\n                return `bkgnd \"${name}\" of stack \"${stname}\"`;\n            } else if (adjective === PropAdjective.Short) {\n                return `${name}`;\n            } else {\n                return `bkgnd \"${name}\"`;\n            }\n        } else {\n            /* no name, fall back to showing the id */\n            if (adjective === PropAdjective.Long) {\n                return `bkgnd id ${vel.getUserFacingId()} of stack \"${stname}\"`;\n            } else {\n                return `bkgnd id ${vel.getUserFacingId()}`;\n            }\n        }\n    }\n\n    /**\n     * get the name of a stack.\n     * made compatible with original product.\n     * we don't return 'stack id x' because original product never did that.\n     */\n    protected goRenderNameStack(vel: VpcElStack, adjective: PropAdjective) {\n        checkThrow(vel instanceof VpcElStack, 'J<|');\n        let nm = vel.getS('name');\n        if (adjective === PropAdjective.Short) {\n            return nm;\n        } else if (adjective === PropAdjective.Long) {\n            return `stack \"Hard Drive:${nm}\"`;\n        } else {\n            return `stack \"${nm}\"`;\n        }\n    }\n\n    /**\n     * get the name of product\n     * fun fact, in emulator the \"long name\" of product would return filepath of the app\n     */\n    protected goRenderNameProduct(vel: VpcElProductOpts, adjective: PropAdjective) {\n        checkThrow(vel instanceof VpcElProductOpts, 'J;|');\n        if (adjective === PropAdjective.Long) {\n            return `Hard Drive:${cProductName}`;\n        } else {\n            return `${cProductName}`;\n        }\n    }\n}\n\n/**\n * when a script asks for the id of an object\n * put the long name of cd btn \"myBtn\" into x\n */\nexport class VelRenderId {\n    constructor(protected model: VpcModelTop) {}\n\n    /**\n     * get the id\n     */\n    go(vel: VpcElBase, adjective: PropAdjective, compatMode: boolean) {\n        if (vel instanceof VpcElCard && compatMode) {\n            return this.goCardCompat(vel, adjective);\n        } else if (vel instanceof VpcElProductOpts) {\n            return this.goProduct(vel, adjective);\n        } else {\n            return this.goOtherTypes(vel, adjective, compatMode);\n        }\n    }\n\n    /**\n     * matching the emulator's behavior. fascinating.\n     */\n    protected goProduct(vel: VpcElProductOpts, adjective: PropAdjective) {\n        return 'WILD';\n    }\n\n    /**\n     * confirmed in emulator that id of card is inconsistent,\n     * and more verbose than other objects\n     */\n    protected goCardCompat(vel: VpcElCard, adjective: PropAdjective) {\n        let userFacingId = vel.getUserFacingId();\n        if (adjective === PropAdjective.Short) {\n            return userFacingId;\n        } else if (adjective === PropAdjective.Long) {\n            let stname = this.model.stack.getS('name');\n            return `card id ${userFacingId} of stack \"${stname}\"`;\n        } else if (adjective === PropAdjective.LongForParse) {\n            return `card id ${userFacingId}`;\n        } else {\n            return `card id ${userFacingId}`;\n        }\n    }\n\n    /**\n     * the long id of a cd btn is the same as the short id of a cd btn\n     */\n    protected goOtherTypes(vel: VpcElBase, adjective: PropAdjective, compatMode: boolean) {\n        let userFacingId = vel.getUserFacingId();\n        if (adjective === PropAdjective.LongForParse || (adjective === PropAdjective.Long && !compatMode)) {\n            if (vel instanceof VpcElButton || vel instanceof VpcElField) {\n                let cdOrBg = vel.getS('is_bg_velement_id').length ? 'bkgnd' : 'card';\n                /* NOTE: this is ambiguous - for a bg object,\n                it won't precisely identify the object.\n                but this is the way the original product worked. */\n                let s = `${cdOrBg} ${vpcElTypeShowInUI(vel.getType())} id ${userFacingId}`;\n                if ((adjective === PropAdjective.LongForParse || !compatMode) && vel.getS('is_bg_velement_id').length) {\n                    /* this fixes the ambiguity */\n                    let parent = this.model.getByIdUntyped(vel.parentIdInternal);\n                    s += ` of cd id ${parent.getUserFacingId()}`;\n                }\n\n                return s;\n            } else {\n                return `${vpcElTypeShowInUI(vel.getType())} id ${userFacingId}`;\n            }\n        } else {\n            return userFacingId;\n        }\n    }\n\n    /**\n     * go from \"card id 123\" back to a RequestedVelRef\n     * an alternative would be to spin up the full parser/visitor and use it,\n     * but that's awkward because we might be calling this from the visitor\n     *\n     * supports:\n     *      at most one parent\n     *      \"this\"\n     *      lookup by id\n     *      lookup by name\n     *      but nothing more!\n     *\n     * what is most important is that it supports everything \"the long id\"\n     * will render as!\n     */\n    static parseFromString(s: string) {\n        s = s.trim();\n        checkThrow(s, 'Vl|Cannot parse from string. No such object or selection.');\n\n        /* remove of this stack, of this bg */\n        let sRemove = ' of this stack';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n        sRemove = ' of this background';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n        sRemove = ' of this bkgnd';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n        sRemove = ' of this bg';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n        sRemove = ' of this card';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n        sRemove = ' of this cd';\n        if (s.endsWith(sRemove)) {\n            s = s.substr(0, s.length - sRemove.length).trim();\n        }\n\n        let ret = new RequestedVelRef(VpcElType.Unknown);\n        let ptsStackParent = s.split(' of stack ');\n        if (ptsStackParent.length === 2) {\n            ret.parentStackInfo = VelRenderId.parseFromString('stack ' + ptsStackParent[1]);\n            s = ptsStackParent[0];\n        }\n        let ptsBgParent = s.split(/ of (?:background|bkgnd|bg) /);\n        if (ptsBgParent.length === 2) {\n            ret.parentBgInfo = VelRenderId.parseFromString('bkgnd ' + ptsBgParent[1]);\n            s = ptsBgParent[0];\n        }\n        let ptsCardParent = s.split(/ of (?:card|cd) /);\n        if (ptsCardParent.length === 2) {\n            ret.parentCdInfo = VelRenderId.parseFromString('card ' + ptsCardParent[1]);\n            s = ptsCardParent[0];\n        }\n\n        /* by only splitting by single space we won't accept \"this  stack\"\n        but we can also losslessly join by space later (to accept names with spaces) */\n        let words = s.trim().split(/\\s/);\n        if (words.length === 2 && words[0] === 'this' && words[1] === 'stack') {\n            ret.type = VpcElType.Stack;\n            ret.lookByRelative = OrdinalOrPosition.This;\n            return ret;\n        } else if (words.length === 2 && words[0] === 'this' && findStrToEnum<VpcElType>(VpcElType, words[1]) === VpcElType.Bg) {\n            ret.type = VpcElType.Bg;\n            ret.lookByRelative = OrdinalOrPosition.This;\n            return ret;\n        } else if (\n            words.length === 2 &&\n            words[0] === 'this' &&\n            findStrToEnum<VpcElType>(VpcElType, words[1]) === VpcElType.Card\n        ) {\n            ret.type = VpcElType.Card;\n            ret.lookByRelative = OrdinalOrPosition.This;\n            return ret;\n        }\n\n        let getType = (sIn: string) => {\n            return getStrToEnum<VpcElType>(VpcElType, 'element type, expected \"card\" or \"button\"', sIn);\n        };\n\n        checkThrow(words.length >= 2, 'Vk|too short, expected something like `card id 123`');\n        let isPartFld = findStrToEnum<VpcElType>(VpcElType, words[1]) === VpcElType.Fld;\n        let isPartBtn = findStrToEnum<VpcElType>(VpcElType, words[1]) === VpcElType.Btn;\n        if (isPartFld || isPartBtn) {\n            let cdOrBg = getType(words[0]);\n            if (cdOrBg === VpcElType.Card) {\n                ret.partIsCd = true;\n            } else if (cdOrBg === VpcElType.Bg) {\n                ret.partIsBg = true;\n            } else {\n                checkThrow(false, 'Vj|expected something like `cd btn id 123`, got something like `stack btn id 123`');\n            }\n\n            /* remove the cd/bg prefix */\n            words.splice(0, 1);\n        }\n\n        let realType = getType(words[0]);\n        ret.type = realType;\n        if (words[1] === 'id') {\n            checkThrow(words.length >= 3, 'Vi|too short, expected something like `card id 123`');\n            let theId = Util512.parseInt(words[2]);\n            checkThrow(theId, 'Tz|invalid number. expected something like `card id 123`');\n            ret.lookById = theId;\n        } else {\n            let restOfString = words.slice(1).join(' ');\n            if (restOfString.startsWith('\"') && restOfString.endsWith('\"')) {\n                ret.lookByName = restOfString.slice(1, -1);\n            } else {\n                checkThrow(false, 'Vh|expected either `cd id 123` or `cd \"name\"`');\n            }\n        }\n\n        return ret;\n    }\n}\n\n/**\n * the user asked \"put the number of cd btn 'a' into x\"\n */\nexport class VelGetNumberProperty {\n    constructor(protected model: VpcModelTop) {}\n    /**\n     * get the number. note that the adjective is ignored, \"long number\" === \"short number\"\n     */\n    go(vel: VpcElBase) {\n        if (vel instanceof VpcElStack) {\n            /* emulator throws an error,\n            but since we support 'stack 1' we may as well do this. */\n            return 1;\n        } else if (vel instanceof VpcElProductOpts) {\n            checkThrow(false, 'Tx|This type of object does not have a number.');\n        } else {\n            return this.goStandard(vel);\n        }\n    }\n\n    /**\n     * most objects exist in a list of siblings\n     */\n    goStandard(vel: VpcElBase) {\n        let parentList: VpcElBase[] = [];\n        if (vel.getType() === VpcElType.Bg) {\n            let parent = this.model.getOwner(VpcElStack, vel);\n            parentList = parent.bgs;\n        } else if (vel.getType() === VpcElType.Card) {\n            parentList = this.model.stack.getCardOrder().map(id => this.model.getByIdUntyped(id));\n        } else if (vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld) {\n            let parent = this.model.getOwner(VpcElCard, vel);\n            let isBg = vel.getS('is_bg_velement_id').length > 0;\n            parentList = parent.parts.filter(\n                e => e.getType() === vel.getType() && isBg === e.getS('is_bg_velement_id').length > 0\n            );\n        }\n\n        checkThrow(parentList && parentList.length, 'Tu|parent list not found or empty');\n        let index = parentList.findIndex(e => e.idInternal === vel.idInternal);\n        checkThrow(index !== -1, 'Tt|object not found belonging to its parent');\n        return index + 1; /* one-based indexing */\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velResolveContainer.ts",
    "content": "\n/* auto */ import { VpcValS } from './../vpcutils/vpcVal';\n/* auto */ import { ReadableContainer, WritableContainer } from './../vpcutils/vpcUtils';\n/* auto */ import { checkThrow } from './../vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldReadWrite } from './velOutsideInterfaces';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcHandleLinkedVels } from './velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { slength } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a readable container for a simple string.\n * (some readable containers are more complex, like a field that has formatted text)\n */\nexport class ReadableContainerStr implements ReadableContainer {\n    constructor(protected s: string) {}\n    isDefined() {\n        return true;\n    }\n\n    getRawString() {\n        return this.s;\n    }\n\n    len() {\n        return this.s.length;\n    }\n}\n\n/**\n * a readable + writable container\n */\nexport class RWContainerVar implements WritableContainer {\n    constructor(protected outside: OutsideWorldReadWrite, public varName: string) {}\n    isDefined() {\n        return this.outside.IsVarDefined(this.varName);\n    }\n\n    getRawString() {\n        return this.outside.ReadVarContents(this.varName).readAsString();\n    }\n\n    len() {\n        return this.getRawString().length;\n    }\n\n    splice(insertion: number, lenToDelete: number, newText: string) {\n        /* mimic Array.splice */\n        let current = this.getRawString();\n        let ret = '';\n        ret += current.substring(0, insertion);\n        ret += newText;\n        ret += current.substring(insertion + lenToDelete);\n        this.outside.SetVarContents(this.varName, VpcValS(ret));\n    }\n\n    setAll(newText: string) {\n        this.outside.SetVarContents(this.varName, VpcValS(newText));\n    }\n\n    replaceAll(search: string, replaceWith: string) {\n        let s = this.getRawString();\n        let result = RWContainerVar.replaceAll(s, search, replaceWith);\n        this.setAll(result);\n    }\n\n    static replaceAll(s: string, search: string, replace: string) {\n        checkThrow(slength(search) > 0, 'Ts|you cannot search for an empty string, replace \"\" with \"\" in s is not allowed.');\n\n        /* regular expressions would be faster, but we'd need to escape\n        all metacharacters in the search string (hard to know if any metacharacters missed)\n        and also need to be careful about special strings like $& in the replace string.\n        so, until there's a standardized re.escape, use this. */\n        return s.split(search).join(replace);\n    }\n}\n\n/**\n * reading/writing content to a field\n */\nexport class RWContainerField implements WritableContainer {\n    constructor(protected fld: VpcElField, protected h: VpcHandleLinkedVels) {}\n    isDefined() {\n        return true;\n    }\n\n    len() {\n        /* this is fast, it's the reason we have a len() and not just getRawString().length */\n        return this.fld.getFmTxt().len();\n    }\n\n    getRawString(): string {\n        return this.fld.getFmTxt().toUnformatted();\n    }\n\n    splice(insertion: number, lenToDelete: number, newstring: string) {\n        let txt = this.fld.getFmTxt();\n        if (insertion === 0 && lenToDelete >= txt.len()) {\n            /* follow emulator, there is different behavior\n            (lose formatting) when replacing all text */\n            this.fld.setProp('alltext', VpcValS(newstring), this.h);\n        } else {\n            let font = insertion >= 0 && insertion < txt.len() ? txt.fontAt(insertion) : this.fld.getDefaultFontAsUi512();\n            let newTxt = FormattedText.byInsertion(txt, insertion, lenToDelete, newstring, font);\n            this.fld.setFmTxt(newTxt, this.h);\n        }\n    }\n\n    setAll(newText: string) {\n        /* follow emulator, there is different behavior (lose formatting) when replacing all text */\n        this.fld.setProp('alltext', VpcValS(newText), this.h);\n    }\n\n    replaceAll(search: string, replaceWith: string) {\n        /* currently loses all formatting. this feature could be added if desired. */\n        let s = this.getRawString();\n        let result = RWContainerVar.replaceAll(s, search, replaceWith);\n        this.setAll(result);\n    }\n}\n\n/**\n * reading/writing content to 'the selection'\n */\nexport class RWContainerFldSelection implements WritableContainer {\n    constructor(protected fld: O<VpcElField>, protected h: VpcHandleLinkedVels, protected start: number, protected end: number) {}\n    isDefined() {\n        return true;\n    }\n\n    len() {\n        return this.end - this.start;\n    }\n\n    getRawString(): string {\n        if (this.fld) {\n            return this.fld.getFmTxt().toUnformatted().substring(this.start, this.end);\n        } else {\n            return '';\n        }\n    }\n\n    splice(insertion: number, lenToDelete: number, newstring: string) {\n        checkThrow(this.fld, \"Vm|There isn't a selection\");\n        let txt = this.fld.getFmTxt();\n        if (insertion === 0 && lenToDelete >= txt.len() && this.start === 0 && this.end >= txt.len() - 1) {\n            /* follow emulator, there is different behavior\n            (lose formatting) when replacing all text */\n            this.fld.setProp('alltext', VpcValS(newstring), this.h);\n        } else {\n            let slice = txt.slice(this.start, this.end);\n            let trueInsert = insertion + this.start;\n            let font = trueInsert >= 0 && trueInsert < txt.len() ? txt.fontAt(trueInsert) : this.fld.getDefaultFontAsUi512();\n            let newSliceContents = FormattedText.byInsertion(slice, insertion, lenToDelete, newstring, font);\n            let newTxt = FormattedText.byInsertion(\n                txt,\n                this.start,\n                this.end - this.start,\n                newSliceContents.toUnformatted(),\n                font\n            );\n            this.fld.setFmTxt(newTxt, this.h);\n        }\n    }\n\n    setAll(newText: string) {\n        this.splice(0, this.len(), newText);\n    }\n\n    replaceAll(search: string, replaceWith: string) {\n        /* currently loses all formatting. this feature could be added if desired. */\n        let s = this.getRawString();\n        let result = RWContainerVar.replaceAll(s, search, replaceWith);\n        this.setAll(result);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velResolveReference.ts",
    "content": "\n/* auto */ import { RememberHistory } from './../vpcutils/vpcUtils';\n/* auto */ import { RequestedVelRef } from './../vpcutils/vpcRequestedReference';\n/* auto */ import { OrdinalOrPosition, VpcElType, checkThrow, checkThrowEq, checkThrowInternal, findPositionFromOrdinalOrPosition, ordinalOrPositionIsPosition } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './velStack';\n/* auto */ import { VpcElProductOpts } from './velProductOpts';\n/* auto */ import { VpcModelTop } from './velModelTop';\n/* auto */ import { VpcElField } from './velField';\n/* auto */ import { VpcElCard } from './velCard';\n/* auto */ import { VpcElButton } from './velButton';\n/* auto */ import { VpcElBg } from './velBg';\n/* auto */ import { VpcElBase } from './velBase';\n/* auto */ import { O, tostring, trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, assertWarnEq, cast, getEnumToStrOrFallback } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a script refers to an object that might or might not exist,\n * go from a RequestedVelRef to a concrete VpcElBase\n */\nexport class VelResolveReference {\n    constructor(protected model: VpcModelTop) {}\n    /**\n     * resolve the reference\n     * returns the given parent card as well,\n     * since 'bg fld id 1234 of cd 1' is different than 'bg fld id 1234 of cd 2'\n     */\n    go(ref: RequestedVelRef, me: O<VpcElBase>, target: O<VpcElBase>, cardHistory: RememberHistory): O<VpcElBase> {\n        checkThrow(ref instanceof RequestedVelRef, '76|invalid RequestedElRef');\n        ref.checkOnlyOneSpecified();\n\n        /* special categories */\n        checkThrow(!ref.cardLookAtMarkedOnly || ref.type === VpcElType.Card, 'T<|');\n        checkThrow(!ref.cardIsRecentHistory || ref.type === VpcElType.Card, 'T;|');\n        if (ref.isReferenceToMe) {\n            checkThrowEq(VpcElType.Unknown, ref.type, 'T:|');\n            return me;\n        } else if (ref.isReferenceToTarget) {\n            checkThrowEq(VpcElType.Unknown, ref.type, '6}|');\n            return target;\n        } else if (ref.cardIsRecentHistory) {\n            return this.getFromCardRecentHistory(ref, cardHistory);\n        }\n\n        /* some things should not be by position */\n        if (ref.type === VpcElType.Btn || ref.type === VpcElType.Fld) {\n            checkThrow(!ref.lookByRelative || !ordinalOrPositionIsPosition(ref.lookByRelative), 'W1|cannot be by position');\n        }\n\n        /* combine parents into one chain */\n        this.combineParents(ref);\n\n        /* resolve parents */\n        let parentCard: O<VpcElCard>;\n        let parentBg: O<VpcElBg>;\n        if (ref.parentCdInfo) {\n            let aParentCard = this.go(ref.parentCdInfo, me, target, cardHistory);\n            checkThrow(aParentCard, 'W0|break, not found, parent not found');\n            parentCard = cast(VpcElCard, aParentCard, 'break, not found, wrong parent type');\n        }\n        if (ref.parentBgInfo) {\n            let aParentBg = this.go(ref.parentBgInfo, me, target, cardHistory);\n            checkThrow(aParentBg, 'V~|break, not found, parent not found');\n            parentBg = cast(VpcElBg, aParentBg, 'break, not found, wrong parent type');\n        }\n        if (ref.parentStackInfo) {\n            let aParentStack = this.go(ref.parentStackInfo, me, target, cardHistory);\n            checkThrow(aParentStack, 'V}|break, not found, parent not found');\n            cast(VpcElStack, aParentStack, 'break, not found, wrong parent type');\n            /* we can now safely ignore parentStack,\n            since the only options are 1) doesn't exist\n            and 2) exists and refers to this stack */\n        }\n\n        let ret: O<VpcElBase>;\n        if (ref.partIsBg) {\n            let found = this.lookForBgPart(ref, parentCard, parentBg);\n            this.doParentsHaveRightHierarchy(found, ref, parentCard, parentBg);\n            ret = this.doubleCheckVelType(found, ref, parentCard, parentBg);\n        } else if (ref.lookById) {\n            let found = this.model.findByIdUntyped(tostring(ref.lookById));\n            this.doParentsHaveRightHierarchy(found, ref, parentCard, parentBg);\n            ret = this.doubleCheckVelType(found, ref, parentCard, parentBg);\n        } else {\n            let methodName = 'go' + Util512.capitalizeFirst(getEnumToStrOrFallback(VpcElType, ref.type));\n            let found = Util512.callAsMethodOnClass(\n                VelResolveReference.name,\n                this,\n                methodName,\n                [ref, parentCard, parentBg],\n                false\n            ) as O<VpcElBase>;\n            this.doParentsHaveRightHierarchy(found, ref, parentCard, parentBg);\n            ret = this.doubleCheckVelType(found, ref, parentCard, parentBg);\n        }\n\n        return ret;\n    }\n\n    /**\n     * bg parts are complicated\n     */\n    protected lookForBgPart(ref: RequestedVelRef, parentCard: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        checkThrow(!parentBg, \"V||can't say bg fld 1 of bg 3, have to access via a card\");\n        checkThrow(ref.type === VpcElType.Btn || ref.type === VpcElType.Fld, 'V{|only parts can belong to a bg');\n        parentCard = parentCard ?? this.model.getCurrentCard();\n        let arr = parentCard.parts.filter(vel => vel.getS('is_bg_velement_id').length > 0 && vel.getType() === ref.type);\n        if (ref.lookById) {\n            /* remember that for bg parts, userfacing id IS NOT THE SAME AS internal velid */\n            let lookById = ref.lookById.toString();\n            return arr.find(vel => vel.getS('is_bg_velement_id') === lookById);\n        } else if (ref.lookByAbsolute !== undefined) {\n            return arr[ref.lookByAbsolute - 1];\n        } else if (ref.lookByName !== undefined) {\n            return arr.find(vel => vel.getS('name').toLowerCase() === ref.lookByName?.toLowerCase());\n        } else if (ref.lookByRelative) {\n            let index = findPositionFromOrdinalOrPosition(ref.lookByRelative, 0, 0, arr.length - 1);\n            return index === undefined ? undefined : arr[index];\n        } else {\n            checkThrow(false, 'V_|no specifier');\n        }\n    }\n\n    /**\n     * do parents make sense\n     */\n    protected doParentsHaveRightHierarchy(\n        found: O<VpcElBase>,\n        ref: RequestedVelRef,\n        parentCard: O<VpcElCard>,\n        parentBg: O<VpcElBg>\n    ) {\n        if (found && found.getType() === VpcElType.Stack) {\n            checkThrow(!parentCard, 'V^|break, not found, cannot have this this type of parent');\n            checkThrow(!parentBg, 'V]|break, not found, cannot have this this type of parent');\n        } else if (found && found.getType() === VpcElType.Bg) {\n            checkThrow(!parentCard, 'V[|break, not found, cannot have this this type of parent');\n            checkThrow(!parentBg, 'V@|break, not found, cannot have this this type of parent');\n        } else if (found && found.getType() === VpcElType.Card) {\n            checkThrow(!parentCard, 'V?|break, not found, cannot have this this type of parent');\n        }\n\n        /* double-check classes */\n        if (found && found.getType() === VpcElType.Card) {\n            checkThrow(found instanceof VpcElCard, 'V>|break, not found, incorrect class');\n        } else if (found && found.getType() === VpcElType.Fld) {\n            checkThrow(found instanceof VpcElField, 'V=|break, not found, incorrect class');\n        } else if (found && found.getType() === VpcElType.Product) {\n            checkThrow(found instanceof VpcElProductOpts, 'V<|break, not found, incorrect class');\n        } else if (found && found.getType() === VpcElType.Stack) {\n            checkThrow(found instanceof VpcElStack, 'V;|break, not found, incorrect class');\n        } else if (found && found.getType() === VpcElType.Bg) {\n            checkThrow(found instanceof VpcElBg, 'V:|break, not found, incorrect class');\n        } else if (found && found.getType() === VpcElType.Btn) {\n            checkThrow(found instanceof VpcElButton, 'V/|break, not found, incorrect class');\n        } else if (found) {\n            checkThrow(false, 'V.|unknown type');\n        }\n    }\n\n    /**\n     * get the results, get the correct card to reference a bg item from\n     */\n    protected doubleCheckVelType(\n        found: O<VpcElBase>,\n        ref: RequestedVelRef,\n        parentCard: O<VpcElCard>,\n        parentBg: O<VpcElBg>\n    ): O<VpcElBase> {\n        if (!found) {\n            return undefined;\n        }\n\n        /* confirm type lines up with what we expect */\n        checkThrow(\n            !found || ref.type === VpcElType.Unknown || ref.type === found.getType(),\n            'V-|break, not found, unexpected type'\n        );\n\n        if (found.getType() === VpcElType.Card) {\n            checkThrow(!parentBg || found.parentIdInternal === parentBg.idInternal, 'V,|break, not found, wrong card parent');\n        } else if (found.getType() === VpcElType.Btn || found.getType() === VpcElType.Fld) {\n            checkThrow(!parentCard || found.parentIdInternal === parentCard.idInternal, 'V+|break, not found, wrong card parent');\n            checkThrow(!parentBg, \"V*|break, not found, a card element can't belong to a bg\");\n        }\n\n        checkThrow(!ref.cardLookAtMarkedOnly || ref.type === VpcElType.Card, 'V)|marked only is only for cards');\n        if (found && found.getType() !== VpcElType.Fld && found.getType() !== VpcElType.Btn) {\n            checkThrow(!ref.partIsBg, 'V(|does not make sense to belong to bg');\n            checkThrow(!ref.partIsCd, 'V&|does not make sense to belong to cd');\n        } else if (found) {\n            assertWarn(ref.partIsCd || ref.partIsBg || ref.partIsCdOrBg, 'V%|expect to look up by cd or by bg');\n        }\n\n        if (ref.partIsCd) {\n            /* important for preventing someone from\n            using the internal true id to look up a bg btn */\n            checkThrow(found.getS('is_bg_velement_id').length === 0, 'V#|break, not found, said to belong to card');\n            checkThrow(!ref.partIsBg, 'V!|');\n        }\n        if (ref.partIsBg) {\n            checkThrow(found.getS('is_bg_velement_id').length > 0, 'V |break, not found, said to belong to bg');\n            checkThrow(!ref.partIsCd, 'Vz|');\n        }\n\n        return found;\n    }\n\n    /**\n     * consolidate parents into one chain\n     */\n    protected combineParents(ref: RequestedVelRef) {\n        if (ref.parentCdInfo) {\n            if (ref.parentBgInfo) {\n                ref.parentCdInfo.parentBgInfo = ref.parentBgInfo;\n                ref.parentBgInfo = undefined;\n                if (ref.parentStackInfo) {\n                    ref.parentCdInfo.parentBgInfo.parentStackInfo = ref.parentStackInfo;\n                    ref.parentStackInfo = undefined;\n                }\n            } else if (ref.parentStackInfo) {\n                ref.parentCdInfo.parentStackInfo = ref.parentStackInfo;\n                ref.parentStackInfo = undefined;\n            }\n        } else if (ref.parentBgInfo) {\n            if (ref.parentStackInfo) {\n                ref.parentBgInfo.parentStackInfo = ref.parentStackInfo;\n                ref.parentStackInfo = undefined;\n            }\n        }\n    }\n\n    /**\n     * implement \"back\", \"forth\". match product behavior: if card no longer exists, keep going\n     */\n    protected getFromCardRecentHistory(ref: RequestedVelRef, cardHistory: RememberHistory): O<VpcElBase> {\n        let currentCard = this.model.getCurrentCard();\n        let refersTo: O<string>;\n        let fallback = () => currentCard.idInternal;\n        let cardExists = (s: string) => {\n            let cd = this.model.findByIdUntyped(s);\n            return trueIfDefinedAndNotNull(cd) && cd.getType() === VpcElType.Card;\n        };\n\n        /* confirmed in the emulator that refering to 'back' doesn't alter its state */\n        if (ref.cardIsRecentHistory === 'recent' || ref.cardIsRecentHistory === 'back') {\n            refersTo = cardHistory.walkPreviousWhileAcceptible(fallback, cardExists);\n            cardHistory.walkNextWhileAcceptible(fallback, cardExists);\n        } else if (ref.cardIsRecentHistory === 'forth') {\n            refersTo = cardHistory.walkNextWhileAcceptible(fallback, cardExists);\n            cardHistory.walkPreviousWhileAcceptible(fallback, cardExists);\n        }\n\n        checkThrow(refersTo, `T-|can't see card \"${ref.cardIsRecentHistory}\"`);\n        let cd = this.model.findByIdUntyped(refersTo);\n        checkThrow(trueIfDefinedAndNotNull(cd) && cd.getType() === VpcElType.Card, 'J+|wrong type');\n        return cd;\n    }\n\n    /**\n     * share logic for buttons and fields\n     */\n    protected goFld(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>) {\n        return this.goBtnOrFld(ref, parentCd, parentBg);\n    }\n\n    /**\n     * share logic for buttons and fields\n     */\n    protected goBtn(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>) {\n        return this.goBtnOrFld(ref, parentCd, parentBg);\n    }\n\n    /**\n     * resolve a productopts\n     */\n    protected goProduct(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        checkThrow(\n            !ref.lookByAbsolute &&\n                !ref.lookById &&\n                !ref.lookByName &&\n                (!ref.lookByRelative || ref.lookByRelative === OrdinalOrPosition.This),\n            'Vy|only one productOpts'\n        );\n        return this.model.productOpts;\n    }\n\n    /**\n     * resolve a stack\n     */\n    protected goStack(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        if (ref.lookByName !== undefined) {\n            /* `the short id of stack \"myStack\"` */\n            if (ref.lookByName.startsWith('Hard Drive:')) {\n                ref.lookByName = ref.lookByName.substr('Hard Drive:'.length);\n            }\n\n            return ref.lookByName.toLowerCase() === this.model.stack.getS('name').toLowerCase() ? this.model.stack : undefined;\n        } else if (ref.lookByAbsolute !== undefined) {\n            /* `the short id of stack 1` */\n            return ref.lookByAbsolute === 1 ? this.model.stack : undefined;\n        } else if (ref.lookByRelative) {\n            /* `the short id of this stack` */\n            if (\n                ref.lookByRelative === OrdinalOrPosition.This ||\n                ref.lookByRelative === OrdinalOrPosition.Any ||\n                ref.lookByRelative === OrdinalOrPosition.Middle ||\n                ref.lookByRelative === OrdinalOrPosition.Last ||\n                ref.lookByRelative === OrdinalOrPosition.First\n            ) {\n                return this.model.stack;\n            } else {\n                return undefined;\n            }\n        } else {\n            /* it's ok if no specifiers were given\n            it is valid to say `get the number of cards of stack` */\n            return this.model.stack;\n        }\n    }\n\n    /**\n     * resolve a bg\n     */\n    protected goBg(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        let arr = this.model.stack.bgs;\n        if (ref.lookByName !== undefined) {\n            /* `the short id of bg \"theName\"` */\n            return arr.find(vel => vel.getS('name').toLowerCase() === ref?.lookByName?.toLowerCase());\n        } else if (ref.lookByAbsolute !== undefined) {\n            /* `the short id of bg 2` */\n            return arr[ref.lookByAbsolute - 1];\n        } else if (ref.lookByRelative) {\n            /* `the short id of first bg, the short id of next bg` */\n            let cur = this.model.getCurrentCard().parentIdInternal;\n            let curIndex = arr.findIndex(item => item.idInternal === cur);\n            let index = findPositionFromOrdinalOrPosition(ref.lookByRelative, curIndex, 0, arr.length - 1);\n            return index === undefined ? undefined : arr[index];\n        } else {\n            checkThrow(false, 'Vx|unknown object reference');\n        }\n    }\n\n    /**\n     * resolve a card\n     */\n    protected goCard(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        let arr = this.model.stack.getCardOrder().map(item => this.model.getCardById(item));\n        if (parentBg) {\n            arr = parentBg.cards;\n        }\n\n        let currCdId = this.model.getCurrentCard().idInternal;\n        if (ref.lookByName !== undefined) {\n            if (ref.cardLookAtMarkedOnly) {\n                arr = arr.filter(cd => cd.getB('marked'));\n            }\n            /* `the short id of cd \"theName\"` */\n            let curId = this.model.getCurrentCard().idInternal;\n            let pivot = arr.findIndex(vel => vel.idInternal === curId);\n            if (pivot !== -1) {\n                /* match product: start search from current card and wrap around */\n                /* this doesn't happen for bg names. */\n                let prevLen = arr.length;\n                arr = arr.slice(pivot + 1).concat(arr.slice(0, pivot + 1));\n                assertWarnEq(prevLen, arr.length, 'Vw|');\n            }\n            return arr.find(vel => vel.getS('name').toLowerCase() === ref?.lookByName?.toLowerCase());\n        } else if (ref.lookByAbsolute !== undefined) {\n            if (ref.cardLookAtMarkedOnly) {\n                arr = arr.filter(cd => cd.getB('marked'));\n            }\n            /* `the short id of cd 2` */\n            return arr[ref.lookByAbsolute - 1];\n        } else if (ref.lookByRelative) {\n            arr = this.model.stack.getCardOrder().map(item => this.model.getCardById(item));\n            let keepCurCd =\n                ref.lookByRelative === OrdinalOrPosition.Previous || /* bool */ ref.lookByRelative === OrdinalOrPosition.Next;\n            let justMe = [this.model.getCurrentCard()];\n            if (ref.cardLookAtMarkedOnly) {\n                arr = arr.filter(cd => cd.getB('marked') || /* bool */ (keepCurCd && cd.idInternal === currCdId));\n                justMe = justMe.filter(cd => cd.getB('marked'));\n            }\n            if (parentBg) {\n                arr = arr.filter(\n                    cd => cd.parentIdInternal === parentBg.idInternal || /* bool */ (keepCurCd && cd.idInternal === currCdId)\n                );\n                justMe = justMe.filter(cd => cd.parentIdInternal === parentBg.idInternal);\n            }\n\n            let curIndex = arr.findIndex(item => item.idInternal === currCdId);\n            /* confirmed in emulator: */\n            /* `the short id of this marked cd` should fail if this cd is not marked */\n            /* `the short id of this cd of bg 2` should fail if this cd is not in bg 2 */\n            checkThrow(\n                !(keepCurCd && justMe.length === 0 && arr.length === 1 && arr[0].idInternal === currCdId),\n                'Vv|break, not found, this/next does not meet criteria'\n            );\n            checkThrow(\n                !(ref.lookByRelative === OrdinalOrPosition.This && curIndex === -1),\n                \"Vu|break, not found, 'this' card does not meet criteria\"\n            );\n            let index = findPositionFromOrdinalOrPosition(ref.lookByRelative, curIndex, 0, arr.length - 1);\n            return index === undefined ? undefined : arr[index];\n        } else {\n            checkThrowInternal(false, 'Vt|unknown object reference');\n        }\n    }\n\n    /**\n     * resolve a button or field\n     */\n    protected goBtnOrFld(ref: RequestedVelRef, parentCd: O<VpcElCard>, parentBg: O<VpcElBg>): O<VpcElBase> {\n        checkThrow(!ref.partIsBg, 'Vs|should be covered elsewhere');\n        checkThrow(!parentBg, 'Vr|does not make sense to have a parent bg');\n        parentCd = parentCd ?? this.model.getCurrentCard();\n        if (ref.lookByName !== undefined) {\n            /* `the short id of cd btn \"theName\"` */\n            return parentCd.parts.find(\n                vel =>\n                    vel.getType() === ref.type &&\n                    vel.getS('name').toLowerCase() === ref?.lookByName?.toLowerCase() &&\n                    !vel.getS('is_bg_velement_id').length\n            );\n        } else if (ref.lookByAbsolute !== undefined) {\n            /* `the short id of cd btn 2` */\n            let arr = parentCd.parts.filter(vel => vel.getType() === ref.type && !vel.getS('is_bg_velement_id').length);\n            return arr[ref.lookByAbsolute - 1];\n        } else if (ref.lookByRelative) {\n            /* `the short id of first cd btn` */\n            let arr = parentCd.parts.filter(vel => vel.getType() === ref.type && !vel.getS('is_bg_velement_id').length);\n            let index = findPositionFromOrdinalOrPosition(ref.lookByRelative, 0, 0, arr.length - 1);\n            return index === undefined ? undefined : arr[index];\n        } else {\n            checkThrow(false, 'T,|unknown object reference');\n        }\n    }\n\n    /**\n     * count number of elements\n     * pretty limited, since we only support what the original product supported\n     */\n    countElements(type: VpcElType, parentRef: RequestedVelRef, cardHistory: RememberHistory) {\n        let countMarked = parentRef.cardLookAtMarkedOnly;\n        parentRef.cardLookAtMarkedOnly = false;\n        let parent = this.go(parentRef, undefined, undefined, cardHistory);\n        if (type === VpcElType.Product) {\n            return 1;\n        } else if (type === VpcElType.Stack) {\n            return 1;\n        } else if (type === VpcElType.Bg) {\n            /* ensure parent exists and is a stack */\n            checkThrow(parent && parent instanceof VpcElStack, 'Vq|could not find this object parent');\n            return this.model.stack.bgs.length;\n        } else if (type === VpcElType.Card) {\n            if (parent instanceof VpcElStack) {\n                let arr = parent.getCardOrder();\n                if (countMarked) {\n                    let cds = arr.map(id => this.model.findByIdUntyped(id)).filter(cd => cd?.getB('marked'));\n                    return cds.length;\n                } else {\n                    return arr.length;\n                }\n            } else if (parent instanceof VpcElBg) {\n                let arr = parent.cards;\n                if (countMarked) {\n                    let cds = arr.filter(cd => cd.getB('marked'));\n                    return cds.length;\n                } else {\n                    return arr.length;\n                }\n            } else {\n                checkThrow(false, 'Vp|could not find this object parent or incorrect type');\n            }\n        } else if (type === VpcElType.Btn || type === VpcElType.Fld) {\n            if (parent instanceof VpcElBg) {\n                let arr = parent\n                    .getTemplateCard()\n                    .parts.filter(vel => vel.getType() === type && vel.getS('is_bg_velement_id').length);\n                return arr.length;\n            } else if (parent instanceof VpcElCard) {\n                let arr = parent.parts.filter(vel => vel.getType() === type && !vel.getS('is_bg_velement_id').length);\n                return arr.length;\n            } else {\n                checkThrow(false, 'Vo|could not find this object parent or incorrect type');\n            }\n        } else {\n            checkThrow(false, 'Vn|unknown type');\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velSerialization.ts",
    "content": "\n/* auto */ import { VpcElType, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElBase, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { IsUtil512Serializable } from './../../ui512/utils/util512Serialize';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { AnyJson, Util512 } from './../../ui512/utils/util512';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { ElementObserverNoOp, ElementObserverVal, UI512Gettable, UI512PublicSettable } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { specialCharNumFontChange, specialCharNumNewline, specialCharNumTab } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { bridgedBase64Js } from './../../bridge/bridgeBase64Js';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * serialization of VPC objects, preparing them for JSON.serialize\n */\nexport const VpcGettableSerialization = /* static class */ {\n    /**\n     * serialize a Gettable to a JS object\n     */\n    serializeGettable(vel: UI512Gettable) {\n        let ret: { [key: string]: string | number | boolean } = {};\n        let keys = Util512.getMapKeys(vel as any);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            let propName = keys[i];\n            if (propName.startsWith('_') && propName[1] !== '_') {\n                propName = propName.slice(1);\n                let v = vel.getGeneric(propName);\n                assertWarn(v !== undefined, propName, 'J||');\n                if (v instanceof FormattedText) {\n                    assertWarn(\n                        VpcGettableSerialization._propNameExpectFormattedText(propName),\n                        'T@|expected ftxt, got ',\n                        propName\n                    );\n                    assertTrue(v instanceof FormattedText, 'J{|invalid ftxt');\n                    ret[propName] = v.toSerialized();\n                } else {\n                    ret[propName] = VpcGettableSerialization.serializePlain(v);\n                }\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * deserialize a JS object to a Settable\n     */\n    deserializeSettable(vel: VpcElBase, vals: AnyJson, h: VpcHandleLinkedVels) {\n        let savedObserver = vel.observer;\n        try {\n            vel.observer = new ElementObserverNoOp();\n            let expectToSee = Util512.getMapKeys(vel as any);\n            let whichWereSet: { [key: string]: boolean } = {};\n            let keys = Util512.getMapKeys(vals as any);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                let propName = keys[i];\n                whichWereSet[propName] = true;\n                let v = vals[propName];\n                if (VpcGettableSerialization._propNameExpectFormattedText(propName)) {\n                    if (typeof v === 'string') {\n                        let vAsText = FormattedText.newFromSerialized(v);\n                        VpcGettableSerialization._setAnyAndSendChangeNotification(vel, propName, vAsText, h);\n                    } else {\n                        assertTrue(v instanceof FormattedText, 'J`|not a string or FormattedText');\n                        VpcGettableSerialization._setAnyAndSendChangeNotification(vel, propName, v, h);\n                    }\n                } else {\n                    let decoded = VpcGettableSerialization.deserializePlain(v);\n                    VpcGettableSerialization._setAnyAndSendChangeNotification(vel, propName, decoded, h);\n                }\n            }\n\n            /* send an alert if the saved file didn't have a property.\n            ok to have seen extra ones, though, could have come from card-specific */\n            for (let prp of expectToSee) {\n                let prpSliced = prp.slice(1);\n                if (\n                    !whichWereSet[prpSliced] &&\n                    prp.startsWith('_') &&\n                    prp[1] !== '_' &&\n                    !VpcGettableSerialization.okNotToSee[prpSliced]\n                ) {\n                    checkThrowInternal(false, `T?|in obj ${vel.idInternal} did not see ${prpSliced}`);\n                }\n            }\n        } finally {\n            vel.observer = savedObserver;\n        }\n    },\n\n    okNotToSee: {\n        sharedtext: true,\n        sharedhilite: true,\n        marked: true,\n        cardorder: true,\n        compatibilitymode: true,\n        is_bg_velement_id: true,\n        ftxt_uniquetocard: true,\n        scroll_uniquetocard: true,\n        hilite_uniquetocard: true,\n        checkmark_uniquetocard: true,\n        increasingnumberforelemnamefld: true\n    } as { [key: string]: boolean },\n\n    /**\n     * set a property, and set to 2 different values to ensure that the 'change' event is sent\n     */\n    _setAnyAndSendChangeNotification(vel: VpcElBase, propName: string, v: ElementObserverVal, h: VpcHandleLinkedVels) {\n        if (typeof v === 'boolean') {\n            (vel as any)['_' + propName] = false;\n            vel.setOnVel(propName, !v, h);\n            vel.setOnVel(propName, v, h);\n        } else if (typeof v === 'number') {\n            (vel as any)['_' + propName] = 0;\n            vel.setOnVel(propName, v === 0 ? 1 : 0, h);\n            vel.setOnVel(propName, v, h);\n        } else if (typeof v === 'string') {\n            (vel as any)['_' + propName] = '';\n            vel.setOnVel(propName, v.length === 0 ? ' ' : '', h);\n            vel.setOnVel(propName, v, h);\n        } else if (v instanceof FormattedText) {\n            (vel as any)['_' + propName] = new FormattedText();\n            vel.setOnVel(propName, new FormattedText(), h);\n            vel.setOnVel(propName, v, h);\n        } else {\n            assertWarn(false, 'T>|unknown data type for ' + v);\n        }\n    },\n\n    /**\n     * do we expect the type of this property to be a formattedtext\n     */\n    _propNameExpectFormattedText(propName: string) {\n        return (\n            propName === UI512PublicSettable.fmtTxtVarName ||\n            /* bool */ propName.startsWith(UI512PublicSettable.fmtTxtVarName + '_')\n        );\n    },\n\n    /**\n     * use base64 if the string contains nonprintable or nonascii chars\n     */\n    serializePlain(v: string | number | boolean): string | number | boolean {\n        if (typeof v === 'string' && VpcGettableSerialization.containsNonSimpleAscii(v.toString())) {\n            return 'b64``' + VpcGettableSerialization.jsBinaryStringToUtf16Base64(v.toString());\n        } else {\n            return v;\n        }\n    },\n\n    /**\n     * decode a string encoded by serializePlain\n     */\n    deserializePlain(v: string | number | boolean): string | number | boolean {\n        if (typeof v === 'string' && v.toString().startsWith('b64``')) {\n            let s = v.toString();\n            return VpcGettableSerialization.Base64Utf16ToJsBinaryString(s.substr('b64``'.length));\n        } else {\n            return v;\n        }\n    },\n\n    /**\n     * does the string contain nonprintable or nonascii chars?\n     */\n    containsNonSimpleAscii(s: string) {\n        for (let i = 0, len = s.length; i < len; i++) {\n            let c = s.charCodeAt(i);\n            if (\n                (c < 32 && c !== specialCharNumTab && c !== specialCharNumNewline && c !== specialCharNumFontChange) ||\n                c >= 128\n            ) {\n                return true;\n            }\n        }\n\n        return false;\n    },\n\n    /**\n     * to base64\n     * btoa does not support unicode characters and so we must use\n     * an intermediate step.\n     *\n     * use utf16le instead of utf8 because it was measured to be 40% more\n     * space-efficient for dense unicode data like this.\n     */\n    jsBinaryStringToUtf16Base64(str: string) {\n        let bytes: Uint8Array = new Uint8Array(str.length * 2);\n        for (let i = 0, len = str.length; i < len; i++) {\n            let n = str.charCodeAt(i) | 0;\n            bytes[i * 2] = n % 256;\n            bytes[i * 2 + 1] = n >> 8;\n        }\n\n        return bridgedBase64Js.fromByteArray(bytes);\n    },\n\n    /**\n     * decode a string encoded by jsBinaryStringToUtf16Base64\n     */\n    Base64Utf16ToJsBinaryString(str: string) {\n        let bytes = bridgedBase64Js.toByteArray(str);\n        let s = '';\n        for (let i = 0, len = bytes.length; i < len; i += 2) {\n            let n = bytes[i] + (bytes[i + 1] << 8);\n            s += String.fromCharCode(n);\n        }\n\n        return s;\n    }\n};\n\n/**\n * defines what a saved document is\n */\nexport class SerializedVpcDocStructure extends IsUtil512Serializable {\n    product = 'vpc';\n    fileformatmajor = 0;\n    fileformatminor = 0;\n    buildnumber = '';\n    uuid = '';\n    elements: SerializedVelStructure[] = [];\n}\n\n/**\n * defines what a serialized vel is\n */\nexport class SerializedVelStructure extends IsUtil512Serializable {\n    type: VpcElType;\n    id: string;\n    parent_id: string;\n    insertIndex: number;\n    attrs: { [key: string]: string | number | boolean };\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velStack.ts",
    "content": "\n/* auto */ import { VpcElType, checkThrow, checkThrowEq, checkThrowInternal } from './../vpcutils/vpcEnums';\n/* auto */ import { VpcElBg } from './velBg';\n/* auto */ import { PropGetter, PropSetter, PrpTyp, VpcElBase, VpcHandleLinkedVels } from './velBase';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, arLast, slength } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a vipercard \"stack\"\n */\nexport class VpcElStack extends VpcElBase {\n    protected _script = '';\n    protected _name = '';\n    protected _compatibilitymode = false;\n    constructor(id: string, parentId: string) {\n        super(id, parentId);\n    }\n\n    /* cached getters */\n    static cachedGetters: { [key: string]: PropGetter<VpcElBase> };\n\n    /* cached setters */\n    static cachedSetters: { [key: string]: PropSetter<VpcElBase> };\n\n    /* productopts are always given this id. */\n    static readonly initProductOptsId = '920';\n\n    /* stacks are always given this id. */\n    static readonly initStackId = '921';\n\n    /* initial value for counter used for internal script line numbers. */\n    static readonly initIncreasingNumberId = 50000;\n\n    /* counter for when you create a button in the ui and it's called \"my button 3\"\n    (persisted, but not undoable because it starts with 'increasingnumber') */\n    protected _increasingnumberforelemname = 1;\n\n    /* counter for when you create a button in the ui and it's called \"my field 3\"\n    (persisted, but not undoable because it starts with 'increasingnumber') */\n    protected _increasingnumberforelemnamefld = 1;\n\n    /* counter for creating numeric ids for elements\n    (persisted, but not undoable) */\n    protected _increasingnumberforid = 1000;\n\n    /* original author of the stack. when you hit save as, we remember the original stack info.\n    in the form author|1b2v123c|stack name||author|1b2v123c|stack name */\n    protected _stacklineage = '';\n\n    /* stored as a string so that undo is easier */\n    protected _cardorder = '';\n\n    /* child backgrounds */\n    bgs: VpcElBg[] = [];\n\n    /**\n     * convenience for getting card order\n     * fun fact: in the original product, cards aren't always in same order as the backgrounds,\n     * cut card/paste card can make them out of order\n     */\n    getCardOrder() {\n        return this._cardorder ? this._cardorder.split('|') : [];\n    }\n\n    /**\n     * convenience for setting card order\n     */\n    alterCardOrder(fn: (a: string[]) => string[], h: VpcHandleLinkedVels) {\n        let got = fn(this.getCardOrder());\n        assertTrue(got.length, 'W2|');\n        this.setOnVel('cardorder', got.join('|'), h);\n    }\n\n    /**\n     * get next id for created element\n     */\n    getNextId(h: VpcHandleLinkedVels) {\n        let ret = this.getN('increasingnumberforid');\n        this.setOnVel('increasingnumberforid', ret + 1, h);\n        return ret.toString();\n    }\n\n    /**\n     * get next number, when you create a button in the ui and it's called \"my button 3\"\n     */\n    getNextNumberForElemName(h: VpcHandleLinkedVels, forBtn: boolean) {\n        let fld = forBtn ? 'increasingnumberforelemname' : 'increasingnumberforelemnamefld';\n        let ret = this.getN(fld);\n        this.setOnVel(fld, ret + 1, h);\n        return ret.toString();\n    }\n\n    /**\n     * re-use cached getters and setter callback functions for better perf\n     */\n    startGettersSetters() {\n        VpcElStack.stackInit();\n        this.getters = VpcElStack.cachedGetters;\n        this.setters = VpcElStack.cachedSetters;\n    }\n\n    /**\n     * use this username if you create a new stack and aren't signed in.\n     */\n    lineageUsernameNull() {\n        return 'null';\n    }\n\n    /**\n     * get latest stack info (server id, username)\n     */\n    getLatestStackLineage(): VpcElStackLineageEntry {\n        let lin = this.getS('stacklineage');\n        if (slength(lin)) {\n            let linParts = lin.split('||');\n            return VpcElStackLineageEntry.fromSerialized(arLast(linParts));\n        } else {\n            checkThrowInternal(false, 'K5|stacklineage should never be empty');\n        }\n    }\n\n    /**\n     * set latest stack info (server id, username)\n     */\n    appendToStackLineage(entryIn: VpcElStackLineageEntry, h: VpcHandleLinkedVels) {\n        /* round-trip to validate it */\n        let entry = VpcElStackLineageEntry.fromSerialized(entryIn.serialize());\n        let lin = this.getS('stacklineage');\n        if (slength(lin)) {\n            lin += '||' + entry.serialize();\n        } else {\n            lin += entry.serialize();\n        }\n\n        this.setOnVel('stacklineage', lin, h);\n    }\n\n    /**\n     * define getters and setters\n     */\n    static stackInit() {\n        if (!VpcElStack.cachedGetters || !VpcElStack.cachedSetters) {\n            VpcElStack.cachedGetters = {};\n            VpcElStack.cachedGetters['script'] = [PrpTyp.Str, 'script'];\n            VpcElStack.cachedGetters['compatibilitymode'] = [PrpTyp.Bool, 'compatibilitymode'];\n            VpcElStack.cachedGetters['freesize'] = [PrpTyp.Num, () => 0];\n            VpcElStack.cachedGetters['size'] = [PrpTyp.Num, () => 0];\n            VpcElStack.cachedSetters = {};\n            VpcElStack.cachedSetters['name'] = [PrpTyp.Str, 'name'];\n            VpcElStack.cachedSetters['script'] = [PrpTyp.Str, 'script'];\n            VpcElStack.cachedSetters['compatibilitymode'] = [PrpTyp.Bool, 'compatibilitymode'];\n            Util512.freezeRecurse(VpcElStack.cachedGetters);\n            Util512.freezeRecurse(VpcElStack.cachedSetters);\n        }\n    }\n\n    /**\n     * type of element\n     */\n    getType() {\n        return VpcElType.Stack;\n    }\n\n    /**\n     * iterate through a stack\n     * does not include productopts.\n     */\n    *iterEntireStack(): IterableIterator<VpcElBase> {\n        yield this;\n        for (let bg of this.bgs) {\n            /* must process parents before children, as we */\n            /* use this ordering during deserialization */\n            yield bg;\n            for (let cd of bg.cards) {\n                yield cd;\n                for (let pt of cd.parts) {\n                    yield pt;\n                }\n            }\n        }\n    }\n}\n\n/**\n * stack info, like original author of the stack.\n * when you hit save as, we remember the original stack info.\n */\nexport class VpcElStackLineageEntry {\n    constructor(public stackOwner: string, public stackGuid: string, public stackName: string) {\n        checkThrow(slength(stackOwner) > 0, 'K4|author is empty');\n        checkThrow(slength(stackGuid) > 0, 'K3|guid is empty');\n        checkThrow(slength(stackName) > 0, 'K2|name is empty');\n        checkThrow(!stackOwner.includes('|'), 'K1|author must not contain |', stackOwner);\n        checkThrow(!stackGuid.includes('|'), 'K0|guid must not contain |', stackGuid);\n        checkThrow(!stackName.includes('|'), 'J~|name must not contain |', stackName);\n    }\n\n    serialize() {\n        return this.stackOwner + '|' + this.stackGuid + '|' + this.stackName;\n    }\n\n    static fromSerialized(s: string) {\n        let pts = s.split('|');\n        checkThrowEq(3, pts.length, 'J}|invalid lineage', s);\n        return new VpcElStackLineageEntry(pts[0], pts[1], pts[2]);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vel/velStackOrderHelpers.ts",
    "content": "\n/* auto */ import { VpcElStack } from './velStack';\n/* auto */ import { VpcModelTop } from './velModelTop';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\nexport const StackOrderHelpers = /* static class */ {\n    /**\n     * position of card within the stack. return undefined if card not found\n     */\n    findCardStackPosition(stack: VpcElStack, cardId: string): O<number> {\n        let cdids = stack.getCardOrder();\n        let found = cdids.findIndex(s => s === cardId);\n        return found === -1 ? undefined : found;\n    },\n\n    /**\n     * position of card within the stack. throw if card not found\n     */\n    getCardStackPosition(stack: VpcElStack, cardId: string) {\n        return ensureDefined(this.findCardStackPosition(stack, cardId), '4v|card id not found', cardId);\n    },\n\n    /**\n     * position of card within the stack, to card. \"go to card 6\", which card is it?\n     * 0-based index\n     */\n    findFromCardStackPosition(model: VpcModelTop, pos: number) {\n        let cdids = model.stack.getCardOrder();\n        if (pos >= 0 && pos < cdids.length) {\n            return model.getCardById(cdids[pos]);\n        } else {\n            return undefined;\n        }\n    },\n\n    /**\n     * position of card within the stack, to card.\n     * \"go to card 6\", which card is it? throws if not exist\n     * 0-based index\n     */\n    getFromCardStackPosition(model: VpcModelTop, pos: number) {\n        return ensureDefined(this.findFromCardStackPosition(model, pos), '4u|card number not found', pos);\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcAudio.ts",
    "content": "\n/* auto */ import { checkThrow } from './vpcEnums';\n/* auto */ import { RespondToErr, Util512Higher, VoidFn, justConsoleMsgIfExceptionThrown } from './../../ui512/utils/util512Higher';\n/* auto */ import { Util512, ValHolder, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * support the \"play\" command in vipercard\n */\nexport const VpcAudio = /* static class */ {\n    isLoaded: {} as { [key: string]: boolean },\n\n    /**\n     * get url for a sound\n     */\n    urlFromKey(key: string) {\n        checkThrow(!key.includes('/'), 'K8|');\n        checkThrow(!key.includes('\\\\'), 'K7|');\n        checkThrow(key.match(/^[A-Za-z0-9_-]+$/), 'K6|');\n        return `/resources03a/sound/${key}.mp3`;\n    },\n\n    /**\n     * preload the sound, so that it will be\n     * downloaded in the background and ready when needed\n     * asynchronous\n     *\n     * note: safari seems to not let the sound work, as the audio\n     * element hasn't been 'interacted' with.\n     */\n    preloadNoThrow(key: string) {\n        justConsoleMsgIfExceptionThrown(() => VpcAudio._preloadImpl(key), 'preloadAudio');\n    },\n\n    _preloadImpl(key: string) {\n        if (!VpcAudio.isLoaded[key]) {\n            let span = window.document.createElement('span');\n            span.setAttribute('id', 'vpcaudiospan' + key);\n            let url = VpcAudio.urlFromKey(key);\n\n            span.innerHTML = longstr(`<audio class=\"notvisible\" preload=\"auto\"\n             volume=\"0.2\" id=\"vpcaudiohtmlel${key}\"><source src=\"${url}\"\n             type=\"audio/mpeg\" autoplay=\"0\" autostart=\"0\" volume=\"0.2\"\n             preload=\"auto\"></audio>`);\n            window.document.body.appendChild(span);\n            VpcAudio.isLoaded[key] = true;\n        }\n    },\n\n    _playAsyncImpl(aud: HTMLAudioElement) {\n        aud.currentTime = 0;\n        let fn = async function () {\n            return aud.play();\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'play audio', RespondToErr.ConsoleErrOnly);\n    },\n\n    /**\n     * play the sound\n     * asynchronous\n     * will interrupt a sound that is currently playing\n     */\n    play(key: string) {\n        return (\n            justConsoleMsgIfExceptionThrown(() => {\n                let aud = window.document.getElementById('vpcaudiohtmlel' + key) as HTMLAudioElement;\n                if (aud) {\n                    VpcAudio._playAsyncImpl(aud);\n                    return true;\n                } else {\n                    return false;\n                }\n            }, 'audio play') === true\n        );\n    },\n\n    /**\n     * play system beep sound\n     */\n    beep() {\n        let aud = window.document.getElementById('vpcinitialaudio') as HTMLAudioElement;\n        if (aud) {\n            VpcAudio._playAsyncImpl(aud);\n        }\n    }\n};\n\n/**\n * support the \"dial\" command in vipercard\n */\nexport const VpcPhoneDial = /* static class */ {\n    /**\n     * dials a number, and call cbWhenComplete when complete\n     */\n    goDial(s: string, cbWhenComplete: VoidFn) {\n        let alreadyRun = new ValHolder(false);\n        let runCallbackUnlessAlreadyRun = () => {\n            if (!alreadyRun.val) {\n                cbWhenComplete();\n                alreadyRun.val = true;\n            }\n        };\n        /* fail-safe: continue running the script in 5 seconds even if everything else fails */\n        let fiveSeconds = 5 * 1000;\n        Util512Higher.syncToAsyncAfterPause(runCallbackUnlessAlreadyRun, fiveSeconds, 'dial', RespondToErr.ConsoleErrOnly);\n        /* preload, so we'll at least have them available for next time */\n        for (let i = 0; i < 10; i++) {\n            let filename = `dial${i}`;\n            VpcAudio.preloadNoThrow(filename);\n        }\n        /* start playback */\n        let padding = 30;\n        let arr = VpcPhoneDial._intoArray(s);\n        if (!arr.length) {\n            Util512Higher.syncToAsyncAfterPause(runCallbackUnlessAlreadyRun, 1, 'dial', RespondToErr.ConsoleErrOnly);\n            return;\n        }\n        /* schedule playing each tone */\n        let durations = arr.map(n => VpcPhoneDial.mapDialDurations[n] + padding);\n        for (let i = 0; i < arr.length; i++) {\n            let timeAt = durations.slice(0, i + 1).reduce(Util512.add);\n            let filename = `dial${arr[i]}`;\n            Util512Higher.syncToAsyncAfterPause(() => VpcAudio.play(filename), timeAt, 'dialone', RespondToErr.ConsoleErrOnly);\n        }\n        /* schedule returing to the script */\n        let totalTime = durations.reduce(Util512.add) + 500;\n        Util512Higher.syncToAsyncAfterPause(runCallbackUnlessAlreadyRun, totalTime, 'dial', RespondToErr.ConsoleErrOnly);\n    },\n\n    /**\n     * from '123' to [1,2,3]\n     */\n    _intoArray(s: string): number[] {\n        let ret: number[] = [];\n        for (let i = 0; i < s.length; i++) {\n            if (s.charCodeAt(i) >= '0'.charCodeAt(0) && s.charCodeAt(i) <= '9'.charCodeAt(0)) {\n                ret.push(s.charCodeAt(i) - '0'.charCodeAt(0));\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * durations in milliseconds of the sounds\n     */\n    mapDialDurations: {\n        0: 261,\n        1: 261,\n        2: 235,\n        3: 287,\n        4: 287,\n        5: 313,\n        6: 313,\n        7: 235,\n        8: 313,\n        9: 313\n    } as { [key: number]: number }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcChunkResolution.ts",
    "content": "\n/* auto */ import { ReadableContainer, WritableContainer } from './vpcUtils';\n/* auto */ import { VpcChunkPreposition, VpcGranularity, checkThrow, checkThrowInternal } from './vpcEnums';\n/* auto */ import { ChunkResolutionUtils, RequestedChunk, ResolvedChunk } from './vpcChunkResolutionUtils';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/*\n    we support:\n    put char 3 to 5 of x into y (read)\n    put x into char 3 to 5 of y (write)\n    add 1 to char 3 to 5 of y (modify)\n    delete char 3 to 5 of y (delete)\n    set the textsize of char 3 to 5 of cd fld 1 to 12 (text)\n    Note: chunks can also be applied to 'the selection'.\n        it's a new container type, not a chunk.\n            if it were a chunk, or if it were rewritten\n            in rewrites to char selcharstart to selcharend of the selectedfield,\n            it would be hard to support put \"abc\" into item 3 of the selection\n        put char 3 to 5 of the selection into y (read)\n        put x into char 3 to 5 of the selection (write)\n        add 1 to char 3 to 5 of the selection, nyi\n        delete char 3 to 5 of y (delete)\n        set the textsize of the selectedchunk to 12 (done in visitor, RuleHUnaryPropertyGet looks ahead)\n */\n\n/**\n * it turns out to be complicated to evaluate something like\n * put item x to y of myList into z,\n * to match all of the corner cases with the original product's behavior.\n * we use 500,000 tests in vpcTestScriptExtensiveChunk.ts to verify.\n * the original product is weird - e.g. order is ignored in puts/deletes,\n * items and lines behave subtly differently, and words have\n * tricky behavior around newlines.\n */\n\n/**\n * public interface for chunk resolution\n */\nexport const ChunkResolution = /* static class */ {\n    /**\n     * the original product has counter-intuitive behavior for put\n     * where order is ignored, and only one part for each\n     * granularity is kept. item 2 of item 3 of === item 2 of.\n     * see _rearrangeChunksToMatchOriginalProduct.\n     */\n    applyPut(\n        cont: WritableContainer,\n        chunk: O<RequestedChunk>,\n        itemDel: string,\n        newString: string,\n        prep: VpcChunkPreposition,\n        compat: boolean\n    ) {\n        if (!chunk) {\n            /* don't use parent scopes,\n            we might be inserting into a never-before-seen variable */\n            let result: string;\n            if (prep === VpcChunkPreposition.After) {\n                let prevs = cont.isDefined() ? cont.getRawString() : '';\n                result = prevs + newString;\n            } else if (prep === VpcChunkPreposition.Before) {\n                let prevs = cont.isDefined() ? cont.getRawString() : '';\n                result = newString + prevs;\n            } else if (prep === VpcChunkPreposition.Into) {\n                result = newString;\n            } else {\n                checkThrow(false, `5+|unknown preposition ${prep}`);\n            }\n\n            cont.setAll(result);\n            return;\n        }\n\n        /* compatibility */\n        chunk = this._rearrangeChunksToMatchOriginalProduct(chunk, compat);\n        checkThrow(itemDel !== '\\n', \"WH|we haven't tested with an itemdel of newline\");\n\n        /* make parent objects */\n        let resolved = new ResolvedChunk(cont, 0, cont.len());\n        let current: O<RequestedChunk> = chunk;\n        let isChildOfAddedText = false;\n        while (current) {\n            if (!current.child) {\n                break;\n            }\n\n            /* narrow down the scope.\n            it still might write text here;\n            item 99 of x will still add commas. */\n            let got = ChunkResolutionUtils.doResolveOne(\n                current,\n                resolved,\n                itemDel,\n                undefined,\n                compat,\n                VpcChunkPreposition.Into,\n                true,\n                isChildOfAddedText\n            );\n\n            resolved = ensureDefined(got[0], 'WG|');\n            isChildOfAddedText = isChildOfAddedText || /* bool */ got[1];\n            current = current.child;\n        }\n\n        /* insert the real text */\n        ensureDefined(\n            ChunkResolutionUtils.doResolveOne(current, resolved, itemDel, newString, compat, prep, true, isChildOfAddedText)[0],\n            'WF|'\n        );\n    },\n\n    /**\n     * used for 'add 2 to item 1 of x'\n     * follows the same funky logic as put.\n     */\n    applyModify(cont: WritableContainer, chunk: O<RequestedChunk>, itemDel: string, compat: boolean, fn: (s: string) => string) {\n        if (!chunk) {\n            /* no chunk logic needed */\n            let s = cont.getRawString();\n            let news = fn(s);\n            cont.splice(0, cont.len(), news);\n            return;\n        }\n\n        /* it gets thrown off because it won't see the inserted text */\n        checkThrow(\n            cont['start'] === undefined && cont['end'] === undefined,\n            \"WE|we don't yet support 'add 3 to item 1 of the selection' _RWContainerFldSelection_\"\n        );\n\n        /* haven't tested this, note that newline is sometimes a special char even for items */\n        checkThrow(itemDel !== '\\n', \"WD|we haven't tested with an itemdel of newline\");\n\n        /* use a sentinel value to ensure we get the same results as a \"put\" */\n        let marker = '\\x01\\x01~~internalvpcmarker~~\\x01\\x01';\n        let unformatted = cont.getRawString();\n        checkThrow(!unformatted.includes(marker), 'WC|cannot contain the string ' + marker);\n        this.applyPut(cont, chunk, itemDel, marker, VpcChunkPreposition.Into, compat);\n\n        /* now we look at the results and see where it got put! */\n        let results = cont.getRawString();\n        let index = results.indexOf(marker);\n        checkThrow(index >= 0, 'WB|applyModify did not find marker');\n\n        if (results.length - marker.length > unformatted.length) {\n            /* the case where we had to insert commas and stuff afterwards */\n            let newTxt = fn('');\n            cont.splice(index, marker.length, newTxt);\n        } else {\n            /* go back to the original string and retrieve what was there */\n            let targetLength = unformatted.length - (results.length - marker.length);\n            let sourceText = unformatted.slice(index, index + targetLength) ?? '';\n            let newTxt = fn(sourceText);\n            cont.splice(index, marker.length, newTxt);\n        }\n    },\n\n    /**\n     * returns a ResolvedChunk, so you can use the bounds\n     */\n    applyRead(cont: ReadableContainer, chunk: O<RequestedChunk>, itemDel: string): O<ResolvedChunk> {\n        /* make parent objects */\n        let resolved: O<ResolvedChunk> = new ResolvedChunk(cont, 0, cont.len());\n        if (!chunk) {\n            return resolved;\n        }\n\n        let current: O<RequestedChunk> = chunk;\n        let compat = true; /* doesn't matter for reads */\n        let isChildOfAddedLine = false; /* doesn't matter for reads */\n        while (current && resolved) {\n            /* resolved will be undefined if we ask for\n            something non-existent like line 99 of x */\n            resolved = ChunkResolutionUtils.doResolveOne(\n                current,\n                resolved,\n                itemDel,\n                '',\n                compat,\n                VpcChunkPreposition.Into,\n                false,\n                isChildOfAddedLine\n            )[0];\n            current = current.child;\n        }\n\n        return resolved;\n    },\n\n    /**\n     * for convenience, returns an unformatted string\n     */\n    applyReadToString(cont: ReadableContainer, chunk: O<RequestedChunk>, itemDel: string): string {\n        let resolved = this.applyRead(cont, chunk, itemDel);\n        return resolved ? resolved.container.getRawString().substring(resolved.startPos, resolved.endPos) : '';\n    },\n\n    /**\n     * find the deepest child\n     */\n    _getFinalChild(chunk: RequestedChunk) {\n        let current: O<RequestedChunk> = chunk;\n        while (current.child) {\n            current = current.child;\n        }\n\n        return current;\n    },\n\n    /**\n     * delete, which is not the same as `put \"\" into`\n     */\n    applyDelete(cont: WritableContainer, chunk: RequestedChunk, itemDel: string, compat: boolean) {\n        /* don't allow backwards bounds. only have to check the first one since\n        there's a check in vpcVisitorMixin for recursive scopes. */\n        checkThrow(!chunk.hasBackwardsBounds(), \"WA|backwards bounds - don't allow delete item 3 to 2 of x.\");\n        checkThrow(itemDel !== '\\n', \"W9|we haven't tested with an itemdel of newline\");\n\n        /* use same funky logic as put */\n        chunk = this._rearrangeChunksToMatchOriginalProduct(chunk, compat);\n\n        /* if the final child is a char, it's the one case where it is the same as put \"\" into */\n        let finalChild = this._getFinalChild(chunk);\n        if (finalChild.granularity === VpcGranularity.Chars) {\n            return this.applyPut(cont, chunk, itemDel, '', VpcChunkPreposition.Into, compat);\n        }\n\n        /* we don't yet support deleting ranges.\n            we tried doing:\n                delete word 1 to 3 ->\n                delete word 3; delete word 2; delete word 1\n            and\n                pretend to delete word 3, get bounds,\n                pretend to delete word 2, get bounds,\n                pretend to delete word 1, get bounds,\n                then delete the min to max bounds\n            and\n                pretend to delete word 3 and get the rightmost bound\n                pretend to delete word 1 and get the leftmost bound\n                then delete everything in-between\n            none of them seemed to 100% match original product\n         */\n        checkThrow(\n            finalChild.ordinal !== undefined || finalChild.last === undefined || finalChild.first === finalChild.last,\n            \"W8|we don't yet support deleting ranges\"\n        );\n        checkThrow(\n            finalChild.ordinal !== undefined || finalChild.last === undefined || finalChild.first <= finalChild.last,\n            \"W7|we don't support backwards bounds\"\n        );\n\n        /* first, narrow the scope */\n        let resolved: O<ResolvedChunk> = new ResolvedChunk(cont, 0, cont.len());\n        let current: O<RequestedChunk> = chunk;\n        let isChildOfAddedLine = false; /* not used here */\n        let isChild = false;\n        while (current && resolved) {\n            if (!current.child) {\n                break;\n            }\n\n            resolved = ChunkResolutionUtils.doResolveOne(\n                current,\n                resolved,\n                itemDel,\n                '',\n                compat,\n                VpcChunkPreposition.Into,\n                false /* not a write context; don't insert extra commas */,\n                isChildOfAddedLine\n            )[0];\n            current = current.child;\n            isChild = true;\n        }\n\n        /* if you delete something that isn't found, it is a no-op */\n        if (!resolved) {\n            return;\n        }\n\n        let txtFull = cont.getRawString();\n        let txtNarrowed = txtFull.substring(resolved.startPos, resolved.endPos);\n        let narrowedAndAfter = txtFull.substring(resolved.startPos);\n        ChunkResolutionUtils.resolveOrdinal(txtNarrowed, itemDel, current);\n\n        let startAndEnd: [number, number];\n        if (current.granularity === VpcGranularity.Items || current.granularity === VpcGranularity.Lines) {\n            startAndEnd = this._applyDeleteHelperItemsLines(\n                txtNarrowed,\n                itemDel,\n                current.first - 1 /* one-based to 0 based */,\n                current.granularity,\n                narrowedAndAfter,\n                txtFull,\n                compat,\n                isChild ? resolved.startPos : -1\n            );\n        } else if (current.granularity === VpcGranularity.Words) {\n            startAndEnd = this._applyDeleteHelperWords(\n                txtNarrowed,\n                itemDel,\n                current.first - 1 /* one-based to 0 based */,\n                current.granularity,\n                narrowedAndAfter,\n                txtFull,\n                compat,\n                isChild ? resolved.startPos : -1\n            );\n        } else {\n            checkThrowInternal(false, 'W6|unknown type');\n        }\n\n        let [start, end] = startAndEnd;\n        cont.splice(resolved.startPos + start, end - start, '');\n    },\n\n    /**\n     * delete a word\n     */\n    _applyDeleteHelperWords(\n        txtNarrowed: string,\n        delim: string,\n        currentPlace: number,\n        granularity: VpcGranularity,\n        narrowedAndAfter: string,\n        txtFull: string,\n        compat: boolean,\n        parentStartPos: number\n    ): [number, number] {\n        let table = ChunkResolutionUtils._getPositionsTable(txtNarrowed, granularity, delim);\n        let start = 0;\n        let end = 0;\n        if (currentPlace === -1) {\n            /* emulator confirms you can say meaningfully say word 0 of x */\n            start = 0;\n            end = start;\n            while (end < table[0]) {\n                if (txtNarrowed[end] === '\\n') {\n                    break;\n                }\n                end++;\n            }\n        } else if (currentPlace > table.length - 1) {\n            /* strip final whitespace */\n            start = txtNarrowed.length;\n            end = txtNarrowed.length;\n            if (end === narrowedAndAfter.length) {\n                /* special case only applies to the true end of the string */\n                while (txtNarrowed[start - 1] === ' ') {\n                    start--;\n                }\n            }\n        } else if (currentPlace === table.length - 1) {\n            /* this is a weird case-it deletes spaces both before and after */\n            start = table[table.length - 1];\n            end = table[table.length - 1];\n            let sawReturn = false;\n            while (end < txtNarrowed.length) {\n                if (txtNarrowed[end] === '\\n') {\n                    sawReturn = true;\n                    break;\n                }\n                end++;\n            }\n\n            /* use narrowedAndAfter.length not txtNarrowed.length here,\n            this special case only applies to the true end of the string */\n            if (end >= narrowedAndAfter.length - 1 && !sawReturn && txtNarrowed.length === narrowedAndAfter.length) {\n                while (txtNarrowed[start - 1] === ' ') {\n                    start--;\n                }\n            }\n        } else {\n            /* normal case in middle of the string */\n            start = table[currentPlace];\n            end = start;\n            while (end < table[currentPlace + 1]) {\n                if (txtNarrowed[end] === '\\n') {\n                    break;\n                }\n                end++;\n            }\n        }\n\n        return [start, end];\n    },\n\n    /**\n     * delete an item or line\n     */\n    _applyDeleteHelperItemsLines(\n        txtNarrowed: string,\n        delim: string,\n        currentPlace: number,\n        granularity: VpcGranularity,\n        narrowedAndAfter: string,\n        txtFull: string,\n        compat: boolean,\n        parentStartPos: number\n    ): [number, number] {\n        let table = ChunkResolutionUtils._getPositionsTable(txtNarrowed, granularity, delim);\n        let start = 0;\n        let end = 0;\n        let activeChar = granularity === VpcGranularity.Items ? delim : '\\n';\n        if (\n            granularity === VpcGranularity.Items &&\n            currentPlace === 0 &&\n            parentStartPos > 0 &&\n            compat &&\n            !txtNarrowed.includes(delim) &&\n            txtFull[parentStartPos - 1] === '\\n' &&\n            (txtNarrowed.length ||\n                /* is at end of string */\n                parentStartPos + txtNarrowed.length === txtFull.length)\n        ) {\n            /* weird corner case: if you say delete item 1 of line 2\n            and there is text in line 2 but no commas, we need to\n            delete the entire line - it even deletes backwards */\n            start = -1;\n            end = txtNarrowed.length;\n        } else if (currentPlace === -1) {\n            /* emulator confirms you can say item 0 of x */\n            if (txtNarrowed.startsWith(activeChar)) {\n                start = 0;\n                end = 1;\n            } else {\n                start = 0;\n                end = 0;\n            }\n        } else if (currentPlace >= table.length) {\n            start = 0;\n            end = 0;\n        } else if (currentPlace === table.length - 1) {\n            /* this is a weird case-it might delete commas both before and after */\n            /* and newlines are significant, even for an 'item'. */\n            if (\n                granularity === VpcGranularity.Items &&\n                (txtNarrowed.length === narrowedAndAfter.length ||\n                    (narrowedAndAfter[txtNarrowed.length] === '\\n' && !txtNarrowed.endsWith(activeChar)))\n            ) {\n                start = table[table.length - 1];\n                end = txtNarrowed.length;\n                if (txtNarrowed[start - 1] === activeChar) {\n                    start--;\n                }\n            } else {\n                start = table[table.length - 1];\n                end = txtNarrowed.length;\n            }\n        } else {\n            /* normal case in the middle of the string */\n            start = table[currentPlace];\n            end = start;\n            while (end < table[currentPlace + 1]) {\n                end++;\n            }\n        }\n\n        return [start, end];\n    },\n\n    /**\n     * count chunks, e.g.\n     * 'put the number of words in x into y'\n     */\n    applyCount(sInput: string, itemDel: string, type: VpcGranularity, isPublicCall: boolean) {\n        return ChunkResolutionUtils.applyCount(sInput, itemDel, type, isPublicCall);\n    },\n\n    /**\n     * match the weird behavior seen in original product.\n     * 1) first come, first serve, for each granularity\n     * 2) regardless of order seen, sort in the order seen in enum VpcGranularity\n     */\n    _rearrangeChunksToMatchOriginalProduct(chunk: RequestedChunk, compat: boolean) {\n        if (!chunk.child) {\n            return chunk;\n        }\n\n        /* flatten it! the given order does not matter!\n        we'll use the fact that VpcGranularity enum numbers are already in order,\n        and index them into a list */\n        let max = VpcGranularity.__Max + 1;\n        let arr = Util512.repeat(max, undefined as O<RequestedChunk>);\n\n        /* remember that it's first come, first serve,\n        so placing into the array intentionally overwrites what we saw before */\n        let current: O<RequestedChunk> = chunk;\n        let lastKey = -1;\n        while (current) {\n            let key = current.granularity;\n\n            /* unless we're in compat mode we'll only allow strict ordering */\n            if (!compat) {\n                checkThrow(\n                    lastKey === -1 || key <= lastKey,\n                    longstr(`W5|you can put something into char 1 of\n                 word 1 of x, but you can't put something into word 1 of char 1 of x.\n                The order must be char, word, item, line. To allow other orders, go to\n                Object->Stack Info and turn on compatibility mode, but be aware that\n                it will ignore your given order - line 2 of item 3 of x is confusingly\n                interpreted to mean item 3 of line 2 of x. `)\n                );\n                checkThrow(\n                    lastKey === -1 || key < lastKey,\n                    longstr(`W4|you can't put something into word 2 of\n                word 1 of x. To allow this, go Object->Stack Info and turn on\n                compatibility mode, be aware though that if you say something like\n                put \"\" into word 2 of word 1 of x it will disregard the word 1 of x.`)\n                );\n            }\n\n            arr[key] = current;\n            current = current.child;\n            lastKey = key;\n        }\n\n        /* reverse it so that higher ones are first */\n        arr.reverse();\n\n        /* from list back into a tree */\n        let newRoot: O<RequestedChunk>;\n        let rebuild: O<RequestedChunk>;\n        for (let i = 0; i < arr.length; i++) {\n            if (arr[i]) {\n                if (!rebuild) {\n                    rebuild = arr[i];\n                    newRoot = arr[i];\n                } else {\n                    rebuild.child = arr[i];\n                    rebuild = arr[i];\n                }\n            }\n        }\n\n        /* be sure to overwrite the child here in case it used to have a child */\n        if (rebuild) {\n            rebuild.child = undefined;\n        }\n\n        return ensureDefined(newRoot, 'W3|newRoot');\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcChunkResolutionSort.ts",
    "content": "\n/* auto */ import { WritableContainer } from './vpcUtils';\n/* auto */ import { SortType, VpcGranularity, checkThrow } from './vpcEnums';\n/* auto */ import { getEnumToStrOrFallback, util512Sort } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * utilities for sorting text\n */\nexport const ChunkResolutionSort = /* static class */ {\n    /**\n     * sort a container by chunks.\n     * text sorting (default), compares text, not case sensitive.\n     * numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\n     * international sorting, not yet supported.\n     */\n    applySort(cont: WritableContainer, itemDel: string, type: VpcGranularity, sortType: SortType, ascend: boolean) {\n        let splitBy: string;\n        if (type === VpcGranularity.Chars) {\n            splitBy = '';\n        } else if (type === VpcGranularity.Items) {\n            splitBy = itemDel;\n        } else if (type === VpcGranularity.Lines) {\n            splitBy = '\\n';\n        } else {\n            checkThrow(false, `5/|we don't currently support sorting by ${type}`);\n        }\n\n        let split = cont.getRawString().split(splitBy);\n        let sorter: (a: string, b: string) => number;\n        if (sortType === SortType.Numeric) {\n            sorter = (a, b) => {\n                /* don't use a different comparison if both inputs are numbers */\n                /* that would be an inconsistent comparison */\n                /* if there are some strings/some numbers in the array */\n                let na = parseFloat(a);\n                let nb = parseFloat(b);\n                na = isFinite(na) ? na : Infinity;\n                nb = isFinite(nb) ? nb : Infinity;\n                return util512Sort([na, a.toLowerCase()], [nb, b.toLowerCase()]);\n            };\n        } else if (sortType === SortType.Text) {\n            sorter = (a, b) => {\n                a = a.toLowerCase();\n                b = b.toLowerCase();\n                return a < b ? -1 : a > b ? 1 : 0;\n            };\n        } else {\n            checkThrow(false, `5.|Don't yet support sorting by style ${getEnumToStrOrFallback(SortType, sortType)}`);\n        }\n\n        split.sort(sorter);\n        if (!ascend) {\n            split.reverse();\n        }\n\n        let result = split.join(splitBy);\n        cont.splice(0, cont.len(), result);\n    },\n\n    /**\n     * lets you sort by a custom expression.\n     * written in vipercard itself so that it's easy to plug in the expression.\n     */\n    internalDelim: '\\x01\\x01\\x01vpcinternal\\x01\\x01\\x01',\n    writeCodeCustomSort(granularity: string, sortOptions: { [key: string]: string }) {\n        /* let's build a sort here! use decorate-sort-undecorate */\n        if (granularity !== 'items' && granularity !== 'lines') {\n            checkThrow(false, 'T[|We only support sorting by lines or items');\n        }\n\n        /* check_long_lines_silence_subsequent */\n        let delimExpr = granularity === 'items' ? 'the itemDel' : 'cr';\n        /* the first char of the delim should probably be a 'small' character */\n        /* can't use a repeat-with ... */\n        let template = `\nput ( %ARG0% ) %INTO% content%UNIQUE%\nif length ( content%UNIQUE% ) > 0 then\nif \"${ChunkResolutionSort.internalDelim}\" is in content%UNIQUE% then\n    errordialog \"Cannot~sort~by~this~type~of~expression.\"\nend if\nput \"\" %INTO% tosort%UNIQUE%\nrepeat with loop%UNIQUE% = 1 to the number of ${granularity} of content%UNIQUE%\n    put ${granularity} loop%UNIQUE% of content%UNIQUE% %INTO% each\n    put ( %ARG1% ) %INTO% sortkey%UNIQUE%\n    put sortkey%UNIQUE% & \"${ChunkResolutionSort.internalDelim}\" & each & ${delimExpr} %AFTER% tosort%UNIQUE%\nend repeat\nput char 1 to ( length ( tosort%UNIQUE% ) - length ( ${delimExpr} ) ) of tosort%UNIQUE% %INTO% tosort%UNIQUE%\nsort \"${sortOptions['method']}\" \"${sortOptions['order']}\" ${granularity} of tosort%UNIQUE%\nput \"\" %INTO% result%UNIQUE%\nrepeat with loop%UNIQUE% = 1 to the number of ${granularity} of tosort%UNIQUE%\n    put ${granularity} loop%UNIQUE% of tosort%UNIQUE% %INTO% each\n    put char ( offset ( \"${ChunkResolutionSort.internalDelim}\" , each ) + ${ChunkResolutionSort.internalDelim.length} ) to ( the length of each ) of each %INTO% each\n    put each & ${delimExpr} %AFTER% result%UNIQUE%\nend repeat\nput char 1 to ( the length of result%UNIQUE% - the length of ${delimExpr} ) of result%UNIQUE% %INTO% result%UNIQUE%\nput result%UNIQUE% %INTO% %ARG0%\nend if`;\n\n        return template;\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcChunkResolutionUtils.ts",
    "content": "\n/* auto */ import { VpcIntermedValBase } from './vpcVal';\n/* auto */ import { ReadableContainer, WritableContainer } from './vpcUtils';\n/* auto */ import { OrdinalOrPosition, VpcChunkPreposition, VpcGranularity, checkThrow, checkThrowEq, checkThrowInternal, findPositionFromOrdinalOrPosition } from './vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, findStrToEnum } from './../../ui512/utils/util512';\n/* auto */ import { largeArea } from './../../ui512/drawtext/ui512DrawTextClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/*\n * the input is given as 1-based but\n * internally in this class we use 0-based indexes\n */\nexport const ChunkResolutionUtils = /* static class */ {\n    /**\n     * regex for a given granularity\n     */\n    getRegex(type: VpcGranularity, delim: string): RegExp {\n        if (type === VpcGranularity.Items) {\n            /*\n                if the script has said something like\n                set the itemDel to \"?\"\n                make sure it is one-character and that the regex is escaped\n            */\n            checkThrowEq(1, delim.length, '8m|delim should be length 1 but got', delim);\n            let escaped = Util512.escapeForRegex(delim);\n            return new RegExp(escaped, 'g');\n        } else if (type === VpcGranularity.Lines) {\n            return /\\n/g;\n        } else if (type === VpcGranularity.Words) {\n            return new RegExp('(\\\\n| )+', 'g');\n        } else {\n            checkThrowInternal(false, 'WO|no regex for this granularity');\n        }\n    },\n\n    /**\n     * make a table of positions where items start\n     * positions are 0-based\n     * \"a,bb,c\" -> [0, 2, 5]\n     */\n    _getPositionsTable(s: string, type: VpcGranularity, itemDel: string): number[] {\n        let re = ChunkResolutionUtils.getRegex(type, itemDel);\n        let isWords = type === VpcGranularity.Words;\n        let positions: number[] = [];\n        if (!isWords || (!s.startsWith(' ') && !s.startsWith('\\n'))) {\n            positions.push(0);\n        }\n\n        while (true) {\n            let match = re.exec(s);\n            if (match) {\n                let endOfMatch = match.index + match[0].length;\n                if (!isWords || endOfMatch !== s.length) {\n                    positions.push(endOfMatch);\n                }\n            } else {\n                break;\n            }\n        }\n\n        return positions;\n    },\n\n    /**\n     * get positions of the chunk, for chars.\n     * return semi-inclusive bounds [start, end)\n     */\n    _charsBoundsForGet(sInput: string, start: number, end: number): O<[number, number]> {\n        if (start >= sInput.length) {\n            return undefined;\n        } else {\n            end = Math.min(end, sInput.length);\n            return [start, end];\n        }\n    },\n\n    /**\n     * get positions of the chunk, for items.\n     * return semi-inclusive bounds [start, end)\n     */\n    _itemsBoundsForGet(sInput: string, delim: string, start: number, end: number): O<[number, number]> {\n        let table = this._getPositionsTable(sInput, VpcGranularity.Items, delim);\n        if (start >= table.length) {\n            return undefined;\n        } else {\n            let firstchar = table[start];\n            let lastchar = end >= table.length ? sInput.length : table[end] - 1;\n            return [firstchar, lastchar];\n        }\n    },\n\n    /**\n     * get positions of the chunk, for words.\n     * confirmed in emulator: only spaces and newlines separate words, not punctuation.\n     * return semi-inclusive bounds [start, end)\n     */\n    _wordsBoundsForGet(sInput: string, start: number, end: number, itemDel: string): O<[number, number]> {\n        let table = this._getPositionsTable(sInput, VpcGranularity.Words, itemDel);\n        if (start >= table.length) {\n            return undefined;\n        } else {\n            let firstchar = table[start];\n            let lastchar = end >= table.length ? sInput.length : table[end] - 1;\n            while (lastchar > 0 && (sInput[lastchar - 1] === '\\n' || sInput[lastchar - 1] === ' ')) {\n                lastchar--;\n            }\n\n            return [firstchar, lastchar];\n        }\n    },\n\n    /**\n     * when you say put \"abc\" into char x to y of z, which positions should be replaced with \"abc\"?\n     */\n    _charsBoundsForSet(sInput: string, start: number, end: number): any {\n        if (start >= sInput.length) {\n            return [sInput.length, sInput.length, ''];\n        } else {\n            end = Math.min(end, sInput.length);\n            return [start, end, ''];\n        }\n    },\n\n    /**\n     * when you say put \"abc\" into item x to y of z, which positions should be replaced with \"abc\"?\n     */\n    _itemsBoundsForSet(sInput: string, delim: string, start: number, end: number): any {\n        let table = this._getPositionsTable(sInput, VpcGranularity.Items, delim);\n        if (start >= table.length) {\n            /* you can set items beyond current content, add trailing commas! */\n            let howmanytoadd = 1 + (start - table.length);\n            let trailingCommas = Util512.repeat(howmanytoadd, delim).join('');\n            return [sInput.length + howmanytoadd, sInput.length + howmanytoadd, trailingCommas];\n        } else {\n            let firstchar = table[start];\n            let lastchar = end >= table.length ? sInput.length : table[end] - 1;\n            return [firstchar, lastchar, ''];\n        }\n    },\n\n    /**\n     * when you say put \"abc\" into word x to y of z, which positions should be replaced with \"abc\"?\n     */\n    _wordsBoundsForSet(sInput: string, start: number, end: number, itemDel: string): any {\n        let boundsGet = this._wordsBoundsForGet(sInput, start, end, itemDel);\n        if (boundsGet === undefined) {\n            return [sInput.length, sInput.length, ''];\n        } else {\n            return [boundsGet[0], boundsGet[1], ''];\n        }\n    },\n\n    /**\n     * we've been asked to get item x to y.\n     * return semi-inclusive bounds [start, end)\n     */\n    _getBoundsForGet(s: string, itemDel: string, ch: RequestedChunk): O<[number, number]> {\n        this.resolveOrdinal(s, itemDel, ch);\n        let first = ch.first;\n        let last = ch.last;\n\n        checkThrow(first >= 0 && (!last || last >= 0), 'WN|do not allow negative');\n        if (ch.granularity === VpcGranularity.Chars && last !== undefined && last < first) {\n            /* checked in emulator, behavior for chars differs here for some reason. */\n            return undefined;\n        }\n\n        assertTrue(first !== null && first !== undefined && last !== null, '5=|invalid first or last');\n        last = last === undefined ? first : last;\n        last = last < first ? first : last;\n        if (first <= 0) {\n            return undefined;\n        } else if (s.length === 0) {\n            return undefined;\n        }\n\n        /* convert from one-based to zero-based */\n        let start = first - 1;\n        last -= 1;\n        let end = last;\n\n        /* from inclusive to semiinclusive */\n        end++;\n\n        /* type-specific actions */\n        if (ch.granularity === VpcGranularity.Chars) {\n            return this._charsBoundsForGet(s, start, end);\n        } else if (ch.granularity === VpcGranularity.Items) {\n            return this._itemsBoundsForGet(s, itemDel, start, end);\n        } else if (ch.granularity === VpcGranularity.Lines) {\n            return this._itemsBoundsForGet(s, '\\n', start, end);\n        } else if (ch.granularity === VpcGranularity.Words) {\n            return this._wordsBoundsForGet(s, start, end, itemDel);\n        } else {\n            checkThrow(false, `5<|unknown chunk granularity ${ch.granularity}`);\n        }\n    },\n\n    /**\n     * resolve \"first\" or \"last\"\n     * treat \"tenth\" exactly the same as \"10\", even if there are not 10 items\n     */\n    resolveOrdinal(sInput: string, itemDel: string, ch: RequestedChunk) {\n        if (ch.ordinal !== undefined) {\n            let upperBound = largeArea;\n            if (\n                ch.ordinal === OrdinalOrPosition.Last ||\n                ch.ordinal === OrdinalOrPosition.Middle ||\n                ch.ordinal === OrdinalOrPosition.Any\n            ) {\n                upperBound = ChunkResolutionUtils.applyCount(sInput, itemDel, ch.granularity, false);\n            }\n\n            ch.first = ensureDefined(findPositionFromOrdinalOrPosition(ch.ordinal, 0, 1, upperBound), 'WM|too big an index');\n            ch.last = ch.first;\n            ch.ordinal = undefined;\n        }\n    },\n\n    /**\n     * we've been asked to set item x to y.\n     * return semi-inclusive bounds [start, end)\n     */\n    _getBoundsForSet(sInput: string, itemDel: string, ch: RequestedChunk): [number, number, string] {\n        this.resolveOrdinal(sInput, itemDel, ch);\n        let first = ch.first;\n        let last = ch.last;\n\n        checkThrow(first >= 0 && (!last || last >= 0), 'WL|do not allow negative');\n        assertTrue(first !== null && first !== undefined && last !== null, '5;|invalid first or last');\n        if (ch.granularity === VpcGranularity.Chars && last !== undefined && last < first) {\n            /* checked in emulator, behavior for chars differs here for some reason. */\n            return [first - 1, first - 1, ''];\n        }\n\n        last = last === undefined ? first : last;\n        last = last < first ? first : last;\n        if (first <= 0) {\n            return [0, 0, ''];\n        }\n\n        /* convert from one-based to zero-based */\n        let start = first - 1;\n        last -= 1;\n        let end = last;\n\n        /* from inclusive to semiinclusive */\n        end++;\n\n        /* type-specific actions */\n        if (ch.granularity === VpcGranularity.Chars) {\n            return this._charsBoundsForSet(sInput, start, end);\n        } else if (ch.granularity === VpcGranularity.Items) {\n            return this._itemsBoundsForSet(sInput, itemDel, start, end);\n        } else if (ch.granularity === VpcGranularity.Lines) {\n            return this._itemsBoundsForSet(sInput, '\\n', start, end);\n        } else if (ch.granularity === VpcGranularity.Words) {\n            return this._wordsBoundsForSet(sInput, start, end, itemDel);\n        } else {\n            checkThrow(false, `5:|unknown chunk type ${ch.granularity}`);\n        }\n    },\n\n    /**\n     * count chunks, e.g.\n     * 'put the number of words in x into y'\n     */\n    applyCount(sInput: string, itemDel: string, type: VpcGranularity, isPublicCall: boolean) {\n        /* in the public interface, change behavior to match original product\n        behavior confirmed in emulator. */\n        let adjust = 0;\n        if (isPublicCall && sInput === '') {\n            return 0;\n        } else if (isPublicCall && type === VpcGranularity.Items && !sInput.includes(itemDel) && sInput.trim() === '') {\n            return 0;\n        } else if (isPublicCall && type === VpcGranularity.Lines && sInput.endsWith('\\n')) {\n            adjust = -1;\n        } else if (isPublicCall && type === VpcGranularity.Items && sInput.trim().endsWith(',')) {\n            if (sInput) {\n                adjust = -1;\n            } else {\n                return 1;\n            }\n        }\n\n        if (type === VpcGranularity.Chars) {\n            return sInput.length + adjust;\n        } else {\n            return ChunkResolutionUtils._getPositionsTable(sInput, type, itemDel).length + adjust;\n        }\n    },\n\n    /**\n     * go from \"word 2 to 5\" to the character start+end positions.\n     * this might be a child of a parent scope (word 3 of line 4), so\n     * remember to adjust based on parent.startPos!\n     */\n    doResolveOne(\n        request: RequestedChunk,\n        parent: ResolvedChunk,\n        itemDel: string,\n        newString: O<string>,\n        compat: boolean,\n        prep: O<VpcChunkPreposition>,\n        isWriteContext: boolean,\n        isChildOfAddedText: boolean\n    ): [O<ResolvedChunk>, boolean] {\n        /* we limit our view to the parent scope */\n        let unformatted = parent.container.getRawString();\n        unformatted = unformatted.substring(parent.startPos, parent.endPos);\n        let retbounds: O<[number, number]>;\n        let addedExtraText = false;\n        if (isWriteContext) {\n            let writeAccess = parent.container as WritableContainer;\n            let bounds = this._getBoundsForSet(unformatted, itemDel, request);\n            if (bounds[2] && bounds[2].length) {\n                /* it's a brand new item, 'before' or 'after' isn't applicable */\n                prep = VpcChunkPreposition.Into;\n            }\n\n            if (newString === undefined) {\n                /* if we are in a write-context and newString is undefined,\n                this means that we are in a parent scope i.e. the\n                'line 3' in 'put \"a\" into item 2 of line 3 of z' */\n\n                /* for compat, don't add extra commas if a parent scope\n                has already added extra text */\n                if (compat && parent.startPos === parent.endPos && isChildOfAddedText) {\n                    bounds[2] = '';\n                }\n\n                /* add extra commas to the end */\n                let fakeNewS = '';\n                let result = fakeNewS + bounds[2];\n                let insertionPoint = parent.startPos + bounds[0];\n                if (bounds[2]) {\n                    /* the insertionPoint needs to be adjusted,\n                    otherwise the extra commas would send us outside our scope */\n                    addedExtraText = true;\n                    insertionPoint = Math.min(parent.endPos, insertionPoint);\n                }\n\n                writeAccess.splice(insertionPoint, 0 /* delete nothing */, result);\n                if (bounds[2]) {\n                    retbounds = [\n                        -parent.startPos + insertionPoint + result.length,\n                        -parent.startPos + insertionPoint + result.length\n                    ];\n                } else {\n                    retbounds = [-parent.startPos + insertionPoint, bounds[1] + result.length];\n                }\n            } else if (prep === VpcChunkPreposition.Into) {\n                /* for compat, don't add extra commas if a parent scope\n                has already added extra text */\n                if (compat && parent.startPos === parent.endPos && isChildOfAddedText) {\n                    bounds[2] = '';\n                }\n\n                /* prepare to insert text */\n                let result = bounds[2] + newString;\n                let insertionPoint = parent.startPos + bounds[0];\n                if (bounds[2]) {\n                    /* the insertionPoint needs to be adjusted,\n                    otherwise the extra commas would send us outside our scope */\n                    addedExtraText = true;\n                    insertionPoint = Math.min(parent.endPos, insertionPoint);\n                }\n\n                writeAccess.splice(insertionPoint, bounds[1] - bounds[0], result);\n                retbounds = [insertionPoint, insertionPoint + result.length];\n            } else if (prep === VpcChunkPreposition.After) {\n                writeAccess.splice(parent.startPos + bounds[1], 0, newString);\n                retbounds = [bounds[1], bounds[1] + newString.length];\n            } else if (prep === VpcChunkPreposition.Before) {\n                writeAccess.splice(parent.startPos + bounds[0], 0, newString);\n                retbounds = [bounds[0], bounds[0] + newString.length];\n            } else {\n                checkThrow(false, `5,|unknown preposition ${prep}`);\n            }\n        } else {\n            assertTrue(!newString, 'WK|');\n            assertTrue(!prep || prep === VpcChunkPreposition.Into, 'WJ|');\n            retbounds = this._getBoundsForGet(unformatted, itemDel, request);\n        }\n\n        if (retbounds) {\n            let ret = new ResolvedChunk(parent.container, parent.startPos + retbounds[0], parent.startPos + retbounds[1]);\n            checkThrow(ret.startPos >= 0 && ret.endPos >= 0, 'WI|somehow got a negative');\n            return [ret, addedExtraText];\n        } else {\n            return [undefined, addedExtraText];\n        }\n    }\n};\n\n/**\n * a requested chunk from a script.\n */\nexport class RequestedChunk extends VpcIntermedValBase {\n    granularity = VpcGranularity.Chars;\n    first: number;\n    last: O<number>;\n    ordinal: O<OrdinalOrPosition>;\n    child: O<RequestedChunk>;\n    constructor(first: number) {\n        super();\n        this.first = first;\n    }\n\n    /**\n     * get a copy of this structure\n     */\n    getClone() {\n        let other = new RequestedChunk(this.first);\n        other.granularity = this.granularity;\n        other.first = this.first;\n        other.last = this.last;\n        other.ordinal = this.ordinal;\n        other.child = this.child?.getClone();\n        return other;\n    }\n\n    /**\n     * are bounds backwards? we sometimes support this\n     */\n    hasBackwardsBounds(): boolean {\n        return this.last !== undefined && this.last < this.first;\n    }\n\n    /**\n     * get from string\n     * \"char 3 to 7 of cd fld 4\"\n     * ->\n     * RequestedChunk(char,3,7), \"cd fld 4\"\n     */\n    static parseFromString(s: string): [O<RequestedChunk>, string] {\n        let words = s.split(' ');\n        let grn = findStrToEnum<VpcGranularity>(VpcGranularity, words[0]);\n        let ret = new RequestedChunk(-1);\n        if (grn) {\n            ret.granularity = grn;\n            let b1 = Util512.parseInt(words[1]);\n            if (b1 !== undefined) {\n                ret.first = b1;\n                if (words[2] === 'of') {\n                    return [ret, words.slice(3).join(' ')];\n                } else if (words[2] === 'to') {\n                    let b2 = Util512.parseInt(words[3]);\n                    if (b2 !== undefined) {\n                        ret.last = b2;\n                        if (words[4] === 'of') {\n                            return [ret, words.slice(5).join(' ')];\n                        }\n                    }\n                }\n            }\n        }\n\n        return [undefined, s];\n    }\n}\n\n/**\n * a resolved chunk.\n * positions are in 0-based offsets,\n * [start, end)\n */\nexport class ResolvedChunk {\n    constructor(public container: ReadableContainer, public startPos: number, public endPos: number) {}\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcEnums.ts",
    "content": "\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512BaseErr, Util512Message, joinIntoMessage } from './../../ui512/utils/util512Assert';\n/* auto */ import { fitIntoInclusive, getStrToEnum, util512Sort } from './../../ui512/utils/util512';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { UI512PaintDispatchShapes } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * SortType for the \"sort\" command\n * text sorting (default), compares text, not case sensitive.\n * numeric sorting, interpret as numbers, e.g. 10 sorts after 2.\n * international sorting, not yet supported.\n */\nexport enum SortType {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Text,\n    Numeric,\n    International\n}\n\n/**\n * PropAdjective for properties, e.g.\n * get the long name of cd btn \"btn1\"\n */\nexport enum PropAdjective {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Empty,\n    Abbrev,\n    Long,\n    Short,\n    /* always use the long id style,\n    even if we are in compatibility mode */\n    LongForParse,\n    __AlternateForm__Abbreviated = Abbrev,\n    __AlternateForm__Abbr = Abbrev\n}\n\n/**\n * ordinal or position, i.e. \"go to third card\"\n */\nexport enum OrdinalOrPosition {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Last,\n    Middle,\n    Any,\n    First,\n    Second,\n    Third,\n    Fourth,\n    Fifth,\n    Sixth,\n    Seventh,\n    Eighth,\n    Ninth,\n    Tenth,\n    Next,\n    Previous,\n    This,\n    __AlternateForm__Mid = Middle,\n    __AlternateForm__Prev = Previous\n}\n\nexport function ordinalOrPositionIsPosition(o: OrdinalOrPosition) {\n    return o > OrdinalOrPosition.Tenth;\n}\n\n/**\n * a 'chunk' is a way to specify a contiguous span of text, e.g.\n * word 3 to 4 of \"a b c d e\"\n * these are the types of chunks currently supported.\n */\nexport enum VpcGranularity {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    /* DO NOT CHANGE THE ORDER HERE, it's used by chunkresolution */\n    Chars,\n    Words,\n    Items,\n    Lines,\n    __AlternateForm__Char = Chars,\n    __AlternateForm__Character = Chars,\n    __AlternateForm__Characters = Chars,\n    __AlternateForm__Word = Words,\n    __AlternateForm__Item = Items,\n    __AlternateForm__Line = Lines,\n    __Max\n}\n\n/**\n * preposition, e.g. put \"a\" after cd fld \"fld1\"\n */\nexport enum VpcChunkPreposition {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Into,\n    Before,\n    After\n}\n\n/**\n * type of vpc element\n * this is serialized -- do not change the order\n */\nexport enum VpcElType {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Btn,\n    Fld,\n    Card,\n    Bg,\n    Stack,\n    Product,\n    Unknown,\n    __AlternateForm__Button = Btn,\n    __AlternateForm__Field = Fld,\n    __AlternateForm__Cd = Card,\n    __AlternateForm__Background = Bg,\n    __AlternateForm__Bkgnd = Bg\n}\n\n/**\n * show type in UI\n */\nexport function vpcElTypeShowInUI(tp: VpcElType) {\n    switch (tp) {\n        case VpcElType.Btn:\n            return 'button';\n        case VpcElType.Fld:\n            return 'field';\n        case VpcElType.Card:\n            return 'card';\n        case VpcElType.Bg:\n            return 'bkgnd';\n        case VpcElType.Stack:\n            return 'stack';\n        case VpcElType.Product:\n            return '';\n        default:\n            checkThrow(false, `4k|can't get name of el type ${tp}`);\n    }\n}\n\n/**\n * string name of the type, to show in UI\n */\nexport function vpcElTypeToString(type: VpcElType, veryShort: boolean) {\n    if (veryShort) {\n        if (type === VpcElType.Unknown) {\n            return '';\n        } else if (type === VpcElType.Btn) {\n            return 'btn';\n        } else if (type === VpcElType.Fld) {\n            return 'fld';\n        } else if (type === VpcElType.Card) {\n            return 'cd';\n        } else if (type === VpcElType.Bg) {\n            return 'bg';\n        } else if (type === VpcElType.Stack) {\n            return 'stack';\n        } else if (type === VpcElType.Product) {\n            return '';\n        } else {\n            checkThrow(false, 'KB|unknown VpcElType' + type);\n        }\n    } else {\n        if (type === VpcElType.Unknown) {\n            return '';\n        } else if (type === VpcElType.Btn) {\n            return 'button';\n        } else if (type === VpcElType.Fld) {\n            return 'field';\n        } else if (type === VpcElType.Card) {\n            return 'card';\n        } else if (type === VpcElType.Bg) {\n            return 'background';\n        } else if (type === VpcElType.Stack) {\n            return 'stack';\n        } else if (type === VpcElType.Product) {\n            return '';\n        } else {\n            checkThrow(false, 'KA|unknown VpcElType' + type);\n        }\n    }\n}\n\n/**\n * speed of visual effect\n */\nexport enum VpcVisualEffectSpeed {\n    __isUI512Enum = 1,\n    normal,\n    slow,\n    fast,\n    verynormal,\n    veryslow,\n    veryfast,\n    __AlternateForm__veryslowly = veryslow,\n    __AlternateForm__slowly = slow\n}\n\n/**\n * note: for simplicity we use \"barn\" and not \"barn door\",\n * and \"venetian\" and not \"venetian blinds\"\n */\nexport enum VpcVisualEffectType {\n    __isUI512Enum = 1,\n    barn,\n    cut,\n    plain,\n    dissolve,\n    venetian,\n    checkerboard,\n    iris,\n    scroll,\n    wipe,\n    zoom,\n    shrink,\n    stretch,\n    push\n}\n\n/**\n * the direction of the effect\n */\nexport enum VpcVisualEffectTypeDirection {\n    __isUI512Enum = 1,\n    open,\n    close,\n    left,\n    right,\n    up,\n    down,\n    top,\n    bottom,\n    center\n}\n\n/**\n * the direction of the effect\n */\nexport enum VpcVisualEffectTypeDestination {\n    __isUI512Enum = 1,\n    card,\n    black,\n    white,\n    gray,\n    inverse,\n    __AlternateForm__cd = card,\n    __AlternateForm__grey = gray\n}\n\n/**\n * specify a visual effect\n */\nexport class VpcVisualEffectSpec {\n    constructor(\n        public sp: VpcVisualEffectSpeed,\n        public typ: VpcVisualEffectType,\n        public dir: VpcVisualEffectTypeDirection,\n        public dest: VpcVisualEffectTypeDestination\n    ) {}\n\n    /**\n     * parse visual effect params. they were already set up nicely in rewrites.\n     */\n    static getVisualEffect(params: string[]) {\n        checkThrowEq(4, params.length, 'T^|');\n        return new VpcVisualEffectSpec(\n            getStrToEnum<VpcVisualEffectSpeed>(VpcVisualEffectSpeed, 'VpcVisualEffectSpeed', params[0]),\n            getStrToEnum<VpcVisualEffectType>(VpcVisualEffectType, 'VpcVisualEffectType', params[1]),\n            getStrToEnum<VpcVisualEffectTypeDirection>(VpcVisualEffectTypeDirection, 'VpcVisualEffectTypeDirection', params[2]),\n            getStrToEnum<VpcVisualEffectTypeDestination>(\n                VpcVisualEffectTypeDestination,\n                'VpcVisualEffectTypeDestination',\n                params[3]\n            )\n        );\n    }\n}\n\n/**\n * a tool\n * you can use __first and __last to iterate all tools\n */\nexport enum VpcTool {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Browse,\n    Button,\n    Field,\n    Select,\n    Brush,\n    Bucket,\n    Stamp,\n    Pencil,\n    Line,\n    Lasso,\n    Eraser,\n    Rect,\n    Oval,\n    Roundrect,\n    Curve,\n    Spray,\n    __first = Browse,\n    __last = Spray,\n    __AlternateForm__Round = Roundrect,\n    __AlternateForm__Rectangle = Rect,\n    __AlternateForm__Spraycan = Spray\n}\n\n/**\n * a tool category\n * not used by scripts, but used by UI implementation,\n * since say the \"pencil\" tool and \"brush\" tool do basically the same thing,\n * they can share the same code\n */\nexport enum VpcToolCtg {\n    __isUI512Enum = 1,\n    CtgBrowse,\n    CtgEdit,\n    CtgShape,\n    CtgRectSelect,\n    CtgLasso,\n    CtgSmear,\n    CtgBucket,\n    CtgCurve,\n    CtgStamp\n}\n\n/**\n * from tool to tool category\n */\nexport function getToolCategory(tl: VpcTool): VpcToolCtg {\n    switch (tl) {\n        case VpcTool.Browse:\n            return VpcToolCtg.CtgBrowse;\n        case VpcTool.Button:\n            return VpcToolCtg.CtgEdit;\n        case VpcTool.Field:\n            return VpcToolCtg.CtgEdit;\n        case VpcTool.Select:\n            return VpcToolCtg.CtgRectSelect;\n        case VpcTool.Brush:\n            return VpcToolCtg.CtgSmear;\n        case VpcTool.Bucket:\n            return VpcToolCtg.CtgBucket;\n        case VpcTool.Stamp:\n            return VpcToolCtg.CtgStamp;\n        case VpcTool.Pencil:\n            return VpcToolCtg.CtgSmear;\n        case VpcTool.Line:\n            return VpcToolCtg.CtgShape;\n        case VpcTool.Lasso:\n            return VpcToolCtg.CtgLasso;\n        case VpcTool.Eraser:\n            return VpcToolCtg.CtgSmear;\n        case VpcTool.Rect:\n            return VpcToolCtg.CtgShape;\n        case VpcTool.Oval:\n            return VpcToolCtg.CtgShape;\n        case VpcTool.Roundrect:\n            return VpcToolCtg.CtgShape;\n        case VpcTool.Spray:\n            return VpcToolCtg.CtgSmear;\n        case VpcTool.Curve:\n            return VpcToolCtg.CtgCurve;\n        default:\n            checkThrow(false, `4/|unknown tool ${tl}`);\n    }\n}\n\n/**\n * from tool to UI512PaintDispatchShapes\n */\nexport function toolToDispatchShapes(tl: VpcTool) {\n    if (tl === VpcTool.Line) {\n        return UI512PaintDispatchShapes.ShapeLine;\n    } else if (tl === VpcTool.Rect) {\n        return UI512PaintDispatchShapes.ShapeRectangle;\n    } else if (tl === VpcTool.Oval) {\n        return UI512PaintDispatchShapes.ShapeEllipse;\n    } else if (tl === VpcTool.Roundrect) {\n        return UI512PaintDispatchShapes.ShapeRoundRect;\n    } else if (tl === VpcTool.Brush) {\n        return UI512PaintDispatchShapes.SmearSmallBrush;\n    } else if (tl === VpcTool.Pencil) {\n        return UI512PaintDispatchShapes.SmearPencil;\n    } else if (tl === VpcTool.Eraser) {\n        return UI512PaintDispatchShapes.SmearRectangle;\n    } else if (tl === VpcTool.Spray) {\n        return UI512PaintDispatchShapes.SmearSpraycan;\n    } else if (tl === VpcTool.Curve) {\n        return UI512PaintDispatchShapes.ShapeCurve;\n    } else if (tl === VpcTool.Bucket) {\n        return UI512PaintDispatchShapes.Bucket;\n    } else {\n        checkThrow(false, 'K9|toPaintOntoCanvasShapes unsupported tool ' + tl);\n    }\n}\n\n/**\n * for backwards compatibility: the original tool numbers\n */\nexport function originalToolNumberToTool(n: number): VpcTool {\n    switch (n) {\n        case 1:\n            return VpcTool.Browse;\n        case 2:\n            return VpcTool.Button;\n        case 3:\n            return VpcTool.Field;\n        case 4:\n            return VpcTool.Select;\n        case 5:\n            return VpcTool.Lasso;\n        case 6:\n            return VpcTool.Pencil;\n        case 7:\n            return VpcTool.Brush;\n        case 8:\n            return VpcTool.Eraser;\n        case 9:\n            return VpcTool.Line;\n        case 10:\n            return VpcTool.Spray;\n        case 11:\n            return VpcTool.Rect;\n        case 12:\n            return VpcTool.Roundrect;\n        case 13:\n            return VpcTool.Bucket;\n        case 14:\n            return VpcTool.Oval;\n        case 15:\n            return VpcTool.Curve;\n        /* 16: text tool, not yet implemented */\n        /* 17: regular polygon tool, not yet implemented */\n        /* 18: polygon tool, not yet implemented */\n        default:\n            checkThrow(false, `T]|unknown or unsupported tool ${n}`);\n    }\n}\n\n/**\n * built-in messages sent to scripts.\n */\nexport enum VpcBuiltinMsg {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Openbackground,\n    Opencard,\n    Openstack,\n    Closebackground,\n    Closecard,\n    Mousedoubleclick,\n    Mousedown,\n    Mouseenter,\n    Mouseleave,\n    Mouseup,\n    Mousewithin,\n    Idle,\n    Afterkeydown,\n    Afterkeyup,\n    Openfield,\n    Closefield,\n    Exitfield,\n    SendCode,\n    __Custom\n}\n\n/**\n * what we support for the wait command, e.g. \"wait 100 ms\"\n */\nexport enum MapTermToMilliseconds {\n    __isUI512Enum = 1,\n    __UI512EnumCapitalize,\n    Tick = 16,\n    Ticks = 16,\n    Milliseconds = 1,\n    Ms = 1,\n    Sec = 1000,\n    Secs = 1000,\n    Second = 1000,\n    Seconds = 1000\n}\n\n/**\n * event details type tp message type\n * note that Idle can become either on mousewithin or on idle depending on context\n */\nexport function getMsgFromEvtType(tp: UI512EventType) {\n    switch (tp) {\n        case UI512EventType.KeyUp:\n            return VpcBuiltinMsg.Afterkeyup;\n        case UI512EventType.KeyDown:\n            return VpcBuiltinMsg.Afterkeydown;\n        case UI512EventType.MouseDown:\n            return VpcBuiltinMsg.Mousedown;\n        case UI512EventType.MouseDownDouble:\n            return VpcBuiltinMsg.Mousedoubleclick;\n        case UI512EventType.MouseUp:\n            return VpcBuiltinMsg.Mouseup;\n        case UI512EventType.Idle:\n            return VpcBuiltinMsg.Mousewithin;\n        case UI512EventType.MouseEnter:\n            return VpcBuiltinMsg.Mouseenter;\n        case UI512EventType.MouseLeave:\n            return VpcBuiltinMsg.Mouseleave;\n        default:\n            checkThrow(false, `4.|unknown event type ${tp}`);\n    }\n}\n\n/**\n * levels of operations when evaluating an expression\n */\nexport enum VpcOpCtg {\n    __isUI512Enum = 1,\n    OpLogicalOrAnd,\n    OpStringConcat,\n    OpStringWithin,\n    OpEqualityGreaterLessOrContains,\n    OpPlusMinus,\n    OpMultDivideExpDivMod\n}\n\nfunction getPositionUnbounded(rel: OrdinalOrPosition, current: number, min: number, max: number) {\n    switch (rel) {\n        case OrdinalOrPosition.Last:\n            return max;\n        case OrdinalOrPosition.Middle:\n            /* confirmed in emulator that this rounds to highest */\n            return Math.ceil((min + max) / 2);\n        case OrdinalOrPosition.Any:\n            return Util512Higher.getRandIntInclusiveWeak(min, max);\n        case OrdinalOrPosition.First:\n            return min;\n        case OrdinalOrPosition.Second:\n            return min + 1;\n        case OrdinalOrPosition.Third:\n            return min + 2;\n        case OrdinalOrPosition.Fourth:\n            return min + 3;\n        case OrdinalOrPosition.Fifth:\n            return min + 4;\n        case OrdinalOrPosition.Sixth:\n            return min + 5;\n        case OrdinalOrPosition.Seventh:\n            return min + 6;\n        case OrdinalOrPosition.Eighth:\n            return min + 7;\n        case OrdinalOrPosition.Ninth:\n            return min + 8;\n        case OrdinalOrPosition.Tenth:\n            return min + 9;\n        case OrdinalOrPosition.Next: {\n            /* cycle back to the beginning */\n            let tmp = current + 1;\n            return tmp > max ? min : tmp;\n        }\n        case OrdinalOrPosition.Previous: {\n            /* cycle back to the end */\n            let tmp = current - 1;\n            return tmp < min ? max : tmp;\n        }\n        case OrdinalOrPosition.This:\n            return current;\n        default:\n            checkThrow(false, `4-|unknown ordinal ${rel}`);\n    }\n}\n\n/**\n * evaluate an OrdinalOrPosition\n * current === -1 is allowed! it will be fit within the bounds.\n */\nexport function findPositionFromOrdinalOrPosition(rel: OrdinalOrPosition, current: number, min: number, max: number): O<number> {\n    current = fitIntoInclusive(current, min, max);\n    let ret = getPositionUnbounded(rel, current, min, max);\n    return ret >= min && ret <= max ? ret : undefined;\n}\n\n/**\n * Redesigning exceptions for code errors.\n * Different ways code can fail:\n *      1) error during lexing\n *      2) error during preprocessing/rewrites\n *      3) error during parsing\n *      4) error during command execution\n *      5) error during syntax execution\n *      (i.e. runtime error in an if )\n */\nexport enum VpcErrStage {\n    __isUI512Enum = 1,\n    Unknown,\n    Lex,\n    Rewrite,\n    Parse,\n    Execute,\n    Visit,\n    SyntaxStep\n}\n\n/**\n * placeholder interface, is actually a LineOfCode object\n */\nexport interface IVpcCodeLine {\n    readonly lineId: number;\n}\n\n/**\n * a vpc error. doesn't have to be a script error, but often is.\n */\nexport class VpcErr extends Util512BaseErr {\n    typeName = 'VpcErr';\n    origClass = 'VpcErr';\n    scriptErrLine: O<number>;\n    scriptErrVelid: O<string>;\n    lineObj: O<IVpcCodeLine>;\n    stage = VpcErrStage.Unknown;\n    traceInfo: O<[string, string, number][]>;\n\n    /**\n     * for example, when you say 'send \"#$@#$@#\" to cd btn 1'\n     * the code is run in the context of cd btn 1,\n     * but the resulting script error should actually be\n     * shown to originate from the original line.\n     */\n    dynamicCodeOrigin: O<[string, number]>;\n\n    protected static gen(message: string, level: string) {\n        return new VpcErr(message, level);\n    }\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(VpcErr.gen, ...params);\n    }\n}\n\n/**\n * make a vpc error\n */\nexport function makeVpcError(msg: string, s1: unknown = '', s2: unknown = '', s3: unknown = '') {\n    let level = 'vpc';\n    let msgTotal = joinIntoMessage(msg, level, s1, s2, s3);\n    return VpcErr.createError(msgTotal, level);\n}\n\n/**\n * a quick way to throw if condition is false.\n * not the same as assert, which should only be triggered when\n * something goes wrong.\n */\nexport function checkThrow(condition: unknown, msg: string, s1: unknown = '', s2: unknown = ''): asserts condition {\n    if (!condition) {\n        throw makeVpcError(msg, s1, s2).clsAsErr();\n    }\n}\n\n/**\n * a quick way to throw an expection if value is not what was expected.\n */\nexport function checkThrowEq<T>(expected: T, got: unknown, msg: string, c1: unknown = '', c2: unknown = ''): asserts got is T {\n    if (expected !== got && util512Sort(expected, got, true) !== 0) {\n        let msgEq = ` expected '${expected}' but got '${got}'.`;\n        checkThrow(false, msg + msgEq, c1, c2);\n    }\n}\n\n/**\n * distinguish between expected script errors, like bad syntax in the script,\n * and 'internal' unexpected conditions\n */\nexport class VpcInternalErr extends Util512BaseErr {\n    typeName = 'VpcInternalErr';\n    protected static gen(message: string, level: string) {\n        return new VpcInternalErr(message, level);\n    }\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(VpcInternalErr.gen, ...params);\n    }\n}\n\n/**\n * make an internal error\n */\nexport function makeVpcInternalErr(msg: string, s1: unknown = '', s2: unknown = '', s3: unknown = '') {\n    let level = 'vpcinternal';\n    let msgTotal = joinIntoMessage(msg, level, s1, s2, s3);\n    return VpcInternalErr.createError(msgTotal, level);\n}\n\n/**\n * if condition is false, throw a 'internal' exception\n */\nexport function checkThrowInternal(condition: unknown, msg: string, s1: unknown = '', s2: unknown = ''): asserts condition {\n    if (!condition) {\n        throw makeVpcInternalErr(msg, s1, s2).clsAsErr();\n    }\n}\n\n/**\n * an exception that doesn't represent an error state,\n * just a message we want to show the user.\n */\nexport class VpcNotificationMsg extends Util512Message {\n    typeName = 'VpcNotificationMsg';\n    protected static gen(message: string, level: string) {\n        return new VpcNotificationMsg(message, level);\n    }\n    static createError(...params: unknown[]) {\n        return Util512BaseErr.createErrorImpl(VpcNotificationMsg.gen, ...params);\n    }\n}\n\n/**\n * make a notification type of message\n */\nexport function makeVpcNotificationMsg(msg: string, s1: unknown = '', s2: unknown = '', s3: unknown = '') {\n    let level = 'vpcmessage';\n    let msgTotal = joinIntoMessage(msg, level, s1, s2, s3);\n    return VpcNotificationMsg.createError(msgTotal, level);\n}\n\n/**\n * if condition is false, throw a notification\n */\nexport function checkThrowNotifyMsg(condition: unknown, msg: string, s1: unknown = '', s2: unknown = ''): asserts condition {\n    if (!condition) {\n        throw makeVpcNotificationMsg(msg, s1, s2).clsAsErr();\n    }\n}\n\n/**\n * we're about to show it to the user, so make it look nicer\n */\nexport function cleanExceptionMsg(e: Error): string {\n    let isMsgCls = false;\n    if ((e as any)?.typeName?.includes('Message') || (e as any)?.typeName?.includes('Msg')) {\n        isMsgCls = true;\n    }\n\n    let msg = e.message.trim();\n    if (isMsgCls || msg.startsWith('vpcmessage:')) {\n        isMsgCls = true;\n        /* remove the marker */\n        let r = / \\(..\\)$/g;\n        msg = msg.replace(r, '');\n    }\n\n    if (msg.startsWith('vpcinternal:')) {\n        msg = msg.slice('vpcinternal:'.length) + ' (internal)';\n    } else if (msg.startsWith('vpc:')) {\n        msg = msg.slice('vpc:'.length);\n    } else if (msg.startsWith('vpcmessage:')) {\n        msg = msg.slice('vpcmessage:'.length);\n    } else if (msg.startsWith('ui512:')) {\n        msg = msg.slice('ui512:'.length) + ' (ui512)';\n    }\n\n    if (isMsgCls) {\n        return msg.trim();\n    } else {\n        return 'Note: ' + msg.trim();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcInitIcons.ts",
    "content": "\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { IconGroupInfo, RenderIconGroup } from './../../ui512/draw/ui512DrawIconClasses';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * specify the icon dimensions for ViperCard-specific icons.\n * define rectangles where each icon is in the image.\n */\nexport const VpcInitIcons = /* static class */ {\n    /**\n     * define icons, if needed.\n     */\n    go() {\n        if (RenderIconGroup.cachedGridInfo['000']) {\n            /* exit early if we've already loaded. */\n            return;\n        }\n\n        VpcInitIcons._defineGroup000();\n        VpcInitIcons._defineGroup001();\n        VpcInitIcons._defineGroup002();\n        VpcInitIcons._defineCursors();\n        VpcInitIcons._defineGroupDissolve();\n        VpcInitIcons._defineGroupSpace();\n        VpcInitIcons._defineGroupLogo();\n        VpcInitIcons._defineGroupGlider();\n        VpcInitIcons._setGliderSprites();\n        Util512.freezeRecurse(RenderIconGroup.cachedGridInfo);\n    },\n\n    /**\n     * icon set for the vipercard logo\n     */\n    _defineGroupLogo() {\n        let grpLogo = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['logo'] = grpLogo;\n        grpLogo.totalIcons = 3;\n        grpLogo.customOffsets[0] = [0, 0];\n        grpLogo.customDims[0] = [176, 90];\n        grpLogo.customOffsets[1] = [180, 0];\n        grpLogo.customDims[1] = [284, 512];\n        grpLogo.customOffsets[2] = [1, 491];\n        grpLogo.customDims[2] = [22, 20];\n    },\n\n    /**\n     * icon set for dissolve & visual fx implementation\n     */\n    _defineGroupDissolve() {\n        let grpDissolve = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['fordissolve'] = grpDissolve;\n        grpDissolve.gridSize = 64;\n        grpDissolve.gridSpacing = 0;\n        grpDissolve.gridWidth = 64;\n        grpDissolve.totalIcons = 11;\n    },\n\n    /**\n     * icon group 0, background textures\n     */\n    _defineGroup000() {\n        let grp000 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['000'] = grp000;\n        grp000.totalIcons = 4;\n        grp000.customOffsets[0] = [0, 0];\n        grp000.customDims[0] = [896, 48];\n        grp000.customOffsets[1] = [0, 48];\n        grp000.customDims[1] = [896, 48];\n        grp000.customOffsets[2] = [0, 48 + 48];\n        grp000.customDims[2] = [896, 64];\n        grp000.customOffsets[3] = [0, 48 + 48 + 64];\n        grp000.customDims[3] = [896, 24];\n    },\n\n    /**\n     * icon group 2, \"icons\" for vipercard buttons\n     */\n    _defineGroup002() {\n        let grp002 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['002'] = grp002;\n        grp002.gridSize = 32;\n        grp002.gridSpacing = 1;\n        grp002.gridWidth = 12;\n        grp002.totalIcons = 12 * 23;\n    },\n\n    /**\n     * icon groups for cursors\n     */\n    _defineCursors() {\n        let grpCursors1 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['0cursors1'] = grpCursors1;\n        grpCursors1.gridSize = 32;\n        grpCursors1.gridSpacing = 1;\n        grpCursors1.gridWidth = 12;\n        grpCursors1.totalIcons = 12 * 3;\n\n        let grpCursors2 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['0cursors2'] = grpCursors2;\n        grpCursors2.gridSize = 32 * 2;\n        grpCursors2.gridSpacing = 1 * 2;\n        grpCursors2.gridWidth = 12;\n        grpCursors2.totalIcons = 12 * 3;\n\n        let grpCursors3 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['0cursors3'] = grpCursors3;\n        grpCursors3.gridSize = 32 * 3;\n        grpCursors3.gridSpacing = 1 * 3;\n        grpCursors3.gridWidth = 12;\n        grpCursors3.totalIcons = 12 * 3;\n\n        let gps = [grpCursors1, grpCursors2, grpCursors3];\n        for (let i = 0; i < gps.length; i++) {\n            let m = i + 1;\n            gps[i].customDims[0] = [m * 8, m * 16];\n            gps[i].customDims[1] = [m * 17, m * 17];\n            gps[i].customDims[2] = [m * 16, m * 16];\n            gps[i].customDims[3] = [m * 16, m * 16];\n            gps[i].customDims[4] = [m * 16, m * 16];\n            gps[i].customDims[5] = [m * 16, m * 16];\n            gps[i].customDims[6] = [m * 15, m * 15];\n            gps[i].customDims[7] = [m * 16, m * 16];\n            gps[i].customDims[8] = [m * 12, m * 16];\n            gps[i].customDims[9] = [m * 16, m * 16];\n            gps[i].customDims[10] = [m * 16, m * 16];\n            gps[i].customDims[11] = [m * 16, m * 16];\n            gps[i].customDims[12] = [m * 17, m * 17];\n            gps[i].customDims[13] = [m * 16, m * 16];\n            gps[i].customDims[14] = [m * 16, m * 17];\n            gps[i].customDims[15] = [m * 15, m * 15];\n            gps[i].customDims[16] = [m * 15, m * 15];\n            gps[i].customDims[17] = [m * 15, m * 15];\n        }\n    },\n\n    /**\n     * icon group 1, parts of the ui like scrollbar arrows, patterns, tools\n     */\n    _defineGroup001() {\n        let grp001 = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['001'] = grp001;\n        grp001.gridSize = 32;\n        grp001.gridSpacing = 1;\n        grp001.gridWidth = 9;\n        grp001.totalIcons = 9 * 16 + 2;\n        for (let i = 0; i < 18; i++) {\n            grp001.customDims[i] = [22, 20];\n        }\n        grp001.customDims[18] = [9, 9];\n        grp001.customDims[19] = [9, 8];\n        for (let i = 20; i < 23; i++) {\n            grp001.customDims[i] = [22, 20];\n        }\n        for (let i = 23; i < 27; i++) {\n            grp001.customDims[i] = [14, 14];\n        }\n        grp001.customDims[27] = [11, 8];\n        for (let i = 28; i < 36; i++) {\n            grp001.customDims[i] = [12, 12];\n        }\n        /* pattern toolbox icons part 1 */\n        for (let i = 36; i < 75; i++) {\n            grp001.customDims[i] = [17, 12];\n        }\n        grp001.customDims[75] = [18, 16];\n        grp001.customDims[76] = [32, 32];\n        grp001.customDims[77] = [32, 32];\n        grp001.customDims[78] = [12, 15];\n        grp001.customDims[79] = [11, 13];\n        grp001.customDims[80] = [8, 11];\n        /* pattern toolbox icons part 2 */\n        for (let i = 81; i < 90; i++) {\n            grp001.customDims[i] = [17, 12];\n        }\n        /* nav icons */\n        for (let i = 90; i < 100; i++) {\n            grp001.customDims[i] = [22, 20];\n        }\n        /* first gray pattern */\n        grp001.customOffsets[144] = [0, 529];\n        grp001.customDims[144] = [304, 384];\n        /* second gray pattern */\n        grp001.customOffsets[145] = [0, 529 + 384];\n        grp001.customDims[145] = [304, 383];\n    },\n\n    /**\n     * icon set for space game\n     */\n    _defineGroupSpace() {\n        let grpSpace = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['spacegame'] = grpSpace;\n        grpSpace.gridSize = 14;\n        grpSpace.gridSpacing = 0;\n        grpSpace.gridWidth = 10;\n        grpSpace.totalIcons = 7 * grpSpace.gridWidth + 4;\n        grpSpace.customOffsets[grpSpace.totalIcons - 4] = [12, 402];\n        grpSpace.customDims[grpSpace.totalIcons - 4] = [396, 134];\n        grpSpace.customOffsets[grpSpace.totalIcons - 3] = [2, 136];\n        grpSpace.customDims[grpSpace.totalIcons - 3] = [437, 264];\n        grpSpace.customOffsets[grpSpace.totalIcons - 2] = [6, 105];\n        grpSpace.customDims[grpSpace.totalIcons - 2] = [253, 27];\n        grpSpace.customOffsets[grpSpace.totalIcons - 1] = [145, 1];\n        grpSpace.customDims[grpSpace.totalIcons - 1] = [36, 30];\n    },\n\n    /**\n     * icon set for glider game\n     */\n    _defineGroupGlider() {\n        let gliderBg = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['gliderBg'] = gliderBg;\n        gliderBg.totalIcons = 43;\n        for (let i = 0; i < gliderBg.totalIcons; i++) {\n            gliderBg.customOffsets[i] = [0, i * 343];\n            gliderBg.customDims[i] = [512, 343];\n        }\n    },\n\n    /**\n     * icon set for glider sprites,\n     * the glider icons aren't in a fixed grid and need custom dims\n     */\n    _setGliderSprites() {\n        let grpGlider = new IconGroupInfo();\n        RenderIconGroup.cachedGridInfo['gliderSprites'] = grpGlider;\n        grpGlider.totalIcons = 80;\n        grpGlider.customOffsets[0] = [0, 0];\n        grpGlider.customDims[0] = [1, 1];\n        grpGlider.customOffsets[1] = [256, 0];\n        grpGlider.customDims[1] = [48, 11];\n        grpGlider.customOffsets[2] = [256, 12];\n        grpGlider.customDims[2] = [48, 11];\n        grpGlider.customOffsets[3] = [0, 0];\n        grpGlider.customDims[3] = [48, 20];\n        grpGlider.customOffsets[4] = [0, 21];\n        grpGlider.customDims[4] = [48, 20];\n        grpGlider.customOffsets[5] = [0, 42];\n        grpGlider.customDims[5] = [48, 20];\n        grpGlider.customOffsets[6] = [0, 63];\n        grpGlider.customDims[6] = [48, 20];\n        grpGlider.customOffsets[7] = [208, 0];\n        grpGlider.customDims[7] = [48, 20];\n        grpGlider.customOffsets[8] = [208, 21];\n        grpGlider.customDims[8] = [48, 20];\n        grpGlider.customOffsets[9] = [208, 42];\n        grpGlider.customDims[9] = [48, 20];\n        grpGlider.customOffsets[10] = [208, 63];\n        grpGlider.customDims[10] = [48, 20];\n        grpGlider.customOffsets[11] = [208, 84];\n        grpGlider.customDims[11] = [48, 20];\n        grpGlider.customOffsets[12] = [208, 105];\n        grpGlider.customDims[12] = [48, 20];\n        grpGlider.customOffsets[13] = [256, 24];\n        grpGlider.customDims[13] = [48, 36];\n        grpGlider.customOffsets[14] = [256, 61];\n        grpGlider.customDims[14] = [48, 36];\n        grpGlider.customOffsets[15] = [256, 98];\n        grpGlider.customDims[15] = [48, 36];\n        grpGlider.customOffsets[16] = [256, 135];\n        grpGlider.customDims[16] = [48, 36];\n        grpGlider.customOffsets[17] = [414, 179];\n        grpGlider.customDims[17] = [48, 20];\n        grpGlider.customOffsets[18] = [463, 179];\n        grpGlider.customDims[18] = [48, 20];\n        grpGlider.customOffsets[19] = [0, 84];\n        grpGlider.customDims[19] = [48, 12];\n        grpGlider.customOffsets[20] = [0, 97];\n        grpGlider.customDims[20] = [48, 13];\n        grpGlider.customOffsets[21] = [0, 111];\n        grpGlider.customDims[21] = [48, 13];\n        grpGlider.customOffsets[22] = [0, 125];\n        grpGlider.customDims[22] = [48, 21];\n        grpGlider.customOffsets[23] = [0, 147];\n        grpGlider.customDims[23] = [38, 27];\n        grpGlider.customOffsets[24] = [304, 84];\n        grpGlider.customDims[24] = [32, 31];\n        grpGlider.customOffsets[25] = [304, 116];\n        grpGlider.customDims[25] = [32, 31];\n        grpGlider.customOffsets[26] = [304, 148];\n        grpGlider.customDims[26] = [32, 31];\n        grpGlider.customOffsets[27] = [304, 180];\n        grpGlider.customDims[27] = [32, 31];\n        grpGlider.customOffsets[28] = [304, 212];\n        grpGlider.customDims[28] = [32, 31];\n        grpGlider.customOffsets[29] = [304, 244];\n        grpGlider.customDims[29] = [32, 31];\n        grpGlider.customOffsets[30] = [0, 175];\n        grpGlider.customDims[30] = [41, 30];\n        grpGlider.customOffsets[31] = [0, 206];\n        grpGlider.customDims[31] = [35, 55];\n        grpGlider.customOffsets[32] = [0, 262];\n        grpGlider.customDims[32] = [35, 54];\n        grpGlider.customOffsets[33] = [48, 23];\n        grpGlider.customDims[33] = [64, 22];\n        grpGlider.customOffsets[34] = [48, 46];\n        grpGlider.customDims[34] = [64, 24];\n        grpGlider.customOffsets[35] = [48, 71];\n        grpGlider.customDims[35] = [64, 55];\n        grpGlider.customOffsets[36] = [112, 0];\n        grpGlider.customDims[36] = [32, 29];\n        grpGlider.customOffsets[37] = [112, 30];\n        grpGlider.customDims[37] = [32, 21];\n        grpGlider.customOffsets[38] = [112, 52];\n        grpGlider.customDims[38] = [32, 23];\n        grpGlider.customOffsets[39] = [112, 76];\n        grpGlider.customDims[39] = [32, 32];\n        grpGlider.customOffsets[40] = [112, 109];\n        grpGlider.customDims[40] = [32, 29];\n        grpGlider.customOffsets[41] = [144, 109];\n        grpGlider.customDims[41] = [16, 16];\n        grpGlider.customOffsets[42] = [144, 126];\n        grpGlider.customDims[42] = [16, 16];\n        grpGlider.customOffsets[43] = [144, 143];\n        grpGlider.customDims[43] = [16, 16];\n        grpGlider.customOffsets[44] = [144, 160];\n        grpGlider.customDims[44] = [16, 16];\n        grpGlider.customOffsets[45] = [112, 139];\n        grpGlider.customDims[45] = [32, 29];\n        grpGlider.customOffsets[46] = [112, 169];\n        grpGlider.customDims[46] = [32, 29];\n        grpGlider.customOffsets[47] = [112, 199];\n        grpGlider.customDims[47] = [32, 29];\n        grpGlider.customOffsets[48] = [142, 0];\n        grpGlider.customDims[48] = [18, 26];\n        grpGlider.customOffsets[49] = [144, 27];\n        grpGlider.customDims[49] = [18, 27];\n        grpGlider.customOffsets[50] = [160, 264];\n        grpGlider.customDims[50] = [32, 25];\n        grpGlider.customOffsets[51] = [160, 290];\n        grpGlider.customDims[51] = [32, 25];\n        grpGlider.customOffsets[52] = [160, 316];\n        grpGlider.customDims[52] = [32, 25];\n        grpGlider.customOffsets[53] = [144, 82];\n        grpGlider.customDims[53] = [18, 26];\n        grpGlider.customOffsets[54] = [48, 127];\n        grpGlider.customDims[54] = [64, 170];\n        grpGlider.customOffsets[55] = [192, 42];\n        grpGlider.customDims[55] = [16, 13];\n        grpGlider.customOffsets[56] = [192, 71];\n        grpGlider.customDims[56] = [16, 29];\n        grpGlider.customOffsets[57] = [448, 270];\n        grpGlider.customDims[57] = [63, 71];\n        grpGlider.customOffsets[58] = [408, 53];\n        grpGlider.customDims[58] = [102, 93];\n        grpGlider.customOffsets[59] = [144, 55];\n        grpGlider.customDims[59] = [16, 26];\n        grpGlider.customOffsets[60] = [256, 209];\n        grpGlider.customDims[60] = [45, 58];\n        grpGlider.customOffsets[61] = [0, 0];\n        grpGlider.customDims[61] = [161, 254];\n        grpGlider.customOffsets[62] = [0, 0];\n        grpGlider.customDims[62] = [161, 254];\n        grpGlider.customOffsets[63] = [144, 189];\n        grpGlider.customDims[63] = [16, 12];\n        grpGlider.customOffsets[64] = [144, 202];\n        grpGlider.customDims[64] = [16, 12];\n        grpGlider.customOffsets[65] = [144, 215];\n        grpGlider.customDims[65] = [16, 12];\n        grpGlider.customOffsets[66] = [192, 0];\n        grpGlider.customDims[66] = [16, 13];\n        grpGlider.customOffsets[67] = [192, 14];\n        grpGlider.customDims[67] = [16, 13];\n        grpGlider.customOffsets[68] = [192, 28];\n        grpGlider.customDims[68] = [16, 13];\n        grpGlider.customOffsets[69] = [192, 42];\n        grpGlider.customDims[69] = [16, 13];\n        grpGlider.customOffsets[70] = [192, 56];\n        grpGlider.customDims[70] = [16, 14];\n\n        /* vent pattern, added manually */\n        grpGlider.customOffsets[71] = [512, 0];\n        grpGlider.customDims[71] = [16, 342];\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcRequestedReference.ts",
    "content": "\n/* auto */ import { VpcIntermedValBase } from './vpcVal';\n/* auto */ import { OrdinalOrPosition, VpcElType } from './vpcEnums';\n/* auto */ import { RequestedChunk } from './vpcChunkResolutionUtils';\n/* auto */ import { O, checkIsProductionBuild } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a script is requesting a reference to a vel element.\n * e.g. cd fld id 1234, or\n * cd btn \"c\" of second cd of bg \"myBg\"\n *\n * note that bg fld 1 of cd 2 is not the same as bg fld 1 of cd 3,\n * if it was accessed via different card it can change the meaning.\n *\n * the vel might or might not exist, it hasn't been\n * \"resolved\", by _velResolveReference_.\n */\nexport class RequestedVelRef extends VpcIntermedValBase {\n    type: VpcElType;\n    lookById: O<number>;\n    lookByName: O<string>;\n    lookByRelative: O<OrdinalOrPosition>;\n    lookByAbsolute: O<number>;\n    parentCdInfo: O<RequestedVelRef>;\n    parentBgInfo: O<RequestedVelRef>;\n    parentStackInfo: O<RequestedVelRef>;\n    partIsBg = false;\n    partIsCd = false;\n    partIsCdOrBg = false;\n    isReferenceToMe = false;\n    isReferenceToTarget = false;\n    cardLookAtMarkedOnly = false;\n    cardIsRecentHistory = '';\n    constructor(type: VpcElType) {\n        super();\n        this.type = type;\n    }\n\n    /**\n     * should only have one specified\n     */\n    checkOnlyOneSpecified() {\n        if (!checkIsProductionBuild()) {\n            let total = 0;\n            if (this.lookByAbsolute !== undefined) {\n                total += 1;\n            }\n            if (this.lookById !== undefined) {\n                total += 1;\n            }\n            if (this.lookByName !== undefined) {\n                total += 1;\n            }\n            if (this.lookByRelative !== undefined) {\n                total += 1;\n            }\n\n            assertWarn(total <= 1, 'WP|too many specified');\n        }\n    }\n}\n\n/**\n * a script is requesting a reference to a container\n * maybe a variable or a field.\n * the container might or might not exist, it hasn't been resolved\n */\nexport class RequestedContainerRef extends VpcIntermedValBase {\n    vel: O<RequestedVelRef>;\n    variable: O<string>;\n    chunk: O<RequestedChunk>;\n    isJustSelection = false;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcStandardLibDoMenu.ts",
    "content": "\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * if code here needs special abilities, we'll call\n * internalvpcmessagesdirective, which can do anything.\n *\n * in the same scope as vpcStandardLibScript and can call anything there.\n */\nexport const VpcStandardLibDoMenu = /* static class */ {\n    script: `\n\non vpcinternaluntrappabledomenu itemName, pb\n    if the shiftKey is down then\n        domenu itemName, pb\n    else\n        send (\"domenu \"&quote&itemName&quote&\", \"&quote&pb&quote) to this cd\n    end if\nend vpcinternaluntrappabledomenu\n\non domenu itemName, pb\n    global doMenuResult\n    put \"\" into doMenuResult\n    put tolowercase(itemName) into pl\n    if \"|\" is in pl then\n        errordialog (\"not a valid domenu\" && pl)\n    end if\n    put false into handled\n    put \"|\" & pl & \"|\" into key\n    if not handled then put domenu_edit(key, pl, pb) into handled\n    if not handled then put domenu_movecard(key, pl, pb) into handled\n    if not handled then put domenu_object(key, pl, pb) into handled\n    if not handled then put domenu_paintsetting(key, pl, pb) into handled\n    if not handled then put domenu_changefont(key, pl, pb) into handled\n    if not handled then put domenu_changefontsize(key, pl, pb) into handled\n    if not handled then put domenu_changefontstyle(key, pl, pb) into handled\n    if not handled then put domenu_changefontalign(key, pl, pb) into handled\n    if not handled then\n        errorDialog (\"Unknown domenu\" && pl)\n    end if\n    return doMenuResult\nend domenu\n\non domenu_edit key, pl, pb\n    global doMenuResult\n    put true into ret\n    if pl == \"clear\" then\n        put the selectedfield into theFld\n        if theFld is not empty then\n            put \"\" into the selection\n            select before text of theFld\n        end if\n    else\n        put false into ret\n    end if\n    return ret\nend domenu_edit\n\non domenu_object key, pl, pb\n    global doMenuResult\n    put true into ret\n    if pl == \"new button\" or pl == \"new button from ui\" then\n        send \"newButton\" to this cd\n        put \"btn\" into sendParam\n        if \"from ui\" is in pl then put \"fromui\" after sendParam\n        internalvpcmessagesdirective \"makevelwithoutmsg\" sendParam\n        put sendParam into doMenuResult\n    else if pl == \"new field\" or pl == \"new field from ui\" then\n        send \"newField\" to this cd\n        put \"fld\" into sendParam\n        if \"from ui\" is in pl then put \"fromui\" after sendParam\n        internalvpcmessagesdirective \"makevelwithoutmsg\" sendParam\n        put sendParam into doMenuResult\n    else if pl == \"new background\" then\n        send \"newBackground\" to this stack\n        put \"bkgnd\" into sendParam\n        internalvpcmessagesdirective \"makevelwithoutmsg\" sendParam\n        put sendParam into doMenuResult\n        go cd 1 of bkgnd id doMenuResult\n    else if pl == \"new card\" then\n        send \"newCard\" to this cd\n        put \"card\" into sendParam\n        internalvpcmessagesdirective \"makevelwithoutmsg\" sendParam\n        put sendParam into doMenuResult\n        go cd id doMenuResult\n    else if pl == \"duplicate card paint\" then\n        send \"newCard\" to this cd\n        put \"dupecardpaint\" into sendParam\n        internalvpcmessagesdirective \"makevelwithoutmsg\" sendParam\n        put sendParam into doMenuResult\n        go cd id doMenuResult\n    else if pl == \"paste card or vel\" then\n        put \"\" into sendParam\n        internalvpcmessagesdirective \"pastecardorvel\" sendParam\n        put sendParam into doMenuResult\n    else if pl == \"delete card\" then\n        delete this card\n    else\n        put false into ret\n    end if\n    return ret\nend domenu_object\n\non domenu_movecard key, pl, pb\n    put true into ret\n    if pl == \"back\" then\n        go back\n    else if pl == \"home\" then\n        go to card 1\n    else if pl == \"help\" then\n        send \"help\" to this card\n    else if pl == \"recent\" then\n        go recent\n    else if pl == \"first\" then\n        go first\n    else if pl == \"last\" then\n        go last\n    else if pl == \"prev\" or pl == \"previous\" then\n        if pb == \"FromUI\" and the number of this cd is 1 then\n            answer \"You are already at the first card.\"\n        else\n            go prev\n        end if\n    else if pl == \"next\" then\n        if pb == \"FromUI\" and the number of this cd >= the number of cds in this stack then\n            answer \"You are at the last-most card. You can create a new card by selecting 'New Card' from the Edit menu.\"\n        else\n            go next\n        end if\n    else\n        put false into ret\n    end if\n    return ret\nend domenu_movecard\n\non domenu_paintsetting key, pl, pb\n    global doMenuResult\n    put true into ret\n    if pl == \"wide lines\" then\n        if the linesize is 1 then\n            set the linesize to 2\n        else\n            set the linesize to 1\n        end if\n    else if pl == \"black lines\" then\n        -- DrawPatterns_clrBlack\n        set the linecolor to 0\n    else if pl == \"white lines\" then\n        -- DrawPatterns_clrWhite\n        set the linecolor to 1\n    else if pl == \"no fill\" then\n        set the filled to false\n    else if pl == \"black fill\" then\n        set the filled to true\n    else if pl == \"white fill\" then\n        set the filled to \"white\"\n    else if pl == \"draw multiple\" then\n        set the multiple to (not the multiple)\n    else\n        put false into ret\n    end if\n    return ret\nend domenu_paintsetting\n\non domenu_changefont key, pl, pb\n    put \"|chicago|courier|geneva|new york|times|helvetica|monaco|symbol|\" into keys\n    if key is in keys then\n        domenu_exitifcompatmodeenabled\n        if \"setAll|\" is in pb then\n            replace \"setAll|\" with \"\" in pb\n            set the textfont of pb to pl\n        else\n            set the textfont of the selectedchunk to pl\n        end if\n        return true\n    else\n        return false\n    end if\nend domenu_changefont\n\non domenu_changefontsize key, pl, pb\n    put \"|9|10|12|14|18|24|\" into keys\n    if key is in keys then\n        domenu_exitifcompatmodeenabled\n        if \"setAll|\" is in pb then\n            replace \"setAll|\" with \"\" in pb\n            set the textsize of pb to pl\n        else\n            set the textsize of the selectedchunk to pl\n        end if\n        return true\n    else\n        return false\n    end if\nend domenu_changefontsize\n\non domenu_changefontstyle key, pl, pb\n    put \"|plain|bold|italic|underline|outline|condense|extend|grayed|\" into keys\n    if key is in keys then\n        domenu_exitifcompatmodeenabled\n        if \"setAll|\" is in pb then\n            replace \"setAll|\" with \"\" in pb\n            if pl == \"plain\" then\n                set the textstyle of pb to plain\n            else\n                set the textstyle of pb to \"toggle-\" & pl\n            end if\n        else if pl == \"plain\" then\n            set the textstyle of the selectedchunk to plain\n        else\n            set the textstyle of the selectedchunk to \"toggle-\" & pl\n        end if\n        return true\n    else\n        return false\n    end if\nend domenu_changefontstyle\n\non domenu_changefontalign key, pl, pb\n    put true into ret\n    put \"|align left|alignleft|align center|aligncenter|\" into keys\n    if key is in keys then\n        domenu_exitifcompatmodeenabled\n        if \"left\" is in pl then put \"left\" into direction\n        else put \"center\" into direction\n        if \"setAll|\" is in pb then\n            replace \"setAll|\" with \"\" in pb\n            set the textalign of pb to direction\n        else\n            set the textalign of the selectedfield to direction\n        end if\n        return true\n    else\n        return false\n    end if\nend domenu_changefontalign\n\non domenu_exitifcompatmodeenabled\n    if the compatibilitymode of this stack then\n        answer \"Please turn off compatibilitymode before doing this.\"\n        exit to ViperCard\n    end if\nend domenu_exitifcompatmodeenabled\n       `.replace(/\\r\\n/g, '\\n')\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcStandardLibScript.ts",
    "content": "\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * some of ViperCard is implemented in ViperCard!\n * commands like push and pop are simple enough to be\n * implemented right here without much custom parsing.\n * if code here needs special abilities, we'll call\n * internalvpcmessagesdirective, which can do anything.\n */\nexport const VpcStandardLibScript = /* static class */ {\n    handlersImplementedInSoftware: {\n        push: true,\n        pop: true,\n        choose: true,\n        domenu: true,\n        help: true\n    },\n\n    script: `\n-- we could put a default \"on mousedown\" here, but instead we designate\n-- messages like mousedown to become a no-op if they are missing, for perf.\n\n-- MESSAGES THAT THE USER CAN OVERRIDE ---------------------\non choose whichTool\n    vpccalluntrappablechoose whichTool\nend choose\n\non errorDialog pa\n    vpccalluntrappableerrordialog pa\nend errorDialog\n\non help\n    errorDialog \"Help is not supported.\"\nend help\n\non arrowkey direction\n    if direction == \"right\" then\n        go next\n    else if direction == \"left\" then\n        go prev\n    end if\nend arrowkey\n\n-- clicking away from any field should clear selection\non mouseUp\n    if word 2 of (the target) is not \"button\" and word 2 of (the target) is not \"field\" then\n        select empty\n    end if\nend mouseUp\n\non push\n    global internalvpcpushimpl\n    put return & the short id of this cd after internalvpcpushimpl\nend push\n\non pop actuallyMove\n    global internalvpcpushimpl\n    put internalvpcpushimplgetlastonstack() into theId\n    if actuallyMove then\n        go to cd id theId\n    end if\n    return the long id of cd id theId\nend pop\n\nfunction internalvpcpushimplgetlastonstack\n    global internalvpcpushimpl\n    if the number of lines of internalvpcpushimpl <= 1 then\n        return the short id of cd 1\n    end if\n    repeat with x = the number of lines of internalvpcpushimpl down to 1\n        if there is a cd id (line x of internalvpcpushimpl) then\n            put line x of internalvpcpushimpl into ret\n            put line 1 to (x-1) of internalvpcpushimpl into internalvpcpushimpl\n            return ret\n        end if\n    end repeat\n    return the short id of cd 1\nend internalvpcpushimplgetlastonstack\n\n-- HELPERS FOR MOVING, CREATING, DELETING OBJECTS\n-- it's much simpler to send messages in code\n\n-- 'go cd 1' becomes this:\non internalvpcmovecardhelper nextId, shouldSuspendHistory\n    -- cache card id in case another gotocard happens\n    -- order confirmed for all of these, in the product\n    put goCardDestinationFromObjectId(nextId) into nextCard\n    put the short id of this cd into prevCard\n    if prevCard != nextCard and length(nextCard) > 0 then\n        internalvpcmessagesdirective \"closeorexitfield\" prevCard\n        send \"closecard\" to cd id prevCard\n        if the short id of (the owner of cd id prevCard) is not the short id of (the owner of cd id nextCard) then\n            send \"closebackground\" to cd id prevCard\n        end if\n        global internalvpcmovecardimplsuspendhistory\n        if length(shouldSuspendHistory) > 0 then\n            put 1 into internalvpcmovecardimplsuspendhistory\n        end if\n        internalvpcmessagesdirective \"viseffect\" nextCard\n        internalvpcmessagesdirective \"gotocardsendnomessages\" nextCard\n        put 0 into internalvpcmovecardimplsuspendhistory\n        if the short id of (the owner of cd id prevCard) is not the short id of (the owner of cd id nextCard) then\n            send \"openbackground\" to cd id nextCard\n        end if\n        send \"opencard\" to cd id nextCard\n    else if length(nextCard) > 0 then\n        internalvpcmessagesdirective \"viseffect\" nextCard\n    end if\n    if shouldSuspendHistory == \"applyback\" then\n        put \"back\" into vsend\n        internalvpcmessagesdirective \"applybackforth\" vsend\n    else if shouldSuspendHistory == \"applyforth\" then\n        put \"forth\" into vsend\n        internalvpcmessagesdirective \"applybackforth\" vsend\n    end if\n    if length(nextCard) > 0 then\n        return \"\"\n    else\n        return \"No such card\"\n    end if\nend internalvpcmovecardhelper\n\nfunction goCardDestinationFromObjectId nextId\n    if objectById(nextId) == \"\" then\n        -- returns \"\" if the object does not exist\n        return \"\"\n    end if\n    put word 1 of objectById(nextId) into objType\n    if word 2 of objectById(nextId) is \"button\" then\n        errordialog \"Cannot go to a button\"\n    else if word 2 of objectById(nextId) is \"field\" then\n        errordialog \"Cannot go to a field\"\n    else if objType == \"card\" then\n        return nextId\n    else if objType == \"bkgnd\" then\n        if the short id of (the owner of this cd) is nextId then\n            return the short id of this cd\n        else\n            return the short id of cd 1 of bkgnd id nextId\n        end if\n    else if objType == \"stack\" then\n        return the short id of this cd\n    else\n        errordialog \"Cannot go to this type of object\"\n    end if\nend goCardDestinationFromObjectId\n\n-- 'delete cd btn 1' becomes this:\non internalvpcdeletevelhelper internalId, userfacingId\n    if objectById(internalId) == \"\" then\n        errorDialog \"Delete failed, object not found.\"\n    end if\n    -- 1) send messages\n    put word 1 of objectById(internalId) into objType\n    if word 2 of objectById(internalId) is \"button\" then\n        if objType is \"bkgnd\" then\n            send \"deleteButton\" to bkgnd btn id userfacingId\n        else\n            send \"deleteButton\" to cd btn id userfacingId\n        end if\n    else if word 2 of objectById(internalId) is \"field\" then\n        if objType is \"bkgnd\" then\n            send \"deleteField\" to bkgnd fld id userfacingId\n        else\n            send \"deleteField\" to cd fld id userfacingId\n        end if\n    else if objType == \"card\" then\n        if internalId == the short id of this cd then\n            put the short id of this cd into prevCd\n            go next\n            if the short id of this cd is prevCd then\n                errorDialog \"Delete failed, cannot delete this card. Is it the only card in the stack?\"\n            end if\n        end if\n\n        send \"deleteCard\" to cd id internalId\n        if the number of cds in (the owner of cd id internalId) is 1 then\n            send \"deleteBackground\" to cd id internalId\n        end if\n    else if objType = \"bkgnd\" then\n        internalvpcdeletevelhelper_bg internalId\n    else\n        errorDialog \"Cannot delete this type of object\"\n    end if\n\n    -- 2) remove it\n    if objType != \"bkgnd\" then\n        put internalId into sendParam\n        internalvpcmessagesdirective \"removevelwithoutmsg\" sendParam\n        return sendParam\n    end if\nend internalvpcdeletevelhelper\n\n\n\n\n\non internalvpcdeletevelhelper_bg bgId\n    if the short id of (the owner of this cd) is bgId then\n        -- try to find the first card that's not not in the bg and go there\n        put \"\" into found\n        repeat with x = 1 to the number of cards\n            if the short id of (the owner of cd x) is not bgId then\n                put the short id of cd x into found\n                exit repeat\n            end if\n        end repeat\n        if length(found) <= 0 then\n             errorDialog \"Cannot delete this background, is it the only background?\"\n        end if\n        go to card id found\n    end if\n    put \"\" into toDelete\n    repeat with x = 1 to the number of cards in bg id bgId\n        put the short id of cd x of bg id bgId into line x of toDelete\n    end repeat\n    repeat with x = 1 to the number of lines in toDelete\n        delete cd id (line x of toDelete)\n    end repeat\nend internalvpcdeletevelhelper_bg\n\n\n--on internalvpcnewbghelper\n--    put the short id of this cd into prevCard\n--    internalvpcmessagesdirective \"closeorexitfield\" prevCard\n--    send \"closecard\" to cd id prevCard\n--    send \"closebackground\" to cd id prevCard\n--    internalvpcmessagesdirective \"makenewbgsendnomessages\"\n--    put the result into nextCard\n--    internalvpcmessagesdirective \"gotocardsendnomessages\" nextCard\n--    send \"newbackground\" to cd id nextCard\n--    send \"newcard\" to cd id nextCard\n--    send \"openbackground\" to cd id nextCard\n--    send \"opencard\" to cd id nextCard\n--end internalvpcnewbghelper\n\n\n       `.replace(/\\r\\n/g, '\\n')\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcTables.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './vpcVal';\n/* auto */ import { checkThrow } from './vpcEnums';\n/* auto */ import { MapKeyToObjectCanSet, Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * provide ViperCard with a list/hashmap structure,\n * called a \"table\" because Lua's are called tables.\n */\nexport class VpcTable {\n    data: MapKeyToObjectExposed<VpcVal>;\n    numericKeys = true;\n\n    set(place: VpcVal, v: VpcVal) {\n        checkThrow(place && place.readAsString(), 'WT|not a valid place');\n        let s = place.readAsString();\n        let parsed = Util512.parseIntStrict(s);\n        if (parsed === undefined) {\n            this.numericKeys = false;\n            this.data.set(place.readAsString(), v);\n        } else {\n            /* we don't have sparse arrays,\n            set values for each place.\n            this makes 'put after' work better */\n            for (let i = 0; i < parsed; i++) {\n                if (!this.data.exists(i.toString())) {\n                    this.data.set(i.toString(), VpcValS(''));\n                }\n            }\n\n            this.data.data()[parsed] = v;\n        }\n    }\n\n    get(place: VpcVal) {\n        let got = this.data.getOrFallback(place.readAsString(), VpcValS(''));\n        return got;\n    }\n\n    putAfterAll(v: VpcVal) {\n        checkThrow(this.numericKeys, 'WS|after only works if there are no string keys in the table');\n        let len = this.data.data().length;\n        this.data.set(len.toString(), v);\n    }\n\n    putAfterPlace(place: VpcVal, v: VpcVal) {\n        checkThrow(this.numericKeys, 'WR|after only works if there are no string keys in the table');\n        let s = place.readAsString();\n        let parsed = Util512.parseIntStrict(s);\n        checkThrow(parsed !== undefined, 'WQ|must be a number');\n    }\n}\n\nexport class VpcTables {\n    data: MapKeyToObjectCanSet<VpcVal>;\n}\n\nclass MapKeyToObjectExposed<T> extends MapKeyToObjectCanSet<T> {\n    data() {\n        return this.objects;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcUtils.ts",
    "content": "\n/* auto */ import { VpcBuiltinMsg } from './vpcEnums';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertEq, fitIntoInclusive, getEnumToStrOrFallback, slength } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * container that can be read from.\n * for example, a field is a readable container because you can say\n * put cd fld \"fld1\" into x\n */\nexport interface ReadableContainer {\n    isDefined(): boolean;\n    getRawString(): string;\n    len(): number;\n}\n\n/**\n * container that you can write to.\n * for example, a field is a writable container because you can say\n * put \"abc\" into cd fld \"fld1\"\n */\nexport interface WritableContainer extends ReadableContainer {\n    setAll(newText: string): void;\n    splice(insertion: number, lenToDelete: number, newText: string): void;\n    replaceAll(search: string, replaceWith: string): void;\n}\n\n/**\n * a message sent to a script\n * includes both built-in messages \"mouseUp\" and custom messages \"myHandler\"\n */\nexport class VpcScriptMessage {\n    clickLoc: [number, number] = [0, 0];\n    lastSeenClickId = 0;\n    keyMods: O<ModifierKeys>;\n    keyChar: O<string>;\n    keyRepeated: O<boolean>;\n    msg: VpcBuiltinMsg;\n    msgName: string;\n    cardWhenFired: O<string>;\n    causedByUserAction = false;\n    constructor(public targetId: string, handler: VpcBuiltinMsg, msgName?: string) {\n        /* parse the message name to see if it is a built-in like mouseUp */\n        if (msgName) {\n            assertEq(VpcBuiltinMsg.__Custom, handler, '4j|');\n            this.msg = handler;\n            this.msgName = msgName;\n        } else {\n            this.msg = handler;\n            this.msgName = getEnumToStrOrFallback(VpcBuiltinMsg, handler, '');\n            assertTrue(slength(this.msgName), '4i|got', this.msgName);\n        }\n    }\n}\n\n/**\n * for running code in the messagebox\n */\nexport class VpcScriptMessageMsgBoxCode extends VpcScriptMessage {\n    returnToMsgBox = false;\n    msgBoxCodeBody = '';\n}\n\n/**\n * a provider of unique numeric ids\n */\nexport interface CountNumericId {\n    next(): number;\n    nextAsStr(): string;\n}\n\n/**\n * a provider of unique numeric ids, counts upwards 1 at a time\n */\nexport class CountNumericIdNormal implements CountNumericId {\n    constructor(protected counter = 1000) {}\n    next() {\n        let ret = this.counter;\n        this.counter += 1;\n        return ret;\n    }\n\n    nextAsStr() {\n        return this.next().toString();\n    }\n\n    setCounter(n: number) {\n        if (n >= this.counter) {\n            this.counter = n;\n        } else {\n            assertWarn(false, 'KC|tried to set counter lower', n);\n        }\n    }\n}\n\n/**\n * code limits\n * you shouldn't be able to create a stack that causes a\n * huge amount of memory to be allocated.\n */\nexport enum CodeLimits {\n    MaxCustomFnCallsAllowedInLine = 100,\n    MaxTokensInLine = 512,\n    MaxLinesInScript = 32 * 1024,\n    MaxCodeFrames = 1000,\n    CacheThisManyParsedLines = 10 * 1000,\n    CacheThisManyScripts = 20,\n    MaxLocalVars = 1024,\n    MaxGlobalVars = 1024,\n    MaxStringLength = 64 * 1024,\n    MaxVelChildren = 256,\n    MaxObjectsInMsgChain = 128,\n    LimitChevErrStringLen = 128\n}\n\n/**\n * the user can log to the message box\n */\nexport class LogToReplMsgBox {\n    static redirectThisVariableToMsgBox = 'vpc__internal__msgbox';\n}\n\n/**\n * record what you submit to the repl, for history\n */\nexport class RememberHistory {\n    pointer = 0;\n    keepBeforeEnd = false;\n    list: string[] = [];\n\n    /**\n     * get the history at the current point\n     */\n    protected getAt() {\n        this.pointer = fitIntoInclusive(this.pointer, 0, this.list.length);\n        if (this.pointer >= this.list.length) {\n            return undefined;\n        } else {\n            return this.list[this.pointer];\n        }\n    }\n\n    /**\n     * user pressed up, like pressing arrow key up in bash\n     */\n    walkPrevious(fallback: () => string) {\n        this.pointer -= 1;\n        let ret = this.getAt();\n        return ret ?? fallback();\n    }\n\n    /**\n     * user pressed down, like pressing arrow key up in bash\n     */\n    walkNext(fallback: () => string) {\n        this.pointer += 1;\n        let ret = this.getAt();\n        return ret ?? fallback();\n    }\n\n    /**\n     * you can reject candidates\n     */\n    walkPreviousWhileAcceptible(fallback: () => string, isAccepted: (s: string) => boolean) {\n        while (true) {\n            let cand = this.walkPrevious(fallback);\n            if (isAccepted(cand)) {\n                return cand;\n            } else if (this.pointer <= 0) {\n                return fallback();\n            }\n        }\n    }\n\n    /**\n     * you can reject candidates\n     */\n    walkNextWhileAcceptible(fallback: () => string, isAccepted: (s: string) => boolean) {\n        while (true) {\n            let cand = this.walkNext(fallback);\n            if (isAccepted(cand)) {\n                return cand;\n            } else if (this.pointer >= this.list.length - 1) {\n                return fallback();\n            }\n        }\n    }\n\n    /**\n     * add to the list\n     */\n    append(s: string) {\n        this.list.push(s);\n        if (this.keepBeforeEnd) {\n            this.pointer = this.list.length - 1;\n        } else {\n            this.pointer = this.list.length;\n        }\n    }\n\n    /**\n     * pop from the list\n     */\n    pop(fallback: () => string): string {\n        if (!this.list.length) {\n            return fallback();\n        } else {\n            return this.list.pop() ?? fallback();\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcVal.ts",
    "content": "\n/* auto */ import { CodeLimits } from './vpcUtils';\n/* auto */ import { OrdinalOrPosition, checkThrow } from './vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * for the interpreter, when interpreting a script,\n * an \"intermedVal\" is the result of part of an expression\n */\nexport class VpcIntermedValBase {}\n\n/**\n * this token allows access for directly creating a VpcVal,\n * and since we haven't made this token public, we've\n * guided other code towards using VpcValN or VpcValS instead.\n */\nlet allowUsingVpcValConstructor = new Object();\n\n/**\n * VpcVal, a ViperCard script value\n * immutable\n * like in the original product, can hold a string, a number, or a boolean\n */\nexport class VpcVal extends VpcIntermedValBase {\n    static readonly epsilon = 0.000001;\n    protected readonly v: string;\n\n    /**\n     * construct a VpcVal.\n     * the required \"token\" prevents code outside this module from calling the constructor\n     */\n    constructor(v: string, token: unknown) {\n        super();\n\n        assertTrue(token === allowUsingVpcValConstructor, \"66|please don't use the VpcVal constructor directly\");\n        assertTrue(v !== null && v !== undefined, '65|tried to set string as null or undefined');\n        checkThrow(v.length < CodeLimits.MaxStringLength, '8w|exceeded max string length');\n        this.v = v;\n    }\n\n    /**\n     * like in the original product, booleans are strictly \"true\" or \"false\"\n     * you can't say \"if 0 then\" or \"if \"\" then\"\n     * interestingly, \"true  \" with trailing whitespace is allowed, though.\n     */\n    isItAStrictBooleanImpl(output: [boolean, any]) {\n        output[0] = false;\n        output[1] = undefined;\n        if (this.v.match(/^true\\s*$/)) {\n            output[0] = true;\n            output[1] = true;\n        } else if (this.v.match(/^false\\s*$/)) {\n            output[0] = true;\n            output[1] = false;\n        }\n    }\n\n    /**\n     * get value as boolean, or throw if not a boolean\n     */\n    readAsStrictBoolean(tmpArr?: [boolean, any]): boolean {\n        if (!tmpArr) {\n            tmpArr = [false, undefined];\n        }\n\n        this.isItAStrictBooleanImpl(tmpArr);\n        if (tmpArr[0]) {\n            return tmpArr[1];\n        } else {\n            checkThrow(false, `64|expected true or false here, got \"${this.v}\"`);\n        }\n    }\n\n    /**\n     * is value an integer\n     */\n    isItInteger() {\n        let ar: [boolean, any] = [false, undefined];\n        this.isItAStrictIntegerImpl(ar);\n        return ar[0];\n    }\n\n    /**\n     * is value a number (possibly floating point)\n     */\n    isItNumeric() {\n        let ar: [boolean, any] = [false, undefined];\n        this.isItNumericImpl(ar);\n        return ar[0];\n    }\n\n    /**\n     * parse scientific notation into a number\n     * note that scientific notation is allowed only for\n     *      numeric literals, when you're first setting it.\n     * put 2.34e6 into x --valid, seen as number\n     * put x * 2 into y --valid\n     *\n     * put \"2.34e6\" into x --seen as a string\n     * put x * 2 into y --runtime error, can't multiply\n     */\n    static readScientificNotation(s: string) {\n        if (s.match(/^\\s*-?[0-9]+(\\.[0-9]*)?(e[-+]?[0-9]+)?\\s*$/)) {\n            let f = parseFloat(s);\n            if (isFinite(f) && f < 1e18 && f > -1e18) {\n                return VpcValN(f);\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * read as scientific notation, or throw exception\n     */\n    static getScientificNotation(s: string) {\n        return ensureDefined(\n            VpcVal.readScientificNotation(s),\n            `63|expected a number/scientific notation here, or > 1e18, got \"${s}\"`\n        );\n    }\n\n    /**\n     * is it numeric - can we treat this string as a number?\n     * original product accepts whitespace, even newlines, before/after the number\n     * confirmed that original product accepts \"3.\" as same as \"3.0\"\n     */\n    isItNumericImpl(output: [boolean, any]) {\n        output[0] = false;\n        output[1] = undefined;\n        if (this.v && this.v.match(/^\\s*-?[0-9]+(\\.[0-9]*)?\\s*$/)) {\n            let ret = parseFloat(this.v);\n            if (isFinite(ret) && ret < 1e18 && ret > -1e18) {\n                output[0] = true;\n                output[1] = ret;\n            }\n        }\n    }\n\n    /**\n     * reads as a number.\n     * you can provide the temporary array so that it doesn't have to be allocd\n     */\n    readAsStrictNumeric(tmpArr?: [boolean, any]): number {\n        if (!tmpArr) {\n            tmpArr = [false, undefined];\n        }\n\n        this.isItNumericImpl(tmpArr);\n        if (tmpArr[0]) {\n            return tmpArr[1];\n        } else {\n            checkThrow(false, `62|expected a number here, got \"${this.v}\"`);\n        }\n    }\n\n    /**\n     * is the value in the string an integer?\n     *\n     * note: if the value is greater than max 32bit signed integer,\n     * we'll treat it as a valid \"number\" but not as a valid \"integer\"\n     * i.e. if x is 2^40 you can multiply x by 2 but can't get the xth line of a string.\n     * we're being a bit cautious, the true dangerous cutoff is Number.LARGEST_SAFE_INT.\n     */\n    isItAStrictIntegerImpl(output: [boolean, any]) {\n        this.isItNumericImpl(output);\n        let rounded = Math.round(output[1]);\n        if (output[0] && (output[1] > maxInt32 || output[1] < minInt32)) {\n            output[0] = false;\n            output[1] = undefined;\n        } else if (output[0] && Math.abs(output[1] - rounded) < VpcVal.epsilon) {\n            output[0] = true;\n            output[1] = rounded;\n        } else {\n            output[0] = false;\n            output[1] = undefined;\n        }\n    }\n\n    /**\n     * read as an integer, or throw exception\n     */\n    readAsStrictInteger(tmpArr?: [boolean, any]): number {\n        if (!tmpArr) {\n            tmpArr = [false, undefined];\n        }\n\n        this.isItAStrictIntegerImpl(tmpArr);\n        if (tmpArr[0]) {\n            return tmpArr[1];\n        } else {\n            checkThrow(false, `61|expected an integer here, got \"${this.v}\"`);\n        }\n    }\n\n    /**\n     * is it a comma-delimited list of only integers?\n     */\n    isIntegerList(requireLength = -1): O<number[]> {\n        let found = this.isItNumberList(requireLength);\n        let tmp: [boolean, any] = [false, 0];\n        if (found) {\n            for (let i = 0; i < found.length; i++) {\n                let v = VpcValN(found[i]);\n                v.isItAStrictIntegerImpl(tmp);\n                if (tmp[0]) {\n                    /* make sure to get the rounded form */\n                    found[i] = tmp[1];\n                } else {\n                    return undefined;\n                }\n            }\n        }\n\n        /* we've already checked for required length */\n        return found;\n    }\n\n    /**\n     * is it a comma-delimited list of only numbers?\n     */\n    isItNumberList(requireLength = -1): O<number[]> {\n        let ret: number[] = [];\n        let tmp: [boolean, any] = [false, 0];\n        /* prob faster than calling trim on each */\n        let spl = this.v.split(/\\s*,\\s*/);\n        if (!this.v || spl.length <= 1) {\n            /* don't treat 123 as a list of length 1 */\n            return undefined;\n        }\n\n        for (let s of spl) {\n            if (!s.length) {\n                /* following what the emulator seems to do: treat an empty item as 0.*/\n                ret.push(0);\n            } else {\n                let v = VpcValS(s);\n                v.isItNumericImpl(tmp);\n                if (tmp[0]) {\n                    ret.push(tmp[1]);\n                } else {\n                    return undefined;\n                }\n            }\n        }\n\n        if (requireLength !== -1 && ret.length !== requireLength) {\n            return undefined;\n        } else {\n            return ret;\n        }\n    }\n\n    /**\n     * is it a list of coordinates?\n     */\n    readAsIntegerList(requireLength = -1): number[] {\n        let ret = this.isIntegerList(-1 /* don't enforce yet, so we'll get a better error message */);\n        checkThrow(ret, 'T{|Not a list of integers');\n        checkThrow(\n            requireLength === -1 || requireLength === ret.length,\n            `T_|expected ${requireLength} numbers but got ${ret.length}`\n        );\n        return ret;\n    }\n\n    /**\n     * read as a string\n     */\n    readAsString() {\n        if (this.v !== null && this.v !== undefined) {\n            return this.v;\n        } else {\n            checkThrow(false, `9g|value is null, got \"${this.v}\"`);\n        }\n    }\n\n    /**\n     * is emppty\n     */\n    isEmpty() {\n        return this.v.length > 0;\n    }\n\n    static readonly Empty = new VpcVal('', allowUsingVpcValConstructor);\n    static readonly True = new VpcVal('true', allowUsingVpcValConstructor);\n    static readonly False = new VpcVal('false', allowUsingVpcValConstructor);\n    static readonly Zero = new VpcVal('0', allowUsingVpcValConstructor);\n    static readonly One = new VpcVal('1', allowUsingVpcValConstructor);\n}\n\n/**\n * factory for VpcVal, create from a string\n */\nexport function VpcValS(s: string) {\n    return new VpcVal(s, allowUsingVpcValConstructor);\n}\n\n/**\n * factory for VpcVal, create from a number\n */\nexport function VpcValN(f: number) {\n    checkThrow(isFinite(f) && f < 1e18 && f > -1e18, '8v|not a number, or > 1e18');\n    let s = f.toString();\n    if (s.includes('e')) {\n        /* toFixed returns a string representation that does not use exponential notation */\n        return new VpcVal(f.toFixed(20), allowUsingVpcValConstructor);\n    } else {\n        return new VpcVal(s, allowUsingVpcValConstructor);\n    }\n}\n\n/**\n * factory for VpcVal, create from a bool\n */\nexport function VpcValBool(b: O<boolean>) {\n    return b ? VpcVal.True : VpcVal.False;\n}\n\n/* largest positive 32bit signed integer */\nconst maxInt32 = 2147483647;\n\n/* largest negative 32bit signed integer */\nconst minInt32 = -2147483648;\n\n/**\n * map of keys to intermediate values\n */\nexport class IntermedMapOfIntermedVals extends VpcIntermedValBase {\n    vals: { [key: string]: (VpcIntermedValBase | string)[] } = {};\n\n    /**\n     * add a string to the map\n     */\n    addString(key: string, val: string) {\n        if (!this.vals[key]) {\n            this.vals[key] = [val];\n        } else {\n            this.vals[key].push(val);\n        }\n    }\n\n    /**\n     * add a value to the map\n     * same logic as addString, but some JavaScript performance articles\n     * say it is faster to not use the same functions with different data types\n     */\n    addResult(key: string, val: VpcIntermedValBase) {\n        if (!this.vals[key]) {\n            this.vals[key] = [val];\n        } else {\n            this.vals[key].push(val);\n        }\n    }\n\n    /**\n     * rules like HOrdinal are actually an enum, not a string\n     */\n    static getOrdinalOrPosition(v: IntermedMapOfIntermedVals, keyname: string) {\n        return (v.vals[keyname][0] as any) as OrdinalOrPosition;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcValEval.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValBool, VpcValN, VpcValS } from './vpcVal';\n/* auto */ import { VpcOpCtg, checkThrow, checkThrowEq, checkThrowInternal } from './vpcEnums';\n/* auto */ import { bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * used by the interpreter to evaluate operations\n * tested in vpcTestScriptEval\n */\nexport class VpcEvalHelpers {\n    /* re-use temporary arrays instead of re-allocating */\n    tmp1: [boolean, any] = [false, undefined];\n    tmp2: [boolean, any] = [false, undefined];\n\n    /**\n     * for checking the type of a value\n     * e.g. 'if x is a number then'\n     */\n    typeMatches(v: VpcVal, sType: string): VpcVal {\n        let tmp = this.tmp1;\n        if (sType === 'number') {\n            v.isItNumericImpl(tmp);\n            return VpcValBool(tmp[0]);\n        } else if (sType === 'integer') {\n            v.isItAStrictIntegerImpl(tmp);\n            return VpcValBool(tmp[0]);\n        } else if (sType === 'logical') {\n            v.isItAStrictBooleanImpl(tmp);\n            return VpcValBool(tmp[0]);\n        } else {\n            let numExpected: number;\n            if (sType === 'point') {\n                numExpected = 2;\n            } else if (sType === 'rect') {\n                numExpected = 4;\n            } else {\n                checkThrow(\n                    false,\n                    longstr(`5}|expected \"if x is a number\" but got \"if x is a\n                      ${sType}\" needs one of {number|integer|point|rect|logical}`)\n                );\n            }\n\n            return VpcValBool(bool(v.isIntegerList(numExpected)));\n        }\n    }\n\n    /**\n     * evaluate unary operation\n     */\n    evalUnary(a: VpcVal, op: string): VpcVal {\n        if (!a || !(a instanceof VpcVal)) {\n            checkThrowInternal(false, `5||can't compute, not VpcVal. ${a} ${op}`);\n        }\n\n        if (op === 'not') {\n            let v = a.readAsStrictBoolean(this.tmp1);\n            return VpcValBool(!v);\n        } else if (op === '-') {\n            let f = a.readAsStrictNumeric(this.tmp1);\n            return VpcValN(-f);\n        } else if (op === '+') {\n            checkThrow(false, `5{|syntax error, \"+\" in the wrong place. we can't evaluate something like 2*(+3)`);\n        } else {\n            checkThrowInternal(false, `9f|unknown unary operation ${op}`);\n        }\n    }\n\n    /**\n     * evaluate binary operation\n     */\n    evalOp(a: VpcVal, b: VpcVal, opClass: VpcOpCtg, op: string): VpcVal {\n        if (!a || !b || !(a instanceof VpcVal) || !(b instanceof VpcVal)) {\n            checkThrowInternal(false, `5_|can't eval, not VpcVal. ${a} ${b} ${opClass} ${op}`);\n        }\n\n        if (opClass === VpcOpCtg.OpLogicalOrAnd) {\n            return this.evalOpLogicalOrAnd(a, b, op, opClass);\n        } else if (opClass === VpcOpCtg.OpEqualityGreaterLessOrContains && op !== 'contains') {\n            a.isItNumericImpl(this.tmp1);\n            b.isItNumericImpl(this.tmp2);\n            if (this.tmp1[0] && this.tmp2[0]) {\n                return this.evalOpNumericComparison(op, opClass);\n            } else {\n                return this.evalOpStringComparison(a, b, op, opClass);\n            }\n        } else if (opClass === VpcOpCtg.OpStringConcat || opClass === VpcOpCtg.OpStringWithin || op === 'contains') {\n            return this.evalOpStrings(a, b, op, opClass);\n        } else if (opClass === VpcOpCtg.OpPlusMinus || opClass === VpcOpCtg.OpMultDivideExpDivMod) {\n            return this.evalOpMath(a, b, op, opClass);\n        } else {\n            checkThrowInternal(false, `5>|unknown opClass ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * evaluate math (both arguments numeric)\n     */\n    protected evalOpMath(a: VpcVal, b: VpcVal, op: string, opClass: VpcOpCtg) {\n        let av = a.readAsStrictNumeric(this.tmp1);\n        let bv = b.readAsStrictNumeric(this.tmp2);\n        switch (op) {\n            case '+':\n                return VpcValN(av + bv);\n            case '-':\n                return VpcValN(av - bv);\n            case '*':\n                return VpcValN(av * bv);\n            case '/':\n                return VpcValN(av / bv);\n            case '^':\n                return VpcValN(Math.pow(av, bv));\n            case 'mod':\n                return VpcValN(av % bv);\n            case 'div':\n                return VpcValN(Math.trunc(av / bv));\n            default:\n                checkThrowInternal(false, `5?|unknown operator. ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * evaluate string ops (both arguments strings)\n     */\n    protected evalOpStrings(a: VpcVal, b: VpcVal, op: string, opClass: VpcOpCtg) {\n        let av = a.readAsString();\n        let bv = b.readAsString();\n        switch (op) {\n            case '&&':\n                return VpcValS(av + ' ' + bv);\n            case '&':\n                return VpcValS(av + bv);\n            case 'contains':\n                return VpcValBool(av.includes(bv));\n            case 'is within':\n                return VpcValBool(bv.includes(av));\n            default:\n                checkThrowInternal(false, `5@|unknown operator. ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * evaluate string comparison (both arguments strings)\n     */\n    protected evalOpStringComparison(a: VpcVal, b: VpcVal, op: string, opClass: VpcOpCtg) {\n        let av = a.readAsString();\n        let bv = b.readAsString();\n        switch (op) {\n            case '>':\n                return VpcValBool(av > bv);\n            case '>=':\n                return VpcValBool(av >= bv);\n            case '<':\n                return VpcValBool(av < bv);\n            case '<=':\n                return VpcValBool(av <= bv);\n            case 'is':\n            /* falls through */\n            case '==':\n            /* falls through */\n            case '=':\n                /* string equality, no leniency for whitespace */\n                return VpcValBool(av === bv);\n            case 'is not':\n            /* falls through */\n            case '<>':\n            /* falls through */\n            case '!=':\n                return VpcValBool(av !== bv);\n            default:\n                checkThrowInternal(false, `5[|unknown operator. ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * evaluate numeric comparison\n     */\n    protected evalOpNumericComparison(op: string, opClass: VpcOpCtg) {\n        let av = this.tmp1[1];\n        let bv = this.tmp2[1];\n        switch (op) {\n            case '>':\n                return VpcValBool(av > bv);\n            case '>=':\n                return VpcValBool(av >= bv);\n            case '<':\n                return VpcValBool(av < bv);\n            case '<=':\n                return VpcValBool(av <= bv);\n            case 'is':\n            /* falls through */\n            case '==':\n            /* falls through */\n            case '=':\n                /* confirmed in emulator -- very close numbers compare equal */\n                return VpcValBool(Math.abs(av - bv) < VpcVal.epsilon);\n            case 'is not':\n            /* falls through */\n            case '<>':\n            /* falls through */\n            case '!=':\n                return VpcValBool(Math.abs(av - bv) >= VpcVal.epsilon);\n            default:\n                checkThrowInternal(false, `5]|unknown operator. ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * evaluate logical\n     */\n    protected evalOpLogicalOrAnd(a: VpcVal, b: VpcVal, op: string, opClass: VpcOpCtg) {\n        let av = a.readAsStrictBoolean(this.tmp1);\n        let bv = b.readAsStrictBoolean(this.tmp2);\n        switch (op) {\n            case 'or':\n                return VpcValBool(av || /* bool */ bv);\n            case 'and':\n                return VpcValBool(av && bv);\n            default:\n                checkThrowInternal(false, `5^|unknown operator. ${opClass} ${op}`);\n        }\n    }\n\n    /**\n     * get list of numbers... sometimes from a string, sometimes from args\n     * e.g. put sum(1,2,3) into x\n     * and put sum(\"1,2,3\") into x\n     * should do the same thing.\n     */\n    numberListFromArgsGiven(fnname: string, vAr: VpcVal[], sep: string): number[] {\n        checkThrow(vAr.length > 0, `T}|Wrong number of arguments given to ${fnname}, need at least 1`);\n        checkThrowEq(1, sep.length, `8q|numberListFromArgsGiven`);\n        if (vAr.length === 1 && !vAr[0].isItNumeric()) {\n            /* first, a trailing comma is removed if present.\n            seems to only happen for numeric variadic functions.\n            for example, average(\"1,2,9\") is the same as average(\"1,2,9,\")\n            but in other contexts a trailing comma is treated as an item with val=0 */\n\n            let s = vAr[0].readAsString();\n            if (s.endsWith(sep)) {\n                s = s.substr(0, s.length - 1);\n            }\n\n            let found = VpcValS(s).isItNumberList();\n            checkThrow(found, `T||Wrong arguments given to ${fnname}, wanted numbers`);\n            checkThrow(found.length >= 1, `8r|Wrong arguments given to ${fnname}, wanted at least one number`);\n            return found;\n        } else {\n            return vAr.map(v => v.readAsStrictNumeric());\n        }\n    }\n\n    /**\n     * from \"a|b|c\" to \"a\"&cr&\"b\"&cr&\"c\"\n     */\n    static escapeWithinString(s: string, target = new RegExp(/\\|/g), replacement = 'cr') {\n        assertWarn(s.startsWith('\"'), 'WV|');\n        assertWarn(s.endsWith('\"'), 'WU|');\n        let between = s.substring(1, s.length - 1);\n        between = between.replace(target, `\"&${replacement}&\"`);\n        return `\"${between}\"`;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpc/vpcutils/vpcVarCollection.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './vpcVal';\n/* auto */ import { checkThrow, checkThrowInternal } from './vpcEnums';\n/* auto */ import { MapKeyToObjectCanSet, Util512 } from './../../ui512/utils/util512';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a collection of variables\n */\nexport class VarCollection extends MapKeyToObjectCanSet<VpcVal> {\n    protected length = 0;\n    protected readonly limitReason: string;\n    constructor(protected readonly limit: number, protected readonly nameOfCollection: string) {\n        super();\n        this.limitReason = `exceeded max ${nameOfCollection} vars ${limit}`;\n    }\n\n    /**\n     * assign a value to the variable\n     */\n    set(key: string, v: VpcVal) {\n        if (this.objects[key] === undefined) {\n            this.length += 1;\n            checkThrow(this.length < this.limit, this.limitReason, '8u|');\n        }\n\n        super.set(key, v);\n    }\n\n    /**\n     * add a new value to the collection\n     */\n    add(key: string, v: VpcVal) {\n        if (this.objects[key] === undefined) {\n            this.length += 1;\n            checkThrow(this.length < this.limit, this.limitReason, '8t|');\n        }\n\n        super.add(key, v);\n    }\n}\n\n/**\n * built-in VPC constants\n */\nexport class VariableCollectionConstants extends VarCollection {\n    constructor() {\n        super(256, 'constants');\n        this.add('one', VpcValS('1'));\n        this.add('two', VpcValS('2'));\n        this.add('three', VpcValS('3'));\n        this.add('four', VpcValS('4'));\n        this.add('five', VpcValS('5'));\n        this.add('six', VpcValS('6'));\n        this.add('seven', VpcValS('7'));\n        this.add('eight', VpcValS('8'));\n        this.add('nine', VpcValS('9'));\n        this.add('ten', VpcValS('10'));\n        this.add('colon', VpcValS(':'));\n        this.add('comma', VpcValS(','));\n        this.add('empty', VpcValS(''));\n        this.add('true', VpcValS('true'));\n        this.add('false', VpcValS('false'));\n        this.add('up', VpcValS('up'));\n        this.add('down', VpcValS('down'));\n        this.add('left', VpcValS('left'));\n        this.add('right', VpcValS('right'));\n        this.add('pi', VpcValS('3.14159265358979323846'));\n        this.add('quote', VpcValS('\"'));\n        this.add('space', VpcValS(' '));\n        this.add('tab', VpcValS('\\t'));\n        this.add('newline', VpcValS('\\n'));\n        this.add('return', VpcValS('\\n'));\n        this.add('cr', VpcValS('\\n'));\n        this.add('formfeed', VpcValS('\\x0C'));\n        this.add('linefeed', VpcValS('\\n'));\n\n        /**\n         * in the original product you can say\n         * 'set the style of cd btn 1 to roundrect'\n         * and it works, even though roundrect isn't\n         * a constant. it's because unset variables\n         * are considered to contain their names.\n         * Should I add preparse in 'set' to\n         * only treat these as constants in that context?\n         * no, because for compatibility, code like\n         * 'if the style of cd btn 1 is roundrect' should\n         * still be valid.\n         */\n\n        /* text style */\n        this.add('plain', VpcValS('plain'));\n        this.add('bold', VpcValS('bold'));\n        this.add('italic', VpcValS('italic'));\n        this.add('underline', VpcValS('underline'));\n        this.add('outline', VpcValS('outline'));\n        this.add('shadow', VpcValS('shadow'));\n        this.add('condense', VpcValS('condense'));\n        this.add('extend', VpcValS('extend'));\n        this.add('grayed', VpcValS('grayed'));\n\n        /* button style */\n        this.add('transparent', VpcValS('transparent'));\n        this.add('rect', VpcValS('rect'));\n        this.add('opaque', VpcValS('opaque'));\n        this.add('roundrect', VpcValS('roundrect'));\n        this.add('standard', VpcValS('standard'));\n        this.add('default', VpcValS('default'));\n        this.add('osboxmodal', VpcValS('osboxmodal'));\n        this.add('checkbox', VpcValS('checkbox'));\n        this.add('radio', VpcValS('radio'));\n        this.add('rectangle', VpcValS('rectangle'));\n\n        /* textalign */\n        this.add('center', VpcValS('center'));\n        this.add('centre', VpcValS('center'));\n\n        /* field style */\n        this.add('scrolling', VpcValS('scrolling'));\n\n        Util512.freezeRecurse(this);\n    }\n\n    set(varName: string, val: VpcVal) {\n        checkThrowInternal(false, \"5~|we don't support creating a new constant \" + varName);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcInterfaceImpl.ts",
    "content": "\n/* auto */ import { UndoableActionCreateVel } from './../state/vpcUndo';\n/* auto */ import { VpcState } from './../state/vpcState';\n/* auto */ import { VpcExecTop } from './../../vpc/codeexec/vpcScriptExecTop';\n/* auto */ import { VpcExecFrameStack } from './../../vpc/codeexec/vpcScriptExecFrameStack';\n/* auto */ import { VpcExecFrame } from './../../vpc/codeexec/vpcScriptExecFrame';\n/* auto */ import { VpcPresenterEvents } from './../presentation/vpcPresenterEvents';\n/* auto */ import { VpcPresenter } from './../presentation/vpcPresenter';\n/* auto */ import { TypeOfUndoAction, VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcTool, checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { DialogDocsType, VpcNonModalDocViewer } from './../nonmodaldialogs/vpcDocViewer';\n/* auto */ import { OutsideWorldReadWrite } from './../../vpc/vel/velOutsideInterfaces';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { SetToInvalidObjectAtEndOfExecution } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { arLast } from './../../ui512/utils/util512';\n/* auto */ import { EventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512PaintDispatch } from './../../ui512/draw/ui512DrawPaintDispatch';\n/* auto */ import { UI512CompBase } from './../../ui512/composites/ui512Composites';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * fulfill the VpcStateInterface interface\n */\nexport class VpcStateInterfaceImpl implements VpcStateInterface {\n    protected vcstate: VpcState;\n    protected pr: VpcPresenter;\n    init(vcstate: VpcState, pr: VpcPresenter) {\n        this.vcstate = vcstate;\n        this.pr = pr;\n    }\n\n    /**\n     * get a string runtime (not-persisted) option\n     */\n    getOptionS(prop: string) {\n        if (this.vcstate.runtime.opts.isARuntimeOpt[prop]) {\n            return this.vcstate.runtime.opts.getS(prop);\n        } else {\n            return this.vcstate.model.productOpts.getS(prop);\n        }\n    }\n\n    /**\n     * get a numeric runtime (not-persisted) option\n     */\n    getOptionN(prop: string) {\n        if (this.vcstate.runtime.opts.isARuntimeOpt[prop]) {\n            return this.vcstate.runtime.opts.getN(prop);\n        } else {\n            return this.vcstate.model.productOpts.getN(prop);\n        }\n    }\n\n    /**\n     * get a boolean runtime (not-persisted) option\n     */\n    getOptionB(prop: string) {\n        if (this.vcstate.runtime.opts.isARuntimeOpt[prop]) {\n            return this.vcstate.runtime.opts.getB(prop);\n        } else {\n            return this.vcstate.model.productOpts.getB(prop);\n        }\n    }\n\n    /**\n     * set a boolean runtime (not-persisted) option\n     */\n    setOption<T extends ElementObserverVal>(prop: string, newVal: T) {\n        if (this.vcstate.runtime.opts.isARuntimeOpt[prop]) {\n            return this.vcstate.runtime.opts.set(prop, newVal);\n        } else {\n            return this.vcstate.model.productOpts.setProductOpt(prop, newVal);\n        }\n    }\n\n    /**\n     * perform undo\n     */\n    performUndo(): boolean {\n        return this.vcstate.undoManager.performUndo(this);\n    }\n\n    /**\n     * perform redo\n     */\n    performRedo(): boolean {\n        return this.vcstate.undoManager.performRedo(this);\n    }\n\n    /**\n     * get state id, for undo/redo and seeing if a stack is dirty/needs to be saved\n     */\n    getCurrentStateId(): string {\n        return this.vcstate && this.vcstate.undoManager && this.vcstate.undoManager.getCurrentStateId();\n    }\n\n    /**\n     * get current execution context, or undefined if script not running\n     */\n    findExecFrameStack(): [O<VpcExecFrameStack>, O<VpcExecFrame>] {\n        let frStack = this.vcstate.runtime.codeExec.workQueue[0];\n        if (frStack) {\n            return [frStack, arLast(frStack.stack)];\n        } else {\n            return [undefined, undefined];\n        }\n    }\n\n    /**\n     * get vel model structure\n     */\n    getModel(): VpcModelTop {\n        return this.vcstate.model;\n    }\n\n    /**\n     * is code currently running\n     */\n    isCodeRunning(): boolean {\n        return this.vcstate.runtime.codeExec.isCodeRunning();\n    }\n\n    /**\n     * re-add a vel to the model\n     */\n    rawRevive(readded: VpcElBase) {\n        checkThrow(!this.getCodeExec().isCodeRunning(), \"8#|currently can't add or remove an element while code is running\");\n\n        this.causeFullRedraw();\n        readded.observer = this.vcstate.runtime.useThisObserverForVpcEls;\n        this.getModel().addIdToMapOfElements(readded);\n    }\n\n    /**\n     * perform a changeSeenCreationDeletion\n     */\n    doChangeSeenCreationDeletion(action: UndoableActionCreateVel): void {\n        this.vcstate.undoManager.changeSeenCreationDeletion(action);\n    }\n\n    /**\n     * don't record changes made for undo, and assert that no changes were made\n     */\n    doWithoutAbilityToUndoExpectingNoChanges(fn: () => void) {\n        this.vcstate.undoManager.doWithoutAbilityToUndoExpectingNoChanges(fn);\n    }\n\n    /**\n     * don't record changes made for undo\n     */\n    doWithoutAbilityToUndo(fn: () => void) {\n        this.vcstate.undoManager.doWithoutAbilityToUndo(fn);\n    }\n\n    /**\n     * record changes made for undo\n     */\n    undoableAction(fn: () => void, typ: O<TypeOfUndoAction>) {\n        this.vcstate.undoManager.undoableAction(fn, typ ?? TypeOfUndoAction.StartNewAction);\n    }\n\n    /**\n     * are we 'back in time' looking at a previous state?\n     */\n    isCurrentlyUndoing() {\n        return this.vcstate.undoManager.isCurrentlyUndoing();\n    }\n\n    /**\n     * schedule event to be sent\n     */\n    scheduleScriptEventSend(d: EventDetails) {\n        return VpcPresenterEvents.scheduleScriptMsg(this.pr, this, d);\n    }\n\n    /**\n     * get the UI512 app for the Presenter\n     */\n    UI512App() {\n        return this.pr.app;\n    }\n\n    /**\n     * get the Presenter\n     */\n    getPresenter() {\n        return this.pr;\n    }\n\n    /**\n     * a way to call a function asynchronously and get the error handling and typical callstack\n     * the function will be called soon via onIdle\n     */\n    placeCallbackInQueue(cb: () => void) {\n        return this.pr.placeCallbackInQueue(cb);\n    }\n\n    /**\n     * get bounds of the UI512Presenter\n     */\n    bounds() {\n        return this.pr.bounds;\n    }\n\n    /**\n     * get user-bounds of the UI512Presenter\n     */\n    userBounds() {\n        return this.pr.userBounds;\n    }\n\n    /**\n     * get current card number\n     */\n    getCurrentCardNum() {\n        return this.pr.getCurrentCardNum();\n    }\n\n    /**\n     * get current card id\n     */\n    getCurrentCardId() {\n        return this.getOptionS('currentCardId');\n    }\n\n    /**\n     * go to a card without sending any closecard or opencard events\n     */\n    setCurCardNoOpenCardEvt(id: string): void {\n        return this.pr.setCurCardNoOpenCardEvt(id);\n    }\n\n    /**\n     * get the current tool\n     */\n    getTool() {\n        return this.pr.getTool();\n    }\n\n    /**\n     * set the current tool\n     */\n    setTool(n: VpcTool) {\n        return this.pr.setTool(n);\n    }\n\n    /**\n     * show a non-modal form, closing any other active form\n     */\n    setNonModalDialog(form: O<UI512CompBase>) {\n        return this.pr.lyrNonModalDlgHolder.setNonModalDialog(form);\n    }\n\n    /**\n     * show a non-modal form, closing any other active form\n     */\n    setNonModalDialogByStr(form: O<string>) {\n        if (form === 'VpcNonModalDocViewerReference') {\n            let dlg = new VpcNonModalDocViewer(this, DialogDocsType.Reference);\n            this.setNonModalDialog(dlg);\n        } else if (!form) {\n            this.setNonModalDialog(undefined);\n        } else {\n            checkThrow(false, 'T~|unknown dialog', form);\n        }\n    }\n\n    /**\n     * show a modal dialog\n     */\n    answerMsgAsync(prompt: string, choice1?: string, choice2?: string, choice3?: string): Promise<number> {\n        return this.pr.answerMsgAsync(prompt, choice1, choice2, choice3);\n    }\n\n    /**\n     * get the currently focused vel\n     */\n    getCurrentFocusVelField() {\n        return this.pr.getSelectedFieldVel();\n    }\n\n    /**\n     * set the currently focused element\n     */\n    setCurrentFocus(s: O<string>) {\n        return this.pr.setCurrentFocus(s);\n    }\n\n    /**\n     * get the currently focused element, either an element of the stack or part of vpc ui\n     */\n    getCurrentFocus() {\n        return this.pr.getCurrentFocus();\n    }\n\n    /**\n     * flush queue of paint actions\n     */\n    commitSimulatedClicks(queue: UI512PaintDispatch[]) {\n        return this.pr.lyrPaintRender.commitSimulatedClicks(queue);\n    }\n\n    /**\n     * perform a menu action.\n     * might not be synchronous; the menu action could show a modal dialog\n     */\n    performMenuAction(s: string) {\n        return this.pr.performMenuAction(s);\n    }\n\n    /**\n     * cause VPC UI to be redrawn\n     */\n    causeUIRedraw() {\n        return this.pr.lyrModelRender.uiRedrawNeeded();\n    }\n\n    /**\n     * cause VPC UI and also every vel to be redrawn\n     */\n    causeFullRedraw() {\n        return this.pr.lyrModelRender.fullRedrawNeeded();\n    }\n\n    /**\n     * get top code execution object\n     */\n    getCodeExec(): VpcExecTop {\n        return this.vcstate.runtime.codeExec;\n    }\n\n    /**\n     * get \"outside world\" interface\n     */\n    getOutside(): OutsideWorldReadWrite {\n        return this.vcstate.runtime.outside;\n    }\n\n    /**\n     * append text to the message box\n     * ignored if the message box is not currently open\n     */\n    writeToReplMessageBox(s: string, returnFocus: boolean): void {\n        return this.pr.writeToReplMessageBox(s, returnFocus);\n    }\n\n    /**\n     * releases memory by nulling out everything owned by the class\n     */\n    destroy(): void {\n        this.vcstate.model.destroy();\n        this.vcstate.runtime.destroy();\n        this.vcstate.vci = SetToInvalidObjectAtEndOfExecution(this.vcstate.vci);\n        this.vcstate.model = SetToInvalidObjectAtEndOfExecution(this.vcstate.model);\n        this.vcstate.runtime = SetToInvalidObjectAtEndOfExecution(this.vcstate.runtime);\n        this.vcstate.undoManager = SetToInvalidObjectAtEndOfExecution(this.vcstate.undoManager);\n        this.vcstate = SetToInvalidObjectAtEndOfExecution(this.vcstate);\n        this.pr = SetToInvalidObjectAtEndOfExecution(this.pr);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntro.ts",
    "content": "\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPageLoading } from './vpcIntroPageLoading';\n/* auto */ import { IntroPageFirst } from './vpcIntroPageFirst';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { VpcIntroInterface } from './vpcIntroInterface';\n/* auto */ import { getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { Util512, cast } from './../../ui512/utils/util512';\n/* auto */ import { addDefaultListeners } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512CompModalDialog } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { IdleEventDetails, KeyDownEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * presenter for the ViperCard intro screen\n */\nexport class VpcUiIntro extends VpcIntroInterface {\n    /**\n     * initialize UI\n     */\n    init() {\n        super.init();\n        this.bounds = getUI512WindowBounds();\n        this.app = new UI512Application(this.bounds, this);\n        let grp = new UI512ElGroup('grpmain');\n        this.app.addGroup(grp);\n\n        /* draw bg */\n        let fullBg = new UI512ElButton('bg');\n        grp.addElement(this.app, fullBg);\n        fullBg.set('style', UI512BtnStyle.Opaque);\n        fullBg.setDimensions(this.bounds[0], this.bounds[1], this.bounds[2], this.bounds[3]);\n        fullBg.set('autohighlight', false);\n\n        /* draw gray bg */\n        let offsetForBetterPattern = -1;\n        let layoutPatternBg = new GridLayout(\n            offsetForBetterPattern,\n            0,\n            220,\n            512,\n            Util512.range(0, 5) /* cols */,\n            Util512.range(0, 2) /* rows */,\n            -4 /* negative margin so that the tiles overlap */,\n            -4 /* negative margin so that the tiles overlap */\n        );\n\n        layoutPatternBg.createElems(this.app, grp, 'bgpattern', UI512ElButton, (col, row, el) => {\n            el.set('icongroupid', 'logo');\n            el.set('iconnumber', 1);\n            el.set('style', UI512BtnStyle.Transparent);\n            el.set('autohighlight', false);\n        });\n\n        /* start the first page (a ui512composite object) */\n        this.activePage = new IntroPageFirst('introFirstPage', this.bounds);\n        this.activePage.create(this, this.app);\n        this.rebuildFieldScrollbars();\n\n        /* register for events */\n        addDefaultListeners(this.listeners);\n        this.listenEvent(UI512EventType.MouseDown, VpcUiIntro.respondMouseDown);\n        this.listenEvent(UI512EventType.MouseUp, VpcUiIntro.respondMouseUp);\n        this.listenEvent(UI512EventType.MouseMove, VpcUiIntro.respondMouseMove);\n        this.listenEvent(UI512EventType.KeyDown, VpcUiIntro.respondKeyDown);\n        this.listenEvent(UI512EventType.Idle, VpcUiIntro.respondIdle);\n        this.invalidateAll();\n        this.rebuildFieldScrollbars();\n        this.inited = true;\n    }\n\n    /**\n     * back to the first screen\n     */\n    goBackToFirstScreen() {\n        let [x, y] = [this.activePage.x, this.activePage.y];\n        this.activePage.destroy(this, this.app);\n        this.activePage = new IntroPageFirst('introFirstPage', this.bounds, x, y);\n        this.activePage.create(this, this.app);\n    }\n\n    /**\n     * get a modal dialog object\n     */\n    getModal() {\n        return new UI512CompModalDialog('mainModalDlg');\n    }\n\n    /**\n     * route keydown to the current page\n     */\n    static respondKeyDown(pr: VpcUiIntro, d: KeyDownEventDetails) {\n        if (pr.activePage) {\n            pr.activePage.respondKeyDown(pr, d);\n        }\n    }\n\n    /**\n     * route mouseup to the current page\n     */\n    static respondMouseUp(pr: VpcUiIntro, d: MouseUpEventDetails) {\n        if (pr.activePage) {\n            pr.activePage.respondMouseUp(pr, d);\n        }\n\n        if (d.elClick && pr.activePage instanceof IntroPageBase) {\n            if (pr.activePage.children.length) {\n                pr.activePage.respondToBtnClick(pr, pr.activePage, d.elClick);\n            }\n        }\n    }\n\n    /**\n     * create a new project and begin it, leaving the intro\n     */\n    beginNewDocument() {\n        let loader = new VpcIntroProvider('', lng('lngnew stack'), VpcDocumentLocation.NewDoc);\n        this.beginLoadDocument(loader);\n    }\n\n    /**\n     * load a project and begin it, leaving the intro\n     */\n    beginLoadDocument(loader: VpcIntroProvider) {\n        this.provideExitCallbacks(loader);\n        let translatedLoadMessage = lng('lngLoading %docname');\n        translatedLoadMessage = translatedLoadMessage.replace(/%docname/g, loader.docName);\n        let [x, y] = [this.activePage.x, this.activePage.y];\n        this.activePage.destroy(this, this.app);\n        this.activePage = new IntroPageLoading('introWaitWhileLoadingPage', this.bounds, x, y, loader, translatedLoadMessage);\n\n        this.activePage.create(this, this.app);\n        this.rebuildFieldScrollbars();\n        cast(IntroPageLoading, this.activePage).go(this);\n    }\n\n    /**\n     * provide callbacks to the ViperCard presenter, so that it can return here\n     */\n    protected provideExitCallbacks(loader: VpcIntroProvider) {\n        let exitToMainMenu = () => {\n            let pr = new VpcUiIntro();\n            pr.init();\n            getRoot().replaceCurrentPresenter(pr);\n            return pr;\n        };\n\n        loader.cbExitToMainMenu = () => {\n            exitToMainMenu();\n        };\n\n        loader.cbExitToNewDocument = () => {\n            let pr = exitToMainMenu();\n            pr.beginNewDocument();\n        };\n\n        loader.cbExitToOpen = mineOnly => {\n            let pr = exitToMainMenu();\n            if (mineOnly) {\n                IntroPageFirst.goPage(pr, VpcDocumentLocation.ShowLoginForm);\n            } else {\n                IntroPageFirst.onDoOpenstack(pr);\n            }\n        };\n    }\n\n    /**\n     * route mousedown events to the current page\n     */\n    static respondMouseDown(pr: VpcUiIntro, d: MouseDownEventDetails) {\n        if (pr.activePage) {\n            pr.activePage.respondMouseDown(pr, d);\n        }\n    }\n\n    /**\n     * route mousemove events to the current page\n     */\n    static respondMouseMove(pr: VpcUiIntro, d: MouseMoveEventDetails) {\n        if (pr.activePage) {\n            pr.activePage.respondMouseMove(pr, d);\n        }\n    }\n\n    /**\n     * route idle events to the current page\n     */\n    static respondIdle(pr: VpcUiIntro, d: IdleEventDetails) {\n        if (pr.activePage) {\n            pr.activePage.respondIdle(pr, d);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroInterface.ts",
    "content": "\n/* auto */ import { VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512CompModalDialog } from './../../ui512/composites/ui512ModalDialog';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * forward-declare methods on the VpcIntroInterface presenter, solely\n * to break circular dependencies\n */\nexport abstract class VpcIntroInterface extends UI512Presenter {\n    abstract beginLoadDocument(loader: VpcIntroProvider): void;\n    abstract getModal(): UI512CompModalDialog;\n    abstract beginNewDocument(): void;\n    abstract goBackToFirstScreen(): void;\n\n    activePage: IntroPageBase;\n    bounds: number[];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroPageBase.ts",
    "content": "\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, fitIntoInclusive } from './../../ui512/utils/util512';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512PresenterInterface } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { IdleEventDetails, KeyDownEventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { UI512CompBase, WndBorderDecorationConsts } from './../../ui512/composites/ui512Composites';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for intro pages\n * provides layout and 'drag/drop' implementation for the window\n */\nexport abstract class IntroPageBase extends UI512CompBase {\n    protected canDrag = true;\n    protected isDraggingWindow = false;\n    protected fadedWindowDragging: UI512ElButton[] = [];\n    protected dragOffsetX = 0;\n    protected dragOffsetY = 0;\n    protected screenBounds: number[];\n    hasCloseBtn = false;\n    cancelBtnId: O<string>;\n    acceptBtnId: O<string>;\n\n    constructor(compId: string, bounds: number[], x?: number, y?: number) {\n        super(compId);\n\n        /* set dimensions */\n        this.logicalWidth = 512;\n        this.logicalHeight = 342;\n        this.screenBounds = bounds;\n\n        if (x === undefined || y === undefined) {\n            /* center in the window */\n            this.x = bounds[0] + Math.trunc((bounds[2] - this.logicalWidth) / 2);\n            this.y = bounds[1] + Math.trunc((bounds[3] - this.logicalHeight) / 2);\n        } else {\n            /* position where asked */\n            this.x = x;\n            this.y = y;\n        }\n    }\n\n    /**\n     * common layout, low in the z-order (background)\n     */\n    drawCommonFirst(app: UI512Application, grp: UI512ElGroup) {\n        /* draw opaque bg for the page */\n        let bg = this.genBtn(app, grp, 'windowLowestLayer');\n        bg.set('style', UI512BtnStyle.Shadow);\n        bg.set('autohighlight', false);\n        bg.setDimensions(this.x, this.y, this.logicalWidth + 1, this.logicalHeight + 2);\n\n        /* draw header */\n        let headerHeight = this.drawWindowDecoration(app, new WndBorderDecorationConsts(), this.hasCloseBtn);\n        let caption = grp.getEl(this.getElId('caption'));\n        caption.set('labeltext', lng('lngWelcome to ViperCard'));\n\n        /* draw footer; pages can omit by hiding this element */\n        let footerText = this.genChild(app, grp, 'footerText', UI512ElLabel);\n        footerText.set('labeltext', lng('lngby moltenform (Ben Fisher)'));\n        footerText.setDimensions(this.x + 5, this.y + this.logicalHeight - 20, 300, 20);\n        return headerHeight;\n    }\n\n    /**\n     * common layout, high in the z-order (foreground)\n     */\n    drawCommonLast(app: UI512Application, grp: UI512ElGroup) {\n        /* 1 on left side, 1 on right side, 2 on top, 2 on bottom */\n        const howManyFadesNeeded = 6;\n        for (let i of Util512.range(0, howManyFadesNeeded)) {\n            /* outlines of a faded window */\n            this.fadedWindowDragging[i] = this.genBtn(app, grp, `faded${i}`);\n            this.fadedWindowDragging[i].set('style', UI512BtnStyle.Transparent);\n            this.fadedWindowDragging[i].set('icongroupid', 'logo');\n            this.fadedWindowDragging[i].set('iconnumber', 1);\n        }\n\n        this.setFadedDragPositions(this.x, this.y);\n        this.setFadedDragPositionsVisible(false);\n    }\n\n    /**\n     * set visibility of outlines of a faded window\n     */\n    setFadedDragPositionsVisible(v: boolean) {\n        for (let el of this.fadedWindowDragging) {\n            el.set('visible', v);\n        }\n    }\n\n    /**\n     * set position of outlines of a faded window\n     */\n    setFadedDragPositions(x: number, y: number) {\n        /* vertical ones */\n        this.fadedWindowDragging[0].setDimensions(x, y, 1, this.logicalHeight);\n        this.fadedWindowDragging[1].setDimensions(x + this.logicalWidth, y, 1, this.logicalHeight);\n\n        /* horizontal ones */\n        const half = Math.floor(this.logicalWidth / 2);\n        this.fadedWindowDragging[2].setDimensions(x, y, half, 1);\n        this.fadedWindowDragging[3].setDimensions(x + half, y, half, 1);\n        this.fadedWindowDragging[4].setDimensions(x, y + this.logicalHeight, half, 1);\n        this.fadedWindowDragging[5].setDimensions(x + half, y + this.logicalHeight, half, 1);\n    }\n\n    /**\n     * begin dragging if you click on the top of the window\n     */\n    respondMouseDown(pr: UI512Presenter, d: MouseDownEventDetails) {\n        if (d.el && d.el.id === this.getElId('caption') && !this.isDraggingWindow && this.canDrag) {\n            this.isDraggingWindow = true;\n\n            this.setFadedDragPositions(this.x, this.y);\n            this.setFadedDragPositionsVisible(true);\n            this.dragOffsetX = d.mouseX - this.x;\n            this.dragOffsetY = d.mouseY - this.y;\n        }\n    }\n\n    /**\n     * if dragging, move faded window outline\n     */\n    respondMouseMove(pr: UI512Presenter, d: MouseMoveEventDetails) {\n        this.setFadedDragPositions(d.mouseX - this.dragOffsetX, d.mouseY - this.dragOffsetY);\n    }\n\n    /**\n     * if you dragged the window, move the window\n     */\n    respondMouseUp(pr: UI512Presenter, d: MouseUpEventDetails) {\n        if (this.isDraggingWindow) {\n            this.isDraggingWindow = false;\n            this.setFadedDragPositionsVisible(false);\n            let nextX = this.fadedWindowDragging[0].x;\n            let nextY = this.fadedWindowDragging[0].y;\n\n            /* we won't let you drag it all of the way off the screen */\n            nextX = fitIntoInclusive(\n                nextX,\n                this.screenBounds[0],\n                this.screenBounds[0] + this.screenBounds[2] - this.logicalWidth\n            );\n\n            nextY = fitIntoInclusive(nextY, this.screenBounds[1], this.screenBounds[1] + this.screenBounds[3] - 100);\n            this.moveAllTo(nextX, nextY, pr.app);\n        }\n    }\n\n    /**\n     * draw an os-style rounded rectangle button\n     */\n    protected drawBtn(app: UI512Application, grp: UI512ElGroup, n: number, x: number, y: number, w: number, h: number) {\n        let btn = this.genBtn(app, grp, `choicebtn${n}`);\n        let labeltext = n === 0 ? lng('lngOK') : lng('lngCancel');\n        btn.set('style', n === 0 ? UI512BtnStyle.OSDefault : UI512BtnStyle.OSStandard);\n        btn.set('autohighlight', true);\n        btn.set('labeltext', labeltext);\n        btn.setDimensions(x, y, w, h);\n        return btn;\n    }\n\n    /**\n     * respond to key press, can be overridden in child class\n     */\n    respondKeyDown(pr: UI512Presenter, d: KeyDownEventDetails) {\n        let elId: O<string>;\n        if (d.readableShortcut.toLowerCase() === 'enter' || d.readableShortcut.toLowerCase() === 'return') {\n            elId = this.acceptBtnId;\n        } else if (d.readableShortcut.toLowerCase() === 'escape') {\n            elId = this.cancelBtnId;\n        }\n\n        let fnd = pr?.app?.findEl(elId);\n        if (fnd) {\n            fnd.set('highlightactive', true);\n            let fn = () => {\n                if (fnd && this.children.length) {\n                    this.respondToBtnClick(pr, this, fnd);\n                }\n            };\n            Util512Higher.syncToAsyncAfterPause(fn, 200, 'Hit return to click a button', RespondToErr.ConsoleErrOnly);\n        }\n    }\n\n    /**\n     * event called continuously, can be overridden in child class\n     */\n    respondIdle(pr: UI512Presenter, d: IdleEventDetails) {}\n\n    /**\n     * a button was clicked\n     */\n    respondToBtnClick(pr: UI512PresenterInterface, self: O<IntroPageBase>, el: UI512Element) {}\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroPageFirst.ts",
    "content": "\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPagePickFile } from './vpcIntroPagePickFile';\n/* auto */ import { IntroPageOpen } from './vpcIntroPageOpen';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { VpcIntroInterface } from './vpcIntroInterface';\n/* auto */ import { VpcAboutDialog } from './../menu/vpcAboutDialog';\n/* auto */ import { RespondToErr, Util512Higher, getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, slength } from './../../ui512/utils/util512';\n/* auto */ import { IdleEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { GridLayout, UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * first page shown when you open ViperCard\n */\nexport class IntroPageFirst extends IntroPageBase {\n    compositeType = 'IntroPageFirst';\n    static haveCheckedPageURLParams = false;\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        const cellWidth = 66;\n        const cellHeight = 110;\n        const iconW = 24;\n        const iconH = 24;\n        const footerHeight = 45;\n        const numBtns = 4;\n        const btnWidth = 200;\n        const btnHeight = 24;\n        const btnMargin = 22;\n        const increaseHForLargerBtn = 10;\n\n        /* set button positions manually, using an even grid doesn't */\n        /* look right since the default button is slightly taller than the rest. */\n        const btnY = [78, 118, 170, 214];\n\n        /* draw group and window decoration */\n        let grp = app.getGroup(this.grpId);\n        let headerHeight = this.drawCommonFirst(app, grp);\n\n        /* draw background decoration (lots of hands) */\n        this.drawHandCursors(iconW, iconH, cellWidth, cellHeight, app, grp);\n\n        /* compute dimensions for the initial buttons */\n        let ySpacebtns = numBtns * btnHeight + (numBtns - 1) * btnMargin;\n        const spaceY = this.logicalHeight - (headerHeight + footerHeight);\n        const centeredY = this.y + headerHeight + Math.trunc((spaceY - ySpacebtns) / 2);\n        const btnX = this.x + Math.trunc((this.logicalWidth - btnWidth) / 2);\n\n        /* cover up the background and make it white beneath the initial buttons */\n        let opaqueWhiteBehindBtns = this.genBtn(app, grp, 'opaqueWhiteBehindBtns');\n        opaqueWhiteBehindBtns.set('style', UI512BtnStyle.Opaque);\n        opaqueWhiteBehindBtns.set('autohighlight', false);\n        opaqueWhiteBehindBtns.setDimensions(btnX, centeredY, btnWidth, ySpacebtns);\n\n        const btnKeywords = ['openStack', 'showFeatured', 'newStack', 'showAbout'];\n        const btnLabels = ['lngOpen stack...', 'lngFeatured stacks...', 'lngNew stack', 'lngAbout...', ''];\n        let layout = new GridLayout(\n            btnX,\n            centeredY,\n            btnWidth,\n            btnHeight,\n            Util512.range(0, 1) /* cols */,\n            Util512.range(0, numBtns) /* rows */,\n            btnMargin,\n            btnMargin\n        );\n\n        /* create the initial buttons */\n        layout.combinations((n, nCol, nRow, bnds) => {\n            let id = 'choice' + Util512.capitalizeFirst(btnKeywords[nRow]);\n            let el = this.genBtn(app, grp, id);\n            el.setDimensions(bnds[0], this.y + btnY[nRow], bnds[2], bnds[3]);\n            el.set('style', btnKeywords[nRow] === 'showFeatured' ? UI512BtnStyle.OSDefault : UI512BtnStyle.OSStandard);\n            el.set('labeltext', lng(btnLabels[nRow]));\n            if (btnKeywords[nRow] === 'showFeatured') {\n                el.setDimensions(el.x, el.y, el.w, el.h + increaseHForLargerBtn);\n            } else if (btnKeywords[nRow] === 'showAbout') {\n                el.setDimensions(el.x, el.y, el.w, el.h);\n            }\n        });\n\n        this.acceptBtnId = this.getElId('choiceShowFeatured');\n        this.drawCommonLast(app, grp);\n    }\n\n    /**\n     * draw the 'hands' background decoration\n     * draw 2 grids, staggered, like a fleur de lis wallpaper\n     */\n    protected drawHandCursors(\n        iconW: number,\n        iconH: number,\n        cellWidth: number,\n        cellHeight: number,\n        app: UI512Application,\n        grp: UI512ElGroup\n    ) {\n        let cbHands = (a: number, b: number, el: UI512ElButton) => {\n            el.set('icongroupid', 'logo');\n            el.set('iconnumber', 2);\n            el.set('style', UI512BtnStyle.Transparent);\n            el.set('autohighlight', false);\n            this.children.push(el);\n        };\n\n        let pattern = new GridLayout(\n            this.x + 26,\n            this.y + 39,\n            iconW,\n            iconH,\n            Util512.range(0, 7),\n            Util512.range(0, 3),\n            cellWidth - iconW,\n            cellHeight - iconH\n        );\n        pattern.createElems(app, grp, this.getElId('wallpaper1'), UI512ElButton, cbHands);\n        pattern = new GridLayout(\n            this.x + 26 + cellWidth / 2,\n            this.y + 39 + cellHeight / 2,\n            iconW,\n            iconH,\n            Util512.range(0, 7),\n            Util512.range(0, 2),\n            cellWidth - iconW,\n            cellHeight - iconH\n        );\n        pattern.createElems(app, grp, this.getElId('wallpaper2'), UI512ElButton, cbHands);\n    }\n\n    /**\n     * check url if we haven't already\n     *\n     * haveCheckedPageURLParams is a stack, since when you click \"exit to main menu\"\n     * we don't want to run checkPageUrlParams again and accidentally get taken back into the stack.\n     */\n    respondIdle(pr: VpcIntroInterface, d: IdleEventDetails) {\n        if (!IntroPageFirst.haveCheckedPageURLParams) {\n            IntroPageFirst.haveCheckedPageURLParams = true;\n            Util512Higher.syncToAsyncTransition(this.checkPageUrlParams(pr), 'respondIdle', RespondToErr.Alert);\n        }\n\n        super.respondIdle(pr, d);\n    }\n\n    /**\n     * see if the url is taking to us to a stack, and load the stack if so\n     */\n    async checkPageUrlParams(pr: VpcIntroInterface) {\n        let provider = IntroPageFirst.checkPageUrlParamsGetProvider(window.location.href);\n        if (provider) {\n            pr.beginLoadDocument(provider);\n        }\n    }\n\n    static onDoOpenstack(pr: VpcIntroInterface) {\n        if (getVpcSessionTools().enableServerCode) {\n            pr.getModal().standardAnswer(\n                pr,\n                pr.app,\n                'From which location would you like to open?',\n                n => {\n                    if (n === 0) {\n                        IntroPageFirst.goPage(pr, VpcDocumentLocation.ShowLoginForm);\n                    } else if (n === 1) {\n                        IntroPageFirst.goPage(pr, VpcDocumentLocation.FromJsonFile);\n                    }\n                },\n                'Online',\n                'Json file',\n                'Cancel'\n            );\n        } else {\n            IntroPageFirst.goPage(pr, VpcDocumentLocation.FromJsonFile);\n        }\n    }\n\n    /**\n     * respond to button click\n     */\n    respondToBtnClick(pr: VpcIntroInterface, self: IntroPageOpen, el: UI512Element) {\n        if (el.id.endsWith('choiceNewStack')) {\n            pr.beginNewDocument();\n        } else if (el.id.endsWith('choiceShowAbout')) {\n            VpcAboutDialog.show(pr, pr.getModal());\n        } else if (el.id.endsWith('choiceShowFeatured')) {\n            IntroPageFirst.goPage(pr, VpcDocumentLocation.FromStaticDemo);\n        } else if (el.id.endsWith('choiceOpenStack')) {\n            IntroPageFirst.onDoOpenstack(pr);\n        }\n    }\n\n    /**\n     * destroy the active page, and go to another page\n     */\n    static goPage(pr: VpcIntroInterface, openType: VpcDocumentLocation) {\n        let [x, y] = [pr.activePage.x, pr.activePage.y];\n        pr.activePage.destroy(pr, pr.app);\n        pr.activePage = new IntroPageOpen('introOpenPage', pr.bounds, x, y, openType);\n        pr.activePage.create(pr, pr.app);\n\n        if (openType === VpcDocumentLocation.FromJsonFile) {\n            /* user clicked 'open from json' */\n            let [x1, y1] = [pr.activePage.x, pr.activePage.y];\n            pr.activePage.destroy(pr, pr.app);\n            pr.activePage = new IntroPagePickFile('IntroPagePickFile', pr.bounds, x1, y1, pr);\n            pr.activePage.create(pr, pr.app);\n        } else if (openType === VpcDocumentLocation.ShowLoginForm) {\n            if (!getRoot().getSession()) {\n                /* we have to load the full ui, just to get the dialog to get then to log in */\n                let loader = new VpcIntroProvider('', '', VpcDocumentLocation.ShowLoginForm);\n                pr.beginLoadDocument(loader);\n            } else {\n                pr.activePage.destroy(pr, pr.app);\n                pr.activePage = new IntroPageOpen('introOpenPage', pr.bounds, x, y, VpcDocumentLocation.FromStackIdOnline);\n                pr.activePage.create(pr, pr.app);\n            }\n        }\n    }\n\n    /**\n     * parse the page's url parameters and see if it refers to a stack\n     */\n    static checkPageUrlParamsGetProvider(fullLocation: string): O<VpcIntroProvider> {\n        let id = IntroPageFirst.parseStackIdFromParams(fullLocation);\n        if (id && slength(id)) {\n            id = id.replace(/%7C/g, '|').replace(/%7c/g, '|');\n            let pts = id.split('|');\n            if (pts.length === 1) {\n                /* sending reference to a demo stack is different */\n                /* saves some $ since no server code or even db hits need to be run */\n                let demoName = Util512.fromBase64UrlSafe(pts[0]);\n                if (demoName.startsWith('demo_') && demoName.match(/^[a-zA-Z0-9_-]{1,100}$/)) {\n                    /* open the document */\n                    let demoId = demoName + '.json';\n                    return new VpcIntroProvider(demoId, lng('lngfeatured stack'), VpcDocumentLocation.FromStaticDemo);\n                }\n            } else if (pts.length === 2) {\n                /* we're opening someone's online stack */\n                return new VpcIntroProvider(id, lng('lngstack'), VpcDocumentLocation.FromStackIdOnline);\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * if the url contains something like s=xxxxx, return the xxxxx\n     */\n    protected static parseStackIdFromParams(s: string): O<string> {\n        let spl = s.split('?');\n        if (spl.length === 2) {\n            let splParams = spl[1].split('&');\n            for (let splParam of splParams) {\n                let pair = splParam.split('=');\n                if (pair.length === 2) {\n                    if (pair[0] === 's') {\n                        return pair[1];\n                    }\n                }\n            }\n        }\n\n        return undefined;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroPageLoading.ts",
    "content": "\n/* auto */ import { VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the loading page, essentially just shows a message on a white background\n */\nexport class IntroPageLoading extends IntroPageBase {\n    compositeType = 'IntroPageLoading';\n    protected prompt: O<UI512ElLabel>;\n    constructor(\n        compId: string,\n        bounds: number[],\n        x: number,\n        y: number,\n        public loader: VpcIntroProvider,\n        public initialLoadMessage: string\n    ) {\n        super(compId, bounds, x, y);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        let headerHeight = this.drawCommonFirst(app, grp);\n\n        /* draw the text */\n        const margin = 80;\n        this.prompt = this.genChild(app, grp, 'prompt', UI512ElLabel);\n        this.prompt.set('labeltext', this.initialLoadMessage + '...');\n        this.prompt.set('labelwrap', true);\n        this.prompt.set('labelhalign', true);\n        this.prompt.setDimensionsX1Y1(\n            this.x + margin,\n            this.y + headerHeight + margin,\n            this.x + this.logicalWidth - margin,\n            this.y + this.logicalHeight - margin\n        );\n\n        this.drawCommonLast(app, grp);\n    }\n\n    /**\n     * begin loading the document\n     * the loader will run the callback to update the label\n     */\n    go(currentCntrl: UI512Presenter) {\n        this.loader.prompt = this.prompt;\n        this.loader.startLoadDocument(currentCntrl, s => {\n            if (this.prompt) {\n                this.prompt.set('labeltext', s);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroPageOpen.ts",
    "content": "\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { VpcIntroInterface } from './vpcIntroInterface';\n/* auto */ import { RectUtils } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { slength } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512CompStdDialogResult } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * open a saved project\n * if the openType is FromStaticDemo, shows a list of demos,\n * otherwise, shows the user's saved online stacks\n */\nexport class IntroPageOpen extends IntroPageBase {\n    compositeType = 'IntroPageOpen';\n    listBox: O<UI512ElTextField>;\n    loadedFromOnline: [string, string][] = [];\n    hardCodedFeatured: [string, string][] = [\n        ['demo_graphics.json', 'Interactive art'],\n        ['demo_game.json', 'Make a game'],\n        ['demo_anim.json', 'Simple animation'],\n        ['demo_glider.json', 'GLIDER 4.0'],\n        ['demo_spacegame.json', 'Spaceman Gamma']\n    ];\n\n    constructor(compId: string, bounds: number[], x: number, y: number, protected openType: VpcDocumentLocation) {\n        super(compId, bounds, x, y);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        let headerHeight = this.drawCommonFirst(app, grp);\n\n        /* draw the OK and cancel buttons */\n        grp.getEl(this.getElId('windowLowestLayer'));\n        let cancel = this.drawBtn(app, grp, 1, this.x + 180, this.y + 287, 68, 21);\n        let ok = this.drawBtn(app, grp, 0, this.x + 180 - (252 - 174), this.y + 287 - 4, 69, 29);\n        this.acceptBtnId = ok.id;\n        this.cancelBtnId = cancel.id;\n\n        /* get logo dimensions (centered within the area) */\n        const footerHeight = 70;\n        const logoMargin = 20;\n        let half = Math.floor(this.logicalWidth / 2);\n        let spaceY = this.logicalHeight - (footerHeight + headerHeight);\n        let aroundLogo = [this.x + half, this.y + headerHeight, half, spaceY];\n        let logoBounds = RectUtils.getSubRectRaw(\n            aroundLogo[0],\n            aroundLogo[1],\n            aroundLogo[2],\n            aroundLogo[3],\n            logoMargin,\n            logoMargin\n        );\n\n        /* draw the logo */\n        logoBounds = logoBounds ? logoBounds : [0, 0, 0, 0];\n        let logo = this.genBtn(app, grp, 'logo');\n        logo.set('style', UI512BtnStyle.Opaque);\n        logo.set('autohighlight', false);\n        logo.set('icongroupid', 'logo');\n        logo.set('iconnumber', 0);\n        logo.setDimensions(logoBounds[0], logoBounds[1], logoBounds[2], logoBounds[3]);\n\n        /* draw the prompt */\n        let prompt = this.genChild(app, grp, 'prompt', UI512ElLabel);\n        let caption = lng('lngFeatured stacks...');\n        prompt.set('labeltext', caption);\n        prompt.setDimensions(this.x + 20, this.y + 50, 200, 50);\n\n        /* draw the list of choices */\n        this.listBox = this.genChild(app, grp, 'chooser', UI512ElTextField);\n        this.listBox.set('scrollbar', true);\n        this.listBox.set('selectbylines', true);\n        this.listBox.set('multiline', true);\n        this.listBox.set('canselecttext', true);\n        this.listBox.set('canedit', false);\n        this.listBox.set('labelwrap', false);\n        this.listBox.setDimensions(this.x + 26, this.y + 84, 190, 140);\n        grp.getEl(this.getElId('footerText')).set('visible', false);\n\n        if (this.openType === VpcDocumentLocation.FromStaticDemo) {\n            let sDocs: string[] = [];\n            sDocs = this.hardCodedFeatured.map(item => item[1]);\n            UI512ElTextField.setListChoices(this.listBox, sDocs);\n\n            if (sDocs.length) {\n                TextSelModify.selectLineInField(new UI512ElTextFieldAsGeneric(this.listBox), 0);\n            }\n        } else {\n            prompt.set('labeltext', 'Loading...');\n            Util512Higher.syncToAsyncTransition(this.getListChoicesAsync(prompt), 'respondIdle', RespondToErr.Alert);\n        }\n\n        this.drawCommonLast(app, grp);\n    }\n\n    /**\n     * draw a delete button, the functionality isn't yet implemented\n     */\n    protected drawDeleteBtn(app: UI512Application, grp: UI512ElGroup) {\n        let btnDelete = this.drawBtn(app, grp, 3, this.x + 311, this.y + 240, 149, 31);\n        btnDelete.set('labeltext', lng('lngDelete...'));\n    }\n\n    /**\n     * get a list of stacks from the server\n     */\n    async getListChoicesAsync(prompt: UI512Element) {\n        let ses = getVpcSessionTools().fromRoot();\n        if (!this.listBox) {\n            return;\n        }\n\n        if (ses) {\n            try {\n                let stacks = await ses.vpcListMyStacks();\n                this.loadedFromOnline = stacks.map(item => [item.fullstackid, item.stackname] as [string, string]);\n                UI512ElTextField.setListChoices(\n                    this.listBox,\n                    this.loadedFromOnline.map(item => item[1])\n                );\n                if (this.loadedFromOnline.length) {\n                    TextSelModify.selectLineInField(new UI512ElTextFieldAsGeneric(this.listBox), 0);\n                }\n\n                prompt.set('labeltext', 'Open from online stacks:');\n            } catch (e) {\n                prompt.set('labeltext', e.toString());\n            }\n        }\n    }\n\n    /**\n     * which line was chosen in the listbox?\n     */\n    static getChosen(self: IntroPageOpen): O<string> {\n        if (self.listBox) {\n            let whichLine = TextSelModify.selectByLinesWhichLine(new UI512ElTextFieldAsGeneric(self.listBox));\n            if (whichLine !== undefined) {\n                if (self.openType === VpcDocumentLocation.FromStaticDemo) {\n                    let entry = self.hardCodedFeatured[whichLine];\n                    if (entry !== undefined) {\n                        return entry[0];\n                    }\n                } else {\n                    let entry = self.loadedFromOnline[whichLine];\n                    if (entry !== undefined) {\n                        return entry[0];\n                    }\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * user clicked OK or cancel\n     */\n    respondToBtnClick(pr: VpcIntroInterface, self: IntroPageOpen, el: UI512Element) {\n        if (el.id.endsWith('choicebtn0')) {\n            let chosenId = IntroPageOpen.getChosen(self);\n            if (chosenId && slength(chosenId)) {\n                /* open the document */\n                let loader = new VpcIntroProvider(chosenId, lng('lngstack'), self.openType);\n                pr.beginLoadDocument(loader);\n            }\n        } else if (el.id.endsWith('choicebtn1')) {\n            pr.goBackToFirstScreen();\n        }\n    }\n\n    /**\n     * delete a project\n     */\n    deleteSelected(pr: VpcIntroInterface) {\n        assertTrue(false, 'KE|not yet implemented.');\n        let whichData = IntroPageOpen.getChosen(this);\n        if (whichData) {\n            pr.getModal().standardAnswer(\n                pr,\n                pr.app,\n                'Confirm deletion?',\n                n => {\n                    if (whichData && n === UI512CompStdDialogResult.Btn1) {\n                        this.deleteSelectedImpl(pr, whichData);\n                    }\n                },\n                lng('lngOK'),\n                lng('lngCancel')\n            );\n        }\n    }\n\n    /**\n     * delete a project, not yet implemented\n     */\n    protected deleteSelectedImpl(pr: VpcIntroInterface, whichData: string) {\n        assertTrue(false, 'KD|not yet implemented.');\n        pr.getModal().standardAnswer(\n            pr,\n            pr.app,\n            'Item removed',\n            n => {\n                pr.goBackToFirstScreen();\n            },\n            lng('lngOK')\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroPagePickFile.ts",
    "content": "\n/* auto */ import { VpcDocumentLocation, VpcIntroProvider } from './vpcIntroProvider';\n/* auto */ import { IntroPageBase } from './vpcIntroPageBase';\n/* auto */ import { VpcIntroInterface } from './vpcIntroInterface';\n/* auto */ import { showMsgIfExceptionThrown } from './../../ui512/utils/util512Higher';\n/* auto */ import { trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * opening from a json file on disk\n */\nexport class IntroPagePickFile extends IntroPageBase {\n    compositeType = 'IntroPagePickFile';\n    canDrag = false;\n    constructor(compId: string, bounds: number[], x: number, y: number, protected pr: VpcIntroInterface) {\n        /* always display this window in the center, even if it was moved earlier */\n        super(compId, bounds, undefined, undefined);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        this.drawCommonFirst(app, grp);\n\n        let noteToUser = this.genChild(app, grp, 'noteToUser', UI512ElLabel);\n        noteToUser.setDimensions(this.x + 30, this.y + 30, 300, 200);\n        noteToUser.set(\n            'labeltext',\n            lng(\n                longstr(\n                    `lngOpen from .json file:{{NEWLINE}}{{NEWLINE}}\n                    {{NEWLINE}}Please click anywhere on this page{{NEWLINE}}\n                    to choose a .json file to open...`\n                )\n            )\n        );\n\n        /* draw the cancel button */\n        let windowLowestLayer = grp.getEl(this.getElId('windowLowestLayer'));\n        const baseX = windowLowestLayer.right - 170;\n        const baseY = windowLowestLayer.bottom - 50;\n        let btnCancel = this.drawBtn(app, grp, 1, baseX + (252 - 174), baseY + (68 - 64), 68, 21);\n        this.cancelBtnId = btnCancel.id;\n\n        /* set the dimensions of the clickbounds */\n        let bounds = [0, 0, 9999, baseY - 50];\n        this.addPickerHtml(bounds);\n        this.drawCommonLast(app, grp);\n        grp.getEl(this.getElId('footerText')).set('visible', false);\n    }\n\n    /**\n     * add html elements for file picker\n     * one of the rare cases in ViperCard where we touch the real DOM\n     * we can't show any real input boxes, though, because the text\n     * will be smoothed, which looks wrong.\n     */\n    protected addPickerHtml(bounds: number[]) {\n        /* v1: use a ui512button and send click() to an <input>.\n        doesn't work in some browsers, and it seems like the type of thing\n        browsers will think is clickjacking and disable.\n\n        v2: show the native <input>... can set opacity to 0 to hide the\n        \"no file chosen\" text but, it's complicated to position (we sometimes\n        scale all our content) and hitbox is really wonky+too wide.\n\n        v3: create a 64px by 64px image that is a rectangle with text\n        'click here', set as label. works but the position might not always\n        be right and image looks ugly.\n\n        v4: current\n        make a real <input>, but hide it offscreen\n        make a <label> for the input that contains an <img>, the image\n        is a nearly-opaque png. so, clicking the png triggers the <input>.\n        we make the hitbox as big as possible (nearly entire screen) so that\n        any rendering discrepencies won't affect too badly.\n\n        used fixed, not absolute, we position relative to window not parent */\n\n        let pDiv = window.document.createElement('div');\n        pDiv.setAttribute('id', 'divVpcFilePicker');\n        pDiv.style.position = 'absolute';\n        pDiv.style.left = `${bounds[0]}px`;\n        pDiv.style.top = `${bounds[1]}px`;\n        pDiv.style.cursor = 'none';\n\n        let pLabel = window.document.createElement('label');\n        pLabel.setAttribute('for', 'idFilePicker');\n        pLabel.style.position = 'fixed';\n        pLabel.style.left = `${bounds[0]}px`;\n        pLabel.style.top = `${bounds[1]}px`;\n        pLabel.style.width = `3`;\n        pLabel.style.height = `3`;\n        pLabel.innerText = ' ';\n        pLabel.style.cursor = 'none';\n\n        let img = window.document.createElement('img');\n        img.src = '/resources03a/images/choosejsonfilenearlytransparent.png';\n        img.style.position = 'fixed';\n        img.style.left = `${bounds[0]}px`;\n        img.style.top = `${bounds[1]}px`;\n        img.style.width = `${bounds[2]}px`;\n        img.style.height = `${bounds[3]}px`;\n        img.style.cursor = 'none';\n        img.setAttribute('class', 'arrowCursor');\n        pLabel.appendChild(img);\n\n        let pInput = window.document.createElement('input');\n        pInput.setAttribute('id', 'idFilePicker');\n        pInput.setAttribute('type', 'file');\n        pInput.setAttribute('accept', '.json');\n        pInput.style.position = 'fixed';\n        pInput.style.left = `-9999px`;\n        pInput.style.top = `-9999px`;\n        pInput.style.cursor = 'none';\n        pInput.addEventListener('change', () => this.loadFromFile());\n        pDiv.appendChild(pLabel);\n        pDiv.appendChild(pInput);\n        window.document.body.appendChild(pDiv);\n    }\n\n    /**\n     * called by the browser when a file is chosen\n     */\n    loadFromFile() {\n        if (!FileReader) {\n            alert('opening files not supported in this browser, \"FileReader\" not found');\n            return;\n        }\n\n        let picker = window.document.getElementById('idFilePicker') as HTMLInputElement;\n        if (!picker) {\n            alert('file picker element not found');\n            return;\n        }\n\n        let files = picker.files;\n        if (!files || !files.length) {\n            /* no file chosen yet */\n            return;\n        } else {\n            let file = files[0];\n            let reader = new FileReader();\n            reader.addEventListener('load', evt => showMsgIfExceptionThrown(() => this.onOpenFileCallback(reader), ''));\n            reader.addEventListener('error', evt => showMsgIfExceptionThrown(() => this.onOpenFileErrorCallback(reader), ''));\n\n            /* read in the image file as a data URL */\n            reader.readAsText(file, 'utf-8');\n        }\n    }\n\n    /**\n     * file could not be read.\n     */\n    onOpenFileErrorCallback(reader: FileReader) {\n        alert('error reading the file contents. ' + reader.error);\n    }\n\n    /**\n     * called when file is read.\n     * pass the string read from the file as a string via identifier\n     */\n    onOpenFileCallback(reader: FileReader) {\n        if (reader.readyState === reader.DONE) {\n            if (\n                !trueIfDefinedAndNotNull(reader) ||\n                trueIfDefinedAndNotNull(reader.error) ||\n                !trueIfDefinedAndNotNull(reader.result)\n            ) {\n                alert(`error reading the file contents. ${reader?.error?.toString()}`);\n                return;\n            }\n\n            let text = reader.result;\n            if (!text) {\n                alert('got no text from file');\n                return;\n            }\n            if (typeof text !== 'string') {\n                alert('text is not a string. got binary data?');\n                return;\n            }\n\n            let loader = new VpcIntroProvider(text, lng('lngfile from disk'), VpcDocumentLocation.FromJsonFile);\n            this.pr.beginLoadDocument(loader);\n        }\n    }\n\n    /**\n     * override destroy and close our div\n     */\n    destroy(pr: UI512PresenterBase, app: UI512Application) {\n        let el = window.document.getElementById('divVpcFilePicker');\n        if (el) {\n            window.document.body.removeChild(el);\n        }\n\n        super.destroy(pr, app);\n    }\n\n    /**\n     * respond to button click\n     */\n    respondToBtnClick(pr: VpcIntroInterface, self: IntroPagePickFile, el: UI512Element) {\n        if (el.id.endsWith('choicebtn0') || el.id.endsWith('choicebtn1')) {\n            /* user clicked cancel, go back to first screen */\n            pr.goBackToFirstScreen();\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/intro/vpcIntroProvider.ts",
    "content": "\n/* auto */ import { CountNumericIdNormal } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { UndoManager } from './../state/vpcUndo';\n/* auto */ import { VpcStateSerialize } from './../state/vpcStateSerialize';\n/* auto */ import { VpcRuntime, VpcState } from './../state/vpcState';\n/* auto */ import { VpcExecTop } from './../../vpc/codeexec/vpcScriptExecTop';\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcPresenter } from './../presentation/vpcPresenter';\n/* auto */ import { VpcOutsideImpl } from './../state/vpcOutsideImpl';\n/* auto */ import { VpcStateInterfaceImpl } from './vpcInterfaceImpl';\n/* auto */ import { VpcNonModalFormSendReport } from './../nonmodaldialogs/vpcFormSendReport';\n/* auto */ import { VpcNonModalFormLogin } from './../nonmodaldialogs/vpcFormLogin';\n/* auto */ import { VpcTool, checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UndoableActionCreateOrDelVel } from './../state/vpcCreateOrDelVel';\n/* auto */ import { VpcElStack, VpcElStackLineageEntry } from './../../vpc/vel/velStack';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { RespondToErr, Root, Util512Higher, getRoot, justConsoleMsgIfExceptionThrown } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, bool, vpcWebsite } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, respondUI512Error } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertWarnEq, longstr, slength } from './../../ui512/utils/util512';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { ElementObserverNoOp } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * download, construct, and initialize a ViperCard project\n */\nexport class VpcIntroProvider {\n    prompt: O<UI512ElLabel>;\n    cbExitToMainMenu: () => void;\n    cbExitToNewDocument: () => void;\n    cbExitToOpen: (mineOnly: boolean) => void;\n    constructor(public identifier: string, public readonly docName: string, public readonly loc: VpcDocumentLocation) {}\n\n    /**\n     * begin async operation\n     */\n    startLoadDocument(currentCntrl: UI512Presenter, cbSetStatus: (s: string) => void) {\n        Util512Higher.syncToAsyncTransition(\n            this.startLoadDocumentAsync(currentCntrl, cbSetStatus),\n            'startLoadDocument',\n            RespondToErr.Alert\n        );\n    }\n\n    /**\n     * loads the document, showing a message on the \"loading\" page\n     * if an error occurs. we'll show the exception details.\n     */\n    async startLoadDocumentAsync(currentCntrl: UI512Presenter, cbSetStatus: (s: string) => void) {\n        try {\n            return this.startLoadDocumentAsyncImpl(currentCntrl);\n        } catch (e) {\n            cbSetStatus(\n                lng(\n                    longstr(\n                        `lngPlease go to \\n${vpcWebsite}\\nto return\n                to the main menu.'){NEWLINE}${e.message}{NEWLINE}{NEWLINE}{NEWLINE}`,\n                        ''\n                    )\n                )\n            );\n        }\n    }\n\n    /**\n     * wait for delay loaded javascript\n     */\n    static async waitForDelayLoadedJs(prompt: O<UI512ElLabel>) {\n        if (prompt) {\n            prompt.set('labeltext', 'Opening delay-loaded libraries...');\n        }\n        while (true) {\n            let rootHigher = getRoot() as RootHigher;\n            if (rootHigher?.hasLoadedExternalDelay === 'success') {\n                break;\n            } else if (rootHigher?.hasLoadedExternalDelay) {\n                checkThrow(false, 'WW|Failed to delay-load' + rootHigher?.hasLoadedExternalDelay);\n            } else {\n                await Util512Higher.sleep(100);\n            }\n        }\n        if (prompt) {\n            prompt.set('labeltext', 'Loading...');\n        }\n    }\n\n    /**\n     * load the document\n     */\n    async loadDocumentTop(): Promise<[VpcPresenter, VpcState]> {\n        /* wait for delay-loaded javascript */\n        await VpcIntroProvider.waitForDelayLoadedJs(this.prompt);\n\n        /* download the stack data */\n        let serialized = await this.getSerializedStackData();\n\n        /* create pr and fullVci */\n        let { pr, fullVci, vpcState } = await this.getVpcState();\n\n        /* load saved data */\n        await this.initPrUI(pr, serialized, fullVci, vpcState);\n\n        /* compile scripts, set stack lineage */\n        /* don't prevent stack from opening if a failure happens here */\n        try {\n            await this.initPrSettings(pr, vpcState, fullVci);\n        } catch (e) {\n            respondUI512Error(e, 'initPrSettings');\n        }\n\n        /* setup the redirection-to-login-form if requested */\n        this.setFirstActionWhenLoaded(vpcState, pr);\n\n        /* return the results */\n        checkThrow(pr, 'U1|pr must be defined');\n        checkThrow(vpcState, 'U0|vpcState must be defined');\n        return [pr, vpcState];\n    }\n\n    /**\n     * download stack data\n     */\n    protected async getSerializedStackData() {\n        let serializedSavedData = '';\n        if (this.loc === VpcDocumentLocation.NewDoc || this.loc === VpcDocumentLocation.ShowLoginForm) {\n            /* no serialized data needed */\n            assertWarnEq('', this.identifier, 'KL|');\n        } else if (this.loc === VpcDocumentLocation.FromStaticDemo) {\n            /* request json asynchronously */\n            assertTrue(!this.identifier.includes('/'), 'KK|');\n            assertTrue(!this.identifier.includes('\\\\'), 'KJ|');\n            assertTrue(!this.identifier.includes('..'), 'KI|');\n            assertTrue(this.identifier.endsWith('.json'), 'KH|');\n            let got = await Util512Higher.asyncLoadJson('/resources03a/docs/' + this.identifier);\n            serializedSavedData = JSON.stringify(got);\n        } else if (this.loc === VpcDocumentLocation.FromJsonFile) {\n            /* we already have the json, it was given to us via identifier */\n            serializedSavedData = this.identifier;\n        } else if (this.loc === VpcDocumentLocation.FromStackIdOnline) {\n            /* ask the server for the data */\n            let got = await getVpcSessionTools().vpcStacksGetData(this.identifier);\n            serializedSavedData = got.stackdata;\n        } else {\n            checkThrow(false, 'KG|cannot open from location ' + this.loc);\n        }\n\n        checkThrow(\n            this.loc === VpcDocumentLocation.NewDoc ||\n                this.loc === VpcDocumentLocation.ShowLoginForm ||\n                slength(serializedSavedData),\n            'KF|serializedSavedData is ' + serializedSavedData\n        );\n\n        return serializedSavedData;\n    }\n\n    /**\n     * construct a full VpcState\n     */\n    async getVpcState() {\n        await this.yieldTime();\n        let idGen = new CountNumericIdNormal(10000);\n        await this.yieldTime();\n        let vpcState = new VpcState();\n        await this.yieldTime();\n        vpcState.runtime = new VpcRuntime();\n        await this.yieldTime();\n        vpcState.undoManager = new UndoManager(() => vpcState.model.productOpts.getS('currentCardId'));\n        await this.yieldTime();\n        vpcState.runtime.opts.observer = new ElementObserverNoOp();\n        await this.yieldTime();\n        vpcState.runtime.outside = new VpcOutsideImpl();\n        await this.yieldTime();\n        vpcState.runtime.codeExec = new VpcExecTop(vpcState.runtime.outside, idGen);\n        await this.yieldTime();\n        vpcState.model = new VpcModelTop();\n        await this.yieldTime();\n        let fullVci = new VpcStateInterfaceImpl();\n        let pr = new VpcPresenter(fullVci, vpcState.runtime);\n        fullVci.init(vpcState, pr);\n        vpcState.vci = fullVci;\n        await this.yieldTime();\n        if (this.loc === VpcDocumentLocation.FromStaticDemo) {\n            pr.cameFromDemoSoNeverPromptSave = this.identifier.replace(/\\.json/g, '');\n            await this.yieldTime();\n        }\n\n        pr.cbExitToMainMenu = this.cbExitToMainMenu;\n        await this.yieldTime();\n        pr.cbExitToNewDocument = this.cbExitToNewDocument;\n        await this.yieldTime();\n        pr.cbExitToOpen = this.cbExitToOpen;\n        await this.yieldTime();\n        pr.initPresenter(vpcState.undoManager);\n        await this.yieldTime();\n        return { pr, fullVci, vpcState };\n    }\n\n    /**\n     * construct the presenter object\n     */\n    protected async initPrUI(pr: VpcPresenter, serializedSavedData: string, fullVci: VpcStateInterfaceImpl, vcstate: VpcState) {\n        /* load saved data */\n        if (serializedSavedData.length) {\n            UndoableActionCreateOrDelVel.ensureModelNotEmpty(fullVci, false, vcstate.runtime.useThisObserverForVpcEls);\n            await this.yieldTime();\n            let serVel = JSON.parse(serializedSavedData);\n            await this.yieldTime();\n            VpcStateSerialize.deserializeAll(fullVci, serVel);\n            await this.yieldTime();\n            /* load card order if not set */\n            this.patchUpFromPrevVersions(fullVci.getModel());\n            await this.yieldTime();\n        } else {\n            /* only call this *after* the presenter has set up useThisObserverForVpcEls */\n            vcstate.model.uuid = Util512Higher.weakUuid();\n            await this.yieldTime();\n            UndoableActionCreateOrDelVel.ensureModelNotEmpty(fullVci, true, vcstate.runtime.useThisObserverForVpcEls);\n            await this.yieldTime();\n        }\n\n        await this.yieldTime();\n        pr.initUI();\n        await this.yieldTime();\n        vcstate.runtime.outside.vci = pr.vci;\n        await this.yieldTime();\n\n        /* go to the first card (but don't send opencard yet) */\n        fullVci.doWithoutAbilityToUndo(() => {\n            let card = vcstate.model.stack.bgs[0].cards[0].idInternal;\n            pr.setCurCardNoOpenCardEvt(card);\n        });\n    }\n\n    /**\n     * older stacks won't have this set\n     */\n    protected patchUpFromPrevVersions(model: VpcModelTop) {\n        for (let vel of model.stack.iterEntireStack()) {\n            if (vel instanceof VpcElStack) {\n                if (vel['_compatibilitymode'] === undefined) {\n                    vel['_compatibilitymode'] = false;\n                }\n                if (vel['_increasingnumberforelemnamefld'] === undefined) {\n                    vel['_increasingnumberforelemnamefld'] = 1;\n                }\n                if (vel['_cardorder'] === undefined) {\n                    vel['_cardorder'] = '';\n                    model.stack.alterCardOrder(current => {\n                        let order: string[] = [];\n                        for (let bg of model.stack.bgs) {\n                            for (let cd of bg.cards) {\n                                order.push(cd.idInternal);\n                            }\n                        }\n                        return order;\n                    }, model);\n                }\n            } else if (vel instanceof VpcElBg) {\n                if (vel['parts']) {\n                    delete vel['parts'];\n                }\n            } else if (vel instanceof VpcElCard) {\n                if (vel['_marked'] === undefined) {\n                    vel['_marked'] = false;\n                }\n            } else if (vel instanceof VpcElButton) {\n                if (vel['_sharedhilite'] === undefined) {\n                    vel['_sharedhilite'] = false;\n                }\n                if (vel['_is_bg_velement_id'] === undefined) {\n                    vel['_is_bg_velement_id'] = '';\n                }\n                if (vel['_hilite_uniquetocard'] === undefined) {\n                    vel['_hilite_uniquetocard'] = false;\n                }\n                if (vel['_checkmark_uniquetocard'] === undefined) {\n                    vel['_checkmark_uniquetocard'] = false;\n                }\n            } else if (vel instanceof VpcElField) {\n                if (vel['_sharedtext'] === undefined) {\n                    vel['_sharedtext'] = false;\n                }\n                if (vel['_is_bg_velement_id'] === undefined) {\n                    vel['_is_bg_velement_id'] = '';\n                }\n                if (vel['_ftxt_uniquetocard'] === undefined) {\n                    vel['_ftxt_uniquetocard'] = new FormattedText();\n                }\n                if (vel['_scroll_uniquetocard'] === undefined) {\n                    vel['_scroll_uniquetocard'] = 0;\n                }\n            }\n        }\n    }\n\n    /**\n     * compile scripts, set stack lineage\n     */\n    protected async initPrSettings(pr: VpcPresenter, vci: VpcState, fullVci: VpcStateInterfaceImpl) {\n        /* create a new stack lineage */\n        if (!vci.model.stack.getS('stacklineage').length) {\n            fullVci.doWithoutAbilityToUndo(() => {\n                let en = new VpcElStackLineageEntry(\n                    vci.model.stack.lineageUsernameNull(),\n                    getVpcSessionTools().generateStackPartialId(),\n                    'untitled'\n                );\n\n                vci.model.stack.appendToStackLineage(en, vci.model);\n            });\n        }\n\n        /* set current tool */\n        let hasContent =\n            vci.model.stack.bgs[0] && vci.model.stack.bgs[0].cards[0] && bool(vci.model.stack.bgs[0].cards[0].parts[0]);\n\n        if (\n            this.identifier === 'demo_graphics.json' ||\n            this.identifier === 'demo_game.json' ||\n            this.identifier === 'demo_anim.json'\n        ) {\n            hasContent = false;\n        }\n\n        vci.vci.doWithoutAbilityToUndo(() => {\n            vci.vci.setTool(hasContent ? VpcTool.Browse : VpcTool.Pencil);\n        });\n\n        vci.vci.causeUIRedraw();\n        return this.yieldTime();\n    }\n\n    /**\n     * by placing a callback in the queue, this code will be run\n     * as soon as the page opens\n     */\n    protected setFirstActionWhenLoaded(vpcState: VpcState, pr: VpcPresenter) {\n        if (this.loc === VpcDocumentLocation.ShowLoginForm) {\n            /* tell the presenter to show the login form as soon as the page opens */\n            pr.lyrCoverArea.setMyMessage('');\n            pr.placeCallbackInQueue(() => {\n                let form = new VpcNonModalFormLogin(vpcState.vci, false /*newUserOk*/);\n                form.fnCbWhenSignedIn = () => {\n                    pr.menuActions.save.beginGoExit('openFromMyStacks');\n                };\n\n                VpcNonModalFormSendReport.largeWindowBounds(form, vpcState.vci);\n                vpcState.vci.setNonModalDialog(form);\n            });\n        } else if (this.loc === VpcDocumentLocation.FromStackIdOnline) {\n            /* tell the presenter to show a dialog explaining that this is someone else's stack */\n            let fn = () => {\n                let ses = getVpcSessionTools().fromRoot();\n                let username = ses ? ses.username : '';\n                let info = vpcState.vci.getModel().stack.getLatestStackLineage();\n                if (info.stackOwner !== username) {\n                    pr.answerMsg(\n                        longstr(`You're opening a stack created by\n                                \"${info.stackOwner}\".{{NEWLINE}}If you want\n                                to make changes, simply press Save, and you'll\n                                be working on your own copy of the stack.`)\n                    );\n                }\n            };\n            pr.placeCallbackInQueue(() => justConsoleMsgIfExceptionThrown(fn, \"this is someone else's stack\"));\n        }\n    }\n\n    /**\n     * load the document, and pause for a bit\n     */\n    protected async startLoadDocumentAsyncImpl(currentCntrl: UI512Presenter) {\n        /* minimum time, just so that it \"feels right\" rather than loading instantly */\n        let ret: [VpcPresenter, VpcState] = await Util512Higher.runAsyncWithMinimumTime(this.loadDocumentTop(), 1500);\n\n        currentCntrl.placeCallbackInQueue(() => {\n            /* remove the loading page and replace it with the new presenter */\n            getRoot().replaceCurrentPresenter(ret[0]);\n        });\n    }\n\n    /**\n     * provide time for event loop,\n     * in case the stack has thousands of scripts to process\n     */\n    protected async yieldTime() {\n        return Util512Higher.sleep(10);\n    }\n}\n\n/**\n * which location to open from\n */\nexport enum VpcDocumentLocation {\n    __isUI512Enum = 1,\n    NewDoc,\n    FromStaticDemo,\n    FromJsonFile,\n    FromStackIdOnline,\n    ShowLoginForm\n}\n\n/**\n * a higher level root interface\n */\nexport interface RootHigher extends Root {\n    rawResize(width: number, height: number): void;\n    scaleMouseCoords: number;\n    hasLoadedExternalDelay: string;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/menu/vpcAboutDialog.ts",
    "content": "\n/* auto */ import { vpcWebsitePart } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512CompModalDialog, UI512CompStdDialogResult } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * ViperCard's about dialog\n */\nexport const VpcAboutDialog = /* static class */ {\n    /**\n     * show main about screen\n     *\n     * opening a window is often blocked by browsers because it looks like a pop-up,\n     * so we have to open the window in a more direct way, straght from\n     * the mouseUp event.\n     *\n     * we used to use donorbox's iframe to show the donation without opening\n     * a new page, but this is fragile with a lot of moving parts.\n     * would it interfere with my code to capture the focus for clipboard paste?\n     * also, browser differences, with Firefox treating typing into the\n     * donation page also sending the events to vipercard, which didn't look right.\n     */\n    show(pr: UI512Presenter, dlg: UI512CompModalDialog) {\n        dlg.destroy(pr, pr.app);\n        dlg.cbOnMouseUp = n => {\n            if (n === UI512CompStdDialogResult.Btn2) {\n                window.open('https://donorbox.org/vipercard', '_blank');\n            }\n        };\n\n        dlg.standardAnswer(\n            pr,\n            pr.app,\n            longstr(\n                `@ViperCardDotNet{{NEWLINE}} Re-creating and re-imagining HyperCard,\n                to make animations, games, and interactive art.{{NEWLINE}}` +\n                    `https://github.com/moltenform/vipercard{{NEWLINE}}` +\n                    `groups.google.com/forum/#!forum/vipercard{{NEWLINE}}`,\n                ' '\n            ),\n            n => {\n                if (n === UI512CompStdDialogResult.Btn2) {\n                    /* see cbOnMouseUp */\n                } else if (n === UI512CompStdDialogResult.Btn3) {\n                    VpcAboutDialog.showMore(pr, dlg);\n                }\n            },\n            lng('lngClose'),\n            lng('lngDonate'),\n            lng('lngMore')\n        );\n    },\n\n    /**\n     * go directly to a dialog about Donation\n     */\n    showDonateDlg(pr: UI512Presenter, dlg: UI512CompModalDialog) {\n        dlg.destroy(pr, pr.app);\n        dlg.cbOnMouseUp = n => {\n            if (n === UI512CompStdDialogResult.Btn1) {\n                window.open('https://donorbox.org/vipercard', '_blank');\n            }\n        };\n\n        dlg.standardAnswer(\n            pr,\n            pr.app,\n            `Thank you for supporting this project.`,\n            n => {\n                /* see cbOnMouseUp */\n            },\n            lng('lngDonate'),\n            lng('lngClose')\n        );\n    },\n\n    /**\n     * show more information, incl terms\n     */\n    showMore(pr: UI512Presenter, dlg: UI512CompModalDialog) {\n        dlg.destroy(pr, pr.app);\n        dlg.cbOnMouseUp = n => {\n            if (n === UI512CompStdDialogResult.Btn3) {\n                window.open(vpcWebsitePart + 'html/terms.html', '_blank');\n            }\n        };\n\n        dlg.standardAnswer(\n            pr,\n            pr.app,\n            longstr(\n                `ViperCard has a right to remove any content{{NEWLINE}}\n            that has been posted. Spam, obscene images, malware, and hateful\n            content are disallowed.{{NEWLINE}}This project is funded by\n            donation and will not{{NEWLINE}}share or sell any user data.`,\n                ' '\n            ),\n            n => {\n                if (n === UI512CompStdDialogResult.Btn2) {\n                    VpcAboutDialog.showLibs(pr, dlg);\n                } else if (n === UI512CompStdDialogResult.Btn3) {\n                    /* see cbOnMouseUp */\n                } else {\n                    VpcAboutDialog.show(pr, dlg);\n                }\n            },\n\n            lng('lngBack'),\n            lng('lngJS Libs Used'),\n            lng('lngFull terms')\n        );\n    },\n\n    /**\n     * show libraries, to fulfill terms of MIT license\n     */\n    showLibs(pr: UI512Presenter, dlg: UI512CompModalDialog) {\n        dlg.destroy(pr, pr.app);\n        dlg.standardAnswer(\n            pr,\n            pr.app,\n            longstr(\n                `ViperCard, by moltenform (Ben Fisher). GPLv3. {{NEWLINE}}{{NEWLINE}}\n                Uses Chevrotain (Apache), base64-js (MIT), FileSaver (MIT),\n                Golly (MIT), JSGIF (MIT), js-lru (MIT), lz-string,\n                Bowser (MIT), Clipboard.js (MIT), and easy.filter.`,\n                ' '\n            ),\n            n => {\n                VpcAboutDialog.show(pr, dlg);\n            },\n            lng('lngBack')\n        );\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/menu/vpcAppMenuActions.ts",
    "content": "\n/* auto */ import { RememberHistory } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcNonModalReplBox } from './../nonmodaldialogs/vpcReplMessageBox';\n/* auto */ import { VpcNonModalFormBase } from './../nonmodaldialogs/vpcLyrNonModalHolder';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcNonModalFormSendReport } from './../nonmodaldialogs/vpcFormSendReport';\n/* auto */ import { VpcNonModalFormLogin } from './../nonmodaldialogs/vpcFormLogin';\n/* auto */ import { PropAdjective, VpcTool, checkThrowNotifyMsg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { DialogDocsType, VpcNonModalDocViewer } from './../nonmodaldialogs/vpcDocViewer';\n/* auto */ import { VpcAboutDialog } from './vpcAboutDialog';\n/* auto */ import { VelRenderId } from './../../vpc/vel/velRenderName';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { BrowserInfo, BrowserOSInfo, getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompModalDialog } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * respond to menu actions\n */\nexport class VpcMenuActions {\n    save: VpcSaveInterface;\n    msgBoxHistory = new RememberHistory();\n    cbFindEditToolSelectedFldOrBtn: () => O<VpcElBase>;\n    cbOnClearNonBrowseTool: () => void;\n    constructor(protected vci: VpcStateInterface) {}\n\n    /**\n     * let's implement a lot of our menu commands in vipercard itself!\n     * 1) don't need two implementations\n     * 2) exposes more actions to scripts, i.e. doMenu\n     * note: if you're not in the browse tool, we don't really want\n     * a lot of code to run, so we use silenceMessagesForUIAction\n     */\n    runMenuActionCode(s: string) {\n        this.vci.getCodeExec().silenceMessagesForUIAction.val = this.vci.getTool();\n        this.vci.setTool(VpcTool.Browse);\n        this.vci.getCodeExec().runMsgBoxCodeOrThrow(s, this.vci.getCurrentCardId(), false /* add return */);\n    }\n\n    /**\n     * show about dialog\n     */\n    goMnuOSAbout() {\n        let pr = this.vci.getPresenter();\n        let dlg = new UI512CompModalDialog('OSAboutDlg');\n        VpcAboutDialog.show(pr, dlg);\n    }\n\n    /**\n     * show donate dialog\n     */\n    goMnuOSDonate() {\n        let pr = this.vci.getPresenter();\n        let dlg = new UI512CompModalDialog('OSAboutDlg');\n        VpcAboutDialog.showDonateDlg(pr, dlg);\n    }\n\n    /**\n     * show report error window\n     */\n    goMnuReportErr() {\n        this.exitIfServerCodeInactive();\n        if (getRoot().getSession()) {\n            let dlg = new VpcNonModalFormSendReport(this.vci);\n            this.vci.setNonModalDialog(dlg);\n        } else {\n            let form = new VpcNonModalFormLogin(this.vci, true /* newUserOk*/);\n            VpcNonModalFormBase.standardWindowBounds(form, this.vci);\n            form.fnCbWhenSignedIn = () => {\n                this.goMnuReportErr();\n            };\n\n            this.vci.setNonModalDialog(form);\n        }\n    }\n\n    /**\n     * show \"security info\" dialog\n     */\n    goMnuReportSec() {\n        this.showModal(\n            longstr(`lngSecurity issues are taken seriously. If you are aware\n                of an issue that has security{{NEWLINE}}implications, please\n                contact the developers{{NEWLINE}}at security@vipercard.net.`)\n        );\n    }\n\n    /**\n     * show message box (repl)\n     */\n    goMnuMsgBox() {\n        let dlg = new VpcNonModalReplBox(this.vci, this.msgBoxHistory);\n        this.vci.setNonModalDialog(dlg);\n    }\n\n    /**\n     * begin async save\n     */\n    goMnuSave() {\n        if (!getVpcSessionTools().enableServerCode) {\n            this.goMnuExportStack();\n        } else {\n            this.exitIfServerCodeInactive();\n            if (this.save.busy) {\n                console.log(\"Cannot start a new task until we've finished the other task.\");\n            } else {\n                this.save.beginSave();\n            }\n        }\n    }\n\n    /**\n     * begin save as\n     */\n    goMnuSaveAs() {\n        this.exitIfServerCodeInactive();\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginSaveAs();\n        }\n    }\n\n    /**\n     * begin open (exits everything and goes back to start screen)\n     */\n    goMnuOpen() {\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginGoExit('mnuOpen');\n        }\n    }\n\n    /**\n     * share a link\n     */\n    goMnuShareALink() {\n        this.exitIfServerCodeInactive();\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginShareLink();\n        }\n    }\n\n    /**\n     * create new stack\n     */\n    goMnuNewStack() {\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginGoExit('mnuNewStack');\n        }\n    }\n\n    /**\n     * export stack to json\n     */\n    goMnuExportStack() {\n        /* *don't* use this.busy with this. need a way to\n        recover if save() hangs for some reason. */\n        this.save.beginExportJson();\n    }\n\n    /**\n     * export to gif\n     */\n    goMnuExportGif() {\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginExportGif();\n        }\n    }\n\n    /**\n     * quit (to main screen)\n     */\n    goMnuQuit() {\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginGoExit('mnuQuit');\n        }\n    }\n\n    /**\n     * flag stack inappropriate content\n     */\n    goMnuFlagStack() {\n        this.exitIfServerCodeInactive();\n        if (this.save.busy) {\n            console.log(\"Cannot start a new task until we've finished the other task.\");\n        } else {\n            this.save.beginFlagContent();\n        }\n    }\n\n    /**\n     * use internal-only clipboard in case connection with os-clipboard isn't working\n     */\n    goMnuUseHostClipboard() {\n        this.vci.setOption('optUseHostClipboard', !this.vci.getOptionB('optUseHostClipboard'));\n        this.vci.getPresenter().useOSClipboard = this.vci.getOptionB('optUseHostClipboard');\n    }\n\n    /**\n     * create new card\n     */\n    goMnuNewCard() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"New Card\"');\n    }\n\n    /**\n     * duplicate current card\n     */\n    goMnuDupeCardPaint() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Duplicate Card Paint\"');\n    }\n\n    /**\n     * show publish stack info\n     */\n    goMnuPublishFeatured() {\n        this.exitIfServerCodeInactive();\n        this.showModal(\n            longstr(`lngYour project could be featured on ViperCard's\n                front page! Save the project, choose 'Share a link' from\n                the File menu, and send the link to @ViperCardDotNet on Twitter.`)\n        );\n    }\n\n    /**\n     * copy card or element\n     */\n    goMnuCopyCardOrVel() {\n        let selected = this.cbFindEditToolSelectedFldOrBtn();\n        if (selected) {\n            this.vci.setOption('copiedVelId', selected.idInternal);\n        } else {\n            this.showModal('lngThis feature has not yet been developed.');\n        }\n    }\n\n    /**\n     * paste card or element\n     */\n    goMnuPasteCardOrVel() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Paste Card Or Vel\"');\n    }\n\n    /**\n     * show about dialog\n     * (another method, each menuitem must have an id that is unique)\n     */\n    goMnuOSAbout2() {\n        this.goMnuOSAbout();\n    }\n\n    /**\n     * delete current card\n     * note that we have to move away from this card first before deleting it\n     */\n    goMnuDelCard() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Delete Card\"');\n    }\n\n    /**\n     * toggle wide lines option\n     */\n    goMnuPaintWideLines() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Wide Lines\"');\n    }\n\n    /**\n     * set black lines option\n     */\n    goMnuPaintBlackLines() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Black Lines\"');\n    }\n\n    /**\n     * set white lines option\n     */\n    goMnuPaintWhiteLines() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"White Lines\"');\n    }\n\n    /**\n     * set black fill option\n     */\n    goMnuPaintBlackFill() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Black Fill\"');\n    }\n\n    /**\n     * set white fill option\n     */\n    goMnuPaintWhiteFill() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"White Fill\"');\n    }\n\n    /**\n     * set no fill option\n     */\n    goMnuPaintNoFill() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"No Fill\"');\n    }\n\n    /**\n     * set paint-multiple\n     */\n    goMnuPaintDrawMult() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Draw Multiple\"');\n    }\n\n    /**\n     * show info about painting many copies\n     */\n    goMnuPaintManyCopies() {\n        let keyname = BrowserInfo.get().os === BrowserOSInfo.Mac ? 'Option' : 'Alt';\n        this.showModal(\n            longstr(`lngTo make many of copies of a shape, first use the\n                'lasso' or 'select' tool to select the region. Then, hold\n                the ${keyname} key, click within the region, and drag.`)\n        );\n    }\n\n    /**\n     * cut, has to be done from keyboard\n     */\n    goMnuCut() {\n        let keyname = BrowserInfo.get().os === BrowserOSInfo.Mac ? 'Cmd' : 'Ctrl';\n        this.showModal(`lngPlease use the keyboard shortcut ${keyname}+X to \\ncut text.`);\n    }\n\n    /**\n     * copy, has to be done from keyboard\n     */\n    goMnuCopy() {\n        let keyname = BrowserInfo.get().os === BrowserOSInfo.Mac ? 'Cmd' : 'Ctrl';\n        this.showModal(`lngPlease use the keyboard shortcut ${keyname}+C to \\ncopy text.`);\n    }\n\n    /**\n     * paste, has to be done from keyboard\n     */\n    goMnuPaste() {\n        let keyname = BrowserInfo.get().os === BrowserOSInfo.Mac ? 'Cmd' : 'Ctrl';\n        this.showModal(`lngPlease use the keyboard shortcut ${keyname}+V to \\npaste text.`);\n    }\n\n    /**\n     * go to first card\n     */\n    goMnuGoCardFirst() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"First\"');\n    }\n\n    /**\n     * go to last card\n     */\n    goMnuGoCardLast() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Last\"');\n    }\n\n    /**\n     * left arrow, usually go left but user can override\n     */\n    goMnuOnArrowLeft() {\n        this.runMenuActionCode('arrowkey \"left\"');\n    }\n\n    /**\n     * right arrow, usually go right but user can override\n     */\n    goMnuOnArrowRight() {\n        this.runMenuActionCode('arrowkey \"right\"');\n    }\n\n    /**\n     * up arrow, usually no-op but user can override\n     */\n    goMnuOnArrowUp() {\n        this.runMenuActionCode('arrowkey \"up\"');\n    }\n\n    /**\n     * down arrow, usually no-op but user can override\n     */\n    goMnuOnArrowDown() {\n        this.runMenuActionCode('arrowkey \"down\"');\n    }\n\n    /**\n     * go to previous card\n     */\n    goMnuGoCardPrev() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Prev\", \"FromUI\"');\n    }\n\n    /**\n     * go to the next card\n     */\n    goMnuGoCardNext() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"Next\", \"FromUI\"');\n    }\n\n    /**\n     * select and edit the card\n     */\n    goMnuCardInfo() {\n        let currentCardId = this.vci.getOptionS('currentCardId');\n        this.vci.setTool(VpcTool.Button);\n        this.vci.setOption('selectedVelId', currentCardId);\n        this.vci.setOption('viewingScriptVelId', '');\n    }\n\n    /**\n     * select and edit the stack\n     */\n    goMnuStackInfo() {\n        let currentstackid = this.vci.getModel().stack.idInternal;\n        this.vci.setTool(VpcTool.Button);\n        this.vci.setOption('selectedVelId', currentstackid);\n        this.vci.setOption('viewingScriptVelId', '');\n    }\n\n    /**\n     * new button\n     */\n    goMnuObjectsNewBtn() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"New Button from ui\"');\n    }\n\n    /**\n     * new field\n     */\n    goMnuObjectsNewFld() {\n        this.runMenuActionCode('vpcinternaluntrappabledomenu \"New Field from ui\"');\n    }\n\n    /**\n     * clear (either selected text or a tool-specific action)\n     */\n    goMnuClear() {\n        if (this.vci.getTool() === VpcTool.Browse) {\n            this.runMenuActionCode('vpcinternaluntrappabledomenu \"Clear\"');\n        } else {\n            this.cbOnClearNonBrowseTool();\n        }\n    }\n\n    /**\n     * show help examples\n     */\n    goMnuDlgHelpExamples() {\n        let dlg = new VpcNonModalDocViewer(this.vci, DialogDocsType.Examples);\n        this.vci.setNonModalDialog(dlg);\n    }\n\n    /**\n     * show complete script reference\n     */\n    goMnuDlgHelpReference() {\n        let showVids = () => this.goMnuDlgHelpExamples();\n        let dlg = new VpcNonModalDocViewer(this.vci, DialogDocsType.Reference);\n        dlg.cbShowVids = showVids;\n        this.vci.setNonModalDialog(dlg);\n    }\n\n    /**\n     * user has chosen something without its own method\n     */\n    fallbackToSetToolOrSetFont(s: string) {\n        if (s.startsWith('mnuItemTool')) {\n            /* these can't go through doMenu, scripts can't set the current tool */\n            let toolNumber = Util512.parseInt(s.substr('mnuItemTool'.length));\n            toolNumber = toolNumber ?? VpcTool.Browse;\n            this.vci.setTool(toolNumber);\n        } else if (s.startsWith('mnuItemSetFont')) {\n            let cmd = s.substr('mnuItemSetFont'.length);\n            if (this.vci.getTool() === VpcTool.Browse) {\n                this.runMenuActionCode(`doMenu \"${cmd}\"`);\n            } else {\n                let vel = this.cbFindEditToolSelectedFldOrBtn();\n                let renderVel = vel\n                    ? new VelRenderId(this.vci.getModel()).go(\n                          vel,\n                          PropAdjective.LongForParse,\n                          this.vci.getModel().stack.getB('compatibilitymode')\n                      )\n                    : '';\n                this.runMenuActionCode(`doMenu \"${cmd}\", \"setAll|${renderVel}\" `);\n            }\n        } else {\n            console.error('Unknown menu item', s);\n        }\n    }\n\n    /**\n     * sometimes we disable saving to the server. you\n     * can still save to json though.\n     */\n    protected exitIfServerCodeInactive() {\n        checkThrowNotifyMsg(\n            getVpcSessionTools().enableServerCode,\n            'U2|Server code currently not enabled. You can still save as a .json file, though.'\n        );\n    }\n\n    /**\n     * show a modal dialog,\n     * not an error at all but we just use this to enforce that\n     * there's no other code run after showing the dialog\n     * (code running after showing the dialog would be in a weird state)\n     */\n    protected showModal(untranslated: string) {\n        checkThrowNotifyMsg(false, lng(untranslated));\n    }\n}\n\n/**\n * asynchronous save methods\n */\nexport interface VpcSaveInterface {\n    busy: boolean;\n    beginSave(): void;\n    beginSaveAs(): void;\n    beginShareLink(): void;\n    beginExportJson(): void;\n    beginExportGif(): void;\n    beginFlagContent(): void;\n    beginGoExit(destination: string): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/menu/vpcMenu.ts",
    "content": "\n/* auto */ import { VpcAppMenuStructure } from './vpcMenuStructure';\n/* auto */ import { VpcElType, VpcTool, VpcToolCtg, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { MenuPositioning } from './../../ui512/menu/ui512MenuPositioning';\n/* auto */ import { clrBlack, clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the Vpc menu\n */\nexport class VpcAppMenu extends VpcAppMenuStructure {\n    /**\n     * initialize the menu\n     */\n    init() {\n        MenuPositioning.buildFromArray(this.vci.getPresenter(), this.getMenuStruct());\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuSysAppsHideProduct', undefined, false);\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuSysAppsHideOthers', undefined, false);\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuSysAppsShowAll', undefined, false);\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuSysAppsCheckProduct', true, true);\n    }\n\n    /**\n     * update according to productopts options,\n     * e.g. if you've set WideLines to true,\n     * Wide Lines should be checked on in the Draw menu.\n     * also called whenever selected vel changes,\n     * so that Copy {Button/Field} shows the right text.\n     */\n    updateUI512Els() {\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuPaintWideLines', this.vci.getOptionB('optWideLines'), true);\n\n        MenuPositioning.setItemStatus(this.vci.UI512App(), 'mnuPaintDrawMult', this.vci.getOptionB('optPaintDrawMult'), true);\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuPaintBlackLines',\n            this.vci.getOptionN('optPaintLineColor') === clrBlack,\n            true\n        );\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuPaintWhiteLines',\n            this.vci.getOptionN('optPaintLineColor') === clrWhite,\n            true\n        );\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuPaintBlackFill',\n            this.vci.getOptionN('optPaintFillColor') === clrBlack,\n            true\n        );\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuPaintWhiteFill',\n            this.vci.getOptionN('optPaintFillColor') === clrWhite,\n            true\n        );\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuPaintNoFill',\n            this.vci.getOptionN('optPaintFillColor') === -1,\n            true\n        );\n\n        MenuPositioning.setItemStatus(\n            this.vci.UI512App(),\n            'mnuUseHostClipboard',\n            this.vci.getOptionB('optUseHostClipboard'),\n            true\n        );\n\n        let grpBar = MenuPositioning.getMenuGroups(this.vci.UI512App())[0];\n\n        /* update day of year */\n        let topClock = grpBar.getEl('topClock');\n        topClock.set('labeltext', this.getDayOfYear());\n\n        let currentTool = this.vci.getOptionN('currentTool');\n        let toolCtg = getToolCategory(currentTool);\n        for (let i = VpcTool.__first; i <= VpcTool.__last; i++) {\n            let check = i === currentTool;\n            MenuPositioning.setItemStatus(this.vci.UI512App(), `mnuItemTool${i}`, check, true);\n        }\n\n        let selectedId = toolCtg === VpcToolCtg.CtgEdit ? this.vci.getOptionS('selectedVelId') : '';\n        this.refreshCopyPasteMnuItem(selectedId, 'mnuCopyCardOrVel', 'lngCopy Card', 'lngCopy Button', 'lngCopy Field');\n        let copiedId = this.vci.getOptionS('copiedVelId');\n        this.refreshCopyPasteMnuItem(copiedId, 'mnuPasteCardOrVel', 'lngPaste Card', 'lngPaste Button', 'lngPaste Field');\n    }\n\n    /**\n     * should we show 'copy button' or 'copy field'?\n     */\n    refreshCopyPasteMnuItem(id: string, menuId: string, fallback: string, txtBtn: string, txtFld: string) {\n        let found = this.vci.getModel().findByIdUntyped(id);\n        if (found && (found.getType() === VpcElType.Btn || found.getType() === VpcElType.Fld)) {\n            let txt = found.getType() === VpcElType.Btn ? txtBtn : txtFld;\n            MenuPositioning.setItemStatus(this.vci.UI512App(), menuId, undefined, undefined, lng(txt));\n        } else {\n            MenuPositioning.setItemStatus(this.vci.UI512App(), menuId, undefined, undefined, lng(fallback));\n        }\n    }\n\n    /**\n     * gets day of year,\n     * uses a locale-appropriate format.\n     */\n    protected getDayOfYear() {\n        let d = new Date();\n        return d.toLocaleDateString();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/menu/vpcMenuStructure.ts",
    "content": "\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512MenuDefn } from './../../ui512/menu/ui512MenuPositioning';\n/* auto */ import { KeyDownEventDetails } from './../../ui512/menu/ui512Events';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * provide menu structure and keybindings\n */\nexport abstract class VpcAppMenuStructure extends VpcUILayer {\n    constructor() {\n        super();\n        this.initkeymappings();\n    }\n\n    /**\n     * provide menu structure\n     * with syntax\n     * itemId|lngLabel|shortcutKey\n     */\n    protected getMenuStruct(): UI512MenuDefn[] {\n        return [\n            [\n                'mnuHeaderOS|icon:001:80:26',\n                [\n                    'mnuOSAbout|lngAbout ViperCard...|',\n                    'mnuOSDonate|lngDonate...|',\n                    '|---|',\n                    'mnuReportErr|lngReport an error...|',\n                    'mnuReportSec|lngReport security issue...|',\n                    'mnuFlagStack|lngFlag content...|'\n                ]\n            ],\n            [\n                'mnuHeaderFile|lngFile',\n                [\n                    'mnuNewStack|lngNew stack|',\n                    /* don't add Cmd-N yet, leads to errors */\n                    '|---|',\n                    'mnuOpen|lngOpen stack...|',\n                    /* don't add Cmd-O yet, leads to errors */\n                    '|---|',\n                    'mnuSave|lngSave stack|\\xBD S',\n                    'mnuSaveAs|lngSave stack as...|',\n                    'mnuExportStack|lngSave to .json...|',\n                    '|---|',\n                    'mnuShareALink|lngShare a link...|',\n                    'mnuPublishFeatured|lngPublish to featured...|',\n                    '|---|',\n                    'mnuQuit|lngQuit ViperCard|\\xBD U'\n                ]\n            ],\n            [\n                'mnuHeaderEdit|lngEdit',\n                [\n                    'mnuUndo|lngUndo|\\xBD Z',\n                    'mnuRedo|lngRedo|\\xBD Y',\n                    '|---|',\n                    'mnuCut|lngCut Text|\\xBD X',\n                    'mnuCopy|lngCopy Text|\\xBD C',\n                    'mnuPaste|lngPaste Text|\\xBD V',\n                    'mnuClear|lngClear|',\n                    '|---|',\n                    'mnuUseHostClipboard|lngUse OS Clipboard|',\n                    '|---|',\n                    'mnuCopyCardOrVel|lngCopy Card|',\n                    'mnuPasteCardOrVel|lngPaste Card|',\n                    '|---|',\n                    'mnuNewCard|lngNew Card|',\n                    'mnuDelCard|lngDelete Card|'\n                ]\n            ],\n            [\n                'mnuHeaderGo|lngGo',\n                [\n                    'mnuGoCardFirst|lngFirst|\\xBD 1',\n                    'mnuGoCardPrev|lngPrev|\\xBD 2',\n                    'mnuGoCardNext|lngNext|\\xBD 3',\n                    'mnuGoCardLast|lngLast|\\xBD 4',\n                    '|---|',\n                    'mnuMsgBox|lngMessage Box|\\xBD M'\n                ]\n            ],\n            [\n                'mnuHeaderTools|lngTools',\n                [\n                    'mnuItemTool3|lngBrowse|',\n                    'mnuItemTool4|lngButton|',\n                    'mnuItemTool5|lngField|',\n                    'mnuItemTool6|lngSelect|',\n                    'mnuItemTool7|lngBrush|',\n                    'mnuItemTool8|lngBucket|',\n                    'mnuItemTool9|lngStamp|',\n                    'mnuItemTool10|lngPencil|',\n                    'mnuItemTool11|lngLine|',\n                    'mnuItemTool12|lngLasso|',\n                    'mnuItemTool13|lngEraser|',\n                    'mnuItemTool14|lngRect|',\n                    'mnuItemTool15|lngOval|',\n                    'mnuItemTool16|lngRoundrect|',\n                    'mnuItemTool17|lngCurve|',\n                    'mnuItemTool18|lngSpray|'\n                ]\n            ],\n            [\n                'mnuHeaderObjects|lngObjects',\n                [\n                    'mnuCardInfo|lngCard Info...|',\n                    'mnuStackInfo|lngStack Info...|',\n                    '|---|',\n                    'mnuObjectsNewBtn|lngNew Button|',\n                    'mnuObjectsNewFld|lngNew Field|'\n                ]\n            ],\n            [\n                'mnuHeaderDraw|lngDraw',\n                [\n                    'mnuPaintWideLines|lngWide lines|',\n                    '|---|',\n                    'mnuPaintBlackLines|lngBlack lines|',\n                    'mnuPaintWhiteLines|lngWhite lines|',\n                    '|---|',\n                    'mnuPaintNoFill|lngNo fill|',\n                    'mnuPaintBlackFill|lngBlack fill|',\n                    'mnuPaintWhiteFill|lngWhite fill|',\n                    '|---|',\n                    'mnuPaintDrawMult|lngMultiple|',\n                    'mnuPaintManyCopies|lngMany copies...|',\n                    '|---|',\n                    'mnuExportGif|lngAnimated .gif...|'\n                ]\n            ],\n            [\n                'mnuHeaderFont|lngFont',\n                [\n                    'mnuItemSetFontChicago|lngChicago|',\n                    'mnuItemSetFontGeneva|lngGeneva|',\n                    'mnuItemSetFontCourier|lngCourier|',\n                    'mnuItemSetFontTimes|lngTimes|',\n                    'mnuItemSetFontNew York|lngNew York|',\n                    'mnuItemSetFontHelvetica|lngHelvetica|',\n                    'mnuItemSetFontMonaco|lngMonaco|',\n                    'mnuItemSetFontSymbol|lngSymbol|'\n                ]\n            ],\n            [\n                'mnuHeaderFontStyle|lngStyle',\n                [\n                    'mnuItemSetFontPlain|lngPlain|',\n                    'mnuItemSetFontBold|lngBold|',\n                    'mnuItemSetFontItalic|lngItalic|',\n                    'mnuItemSetFontUnderline|lngUnderline|',\n                    'mnuItemSetFontOutline|lngOutline|',\n                    'mnuItemSetFontCondense|lngCondense|',\n                    'mnuItemSetFontExtend|lngExtend|',\n                    'mnuItemSetFontGrayed|lngGrayed|',\n                    '|---|',\n                    'mnuItemSetFontAlignLeft|lngAlign Left|',\n                    'mnuItemSetFontAlignCenter|lngAlign Center|',\n                    '|---|',\n                    'mnuItemSetFont9|lng9|',\n                    'mnuItemSetFont10|lng10|',\n                    'mnuItemSetFont12|lng12|',\n                    'mnuItemSetFont14|lng14|',\n                    'mnuItemSetFont18|lng18|',\n                    'mnuItemSetFont24|lng24|'\n                ]\n            ],\n            ['topClock|lng12/28/18', 776, ['|lngPlaceholder|']],\n            [\n                'mnuHeaderHelpIcon|icon:001:75:27',\n                864,\n                [\n                    'mnuOSAbout2|lngAbout ViperCard...|',\n                    '|---|',\n                    'mnuDlgHelpExamples|lngExamples & Tutorials...|',\n                    'mnuDlgHelpReference|lngScript Reference...|'\n                ]\n            ],\n            [\n                'mnuHeaderAppIcon|icon:001:78:27',\n                891,\n                [\n                    'mnuSysAppsHideProduct|lngHide ViperCard|',\n                    'mnuSysAppsHideOthers|lngHide Others|',\n                    'mnuSysAppsShowAll|lngShow All|',\n                    '|---|',\n                    'mnuSysAppsCheckProduct|lngViperCard|'\n                ]\n            ]\n        ];\n    }\n\n    /* map key to either a menu id, or a custom function */\n    keyMappings: {\n        [key: string]: ((self: VpcAppMenuStructure) => O<string>) | string;\n    } = {};\n\n    /**\n     * populate keyMappings\n     */\n    initkeymappings() {\n        /*\n            Non-catchable chrome shortcuts :( include\n                Ctrl-T\n                Ctrl-W\n                Ctrl-N\n        */\n\n        this.keyMappings['ArrowLeft'] = 'onlyIfNotInTextField/mnuOnArrowLeft';\n        this.keyMappings['ArrowRight'] = 'onlyIfNotInTextField/mnuOnArrowRight';\n        this.keyMappings['ArrowUp'] = 'onlyIfNotInTextField/mnuOnArrowUp';\n        this.keyMappings['ArrowDown'] = 'onlyIfNotInTextField/mnuOnArrowDown';\n        this.keyMappings['Home'] = 'onlyIfNotInTextField/mnuGoCardFirst';\n        this.keyMappings['End'] = 'onlyIfNotInTextField/mnuGoCardLast';\n        this.keyMappings['Backspace'] = 'onlyIfNotInTextField/mnuClear';\n        this.keyMappings['Delete'] = 'onlyIfNotInTextField/mnuClear';\n        this.keyMappings['Cmd+E'] = 'mnuExportStack';\n        this.keyMappings['Cmd+S'] = 'mnuSave';\n        this.keyMappings['Cmd+Shift+S'] = 'mnuSaveAs';\n        this.keyMappings['Cmd+U'] = 'mnuQuit';\n        this.keyMappings['Cmd+1'] = 'mnuGoCardFirst';\n        this.keyMappings['Cmd+2'] = 'mnuGoCardPrev';\n        this.keyMappings['Cmd+3'] = 'mnuGoCardNext';\n        this.keyMappings['Cmd+4'] = 'mnuGoCardLast';\n        this.keyMappings['Cmd+M'] = 'mnuMsgBox';\n    }\n\n    /**\n     * from key event, to menu id\n     * returns menu id, or undefined if none found\n     */\n    translateHotkey(d: KeyDownEventDetails): O<string> {\n        if (!d.repeated) {\n            let mapped = this.keyMappings[d.readableShortcut];\n            if (typeof mapped === 'string') {\n                return mapped;\n            } else if (typeof mapped === 'function') {\n                return mapped(this);\n            } else {\n                return undefined;\n            }\n        }\n\n        return undefined;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/modelrender/vpcGifExport.ts",
    "content": "\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, cProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n/* auto */ import { getGIFEncoderInst } from './../../bridge/bridgeJsGif';\n/* auto */ import { bridgedSaveAs } from './../../bridge/bridgeFileSaver';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * export paint to GIF\n */\nexport class PaintGifExport {\n    elStatus: O<UI512ElLabel>;\n    constructor(\n        protected vci: VpcStateInterface,\n        protected cbRefreshCachedPaintForCard: (cardId: string) => [string, CanvasWrapper]\n    ) {}\n\n    /**\n     * begin gif export\n     */\n    begin(speed: number) {\n        this.init();\n        Util512Higher.syncToAsyncTransition(this.beginPaintExportToGif(speed), 'gif export', RespondToErr.ConsoleErrOnly);\n    }\n\n    /**\n     * create a temporary label element\n     */\n    protected init() {\n        let grp = this.vci.UI512App().findGroup('grpPaintExportToGif');\n        if (!grp) {\n            grp = new UI512ElGroup('grpPaintExportToGif');\n            this.vci.UI512App().addGroup(grp);\n        }\n\n        let labelElemId = 'labelPaintExportToGif' + Math.random();\n        this.elStatus = new UI512ElLabel(labelElemId);\n        grp.addElement(this.vci.UI512App(), this.elStatus);\n        this.elStatus.setDimensions(this.vci.userBounds()[0] + this.vci.userBounds()[2] + 10, 300, 40, 40);\n        this.elStatus.set('w', this.vci.bounds()[2] - this.elStatus.x);\n    }\n\n    /**\n     * delete our temporary label element\n     */\n    protected teardown() {\n        let grp = this.vci.UI512App().findGroup('grpPaintExportToGif');\n        if (grp && this.elStatus) {\n            grp.removeElement(this.elStatus.id);\n            this.elStatus = undefined;\n            if (grp.countElems() === 0) {\n                this.vci.UI512App().removeGroup('grpPaintExportToGif');\n            }\n        }\n    }\n\n    /**\n     * set status, s is untranslated, s2 is already translated\n     */\n    protected setStatus(s: string, s2 = '') {\n        if (this && this.elStatus && this.elStatus.set) {\n            this.elStatus.set('labeltext', lng(s) + ' ' + s2);\n        }\n    }\n\n    /**\n     * begin to export the gif\n     * no exceptions thrown\n     *\n     * let's not use TemporarilySuspendEvents, so that the ui is not stuck if the\n     * GIFEncoder is somehow stuck in a long operation\n     */\n    async beginPaintExportToGif(speed: number) {\n        try {\n            this.setStatus('lngLoading .gif creation module...');\n            await Util512Higher.asyncLoadJsIfNotAlreadyLoaded('/external/jsgif-dynamic/jsgifcombined.js');\n            this.setStatus('lngBegin .gif export.');\n\n            if (speed < 1 || speed > 10) {\n                await this.showMsgAndClose('lngSpeed should be between 1 and 10');\n                return;\n            }\n\n            let framesTodo = this.vci.getModel().stack.bgs[0].cards.length;\n            let encoder = this.getEncoder(speed);\n            for (let i = 0; i < framesTodo; i++) {\n                this.setStatus(`lngFrame ${i + 1} of ${framesTodo}...`);\n                await Util512Higher.sleep(100);\n                let cds = this.vci.getModel().stack.bgs[0].cards;\n                let cardId = cds[i].idInternal;\n                let currentlyCachedIm = this.cbRefreshCachedPaintForCard(cardId)[1];\n                checkThrow(encoder.addFrame(currentlyCachedIm.context), `KT|addFrame() returned false on cd ${i + 1}.`);\n            }\n\n            await Util512Higher.sleep(100);\n            encoder.finish();\n            let blob = new Blob([encoder.getUint8Array()], { type: 'image/gif' });\n            bridgedSaveAs()(blob, `made with ${cProductName}.gif`);\n\n            return this.showMsgAndClose('lngCreating .gif complete.');\n        } catch (e) {\n            return this.showMsgAndClose('lngErr: ' + e.toString());\n        }\n    }\n\n    /**\n     * get encoder and set the gif speed\n     */\n    protected getEncoder(speed: number) {\n        /* 1-> 0.5 fps, 10-> 20fps */\n        let fpsDesired = 0.5 + (speed - 1) * (19.5 / 9);\n        let delay = Math.round(1000 / fpsDesired);\n        let encoder = getGIFEncoderInst();\n\n        /* loop forever */\n        encoder.setRepeat(0);\n\n        /* next frame every n milliseconds */\n        encoder.setDelay(delay);\n\n        checkThrow(encoder.start(), 'KS|start() returned false.');\n        return encoder;\n    }\n\n    /**\n     * show a message, and then close\n     */\n    protected async showMsgAndClose(msg: string) {\n        this.setStatus(msg);\n        await Util512Higher.sleep(2000);\n        this.setStatus('');\n        this.teardown();\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/modelrender/vpcModelRender.ts",
    "content": "\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { VpcElType, VpcToolCtg, checkThrow, checkThrowInternal, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElField, VpcFldStyleInclScroll } from './../../vpc/vel/velField';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { ElementObserver, ElementObserverVal, UI512PublicSettable } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * loop through the vels on the page and create UI512elements to be rendered\n * map changes to a vel to a change in the corresponding UI512element\n */\nexport class VpcModelRender extends VpcUILayer implements ElementObserver {\n    grp: UI512ElGroup;\n    directMapProperty: { [key: string]: string } = {};\n    indirectProperty: {\n        [key: string]: (vel: VpcElBase, el: UI512Element, newVal: ElementObserverVal) => void;\n    } = {};\n    propertiesCouldUnFocus: { [key: string]: boolean } = {};\n\n    /* cause VPC UI to be redrawn */\n    needUIToolsRedraw = true;\n\n    /* cause VPC UI and also every vel to be redrawn */\n    needFullRedraw = true;\n\n    /* when a script has just unlocked the screen, need to redraw */\n    needFullRedrawBecauseScreenWasLocked = true;\n\n    /**\n     * create our UI512ElGroup and intialize property maps\n     */\n    init() {\n        this.grp = new UI512ElGroup('VpcModelRender');\n        this.vci.UI512App().addGroup(this.grp);\n        this.initButtonProps();\n        this.initFieldProps();\n        this.initLocationProps();\n    }\n\n    /**\n     * when a script has just unlocked the screen, need to redraw\n     */\n    checkIfScreenWasJustUnlocked() {\n        let screenlocked = this.vci.getOptionB('screenLocked');\n        if (!screenlocked && this.needFullRedrawBecauseScreenWasLocked) {\n            this.needFullRedraw = true;\n            this.needFullRedrawBecauseScreenWasLocked = false;\n        }\n    }\n\n    /**\n     * when this layer is refreshed, and a fullredraw is needed, redraw everything from scratch\n     */\n    updateUI512Els() {\n        if (this.needFullRedraw) {\n            this.fullRedrawFromScratch();\n            this.needFullRedraw = false;\n        }\n    }\n\n    /**\n     * on the next render(), redraw everything\n     */\n    fullRedrawNeeded() {\n        this.needFullRedraw = true;\n        this.needUIToolsRedraw = true;\n    }\n\n    /**\n     * on the next render(), redraw the ui\n     */\n    uiRedrawNeeded() {\n        this.needUIToolsRedraw = true;\n    }\n\n    /**\n     * a change has been seen\n     */\n    changeSeen(context: ChangeContext, velId: string, propName: string, prev: ElementObserverVal, newVal: ElementObserverVal) {\n        if (!this.vci) {\n            checkThrow(\n                propName.startsWith('increasingnum') || propName.startsWith('cardorder') || propName.startsWith('name'),\n                'KV|we only expect increasingnum or cardorder to be changed before init()'\n            );\n            return;\n        }\n\n        let vel = this.vci.getModel().findByIdUntyped(velId);\n        if (vel) {\n            this.applyOneChangeIfApplicable(vel, propName, newVal, false);\n        }\n    }\n\n    /**\n     * getting properties from a vel is complicated\n     * because sometimes you have to look via the current card\n     */\n    protected getCardSpecific(vel: VpcElBase, propName: string, currentCardId: string) {\n        let spl = propName.split('_oncard_');\n        if (spl.length > 1) {\n            let shortPropname = spl[0];\n            let propCardname = spl[1];\n            if (vel.isCardSpecificContent(shortPropname)) {\n                return propCardname === currentCardId ? shortPropname : '______';\n            } else {\n                return '______';\n            }\n        } else {\n            if (vel.isCardSpecificContent(propName)) {\n                return '______';\n            } else {\n                return propName;\n            }\n        }\n    }\n\n    /**\n     * apply the change, if the vel type is one we listen to\n     * for example, if change is to a vel on a different card, ignore the change\n     */\n    protected applyOneChangeIfApplicable(vel: VpcElBase, propName: string, newVal: ElementObserverVal, fromScratch: boolean) {\n        /* translate from card-specific content */\n        let type = vel.getType();\n        let currentCardId = this.vci.getOptionS('currentCardId');\n        if (type === VpcElType.Btn || type === VpcElType.Fld) {\n            propName = this.getCardSpecific(vel, propName, currentCardId);\n        }\n\n        let screenlocked = this.vci.getOptionB('screenLocked');\n        if (type === VpcElType.Product && propName === 'suggestedIdleRate') {\n            this.changeIdleRate(newVal);\n        } else if (screenlocked) {\n            this.needFullRedrawBecauseScreenWasLocked = true;\n        } else if (propName === 'script') {\n            this.needUIToolsRedraw = true;\n        } else if (type === VpcElType.Fld || type === VpcElType.Btn) {\n            if (vel.parentIdInternal === currentCardId) {\n                this.applyOneChange(vel, propName, newVal, fromScratch);\n            }\n        } else if (type === VpcElType.Card && vel.idInternal === currentCardId) {\n            if (propName === 'paint') {\n                this.needUIToolsRedraw = true;\n            }\n        } else if (type === VpcElType.Product) {\n            this.needUIToolsRedraw = true;\n            if (propName === 'currentCardId') {\n                this.fullRedrawNeeded();\n            }\n        }\n    }\n\n    /**\n     * helper function for refreshing a label\n     */\n    protected refreshLabelWithFont(vel: VpcElBase, target: UI512Element) {\n        if (vel instanceof VpcElButton) {\n            let lbl = vel.getB('showlabel') ? UI512DrawText.setFont(vel.getS('label'), vel.getFontAsUI512()) : '';\n            target.set('labeltext', lbl);\n        } else {\n            checkThrowInternal(false, `6+|expected button`);\n        }\n    }\n\n    /**\n     * redraw all vels on the card, from scratch\n     */\n    protected fullRedrawFromScratch() {\n        let currentCardId = this.vci.getOptionS('currentCardId');\n        let currentCard = this.vci.getModel().getCardById(currentCardId);\n        this.grp.removeAllEls();\n        for (let i = 0, len = currentCard.parts.length; i < len; i++) {\n            let part = currentCard.parts[i];\n            if (part instanceof VpcElButton) {\n                this.buildBtnFromScratch(part, currentCardId);\n            } else if (part instanceof VpcElField) {\n                this.buildFldFromScratch(part, currentCardId);\n            } else {\n                checkThrowInternal(false, '6*|invalid part type');\n            }\n        }\n\n        this.seeIfCurrentFocusMakesSense();\n\n        for (let i = 0, len = currentCard.parts.length; i < len; i++) {\n            /* change something on an ui512el to trigger redraw */\n            let target = this.findVelIdToEl(currentCard.parts[0].idInternal);\n            if (target) {\n                target.set('x', target.getN('x') + 1);\n                target.set('x', target.getN('x') - 1);\n                break;\n            }\n        }\n    }\n\n    /**\n     * does this ui512element id belong to a vel or to the vpc background?\n     */\n    isVelOrBaseLayer(id: string) {\n        return id.startsWith('VpcModelRender$$') && !id.includes('##sb##');\n    }\n\n    /**\n     * from ui512element id to vel id, or undefined\n     */\n    elIdToVelId(id: string): O<string> {\n        if (id.includes('##sb##')) {\n            /* scrollbar parts aren't considered part of the vel */\n            return undefined;\n        } else if (id === 'VpcModelRender$$baselayer') {\n            return undefined;\n        } else if (id.startsWith('VpcModelRender$$')) {\n            return id.substr('VpcModelRender$$'.length);\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * from ui512element id to vel, or undefined\n     */\n    findElIdToVel(id: string): O<VpcElBase> {\n        let card = this.vci.getModel().getCurrentCard();\n        let vel = this.vci.getModel().findByIdUntyped(this.elIdToVelId(id));\n        if (vel && vel.parentIdInternal === card.idInternal) {\n            return vel;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * from vel id to ui512element id\n     */\n    velIdToElId(id: string): string {\n        return 'VpcModelRender$$' + id;\n    }\n\n    /**\n     * from vel id to ui512element, or undefined\n     */\n    findVelIdToEl(id: string) {\n        return this.grp.findEl('VpcModelRender$$' + id);\n    }\n\n    /**\n     * from vel id to ui512element, or throw\n     */\n    getVelIdToEl(id: string) {\n        return this.grp.getEl('VpcModelRender$$' + id);\n    }\n\n    /**\n     * build a button from scratch\n     */\n    protected buildBtnFromScratch(vel: VpcElButton, currentCardId: string) {\n        let target = new UI512ElButton(this.velIdToElId(vel.idInternal));\n        this.grp.addElement(this.vci.UI512App(), target);\n        let keys = Util512.getMapKeys(vel);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            let prop = keys[i];\n            if (prop.startsWith('_') && prop[1] !== '_') {\n                prop = prop.slice(1);\n                let newVal = vel.getGeneric(prop);\n                this.applyOneChange(vel, prop, newVal, true);\n            }\n        }\n    }\n\n    /**\n     * build a field from scratch\n     */\n    protected buildFldFromScratch(vel: VpcElField, currentCardId: string) {\n        let target = new UI512ElTextField(this.velIdToElId(vel.idInternal));\n        this.grp.addElement(this.vci.UI512App(), target);\n        let keys = Util512.getMapKeys(vel);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            let prop = keys[i];\n            if (prop.startsWith('_') && prop[1] !== '_') {\n                prop = prop.slice(1);\n                let newVal = vel.getGeneric(prop);\n                this.applyOneChange(vel, prop, newVal, true);\n            }\n        }\n\n        target.setFmTxt(vel.getFmTxt());\n    }\n\n    /**\n     * apply one change,\n     * mapping a vel change to a ui512element change\n     */\n    protected applyOneChange(vel: VpcElBase, propName: string, newVal: ElementObserverVal, fromScratch: boolean) {\n        assertTrue(vel.getType() === VpcElType.Fld || vel.getType() === VpcElType.Btn, 'KU|');\n        let key = vel.getType().toString() + '/' + propName;\n        let target = this.findVelIdToEl(vel.idInternal);\n        if (target) {\n            let fnSetProperty = this.indirectProperty[key];\n            let ui512propname = this.directMapProperty[key];\n            if (fnSetProperty !== undefined) {\n                fnSetProperty(vel, target, newVal);\n            } else if (ui512propname !== undefined) {\n                target.set(ui512propname, newVal);\n            } else if (propName === UI512PublicSettable.fmtTxtVarName) {\n                assertTrue(newVal instanceof FormattedText, '6)|bad formatted text', vel.idInternal);\n                target.setFmTxt(newVal);\n            } else {\n                /* it's a property that doesn't impact rendering. that's ok. */\n            }\n        } else if (!this.needFullRedraw && !this.needFullRedrawBecauseScreenWasLocked) {\n            assertWarn(false, `6(|did not find rendered corresponing ${vel.idInternal}`);\n        }\n\n        if (!fromScratch && this.propertiesCouldUnFocus[key]) {\n            /* e.g. if we've set the locktext on the focused field to true, move the focus */\n            this.seeIfCurrentFocusMakesSense();\n        }\n    }\n\n    /**\n     * change the onIdle rate\n     */\n    protected changeIdleRate(s: ElementObserverVal) {\n        if (typeof s === 'string') {\n            getRoot().setTimerRate(s.toString());\n        }\n    }\n\n    /**\n     * can the field have focus, given its properties\n     */\n    static canFieldHaveFocus(vel: VpcElField) {\n        return vel.getB('enabled') && !vel.getB('locktext') && vel.getB('visible');\n    }\n\n    /**\n     * e.g. if we've set the locktext on the focused field to true, move the focus\n     */\n    seeIfCurrentFocusMakesSense() {\n        let focusedId = this.vci.getCurrentFocus();\n        if (!focusedId || !focusedId.startsWith('VpcModelRender$$')) {\n            /* if it's another ui element like a box in edit panel having focus, ok */\n            return;\n        }\n\n        let focusedVel = this.findElIdToVel(focusedId);\n        if (!(focusedVel instanceof VpcElField)) {\n            /* missing or non-field focus */\n            this.vci.setCurrentFocus(undefined);\n        } else if (!VpcModelRender.canFieldHaveFocus(focusedVel)) {\n            /* field not enabled/visible */\n            this.vci.setCurrentFocus(undefined);\n        } else {\n            let parent = this.vci.getModel().getCardById(focusedVel.parentIdInternal);\n            let currentCardId = this.vci.getModel().productOpts.getS('currentCardId');\n            if (parent.getType() === VpcElType.Card && parent.idInternal !== currentCardId) {\n                /* field not on the current card */\n                this.vci.setCurrentFocus(undefined);\n            }\n        }\n    }\n\n    /**\n     * map setting the position\n     */\n    protected initLocationProps() {\n        for (let type of [VpcElType.Btn, VpcElType.Fld]) {\n            this.directMapProperty[type + '/w'] = 'w';\n            this.directMapProperty[type + '/h'] = 'h';\n            this.indirectProperty[type + '/x'] = (vel, el, newVal) => {\n                el.set('x', this.vci.userBounds()[0] + (newVal as number));\n            };\n\n            this.indirectProperty[type + '/y'] = (vel, el, newVal) => {\n                el.set('y', this.vci.userBounds()[1] + (newVal as number));\n            };\n        }\n    }\n\n    /**\n     * map setting field properties\n     */\n    protected initFieldProps() {\n        this.indirectProperty[VpcElType.Fld + '/dontwrap'] = (vel, el, newVal) => {\n            el.set('labelwrap', !newVal);\n        };\n\n        this.indirectProperty[VpcElType.Fld + '/singleline'] = (vel, el, newVal) => {\n            el.set('multiline', !newVal);\n        };\n\n        this.indirectProperty[VpcElType.Fld + '/enabled'] = (vel, el, newVal) => {\n            let isEdit = getToolCategory(this.vci.getOptionN('currentTool')) === VpcToolCtg.CtgEdit;\n            el.set('enabledstyle', newVal);\n            el.set('enabled', isEdit ? true : newVal);\n        };\n\n        this.indirectProperty[VpcElType.Fld + '/locktext'] = (vel, el, newVal) => {\n            el.set('canselecttext', !newVal);\n            el.set('canedit', !newVal);\n        };\n\n        this.directMapProperty[VpcElType.Fld + '/selcaret'] = 'selcaret';\n        this.directMapProperty[VpcElType.Fld + '/selend'] = 'selend';\n        this.directMapProperty[VpcElType.Fld + '/scroll'] = 'scrollamt';\n        this.indirectProperty[VpcElType.Fld + '/style'] = (vel, el, newVal) => {\n            let wasScroll = el.getB('scrollbar');\n            if (newVal === VpcFldStyleInclScroll.Scrolling) {\n                el.set('style', UI512FldStyle.Rectangle);\n                el.set('scrollbar', true);\n            } else {\n                el.set('style', newVal);\n                el.set('scrollbar', false);\n            }\n            if (wasScroll !== el.getB('scrollbar')) {\n                this.vci.getPresenter().rebuildFieldScrollbars();\n            }\n        };\n\n        this.directMapProperty[VpcElType.Fld + '/scrollbar'] = 'scrollbar';\n        this.indirectProperty[VpcElType.Fld + '/visible'] = (vel, el, newVal) => {\n            let isEdit = getToolCategory(this.vci.getOptionN('currentTool')) === VpcToolCtg.CtgEdit;\n            el.set('visible', isEdit ? true : newVal);\n        };\n\n        this.indirectProperty[VpcElType.Fld + '/textalign'] = (vel, el, newVal) => {\n            el.set('labelhalign', newVal !== 'left');\n        };\n\n        /* these ones should make us call seeIfCurrentFocusMakesSense() */\n        this.propertiesCouldUnFocus[VpcElType.Fld + '/enabled'] = true;\n        this.propertiesCouldUnFocus[VpcElType.Fld + '/locktext'] = true;\n        this.propertiesCouldUnFocus[VpcElType.Fld + '/visible'] = true;\n    }\n\n    /**\n     * map setting button properties\n     */\n    protected initButtonProps() {\n        this.directMapProperty[VpcElType.Btn + '/autohilite'] = 'autohighlight';\n        this.indirectProperty[VpcElType.Btn + '/enabled'] = (vel, el, newVal) => {\n            let isEdit = getToolCategory(this.vci.getOptionN('currentTool')) === VpcToolCtg.CtgEdit;\n            el.set('enabledstyle', newVal);\n            el.set('enabled', isEdit ? true : newVal);\n        };\n\n        this.directMapProperty[VpcElType.Btn + '/hilite'] = 'highlightactive';\n        this.directMapProperty[VpcElType.Btn + '/checkmark'] = 'checkmark';\n        this.indirectProperty[VpcElType.Btn + '/icon'] = (vel, el, newVal) => {\n            el.set('iconnumber', (newVal as number) - 1);\n            el.set('icongroupid', getIconGroupId(vel, el, newVal));\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/showlabel'] = (vel, el, newVal) => {\n            this.refreshLabelWithFont(vel, el);\n        };\n\n        this.directMapProperty[VpcElType.Btn + '/style'] = 'style';\n        this.indirectProperty[VpcElType.Btn + '/label'] = (vel, el, newVal) => {\n            el.set('labeltext', newVal);\n            this.refreshLabelWithFont(vel, el);\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/textfont'] = (vel, el, newVal) => {\n            this.refreshLabelWithFont(vel, el);\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/textsize'] = (vel, el, newVal) => {\n            this.refreshLabelWithFont(vel, el);\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/textstyle'] = (vel, el, newVal) => {\n            this.refreshLabelWithFont(vel, el);\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/textalign'] = (vel, el, newVal) => {\n            el.set('labelhalign', newVal !== 'left');\n        };\n\n        this.indirectProperty[VpcElType.Btn + '/visible'] = (vel, el, newVal) => {\n            let isEdit = getToolCategory(this.vci.getOptionN('currentTool')) === VpcToolCtg.CtgEdit;\n            el.set('visible', isEdit ? true : newVal);\n        };\n    }\n}\n\n/**\n * certain stacks, instead of using default icon set, use another icon set\n */\nfunction getIconGroupId(vel: VpcElBase, el: UI512Element, newVal: ElementObserverVal) {\n    if (!newVal) {\n        return '';\n    } else if (vel.getS('name').startsWith('gliderSprites')) {\n        return 'gliderSprites';\n    } else if (vel.getS('name').startsWith('gliderBg')) {\n        return 'gliderBg';\n    } else if (vel.getS('name').startsWith('spacegameSprites')) {\n        return 'spacegame';\n    } else {\n        return '002';\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/modelrender/vpcPaintRender.ts",
    "content": "\n/* auto */ import { VpcOutsideImpl } from './../state/vpcOutsideImpl';\n/* auto */ import { VpcStateInterface, VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { PaintGifExport } from './vpcGifExport';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MapKeyToObjectCanSet, arLast, cast } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { UI512ImageSerialization } from './../../ui512/draw/ui512ImageSerialization';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvCanvas } from './../../ui512/draw/ui512DrawPainter';\n/* auto */ import { UI512PaintDispatch, UI512PaintDispatchShapes } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * drawing paint to the canvas\n *\n * draws the main background paint for the card,\n * also, draws the temporary shapes while the user is clicking/dragging to paint,\n * which will later be committed to the background paint\n */\nexport class VpcPaintRender extends VpcUILayer {\n    vci: VpcStateInterface;\n    canvasesByCardId = new MapKeyToObjectCanSet<[string, CanvasWrapper]>();\n    canvasesForPainting: CanvasWrapper[] = [];\n    paintGrp: UI512ElGroup;\n    userPaintW = -1;\n    userPaintH = -1;\n    constructor() {\n        super();\n    }\n\n    /**\n     * create our ui512element group\n     */\n    init(pr: UI512PresenterBase) {\n        this.userPaintW = this.vci.userBounds()[2];\n        this.userPaintH = this.vci.userBounds()[3];\n        this.paintGrp = new UI512ElGroup('VpcPaintRender');\n        this.vci.UI512App().addGroup(this.paintGrp);\n        this.makeAndAddFullsizeEl('VpcModelRender$$baselayer');\n    }\n\n    /**\n     * we paint onto a hidden canvas, and\n     * use a UI512ElCanvasPiece to draw a piece of this canvas onto the main canvas\n     */\n    updateUI512Els(): void {\n        let mainPaint = cast(UI512ElCanvasPiece, this.vci.UI512App().getEl('VpcModelRender$$baselayer'));\n        let currentCardId = this.vci.getModel().productOpts.getS('currentCardId');\n        let currentlyCachedIm = this.refreshCachedPaintForCard(currentCardId)[1];\n        mainPaint.setCanvas(currentlyCachedIm);\n    }\n\n    /**\n     * make a full-size canvas piece\n     */\n    makeAndAddFullsizeEl(id: string) {\n        let el = new UI512ElCanvasPiece(id);\n        this.paintGrp.addElement(this.vci.UI512App(), el);\n        el.set('x', this.vci.userBounds()[0]);\n        el.set('y', this.vci.userBounds()[1]);\n        el.set('w', this.vci.userBounds()[2]);\n        el.set('h', this.vci.userBounds()[3]);\n        return el;\n    }\n\n    /**\n     * refresh cached paint for the card\n     */\n    refreshCachedPaintForCard(cardId: string) {\n        let cd = this.vci.getModel().getCardById(cardId);\n        let currentVersion = cd.getS('paint');\n        let currentlyCached = this.canvasesByCardId.find(cardId);\n\n        if (!currentlyCached) {\n            currentlyCached = ['(placeholder)', CanvasWrapper.createMemoryCanvas(this.userPaintW, this.userPaintH)];\n            this.canvasesByCardId.set(cardId, currentlyCached);\n        }\n\n        if (currentlyCached[0] !== currentVersion) {\n            currentlyCached[0] = currentVersion;\n            UI512ImageSerialization.loadFromString(currentlyCached[1], cd.getS('paint'));\n        }\n\n        return currentlyCached;\n    }\n\n    /**\n     * release objects that we're no longer using\n     */\n    doMaintenance() {\n        let keys = this.canvasesByCardId.getKeys().slice();\n        for (let cardId of keys) {\n            if (!this.vci.getModel().findById(VpcElCard, cardId)) {\n                this.canvasesByCardId.remove(cardId);\n            }\n        }\n    }\n\n    /**\n     * clear all temporary paint elements\n     */\n    deleteTempPaintEls() {\n        let mainPaint = this.vci.UI512App().getEl('VpcModelRender$$baselayer');\n        this.paintGrp.removeAllEls();\n        this.paintGrp.addElement(this.vci.UI512App(), mainPaint);\n    }\n\n    /**\n     * get the main background paint hidden canvas piece\n     */\n    getBaseLayer(): UI512ElCanvasPiece {\n        return cast(UI512ElCanvasPiece, this.vci.UI512App().getEl('VpcModelRender$$baselayer'));\n    }\n\n    /**\n     * get one of our cached temporary canvases, create if necessary\n     */\n    getTemporaryCanvas(n: number, w = -1, h = -1) {\n        if (w === -1 || h === -1) {\n            w = this.userPaintW;\n            h = this.userPaintH;\n        }\n\n        if (this.canvasesForPainting[n] === undefined) {\n            this.canvasesForPainting[n] = CanvasWrapper.createMemoryCanvas(w, h);\n        }\n\n        if (this.canvasesForPainting[n].canvas.width !== w || this.canvasesForPainting[n].canvas.height !== h) {\n            this.canvasesForPainting[n].resizeAndClear(w, h);\n        }\n\n        this.canvasesForPainting[n].clear();\n        return this.canvasesForPainting[n];\n    }\n\n    /**\n     * comit moving a rectangle\n     */\n    commitRectangleMove(incoming: CanvasWrapper, offsetX: number, offsetY: number, x: number, y: number, w: number, h: number) {\n        this.commitPaintOps((mainCanvas, painter) => {\n            let argsMask = new UI512PaintDispatch(\n                UI512PaintDispatchShapes.ShapeRectangle,\n                [x, x + w],\n                [y, y + h],\n                clrWhite,\n                clrWhite,\n                true,\n                1\n            );\n            UI512PaintDispatch.go(argsMask, painter);\n            mainCanvas.drawFromImage(\n                incoming.canvas,\n                0,\n                0,\n                incoming.canvas.width,\n                incoming.canvas.height,\n                offsetX,\n                offsetY,\n                0,\n                0,\n                mainCanvas.canvas.width,\n                mainCanvas.canvas.height\n            );\n        });\n    }\n\n    /**\n     * commit deleting a rectangle\n     */\n    commitRectangleDelete(x: number, y: number, w: number, h: number) {\n        this.commitPaintOps((mainCanvas, painter) => {\n            let argsMask = new UI512PaintDispatch(\n                UI512PaintDispatchShapes.ShapeRectangle,\n                [x, x + w],\n                [y, y + h],\n                clrWhite,\n                clrWhite,\n                true,\n                1\n            );\n            UI512PaintDispatch.go(argsMask, painter);\n        });\n    }\n\n    /**\n     * commit paint bucket (floodfill)\n     */\n    commitPaintBucket(x: number, y: number) {\n        this.commitPaintOps((mainCanvas, painter) => {\n            let args = this.argsFromCurrentOptions([x], [y]);\n            UI512PaintDispatch.go(args, painter);\n        });\n    }\n\n    /**\n     * commit one or more drawing images onto an image\n     */\n    commitImageOntoImage(incoming: CanvasWrapper[], offsetX: number, offsetY: number) {\n        this.commitPaintOps((mainCanvas, painter) => {\n            for (let i = 0, len = incoming.length; i < len; i++) {\n                let im = incoming[i];\n                mainCanvas.drawFromImage(\n                    im.canvas,\n                    0,\n                    0,\n                    im.canvas.width,\n                    im.canvas.height,\n                    offsetX,\n                    offsetY,\n                    0,\n                    0,\n                    mainCanvas.canvas.width,\n                    mainCanvas.canvas.height\n                );\n            }\n        });\n    }\n\n    /**\n     * commit an html image onto an image\n     */\n    commitHtmlImageOntoImage(im: HTMLImageElement, offsetX: number, offsetY: number, srcw: number, srch: number) {\n        this.commitPaintOps((mainCanvas, painter) => {\n            mainCanvas.drawFromImage(\n                im,\n                0,\n                0,\n                srcw,\n                srch,\n                offsetX,\n                offsetY,\n                0,\n                0,\n                mainCanvas.canvas.width,\n                mainCanvas.canvas.height\n            );\n        });\n    }\n\n    /**\n     * draw a \"smear\" (pencil/brush/etc tool)\n     */\n    drawPartialSmear(\n        xPts: number[],\n        yPts: number[],\n        elPiece: O<UI512ElCanvasPiece>,\n        painter: UI512Painter,\n        setShape?: UI512PaintDispatchShapes\n    ) {\n        let args = this.argsFromCurrentOptions(xPts, yPts);\n        if (setShape) {\n            args.shape = setShape;\n        }\n\n        UI512PaintDispatch.go(args, painter);\n        if (elPiece) {\n            elPiece.getCanvasForWrite();\n        }\n    }\n\n    /**\n     * draw a \"shape\" (oval/rectangle/etc tool)\n     */\n    drawPartialShape(xPts: number[], yPts: number[], elPiece: UI512ElCanvasPiece, painter: UI512Painter) {\n        elPiece.getCanvasForWrite();\n        return this.drawPartialSmear(xPts, yPts, elPiece, painter);\n    }\n\n    /**\n     * get a UI512PaintDispatch object\n     */\n    protected argsFromCurrentOptions(xPts: number[], yPts: number[]) {\n        let outside = new VpcOutsideImpl();\n        outside.vci = this.vci;\n        let args = outside.MakeUI512PaintDispatchFromCurrentOptions(true, ModifierKeys.None);\n        args.xPts = xPts;\n        args.yPts = yPts;\n        return args;\n    }\n\n    /**\n     * commit paint operations\n     * (writes a serialized copy of the paint data to the card vel, for undoability)\n     * slower than it needs to be, since it doesn't need to be deserialized, but\n     * it's also nice to know that everything that was serialized works\n     */\n    protected commitPaintOps(fn: (mainCanvas: CanvasWrapper, pnt: UI512Painter) => void) {\n        /* make sure we have the latest paint */\n        this.updateUI512Els();\n        let mainCanvas = this.getBaseLayer().getCanvasForWrite();\n        let painter = new UI512PainterCvCanvas(mainCanvas, mainCanvas.canvas.width, mainCanvas.canvas.height);\n        fn(mainCanvas, painter);\n        let serialized = UI512ImageSerialization.writeToString(mainCanvas);\n        let currentCardId = this.vci.getModel().productOpts.getS('currentCardId');\n        let currentCard = this.vci.getModel().getCardById(currentCardId);\n        currentCard.setOnVel('paint', serialized, this.vci.getModel());\n    }\n\n    /**\n     * commit simulated paint actions\n     */\n    commitSimulatedClicks(queue: UI512PaintDispatch[]) {\n        let currentCard = '';\n        let queuesPerCard: UI512PaintDispatch[][] = [];\n        for (let item of queue) {\n            if (item.cardId === currentCard) {\n                arLast(queuesPerCard).push(item);\n            } else {\n                queuesPerCard.push([]);\n                arLast(queuesPerCard).push(item);\n                currentCard = item.cardId;\n            }\n        }\n\n        for (let queuePerCard of queuesPerCard) {\n            let cd = this.vci.getModel().getCardById(queuePerCard[0].cardId);\n            let cvs = this.refreshCachedPaintForCard(cd.idInternal)[1];\n            let painter = new UI512PainterCvCanvas(cvs, cvs.canvas.width, cvs.canvas.height);\n\n            for (let item of queuePerCard) {\n                UI512PaintDispatch.go(item, painter);\n            }\n\n            let serialized = UI512ImageSerialization.writeToString(cvs);\n            cd.setOnVel('paint', serialized, this.vci.getModel());\n        }\n    }\n\n    /**\n     * export to gif\n     */\n    paintExportToGif(pr: UI512Presenter, speed: number) {\n        let gif = new PaintGifExport(this.vci, cardId => this.refreshCachedPaintForCard(cardId));\n        gif.begin(speed);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcDocViewer.ts",
    "content": "\n/* auto */ import { VpcNonModalBase, VpcNonModalFormBase } from './vpcLyrNonModalHolder';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { RectUtils } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, tostring } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, cast } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { WndBorderDecorationConsts } from './../../ui512/composites/ui512Composites';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * documentation viewer\n * used for both\n * \"examples\" (currently points to youtube example videos)\n * and\n * \"reference\" (complete scripting reference)\n */\nexport class VpcNonModalDocViewer extends VpcNonModalBase {\n    compositeType = 'VpcNonModalDocViewer';\n    hasCloseBtn = true;\n    adjustedStartVidBtn = false;\n    cbShowVids: O<() => void>;\n    constructor(protected vci: VpcStateInterface, public type: DialogDocsType) {\n        super('VpcNonModalDocViewer' + Math.random());\n\n        /* set size of window. LargeWindowBounds is an alternative */\n        VpcNonModalFormBase.standardWindowBounds(this, vci);\n    }\n\n    /**\n     * data for examples\n     */\n    readonly examplesInfo: [string, string, number][] = [\n        ['vid1', 'lngVideo: Animation', 1],\n        ['vid2', 'lngVideo: Game', 1],\n        ['vid3', 'lngVideo: Art', 1]\n    ];\n\n    /**\n     * data for script reference\n     */\n    readonly referenceInfo: [string, string, string[]][] = [\n        /* prettier-ignore */\n        [\"overview\", \"lngOverview\", [\"Introduction\", \"Scripting\", \"Expressions\", \"Message Box\", \"Lists/Arrays\", \"Variables\", \"User Functions\", \"Text and Chunks\", \"Objects\", \"Structure\", \"Examples\", \"Tips & Shortcuts\", \"What's New\", \"Credits\"]],\n        /* prettier-ignore */\n        [\"commands\", \"lngCommands\", [\"add\", \"answer\", \"ask\", \"beep\", \"choose tool\", \"click\", \"create\", \"do\", \"doMenu\", \"dial\", \"disable\", \"divide\", \"delete \", \"drag\", \"enable\", \"go to card\", \"hide\", \"multiply\", \"lock screen\", \"play\", \"put\", \"replace\", \"select\", \"send\", \"set\", \"show\", \"sort\", \"subtract\", \"unlock screen\", \"wait\", \"visual effect\"]],\n        /* prettier-ignore */\n        [\"syntax\", \"lngSyntax\", [\"(Operators)\", \"(Constants)\", \"global\", \"if/then\", \"short if/then\", \"exit repeat\", \"exit\", \"exit to ViperCard\", \"next repeat\", \"pass\", \"repeat\", \"return\"]],\n        /* prettier-ignore */\n        [\"properties\", \"lngProperties\", [\"id\", \"name\", \"number\", \"owner\", \"script\", \"btn: autohilite\", \"btn: checkmark\", \"btn: enabled\", \"btn: left\", \"btn: loc, location\", \"btn: height\", \"btn: hilite\", \"btn: label\", \"btn: icon\", \"btn: rect, rectangle\", \"btn: showlabel\", \"btn: style\", \"btn: textalign\", \"btn: textfont\", \"btn: textsize\", \"btn: textstyle\", \"btn: top\", \"btn: topleft\", \"btn: visible\", \"btn: width\", \"fld: alltext\", \"fld: dontwrap\", \"fld: enabled\", \"fld: defaulttextfont\", \"fld: defaulttextsize\", \"fld: defaulttextstyle\", \"fld: left\", \"fld: loc, location\", \"fld: locktext\", \"fld: height\", \"fld: rect, rectangle\", \"fld: scroll\", \"fld: singleline\", \"fld: style\", \"fld: textalign\", \"fld: textfont\", \"fld: textsize\", \"fld: textstyle\", \"fld: top\", \"fld: topleft\", \"fld: width\", \"fld: visible\", \"cursor\", \"filled\", \"lineColor\", \"lineSize\", \"itemdelimiter\", \"idlerate\", \"multiple\", \"pattern\"]],\n        /* prettier-ignore */\n        [\"functions\", \"lngFunctions\", [\"abs\", \"atan\", \"average\", \"charToNum\", \"clickH\", \"clickLoc\", \"clickV\", \"commandKey\", \"contains\", \"cos\", \"date\", \"exp\", \"exp2\", \"is a\", \"is in\", \"keyChar\", \"keyRepeated\", \"length\", \"ln\", \"log2\", \"max\", \"me\", \"min\", \"mouse\", \"mouseClick\", \"mouseH\", \"mouseLoc\", \"mouseV\", \"number\", \"numberToStr\", \"numToChar\", \"objectById\", \"offset\", \"optionKey\", \"param\", \"paramCount\", \"params\", \"random\", \"result\", \"round\", \"screenRect\", \"seconds\", \"selectedChunk\", \"selectedField\", \"selectedLine\", \"selectedText\", \"the selection\", \"shiftKey\", \"sqrt\", \"sin\", \"strToNumber\", \"sum\", \"tan\", \"target\", \"there is a\", \"ticks\", \"tool\", \"toLowerCase\", \"toUpperCase\", \"trunc\", \"annuity\", \"compound\"]],\n        /* prettier-ignore */\n        [\"events\", \"lngEvent Handlers\", [\"afterKeyDown\", \"afterKeyUp\", \"closeBackground\", \"closeCard\", \"closeField\", \"exitField\", \"idle\", \"mouseDoubleClick\", \"mouseDown\", \"mouseEnter\", \"mouseLeave\", \"mouseUp\", \"mouseWithin\", \"openBackground\", \"openCard\", \"openField\", \"openStack\"]],\n        /* prettier-ignore */\n        [\"compatibility\", \"lngCompatibility\", [\"(Compatibility)\", \"abbrev id\", \"abbrev name\", \"arrowKey\", \"bottom\", \"botright\", \"diskSpace\", \"environment\", \"errorDialog\", \"exp1\", \"freesize\", \"get\", \"heapSpace\", \"ln1\", \"long name\", \"mark\", \"marked\", \"on errorDialog\", \"right\", \"pop\", \"push\", \"size\", \"stacksInUse\", \"stackSpace\", \"suspended\", \"systemVersion\", \"trappable: on arrowKey\", \"trappable: on doMenu\", \"trappable: on help\", \"unmark\", \"version\"]]\n    ];\n\n    /**\n     * cache script reference data loaded from server\n     */\n    referenceJsonData = new JsonDocumentationStructure();\n\n    /**\n     * add list entries and choose the first\n     */\n    initialPopulate() {\n        let grp = this.vci.UI512App().getGroup(this.grpId);\n        let topGeneric = grp.getEl(this.getElId('topChoice'));\n        let top = cast(UI512ElTextField, topGeneric);\n        if (this.type === DialogDocsType.Reference) {\n            let choices = this.referenceInfo.map(item => lng(item[1]));\n            UI512ElTextField.setListChoices(top, choices);\n        } else if (this.type === DialogDocsType.Examples) {\n            let choices = this.examplesInfo.map(item => lng(item[1]));\n            UI512ElTextField.setListChoices(top, choices);\n            let btmGeneric = grp.getEl(this.getElId('btmChoice'));\n            btmGeneric.set('visible', false);\n        }\n\n        /* auto-choose the first entry in the list */\n        let lftgel = new UI512ElTextFieldAsGeneric(top);\n        TextSelModify.selectLineInField(lftgel, 0);\n        this.onChooseCategory(top);\n    }\n\n    /**\n     * which line of a listbox is selected\n     */\n    protected getChosenCategoryNumber(top: UI512ElTextField): O<number> {\n        let gel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, top));\n        return TextSelModify.selectByLinesWhichLine(gel);\n    }\n\n    /**\n     * when a category is chosen\n     */\n    protected onChooseCategory(top: UI512ElTextField) {\n        let ctg = this.getChosenCategoryNumber(top);\n        let lns: string[] = [];\n        if (ctg !== undefined && this.type === DialogDocsType.Reference) {\n            let ctginfo = this.referenceInfo[ctg];\n            if (ctginfo) {\n                lns = ctginfo[2];\n            }\n        } else if (ctg !== undefined && this.type === DialogDocsType.Examples) {\n            let ctginfo = this.examplesInfo[ctg];\n            if (ctginfo) {\n                let nTotal = ctginfo[2];\n                lns = Util512.range(0, nTotal).map(n => (n + 1).toString());\n            }\n        }\n\n        /* reset right side */\n        let grp = this.vci.UI512App().getGroup(this.grpId);\n        this.resetRightSide(grp, false);\n\n        /* deselect bottom choice */\n        let btmGeneric = grp.findEl(this.getElId('btmChoice'));\n        if (btmGeneric) {\n            if (ctg !== undefined && this.type === DialogDocsType.Examples) {\n                this.onChooseExampleVid(ctg, grp);\n            }\n\n            let btm = cast(UI512ElTextField, btmGeneric);\n            UI512ElTextField.setListChoices(btm, lns);\n            btm.set('selcaret', 0);\n            btm.set('selend', 0);\n            btm.set('scrollamt', 0);\n        }\n    }\n\n    /**\n     * when a video category is chosen, set the button name\n     */\n    protected onChooseExampleVid(ctg: number, grp: UI512ElGroup) {\n        let ctginfo = this.examplesInfo[ctg];\n        if (ctginfo) {\n            let starting = this.getElId('btmChoice');\n            for (let el of grp.iterEls()) {\n                if (el.id.startsWith(starting)) {\n                    el.set('visible', !ctginfo[0].startsWith('vid'));\n                }\n            }\n\n            let vidTitles = [\n                'Video 1:\\nhow to make\\nan animated GIF',\n                'Video 2:\\nhow to make a game',\n                'Video 3:\\nhow to make\\ninteractive art'\n            ];\n\n            let btnStartVid = grp.getEl(this.getElId('btnStartVid'));\n            btnStartVid.set('visible', ctginfo[0].startsWith('vid'));\n            btnStartVid.set('labeltext', tostring(vidTitles[ctg]));\n            if (ctginfo[0].startsWith('vid')) {\n                let rghtBackground = grp.findEl(this.getElId('rghtBackground'));\n                if (rghtBackground) {\n                    rghtBackground.set('labeltext', '');\n                }\n            }\n        }\n    }\n\n    /**\n     * clear all content on the right side\n     */\n    protected resetRightSide(grp: UI512ElGroup, isWaiting: boolean) {\n        let rghtFld = grp.findEl(this.getElId('rghtFld'));\n        let rghtBackground = grp.findEl(this.getElId('rghtBackground'));\n        if (rghtFld) {\n            rghtFld.set('scrollamt', 0);\n            rghtFld.setFmTxt(FormattedText.newFromUnformatted(isWaiting ? ' ... ' : ''));\n        }\n\n        if (rghtBackground) {\n            if (!isWaiting && this.type === DialogDocsType.Examples) {\n                this.giveRightBtnText(rghtBackground);\n            } else {\n                rghtBackground.set('labeltext', '');\n            }\n        }\n    }\n\n    /**\n     * show the json data on the right side\n     */\n    protected referenceShowData(grp: UI512ElGroup, btm: UI512ElTextField, ctg: number, jsonData: JsonDocumentationStructure) {\n        let entryTitles = this.referenceInfo[ctg][2];\n        let gel = new UI512ElTextFieldAsGeneric(btm);\n        let ln = TextSelModify.selectByLinesWhichLine(gel);\n        if (ln !== undefined) {\n            let entryTitle = entryTitles[ln];\n            if (entryTitle) {\n                for (let i = 0, len = jsonData.entries.length; i < len; i++) {\n                    let jsonEntry = jsonData.entries[i];\n                    if (\n                        jsonEntry.body &&\n                        (jsonEntry.title.toLowerCase() === entryTitle.toLowerCase() ||\n                            jsonEntry.title.split('(')[0].toLowerCase() === entryTitle.toLowerCase())\n                    ) {\n                        let btnStartVid = grp.getEl(this.getElId('btnStartVid'));\n                        if (entryTitle.toLowerCase() === 'introduction') {\n                            btnStartVid.set('visible', true);\n                            btnStartVid.set('labeltext', '(Open a tutorial vid)');\n                            if (!this.adjustedStartVidBtn) {\n                                this.adjustedStartVidBtn = true;\n                                btnStartVid.set('h', btnStartVid.getN('h') - 30);\n                                btnStartVid.set('y', btnStartVid.getN('y') + 50);\n                                btnStartVid.set('x', btnStartVid.getN('x') - 10);\n                            }\n                        } else {\n                            btnStartVid.set('visible', false);\n                        }\n\n                        let txt = FormattedText.newFromSerialized(jsonEntry.body);\n                        let rghtFld = grp.findEl(this.getElId('rghtFld'));\n                        if (rghtFld) {\n                            rghtFld.setFmTxt(txt);\n                            return;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * user clicked on an item\n     */\n    protected onChooseItem(btm: UI512ElTextField) {\n        let grp = this.vci.UI512App().getGroup(this.grpId);\n        let topGeneric = grp.getEl(this.getElId('topChoice'));\n        let top = cast(UI512ElTextField, topGeneric);\n        let ctg = this.getChosenCategoryNumber(top);\n        this.resetRightSide(grp, true);\n\n        if (ctg !== undefined) {\n            if (this.type === DialogDocsType.Reference) {\n                this.onChooseReferenceItem(ctg, grp, btm);\n            } else if (this.type === DialogDocsType.Examples) {\n                let section = this.examplesInfo[ctg];\n                if (section) {\n                    let sectionId = section[0];\n                    this.examplesShowData(grp, btm, ctg, sectionId);\n                }\n            }\n        }\n    }\n\n    /**\n     * user clicked on a reference item, begin async load if hasn't loaded yet\n     */\n    protected onChooseReferenceItem(ctg: number, grp: UI512ElGroup, btm: UI512ElTextField) {\n        let section = this.referenceInfo[ctg];\n        if (section) {\n            let sectionId = section[0];\n            let jsonData = this.referenceJsonData[sectionId];\n            if (jsonData) {\n                this.referenceShowData(grp, btm, ctg, jsonData);\n            } else {\n                let url = '/resources03a/docs/ref' + sectionId + '.json';\n                let afn = async () => {\n                    let obj = await Util512Higher.asyncLoadJson(url);\n                    assertTrue(obj.entries, 'KW|');\n                    this.referenceJsonData[sectionId] = obj;\n                    this.onChooseItem(btm);\n                };\n\n                Util512Higher.syncToAsyncTransition(afn(), 'ChooseReferenceItem', RespondToErr.Alert);\n            }\n        }\n    }\n\n    /**\n     * show the button linking to video\n     */\n    protected examplesShowData(grp: UI512ElGroup, btm: UI512ElTextField, ctg: number, sectionId: string) {\n        let gel = new UI512ElTextFieldAsGeneric(btm);\n        let ln = TextSelModify.selectByLinesWhichLine(gel);\n        if (ln !== undefined && ln >= 0 && ln < this.examplesInfo[ctg][2]) {\n            this.resetRightSide(grp, true);\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        /* draw a 1px border around the panel */\n        let grp = app.getGroup(this.grpId);\n        let bg = this.genBtn(app, grp, 'bg');\n        bg.set('autohighlight', false);\n        bg.setDimensions(this.x, this.y, this.logicalWidth, this.logicalHeight);\n\n        let curY = this.y;\n        let headheight = this.drawWindowDecoration(app, new WndBorderDecorationConsts(), this.hasCloseBtn);\n        curY += headheight;\n\n        let [top, btm] = this.createLayoutListboxes(curY, grp);\n        let rghtFld = this.createLayoutRightFld(grp, top, headheight, btm);\n        this.createLayoutRightBtn(grp, rghtFld);\n        let caption = dialogDocsTypeToStr(this.type);\n        grp.getEl(this.getElId('caption')).set('labeltext', lng(caption));\n        this.initialPopulate();\n    }\n\n    /**\n     * draw thw two listboxes on the left\n     */\n    protected createLayoutListboxes(curY: number, grp: UI512ElGroup) {\n        curY += 15;\n        let top = UI512ElTextField.makeChoiceBox(this.vci.UI512App(), grp, this.getElId('topChoice'), this.x + 15, curY);\n        top.set('w', 131);\n        curY += top.h + 15;\n        let btm = UI512ElTextField.makeChoiceBox(this.vci.UI512App(), grp, this.getElId('btmChoice'), this.x + 15, curY);\n        btm.set('w', 131);\n        return [top, btm];\n    }\n\n    /**\n     * show link to start video\n     */\n    protected createLayoutRightBtn(grp: UI512ElGroup, rghtFld: UI512ElTextField) {\n        let rghtBackground = this.genBtn(this.vci.UI512App(), grp, 'rghtBtn');\n        rghtBackground.set('autohighlight', false);\n        rghtBackground.setDimensions(rghtFld.x, rghtFld.y, rghtFld.w, rghtFld.h);\n        rghtBackground.set('visible', this.type !== DialogDocsType.Reference);\n        rghtBackground.set('style', this.type === DialogDocsType.Examples ? UI512BtnStyle.Rectangle : UI512BtnStyle.Transparent);\n\n        let btnStartVid = this.genBtn(this.vci.UI512App(), grp, 'btnStartVid');\n        btnStartVid.set('style', UI512BtnStyle.OSStandard);\n        btnStartVid.set('autohighlight', true);\n        btnStartVid.set('labeltext', 'Start Video');\n        btnStartVid.set('visible', this.type === DialogDocsType.Examples);\n        btnStartVid.setDimensions(\n            rghtFld.x + Math.round(rghtFld.w / 2) - 200 / 2,\n            rghtFld.y + Math.round(rghtFld.h / 2) - 100 / 2,\n            200,\n            100\n        );\n    }\n\n    /**\n     * the field that holds documentation content\n     */\n    protected createLayoutRightFld(grp: UI512ElGroup, top: UI512ElTextField, headheight: number, btm: UI512ElTextField) {\n        let rghtFld = this.genChild<UI512ElTextField>(this.vci.UI512App(), grp, 'rghtFld', UI512ElTextField);\n        if (this.type === DialogDocsType.Examples) {\n            rghtFld.setDimensionsX1Y1(\n                top.x + top.w + 10,\n                this.y + headheight - 1,\n                this.x + this.logicalWidth,\n                this.y + this.logicalHeight - 1\n            );\n            let shrunk = RectUtils.getSubRectRaw(rghtFld.x, rghtFld.y, rghtFld.w, rghtFld.h, 7, 7);\n            if (shrunk) {\n                rghtFld.setDimensions(shrunk[0], shrunk[1], shrunk[2], shrunk[3]);\n            }\n        } else {\n            rghtFld.setDimensionsX1Y1(top.x + top.w + 10, top.y, this.x + this.logicalWidth, btm.bottom);\n        }\n\n        rghtFld.set('style', UI512FldStyle.Rectangle);\n        rghtFld.set('canselecttext', true);\n        rghtFld.set('canedit', false);\n        rghtFld.set('scrollbar', this.type === DialogDocsType.Reference);\n        return rghtFld;\n    }\n\n    /**\n     * start the video in a new browser tab\n     */\n    protected clickedBtnStartVid() {\n        if (this.type === DialogDocsType.Examples) {\n            let grp = this.vci.UI512App().getGroup(this.grpId);\n            let top = cast(UI512ElTextField, grp.getEl(this.getElId('topChoice')));\n            let ctg = this.getChosenCategoryNumber(top);\n            if (ctg !== undefined && this.examplesInfo[ctg]) {\n                let num = this.examplesInfo[ctg][0].replace(/vid/g, '');\n                window.open('/0.3/html/video' + num + '.html', '_blank');\n            }\n        } else {\n            /* close this and load the tutorial one */\n            if (this.cbShowVids) {\n                this.cbShowVids();\n            }\n        }\n    }\n\n    /**\n     * when showing example screenshots (the old way before youtube vids),\n     * the right button to start showing screenshots\n     */\n    protected giveRightBtnText(rghtBackground: UI512Element) {\n        let s = 'Click here to view a tutorial showing how to use ViperCard.';\n        let style = 'b+iuosdce';\n        s = UI512DrawText.setFont(s, `geneva_14_${style}`);\n        rghtBackground.set('labeltext', s);\n    }\n\n    /**\n     * route button click\n     */\n    onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void {\n        if (short === 'topChoice') {\n            this.onChooseCategory(cast(UI512ElTextField, el));\n        } else if (short === 'btmChoice') {\n            this.onChooseItem(cast(UI512ElTextField, el));\n        } else if (short === 'btnStartVid') {\n            this.clickedBtnStartVid();\n        }\n    }\n\n    /**\n     * respond to mouse down\n     */\n    onMouseDown(short: string, el: UI512Element, vci: VpcStateInterface): void {}\n}\n\n/**\n * structure of the json documentation\n */\nclass JsonDocumentationStructure {\n    name: string;\n    entries: {\n        title: string;\n        body: string;\n    }[];\n}\n\n/**\n * are we showing examples or script reference\n */\nexport enum DialogDocsType {\n    None = 1,\n    Examples,\n    Reference\n}\n\n/**\n * used for the window caption\n */\nfunction dialogDocsTypeToStr(e: DialogDocsType) {\n    if (e === DialogDocsType.Examples) {\n        return 'lngViperCard Examples';\n    } else if (e === DialogDocsType.Reference) {\n        return 'lngComplete Script Reference';\n    } else {\n        return '';\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcFormLogin.ts",
    "content": "\n/* auto */ import { VpcSessionInterface, VpcUsersCheckLoginResponseInterface } from './../../vpc/request/vpcRequestBase';\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcNonModalFormLoginInterface, VpcNonModalFormNewUser } from './vpcFormNewUser';\n/* auto */ import { RespondToErr, Util512Higher, getRoot } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * form for logging in\n */\nexport class VpcNonModalFormLogin extends VpcNonModalFormLoginInterface {\n    fnCbWhenSignedIn = () => {};\n    showHeader = true;\n    captionText = 'lngLog In';\n    hasCloseBtn = true;\n    compositeType = 'VpcNonModalFormLogin';\n    autoFillUsername: O<string>;\n    autoShowNeedEmailCode = false;\n    waitingForVerifyCode: O<ArrayBuffer>;\n    btns: [string, string][] = [\n        ['ok', 'lngOK'],\n        ['close', 'lngClose'],\n        ['newAccount', 'lngNew User']\n    ];\n\n    fields: [string, string, number][] = [\n        ['username', 'lngUsername:', 1],\n        ['pw', 'lngPassword:', 1],\n        ['codeEmailVerify', 'lngE-mail verif-\\nication code:', 2]\n    ];\n\n    /**\n     * construct. the caller is responsible for setting dimensions.\n     */\n    constructor(protected vci: VpcStateInterface, public newUserOk: boolean) {\n        super('vpcFormNonModalDialogLogIn' + Math.random());\n    }\n\n    /**\n     * start login, and respond to the result\n     */\n    doLogin(vci: VpcStateInterface) {\n        let paramFields = this.readFields(vci.UI512App());\n\n        let fn = async () => {\n            let result: VpcUsersCheckLoginResponseInterface | VpcSessionInterface;\n            try {\n                result = await getVpcSessionTools().vpcUsersCheckLogin(paramFields['username'], paramFields['pw']);\n            } catch (e) {\n                /* login was not successful, no such user or wrong password */\n                this.setStatus(`Did not log in, ${e}`);\n                return;\n            }\n\n            if (this.children.length === 0) {\n                /* user hit cancel */\n                return;\n            } else if (result instanceof VpcSessionInterface) {\n                /* login was successful! */\n                getRoot().setSession(result);\n                this.setStatus('lngLogged in.');\n                this.vci.setNonModalDialog(undefined);\n                this.children = [];\n                this.fnCbWhenSignedIn();\n            } else if (result.status === 'needEmailVerify') {\n                /* login needs email verification */\n                this.setStatus('lngPlease enter the verification code sent via e-mail.');\n                let grp = vci.UI512App().getGroup(this.grpId);\n                let fldEmailVerify = grp.getEl(this.getElId('fldcodeEmailVerify'));\n                fldEmailVerify.set('visible', true);\n                let lblEmailVerify = grp.getEl(this.getElId('lblForcodeEmailVerify'));\n                lblEmailVerify.set('visible', true);\n                this.waitingForVerifyCode = result.buffer;\n            } else {\n                this.setStatus('lngDid not log in, unknown.');\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'doLogin', RespondToErr.Alert);\n    }\n\n    /**\n     * send login requset to server\n     */\n    doLoginVerifyCode(vci: VpcStateInterface, keybuffer: ArrayBuffer) {\n        let paramFields = this.readFields(vci.UI512App());\n        let fn = async () => {\n            let result: VpcSessionInterface;\n            try {\n                result = await getVpcSessionTools().vpcUsersEnterEmailVerifyCode(\n                    paramFields['username'],\n                    keybuffer,\n                    paramFields['codeEmailVerify']\n                );\n            } catch (e) {\n                /* login was not successful -- prob wrong password */\n                this.setStatus(`${e}`);\n                return;\n            }\n\n            if (this.children.length === 0) {\n                /* user hit cancel */\n                return;\n            } else if (result instanceof VpcSessionInterface) {\n                /* login was successful! */\n                getRoot().setSession(result);\n                this.setStatus('lngLogged in.');\n                this.vci.setNonModalDialog(undefined);\n                this.children = [];\n                this.fnCbWhenSignedIn();\n            } else {\n                /* got unexpected type back*/\n                this.setStatus(`unexpected type ${result}`);\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'doLoginVerifyCode', RespondToErr.Alert);\n    }\n\n    /**\n     * when user clicks a button\n     */\n    onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void {\n        if (short === 'btnok') {\n            if (this.waitingForVerifyCode) {\n                this.setStatus('lngInitial account verification...');\n                this.doLoginVerifyCode(vci, this.waitingForVerifyCode);\n            } else {\n                this.setStatus('lngLogging in...');\n                this.doLogin(vci);\n            }\n        } else if (short === 'btnclose') {\n            this.vci.setNonModalDialog(undefined);\n            this.children = [];\n        } else if (short === 'btnnewAccount') {\n            this.vci.setNonModalDialog(undefined);\n            this.children = [];\n            let makeALoginForm = () => new VpcNonModalFormLogin(this.vci, true);\n            let newuserform = new VpcNonModalFormNewUser(this.vci, makeALoginForm);\n            newuserform.fnCbWhenSignedIn = this.fnCbWhenSignedIn;\n            this.vci.setNonModalDialog(newuserform);\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        super.createSpecific(app);\n        let grp = app.getGroup(this.grpId);\n\n        /* following conventions, the password field shows asterisks only */\n        let fldPw = grp.getEl(this.getElId('fldpw'));\n        fldPw.set('asteriskonly', true);\n\n        /* hide the 'verify email' boxes until they are needed */\n        let fldEmailVerify = grp.getEl(this.getElId('fldcodeEmailVerify'));\n        fldEmailVerify.set('h', fldPw.h);\n        fldEmailVerify.set('visible', false);\n        let lblEmailVerify = grp.getEl(this.getElId('lblForcodeEmailVerify'));\n        lblEmailVerify.set('visible', false);\n\n        /* this.autoShowNeedEmailCode */\n        /* doesn't help since it wouldn't have the right state yet, needs keybuffer. */\n        if (this.autoShowNeedEmailCode) {\n            this.setStatus('lngAn e-mail has been sent to verify.');\n        }\n\n        let btnnewAccount = grp.getEl(this.getElId('btnnewAccount'));\n        btnnewAccount.setDimensions(btnnewAccount.x - 10, btnnewAccount.y, btnnewAccount.w + 10, btnnewAccount.h);\n        if (this.autoFillUsername) {\n            grp.getEl(this.getElId('fldusername')).setFmTxt(FormattedText.newFromUnformatted(this.autoFillUsername));\n        }\n\n        /* sometimes it makes more sense not to allow creating new users,\n        like when you've hit File->Open */\n        if (!this.newUserOk) {\n            grp.getEl(this.getElId('btnnewAccount')).set('visible', false);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcFormNewUser.ts",
    "content": "\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcNonModalFormBase } from './vpcLyrNonModalHolder';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * form for creating a new user\n */\nexport class VpcNonModalFormNewUser extends VpcNonModalFormBase {\n    fnCbWhenSignedIn = () => {};\n    showHeader = true;\n    captionText = 'lngNew User';\n    hasCloseBtn = true;\n    compositeType = 'VpcNonModalFormNewUser';\n    btns: [string, string][] = [\n        ['ok', 'lngOK'],\n        ['cancel', 'lngCancel']\n    ];\n    fieldsThatAreLabels: { [key: string]: boolean } = { descrEmail: true };\n    fields: [string, string, number][] = [\n        ['username', 'lngUsername:', 1],\n        ['pw', 'lngPassword:', 1],\n        ['pwagain', 'lngPassword:\\n(again)', 2],\n        ['email', 'lngE-mail:', 1],\n        [\n            'descrEmail',\n            longstr(`lng(This e-mail address and all information{{NEWLINE}}\n                provided will not be shared with any{{NEWLINE}}third party.)`),\n            2\n        ]\n    ];\n\n    /**\n     * construct and set dimensions\n     */\n    constructor(protected vci: VpcStateInterface, protected makeALoginClass: () => VpcNonModalFormLoginInterface) {\n        super('VpcNonModalFormNewUser' + Math.random());\n        VpcNonModalFormBase.standardWindowBounds(this, vci);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        const adjustYPos = -3;\n        super.createSpecific(app);\n        let grp = app.getGroup(this.grpId);\n        let fldPw = grp.getEl(this.getElId('fldpw'));\n        fldPw.set('asteriskonly', true);\n        let fldPwAgain = grp.getEl(this.getElId('fldpwagain'));\n        fldPwAgain.set('asteriskonly', true);\n        fldPwAgain.set('h', fldPw.h);\n\n        /* nudge things up a few pixels */\n        for (let id of ['btnok', 'btncancel', 'lblStatusOfForm']) {\n            let el = grp.getEl(this.getElId(id));\n            el.set('y', el.y + adjustYPos);\n        }\n    }\n\n    /**\n     * respond to button click\n     */\n    onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void {\n        if (short === 'btnok') {\n            this.setStatus('lngCreating user...');\n            this.doCreateUser(vci);\n        } else if (short === 'btncancel') {\n            this.goBackToLogin();\n        }\n    }\n\n    /**\n     * user clicked OK\n     */\n    doCreateUser(vci: VpcStateInterface) {\n        let paramFields = this.readFields(vci.UI512App());\n        if (paramFields['pw'] !== paramFields['pwagain']) {\n            this.setStatus('lngPasswords do not match.');\n            return;\n        }\n\n        let fn = async () => {\n            let result: boolean;\n            try {\n                result = await getVpcSessionTools().vpcUsersCreate(\n                    paramFields['username'],\n                    paramFields['pw'],\n                    paramFields['email']\n                );\n            } catch (e) {\n                this.setStatus(e.toString());\n                return;\n            }\n\n            if (this.children.length === 0) {\n                /* user hit cancel */\n                return;\n            } else if (result === true) {\n                /* create user was successful! */\n                /* it sent an email to the place, now get recovery code */\n                this.goBackToLogin(paramFields['username']);\n            } else {\n                this.setStatus('lngDid create user, unknown.');\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'vpcuserscreate', RespondToErr.Alert);\n    }\n\n    /**\n     * return to the 'login' screen and automatically fill in some of the boxes\n     */\n    protected goBackToLogin(autoFillUsername?: string) {\n        this.vci.setNonModalDialog(undefined);\n        this.children = [];\n\n        let newForm = this.makeALoginClass();\n        checkThrow(newForm instanceof VpcNonModalFormLoginInterface, 'KX|');\n        VpcNonModalFormBase.standardWindowBounds(newForm, this.vci);\n        newForm.fnCbWhenSignedIn = this.fnCbWhenSignedIn;\n        newForm.autoFillUsername = autoFillUsername;\n        newForm.autoShowNeedEmailCode = bool(autoFillUsername);\n        this.vci.setNonModalDialog(newForm);\n    }\n}\n\n/* use VpcFormNonModalDialogLogInCtor, even though it looks ugly,\nto break the circular reference between login and new user,\nthey used to both call each other.  */\nexport abstract class VpcNonModalFormLoginInterface extends VpcNonModalFormBase {\n    fnCbWhenSignedIn: () => void;\n    showHeader: boolean;\n    captionText: string;\n    hasCloseBtn: boolean;\n    compositeType: string;\n    autoFillUsername: O<string>;\n    autoShowNeedEmailCode: boolean;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcFormSendReport.ts",
    "content": "\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcNonModalFormBase } from './vpcLyrNonModalHolder';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { checkIsProductionBuild, vpcVersion } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512ErrorHandling, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { AnyJson, longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { bridgedSaveAs } from './../../bridge/bridgeFileSaver';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * send a report\n */\nexport class VpcNonModalFormSendReport extends VpcNonModalFormBase {\n    showHeader = true;\n    captionText = 'lngReport an error...';\n    hasCloseBtn = true;\n    compositeType = 'VpcNonModalFormSendReport';\n    fieldsThatAreLabels: { [key: string]: boolean } = { header: true };\n    fields: [string, string, number][] = [\n        [\n            'header',\n            longstr(`lngThank you for reporting a potential area\\nof improvement.\n                We will notify you of any\\nupdates or fixes\\nby posting to\n                \\ngroups.google.com/forum/#!forum/vipercard' `),\n            4\n        ],\n        ['desc', 'lngDescription of\\nbug or error\\nmessage, incl.\\ncontext:', 3]\n    ];\n\n    /**\n     * when not building as 'release', we can download the raw logs as json\n     */\n    constructor(protected vci: VpcStateInterface) {\n        super('VpcNonModalFormSendReport' + Math.random());\n        VpcNonModalFormBase.standardWindowBounds(this, vci);\n        if (checkIsProductionBuild()) {\n            this.btns = [\n                ['ok', 'lngSend'],\n                ['close', 'lngClose']\n            ];\n        } else {\n            this.btns = [\n                ['ok', 'lngSend'],\n                ['close', 'lngClose'],\n                ['errorlogs', 'lngGet Logs']\n            ];\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        super.createSpecific(app);\n        let grp = app.getGroup(this.grpId);\n        let header = grp.findEl(this.getElId('lblForheader'));\n        if (header) {\n            header.setDimensions(header.x - 20, header.y, header.w + 40, header.h);\n        }\n\n        let descHeader = grp.findEl(this.getElId('lblFordesc'));\n        if (descHeader) {\n            descHeader.setDimensions(descHeader.x - 20, descHeader.y, descHeader.w + 40, descHeader.h);\n        }\n\n        let fld = grp.findEl(this.getElId('flddesc'));\n        if (fld) {\n            fld.set('scrollbar', true);\n        }\n    }\n\n    /**\n     * respond to button click\n     */\n    onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void {\n        if (short === 'btnerrorlogs') {\n            this.downloadJsonLogs();\n        } else if (short === 'btnok') {\n            this.doSendErrReport(this.vci);\n        } else if (short === 'btnclose') {\n            this.vci.setNonModalDialog(undefined);\n        }\n    }\n\n    /**\n     * download the raw logs as json\n     */\n    protected downloadJsonLogs() {\n        const amountToGet = 50;\n        let lastClientLogs = UI512ErrorHandling.getLatestErrLogs(amountToGet);\n        let obj: AnyJson = {\n            logs: ['(logs are compressed with lz-string)', lastClientLogs],\n            version: vpcVersion\n        };\n        let s = JSON.stringify(obj);\n        let defaultFilename = 'vpc logs.json';\n        let blob = new Blob([s], { type: 'text/plain;charset=utf-8' });\n        bridgedSaveAs()(blob, defaultFilename);\n    }\n\n    /**\n     * send the err report and respond in the ui\n     */\n    doSendErrReport(vci: VpcStateInterface) {\n        let params = this.readFields(vci.UI512App());\n        let fn = async () => {\n            try {\n                await this.asyncSendErrReport(this.vci, params['desc']);\n            } catch (e) {\n                if (e.toString().includes('could not create log entry')) {\n                    this.setStatus('lngAlready sent.');\n                } else {\n                    this.setStatus(e.toString());\n                }\n                return;\n            }\n\n            if (this.children.length === 0) {\n                /* user hit cancel */\n                return;\n            } else {\n                this.setStatus('lngSent report.');\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'doSendErrReport', RespondToErr.Alert);\n    }\n\n    /**\n     * send the err report\n     */\n    async asyncSendErrReport(vci: VpcStateInterface, userdesc: string) {\n        let ses = ensureDefined(getVpcSessionTools().fromRoot(), 'U5|session');\n\n        /* get the last 30 logged errors, which might be useful. */\n        let lastClientLogs = vpcVersion;\n        lastClientLogs += '\\n' + UI512ErrorHandling.getLatestErrLogs(30).join('\\n\\n\\n\\n');\n        let info = this.vci.getModel().stack.getLatestStackLineage();\n        let fullStackId = getVpcSessionTools().getFullStackId(info.stackOwner, info.stackGuid);\n\n        /* ok to set props on lblStatus, since we have a\n        firm reference, if form has been closed is a no-op */\n        this.setStatus('lngSending report...');\n        await ses.vpcLogEntriesCreate(userdesc, lastClientLogs, fullStackId);\n        return true;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcLyrNonModalHolder.ts",
    "content": "\n/* auto */ import { VpcStateInterface, VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { checkThrowInternal } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { KeyDownEventDetails, MouseDownEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { BorderDecorationConsts, UI512CompBase, WndBorderDecorationConsts } from './../../ui512/composites/ui512Composites';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a UI layer that holds a non-modal window\n * there can only be one non-modal window active at any given time\n * non-modal windows are usually shown on the left of the screen,\n * particularly we want the script reference + script editor to both be visible\n */\nexport class VpcLyrNonModalHolder extends VpcUILayer {\n    vci: VpcStateInterface;\n    pr: UI512PresenterBase;\n    current: O<VpcNonModalBase>;\n    init(pr: UI512PresenterBase) {}\n    updateUI512Els() {}\n\n    /**\n     * open this non-modal window,\n     * and close any other non-modal window\n     */\n    setNonModalDialog(form: O<UI512CompBase>) {\n        if (this.current) {\n            this.current.destroy(this.pr, this.vci.UI512App());\n            this.current = undefined;\n        }\n\n        if (form && form instanceof VpcNonModalBase) {\n            let index = -1;\n            if (form.y > this.vci.userBounds()[1] + 30) {\n                /* create it beneath the menubar! */\n                index = this.vci.UI512App().findIndex(grp => grp.id.includes('menu'));\n            }\n\n            form.create(this.pr, this.vci.UI512App(), index);\n            this.current = form;\n        } else if (form) {\n            checkThrowInternal(false, 'KY|expected VpcFormNonModalDialogBase.');\n        }\n    }\n\n    /**\n     * route mouseup to the dialog\n     */\n    respondMouseUp(d: MouseUpEventDetails) {\n        if (this.current) {\n            if (d.elClick) {\n                let short = this.current.fromFullId(d.elClick.id);\n                if (short === 'caption') {\n                    /* clicked the close box */\n                    this.current.destroy(this.pr, this.vci.UI512App());\n                    this.current = undefined;\n                } else if (short) {\n                    this.current.onClickBtn(short, d.elClick, this.vci);\n                }\n            }\n        }\n    }\n\n    /**\n     * route mousedown to the dialog\n     */\n    respondMouseDown(d: MouseDownEventDetails) {\n        if (this.current) {\n            if (d.el) {\n                let short = this.current.fromFullId(d.el.id);\n                if (short) {\n                    this.current.onMouseDown(short, d.el, this.vci);\n                }\n            }\n        }\n    }\n\n    /**\n     * route keydown to the dialog\n     */\n    respondKeyDown(d: KeyDownEventDetails) {\n        if (this.current) {\n            let focused = this.vci.getCurrentFocus();\n            let el = focused ? this.current.fromFullId(focused) : undefined;\n            this.current.onKeyDown(focused, el, d);\n        }\n    }\n}\n\n/**\n * base class for nonmodal windows\n */\nexport abstract class VpcNonModalBase extends UI512CompBase {\n    abstract onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void;\n    abstract onMouseDown(short: string, el: UI512Element, vci: VpcStateInterface): void;\n    onKeyDown(elId: O<string>, short: O<string>, d: KeyDownEventDetails): void {}\n}\n\n/**\n * drawing a form, with inputs, labels, and buttons\n */\nexport abstract class VpcNonModalFormBase extends VpcNonModalBase {\n    fields: [string, string, number][] = [];\n    btns: [string, string][] = [];\n    compositeType = 'VpcNonModalFormBase';\n    logicalWidth = 1;\n    logicalHeight = 1;\n    fldHeight = 22;\n    fldWidth = 180;\n    lblWidth = 100;\n    lblMarginSpace = 5;\n    showHeader = false;\n    hasCloseBtn = false;\n    captionText = '';\n    lblStatus: O<UI512ElLabel>;\n    fieldsThatAreLabels: { [key: string]: boolean } = {};\n    decorations: BorderDecorationConsts = new WndBorderDecorationConsts();\n\n    /**\n     * set window bounds to the 'userarea' in the left half of the screen\n     */\n    static standardWindowBounds(me: UI512CompBase, vci: VpcStateInterface) {\n        me.x = vci.userBounds()[0];\n        me.y = vci.userBounds()[1] + 32;\n        me.logicalWidth = vci.userBounds()[2] + 2;\n        me.logicalHeight = vci.userBounds()[3] - (me.y - vci.userBounds()[1]);\n    }\n\n    /**\n     * set window bounds to cover most of the screen\n     */\n    static largeWindowBounds(me: UI512CompBase, vci: VpcStateInterface) {\n        me.x = vci.userBounds()[0];\n        me.y = vci.bounds()[1] + 3;\n        me.logicalWidth = vci.bounds()[2];\n        me.logicalHeight = vci.bounds()[3] - (me.y - vci.bounds()[1]);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        this.createHeaderAndBg(app, grp);\n\n        const fldVerticalMargin = 5;\n        const totalWidthForCenter = this.lblWidth + this.fldWidth + this.lblMarginSpace;\n        const totalHeightForCenter =\n            this.fields.length * fldVerticalMargin + this.fields.map(t => t[2] * this.fldHeight).reduce(Util512.add);\n        const startX = this.x + Math.round((this.logicalWidth - totalWidthForCenter) / 2);\n        const startY = this.y + Math.round((this.logicalHeight - totalHeightForCenter) / 2);\n        let curX;\n        let curY = startY;\n        for (let [fldId, fldUntransed, heightMult] of this.fields) {\n            curY = this.createFormFld(heightMult, curX, startX, app, grp, fldId, curY, fldUntransed, fldVerticalMargin);\n        }\n\n        curY += fldVerticalMargin * 2;\n        curX = startX + totalWidthForCenter - 90;\n        this.drawBtn(app, grp, 0, curX, curY, 69, 29);\n        curX -= 69 + this.lblMarginSpace * 2;\n        this.drawBtn(app, grp, 1, curX, curY + 4, 68, 21);\n        curX -= 68 + this.lblMarginSpace * 2;\n        this.drawBtn(app, grp, 2, curX, curY + 4, 68, 21);\n\n        curX = startX;\n        curY += 30;\n\n        this.lblStatus = this.genChild<UI512ElLabel>(app, grp, 'lblStatusOfForm', UI512ElLabel);\n        this.lblStatus.setDimensionsX1Y1(curX, curY, this.x + this.logicalWidth - 1, curY + 27);\n    }\n\n    /**\n     * draw header and background (an opaque background to cover the card paint below)\n     */\n    protected createHeaderAndBg(app: UI512Application, grp: UI512ElGroup) {\n        let headHeight = 0;\n        if (this.showHeader) {\n            headHeight = this.drawWindowDecoration(app, this.decorations, this.hasCloseBtn) - 1;\n            let caption = grp.getEl(this.getElId('caption'));\n            caption.set('labeltext', lng(this.captionText));\n        }\n\n        let bg = this.genBtn(app, grp, 'bg');\n        bg.set('autohighlight', false);\n        bg.set('style', this.showHeader ? UI512BtnStyle.Rectangle : UI512BtnStyle.Opaque);\n        bg.setDimensions(this.x, this.y + headHeight, this.logicalWidth, this.logicalHeight - headHeight);\n    }\n\n    /**\n     * draw a field in the form, and its label\n     */\n    protected createFormFld(\n        heightMult: number,\n        curX: any,\n        startX: number,\n        app: UI512Application,\n        grp: UI512ElGroup,\n        fldId: string,\n        curY: number,\n        fldUntransed: string,\n        fldVerticalMargin: number\n    ) {\n        let h = heightMult * this.fldHeight;\n        curX = startX;\n        let lbl = this.genChild<UI512ElLabel>(app, grp, 'lblFor' + fldId, UI512ElLabel);\n        lbl.setDimensions(curX, curY, this.lblWidth, h);\n        lbl.set('labeltext', lng(fldUntransed));\n        curX += this.lblWidth + this.lblMarginSpace;\n        let rght = this.genChild<UI512ElTextField>(app, grp, 'fld' + fldId, UI512ElTextField);\n        rght.setDimensions(curX, curY, this.fldWidth, h);\n        rght.set('style', UI512FldStyle.Rectangle);\n        rght.set('multiline', heightMult > 1);\n        rght.set('nudgey', 2);\n        if (this.fieldsThatAreLabels[fldId]) {\n            /* instead of having an entry box, this is\n            a wide label that uses the space where the entry box would be */\n            lbl.setDimensionsX1Y1(lbl.x, lbl.y, rght.right, rght.bottom + fldVerticalMargin);\n            rght.set('visible', false);\n        }\n\n        curY += h + fldVerticalMargin;\n        return curY;\n    }\n\n    /**\n     * read all strings out of the UI, for convenience\n     */\n    readFields(app: UI512Application, trim = true) {\n        let ret: { [key: string]: string } = {};\n        let grp = app.getGroup(this.grpId);\n        for (let fldIdPts of this.fields) {\n            let fldId = fldIdPts[0];\n            let el = grp.getEl(this.getElId('fld' + fldId));\n            ret[fldId] = el.getFmTxt().toUnformatted();\n            if (trim) {\n                ret[fldId] = ret[fldId].trim();\n            }\n        }\n\n        return ret;\n    }\n\n    /**\n     * show a status message at the bottom\n     */\n    setStatus(s: string) {\n        if (this.lblStatus) {\n            s = s.replace(/\\r\\n/g, '').replace(/\\n/g, '');\n            if (!s.endsWith('.')) {\n                s += '.';\n            }\n\n            if (!s.startsWith('lng')) {\n                s = 'lng' + s;\n            }\n\n            this.lblStatus.set('labeltext', lng(s));\n        }\n    }\n\n    /**\n     * don't need to respond to mousedown\n     */\n    onMouseDown(short: string, el: UI512Element, vci: VpcStateInterface): void {}\n\n    /**\n     * draw one of the OK or Cancel buttons at the bottom\n     */\n    protected drawBtn(app: UI512Application, grp: UI512ElGroup, n: number, x: number, y: number, w: number, h: number) {\n        if (this.btns[n]) {\n            let btn = this.genBtn(app, grp, `btn${this.btns[n][0]}`);\n            btn.set('style', n === 0 ? UI512BtnStyle.OSDefault : UI512BtnStyle.OSStandard);\n            btn.set('autohighlight', true);\n            btn.set('labeltext', lng(this.btns[n][1]));\n            btn.setDimensions(x, y, w, h);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/nonmodaldialogs/vpcReplMessageBox.ts",
    "content": "\n/* auto */ import { RememberHistory } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcNonModalBase, VpcNonModalFormBase } from './vpcLyrNonModalHolder';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcErr, VpcTool, cleanExceptionMsg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { CheckReservedWords } from './../../vpc/codepreparse/vpcCheckReserved';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { lastIfThere } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { KeyDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { TextFontSpec, TextFontStyling } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { PalBorderDecorationConsts } from './../../ui512/composites/ui512Composites';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a \"message box\" where you can type in code and evaluate it\n * redesigned by Ben Fisher, you can now see previous entries,\n * much closer to a traditional REPL than the original.\n *\n * we currently run what you type in a message box by\n * making a hidden button on the card and running a handler there.\n * this way you can call card/bg/stack handlers.\n */\nexport class VpcNonModalReplBox extends VpcNonModalBase {\n    showHeader = true;\n    captionText = '';\n    hasCloseBtn = true;\n    entry: UI512ElTextField;\n    showResults: UI512ElTextField;\n    rememberedTool = VpcTool.Button;\n    constructor(protected vci: VpcStateInterface, protected history: RememberHistory) {\n        super('VpcNonModalReplBox' + Math.random());\n        this.vci.UI512App();\n        this.adjustDimensions(vci);\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        let headheight = 0;\n        if (this.showHeader) {\n            headheight = this.drawWindowDecoration(app, new PalBorderDecorationConsts(), this.hasCloseBtn) - 1;\n        }\n\n        let grp = app.getGroup(this.grpId);\n        let bg = this.genBtn(app, grp, 'bg');\n        bg.set('autohighlight', false);\n        bg.set('style', this.showHeader ? UI512BtnStyle.Rectangle : UI512BtnStyle.Opaque);\n        bg.setDimensions(this.x, this.y + headheight, this.logicalWidth, this.logicalHeight - headheight);\n\n        this.showResults = this.genChild(app, grp, 'scrollGot', UI512ElTextField);\n        this.showResults.setDimensions(this.x + 14 + 5, this.y + 50 + 5, 460 + 15, 50);\n        this.showResults.set('style', UI512FldStyle.Rectangle);\n        this.showResults.set('scrollbar', true);\n        this.showResults.set('canedit', true);\n\n        let dashedLine = this.genBtn(app, grp, 'dashedLine');\n        dashedLine.setDimensions(this.x + 14 - 1, this.y + 30 + 9 + 1, 490, 8);\n        dashedLine.set('icongroupid', '000');\n        dashedLine.set('iconnumber', 1);\n        dashedLine.set('iconadjustheight', -47);\n        dashedLine.set('autohighlight', false);\n        dashedLine.set('style', UI512BtnStyle.Opaque);\n\n        this.entry = this.genChild(app, grp, 'entry', UI512ElTextField);\n        this.entry.setDimensions(this.x + 18 - 1, this.y + 15 + 9 + 1, 478, 20);\n        this.entry.set('style', UI512FldStyle.Transparent);\n        this.entry.set('multiline', false);\n        this.entry.set('defaultFont', 'geneva');\n        this.vci.getPresenter().setCurrentFocus(this.entry.id);\n\n        let msg = lastIfThere(this.history.list) ?? 'put \"abc\"';\n        this.setFontAndText(this.entry, msg, 'geneva', 12);\n        this.setFontAndText(this.showResults, '', 'monaco', 9);\n        this.entry.set('selcaret', msg.length);\n        this.entry.set('selend', msg.length);\n    }\n\n    /**\n     * make the window smaller\n     */\n    protected adjustDimensions(vci: VpcStateInterface) {\n        VpcNonModalFormBase.standardWindowBounds(this, vci);\n        this.x -= 1;\n        this.y += 188;\n        this.logicalHeight -= 188;\n    }\n\n    /**\n     * set the font and text of a field\n     */\n    setFontAndText(el: UI512ElTextField, s: string, typfacename: string, pts: number) {\n        let spec = new TextFontSpec(typfacename, TextFontStyling.Default, pts);\n        el.set('defaultFont', spec.toSpecString());\n        let t = FormattedText.newFromSerialized(UI512DrawText.setFont(s, spec.toSpecString()));\n        el.setFmTxt(t);\n        let gel = new UI512ElTextFieldAsGeneric(el);\n        TextSelModify.fixSelection(gel);\n    }\n\n    /**\n     * respond to button click\n     */\n    onClickBtn(short: string, el: UI512Element, vci: VpcStateInterface): void {\n        if (short && short === 'closebtn') {\n            this.vci.setNonModalDialog(undefined);\n        }\n    }\n\n    /**\n     * respond to button down\n     */\n    onMouseDown(short: string, el: UI512Element, vci: VpcStateInterface): void {}\n\n    /**\n     * use the arrow keys up and down to view history\n     */\n    onKeyDown(elId: O<string>, short: O<string>, d: KeyDownEventDetails): void {\n        if (short === 'entry' && (d.readableShortcut === 'Enter' || d.readableShortcut === 'Return')) {\n            this.launchScript(this.entry.getFmTxt().toUnformatted());\n            d.setHandled();\n        } else if (short === 'entry' && d.readableShortcut === 'ArrowUp') {\n            this.replHistory(true);\n        } else if (short === 'entry' && d.readableShortcut === 'ArrowDown') {\n            this.replHistory(false);\n        }\n    }\n\n    /**\n     * user is viewing what they've previously entered,\n     * like pressing arrow key up/down in bash\n     */\n    replHistory(upwards: boolean) {\n        let fallback = () => '';\n        let retrieved = upwards ? this.history.walkPrevious(fallback) : this.history.walkNext(fallback);\n        this.setFontAndText(this.entry, retrieved, 'geneva', 12);\n\n        /* set caret to the end */\n        this.entry.set('selcaret', retrieved.length);\n        this.entry.set('selend', retrieved.length);\n    }\n\n    /**\n     * launch the script\n     */\n    launchScript(scr: string) {\n        scr = scr.trim();\n        if (!scr || !scr.length) {\n            return;\n        }\n\n        /* don't need to have a \"busy\" state,\n        they'd still be queued. */\n        this.history.append(scr);\n        this.appendToOutput('> ' + scr + ' ...', false);\n        this.setFontAndText(this.entry, '', 'geneva', 12);\n\n        /* prepare to run the code */\n        let codeBody = VpcNonModalReplBox.transformText(scr);\n        let curCard = this.vci.getOptionS('currentCardId');\n\n        this.rememberedTool = this.vci.getTool();\n        this.vci.setTool(VpcTool.Browse);\n\n        /* do this last because it could throw\n        synchronously and call onScriptErr right away */\n        this.vci.getCodeExec().runMsgBoxCodeOrThrow(codeBody, curCard, true);\n    }\n\n    /**\n     * append the results\n     */\n    appendToOutput(sToAdd: string, truncEllipses: boolean) {\n        FormattedText.throwIfContainsControlCharacters(sToAdd);\n        let results = this.showResults.getFmTxt().toUnformatted();\n        if (truncEllipses && results.endsWith(' ...')) {\n            results = results.slice(0, -1 * ' ...'.length);\n        }\n\n        if (truncEllipses && results.endsWith(' ...\\n')) {\n            results = results.slice(0, -1 * ' ...\\n'.length);\n        }\n\n        results = results.trim();\n        if (results.length) {\n            results += '\\n';\n        }\n\n        results += sToAdd;\n        results += '\\n'; /* looks better */\n        this.setFontAndText(this.showResults, results, 'monaco', 9);\n\n        /* scroll down to the end */\n        let gel = new UI512ElTextFieldAsGeneric(this.showResults);\n        TextSelModify.changeSelGoDocHomeEnd(gel, false /* isLeft*/, false /* isExtend*/);\n    }\n\n    /**\n     * respond to a script error\n     */\n    onScriptErr(scriptErr: VpcErr) {\n        /* go back to the previous tool */\n        this.vci.setTool(this.rememberedTool);\n        if (scriptErr) {\n            this.appendToOutput(cleanExceptionMsg(scriptErr.clsAsErr()), true);\n        } else {\n            this.appendToOutput('Unknown', true);\n        }\n\n        /* set focus back */\n        this.vci.getPresenter().setCurrentFocus(this.entry.id);\n    }\n\n    /**\n     * might will be called after script completes.\n     * if the script takes a while and has closed the message box, that's fine,\n     * this won't ever get called.\n     */\n    returnFocus() {\n        this.vci.setTool(this.rememberedTool);\n        this.vci.getPresenter().setCurrentFocus(this.entry.id);\n    }\n\n    /**\n     * add declare 'global x' to the script if you refer to a variable 'x'\n     */\n    static makeAllVarsGlobals(linesImproved: string[], lineWithNoStringLiterals: string) {\n        let splitter = /[a-zA-Z_][0-9a-zA-Z_]*(?![0-9a-zA-Z_(])/g;\n        let allMatches = lineWithNoStringLiterals.match(splitter);\n        let reserved = new CheckReservedWords();\n        if (allMatches) {\n            /* we don't want the first match, which is the command name like 'put' */\n            allMatches.shift();\n            for (let match of allMatches) {\n                if (reserved.okLocalVar(match)) {\n                    linesImproved.push(`global ${match}`);\n                }\n            }\n        }\n    }\n\n    /**\n     * transform the script, making all variables global\n     */\n    static transformText(scr: string) {\n        let lines = scr.split(';');\n        let linesOut: string[] = [];\n        lines.map(line => {\n            line = line.trim();\n            let lineWithNoStringLiterals = VpcNonModalReplBox.removeStringLiterals(line);\n            VpcNonModalReplBox.makeAllVarsGlobals(linesOut, lineWithNoStringLiterals);\n            linesOut.push(line);\n        });\n\n        let total = ``;\n        total += linesOut.join('\\n');\n        return total;\n    }\n\n    /**\n     * disregard string literals when looking for variable names\n     */\n    static removeStringLiterals(s: string) {\n        return s.replace(/\".*?\"/g, '');\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsBase.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValBool, VpcValN, VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { VpcPanelScriptEditor } from './vpcScriptEditor';\n/* auto */ import { VpcEditPanels } from './vpcPanelsInterface';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcElType, checkThrowNotifyMsg, vpcElTypeToString } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { Util512, cast } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { UI512CompBase } from './../../ui512/composites/ui512Composites';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for property panels,\n * for example, editing button and field properties\n */\nexport abstract class VpcEditPanelsBase extends UI512CompBase implements VpcEditPanels {\n    vci: VpcStateInterface;\n    isExclusive = false;\n    compositeType = 'VpcEditPanelsBase';\n    readonly firstSectionH = 100;\n    readonly secondSectionH = 162;\n    readonly thirdSectionH = 100;\n    protected static numeric: { [key: string]: boolean } = { icon: true };\n    topInputs: [string, string, number][] = [];\n\n    leftChoices: [string, string][] = [];\n    readonly leftChoicesX = 20;\n    readonly leftChoicesW = 130;\n    readonly leftChoicesH = 117;\n    readonly rightOptionsX = 216;\n    rightOptions: [string, string, boolean][] = [];\n    abstract readonly velType: VpcElType;\n    cbGetAndValidateSelectedVel: (prp: string) => O<VpcElBase>;\n    lblNamingTip: UI512ElLabel;\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        Util512.freezeProperty(this, 'topInputs');\n        Util512.freezeProperty(this, 'leftChoices');\n        Util512.freezeProperty(this, 'rightOptions');\n\n        /* draw a 1px border around the panel */\n        let grp = app.getGroup(this.grpId);\n        let bg = this.genBtn(app, grp, 'bg');\n        bg.set('autohighlight', false);\n        bg.setDimensions(this.x, this.y, this.logicalWidth, this.logicalHeight);\n        this.createTopInputs(app);\n        this.createLeftChoices(app);\n        this.createRightOptions(app);\n        this.createLowerSection(app);\n    }\n\n    /**\n     * draw top inputs, usually to get name of vel\n     */\n    createTopInputs(app: UI512Application) {\n        const lblX = 16;\n        const inputX = 170;\n        const inputH = 22;\n        const inputMargin = 11;\n        let totalUsedH = this.topInputs.length * inputH + (this.topInputs.length - 1) * inputMargin;\n        let startY = this.y + Math.floor((this.firstSectionH - totalUsedH) / 2);\n        let curY = startY;\n        let grp = app.getGroup(this.grpId);\n        for (let [lblTxt, inId, inputW] of this.topInputs) {\n            let lbl = this.genChild<UI512ElLabel>(app, grp, `lbl##${inId}`, UI512ElLabel);\n            lbl.set('labeltext', lng(lblTxt));\n            lbl.set('labelhalign', false);\n            lbl.set('labelvalign', true);\n            lbl.setDimensions(this.x + lblX, curY, inputX - lblX, inputH);\n\n            let inp = this.genChild<UI512ElTextField>(app, grp, `inp##${inId}`, UI512ElTextField);\n            inp.set('multiline', false);\n            inp.set('labelwrap', false);\n            inp.set('nudgey', 2);\n            inp.setDimensions(this.x + inputX, curY, inputW, inputH);\n            curY += inputH + inputMargin;\n        }\n    }\n\n    /**\n     * draw left choicebox, usually to get style of vel\n     */\n    createLeftChoices(app: UI512Application) {\n        if (!this.leftChoices.length) {\n            return;\n        }\n\n        let grp = app.getGroup(this.grpId);\n        let startY = this.y + this.firstSectionH + Math.floor((this.secondSectionH - this.leftChoicesH) / 2);\n        let fld = this.genChild<UI512ElTextField>(app, grp, `leftchoice`, UI512ElTextField);\n        fld.set('scrollbar', true);\n        fld.set('selectbylines', true);\n        fld.set('multiline', true);\n        fld.set('canselecttext', true);\n        fld.set('canedit', false);\n        fld.set('labelwrap', false);\n        UI512ElTextField.setListChoices(\n            fld,\n            this.leftChoices.map(item => lng(item[0]))\n        );\n        fld.setDimensions(this.x + this.leftChoicesX, startY, this.leftChoicesW, this.leftChoicesH);\n    }\n\n    /**\n     * draw right options, usually to set boolean options of vel\n     */\n    createRightOptions(app: UI512Application) {\n        const inputH = 15;\n        const inputMargin = 3;\n        let totalUsedH = this.rightOptions.length * inputH + (this.rightOptions.length - 1) * inputMargin;\n        let startY = this.y + this.firstSectionH + Math.floor((this.secondSectionH - totalUsedH) / 2);\n        let curY = startY;\n        let grp = app.getGroup(this.grpId);\n        for (let [lblTxt, inId] of this.rightOptions) {\n            let inp = this.genBtn(app, grp, `toggle##${inId}`);\n            inp.set('style', UI512BtnStyle.Checkbox);\n            inp.set('labeltext', lng(lblTxt));\n            inp.set('labelhalign', false);\n            inp.set('labelvalign', true);\n            inp.setDimensions(this.x + this.rightOptionsX, curY, this.logicalWidth - this.rightOptionsX, inputH);\n            curY += inputH + inputMargin;\n        }\n    }\n\n    /**\n     * initialize layout for lower part of panel\n     */\n    createLowerSection(app: UI512Application) {\n        let tipsX = this.leftChoicesX + 0;\n        let tipsY = this.firstSectionH + this.secondSectionH - 9;\n        let grp = app.getGroup(this.grpId);\n        this.lblNamingTip = this.genChild<UI512ElLabel>(app, grp, `lbl##tip`, UI512ElLabel);\n        this.lblNamingTip.set('labelhalign', false);\n        this.lblNamingTip.set('labelvalign', false);\n        this.lblNamingTip.setDimensions(this.x + tipsX, this.y + tipsY, this.logicalWidth - tipsX, this.logicalHeight - tipsY);\n\n        const spaceFromRight = 55;\n        const spaceFromBottom = 17;\n        const btnW = 68;\n        const btnH = 23;\n        let isEmpty = this.compositeType === 'VpcEditPanelsEmpty';\n        let scriptBtn = this.genBtn(app, grp, isEmpty ? 'btnGenPart' : 'btnScript');\n        scriptBtn.set('labeltext', lng('lngScript...'));\n        scriptBtn.set('style', UI512BtnStyle.OSStandard);\n        scriptBtn.setDimensions(\n            this.x + this.logicalWidth - (btnW + spaceFromRight),\n            this.y + this.logicalHeight - (btnH + spaceFromBottom),\n            btnW,\n            btnH\n        );\n\n        if (isEmpty) {\n            scriptBtn.setDimensions(scriptBtn.x - 75, scriptBtn.y, scriptBtn.w + 75, scriptBtn.h);\n        }\n    }\n\n    /**\n     * refresh ui\n     */\n    refreshFromModel(app: UI512Application) {\n        let vel = this.cbGetAndValidateSelectedVel('selectedVelId');\n        if (!vel) {\n            return;\n        }\n\n        this.fillInValuesTip(app, vel);\n        let grp = app.getGroup(this.grpId);\n        for (let lblTxtPts of this.topInputs) {\n            let inId = lblTxtPts[1];\n            let el = grp.getEl(this.getElId(`inp##${inId}`));\n            if (inId === 'fldcontent') {\n                el.set('style', UI512FldStyle.Transparent);\n                el.set('canedit', false);\n                el.set('canselecttext', false);\n                el.set('h', 50);\n                el.set('x', grp.getEl(this.getElId(`inp##name`)).x - 3);\n                el.setFmTxt(FormattedText.newFromUnformatted('To edit text, use the Browse\\ntool and click on the field.'));\n            } else {\n                let s = VpcEditPanelsBase.numeric[inId] ? vel.getN(inId).toString() : vel.getS(inId);\n                el.setFmTxt(FormattedText.newFromUnformatted(s));\n            }\n        }\n\n        if (this.leftChoices.length) {\n            let styl = vel.getProp('style').readAsString();\n            let el = grp.getEl(this.getElId(`leftchoice`));\n            let found = this.leftChoices.findIndex(item => item[1].toLowerCase() === styl.toLowerCase());\n            if (found !== -1) {\n                let wasScroll = el.getN('scrollamt');\n                let gel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, el));\n                TextSelModify.selectLineInField(gel, found);\n                el.set('scrollamt', wasScroll);\n            } else {\n                el.set('selcaret', 0);\n                el.set('selend', 0);\n            }\n        }\n\n        for (let lblTxtPts of this.rightOptions) {\n            let inId = lblTxtPts[1];\n            let el = grp.getEl(this.getElId(`toggle##${inId}`));\n            let val = vel.getProp(inId);\n            el.set('checkmark', val.readAsStrictBoolean());\n        }\n    }\n\n    /**\n     * refresh the tip saying how to refer to an object in a script\n     */\n    fillInValuesTip(app: UI512Application, vel: VpcElBase) {\n        let prefix = '';\n        if (vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld) {\n            let isBg = vel.getS('is_bg_velement_id').length > 0;\n            prefix = isBg ? vpcElTypeToString(VpcElType.Bg, true) : vpcElTypeToString(VpcElType.Card, true);\n            prefix += ' ';\n        }\n\n        let typeName = vpcElTypeToString(this.velType, true);\n        let s = lng('lngRefer to this %typ in a script as');\n        s = s.replace(/%typ/g, vpcElTypeToString(this.velType, false));\n        s += `\\n${prefix}${typeName} id ${vel.getUserFacingId()}`;\n        if (vel.getS('name').length) {\n            s += `\\nor\\n${prefix}${typeName} \"${vel.getS('name')}\"`;\n        }\n\n        s = UI512DrawText.setFont(s, new TextFontSpec('monaco', 0, 9).toSpecString());\n        this.lblNamingTip.set('labeltext', s);\n    }\n\n    /**\n     * save changes for one property\n     */\n    protected saveChangesToModelSetProp(vel: VpcElBase, propName: string, newVal: VpcVal, onlyCheckIfDirty: boolean) {\n        if (onlyCheckIfDirty) {\n            let current = propName === 'name' ? VpcValS(vel.getS('name')) : vel.getProp(propName);\n            if (current.readAsString() !== newVal.readAsString()) {\n                checkThrowNotifyMsg(false, VpcPanelScriptEditor.thereArePendingChanges);\n            }\n        } else {\n            vel.setProp(propName, newVal, this.vci.getModel());\n        }\n    }\n\n    /**\n     * save changes for all properties\n     * if onlyCheckIfDirty is set, skip saving anything and only check if there are unsaved changes\n     */\n    saveChangesToModel(app: UI512Application, onlyCheckIfDirty: boolean) {\n        let vel = this.cbGetAndValidateSelectedVel('selectedVelId');\n        if (!vel) {\n            return;\n        }\n\n        let grp = app.getGroup(this.grpId);\n        let elIcon = grp.findEl(this.getElId(`inp##icon`));\n        if (elIcon && vel.getType() === VpcElType.Btn && !onlyCheckIfDirty) {\n            let typed = elIcon.getFmTxt().toUnformatted();\n            let n = Util512.parseInt(typed);\n            let nextIcon = Math.max(0, n ?? 0);\n            let curIcon = vel.getN('icon') ?? 0;\n            if (nextIcon === 0 && curIcon !== 0) {\n                /* if you are adding/removing a button's icon, set font as appropriate */\n                vel.setOnVel('textfont', 'chicago', this.vci.getModel());\n                vel.setOnVel('textstyle', 0, this.vci.getModel());\n                vel.setOnVel('textsize', 12, this.vci.getModel());\n            } else if (nextIcon !== 0 && curIcon === 0) {\n                /* if you are adding/removing a button's icon, set font as appropriate */\n                vel.setOnVel('textfont', 'geneva', this.vci.getModel());\n                vel.setOnVel('textstyle', 0, this.vci.getModel());\n                vel.setOnVel('textsize', 9, this.vci.getModel());\n            }\n        }\n\n        for (let lblTxtPts of this.topInputs) {\n            let inId = lblTxtPts[1];\n            if (inId === 'fldcontent') {\n                continue;\n            }\n\n            let el = grp.getEl(this.getElId(`inp##${inId}`));\n            let typed = el.getFmTxt().toUnformatted();\n            if (VpcEditPanelsBase.numeric[inId]) {\n                let n = Util512.parseInt(typed);\n                n = Math.max(0, n ?? 0);\n                this.saveChangesToModelSetProp(vel, inId, VpcValN(n), onlyCheckIfDirty);\n            } else {\n                this.saveChangesToModelSetProp(vel, inId, VpcValS(typed), onlyCheckIfDirty);\n            }\n        }\n\n        if (this.leftChoices.length) {\n            let el = grp.getEl(this.getElId(`leftchoice`));\n            let gel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, el));\n            let ln = TextSelModify.selectByLinesWhichLine(gel);\n            if (ln !== undefined && ln >= 0 && ln < this.leftChoices.length) {\n                this.saveChangesToModelSetProp(vel, 'style', VpcValS(this.leftChoices[ln][1]), onlyCheckIfDirty);\n            }\n        }\n\n        for (let lblTxtParts of this.rightOptions) {\n            let inId = lblTxtParts[1];\n            let el = grp.getEl(this.getElId(`toggle##${inId}`));\n            if (el.getB('visible')) {\n                let checked = el.getB('checkmark');\n                vel.setProp(inId, VpcValBool(checked), this.vci.getModel());\n                this.saveChangesToModelSetProp(vel, inId, VpcValBool(checked), onlyCheckIfDirty);\n            }\n        }\n    }\n\n    /**\n     * e.g. certain properties only apply to bg items\n     */\n    showOrHideBgSpecific(app: UI512Application, isBgPart: boolean) {\n        let grp = app.getGroup(this.grpId);\n        for (let lblTxtParts of this.rightOptions) {\n            let inId = lblTxtParts[1];\n            let isBgOnly = lblTxtParts[2];\n            let el = grp.getEl(this.getElId(`toggle##${inId}`));\n            if (isBgOnly && !isBgPart) {\n                el.set('visible', false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsBtn.ts",
    "content": "\n/* auto */ import { VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * properties panel, for editing a button's properties\n */\nexport class VpcEditPanelsBtn extends VpcEditPanelsBase {\n    compositeType = 'VpcEditPanelsBtn';\n    readonly velTypeShortName = 'cd btn';\n    readonly velTypeLongName = 'lngbutton';\n    readonly velType = VpcElType.Btn;\n    topInputs: [string, string, number][] = [\n        ['lngButton Name:', 'name', 190],\n        ['lngButton Label:', 'label', 190],\n        ['lngIcon:', 'icon', 45]\n    ];\n\n    leftChoices: [string, string][] = [\n        ['lngOpaque', 'opaque'],\n        ['lngRectangle', 'rectangle'],\n        ['lngTransparent', 'transparent'],\n        ['lngRoundrect', 'roundrect'],\n        ['lngShadow', 'shadow'],\n        ['lngCheckbox', 'checkbox'],\n        ['lngRadio', 'radio'],\n        ['lngPlain', 'plain'],\n        ['lngOS Standard', 'standard'],\n        ['lngOS Default', 'default']\n    ];\n\n    rightOptions: [string, string, boolean][] = [\n        ['lngShow Label', 'showlabel', false],\n        ['lngAuto Hilite', 'autohilite', false],\n        ['lngEnabled', 'enabled', false],\n        ['lngShared Hilite', 'sharedhilite', true]\n    ];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsCard.ts",
    "content": "\n/* auto */ import { VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * properties panel, for editing a card's properties\n */\nexport class VpcEditPanelsCard extends VpcEditPanelsBase {\n    compositeType = 'VpcEditPanelsCard';\n    readonly velTypeShortName = 'card';\n    readonly velTypeLongName = 'lngcard';\n    readonly velType = VpcElType.Card;\n    topInputs: [string, string, number][] = [['lngCard Name:', 'name', 190]];\n    leftChoices: [string, string][] = [];\n    rightOptions: [string, string, boolean][] = [];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsEmpty.ts",
    "content": "\n/* auto */ import { VpcElType, VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * properties panel, for when no object is selected\n */\nexport class VpcEditPanelsEmpty extends VpcEditPanelsBase {\n    compositeType = 'VpcEditPanelsEmpty';\n    readonly velTypeShortName = '';\n    readonly velTypeLongName = '';\n    readonly velType = VpcElType.Unknown;\n    topInputs: [string, string, number][] = [];\n    leftChoices: [string, string][] = [];\n    rightOptions: [string, string, boolean][] = [];\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        super.createSpecific(app);\n\n        let s = lng('lngNothing is selected.');\n        s = UI512DrawText.setFont(s, new TextFontSpec('monaco', 0, 9).toSpecString());\n        this.lblNamingTip.set('labeltext', s);\n        this.lblNamingTip.setDimensions(this.lblNamingTip.x, this.lblNamingTip.y + 20, this.lblNamingTip.w, this.lblNamingTip.h);\n    }\n\n    /**\n     * refresh from model\n     */\n    refreshFromModel(app: UI512Application) {\n        let grp = app.getGroup(this.grpId);\n        let btnGenPart = grp.getEl(this.getElId('btnGenPart'));\n        let currentTool = this.vci.getOptionN('currentTool');\n        let lbl = currentTool === VpcTool.Button ? 'lngMake new button' : 'lngMake new field';\n        btnGenPart.set('labeltext', lng(lbl));\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsFld.ts",
    "content": "\n/* auto */ import { VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * properties panel, for editing a field's properties\n */\nexport class VpcEditPanelsField extends VpcEditPanelsBase {\n    compositeType = 'VpcEditPanelsField';\n    readonly velTypeShortName = 'cd fld';\n    readonly velTypeLongName = 'lngfield';\n    readonly velType = VpcElType.Fld;\n    topInputs: [string, string, number][] = [\n        ['lngField Name:', 'name', 190],\n        ['lngField Contents:', 'fldcontent', 205]\n    ];\n\n    leftChoices: [string, string][] = [\n        ['lngRectangle', 'rectangle'],\n        ['lngScrolling', 'scrolling'],\n        ['lngShadow', 'shadow'],\n        ['lngOpaque', 'opaque'],\n        ['lngTransparent', 'transparent']\n    ];\n\n    rightOptions: [string, string, boolean][] = [\n        ['lngLock Text', 'locktext', false],\n        [\"lngDon't Wrap\", 'dontwrap', false],\n        ['lngSingle Line', 'singleline', false],\n        ['lngEnabled', 'enabled', false],\n        ['lngShare Text', 'sharedtext', true]\n    ];\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcEditPanelsStack.ts",
    "content": "\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcElType } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { cAltProductName } from './../../ui512/utils/util512Base';\n/* auto */ import { longstr } from './../../ui512/utils/util512';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * properties panel, for editing a stack's properties\n */\nexport class VpcEditPanelsStack extends VpcEditPanelsBase {\n    compositeType = 'VpcEditPanelsStack';\n    readonly velTypeShortName = '';\n    readonly velTypeLongName = '';\n    readonly velType = VpcElType.Stack;\n    topInputs: [string, string, number][] = [['lngStack Name:', 'name', 190]];\n    leftChoices: [string, string][] = [];\n    rightOptions: [string, string, boolean][] = [];\n\n    /**\n     * you should refer to a stack as 'this stack' rather than by name or id\n     */\n    fillInValuesTip(app: UI512Application, vel: VpcElBase) {\n        let txt = lng('lngRefer to the current stack in a script as\\nthis stack');\n        txt = UI512DrawText.setFont(txt, new TextFontSpec('monaco', 0, 9).toSpecString());\n        this.lblNamingTip.set('labeltext', txt);\n    }\n\n    /**\n     * initialize layout for lower part of panel\n     */\n    createLowerSection(app: UI512Application) {\n        super.createLowerSection(app);\n\n        let grp = app.getGroup(this.grpId);\n        const spaceFromRight = 130;\n        const spaceFromBottom = 17;\n        const btnW = 100 + 70;\n        const btnH = 23;\n        let scriptBtn = this.genBtn(app, grp, 'btnCompatibility');\n        scriptBtn.set('labeltext', lng('lngCompatibility Mode...'));\n        scriptBtn.set('style', UI512BtnStyle.OSStandard);\n        scriptBtn.setDimensions(\n            this.x + this.logicalWidth - (btnW + spaceFromRight),\n            this.y + this.logicalHeight - (btnH + spaceFromBottom),\n            btnW,\n            btnH\n        );\n    }\n\n    /**\n     * user clicked on Compatibility\n     */\n    static onBtnCompatibility(vci: VpcStateInterface) {\n        let fn = async () => {\n            let isCurrently = vci.getModel().stack.getB('compatibilitymode');\n            let offOn = isCurrently ? 'on' : 'off';\n            let onOff = isCurrently ? 'off' : 'on';\n            let msg = longstr(\n                `Turn ${onOff} this setting for more compatibility\n                with ${cAltProductName}? Currently is ${offOn}.`\n            );\n            let chosen = await vci.answerMsgAsync(msg, 'OK', 'Cancel');\n            if (chosen === 0) {\n                /* clicked ok */\n                vci.undoableAction(() => vci.getModel().stack.setOnVel('compatibilitymode', !isCurrently, vci.getModel()));\n            } else {\n                /* clicked cancel or off the screen */\n            }\n        };\n\n        Util512Higher.syncToAsyncTransition(fn(), 'onBtnCompatibility', RespondToErr.ConsoleErrOnly);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcLyrDragHandles.ts",
    "content": "\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { VpcTool, VpcToolCtg, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { slength } from './../../ui512/utils/util512';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * resize handles, for moving and resizing a vel\n */\nexport class VpcAppLyrDragHandles extends VpcUILayer {\n    readonly resizeBoxSize = 8;\n    readonly sizeHandles: UI512Element[] = [];\n\n    /**\n     * get group containing the handles\n     */\n    static getGrpHelperElems(app: UI512Application) {\n        let fnd = app.findGroup('grpAppResizeHandles');\n        if (fnd) {\n            return fnd;\n        } else {\n            let grp = new UI512ElGroup('grpAppResizeHandles');\n            app.addGroup(grp);\n            return grp;\n        }\n    }\n\n    /**\n     * initialize and create resize handles\n     */\n    init() {\n        let grpHelperElems = VpcAppLyrDragHandles.getGrpHelperElems(this.vci.UI512App());\n        for (let i = 0; i < 4; i++) {\n            let handle = new UI512ElButton(`grpAppResizeHandlesHandle${i}`);\n            grpHelperElems.addElement(this.vci.UI512App(), handle);\n            handle.set('style', UI512BtnStyle.Rectangle);\n            handle.set('visible', true);\n            handle.set('autohighlight', false);\n            handle.set('highlightactive', true);\n            handle.setDimensions(0, 0, this.resizeBoxSize, this.resizeBoxSize);\n            this.sizeHandles[i] = handle;\n        }\n    }\n\n    /**\n     * get the target UI512 element, or undefined if none ot present\n     */\n    getSelectedUIElForHandles(currentTool: VpcTool) {\n        let selectedVelId = this.vci.getOptionS('selectedVelId');\n        if (getToolCategory(currentTool) === VpcToolCtg.CtgEdit && slength(selectedVelId)) {\n            /* if the current card / stack is selected, */\n            /* we won't find an element, that's ok, it will return undefined. */\n            let grp = this.vci.UI512App().getGroup('VpcModelRender');\n            return grp.findEl('VpcModelRender$$' + selectedVelId);\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * set the handle positions\n     * one box is centered on each corner of the element\n     */\n    updateUI512Els() {\n        let currentTool = this.vci.getOptionN('currentTool');\n        let el = this.getSelectedUIElForHandles(currentTool);\n        if (el) {\n            this.sizeHandles[0].setDimensions(\n                el.x - this.sizeHandles[0].w / 2,\n                el.y - this.sizeHandles[0].h / 2,\n                this.sizeHandles[0].w,\n                this.sizeHandles[0].h\n            );\n\n            this.sizeHandles[1].setDimensions(\n                el.x + el.w - this.sizeHandles[0].w / 2,\n                el.y - this.sizeHandles[0].h / 2,\n                this.sizeHandles[0].w,\n                this.sizeHandles[0].h\n            );\n\n            this.sizeHandles[2].setDimensions(\n                el.x - this.sizeHandles[0].w / 2,\n                el.y + el.h - this.sizeHandles[0].h / 2,\n                this.sizeHandles[0].w,\n                this.sizeHandles[0].h\n            );\n\n            this.sizeHandles[3].setDimensions(\n                el.x + el.w - this.sizeHandles[0].w / 2,\n                el.y + el.h - this.sizeHandles[0].h / 2,\n                this.sizeHandles[0].w,\n                this.sizeHandles[0].h\n            );\n        } else {\n            for (let i = 0, len = this.sizeHandles.length; i < len; i++) {\n                let handle = this.sizeHandles[i];\n                handle.setDimensions(-400, -400, handle.w, handle.h);\n            }\n        }\n    }\n\n    /**\n     * from handle id to number\n     */\n    whichHandle(id: string) {\n        if (id === 'grpAppResizeHandlesHandle0') {\n            return 0;\n        } else if (id === 'grpAppResizeHandlesHandle1') {\n            return 1;\n        } else if (id === 'grpAppResizeHandlesHandle2') {\n            return 2;\n        } else if (id === 'grpAppResizeHandlesHandle3') {\n            return 3;\n        } else {\n            return undefined;\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcLyrNotification.ts",
    "content": "\n/* auto */ import { VpcAppLyrDragHandles } from './vpcLyrDragHandles';\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * text notifications to the user in the lower right of the screen\n */\nexport class VpcAppLyrNotification extends VpcUILayer {\n    elems: { [key: string]: UI512Element } = {};\n\n    /**\n     * update ui\n     */\n    updateUI512Els() {\n        this.elems.nyiMsg.set('visible', false);\n    }\n\n    /**\n     * hide the message\n     */\n    hideMyMessage() {\n        let grpHelperElems = VpcAppLyrDragHandles.getGrpHelperElems(this.vci.UI512App());\n        let lbl = grpHelperElems.findEl('grpAppHelperElemsShowTutorial');\n        if (lbl) {\n            lbl.set('visible', false);\n        }\n    }\n\n    /**\n     * set the message\n     */\n    setMyMessage(s: string) {\n        let grpHelperElems = VpcAppLyrDragHandles.getGrpHelperElems(this.vci.UI512App());\n        let lbl = grpHelperElems.findEl('grpAppHelperElemsShowTutorial');\n        if (lbl) {\n            lbl.set('labeltext', s);\n            lbl.set('visible', true);\n        }\n    }\n\n    /**\n     * if user clicked 'open tutorial', hide our message\n     */\n    respondMouseUp(d: MouseUpEventDetails) {\n        if (d.elClick) {\n            if (d.elClick.id === 'grpAppHelperElemsShowTutorial') {\n                let grpHelperElems = VpcAppLyrDragHandles.getGrpHelperElems(this.vci.UI512App());\n                let lbl = grpHelperElems.findEl('grpAppHelperElemsShowTutorial');\n                if (lbl) {\n                    if (this.vci.bounds()[0] + this.vci.bounds()[2] - d.mouseX < 55) {\n                        lbl.set('visible', false);\n                    } else {\n                        this.vci.performMenuAction('mnuDlgHelpExamples');\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    init() {\n        /* get or create group */\n        let grpHelperElems = VpcAppLyrDragHandles.getGrpHelperElems(this.vci.UI512App());\n\n        /* create a white opaque rectangle to cover up user elements that leave the user area */\n        this.elems.cover = new UI512ElButton('grpAppHelperElemsCover');\n        grpHelperElems.addElement(this.vci.UI512App(), this.elems.cover);\n        this.elems.cover.set('style', UI512BtnStyle.Opaque);\n        this.elems.cover.set('autohighlight', false);\n        let coverx = this.vci.bounds()[0] + ScreenConsts.xAreaWidth;\n        let covery = this.vci.bounds()[1];\n        let coverw = 10 + this.vci.bounds()[2] - ScreenConsts.xAreaWidth;\n        let coverh = 10 + this.vci.bounds()[3];\n        this.elems.cover.setDimensions(coverx, covery, coverw, coverh);\n\n        /* a message to the user saying \"nyi\" */\n        let msg = lng('lng(This feature is not yet supported.)');\n        let font = new TextFontSpec('geneva', 0, 10);\n        msg = UI512DrawText.setFont(msg, font.toSpecString());\n        this.elems.nyiMsg = new UI512ElLabel('grpAppHelperElemsNyiMsg');\n        grpHelperElems.addElement(this.vci.UI512App(), this.elems.nyiMsg);\n        this.elems.nyiMsg.set('visible', false);\n        this.elems.nyiMsg.set('labeltext', msg);\n        this.elems.nyiMsg.set('labelwrap', true);\n        this.elems.nyiMsg.set('labelhalign', true);\n        this.elems.nyiMsg.set('labelvalign', true);\n        this.elems.nyiMsg.setDimensions(this.elems.cover.x, this.elems.cover.y, this.elems.cover.w, this.elems.cover.h);\n\n        /* a message to the user saying where tutorials are. */\n        let s = lng('lngNew? Click here to see how to use ViperCard. (Close).');\n        let style = 'biuosdce';\n        s = UI512DrawText.setFont(s, `chicago_10_${style}`);\n        let lbl = new UI512ElLabel('grpAppHelperElemsShowTutorial');\n        grpHelperElems.addElement(this.vci.UI512App(), lbl);\n        lbl.set('labelhalign', false);\n        lbl.set('labeltext', s);\n        lbl.set('w', 318);\n        lbl.set('h', 20);\n        lbl.set('x', this.vci.bounds()[0] + this.vci.bounds()[2] - lbl.w);\n        lbl.set('y', this.vci.bounds()[1] + this.vci.bounds()[3] - lbl.h);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcLyrPanels.ts",
    "content": "\n/* auto */ import { ToolboxDims } from './vpcToolboxPatterns';\n/* auto */ import { VpcPanelScriptEditor } from './vpcScriptEditor';\n/* auto */ import { VpcEditPanels } from './vpcPanelsInterface';\n/* auto */ import { VpcAppLyrDragHandles } from './vpcLyrDragHandles';\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { VpcElType, VpcTool, VpcToolCtg, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcEditPanelsStack } from './vpcEditPanelsStack';\n/* auto */ import { VpcEditPanelsField } from './vpcEditPanelsFld';\n/* auto */ import { VpcEditPanelsEmpty } from './vpcEditPanelsEmpty';\n/* auto */ import { VpcEditPanelsCard } from './vpcEditPanelsCard';\n/* auto */ import { VpcEditPanelsBtn } from './vpcEditPanelsBtn';\n/* auto */ import { VpcEditPanelsBase } from './vpcEditPanelsBase';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { MapKeyToObject, slength } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { KeyDownEventDetails, MouseDownEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * layer that holds the property panels\n */\nexport class VpcAppLyrPanels extends VpcUILayer {\n    panelEmpty = new VpcEditPanelsEmpty('editPanelEmpty');\n    panels = new MapKeyToObject<VpcEditPanels>();\n    editor = new VpcPanelScriptEditor('editPanelScript');\n    active: O<VpcEditPanels> = this.panelEmpty;\n    handles: VpcAppLyrDragHandles;\n\n    /* set in initLayers */\n    model: VpcModelTop;\n\n    /**\n     * return the currently selected button or field, or undefined\n     */\n    selectedFldOrBtn() {\n        let vel = this.selectedVel('selectedVelId');\n        if (vel && (vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld)) {\n            return vel;\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * return the selected vel, or undefined\n     * can be e.g. the stack if user did Object->Stack Info...\n     */\n    selectedVel(propName: string) {\n        /* the selectedVelId could be out of date. */\n        let selVel = this.vci.getOptionS(propName);\n        let vel = this.vci.getModel().findByIdUntyped(selVel);\n        let currentCardId = this.vci.getModel().getCurrentCard().idInternal;\n        if (vel && getToolCategory(this.vci.getTool()) === VpcToolCtg.CtgEdit) {\n            /* make sure the parent makes sense */\n            if (vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld) {\n                if (vel.parentIdInternal === currentCardId) {\n                    return vel;\n                }\n            } else if (vel.getType() === VpcElType.Card) {\n                /* make sure it's on the right card */\n                if (vel.idInternal === currentCardId) {\n                    return vel;\n                }\n            } else if (vel.getType() === VpcElType.Stack) {\n                return vel;\n            } else {\n                if (!this.hasSentDontSupportMessage) {\n                    alert(\"we don't support selecting this type of object, so going to the current card instead\");\n                    this.hasSentDontSupportMessage = true;\n                }\n                return this.vci.getModel().getCurrentCard();\n            }\n        }\n\n        return undefined;\n    }\n\n    hasSentDontSupportMessage = false;\n\n    /**\n     * update UI\n     */\n    updateUI512Els() {\n        let selected = this.selectedVel('selectedVelId');\n        let shouldBeActive: O<VpcEditPanels>;\n        if (getToolCategory(this.vci.getOptionN('currentTool')) !== VpcToolCtg.CtgEdit) {\n            shouldBeActive = undefined;\n        } else if (slength(this.vci.getOptionS('viewingScriptVelId'))) {\n            shouldBeActive = this.editor;\n        } else if (!selected) {\n            shouldBeActive = this.panelEmpty;\n        } else {\n            shouldBeActive = this.panels.find(selected.getType().toString()) ?? this.panelEmpty;\n            if (shouldBeActive !== this.panelEmpty) {\n                this.showOrHideCheckboxItems(selected, shouldBeActive);\n            }\n        }\n\n        let arPanels = this.panels.getVals();\n        for (let i = 0, len = arPanels.length; i < len; i++) {\n            let panel = arPanels[i];\n            panel.setVisible(this.vci.UI512App(), false);\n        }\n\n        if (shouldBeActive) {\n            shouldBeActive.setVisible(this.vci.UI512App(), true);\n        }\n\n        this.active = shouldBeActive;\n        if (this.active) {\n            this.active.refreshFromModel(this.vci.UI512App());\n        }\n    }\n\n    /**\n     * e.g. certain properties only apply to bg items\n     */\n    showOrHideCheckboxItems(sel: VpcElBase, panel: VpcEditPanels) {\n        let isBgPart = false;\n        if (sel.getType() === VpcElType.Btn || sel.getType() === VpcElType.Fld) {\n            isBgPart = sel.getS('is_bg_velement_id').length > 0;\n        }\n\n        panel.showOrHideBgSpecific(this.vci.UI512App(), isBgPart);\n    }\n\n    /**\n     * save changes\n     */\n    saveChangesToModel(onlyCheckIfDirty: boolean) {\n        if (this.active && getToolCategory(this.vci.getTool()) === VpcToolCtg.CtgEdit) {\n            this.active.saveChangesToModel(this.vci.UI512App(), onlyCheckIfDirty);\n            this.updateUI512Els();\n        }\n    }\n\n    /**\n     * by calling saveChangesToModel with onlyCheckIfDirty flag, we can\n     * compare what is typed in the ui with the current actual state\n     */\n    areThereUnsavedChanges() {\n        try {\n            this.saveChangesToModel(true);\n        } catch (e) {\n            if (e.toString().includes(VpcPanelScriptEditor.thereArePendingChanges)) {\n                return true;\n            } else {\n                throw e;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * respond to keydown\n     */\n    respondKeydown(d: KeyDownEventDetails) {\n        if (this.active && this.active instanceof VpcEditPanelsBase && d.readableShortcut === 'Enter') {\n            this.saveChangesToModel(false);\n            d.setHandled();\n        }\n    }\n\n    /**\n     * respond to clicking a checkbox\n     */\n    protected toggleIfClickedCheckbox(short: string, el: UI512Element) {\n        if (short && short.startsWith('toggle##')) {\n            let vel = this.selectedVel('selectedVelId');\n            if (vel) {\n                el.set('checkmark', !el.getB('checkmark'));\n            }\n        }\n    }\n\n    /**\n     * respond to mouse down, we'll save changes\n     */\n    respondMouseDown(d: MouseDownEventDetails) {\n        if (this.active) {\n            /* any click, no matter where, saves changes */\n            this.active.saveChangesToModel(this.vci.UI512App(), false);\n        }\n    }\n\n    /**\n     * respond to mouseup, and pass to the panel\n     */\n    respondMouseUp(d: MouseUpEventDetails) {\n        if (this.active && d.elClick) {\n            let isOnPanel = this.active.fromFullId(d.elClick.id);\n            if (isOnPanel) {\n                this.toggleIfClickedCheckbox(isOnPanel, d.elClick);\n                this.saveChangesToModel(false);\n\n                if (d.elClick.id && d.elClick.id.endsWith('##btnScript')) {\n                    this.editor.respondToClick(this.vci.UI512App(), d.elClick.id);\n                } else if (d.elClick.id && d.elClick.id.endsWith('##btnCompatibility')) {\n                    VpcEditPanelsStack.onBtnCompatibility(this.vci);\n                } else if (d.elClick.id && this.active instanceof VpcPanelScriptEditor) {\n                    this.editor.respondToClick(this.vci.UI512App(), d.elClick.id);\n                } else if (d.elClick.id && d.elClick.id.endsWith('##btnGenPart')) {\n                    let action = this.vci.getOptionN('currentTool') === VpcTool.Button ? 'mnuObjectsNewBtn' : 'mnuObjectsNewFld';\n                    this.vci.performMenuAction(action);\n                }\n            }\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    init(pr: UI512PresenterBase) {\n        this.editor.vci = this.vci;\n        this.panels.add(VpcElType.Btn.toString(), new VpcEditPanelsBtn('editPanelBtn'));\n        this.panels.add(VpcElType.Card.toString(), new VpcEditPanelsCard('editPanelCd'));\n        this.panels.add(VpcElType.Fld.toString(), new VpcEditPanelsField('editPanelFld'));\n        this.panels.add(VpcElType.Stack.toString(), new VpcEditPanelsStack('editPanelStack'));\n        this.panels.add(VpcElType.Unknown.toString(), ensureDefined(this.panelEmpty, '6v|'));\n        this.panels.add(VpcElType.Product.toString(), this.editor);\n        for (let panel of this.panels.getVals()) {\n            panel.vci = this.vci;\n            panel.x = this.vci.bounds()[0] + ScreenConsts.xAreaWidth + 1;\n            panel.y = this.vci.bounds()[1] + ScreenConsts.yMenuBar + ToolboxDims.IconH + 8;\n            panel.logicalWidth = ScreenConsts.ScreenWidth - (ScreenConsts.xAreaWidth + 1);\n            panel.logicalHeight = ScreenConsts.yAreaHeight - ToolboxDims.IconH;\n            panel.create(pr, this.vci.UI512App());\n            panel.setVisible(this.vci.UI512App(), false);\n            panel.cbGetAndValidateSelectedVel = b => this.selectedVel(b);\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcLyrToolbox.ts",
    "content": "\n/* auto */ import { ToolboxDims, VpcToolboxPatterns } from './vpcToolboxPatterns';\n/* auto */ import { VpcToolboxNav } from './vpcToolboxNav';\n/* auto */ import { VpcToolboxMain } from './vpcToolboxMain';\n/* auto */ import { VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { VpcTool, checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { findEnumToStr, getStrToEnum, slength } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * UI layer containing toolboxes\n */\nexport class VpcAppLyrToolbox extends VpcUILayer {\n    toolsMain = new VpcToolboxMain('toolsMain');\n    toolsPatterns = new VpcToolboxPatterns('toolsPatterns');\n    toolsNav = new VpcToolboxNav('toolsNav');\n    toolsMainDefaultLoc: number[];\n    toolsNavDefaultLoc: number[];\n    toolsPatternsDefaultLoc: number[];\n    cbStopCodeRunning: () => void;\n    cbAnswerMsg: (s: string, cb: () => void) => void;\n\n    /**\n     * initialize layout\n     */\n    init(pr: UI512PresenterBase) {\n        /* add main toolbox */\n        this.toolsMain.iconGroupId = '001';\n        this.toolsMain.x = this.vci.bounds()[0] + ScreenConsts.xAreaWidth + 1;\n        this.toolsMain.y = this.vci.bounds()[1] + ScreenConsts.yMenuBar - 1;\n        this.toolsMain.callbackOnChange = s => this.toolsMainRespondClicked(s);\n        this.toolsMainDefaultLoc = VpcToolboxMain.layout(this.toolsMain, this.vci);\n\n        /* add navigation toolbox */\n        this.toolsNav.iconGroupId = '001';\n        this.toolsNav.x = this.toolsMain.x + ToolboxDims.NavAddedX;\n        this.toolsNav.y = this.toolsMain.y + ToolboxDims.ToolbarHeight;\n        this.toolsNav.callbackOnChange = s => this.toolsNavRespondClicked(s);\n        this.toolsNavDefaultLoc = VpcToolboxNav.layout(this.toolsNav, this.vci);\n\n        /* add patterns toolbox */\n        this.toolsPatterns.iconGroupId = '001';\n        this.toolsPatterns.x = this.toolsMain.x;\n        this.toolsPatterns.y = this.toolsNav.y + ToolboxDims.ToolbarHeight;\n        this.toolsPatterns.callbackOnChange = s => this.toolsPatternsRespondClicked(s);\n        this.toolsPatternsDefaultLoc = VpcToolboxPatterns.layout(this.toolsPatterns, this.vci);\n    }\n\n    /**\n     * update UI\n     */\n    updateUI512Els() {\n        /* don't call this.setOption in this method -- it could cause an infinite loop */\n        let currentTool = this.vci.getOptionN('currentTool');\n\n        /* position toolboxes according to fullscreen mode */\n        this.toolsMain.setVisible(this.vci.UI512App(), true);\n        this.toolsNav.moveAllTo(this.toolsNavDefaultLoc[0], this.toolsNavDefaultLoc[1], this.vci.UI512App());\n\n        /* main toolbox */\n        this.toolsMain.setWhich(this.vci.UI512App(), findEnumToStr(VpcTool, currentTool));\n\n        /* navigation toolbox */\n        let codeRunning = this.vci.isCodeRunning();\n        let cardNum = this.vci.getCurrentCardNum();\n        this.toolsNav.refreshNavIcons(this.vci.UI512App(), codeRunning, cardNum);\n\n        /* patterns toolbox */\n        this.toolsPatterns.setVisible(this.vci.UI512App(), currentTool === VpcTool.Bucket);\n        this.toolsPatterns.setWhich(this.vci.UI512App(), this.vci.getOptionS('currentPattern'));\n    }\n\n    /**\n     * user clicked on patterns palette\n     */\n    toolsPatternsRespondClicked(id: O<string>) {\n        if (id && slength(id) > 0) {\n            this.vci.setOption('currentPattern', id);\n        }\n    }\n\n    /**\n     * user clicked on main palette\n     */\n    toolsMainRespondClicked(sTool: O<string>) {\n        if (sTool) {\n            checkThrow(sTool.length > 1, 'Ka|not a valid tool name.');\n            let toolParsed = getStrToEnum<VpcTool>(VpcTool, 'VpcTool', sTool);\n            this.vci.setTool(toolParsed);\n            this.vci.setOption('viewingScriptVelId', '');\n            this.vci.setOption('selectedVelId', '');\n        } else {\n            assertWarn(false, `6w|invalid tool id ${sTool}`);\n        }\n    }\n\n    /**\n     * user clicked on nav palette\n     */\n    toolsNavRespondClicked(id: O<string>) {\n        /* immediately undo the highlight */\n        this.toolsNav.setWhich(this.vci.UI512App(), undefined);\n\n        if (id === 'cardNumOrStop') {\n            this.cbStopCodeRunning();\n        } else if (id === 'cardPrev') {\n            this.vci.performMenuAction('mnuGoCardPrev');\n        } else if (id === 'cardNext') {\n            this.vci.performMenuAction('mnuGoCardNext');\n        } else if (id === 'dupeCardOrStatus') {\n            if (!this.vci.isCodeRunning()) {\n                this.vci.performMenuAction('mnuDupeCardPaint');\n            }\n        } else if (id === 'makeAnimOrStatus') {\n            if (!this.vci.isCodeRunning()) {\n                this.vci.performMenuAction('mnuExportGif');\n            }\n        }\n    }\n\n    /**\n     * is this element the 'stop' button?\n     */\n    isElemStopRunning(el: O<UI512Element>): boolean {\n        if (el) {\n            let short = this.toolsNav.fromFullId(el.id);\n            if (short === 'choice##cardNumOrStop') {\n                return true;\n            }\n\n            short = this.toolsMain.fromFullId(el.id);\n            if (short && (short.includes('choice##button') || short.includes('choice##field'))) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcPanelsInterface.ts",
    "content": "\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a property panel is a window on the right side of the screen,\n * for editing vel properties.\n */\nexport interface VpcEditPanels {\n    x: number;\n    y: number;\n    logicalWidth: number;\n    logicalHeight: number;\n    vci: VpcStateInterface;\n    create(pr: UI512PresenterBase, app: UI512Application): void;\n    setVisible(app: UI512Application, visible: boolean): void;\n    refreshFromModel(app: UI512Application): void;\n    saveChangesToModel(app: UI512Application, onlyCheckIfDirty: boolean): void;\n    fromFullId(fullId: string): O<string>;\n    cbGetAndValidateSelectedVel: (prp: string) => O<VpcElBase>;\n    showOrHideBgSpecific(app: UI512Application, isBgPart: boolean): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcScriptEditor.ts",
    "content": "\n/* auto */ import { VpcEditPanels } from './vpcPanelsInterface';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcErrStage, checkThrowNotifyMsg, vpcElTypeToString } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MapKeyToObjectCanSet, Util512 } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512TextEvents } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { KeyDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField, UI512FldStyle } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512BtnStyle } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontStyling, textFontStylingToString } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { WndBorderDecorationConsts } from './../../ui512/composites/ui512Composites';\n/* auto */ import { UI512CompCodeEditorFont } from './../../ui512/composites/ui512CodeEditorAutoIndent';\n/* auto */ import { UI512CompCodeEditor } from './../../ui512/composites/ui512CodeEditor';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the ViperCard script editor\n */\nexport class VpcPanelScriptEditor extends UI512CompCodeEditor implements VpcEditPanels {\n    hasCloseBtn = true;\n    autoCreateBlock = true;\n    compositeType = 'VpcPanelScriptEditor';\n    lineCommentPrefix = '--~ ';\n    blockCommentStart = '--[[';\n    blockCommentEnd = ']]';\n    vci: VpcStateInterface;\n    needsToBeSaved = new MapKeyToObjectCanSet<boolean>();\n    cbGetAndValidateSelectedVel: (prp: string) => O<VpcElBase>;\n    cbAnswerMsg: (s: string, cb: () => void) => void;\n    protected status1a: UI512ElLabel;\n    protected status2a: UI512ElLabel;\n    protected status3a: UI512ElLabel;\n    protected lastErrInfo: O<[string, string, number, VpcErrStage, string]>;\n    readonly monaco = `monaco_9_${textFontStylingToString(TextFontStyling.Default)}`;\n    readonly genevaPlain = `geneva_10_${textFontStylingToString(TextFontStyling.Default)}`;\n    readonly genevaBold = `geneva_10_${textFontStylingToString(TextFontStyling.Bold)}`;\n    constructor(compositeId: string) {\n        super(compositeId);\n        this.autoIndent.lineContinuation = ['\\\\', '\\xC2'];\n        this.autoIndent.linesCauseIndent = [\n            [/^repeat\\b/, /^end\\s+repeat\\b/, 'end repeat'],\n            [/^if\\b/, /^(else\\b)|(end\\s+if)\\b/, 'end if'],\n            [/^else\\b/, /^(else\\b)|(end\\s+if)\\b/, ''],\n            [/^on\\s+(\\w+)\\b/, /^end\\s+%MATCH%\\b/, 'end %MATCH%'],\n            [/^function\\s+(\\w+)\\b/, /^end\\s+%MATCH%\\b/, 'end %MATCH%']\n        ];\n\n        this.autoIndent.caseSensitive = false;\n        this.autoIndent.useTabs = true;\n        this.autoIndent.useAutoIndent = true;\n        this.autoIndent.useAutoCreateBlock = true;\n        this.autoIndent.lineDoesNotActuallyStartBlock = s => this.lineDoesNotActuallyStartBlock(s);\n    }\n\n    /**\n     * a higher layer will tell us info about the current error\n     */\n    setLastErrInfo(velId: string, errDetails: string, lineNum: number, stage: VpcErrStage, trace: string) {\n        if (errDetails.startsWith('Note: ')) {\n            errDetails = errDetails.slice('Note: '.length);\n        }\n\n        this.lastErrInfo = [velId, errDetails, lineNum, stage, trace];\n    }\n\n    /**\n     * initialize layout\n     */\n    createSpecific(app: UI512Application) {\n        /* constants */\n        const spacerHeight = 6;\n        const footerHeight = 65;\n\n        /* occurs because apparent discrepency between\n        'screenwidth' and bounds[2] */\n        this.logicalWidth -= 46;\n\n        /* draw a 1px border around the panel */\n        let grp = app.getGroup(this.grpId);\n        let bg = this.genBtn(app, grp, 'bg');\n        bg.set('autohighlight', false);\n        bg.setDimensions(this.x, this.y, this.logicalWidth, this.logicalHeight);\n\n        /* draw window decoration */\n        let headerHeight = this.drawWindowDecoration(app, new WndBorderDecorationConsts(), this.hasCloseBtn);\n\n        /* draw spacer */\n        let curY = this.y + headerHeight - 1;\n        let spacer = this.genBtn(app, grp, 'spacer');\n        spacer.set('autohighlight', false);\n        spacer.setDimensions(this.x, curY, this.logicalWidth, spacerHeight);\n        curY += spacerHeight - 1;\n\n        /* draw the code editor field */\n        this.el = this.genChild(app, grp, 'editor', UI512ElTextField);\n        this.el.set('style', UI512FldStyle.Rectangle);\n        this.el.set('labelwrap', false);\n        this.el.set('scrollbar', true);\n        this.el.set('defaultFont', UI512CompCodeEditorFont.font);\n        this.el.set('nudgey', 2);\n        this.el.setDimensions(this.x, curY, this.logicalWidth, this.y + this.logicalHeight - curY - footerHeight);\n\n        /* draw status text */\n        this.status3a = this.genChild(app, grp, 'status3a', UI512ElLabel);\n        this.status3a.setDimensions(this.el.x + 5, this.el.bottom + 36, this.el.w - 10, 20);\n        this.status2a = this.genChild(app, grp, 'status2a', UI512ElLabel);\n        this.status2a.setDimensions(this.el.x + 5, this.el.bottom + 22, this.el.w - 10, 17);\n        this.status1a = this.genChild(app, grp, 'status1a', UI512ElLabel);\n        this.status1a.setDimensions(this.el.x + 5, this.el.bottom, this.el.w - 10, 20);\n\n        /* draw Help buttton */\n        const hlpspaceFromRight = 9;\n        const hlpspaceFromBottom = 41;\n        const hlpbtnW = 21;\n        const hlpbtnH = 23;\n        let btnHelp = this.genBtn(app, grp, 'btnScriptHelp');\n        btnHelp.set('labeltext', '');\n        btnHelp.set('icongroupid', '002');\n        btnHelp.set('iconnumber', 248);\n        btnHelp.set('style', UI512BtnStyle.OSStandard);\n        btnHelp.setDimensions(\n            this.x + this.logicalWidth - (hlpbtnW + hlpspaceFromRight),\n            this.y + this.logicalHeight - (hlpbtnH + hlpspaceFromBottom),\n            hlpbtnW,\n            hlpbtnH\n        );\n\n        /* draw Save buttton */\n        const spaceFromRight = 9;\n        const spaceFromBottom = 17;\n        const btnW = 68 + 15;\n        const btnH = 23;\n        let btnSave = this.genBtn(app, grp, 'btnScriptEditorSave');\n        btnSave.set('labeltext', '');\n        btnSave.set('style', UI512BtnStyle.OSStandard);\n        btnSave.setDimensions(\n            this.x + this.logicalWidth - (btnW + spaceFromRight),\n            this.y + this.logicalHeight - (btnH + spaceFromBottom),\n            btnW,\n            btnH\n        );\n    }\n\n    /**\n     * refresh\n     */\n    refreshFromModel(app: UI512Application) {\n        let vel = this.cbGetAndValidateSelectedVel('viewingScriptVelId');\n        let grp = app.getGroup(this.grpId);\n        if (!vel) {\n            this.setContent(lng('lngElement not found.'));\n            grp.getEl(this.getElId('caption')).set('labeltext', lng('lngElement not found.'));\n        } else {\n            let caption = grp.getEl(this.getElId('caption'));\n            let captionMsg = lng('lngScript of %c');\n            let velName = vpcElTypeToString(vel.getType(), true) + ` \"${vel.getS('name')}\"`;\n            captionMsg = captionMsg.replace(/%c/g, velName);\n            captionMsg = captionMsg.substr(0, 36);\n            caption.set('labeltext', captionMsg);\n\n            let selcaret = this.el.getN('selcaret');\n            let selend = this.el.getN('selend');\n            let scrl = this.el.getN('scrollamt');\n            this.setContent(vel.getS('script'));\n            this.el.set('selcaret', selcaret);\n            this.el.set('selend', selend);\n            this.el.set('scrollamt', scrl);\n            this.refreshStatusLabels(app);\n        }\n    }\n\n    /**\n     * refresh status labels,\n     * shows the last error encountered by the codeExec object\n     */\n    refreshStatusLabels(app: UI512Application) {\n        if (this.lastErrInfo) {\n            this.status1a.set('labeltext', `Stopped on line ${this.lastErrInfo[2]},`);\n\n            let errDetails = this.lastErrInfo[1];\n            let sErr = `Script: ${errDetails}`;\n            const maxLen = 44;\n            sErr = Util512.truncateWithEllipsis(sErr, maxLen);\n            sErr = UI512DrawText.setFont(sErr, this.monaco);\n            this.status2a.set('labeltext', sErr);\n\n            let strace = this.lastErrInfo[4].length > 3 ? 'Trace' : '';\n            strace = UI512DrawText.setFont(strace, this.monaco);\n            this.status3a.set('labeltext', strace);\n        } else {\n            this.status1a.set('labeltext', '');\n            this.status2a.set('labeltext', '');\n            this.status3a.set('labeltext', '');\n        }\n\n        /* does script have unsaved changes? */\n        let velid = this.vci.getOptionS('viewingScriptVelId');\n\n        let grp = app.getGroup(this.grpId);\n        let btnSave = grp.getEl(this.getElId('btnScriptEditorSave'));\n        if (this.needsToBeSaved.find(velid)) {\n            btnSave.set('labeltext', UI512DrawText.setFont(lng('lngSave Script'), this.genevaBold));\n        } else {\n            btnSave.set('labeltext', UI512DrawText.setFont(lng('lngSave Script'), this.genevaPlain));\n        }\n    }\n\n    /**\n     * user has clicked 'Save Script'\n     */\n    protected onBtnSaveScript() {\n        let vel = this.cbGetAndValidateSelectedVel('viewingScriptVelId');\n        if (!vel) {\n            return;\n        }\n\n        /* saves script */\n        this.saveChangesToModel(this.vci.UI512App(), false);\n\n        /* clear the encountered error message */\n        this.lastErrInfo = undefined;\n        this.needsToBeSaved.remove(vel.idInternal);\n        this.refreshStatusLabels(this.vci.UI512App());\n        this.vci.causeUIRedraw();\n    }\n\n    /**\n     * scroll to and highlight the target line\n     */\n    scrollToErrorPosition(pr: O<UI512PresenterBase>) {\n        if (this.lastErrInfo !== undefined) {\n            let lineNum = this.lastErrInfo[2];\n            lineNum -= 1; /* from 1-based to 0-based */\n            lineNum = Math.max(0, lineNum);\n            let gel = new UI512ElTextFieldAsGeneric(this.el);\n            TextSelModify.selectLineInField(gel, lineNum);\n\n            if (pr) {\n                pr.setCurrentFocus(this.el.id);\n            }\n        }\n    }\n\n    /**\n     * respond to keydown\n     */\n    respondKeydown(d: KeyDownEventDetails) {\n        if (!this.el || !this.el.getB('canselecttext') || !this.el.getB('canedit')) {\n            return;\n        }\n\n        if (UI512TextEvents.keyDownProbablyCausesTextChange(d)) {\n            /* make the 'save' button bold since we have unsaved changes */\n            let vel = this.cbGetAndValidateSelectedVel('selectedVelId');\n            if (vel) {\n                this.needsToBeSaved.set(vel.idInternal, true);\n                this.refreshStatusLabels(this.vci.UI512App());\n            }\n        }\n\n        super.respondKeydown(d);\n\n        /* typically changes are saved to model after every keypress,\n        but let's save less often, after every Enter key is pressed.\n        this way, it's better when you hit undo.\n        note that we call saveChangesToModel after super.respondKeydown\n        in order to include any indentation/text insertion changes.*/\n        if (d.readableShortcut.toLowerCase().search(/\\benter\\b/) !== -1) {\n            this.saveChangesToModel(this.vci.UI512App(), false);\n        }\n    }\n\n    /**\n     * respond to mouse click\n     */\n    respondToClick(app: UI512Application, clicked: string) {\n        if (clicked.endsWith('##btnScript')) {\n            /* user clicked on 'edit script' in the lower right of the panel, so\n            open the script editor */\n            let validVel = this.cbGetAndValidateSelectedVel('selectedVelId');\n            if (validVel) {\n                this.vci.setOption('viewingScriptVelId', validVel.idInternal);\n\n                /* reset scroll, in case the last script we saw was really long */\n                this.el.set('scrollamt', 0);\n                this.refreshFromModel(app);\n            }\n        } else {\n            let short = this.fromFullId(clicked);\n            if (short === 'caption') {\n                /* clicked the close box */\n                this.saveChangesToModel(app, false);\n                this.vci.setOption('viewingScriptVelId', '');\n            } else if (short === 'btnScriptEditorSave') {\n                /* user clicked 'save script' */\n                this.onBtnSaveScript();\n            } else if (short === 'btnScriptHelp') {\n                /* user clicked help */\n                this.vci.setNonModalDialogByStr('VpcNonModalDocViewerReference');\n            } else if (short === 'status1a') {\n                /* user clicked the line number, scroll to that line */\n                this.scrollToErrorPosition(undefined);\n            } else if (short === 'status2a') {\n                /* user clicked the error message, show the details */\n                if (this.lastErrInfo && this.lastErrInfo[1]) {\n                    let sDetails = Util512.capitalizeFirst(this.lastErrInfo[1].trim());\n                    this.cbAnswerMsg(sDetails, () => {});\n                    /* remember to not run other code after showing modal dialog */\n                }\n            } else if (short === 'status3a') {\n                /* user clicked the stack trace, show details */\n                if (this.lastErrInfo && this.lastErrInfo[4]) {\n                    let sDetails = this.lastErrInfo[4];\n                    this.cbAnswerMsg(sDetails, () => {});\n                    /* remember to not run other code after showing modal dialog */\n                }\n            }\n        }\n    }\n\n    /** strip these */\n    protected stripStringsAndComments(s: string) {\n        s = s.split('--')[0];\n        s = s.replace(/\"[^\"]+\"/g, '');\n        return s;\n    }\n\n    /**\n     * let's support single-line ifs...\n     * and singleline else statements.\n     */\n    protected lineDoesNotActuallyStartBlock(s: string) {\n        s = s.toLowerCase().trim();\n        if (s.startsWith('if ')) {\n            s = this.stripStringsAndComments(s);\n            if (!s.endsWith(' then')) {\n                let findThen = s.indexOf(' then ');\n                if (findThen !== -1) {\n                    return true;\n                }\n            }\n        } else if (s.startsWith('else if ')) {\n            s = this.stripStringsAndComments(s);\n            if (!s.endsWith(' then')) {\n                let findThen = s.indexOf(' then ');\n                if (findThen !== -1) {\n                    return true;\n                }\n            }\n        } else if (s.trim() === 'else') {\n        } else if (s.startsWith('else ')) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * message that there are pending changes\n     */\n    static readonly thereArePendingChanges = 'There are pending changes.';\n\n    /**\n     * save the script to the script property on the vel\n     * if onlyCheckIfDirty is set, skip saving the script and only check if\n     * there are unsaved changes\n     */\n    saveChangesToModel(app: UI512Application, onlyCheckIfDirty: boolean) {\n        let vel = this.cbGetAndValidateSelectedVel('viewingScriptVelId');\n        if (!vel || !this.el) {\n            return;\n        }\n\n        let newscript = this.el.getFmTxt().toUnformatted();\n        if (onlyCheckIfDirty) {\n            let current = vel.getS('script');\n            if (current !== newscript) {\n                checkThrowNotifyMsg(false, VpcPanelScriptEditor.thereArePendingChanges);\n            }\n        } else {\n            vel.setOnVel('script', newscript, this.vci.getModel());\n        }\n    }\n\n    /**\n     * not relevant, there's nothing different in a bg\n     */\n    showOrHideBgSpecific(_app: UI512Application, _isBgPart: boolean) {}\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcToolboxMain.ts",
    "content": "\n/* auto */ import { ToolboxDims } from './vpcToolboxPatterns';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompToolbox } from './../../ui512/composites/ui512Toolbox';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the main tool palette\n */\nexport class VpcToolboxMain extends UI512CompToolbox {\n    compositeType = 'ToolboxMain';\n\n    /**\n     * initialize layout\n     */\n    static layout(toolsMain: VpcToolboxMain, vci: VpcStateInterface) {\n        toolsMain.iconH = ToolboxDims.IconH;\n        toolsMain.widthOfIcon = (id: string) => {\n            return ToolboxDims.MainW;\n        };\n\n        toolsMain.items = [\n            ['browse', 0],\n            ['button', 1],\n            ['field', 17],\n            ['select', 2],\n            ['brush', 5],\n            ['bucket', 11],\n            ['pencil', 4],\n            ['line', 7],\n            ['lasso', 3],\n            ['eraser', 6],\n            ['rect', 9],\n            ['oval', 12],\n            ['roundrect', 10],\n            ['curve', 13],\n            ['stamp', 97],\n            ['spray', 8]\n        ];\n\n        assertEq(16, toolsMain.items.length, '6y|');\n        toolsMain.logicalWidth = toolsMain.items.length * ToolboxDims.MainW - (toolsMain.items.length - 1);\n        toolsMain.logicalHeight = 1;\n        toolsMain.hasCloseBtn = false;\n        toolsMain.create(vci.getPresenter(), vci.UI512App());\n        toolsMain.setWhich(vci.UI512App(), 'browse');\n\n        toolsMain.logicalHeight = ToolboxDims.ToolbarHeight;\n        return [toolsMain.x, toolsMain.y];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcToolboxNav.ts",
    "content": "\n/* auto */ import { ToolboxDims } from './vpcToolboxPatterns';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { UI512CompToolbox } from './../../ui512/composites/ui512Toolbox';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { TextFontSpec } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a tool palette for moving from card to card\n */\nexport class VpcToolboxNav extends UI512CompToolbox {\n    compositeType = 'ToolboxNav';\n    readonly geneva: string;\n    constructor(id: string) {\n        super(id);\n        let font = new TextFontSpec('geneva', 0, 10);\n        this.geneva = font.toSpecString();\n    }\n\n    /**\n     * override refreshHighlight to do nothing,\n     * don't highlight any button at all\n     */\n    protected refreshHighlight(app: UI512Application) {}\n\n    /**\n     * when a script is running, we'll show a Stop icon\n     * when a script isn't running, show the current card number\n     */\n    refreshNavIcons(app: UI512Application, coderunning: boolean, cardnum: number) {\n        this.setWhich(app, undefined);\n        let grpnav = app.getGroup(this.grpId);\n\n        let btnCardNumOrStop = grpnav.getEl(this.getElId('choice##cardNumOrStop'));\n        let btnDupeCardOrStatus = grpnav.getEl(this.getElId('choice##dupeCardOrStatus'));\n        let btnMakeAnimOrStatus = grpnav.getEl(this.getElId('choice##makeAnimOrStatus'));\n\n        if (coderunning) {\n            btnCardNumOrStop.set('icongroupid', '001');\n            btnCardNumOrStop.set('iconnumber', 90);\n            btnCardNumOrStop.set('labeltext', '');\n            btnCardNumOrStop.set('autohighlight', true);\n            btnDupeCardOrStatus.set('iconnumber', 91); /* waiting */\n            btnDupeCardOrStatus.set('autohighlight', false);\n            btnMakeAnimOrStatus.set('iconnumber', 76); /* white */\n            btnMakeAnimOrStatus.set('autohighlight', false);\n        } else {\n            btnCardNumOrStop.set('icongroupid', '');\n            btnCardNumOrStop.set('iconnumber', -1);\n            btnCardNumOrStop.set('labeltext', UI512DrawText.setFont((cardnum + 1).toString(), this.geneva));\n            btnCardNumOrStop.set('autohighlight', false);\n            btnDupeCardOrStatus.set('iconnumber', 98); /* dupecard */\n            btnDupeCardOrStatus.set('autohighlight', true);\n            btnMakeAnimOrStatus.set('iconnumber', 96); /* anim */\n            btnMakeAnimOrStatus.set('autohighlight', true);\n        }\n    }\n\n    /**\n     * initialize layout\n     */\n    static layout(toolsNav: VpcToolboxNav, vci: VpcStateInterface) {\n        toolsNav.iconH = 24;\n        toolsNav.widthOfIcon = (id: string) => {\n            return ToolboxDims.NavW;\n        };\n\n        const black = 77;\n        toolsNav.items = [\n            ['cardNumOrStop', black],\n            ['cardPrev', 94],\n            ['cardNext', 95],\n            ['dupeCardOrStatus', black],\n            ['makeAnimOrStatus', black]\n        ];\n\n        toolsNav.logicalWidth = toolsNav.items.length * ToolboxDims.NavW - (toolsNav.items.length - 1);\n        toolsNav.logicalHeight = 1;\n        toolsNav.hasCloseBtn = false;\n        toolsNav.create(vci.getPresenter(), vci.UI512App());\n        toolsNav.setWhich(vci.UI512App(), undefined);\n        toolsNav.logicalHeight = ToolboxDims.ToolbarHeight;\n        return [toolsNav.x, toolsNav.y];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/panels/vpcToolboxPatterns.ts",
    "content": "\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { assertEq } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompToolbox } from './../../ui512/composites/ui512Toolbox';\n/* auto */ import { UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a tool palette showing the available fill patterns\n */\nexport class VpcToolboxPatterns extends UI512CompToolbox {\n    compositeType = 'ToolboxPatterns';\n    hiliteSelected: UI512ElButton[] = [];\n    createSpecific(app: UI512Application) {\n        super.createSpecific(app);\n        let grp = app.getGroup(this.grpId);\n        for (let i = 0; i < 4; i++) {\n            /* create elements for the hilite */\n            this.hiliteSelected[i] = this.genBtn(app, grp, 'selection' + i);\n            this.hiliteSelected[i].set('autohighlight', false);\n        }\n\n        /* adjust the icon size for black */\n        let choiceBlack = grp.getEl(this.getElId('choice##pattern105'));\n        choiceBlack.set('iconadjustwidth', 17 - 32);\n        choiceBlack.set('iconadjustheight', 12 - 32);\n    }\n\n    /**\n     * override the refreshHighlight method,\n     * instead of inverting colors of the selected tool,\n     * draw a box around it\n     */\n    protected refreshHighlight(app: UI512Application) {\n        const shrink = 2;\n        let grp = app.getGroup(this.grpId);\n        let lookfor = this.whichChosen;\n        for (let item of this.items) {\n            let id = this.getElId('choice##' + item[0]);\n            let el = grp.getEl(id);\n            el.set('highlightactive', false);\n            el.set('autohighlight', item[0] !== lookfor);\n            if (item[0] === lookfor) {\n                let subr = [el.x, el.y, el.w - shrink, el.h - shrink];\n                if (this.hiliteSelected.length) {\n                    this.hiliteSelected[0].setDimensions(subr[0], subr[1], subr[2], 2);\n                    this.hiliteSelected[1].setDimensions(subr[0], subr[1], 2, subr[3]);\n                    this.hiliteSelected[2].setDimensions(subr[0] + subr[2], subr[1], 2, subr[3]);\n                    this.hiliteSelected[3].setDimensions(subr[0], subr[1] + subr[3], subr[2], 2);\n                }\n            }\n        }\n    }\n\n    /**\n     * initialize the layout\n     */\n    static layout(toolsPatterns: VpcToolboxPatterns, vci: VpcStateInterface) {\n        toolsPatterns.iconH = ToolboxDims.IconH;\n        toolsPatterns.widthOfIcon = (id: string) => {\n            return ToolboxDims.PatternsW;\n        };\n\n        toolsPatterns.logicalHeight = 1;\n        toolsPatterns.logicalWidth = ToolboxDims.PatternsPerRow * ToolboxDims.PatternsW - (ToolboxDims.PatternsPerRow - 1);\n\n        toolsPatterns.items = [\n            ['pattern100', 76],\n            ['pattern148', 74],\n            ['pattern101', 36],\n            ['pattern102', 37],\n            ['pattern103', 38],\n            ['pattern104', 39],\n            ['pattern106', 40],\n            ['pattern107', 41],\n            ['pattern108', 42],\n            ['pattern109', 43],\n            ['pattern110', 44],\n            ['pattern111', 45],\n            ['pattern112', 46],\n            ['pattern113', 47],\n            ['pattern114', 48],\n            ['pattern115', 49],\n            ['pattern116', 50],\n            ['pattern117', 51],\n            ['pattern118', 52],\n            ['pattern119', 53],\n            ['pattern120', 54],\n            ['pattern121', 55],\n            ['pattern122', 56],\n            ['pattern123', 57],\n            ['pattern124', 58],\n            ['pattern125', 59],\n            ['pattern126', 60],\n            ['pattern127', 61],\n            ['pattern128', 62],\n            ['pattern129', 63],\n            ['pattern130', 64],\n            ['pattern131', 65],\n            ['pattern132', 66],\n            ['pattern133', 67],\n            ['pattern134', 68],\n            ['pattern135', 69],\n            ['pattern136', 70],\n            ['pattern137', 71],\n            ['pattern138', 72],\n            ['pattern139', 73],\n            ['pattern140', 82],\n            ['pattern141', 83],\n            ['pattern142', 84],\n            ['pattern143', 85],\n            ['pattern144', 86],\n            ['pattern145', 87],\n            ['pattern146', 88],\n            ['pattern105', 77]\n        ];\n\n        assertEq(48, toolsPatterns.items.length, '6x|');\n        toolsPatterns.hasCloseBtn = false;\n        toolsPatterns.create(vci.getPresenter(), vci.UI512App());\n        toolsPatterns.setWhich(vci.UI512App(), vci.getOptionS('currentPattern'));\n        toolsPatterns.logicalHeight = ToolboxDims.ToolbarHeight * 3;\n        return [toolsPatterns.x, toolsPatterns.y];\n    }\n}\n\n/**\n * constants for tool dimensions\n */\nexport enum ToolboxDims {\n    IconH = 24,\n    MainW = 24,\n    PatternsW = 24,\n    PatternsPerRow = 16,\n    ToolbarHeight = 33,\n    NavW = 24,\n    NavAddedX = 253\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcInternalDirectiveImpl.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { RememberHistory } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { UndoableActionCreateVel, UndoableActionDeleteVel } from './../state/vpcUndo';\n/* auto */ import { VpcExecInternalDirectiveAbstract } from './../../vpc/codeexec/vpcScriptExecInternalDirective';\n/* auto */ import { RequestedVelRef } from './../../vpc/vpcutils/vpcRequestedReference';\n/* auto */ import { VpcPresenterInterface } from './vpcPresenterInterface';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcElType, VpcTool, checkThrow, checkThrowInternal, checkThrowNotifyMsg, vpcElTypeShowInUI } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcGettableSerialization } from './../../vpc/vel/velSerialization';\n/* auto */ import { VpcElField, VpcTextFieldAsGeneric } from './../../vpc/vel/velField';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { VpcElBase, VpcElSizable } from './../../vpc/vel/velBase';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, ValHolder, longstr } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { UI512DrawText } from './../../ui512/drawtext/ui512DrawText';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * complete implementation of VpcExecInternalDirective\n */\nexport class VpcExecInternalDirectiveFull extends VpcExecInternalDirectiveAbstract {\n    constructor(protected pr: VpcPresenterInterface, protected vci: VpcStateInterface) {\n        super();\n    }\n\n    /**\n     * set contents of global var\n     */\n    setGlobal(key: string, v: VpcVal) {\n        this.vci.getCodeExec().globals.set(key, v);\n    }\n\n    /**\n     * get contents of global var\n     */\n    getGlobal(key: string): VpcVal {\n        return this.vci.getCodeExec().globals.getOrFallback(key, VpcValS(''));\n    }\n\n    /**\n     * access cardhistory array\n     */\n    getCardHistory(): RememberHistory {\n        return this.vci.getCodeExec().cardHistory;\n    }\n\n    /**\n     * make a new vel, can't send messages like newButton\n     */\n    goMakevelwithoutmsg(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let vel: VpcElBase;\n        let isFromUI = false;\n        if (param.val.toLowerCase().endsWith('fromui')) {\n            isFromUI = true;\n            param.val = param.val.replace(/fromui/i, '');\n        }\n\n        if (param.val === 'btn' || param.val === 'button') {\n            vel = this.makeBtnFldWithoutMsg(VpcElType.Btn, isFromUI);\n        } else if (param.val === 'fld' || param.val === 'field') {\n            vel = this.makeBtnFldWithoutMsg(VpcElType.Fld, isFromUI);\n        } else if (param.val === 'card' || param.val === 'dupecardpaint') {\n            vel = this.makeCardWithoutMsg(cur, param.val === 'dupecardpaint');\n        } else if (param.val === 'bg' || param.val === 'bkgnd') {\n            vel = this.makeBgWithoutMsg(cur);\n        } else {\n            checkThrowInternal(false, 'WZ|cannot make this type');\n        }\n\n        param.val = vel.getUserFacingId();\n        return vel;\n    }\n\n    /**\n     * paste a copied vel\n     */\n    goPastecardorvel(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let id = this.vci.getOptionS('copiedVelId');\n        let found = this.vci.getModel().findByIdUntyped(id);\n        if (found && (found.getType() === VpcElType.Btn || found.getType() === VpcElType.Fld)) {\n            checkThrow(!found.getS('is_bg_velement_id'), 'WY|bg elems not yet supported');\n            let dupe = this.makeBtnFldWithoutMsg(found.getType(), true);\n            let asObj = VpcGettableSerialization.serializeGettable(found);\n            let asNewObj = JSON.parse(JSON.stringify(asObj));\n            VpcGettableSerialization.deserializeSettable(dupe, asNewObj, this.outside.Model());\n\n            /* move it a bit */\n            let amtToMove = Util512Higher.getRandIntInclusiveWeak(10, 50);\n            dupe.setOnVel('x', Math.min(ScreenConsts.xAreaWidth, dupe.getN('x') + amtToMove), this.vci.getModel());\n            dupe.setOnVel('y', Math.min(ScreenConsts.yAreaHeight, dupe.getN('y') + amtToMove), this.vci.getModel());\n        } else if (id && id.length) {\n            checkThrowNotifyMsg(false, 'U9|Pasting this type of element is not yet supported.');\n        } else {\n            checkThrowNotifyMsg(false, 'U8|Nothing has been copied.');\n        }\n    }\n\n    /**\n     * remove a vel\n     */\n    goRemovevelwithoutmsg(param: ValHolder<string>, cur: VpcElCard, msg: [string, string]) {\n        let idInternal = param.val;\n        let ref = new RequestedVelRef(VpcElType.Unknown);\n        ref.lookById = Util512.parseInt(idInternal) ?? 0;\n        ref.partIsCdOrBg = true;\n        let vel = this.outside.ResolveVelRef(ref);\n        if (vel) {\n            this.removeVel(vel);\n            param.val = vel.getUserFacingId();\n        } else {\n            param.val = '';\n        }\n    }\n\n    /**\n     * make a background\n     */\n    protected makeBgWithoutMsg(cur: VpcElCard) {\n        let bg = this.rawCreateOneVelUseCarefully(this.vci.getModel().stack.idInternal, VpcElType.Bg, -1);\n        this.rawCreateOneVelUseCarefully(bg.idInternal, VpcElType.Card, -1);\n        return bg;\n    }\n\n    /**\n     * make a card\n     */\n    protected makeCardWithoutMsg(cur: VpcElCard, isDupePaint: boolean) {\n        let paint = cur.getS('paint');\n        let currentBg = this.vci.getModel().getById(VpcElBg, cur.parentIdInternal);\n        let currentIndex = currentBg.cards.findIndex(cd => cd.idInternal === cur.idInternal);\n        let indexRelativeToBg = currentIndex === -1 ? 0 : currentIndex + 1;\n        let vel = this.rawCreateOneVelUseCarefully(cur.parentIdInternal, VpcElType.Card, indexRelativeToBg);\n        if (isDupePaint) {\n            /* can't use copy card/paste card since it's not yet impl'd */\n            /* use this workaround instead (only copies the paint) */\n            vel.setOnVel('paint', paint, this.vci.getModel());\n        }\n        return vel;\n    }\n\n    /**\n     * make a btn or fld\n     */\n    protected makeBtnFldWithoutMsg(type: VpcElType, fromui: boolean) {\n        /* make a button that is tall enough to show an icon, since\n        in prev versions icon clipping didn't work well */\n        const defaultBtnW = 100;\n        const defaultBtnH = 58;\n        const defaultFldW = 100;\n        const defaultFldH = 100;\n        let w = 0;\n        let h = 0;\n        if (type === VpcElType.Btn) {\n            w = defaultBtnW;\n            h = defaultBtnH;\n        } else if (type === VpcElType.Fld) {\n            w = defaultFldW;\n            h = defaultFldH;\n        } else {\n            checkThrowInternal(false, '6E|wrong type ' + type);\n        }\n\n        let newX = this.pr.userBounds[0] + Util512Higher.getRandIntInclusiveWeak(20, 200);\n        let newY = this.pr.userBounds[1] + Util512Higher.getRandIntInclusiveWeak(20, 200);\n        let currentCardId = this.vci.getOutside().GetOptionS('currentCardId');\n        let vel = this.rawCreateOneVelUseCarefully(currentCardId, type, -1);\n        assertTrue(vel instanceof VpcElSizable, '6u|not VpcElSizable');\n        vel.setDimensions(newX, newY, w, h, this.vci.getModel());\n        vel.setOnVel(\n            'name',\n            longstr(`my ${vpcElTypeShowInUI(vel.getType())}\n             ${this.vci.getModel().stack.getNextNumberForElemName(this.vci.getModel(), type === VpcElType.Btn)}`),\n            this.vci.getModel()\n        );\n\n        if (type === VpcElType.Btn) {\n            /* give it a style and initial script */\n            vel.setProp('style', VpcValS('roundrect'), this.vci.getModel());\n            vel.setOnVel('label', lng('lngNew Button'), this.vci.getModel());\n            vel.setOnVel('showlabel', true, this.vci.getModel());\n            vel.setOnVel('script', 'on mouseUp\\n\\tanswer \"the button was clicked.\"\\nend mouseUp', this.vci.getModel());\n        } else if (type === VpcElType.Fld && vel instanceof VpcElField) {\n            /* need to give it content, since we don't currently\n            draw the lines, otherwise you'd see nothing there */\n            let newTxt = FormattedText.newFromSerialized(\n                UI512DrawText.setFont('abcde\\nabcde\\nabcde', vel.getDefaultFontAsUi512())\n            );\n\n            vel.setFmTxt(newTxt, this.vci.getModel());\n            vel.setProp('style', VpcValS('scrolling'), this.vci.getModel());\n        } else {\n            checkThrowInternal(false, 'WX|btn or fld expected');\n        }\n\n        /* important: only mess with proppanels if not fromui!\n        otherwise closing the invisible panel will set props on the object */\n        if (fromui) {\n            /* save *before* setting selectedVelId */\n            this.pr.lyrPropPanel.saveChangesToModel(false);\n            this.pr.lyrPropPanel.updateUI512Els();\n            this.vci.setOption('selectedVelId', vel.idInternal);\n            this.vci.setOption('viewingScriptVelId', '');\n\n            /* update before tool is set */\n            this.pr.lyrPropPanel.updateUI512Els();\n\n            /* change tool -- so we can see it selected  */\n            let needChangeTool = type === VpcElType.Btn ? VpcTool.Button : VpcTool.Field;\n            this.setUpcomingTool(needChangeTool);\n        }\n\n        return vel;\n    }\n\n    /**\n     * in a menu action, current tool might temporarily be browse\n     */\n    protected getUpcomingTool() {\n        if (this.vci.getTool() === VpcTool.Browse) {\n            return this.vci.getCodeExec().silenceMessagesForUIAction.val ?? this.vci.getTool();\n        } else {\n            return this.vci.getTool();\n        }\n    }\n\n    /**\n     * in a menu action, set subsequent tool\n     */\n    protected setUpcomingTool(t: VpcTool) {\n        if (this.vci.getTool() === VpcTool.Browse && this.vci.getCodeExec().silenceMessagesForUIAction.val) {\n            this.vci.getCodeExec().silenceMessagesForUIAction.val = t;\n        } else {\n            this.vci.setTool(t);\n        }\n    }\n\n    /**\n     * create an element and add it to the model\n     */\n    rawCreateOneVelUseCarefully(parentId: string, type: VpcElType, insertIndex = -1, newId: O<string> = undefined) {\n        if (!newId) {\n            newId = this.vci.getModel().stack.getNextId(this.vci.getModel());\n        }\n\n        checkThrow(newId.match(/^[0-9]+$/), 'Ku|id should be purely numeric', newId);\n        let cr = new UndoableActionCreateVel(newId, parentId, type, false, insertIndex);\n        this.vci.doChangeSeenCreationDeletion(cr);\n        cr.do(this.vci);\n        return this.vci.getModel().getByIdUntyped(newId);\n    }\n\n    /**\n     * remove an element from the model, includng children\n     */\n    protected removeVel(vel: VpcElBase) {\n        if (vel instanceof VpcElCard) {\n            let totalCardNum = this.vci\n                .getModel()\n                .stack.bgs.map(bg => bg.cards.length)\n                .reduce(Util512.add);\n            checkThrow(totalCardNum > 1, '8%|Cannot delete the only card of a stack');\n            let curCard = this.vci.getOptionS('currentCardId');\n            checkThrow(vel.idInternal !== curCard, 'UM|cannot delete the current card');\n\n            /* if deleting a card, first delete all of its children */\n            /* that way there won't be orphan parts in the mapModelById */\n            let partsToRemove: VpcElBase[] = [];\n            for (let part of vel.parts) {\n                assertTrue(part instanceof VpcElButton || part instanceof VpcElField, '6M|bad type');\n                partsToRemove.push(part);\n            }\n\n            for (let part of partsToRemove) {\n                this.removeElemImpl(part);\n            }\n        }\n\n        UndoableActionDeleteVel.checkIfCanDelete(vel, this.vci);\n        this.removeElemImpl(vel);\n\n        if (vel.getType() === VpcElType.Card) {\n            let parentBg = this.vci.getModel().getById(VpcElBg, vel.parentIdInternal);\n            if (parentBg && parentBg.cards.length === 0) {\n                /* if a bg has no remaining cards, let's remove the bg */\n                this.removeElemImpl(parentBg);\n            }\n        }\n    }\n\n    /**\n     * remove a single element from the model\n     */\n    protected removeElemImpl(vel: VpcElBase) {\n        let action = new UndoableActionDeleteVel(vel, this.vci);\n        this.vci.doChangeSeenCreationDeletion(action);\n        action.do(this.vci);\n    }\n\n    /**\n     * set the selected text\n     * we don't need to send a selected-field-changed event, it will\n     * be sent by the ui512 layer.\n     */\n    setSelection(vel: O<VpcElField>, start: number, end: number): void {\n        this.vci.causeFullRedraw();\n        if (!vel) {\n            /* clear the selection */\n            this.pr.setCurrentFocus(undefined, false /* skip sending event */);\n            return;\n        }\n\n        let elId = this.pr.lyrModelRender.velIdToElId(vel.idInternal);\n        let findEl = this.pr.app.findEl(elId);\n        if (findEl) {\n            vel.setOnVel('selcaret', start, this.outside.Model());\n            vel.setOnVel('selend', end, this.outside.Model());\n            let generic = new VpcTextFieldAsGeneric(undefined, vel, this.outside.Model());\n            let newbounds = TextSelModify.getSelectedTextBounds(generic);\n            /* also checks if the field has lockedtext/can'tselect */\n            if (newbounds) {\n                /* let's be kind and fix up the bounds so if you send it something\n                weird/negative/backwards, we'll repair it here  */\n                vel.setOnVel('selcaret', newbounds[0], this.outside.Model());\n                vel.setOnVel('selend', newbounds[1], this.outside.Model());\n                this.pr.setCurrentFocus(elId, false /* skip sending event */);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcPresenter.ts",
    "content": "\n/* auto */ import { VpcValN } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { VpcScriptMessage, VpcScriptMessageMsgBoxCode } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { SelectToolMode, VpcAppUIToolSelectBase } from './../tools/vpcToolSelectBase';\n/* auto */ import { VpcStateSerialize } from './../state/vpcStateSerialize';\n/* auto */ import { GuessStackTrace } from './../../vpc/codeexec/vpcScriptExecTop';\n/* auto */ import { VpcNonModalReplBox } from './../nonmodaldialogs/vpcReplMessageBox';\n/* auto */ import { VpcPresenterInit } from './vpcPresenterInit';\n/* auto */ import { VpcBuiltinMsg, VpcElType, VpcErr, VpcTool, VpcToolCtg, checkThrow, checkThrowNotifyMsg, cleanExceptionMsg, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { StackOrderHelpers } from './../../vpc/vel/velStackOrderHelpers';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { UI512CursorAccess, UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { RenderComplete, SetToInvalidObjectAtEndOfExecution } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, callDebuggerIfNotInProduction, trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { assertWarn, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { UI512CompModalDialog } from './../../ui512/composites/ui512ModalDialog';\n/* auto */ import { FocusChangedEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * main ViperCard presentation object\n */\nexport class VpcPresenter extends VpcPresenterInit {\n    /**\n     * get the current card number\n     */\n    getCurrentCardNum() {\n        let currentCardId = this.vci.getModel().productOpts.getS('currentCardId');\n        return StackOrderHelpers.getCardStackPosition(this.vci.getModel().stack, currentCardId);\n    }\n\n    /**\n     * from tool to the corresponding tool response object\n     */\n    getToolResponse(t: VpcTool) {\n        return ensureDefined(this.tlNumToResponse[t], 'Kl|not found', t);\n    }\n\n    /**\n     * set the current tool\n     * this is the only place that should be able to directly set the tool\n     * you must call this rather than modifying 'currentTool' directly\n     */\n    setTool(nextTl: VpcTool) {\n        let prevTl = this.getTool();\n        if (nextTl !== prevTl) {\n            if (prevTl === VpcTool.Browse) {\n                this.vci.getCodeExec().forceStopRunning();\n            }\n\n            let prevResp = this.getToolResponse(prevTl);\n            this.vci.undoableAction(() => prevResp.onLeaveTool());\n\n            let nextResp = this.getToolResponse(nextTl);\n            this.vci.undoableAction(() => nextResp.onOpenTool());\n            if (nextTl === VpcTool.Stamp || prevTl === VpcTool.Stamp) {\n                this.rebuildFieldScrollbars();\n            }\n\n            this.lyrPaintRender.deleteTempPaintEls();\n            this.setCurrentFocus(undefined);\n\n            /* especially important when going from edit to browse,\n            let's say you've set the enabled of a button to false,\n            need to redo modelRender so that it is actually\n                enabled==false not just enabledstyle */\n            this.lyrModelRender.fullRedrawNeeded();\n\n            this.vci.getModel().productOpts.allowSetCurrentTool = true;\n            this.vci.setOption('currentTool', nextTl);\n            this.vci.getModel().productOpts.allowSetCurrentTool = false;\n\n            this.refreshCursor();\n        }\n    }\n\n    /**\n     * set the current card, without sending any closecard or opencard events\n     */\n    setCurCardNoOpenCardEvt(nextId: string) {\n        this.vci.undoableAction(() => {\n            /* verify card exists */\n            this.vci.getModel().getCardById(nextId);\n\n            /* go to the card */\n            let wasCard = this.vci.getOptionS('currentCardId');\n            this.vci.getModel().productOpts.allowSetCurrentCard = true;\n            this.vci.setOption('currentCardId', nextId);\n            this.vci.getModel().productOpts.allowSetCurrentCard = false;\n\n            if (wasCard !== nextId) {\n                this.vci.setOption('selectedVelId', '');\n                this.vci.setOption('copiedVelId', '');\n                this.vci.setOption('viewingScriptVelId', '');\n                /* remember history, for go back and go forth */\n                let suspended = this.vci.getCodeExec().globals.find('internalvpcmovecardimplsuspendhistory');\n                if (suspended === undefined || suspended.readAsString() !== '1') {\n                    this.vci.getCodeExec().cardHistory.append(nextId);\n                }\n            }\n\n            /* turn this off, so it's never stuck on indefinitely */\n            this.vci.getCodeExec().globals.set('internalvpcmovecardimplsuspendhistory', VpcValN(0));\n        });\n    }\n\n    /**\n     * implement sending closeField/openField event\n     *\n     * places this should ideally be called, if browse tool is active:\n     * clicking outside field\n     * move to different field via tab key\n     * press Enter key\n     * go to a different card\n     * press Cmd+Z to undo (not yet implemented)\n     * quitting the program (not yet implemented)\n     * select command (implemented, unless a script selects a\n     *      different field and comes back quickly)\n     */\n    beginScheduleFldOpenCloseEvent(evt: FocusChangedEventDetails) {\n        if (evt.idPrev === evt.idNext || this.getTool() !== VpcTool.Browse || evt.skipCloseFieldMsg) {\n            return;\n        }\n\n        if (evt.idPrev) {\n            this.beginScheduleFldOpenCloseEventClose(evt.idPrev);\n        }\n\n        if (evt.idNext) {\n            this.beginScheduleFldOpenCloseEventOpen(evt.idNext);\n        }\n    }\n\n    /**\n     * schedule the closefield event(s)\n     */\n    beginScheduleFldOpenCloseEventClose(prevElId: string) {\n        /* note, findElIdToVel returns undefined if vel is on a different card, ok for now\n        since people's closeField scripts probably assume we are on the card anyways */\n        let prevVel = this.lyrModelRender.findElIdToVel(prevElId);\n        if (prevVel && prevVel.getType() === VpcElType.Fld) {\n            if (this.vci.getCodeExec().fieldsRecentlyEdited.val[prevVel.idInternal]) {\n                /* closefield called if changes made in the field */\n                let msg = new VpcScriptMessage(prevVel.idInternal, VpcBuiltinMsg.Closefield);\n                this.vci.getCodeExec().scheduleCodeExec(msg);\n\n                this.vci.getCodeExec().fieldsRecentlyEdited.val[prevVel.idInternal] = false;\n            } else {\n                /* exitfield called if no changes were made in the field */\n                let msg = new VpcScriptMessage(prevVel.idInternal, VpcBuiltinMsg.Exitfield);\n                this.vci.getCodeExec().scheduleCodeExec(msg);\n            }\n        }\n    }\n\n    /**\n     * schedule the openfield event\n     */\n    beginScheduleFldOpenCloseEventOpen(nextId: string) {\n        /* note, findElIdToVel returns undefined if vel is on a different card, ok for now\n        since people's openField scripts probably assume we are on the card anyways */\n        let vel = this.lyrModelRender.findElIdToVel(nextId);\n        if (vel && vel.getType() === VpcElType.Fld) {\n            let msg = new VpcScriptMessage(vel.idInternal, VpcBuiltinMsg.Openfield);\n            this.vci.getCodeExec().scheduleCodeExec(msg);\n        }\n    }\n\n    /**\n     * respond to a script error,\n     * might be either a compile error\n     * or a runtime error\n     */\n    defaultShowScriptErr(scriptErr: VpcErr, msgObj: O<VpcScriptMessage>) {\n        this.vci.getCodeExec().forceStopRunning();\n\n        this.vci.undoableAction(() => {\n            /* by leaving browse tool we won't hit other errors / try to run closeCard or openCard */\n            this.vci.setTool(VpcTool.Button);\n            /* if there wasn't a velid set, use current card */\n            let velId = scriptErr.scriptErrVelid ?? this.vci.getModel().getCurrentCard().idInternal;\n            let lineNum = scriptErr.scriptErrLine ?? 1;\n            let msg = cleanExceptionMsg(scriptErr.clsAsErr());\n\n            /* did this come from the messagebox? note that\n            we've already applied changes from dynamicCodeOrigin */\n            if (velId === 'messagebox') {\n                if (this.lyrNonModalDlgHolder.current && this.lyrNonModalDlgHolder.current instanceof VpcNonModalReplBox) {\n                    this.lyrNonModalDlgHolder.current.onScriptErr(scriptErr);\n                } else {\n                    this.answerMsg(msg);\n                }\n\n                return;\n            } else if (\n                msgObj &&\n                msgObj instanceof VpcScriptMessageMsgBoxCode &&\n                velId === this.vci.getModel().productOpts.idInternal\n            ) {\n                /* e.g. you go Edit->Delete Card for the only card in a stack.\n                there will be a script error, but don't open the script editor,\n                just show a dialog -- it's not even really a script error.\n                Only do this for productopts errors in case someone has overridden domenu */\n                this.answerMsg(msg);\n                return;\n            }\n\n            /* move to the card where the error happened. */\n            /* for example \"send myevent to btn 4 of cd 5\" */\n            /* if there is an error in that script, we need to be on cd 5 to edit that script */\n            {\n                let vel = this.vci.getModel().findByIdUntyped(velId);\n                if (vel?.getType() === VpcElType.Btn || vel?.getType() === VpcElType.Fld) {\n                    let parentCard = this.vci.getModel().getParentCardOfElement(vel);\n                    this.vci.setCurCardNoOpenCardEvt(parentCard.idInternal);\n                } else if (vel?.getType() === VpcElType.Card) {\n                    this.vci.setCurCardNoOpenCardEvt(vel.idInternal);\n                } else if (vel instanceof VpcElBg) {\n                    if (\n                        this.vci.getModel().getByIdUntyped(this.vci.getModel().getCurrentCard().idInternal).parentIdInternal !==\n                            vel.idInternal &&\n                        vel.cards.length\n                    ) {\n                        this.vci.setCurCardNoOpenCardEvt(vel.cards[0].idInternal);\n                    }\n                } else if (vel?.getType() !== VpcElType.Stack) {\n                    /* for example, error in standardlib,\n                    or script error from a deleted object (which is fine) */\n                    let s = `script err in id${velId} line${lineNum} ${msg}`;\n                    console.error(s);\n                    callDebuggerIfNotInProduction(s);\n                    /* fall back to current card */\n                    velId = this.vci.getModel().getCurrentCard().idInternal;\n                    lineNum = 1;\n                }\n            }\n\n            /* set the runtime flags */\n            this.vci.setOption('selectedVelId', velId);\n            this.vci.setOption('viewingScriptVelId', velId);\n\n            /* open the code editor at the offending line */\n            this.lyrPropPanel.updateUI512Els();\n            let gst = new GuessStackTrace(this.vci.getCodeExec(), this.vci.getOutside());\n            let renderedTrace = gst.goAsString(velId, lineNum, scriptErr.traceInfo);\n            this.lyrPropPanel.editor.setLastErrInfo(velId, msg, lineNum, scriptErr.stage, renderedTrace);\n            this.lyrPropPanel.editor.refreshFromModel(this.app);\n            this.lyrPropPanel.editor.scrollToErrorPosition(this);\n        });\n    }\n\n    /**\n     * create modal dialog instance\n     */\n    protected getModalDlg() {\n        checkThrow(!this.app.findEl('mainModalDlg##modaldialog##dlgprompt'), 'Kj|dialog box already shown');\n\n        let modalDlg = new UI512CompModalDialog('mainModalDlg');\n        let stopBtnElId = this.lyrToolboxes.toolsNav.getElId('choice##cardNumOrStop');\n        let stopBtn = this.app.getEl(stopBtnElId);\n        modalDlg.cancelBtnBounds = [\n            /* you can exit the dlg by clicking Stop */\n            [stopBtn.x, stopBtn.y, stopBtn.w, stopBtn.h],\n            [\n                /* you can also exit the dlg by clicking different tool */\n                this.lyrToolboxes.toolsMain.x,\n                this.lyrToolboxes.toolsMain.y,\n                this.lyrToolboxes.toolsMain.logicalWidth,\n                this.lyrToolboxes.toolsMain.logicalHeight\n            ]\n        ];\n\n        return modalDlg;\n    }\n\n    /**\n     * show \"answer\" modal dialog.\n     *\n     * after calling this, it'd best not run other code until the dialog is closed,\n     * since all the event handlers are suspended, and accidentally causing another\n     * dialog will show an assert in getModalDlg()\n     */\n    answerMsg(prompt: string, fnOnResult?: (n: number) => void, choice1?: string, choice2?: string, choice3?: string) {\n        let tl = this.getToolResponse(this.getTool());\n        tl.cancelCurrentToolAction();\n        let dlg = this.getModalDlg();\n        dlg.standardAnswer(this, this.app, prompt, fnOnResult, choice1 ?? '', choice2 ?? '', choice3 ?? '');\n        assertWarn(this.app.findEl('mainModalDlg##modaldialog##dlgprompt'), 'Ki|expect to have been created');\n    }\n\n    /**\n     * show \"ask\" modal dialog, getting a string from user.\n     *\n     * after calling this, it'd best not run other code until the dialog is closed,\n     * since all the event handlers are suspended, and accidentally causing another\n     * dialog will show an assert in getModalDlg()\n     */\n    askMsg(prompt: string, defText: string, fnOnResult: (ret: O<string>, n: number) => void) {\n        let tl = this.getToolResponse(this.getTool());\n        tl.cancelCurrentToolAction();\n        let dlg = this.getModalDlg();\n        dlg.standardAsk(this, this.app, prompt, defText, fnOnResult);\n        assertWarn(this.app.findEl('mainModalDlg##modaldialog##dlgprompt'), 'Kh|expect to have been created');\n    }\n\n    /**\n     * wrapper around answerMsg as async\n     */\n    answerMsgAsync(prompt: string, choice1?: string, choice2?: string, choice3?: string): Promise<number> {\n        return new Promise<number>((resolve, reject) => {\n            try {\n                this.answerMsg(\n                    prompt,\n                    n => {\n                        resolve(n);\n                    },\n                    choice1,\n                    choice2,\n                    choice3\n                );\n            } catch (e) {\n                reject(e);\n            }\n        });\n    }\n\n    /**\n     * wrapper around askMsg as async\n     */\n    askMsgAsync(prompt: string, defText: string): Promise<[O<string>, number]> {\n        return new Promise<[O<string>, number]>((resolve, reject) => {\n            try {\n                this.askMsg(prompt, defText, (ret, n) => {\n                    resolve([ret, n]);\n                });\n            } catch (e) {\n                reject(e);\n            }\n        });\n    }\n\n    /**\n     * tell every layer to update its UI\n     */\n    updateUI512ElsAllLayers() {\n        try {\n            this.runtime.opts.lock(true);\n            this.vci.getModel().productOpts.lock(true);\n            for (let i = 0, len = this.layers.length; i < len; i++) {\n                this.layers[i].updateUI512Els();\n            }\n        } finally {\n            this.runtime.opts.lock(false);\n            this.vci.getModel().productOpts.lock(false);\n        }\n    }\n\n    /**\n     * returns true if code is currently running\n     */\n    isCodeRunning() {\n        return this && this.vci && this.vci.getCodeExec && this.vci.getCodeExec() && this.vci.getCodeExec().isCodeRunning();\n    }\n\n    /**\n     * main render method\n     */\n    render(canvas: CanvasWrapper, ms: number, cmpTotal: RenderComplete): boolean {\n        //~ this.lyrModelRender.checkIfScreenWasJustUnlocked();\n        let shouldUpdate = this.lyrModelRender.needUIToolsRedraw || /* bool */ this.lyrModelRender.needFullRedraw;\n\n        /* we used to put a finally here to ensure that needFullRedraw is\n        always set to false even if an exception ocurrs. we did this to\n        prevent continous exception dialogs. now that we let\n        the user ignore exception messages, I don't think it's necessary.\n        */\n        if (shouldUpdate) {\n            this.updateUI512ElsAllLayers();\n            this.refreshCursor();\n        }\n\n        this.lyrModelRender.needUIToolsRedraw = false;\n        this.lyrModelRender.needFullRedraw = false;\n        return super.render(canvas, ms, cmpTotal);\n    }\n\n    /**\n     * refresh the cursor, looks up mouse position\n     */\n    refreshCursor() {\n        let elUnderCursor = this.app.coordsToElement(this.trackMouse[0], this.trackMouse[1]);\n        let isCursorWithinDocument =\n            trueIfDefinedAndNotNull(elUnderCursor) && this.lyrModelRender.isVelOrBaseLayer(elUnderCursor.id);\n        this.refreshCursorElemKnown(elUnderCursor, isCursorWithinDocument);\n    }\n\n    /**\n     * refresh cursor\n     * note: is a no-op if cursor hasn't changed, so feel free to call this\n     */\n    refreshCursorElemKnown(el: O<UI512Element>, isDocumentEl: boolean) {\n        if (this.vci.getCodeExec().isCodeRunning()) {\n            /* always set it to hand. why?\n            because currently hand is a css cursor that will never lag slowly\n            if the script is really busy running things. */\n            UI512CursorAccess.setCursor(UI512Cursors.hand);\n            return;\n        }\n\n        if (isDocumentEl) {\n            let tl = this.getTool();\n            let curs = this.getToolResponse(tl).whichCursor(tl, el);\n            UI512CursorAccess.setCursor(curs);\n        } else {\n            if (el && el instanceof UI512ElTextField && el.getB('canedit')) {\n                UI512CursorAccess.setCursor(UI512Cursors.lbeam);\n            } else {\n                UI512CursorAccess.setCursor(UI512Cursors.arrow);\n            }\n        }\n    }\n\n    /**\n     * is the document dirty?\n     */\n    isDocDirty() {\n        return (\n            this &&\n            this.vci &&\n            this.vci.getCurrentStateId() !== '(justOpened)' &&\n            this.vci.getCurrentStateId() !== this.vci.getOptionS('lastSavedStateId')\n        );\n    }\n\n    /**\n     * exit the stack, after asking user if they are sure\n     */\n    exit(dest: string) {\n        if (this.isDocDirty() && !this.cameFromDemoSoNeverPromptSave.length) {\n            this.answerMsg(\n                lng('lngReminder that unsaved changes will be lost.\\nContinue?'),\n                n => {\n                    if (n === 0) {\n                        this.exitImpl(dest);\n                    }\n                },\n                lng('lngOK'),\n                lng('lngCancel')\n            );\n        } else {\n            this.exitImpl(dest);\n        }\n    }\n\n    /**\n     * exit the stack\n     */\n    protected exitImpl(dest: string) {\n        /* no longer need url change warning */\n        this.teardownBeforeUnloadWarning();\n\n        /* scribble over everything to make sure no-one reuses it. */\n        this.listeners = [];\n        this.vci.destroy();\n        this.vci = SetToInvalidObjectAtEndOfExecution(this.vci);\n        this.runtime = SetToInvalidObjectAtEndOfExecution(this.runtime);\n        if (dest === 'mnuNewStack') {\n            this.cbExitToNewDocument();\n        } else if (dest === 'mnuOpen') {\n            this.cbExitToOpen(false);\n        } else if (dest === 'openFromMyStacks') {\n            this.cbExitToOpen(true);\n        } else {\n            this.cbExitToMainMenu();\n        }\n    }\n\n    /**\n     * run undo/redo\n     * more complex than you'd think,\n     * because some user actions 'feel' like changes even though they don't change\n     * the state, and we should still treat those as undoable.\n     */\n    protected runUndoOrRedo(fn: () => boolean, msgIfFalse: string, isUndo: boolean) {\n        /* if we selected/moved something, it \"feels\" like we moved\n        it even though we haven't committed anything. so calling undo\n        in this case should just cancel selection and not step backwards. */\n        let tl = this.getToolResponse(this.getTool());\n        if (isUndo && tl instanceof VpcAppUIToolSelectBase && tl.st && tl.st.mode !== SelectToolMode.SelectingRegion) {\n            this.vci.doWithoutAbilityToUndoExpectingNoChanges(() => {\n                tl.cancelCurrentToolAction();\n                this.lyrModelRender.uiRedrawNeeded();\n            });\n\n            return;\n        }\n\n        /* did we just type something into properties... */\n        /* if so it feels more intuitive to not actually undo, but just erase the recent change. */\n        if (isUndo && getToolCategory(this.getTool()) === VpcToolCtg.CtgEdit) {\n            let areThereUnsavedChanges = false;\n            this.vci.doWithoutAbilityToUndoExpectingNoChanges(() => {\n                areThereUnsavedChanges = this.lyrPropPanel.areThereUnsavedChanges();\n            });\n\n            if (areThereUnsavedChanges) {\n                this.lyrPropPanel.updateUI512Els();\n                this.lyrModelRender.uiRedrawNeeded();\n                return;\n            }\n        }\n\n        this.vci.doWithoutAbilityToUndoExpectingNoChanges(() => {\n            /* cancel tool action, i.e. you were in the middle of drawing a shape */\n            tl.cancelCurrentToolAction();\n            this.lyrModelRender.fullRedrawNeeded();\n            this.lyrNonModalDlgHolder.setNonModalDialog(undefined);\n        });\n\n        let done = fn();\n        if (done) {\n            this.vci.doWithoutAbilityToUndo(() => {\n                /* check that the current card still exists, otherwise go to first card */\n                let currentCardId = this.vci.getModel().productOpts.getS('currentCardId');\n                let currentCard = this.vci.getModel().findById(VpcElCard, currentCardId);\n                if (!currentCard) {\n                    assertWarn(false, 'U6|card has been deleted, going to card 1 instead.');\n                    let card = this.vci.getModel().stack.bgs[0].cards[0].idInternal;\n                    this.vci.setCurCardNoOpenCardEvt(card);\n                }\n\n                /* refresh everything */\n                this.lyrModelRender.fullRedrawNeeded();\n            });\n        } else {\n            checkThrowNotifyMsg(false, lng(msgIfFalse));\n        }\n    }\n\n    /**\n     * perform a menu action, and show a nicer user friendly\n     * dialog if an exception is thrown\n     */\n    performMenuAction(s: string) {\n        if (this.isCodeRunning()) {\n            return;\n        }\n\n        try {\n            if (s === 'mnuUndo') {\n                this.runUndoOrRedo(() => this.vci.performUndo(), 'lngNothing to undo.', true);\n            } else if (s === 'mnuRedo') {\n                this.runUndoOrRedo(() => this.vci.performRedo(), 'lngNothing to redo.', false);\n            } else if (s === 'mnuClear') {\n                this.vci.undoableAction(() => this.performMenuActionImpl(s));\n            } else {\n                let tl = this.getToolResponse(this.getTool());\n                tl.cancelCurrentToolAction();\n                this.vci.undoableAction(() => this.performMenuActionImpl(s));\n            }\n        } catch (e) {\n            this.answerMsg(cleanExceptionMsg(e));\n        }\n\n        this.lyrModelRender.uiRedrawNeeded();\n    }\n\n    /**\n     * dispatch the menu action\n     */\n    performMenuActionImpl(s: string) {\n        let method = Util512.isMethodOnClass(this.menuActions, 'go' + Util512.capitalizeFirst(s));\n        if (method !== undefined) {\n            method.apply(this.menuActions, [this.vci]);\n        } else {\n            this.menuActions.fallbackToSetToolOrSetFont(s);\n        }\n    }\n\n    /**\n     * get complete state as a string\n     */\n    getSerializedStack() {\n        let serialized = VpcStateSerialize.serializeAll(this.vci);\n        return JSON.stringify(serialized);\n    }\n\n    /**\n     * queueRefreshCursor, someone has told us we need to refresh the cursor\n     */\n    queueRefreshCursor(): void {\n        this.cursorRefreshPending = true;\n    }\n\n    /**\n     * append text to the message box\n     * ignored if the message box is not currently open\n     */\n    writeToReplMessageBox(s: string, returnFocus: boolean): void {\n        if (this.lyrNonModalDlgHolder.current && this.lyrNonModalDlgHolder.current instanceof VpcNonModalReplBox) {\n            if (returnFocus) {\n                this.lyrNonModalDlgHolder.current.returnFocus();\n            } else {\n                this.lyrNonModalDlgHolder.current.appendToOutput(s, false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcPresenterEvents.ts",
    "content": "\n/* auto */ import { VpcScriptMessage } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcAppUIToolSmear } from './../tools/vpcToolSmear';\n/* auto */ import { VpcNonModalReplBox } from './../nonmodaldialogs/vpcReplMessageBox';\n/* auto */ import { VpcPresenterInterface } from './vpcPresenterInterface';\n/* auto */ import { VpcModelRender } from './../modelrender/vpcModelRender';\n/* auto */ import { TypeOfUndoAction, VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcBuiltinMsg, VpcElType, VpcTool, VpcToolCtg, getMsgFromEvtType, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElField, VpcTextFieldAsGeneric } from './../../vpc/vel/velField';\n/* auto */ import { justConsoleMsgIfExceptionThrown } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, bool, coalesceIfFalseLike, trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { arLast, cast, slength } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512TextEvents } from './../../ui512/textedit/ui512TextEvents';\n/* auto */ import { ScrollbarImpl } from './../../ui512/textedit/ui512Scrollbar';\n/* auto */ import { MenuListeners } from './../../ui512/menu/ui512MenuListeners';\n/* auto */ import { UI512EventType } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { GenericTextField, UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { EventDetails, FocusChangedEventDetails, IdleEventDetails, KeyDownEventDetails, KeyEventDetails, MenuItemClickedDetails, MouseDownDoubleEventDetails, MouseDownEventDetails, MouseEnterDetails, MouseLeaveDetails, MouseMoveEventDetails, MouseUpEventDetails, MouseUpOrDownDetails, PasteTextEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { BasicHandlers } from './../../ui512/textedit/ui512BasicHandlers';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * ViperCard event handling\n */\nexport const VpcPresenterEvents = /* static class */ {\n    /**\n     * register event handlers\n     */\n    initEvents(pr: VpcPresenterInterface) {\n        /* Currently, a running script can't cancel default behavior\n        by handling an event and not running \"exit to product\",\n        that's why I call it 'on afterkeydown' instead of 'on keydown'\n\n        A running script can pass the event upwards (say to the current card) with \"pass mouseUp\"\n        */\n\n        /* we must route text changes to a vel instead of directly setting the UI512 element */\n        let editTextBehavior = new EditTextBehaviorSendToVel(pr);\n\n        pr.listeners[UI512EventType.MouseDown] = [\n            BasicHandlers.trackMouseStatusMouseDown,\n            BasicHandlers.trackCurrentElMouseDown,\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.respondMouseDown,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            BasicHandlers.trackHighlightedButtonMouseDown,\n            MenuListeners.onMouseDown,\n            editTextBehavior.onMouseDownScroll.bind(editTextBehavior),\n            editTextBehavior.onMouseDownSelect.bind(editTextBehavior)\n        ];\n\n        pr.listeners[UI512EventType.MouseUp] = [\n            BasicHandlers.trackMouseStatusMouseUp,\n            BasicHandlers.trackCurrentElMouseUp,\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            MenuListeners.onMouseUp,\n            VpcPresenterEvents.respondMouseUp,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            BasicHandlers.trackHighlightedButtonMouseUp,\n            editTextBehavior.onMouseUp.bind(editTextBehavior)\n        ];\n\n        pr.listeners[UI512EventType.MouseMove] = [\n            BasicHandlers.trackCurrentElMouseMove,\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.respondMouseMove,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            /* don't need editTextBehavior.onMouseMoveSetTextEditCursor */\n            editTextBehavior.onMouseMoveSelect.bind(editTextBehavior)\n        ];\n\n        pr.listeners[UI512EventType.MouseEnter] = [\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.scheduleScriptEvent,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            BasicHandlers.trackHighlightedButtonMouseEnter,\n            MenuListeners.onMouseEnter\n        ];\n\n        pr.listeners[UI512EventType.MouseLeave] = [\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.scheduleScriptEvent,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            BasicHandlers.trackHighlightedButtonMouseLeave,\n            MenuListeners.onMouseLeave\n        ];\n\n        pr.listeners[UI512EventType.MouseDownDouble] = [\n            BasicHandlers.trackMouseDoubleDown,\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.scheduleScriptEvent,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool,\n            editTextBehavior.onMouseDoubleDown.bind(editTextBehavior),\n            VpcPresenterEvents.respondMouseDoubleDown\n        ];\n\n        pr.listeners[UI512EventType.KeyUp] = [\n            BasicHandlers.trackKeyUp,\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.respondKeyUp,\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool\n        ];\n\n        pr.listeners[UI512EventType.KeyDown] = [\n            BasicHandlers.basicKeyShortcuts,\n            (_pr: VpcPresenterInterface, d: KeyDownEventDetails) => VpcPresenterEvents.respondKeyDown(_pr, d, editTextBehavior),\n            VpcPresenterEvents.cancelEvtIfNotBrowseTool\n        ];\n\n        pr.listeners[UI512EventType.PasteText] = [\n            (_pr: VpcPresenterInterface, d: PasteTextEventDetails) => {\n                _pr.vci.undoableAction(() => {\n                    editTextBehavior.onPasteText(_pr, d);\n                });\n            }\n        ];\n\n        pr.listeners[UI512EventType.MenuItemClicked] = [\n            VpcPresenterEvents.cancelEvtIfCodeRunning,\n            VpcPresenterEvents.respondMenuItemClicked\n        ];\n\n        pr.listeners[UI512EventType.FocusChanged] = [\n            VpcPresenterEvents.respondFocusChanged,\n            VpcPresenterEvents.cancelEvtIfCodeRunning\n        ];\n\n        pr.listeners[UI512EventType.Idle] = [\n            VpcPresenterEvents.respondIdle,\n            BasicHandlers.onIdleRunCallbackQueueFromAsyncs,\n            editTextBehavior.onIdle.bind(editTextBehavior)\n        ];\n    },\n\n    /**\n     * by calling setHandled, this stops event propagation\n     */\n    cancelEvtIfCodeRunning(pr: VpcPresenterInterface, d: EventDetails) {\n        if (pr.vci.isCodeRunning()) {\n            let isElemStopRunning = d.getAffectedElements().some(el => pr.lyrToolboxes.isElemStopRunning(el));\n            if (!isElemStopRunning) {\n                d.setHandled();\n            }\n        }\n    },\n\n    /**\n     * if we're not in the browse tool,\n     * when you click on a vel button it shouldn't have any response\n     * without this check here, you'd be able to click on a vel button even when\n     * you are in the pencil tool\n     */\n    cancelEvtIfNotBrowseTool(pr: VpcPresenterInterface, d: EventDetails) {\n        let isVel = d.getAffectedElements().some(item => bool(pr.lyrModelRender.elIdToVelId(item.id)));\n        if (isVel && pr.vci.getTool() !== VpcTool.Browse) {\n            d.setHandled();\n        }\n    },\n\n    /**\n     * double-click the eraser tool to erase all paint on the screen\n     */\n    respondMouseDoubleDown(pr: VpcPresenterInterface, d: MouseDownDoubleEventDetails) {\n        pr.vci.undoableAction(() => {\n            if (d.el && d.el.id) {\n                let short = pr.lyrToolboxes.toolsMain.fromFullId(d.el.id);\n                if (short && short.endsWith('##eraser')) {\n                    pr.vci.setTool(VpcTool.Eraser);\n                    let tl = cast(VpcAppUIToolSmear, pr.getToolResponse(VpcTool.Eraser));\n                    tl.clearAllPaint();\n                }\n            }\n        });\n    },\n\n    /**\n     * send mousedown event to the current tool\n     */\n    respondMouseDown(pr: VpcPresenterInterface, d: MouseDownEventDetails) {\n        pr.vci.undoableAction(() => {\n            if (d.button === 0) {\n                let isUserElOrBaseLayer = trueIfDefinedAndNotNull(d.el) && pr.lyrModelRender.isVelOrBaseLayer(d.el.id);\n                pr.getToolResponse(pr.vci.getTool()).respondMouseDown(pr.vci.getTool(), d, isUserElOrBaseLayer);\n                pr.lyrNonModalDlgHolder.respondMouseDown(d);\n\n                /* change focus on click, to make the property panel commit */\n                let focused = pr.getCurrentFocus();\n                pr.setCurrentFocus(undefined, true);\n                pr.setCurrentFocus(focused, true);\n\n                /* according to docs closefield should be called when\n                user clicks outside the field */\n                let elClicked = d.el ? d.el.id : undefined;\n                if (!d.handled() && pr.vci.getTool() === VpcTool.Browse && focused && focused !== elClicked) {\n                    pr.beginScheduleFldOpenCloseEventClose(focused);\n                }\n            }\n        });\n    },\n\n    /**\n     * send mouseup event to the current tool, and any layers that need to respond to it\n     */\n    respondMouseUp(pr: VpcPresenterInterface, d: MouseUpEventDetails) {\n        pr.vci.undoableAction(() => {\n            if (d.button === 0) {\n                let isUserElOrBaseLayer = d.getAffectedElements().some(item => pr.lyrModelRender.isVelOrBaseLayer(item.id));\n                pr.getToolResponse(pr.vci.getTool()).respondMouseUp(pr.vci.getTool(), d, isUserElOrBaseLayer);\n                pr.lyrNonModalDlgHolder.respondMouseUp(d);\n                pr.lyrToolboxes.toolsMain.respondMouseUp(pr.app, d);\n                pr.lyrToolboxes.toolsPatterns.respondMouseUp(pr.app, d);\n                pr.lyrToolboxes.toolsNav.respondMouseUp(pr.app, d);\n                pr.lyrCoverArea.respondMouseUp(d);\n            }\n        });\n    },\n\n    /**\n     * send mousemove event to current tool\n     */\n    respondMouseMove(pr: VpcPresenterInterface, d: MouseMoveEventDetails) {\n        let isUserElOrBaseLayer = d.getAffectedElements().some(item => pr.lyrModelRender.isVelOrBaseLayer(item.id));\n        pr.getToolResponse(pr.vci.getTool()).respondMouseMove(pr.vci.getTool(), d, isUserElOrBaseLayer);\n        let isNextAVelOrBaseLayer = trueIfDefinedAndNotNull(d.elNext) && pr.lyrModelRender.isVelOrBaseLayer(d.elNext.id);\n        if (d.elNext !== d.elPrev) {\n            pr.refreshCursorElemKnown(d.elNext, isNextAVelOrBaseLayer);\n        }\n    },\n\n    /**\n     * respond to keyboard shortcuts for undo and redo\n     */\n    _checkIfUndoRedo(pr: VpcPresenterInterface, d: KeyDownEventDetails) {\n        /* these must be done outside of a undoableAction() block */\n        if (!d.handled() && !pr.vci.isCodeRunning() && !d.repeated) {\n            if (d.readableShortcut === 'Cmd+Z') {\n                pr.vci.performMenuAction('mnuUndo');\n                d.setHandled();\n            } else if (d.readableShortcut === 'Cmd+Y') {\n                pr.vci.performMenuAction('mnuRedo');\n                d.setHandled();\n            }\n        }\n    },\n\n    /**\n     * respond to keydown event\n     */\n    respondKeyDown(pr: VpcPresenterInterface, d: KeyDownEventDetails, ed: EditTextBehaviorSendToVel) {\n        VpcPresenterEvents._checkIfUndoRedo(pr, d);\n        if (d.handled()) {\n            return;\n        }\n\n        pr.vci.undoableAction(() => {\n            let currentFocus = pr.getCurrentFocus();\n\n            /* menu action */\n            let translated = pr.lyrMenus.translateHotkey(d);\n            if (!pr.vci.isCodeRunning() && !d.handled() && translated) {\n                if (translated.startsWith('onlyIfNotInTextField/')) {\n                    if (currentFocus) {\n                        translated = undefined;\n                    } else {\n                        translated = translated.substr('onlyIfNotInTextField/'.length);\n                    }\n                }\n\n                let isArrow = d.readableShortcut.startsWith('Arrow');\n                if (translated && !(isArrow && pr.vci.getModel().productOpts.getB('skipArrowkeyMessages'))) {\n                    pr.vci.performMenuAction(translated);\n                    /* arrowkeys send both 'afterKeyDown' and 'arrowKey' */\n                    if (!isArrow) {\n                        d.setHandled();\n                    }\n                }\n            }\n\n            if (\n                !pr.vci.isCodeRunning() &&\n                !d.handled() &&\n                currentFocus &&\n                currentFocus.includes('VpcPanelScriptEditor##editor') &&\n                getToolCategory(pr.vci.getTool()) === VpcToolCtg.CtgEdit &&\n                slength(pr.vci.getOptionS('viewingScriptVelId'))\n            ) {\n                /* code editor keyboard shortcuts */\n                pr.lyrPropPanel.editor.respondKeydown(d);\n            }\n\n            if (!pr.vci.isCodeRunning() && !d.handled()) {\n                /* non-modal dialog keyboard shortcuts */\n                pr.lyrNonModalDlgHolder.respondKeyDown(d);\n            }\n\n            if (!pr.vci.isCodeRunning() && !d.handled() && getToolCategory(pr.vci.getTool()) === VpcToolCtg.CtgEdit) {\n                /* prop panel keyboard shortcuts */\n                pr.lyrPropPanel.respondKeydown(d);\n            }\n\n            if (\n                !d.handled() &&\n                pr.vci.getTool() === VpcTool.Browse &&\n                currentFocus &&\n                (d.readableShortcut === 'Enter' || d.readableShortcut === 'Return')\n            ) {\n                /* according to docs, closefield should be called when user hits Enter in a field */\n                pr.beginScheduleFldOpenCloseEventClose(currentFocus);\n            }\n\n            if (!pr.vci.isCodeRunning() && !d.handled()) {\n                VpcPresenterEvents.updateFieldsRecentlyEdited(pr, d);\n            }\n\n            if (!pr.vci.isCodeRunning() && !d.handled()) {\n                /* normal typing text into a field */\n                ed.onKeyDown(pr, d);\n            }\n\n            if (!pr.vci.isCodeRunning() && !d.handled() && pr.vci.getTool() === VpcTool.Browse) {\n                VpcPresenterEvents.scheduleScriptMsg(pr, pr.vci, d);\n            }\n\n            if (!d.handled() && pr.vci.isCodeRunning()) {\n                d.setHandled();\n            }\n        });\n    },\n\n    /**\n     * track when we've typed normal text in a field, to\n     * know if we should call closeField or exitField\n     */\n    updateFieldsRecentlyEdited(pr: VpcPresenterInterface, d: KeyDownEventDetails) {\n        if (UI512TextEvents.keyDownProbablyCausesTextChange(d)) {\n            let el = TextSelModify.getSelectedField(pr);\n            if (el) {\n                let vel = pr.lyrModelRender.findElIdToVel(el.id);\n                if (vel && vel.getType() === VpcElType.Fld && !vel.getB('locktext')) {\n                    pr.vci.getCodeExec().fieldsRecentlyEdited.val[vel.idInternal] = true;\n                }\n            }\n        }\n    },\n\n    /**\n     * schedule a script event\n     */\n    scheduleScriptEvent(pr: VpcPresenterInterface, d: EventDetails) {\n        VpcPresenterEvents.scheduleScriptMsg(pr, pr.vci, d);\n    },\n\n    /**\n     * send keyup to current script\n     */\n    respondKeyUp(pr: VpcPresenterInterface, d: EventDetails) {\n        if (!d.handled() && pr.vci.getTool() === VpcTool.Browse) {\n            VpcPresenterEvents.scheduleScriptMsg(pr, pr.vci, d);\n        }\n\n        if (!d.handled() && pr.vci.isCodeRunning()) {\n            d.setHandled();\n        }\n    },\n\n    /**\n     * respond to menu item\n     */\n    respondMenuItemClicked(pr: VpcPresenterInterface, d: MenuItemClickedDetails) {\n        if (!d.handled()) {\n            pr.vci.performMenuAction(d.id);\n        }\n    },\n\n    /**\n     * on focus changed (user highlighted something)\n     */\n    respondFocusChanged(pr: VpcPresenterInterface, d: FocusChangedEventDetails) {\n        if (!d.handled()) {\n            pr.beginScheduleFldOpenCloseEvent(d);\n        }\n    },\n\n    /**\n     * on idle (this event is continuously sent)\n     */\n    respondIdle(pr: VpcPresenterInterface, d: IdleEventDetails) {\n        let curtool = pr.vci.getTool();\n        let codeRunning = pr.vci.isCodeRunning();\n        if (pr.cursorRefreshPending && pr.trackMouse[0] !== -1 && pr.trackMouse[1] !== -1) {\n            pr.refreshCursor();\n            pr.cursorRefreshPending = false;\n        }\n\n        if (!d.handled() && codeRunning && curtool !== VpcTool.Browse) {\n            pr.vci.getCodeExec().forceStopRunning();\n        }\n\n        if (!d.handled() && curtool === VpcTool.Browse) {\n            /* run scripts. note that anything a script does is undoable. */\n            pr.timerRunScript.update(d.milliseconds);\n            if (pr.timerRunScript.isDue()) {\n                pr.timerRunScript.reset();\n                pr.vci.undoableAction(\n                    () => pr.vci.getCodeExec().runTimeslice(pr.runScriptTimeslice),\n                    TypeOfUndoAction.StartReusableAction\n                );\n            }\n        }\n\n        if (!d.handled() && codeRunning) {\n            d.setHandled();\n        }\n\n        if (!d.handled()) {\n            /* mousewithin events are currently only sent a few times\n            a second to not overwhelm system with events */\n            pr.timerSendMouseWithin.update(d.milliseconds);\n            if (pr.timerSendMouseWithin.isDue()) {\n                pr.timerSendMouseWithin.reset();\n                if (curtool === VpcTool.Browse) {\n                    /* send mousewithin */\n                    VpcPresenterEvents.scheduleScriptMsg(pr, pr.vci, d, pr.trackMouse[0], pr.trackMouse[1]);\n                }\n            }\n        }\n\n        if (!d.handled()) {\n            /* should be fairly fast, not adding anything to a queue, if there is no handler. */\n            /* send onidle event to script */\n            if (curtool === VpcTool.Browse) {\n                VpcPresenterEvents.scheduleScriptMsg(pr, pr.vci, d, -1, -1);\n            }\n        }\n\n        if (!d.handled()) {\n            /* good, the caret won't be blinking in a text field when script is running */\n            pr.timerBlinkMarquee.update(d.milliseconds);\n            if (pr.timerBlinkMarquee.isDue()) {\n                pr.timerBlinkMarquee.reset();\n                pr.tlctgLasso.blinkSelection();\n                pr.tlctgRectSelect.blinkSelection();\n            }\n        }\n\n        if (!d.handled()) {\n            /* run maintenance */\n            pr.timerRunMaintenance.update(d.milliseconds);\n            if (pr.timerRunMaintenance.isDue()) {\n                pr.timerRunMaintenance.reset();\n                if (!pr.vci.isCurrentlyUndoing()) {\n                    justConsoleMsgIfExceptionThrown(() => pr.lyrPaintRender.doMaintenance(), 'lyrPaintRender.doMaintenance');\n                    justConsoleMsgIfExceptionThrown(() => pr.vci.getCodeExec().doMaintenance(), 'getCodeExec.doMaintenance');\n                }\n            }\n        }\n    },\n\n    /**\n     * is the menubar open\n     */\n    _menuIsOpen(pr: VpcPresenterInterface) {\n        let grpMenubar = pr.app.findGroup('$$grpmenubar');\n        if (grpMenubar) {\n            let menubar = grpMenubar.findEl('$$menubarforapp');\n            if (menubar && menubar.getN('whichIsExpanded') >= 0) {\n                return true;\n            }\n        }\n\n        return false;\n    },\n\n    /**\n     * finds target vel id and\n     * schedules a script message (only if browse tool is active)\n     */\n    scheduleScriptMsg(pr: VpcPresenterInterface, vci: VpcStateInterface, d: EventDetails, mouseX = -1, mouseY = -1) {\n        if (d.handled() || vci.getTool() !== VpcTool.Browse) {\n            return;\n        }\n\n        let target: O<string>;\n        let isOnIdleEvent = false;\n        if (d instanceof MouseUpEventDetails) {\n            if (d.elClick) {\n                target = d.elClick.id;\n            }\n        } else if (d instanceof MouseUpOrDownDetails || d instanceof MouseEnterDetails || d instanceof MouseLeaveDetails) {\n            let affected = d.getAffectedElements();\n            if (affected.length) {\n                target = arLast(affected).id;\n            }\n        } else if (d instanceof KeyEventDetails) {\n            let focus = pr.vci.getCurrentFocus();\n            if (focus && pr.lyrModelRender.elIdToVelId(focus)) {\n                target = focus;\n            } else {\n                target = '<use-current-card>';\n            }\n        } else if (d instanceof IdleEventDetails) {\n            if (mouseX !== -1 && mouseY !== -1) {\n                /* mousewithin event */\n                let el = pr.vci.UI512App().coordsToElement(mouseX, mouseY);\n                if (el) {\n                    target = el.id;\n                } else {\n                    target = '<use-current-card>';\n                }\n            } else {\n                /* idle event */\n                target = '<use-current-card>';\n                isOnIdleEvent = true;\n                /* don't let 'on idle' run when you are running a msg box command  */\n                if (pr.lyrNonModalDlgHolder.current instanceof VpcNonModalReplBox) {\n                    target = undefined;\n                }\n            }\n        }\n\n        if (target) {\n            let velId = coalesceIfFalseLike(pr.lyrModelRender.elIdToVelId(target), pr.vci.getOptionS('currentCardId'));\n            VpcPresenterEvents.scheduleScriptMsgImpl(pr, d, velId, isOnIdleEvent);\n        }\n    },\n\n    /**\n     * schedule a script message (only if browse tool is active)\n     */\n    scheduleScriptMsgImpl(pr: VpcPresenterInterface, d: EventDetails, targetVelId: string, isOnIdleEvent: boolean) {\n        /* don't start scripts if menu is open */\n        if (VpcPresenterEvents._menuIsOpen(pr)) {\n            return;\n        }\n\n        let whichMsg = isOnIdleEvent ? VpcBuiltinMsg.Idle : getMsgFromEvtType(d.type());\n        let msg = new VpcScriptMessage(targetVelId, whichMsg);\n        msg.cardWhenFired = pr.vci.getOptionS('currentCardId');\n        msg.causedByUserAction = true;\n\n        if (d instanceof KeyEventDetails) {\n            msg.keyChar = d.keyChar;\n            msg.keyMods = d.mods;\n            msg.keyRepeated = d.repeated;\n        }\n\n        if (d instanceof MouseDownEventDetails || d instanceof MouseUpEventDetails || d instanceof MouseDownDoubleEventDetails) {\n            msg.clickLoc = [d.mouseX - pr.userBounds[0], d.mouseY - pr.userBounds[1]];\n        } else {\n            msg.clickLoc = [pr.trackLastClick[0] - pr.userBounds[0], pr.trackLastClick[1] - pr.userBounds[1]];\n        }\n\n        msg.lastSeenClickId = pr.trackLastClick[2];\n        pr.vci.getCodeExec().scheduleCodeExec(msg);\n    }\n};\n\n/**\n * we must route text changes to a vel instead of directly setting the UI512 element\n */\nexport class EditTextBehaviorSendToVel extends UI512TextEvents {\n    constructor(protected pr: VpcPresenterInterface) {\n        super();\n    }\n\n    /**\n     * override the UI512TextEvents method to get our own scrollbarImpl\n     */\n    protected getScrollbarImpl() {\n        return new ScrollbarImplSendToVel(this.pr);\n    }\n\n    /**\n     * if this is a vel, we should send to the vel\n     * otherwise, send to the ui512el\n     */\n    protected gelFromEl(el: O<UI512ElTextField>): O<GenericTextField> {\n        return EditTextBehaviorSendToVel.gelFromEl(this.pr, el);\n    }\n\n    /**\n     * get the vel, if it exists, else return the el\n     */\n    static gelFromEl(pr: VpcPresenterInterface, el: O<UI512ElTextField>): O<GenericTextField> {\n        if (el) {\n            let vel = pr.lyrModelRender.findElIdToVel(el.id);\n            if (vel) {\n                let velFld = cast(VpcElField, vel);\n                return VpcModelRender.canFieldHaveFocus(velFld)\n                    ? new VpcTextFieldAsGeneric(el, velFld, pr.vci.getModel())\n                    : undefined;\n            } else {\n                return new UI512ElTextFieldAsGeneric(el);\n            }\n        } else {\n            return undefined;\n        }\n    }\n}\n\n/**\n * a modified version of ScrollbarImpl that, when applicable,\n * routes text changes to a vel instead of directly setting the UI512 element\n */\nexport class ScrollbarImplSendToVel extends ScrollbarImpl {\n    constructor(protected pr: VpcPresenterInterface) {\n        super();\n    }\n\n    /**\n     * if this is a vel, we should send to the vel\n     * otherwise, send to the ui512el\n     */\n    protected gelFromEl(el: O<UI512Element>): O<GenericTextField> {\n        if (el instanceof UI512ElTextField) {\n            return EditTextBehaviorSendToVel.gelFromEl(this.pr, el);\n        } else {\n            return undefined;\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcPresenterInit.ts",
    "content": "\n/* auto */ import { UndoManager } from './../state/vpcUndo';\n/* auto */ import { VpcAppUIToolStamp } from './../tools/vpcToolStamp';\n/* auto */ import { VpcAppUIToolSmear } from './../tools/vpcToolSmear';\n/* auto */ import { VpcAppUIToolShape } from './../tools/vpcToolShape';\n/* auto */ import { VpcAppUIToolSelect } from './../tools/vpcToolSelect';\n/* auto */ import { VpcAppUIToolLasso } from './../tools/vpcToolLasso';\n/* auto */ import { VpcAppUIToolEdit } from './../tools/vpcToolEdit';\n/* auto */ import { VpcAppUIToolCurve } from './../tools/vpcToolCurve';\n/* auto */ import { VpcAppUIToolBucket } from './../tools/vpcToolBucket';\n/* auto */ import { VpcAppUIToolBrowse } from './../tools/vpcToolBrowse';\n/* auto */ import { VpcAppUIToolBase } from './../tools/vpcToolBase';\n/* auto */ import { VpcRuntime } from './../state/vpcState';\n/* auto */ import { VpcSave } from './vpcSave';\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcPresenterInterface } from './vpcPresenterInterface';\n/* auto */ import { VpcPresenterEvents } from './vpcPresenterEvents';\n/* auto */ import { VpcPaintRender } from './../modelrender/vpcPaintRender';\n/* auto */ import { VpcModelRender } from './../modelrender/vpcModelRender';\n/* auto */ import { VpcAppMenu } from './../menu/vpcMenu';\n/* auto */ import { VpcAppLyrToolbox } from './../panels/vpcLyrToolbox';\n/* auto */ import { VpcAppLyrPanels } from './../panels/vpcLyrPanels';\n/* auto */ import { VpcAppLyrNotification } from './../panels/vpcLyrNotification';\n/* auto */ import { VpcLyrNonModalHolder } from './../nonmodaldialogs/vpcLyrNonModalHolder';\n/* auto */ import { VpcAppLyrDragHandles } from './../panels/vpcLyrDragHandles';\n/* auto */ import { VpcExecInternalDirectiveFull } from './vpcInternalDirectiveImpl';\n/* auto */ import { VpcStateInterface, VpcUILayer } from './../state/vpcInterface';\n/* auto */ import { VpcTool, VpcToolCtg, getToolCategory } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcMenuActions } from './../menu/vpcAppMenuActions';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { ScreenConsts, getUI512WindowBounds } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { RepeatingTimer } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, checkIsProductionBuild } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512 } from './../../ui512/utils/util512';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { ElementObserverToTwo } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * contains initialization code for the ViperCard presenter\n */\nexport abstract class VpcPresenterInit extends VpcPresenterInterface {\n    /* window dimensions */\n    bounds: number[] = [];\n    userBounds: number[] = [];\n\n    /* callbacks to the higher level provider */\n    cbExitToMainMenu: () => void;\n    cbExitToNewDocument: () => void;\n    cbExitToOpen: (mystacksonly: boolean) => void;\n    cbSaveToBrowserStorage: (s: string, identifier: O<string>, humanName: O<string>) => string;\n\n    /* higher level has told us this is a demo stack */\n    cameFromDemoSoNeverPromptSave = '';\n\n    /* repeating timers */\n    /* use a very fast runScriptPeriod */\n    /*  - needed for appropriate responsiveness in games */\n    /*  - drawframe pings even faster, so no harm done */\n    /*  - will be a no-op most of the time */\n    readonly sendMouseWithinPeriod = 250;\n    readonly blinkMarqueePeriod = 350;\n    readonly runMaintenancePeriod = 60 * 1000;\n    readonly runScriptPeriod = 5;\n    readonly runScriptTimeslice = 400;\n    timerSendMouseWithin = new RepeatingTimer(this.sendMouseWithinPeriod);\n    timerRunScript = new RepeatingTimer(this.runScriptPeriod);\n    timerBlinkMarquee = new RepeatingTimer(this.blinkMarqueePeriod);\n    timerRunMaintenance = new RepeatingTimer(this.runMaintenancePeriod);\n\n    /* have we been told to refresh the cursor */\n    cursorRefreshPending = true;\n\n    /* menu actions helper object */\n    menuActions: VpcMenuActions;\n\n    /* tool event responder objects */\n    tlctgBrowse = new VpcAppUIToolBrowse(this.bounds, this.userBounds);\n    tlctgEdit = new VpcAppUIToolEdit(this.bounds, this.userBounds);\n    tlctgShape = new VpcAppUIToolShape(this.bounds, this.userBounds);\n    tlctgRectSelect = new VpcAppUIToolSelect(this.bounds, this.userBounds);\n    tlctgLasso = new VpcAppUIToolLasso(this.bounds, this.userBounds);\n    tlctgSmear = new VpcAppUIToolSmear(this.bounds, this.userBounds);\n    tlctgBucket = new VpcAppUIToolBucket(this.bounds, this.userBounds);\n    tlctgCurve = new VpcAppUIToolCurve(this.bounds, this.userBounds);\n    tlctgStamp = new VpcAppUIToolStamp(this.bounds, this.userBounds);\n    tlResponses: { [ctg: string]: VpcAppUIToolBase } = {};\n    tlNumToResponse: { [tl: number]: VpcAppUIToolBase } = {};\n\n    /* background to foreground: */\n    /* layer 1: paint */\n    /* layer 2: rendering model */\n    /* layer 3: resize handles */\n    /* layer 4: white cover */\n    /* layer 5: toolboxes */\n    /* layer 6: prop panels */\n    /* layer 7: menus */\n    /* layer 8: non-modal dialog */\n    lyrPaintRender = new VpcPaintRender();\n    lyrModelRender = new VpcModelRender();\n    lyrResizeHandles = new VpcAppLyrDragHandles();\n    lyrCoverArea = new VpcAppLyrNotification();\n    lyrToolboxes = new VpcAppLyrToolbox();\n    lyrPropPanel = new VpcAppLyrPanels();\n    lyrMenus = new VpcAppMenu();\n    lyrNonModalDlgHolder = new VpcLyrNonModalHolder();\n    layers: VpcUILayer[] = [\n        this.lyrPaintRender,\n        this.lyrModelRender,\n        this.lyrResizeHandles,\n        this.lyrCoverArea,\n        this.lyrToolboxes,\n        this.lyrPropPanel,\n        this.lyrMenus,\n        this.lyrNonModalDlgHolder\n    ];\n\n    /**\n     * construct an instance\n     */\n    constructor(public vci: VpcStateInterface, protected runtime: VpcRuntime) {\n        super();\n        this.menuActions = new VpcMenuActions(this.vci);\n    }\n\n    /**\n     * initialize member variables\n     */\n    initPresenter(undoManager: UndoManager) {\n        super.init();\n\n        /* when a vel changes: */\n        /* - notify undo manager */\n        /* - notify \"modelRender\", so ui can be updated. */\n        let observeVelChange = new ElementObserverToTwo();\n        observeVelChange.observer1 = undoManager;\n        observeVelChange.observer2 = this.lyrModelRender;\n        this.runtime.useThisObserverForVpcEls = observeVelChange;\n\n        /* when a runtime option changes: */\n        /* - set a flag in observeRuntimeOptChanges that we'll check during render */\n        this.vci.getCodeExec().directiveImpl = new VpcExecInternalDirectiveFull(this, this.vci);\n        this.vci.getCodeExec().directiveImpl.outside = this.vci.getOutside();\n        this.vci.getCodeExec().runStatements.directiveImpl = this.vci.getCodeExec().directiveImpl;\n        this.vci.getCodeExec().cbOnScriptError = (scriptErr, msg) => this.defaultShowScriptErr(scriptErr, msg);\n        this.vci.getCodeExec().cbCauseUIRedraw = () => this.lyrModelRender.uiRedrawNeeded();\n        this.vci.getCodeExec().cbSetRealTool = (tl: VpcTool) => this.vci.setTool(tl);\n        this.vci.getCodeExec().runStatements.cbAnswerMsg = (a, b, c, d, e) => this.answerMsg(a, b, c, d, e);\n        this.vci.getCodeExec().runStatements.cbAskMsg = (a, b, c) => this.askMsg(a, b, c);\n        this.vci.getCodeExec().runStatements.cbStopCodeRunning = () => {\n            /* stop all code, even an infinite loop */\n            this.vci.getCodeExec().forceStopRunning();\n            this.vci.setTool(VpcTool.Button);\n        };\n\n        /* window dimensions*/\n        Util512.extendArray(this.bounds, getUI512WindowBounds());\n        Util512.extendArray(this.userBounds, [\n            this.bounds[0],\n            this.bounds[1] + ScreenConsts.yMenuBar,\n            ScreenConsts.xAreaWidth,\n            ScreenConsts.yAreaHeight\n        ]);\n\n        Util512.freezeProperty(this, 'bounds');\n        Util512.freezeProperty(this, 'userBounds');\n        Util512.freezeProperty(this, 'layers');\n\n        /* provide a callback to menuActions */\n        this.menuActions.save = new VpcSave(this);\n        this.menuActions.cbFindEditToolSelectedFldOrBtn = () => this.lyrPropPanel.selectedFldOrBtn();\n        this.menuActions.cbOnClearNonBrowseTool = () => this.getToolResponse(this.getTool()).onDeleteSelection();\n        this.setUpUnbeforeloadWarning();\n    }\n\n    /**\n     * initialize UI tools and layers\n     */\n    initUI() {\n        this.app = new UI512Application(this.bounds, this);\n        this.initLayers();\n        VpcPresenterEvents.initEvents(this);\n        this.tlctgEdit.lyrPanels = this.lyrPropPanel;\n        this.tlResponses[VpcToolCtg.CtgBrowse] = this.tlctgBrowse;\n        this.tlResponses[VpcToolCtg.CtgEdit] = this.tlctgEdit;\n        this.tlResponses[VpcToolCtg.CtgShape] = this.tlctgShape;\n        this.tlResponses[VpcToolCtg.CtgRectSelect] = this.tlctgRectSelect;\n        this.tlResponses[VpcToolCtg.CtgLasso] = this.tlctgLasso;\n        this.tlResponses[VpcToolCtg.CtgSmear] = this.tlctgSmear;\n        this.tlResponses[VpcToolCtg.CtgBucket] = this.tlctgBucket;\n        this.tlResponses[VpcToolCtg.CtgCurve] = this.tlctgCurve;\n        this.tlResponses[VpcToolCtg.CtgStamp] = this.tlctgStamp;\n\n        /* provide callbacks for tool responses */\n        for (let tlresp of Util512.getMapVals(this.tlResponses)) {\n            tlresp.vci = this.vci;\n            tlresp.cbModelRender = () => this.lyrModelRender;\n            tlresp.cbPaintRender = () => this.lyrPaintRender;\n            tlresp.cbScheduleScriptEventSend = a => VpcPresenterEvents.scheduleScriptMsg(this, this.vci, a);\n        }\n\n        /* make a map of tool number to tool response */\n        for (let tl = VpcTool.__first; tl <= VpcTool.__last; tl++) {\n            let ctg = getToolCategory(tl);\n            assertTrue(this.tlResponses[ctg], 'Km|');\n            this.tlNumToResponse[tl] = this.tlResponses[ctg];\n        }\n\n        this.useOSClipboard = this.vci.getOptionB('optUseHostClipboard');\n        this.inited = true;\n    }\n\n    /**\n     * initialize layers\n     */\n    protected initLayers() {\n        for (let layer of this.layers) {\n            layer.vci = this.vci;\n            layer.init(this);\n        }\n\n        /* provide callbacks */\n        this.lyrPropPanel.handles = this.lyrResizeHandles;\n        this.lyrPropPanel.editor.cbAnswerMsg = (s, cb) =>\n            this.answerMsg(s, n => {\n                cb();\n            });\n\n        this.lyrToolboxes.cbAnswerMsg = (s, cb) =>\n            this.answerMsg(s, n => {\n                cb();\n            });\n\n        this.lyrToolboxes.cbStopCodeRunning = () => this.vci.getCodeExec().forceStopRunning();\n        this.lyrNonModalDlgHolder.pr = this as UI512PresenterBase;\n\n        if (\n            this.cameFromDemoSoNeverPromptSave &&\n            this.cameFromDemoSoNeverPromptSave !== 'demo_game.json' &&\n            this.cameFromDemoSoNeverPromptSave !== 'demo_anim.json'\n        ) {\n            this.lyrCoverArea.hideMyMessage();\n        }\n\n        let ses = getVpcSessionTools().fromRoot();\n        let username = ses ? ses.username : '';\n        if (username) {\n            this.lyrCoverArea.hideMyMessage();\n        }\n    }\n\n    /**\n     * get the current tool\n     */\n    getTool(): VpcTool {\n        return this.vci.getOptionN('currentTool');\n    }\n\n    /**\n     * get the selected vel\n     */\n    getSelectedFieldVel(): O<VpcElField> {\n        let focused = this.getCurrentFocus();\n        if (focused) {\n            let vel = this.lyrModelRender.findElIdToVel(focused);\n            if (vel && vel instanceof VpcElField) {\n                return vel;\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * register with the browser so that if you try to navigate to a new page,\n     * and you haven't hit Save,\n     * browser will warn you before moving to the page (since you'd lose your changes)\n     */\n    protected setUpUnbeforeloadWarning() {\n        if (WeakMap) {\n            /* let's not keep a strong reference to _VpcPresenter_, */\n            /* because that would tie up a lot of memory from being freed. */\n            /* a WeakMap accomplishes this well. */\n            let weakRef = new WeakMap<any, VpcPresenterInit>();\n            let key = new Object();\n            weakRef.set(key, this);\n            window.onbeforeunload = () => {\n                if (weakRef.has(key)) {\n                    let pr = weakRef.get(key);\n                    if (pr && pr.isDocDirty() && checkIsProductionBuild() && !pr.cameFromDemoSoNeverPromptSave.length) {\n                        return lng('lngReminder that unsaved changes will be lost.\\nContinue?');\n                    }\n                }\n\n                return undefined;\n            };\n        }\n    }\n\n    /**\n     * we no longer need this warning\n     */\n    protected teardownBeforeUnloadWarning() {\n        window.onbeforeunload = () => {};\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcPresenterInterface.ts",
    "content": "\n/* auto */ import { VpcScriptMessage } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcAppUIToolSelect } from './../tools/vpcToolSelect';\n/* auto */ import { VpcAppUIToolLasso } from './../tools/vpcToolLasso';\n/* auto */ import { VpcAppUIToolBase } from './../tools/vpcToolBase';\n/* auto */ import { VpcPaintRender } from './../modelrender/vpcPaintRender';\n/* auto */ import { VpcModelRender } from './../modelrender/vpcModelRender';\n/* auto */ import { VpcAppMenu } from './../menu/vpcMenu';\n/* auto */ import { VpcAppLyrToolbox } from './../panels/vpcLyrToolbox';\n/* auto */ import { VpcAppLyrPanels } from './../panels/vpcLyrPanels';\n/* auto */ import { VpcAppLyrNotification } from './../panels/vpcLyrNotification';\n/* auto */ import { VpcLyrNonModalHolder } from './../nonmodaldialogs/vpcLyrNonModalHolder';\n/* auto */ import { VpcAppLyrDragHandles } from './../panels/vpcLyrDragHandles';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcErr, VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { RepeatingTimer } from './../../ui512/utils/util512Higher';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { FocusChangedEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * forward-declare methods on the presenter class, solely\n * to break circular dependencies\n */\nexport abstract class VpcPresenterInterface extends UI512Presenter {\n    vci: VpcStateInterface;\n    timerSendMouseWithin: RepeatingTimer;\n    timerRunScript: RepeatingTimer;\n    timerBlinkMarquee: RepeatingTimer;\n    timerRunMaintenance: RepeatingTimer;\n    userBounds: number[];\n    cursorRefreshPending: boolean;\n    runScriptTimeslice: number;\n    tlctgRectSelect: VpcAppUIToolSelect;\n    tlctgLasso: VpcAppUIToolLasso;\n    lyrPaintRender: VpcPaintRender;\n    lyrModelRender: VpcModelRender;\n    lyrResizeHandles: VpcAppLyrDragHandles;\n    lyrCoverArea: VpcAppLyrNotification;\n    lyrToolboxes: VpcAppLyrToolbox;\n    lyrPropPanel: VpcAppLyrPanels;\n    lyrMenus: VpcAppMenu;\n    lyrNonModalDlgHolder: VpcLyrNonModalHolder;\n    cameFromDemoSoNeverPromptSave: string;\n\n    abstract askMsg(prompt: string, defText: string, fnOnResult: (ret: O<string>, n: number) => void): void;\n    abstract exit(s: string): void;\n    abstract askMsgAsync(prompt: string, defText: string): Promise<[O<string>, number]>;\n    abstract answerMsgAsync(prompt: string, choice1?: string, choice2?: string, choice3?: string): Promise<number>;\n    abstract isDocDirty(): boolean;\n    abstract defaultShowScriptErr(scriptErr: VpcErr, msg: O<VpcScriptMessage>): void;\n    abstract getSerializedStack(): string;\n    abstract getToolResponse(t: VpcTool): VpcAppUIToolBase;\n    abstract refreshCursor(): void;\n    abstract refreshCursorElemKnown(el: O<UI512Element>, isDocumentEl: boolean): void;\n    abstract beginScheduleFldOpenCloseEvent(evt: FocusChangedEventDetails): void;\n    abstract beginScheduleFldOpenCloseEventClose(prevId: string): void;\n    abstract beginScheduleFldOpenCloseEventOpen(nextId: string): void;\n\n    abstract answerMsg(\n        prompt: string,\n        fnOnResult?: (n: number) => void,\n        choice1?: string,\n        choice2?: string,\n        choice3?: string\n    ): void;\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/presentation/vpcSave.ts",
    "content": "\n/* auto */ import { VpcSessionInterface } from './../../vpc/request/vpcRequestBase';\n/* auto */ import { getVpcSessionTools } from './../../vpc/request/vpcRequest';\n/* auto */ import { VpcPresenterInterface } from './vpcPresenterInterface';\n/* auto */ import { VpcNonModalFormSendReport } from './../nonmodaldialogs/vpcFormSendReport';\n/* auto */ import { VpcNonModalFormLogin } from './../nonmodaldialogs/vpcFormLogin';\n/* auto */ import { checkThrowNotifyMsg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcSaveInterface } from './../menu/vpcAppMenuActions';\n/* auto */ import { VpcElStackLineageEntry } from './../../vpc/vel/velStack';\n/* auto */ import { BrowserInfo, BrowserOSInfo, RespondToErr, Util512Higher } from './../../ui512/utils/util512Higher';\n/* auto */ import { O, coalesceIfFalseLike } from './../../ui512/utils/util512Base';\n/* auto */ import { ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { Util512, longstr } from './../../ui512/utils/util512';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n/* auto */ import { bridgedSaveAs } from './../../bridge/bridgeFileSaver';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * saving stacks\n * we limit to one async operation running at a time, so that the UI isn't confusing.\n * overlapping saves would be OK functionally but confusing to the user.\n */\nexport class VpcSave implements VpcSaveInterface {\n    busy = false;\n    constructor(protected pr: VpcPresenterInterface) {}\n\n    /**\n     * save to server with a new name\n     */\n    beginSaveAs() {\n        let ses = getVpcSessionTools().fromRoot();\n        if (ses) {\n            this.busy = true;\n            Util512Higher.syncToAsyncTransition(\n                this.goSaveAsAsync(ensureDefined(ses, 'Kr|')),\n                'goSaveAsAsync',\n                RespondToErr.Alert\n            );\n        } else {\n            /* not logged in yet, show log in form */\n            let form = new VpcNonModalFormLogin(this.pr.vci, true /* newUserOk*/);\n            VpcNonModalFormSendReport.standardWindowBounds(form, this.pr.vci);\n            form.fnCbWhenSignedIn = () => {\n                this.beginSaveAs();\n            };\n\n            this.pr.vci.setNonModalDialog(form);\n        }\n    }\n\n    /**\n     * save to server\n     */\n    beginSave() {\n        let ses = getVpcSessionTools().fromRoot();\n        if (ses) {\n            this.busy = true;\n            Util512Higher.syncToAsyncTransition(\n                this.goSaveAsync(ensureDefined(ses, 'Kq|')),\n                'beginSave async',\n                RespondToErr.Alert\n            );\n        } else {\n            /* not logged in yet, show log in form */\n            let form = new VpcNonModalFormLogin(this.pr.vci, true /* newUserOk*/);\n            VpcNonModalFormSendReport.standardWindowBounds(form, this.pr.vci);\n            form.fnCbWhenSignedIn = () => {\n                this.beginSave();\n            };\n\n            this.pr.vci.setNonModalDialog(form);\n        }\n    }\n\n    /**\n     * save as, show dialog upon failure\n     */\n    protected async goSaveAsAsyncImpl(ses: VpcSessionInterface) {\n        let didSave = false;\n        try {\n            let newStackData = this.pr.getSerializedStack();\n            let info = this.pr.vci.getModel().stack.getLatestStackLineage();\n            didSave = await this.goSaveAsWithNewName(ses, info.stackName, newStackData);\n        } catch (e) {\n            this.pr.answerMsg(\n                longstr(`Save did not complete. If you encounter repeated\n                 errors, you can use 'Save As Json' instead.\\n${e}`),\n                n => {}\n            );\n        }\n\n        if (didSave) {\n            this.pr.lyrCoverArea.setMyMessage('Save was successful.');\n            Util512Higher.syncToAsyncAfterPause(\n                () => this.pr.lyrCoverArea.setMyMessage(''),\n                2000,\n                'hide succesful save msg',\n                RespondToErr.ConsoleErrOnly\n            );\n        }\n\n        this.pr.cameFromDemoSoNeverPromptSave = '';\n    }\n\n    /**\n     * save, show dialog upon failure\n     */\n    protected async goSaveAsyncImpl(ses: VpcSessionInterface) {\n        let didSave = false;\n        try {\n            let newStackData = this.pr.getSerializedStack();\n            let info = this.pr.vci.getModel().stack.getLatestStackLineage();\n            if (info.stackOwner === ses.username) {\n                didSave = await this.goSaveQuietUpdate(ses, info.stackGuid, info.stackName, newStackData);\n            } else {\n                didSave = await this.goSaveAsWithNewName(ses, info.stackName, newStackData);\n            }\n        } catch (e) {\n            await this.pr.answerMsgAsync(\n                longstr(`Save did not complete. If you encounter repeated\n                    errors, you can use 'Save As Json' instead.\\n${e}`)\n            );\n        }\n\n        if (didSave) {\n            this.pr.lyrCoverArea.setMyMessage('Save was successful.');\n            Util512Higher.syncToAsyncAfterPause(\n                () => this.pr.lyrCoverArea.setMyMessage(''),\n                2000,\n                'hide succesful save msg',\n                RespondToErr.ConsoleErrOnly\n            );\n        }\n\n        this.pr.cameFromDemoSoNeverPromptSave = '';\n    }\n\n    /**\n     * stack was already saved, so we can quietly send our updated version\n     */\n    protected async goSaveQuietUpdate(ses: VpcSessionInterface, stackId: string, stackName: string, newStackData: string) {\n        await ses.vpcStacksSave(stackId, newStackData);\n        this.pr.vci.setOption('lastSavedStateId', this.pr.vci.getCurrentStateId());\n        return true;\n    }\n\n    /**\n     * ensures 'busy' flag reset\n     */\n    protected async goSaveAsAsync(ses: VpcSessionInterface) {\n        try {\n            await this.goSaveAsAsyncImpl(ses);\n        } finally {\n            this.busy = false;\n        }\n    }\n\n    /**\n     * ensures 'busy' flag reset\n     */\n    protected async goSaveAsync(ses: VpcSessionInterface) {\n        try {\n            await this.goSaveAsyncImpl(ses);\n        } finally {\n            this.busy = false;\n        }\n    }\n\n    /**\n     * ask the user to choose a new name\n     */\n    protected async goSaveAsWithNewName(ses: VpcSessionInterface, prevStackName: string, newStackData: string) {\n        let prevStackNameToShow = coalesceIfFalseLike(prevStackName, 'untitled');\n        if (prevStackNameToShow === 'untitled') {\n            prevStackNameToShow = 'Untitled ' + Util512Higher.getRandIntInclusiveWeak(1, 100);\n        }\n\n        let newName = (await this.pr.askMsgAsync('Save as:', prevStackNameToShow))[0];\n        if (newName && newName.trim().length) {\n            newName = newName.trim();\n            let lineageBeforeChanges = this.pr.vci.getModel().stack.getS('stacklineage');\n            try {\n                /* add new part to stack lineage! */\n                let stack = this.pr.vci.getModel().stack;\n                let newPartialId = getVpcSessionTools().generateStackPartialId();\n                let en = new VpcElStackLineageEntry(ses.username, newPartialId, newName);\n                stack.appendToStackLineage(en, this.pr.vci.getModel());\n\n                /* a serialized stack -- with the new lineage */\n                newStackData = this.pr.getSerializedStack();\n                await ses.vpcStacksSaveAs(newPartialId, newName, newStackData);\n                this.pr.vci.setOption('lastSavedStateId', this.pr.vci.getCurrentStateId());\n                return true;\n            } catch (e) {\n                /* something went wrong - revert the changes! */\n                this.pr.vci.getModel().stack.setOnVel('stacklineage', lineageBeforeChanges, this.pr.vci.getModel());\n                throw e;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * show a dialog where user can copy link\n     * might be able to set clipboard, but this is simpler to implement\n     */\n    beginShareLink() {\n        let gotLink = this.getShareLink();\n        let br = BrowserInfo.get().os;\n        let key = br === BrowserOSInfo.Mac ? 'Cmd' : 'Ctrl';\n        this.pr.askMsg(lng(`lngPress ${key}+C to copy this link!`), gotLink, () => {});\n    }\n\n    /**\n     * export stack to json\n     */\n    beginExportJson() {\n        /* *don't* use this.busy with this.\n        this isn't async so it isn't really needed,\n        but more importantly we don't want a malfunctioning server save\n        to stop us from saving as json, which is our fallback if server fails. */\n        let eThrown: O<Error>;\n        try {\n            this.pr.lyrPropPanel.saveChangesToModel(false);\n        } catch (e) {\n            /* shouldn't happen, but let the save continue. */\n            eThrown = e;\n        }\n\n        let defaultFilename = 'my stack.json';\n        let blob = new Blob([this.pr.getSerializedStack()], {\n            type: 'text/plain;charset=utf-8'\n        });\n        bridgedSaveAs()(blob, defaultFilename);\n        this.pr.vci.setOption('lastSavedStateId', this.pr.vci.getCurrentStateId());\n\n        /* count json saves, send to our server to count */\n        let info = this.pr.vci.getModel().stack.getLatestStackLineage();\n        let ses = getVpcSessionTools().fromRoot();\n        let currentUsername = ses ? ses.username : '';\n\n        /* telemetry on how often people save stacks */\n        if (getVpcSessionTools().enableServerCode) {\n            Util512Higher.syncToAsyncTransition(\n                getVpcSessionTools().vpcStacksCountJsonSaves(info.stackOwner, info.stackGuid, currentUsername),\n                'count json saves',\n                RespondToErr.ConsoleErrOnly\n            );\n        }\n\n        /* now rethrow if we got an error */\n        if (eThrown) {\n            throw eThrown;\n        }\n    }\n\n    /**\n     * export to gif\n     */\n    beginExportGif() {\n        this.pr.askMsg('Animation speed (1-10, where 10 is fastest):', '4', (typed, btnPressed) => {\n            if (btnPressed === 0) {\n                let speed = parseFloat(typed === undefined ? '' : typed);\n                speed = Number.isFinite(speed) ? speed : -1;\n                this.pr.lyrPaintRender.paintExportToGif(this.pr, speed);\n            }\n        });\n    }\n\n    /**\n     * send mark to server to flag content\n     */\n    beginFlagContent() {\n        Util512Higher.syncToAsyncTransition(this.mnuGoFlagContentAsync(), 'beginFlagContent', RespondToErr.Alert);\n    }\n\n    /**\n     * ask for confirmation and send content flag\n     */\n    async mnuGoFlagContentAsync() {\n        let choice = await this.pr.answerMsgAsync(\n            longstr(`We do not allow the hosting of malware, spam,\n             phishing, obscene, libelous, defamatory, pornographic,\n             or hateful content. Submit a report?`),\n            'Submit',\n            'Cancel'\n        );\n\n        if (choice === 0) {\n            try {\n                let ses = getVpcSessionTools().fromRoot();\n                let currentUsername = ses ? ses.username : '';\n                let info = this.pr.vci.getModel().stack.getLatestStackLineage();\n                if (\n                    info.stackOwner &&\n                    info.stackOwner.length &&\n                    info.stackOwner !== this.pr.vci.getModel().stack.lineageUsernameNull() &&\n                    info.stackOwner !== currentUsername\n                ) {\n                    await getVpcSessionTools().vpcStacksFlagContent(info.stackOwner, info.stackGuid, currentUsername);\n                } else {\n                    let e = new Error('Could not get info, or it looks like you own this stack.');\n                    throw e;\n                }\n            } catch (e) {\n                return this.pr.answerMsgAsync('Could not send a report. ' + e.toString());\n            }\n\n            return this.pr.answerMsgAsync('Submitted a content report for this stack. Thank you.');\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * exit the stack\n     */\n    beginGoExit(destination: string) {\n        this.pr.exit(destination);\n    }\n\n    /**\n     * get url for this stack\n     */\n    protected getShareLink(): string {\n        let loc = location.href.split('?')[0];\n        /* case 1) from a demo stack (perf optimization, 0 db hits) */\n        if (this.pr.cameFromDemoSoNeverPromptSave.length) {\n            let url = loc + '?s=' + Util512.toBase64UrlSafe(this.pr.cameFromDemoSoNeverPromptSave);\n            return url;\n        } else {\n            let info = this.pr.vci.getModel().stack.getLatestStackLineage();\n            /* case 2) from a stack not saved online */\n            if (\n                !info.stackOwner ||\n                !info.stackOwner.length ||\n                info.stackOwner === this.pr.vci.getModel().stack.lineageUsernameNull()\n            ) {\n                checkThrowNotifyMsg(false, 'UC|First, go to File->Save to upload the stack.');\n            }\n\n            let ses = getVpcSessionTools().fromRoot();\n            let currentUsername = ses ? ses.username : '';\n\n            if (info.stackOwner !== currentUsername) {\n                /* case 3) from a stack we don't own -- don't check if changes need to be saved */\n                return getVpcSessionTools().getUrlForOpeningStack(loc, info.stackOwner, info.stackGuid, info.stackName);\n            } else {\n                /* case 4) from a stack we do own */\n                if (this.pr.isDocDirty()) {\n                    checkThrowNotifyMsg(\n                        false,\n                        longstr(`UB|It looks like you have unsaved\n                    changes, we're reminding you to hit Save first.`)\n                    );\n                }\n\n                return getVpcSessionTools().getUrlForOpeningStack(loc, info.stackOwner, info.stackGuid, info.stackName);\n            }\n        }\n    }\n\n    /**\n     * helper method to show the login form and set its dimensions\n     */\n    protected showLoginForm(newUserOk: boolean) {\n        let form = new VpcNonModalFormLogin(this.pr.vci, newUserOk);\n        VpcNonModalFormSendReport.standardWindowBounds(form, this.pr.vci);\n        this.pr.vci.setNonModalDialog(form);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcCreateOrDelVel.ts",
    "content": "\n/* auto */ import { CodeLimits } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcStateInterface } from './vpcInterface';\n/* auto */ import { VpcElType, checkThrow, checkThrowInternal } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElStack } from './../../vpc/vel/velStack';\n/* auto */ import { VpcElProductOpts } from './../../vpc/vel/velProductOpts';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElButton } from './../../vpc/vel/velButton';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { assertWarnEq } from './../../ui512/utils/util512';\n/* auto */ import { ElementObserver } from './../../ui512/elements/ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * create or delete a vel\n */\nexport abstract class UndoableActionCreateOrDelVel {\n    constructor(\n        public velId: string,\n        public parentId: string,\n        public type: VpcElType,\n        public isBg: boolean,\n        public insertIndex: number\n    ) {}\n\n    /**\n     * from VpcElType to class object\n     */\n    protected static getConstructor(type: VpcElType): { new (...args: any[]): VpcElBase } {\n        if (type === VpcElType.Btn) {\n            return VpcElButton;\n        } else if (type === VpcElType.Fld) {\n            return VpcElField;\n        } else if (type === VpcElType.Card) {\n            return VpcElCard;\n        } else if (type === VpcElType.Bg) {\n            return VpcElBg;\n        } else if (type === VpcElType.Stack) {\n            return VpcElStack;\n        } else {\n            checkThrowInternal(false, `6f|incorrect type/parent. type is a ${type}`);\n        }\n    }\n\n    /**\n     * get child array\n     */\n    static getChildVelsArray(velId: string, vci: VpcStateInterface, type: VpcElType): VpcElBase[] {\n        let vel = vci.getModel().getByIdUntyped(velId);\n        if ((type === VpcElType.Btn || type === VpcElType.Fld) && vel instanceof VpcElCard) {\n            return vel.parts;\n        } else if (type === VpcElType.Card && vel instanceof VpcElBg) {\n            return vel.cards;\n        } else if (type === VpcElType.Bg && vel instanceof VpcElStack) {\n            return vel.bgs;\n        } else {\n            checkThrowInternal(false, `6e|incorrect type/parent. child is a ${type} and parent is a `);\n        }\n    }\n\n    /**\n     * create a new vel on its own\n     */\n    protected static rawMakeVelInstanceAndAddToModelMap<T extends VpcElBase>(\n        vci: VpcStateInterface,\n        velId: string,\n        parentId: string,\n        ctr: { new (...args: any[]): T },\n        ob?: ElementObserver\n    ): T {\n        vci.causeFullRedraw();\n        let vel = new ctr(velId, parentId);\n        checkThrow(vel instanceof VpcElBase, `8*|must be a VpcElBase`);\n        if (ob) {\n            vel.observer = ob;\n        } else {\n            vel.observer = vci.getModel().productOpts.observer;\n        }\n\n        vci.getModel().addIdToMapOfElements(vel);\n        return vel;\n    }\n\n    /**\n     * find index in array\n     */\n    protected determineIndexInAr(vel: VpcElBase, vci: VpcStateInterface) {\n        let ar = UndoableActionCreateOrDelVel.getChildVelsArray(this.parentId, vci, vel.getType());\n        for (let i = 0; i < ar.length; i++) {\n            if (ar[i].idInternal === vel.idInternal) {\n                return i;\n            }\n        }\n\n        checkThrowInternal(false, `6d|could not find place in parent array for ${vel.idInternal}`);\n    }\n\n    /**\n     * create a vel, supports creating a bg vel\n     */\n    protected create(vci: VpcStateInterface) {\n        if (this.isBg && (this.type === VpcElType.Btn || this.type === VpcElType.Fld)) {\n            let userFacingId = vci.getModel().stack.getNextId(vci.getModel());\n            console.log(userFacingId);\n            checkThrow(false, 'Wa|not yet implemented');\n        } else {\n            return this.createImpl(vci);\n        }\n    }\n\n    /**\n     * create a vel\n     */\n    protected createImpl(vci: VpcStateInterface) {\n        vci.causeFullRedraw();\n        let ctr = UndoableActionCreateOrDelVel.getConstructor(this.type);\n        let vel = UndoableActionCreateOrDelVel.rawMakeVelInstanceAndAddToModelMap(vci, this.velId, this.parentId, ctr);\n        let ar = UndoableActionCreateOrDelVel.getChildVelsArray(this.parentId, vci, vel.getType());\n        if (this.insertIndex === -1) {\n            /* note, save this for undo posterity */\n            this.insertIndex = ar.length;\n        }\n\n        /* check bounds, note that it is ok to insert one past the end. */\n        assertWarn(this.insertIndex >= 0 && this.insertIndex <= ar.length, '6c|incorrect insertion point');\n        checkThrow(\n            ar.length < CodeLimits.MaxVelChildren,\n            `8)|exceeded maximum number of child elements (${CodeLimits.MaxVelChildren})`\n        );\n\n        ar.splice(this.insertIndex, 0, vel);\n\n        if (vel.getType() === VpcElType.Card) {\n            vci.getModel().copyBgVelsOnNewCard(vel);\n\n            let order = vci.getModel().stack.getCardOrder();\n            let found = order.findIndex(s => s === vci.getCurrentCardId());\n            found = found === -1 ? order.length - 1 : found;\n            order.splice(found + 1, 0, vel.idInternal);\n            vci.getModel().stack.alterCardOrder(oldOrder => order, vci.getModel());\n        }\n    }\n\n    /**\n     * remove a vel\n     */\n    protected remove(vci: VpcStateInterface) {\n        vci.causeFullRedraw();\n        let vel = vci.getModel().getByIdUntyped(this.velId);\n        let ar = UndoableActionCreateOrDelVel.getChildVelsArray(vel.parentIdInternal, vci, vel.getType());\n        assertWarnEq(vel.idInternal, ar[this.insertIndex].idInternal, '6b|');\n        assertWarn(this.insertIndex >= 0 && this.insertIndex < ar.length, '6a|incorrect insertion point');\n        /* for safety, delete by id */\n        let index = ar.findIndex(v => v.idInternal === this.velId);\n        if (index !== -1) {\n            ar.splice(index, 1);\n            vci.getModel().removeIdFromMapOfElements(vel.idInternal);\n            if (vel.getType() === VpcElType.Card) {\n                vci.getModel().stack.alterCardOrder(list => list.filter(s => s !== vel.idInternal), vci.getModel());\n            }\n        }\n    }\n\n    /**\n     * ensure model is not empty, create a productOpts and stack object if either is missing.\n     */\n    static ensureModelNotEmpty(vci: VpcStateInterface, createFirstCard: boolean, ob: ElementObserver) {\n        vci.causeFullRedraw();\n        let model = vci.getModel();\n        if (!model.productOpts) {\n            vci.doWithoutAbilityToUndo(() => {\n                model.productOpts = UndoableActionCreateOrDelVel.rawMakeVelInstanceAndAddToModelMap(\n                    vci,\n                    VpcElStack.initProductOptsId,\n                    '(VpcElProductOpts has no parent)',\n                    VpcElProductOpts,\n                    ob\n                );\n            });\n        }\n\n        if (!model.stack) {\n            vci.doWithoutAbilityToUndo(() => {\n                /* create a new stack */\n                model.stack = UndoableActionCreateOrDelVel.rawMakeVelInstanceAndAddToModelMap(\n                    vci,\n                    VpcElStack.initStackId,\n                    model.productOpts.idInternal,\n                    VpcElStack,\n                    ob\n                );\n                model.stack.setOnVel('name', 'my stack', model);\n                if (createFirstCard) {\n                    let creator = vci.getCodeExec().directiveImpl;\n                    let firstBg = creator.rawCreateOneVelUseCarefully(model.stack.idInternal, VpcElType.Bg, -1, undefined);\n                    creator.rawCreateOneVelUseCarefully(firstBg.idInternal, VpcElType.Card, -1, undefined);\n                }\n            });\n        }\n\n        model.productOpts.observer = ob;\n        model.stack.observer = ob;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcInterface.ts",
    "content": "\n/* auto */ import { VpcExecTop } from './../../vpc/codeexec/vpcScriptExecTop';\n/* auto */ import { VpcExecFrameStack } from './../../vpc/codeexec/vpcScriptExecFrameStack';\n/* auto */ import { VpcExecFrame } from './../../vpc/codeexec/vpcScriptExecFrame';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { OutsideWorldReadWrite } from './../../vpc/vel/velOutsideInterfaces';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcElField } from './../../vpc/vel/velField';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { UI512PresenterBase } from './../../ui512/presentation/ui512PresenterBase';\n/* auto */ import { UI512Presenter } from './../../ui512/presentation/ui512Presenter';\n/* auto */ import { EventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512Application } from './../../ui512/elements/ui512ElementApp';\n/* auto */ import { UI512PaintDispatch } from './../../ui512/draw/ui512DrawPaintDispatch';\n/* auto */ import { UI512CompBase } from './../../ui512/composites/ui512Composites';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * interface,\n * a way to request from the Presenter\n * without any reference cycles\n */\nexport interface VpcStateInterface {\n    /**\n     * get a string runtime (not-persisted) option\n     */\n    getOptionS(prop: string): string;\n\n    /**\n     * get a numeric runtime (not-persisted) option\n     */\n    getOptionN(prop: string): number;\n\n    /**\n     * get a boolean runtime (not-persisted) option\n     */\n    getOptionB(prop: string): boolean;\n\n    /**\n     * set a boolean runtime (not-persisted) option\n     */\n    setOption<T extends ElementObserverVal>(prop: string, newVal: T): void;\n\n    /**\n     * perform undo\n     */\n    performUndo(): boolean;\n\n    /**\n     * perform redo\n     */\n    performRedo(): boolean;\n\n    /**\n     * get state id, for undo/redo and seeing if a stack is dirty/needs to be saved\n     */\n    getCurrentStateId(): string;\n\n    /**\n     * get current execution context, or undefined if script not running\n     */\n    findExecFrameStack(): [O<VpcExecFrameStack>, O<VpcExecFrame>];\n\n    /**\n     * get vel model structure\n     */\n    getModel(): VpcModelTop;\n\n    /**\n     * is code currently running\n     */\n    isCodeRunning(): boolean;\n\n    /**\n     * re-add a vel to the model\n     */\n    rawRevive(vel: VpcElBase): void;\n\n    /**\n     * perform a changeSeenCreationDeletion\n     */\n    doChangeSeenCreationDeletion(action: UndoableActionPlaceholder): void;\n\n    /**\n     * don't record changes made for undo, and assert that no changes were made\n     */\n    doWithoutAbilityToUndoExpectingNoChanges(fn: () => void): void;\n\n    /**\n     * don't record changes made for undo\n     */\n    doWithoutAbilityToUndo(fn: () => void): void;\n\n    /**\n     * record changes made for undo\n     */\n    undoableAction(fn: () => void, typ?: TypeOfUndoAction): void;\n\n    /**\n     * are we 'back in time' looking at a previous state?\n     */\n    isCurrentlyUndoing(): boolean;\n\n    /**\n     * schedule event to be sent\n     */\n    scheduleScriptEventSend(d: EventDetails): void;\n\n    /**\n     * get the UI512 app for the Presenter\n     */\n    UI512App(): UI512Application;\n\n    /**\n     * get the Presenter\n     */\n    getPresenter(): UI512Presenter;\n\n    /**\n     * a way to call a function asynchronously and get the error handling and typical callstack\n     * the function will be called soon via onIdle\n     */\n    placeCallbackInQueue(cb: () => void): void;\n\n    /**\n     * get bounds of the UI512Presenter\n     */\n    bounds(): number[];\n\n    /**\n     * get user-bounds of the UI512Presenter\n     */\n    userBounds(): number[];\n\n    /**\n     * get current card number\n     */\n    getCurrentCardNum(): number;\n\n    /**\n     * get current card id\n     */\n    getCurrentCardId(): string;\n\n    /**\n     * go to a card without sending any closecard or opencard events\n     */\n    setCurCardNoOpenCardEvt(id: string): void;\n\n    /**\n     * get the current tool\n     */\n    getTool(): VpcTool;\n\n    /**\n     * set the current tool\n     */\n    setTool(n: VpcTool): void;\n\n    /**\n     * show a non-modal form, closing any other active form\n     */\n    setNonModalDialog(form: O<UI512CompBase>): void;\n\n    /**\n     * show a non-modal form, closing any other active form\n     */\n    setNonModalDialogByStr(form: O<string>): void;\n\n    /**\n     * show a modal dialog\n     */\n    answerMsgAsync(prompt: string, choice1?: string, choice2?: string, choice3?: string): Promise<number>;\n\n    /**\n     * get the currently focused vel\n     */\n    getCurrentFocusVelField(): O<VpcElField>;\n\n    /**\n     * get the currently focused element, either an element of the stack or part of vpc ui\n     */\n    getCurrentFocus(): O<string>;\n\n    /**\n     * set the currently focused element\n     */\n    setCurrentFocus(s: O<string>): void;\n\n    /**\n     * flush queue of paint actions\n     */\n    commitSimulatedClicks(queue: UI512PaintDispatch[]): void;\n\n    /**\n     * perform a menu action.\n     * might not be synchronous; the menu action could show a modal dialog\n     */\n    performMenuAction(s: string): void;\n\n    /**\n     * cause VPC UI to be redrawn\n     */\n    causeUIRedraw(): void;\n\n    /**\n     * cause VPC UI and also every vel to be redrawn\n     */\n    causeFullRedraw(): void;\n\n    /**\n     * get top code execution object\n     */\n    getCodeExec(): VpcExecTop;\n\n    /**\n     * get \"outside world\" interface\n     */\n    getOutside(): OutsideWorldReadWrite;\n\n    /**\n     * append text to the message box\n     * ignored if the message box is not currently open\n     */\n    writeToReplMessageBox(s: string, returnFocus: boolean): void;\n\n    /**\n     * releases memory by nulling out everything owned by the class\n     */\n    destroy(): void;\n}\n\n/**\n * will become a UndoableActionCreateVel\n */\nexport interface UndoableActionPlaceholder {}\n\n/**\n * base class for layers in the Vpc UI\n */\nexport abstract class VpcUILayer {\n    vci: VpcStateInterface;\n    abstract init(pr: UI512PresenterBase): void;\n    abstract updateUI512Els(): void;\n}\n\n/**\n * it seems more intuitive if all modifications caused by a script are\n * wrapped together into one undoable block, even though the script\n * is run in separate timeslices. without this coalescing of undo\n * events, user would have to hit Undo multiple times for no apparent reason\n */\nexport enum TypeOfUndoAction {\n    None = 1,\n\n    /* always create new action */\n    StartNewAction,\n\n    /* if latest action is also StartReusableAction, glue it together */\n    StartReusableAction\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcOutsideImpl.ts",
    "content": "\n/* auto */ import { VpcVal, VpcValN, VpcValS } from './../../vpc/vpcutils/vpcVal';\n/* auto */ import { LogToReplMsgBox, ReadableContainer, VpcScriptMessage, WritableContainer } from './../../vpc/vpcutils/vpcUtils';\n/* auto */ import { VpcExecFrameStack } from './../../vpc/codeexec/vpcScriptExecFrameStack';\n/* auto */ import { VpcExecFrame } from './../../vpc/codeexec/vpcScriptExecFrame';\n/* auto */ import { RequestedContainerRef, RequestedVelRef } from './../../vpc/vpcutils/vpcRequestedReference';\n/* auto */ import { VpcStateInterface } from './vpcInterface';\n/* auto */ import { PropAdjective, VpcElType, VpcTool, checkThrow, toolToDispatchShapes } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { RequestedChunk } from './../../vpc/vpcutils/vpcChunkResolutionUtils';\n/* auto */ import { ChunkResolution } from './../../vpc/vpcutils/vpcChunkResolution';\n/* auto */ import { CheckReservedWords } from './../../vpc/codepreparse/vpcCheckReserved';\n/* auto */ import { VpcBuiltinFunctionsDateUtils } from './../../vpc/codepreparse/vpcBuiltinFunctionsUtils';\n/* auto */ import { VpcBuiltinFunctions } from './../../vpc/codepreparse/vpcBuiltinFunctions';\n/* auto */ import { VelResolveReference } from './../../vpc/vel/velResolveReference';\n/* auto */ import { RWContainerField, RWContainerFldSelection, RWContainerVar } from './../../vpc/vel/velResolveContainer';\n/* auto */ import { VelGetNumberProperty, VelRenderId, VelRenderName } from './../../vpc/vel/velRenderName';\n/* auto */ import { VpcElProductOpts } from './../../vpc/vel/velProductOpts';\n/* auto */ import { OutsideWorldRead, OutsideWorldReadWrite } from './../../vpc/vel/velOutsideInterfaces';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcFontSpecialChunk } from './../../vpc/vel/velFieldChangeFont';\n/* auto */ import { VpcElField, VpcTextFieldAsGeneric } from './../../vpc/vel/velField';\n/* auto */ import { VpcElBg } from './../../vpc/vel/velBg';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { O, bool } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, ensureDefined } from './../../ui512/utils/util512Assert';\n/* auto */ import { ValHolder, assertEq, longstr, slength } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n/* auto */ import { UI512PaintDispatch } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * OutsideWorldReadWrite\n * provides scripts with access to the outside \"world\".\n */\nexport class VpcOutsideImpl implements OutsideWorldReadWrite {\n    protected readonly check = new CheckReservedWords();\n    readonly builtinFns: VpcBuiltinFunctions;\n    vci: VpcStateInterface;\n    constructor() {\n        this.builtinFns = new VpcBuiltinFunctions(this as OutsideWorldRead);\n    }\n\n    /**\n     * resolve reference to a vel\n     */\n    ResolveVelRef(ref: RequestedVelRef): O<VpcElBase> {\n        let frame = this.vci.findExecFrameStack()[1];\n        let me: O<VpcElBase> = this.FindVelById(frame?.meId);\n        let target = this.vci.getModel().findByIdUntyped(frame?.message?.targetId);\n        let cardHistory = this.vci.getCodeExec().cardHistory;\n\n        let resolver = new VelResolveReference(this.vci.getModel());\n        let ret: O<VpcElBase>;\n        try {\n            /* for convenience, let's throw exceptions when\n            the vel can't be found. means we get less specific messages, though */\n            ret = resolver.go(ref, me, target, cardHistory);\n        } catch (e) {\n            let as = e?.typeName?.includes('Vpc') && e?.message?.includes('break, not found');\n            if (as) {\n                ret = undefined;\n            } else {\n                throw e;\n            }\n        }\n\n        checkThrow(!ret || !ret.getS('name').includes('$$'), `Kt|names with $$ are reserved for internal ViperCard objects.`);\n\n        return ret;\n    }\n\n    /**\n     * try resolving a RequestedVelRef, if succeeds return its long id\n     * if resolution fails, return undefined\n     */\n    ElementExists(vel: RequestedVelRef): O<string> {\n        let found = this.ResolveVelRef(vel);\n        if (found) {\n            return new VelRenderId(this.vci.getModel()).go(\n                found,\n                PropAdjective.LongForParse,\n                this.Model().stack.getB('compatibilitymode')\n            );\n        } else {\n            return undefined;\n        }\n    }\n\n    /**\n     * count the number of elements of a certain type\n     */\n    CountElements(type: VpcElType, parentRef: RequestedVelRef): number {\n        return new VelResolveReference(this.vci.getModel()).countElements(type, parentRef, this.vci.getCodeExec().cardHistory);\n    }\n\n    /**\n     * get the current \"item delemiter\" to know how to interpret 'get item 3 of \"a,b,c\"'\n     */\n    GetItemDelim() {\n        let ret = this.GetOptionS('itemDel');\n        assertEq(1, ret.length, '6r|invalid itemDel', ret);\n        return ret;\n    }\n\n    /**\n     * declare a global\n     */\n    DeclareGlobal(varName: string) {\n        assertTrue(slength(varName), '6q|bad varName', varName);\n        let frame = this.getExecFrameStack()[1];\n        frame.declaredGlobals[varName] = true;\n    }\n\n    /**\n     * is a variable defined\n     */\n    IsVarDefined(varName: string) {\n        let [frStack, frame] = this.getExecFrameStack();\n        return (\n            bool(frStack.constants.find(varName)) ||\n            bool(frame.declaredGlobals[varName] && frStack.globals.find(varName)) ||\n            bool(frame.locals.find(varName))\n        );\n    }\n\n    /**\n     * read variable contents\n     */\n    ReadVarContents(varName: string): VpcVal {\n        assertTrue(slength(varName), '6p|bad varName', varName);\n\n        let [frStack, frame] = this.getExecFrameStack();\n        let found = frStack.constants.find(varName);\n        if (found) {\n            return found;\n        }\n\n        found = frStack.globals.find(varName);\n        if (found && frame.declaredGlobals[varName] !== undefined) {\n            return found;\n        }\n\n        found = frame.locals.find(varName);\n        return ensureDefined(\n            found,\n            '6o|no variable found with this name. please put contents into before reading from it.',\n            varName\n        );\n    }\n\n    /**\n     * set variable contents\n     */\n    SetVarContents(varName: string, v: VpcVal): void {\n        assertTrue(slength(varName), '6n|bad varName', varName);\n\n        if (varName === LogToReplMsgBox.redirectThisVariableToMsgBox) {\n            this.WriteToReplMessageBox(v.readAsString(), false);\n            return;\n        }\n\n        let [frStack, frame] = this.getExecFrameStack();\n        let found = frStack.constants.find(varName);\n        if (found) {\n            checkThrow(false, `6m|name not allowed ${varName}, it is a constant`);\n        }\n\n        checkThrow(this.check.okLocalVar(varName), '8>|variable name not allowed', varName);\n        if (frame.declaredGlobals[varName] !== undefined) {\n            frStack.globals.set(varName, v);\n        } else {\n            frame.locals.set(varName, v);\n        }\n    }\n\n    /**\n     * set variable contents (allows access to special vars like \"it\")\n     */\n    SetSpecialVar(varName: string, v: VpcVal): void {\n        checkThrow(varName === 'it', '8=|only supported for it');\n        let frame = this.getExecFrameStack()[1];\n        frame.locals.set(varName, v);\n    }\n\n    /**\n     * resolve a reference to a container,\n     * throws if the requested vel does not exist.\n     * by casting to readablecontainer this provides read-only access\n     */\n    ResolveContainerReadable(container: RequestedContainerRef): ReadableContainer {\n        return this.ResolveContainerWritable(container) as ReadableContainer;\n    }\n\n    /**\n     * resolve reference to writable container\n     * throws if the requested vel does not exist\n     */\n    ResolveContainerWritable(container: RequestedContainerRef): WritableContainer {\n        checkThrow(container instanceof RequestedContainerRef, '8<|not a valid container');\n        if (container.isJustSelection) {\n            let selPts = this.FindSelectedTextBounds();\n            return new RWContainerFldSelection(selPts[0], this.Model(), selPts[1], selPts[2]);\n        } else if (container.vel) {\n            let vel = this.ResolveVelRef(container.vel);\n            checkThrow(vel, `8;|element not found`);\n            checkThrow(\n                vel instanceof VpcElField,\n                longstr(`UJ|you can only read/write text to\n                    a field. to read/write label of button, use 'the label of cd btn 1'`)\n            );\n\n            return new RWContainerField(vel, this.Model());\n        } else if (container.variable) {\n            return new RWContainerVar(this, container.variable);\n        } else {\n            checkThrow(false, `6k|invalid IntermedValContainer, nothing set`);\n        }\n    }\n\n    /**\n     * read text from a container\n     */\n    ContainerRead(contRef: RequestedContainerRef): string {\n        let cont = this.ResolveContainerReadable(contRef);\n        return ChunkResolution.applyReadToString(cont, contRef.chunk, this.GetItemDelim());\n    }\n\n    /**\n     * modify a container\n     */\n    ContainerModify(contRef: RequestedContainerRef, fn: (s: string) => string) {\n        let cont = this.ResolveContainerWritable(contRef);\n        ChunkResolution.applyModify(cont, contRef.chunk, this.GetItemDelim(), this.Model().stack.getB('compatibilitymode'), fn);\n    }\n\n    /**\n     * makes the bounds ordered min to max, and ensures that they are within range.\n     * also checks for a field marked as can't-select.\n     */\n    protected fixSelectionBounds(fld: VpcElField): O<[number, number]> {\n        let generic = new VpcTextFieldAsGeneric(undefined, fld, this.Model());\n        return TextSelModify.getSelectedTextBounds(generic);\n    }\n\n    /**\n     * find the selected text chunk\n     */\n    FindSelectedTextBounds(): [O<VpcElField>, number, number] {\n        let selFld = this.vci.getCurrentFocusVelField();\n        if (selFld) {\n            /* check if it's locktext/non selectable */\n            let bounds = this.fixSelectionBounds(selFld);\n            if (bounds) {\n                return [selFld, bounds[0], bounds[1]];\n            }\n        }\n\n        return [undefined, 0, 0];\n    }\n\n    /**\n     * set a property\n     */\n    SetProp(ref: RequestedVelRef, prop: string, v: VpcVal, chunk: O<RequestedChunk>): void {\n        let vel = this.ResolveVelRef(ref);\n        checkThrow(vel, `8/|could not set ${prop}, could not find that object.`);\n\n        if (chunk) {\n            checkThrow(vel instanceof VpcElField, `8.|can only say 'set the (prop) of char 1 to 2' on fields.`);\n            new VpcFontSpecialChunk(vel).specialSetPropChunk(this.Model(), prop, chunk, v, this.GetItemDelim());\n        } else {\n            vel.setProp(prop, v, this.Model());\n        }\n    }\n\n    /**\n     * high-level get property of a vel, returns VpcVal\n     */\n    GetProp(ref: RequestedVelRef, prop: string, adjective: PropAdjective, chunk: O<RequestedChunk>): VpcVal {\n        let vel = this.ResolveVelRef(ref);\n        checkThrow(vel, `8-|could not get ${prop}, could not find that object.`);\n\n        /* handled here are the cases where \"adjective\" matters */\n        if (chunk) {\n            /* put the textstyle of char 2 to 4 of fld \"myFld\" into x */\n            checkThrow(vel instanceof VpcElField, `8,|can only say 'get the (prop) of char 1 to 2' on fields.`);\n            return new VpcFontSpecialChunk(vel).specialGetPropChunk(this.Model(), prop, chunk, this.GetItemDelim());\n        } else if (prop === 'name') {\n            /* put the long name of card \"myCard\" into x */\n            let renderer = new VelRenderName(this.vci.getModel());\n            adjective = adjective === PropAdjective.Empty ? PropAdjective.Abbrev : adjective;\n            return VpcValS(renderer.go(vel, adjective));\n        } else if (prop === 'id') {\n            /* put the id of card \"myCard\" into x */\n            let renderer = new VelRenderId(this.vci.getModel());\n            adjective = adjective === PropAdjective.Empty ? PropAdjective.Abbrev : adjective;\n            return VpcValS(renderer.go(vel, adjective, this.Model().stack.getB('compatibilitymode')));\n        } else if (prop === 'internalid') {\n            /* put the internalid of cd btn 1 into x\n            for bg elements, id !== internalid */\n            return VpcValS(vel.idInternal);\n        } else if (prop === 'number') {\n            /* put the number of card \"myCard\" into x */\n            let renderer = new VelGetNumberProperty(this.vci.getModel());\n            return VpcValN(renderer.go(vel));\n        } else if (prop === 'owner') {\n            /* put the owner of cd btn 1 into x */\n            checkThrow(ref, \"UI|must say 'get the owner of cd btn 1' and not 'get the owner'\");\n            return VpcValS(this.getOwnerFullString(vel, adjective));\n        } else if (prop === 'target') {\n            /* put the long target into x */\n            checkThrow(\n                !ref || ref.type === VpcElType.Product,\n                \"UH|must say 'get the target' and not 'get the target of cd btn 1'\"\n            );\n            return VpcValS(this.getTargetFullString(adjective));\n        } else if (prop === 'date') {\n            /* put the long date into x */\n            checkThrow(!ref || ref.type === VpcElType.Product, \"UG|must say 'get the date' and not 'get the date of cd btn 1'\");\n            return VpcBuiltinFunctionsDateUtils.go(adjective);\n        } else if (prop === 'version') {\n            /* get the long version */\n            checkThrow(!ref || ref.type === VpcElType.Product, \"8+|must say 'get the date' and not 'get the date of cd btn 1'\");\n            return VpcBuiltinFunctionsDateUtils.getVersion(adjective);\n        } else {\n            if (adjective !== PropAdjective.Empty) {\n                checkThrow(\n                    false,\n                    longstr(`6j|this property does not take an\n                        adjective like 'long' (the long name of cd btn 1)`)\n                );\n            }\n\n            /* ask the vel for the property */\n            return vel.getProp(prop);\n        }\n    }\n\n    /**\n     * get the model\n     */\n    Model(): VpcModelTop {\n        return this.vci.getModel();\n    }\n\n    /**\n     * is this a runtime property on the 'product' object, or a special pseudoproperty?\n     */\n    IsProductProp(propName: string): boolean {\n        return (\n            VpcElProductOpts.canGetProductProp(propName) || propName === 'target' || propName === 'date' || propName === 'version'\n        );\n    }\n\n    /**\n     * get the current tool, specify the 'real' tool or the 'simulated' tool chosen by a script\n     */\n    GetCurrentTool(realOrMimic: boolean): VpcTool {\n        return this.GetOptionN(realOrMimic ? 'currentTool' : 'mimicCurrentTool');\n    }\n\n    /**\n     * is this a built-in function\n     */\n    IsBuiltinFunction(s: string): boolean {\n        return VpcBuiltinFunctions.isFunction(s);\n    }\n\n    /**\n     * call a built-in function\n     */\n    CallBuiltinFunction(s: string, args: VpcVal[]): VpcVal {\n        return this.builtinFns.call(s, args);\n    }\n\n    /**\n     * get the current card id\n     */\n    GetCurrentCardId(): string {\n        return this.vci.getOptionS('currentCardId');\n    }\n\n    /**\n     * get code execution frame information\n     */\n    GetFrameInfo(): [VpcScriptMessage, VpcVal[]] {\n        let frame = this.getExecFrameStack()[1];\n        return [frame.message, frame.args];\n    }\n\n    /**\n     * get a runtime (non-persisted) string value\n     */\n    GetOptionS(prop: string): string {\n        return this.vci.getOptionS(prop);\n    }\n\n    /**\n     * get a runtime (non-persisted) numeric value\n     */\n    GetOptionN(prop: string): number {\n        return this.vci.getOptionN(prop);\n    }\n\n    /**\n     * get a runtime (non-persisted) boolean value\n     */\n    GetOptionB(prop: string): boolean {\n        return this.vci.getOptionB(prop);\n    }\n\n    /**\n     * set a runtime (non-persisted) value\n     */\n    SetOption<T extends ElementObserverVal>(prop: string, newVal: T) {\n        this.vci.setOption(prop, newVal);\n    }\n\n    /**\n     * find element by id\n     */\n    FindVelById(id: O<string>): O<VpcElBase> {\n        return this.vci.getModel().findByIdUntyped(id);\n    }\n\n    /**\n     * go straight to a card without calling closecard or opencard\n     */\n    SetCurCardNoOpenCardEvt(id: string) {\n        this.vci.setCurCardNoOpenCardEvt(id);\n    }\n\n    /**\n     * draw paint on the screen by simulating a click\n     */\n    SimulateClick(argsGiven: number[], mods: ModifierKeys): void {\n        let mimcTool = this.GetCurrentTool(false);\n        checkThrow(\n            mimcTool !== VpcTool.Browse,\n            longstr(\n                `7R|please first run something like 'choose\n        \"pencil\" tool' to specify which tool to draw with`,\n                ''\n            )\n        );\n        let args = this.MakeUI512PaintDispatchFromCurrentOptions(false, mods);\n        checkThrow(argsGiven.length % 2 === 0, 'Wb|expected even #');\n        for (let i = 0; i < argsGiven.length; i += 2) {\n            args.xPts.push(argsGiven[i]);\n            args.yPts.push(argsGiven[i + 1]);\n        }\n\n        let frStack = this.getExecFrameStack()[0];\n        frStack.paintQueue.push(args);\n    }\n\n    /**\n     * commit simulated clicks to the screen\n     */\n    CommitSimulatedClicks(queue: UI512PaintDispatch[]): void {\n        this.vci.commitSimulatedClicks(queue);\n    }\n\n    /**\n     * get mouse and keyboard state\n     */\n    GetMouseAndKeyState(\n        mouseCoords: [number, number],\n        trackClick: [number, number, number],\n        buttons: ValHolder<boolean[]>,\n        mods: ValHolder<ModifierKeys>\n    ) {\n        let pr = this.vci.getPresenter();\n        mouseCoords[0] = pr.trackMouse[0];\n        mouseCoords[1] = pr.trackMouse[1];\n        trackClick[0] = pr.trackLastClick[0];\n        trackClick[1] = pr.trackLastClick[1];\n        trackClick[2] = pr.trackLastClick[2];\n        buttons.val = pr.trackPressedBtns.slice();\n        mods.val = pr.trackMetaKeys;\n    }\n\n    /**\n     * make a UI512PaintDispatch object\n     */\n    MakeUI512PaintDispatchFromCurrentOptions(realOrMimic: boolean, mods: ModifierKeys) {\n        let tool = this.GetCurrentTool(realOrMimic);\n        let fromOptsPattern = this.GetOptionS('currentPattern');\n        let fromOptsFillcolor = this.GetOptionN('optPaintFillColor');\n        let fromOptsLineColor = this.GetOptionN('optPaintLineColor');\n        let fromOptsWide = this.GetOptionB('optWideLines');\n        let ret = UI512PaintDispatch.fromMemoryOpts(\n            toolToDispatchShapes(tool),\n            tool === VpcTool.Eraser,\n            fromOptsPattern,\n            fromOptsFillcolor,\n            fromOptsLineColor,\n            fromOptsWide\n        );\n\n        ret.cardId = this.GetOptionS('currentCardId');\n        ret.mods = mods;\n        return ret;\n    }\n\n    /**\n     * append text to the message box\n     * ignored if the message box is not currently open\n     */\n    WriteToReplMessageBox(s: string, returnFocus: boolean): void {\n        return this.vci.writeToReplMessageBox(s, returnFocus);\n    }\n\n    /**\n     * get access to FieldsRecentlyEdited, used to determine\n     * whether we should call openField or exitField\n     */\n    GetFieldsRecentlyEdited() {\n        return this.vci.getCodeExec().fieldsRecentlyEdited;\n    }\n\n    /**\n     * put the target into x (the vel that was interacted with)\n     * note that for bg elements this is ambiguous, but we follow\n     * the behavior of the original product.\n     */\n    protected getTargetFullString(adjective: PropAdjective): string {\n        /* get a longer form of the id unless specifically said \"short\" */\n        let frame = this.vci.findExecFrameStack()[1];\n        let target = this.vci.getModel().findByIdUntyped(frame?.message?.targetId);\n        let compat = this.Model().stack.getB('compatibilitymode');\n        checkThrow(target, 'UF|the target was not found');\n\n        if (compat) {\n            return new VelRenderName(this.vci.getModel()).go(target, adjective);\n        } else {\n            /* we want as much info as possible, because although\n                we return a string, it will likely be parsed back into an object */\n            if (adjective !== PropAdjective.Short) {\n                adjective = PropAdjective.LongForParse;\n            }\n\n            return new VelRenderId(this.vci.getModel()).go(target, adjective, compat);\n        }\n    }\n\n    /**\n     * put the owner of cd btn 1 into x, it returns a string, that can then be used as an object\n     */\n    protected getOwnerFullString(vel: O<VpcElBase>, adjective: PropAdjective) {\n        checkThrow(vel, 'UE|the object was not found');\n        if (vel.getType() === VpcElType.Stack || vel.getType() === VpcElType.Product) {\n            checkThrow(false, 'UD|Cannot get owner of this type of object.');\n        }\n\n        let owner = this.vci.getModel().getByIdUntyped(vel.parentIdInternal);\n        if (vel.getType() === VpcElType.Card && this.Model().stack.getB('compatibilitymode')) {\n            /* compat with original product */\n            return new VelRenderName(this.vci.getModel()).go(owner, adjective);\n        } else if (vel.ui512GettableHas('is_bg_velement_id') && vel.getS('is_bg_velement_id').length) {\n            /* it's a bg object, indicate this by returning in the form \"cd x of bg y\".\n            the parent of a bg object is still the card, though. */\n            let card = this.vci.getModel().getCardById(vel.parentIdInternal);\n            let bg = this.vci.getModel().getById(VpcElBg, card.parentIdInternal);\n            adjective = PropAdjective.LongForParse; /* don't use \"short\" */\n            return (\n                new VelRenderId(this.vci.getModel()).go(card, adjective, this.Model().stack.getB('compatibilitymode')) +\n                ' of ' +\n                new VelRenderId(this.vci.getModel()).go(bg, adjective, this.Model().stack.getB('compatibilitymode'))\n            );\n        } else {\n            /* we want as much info as possible, because although\n            we return a string, it will likely be parsed back into an object */\n            if (adjective !== PropAdjective.Short) {\n                adjective = PropAdjective.LongForParse;\n            }\n\n            return new VelRenderId(this.vci.getModel()).go(owner, adjective, this.Model().stack.getB('compatibilitymode'));\n        }\n    }\n\n    /**\n     * get the current code execution frame\n     */\n    protected getExecFrameStack(): [VpcExecFrameStack, VpcExecFrame] {\n        let [frStack, frame] = this.vci.findExecFrameStack();\n        if (frStack && frame) {\n            return [frStack, frame];\n        } else {\n            assertTrue(false, '6h|could not find execution frame');\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcState.ts",
    "content": "\n/* auto */ import { UndoManager } from './vpcUndo';\n/* auto */ import { VpcExecTop } from './../../vpc/codeexec/vpcScriptExecTop';\n/* auto */ import { VpcOutsideImpl } from './vpcOutsideImpl';\n/* auto */ import { VpcStateInterface } from './vpcInterface';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { SetToInvalidObjectAtEndOfExecution } from './../../ui512/utils/util512Higher';\n/* auto */ import { ElementObserver, ElementObserverNoOp, UI512PublicSettable } from './../../ui512/elements/ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * holds all vipercard state\n */\nexport class VpcState {\n    /* (started by _VpcDocLoader_) */\n    model: VpcModelTop;\n\n    /* (started by _VpcDocLoader_) */\n    runtime: VpcRuntime;\n\n    /* (started by _VpcDocLoader_) */\n    undoManager: UndoManager;\n\n    /* (started in _VpcPresenter_ constructor) */\n    vci: VpcStateInterface;\n}\n\n/**\n * VpcRuntimeOpts contains transient options that don't need to be undoable\n * nothing here is persisted as part of the stack\n */\nexport class VpcRuntimeOpts extends UI512PublicSettable {\n    protected _mimicCurrentTool = VpcTool.Browse;\n    protected _screenLocked = false;\n    protected _copiedVelId = '';\n    protected _lastSavedStateId = '';\n    constructor() {\n        super('(VpcRuntimeOpts)');\n    }\n\n    /**\n     * an option with getOptionS('foo') might either be on model.productOpts (so it's undoable)\n     * or put here under VpcRuntimeOpts (so it's not undoable)\n     * if it should be persisted, make it a stack property\n     * is this a VpcRuntimeOpts option?\n     */\n    isARuntimeOpt: { [key: string]: boolean } = {\n        mimicCurrentTool: true,\n        screenLocked: true,\n        copiedVelId: true,\n        lastSavedStateId: true\n    };\n\n    /**\n     * set everything to undefined, to release ownership,\n     * and cause any callers to throw exceptions if attempting to access\n     */\n    destroy() {\n        this.observer = SetToInvalidObjectAtEndOfExecution(this.observer);\n    }\n}\n\n/**\n * holds runtime state, not persisted\n */\nexport class VpcRuntime {\n    /* set by _VpcDocLoader_, _VpcPresenter_::init */\n    codeExec: VpcExecTop;\n    outside: VpcOutsideImpl;\n    useThisObserverForVpcEls: ElementObserver = new ElementObserverNoOp();\n    opts = new VpcRuntimeOpts();\n\n    /**\n     * set everything to undefined, to release ownership,\n     * and cause any callers to throw exceptions if attempting to access\n     */\n    destroy() {\n        this.opts.destroy();\n        this.opts = SetToInvalidObjectAtEndOfExecution(this.opts);\n        this.codeExec = SetToInvalidObjectAtEndOfExecution(this.codeExec);\n        this.useThisObserverForVpcEls = SetToInvalidObjectAtEndOfExecution(this.useThisObserverForVpcEls);\n        this.outside = SetToInvalidObjectAtEndOfExecution(this.outside);\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcStateSerialize.ts",
    "content": "\n/* auto */ import { VpcStateInterface } from './vpcInterface';\n/* auto */ import { VpcElType, checkThrow, checkThrowEq } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { SerializedVelStructure, SerializedVpcDocStructure, VpcGettableSerialization } from './../../vpc/vel/velSerialization';\n/* auto */ import { VpcElBase, VpcHandleLinkedVels } from './../../vpc/vel/velBase';\n/* auto */ import { O, UI512Compress, vpcVersion } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn, ensureDefined } from './../../ui512/utils/util512Assert';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * from a stack to a plain JSON object, and vice-versa\n */\nexport const VpcStateSerialize = /* static class */ {\n    latestMajor: 3,\n    latestMinor: 0,\n    /**\n     * serialize an entire project, to a plain JSON object\n     *\n     * fileformatmajor 1, not released to public\n     * fileformatmajor 2, initial March release\n     * fileformatmajor 3, supports base64\n     *\n     * a change in major number means that a previous version\n     * won't be able to open the document\n     */\n    serializeAll(vci: VpcStateInterface) {\n        let ret = new SerializedVpcDocStructure();\n        ret.product = 'vpc';\n        ret.fileformatmajor = this.latestMajor;\n        ret.fileformatminor = this.latestMinor;\n        ret.buildnumber = vpcVersion;\n        ret.uuid = vci.getModel().uuid;\n        ret.elements = [];\n        let stack = vci.getModel().stack;\n        let i = 0;\n        for (let vel of stack.iterEntireStack()) {\n            let serialized = this.serializeVel(vel, i);\n            ret.elements.push(serialized);\n            i += 1;\n        }\n\n        return ret;\n    },\n\n    /**\n     * serialize a vel\n     */\n    serializeVel(vel: VpcElBase, i: number): SerializedVelStructure {\n        let ret = new SerializedVelStructure();\n        ret.type = vel.getType();\n        ret.id = vel.idInternal;\n        ret.parent_id = vel.parentIdInternal;\n        ret.insertIndex = i;\n\n        ret.attrs = VpcGettableSerialization.serializeGettable(vel);\n\n        /* remove unnecessary noise */\n        delete ret['__isUtil512Serializable'];\n        return ret;\n    },\n\n    /**\n     * deserialize an entire project, from a plain JSON object\n     */\n    deserializeAll(building: VpcStateInterface, incoming: SerializedVpcDocStructure) {\n        building.doWithoutAbilityToUndo(() => {\n            checkThrowEq('vpc', incoming.product, 'K |');\n            checkThrow(incoming.fileformatmajor <= this.latestMajor, 'Kz|file comes from a future version, cannot open');\n            console.log(\n                `opening a document format ${incoming.fileformatmajor}.\n                ${incoming.fileformatminor}, my version is\n                ${this.latestMajor}.${this.latestMinor}`\n            );\n\n            building.getModel().uuid = incoming.uuid;\n            checkThrow(incoming.elements && incoming.elements.length > 0, 'Ky|elements missing or empty');\n            let savedCardOrder = '';\n            for (let i = 0; i < incoming.elements.length; i++) {\n                let vel = this.deserializeVel(building, incoming.elements[i], building.getModel());\n                if (vel && vel.getType() === VpcElType.Stack) {\n                    savedCardOrder = vel.getS('cardorder');\n                }\n            }\n\n            /* we need to save and restore card order, or opening a stack will double it */\n            if (savedCardOrder) {\n                building.getModel().stack.setOnVel('cardorder', savedCardOrder, building.getModel());\n            }\n        });\n    },\n\n    /**\n     * deserialize a vel, from a plain JSON object\n     */\n    deserializeVel(vci: VpcStateInterface, incoming: SerializedVelStructure, h: VpcHandleLinkedVels) {\n        if (incoming.type === VpcElType.Stack) {\n            /* the parent of a stack is always the product opts */\n            incoming.parent_id = vci.getModel().productOpts.idInternal;\n            /* don't create a new element, just copy over the attrs */\n            VpcGettableSerialization.deserializeSettable(vci.getModel().stack, incoming.attrs, h);\n            return vci.getModel().stack;\n        } else if (\n            incoming.type === VpcElType.Bg ||\n            incoming.type === VpcElType.Card ||\n            incoming.type === VpcElType.Btn ||\n            incoming.type === VpcElType.Fld\n        ) {\n            /* the parent of a bg is always the stack */\n            if (incoming.type === VpcElType.Bg) {\n                incoming.parent_id = vci.getModel().stack.idInternal;\n            }\n\n            let creator = vci.getCodeExec().directiveImpl;\n            let newVel = creator.rawCreateOneVelUseCarefully(incoming.parent_id, incoming.type, -1, incoming.id);\n            VpcGettableSerialization.deserializeSettable(newVel, incoming.attrs, h);\n            return newVel;\n        } else {\n            assertWarn(false, 'Kx|unsupported type', incoming.type);\n            return undefined;\n        }\n    },\n\n    /**\n     * serialize to a string and compress\n     */\n    serializeVelCompressed(building: VpcStateInterface, vel: VpcElBase, insertIndex: number): string {\n        let s = '';\n        building.doWithoutAbilityToUndoExpectingNoChanges(() => {\n            let obj = this.serializeVel(vel, insertIndex);\n            s = JSON.stringify(obj);\n        });\n\n        return UI512Compress.compressString(s);\n    },\n\n    /**\n     * deserialize from serializeVelCompressed\n     */\n    deserializeVelCompressed(vci: VpcStateInterface, s: string, h: VpcHandleLinkedVels): VpcElBase {\n        let created: O<VpcElBase>;\n        vci.doWithoutAbilityToUndo(() => {\n            s = UI512Compress.decompressString(s);\n            let incoming = JSON.parse(s);\n            assertTrue(\n                incoming.type === VpcElType.Bg ||\n                    incoming.type === VpcElType.Card ||\n                    incoming.type === VpcElType.Btn ||\n                    incoming.type === VpcElType.Fld,\n                'Kw|unexpected type',\n                incoming.type\n            );\n\n            let creator = vci.getCodeExec().directiveImpl;\n            let newVel = creator.rawCreateOneVelUseCarefully(incoming.parent_id, incoming.type, -1, incoming.id);\n            VpcGettableSerialization.deserializeSettable(newVel, incoming.attrs, h);\n        });\n\n        return ensureDefined(created, 'Kv|');\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/state/vpcUndo.ts",
    "content": "\n/* auto */ import { VpcStateSerialize } from './vpcStateSerialize';\n/* auto */ import { TypeOfUndoAction, UndoableActionPlaceholder, VpcStateInterface } from './vpcInterface';\n/* auto */ import { VpcElType, checkThrow, checkThrowEq, checkThrowInternal } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UndoableActionCreateOrDelVel } from './vpcCreateOrDelVel';\n/* auto */ import { VpcModelTop } from './../../vpc/vel/velModelTop';\n/* auto */ import { VpcElCard } from './../../vpc/vel/velCard';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { O, UI512Compress } from './../../ui512/utils/util512Base';\n/* auto */ import { assertTrue, assertWarn } from './../../ui512/utils/util512Assert';\n/* auto */ import { arLast } from './../../ui512/utils/util512';\n/* auto */ import { ChangeContext } from './../../ui512/draw/ui512Interfaces';\n/* auto */ import { FormattedText } from './../../ui512/drawtext/ui512FormattedText';\n/* auto */ import { ElementObserver, ElementObserverVal } from './../../ui512/elements/ui512ElementGettable';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * we put undoable options into _ProductOpts_, and non-undoable options into _VpcRuntimeOpts_\n *\n * trade-off between how much state is recorded for undo --\n * for example, when you choose a different tool, should this be undoable?\n *\n * 1) if many options are undoable:\n *      you have to be very careful after hitting Undo() a few times,\n *      because if you accidentally change the state, you'll lose the ability to Redo()\n *\n * 2) if few options are undoable:\n *      then it would resolve this, it would but safer to hit Undo() a few times\n *      and, we could 'associate' commonly-used state even if it couldn't be\n *      directly undone. for example, the current tool could be attached to the\n *      undo state, so you could see the context when Undo()ing through history\n *\n * we've decided to use approach 1) and make most options undoable.\n * testing using with both approaches, approach 2 was frustrating because\n * you could not see the context of what you were changing (which object was selected,\n * or which script you were editing, etc.)\n * you might need to hit undo() a few more times than you thought, but there is clarity.\n * if you need to go back between different versions, Save As can be used as a workaround\n */\n\n/**\n * interface for undoable actions\n *\n * this is essentially the Command Pattern\n */\nexport interface UndoableAction {\n    do(vci: VpcStateInterface): void;\n    undo(vci: VpcStateInterface): void;\n}\n\n/**\n * an action creating a vel, thin wrapper around UndoableActionCreateOrDelVel\n */\nexport class UndoableActionCreateVel extends UndoableActionCreateOrDelVel implements UndoableAction, UndoableActionPlaceholder {\n    constructor(id: string, parentId: string, type: VpcElType, isBg: boolean, insertIndex = -1 /* default to add-to-end */) {\n        super(id, parentId, type, isBg, insertIndex);\n    }\n\n    /**\n     * create the vel\n     */\n    do(vci: VpcStateInterface) {\n        this.create(vci);\n    }\n\n    /**\n     * un-create the vel\n     */\n    undo(vci: VpcStateInterface) {\n        this.remove(vci);\n    }\n}\n\n/**\n * an action removing a vel\n * stores the removed vel in a string\n */\nexport class UndoableActionDeleteVel extends UndoableActionCreateOrDelVel implements UndoableAction {\n    storedVelData = '';\n    constructor(vel: VpcElBase, vci: VpcStateInterface) {\n        super(vel.idInternal, vel.parentIdInternal, vel.getType(), false, -1);\n        this.isBg = vel.ui512GettableHas('is_bg_velement_id') && vel.getS('is_bg_velement_id').length > 0;\n        UndoableActionDeleteVel.checkIfCanDelete(vel, vci);\n        this.insertIndex = this.determineIndexInAr(vel, vci);\n        this.storedVelData = VpcStateSerialize.serializeVelCompressed(vci, vel, this.insertIndex);\n    }\n\n    /**\n     * can this vel be deleted?\n     */\n    static checkIfCanDelete(vel: VpcElBase, vci: VpcStateInterface) {\n        let currentCard = vci.getModel().getByIdUntyped(vci.getModel().productOpts.getS('currentCardId'));\n        assertTrue(vci.getModel().findByIdUntyped(vel.idInternal), \"6Z|deleting element that doesn't exist?\", vel.idInternal);\n        if (vel.getType() === VpcElType.Stack || vel.getType() === VpcElType.Product || vel.getType() === VpcElType.Unknown) {\n            checkThrow(false, '6Y|Cannot delete this type of element');\n        } else if (vel instanceof VpcElCard) {\n            checkThrow(vci.getModel().stack.getCardOrder().length > 1, 'UN|Cannot delete the only card of a stack');\n        } else if (vel.idInternal === currentCard.idInternal) {\n            checkThrow(false, '6X|Cannot delete the current card');\n        } else if (vel.idInternal === currentCard.parentIdInternal) {\n            checkThrow(false, '6W|Cannot delete the current background');\n        }\n\n        let childCount = 0;\n        let arrs = VpcModelTop.getChildArrays(vel);\n        for (let i = 0, len = arrs.length; i < len; i++) {\n            /* I used to automatically delete the children here in this loop,\n            but it is better overall to enforce that all children\n            must be separately deleted before deleting a parent,\n            since it is easier to implement undo */\n            childCount += arrs[i].length;\n        }\n\n        checkThrowEq(0, childCount, `K(|you must delete all children before deleting this object`);\n    }\n\n    /**\n     * remove the vel\n     */\n    do(vci: VpcStateInterface) {\n        this.remove(vci);\n    }\n\n    /**\n     * revive and re-add the vel\n     */\n    undo(vci: VpcStateInterface) {\n        checkThrow(!vci.getCodeExec().isCodeRunning(), \"8$|currently can't do this while code is running\");\n\n        let vel = VpcStateSerialize.deserializeVelCompressed(vci, this.storedVelData, vci.getModel());\n        vci.rawRevive(vel);\n    }\n}\n\n/**\n * records all alterations made to vel properties\n */\nclass UndoableActionModifyVelement implements UndoableAction {\n    velId: string;\n    propName: string;\n    prevVal: ElementObserverVal;\n    newVal: ElementObserverVal;\n    constructor(velId: string, propName: string, prevVal: ElementObserverVal, newVal: ElementObserverVal) {\n        if (typeof prevVal === 'string' && propName !== 'paint') {\n            if (typeof newVal === 'string') {\n                prevVal = '$' + UI512Compress.compressString(prevVal.toString());\n                newVal = '$' + UI512Compress.compressString(newVal.toString());\n            } else {\n                checkThrowInternal(false, 'K&|both must be strings ' + propName + ' ' + velId);\n            }\n        } else if (prevVal instanceof FormattedText) {\n            if (newVal instanceof FormattedText) {\n                prevVal.lock();\n                newVal.lock();\n                prevVal = '@' + UI512Compress.compressString(prevVal.toSerialized());\n                newVal = '@' + UI512Compress.compressString(newVal.toSerialized());\n            } else {\n                checkThrowInternal(false, 'K%|both must be FormattedText ' + propName + ' ' + velId);\n            }\n        }\n\n        this.velId = velId;\n        this.propName = propName;\n        this.prevVal = prevVal;\n        this.newVal = newVal;\n    }\n\n    /**\n     * set the vel property from prevVal to newVal\n     */\n    do(vci: VpcStateInterface) {\n        let el = vci.getModel().getByIdUntyped(this.velId);\n        let newVal = this.newVal;\n        if (typeof newVal === 'string' && newVal.startsWith('$')) {\n            newVal = UI512Compress.decompressString(newVal.substr(1));\n        } else if (typeof newVal === 'string' && newVal.startsWith('@')) {\n            let newValPs = UI512Compress.decompressString(newVal.substr(1));\n            newVal = FormattedText.newFromSerialized(newValPs);\n        }\n\n        if (this.propName === 'currentTool' && typeof newVal === 'number') {\n            vci.setTool(newVal);\n        } else {\n            /* might cause more replication than needed, but that's ok */\n            el.setOnVel(this.propName, newVal, vci.getModel());\n        }\n    }\n\n    /**\n     * set the vel property back to prevVal\n     */\n    undo(vci: VpcStateInterface) {\n        let el = vci.getModel().getByIdUntyped(this.velId);\n        let prevVal = this.prevVal;\n        if (typeof prevVal === 'string' && prevVal.startsWith('$')) {\n            prevVal = UI512Compress.decompressString(prevVal.substr(1));\n        } else if (typeof prevVal === 'string' && prevVal.startsWith('@')) {\n            let prevValPs = UI512Compress.decompressString(prevVal.substr(1));\n            prevVal = FormattedText.newFromSerialized(prevValPs);\n        }\n\n        if (this.propName === 'currentTool' && typeof prevVal === 'number') {\n            vci.setTool(prevVal);\n        } else {\n            /* might cause more replication than needed, but that's ok */\n            el.setOnVel(this.propName, prevVal, vci.getModel());\n        }\n    }\n}\n\n/**\n * a set of undoable changes,\n * when the user hits \"Undo\" all changes in this set will be undone at once\n */\nclass UndoableChangeSet {\n    stateId: string;\n    protected list: UndoableAction[] = [];\n    constructor(public readonly type: TypeOfUndoAction) {\n        this.stateId = 'stateId' + Math.random();\n    }\n\n    /**\n     * add an action to the list\n     */\n    notifyAction(action: UndoableAction) {\n        this.list.push(action);\n    }\n\n    /**\n     * record an action and add it to the list\n     */\n    notifyPropChange(velId: string, propName: string, prevVal: ElementObserverVal, newVal: ElementObserverVal) {\n        /* ignore selection and scroll changes. */\n        if (\n            propName === 'selcaret' ||\n            propName === 'selend' ||\n            propName === 'scroll' ||\n            propName.startsWith('increasingnumber') ||\n            propName === 'stacklineage'\n        ) {\n            return;\n        }\n\n        this.list.push(new UndoableActionModifyVelement(velId, propName, prevVal, newVal));\n    }\n\n    /**\n     * does the list have content\n     */\n    hasContent() {\n        return this.list.length > 0;\n    }\n\n    /**\n     * do() every action in the list, user has said to \"Redo\"\n     */\n    do(vci: VpcStateInterface) {\n        for (let i = 0; i < this.list.length; i++) {\n            this.list[i].do(vci);\n        }\n    }\n\n    /**\n     * undo() every action in the list, user has said to \"Undo\"\n     */\n    undo(vci: VpcStateInterface) {\n        for (let i = this.list.length - 1; i >= 0; i--) {\n            this.list[i].undo(vci);\n        }\n    }\n\n    /**\n     * join with another list\n     */\n    combineWithChangelist(other: UndoableChangeSet) {\n        this.stateId += other.stateId;\n        this.list = this.list.concat(other.list);\n    }\n}\n\n/**\n * manage undo state\n * can also detect when a stack has unsaved changes\n */\nexport class UndoManager implements ElementObserver {\n    protected history: UndoableChangeSet[] = [];\n    protected activeChangeSet: O<UndoableChangeSet>;\n    protected pos = -1;\n    protected doWithoutAbilityToUndoActive = false;\n    protected expectNoChanges = false;\n    constructor(protected cbGetCurrentCard: () => string) {}\n\n    /**\n     * don't record changes made for undo\n     */\n    doWithoutAbilityToUndo(fn: () => void) {\n        try {\n            this.doWithoutAbilityToUndoActive = true;\n            fn();\n        } finally {\n            this.doWithoutAbilityToUndoActive = false;\n        }\n    }\n\n    /**\n     * don't record changes made for undo, and assert that no changes were made\n     */\n    doWithoutAbilityToUndoExpectingNoChanges(fn: () => void) {\n        try {\n            this.doWithoutAbilityToUndoActive = true;\n            this.expectNoChanges = true;\n            fn();\n        } finally {\n            this.doWithoutAbilityToUndoActive = false;\n            this.expectNoChanges = false;\n        }\n    }\n\n    /**\n     * record changes made for undo\n     */\n    undoableAction(fn: () => void, type = TypeOfUndoAction.StartNewAction) {\n        /* note: use needToAddToList,\n        be aware of re-entrancy into this method */\n        assertWarn(!this.expectNoChanges, 'K$|expected no changes');\n        let needToAddToList = false;\n        if (!this.activeChangeSet) {\n            this.activeChangeSet = new UndoableChangeSet(type);\n            needToAddToList = true;\n        }\n\n        try {\n            fn();\n        } finally {\n            if (needToAddToList) {\n                this.pushUndoableChanges(this.activeChangeSet);\n                this.activeChangeSet = undefined;\n            }\n        }\n    }\n\n    /**\n     * are we 'back in time' looking at a previous state?\n     */\n    isCurrentlyUndoing() {\n        return this.pos !== this.history.length - 1;\n    }\n\n    /**\n     * record changes\n     */\n    protected pushUndoableChanges(list: UndoableChangeSet) {\n        assertWarn(!this.expectNoChanges, 'K#|expected no changes');\n        if (this.doWithoutAbilityToUndoActive) {\n            /* we've been told not to record any changes */\n            return;\n        }\n\n        if (!list.hasContent()) {\n            /* do nothing if no undoable events were recorded.\n            important because if user has been running undo()\n            we would lose their ability to redo() */\n            return;\n        }\n\n        if (this.history.length <= 0) {\n            /* adding first entry to list */\n            this.history.push(list);\n            this.pos = this.history.length - 1;\n        } else if (this.pos === this.history.length - 1) {\n            if (\n                list.type === TypeOfUndoAction.StartReusableAction &&\n                this.history[this.pos].type === TypeOfUndoAction.StartReusableAction\n            ) {\n                /* if latest action is also StartReusableAction, glue it together\n\n                it seems more intuitive if all modifications cause by a script are\n                wrapped together into one undoable block, even though the script\n                is run in separate timeslices. without this coalescing of undo events,\n                user would have to hit Undo multiple times for no apparent reason */\n                this.history[this.pos].combineWithChangelist(list);\n            } else {\n                this.history.push(list);\n                this.pos = this.history.length - 1;\n            }\n        } else {\n            /* user changed some state when they had gone back in time with Undo() */\n            /* kill everything after this point! */\n            this.history.splice(this.pos + 1, this.history.length, list);\n            this.pos = this.history.length - 1;\n        }\n    }\n\n    /**\n     * perform undo\n     */\n    performUndo(vci: VpcStateInterface) {\n        if (vci.getCodeExec().isCodeRunning()) {\n            return false;\n        }\n\n        assertTrue(!this.doWithoutAbilityToUndoActive, \"6S|can't call this during doWithoutAbilityToUndoActive\");\n        assertTrue(!this.activeChangeSet, \"6R|can't call this during undoable action\");\n        if (this.pos < 0) {\n            /* you've hit undo() so many times you're at the beginning */\n            return false;\n        } else {\n            /* apply the undo */\n            let cmd = this.history[this.pos];\n            vci.doWithoutAbilityToUndo(() => cmd.undo(vci));\n            this.pos--;\n            return true;\n        }\n    }\n\n    /**\n     * perform redo\n     */\n    performRedo(vci: VpcStateInterface) {\n        if (vci.getCodeExec().isCodeRunning()) {\n            return false;\n        }\n\n        assertTrue(!this.doWithoutAbilityToUndoActive, \"6Q|can't call this during doWithoutAbilityToUndoActive\");\n        assertTrue(!this.activeChangeSet, \"6P|can't call this during undoable action\");\n        if (this.pos >= this.history.length - 1) {\n            /* you can't redo() if you are already at the most recent state */\n            return false;\n        } else {\n            /* apply the redo */\n            let cmd = this.history[this.pos + 1];\n            vci.doWithoutAbilityToUndo(() => cmd.do(vci));\n            this.pos++;\n            return true;\n        }\n    }\n\n    /**\n     * respond to an incoming change of state\n     */\n    changeSeen(context: ChangeContext, elId: string, propName: string, prevVal: ElementObserverVal, newVal: ElementObserverVal) {\n        assertWarn(!this.expectNoChanges, 'K!|expected no changes');\n        if (this.doWithoutAbilityToUndoActive) {\n            return;\n        } else if (\n            propName === 'selcaret' ||\n            propName === 'selend' ||\n            propName === 'scroll' ||\n            propName.startsWith('increasingnumber') ||\n            propName === 'stacklineage'\n        ) {\n            return;\n        }\n\n        if (this.activeChangeSet) {\n            this.activeChangeSet.notifyPropChange(elId, propName, prevVal, newVal);\n        } else {\n            assertWarn(false, '6O|must be done inside an undoable block ' + elId + ' ' + propName, prevVal, newVal);\n        }\n    }\n\n    /**\n     * respond to an incoming change of state, a new or deleted vel\n     */\n    changeSeenCreationDeletion(action: UndoableAction) {\n        if (this.doWithoutAbilityToUndoActive) {\n            return;\n        }\n\n        if (action instanceof UndoableActionCreateOrDelVel) {\n            if (this.activeChangeSet) {\n                this.activeChangeSet.notifyAction(action);\n            } else {\n                assertWarn(false, '6N|must be done inside an undoable block', action.velId, action.type);\n            }\n        } else {\n            throw new Error('not a known type of UndoableAction');\n        }\n    }\n\n    /**\n     * get state id, can be used to see if project has unsaved changes\n     */\n    getCurrentStateId() {\n        if (this.history.length === 0) {\n            return '(justOpened)';\n        } else if (this.pos !== this.history.length - 1) {\n            /* if you're in the middle of undoing, */\n            /* this is a transient state */\n            return 'viewingHistory' + Math.random().toString();\n        } else {\n            return arLast(this.history).stateId;\n        }\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolBase.ts",
    "content": "\n/* auto */ import { VpcPaintRender } from './../modelrender/vpcPaintRender';\n/* auto */ import { VpcModelRender } from './../modelrender/vpcModelRender';\n/* auto */ import { VpcStateInterface } from './../state/vpcInterface';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { fitIntoInclusive } from './../../ui512/utils/util512';\n/* auto */ import { EventDetails, MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * base class for VPC tools\n */\nexport abstract class VpcAppUIToolBase {\n    vci: VpcStateInterface;\n    cbModelRender: () => VpcModelRender;\n    cbPaintRender: () => VpcPaintRender;\n    cbScheduleScriptEventSend: (d: EventDetails) => void;\n\n    constructor(protected bounds: number[], protected userBounds: number[]) {}\n    abstract respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void;\n    abstract cancelCurrentToolAction(): void;\n    abstract whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors;\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean): void {}\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {}\n    onOpenTool() {}\n    onLeaveTool() {}\n    onDeleteSelection() {}\n\n    protected getTranslatedCoords(mouseX: number, mouseY: number) {\n        /* get coordinates relative to user area */\n        let tmouseX =\n            fitIntoInclusive(mouseX, this.vci.userBounds()[0], this.vci.userBounds()[0] + this.vci.userBounds()[2] - 1) -\n            this.vci.userBounds()[0];\n\n        let tmouseY =\n            fitIntoInclusive(mouseY, this.vci.userBounds()[1], this.vci.userBounds()[1] + this.vci.userBounds()[3] - 1) -\n            this.vci.userBounds()[1];\n\n        return [tmouseX, tmouseY];\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolBrowse.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool, checkThrowNotifyMsg } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * browse tool\n */\nexport class VpcAppUIToolBrowse extends VpcAppUIToolBase {\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        if (isVelOrBaseLayer) {\n            this.cbScheduleScriptEventSend(d);\n        }\n    }\n\n    /**\n     * respond to mouse up event\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        if (isVelOrBaseLayer) {\n            this.cbScheduleScriptEventSend(d);\n        }\n    }\n\n    /**\n     * respond to mouse move event\n     * mouseWithin events are scheduled by onIdle, not here.\n     */\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean): void {}\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {}\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        if (el && el.typename === 'UI512ElTextField' && el.getB('canselecttext')) {\n            /* change the cursor if you can edit text in a field */\n            return UI512Cursors.lbeam;\n        } else {\n            /* otherwise, use the default hand cursor */\n            return UI512Cursors.hand;\n        }\n    }\n\n    /**\n     * respond to backspace and edit->clear\n     */\n    onDeleteSelection() {\n        checkThrowNotifyMsg(false, 'UO|Please press Backspace on the keyboard to \\ndelete text.');\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolBucket.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MouseDownEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * a bucket (aka floodfill) tool\n */\nexport class VpcAppUIToolBucket extends VpcAppUIToolBase {\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer) {\n            return;\n        }\n\n        let [tx, ty] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n        this.cbPaintRender().commitPaintBucket(tx, ty);\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {}\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        return UI512Cursors.paintbucket;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolCurve.ts",
    "content": "\n/* auto */ import { ShapeToolState, VpcAppUIToolShape } from './vpcToolShape';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * the curve tool.\n * in original product, acted like the pencil tool but if in a filled mode,\n * it would fill the interior.\n * for us we draw a bezier.\n */\nexport class VpcAppUIToolCurve extends VpcAppUIToolShape {\n    /**\n     * draw one bezier curve\n     */\n    protected drawPartial(cv: CanvasWrapper, st: ShapeToolState, tl: VpcTool, x: number, y: number) {\n        /* for now, have a simplified curve tool that can only start with horizontal lines. */\n        /* used to have a full two-stage tool, but people were confused by the interface. */\n        let startX = Math.round(cv.canvas.width / 3);\n        let endx = Math.round((2 * cv.canvas.width) / 3);\n        this.cbPaintRender().drawPartialShape(\n            [startX, x, endx],\n            [Math.round(cv.canvas.height / 2), y, Math.round(cv.canvas.height / 2)],\n            st.elStage,\n            st.paStage\n        );\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolEdit.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcAppLyrPanels } from './../panels/vpcLyrPanels';\n/* auto */ import { VpcElType, VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { VpcElBase } from './../../vpc/vel/velBase';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { ValHolder } from './../../ui512/utils/util512';\n/* auto */ import { MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * implementation for the button tool and field tool\n */\nexport class VpcAppUIToolEdit extends VpcAppUIToolBase {\n    dragStatus: O<EditToolDragState>;\n    lyrPanels: VpcAppLyrPanels;\n\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        this.lyrPanels.respondMouseDown(d);\n        if (d.el && d.el.id === 'VpcModelRender$$baselayer') {\n            /* click on the screen but on no item: deselect all */\n            this.vci.setOption('selectedVelId', '');\n        } else if (d.el && d.el.id.startsWith('VpcModelRender$$')) {\n            /* click on an item to select it */\n            let velId = this.cbModelRender().elIdToVelId(d.el.id) ?? '';\n            if (velId.length && d.el.typename === 'UI512ElTextField') {\n                this.vci.setTool(VpcTool.Field);\n                this.vci.setOption('selectedVelId', velId);\n            } else if (velId.length && d.el.typename === 'UI512ElementButtonBase') {\n                this.vci.setTool(VpcTool.Button);\n                this.vci.setOption('selectedVelId', velId);\n            } else {\n                this.vci.setOption('selectedVelId', '');\n            }\n        } else {\n            /* drag a handle to resize a vel */\n            let handle = this.lyrPanels.handles.whichHandle(d.el ? d.el.id : '');\n            if (handle !== undefined && !this.dragStatus) {\n                let vel = this.lyrPanels.selectedVel('selectedVelId');\n                if (vel && (vel.getType() === VpcElType.Btn || vel.getType() === VpcElType.Fld)) {\n                    let targetEl = this.vci.UI512App().findEl('VpcModelRender$$' + vel.idInternal);\n                    if (targetEl) {\n                        /* distance from initial click to center of handle */\n                        let distanceFromHandleCenterX =\n                            d.mouseX -\n                            this.lyrPanels.handles.sizeHandles[handle].getN('x') -\n                            this.lyrPanels.handles.sizeHandles[0].w / 2;\n\n                        let distanceFromHandleCenterY =\n                            d.mouseY -\n                            this.lyrPanels.handles.sizeHandles[handle].getN('y') -\n                            this.lyrPanels.handles.sizeHandles[0].h / 2;\n\n                        let distanceFromFirstHandleCenterX =\n                            d.mouseX -\n                            this.lyrPanels.handles.sizeHandles[0].getN('x') -\n                            this.lyrPanels.handles.sizeHandles[0].w / 2;\n\n                        let distanceFromFirstHandleCenterY =\n                            d.mouseY -\n                            this.lyrPanels.handles.sizeHandles[0].getN('y') -\n                            this.lyrPanels.handles.sizeHandles[0].h / 2;\n\n                        this.dragStatus = new EditToolDragState(\n                            vel,\n                            targetEl,\n                            handle,\n                            distanceFromHandleCenterX,\n                            distanceFromHandleCenterY,\n                            distanceFromFirstHandleCenterX,\n                            distanceFromFirstHandleCenterY\n                        );\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * respond to mouse move event\n     */\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean) {\n        const minVelW = 5;\n        const minVelH = 5;\n        if (this.dragStatus) {\n            if (this.dragStatus.draggingWhichHandle === 3) {\n                /* for the bottom right handle, set the size+width. */\n                let centerX = d.mouseX - this.dragStatus.distanceFromHandleCenterX;\n                let centerY = d.mouseY - this.dragStatus.distanceFromHandleCenterY;\n                let newW = Math.max(minVelW, centerX - this.dragStatus.el.x);\n                let newH = Math.max(minVelH, centerY - this.dragStatus.el.y);\n                this.dragStatus.el.setDimensions(this.dragStatus.el.x, this.dragStatus.el.y, newW, newH);\n            } else {\n                /* for the other handles, set the location */\n                let newX = d.mouseX - this.dragStatus.distanceFrom1stHandleCenterX;\n                let newY = d.mouseY - this.dragStatus.distanceFrom1stHandleCenterY;\n                this.dragStatus.el.setDimensions(newX, newY, this.dragStatus.el.w, this.dragStatus.el.h);\n            }\n\n            /* refresh ui */\n            this.lyrPanels.handles.updateUI512Els();\n        }\n    }\n\n    /**\n     * respond to mouse up event\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        this.lyrPanels.respondMouseUp(d);\n        if (this.dragStatus) {\n            /* cancel the resize if we're on a different card now or if selected vel was changed */\n            let validatedVel = this.lyrPanels.selectedVel('selectedVelId');\n            if (\n                validatedVel &&\n                validatedVel.idInternal === this.dragStatus.vel.idInternal &&\n                (validatedVel.getType() === VpcElType.Btn || validatedVel.getType() === VpcElType.Fld)\n            ) {\n                /* commit the change to the vel */\n                let vel = this.dragStatus.vel;\n                vel.setOnVel('x', this.dragStatus.el.x - this.vci.userBounds()[0], this.vci.getModel());\n                vel.setOnVel('y', this.dragStatus.el.y - this.vci.userBounds()[1], this.vci.getModel());\n                vel.setOnVel('w', this.dragStatus.el.w, this.vci.getModel());\n                vel.setOnVel('h', this.dragStatus.el.h, this.vci.getModel());\n            }\n\n            this.dragStatus = undefined;\n        }\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {\n        this.dragStatus = undefined;\n    }\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        return UI512Cursors.arrow;\n    }\n\n    /**\n     * reset state when opening tool\n     */\n    onOpenTool() {\n        this.cancelCurrentToolAction();\n    }\n\n    /**\n     * commit changes when leaving tool\n     */\n    onLeaveTool() {\n        this.cancelCurrentToolAction();\n        this.lyrPanels.editor.saveChangesToModel(this.vci.UI512App(), false);\n        if (this.lyrPanels.active) {\n            this.lyrPanels.active.saveChangesToModel(this.vci.UI512App(), false);\n        }\n    }\n\n    /**\n     * respond to backspace and edit->clear\n     * delete the selected vel\n     */\n    onDeleteSelection() {\n        let selected = this.lyrPanels.selectedFldOrBtn();\n        if (selected) {\n            this.vci.setOption('selectedVelId', '');\n            this.vci\n                .getCodeExec()\n                .directiveImpl.goRemovevelwithoutmsg(new ValHolder(selected.idInternal), this.vci.getModel().getCurrentCard(), [\n                    '',\n                    ''\n                ]);\n        }\n    }\n}\n\n/**\n * state of the edit tool\n */\nclass EditToolDragState {\n    constructor(\n        public vel: VpcElBase,\n        public el: UI512Element,\n        public draggingWhichHandle: number,\n        public distanceFromHandleCenterX: number,\n        public distanceFromHandleCenterY: number,\n        public distanceFrom1stHandleCenterX: number,\n        public distanceFrom1stHandleCenterY: number\n    ) {}\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolLasso.ts",
    "content": "\n/* auto */ import { SelectToolState, VpcAppUIToolSelectBase } from './vpcToolSelectBase';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { bool } from './../../ui512/utils/util512Base';\n/* auto */ import { cast, lastIfThere } from './../../ui512/utils/util512';\n/* auto */ import { clrBlack } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PaintDispatch, UI512PaintDispatchShapes } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * lasso tool, for free-form selection\n * see VpcAppUIToolSelectBase for more information\n */\nexport class VpcAppUIToolLasso extends VpcAppUIToolSelectBase {\n    /**\n     * draw the blinking border around the selection\n     */\n    protected selectingDrawTheBorder(\n        st: SelectToolState,\n        cv: CanvasWrapper,\n        painter: UI512Painter,\n        prevTX: number,\n        prevTY: number,\n        tx: number,\n        ty: number\n    ) {\n        if (this.st) {\n            let args = new UI512PaintDispatch(\n                UI512PaintDispatchShapes.SmearPencil,\n                [prevTX, tx],\n                [prevTY, ty],\n                clrBlack,\n                clrBlack,\n                false,\n                1\n            );\n\n            UI512PaintDispatch.go(args, painter);\n            if (prevTX !== lastIfThere(this.st.recordXpts) || prevTY !== lastIfThere(this.st.recordYpts)) {\n                this.st.recordXpts.push(prevTX);\n                this.st.recordYpts.push(prevTY);\n            }\n\n            this.st.recordXpts.push(tx);\n            this.st.recordYpts.push(ty);\n        }\n    }\n\n    /**\n     * draw the shape we want to select as a filled-in black shape\n     */\n    protected makeBlack() {\n        if (this.st) {\n            let cv = cast(CanvasWrapper, this.st.elStage.getCachedPainterForWrite().getBackingSurface());\n            cv.clear();\n\n            let args = new UI512PaintDispatch(\n                UI512PaintDispatchShapes.IrregularPolygon,\n                this.st.recordXpts,\n                this.st.recordYpts,\n                clrBlack,\n                clrBlack,\n                true\n            );\n\n            UI512PaintDispatch.go(args, this.st.elStage.getCachedPainterForWrite());\n        }\n    }\n\n    /**\n     * we'll cancel selection if the region is too small\n     */\n    protected checkTooSmall() {\n        const minSize = 2;\n        return bool(\n            this.st &&\n                (this.st.maxX - this.st.minX <= minSize || this.st.maxY - this.st.minY <= minSize) &&\n                this.st.recordXpts.length > minSize &&\n                this.st.recordYpts.length > minSize\n        );\n    }\n\n    protected mainCursor(): UI512Cursors {\n        return UI512Cursors.paintlasso;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolSelect.ts",
    "content": "\n/* auto */ import { SelectToolState, VpcAppUIToolSelectBase } from './vpcToolSelectBase';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { trueIfDefinedAndNotNull } from './../../ui512/utils/util512Base';\n/* auto */ import { clrBlack, clrWhite } from './../../ui512/draw/ui512DrawPatterns';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PaintDispatch, UI512PaintDispatchShapes } from './../../ui512/draw/ui512DrawPaintDispatch';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * rectangular selection\n * see ToolSelectBase for more information\n */\nexport class VpcAppUIToolSelect extends VpcAppUIToolSelectBase {\n    /**\n     * draw the blinking border around the selection\n     */\n    protected selectingDrawTheBorder(\n        st: SelectToolState,\n        cv: CanvasWrapper,\n        painter: UI512Painter,\n        prevTX: number,\n        prevTY: number,\n        tx: number,\n        ty: number\n    ) {\n        cv.clear();\n        let args = new UI512PaintDispatch(\n            UI512PaintDispatchShapes.ShapeRectangle,\n            [st.startX, tx],\n            [st.startY, ty],\n            clrBlack,\n            clrWhite,\n            false,\n            1\n        );\n\n        UI512PaintDispatch.go(args, painter);\n    }\n\n    /**\n     * draw the shape we want to select as a filled-in black shape\n     * currently uses a floodfill, should use a fillRect though...\n     */\n    protected makeBlack() {\n        if (this.st) {\n            /* make a floodfill. ideally we'd check inner and outer but this might be good enough */\n            /* fails for cases where the top of the shape is a sharp spike 1pixel wide */\n            let floodfillX = this.st.topPtX + 1;\n            let floodfillY = this.st.topPtY + 1;\n            let args = new UI512PaintDispatch(\n                UI512PaintDispatchShapes.Bucket,\n                [floodfillX],\n                [floodfillY],\n                clrBlack,\n                clrBlack,\n                true\n            );\n\n            UI512PaintDispatch.go(args, this.st.elStage.getCachedPainterForWrite());\n        }\n    }\n\n    /**\n     * we'll cancel selection if the region is too small\n     */\n    protected checkTooSmall() {\n        const minSize = 2;\n        return (\n            trueIfDefinedAndNotNull(this.st) && (this.st.maxX - this.st.minX <= minSize || this.st.maxY - this.st.minY <= minSize)\n        );\n    }\n\n    protected mainCursor(): UI512Cursors {\n        return UI512Cursors.paintrectsel;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolSelectBase.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool, checkThrow } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { ModifierKeys } from './../../ui512/utils/utilsKeypressHelpers';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { CanvasWrapper, RectUtils } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { largeArea } from './../../ui512/drawtext/ui512DrawTextClasses';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvCanvas } from './../../ui512/draw/ui512DrawPainter';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\nselect tool implementation\n\ncreate 3 canvaspiece elements:\n    \"elBorder\"\n    \"elStage\"\n    \"elMask\"\n    and \"elPlaceholderForCursor\" which is simply used to tell UI when to show the arrow cursor\n\nfirst, when the user clicks to drag with lasso tool,\n    draw pixels like the pencil tool, drawn to elStage\n    record all of the points where the cursor is moved.\n\nwhen user releases the mouse button,\n    follow conventional lasso tool behavior by connecting back to initial click point\n    find the smallest bounding rectangle containing all the points drawn (minX, maxX, etc)\n    make elPlaceholderForCursor the size of this small rectangle,\n    create \"elBorder\", make it the size of this small rectangle,\n    copy what was painted in elStage to elBorder\n    clear elStage\n    use the recorded points to draw the shape, but opaque and filled-in black, onto elStage\n    make elMask an opaque white of the shape - the \"hole\" that is left behind when you move\n    make elPiece a copy of elMask,\n    then make elPiece the cut-out piece of the card paint (using source-in trick)\n    clear elStage and draw elPiece onto elStage\n\n    now we can draw elMask to be the \"hole\" left behond and move around elStage.\n    to commit the change, simply draw elMask and then elStage onto the card paint.\n */\nexport abstract class VpcAppUIToolSelectBase extends VpcAppUIToolBase {\n    st: O<SelectToolState>;\n\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer && !(d.el && d.el.id.endsWith('UiSelectElPlaceholderForCursor'))) {\n            return;\n        }\n\n        let [tx, ty] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n        if (!this.st) {\n            /* first click with this tool */\n            this.cbPaintRender().deleteTempPaintEls();\n            let st = new SelectToolState();\n            st.elMask = this.cbPaintRender().makeAndAddFullsizeEl('UiSelectElMask');\n            st.elStage = this.cbPaintRender().makeAndAddFullsizeEl('UiSelectElStage');\n            st.elBorder = this.cbPaintRender().makeAndAddFullsizeEl('UiSelectElBorder');\n            st.elPlaceholderForCursor = this.cbPaintRender().makeAndAddFullsizeEl('UiSelectElPlaceholderForCursor');\n            st.elMask.transparentToClicks = true;\n            st.elStage.transparentToClicks = true;\n            st.elBorder.transparentToClicks = true;\n            st.elStage.setCanvas(this.cbPaintRender().getTemporaryCanvas(1));\n            st.elStage.setCachedPainter(\n                new UI512PainterCvCanvas(st.elStage.getCanvasForWrite(), st.elStage.getCvWidth(), st.elStage.getCvHeight())\n            );\n\n            st.rawStartX = d.mouseX;\n            st.rawStartY = d.mouseY;\n            st.startX = tx;\n            st.startY = ty;\n            st.recordXpts = [];\n            st.recordYpts = [];\n            st.mode = SelectToolMode.SelectingRegion;\n            this.st = st;\n\n            /* draw where the user clicked. needed to get the right minx and miny */\n            this.respondMouseMove(tl, new MouseMoveEventDetails(0, d.mouseX, d.mouseY, d.mouseX, d.mouseY), true);\n        } else if (this.st && this.st.mode === SelectToolMode.SelectedRegion) {\n            /* there's already a selection. */\n            if (\n                RectUtils.hasPoint(\n                    d.mouseX,\n                    d.mouseY,\n                    this.st.elBorder.x,\n                    this.st.elBorder.y,\n                    this.st.elBorder.w,\n                    this.st.elBorder.h\n                )\n            ) {\n                /* user clicked in the selection, start moving it */\n                this.st.offsetForMoveX = d.mouseX - this.st.elBorder.x;\n                this.st.offsetForMoveY = d.mouseY - this.st.elBorder.y;\n                this.st.elBorder.set('visible', false);\n                this.st.areCopyingMult = (d.mods & ModifierKeys.Opt) !== 0;\n                this.st.areCopying = this.st.areCopyingMult || /* bool */ (d.mods & ModifierKeys.Cmd) !== 0;\n                this.st.elMask.set('visible', !this.st.areCopying);\n                this.st.mode = SelectToolMode.MovingRegion;\n            } else {\n                /* user clicked outside of the selection, cancel the selection */\n                this.onLeaveTool();\n                this.onOpenTool();\n            }\n        }\n    }\n\n    /**\n     * respond to mouse move event\n     */\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean): void {\n        let [prevX, prevY] = this.getTranslatedCoords(d.prevMouseX, d.prevMouseY);\n        let [tnx, tny] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n\n        if (this.st && this.st.mode === SelectToolMode.SelectingRegion) {\n            if (!isVelOrBaseLayer && !(d.elNext && d.elNext.id.endsWith('UiSelectElPlaceholderForCursor'))) {\n                return;\n            }\n\n            /* user is dragging the mouse to select */\n            this.selectingDrawTheBorder(\n                this.st,\n                this.st.elStage.getCanvasForWrite(),\n                this.st.elStage.getCachedPainterForWrite(),\n                prevX,\n                prevY,\n                tnx,\n                tny\n            );\n\n            this.st.minX = Math.min(this.st.minX, tnx);\n            this.st.maxX = Math.max(this.st.maxX, tnx);\n            this.st.minY = Math.min(this.st.minY, tny);\n            this.st.maxY = Math.max(this.st.maxY, tny);\n            if (tny < this.st.topPtY) {\n                this.st.topPtX = tnx;\n                this.st.topPtY = tny;\n            }\n        } else if (this.st && this.st.mode === SelectToolMode.MovingRegion) {\n            if (!this.st.areCopyingMult) {\n                this.st.elStage.getCanvasForWrite().clear();\n            }\n\n            /* user is dragging the mouse to move selection */\n            let newX = tnx - this.st.rectx - this.st.offsetForMoveX;\n            let newY = tny - this.st.recty - this.st.offsetForMoveY;\n\n            this.st.elStage\n                .getCanvasForWrite()\n                .drawFromImage(\n                    this.st.cvPiece.canvas,\n                    0,\n                    0,\n                    this.st.cvPiece.canvas.width,\n                    this.st.cvPiece.canvas.height,\n                    newX,\n                    newY,\n                    0,\n                    0,\n                    this.st.elStage.getCvWidth(),\n                    this.st.elStage.getCvHeight()\n                );\n\n            this.st.elBorder.set('x', newX + this.st.rectx + this.vci.userBounds()[0]);\n            this.st.elBorder.set('y', newY + this.st.recty + this.vci.userBounds()[1]);\n            this.st.elPlaceholderForCursor.set('x', this.st.elBorder.x);\n            this.st.elPlaceholderForCursor.set('y', this.st.elBorder.y);\n        }\n    }\n\n    /**\n     * respond to mouse up event\n     *\n     * see comment at the top of the class for more info\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        if (this.st && this.st.mode === SelectToolMode.SelectingRegion) {\n            /* if lasso, close the loop */\n            if (tl === VpcTool.Lasso) {\n                this.respondMouseMove(\n                    tl,\n                    new MouseMoveEventDetails(0, d.mouseX, d.mouseY, this.st.rawStartX, this.st.rawStartY),\n                    true\n                );\n            }\n\n            if (this.checkTooSmall()) {\n                /* we don't yet support small selections. */\n                this.onLeaveTool();\n                this.onOpenTool();\n                return;\n            }\n\n            let rectx = this.st.minX;\n            let recty = this.st.minY;\n            let rectw = this.st.maxX - this.st.minX;\n            let recth = this.st.maxY - this.st.minY;\n\n            /* make mask. */\n            this.st.elMask.setCanvas(this.cbPaintRender().getTemporaryCanvas(2));\n\n            /* copy what we have sketched as the border to \"border\". */\n            this.st.elBorder.setDimensions(rectx + this.vci.userBounds()[0], recty + this.vci.userBounds()[1], rectw, recth);\n\n            this.st.elBorder.setCanvas(this.cbPaintRender().getTemporaryCanvas(3, rectw, recth));\n            this.st.elBorder\n                .getCanvasForWrite()\n                .drawFromImage(\n                    this.st.elStage.getCanvasForWrite().canvas,\n                    rectx,\n                    recty,\n                    rectw,\n                    recth,\n                    0,\n                    0,\n                    0,\n                    0,\n                    this.st.elBorder.getCvWidth(),\n                    this.st.elBorder.getCvHeight()\n                );\n\n            this.st.elPlaceholderForCursor.setDimensions(\n                this.st.elBorder.x,\n                this.st.elBorder.y,\n                this.st.elBorder.w,\n                this.st.elBorder.h\n            );\n\n            /* draw the shape, but opaque and filled-in black, onto elStage */\n            this.makeBlack();\n\n            /* make the mask an opaque white of the shape */\n            this.st.elMask\n                .getCanvasForWrite()\n                .drawFromImage(\n                    this.st.elStage.getCanvasForWrite().canvas,\n                    rectx,\n                    recty,\n                    rectw,\n                    recth,\n                    rectx,\n                    recty,\n                    0,\n                    0,\n                    this.st.elMask.getCvWidth(),\n                    this.st.elMask.getCvHeight()\n                );\n\n            this.st.elMask.getCanvasForWrite().temporarilyChangeCompositeMode('source-in', () => {\n                checkThrow(this.st, 'UQ|');\n                this.st.elMask\n                    .getCanvasForWrite()\n                    .fillRect(\n                        0,\n                        0,\n                        this.st.elMask.getCvWidth(),\n                        this.st.elMask.getCvHeight(),\n                        0,\n                        0,\n                        this.st.elMask.getCvWidth(),\n                        this.st.elMask.getCvHeight(),\n                        'white'\n                    );\n            });\n\n            /* make cvPiece equal to cvMask */\n            this.st.cvPiece = this.cbPaintRender().getTemporaryCanvas(4);\n            this.st.cvPiece.drawFromImage(\n                this.st.elMask.getCanvasForWrite().canvas,\n                0,\n                0,\n                this.st.elMask.getCvWidth(),\n                this.st.elMask.getCvHeight(),\n                0,\n                0,\n                0,\n                0,\n                this.st.cvPiece.canvas.width,\n                this.st.cvPiece.canvas.height\n            );\n\n            /* make cvPiece a cut-out of the main base layer */\n            let basePaint = this.cbPaintRender().getBaseLayer();\n            this.st.cvPiece.temporarilyChangeCompositeMode('source-in', () => {\n                checkThrow(this.st, 'UP|');\n                this.st.cvPiece.drawFromImage(\n                    basePaint.getCanvasForWrite().canvas,\n                    0,\n                    0,\n                    basePaint.getCvWidth(),\n                    basePaint.getCvHeight(),\n                    0,\n                    0,\n                    0,\n                    0,\n                    this.st.cvPiece.canvas.width,\n                    this.st.cvPiece.canvas.height\n                );\n            });\n\n            /* clear stage, draw piece on stage */\n            this.st.elStage.getCanvasForWrite().clear();\n            this.st.elStage\n                .getCanvasForWrite()\n                .drawFromImage(\n                    this.st.cvPiece.canvas,\n                    0,\n                    0,\n                    this.st.cvPiece.canvas.width,\n                    this.st.cvPiece.canvas.height,\n                    0,\n                    0,\n                    0,\n                    0,\n                    this.st.elStage.getCvWidth(),\n                    this.st.elStage.getCvHeight()\n                );\n            this.st.rectx = rectx;\n            this.st.recty = recty;\n            this.st.mode = SelectToolMode.SelectedRegion;\n        } else if (this.st && this.st.mode === SelectToolMode.MovingRegion) {\n            this.st.mode = SelectToolMode.SelectedRegion;\n        }\n\n        this.vci.causeUIRedraw(); /* will refresh cursor */\n    }\n\n    /**\n     * respond to backspace and edit->clear\n     */\n    onDeleteSelection() {\n        if (this.st && this.st.mode === SelectToolMode.SelectedRegion) {\n            this.cbPaintRender().commitImageOntoImage([this.st.elMask.getCanvasForWrite()], 0, 0);\n            this.cbPaintRender().deleteTempPaintEls();\n            this.st = undefined;\n        }\n    }\n\n    /**\n     * reset state when opening tool\n     */\n    onOpenTool() {\n        this.st = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * commit changes when leaving tool\n     */\n    onLeaveTool() {\n        this.applyMove();\n        this.cancelCurrentToolAction();\n    }\n\n    /**\n     * commit changes to the card\n     */\n    applyMove() {\n        if (this.st) {\n            if (this.st.elMask.getCanvasForWrite()) {\n                this.cbPaintRender().getBaseLayer();\n                let incoming = this.st.areCopying\n                    ? [this.st.elStage.getCanvasForWrite()]\n                    : [this.st.elMask.getCanvasForWrite(), this.st.elStage.getCanvasForWrite()];\n                this.cbPaintRender().commitImageOntoImage(incoming, 0, 0);\n            }\n\n            this.cbPaintRender().deleteTempPaintEls();\n            this.st = undefined;\n        }\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {\n        this.st = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>) {\n        if (\n            this.st &&\n            (this.st.mode === SelectToolMode.SelectedRegion || this.st.mode === SelectToolMode.MovingRegion) &&\n            el &&\n            el.id.endsWith('PlaceholderForCursor')\n        ) {\n            return UI512Cursors.arrow;\n        } else {\n            return this.mainCursor();\n        }\n    }\n\n    /**\n     * make the selection blink by toggling visibility of elBorder\n     */\n    blinkSelection() {\n        if (\n            (this.vci.getTool() === VpcTool.Select || this.vci.getTool() === VpcTool.Lasso) &&\n            this.st &&\n            this.st.mode === SelectToolMode.SelectedRegion\n        ) {\n            this.st.elBorder.set('visible', !this.st.elBorder.visible);\n        }\n    }\n\n    /**\n     * draw the blinking border around the selection\n     */\n    protected abstract selectingDrawTheBorder(\n        st: SelectToolState,\n        cv: CanvasWrapper,\n        painter: UI512Painter,\n        tmousepx: number,\n        tmousepy: number,\n        tmousenx: number,\n        tmouseny: number\n    ): void;\n\n    /**\n     * we'll cancel selection if the region is too small\n     */\n    protected abstract checkTooSmall(): boolean;\n\n    /**\n     * draw the shape we want to select as a filled-in black shape\n     */\n    protected abstract makeBlack(): void;\n\n    /**\n     * get the main cursor\n     */\n    protected abstract mainCursor(): UI512Cursors;\n}\n\n/**\n * state of the select tool\n */\nexport class SelectToolState {\n    mode: SelectToolMode;\n    areCopying = false;\n    areCopyingMult = false;\n    rawStartX = -1;\n    rawStartY = -1;\n    startX = -1;\n    startY = -1;\n    minX = largeArea;\n    minY = largeArea;\n    maxX = -largeArea;\n    maxY = -largeArea;\n    topPtX = 0;\n    topPtY = largeArea;\n    rectx = 0;\n    recty = 0;\n    recordXpts: number[];\n    recordYpts: number[];\n\n    offsetForMoveX = 0;\n    offsetForMoveY = 0;\n    cvPiece: CanvasWrapper;\n    elMask: UI512ElCanvasPiece;\n    elStage: UI512ElCanvasPiece;\n    elBorder: UI512ElCanvasPiece;\n    elPlaceholderForCursor: UI512ElCanvasPiece;\n}\n\n/**\n * which stage of the selecting lifecycle\n */\nexport enum SelectToolMode {\n    SelectingRegion = 1,\n    SelectedRegion,\n    MovingRegion\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolShape.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { CanvasWrapper } from './../../ui512/utils/utilsCanvasDraw';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvCanvas } from './../../ui512/draw/ui512DrawPainter';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * shape tool (rect, oval, etc)\n *\n * when you click and drag, we are drawing onto a separate \"elStage\" layer,\n * that floats above the real card paint.\n * when you release the mouse, we actually commit onto the card paint.\n */\nexport class VpcAppUIToolShape extends VpcAppUIToolBase {\n    state: O<ShapeToolState> = undefined;\n\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer) {\n            return;\n        }\n        if (!this.state) {\n            let [tx, ty] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n            let state = new ShapeToolState();\n            let elStage = this.cbPaintRender().makeAndAddFullsizeEl('VpcAppUIToolShapeStage');\n            elStage.transparentToClicks = true;\n            elStage.setCanvas(this.cbPaintRender().getTemporaryCanvas(1));\n            state.elStage = elStage;\n            state.paStage = new UI512PainterCvCanvas(\n                state.elStage.getCanvasForWrite(),\n                state.elStage.getCanvasForWrite().canvas.width,\n                state.elStage.getCanvasForWrite().canvas.height\n            );\n            state.drawMultiple = this.vci.getOptionB('optPaintDrawMult');\n            state.startX = tx;\n            state.startY = ty;\n            state.mode = ShapeToolMode.Dragging;\n            this.state = state;\n        }\n    }\n\n    /**\n     * respond to mouse move event\n     */\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer) {\n            return;\n        }\n        if (this.state && this.state.mode === ShapeToolMode.Dragging) {\n            let [tnx, tny] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n            if (!this.state.drawMultiple) {\n                this.state.elStage.getCanvasForWrite().clear();\n            }\n\n            this.drawPartial(this.state.elStage.getCanvasForWrite(), this.state, tl, tnx, tny);\n        }\n    }\n\n    /**\n     * draw the shape\n     */\n    protected drawPartial(cv: CanvasWrapper, st: ShapeToolState, tl: VpcTool, x: number, y: number) {\n        this.cbPaintRender().drawPartialShape([st.startX, x], [st.startY, y], st.elStage, st.paStage);\n    }\n\n    /**\n     * respond to mouse up event\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        if (this.state && this.state.mode === ShapeToolMode.Dragging) {\n            this.cbPaintRender().commitImageOntoImage([this.state.elStage.getCanvasForWrite()], 0, 0);\n            this.onLeaveTool();\n            this.onOpenTool();\n        }\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {\n        this.state = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * reset state when opening tool\n     */\n    onOpenTool() {\n        this.state = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * commit changes when leaving tool\n     */\n    onLeaveTool() {\n        this.state = undefined;\n        this.cancelCurrentToolAction();\n    }\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        return UI512Cursors.cross;\n    }\n}\n\n/**\n * state of the shape tool\n */\nexport class ShapeToolState {\n    mode: ShapeToolMode;\n    elStage: UI512ElCanvasPiece;\n    paStage: UI512Painter;\n    drawMultiple = false;\n    startX = 0;\n    startY = 0;\n}\n\n/**\n * stage of the drawing lifecycle\n */\nenum ShapeToolMode {\n    Inited = 1,\n    Dragging\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolSmear.ts",
    "content": "\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { MouseDownEventDetails, MouseMoveEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElCanvasPiece } from './../../ui512/elements/ui512ElementCanvasPiece';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { UI512Painter } from './../../ui512/draw/ui512DrawPainterClasses';\n/* auto */ import { UI512PainterCvCanvas } from './../../ui512/draw/ui512DrawPainter';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * smear tool (pencil, brush, eraser, etc)\n *\n * when you click and drag, we are drawing onto a separate \"elStage\" layer,\n * that floats above the real card paint.\n * when you release the mouse, we actually commit onto the card paint.\n */\nexport class VpcAppUIToolSmear extends VpcAppUIToolBase {\n    state: O<SmearToolState> = undefined;\n\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer) {\n            return;\n        }\n\n        if (!this.state) {\n            let state = new SmearToolState();\n            let elStage = this.cbPaintRender().makeAndAddFullsizeEl('VpcAppUIToolSmearSelectStage');\n            elStage.transparentToClicks = true;\n            elStage.setCanvas(this.cbPaintRender().getTemporaryCanvas(1));\n            state.elStage = elStage;\n            state.paStage = new UI512PainterCvCanvas(\n                state.elStage.getCanvasForWrite(),\n                state.elStage.getCvWidth(),\n                state.elStage.getCvHeight()\n            );\n            this.state = state;\n        }\n\n        /* also draw where the user clicked. */\n        this.state.mode = SmearToolMode.Dragging;\n        this.respondMouseMove(tl, new MouseMoveEventDetails(0, d.mouseX, d.mouseY, d.mouseX, d.mouseY), true);\n    }\n\n    /**\n     * respond to mouse move event\n     */\n    respondMouseMove(tl: VpcTool, d: MouseMoveEventDetails, isVelOrBaseLayer: boolean): void {\n        if (!isVelOrBaseLayer) {\n            return;\n        }\n\n        if (this.state && this.state.mode === SmearToolMode.Dragging) {\n            let [tprevX, tprevY] = this.getTranslatedCoords(d.prevMouseX, d.prevMouseY);\n            let [tnX, tnY] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n\n            this.cbPaintRender().drawPartialSmear([tprevX, tnX], [tprevY, tnY], this.state.elStage, this.state.paStage);\n        }\n    }\n\n    /**\n     * respond to mouse up event\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        if (this.state && this.state.mode === SmearToolMode.Dragging) {\n            this.cbPaintRender().commitImageOntoImage([this.state.elStage.getCanvasForWrite()], 0, 0);\n            this.onLeaveTool();\n            this.onOpenTool();\n        }\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {\n        this.state = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * reset state when opening tool\n     */\n    onOpenTool() {\n        this.state = undefined;\n        this.cbPaintRender().deleteTempPaintEls();\n    }\n\n    /**\n     * commit changes when leaving tool\n     */\n    onLeaveTool() {\n        this.state = undefined;\n        this.cancelCurrentToolAction();\n    }\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        switch (tl) {\n            case VpcTool.Pencil:\n                return UI512Cursors.paintpencil;\n            case VpcTool.Eraser:\n                return UI512Cursors.painterase;\n            case VpcTool.Brush:\n                return UI512Cursors.paintbrush;\n            case VpcTool.Spray:\n                return UI512Cursors.paintspray;\n            default:\n                return UI512Cursors.arrow;\n        }\n    }\n\n    /**\n     * make everything opaque white\n     */\n    clearAllPaint() {\n        let canvas = this.cbPaintRender().getTemporaryCanvas(1);\n        canvas.fillRect(\n            0,\n            0,\n            canvas.canvas.width,\n            canvas.canvas.height,\n            0,\n            0,\n            canvas.canvas.width,\n            canvas.canvas.height,\n            'white'\n        );\n\n        this.cbPaintRender().commitImageOntoImage([canvas], 0, 0);\n    }\n}\n\n/**\n * state of the smear tool\n */\nclass SmearToolState {\n    mode: SmearToolMode;\n    elStage: UI512ElCanvasPiece;\n    paStage: UI512Painter;\n}\n\n/**\n * stage of the drawing lifecycle\n */\nenum SmearToolMode {\n    Inited = 1,\n    Dragging\n}\n"
  },
  {
    "path": "vipercard/vipercard/src/vpcui/tools/vpcToolStamp.ts",
    "content": "\n/* auto */ import { ToolboxDims } from './../panels/vpcToolboxPatterns';\n/* auto */ import { VpcAppUIToolBase } from './vpcToolBase';\n/* auto */ import { VpcTool } from './../../vpc/vpcutils/vpcEnums';\n/* auto */ import { ScreenConsts } from './../../ui512/utils/utilsDrawConstants';\n/* auto */ import { UI512Cursors } from './../../ui512/utils/utilsCursors';\n/* auto */ import { O } from './../../ui512/utils/util512Base';\n/* auto */ import { cast } from './../../ui512/utils/util512';\n/* auto */ import { TextSelModify } from './../../ui512/textedit/ui512TextSelModify';\n/* auto */ import { UI512ImageCollection, UI512ImageCollectionCollection, UI512ImageCollectionImage } from './../../ui512/draw/ui512ImageCollection';\n/* auto */ import { UI512ElTextFieldAsGeneric } from './../../ui512/textedit/ui512GenericField';\n/* auto */ import { MouseDownEventDetails, MouseUpEventDetails } from './../../ui512/menu/ui512Events';\n/* auto */ import { UI512ElTextField } from './../../ui512/elements/ui512ElementTextField';\n/* auto */ import { UI512ElLabel } from './../../ui512/elements/ui512ElementLabel';\n/* auto */ import { UI512ElGroup } from './../../ui512/elements/ui512ElementGroup';\n/* auto */ import { UI512BtnStyle, UI512ElButton } from './../../ui512/elements/ui512ElementButton';\n/* auto */ import { UI512Element } from './../../ui512/elements/ui512Element';\n/* auto */ import { lng } from './../../ui512/lang/langBase';\n\n/* (c) 2019 moltenform(Ben Fisher) */\n/* Released under the GPLv3 license */\n\n/**\n * stamp tool, draw clip art stamps onto the card\n * images are loaded asynchronously\n */\nexport class VpcAppUIToolStamp extends VpcAppUIToolBase {\n    currentImg: O<UI512ImageCollectionImage>;\n    images = new UI512ImageCollectionCollection();\n    readonly directories: [string, string, number][] = [\n        ['animals', 'lnganimals', 31],\n        ['aquatic', 'lngaquatic', 14],\n        ['food', 'lngfood', 16],\n        ['people', 'lngpeople', 26],\n        ['places', 'lngplaces', 12],\n        ['plants', 'lngplants', 16],\n        ['symbols', 'lngsymbols', 8],\n        ['things', 'lngthings', 22],\n        ['transport', 'lngtransport', 24]\n    ];\n\n    /**\n     * hide the watch icon, once loaded from server\n     */\n    protected checkIfLoaded() {\n        this.updateStatusIcon();\n    }\n\n    /**\n     * respond to mouse down event\n     */\n    respondMouseDown(tl: VpcTool, d: MouseDownEventDetails, isVelOrBaseLayer: boolean): void {}\n\n    /**\n     * draw the clipart onto the page\n     */\n    respondMouseUp(tl: VpcTool, d: MouseUpEventDetails, isVelOrBaseLayer: boolean): void {\n        if (isVelOrBaseLayer) {\n            let theimg = this.currentImg;\n            if (theimg && theimg.loaded && theimg.image) {\n                /* paint the image, centered on the mouse position */\n                let [tx, ty] = this.getTranslatedCoords(d.mouseX, d.mouseY);\n                let [srcw, srch] = theimg.getSize();\n                tx -= Math.round(srcw / 2);\n                ty -= Math.round(srch / 2);\n                this.cbPaintRender().commitHtmlImageOntoImage(theimg.image, tx, ty, srcw, srch);\n            }\n        } else if (!isVelOrBaseLayer && d.elRaw && d.elRaw.id.endsWith('grpVpcAppUIToolStampChoiceLeft')) {\n            this.onChooseCategory();\n        } else if (!isVelOrBaseLayer && d.elRaw && d.elRaw.id.endsWith('grpVpcAppUIToolStampChoiceRight')) {\n            this.onChoosePicture();\n        }\n    }\n\n    /**\n     * erase any uncommitted partial changes, called by Undo() etc\n     */\n    cancelCurrentToolAction() {}\n\n    /**\n     * get category from the listbox\n     */\n    protected getChosenCategory() {\n        let el = this.vci.UI512App().findEl('grpVpcAppUIToolStampChoiceLeft');\n        if (el) {\n            let gel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, el));\n            let ln = TextSelModify.selectByLinesWhichLine(gel);\n            if (ln !== undefined && ln >= 0 && ln < this.directories.length) {\n                let ctg = this.images.children[ln];\n                if (ctg) {\n                    return ctg;\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * get image from the listbox\n     */\n    protected getChosenImage() {\n        let ctg = this.getChosenCategory();\n        if (ctg) {\n            let el = this.vci.UI512App().findEl('grpVpcAppUIToolStampChoiceRight');\n            if (el && el.getFmTxt().len() > 0) {\n                let gel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, el));\n                let ln = TextSelModify.selectByLinesWhichLine(gel);\n                if (ln !== undefined && ln >= 0) {\n                    let img = ctg.children[ln];\n                    if (img) {\n                        return img;\n                    }\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * when you choose a category,\n     * update the list of stamps, and\n     * begin loading the first one\n     */\n    protected onChooseCategory() {\n        let ctg = this.getChosenCategory();\n        if (ctg) {\n            let lns = ctg.children.map(ch => lng(ch.name));\n            let el = this.vci.UI512App().findEl('grpVpcAppUIToolStampChoiceRight');\n            if (el) {\n                UI512ElTextField.setListChoices(cast(UI512ElTextField, el), lns);\n                el.set('selcaret', 0);\n                el.set('selend', 0);\n                this.currentImg = undefined;\n                if (el.getFmTxt().len() > 0) {\n                    /* auto-choose the first one */\n                    let rghtgel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, el));\n                    TextSelModify.selectLineInField(rghtgel, 0);\n                    this.onChoosePicture();\n                }\n            }\n        }\n    }\n\n    /**\n     * when you choose a stamp,\n     * request that it loads from the server\n     */\n    protected onChoosePicture() {\n        let img = this.getChosenImage();\n        this.currentImg = img;\n        if (img && !img.loaded) {\n            /* we used to use the mouse-move event to check if it\n            loaded instead, but this is better. */\n            img.startLoad(() => {\n                this.vci.placeCallbackInQueue(() => this.checkIfLoaded());\n            });\n        }\n\n        this.checkIfLoaded();\n    }\n\n    /**\n     * show a watch if still waiting for image to load from server\n     */\n    protected updateStatusIcon() {\n        let grp = this.vci.UI512App().findGroup('grpVpcAppUIToolStamp');\n        if (grp) {\n            let el = grp.findEl('grpVpcAppUIToolStampStatus');\n            if (el && this.currentImg && this.currentImg.loaded) {\n                el.set('iconnumber', 76); /* white */\n            } else if (el && this.currentImg) {\n                el.set('iconnumber', 91); /* watch */\n            } else if (el) {\n                el.set('iconnumber', 76); /* white */\n            }\n        }\n    }\n\n    /**\n     * reset state when opening tool,\n     * and initialize layout for a form on the right\n     */\n    onOpenTool() {\n        this.images = new UI512ImageCollectionCollection();\n        this.currentImg = undefined;\n        for (let [id, name, n] of this.directories) {\n            let cl = new UI512ImageCollection(id, name, '/resources03a/images/stamps/');\n            cl.genChildren(n);\n            this.images.children.push(cl);\n        }\n\n        this.vci.UI512App().removeGroup('grpVpcAppUIToolStamp');\n        let grp = new UI512ElGroup('grpVpcAppUIToolStamp');\n        this.vci.UI512App().addGroup(grp);\n\n        let px = this.vci.bounds()[0] + ScreenConsts.xAreaWidth + 1;\n        let py = this.vci.bounds()[1] + ScreenConsts.yMenuBar + ToolboxDims.IconH + 8;\n        let pw = ScreenConsts.ScreenWidth - (ScreenConsts.xAreaWidth + 1);\n        let ph = ScreenConsts.yAreaHeight - ToolboxDims.IconH;\n\n        /* draw background rectangle */\n        let bg = new UI512ElButton('grpVpcAppUIToolStampBg');\n        grp.addElement(this.vci.UI512App(), bg);\n        bg.set('autohighlight', false);\n        bg.set('style', UI512BtnStyle.Rectangle);\n        bg.setDimensions(px, py, pw, ph);\n\n        /* draw category choices */\n        let lft = UI512ElTextField.makeChoiceBox(this.vci.UI512App(), grp, 'grpVpcAppUIToolStampChoiceLeft', px + 15, py + 15);\n        let rght = UI512ElTextField.makeChoiceBox(this.vci.UI512App(), grp, 'grpVpcAppUIToolStampChoiceRight', px + 170, py + 15);\n\n        /* draw status icon */\n        let statusicon = new UI512ElButton('grpVpcAppUIToolStampStatus');\n        grp.addElement(this.vci.UI512App(), statusicon);\n        statusicon.set('style', UI512BtnStyle.Opaque);\n        statusicon.set('icongroupid', '001');\n        statusicon.set('iconnumber', 76); /* white */\n        statusicon.setDimensions(px + 312, py + 15, 30, 30);\n\n        /* draw bottom-left label */\n        let lbl2 = new UI512ElLabel('grpVpcAppUIToolStampLbl2');\n        grp.addElement(this.vci.UI512App(), lbl2);\n        lbl2.set('labeltext', lng('lng\"Art Bits\" (1987)       Click on the page to draw art!'));\n        lbl2.setDimensions(px + 13, py + 280, 400, 20);\n\n        /* optimize group */\n        grp.updateBoundsBasedOnChildren();\n\n        /* set left choices */\n        UI512ElTextField.setListChoices(\n            lft,\n            this.directories.map(item => lng(item[1]))\n        );\n\n        /* auto-choose the first entry in the list */\n        let lftgel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, lft));\n        TextSelModify.selectLineInField(lftgel, 0);\n        this.onChooseCategory();\n        if (rght.getFmTxt().len() > 0) {\n            let rghtgel = new UI512ElTextFieldAsGeneric(cast(UI512ElTextField, rght));\n            TextSelModify.selectLineInField(rghtgel, 0);\n            this.onChoosePicture();\n        }\n    }\n\n    /**\n     * commit changes when leaving tool\n     */\n    onLeaveTool() {\n        /* free memory by unreferencing everything */\n        this.vci.UI512App().removeGroup('grpVpcAppUIToolStamp');\n        this.images = new UI512ImageCollectionCollection();\n        this.currentImg = undefined;\n        this.cancelCurrentToolAction();\n    }\n\n    /**\n     * which cursor should be shown if the mouse is over el.\n     */\n    whichCursor(tl: VpcTool, el: O<UI512Element>): UI512Cursors {\n        return UI512Cursors.drawn_cross;\n    }\n}\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/assertmarkerutils.py",
    "content": "\nfrom base90 import *\n\ndef parseArguments(s, begin, f=None):\n    # ` until `, ' until ', \" until \"\n    lvl = 0\n    arlvl = 0\n    stNormal = 9\n    stInSingleQt = 10\n    stInDblQt = 11\n    stInBkQt = 12\n    startCharForIt = {\"'\":stInSingleQt, '\"':stInDblQt, '`':stInBkQt}\n    getCharForIt = {stInSingleQt:\"'\", stInDblQt:'\"', stInBkQt:'`'}\n    s = s[0:begin] + s[begin:].replace('\\\\\\\\', '$$$tmp_backslash_backslash$$$').replace('\\\\\"', '$$$tmp_escaped_backslash_dblquote$$$').replace(\"\\\\'\", '$$$tmp_escaped_backslash_singlequote$$$')\n    \n    st = stNormal\n    i = begin - 1\n    args = ['']\n    while True:\n        i+= 1\n        if st==stNormal:\n            if s[i] =='[':\n                arlvl += 1\n                args[-1] += s[i]\n            elif s[i] ==']':\n                arlvl -= 1\n                args[-1] += s[i]\n            elif s[i] =='(':\n                lvl += 1\n                args[-1] += s[i]\n            elif s[i] ==')':\n                lvl -= 1\n                args[-1] += s[i]\n                if lvl ==0 and arlvl==0:\n                    break\n            elif startCharForIt.get(s[i], None) is not None:\n                args[-1] += s[i]\n                st = startCharForIt.get(s[i], None)\n            elif s[i] ==',' and lvl==1 and arlvl==0:\n                args.append('')\n            else:\n                args[-1] += s[i]\n            \n        else:\n            args[-1] += s[i]\n            wanted = getCharForIt[st]\n            if wanted==s[i]:\n                st=stNormal\n    \n    args = [arg.replace('$$$tmp_escaped_backslash_dblquote$$$', '\\\\\"' ).replace('$$$tmp_escaped_backslash_singlequote$$$', \"\\\\'\").replace('$$$tmp_backslash_backslash$$$', \"\\\\\\\\\")\n        for arg in args]\n    assertTrueMsg('(' in args[0], file=f)\n    assertTrueMsg(args[-1].endswith(')'), file=f)\n    prefix = args[0].split('(', 1)[0] + '('\n    suffix = args[-1][-1]\n    args[0] = args[0].split('(', 1)[1]\n    args[-1] = args[-1][0:-1]\n    totallength = len(prefix) + len(suffix) + len(','.join(args))\n    return prefix, args, suffix, totallength\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/base90.py",
    "content": "\nimport os\nimport sys\nimport re\nsys.path.append('../typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_common import *\nsys.path.append('../typescript-super-auto-import')\nfrom ts_parsing import *\n\nbase90Chars = [\n    '0',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n    'P',\n    'Q',\n    'R',\n    'S',\n    'T',\n    'U',\n    'V',\n    'W',\n    'X',\n    'Y',\n    'Z',\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    ' ',\n    '!',\n    '#',\n    '%',\n    '&',\n    '(',\n    ')',\n    '*',\n    '+',\n    ',',\n    '-',\n    '.',\n    '/',\n    ':',\n    ';',\n    '<',\n    '=',\n    '>',\n    '?',\n    '@',\n    '[',\n    ']',\n    '^',\n    '_',\n    '{',\n    '|',\n    '}',\n    '~'\n    ]\n\n# all ascii printable except\n# ' \" ` which can interfere with js strings\n# $ which when paired with ${  can interfere with js ` style strings\n# \\ which can interfere with js strings\n# that's 95 - 5 = base 90\n\ndef toBase90(n):\n    s = ''\n    while n >= 90:\n        digit = n%90\n        s = base90Chars[digit] + s\n        n = n // 90\n    s = base90Chars[n] + s\n    return s\n    \ndef tests():\n    assertEq(90, len(base90Chars))\n    assertEq('0', toBase90(0))\n    assertEq('A', toBase90(10))\n    assertEq('}', toBase90(88))\n    assertEq('~', toBase90(89))\n    assertEq('10', toBase90(90))\n    assertEq('11', toBase90(91))\n    assertEq('~}', toBase90(8098))\n    assertEq('~~', toBase90(8099))\n    assertEq('100', toBase90(8100))\n    assertEq('101', toBase90(8101))\n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/config.cfg",
    "content": "\n[main]\ndir = ../../src\n\n[assertsToMarkAndWhichArgument]\n# base\nassertTrue = 1\nassertWarn = 1\ncheckThrow512 = 1\nassertEq = 2\nassertWarnEq = 2\ncheckThrowEq512 = 2\n\n# vpc level\ncheckThrow = 1\ncheckThrowEq = 2\n\n# vpc level helpers\ncheckThrowInternal = 1\ncheckThrowNotifyMsg = 1\n\n# other\nensureDefined = 1\nassertThrows = 0\nassertThrowsAsync = 0\nassertAsserts = 0\n\n[linesToSkip]\n\n# signatures\nassertThrows(msgWithMark: string = skip\nexpected: unknown = skip\ncondition: unknown = skip\nassertAsserts(msgWithMark: = skip\n\n# other calls that we don't want to mark\n# makeUI512Error(msgAssertEq, c1, c2, c3 = skip\n# makeUI512Error(msgInAssertEqWarn, = skip\n# makeUI512Error(msgInThrowIfUndefined = skip\n# makeUI512Error(msg: string = skip\nassertWarn(false, sParseErr = skip\nmakeWarningUseful = skip\nfalse, msg + msgEq = skip\n\n# a notifymsg isn't a true error state, we can skip most of them\ncheckThrowNotifyMsg(false, lng(untranslated)) = skip\ncheckThrowNotifyMsg(false, VpcPanelScriptEditor.there = skip\ncheckThrowNotifyMsg(false, lng(msgIfFalse)) = skip\n\n# vpc only\n# checkThrow(condition: any = skip\n\n[filesToSkip]\nexampleFileToSkip.ts = skip\nvpcParser.ts = skip\nvpcTokens.ts = skip\nvpcVisitor.ts = skip\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/current_assert_id.txt",
    "content": "2917\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/main.py",
    "content": "\nfrom base90 import *\nfrom assertmarkerutils import *\nimport readconfig\n\n# Ben Fisher, 2018\n# this script adds markers to asserts\n# it even works if there is a complex condition to be tested\n# and it works across multiple lines\n\ndef go(srcdirectory, previewOnly):\n    assertTrueMsg(files.isDir(srcdirectory), 'directory not found', srcdirectory)\n    currentSavedFile = './current_assert_id.txt'\n    firstNum = int(files.readAll(currentSavedFile, encoding='utf-8').strip()) if files.exists(currentSavedFile) else 1\n    state = Bucket(latestMarker = firstNum)\n    marksAleadySeen = {}\n    \n    try:\n        for f, short in files.recurseFiles(srcdirectory):\n            if short.lower().endswith('.ts') and not short in skipFiles:\n                goForFile(f, previewOnly, state, marksAleadySeen)\n    finally:\n        if not previewOnly:\n            trace(f'first={firstNum} last={state.latestMarker}')\n            files.writeAll(currentSavedFile, f'{state.latestMarker}\\n', encoding='utf-8')\n    \n    for key in skipThese:\n        if skipThese[key] != 'seen':\n            warn('expected to skip this, but not seen. this might mean we accidentally wrote an assert marker ' +\n                'to the signature of an assert itself, or it could just mean that the list is not up to date. \\n' + key)\n\n\ndef goForFile(f, previewOnly, state, marksAleadySeen):\n    content = files.readAll(f, encoding='utf-8')\n    newcontent = goForFileProcess(f, previewOnly, state, marksAleadySeen, content)\n    if newcontent != content: \n        if not previewOnly:\n            files.writeAll(f, newcontent, encoding='utf-8')\n\ndef goForFileProcess(f, previewOnly, state, marksAleadySeen, content):\n    skipIfInGeneratedCode = GeneratedCodeDetector(content, f)\n    matches = []\n    for m in re.finditer(reAssertsToMarker, content):\n        which = m.group(0).split('(')[0]\n        posStart = m.start(0)\n        if not skipIfInGeneratedCode.isInsideGeneratedCode(posStart):\n            matches.append((posStart, which))\n        \n    # iterate the matches backwards so we can alter the string without altering indexes in the document\n    matches.reverse()\n    for posStart, which in matches:\n        prefix, args, suffix, totalLength = parseArguments(content, posStart, f)\n        looksLike = prefix+','.join(args)+suffix\n        assertTrueMsg(prefix.startswith(which + '('), 'wrong offset? ', looksLike, file=f)\n        needRepl = processOneCall(f, state, content, looksLike, marksAleadySeen, posStart, which, prefix, args, suffix, totalLength)\n        if needRepl:\n            replWith = prefix+','.join(args)+suffix\n            trace(f'\\t{looksLike}\\n\\t{replWith}\\n')\n            assertTrueMsg(len(replWith) >= totalLength, 'making it shorter?', file=f)\n            content = jslike.splice(content, posStart, totalLength, replWith)\n    \n    return content\n\ndef processOneCall(f, state, content, looksLike, marksAleadySeen, posStart, which, prefix, args, suffix, totalLength):\n    reFindMarker = r'''^\\s*LS(\"[^\"][^\"]|'[^'][^']|`[^`][^`])\\|'''\n    reFindQuote = r'''^\\s*LS([\"'`])'''\n    reFindMarker = reFindMarker.replace('LS', r'(?:longstr\\(\\s*)?')\n    reFindQuote = reFindQuote.replace('LS', r'(?:longstr\\(\\s*)?')\n\n    for key in skipThese:\n        if key in looksLike:\n            skipThese[key] = 'seen'\n            return False\n\n    wantIndex = desiredArgIndex[which]\n    for narg, arg in enumerate(args):\n        fndQuote = re.search(reFindQuote, arg)\n        if fndQuote:\n            fndMarker = re.search(reFindMarker, arg)\n            if fndMarker:\n                # it's apparently already marked. make sure it's not a duplicate\n                thefoundMarker = fndMarker.group(1)[1:]\n                alreadySaw = marksAleadySeen.get(thefoundMarker, False)\n                if not alreadySaw:\n                    marksAleadySeen[thefoundMarker] = True\n                    return False\n                else:\n                    # duplicate or invalid marker\n                    newmarker = genNewMarker(state)\n                    assertTrueMsg(2 == len(newmarker), len(newmarker), file=f)\n                    marksAleadySeen[newmarker] = True\n                    args[narg] = jslike.splice(args[narg], fndMarker.start(1)+1, 2, newmarker)\n                    return True\n            else:\n                # string with no marker. add a marker\n                if narg >= wantIndex:\n                    ind = fndQuote.start(1) + 1\n                    newmarker = genNewMarker(state)\n                    assertTrueMsg(2 == len(newmarker), len(newmarker), file=f)\n                    marksAleadySeen[newmarker] = True\n                    args[narg] = jslike.splice(args[narg], ind, 0, newmarker + '|' )\n                    return True\n    # no string literals found at all\n    assertTrueMsg(False, 'no string literals found', looksLike, file=f, linenum=lineOffset(content, posStart))\n\ndef lineOffset(contents, posStart):\n    lines = contents.split('\\n')\n    total = 0\n    for i, line in enumerate(lines):\n        total += len(line) + 1\n        if total >= posStart:\n            return i + 1\n    return 1\n\ndef genNewMarker(state):\n    state.latestMarker += 1\n    ret = toBase90(state.latestMarker)\n    ret = ret.ljust(2, '0')\n    return ret\n\nclass GeneratedCodeDetector(object):\n    gStart = '/* generated code, any changes past this point will be lost: --------------- */'\n    gEnd = '/* generated code, any changes above this point will be lost: --------------- */'\n    startInd = None\n    endInd = None\n    def __init__(self, contents, f=''):\n        pts = contents.split(self.gStart)\n        if len(pts)==1:\n            return\n        elif len(pts)==2:\n            self.startInd = contents.find(self.gStart)\n            self.endInd = contents.find(self.gEnd)\n            assertTrue(self.startInd >= 0, 'not seen', self.gStart, f)\n            assertTrue(self.endInd >= 0, 'not seen', self.gEnd, f)\n            self.startInd += len(self.gStart)\n        else:\n            assertTrue(False, 'we only support one generated code chunk per file', f)\n    def isInsideGeneratedCode(self, index):\n        if self.startInd is None or self.endInd is None:\n            return False\n        return index > self.startInd and index < self.endInd\n\ndef tests():\n    assertEq(('other fn(', ['1', '2', '3'], ')', 15), parseArguments(\"other fn(1,2,3)\", 0))\n    assertEq(('other fn(', ['a b', 'c d', 'e f'], ')', 21), parseArguments(\"other fn(a b,c d,e f)\", 0))\n    assertEq(('other fn(', ['ff(a)', 'ff(b)'], ')', 21), parseArguments(\"other fn(ff(a),ff(b))\", 0))\n    assertEq(('other fn(', ['ff(f1(a,b), f2(c,d))', 'ff(b)'], ')', 36), parseArguments(\"other fn(ff(f1(a,b), f2(c,d)),ff(b))\", 0))\n    assertEq(('other fn(', ['\"1,2,3\"', '2', '3'], ')', 21), parseArguments('other fn(\"1,2,3\",2,3)', 0))\n    assertEq(('other fn(', ['\"1\\\\\"2,3\"', '2', '3'], ')', 22), parseArguments('other fn(\"1\\\\\"2,3\",2,3)', 0))\n    assertEq(('other fn(', [\"'1,2,3'\", '2', '3'], ')', 21), parseArguments(\"other fn('1,2,3',2,3)\", 0))\n    assertEq(('other fn(', [\"'1\\\\'2,3'\", '2', '3'], ')', 22), parseArguments(\"other fn('1\\\\'2,3',2,3)\", 0))\n    assertEq(('other fn(', ['`1,2,3`', '2', '3'], ')', 21), parseArguments(\"other fn(`1,2,3`,2,3)\", 0))\n    assertEq(('other fn(', [\"`1\\\\'2,3`\", '2', '3'], ')', 22), parseArguments(\"other fn(`1\\\\'2,3`,2,3)\", 0))\n    assertEq(('other fn(', ['[1,2]', '2', '3'], ')', 19), parseArguments(\"other fn([1,2],2,3)\", 0))\n    assertEq(('other fn(', ['[1,f(a,b)]', '2', '3'], ')', 24), parseArguments(\"other fn([1,f(a,b)],2,3)\", 0))\n    assertEq(('other fn(', ['f([1,2],3)', '2', '3'], ')', 24), parseArguments(\"other fn(f([1,2],3),2,3)\", 0))\n\n    assertEq(('fn(', ['1', '2', '3'], ')', 9), parseArguments(\"'test_test' otherotherotherotherotherother fn(1,2,3)\", 43))\n    assertEq(('fn(', ['1', '2', '3'], ')', 9), parseArguments(\"'test\\\\'tes' otherotherotherotherotherother fn(1,2,3)\", 43))\n\n    gStart = GeneratedCodeDetector('').gStart\n    gEnd = GeneratedCodeDetector('').gEnd\n    exampleDoc = f'first\\nlines\\n\\nthen\\n{gStart}\\ninside\\nthe_generated\\narea\\n{gEnd}outside\\nagain'\n    detector = GeneratedCodeDetector(exampleDoc)\n    assertTrue(not detector.isInsideGeneratedCode(0))\n    assertTrue(not detector.isInsideGeneratedCode(1))\n    assertTrue(not detector.isInsideGeneratedCode(exampleDoc.find('then')))\n    assertTrue(detector.isInsideGeneratedCode(exampleDoc.find('inside')))\n    assertTrue(detector.isInsideGeneratedCode(exampleDoc.find('the_generated')))\n    assertTrue(detector.isInsideGeneratedCode(exampleDoc.find('area')))\n    assertTrue(not detector.isInsideGeneratedCode(exampleDoc.find('outside')))\n    assertTrue(not detector.isInsideGeneratedCode(exampleDoc.find('again')))\n\ntests()\n\nif __name__=='__main__':\n    dir, desiredArgIndex, skipThese, skipFiles = readconfig.readconfig()\n    sAssertsToMarker = '|'.join( '\\\\b' + k + '\\\\(' for k in desiredArgIndex.keys())\n    reAssertsToMarker = re.compile(sAssertsToMarker)\n\n    previewOnly = True\n    #~ previewOnly = False\n    go(dir, previewOnly)\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/add-assert-markers/readconfig.py",
    "content": "\nfrom assertmarkerutils import *\nimport configparser\n\ndef go(f):\n    cfg = configparser.ConfigParser(delimiters='=')\n    # make it case-sensitive\n    cfg.optionxform = str\n    cfg.read(f)\n    \n    dir = cfg['main']['dir']\n    dir = os.path.abspath(dir)\n    \n    desiredArgIndex = {}\n    for key in cfg['assertsToMarkAndWhichArgument']:\n        desiredArgIndex[key.strip()] = \\\n            int(cfg['assertsToMarkAndWhichArgument'][key])\n    assertTrueMsg(len(desiredArgIndex) > 0, \n        'no entries in assertsToMarkAndWhichArgument')\n    \n    skipThese = {}\n    for key in cfg['linesToSkip']:\n        val = cfg['linesToSkip'][key]\n        assertEq('skip', val, 'for key', key)\n        skipThese[key.strip().replace('{{NEWLINE}}', '\\n')] = True\n    \n    skipFiles = {}\n    for key in cfg['filesToSkip']:\n        val = cfg['filesToSkip'][key]\n        assertEq('skip', val, 'for key', key)\n        skipFiles[key.strip().replace('{{NEWLINE}}', '\\n')] = True\n    \n    return dir, desiredArgIndex, skipThese, skipFiles\n\ndef readconfig():\n    assertTrueMsg(files.isFile('config.cfg'), \"Could not find config.cfg\")\n    return go('config.cfg')\n    \nif __name__=='__main__':\n    dir, desiredArgIndex, skipThese, skipFiles = readconfig()\n    trace(desiredArgIndex)\n    trace(skipThese)\n    trace(skipFiles)\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/bgrammar_01.ccc",
    "content": "\n// ben fisher, 2018\n// some tips from http://www.jaedworks.com/hypercard/scripts/hypertalk-bnf.html\n// (viewing this file as C may highlight the syntax better)\n\n// extremely cutting down number of tokens is no longer necessary,\n// with the ensureOptimizations flag now chevrotain's lexing \n// builds a map based on possible first character, so is much faster.\n\n// there are several semi-keywords, like \"transparent\". You can use the term transparent with no parens like set the style to transparent,\n// but also create a variable (put \"abc\" into transparent) with no problem. so is \"transparent\" a keyword or not?\n// (this might have to do with the product's behavior where unwritten to variables hold their names, e.g. get abc is \"abc\" if you've never written to abc)\n// the product is very lenient -- you can even assign over functions (put \"abc\" into cos; answer cos && cos)\n// note that if we made \"transparent\" et all a token, then it would be difficult to allow a variable named transparent. also, we'd have nearly 100 more tokens to deal with.\n// and when you wanted to set a property and had a typo like set the autohilite2 of cd btn 1, it would be a syntax error, which might be confusing\n// let's use this approach:\n//      certain terms are reserved keywords like \"word\", \"item\". defined as tokens, cannot be used as variable names at all.\n//      certain terms are built-in properties/functions. \"cos\", \"mouseloc\". not defined as tokens. if you try 'put \"abc\" into cos' we check at runtime (not compile time) and error then.\n//      certain terms are allowed as variable names but are also interpreted as a string in property-set contexts. like transparent or gray.\n\n// in this version we try to parse as much of the language as possible,\n// even for features like custom menus that we don't support yet,\n// so that old scripts can run without too many changes.\n\n// use (?:noncapturinggroups)\n// {{nothingdirectlyafter}} expands to (?![a-zA-Z0-9_]) which means that it can't be directly followed by a letter or numeral.\n// Be careful when lexing because tokens are greedy. If you have 3 tokens /fro/ /from/ /frome/,\n// the string \"from frome\" becomes [fro, m, fro, me].\n// the (?![a-zA-Z0-9_]) means to look ahead to make sure no other word/letters are there.\n// important, otherwise if you have tokens \"the\" and \"then\", you'd need to order everything right, or \"then\" would lex into \"the\", \"n\"\n\n// in a group of alternates, I think it's a good idea to put ones that will fail fast first\n// Bad parts about reducing number of tokens:\n//      more analysis needed at runtime. although we already need to do a lot of analysis there anyways, so it's not so bad. do need to confirm the right words use though.\n//      grammar is more fragile for chevrotain warning about ambiguities. the first time I stripped it down, see vpc001.txt, got a lot of Chev. warnings saying \"same prefix\" in both paths. unclear if actually a problem but I don't want to increase the lookahead.\n//      grammar might have actual true wrong parsing. consider \"ask [password] <Expr>\". if I made it \"ask [TkIdentifier] <Expr>\" to try to save a token, if the user typed \"ask x-3\" it would be parsed as (ask)(x)(-3) and mess up the expression.\n//      potentially slower parsing because there are potentially more routes the grammar can take as more keywords are moved to generic tkIdentifiers; might do more backtracking\n\n\n// changes from original product:\n//      you can't read from a variable you have never written to\n//      NEW FEATURE: numbers can be written as 1e10 and 1e-10\n//      NEW FEATURE: block comments  --[[ to ]]\n//      NEW FEATURE: get the number of btns in cd 2\n//      continued lines can use either \\ or logical not\n//      you can use != instead of <>, you can use == instead of =\n//      NEW FEATURE: drag from a,b to c,d to e,f\n//      NEW FEATURE: replace \"a\" with \"b\" in s\n//      you can't omit items in a list, like average(1,2,,3)\n//      NEW FEATURE: objectById(id)\n//      NEW FEATURE: owner is more useful\n//      NEW FEATURE: label and name are separate properties\n//      CHANGE: the \"long id\" of objects is now more useful. \n//              if you put the long id into x, you can set properties of x\n//      we are more lenient refering to objects. \n//          e.g. we allow 'get the name of cd 1 of this stack', why not since 'go to cd 1 of this stack' and 'the number of cards in this stack' is valid\n//          e.g. we allow stack-at-end-of-line in a few more contexts\n//      the string versions of \"the target\" and \"the owner of\" look a little different, they return our new long id\n//      we need parens for if the short id of the owner of cd id prevCard is not the short id of the owner of cd id nextCard then answer \"j\"\n//      we don't support char x + 1 of abc, need char (x + 1) of abc\n//      NEW FEATURE: set the fontstyle to grayed\n//      NEW FEATURE: set the fontstyle to toggle-bold\n//      we don't support \"part\"\n//      do \"code\" can't yet read/write local vars\n//      nearly all chunks supported except 1) negative index 2) backwards bounds 3) deleting a range besides chars\n//      use compatibility mode (off by default) to match some weird behavior in original product\n//      unless compatibility mode is turned on, \"the id\" is made consistent for all objects \n//          is also more useful, since the long id actually is longer than the short id, and isn't card-dependent.\n//      set the filled can be true, false, or \"white\"\n\n\n\n// changes from v1:\n        // click at \"1,\" missing items are treated as 0, to match product\n//      we no longer support the in some cases, \"the me\" and \"the hypercard\" are no longer valid\n\n// strings (only way for the user to get a quote char is `put quote & \"hi\" & quote into s` )\ntkStringLiteral=/\"[^\"\\n]*\"{{nothingdirectlyafter}}/\n// block comments, based on lua. --[[ to ]]\n// use [\\s\\S] to match any char, dotall is new and not supported in all browsers\ntkBlockComment=/--\\[\\[[\\s\\S]*?\\]\\]/|||||group: chevrotain.Lexer.SKIPPED,line_breaks:true\n// line comment. use negative lookahead so that --[[ is never a line comment\ntkLineComment=/--(?!\\[\\[)[^\\n]*/|||||group: chevrotain.Lexer.SKIPPED\n// whitespace or a line-continuation. \\xC2 is logical not in mac-roman encoding\ntkContinuedLineOrWhiteSpace=/(?:[ \\t]+)|(?:[\\\\\\xC2][ \\t]*\\n)/|||||group: chevrotain.Lexer.SKIPPED,line_breaks:true\n// official grammar uses this. lookahead to see if it's the last token on the line\ntkCardAtEndOfLine=/(?:card|cd)(?=\\s*\\n)/\n// official grammar uses this. lookahead to see if it's the last token on the line\ntkBgAtEndOfLine=/(?:background|bkgnd|bg)(?=\\s*\\n)/\n// official grammar uses this. lookahead to see if it's the last token on the line\ntkStackAtEndOfLine=/stack(?=\\s*\\n)/\n// a new line\ntkNewLine=/\\n+/|||||line_breaks:true\n// not expected to be lexed from user input, but used as a marker while preparing code to be parsed\ntkSyntaxMark=/\\?{9}/\n// numbers need to disallow letters right afterwards, otherwise 4a becomes [\"4\", \"a\"]. note that emulator supports 001 == 1.\ntkNumLiteral=/[0-9]+(?:\\.[0-9]*)?(?:e[-+]?[0-9]+)?{{nothingdirectlyafter}}/\n\n\n// terms for objects. OneOfWords uses negative lookahead to force it to be a full word\n// used to combine plural and singular into one token. probably better to separate them\n// now that we support old-style functions so that \"the number of cd btns\" doesn't look similar to \"the number of cd btn 1\"\ntkStack=OneOfWords(stack)\ntkBg=OneOfWords(background,bkgnd,bg)\ntkBgPlural=OneOfWords(backgrounds,bkgnds,bgs)\ntkCard=OneOfWords(card,cd)\ntkCardPlural=OneOfWords(cards,cds)\ntkBtn=OneOfWords(button,btn)\ntkBtnPlural=OneOfWords(buttons,btns)\ntkFld=OneOfWords(field,fld)\ntkFldPlural=OneOfWords(fields,flds)\ntkProductName=OneOfWords(hypercard,vipercard)\ntkAdjective=OneOfWords(long,short,abbrev,abbr,abbreviated)\n/* we support 'the first', 'the third' by rewrites _shouldOmit which deletes 'the' */\ntkOrdinalOrPosition=OneOfWords(this,prev,previous,next,last,mid,middle,any,first,second,third,fourth,fifth,sixth,seventh,eighth,ninth,tenth)\ntkChunkGranularity=OneOfWords(characters?,chars?,words?,items?,lines?)\ntkInOnly=OneOfWords(in)\ntkOfOnly=OneOfWords(of)\ntkA=OneOfWords(a,an)\n\n// more terms\n// this implies that the user cannot create a variable with these names.\n// tokens starting with an underscore should accept an image that is the same as their name minus the underscore\n_not=OneOfWords(not)\n_there=OneOfWords(there)\n_is=OneOfWords(is)\n_no=OneOfWords(no)\n_and=OneOfWords(and)\n_or=OneOfWords(or)\n_contains=OneOfWords(contains)\n_within=OneOfWords(within)\n_the=OneOfWords(the)\n_message=OneOfWords(msg,message)\n_window=OneOfWords(window)\n_windows=OneOfWords(windows)\n_box=OneOfWords(box)\n_me=OneOfWords(me)\n_recent=OneOfWords(recent)\n_back=OneOfWords(back)\n_forth=OneOfWords(forth)\n_marked=OneOfWords(marked)\n_to=OneOfWords(to)\n_menuItem=OneOfWords(menuitems?)\n_menu=OneOfWords(menu)\n_id=OneOfWords(id)\n_number=OneOfWords(number)\n_selection=OneOfWords(selection)\n_target=OneOfWords(target)\n\n// comma\ntkComma=/,/\n// open paren\ntkLParen=/\\(/\n// close paren\ntkRParen=/\\)/\n// plus or minus\ntkPlusOrMinus=OneOfOr(\\+ |or| -)\n// mult, div, power, \"div\", \"mod\"\ntkMultDivideExpDivMod=OneOfOr(\\* |or| \\/ |or| \\^ |or| div{{nothingdirectlyafter}} |or| mod{{nothingdirectlyafter}})\n// concat or concat with space\ntkStringConcat=OneOfOr(&& |or| &)\n// not-equal, greater than, less than\n// mac-roman encoding \\xAD is not-equal \\xB2 \\xB3 are lessthan-or-equal\ntkGreaterOrLessEqualOrEqual=OneOfOr(<> |or| >=? |or| <=? |or| != |or| ==? |or| \\xB2 |or| \\xB3 |or| \\xAD)\n\n\n// i think i will have to enumerate the property names in any case,\n// in order to distinguish between a prop lookup and an old style function call\n// could instead enumerate builtin functions also, but it makes since to assume\n// that everything that's not a property is a function, which let's use support custom functions.\n// the rect of cd fld 1 -- treats cd fld 1 as an object\n// the sin of cd fld 1 -- retrieves the *contents* of cd fld 1\n// the list below contains only the long form, synonyms like 'loc' will be rewritten via rewritePropertySynonyms\n// checkmark isn't new to us, it is already in list\ntkUnaryVipercardProperties=OneOfWords(alltext,label,showlabel,singleline,defaulttextstyle,defaulttextfont,defaulttextsize,internalid,compatibilitymode)\n\n/* generated code, any changes past this point will be lost: --------------- */\ntkAllUnaryPropertiesIfNotAlready=OneOfWords(autohilite,autoselect,autotab,bottom,bottomright,cantabort,cantdelete,cantmodify,cantpeek,checkmark,commandchar,dontsearch,dontwrap,enabled,family,fixedlineheight,freesize,height,hilite,icon,left,location,locktext,markchar,menumessage,multiplelines,name,owner,partnumber,rectangle,reporttemplates,right,script,scroll,sharedhilite,sharedtext,showlines,showname,showpict,size,style,textalign,titlewidth,top,topleft,visible,widemargins,width,zoomed)\n\ntkAllNullaryOrUnaryPropertiesIfNotAlready=OneOfWords(scriptinglanguage,textfont,textheight,textsize,textstyle,version)\n\n/* we've automatically searched through all word-like tokens to check for any overlap (like how _id is both a token and a property name) */\nHAllPropertiesThatCouldBeUnary:={tkAllUnaryPropertiesIfNotAlready | tkUnaryVipercardProperties | tkAllNullaryOrUnaryPropertiesIfNotAlready |_id|_marked|_number}                      --->ProcessOr--->IToken\nHAnyFnNameOrAllPropertiesThatCouldBeNullary:={ <HAnyFnName> | tkAllNullaryOrUnaryPropertiesIfNotAlready }                      --->ProcessOr--->IToken\nHAnyFnName:= { tkIdentifier | _target|_windows}                      --->ProcessOr--->IToken\n/* generated code, any changes above this point will be lost: --------------- */\nHCouldBeAPropertyToSet:= { tkIdentifier | <HAllPropertiesThatCouldBeUnary> }                 --->ProcessOr--->IToken\nHAnyAllowedVariableName:={ tkIdentifier | _number | tkA | tkAllUnaryPropertiesIfNotAlready | tkUnaryVipercardProperties | tkAllNullaryOrUnaryPropertiesIfNotAlready }         --->ProcessOr--->IToken\n\n// a bit of a space/time tradeoff in rules:\n// when we cram everything into one rule, slightly less space in memory taken as CST has fewer branches\n// however, this also means slightly longer time in traversing as there are many conditionals to see which subrule is not null\n// also makes software more complex\n// another space/time tradeoff:\n// separating operators into different levels to implement operator precedence: makes a bigger parse tree and more parsing code\n// it's also possible to make all binary operators the same level and work out the precedence in software = smaller parse tree to hold in memory\n\n// must be last, or it would take precedence over most of the rest\ntkIdentifier=/[a-zA-Z][0-9a-zA-Z$_]*/\n\n//////////// Objects\n// note use of Lvl6Expression - confirmed in product. you have to say 'cd btn (1+1)' and not 'cd btn 1+1'\n// note that \"btn 1\" refers to a card button and \"fld 1\" refers to a bg fld. so you should typically specify.\n// in software we'll stop you from saying \"first cd btn 1\"\n// need to remember through which card it was accessed, \"bg fld 1 of card 2\" is different than \"bg fld 1 of card 1\"\n// note that saying \"of card\" just means \"of this card\". \"fld 1 of this card\" still refers to a bg fld.\n// tkStackAtEndOfLine is confirmed in emulator, for example 'answer the id of cd 1 of bg'\n// interestingly, back and forth are cards. \"answer the id of back\" works.\n// you can't usually \"skip levels\". card 1 of this stack and fld 1 of this bg are not allowed. \n// but let's allow card 1 of this stack because in the \"go\" command that is supported. \n\nObject:={ <ObjectSpecial> | <ObjectInterpretedFromString> | <ObjectBtn> | <ObjectFld> | <ObjectCard> |    <ObjectBg> | <ObjectStack>     }                     --->ProcessOr--->RequestedVelRef\nObjectBtn:={ tkOrdinalOrPosition {tkCard | tkBg} tkBtn | {tkCard | tkBg} {tkBtn _id <Lvl6Expression> | tkBtn <Lvl6Expression> } }  [ <Of> <ObjectCard> ]                                     --->Custom--->RequestedVelRef\nObjectFld:={ tkOrdinalOrPosition {tkCard | tkBg} tkFld | {tkCard | tkBg} {tkFld _id <Lvl6Expression> | tkFld <Lvl6Expression>} } [ <Of> <ObjectCard> ]                                   --->Custom--->RequestedVelRef\nObjectCard:= { _recent { tkCard | tkCardPlural | tkCardAtEndOfLine} | _back | _forth | tkCard _id <Lvl6Expression> | \\\n                     [_marked] tkCard <Lvl6Expression> | tkCardAtEndOfLine | tkOrdinalOrPosition [_marked] { tkCard | tkCardAtEndOfLine} } \\\n                [ <Of> <ObjectBg> ]  [ <Of> <ObjectStack> ]                            --->Custom--->RequestedVelRef\nObjectBg:={tkBg _id <Lvl6Expression> | tkBg <Lvl6Expression> | tkOrdinalOrPosition { tkBg | tkBgAtEndOfLine } |  \\\n                        tkBgAtEndOfLine} [ <Of> <ObjectStack> ]                                                                          --->Custom--->RequestedVelRef\nObjectStack:={ tkOrdinalOrPosition { tkStack | tkStackAtEndOfLine} | tkStack <Lvl6Expression> | tkStack _id <Lvl6Expression> | tkStackAtEndOfLine }                                         --->Custom--->RequestedVelRef  \nObjectSpecial:={tkProductName | _me }       --->Custom--->RequestedVelRef\n\n// ObjectInterpretedFromString:\n// don't need to support HOldStyleFnNonNullary\n// to support 'the owner of', why tkAllUnaryPropertiesIfNotAlready and not HUnaryPropertyGet ?\n// HUnaryPropertyGet has an optional \"the\", so it's complicated to parse that now.\n// also note that original product allows an hchunk: 'get the short id of line 3 of cd fld \"a\"' but that would make 'get the textfont of line 3 of cd fld \"a\"' ambiguous.\n// so I won't support an hchunk for now, you'll have to use parens\nObjectInterpretedFromString:={ tkStringLiteral | _target | tkLParen <Expr> tkRParen | <HAnyAllowedVariableName> | <HOldStyleFnNullaryOrNullaryPropGet> | _the [tkAdjective] tkAllUnaryPropertiesIfNotAlready tkOfOnly <Object> }       --->Custom--->RequestedVelRef\n\n// CONFIRMED THIS COMPLEX BEHAVIOR IN EMULATOR:\n// \"target\" and \"the target\" have subtly different behavior\n// see \"Pseudo-functions that refer to objects\" in internaldocs.md\n// \n// Testing in emulator:\n// This does work:\n// \tanswer the name of cd btn fld 1\n// \tanswer the name of cd btn -xx\n// \tanswer the name of cd btn not true\n// This parses as two things:\n// \tanswer the name of cd btn 5 - 4\n// \tanswer the name of cd btn 2 * 1\n// so yes, it is a lvl6 expression that it wants\n// \n// I used to say that a field could be defined as \n//  [{tkCard | tkBg}] {tkFld _id <Lvl6Expression> | tkFld <Lvl6Expression>}\n// because in the product you can say \"put 4 into fld 2\"\n// but this leads to an ambiguity \n// \"cd fld id 1\"\n//which is truly ambiguous , it could mean cd (fld id 1) or (cd fld) id 1 and chevrotain says it doesn't know which.\n// so in the parser we'll require the cd or bg before a fld, and during syntax transformation, take any \"fld\" or \"btn\" that isn't preceded by \"cd\" or \"bg\" and add that. \n// then we'll match the product's behavior because it will be parsed as (cd fld) id 1. and we'll still support a phrase like cd fld fld 1\n// \n\n//////////// Helpers\n// docs say that unless it is ofOnly or inOnly, of/in are interchangeable\nOf:={tkOfOnly|tkInOnly}                         --->ProcessOr--->IToken\nMenuItem:={tkOrdinalOrPosition _menuItem | _menuItem <Lvl6Expression>}       --->Constant|\"{menuitemExpr}\"\nMenu:={tkOrdinalOrPosition _menu | _menu <Lvl6Expression>}                             --->Constant|\"{menuExpr}\"\n// tkIdentifier is one of: pattern,tool,scroll,fatbits\nWindow_1:=[_the] {tkCard  } _window    --->Constant|\"{windowExpr}\"\nWindow:={<Window_1> | <MessageBox>}             --->Constant|\"{windowExpr}\"\nMessageBox:=[_the] _message [ { _box | _window } ]      --->Constant|\"{msgBoxExpr}\"\n\n\n\n\n//////////// Containers\n// the emulator lets you put text into a button, doesn't seem to do anything\n// references to the messagebox are turned into references to a special global variable that is checked after every run\n// we considered implementing 'the selection' as either a chunk or rewriting to char selcharstart to selcharend of the selectedfield,\n// but then it would be hard to support put \"abc\" into item 3 of the selection.\nHSimpleContainer:={ <Menu> | <MessageBox> | [_the] _selection | _target | <ObjectBtn> | <ObjectFld> | <HAnyAllowedVariableName> }  --->Custom--->RequestedContainerRef\n// fyi: HContainer is only used for 'put' command, never in expression evaluation\nHContainer:=[<HChunk>] <HSimpleContainer>                                                                                         --->Custom--->RequestedContainerRef\nHChunk:=<HChunkOne> MANY{{ <HChunkOne> }}ENDMANY                                                                                    --->Custom--->RequestedChunk\nHChunkOne:={ tkOrdinalOrPosition tkChunkGranularity | tkChunkGranularity <HChunkBound> [_to <HChunkBound>] } <Of>       --->Custom--->RequestedChunk\n// we restrict what can be in chunkbounds to reduce the chances for parser ambiguity. this is just the \"4\" in get char 4 of \"abcd\", nothing special\nHChunkBound:= { tkLParen <Expr> tkRParen | tkNumLiteral  | <HSimpleContainer> }                --->Custom--->VpcVal\n\n//////////// Function Calls / Property Gets\n// problem: old-style function calls look like this: \"the sin of 4\"\n// so when you run into an expression like \"get the sin of cd fld 1\" is this looking up a property on the field,\n// or calling a function on the contents of the field? I confirmed in the product that this is valid code.\n\n// first approach was to support only the form \"get the sin of (cd fld 1)\" whereas \"get the sin of cd fld 1\" was always treated as a property lookup even if no such property\n// pros: don't need to enumerate lots of builtin functions or properties (which would slow down lexing + take away variable names), they're both just a tkIdentifier\n// pros: having a list of builtins is redundant since that list needs to exist in software too\n// but it's hard to distinguish those. <Of> { <Object> | ... | <Lvl6Expression> } I thought might work - it will pick Object or Lvl6Expression, depending on which comes first\n// but it's a lookahead parser--not backtracking--so once it goes into Object it can't come back out (unless backtracking is specifically turned on, which I don't want.)\n// and running this Chevrotain warned about the ambiguous alternatives detected: <1,5> in <OR1> \n\n// so I'll do things a more complete way and have a list of all the possible properties\n// I'll support \"get the sin of cd fld 1\", since sin is not \n// making a list of the properties, or a list of the functions, or both, could have worked, but I'll list just the properties, so that \"get the myCustomFunction of cd fld 1\" also works\n// in other words when you get something like \"get the sin of cd fld 1\" we'll know sin has to be a function call because it's not in our list of properties.\n\n// we'll also be able to distinguish between global property gets \"get the lockScreen\" and function calls \"get the myCustomFunction\"\n// note that \"the target\" and \"the number of\" look like function calls but they aren't, they need to be handled differently\n// note that \"the length\" is not handled specially, a phrase like \"get the length of cd fld 1\" should just work (previously we'd have trouble with it)\n// note that you can't use fn style to get global properties, \"get the version\" is valid but not \"get version()\"\n// note that we'll match the product and let you say \"get the long sin of 4\" and ignore the nonsensical adjective\n// note thatHOldStyleFnNonNullary uses a Lvl6Expression not a Expr, otherwise 'the length of \"abc\" > 1' gets parsed wrong\nHSource:={<HSource_1> | <HGenericFunctionCall> | <HSimpleContainer>}   --->Custom--->VpcVal\nHSource_1:=  {tkStringLiteral | tkNumLiteral}                 --->Custom--->VpcVal\nHFnCallWParens:={ <HAnyFnName> tkLParen MANYSEP{{ tkComma / <Expr> }}ENDMANYSEP tkRParen  }         --->Custom--->VpcVal\n// original product supports 'put \"char 2 of cd fld 1\" into x, get the textfont of x',\n// we support this in the visitor by looking ahead to see if it is a ObjectInterpretedFromString and calling RequestedChunk.parseFromString\nHUnaryPropertyGet:=[_the] [ tkAdjective ] <HAllPropertiesThatCouldBeUnary> tkOfOnly { <Object> | <Window> | <MenuItem> <Of> <Menu> | <HChunk> { <ObjectFld> | _me | [_the] _target } }       --->Custom--->VpcVal\nHOldStyleFnNonNullary:=_the <HAnyFnName> tkOfOnly <Lvl6Expression>                                                                             --->Custom--->VpcVal\nHOldStyleFnNullaryOrNullaryPropGet:= _the [ tkAdjective ] <HAnyFnNameOrAllPropertiesThatCouldBeNullary>             --->Custom--->VpcVal\n\n// I think it's legit to increase the lookahead. <_the, _number, tkOfOnly, tkCard> may appear as a prefix path in all these alternatives. \n// but it is true, \"the number of cd btn id 5\" and \"the number of cd btns\" do have the same prefix\nHGenericFunctionCall:={ MAX_LOOKAHEAD=5 <FnCallNumberOf> | <FnCallThereIs> | <HFnCallWParens> | <HUnaryPropertyGet> | <HOldStyleFnNonNullary> | <HOldStyleFnNullaryOrNullaryPropGet> }   --->ProcessOr--->VpcVal\n\n// we used to support more here, but pared it down to match the original product\n// we do though support \"the number of marked cds of bg 1\" which the product could not do\nFnCallNumberOf:= _the _number tkOfOnly { <FnCallNumberOf_1>|<FnCallNumberOf_2>|<FnCallNumberOf_3>|<FnCallNumberOf_4>|<FnCallNumberOf_5>  }      --->ProcessOr--->VpcVal\nFnCallNumberOf_1:={tkCard | tkBg} { tkBtnPlural | tkFldPlural }      --->Custom--->VpcVal\nFnCallNumberOf_2:=[_marked] tkCardPlural  [ <Of> { <Object> } ]           --->Custom--->VpcVal\nFnCallNumberOf_3:=tkBgPlural [ <Of> <ObjectStack> ]                                                       --->Custom--->VpcVal\nFnCallNumberOf_4:={_windows | _menu | _menuItem <Of> <Menu>}                             --->Custom--->VpcVal\nFnCallNumberOf_5:=tkChunkGranularity <Of> <Lvl3Expression>                                        --->Custom--->VpcVal\n\n// you can't say \"there is a line 1000 of cd fld 1\" or \"there is a line 1000 of \"abc\"\", confirmed in the product\nFnCallThereIs:= _there _is {_no | [_not] tkA} <Object>                   --->Custom--->VpcVal\n\n// we want AnyPropertyVal to take many things\n// well tkIdentifier can be a Lvl1Expression (treated as variable)\n// and shadow can be a Lvl1Expression (treated as variable)\n// text style lists are in the form \"bold, italic\".\n// let's be simpler and accept an arbitarary amnt of terms here, and check it at runtime.\n// point needs 2 terms, rect needs 4 terms, fonts need arbitrary number\nAnyPropertyVal:= ATLEASTONESEP{{ tkComma / <Lvl1Expression> }}ENDATLEASTONESEP              --->BuildMap\n\n\n//////////// Expressions\n\n// \"lookahead\" only comes into play when there is an OPTIONAL, OR, etc. block\n// otherwise we'll greedily eat whatever comes our way.\n// this issue arose when dealing with \"x is y\" versus \"x is within y\", had to make \"within\" a token so it wouldn't go the wrong way\n// if the grammar is\n// Expr1:= <Expr2> letterc Integer \n// Expr2:= letterb [letterc lettera]\n// I would have hoped that \"b c 123\" would work, trying out Expr2 and then falling back to Expr1\n// but no, once we go into Expr2 we can never fall back into Expr1.\n// increasing the 'lookahead' parameter in general isn't a good solution.\n\n\n// placing in a tower like this is a good way to resolve left-recursion\n// you can't do something like Expr:= <Expr> + <Expr> because this is left-recursion\n// you might see Lvl6Expression referred to as \"factor\".\n// chevrotain documentation notes that you can also flatten the tower to two tiers and do operator precedence in software,\n// which reduces the size of parse trees in memory \n// note: to match the original product, operations do not short-circuit, so \"true or myFunction()\" will call myFunction\n// also, implementing short-circuit correctly would be tricky because custom-function expansion currently puts the calls on previous lines\nExpr:= <Lvl1Expression> MANY{{ <AndOrOr> <Lvl1Expression> }}ENDMANY                                                     --->BuildExpr|<AndOrOr>|<Lvl1Expression>|OpLogicalOrAnd\nLvl1Expression:= <Lvl2Expression> MANY{{ <ContainsOrGreaterLessEqual> <Lvl2Expression> }}ENDMANY            --->BuildExpr|<ContainsOrGreaterLessEqual>|<Lvl2Expression>|OpEqualityGreaterLessOrContains\nLvl2Expression:= <Lvl3Expression> MANY{{ _is <IsExpression> }}ENDMANY                                                           --->Custom--->VpcVal\nLvl3Expression:= <Lvl4Expression> MANY{{ tkStringConcat <Lvl4Expression> }}ENDMANY                                    --->BuildExpr|tkStringConcat|<Lvl4Expression>|OpStringConcat\nLvl4Expression:= <Lvl5Expression> MANY{{ tkPlusOrMinus <Lvl5Expression> }}ENDMANY                                       --->BuildExpr|tkPlusOrMinus|<Lvl5Expression>|OpPlusMinus\nLvl5Expression:= <Lvl6Expression> MANY{{ tkMultDivideExpDivMod <Lvl6Expression> }}ENDMANY                         --->BuildExpr|tkMultDivideExpDivMod|<Lvl6Expression>|OpMultDivideExpDivMod\nLvl6Expression:= [ { tkPlusOrMinus | _not } ] [<HChunk>] { <HSource> | tkLParen <Expr> tkRParen }                 --->Custom--->VpcVal\n\nAndOrOr:={_or | _and}                                                                                                                       --->ProcessOr--->string\nContainsOrGreaterLessEqual:={ _contains | tkGreaterOrLessEqualOrEqual  }                                            --->ProcessOr--->string\n\n// \"x is a number\" or \"x is 1\" or \"x is within\"\nIsExpression:= [_not]  { tkA { _number | tkIdentifier }  | { tkInOnly | _within } <Lvl3Expression> | <Lvl3Expression> }       --->BuildMap\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/bgrammarcmds_01.ccc",
    "content": "\n// ben fisher, 2018\n// some inspiration from http://www.jaedworks.com/hypercard/scripts/hypertalk-bnf.html\n// (viewing this file as C may highlight the syntax better)\n\n// not supported from product: ask file, answer file, close\n\n//      pop, push supports only simple constructs\n//      select supports only selecting chunk of a field\n//      sort only supports sorting text\n\n// this is the syntax seen by the parser, which isn't the same \n// as what is typed by the user -- we'll apply transformations during \"rewrite\".\n// all commands start with ..., which means 3 tkSyntaxMark tokens\n\n// don't have consecutive terms like tkIdentifier <Expression> or tkIdentifier <Object>\n// this is ok now, but it limits flexibility in case we want to allow consecutive tkIdentifiers\n// use rewrites to make it tkSyntaxMark <Expression> instead.\n// e.g. vpcRewritesCommands will turn 'show at <Expression>' into 'show tkSyntaxMark <Expression>'\n\n// addition. supports customfns\nBuiltinCmdAdd:=... <Lvl1Expression> _to <HContainer>                                                             \n// show dialog. software rewrite \"with\" to tkSyntaxMark. it's a Lvl6Expression not an Expr so that Or works\n// during software rewrite, check for \"answer file\" and \"answer program\" and show NYI\nBuiltinCmdAnswer:=... <Expr> [tkSyntaxMark <Lvl6Expression> [ _or <Lvl6Expression> [ _or <Lvl6Expression>]]]                 \n// arrowkey. simply sends an arrow key message. if not trapped, goes to next cd etc. \n// left and right are constants, so you can say `arrowkey left`, we don't need to rewrite syntax\n// we have the default arrowkey in standardlib but user can override\n// show dialog. software rewrite `with` to tkSyntaxMark and `ask password` to `ask ,\" and `ask file` to NYI\n// original product lets you omit quotes ask \"g\" with why is this happening but I don't think i will\nBuiltinCmdAsk:=... [tkComma] <Expr> [tkSyntaxMark <Expr>]                                            \n// play beep sound.\nBuiltinCmdBeep:=... [<Expr>]\n// choose tool. rewrite will turn `choose brush tool` into `choose \"brush\"`\n// for compatibility the choose message can be trapped, but in standardlib it will call BuiltinCmdVpccalluntrappablechoose to actually change the tool\n// in vipercard this only changes the tool for script running-simulated drawing purposes\nBuiltinCmdVpccalluntrappablechoose:=... <Expr>\n// simulate click. software rewrite \"with\" to tkSyntaxMark. supports click at x if x contains coords.\nBuiltinCmdClick:=... tkIdentifier <HBuiltinCmdDrag_1> [ tkSyntaxMark tkIdentifier [ tkComma tkIdentifier [ tkComma tkIdentifier ] ] ]  \n// close. show NYI in rewrite\n// commandKeyDown, a way to simulate a keypress like Cmd+A. show NYI in rewrite\n// controlkey: goes up through message hierarchy, handled by vipercardstdlib\n// convert. changes date/time formats show NYI in rewrite\n// copy. show NYI in rewrite\n// create.  show NYI in rewrite. say domenu \"new button\" to create a button etc.\n// debug. show NYI in rewrite\n// delete. in rewrite error on mention of \"menu\"\n// delete object is done in software, see internalvpcdeletevelhelper\nBuiltinCmdDelete:=... <HChunk> <HSimpleContainer>\n// plays a phone dial number\nBuiltinCmdDial:=... <Expr>                                                                           \n// disable a button. in rewrite error on mention of \"menu\"\nBuiltinCmdDisable:=... <Object>                                                                     \n// divide. rewrite \"by\" to a  tkSyntaxMark\n// the rewrite isn't really needed, but it's a good idea in case we ever need two consecutive tkidentifiers\n// to be a valid expression\nBuiltinCmdDivide:=... <HContainer> tkSyntaxMark <Lvl1Expression>                                                              \n// domenu is in standardlib as a normal proc call. \n// note that cards can override the domenu message. \n// in the product you can omit quotes, domenu new button works, but we don't support that\n// in rewrite syntax say we don't support \"without dialog\" or \"with keys\"\n// drag, simulate mouse drag\n// in rewrite syntax from \"with\" to tkSyntaxMark\n// do. in rewrite, turned into send x to me\nBuiltinCmdDrag:=... tkIdentifier MANYSEP{{ _to / <HBuiltinCmdDrag_1> }}ENDMANYSEP [ tkSyntaxMark tkIdentifier [ tkComma tkIdentifier [ tkComma tkIdentifier ] ] ]   \nHBuiltinCmdDrag_1:=<Lvl4Expression> [tkComma <Lvl4Expression>]                      --->BuildMap\n// edit. show NYI in rewrite\n// enable a button. in rewrite error on mention of \"menu\"\nBuiltinCmdEnable:=... <Object>                \n// enterInField. sent up the message hierarchy, usually does nothing, handled by vipercardstdlib. takes no args\n// enterKey. sent up the message hierarchy, usually does nothing, handled by vipercardstdlib. takes no args\n// export. show NYI in rewrite\n// errorDialog. in emulator it can be trapped, so let's follow suit I guess\nBuiltinCmdVpccalluntrappableerrordialog:=... <Expr>       \n// find. show NYI in rewrite\n// functionkey: sent up the message hierarchy, usually does nothing, handled by vipercardstdlib.\n// software rewrites \"Get\" to \"Put\"...into it\n// BuiltinCmdGet:=... <Expr>            \n// note that `back` and `forth` are keywords so they don't need special handling\n// BuiltinCmdGo:= the new design is that it's rewritten into a call to internalvpcmovecardhelper, and\n// it's all done in software.\n// for example, actually creating an object or actually changing current card\n// see also internalvpcmessagesdirective -- but it's a keyword, not a command\n// internalvpcmessagesdirective \"whichDirective\" variable\n// help. sent up the message hierarchy, usually does nothing, handled by vipercardstdlib. takes no args\n// hide. in rewrite error on mention of \"menu\"\nBuiltinCmdHide:=... <Object>\n// import. show NYI in rewrite\n// keydown. show NYI in rewrite\n// lock. parsed in software, takes no args.\nBuiltinCmdLock:=... tkIdentifier\n// mark. other parsing done in software\n// mark all cards -> [mark, all]  mark cd 1 -> [mark, tkSyntaxMark, cd 1]\nBuiltinCmdMark:=... [_not] { tkIdentifier | tkSyntaxMark <Object> }\n// multiply. rewrite from \"by\" the tkIdentifier is \"by\"\nBuiltinCmdMultiply:=...<HContainer> tkSyntaxMark <Lvl1Expression>                                                               \n// open. show NYI in rewrite\n// pop card. has a little stack to go to. implemented entirely in software\n// BuiltinCmdPop:=... into|before|after container \n// play: to get around consecutive Exprs, don't support full Exprs, only vars and literals, and insert tkSyntaxMark in rewrites\n// play \"example\" tempo 234 \"a b c\" or play \"example\" load\nBuiltinCmdPlay:=... MANY{{  <HBuiltinCmdPlay_1>   tkSyntaxMark }}ENDMANY\nHBuiltinCmdPlay_1:={ <HAnyAllowedVariableName> | tkStringLiteral | tkNumLiteral  }              --->ProcessOr--->IToken\n// push card. has a little stack to go to. implemented entirely in software\n// put variable in. in rewrite, reject if \"menu\" is mentioned.\n// tkIdentifier here is 'before' 'after' 'into'\n// the traditional <Expr> [ tkIdentifier [ <HContainer> ]] does work for now, but breaks if an Expr can ever have 2 consecutive tkIdentifiers\n// buildmap would work fine, but returns an array for performance reasons\n// rewrites make the HContainer always present.\nBuiltinCmdPut:=... <Expr> tkSyntaxMark tkIdentifier tkSyntaxMark <HContainer>                      --->Custom--->any\n// read. show NYI in rewrite\n// reply. show NYI in rewrite\n// request. show NYI in rewrite\n// reset. reset paint | menubar | printing. reset paint might be useful, let's support that.\nBuiltinCmdReset:=... tkIdentifier\nBuiltinCmdReplace:=... <Expr> tkSyntaxMark <Expr> tkInOnly  <HSimpleContainer>\n// returnInField. sent up the message hierarchy, usually does nothing. takes no args\n// returnKey. sent up the message hierarchy, usually does nothing. takes no args\n// save. show NYI in rewrite\n// select. \"select empty\", \"select text of cd fld 1\" is supported, \"select button/fld\" is not (you'd have to be in the edit tool)\nBuiltinCmdSelect:=...  tkStringLiteral [ [<HChunk>] <Object> ]                                       \n// setting a property\n// original product supports 'put \"char 2 of cd fld 1\" into x, set the textfont of x to bold',\n// but we only support this for 'the selectedchunk' via rewriting selectedchunk\nBuiltinCmdSet:=... [_the] <HCouldBeAPropertyToSet> [ tkOfOnly { <HChunk> { <ObjectFld> | _me | [_the] _target } | <Object> } ] _to <AnyPropertyVal>           --->Custom--->IntermedMapOfIntermedVals\n// show an object, or show all cards. if \"menu\" or \"picture of\", or \"window\", error in rewrite\n// we don't yet support show all cards or show 6 cards\nBuiltinCmdShow:=...  <Object> [ tkSyntaxMark <Lvl4Expression> [tkComma <Lvl4Expression>]  ]                                  \n// we'll build the sort-by-each part in software. tkStringLiteral1 is \"numeric|alphabetic\" tkStringLiteral2 is \"ascending|descending\"\nBuiltinCmdSort:=... tkStringLiteral tkStringLiteral tkChunkGranularity tkOfOnly <HSimpleContainer>\n// start using, currently a no-op\nBuiltinCmdStart:=... tkIdentifier <ObjectStack>\n// stop using, currently a no-op\nBuiltinCmdStop:=... tkIdentifier <ObjectStack>\n// subtraction. rewrite 'from' to syntaxmarker\nBuiltinCmdSubtract:=... <Lvl1Expression> tkSyntaxMark <HContainer>      \n// tabkey. sent up the message hierarchy, usually goes from one field to the next. takes no args\n// type. set NYI during rewrites\n// unlock.\nBuiltinCmdUnlock:=... tkIdentifier [ tkStringLiteral tkStringLiteral tkStringLiteral tkStringLiteral ]\n// unmark, rewrite it to \"mark\", \"_not\"\n// visual effect, parse it in software. the visual effect seems to last until the end of the scope\nBuiltinCmdVisual:=... tkIdentifier [ tkStringLiteral tkStringLiteral tkStringLiteral tkStringLiteral ]\n// wait supports  second,seconds,milliseconds,ms,ticks. defaults to a tick, which is 60th of second\n// we rewrite `wait for 2 ms` into `wait 2 \"ms\"`\n// or \"wait until/while\" which we should just expand into a while loop. note that \"second\" is a tkOrdinal\nBuiltinCmdWait:=... <Expr> [ { tkIdentifier | tkOrdinalOrPosition  } ]\n// write. set NYI during rewrites\n// used internally. tkStringLiteral is \"send\" or \"do\"\nCmdSend:=... tkStringLiteral <Expr> _to <Object>                    --->BuildMap\nInternalCmdRequestEval:=... <Expr>             --->Custom--->any\nInternalCmdUserHandler:=... MANYSEP{{ tkComma / <Expr> }}ENDMANYSEP             --->Custom--->any\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/list-all.ccc",
    "content": "// from the hypercard 2.3 handbook\n/////////////////////////////////////////\nbegin-properties\n/////////////////////////////////////////\naddress-nullary\nautoHilite\nautoSelect\nautoTab\nblindTyping-nullary\nbottom\nbottomRight\nbrush-nullary\ncantAbort\ncantDelete\ncantModify\ncantPeek\ncentered-nullary\ncheckMark\ncommandChar\ncursor-nullary\ndebugger-nullary\ndialingTime-nullary\ndialingVolume-nullary\ndontSearch\ndontWrap\ndragSpeed-nullary\neditBkgnd-nullary\nenabled\nenvironment-nullary\nfamily\nfilled-nullary\nfixedLineHeight\nfreeSize\ngrid-nullary\nheight\nhilite\nicon\nID \nitemDelimiter-nullary\nlanguage-nullary\nleft\nlineSize-nullary\nlocation\nlockErrorDialogs-nullary\nlockMessages-nullary\nlockRecent-nullary\nlockScreen-nullary\nlockText\nlongWindowTitles-nullary\nmarkChar\nmarked\nmenuMessage\nmessageWatcher-nullary\nmultiple-nullary\nmultipleLines\nmultiSpace-nullary\nname\nnumber\nnumberFormat-nullary\nowner\n// owner returns a string that can be used as an object, but it isn't an object\npartNumber\npattern-nullary\npolySides-nullary\npowerKeys-nullary\nprintMargins-nullary\nprintTextAlign-nullary\nprintTextFont-nullary\nprintTextHeight-nullary\nprintTextSize-nullary\nprintTextStyle-nullary\nrectangle\nreportTemplates\nright\nscript\nscriptEditor-nullary\nscriptingLanguage-nullaryOrUnary\nscriptTextFont-nullary\nscriptTextSize-nullary\nscroll\nsharedHilite\nsharedText\nshowLines\nshowName\nshowPict\nsize\nstacksInUse-nullary\nstyle\nsuspended-nullary\ntextAlign\ntextArrows-nullary\ntextFont-nullaryOrUnary\ntextHeight-nullaryOrUnary\ntextSize-nullaryOrUnary\ntextStyle-nullaryOrUnary\ntitleWidth\ntop\ntopLeft\ntraceDelay-nullary\nuserLevel-nullary\nuserModify-nullary\nvariableWatcher-nullary\nversion-nullaryOrUnary\nvisible\nwideMargins\nwidth\nzoomed\n/////////////////////////////////////////\nbegin-keywords\n/////////////////////////////////////////\ndo\nexit\nfunction\nglobal\nif\non\npass\nrepeat\nreturn\nsend\n/////////////////////////////////////////\nbegin-commands\n/////////////////////////////////////////\nadd\nanswer\narrowKey\nask\nbeep\nchoose\nclick at\nclose\ncommandKeyDown\ncontrolKey\nconvert\ncopy template\ncreate\ndebug\ndelete\ndial\ndisable\ndivide\ndoMenu\ndrag\nedit script\nenable\nenterInField\nenterKey\nexport paint\nfind\nfunctionKey\nget\ngo\nhelp\nhide\nimport paint\nkeyDown\nlock\nmark\nmultiply\nopen\nopen file\nopen printing\nopen report printing\nplay\npop\nprint\npush\nput\nread\nreply\nrequest\nreset\nreturnInField\nreturnKey\nrun\nsave\nselect\nset\nshow\nsort\nstart using\nstop using\nsubtract\ntabKey\ntype\nunlock\nunmark\nvisual\nwait\nwrite\n// technically these are syntax not commands, but I'll put them here just in case\ndo\nexit\nglobal\nnext\npass\nreturn\nsend\nif\n/////////////////////////////////////////\nbegin-functions\n/////////////////////////////////////////\nabs\nannuity\natan\naverage\ncharToNum\nclickChunk\nclickH\nclickV\nclickLine\nclickLoc\nclickText\ncommandKey\ncompound\ncos\ndate\ndestination\ndiskSpace\nexp\nexp1\nexp2\nfoundChunk\nfoundField\nfoundLine\nfoundText\nheapSpace\nlength\nln\nln1\nlog2\nmax\nmenus\nmin\nmouse\nmouseClick\nmouseH\nmouseV\nmouseLoc\n// number... not really a function since it takes an object, it's more like a property\nnumToChar\noffset\noptionKey\nparam\nparamCount\nparams\nprograms\nrandom\nresult\nround\nscreenRect\nseconds\nselectedButton\nselectedChunk\nselectedField\nselectedLine\nselectedLoc\nselectedText\nshiftKey\nsin\nsound\nsqrt\nstacks\nstackSpace\nsum\nsystemVersion\ntan\ntarget // returns a string, not a true object\nticks\ntime\ntool\ntrunc\nvalue\nwindows\n/////////////////////////////////////////\nbegin-events\n/////////////////////////////////////////\n// can be trapped\nchoose \ndomenu \nhelp\n// can also be trapped\narrowKey\ncommandKeyDown\ncontrolKey\nfunctionKey\nkeyDown\nreturnInField\nreturnKey\ntabKey\nerrorDialog\nappleEvent\n// other messages (see message sending orders)\nappleEvent\ncloseBackground\ncloseCard\ncloseField\ncloseStack\ndeleteBackground\ndeleteButton\ndeleteCard\ndeleteField\ndeleteStack\nerrorDialog\nexitField\nidle\nmouseDoubleClick\nmouseDown\nmouseEnter\nmouseLeave\nmouseStillDown\nmouseUp\nmouseWithin\nmoveWindow\nnewBackground\nnewButton\nnewCard\nnewField\nnewStack\nopenBackground\nopenCard\nopenField\nopenStack\nquit\nresume\nresumeStack\nsizeWindow\nstartUp\nsuspend\nsuspendStack\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/main.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom producetokens import *\nfrom produceparser import *\nfrom producevisitor import *\n\n'''\nTip: if produced code has a syntax error, sometimes looking at\nthe prettified code can identify the problem, like where there's a missing }\nPrettier won't format it, so use a more lenient formatter:\nopen the file in vscode, select all, rightclick-> format selection with... and choose Typescript language features\n'''\n    \ndef go(dir, infiles, outfiles):\n    try:\n        out = writePropertiesListIntoGrammar(infiles)\n        writeIntoOutput(infiles[0], out)\n        st = readGrammarFiles(infiles, skipGenerated=False)\n        out = goTokensDefnOne(st)\n        writeIntoOutput(outfiles.tokens, '\\n'.join(out))\n        out = goForRules(st)\n        writeIntoOutput(outfiles.parse, '\\n'.join(out))\n        out = goForVisitorInterface(st)\n        writeIntoOutput(outfiles.visitorInterface, '\\n'.join(out))\n        out = makeAllVisitors(st)\n        writeIntoOutput(outfiles.visitor, '\\n'.join(out))\n        checkThatEveryTokensIsReferencedInARule(st, outfiles)\n    except:\n        # print gcc-style warning\n        trace(f'\\n{infiles[0]}:1:1 warning: for convenience, click here to open the first input file\\n')\n        raise\n    \nif __name__ == '__main__':\n    dir = os.path.abspath('../../src')\n    infiles = ['bgrammar_01.ccc', 'bgrammarcmds_01.ccc', 'list-all.ccc']\n    outfiles = Bucket(\n        parse = dir + '/vpc/codeparse/vpcParser.ts',\n        tokens = dir + '/vpc/codeparse/vpcTokens.ts',\n        visitor = dir + '/vpc/codeparse/vpcVisitor.ts',\n        visitorInterface = dir + '/vpc/codeparse/vpcVisitorInterface.ts',\n    )\n    \n    go(dir, infiles, outfiles)\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/produceparser.py",
    "content": "\nfrom readgrammarinput import *\n\n\ndef goForRules(st):\n    out = []\n    out.append(\"\")\n    for rule in st.rules:\n        goForRule(out, rule)\n    out.append(\"\")\n    return out\n    \ndef goForRule(out, rule):\n    out.append(\"\")\n    out.append(f\"Rule{rule.name} = this.RULE('Rule{rule.name}', \" + '() => {')\n    outRuleDefn = []\n    lst = goPrepRule(rule.val, rule.origLine)\n    buildRuleDefinition(outRuleDefn, lst, rule.origLine)\n    addNumerals(outRuleDefn)\n    out.extend(outRuleDefn)\n    out.append(\"});\")\n\ndef goPrepRule(s, origLine):\n    mapToSpecialChars = {\n        '{': ' { ',\n        '}': ' } ',\n        '|': ' | ',\n        '[': ' [ ',\n        ']': ' ] ',\n        '/': ' / ',\n        '<': ' <',\n        '>': '> ',\n    }\n    s = s.replace('MANY{{', 'MANY\\x01\\x01')\n    s = s.replace('MANYSEP{{', 'MANYSEP\\x01\\x01')\n    s = s.replace('ATLEASTONESEP{{', 'ATLEASTONESEP\\x01\\x01')\n    s = s.replace('}}ENDMANY', '\\x01\\x01ENDMANY')\n    s = s.replace('}}ENDMANYSEP', '\\x01\\x01ENDMANYSEP')\n    s = s.replace('}}ENDATLEASTONESEP', '\\x01\\x01ENDATLEASTONESEP')\n    # replace with special chars and adds spaces\n    for key in mapToSpecialChars:\n        s = s.replace(key, mapToSpecialChars[key])\n    \n    # remove spaces inside the many ones, they are special and will be handled all at once\n    def removeSpacesWithinCh(content, start, end):\n        if not start in content: return content\n        assertEq(2, len(content.split(start)), 'currently can only appear once', start, origLine)\n        assertEq(2, len(content.split(end)), 'currently can only appear once', end, origLine)\n        before = content.split(start)[0]\n        inside = content.split(start)[1].split(end)[0]\n        inside = inside.replace(' ', '__space__')\n        after = content.split(end)[1]\n        return before + start + inside + end + after\n    s = removeSpacesWithinCh(s, 'MANY\\x01\\x01', '\\x01\\x01ENDMANY')\n    s = removeSpacesWithinCh(s, 'MANYSEP\\x01\\x01', '\\x01\\x01ENDMANYSEP')\n    s = removeSpacesWithinCh(s, 'ATLEASTONESEP\\x01\\x01', '\\x01\\x01ENDATLEASTONESEP')\n    \n    return re.split('\\s+', s.strip())\n\ndef buildRuleDefinition(out, lst, origLine):\n    helpTrackContext = []\n    i=-1\n    while i < len(lst)-1:\n        i+=1\n        item = lst[i]\n        item = item.strip()\n        if item.startswith('MANY\\x01\\x01') or item.startswith('MANYSEP\\x01\\x01') or item.startswith('ATLEASTONESEP\\x01\\x01'):\n            handleSpecial(item, out, origLine)\n        elif item == '{':\n            # begin an alternate\n            if lst[i+1].startswith('MAX_LOOKAHEAD'):\n                i+=1\n                a, lookahead = lst[i].split('=')\n                out.append('this.OR000({')\n                out.append(f'MAX_LOOKAHEAD: {lookahead.strip()},')\n                out.append(f'DEF: [')\n                out.append('{')\n                out.append('ALT: () => {')\n                helpTrackContext.append('OR_WITH_OPTIONS')\n            else:\n                out.append('this.OR000([')\n                out.append('{')\n                out.append('ALT: () => {')\n                helpTrackContext.append('OR')\n        elif item == '|':\n            # add an alternate\n            out.append('}')\n            out.append('},')\n            out.append('{')\n            out.append('ALT: () => {')\n            assertTrue(len(helpTrackContext) > 0, origLine)\n            assertTrue(helpTrackContext[-1].startswith(\"OR\"), origLine)\n        elif item == '}':\n            # close an alternate\n            assertTrue(len(helpTrackContext) > 0, origLine)\n            if helpTrackContext[-1]=='OR':\n                out.append('}')\n                out.append('}')\n                out.append(']);')\n            elif helpTrackContext[-1]=='OR_WITH_OPTIONS':\n                out.append('}')\n                out.append('}')\n                out.append(']});')\n            else:\n                assertTrue(helpTrackContext[-1].startswith(\"OR\"), origLine)\n            helpTrackContext.pop()\n        elif item == '[':\n            # begin an option\n            out.append('this.OPTION000(() => {')\n            helpTrackContext.append('OPTION')\n        elif item == ']':\n            # close an option\n            out.append('});')\n            assertTrue(len(helpTrackContext) > 0, origLine)\n            assertEq(\"OPTION\", helpTrackContext[-1], origLine)\n            helpTrackContext.pop()\n        else:\n            renderSimpleEntry(out, item, origLine, f'unknown symbol/character ({item})')\n    \n    assertEq(0, len(helpTrackContext), origLine)\n\ndef renderSimpleEntry(out, item, origLine, context):\n    tp = determineEntry(item, origLine, otherOk=True)\n    if tp == 'token':\n        out.append(f'this.CONSUME000({renderToken(item)})')\n    elif tp == 'rule':\n        out.append(f'this.SUBRULE000({renderRule(item)})')\n    else:\n        assertTrue(False, context, origLine)\n\ndef popIfEquals(lst, expect, origLine):\n    assertEq(expect, lst[-1], 'or group with only one option?', origLine)\n    lst.pop()\n\ndef handleSpecial(item, out, origLine):\n    type = item.split('\\x01')[0]\n    contents = item.split('\\x01')[2]\n    contents = contents.replace('__space__', ' ')\n    contentsList = re.split('\\s+', contents.strip())\n    if type == 'ATLEASTONESEP' or type == 'MANYSEP':\n        outText = 'AT_LEAST_ONE_SEP' if type == 'ATLEASTONESEP' else 'MANY_SEP'\n        assertEq(3, len(contentsList), f'{type} expects {{a / b}}', origLine )\n        assertEq('token', determineEntry(contentsList[0], origLine, otherOk=True), f'{type} currently  expects first part to be a token', origLine )\n        assertEq('/', contentsList[1], f'{type} currently  expects 2nd part to be a /', origLine )\n        assertEq('rule', determineEntry(contentsList[2], origLine, otherOk=True), f'{type} currently  expects 3rd part to be a subrule', origLine )\n        out.append(f'this.{outText}000' + '({')\n        out.append(f'SEP: {renderToken(contentsList[0])},')\n        out.append('DEF: () => {')\n        out.append(f'this.SUBRULE000({renderRule(contentsList[2])});')\n        out.append('}')\n        out.append('});')\n    elif type=='MANY':\n        out.append(f'this.{type}000' + '(() => {')\n        for item in contentsList:\n            renderSimpleEntry(out, item, origLine, 'a MANY block can only contain simple subrules+tokens')\n            \n        out.append('});')\n    else:\n        assertTrue(False, 'unknown type', type)\n        \ndef determineEntry(s, origLine, otherOk, moreContext=''):\n    if s.startswith('<') and s.endswith('>'):\n        return 'rule'\n    elif s.startswith('_') or s.startswith('tk'):\n        return 'token'\n    else:\n        if otherOk:\n            return '(other)'\n        else:\n            assertTrue(False, f'not a rule or token, what is it? ({s})', moreContext, origLine)\n\ndef renderToken(s):\n    return 'tks.' + s\ndef renderRule(s):\n    if s.startswith('<'):\n        assertTrue(s.endswith('>'), s)\n        s = s[1:-1]\n    return f'this.Rule{s}'\n    \ndef addNumeralsIm(lines, plainSearch, reSearch, sophisticated=False):\n    assertTrue(plainSearch in reSearch)\n    assertTrue('000' in plainSearch)\n    count = 0\n    haveSeen = {}\n    for i, line in enumerate(lines):\n        fnd = re.search(reSearch, line)\n        if fnd:\n            if sophisticated:\n                assertTrue(len(fnd.group(1)) > 0)\n                key = fnd.group(1).replace(' ','').replace('\\t','').replace(';','')\n                if key not in haveSeen:\n                    haveSeen[key] = 0\n                haveSeen[key] += 1\n                newFnName = plainSearch.replace('000', str(haveSeen[key]))\n                lines[i] = line.replace(plainSearch, newFnName)\n            else:\n                count += 1\n                newFnName = plainSearch.replace('000', str(count))\n                lines[i] = line.replace(plainSearch, newFnName)\n\ndef addNumerals(lines):\n    # these ones are more sophisticated- only increment the number if the actual string inside matches too\n    addNumeralsIm(lines, 'CONSUME000', r'this\\.CONSUME000(\\([^)]+\\))', True)\n    addNumeralsIm(lines, 'SUBRULE000', r'this\\.SUBRULE000(\\([^)]+\\))', True)\n    # these ones are more basic - increment every time we see an option(), even if the insides are different and we don't have to\n    # probably fine though, since there won't be too many of these\n    addNumeralsIm(lines, 'OPTION000', r'this\\.OPTION000\\(\\(\\) => {')\n    addNumeralsIm(lines, 'OR000', r'(this\\.OR000\\(\\[|this\\.OR000\\({)')\n    addNumeralsIm(lines, 'AT_LEAST_ONE_SEP000', r'this\\.AT_LEAST_ONE_SEP000\\(')\n    addNumeralsIm(lines, 'MANY_SEP000', r'this\\.MANY_SEP000\\(')\n    addNumeralsIm(lines, 'MANY000', r'this\\.MANY000\\(')\n\n\ndef writeIntoOutput(f, s):\n    content = files.readAll(f, encoding='utf-8')\n    assertEq(2, len(content.split(gStart)), 'must appear once', f, gStart)\n    assertEq(2, len(content.split(gEnd)), 'must appear once', f, gEnd)\n    before = content.split(gStart)[0]\n    after = content.split(gEnd)[1]\n    news = before + gStart + s + gEnd + after\n    files.writeAll(f, news, encoding='utf-8')\n\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/producetokens.py",
    "content": "from readgrammarinput import *\n\nimport re\n\ndef goTokensDefnOne(st):\n    out = []\n    out.append('')\n    \n    assertEq('tkIdentifier', st.tokens[-1].name,\n        'expect the last to be tkIdentifier')\n    \n    # the fake map\n    out.append('/* as a map so that we get quick access */')\n    out.append('export const tks = {')\n    for tk in st.tokens:\n        out.append(f'{tk.name}: undefined as any as chevrotain.TokenType,')\n    out.append('}')\n    out.append('export const allVpcTokens:chevrotain.TokenType[] = []')\n    out.append('')\n    out.append('')\n    \n    # the map, and the creation\n    out.append('/* as a map so that we get quick access */')\n    out.append('export function initAllVpcTokens() {')\n    out.append('if (!tks.tkStringLiteral) {')\n    for tk in st.tokens:\n        out.append(f'tks.{tk.name} = chevrotain.createToken' + '({')\n        out.append(f'name: \"{tk.name}\",')\n        out.append(f'pattern: {getPatternFromTk(tk)},')\n        if tk.tokenParams:\n            out.append(tk.tokenParams + ',')\n        out.append('});')\n    out.append('}')\n    out.append('')\n    out.append('Object.freeze(tks);')\n    out.append('')\n    \n    # the array (needed since order matters)\n    out.append('/* as an array, since order matters */')\n    out.append('if (allVpcTokens.length <= 1) {')\n    for i, tk in enumerate(st.tokens):\n        out.append(f'allVpcTokens[{i}] = tks.{tk.name}')\n    out.append('Object.freeze(allVpcTokens);')\n    out.append('')\n    out.append('}')\n    \n    # the listOfAllWordLikeTokens\n    out.append('if (!listOfAllWordLikeTokens[\"stack\"]) {')\n    for v, tk in getListOfWordLikeTokens(st.tokens, True):\n        out.append(f\"listOfAllWordLikeTokens['{v.lower()}'] = tks.{tk.name};\")\n    out.append('manuallyAddToListOfAllWordLikeTokens();')\n    out.append('Object.freeze(listOfAllWordLikeTokens);')\n    \n    out.append('}')\n    out.append('}')\n    out.append('')\n    out.append('')\n    \n    # add to list of alsoReservedWordsList\n    addToListOfReservedWords(st, out, st.tokens)\n    \n    # this simply helps us syntax-check for spelling typos\n    out.append('/* so that we\\'ll get compile-time error if a rule name is misspelled */')\n    out.append('export const tkstr = {')\n    for rule in st.rules:\n        out.append(f\"    Rule{rule.name}: 'Rule{rule.name}',\")\n    for tk in st.tokens:\n        out.append(f\"    {tk.name}: '{tk.name}',\")\n    out.append('}')\n    out.append('')\n    out.append('')\n    \n    return out\n\ndef getPatternFromTk(tk):\n    if tk.type == 'regex':\n        theRe = tk.val\n    elif tk.type == 'OneOfWords':\n        theRe = '/'\n        # why not put it into one group, like (abc|def){{nothingdirectlyafter}}\n        # for a simpler expression? I think this led to problems in safari browser.\n        for item in tk.val:\n            theRe += '(?:' # start non capturing group\n            theRe += item\n            theRe += '{{nothingdirectlyafter}}'\n            theRe += ')' # end non capturing group\n            theRe += '|'\n            \n        if theRe.endswith('|'):\n            theRe = theRe[0:-1]\n        theRe += '/'\n    elif tk.type == 'OneOfOr':\n        # similar to OneOfWords, but something can come directly after\n        theRe = '/'\n        for item in tk.val:\n            theRe += '(?:' # start non capturing group\n            theRe += item\n            theRe += ')' # end non capturing group\n            theRe += '|'\n            \n        if theRe.endswith('|'):\n            theRe = theRe[0:-1]\n        theRe += '/'\n    else:\n        assertTrue('unknown type', tk.type)\n    \n    theRe = theRe.replace('{{nothingdirectlyafter}}', '(?![a-zA-Z0-9_])')\n    assertTrue(theRe.startswith('/'), theRe)\n    assertTrue(theRe.endswith('/'), theRe)\n    theRe += 'i' # everything is case insensitive\n    return theRe\n\ndef getListOfWordLikeTokens(tokens, includeAllProperties):\n    skipped = 0\n    propertiesToSkip = ('tkAllUnaryPropertiesIfNotAlready', 'tkAllNullaryOrUnaryPropertiesIfNotAlready', 'tkUnaryVipercardProperties')\n    for tk in tokens:\n        if not includeAllProperties and tk.name in propertiesToSkip:\n            skipped += 1\n            continue\n        if tk.type == 'OneOfWords':\n            for v in tk.val:\n                if v != v.lower():\n                    assertTrue(False, 'probably safer to make this lowercase', tk.origLine)\n                v = v.lower()\n                isPlural = None\n                if v.endswith('?'):\n                    isPlural = v[-2]\n                    v = v[0:-2]\n                assertTrue(v.isalnum(), \"does not look like a word? we don't really yet support regex in OneOfWords\", tk.origLine)\n                if isPlural:\n                    yield (v + isPlural, tk)\n                yield (v, tk)\n        elif tk.type == 'OneOfOr':\n            for v in tk.val:\n                if v.isalnum():\n                    warn(f'this looks like a word, maybe use OneOfWords and not OneOfOr?', tk.val, tk.origLine)\n        elif tk.type == 'regex':\n            if tk.val.replace('/', '').isalnum():\n                warn(f'this looks like a word, maybe use OneOfWords and not regex?', tk.val, tk.origLine)\n        else:\n            assertTrue('unknown type', tk.type)\n    if not includeAllProperties:\n        assertEq(3, skipped, 'expected to skip prooperties- were any of these renamed?\\n', propertiesToSkip)\n\ndef addToListOfReservedWords(st, out, tokens):\n    out.append('')\n    out.append('')\n    for v, tk in getListOfWordLikeTokens(tokens, False):\n        out.append(f\"alsoReservedWordsList['{v.lower()}'] = true;\")\n    out.append('')\n    out.append('')\n    \n    out.append('/* map word-like tokens to the token type, useful for ')\n    out.append(' fabricating new tokens in rewrite stage. */')\n    out.append('export const listOfAllWordLikeTokens:{ [key: string]: chevrotain.TokenType } = { }')\n    out.append('')\n    out.append('')\n    \n    out.append('/* list commands, even the ones we don\\'t support. */')\n    out.append('export const listOfAllBuiltinCommandsInOriginalProduct:{ [key: string]: boolean } = { }')\n    out.append('')\n    did = {}\n    for v in st.listCommands:\n        s = v.split(' ')[0].lower()\n        did[s] = True\n        out.append(f\"listOfAllBuiltinCommandsInOriginalProduct['{s}'] = true;\")\n    out.append(\"/* ones we've defined */\")\n    for rule in st.rules:\n        if rule.name.startswith('BuiltinCmd'):\n            s = rule.name[len('BuiltinCmd'):].lower()\n            if s not in did:\n                out.append(f\"listOfAllBuiltinCommandsInOriginalProduct['{s}'] = true;\")\n    out.append('')\n    \n    out.append('/* list events, even the ones we don\\'t support. */')\n    out.append('export const listOfAllBuiltinEventsInOriginalProduct:{ [key: string]: boolean } = { }')\n    out.append('')\n    for v in st.listEvents:\n        out.append(f\"listOfAllBuiltinEventsInOriginalProduct['{v.split(' ')[0].lower()}'] = true;\")\n    out.append('')\n    \n    out.append('/* it would be too restrictive to say a variable can only be a tkidentifier. */')\n    out.append('export function couldTokenTypeBeAVariableName(t: chevrotain.IToken) {')\n    for rule in st.rules:\n        if rule.name == 'HAnyAllowedVariableName':\n            s = 'return '\n            for item in re.split(r'\\s+', rule.val):\n                if item != '{' and item != '|' and item != '}' and item:\n                    s += f't.tokenType === tks.{item} ||'\n            s = s[0:-2]\n            out.append(s)\n    out.append('}')\n    out.append('')\n    \n\ndef writePropertiesListIntoGrammar(infiles):\n    # a first pass without our generated ones\n    tempst = readGrammarFiles(infiles, skipGenerated=True)\n    tempst.listPropertiesUnary = tempst.listProperties\n    alreadyAToken = {}\n    for wordLikeToken, tk in getListOfWordLikeTokens(tempst.tokens, True):\n        alreadyAToken[wordLikeToken] = True\n        \n    s = ''\n    s += '\\ntkAllUnaryPropertiesIfNotAlready=OneOfWords('\n    s += ','.join((s.lower().strip() for s in tempst.listProperties if not s.lower().strip() in alreadyAToken))\n    s += ')'\n    s += '\\n'\n    s += '\\ntkAllNullaryOrUnaryPropertiesIfNotAlready=OneOfWords('\n    s += ','.join((s.lower().strip() for s in tempst.listPropertiesNullaryOrUnary if not s.lower().strip() in alreadyAToken))\n    s += ')'\n    s += '\\n'\n    \n    s += \"\\n/* we've automatically searched through all word-like tokens to check for any overlap (like how _id is both a token and a property name) */\"\n    \n    addAlreadyTokens = [('_' + s.lower().strip()) for s in tempst.listPropertiesUnary if s.lower().strip() in alreadyAToken]\n    addAlreadyTokens.extend([('_' + s.lower().strip()) for s in tempst.listPropertiesNullaryOrUnary if s.lower().strip() in alreadyAToken])\n    if addAlreadyTokens:\n        s += '\\nHAllPropertiesThatCouldBeUnary:={tkAllUnaryPropertiesIfNotAlready | tkUnaryVipercardProperties | tkAllNullaryOrUnaryPropertiesIfNotAlready |'\n        s += '|'.join(addAlreadyTokens)\n        s += '}'\n    else:\n        s += '\\nHAllPropertiesThatCouldBeUnary:={ tkAllUnaryPropertiesIfNotAlready | tkUnaryVipercardProperties | tkAllNullaryOrUnaryPropertiesIfNotAlready }'\n    s += '                      --->ProcessOr--->IToken'\n    \n    addAlreadyTokens = [('_' + s.lower().strip()) for s in tempst.listPropertiesNullary if s.lower().strip() in alreadyAToken]\n    addAlreadyTokens.extend([('_' + s.lower().strip()) for s in tempst.listPropertiesNullaryOrUnary if s.lower().strip() in alreadyAToken])\n    if addAlreadyTokens:\n        s += '\\nHAnyFnNameOrAllPropertiesThatCouldBeNullary:={ <HAnyFnName> | tkAllNullaryOrUnaryPropertiesIfNotAlready |'\n        s += '|'.join(addAlreadyTokens)\n        s += '}'\n    else:\n        s += '\\nHAnyFnNameOrAllPropertiesThatCouldBeNullary:={ <HAnyFnName> | tkAllNullaryOrUnaryPropertiesIfNotAlready }'\n    s += '                      --->ProcessOr--->IToken'\n    \n    addAlreadyTokens = [('_' + s.lower().strip()) for s in tempst.listFunctions if s.lower().strip() in alreadyAToken]\n    if addAlreadyTokens:\n        s += '\\nHAnyFnName:= { tkIdentifier | '\n        s += '|'.join(addAlreadyTokens)\n        s += '}'\n    else:\n        s += '\\nHAnyFnName:=  tkIdentifier '\n    s += '                      --->ProcessOr--->IToken'\n    \n    s += '\\n'\n    return s\n    \ndef checkThatEveryTokensIsReferencedInARule(st, outfiles):\n    trace('checking that every token is referenced in the parser...')\n    contents = files.readAll(outfiles.parse, encoding = 'utf-8')\n    inside = contents.split(gStart)[1].split(gEnd)[0]\n    namesOkIfNotSeen = dict(tkNewLine=True, tkSyntaxMark=True)\n    for token in st.tokens:\n        if 'SKIPPED' not in token.tokenParams and not token.name in namesOkIfNotSeen:\n            searchFor = r'\\btks\\.' + token.name + r'\\b'\n            found = re.search(searchFor, inside)\n            if not found:\n                trace('warn: not found: ', token.name)\n    trace('done.')\n    "
  },
  {
    "path": "vipercard/vipercard/tools/genparse/producevisitor.py",
    "content": "\nfrom readgrammarinput import *\nfrom produceparser import *\nimport itertools\nimport sys\nsys.path.append('../add-assert-markers')\nimport base90\n\ndef goForVisitorInterface(st):\n    out = []\n    out.append('')\n    out.append('')\n    out.append('/* ensures we have all the expected Rule methods */')\n    out.append('export interface VpcCompleteVisitor {')\n    for rule in st.rules:\n        out.append(f'    Rule{rule.name}(ctx: VisitingContext): {rule.ruleVisitorReturnType};')\n    out.append('}')\n    out.append('')\n    out.append('/* for nicer auto-complete in a visitor implementation */')\n    out.append('export interface VisitingContext {')\n    out.append('/* you can add something like [index: string]: any if you want to */')\n    out.append('/* silence type errors during development */')\n    for rule in st.rules:\n        out.append(f'    Rule{rule.name}: any[];')\n    for tk in st.tokens:\n        out.append(f'    {tk.name}: ChvITk[];')\n    out.append('}')\n    out.append('')\n    out.append('')\n    return out\n    \ndef splitListByDelim(lst, delim):\n    # credit: https://stackoverflow.com/questions/15357830/python-splitting-a-list-based-on-a-delimiter-word\n    # doesn't work as expected with repeated delims or with delim at beginning or end of list\n    for i in range(len(lst) - 1):\n        if lst[i]==delim and lst[i+1]==delim:\n            assertTrue(False, \"this doesn't support repeated delims\")\n    ret = [list(y) for x, y in itertools.groupby(lst, lambda z: z == delim) if not x]\n    if lst[0] == delim:\n        ret.insert(0, [])\n    if lst[-1] == delim:\n        ret.append([])\n    return ret\n    \ndef checkIfDuplicates(listOfElems):\n    # credit: https://thispointer.com/python-3-ways-to-check-if-there-are-duplicates-in-a-list/\n    setOfElems = set()\n    for elem in listOfElems:\n        if elem in setOfElems:\n            return elem\n        else:\n            setOfElems.add(elem)         \n    return None\n\ndef makeAllVisitors(st):\n    out = []\n    maker = MakingVisitors()\n    for rule in st.rules:\n        if rule.ruleVisitorOpts:\n            methodName = 'goMake'+rule.ruleVisitorOpts[0]\n            method = getattr(maker, methodName)\n            assertTrue(method, 'unknown visitor method', methodName)\n            out.append('')\n            out.append('')\n            out.extend(method(rule, rule.ruleVisitorOpts, rule.ruleVisitorReturnType))\n    out.append('')\n    giveAssertMarks(out)\n    return out\n            \ndef renderTokenForVisitor(s):\n    return s\n    \ndef renderRuleForVisitor(s):\n    if s.startswith('<'):\n        assertTrue(s.endswith('>'), s)\n        s = s[1:-1]\n    return f'Rule{s}'\n\nclass MakingVisitors(object):\n    def goMakeProcessOr(self, rule, visitorOpts, returnType):\n        # we'll look at the last one before the | \n        assertEq('ProcessOr', visitorOpts[0])\n        lst = goPrepRule(rule.val, rule.origLine)\n        options = []\n        pts = splitListByDelim(lst, '{')\n        assertEq(2, len(pts), 'expected to see exactly one {', rule.origLine)\n        pts2 = splitListByDelim(pts[1], '}')\n        assertEq(2, len(pts2), 'expected to see exactly one }', rule.origLine)\n        inside = pts2[0]\n        # split by |\n        rawOptions = splitListByDelim(inside, '|')\n        assertTrue(len(rawOptions) > 1, 'only one option?', rule.origLine)\n        for item in rawOptions:\n            item = [s for s in item if not s.startswith('MAXLOOKAHEAD')]\n            type = determineEntry(item[-1], rule.origLine, otherOk=False, moreContext=\\\n                'for ProcessOr we take the last of the option (e.g. { a b | c } we check for just b and c, and it must be a plain token or rule')\n            options.append(item[-1])\n        \n        hasDupe = checkIfDuplicates(options)\n        assertTrue(not hasDupe, f\"can't use processOr because there is a duplicate ({hasDupe})\", rule.origLine)\n        \n        # build the code!\n        return self._buildFromCheckingListOfTokensOrRules(rule, visitorOpts, returnType, options)\n    \n    def goMakeCustomOr(self, rule, visitorOpts, returnType):\n        assertEq('CustomOr', visitorOpts[0])\n        return self._buildFromCheckingListOfTokensOrRules(rule, visitorOpts, returnType, visitorOpts[1:])\n    \n    def _buildFromCheckingListOfTokensOrRules(self, rule, visitorOpts, returnType, options):\n        assertTrue(len(options) > 0)\n        out = []\n        out.append(f'Rule{rule.name}(ctx: VisitingContext): {returnType} ' + '{')\n        branches = []\n        for item in options:\n            type = determineEntry(item, rule.origLine, otherOk=False)\n            if type == 'rule':\n                branches.append(f'if (ctx.{renderRuleForVisitor(item)} && ctx.{renderRuleForVisitor(item)}[0]) {{\\n return this.visit(ctx.{renderRuleForVisitor(item)}[0]); \\n}}')\n            elif type == 'token':\n                maybeGetImage = '.image' if returnType=='string' else ''\n                branches.append(f'if (ctx.{renderTokenForVisitor(item)} && ctx.{renderTokenForVisitor(item)}[0]) {{\\n return ctx.{renderTokenForVisitor(item)}[0]{maybeGetImage}; \\n}}')\n        out.append('\\n else \\n'.join(branches))\n        out.append(\" else { checkThrowInternal(false, '%MARK%OR in \" + rule.name + \", no branch found'); }\")\n        out.append('}')\n        return out\n        \n    def goMakeBuildMap(self, rule, visitorOpts, returnType):\n        assertEq('BuildMap', visitorOpts[0])\n        assertEq(1, len(visitorOpts))\n        assertEq('IntermedMapOfIntermedVals', returnType)\n        out = []\n        out.append(f'Rule{rule.name}(ctx: VisitingContext): {returnType} ' + '{')\n        out.append('return this.H$BuildMap(ctx);')\n        out.append('}')\n        return out\n    def goMakeConstant(self, rule, visitorOpts, returnType):\n        assertEq('Constant', visitorOpts[0])\n        assertEq(2, len(visitorOpts))\n        out = []\n        out.append(f'Rule{rule.name}(ctx: VisitingContext): {returnType} ' + '{')\n        out.append(f'return {visitorOpts[1]};')\n        out.append('}')\n        return out\n    def goMakeBuildExpr(self, rule, visitorOpts, returnType):\n        template = \"\"\"\n        %METHODNAME%(ctx: VisitingContext): VpcVal {\n            let operatorList = ctx.%OPERATORNAME%\n            let operatorListLen = operatorList ? operatorList.length : 0\n            if (!ctx.%NEXTRULE% || !ctx.%NEXTRULE%.length || operatorListLen + 1 !== ctx.%NEXTRULE%.length) {\n                checkThrowInternal(false, `%MARK%%METHODNAME%:${operatorListLen},${ctx.%NEXTRULE%.length}.`);\n            }\n\n            let total = this.visit(ctx.%NEXTRULE%[0]);\n            checkThrow(total instanceof VpcVal, '%MARK%%METHODNAME%: first not a vpcval');\n            const oprulecategory = VpcOpCtg.%OPCATEGORY%;\n            for (let i = 0; i < operatorListLen; i++) {\n                let whichop = %GETOPIMAGE%;\n                checkThrow(typeof whichop === 'string', '%MARK%%METHODNAME%: op not a string');\n                let val1 = total;\n                let val2 = this.visit(ctx.%NEXTRULE%[i + 1]);\n                total = this.evalHelp.evalOp(val1, val2, oprulecategory, whichop);\n                checkThrow(total instanceof VpcVal, '%MARK%%METHODNAME%: not a vpcval');\n            }\n\n            return total;\n        }\n        \"\"\"\n        assertEq(4, len(visitorOpts), rule.origLine)\n        assertEq('VpcVal', returnType)\n        assertEq('BuildExpr', visitorOpts[0])\n        operator = visitorOpts[1]\n        nextRule = visitorOpts[2]\n        opCategory = visitorOpts[3]\n        replacements = {}\n        replacements['METHODNAME'] = 'Rule' + rule.name\n        replacements['NEXTRULE'] = renderRuleForVisitor(nextRule)\n        replacements['OPCATEGORY'] = opCategory\n        operatorType = determineEntry(operator, rule.origLine, otherOk=False)\n        if operatorType=='rule':\n            replacements['OPERATORNAME'] = renderRuleForVisitor(operator)\n            replacements['GETOPIMAGE'] = f\"\"\"this.visit(ctx.{renderRuleForVisitor(operator)}[i])\"\"\"\n        else:\n            replacements['OPERATORNAME'] = renderTokenForVisitor(operator)\n            replacements['GETOPIMAGE'] = f\"\"\"ctx.{renderTokenForVisitor(operator)}[i].image\"\"\"\n        \n        out = template\n        for replacement in replacements:\n            out = out.replace(f'%{replacement}%', replacements[replacement])\n        \n        out = out.replace('\\r\\n', '\\n').split('\\n')\n        return out\n    def goMakeCustom(self, rule, visitorOpts, returnType):\n        # do nothing, the user will write it\n        assertEq('Custom', visitorOpts[0])\n        assertEq(1, len(visitorOpts))\n        return []\n\ndef giveAssertMarks(out):\n    current = 7000\n    for i, line in enumerate(out):\n        if '%MARK%' in line:\n            current += 1\n            s = base90.toBase90(current)\n            assertEq(2, len(s), 'unexpected length')\n            out[i] = line.replace('%MARK%', f'{s}|')\n\ndef tests():\n    assertEq([[], ['b', 'c']], splitListByDelim('a,b,c'.split(','), 'a'))\n    assertEq([['a'],  ['c']], splitListByDelim('a,b,c'.split(','), 'b'))\n    assertEq([['a', 'b'],  []], splitListByDelim('a,b,c'.split(','), 'c'))\n    assertException(lambda: splitListByDelim('a,b,b,c'.split(','), 'b'), AssertionError, 'support repeated')\n    \ntests()\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/genparse/readgrammarinput.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nimport os\nimport sys\nimport re\nsys.path.append('../typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_common import *\n\ndef readGrammarFiles(files, skipGenerated):\n    result = Bucket(tokens=[], rules=[])\n    for file in files:\n        readGrammarFile(file, result, skipGenerated)\n    return result\n\ndef readGrammarFile(file, result, skipGenerated):\n    content = files.readAll(file, encoding='utf-8')\n    content = content.replace('\\\\\\n', ' ') # continued lines\n    if skipGenerated and gStart in content:\n        content = content.split(gStart)[0] + '\\n' + content.split(gEnd)[1]\n    if 'list-all' in files.getName(file):\n        return readListFile(result, file, content.split('\\n'))\n    for line in content.split('\\n'):\n        line = line.strip()\n        if not line or line.startswith('//') or line.startswith('/*'):\n            continue\n        \n        withoutLetters = re.sub('\\w+', '', line).strip()\n        if withoutLetters.startswith(':='):\n            # it is a Rule\n            processRule(result, line)\n        elif withoutLetters.startswith('='):\n            # it is a Token\n            processToken(result, line)\n        else:\n            assertTrue(False, f'unknown type ({withoutLetters})', line)\n\n\ndef processToken(result, line):\n    ret = Bucket()\n    tokenName, tokenDefn = (s.strip() for s in line.split('=', 1))\n    if '|||||' in tokenDefn:\n        tokenDefn, tokenParams = (s.strip() for s in tokenDefn.split('|||||'))\n    else:\n        tokenParams = ''\n    \n    if tokenDefn.startswith('/') and tokenDefn.endswith('/'):\n        ret.type = 'regex'\n        ret.val = tokenDefn\n    elif tokenDefn.startswith('OneOfWords(') and tokenDefn.endswith(')'):\n        tokenDefn = tokenDefn[len('OneOfWords('): -len(')')]\n        ret.type = 'OneOfWords'\n        ret.val = [s.strip() for s in tokenDefn.split(',')]\n    elif tokenDefn.startswith('OneOfOr(') and tokenDefn.endswith(')'):\n        tokenDefn = tokenDefn[len('OneOfOr('): -len(')')]\n        assertTrue('|or|' in line, line)\n        ret.type = 'OneOfOr'\n        ret.val = [s.strip() for s in tokenDefn.split('|or|')]\n    else:\n        assertTrue(False, f'unknown type ({tokenDefn})', line)\n    \n    ret.tokenParams = tokenParams\n    ret.origLine = line\n    ret.name = tokenName\n    result.tokens.append(ret)\n\ndef processRule(result, line):\n    ret = Bucket()\n    ruleName, ruleDefn = (s.strip() for s in line.split(':=', 1))\n    if ruleName.startswith('BuiltinCmd'):\n        assertTrue(ruleDefn.startswith('...'), line)\n        if not '--->' in ruleDefn:\n            ruleDefn += '    --->BuildMap'\n    \n    ruleVisitor = ''\n    ruleVisitorReturnType = ''\n    if '--->' in ruleDefn:\n        ruleDefn, ruleVisitor = (s.strip() for s in ruleDefn.split('--->', 1))\n        if '--->' in ruleVisitor:\n            ruleVisitor, ruleVisitorReturnType = (s.strip() for s in ruleVisitor.split('--->', 1))\n    else:\n        warn(\"---> not seen. this is fine if you're not making visitors yet\", line)\n    \n    ret.ruleVisitorOpts = [s.strip() for s in ruleVisitor.split('|') if s.strip()]\n    if ret.ruleVisitorOpts and ret.ruleVisitorOpts[0] == 'Constant' and (ret.ruleVisitorOpts[1].startswith(\"'\") or ret.ruleVisitorOpts[1].startswith('\"')) and not ruleVisitorReturnType:\n        ruleVisitorReturnType = 'string'\n    if ret.ruleVisitorOpts and ret.ruleVisitorOpts[0] == 'BuildExpr':\n        ruleVisitorReturnType = 'VpcVal'\n    if ret.ruleVisitorOpts and ret.ruleVisitorOpts[0] == 'BuildMap':\n        ruleVisitorReturnType = 'IntermedMapOfIntermedVals'\n    if ruleVisitorReturnType == 'IToken':\n        ruleVisitorReturnType = 'ChvITk'\n    if not ruleVisitorReturnType:\n        ruleVisitorReturnType = 'string | VpcIntermedValBase'\n    ruleDefn = ruleDefn.replace('...', 'tkSyntaxMark tkSyntaxMark tkSyntaxMark ')\n    ret.ruleVisitorReturnType = ruleVisitorReturnType\n    ret.origLine = line\n    ret.name = ruleName\n    ret.val = ruleDefn\n    \n    \n    result.rules.append(ret)\n \ndef readListFile(result, file, lines):\n    result.listPropertiesNullary = []\n    result.listPropertiesNullaryOrUnary = []\n    for line in lines:\n        line = line.strip()\n        line = line.split('//')[0]\n        line = line.strip()\n        if line:\n            if line.startswith('begin-'):\n                category = 'list' + line[len('begin-'):].title()\n                assertTrue(not hasattr(result, category))\n                curLst = []\n                setattr(result, category, curLst)\n            else:\n                if '-' in line:\n                    assertTrue(category == 'listProperties', 'only properties has -')\n                    line, subcategory = line.split('-')\n                    if subcategory == 'nullary':\n                        result.listPropertiesNullary.append(line)\n                    elif subcategory == 'nullaryOrUnary':\n                        result.listPropertiesNullaryOrUnary.append(line)\n                    else:\n                        assertTrue(False, 'unknown subcategory', line)\n                else:\n                    curLst.append(line)\n\ngStart = '/* generated code, any changes past this point will be lost: --------------- */'\ngEnd = '/* generated code, any changes above this point will be lost: --------------- */'\n\n "
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/check_for_long_lines.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom place_imports_one_line import *\nimport re\n\n# prettier ignores long lines in multiline comments,\n# so let's check ourselves.\n\nallowSlightlyLonger = 10\ncurrentPrintWidth = Bucket()\n    \ndef getWidthFromPrettierRcText(text):\n    parts = text.split('printWidth:')\n    if len(parts) <= 1:\n        return None\n    \n    parts[1] = parts[1].strip()\n    found = re.search(r'^(\\d+).*', parts[1])\n    if not found or not found.group(1):\n        return None\n    \n    try:\n        return int(found.group(1), 10)\n    except ValueError:\n        return None\n\ndef getCurrentPrintWidth(prettierCfg):\n    content = '\\n'.join(getFileLines(prettierCfg, tryToStripComments=True))\n    if not content:\n        alert('skipping test for long lines, could not find .prettierrc.js')\n        return None\n    \n    width = getWidthFromPrettierRcText(content)\n    if not width:\n        alert('skipping test for long lines, could not find \"printWidth:\" in .prettierrc.js')\n        return None\n    \n    return width\n\ndef checkCurrentQuoteChar(prettierCfg):\n    content = '\\n'.join(getFileLines(prettierCfg, tryToStripComments=True))\n    if 'singleQuote:true' in content.replace(' ', ''):\n        return True\n    elif 'singleQuote:false' in content.replace(' ', ''):\n        assertTrueMsg(False, \"this script hasn't been tested with double quotes (singleQuote:false)\", file=prettierCfg)\n    else:\n        assertTrueMsg(False, 'could not find singleQuote:true in prettierrc', file=prettierCfg)\n\ndef isLineTooLong(lines, i):\n    line = lines[i]\n    if len(line) > currentPrintWidth.val + allowSlightlyLonger:\n        prevLine = lines[i-1] if i>0 else ''\n        if not 'import { ' in line and not '/* prettier-ignore */' in prevLine:\n            if not 'deleteThis.longstr' in line: # the long-line helper put this here\n                return True\n    return False\n\ndef checkText(f, lines, prettierCfg):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    assertTrue(isinstance(prettierCfg, str))\n    if not hasattr(currentPrintWidth, 'val'):\n        currentPrintWidth.val =  getCurrentPrintWidth(prettierCfg)\n    if currentPrintWidth.val:\n        problemLines = []\n        for i, line in enumerate(lines):\n            if '/* check_long_lines_silence_subsequent */' in line:\n                return\n            elif isLineTooLong(lines, i):\n                problemLines.append((lines, i))\n        \n        # iterate backwards, so that as you fix the problems, the line numbers are still valid\n        problemLines.reverse()\n        for lines, i in problemLines:\n            line = lines[i]\n            trace(f'silence by putting /* check_long_lines_silence_subsequent */ earlier in the file')\n            trace(f'or /* prettier-ignore */ on the prior line')\n            showWarningGccStyle(f, i+1, f'length of line is {len(line)} which exceeds .prettierrc.js printWidth ({currentPrintWidth.val})')\n            warn('')\n\ndef tests():\n    assertEq(20, getWidthFromPrettierRcText('abc printWidth:20'))\n    assertEq(20, getWidthFromPrettierRcText('abc printWidth:20}'))\n    assertEq(20, getWidthFromPrettierRcText('abc printWidth:20 }'))\n    assertEq(20, getWidthFromPrettierRcText('abc printWidth:20, some other text'))\n    assertEq(20, getWidthFromPrettierRcText('abc printWidth:20 , some other text'))\n    assertEq(12, getWidthFromPrettierRcText('abc printWidth: 12'))\n    assertEq(12, getWidthFromPrettierRcText('abc printWidth: 12}'))\n    assertEq(12, getWidthFromPrettierRcText('abc printWidth: 12 }'))\n    assertEq(12, getWidthFromPrettierRcText('abc printWidth: 12, some other text'))\n    assertEq(12, getWidthFromPrettierRcText('abc printWidth: 12 , some other text'))\n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/check_for_null_coalesce.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom place_imports_one_line import *\nimport re\n\n'''\n@typescript-eslint/prefer-nullish-coalescing isn't strict enough, so add our own test\n\nok: if (a || b)\nok: while (a || b)\nok: for (i = 0; i < a || i < b; i++)\nwarn: var a = b || c;\nwarn: var a = (b || c);\nif ((a > b) ||\n    (c > d) ||\n    (e > f)) {\n}\n\nso since our prettier rules put semicolons on everything,\na good rule of thumb is:\nif the line ends with a ; it should not have a ||\n'''\n    \ndef simpleStripComments(s):\n    s = simpleStripMultilineComments(s, '/*', '*/')\n    # remove line comment\n    s = s.split('//')[0]\n    return s\n\ndef shouldWarnThisLine(line):\n    withoutComments = simpleStripComments(line)\n    withoutComments = withoutComments.strip()\n    if withoutComments.endswith(';'): \n        # the user can say || bool(condition) if it is truly logical or\n        # negative lookahead\n        if re.search(r'\\|\\| (?!bool)' , withoutComments):\n            if not withoutComments.startswith('assert'):\n                if not withoutComments.startswith('checkThrow'):\n                    return True\n\ndef checkText(f, lines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    for i, line in enumerate(lines):\n        if shouldWarnThisLine(line):\n            # for example, /* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing */\n            if i > 0 and 'prefer-nullish-coalescing' in lines[i-1]:\n                pass # ok, ignored\n            elif '/* bool */' in lines[i]:\n                pass # ok, ignored\n            else:\n                showWarningGccStyle(f, i+1, f'saw a || in a context that looks like nullish-coalescing')\n                trace(f'please use ?? instead or put /* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing */')\n                trace(f'on the prior line to silence this warning')\n                warn('')\n\n\ndef tests():\n    assertEq('abefij', simpleStripComments('ab/* cd */ef/* gh */ij'))\n    assertEq('abefij', simpleStripComments('ab/* /*cd */ef/* gh */ij'))\n    assertEq('abefij', simpleStripComments('ab/* /*c /*d */ef/* gh */ij'))\n    assertEq('abefij */', simpleStripComments('ab/* /*cd */ef/* gh */ij */'))\n    assertEq('abefij */i', simpleStripComments('ab/* /*cd */ef/* gh */ij */i'))\n    assertEq('abef', simpleStripComments('ab/* cd */ef/* gh ij'))\n    assertEq('', simpleStripComments('/*ab cd ef gh ij'))\n    assertEq('', simpleStripComments('/*ab cd /* ef gh ij'))\n    assertEq('', simpleStripComments('/*ab cd /* ef gh ij*/'))\n    assertEq('', simpleStripComments('/**/'))\n    assertEq('', simpleStripComments('/**//**//**/'))\n    assertEq('ab', simpleStripComments('a/**//**//**/b'))\n    assertEq('ab', simpleStripComments('a/*b*//*c*//*d*/b'))\n    assertEq('', simpleStripComments(''))\n    assertEq('abc', simpleStripComments('abc'))\n    assertEq('abc def', simpleStripComments('abc def'))\n    assertEq('abc ', simpleStripComments('abc //def'))\n    assertEq('abc ', simpleStripComments('abc //def//ghi'))\n    assertEq('abc ', simpleStripComments('abc //def//ghi//jkl'))\n    assertEq('abc ', simpleStripComments('abc /* def'))\n    assertEq('abc ', simpleStripComments('abc /* def*/'))\n    assertEq('abc d', simpleStripComments('abc /* def*/d'))\n    assertEq('abc d', simpleStripComments('abc /* def*/d/*'))\n    assertEq('abc d', simpleStripComments('abc /* def*/d/*more'))\n    assertEq('abc dtext', simpleStripComments('abc /* def*/d/*more*/text'))\n    assertEq('abc dtext', simpleStripComments('abc /* //def*/d/*more*/text'))\n    \n    assertTrue(not shouldWarnThisLine('if (a || b)'))\n    assertTrue(not shouldWarnThisLine('while (a || b)'))\n    assertTrue(not shouldWarnThisLine('for (i = 0; i < a || i < b; i++)'))\n    assertTrue(shouldWarnThisLine('var a = b || c;'))\n    assertTrue(shouldWarnThisLine('    var a = b || c;'))\n    assertTrue(shouldWarnThisLine('    let a = b || c;'))\n    assertTrue(shouldWarnThisLine('var a = b || c; // a comment'))\n    assertTrue(shouldWarnThisLine('var a = b || c; /* a comment'))\n    assertTrue(shouldWarnThisLine('var a = /* not safe */ b || c;'))\n    assertTrue(shouldWarnThisLine('var a = /* not safe */ b || c; /* a comment'))\n    assertTrue(shouldWarnThisLine('const a = /* not safe */ b || c; /* a comment'))\n    assertTrue(not shouldWarnThisLine('const a = /* is safe b || */ c; /* a comment'))\n    \n    assertTrue(not shouldWarnThisLine('assertTrue(a || b)'))\n    assertTrue(not shouldWarnThisLine('assertTrue(a || b);'))\n    assertTrue(not shouldWarnThisLine('    assertTrue(a || b)'))\n    assertTrue(not shouldWarnThisLine('    assertTrue(other(a || b))'))\n        \n    assertTrue(shouldWarnThisLine('    a || b;'))\n    assertTrue(shouldWarnThisLine('    return a || b;'))\n    assertTrue(not shouldWarnThisLine('    assert a || b;'))\n    assertTrue(not shouldWarnThisLine('    assertTrue(a || b);'))\n    assertTrue(not shouldWarnThisLine('    a || bool(b);'))\n    assertTrue(not shouldWarnThisLine('    bool(a) || bool(b);'))\n    \n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/check_more.py",
    "content": "from place_imports_one_line import *\n\ndef shouldWarnHasReplaceString(line):\n    # s.replace('a', 'b') only replaces once unlike most languages.\n    # we should warn you to use a regex like s.replace(/a/g, 'b' instead)\n    if re.search(r'''\\.replace\\(\\s*['\"`]''', line):\n        return True\n\ndef shouldWarnHasNewMap(line):\n    # don't use Map, they are es6 and we target es5\n    if re.search(r'''\\bnew Map\\b''', line):\n        return True\n\ndef shouldWarnArraysThisLine(line):\n    # let ar = []; silently gives you an array of type any!\n    # warn you to provide an explicit type\n    if re.search(r' [a-zA-Z0-9]+ = \\[\\]', line):\n        return True\n\ndef shouldWarnApplyCall(line, silent=False):\n    if '.apply(' in line:\n        if '/* warn-apply-ok */' in line:\n            return False\n        \n        withinParens = line.split('.apply(')[1].split(')')[0].strip()\n        if not withinParens:\n            if not silent:\n                trace('prettier put it onto many lines')\n            return True\n        if '(' in withinParens:\n            # a nested call like .apply(other()) that we're too lazy to parse\n            return True\n        if '...' in withinParens:\n            # something like [...args] is still dangerous\n            return True\n        justOneWord = '^(\\.|\\w)+$'\n        if re.search(justOneWord, withinParens):\n            return False\n        definiteList = '^(\\.|\\w)+, \\[.*?\\]$'\n        if re.search(definiteList, withinParens):\n            return False\n        return True\n        \n\ndef checkText(f, lines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    for i, line in enumerate(lines):\n        if shouldWarnArraysThisLine(line):\n            showWarningGccStyle(f, i+1, f'saw a statement like \"let ar = [];\" but we dissallow implicit any[] arrays')\n            trace(f'use \"let ar:any = [];\" if this was intended')\n            warn('')\n        if shouldWarnHasReplaceString(line):\n            showWarningGccStyle(f, i+1, f'''saw a statement like \"s.replace('a', 'b')\" but you usually mean \"s.replace(/a/g, 'b')\" ''')\n            warn('')\n        if shouldWarnApplyCall(line):\n            showWarningGccStyle(f, i+1, f'''apply like a.apply(b) or a.apply(b, [c, d]) are ok, not a.apply(b, args)''')\n            trace(f\"we think it's unsafe because there could be max arg limits.\")\n            trace(f'use /* warn-apply-ok */ if this was intended')\n            warn('')\n        if shouldWarnHasNewMap(line):\n            showWarningGccStyle(f, i+1, f'''don't use es6 maps, we target es5''')\n            warn('')\n            \n    # finds the case where it goes across different lines\n    allContent = '\\n'.join(lines)\n    if shouldWarnHasReplaceString(allContent):\n        showWarningGccStyle(f, 1,  f'''saw a statement like \"s.replace('a', 'b')\" but you usually mean \"s.replace(/a/g, 'b')\" ''')\n        warn('')\n\ndef tests():\n    assertTrue(shouldWarnArraysThisLine('let ar = [];'))\n    assertTrue(not shouldWarnArraysThisLine('let ar:mytype = [];'))\n    assertTrue(not shouldWarnArraysThisLine('let ar:number[] = [];'))\n    assertTrue(shouldWarnArraysThisLine(' ar = [];'))\n    assertTrue(not shouldWarnArraysThisLine(' ar:mytype = [];'))\n    assertTrue(not shouldWarnArraysThisLine(' ar:number[] = [];'))\n    \n    assertTrue(shouldWarnHasReplaceString('s.replace(\"a\", \"b\")'))\n    assertTrue(shouldWarnHasReplaceString(\"s.replace('a', 'b')\"))\n    assertTrue(not shouldWarnHasReplaceString('s.replace(/a/, \"b\")'))\n    assertTrue(not shouldWarnHasReplaceString('s.replace(/a/g, \"b\")'))\n    assertTrue(shouldWarnHasReplaceString('s.replace( \"a\", \"b\")'))\n    assertTrue(shouldWarnHasReplaceString('s.replace( \\n \"a\", \"b\")'))\n    assertTrue(shouldWarnHasReplaceString('s.replace(\\n\"a\", \"b\")'))\n    \n    assertTrue(not shouldWarnApplyCall('a.apply', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(\\n', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a, b', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a, b)', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a, b, c)', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a, b[0])', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a, [...args])', silent=True))\n    assertTrue(shouldWarnApplyCall('a.apply(a?b, b', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a)', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(abc)', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, [])', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a.b, [])', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, [0])', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, [0, 1, 2])', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, [0, [1], 2])', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, b, c) /* warn-apply-ok */', silent=True))\n    assertTrue(not shouldWarnApplyCall('a.apply(a, b[0]) /* warn-apply-ok */', silent=True))\n\n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/check_tests_referenced.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom place_imports_one_line import *\nimport re\n\n# all tests should be referenced\n\nstate = Bucket(needToReference={}, wereReferenced={}, alteredFile=False, pathTop=None)\n\ndef checkText(f, lines):\n    if f.lower().endswith('testtop.ts'):\n        getWereReferenced(f, lines)\n    else:\n        getNeedToReference(f, lines)\n\ndef getWereReferenced(f, origLines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(origLines, list))\n    assertTrueMsg(not state.pathTop, 'saw two testtop?', file=f)\n    state.pathTop = f\n    \n    # get the file without comments\n    # but let's allow single-line comments so that you can temporarily disable a test.\n    lines = getFileLines(f, tryToStripComments='multilineonly')\n    text = '\\n'.join(lines)\n    pts = text.split('let colls = [')\n    if len(pts) == 1:\n        pts = text.split('let colls: SimpleUtil512TestCollection[] = [')\n    assertTrueMsg(len(pts) == 2, f\"did not see 'let colls = ['\", file=f)\n    assertTrueMsg(']' in pts[1], f\"did not see ']' after let colls\", file=f)\n    listColls = pts[1].split(']')[0]\n    listColls = [s.strip() for s in re.split(',|\\n', listColls)]\n    for s in listColls:\n        s = s.replace('//~', '').replace('//', '').strip()\n        if s:\n            assertTrueMsg(re.match('^[a-zA-Z0-9_]+$', s), f'weird collection name \"{s}\"', file=f)\n            assertTrueMsg(not s in state.wereReferenced, 'dupe entry', s, file=f)\n            state.wereReferenced[s] = True\n    \ndef getNeedToReference(f, lines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    for i, line in enumerate(lines):\n        if 'new SimpleUtil512TestCollection' in line:\n            startWith1 = \"let t = new SimpleUtil512TestCollection('\"\n            startWith2 = \"t = new SimpleUtil512TestCollection('\"\n            assertTrueMsg(line.startswith(startWith1) or line.startswith(startWith2), \n                f'did not start with {startWith1}', file=f, linenum=i)\n            colName = line.replace(startWith1, '').replace(startWith2, '').split(\"'\")[0]\n            assertTrueMsg(not colName in state.needToReference, 'dupe name', colName, file=f, linenum=i)\n            state.needToReference[colName] = f\n            \n            # confirm that the next line is what we expect\n            expected = f'export let {colName} = t'\n            nextLine = lines[i+1]\n            assertTrueMsg(nextLine.startswith(expected), f'did not start with {expected}', file=f, linenum=i+1)\n\ndef autoHelpSetTestCollectionName(f, lines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    for i in range(len(lines)):\n        line = lines[i]\n        if \"new SimpleUtil512TestCollection('testCollectionMMMMMM')\" in line:\n            trace('automatically setting collection name')\n            lines[i] = f\"let t = new SimpleUtil512TestCollection('{getCollNameFromPath(f)}');\"\n            state.alteredFile = True\n        elif \"export let testCollectionMMMMMM = t\" in line:\n            trace('automatically setting collection name')\n            lines[i] = f\"export let {getCollNameFromPath(f)} = t;\"\n            state.alteredFile = True\n\ndef getCollNameFromPath(f):\n    nameWithNoExt = files.splitExt(files.getName(f))[0]\n    return 'testCollection' + nameWithNoExt.replace('test', '').replace('Test', '')\n\ndef checkTestCollectionsReferenced():\n    if state.alteredFile:\n        alert('skipping tests check because we modified a file, please run the script again')\n        return\n    \n    assertTrueMsg(len(state.needToReference), \"new SimpleUtil512TestCollection(' never seen?\")\n    assertTrueMsg(len(state.wereReferenced), \"testTop.ts not seen?\")\n    setExpected = set(state.needToReference.keys())\n    setGot = set(state.wereReferenced.keys())\n    gotAndNotExpected = '\\n'.join(setGot - setExpected)\n    expectedAndNotGot = '\\n'.join(setExpected - setGot)\n    if gotAndNotExpected:\n        showWarningGccStyle(state.pathTop, 1, '')\n        alert(f'not sure where these collections originated: {gotAndNotExpected}')\n    if expectedAndNotGot:\n        showWarningGccStyle(state.pathTop, 1, '')\n        alert(f'please add these collections to the list: {expectedAndNotGot}')\n    else:\n        trace('confirmed all tests referenced.')\n\ndef tests():\n    assertEq('testCollectionMyFile', getCollNameFromPath('./src/abc/testMyFile.ts'))\n    assertEq('testCollectionMyFile', getCollNameFromPath('./src/abc/MyFile.ts'))\n    assertEq('testCollectionotherFile', getCollNameFromPath('./src/abc/otherFile.js'))\n    \n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/config.cfg",
    "content": "\n\n[main]\ndir = ../../src\n\nprettierCfg = ../../.prettierrc.js\nprettierPath = ../../node_modules/prettier/bin-prettier.js\n\n[allowLongerLinesOn]\n# files in this list are allowed to have longer lines\n../../src/vpc/codeparse/vpcVisitor.ts = 1\n../../src/vpc/codeparse/vpcVisitorMixin.ts = 1\n../../src/vpc/**/*.ts = 1\n../../src/vpcui/**/*.ts = 1\n\n[checksToDo]\n# by default all checks are enabled.\n# set to 0 to skip\ndoPlaceImportsOnOneLine = 1\naddFinalLineAndRemoveRightWhitespace = 1\nautoHelpIfTestNamesTooLong = 1\nautoHelpLongLines = 1\nautoHelpSetTestCollectionName = 1\ncheck_tests_referenced = 1\ncheck_for_null_coalesce = 1\n\n# a few other checks like replace with a string, accidentally getting any[] arrays\nadditional_checks = 1\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/find_missing_comments.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom place_imports_one_line import *\nimport re\n\ndef go(srcdirectory):\n    for f, short in files.recurseFiles(srcdirectory):\n        f = f.replace('\\\\', '/')\n        if short.endswith('.ts'):\n            goPerFile(f)\n\ndef goPerFile(f):\n    if '/bridge/' in f:\n        return\n    isTestCode = '/test/' in f  or '/ui512demo/' in f \n    if files.getName(f).lower() in ('vpctokens.ts', 'vpcvisitor.ts','vpcparser.ts','vpcvisitormixin.ts'):\n        isTestCode = True\n        \n    lines = getFileLines(f, 'singlelineonly')\n    results = []\n    for i, line in enumerate(lines):\n        if i==0: continue\n        prevLine = lines[i-1]\n        prevLineComment = prevLine.strip().endswith('*/')\n        curLineStart = False\n        linestrip = line.strip()\n        if linestrip.startswith('export ') or \\\n            linestrip.startswith('class ') or \\\n            linestrip.startswith('function ') or \\\n            linestrip.startswith('interface ') or \\\n            linestrip.startswith('namespace ') or \\\n            linestrip.startswith('abstract ') or \\\n            linestrip.startswith('static ') or \\\n            linestrip.startswith('async ') or \\\n            linestrip.startswith('protected ') or \\\n            linestrip.startswith('private ') or \\\n            linestrip.startswith('public ') or \\\n            linestrip.startswith('type '):\n                curLineStart = True\n        \n        # does it look like a method?\n        # hopefully won't catch fn calls because those hopefully have a period\n        if not isTestCode and not line.endswith(';') and re.search('^ +[a-zA-Z0-9]+\\(', line):\n            curLineStart = True\n        \n        if line.strip().startswith('constructor('):\n            curLineStart = False\n        if line.strip().startswith('assert'):\n            curLineStart = False\n        if line.strip().startswith('checkThrow'):\n            curLineStart = False\n        \n        if curLineStart and not prevLineComment and not prevLine.endswith(';') and not prevLine.endswith(',') and not prevLine.endswith('{') and not prevLine.endswith('(') \\\n            and not prevLine.endswith(':') \\\n            and not prevLine.endswith('>') \\\n            and not prevLine.endswith('+') \\\n            and not prevLine.endswith('-') \\\n            and not prevLine.endswith('&&') \\\n            and not prevLine.endswith('||'):\n            results.append((f, i+1, 'expected a comment'))\n    \n    # show the results backwards so that as you're fixing it, the offsets are still ok\n    results.reverse()\n    for a,b,c in results:\n        showWarningGccStyle(a,b,c)\n\nif __name__ == '__main__':\n    dir = os.path.abspath('../../src')\n    go(dir)\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/help_fix_long_lines.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom check_for_long_lines import *\nimport re\n\ndef isOneLongString(s):\n    # is it all one long string?\n    r = r\"\"\"^(\\s+(?:let|const|var) \\w+ = |\\s+)[`\"'](.+?)[`\"']((?:[,;]| \\+)?)\\s*$\"\"\"\n    return re.match(r, s)\n\ndef isNameTooLong(s):\n    # if the test name is long like this, it forces an extra indentation level for the entire test\n    r = r\"\"\"^t\\.(a?test)\\(\\s*[`\"']([^\\n']+)[`\"'],?\\s*$\"\"\"\n    return re.match(r, s)\n\ndef isOneLongStringHelpRepair(s):\n    found = isOneLongString(s)\n    if found:\n        return f\"{found.group(1)} deleteThis.longstr(`{found.group(2)}`, ''){found.group(3)}\"\n    return None\n\ndef isNameTooLongHelpRepair(s):\n    found = isNameTooLong(s)\n    if found:\n        return f\"t.{found.group(1)}('MMMMMM', moveTheSayCallIntoTheBlockBelow, t.say(longstr(`{found.group(2)}`)),\"\n    return None\n    \ndef autoHelpIfTestNamesTooLong(f, lines):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    def getLineOrEmpty(i):\n        if i >= 0 and i < len(lines):\n            return lines[i]\n        else:\n            return ''\n            \n    for i in range(len(lines)):\n        twoLines = getLineOrEmpty(i) + '\\n' + getLineOrEmpty(i+1)\n        found = isNameTooLongHelpRepair(twoLines)\n        if found:\n            # we don't warn() here, but the user will get compile errors showing what happened\n            trace('automatically altering the line to make it a say.')\n            lines[i] = found\n            lines[i+1] = ''\n\ndef autoHelpLongLines(f, lines, prettierCfg):\n    assertTrue(isinstance(f, str))\n    assertTrue(isinstance(lines, list))\n    assertTrue(isinstance(prettierCfg, str))\n    if not hasattr(currentPrintWidth, 'val'):\n        currentPrintWidth.val =  getCurrentPrintWidth(prettierCfg)\n    if currentPrintWidth.val:\n        for i in range(len(lines)):\n            line = lines[i]\n            if '/* check_long_lines_silence_subsequent */' in line:\n                return\n            elif isLineTooLong(lines, i):\n                prevLine = lines[i-1] if i>0 else ''\n                helpRepaired = isOneLongStringHelpRepair(line)\n                if helpRepaired and 'longstr(' not in line and 'longstr(' not in prevLine:\n                    trace('automatically inserting a longstr to help you.')\n                    lines[i] = helpRepaired\n\ndef tests():\n    assertTrue(isNameTooLong(\"t.test(\\n'somelongtestname'\"))\n    assertTrue(isNameTooLong(\"t.test(\\n'somelongtestname',\"))\n    assertTrue(isNameTooLong(\"t.test(\\n'somelongtestname', \"))\n    assertTrue(isNameTooLong(\"t.test(\\n'somelongtestname',  \"))\n    assertTrue(isNameTooLong(\"t.test(\\n'some testname.with chars()',  \"))\n    assertTrue(isNameTooLong(\"t.atest(\\n'somelongtestname'\"))\n    assertTrue(isNameTooLong(\"t.atest(\\n'somelongtestname',\"))\n    assertTrue(isNameTooLong(\"t.atest(\\n'somelongtestname', \"))\n    assertTrue(isNameTooLong(\"t.atest(\\n'somelongtestname',  \"))\n    assertTrue(isNameTooLong(\"t.atest(\\n'some testname.with chars()',  \"))\n    assertTrue(not isNameTooLong(\"t.test(\\n'somelongtestname', (\"))\n    assertTrue(not isNameTooLong(\"t.test(\\n'somelongtestname', a\"))\n    assertTrue(not isNameTooLong(\"t.atest(\\n'somelongtestname', (\"))\n    assertTrue(not isNameTooLong(\"t.atest(\\n'somelongtestname', a\"))\n    assertTrue(isNameTooLong(\"\"\"t.test(\\n\"somelongtestname\",\"\"\"))\n    assertTrue(not isNameTooLong(\"\"\"t.atest(\\n\"somelongtestname\", a\"\"\"))\n    \n    assertTrue(isOneLongString(\"\"\" 'one string'\"\"\"))\n    assertTrue(isOneLongString(\"\"\" 'one string' \"\"\"))\n    assertTrue(isOneLongString(\"\"\" 'one string', \"\"\"))\n    assertTrue(isOneLongString(\"\"\" 'one string'; \"\"\"))\n    assertTrue(isOneLongString(\"\"\" 'one string' + \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = 'one string' \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = 'one string', \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = 'one string'; \"\"\"))\n    assertTrue(isOneLongString(''' \"one string\"'''))\n    assertTrue(isOneLongString(\"\"\" \"one string\" \"\"\"))\n    assertTrue(isOneLongString(\"\"\" \"one string\", \"\"\"))\n    assertTrue(isOneLongString(\"\"\" \"one string\"; \"\"\"))\n    assertTrue(isOneLongString(\"\"\" \"one string\" + \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = \"one string\" \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = \"one string\", \"\"\"))\n    assertTrue(isOneLongString(\"\"\" let a = \"one string\"; \"\"\"))\n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/main.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom place_imports_one_line import *\nimport check_for_null_coalesce\nimport check_for_long_lines\nimport check_tests_referenced\nimport check_more\nimport help_fix_long_lines\nimport readconfig\n\ndef go(srcdirectory):\n    global counting\n    counting = [0, 0]\n    goPrettierAll(srcdirectory, prettierPath, prettierCfg)\n    trace('count of files, longer lines not accepted:', counting[0])\n    trace('count of files, longer lines accepted:', counting[1])\n\ndef runPrettier(args):\n    retcode, stderr, stdout = files.run(args, throwOnFailure=None)\n    if retcode != 0:\n        s = (stdout + b'\\n' + stderr).decode('utf-8')\n        # make links clickable\n        # example [error] ..\\..\\src\\test\\util512ui\\testUI512Composites.ts: SyntaxError: ',' expected. (6:54)\n        search = r'\\[error\\] ([^ ]+\\.ts): ([\\w]+Error: [^\\n]+)\\(([^)]+)\\)'\n        def getReplaced(r):\n            result = '\\n$1:$3 error $2'\n            result = result.replace('$1', os.path.abspath(r.group(1))).replace('\\\\', '/')\n            result = result.replace('$2', r.group(2))\n            lineInfo = r.group(3) if len(r.groups()) >= 3 else '1:1'\n            result = result.replace('$3', lineInfo)\n            return result\n        s = re.sub(search, getReplaced, s)\n        search = r'\\[error\\] ([^ ]+\\.ts): ([\\w]+Error: [^\\n]+)'\n        s = re.sub(search, getReplaced, s)\n        trace(s)\n        assertTrueMsg(False, \"prettier returned failure\", file=os.path.abspath(__file__), linenum=4)\n\ndef goPrettierAll(srcdirectory, prettierPath, prettierCfg):\n    # we used to run prettier individually for each file,\n    # but it is a lot faster to run prettier in batch for all files at once.\n    # if you need to skip prettier, add a comment in the file or make a .prettierignore file.\n    trace('running prettier...')\n    check_for_long_lines.checkCurrentQuoteChar(prettierCfg)\n    assertTrueMsg(files.exists(prettierPath), 'does not exist', prettierPath)\n    assertTrueMsg(files.exists(prettierCfg), 'does not exist', prettierCfg)\n    assertTrueMsg(not srcdirectory.endswith('/'))\n    assertTrueMsg(not srcdirectory.endswith('\\\\'))\n    args = ['node', prettierPath, '--config', prettierCfg, '--write', srcdirectory.replace('\\\\', '/') + '/**/*.ts']\n    runPrettier(args)\n    \n    # allow long lines in certain files\n    if allowLongerLinesOn:\n        prettierCfgLonger = prettierCfg.replace('prettierrc', 'prettierrc_longer')\n        assertTrueMsg(files.isFile(prettierCfgLonger), f\"file not found: '{prettierCfgLonger}'\")\n        for file in allowLongerLinesOn:\n            args = ['node', prettierPath, '--config', prettierCfgLonger, '--write', file]\n            runPrettier(args)\n    \n    # do other checks per file\n    for f, short in files.recurseFiles(srcdirectory):\n        f = f.replace('\\\\', '/')\n        if short.endswith('.ts'):\n            trace(f)\n            goPerFile(srcdirectory, f, prettierPath, prettierCfg)\n    \n    if not tasksDisabled.check_tests_referenced:\n        check_tests_referenced.checkTestCollectionsReferenced()\n\ndef goPerFile(srcdirectory, f, prettierPath, prettierCfg):\n    # first do operations that potentially change file contents\n    # must be done in this order, or the file will appear to change out from under you while editing.\n    lines = doOperationsThatMightChangeFile(srcdirectory, f, prettierPath, prettierCfg)\n    \n    # then do operations that ask the user questions\n    doOperationsThatAskQuestions(srcdirectory, f, lines, prettierPath, prettierCfg)\n\ndef doOperationsThatMightChangeFile(srcdirectory, f, prettierPath, prettierCfg):\n    # put long import statements on one line\n    # we don't want the import to spill across multiple lines.\n    # could maybe do this by passing a range-start to prettier, but let's write it ourselves.\n    if not tasksDisabled.doPlaceImportsOnOneLine:\n        alltxt = files.readAll(f, encoding='utf-8')\n        alltxtNew = placeImportsOnOneLine(alltxt)\n        if alltxt != alltxtNew:\n            print('placing import {} back all on one line')\n            files.writeAll(f, alltxtNew, encoding='utf-8')\n    \n    # some simple formatting\n    lines = getFileLines(f, False)\n    linesOrig = list(lines)\n    if not tasksDisabled.addFinalLineAndRemoveRightWhitespace:\n        addFinalLineAndRemoveRightWhitespace(lines)\n    \n    if not tasksDisabled.autoHelpIfTestNamesTooLong:\n        help_fix_long_lines.autoHelpIfTestNamesTooLong(f, lines)\n        \n    if not tasksDisabled.autoHelpLongLines:\n        help_fix_long_lines.autoHelpLongLines(f, lines, prettierCfg)\n    \n    if not tasksDisabled.autoHelpSetTestCollectionName:\n        check_tests_referenced.autoHelpSetTestCollectionName(f, lines)\n    \n    if linesOrig != lines:\n        files.writeAll(f, '\\n'.join(lines), encoding='utf-8')\n    return lines\n\ndef doOperationsThatAskQuestions(srcdirectory, f, lines, prettierPath, prettierCfg):\n    if not tasksDisabled.check_tests_referenced:\n        check_tests_referenced.checkText(f, lines)\n        \n    if not tasksDisabled.check_for_null_coalesce:\n        check_for_null_coalesce.checkText(f, lines)\n    \n    if not readconfig.shouldAllowLongerLinesOn(f, allowLongerLinesOn):\n        check_for_long_lines.checkText(f, lines, prettierCfg)\n        counting[0] += 1\n    else:\n        counting[1] += 1\n   \n    if not tasksDisabled.additional_checks:\n        check_more.checkText(f, lines)\n\nif __name__ == '__main__':\n    srcdirectory, prettierCfg, prettierPath, allowLongerLinesOn, tasksDisabled = readconfig.readconfig()\n    go(srcdirectory)\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/place_imports_one_line.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nimport os\nimport sys\nimport re\nsys.path.append('../typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_common import *\nsys.path.append('../typescript-super-auto-import')\nfrom ts_parsing import *\n\ndef placeImportsOnOneLine(s):\n    lines = s.replace('\\r\\n', '\\n').split('\\n')\n    outlines = []\n    i = 0\n    while i < len(lines):\n        line = lines[i]\n        i += 1\n        if line.startswith('/* auto */ import {') and not ';' in line:\n            outlines.append(line)\n            while True:\n                line = lines[i]\n                if not outlines[-1].endswith(' '): \n                    outlines[-1] += ' '\n                outlines[-1] += line.strip()\n                i += 1\n                if ';' in line or '}' in line:\n                    break\n        else:\n            outlines.append(line)\n    \n    # place empty line to start the file, looks nicer,\n    # and also is needed by our typescript-super-auto-import\n    if outlines[0] != '':\n        outlines.insert(0, '')\n    return '\\n'.join(outlines)\n\ndef addFinalLineAndRemoveRightWhitespace(lines):\n    if lines[-1] != '':\n        print('adding final blank line')\n        lines.append('')\n    \n    for i in range(len(lines)):\n        stripped = lines[i].rstrip()\n        if lines[i] != stripped:\n            print('removing whitespace on right of line')\n        lines[i] = stripped\n\ntestInput = r'''\nnot an import\nnot an import {\nnot an import { from \"invalid.js\";\nimport { a, b, c } from\n    \"leave.js\";\n/* auto */ import { a } from \"good1.js\";\n/* auto */ import { a, b, c } from \"good2.js\";\n/* auto */ import { a, b, c } from \"good3.js\";\n/* auto */ import { a, b, c } from\n    \"not good1.js\";\n/* auto */ import { a, b, c } from\n    \"not good2.js\";\n/* auto */ import { a, b, c }\n    from \"not good3.js\";\n/* auto */ import { a, b, c \n    }  from \"not good4.js\";\nother code\n/* auto */ import { a, b,\n    c\n} from \"not good5.js\";\nother code\n/* auto */ import { \n    a, b,\n    c \n    } from \"not good6.js\";\nremaining code\nother code\n'''\n\ntestExpected = r'''\nnot an import\nnot an import {\nnot an import { from \"invalid.js\";\nimport { a, b, c } from\n    \"leave.js\";\n/* auto */ import { a } from \"good1.js\";\n/* auto */ import { a, b, c } from \"good2.js\";\n/* auto */ import { a, b, c } from \"good3.js\";\n/* auto */ import { a, b, c } from \"not good1.js\";\n/* auto */ import { a, b, c } from \"not good2.js\";\n/* auto */ import { a, b, c } from \"not good3.js\";\n/* auto */ import { a, b, c }  from \"not good4.js\";\nother code\n/* auto */ import { a, b, c } from \"not good5.js\";\nother code\n/* auto */ import { a, b, c } from \"not good6.js\";\nremaining code\nother code\n'''\n\ngot = placeImportsOnOneLine(testInput)\nassertEq(testExpected, got)\n\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/prettier-except-long-imports/readconfig.py",
    "content": "\nimport configparser\nfrom place_imports_one_line import *\n\ndef go(f):\n    cfg = configparser.ConfigParser(delimiters='=')\n    # make it case-sensitive\n    cfg.optionxform = str\n    cfg.read(f)\n    \n    dir = cfg['main']['dir']\n    confirmExists(f, dir, 'dir')\n    dir = os.path.abspath(dir)\n    \n    prettierCfg = cfg['main']['prettierCfg']\n    confirmExists(f, prettierCfg, 'prettierCfg')\n    assertTrueMsg(prettierCfg.endswith('.js'), f\"we don't yet support prettier config types besides .js\", file=f)\n    \n    prettierPath = cfg['main']['prettierPath']\n    confirmExists(f, prettierPath, 'prettierPath')\n    \n    allowLongerLinesOn = []\n    for key in cfg['allowLongerLinesOn']:\n        v = int(cfg['allowLongerLinesOn'][key])\n        if v:\n            allowLongerLinesOn.append(key.strip())\n    \n    tasksDisabled = Bucket()\n    for task in knownTasks:\n        object.__setattr__(tasksDisabled, task.strip(), False)\n    \n    for key in cfg['checksToDo']:\n        assertTrueMsg(key.strip() in knownTasks, f\"unknown task '{key}'\", file=f)\n        v = int(cfg['checksToDo'][key])\n        if not v:\n            object.__setattr__(tasksDisabled, key.strip(), True)\n    \n    return dir, prettierCfg, prettierPath, allowLongerLinesOn, tasksDisabled\n\ndef confirmExists(f, path, name):\n    if not files.exists(path):\n        assertTrueMsg(False, f\"in {f} you set {name} to '{path}' but that path does not exist\", file=f)\n\ndef readconfig():\n    assertTrueMsg(files.isFile('config.cfg'), \"Could not find config.cfg\")\n    return go('config.cfg')\n\n\nknownTasks = [s.strip() for s in '''\n    doPlaceImportsOnOneLine\n    addFinalLineAndRemoveRightWhitespace\n    autoHelpIfTestNamesTooLong\n    autoHelpLongLines\n    autoHelpSetTestCollectionName\n    check_tests_referenced\n    check_for_null_coalesce\n    additional_checks'''.replace('\\r\\n', '\\n').split('\\n') if s]\n\ndef absPathToRelative(p):\n    p = p.replace('\\\\', '/')\n    me = os.path.abspath(__file__).replace('\\\\', '/')\n    common = os.path.commonpath([me, p])\n    assertTrueMsg(common, \"paths have nothing in common\")\n    return os.path.relpath(p, files.getParent(me))\n\ndef shouldAllowLongerLinesOn(p, allowLongerLinesOn):\n    import fnmatch\n    p = absPathToRelative(p)\n    for pattern in allowLongerLinesOn:\n        if fnmatch.fnmatch(p, pattern):\n            return True\n    return False\n\nif __name__=='__main__':\n    dir, prettierCfg, prettierPath, allowLongerLinesOn, tasksDisabled = readconfig()\n    trace(dir)\n    trace(prettierCfg)\n    trace(prettierPath)\n    trace(allowLongerLinesOn)\n    trace(tasksDisabled)\n    \n    "
  },
  {
    "path": "vipercard/vipercard/tools/readme.md",
    "content": "\n* Describing the tools in `./vipercard/tools`:\n* `add-assert-markers`\n    * Adds unique markers to asserts\n    * So, if a user sees an assert saying for example `q6i` we can grep the codebase and pinpoint the location\n    * Markers are also shown for script errors, in the details\n* `genparse`\n    * Creates a chevrotain parser out of a bnf-style input file\n    * Can also auto-create some visitor-methods\n    * Can also generate a list of tokens, an interface, and more\n* `set_tsconfig_flavor`\n    * We use a different tsconfig file for development and prod, this script selects the right one.\n* `prettier-except-long-imports`\n    * Runs `prettier` on all code\n    * Leaves long import lines at the top of a file intact.\n    * Runs several other checks that test for long comments/strings, unsafe null coalesce, unreferenced tests, loose-typed arrays, non-regex replace, and more.\n    * Can automatically insert `longstr()` to help breaking up long strings.\n    * You can specify a subset of the files to have longer line lengths\n    * How to run it: `npm run prettierexceptlongimports` or Ctrl-Shift-B in vscode\n* `typescript-super-auto-import`\n    * Automatically add `import()` statements for exported symbols.\n    * Can auto-insert copyright header.\n    * Checks for duplicate exports.\n    * Ensures correct layering order (files mustn't directly call code from a higher module) based on `layers.cfg`\n    * How to run it: `npm run autoimportmodules` or Ctrl-Shift-B in vscode\n\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/releasetools/minify.txt",
    "content": "\nSummary:\n    gz for comparison, since we will serve over gz\n    with tests included\n        terser-minified 261k\n        no minify 441k\n        npm \"strip-comments\" (which leaves some)  356k\n        (couldn't find a way for terser to just strip comments)\n        uglify-strip-comments-and-beautify 338k\n        uglify-uncompressed-but-all-on-one-line 304k\n        uglify-minified 263k\n    without tests included\n        no minify 333k\n        uglify-strip-comments-and-beautify 248k\n        uglify-minified 186k\n\nMake chevrotain load async?\n    Including externalbundle, not including tests:1,085kb\n    Including externalbundle, not including tests over gz:282kb\n    Let's make chevrotain async, only around 39kb but that's 14%...\n\n\ndetails:\n    it looks like babel can also do this: \n    \"build\": \"babel ./index.js --out-dir ./dist/index.js --no-comments\"\n    \n    \n    goal: minimize by taking whitespace, leaving newlines, stripping comments, and not mangling\n    in webpack settings, the section\n    new HtmlWebpackPlugin({\n            hash: true,\n            inject: true,\n            template: '0.3/index.dev.html',\n            minify: {\n                removeComments: true,\n                collapseWhitespace: true,\n                removeRedundantAttributes: true,\n                useShortDoctype: true,\n                removeEmptyAttributes: true,\n                removeStyleLinkTypeAttributes: true,\n                keepClosingSlash: true,\n                minifyJS: true,\n                minifyCSS: true,\n                minifyURLs: true,\n            },\n        }),\n    the minify settings there seem to do nothing.\n    \n    add a new root level to really control it,\n    (it's now based on Terser. add \n    const TerserPlugin = require('terser-webpack-plugin');\n    I want a non-minified one that still has no comments\n    this is as close as I got, but it still\n    really puts everything onto one line\n    optimization: {\n        minimize: true,\n        minimizer: [\n        new TerserPlugin({\n            terserOptions: {\n                mangle: false,\n            output: {\n                comments: false,\n            },\n            },\n        }),\n        ],\n    },\n    \n    so back to this to have no minification, and use a separate script to strip comments?\n    optimization: {\n        // Set this to false if you'd rather not minimize code,\n        // if you get a warning about asset size you can add hints: false here too.\n        minimize: false\n    },   \n    let text = fs.readFileSync(src, {encoding: \"utf8\"})\n    const strip = require('strip-comments');\n    const textOut = strip(text);\n    fs.writeFileSync(src+'.out.js', textOut, {encoding: \"utf8\"})\n    but this left many comments in the file :(\n    \n    online it looks like uglify can remove comments\n    could add it to the list\n   plugins: [ ,\n        new UglifyJsPlugin(),\n   ]\n    note that the UglifyJsPlugin options are different than plain uglify options\n    \n\n    current working solution: removes \n    comments without minifying:\n    npm install --save-dev uglifyjs-webpack-plugin\n    const UglifyJsPlugin = require('uglifyjs-webpack-plugin')\n    optimization: {\n        minimize: true,\n        minimizer: [\n            new UglifyJsPlugin({\n                uglifyOptions: {\n                    output: {\n                        comments: false,\n                        beautify: true,\n                    },\n                    mangle: false,\n                    compress: false,\n                },\n            }),\n        ],\n    },\n    \nNote: using conventions like referring to myFunction.name might be dangerous,\nsee what uglify does here:\n    function X(){var e=null!==Y&&Y.apply(this,arguments)||this;\nreturn e.isVpcNotificationMsg=!0,e.origClass=X.name,e}\nX.name probably returns \"X\" which isn't intended.\n\n\n\n    \n    \n    \n   \n         "
  },
  {
    "path": "vipercard/vipercard/tools/releasetools/release steps.txt",
    "content": "\ndon't use webpack's index.html, use my own\n\nrefer to externalmanualbundle.js, not externalmanualbundle_bigger.js\n\ncreate an index_withtests.html and an index.html,\nadding the reference to vpc03amin_withtests.js and vpc03amin.js respectively.\n"
  },
  {
    "path": "vipercard/vipercard/tools/set_tsconfig_flavor.js",
    "content": "\n/* eslint-disable @typescript-eslint/no-var-requires */\nconst fs = require('fs');\nconst os = require('os');\nconst path = require('path');\n\nfunction copyTsConfig(isProd) {\n    const header = `/* NOTE:: this is a generated file, changes here will be overwritten */`\n    let spec = isProd ? 'production' : 'development'\n    \n    let src = path.join(__dirname, `../tsconfig.${spec}.json`)\n    let dest = path.join(__dirname, `../tsconfig.json`)\n    let text = fs.readFileSync(src, {encoding: \"utf8\"})\n    text = header + os.EOL + os.EOL + text;\n    fs.writeFileSync(dest, text, {encoding: \"utf8\"})\n}\n\nfunction main(argv) {\n    let isProd;\n    if (argv.some(s => s === '--production')) {\n        isProd = true;\n    } else if (argv.some(s => s === '--development')) {\n        isProd = false;\n    } else {\n        console.err('please specify either --production or --development')\n        return process.exit(1)\n    }\n    \n    copyTsConfig(isProd)\n}\n\nmain(process.argv);\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/README.md",
    "content": "typescript-super-auto-import\nby Ben Fisher\n\nRecent vscode can automatically add import statements, but this project can also:\n- Adds all of the imports at once instead of clicking through them one at a time\n- Remove unused symbols from imports\n- Check for dependency cycles\n\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/config.cfg",
    "content": "\n\n[main]\ndir = ../../src\nuseSingleQuotes = 1\nenforceLayersOrder = 1\n\n# if using es6 modules, you'd typically set this to \".js\"\nfileExtensionInImportStatement =\n\n# set these to empty to skip adding copyright info\ncopyrightFirstLine= /* (c) 2019 moltenform(Ben Fisher) */\ncopyrightDefault = /* Released under the GPLv3 license */\n\n[copyrightSkipPathsThatIncludeThis]\n/example/file/path/to/skip/ = skip\n/bridge/ = skip\n\n[copyrightOverrides]\nexamplelowercasefilename.ts = /* custom header */\n\nutil512.ts = /* Released under the MIT license */\nutil512assert.ts = /* Released under the MIT license */\nutil512base.ts = /* Released under the MIT license */\nutil512higher.ts = /* Released under the MIT license */\nutil512serialize.ts = /* Released under the MIT license */\ntesttop.ts = /* Released under the MIT license */\ntestutils.ts = /* Released under the MIT license */\ntestutil512.ts = /* Released under the MIT license */\ntestutil512assert.ts = /* Released under the MIT license */\ntestutil512class.ts = /* Released under the MIT license */\ntestutil512higher.ts = /* Released under the MIT license */\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/main.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nfrom ts_exports_read import *\nfrom ts_layers_read import *\nfrom ts_parsing import *\nfrom ts_add_copyright import *\nimport readconfig\n\ndef go():\n    dir, useSingleQuotes, config = readconfig.readconfig()\n    confirmNoDuplicateFilenames(dir)\n    layers, filesReferencedInLayers, filenamesReferencedInLayers, layersCfg = readLayersFile(dir)\n    confirmLayersIncludesFiles(layersCfg, dir, filenamesReferencedInLayers)\n    autoAddImports(config, dir, layers, useSingleQuotes)\n    enforceLayering(config, dir)\n\ndef autoAddImports(config, srcdirectory, layers, useSingleQuotes):\n    mapSymbolNameToLayer = {}\n    \n    # get a map of symbol to filename where exported from\n    for layer in layers:\n        layerfullpath, layershortnoext, layerdepth = layer\n        symbolsInLayer = collectExports(layerfullpath)\n            \n        for symbol in symbolsInLayer:\n            symbol = symbol.strip()\n            if symbol:\n                if symbol in mapSymbolNameToLayer:\n                    prevFound = mapSymbolNameToLayer[symbol]\n                    assertTrueMsg(symbol == 'runTestsImpl', f'dupe symbol in both {prevFound[0]} and {layer[0]}', symbol, file=layer[0])\n                mapSymbolNameToLayer[symbol] = layer\n    \n    # add the imports\n    for layer in layers:\n        lines = None\n        layerfullpath, layershortnoext, layerdepth = layer\n        trace(layerfullpath)\n        lines = getFileLines(layerfullpath, tryToStripComments)\n        \n        addNewForThisFile = []\n        for line in lines:\n            if not line.strip().startswith('import ') and not line.strip().startswith('/* auto */ import') and not 'import {' in line:\n                for symbol in getSymbolsFromLine(line):\n                    foundFromExports = mapSymbolNameToLayer.get(symbol, None)\n                    if foundFromExports is not None:\n                        if foundFromExports[0] == layerfullpath:\n                            pass # we don't need to import from ourself\n                        else:\n                            addNewForThisFile.append((symbol, foundFromExports[0], foundFromExports[1]))\n        \n        addNewForThisFile.sort()\n        # remove duplicates\n        addNewForThisFile = removeListDuplicates(addNewForThisFile)\n        # sort by level , low-level to high-level\n        addNewForThisFile.sort(reverse=True, key=lambda item:item[2])\n        \n        whatToAdd = []\n        currentFilename = None\n        for symbol, foundFromExports0, foundFromExports1 in addNewForThisFile:\n            if currentFilename != foundFromExports0:\n                whatToAdd.append([foundFromExports0])\n                currentFilename = foundFromExports0\n            whatToAdd[-1].append(symbol)\n        \n        newLinesToAdd = []\n        for parts in whatToAdd:\n            theImports = parts[1:]\n            importFromFile = getImportFromFile(config, srcdirectory, layerfullpath, parts[0])\n            quote = \"'\" if useSingleQuotes else '\"'\n            s = f'''/* auto */ import {{ {', '.join(theImports)} }} from {quote}{importFromFile}{quote};'''\n            newLinesToAdd.append(s)\n        \n        if newLinesToAdd:\n            linesOrigFile = getFileLines(layerfullpath, False)\n            linesWithNoAuto = [line for line in linesOrigFile if not (line.startswith('/* auto */ import') and '{' in line )]\n            assertTrueMsg(linesWithNoAuto[0] == '', 'expected file to start with an empty line ', layer[0], file=layer[0])\n            addNewLine = linesWithNoAuto[1] != ''\n            if addNewLine:\n                newLinesToAdd.append('')\n            addCopyrightIfEnabled(config, layerfullpath, linesWithNoAuto, newLinesToAdd)\n            linesWithNoAuto[1:1] = newLinesToAdd\n            \n            alltxtNew = '\\n'.join(linesWithNoAuto)\n            if alltxtNew != '\\n'.join(linesOrigFile):\n                print('Writing')\n                print('\\n'.join(newLinesToAdd))\n                files.writeAll(layerfullpath, alltxtNew, encoding='utf-8')\n\ndef getImportFromFile(config, srcdirectory, layerfullpath, srcfilename):\n    srcfilenameWithoutExt = files.splitExt(srcfilename)[0]\n    startdir = files.getParent(layerfullpath)\n    s = './' + os.path.relpath(srcfilenameWithoutExt, startdir).replace('\\\\', '/')\n    s += config['main']['fileExtensionInImportStatement'].strip()\n    return s\n    \ndef countDirDepth(s):\n    return len(s.replace('\\\\', '/').split('/')) - 1\n\ndef enforceLayering(config, srcdirectory):\n    if not int(config['main']['enforceLayersOrder']):\n        print('complete')\n        return\n    \n    print('running enforceLayering...')\n    layers, filesReferencedInLayers, filenamesReferencedInLayers, layersCfg = readLayersFile(srcdirectory)\n    for layer in layers:\n        # read file\n        basefilecontents = '\\n'.join(getFileLines(layer[0], tryToStripComments))\n        \n        # this layer should not be able to import from anything above it\n        disallowImportsFromGreaterThan = layer[2]\n        for jlayer in layers:\n            if jlayer[2] < disallowImportsFromGreaterThan:\n                # check that the current layer didn't import from this greaterthan one\n                disallowedfilename = re.escape(jlayer[1])\n                assertTrueMsg(not disallowedfilename.endswith('.js') and not disallowedfilename.endswith('.ts'), disallowedfilename)\n                \n                # disallow \"example.js\", allow \"_example.js_\"\n                if re.search(r'\\b' + disallowedfilename + r'\\.(ts|js)\\b', basefilecontents) or \\\n                 re.search(r'\\bfrom \"[^\"]*?' + disallowedfilename + r'\"', basefilecontents) or \\\n                 re.search(r\"\\bfrom '[^']*?\" + disallowedfilename + r\"'\", basefilecontents):\n                    sErr = f'file {layer[0]} referred to a layer above it \"{disallowedfilename}\" ({jlayer[0]})'\n                    showWarningGccStyle(layer[0], 1, sErr)\n                    warn(sErr)\n    \n    print('layer check complete')\n\nif __name__ == '__main__':\n    go()\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/readconfig.py",
    "content": "import configparser\nfrom ts_parsing import *\n\ndef go(f):\n    cfg = configparser.ConfigParser(delimiters='=')\n    # make it case-sensitive\n    cfg.optionxform = str\n    cfg.read(f)\n    \n    dir = cfg['main']['dir']\n    confirmExists(f, dir, 'dir')\n    dir = os.path.abspath(dir)\n    \n    useSingleQuotes = cfg['main']['useSingleQuotes']\n    useSingleQuotes = int(useSingleQuotes)\n    \n    return dir, useSingleQuotes, cfg\n\ndef confirmExists(f, path, name):\n    if not files.exists(path):\n        assertTrueMsg(False, f\"in {f} you set {name} to '{path}' but that path does not exist\", file=f)\n\ndef readconfig():\n    assertTrueMsg(files.isFile('config.cfg'), \"Could not find config.cfg\")\n    return go('config.cfg')\n\nif __name__=='__main__':\n    dir, useSingleQuotes, cfg = readconfig()\n    trace(dir)\n    trace(useSingleQuotes)\n    trace(cfg)\n    \n    \n\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/ts_add_copyright.py",
    "content": "# Ben Fisher, 2018\n# MIT license\n\nfrom ts_parsing import *\n\ndef whichLicense(config, default, f):\n    f = f.replace('\\\\', '/')\n    for key in config['copyrightSkipPathsThatIncludeThis']:\n        if key.strip() in f:\n            return None\n    \n    for key in config['copyrightOverrides']:\n        if files.getName(f).lower() == key.strip().lower():\n            return config['copyrightOverrides'][key].strip()\n        \n    return default\n\ndef addCopyrightIfEnabled(config, f, linesWithNoAuto, newLinesToAdd):\n    firstline = config['main']['copyrightFirstLine'].strip()\n    default = config['main']['copyrightDefault'].strip()\n    if not firstline:\n        trace('not setting copyright, copyrightFirstLine is empty.')\n        return\n    if not default:\n        trace('not setting copyright, copyrightDefault is empty.')\n        return\n    \n    secondline = whichLicense(config, default, f)\n    if secondline:\n        contents = '\\n'.join(linesWithNoAuto)\n        if firstline in contents:\n            # it looks like we've already added the copyright\n            assertTrueMsg(firstline+'\\n'+secondline in contents, \"second line differs from what was expected\", file=f)\n            return\n        \n        newLinesToAdd.append('')\n        newLinesToAdd.append(firstline)\n        newLinesToAdd.append(secondline)\n        newLinesToAdd.append('')\n\n\n\n\n\n    \n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/ts_exports_read.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nimport os\nimport sys\nimport re\nfrom collections import OrderedDict\nfrom ts_parsing import *\n\ntryToStripComments = 'multilineonly'\n\ndef collectExportsLine(line, found, which):\n    pts = re.split(' +', line)\n    ret = pts[which]\n    ret = ret.split('<')[0]\n    ret = ret.split('(')[0]\n    ret = ret.split(':')[0]\n    if ret in found:\n        if found[ret] == 'ignore':\n            pass\n        else:\n            trace('warning: apparently exported twice', ret)\n    else:\n        found[ret] = 1\n\ndef collectExports(file):\n    lines = getFileLines(file, tryToStripComments)\n    found = OrderedDict()\n    for line in lines:\n        if line.startswith('export class ') or \\\n            line.startswith('export function ') or \\\n            line.startswith('export enum ') or \\\n            line.startswith('export interface ') or \\\n            line.startswith('export let ') or \\\n            line.startswith('export var ') or \\\n            line.startswith('export namespace ') or \\\n            line.startswith('export type ') or \\\n            (line.startswith('export const ') and not line.startswith('export const enum')):\n            collectExportsLine(line, found, 2)\n        elif line.startswith('export abstract class ') or \\\n            line.startswith('export async function ') or \\\n            line.startswith('export const enum ') or \\\n            line.startswith('export declare class ') or \\\n            line.startswith('export declare function ') or \\\n            line.startswith('export declare enum ') or \\\n            line.startswith('export declare interface ') or \\\n            line.startswith('export declare const ') or \\\n            line.startswith('export declare let ') or \\\n            line.startswith('export declare var ') or \\\n            line.startswith('export declare namespace ') or \\\n            line.startswith('export declare type '):\n            collectExportsLine(line, found, 3)\n        elif line.startswith('export declare abstract class ') or \\\n            line.startswith('export declare async function ') or \\\n            line.startswith('export declare const enum '):\n            collectExportsLine(line, found, 4)\n        elif line.startswith('/* ts_exports_read.py add '):\n            collectExportsAddedManually(line, found)\n        elif line.startswith('/* ts_exports_read.py ignore '):\n            collectExportsIgnoredManually(line, found)\n    \n    found = {k:found[k] for k in found if found[k] != 'ignore'}\n    return found\n\ndef readAlreadyImportedNotByUs(filelines):\n    # not supported:\n    # 1) many prettifiers want to put the imports on multiple lines, so it's annoying to parse\n    # 2) typescript will warn us if a symbol is imported twice, so no need.\n    return {}\n    if False:\n        imports = dict()\n        for line in filelines:\n            if line.startswith('import ') and '{' in line and not '/* auto */' in line:\n                a, b = line.split('{')\n                c, d = line.split('}')\n                for item in c.split(','):\n                    imports[item.strip()] = True\n        return imports\n\ndef collectExportsAddedManually(line, found):\n    assertTrueMsg(line.startswith('/* ts_exports_read.py add '), 'internal error, no prefix', line)\n    pts = line.replace('*/', '').replace('/* ', '').split(' ')\n    pts.pop(0) # remove \"ts_exports_read.py\"\n    pts.pop(0) # remove \"add\"\n    for pt in pts:\n        found[pt.strip()] = 1\n    \ndef collectExportsIgnoredManually(line, found):\n    assertTrueMsg(line.startswith('/* ts_exports_read.py ignore '), 'internal error, no prefix', line)\n    pts = line.replace('*/', '').replace('/* ', '').split(' ')\n    pts.pop(0) # remove \"ts_exports_read.py\"\n    pts.pop(0) # remove \"ignore\"\n    for pt in pts:\n        found[pt.strip()] = 'ignore'\n    \n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/ts_layers_read.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nimport os\nimport sys\nimport re\nfrom collections import OrderedDict\nfrom ts_parsing import *\n\ndef readLayersFile(dir):\n    ret = None\n    for f, short in files.recurseFiles(dir):\n        if short == 'layers.cfg':\n            if ret:\n                assertTrueMsg(False, 'more than one layers.cfg seen.', file=f)\n            ret = parseLayersFile(f, dir)\n    if not ret:\n        warn('no layers.cfg file seen.')\n    return ret\n\ndef parseLayersFile(f, root):\n    filesReferencedInLayers = {}\n    filenamesReferencedInLayers = {}\n    layers = []\n    state = Bucket(currentDir=None, count = 0)\n    \n    def processLineDir(line):\n        state.currentDir = line[1:]\n        \n    def processLineFile(short):\n        fullpath = files.join(root, state.currentDir, short)\n        if not files.exists(fullpath):\n            showWarningGccStyle(f, 1, 'file not found')\n            warn('file not found:', fullpath, short)\n        \n        if short.lower() in filenamesReferencedInLayers:\n            showWarningGccStyle(f, 1, 'filename seen twice')\n            warn('filename seen twice:', short)\n        filenamesReferencedInLayers[short.lower()] = 1\n        \n        filesReferencedInLayers[fullpath] = 1\n        state.count += 1\n        layers.append((fullpath, files.splitExt(short)[0], state.count))\n        \n    with open(f, 'r', encoding='utf-8') as fin:\n        for line in fin:\n            line = line.strip()\n            if line and not line.startswith('//'):\n                if line.endswith('.ts'):\n                    processLineFile(line)\n                elif line.startswith('/'):\n                    processLineDir(line)\n                else:\n                    showWarningGccStyle(f, 1, 'wrong line syntax')\n                    warn('in layers.cfg, each line should start with / (a dir) or end with .ts (a file)', line)\n    \n    layers.sort(key=lambda o:o[1], reverse=True)\n    return layers, filesReferencedInLayers, filenamesReferencedInLayers, f\n\ndef confirmNoDuplicateFilenames(dir):\n    filenamesSeen = {}\n    for f, short in files.recurseFiles(dir, allowedExts=['ts']):\n        if not short.endswith('.d.ts'):\n            if short.lower() in filenamesSeen:\n                warn('duplicate filename:', f, filenamesSeen[short.lower()])\n            filenamesSeen[short.lower()] = f\n\ndef confirmLayersIncludesFiles(layersCfg, dir, filenamesReferencedInLayers):\n    for f, short in files.recurseFiles(dir, allowedExts=['ts']):\n        if not short.endswith('.d.ts'):\n            if short.lower() not in filenamesReferencedInLayers:\n                showWarningGccStyle(layersCfg, 1, 'not seen in layers.cfg')\n                warn('exists on disk but not in layers.cfg?', f)\n\ndef removeListDuplicates(lst):\n    return list(OrderedDict.fromkeys(lst))\n"
  },
  {
    "path": "vipercard/vipercard/tools/typescript-super-auto-import/ts_parsing.py",
    "content": "\n# Ben Fisher, 2018\n# MIT license\n\nimport os\nimport sys\nimport re\nsys.path.append('bn_python_common.zip')\nfrom bn_python_common import *\n\ndef getSymbolsFromLine(s):\n    # negative lookahead so that we don't include abc| or abc\"\n    for m in re.finditer(r'''(^|[^'\"`a-zA-Z_])([a-zA-Z_][0-9a-zA-Z_]*)(?![0-9'\"`|])''', s):\n        yield m.group(2)\n\ndef getFileLines(f, tryToStripComments):\n    assertTrue(tryToStripComments in (True,\n        False, 'multilineonly', 'singlelineonly'))\n\n    text = files.readAll(f, encoding='utf8')\n    if tryToStripComments and tryToStripComments != 'singlelineonly':\n        text = simpleStripMultilineComments(text, '/*', '*/')\n    lines = text.replace('\\r\\n', '\\n').split('\\n')\n    if tryToStripComments and tryToStripComments != 'multilineonly':\n        lines = [line.split('//')[0] for line in lines]\n    return lines\n\ndef searchForNearbyFile(srcdirectory, name):\n    if files.isFile(files.join(srcdirectory, f'{name}')):\n        return files.join(srcdirectory, f'{name}')\n    if files.isFile(files.join(srcdirectory, f'src/{name}')):\n        return files.join(srcdirectory, f'src/{name}')\n    if files.isFile(files.join(srcdirectory, f'../{name}')):\n        return files.join(srcdirectory, f'../{name}')\n    if files.isFile(files.join(srcdirectory, f'../src/{name}')):\n        return files.join(srcdirectory, f'../src/{name}')\n    if files.isFile(files.join(srcdirectory, f'../../{name}')):\n        return files.join(srcdirectory, f'../../{name}')\n    return None\n\ndef simpleStripMultilineComments(text, open, close):\n    # still fails on strings, but handles complicated/nested cases better\n    # tests in check_for_null_coalesce.py\n    while True:\n        fnd = text.find(open)\n        if (fnd == -1):\n            return text\n\n        cls = text[fnd:].find(close)\n        if (cls == -1):\n            return text[0: fnd]\n\n        cls += fnd + len(close)\n        text = text[0: fnd] + text[cls:]\n\ndef assertTrueMsg(condition, *messageArgs, file=None, linenum=1):\n    if not condition:\n        if file:\n            showWarningGccStyle(file, linenum, *messageArgs)\n        s = ' '.join(map(getPrintable, messageArgs)) if messageArgs else ''\n        alert('Could not continue. ' + s)\n        raise AssertionError(s)\n\ndef showWarningGccStyle(file, linenum, *messageArgs):\n    # trace a gcc-style warning,\n    # this way SciTE or vscode will make a clickable link.\n    s = ' '.join(map(getPrintable, messageArgs)) if messageArgs else 'unknown warning'\n    trace(f'{file}:{linenum}:1 warning: {s}')\n\ndef tests():\n    testinput = '''abc, def, ghi, v1'''\n    expected = ['abc', 'def', 'ghi', 'v1']\n    assertEq(expected, list(getSymbolsFromLine(testinput)))\n    testinput = '''  x = myFn('', h.walkNext(), 'GO|');'''\n    expected = ['x', 'myFn', 'h', 'walkNext']\n    assertEq(expected, list(getSymbolsFromLine(testinput)))\n    testinput = ''' 's1', `s2`, \"s3\" '''\n    expected = []\n    assertEq(expected, list(getSymbolsFromLine(testinput)))\n\ntests()\n"
  },
  {
    "path": "vipercard/vipercard/tsconfig.development.json",
    "content": "{\n    \"compilerOptions\": {\n        /* Basic Options */\n        \"incremental\": true, /* Enable incremental compilation */\n        \"target\": \"es5\", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */\n        \"module\": \"commonjs\", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */\n        /* esnext enables uses of import() expressions */\n        \"lib\": [\n            \"dom\",\n            \"es2015\",\n            \"es2015.iterable\",\n            \"es5\"\n        ], /* Specify library files to be included in the compilation. */\n        \"allowJs\": false, /* Allow javascript files to be compiled. */\n        \"checkJs\": false, /* Report errors in .js files. */\n        // \"jsx\": \"preserve\",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */\n        // \"declaration\": true,                   /* Generates corresponding '.d.ts' file. */\n        // \"declarationMap\": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */\n        \"sourceMap\": true, /* Generates corresponding '.map' file. */\n        // \"outDir\": \"./\",                        /* Redirect output structure to the directory. */\n        // \"rootDir\": \"./\",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */\n        // \"composite\": true,                     /* Enable project compilation */\n        // \"tsBuildInfoFile\": \"./\",               /* Specify file to store incremental compilation information */\n        // \"removeComments\": true,                /* Do not emit comments to output. */\n        // \"noEmit\": true,                        /* Do not emit outputs. */\n        \"importHelpers\": true, /* Import emit helpers from 'tslib'. */\n        \"downlevelIteration\": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */\n        // \"isolatedModules\": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */\n        \"skipLibCheck\": true, /* skips typechecking in d.ts. otherwise get bowser.d.ts:An export assignment cannot be used in a module with other exported elements. */\n        \"suppressImplicitAnyIndexErrors\": true,\n        /* Strict Type-Checking Options */\n        \"strict\": true, /* Enable all strict type-checking options. */\n        \"noImplicitAny\": true, /* Raise error on expressions and declarations with an implied 'any' type. */\n        \"strictNullChecks\": true, /* Enable strict null checks. */\n        \"strictFunctionTypes\": false, /* Enable strict checking of function types. */\n        \"strictBindCallApply\": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */\n        \"strictPropertyInitialization\": false, /* Enable strict checking of property initialization in classes. */\n        \"noImplicitThis\": true, /* Raise error on 'this' expressions with an implied 'any' type. */\n        \"alwaysStrict\": true, /* Parse in strict mode and emit \"use strict\" for each source file. */\n        /* Additional Checks */\n        \"noUnusedLocals\": false,                 /*  Report errors on unused locals. */\n        \"noUnusedParameters\": false,            /* Report errors on unused parameters. */\n        \"noImplicitReturns\": true, /* Report error when not all code paths in function return a value. */\n        \"noFallthroughCasesInSwitch\": true, /* Report errors for fallthrough cases in switch statement. */\n        /* Module Resolution Options */\n        \"moduleResolution\": \"node\", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */\n        // \"baseUrl\": \"./\",                       /* Base directory to resolve non-absolute module names. */\n        // \"paths\": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */\n        // \"rootDirs\": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */\n        // \"typeRoots\": [],                       /* List of folders to include type definitions from. */\n        // \"types\": [],                           /* Type declaration files to be included in compilation. */\n        \"allowSyntheticDefaultImports\": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */\n        \"esModuleInterop\": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */\n        // \"preserveSymlinks\": true,              /* Do not resolve the real path of symlinks. */\n        \"allowUmdGlobalAccess\": true, /* Allow accessing UMD globals from modules. */\n        /* Source Map Options */\n        // \"sourceRoot\": \"\",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */\n        // \"mapRoot\": \"\",                         /* Specify the location where debugger should locate map files instead of generated locations. */\n        // \"inlineSourceMap\": true,               /* Emit a single file with source maps instead of having a separate file. */\n        // \"inlineSources\": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */\n        /* Experimental Options */\n        \"experimentalDecorators\": true, /* Enables experimental support for ES7 decorators. */\n        // \"emitDecoratorMetadata\": true,         /* Enables experimental support for emitting type metadata for decorators. */\n        /* Advanced Options */\n        \"forceConsistentCasingInFileNames\": true, /* Disallow inconsistently-cased references to the same file. */\n        // \"assumeChangesOnlyAffectDirectDependencies\": false,\n        \"types\": [ \n            \"./external/chevrotain-6.5.0/chevrotaintyping\"\n        ] /* safer to set this explicitly, otherwise npm dependencies can appear */\n    },\n    \"include\": [\n        \"src/**/*\"\n    ],\n}\n"
  },
  {
    "path": "vipercard/vipercard/tsconfig.json",
    "content": "/* NOTE:: this is a generated file, changes here will be overwritten */\n\n{\n    \"compilerOptions\": {\n        /* Basic Options */\n        \"incremental\": true, /* Enable incremental compilation */\n        \"target\": \"es5\", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */\n        \"module\": \"commonjs\", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */\n        /* esnext enables uses of import() expressions */\n        \"lib\": [\n            \"dom\",\n            \"es2015\",\n            \"es2015.iterable\",\n            \"es5\"\n        ], /* Specify library files to be included in the compilation. */\n        \"allowJs\": false, /* Allow javascript files to be compiled. */\n        \"checkJs\": false, /* Report errors in .js files. */\n        // \"jsx\": \"preserve\",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */\n        // \"declaration\": true,                   /* Generates corresponding '.d.ts' file. */\n        // \"declarationMap\": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */\n        \"sourceMap\": true, /* Generates corresponding '.map' file. */\n        // \"outDir\": \"./\",                        /* Redirect output structure to the directory. */\n        // \"rootDir\": \"./\",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */\n        // \"composite\": true,                     /* Enable project compilation */\n        // \"tsBuildInfoFile\": \"./\",               /* Specify file to store incremental compilation information */\n        // \"removeComments\": true,                /* Do not emit comments to output. */\n        // \"noEmit\": true,                        /* Do not emit outputs. */\n        \"importHelpers\": true, /* Import emit helpers from 'tslib'. */\n        \"downlevelIteration\": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */\n        // \"isolatedModules\": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */\n        \"skipLibCheck\": true, /* skips typechecking in d.ts. otherwise get bowser.d.ts:An export assignment cannot be used in a module with other exported elements. */\n        \"suppressImplicitAnyIndexErrors\": true,\n        /* Strict Type-Checking Options */\n        \"strict\": true, /* Enable all strict type-checking options. */\n        \"noImplicitAny\": true, /* Raise error on expressions and declarations with an implied 'any' type. */\n        \"strictNullChecks\": true, /* Enable strict null checks. */\n        \"strictFunctionTypes\": false, /* Enable strict checking of function types. */\n        \"strictBindCallApply\": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */\n        \"strictPropertyInitialization\": false, /* Enable strict checking of property initialization in classes. */\n        \"noImplicitThis\": true, /* Raise error on 'this' expressions with an implied 'any' type. */\n        \"alwaysStrict\": true, /* Parse in strict mode and emit \"use strict\" for each source file. */\n        /* Additional Checks */\n        \"noUnusedLocals\": false,                 /*  Report errors on unused locals. */\n        \"noUnusedParameters\": false,            /* Report errors on unused parameters. */\n        \"noImplicitReturns\": true, /* Report error when not all code paths in function return a value. */\n        \"noFallthroughCasesInSwitch\": true, /* Report errors for fallthrough cases in switch statement. */\n        /* Module Resolution Options */\n        \"moduleResolution\": \"node\", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */\n        // \"baseUrl\": \"./\",                       /* Base directory to resolve non-absolute module names. */\n        // \"paths\": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */\n        // \"rootDirs\": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */\n        // \"typeRoots\": [],                       /* List of folders to include type definitions from. */\n        // \"types\": [],                           /* Type declaration files to be included in compilation. */\n        \"allowSyntheticDefaultImports\": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */\n        \"esModuleInterop\": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */\n        // \"preserveSymlinks\": true,              /* Do not resolve the real path of symlinks. */\n        \"allowUmdGlobalAccess\": true, /* Allow accessing UMD globals from modules. */\n        /* Source Map Options */\n        // \"sourceRoot\": \"\",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */\n        // \"mapRoot\": \"\",                         /* Specify the location where debugger should locate map files instead of generated locations. */\n        // \"inlineSourceMap\": true,               /* Emit a single file with source maps instead of having a separate file. */\n        // \"inlineSources\": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */\n        /* Experimental Options */\n        \"experimentalDecorators\": true, /* Enables experimental support for ES7 decorators. */\n        // \"emitDecoratorMetadata\": true,         /* Enables experimental support for emitting type metadata for decorators. */\n        /* Advanced Options */\n        \"forceConsistentCasingInFileNames\": true, /* Disallow inconsistently-cased references to the same file. */\n        // \"assumeChangesOnlyAffectDirectDependencies\": false,\n        \"types\": [ \n            \"./external/chevrotain-6.5.0/chevrotaintyping\"\n        ] /* safer to set this explicitly, otherwise npm dependencies can appear */\n    },\n    \"include\": [\n        \"src/**/*\"\n    ],\n}\n"
  },
  {
    "path": "vipercard/vipercard/tsconfig.production.json",
    "content": "{\n  \"extends\": \"./tsconfig.development.json\",\n  \"compilerOptions\": {\n    \"noUnusedLocals\": true,                 /*  Report errors on unused locals. */\n    \"noUnusedParameters\": false,            /* Report errors on unused parameters. */\n    \"noEmitOnError\": true,\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n}\n"
  },
  {
    "path": "vipercard/vipercard/webpack.config.development.js",
    "content": "\n/* we're not actually in a typescript environment, this is just a config file, */\n/* so it's fine to disable the warnings about require statements */\n/* eslint-disable @typescript-eslint/no-var-requires */\nconst path = require('path');\nconst ForkTsCheckerNotifierWebpackPlugin = require('fork-ts-checker-notifier-webpack-plugin');\nconst ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst webpack = require('webpack');\n\nconst main = [\n    './src/ui512/root/rootStartCanvas.ts'\n];\n\nmodule.exports = {\n    /* automatically find tsconfig.json */\n    context: process.cwd(),\n    entry: {\n        main\n    },\n    output: {\n        path: path.resolve(__dirname, 'dist'),\n        filename: '[name].js',\n        publicPath: \"/\"\n    },\n    plugins: [\n        new ForkTsCheckerWebpackPlugin({\n            eslint: true\n        }),\n        /* turn off pop-up notifications */\n        /* new ForkTsCheckerNotifierWebpackPlugin(\n            { title: 'TypeScript', excludeWarnings: false }), */\n        new HtmlWebpackPlugin({\n            inject: true,\n            template: '0.3/index.dev.html'\n        }),\n        new webpack.DefinePlugin({\n            /*  note that the plugin does a direct text replacement. */\n            WEBPACK_PRODUCTION: false,\n            DBGPLACEHOLDER: 'debugger'\n        }),\n    ],\n    module: {\n        rules: [\n            {\n                test: /.tsx?$/,\n                use: [\n                    { loader: 'ts-loader', options: { transpileOnly: true } }\n                ]\n            }\n        ]\n    },\n    resolve: {\n        extensions: [\".tsx\", \".ts\", \".js\"]\n    },\n    devtool: 'inline-source-map',\n    devServer: {\n        clientLogLevel: 'warning',\n        open: true,\n        historyApiFallback: true,\n        stats: 'errors-only',\n        /* turn off auto-refresh browser on changes */\n        liveReload: false,\n    }\n};\n"
  },
  {
    "path": "vipercard/vipercard/webpack.config.production.js",
    "content": "\n/* we're not actually in a typescript environment, this is just a config file, */\n/* so it's fine to disable the warnings about require statements */\n/* eslint-disable @typescript-eslint/no-var-requires */\nconst path = require('path');\nconst ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst webpack = require('webpack');\nconst UglifyJsPlugin = require('uglifyjs-webpack-plugin')\n\nconst main = [\n    './src/ui512/root/rootStartCanvas.ts'\n];\n\nmodule.exports = {\n    /* automatically find tsconfig.json */\n    context: process.cwd(),\n    entry: {\n        main: main\n    },\n    output: {\n        path: path.join(process.cwd(), 'dist'),\n        filename: '[name].js',\n    },\n    plugins: [\n        new ForkTsCheckerWebpackPlugin({\n            async: false,\n            useTypescriptIncrementalApi: true,\n            memoryLimit: 4096\n        }),\n        new HtmlWebpackPlugin({\n            hash: true,\n            inject: true,\n            template: '0.3/index.dev.html',\n            minify: {\n                removeComments: true,\n                collapseWhitespace: true,\n                removeRedundantAttributes: true,\n                useShortDoctype: true,\n                removeEmptyAttributes: true,\n                removeStyleLinkTypeAttributes: true,\n                keepClosingSlash: true,\n                minifyJS: true,\n                minifyCSS: true,\n                minifyURLs: true,\n            },\n        }),\n        new webpack.DefinePlugin({\n            /*  note that the plugin does a direct text replacement. */\n            WEBPACK_PRODUCTION: true\n        })\n    ],\n    module: {\n        rules: [\n            {\n                test: /.tsx?$/,\n                use: [\n                    {\n                        loader: 'ts-loader', options: {\n                            transpileOnly: true,\n                        }\n                    }\n                ],\n            }\n        ]\n    },\n    resolve: {\n        extensions: [\".tsx\", \".ts\", \".js\"]\n    },\n    performance: {\n        /* suppress warning about large asset size */\n        hints: false\n    },\n    optimization: {\n        minimize: true,\n        minimizer: [\n            new UglifyJsPlugin({\n                uglifyOptions: {\n                    output: {\n                        comments: false,\n                        beautify: false,\n                    },\n                    mangle: {\n                        properties: false\n                    },\n                    compress: true,\n                },\n            }),\n        ],\n    },\n};\n\n"
  }
]